@hotmeshio/long-tail 0.1.3 → 0.1.5

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 (615) hide show
  1. package/README.md +118 -173
  2. package/build/examples/seed.js +1 -1
  3. package/build/examples/workflows/basic-echo/activities.d.ts +2 -2
  4. package/build/examples/workflows/basic-echo/activities.js +7 -7
  5. package/build/examples/workflows/basic-echo/index.js +1 -1
  6. package/build/examples/workflows/kitchen-sink/index.js +2 -2
  7. package/build/index.d.ts +12 -10
  8. package/build/index.js +15 -12
  9. package/build/lib/db/index.d.ts +18 -0
  10. package/build/{services → lib}/db/index.js +9 -0
  11. package/build/{services → lib}/db/migrate.js +3 -3
  12. package/build/{services → lib}/telemetry/honeycomb.d.ts +2 -2
  13. package/build/{services → lib}/telemetry/honeycomb.js +2 -2
  14. package/build/modules/defaults.d.ts +2 -0
  15. package/build/modules/defaults.js +3 -1
  16. package/build/routes/controlplane.js +1 -1
  17. package/build/routes/dba.js +4 -0
  18. package/build/routes/docs.d.ts +2 -0
  19. package/build/routes/docs.js +87 -0
  20. package/build/routes/escalations/bulk.js +120 -202
  21. package/build/routes/escalations/resolve.js +1 -1
  22. package/build/routes/escalations/single.js +1 -1
  23. package/build/routes/files.js +1 -1
  24. package/build/routes/index.js +2 -0
  25. package/build/routes/insight.js +2 -1
  26. package/build/routes/mcp.js +3 -2
  27. package/build/routes/oauth.js +1 -1
  28. package/build/routes/settings.js +4 -4
  29. package/build/routes/workflows/discovery.js +3 -3
  30. package/build/routes/workflows/invocation.js +1 -1
  31. package/build/routes/yaml-workflows/crud.js +1 -1
  32. package/build/routes/yaml-workflows/deployment.js +25 -0
  33. package/build/services/auth/bot-api-key.js +1 -1
  34. package/build/services/auth/index.d.ts +4 -0
  35. package/build/services/auth/index.js +17 -0
  36. package/build/services/auth/service-token.js +1 -1
  37. package/build/services/config/provider.js +1 -1
  38. package/build/services/config/read.js +1 -1
  39. package/build/services/config/write.js +1 -1
  40. package/build/services/controlplane/index.js +3 -4
  41. package/build/services/controlplane/quorum-bridge.js +2 -2
  42. package/build/services/cron/index.js +4 -5
  43. package/build/services/dba.d.ts +4 -0
  44. package/build/services/dba.js +3 -6
  45. package/build/services/escalation/bulk.js +1 -1
  46. package/build/services/escalation/crud.js +1 -1
  47. package/build/services/escalation/queries.js +1 -1
  48. package/build/services/export/client.js +2 -5
  49. package/build/services/export/index.js +14 -2
  50. package/build/services/hotmesh-utils.js +1 -1
  51. package/build/services/iam/bots.js +6 -12
  52. package/build/services/iam/context.d.ts +1 -1
  53. package/build/services/iam/context.js +5 -5
  54. package/build/services/iam/credentials.js +1 -1
  55. package/build/services/iam/ephemeral.js +8 -15
  56. package/build/services/iam/principal.js +3 -10
  57. package/build/services/iam/resolve.js +1 -1
  58. package/build/services/iam/sql.d.ts +10 -0
  59. package/build/services/iam/sql.js +42 -0
  60. package/build/services/insight/index.d.ts +1 -0
  61. package/build/services/insight/index.js +4 -6
  62. package/build/services/interceptor/activities/escalation.js +1 -1
  63. package/build/services/interceptor/activities/task.js +9 -6
  64. package/build/services/interceptor/activities/workflow.js +4 -5
  65. package/build/services/interceptor/activity-interceptor.d.ts +1 -1
  66. package/build/services/interceptor/activity-interceptor.js +5 -5
  67. package/build/services/interceptor/completion.js +1 -1
  68. package/build/services/interceptor/escalation.js +1 -1
  69. package/build/services/interceptor/index.js +4 -4
  70. package/build/services/interceptor/lifecycle.js +1 -1
  71. package/build/services/maintenance/index.js +4 -5
  72. package/build/services/mcp/adapter.js +1 -16
  73. package/build/services/mcp/client/connection.d.ts +1 -1
  74. package/build/services/mcp/client/connection.js +2 -2
  75. package/build/services/mcp/client/tools.js +1 -1
  76. package/build/services/mcp/db-server/index.js +1 -1
  77. package/build/services/mcp/db-server/tools.js +17 -4
  78. package/build/services/mcp/db.js +1 -1
  79. package/build/services/mcp/playwright-server/index.js +1 -1
  80. package/build/services/mcp/playwright-server/lifecycle.js +1 -1
  81. package/build/services/mcp/playwright-server/schemas.d.ts +2 -2
  82. package/build/services/mcp/playwright-server/tools.js +1 -1
  83. package/build/services/mcp/register-tool.d.ts +11 -0
  84. package/build/services/mcp/register-tool.js +15 -0
  85. package/build/services/mcp/server.js +1 -1
  86. package/build/services/mcp/sql.d.ts +6 -0
  87. package/build/services/mcp/sql.js +34 -1
  88. package/build/services/mcp/workflow-compiler-server.js +1 -1
  89. package/build/services/mcp/workflow-server.js +1 -1
  90. package/build/services/mcp-runs/execution-builder.js +8 -6
  91. package/build/services/mcp-runs/queries.js +2 -2
  92. package/build/services/mcp-runs/sql.d.ts +4 -1
  93. package/build/services/mcp-runs/sql.js +23 -2
  94. package/build/services/namespace/index.js +1 -1
  95. package/build/services/oauth/db.js +9 -37
  96. package/build/services/oauth/index.js +1 -1
  97. package/build/services/oauth/providers/registry.js +1 -1
  98. package/build/services/oauth/sql.d.ts +7 -0
  99. package/build/services/oauth/sql.js +32 -0
  100. package/build/services/orchestrator/index.js +3 -3
  101. package/build/services/role/index.js +1 -1
  102. package/build/services/task/crud.js +1 -1
  103. package/build/services/task/process.js +1 -1
  104. package/build/services/task/resolve.js +1 -1
  105. package/build/services/user/auth.js +1 -1
  106. package/build/services/user/crud.js +1 -1
  107. package/build/services/user/rbac.js +1 -1
  108. package/build/services/user/roles.js +1 -1
  109. package/build/services/user/sql.d.ts +2 -0
  110. package/build/services/user/sql.js +3 -1
  111. package/build/services/yaml-workflow/db-utils.js +1 -1
  112. package/build/services/yaml-workflow/db.js +1 -1
  113. package/build/services/yaml-workflow/deployer-helpers.js +1 -1
  114. package/build/services/yaml-workflow/deployer.js +4 -4
  115. package/build/services/yaml-workflow/generator.js +1 -1
  116. package/build/services/yaml-workflow/input-analyzer-helpers.d.ts +6 -0
  117. package/build/services/yaml-workflow/input-analyzer-helpers.js +36 -7
  118. package/build/services/yaml-workflow/input-analyzer.js +16 -3
  119. package/build/services/yaml-workflow/pipeline/analyze.js +1 -1
  120. package/build/services/yaml-workflow/pipeline/build/dag.js +10 -5
  121. package/build/services/yaml-workflow/pipeline/compile/llm-call.js +1 -1
  122. package/build/services/yaml-workflow/pipeline/extract.js +5 -3
  123. package/build/services/yaml-workflow/pipeline/index.d.ts +5 -0
  124. package/build/services/yaml-workflow/pipeline/index.js +22 -0
  125. package/build/services/yaml-workflow/pipeline/validate.js +2 -2
  126. package/build/services/yaml-workflow/workers/callbacks.js +1 -1
  127. package/build/services/yaml-workflow/workers/events.js +2 -2
  128. package/build/services/yaml-workflow/workers/register.js +8 -8
  129. package/build/start/adapters.js +7 -7
  130. package/build/start/index.js +4 -4
  131. package/build/start/server.js +1 -1
  132. package/build/start/workers.d.ts +1 -2
  133. package/build/start/workers.js +8 -7
  134. package/build/system/activities/claude-code.js +1 -1
  135. package/build/system/activities/file-storage.js +1 -1
  136. package/build/system/activities/knowledge.d.ts +58 -0
  137. package/build/system/activities/knowledge.js +128 -0
  138. package/build/system/activities/sql.d.ts +9 -0
  139. package/build/system/activities/sql.js +41 -0
  140. package/build/system/activities/triage/context.js +1 -1
  141. package/build/system/activities/triage/discovery.d.ts +2 -14
  142. package/build/system/activities/triage/discovery.js +5 -161
  143. package/build/system/activities/triage/llm.d.ts +1 -8
  144. package/build/system/activities/triage/llm.js +2 -28
  145. package/build/system/activities/triage/tools.d.ts +1 -17
  146. package/build/system/activities/triage/tools.js +8 -167
  147. package/build/system/index.js +5 -4
  148. package/build/system/mcp-servers/admin/escalations.d.ts +5 -0
  149. package/build/system/mcp-servers/admin/escalations.js +149 -0
  150. package/build/system/mcp-servers/admin/index.d.ts +31 -0
  151. package/build/system/mcp-servers/admin/index.js +80 -0
  152. package/build/system/mcp-servers/admin/maintenance.d.ts +5 -0
  153. package/build/system/mcp-servers/admin/maintenance.js +58 -0
  154. package/build/system/mcp-servers/admin/mcp-servers.d.ts +5 -0
  155. package/build/system/mcp-servers/admin/mcp-servers.js +146 -0
  156. package/build/system/mcp-servers/admin/schemas.d.ts +411 -0
  157. package/build/system/mcp-servers/admin/schemas.js +177 -0
  158. package/build/system/mcp-servers/admin/tasks.d.ts +5 -0
  159. package/build/system/mcp-servers/admin/tasks.js +112 -0
  160. package/build/system/mcp-servers/admin/users.d.ts +5 -0
  161. package/build/system/mcp-servers/admin/users.js +167 -0
  162. package/build/system/mcp-servers/admin/workflow-config.d.ts +9 -0
  163. package/build/system/mcp-servers/admin/workflow-config.js +118 -0
  164. package/build/system/mcp-servers/admin/workflows.d.ts +6 -0
  165. package/build/system/mcp-servers/admin/workflows.js +138 -0
  166. package/build/system/mcp-servers/admin/yaml-workflows.d.ts +8 -0
  167. package/build/system/mcp-servers/admin/yaml-workflows.js +237 -0
  168. package/build/system/mcp-servers/claude-code.js +1 -1
  169. package/build/system/mcp-servers/db-query/index.js +1 -1
  170. package/build/system/mcp-servers/db-query/tools.js +17 -4
  171. package/build/system/mcp-servers/docs.d.ts +5 -0
  172. package/build/system/mcp-servers/docs.js +147 -0
  173. package/build/system/mcp-servers/file-storage.js +1 -1
  174. package/build/system/mcp-servers/http-fetch.js +1 -1
  175. package/build/system/mcp-servers/human-queue.js +1 -1
  176. package/build/system/mcp-servers/knowledge.d.ts +4 -0
  177. package/build/system/mcp-servers/knowledge.js +137 -0
  178. package/build/system/mcp-servers/oauth.js +1 -1
  179. package/build/system/mcp-servers/playwright/browser-lifecycle.js +1 -1
  180. package/build/system/mcp-servers/playwright/index.js +1 -1
  181. package/build/system/mcp-servers/playwright/schemas.d.ts +19 -8
  182. package/build/system/mcp-servers/playwright/schemas.js +3 -0
  183. package/build/system/mcp-servers/playwright/tools-navigation.js +22 -9
  184. package/build/system/mcp-servers/playwright/tools-run-script.js +20 -3
  185. package/build/system/mcp-servers/playwright/vision-helper.d.ts +12 -0
  186. package/build/system/mcp-servers/playwright/vision-helper.js +81 -0
  187. package/build/system/mcp-servers/playwright-cli/helpers.js +2 -2
  188. package/build/system/mcp-servers/playwright-cli/index.js +1 -1
  189. package/build/system/mcp-servers/playwright-cli/schemas.d.ts +28 -28
  190. package/build/system/mcp-servers/playwright-cli/schemas.js +1 -1
  191. package/build/system/mcp-servers/playwright-cli/tools-auth.js +1 -1
  192. package/build/system/mcp-servers/playwright-cli/tools-capture.js +4 -2
  193. package/build/system/mcp-servers/translation.d.ts +14 -0
  194. package/build/system/mcp-servers/translation.js +130 -0
  195. package/build/system/mcp-servers/vision-prompts.d.ts +2 -0
  196. package/build/system/mcp-servers/vision-prompts.js +9 -0
  197. package/build/system/mcp-servers/{document-vision.d.ts → vision.d.ts} +3 -4
  198. package/build/system/mcp-servers/vision.js +221 -0
  199. package/build/system/mcp-servers/workflow-compiler.js +1 -1
  200. package/build/system/mcp-servers/workflow.js +1 -1
  201. package/build/system/seed/index.js +13 -2
  202. package/build/system/seed/server-definitions.d.ts +1954 -322
  203. package/build/system/seed/server-definitions.js +65 -34
  204. package/build/system/seed/tool-manifests-admin.d.ts +1645 -0
  205. package/build/system/seed/tool-manifests-admin.js +45 -0
  206. package/build/system/seed/tool-manifests-browser.d.ts +1 -1
  207. package/build/system/seed/tool-manifests-browser.js +3 -3
  208. package/build/system/seed/tool-manifests-data.d.ts +62 -21
  209. package/build/system/seed/tool-manifests-data.js +55 -17
  210. package/build/system/seed/tool-manifests-knowledge.d.ts +171 -0
  211. package/build/system/seed/tool-manifests-knowledge.js +94 -0
  212. package/build/system/workflows/mcp-deterministic/index.js +1 -1
  213. package/build/system/workflows/mcp-query/activities/discovery.d.ts +2 -20
  214. package/build/system/workflows/mcp-query/activities/discovery.js +5 -163
  215. package/build/system/workflows/mcp-query/activities/llm.d.ts +1 -7
  216. package/build/system/workflows/mcp-query/activities/llm.js +2 -27
  217. package/build/system/workflows/mcp-query/activities/tool-executor.d.ts +0 -4
  218. package/build/system/workflows/mcp-query/activities/tool-executor.js +2 -106
  219. package/build/system/workflows/mcp-query/activities/tool-loader.d.ts +0 -9
  220. package/build/system/workflows/mcp-query/activities/tool-loader.js +2 -87
  221. package/build/system/workflows/mcp-query/index.js +55 -5
  222. package/build/system/workflows/mcp-query/prompts.d.ts +1 -2
  223. package/build/system/workflows/mcp-query/prompts.js +5 -32
  224. package/build/system/workflows/mcp-query/strategy-advisors.d.ts +3 -14
  225. package/build/system/workflows/mcp-query/strategy-advisors.js +4 -107
  226. package/build/system/workflows/mcp-query/types.d.ts +2 -10
  227. package/build/system/workflows/mcp-query/types.js +0 -1
  228. package/build/system/workflows/mcp-query-router/index.js +1 -1
  229. package/build/system/workflows/mcp-triage/index.d.ts +2 -2
  230. package/build/system/workflows/mcp-triage/index.js +39 -7
  231. package/build/system/workflows/mcp-triage/prompts.js +7 -14
  232. package/build/system/workflows/mcp-triage-deterministic/index.js +1 -1
  233. package/build/system/workflows/mcp-triage-router/index.js +1 -1
  234. package/build/system/workflows/shared/discovery.d.ts +35 -0
  235. package/build/system/workflows/shared/discovery.js +175 -0
  236. package/build/system/workflows/shared/index.d.ts +7 -0
  237. package/build/system/workflows/shared/index.js +18 -0
  238. package/build/system/workflows/shared/llm-caller.d.ts +8 -0
  239. package/build/system/workflows/shared/llm-caller.js +31 -0
  240. package/build/system/workflows/shared/prompts.d.ts +2 -0
  241. package/build/system/workflows/shared/prompts.js +32 -0
  242. package/build/system/workflows/shared/strategy-advisors.d.ts +14 -0
  243. package/build/system/workflows/shared/strategy-advisors.js +109 -0
  244. package/build/system/workflows/shared/tool-executor.d.ts +11 -0
  245. package/build/system/workflows/shared/tool-executor.js +111 -0
  246. package/build/system/workflows/shared/tool-loader.d.ts +19 -0
  247. package/build/system/workflows/shared/tool-loader.js +94 -0
  248. package/build/system/workflows/shared/types.d.ts +9 -0
  249. package/build/system/workflows/shared/types.js +2 -0
  250. package/build/system/workflows/tool-result-guard.d.ts +14 -0
  251. package/build/system/workflows/tool-result-guard.js +78 -0
  252. package/build/tsconfig.tsbuildinfo +1 -1
  253. package/build/types/user.d.ts +2 -0
  254. package/build/vitest.config.d.ts +1 -1
  255. package/build/vitest.integration.config.d.ts +1 -1
  256. package/build/workers/index.js +2 -8
  257. package/dashboard/dist/assets/AdminDashboard-CTyAMUJR.js +2 -0
  258. package/dashboard/dist/assets/AdminDashboard-CTyAMUJR.js.map +1 -0
  259. package/dashboard/dist/assets/AvailableEscalationsPage-BMXV3Q4l.js +2 -0
  260. package/dashboard/dist/assets/AvailableEscalationsPage-BMXV3Q4l.js.map +1 -0
  261. package/dashboard/dist/assets/BotPicker-C51nKFEu.js +2 -0
  262. package/dashboard/dist/assets/{BotPicker-D6FYW1Gt.js.map → BotPicker-C51nKFEu.js.map} +1 -1
  263. package/dashboard/dist/assets/CollapsibleSection-BSyfd8uL.js +2 -0
  264. package/dashboard/dist/assets/{CollapsibleSection-Cxk4wvjT.js.map → CollapsibleSection-BSyfd8uL.js.map} +1 -1
  265. package/dashboard/dist/assets/ConfirmDeleteModal-CBdhia5T.js +2 -0
  266. package/dashboard/dist/assets/{ConfirmDeleteModal-FSXyKjaB.js.map → ConfirmDeleteModal-CBdhia5T.js.map} +1 -1
  267. package/dashboard/dist/assets/CopyableId-dGlewBCS.js +2 -0
  268. package/dashboard/dist/assets/{CopyableId-CBdxWfp8.js.map → CopyableId-dGlewBCS.js.map} +1 -1
  269. package/dashboard/dist/assets/CredentialsPage-CoBNFSAu.js +2 -0
  270. package/dashboard/dist/assets/{CredentialsPage-Ikzsot0w.js.map → CredentialsPage-CoBNFSAu.js.map} +1 -1
  271. package/dashboard/dist/assets/CustomDurationPicker-BataWFj8.js +2 -0
  272. package/dashboard/dist/assets/{CustomDurationPicker-CAninCbl.js.map → CustomDurationPicker-BataWFj8.js.map} +1 -1
  273. package/dashboard/dist/assets/DataTable-B3uf5CCo.js +2 -0
  274. package/dashboard/dist/assets/DataTable-B3uf5CCo.js.map +1 -0
  275. package/dashboard/dist/assets/ElapsedCell-G5oSwTpT.js +2 -0
  276. package/dashboard/dist/assets/ElapsedCell-G5oSwTpT.js.map +1 -0
  277. package/dashboard/dist/assets/EmptyState-BChBJNGS.js +2 -0
  278. package/dashboard/dist/assets/{EmptyState-2CmV-IaS.js.map → EmptyState-BChBJNGS.js.map} +1 -1
  279. package/dashboard/dist/assets/EscalationsOverview-CxUv8xjG.js +2 -0
  280. package/dashboard/dist/assets/{EscalationsOverview-GXYFPASS.js.map → EscalationsOverview-CxUv8xjG.js.map} +1 -1
  281. package/dashboard/dist/assets/EventTable-CVt8B0BZ.js +2 -0
  282. package/dashboard/dist/assets/{EventTable-B01oJf6Y.js.map → EventTable-CVt8B0BZ.js.map} +1 -1
  283. package/dashboard/dist/assets/FilterBar-CShf0oe7.js +2 -0
  284. package/dashboard/dist/assets/{FilterBar-Ck4K4rzu.js.map → FilterBar-CShf0oe7.js.map} +1 -1
  285. package/dashboard/dist/assets/McpOverview-CbaZRnJl.js +2 -0
  286. package/dashboard/dist/assets/{McpOverview-JkvRcX2e.js.map → McpOverview-CbaZRnJl.js.map} +1 -1
  287. package/dashboard/dist/assets/McpQueryDetailPage-CGoR9XK6.js +5 -0
  288. package/dashboard/dist/assets/McpQueryDetailPage-CGoR9XK6.js.map +1 -0
  289. package/dashboard/dist/assets/McpQueryPage-BjXoYQuU.js +2 -0
  290. package/dashboard/dist/assets/McpQueryPage-BjXoYQuU.js.map +1 -0
  291. package/dashboard/dist/assets/McpRunDetailPage-DLkA5Aar.js +2 -0
  292. package/dashboard/dist/assets/McpRunDetailPage-DLkA5Aar.js.map +1 -0
  293. package/dashboard/dist/assets/McpRunsPage-DCh9n11D.js +2 -0
  294. package/dashboard/dist/assets/McpRunsPage-DCh9n11D.js.map +1 -0
  295. package/dashboard/dist/assets/Modal-CI5RBPOQ.js +2 -0
  296. package/dashboard/dist/assets/{Modal-B4rbIVAn.js.map → Modal-CI5RBPOQ.js.map} +1 -1
  297. package/dashboard/dist/assets/OperatorDashboard-Dc80suXd.js +2 -0
  298. package/dashboard/dist/assets/OperatorDashboard-Dc80suXd.js.map +1 -0
  299. package/dashboard/dist/assets/PageHeader-SMD9qtOO.js +2 -0
  300. package/dashboard/dist/assets/PageHeader-SMD9qtOO.js.map +1 -0
  301. package/dashboard/dist/assets/PageHeaderWithStats-TikLQsTp.js +2 -0
  302. package/dashboard/dist/assets/PageHeaderWithStats-TikLQsTp.js.map +1 -0
  303. package/dashboard/dist/assets/PriorityBadge-CQ0EsLTA.js +2 -0
  304. package/dashboard/dist/assets/{PriorityBadge-DfQY9St9.js.map → PriorityBadge-CQ0EsLTA.js.map} +1 -1
  305. package/dashboard/dist/assets/ProcessDetailPage-B2GKuGzk.js +2 -0
  306. package/dashboard/dist/assets/ProcessDetailPage-B2GKuGzk.js.map +1 -0
  307. package/dashboard/dist/assets/ProcessesListPage-CTjI3Wn6.js +2 -0
  308. package/dashboard/dist/assets/ProcessesListPage-CTjI3Wn6.js.map +1 -0
  309. package/dashboard/dist/assets/RefreshButton-BcQDObrv.js +2 -0
  310. package/dashboard/dist/assets/RefreshButton-BcQDObrv.js.map +1 -0
  311. package/dashboard/dist/assets/RolePill-Crj4TH5p.js +2 -0
  312. package/dashboard/dist/assets/{RolePill-BTPa8L-P.js.map → RolePill-Crj4TH5p.js.map} +1 -1
  313. package/dashboard/dist/assets/RolesPage-C_RInUwS.js +2 -0
  314. package/dashboard/dist/assets/RolesPage-C_RInUwS.js.map +1 -0
  315. package/dashboard/dist/assets/RowActions-Cp5HyK_w.js +2 -0
  316. package/dashboard/dist/assets/{RowActions-Dg-Fsm5O.js.map → RowActions-Cp5HyK_w.js.map} +1 -1
  317. package/dashboard/dist/assets/RunAsSelector-BhyWtofX.js +2 -0
  318. package/dashboard/dist/assets/RunAsSelector-BhyWtofX.js.map +1 -0
  319. package/dashboard/dist/assets/StatCard-BKZLSgNV.js +2 -0
  320. package/dashboard/dist/assets/{StatCard-DlgF0CJC.js.map → StatCard-BKZLSgNV.js.map} +1 -1
  321. package/dashboard/dist/assets/StatusBadge-BYNGGZK5.js +2 -0
  322. package/dashboard/dist/assets/StatusBadge-BYNGGZK5.js.map +1 -0
  323. package/dashboard/dist/assets/StickyPagination-CTosgiU2.js +2 -0
  324. package/dashboard/dist/assets/{StickyPagination-F9FZsRy9.js.map → StickyPagination-CTosgiU2.js.map} +1 -1
  325. package/dashboard/dist/assets/SwimlaneTimeline-ylG5Ps1s.js +2 -0
  326. package/dashboard/dist/assets/SwimlaneTimeline-ylG5Ps1s.js.map +1 -0
  327. package/dashboard/dist/assets/TaskDetailPage-C9pDGdD2.js +2 -0
  328. package/dashboard/dist/assets/TaskDetailPage-C9pDGdD2.js.map +1 -0
  329. package/dashboard/dist/assets/TaskQueuePill-BtJbZTT0.js +2 -0
  330. package/dashboard/dist/assets/{TaskQueuePill-awmtb0qw.js.map → TaskQueuePill-BtJbZTT0.js.map} +1 -1
  331. package/dashboard/dist/assets/TasksListPage-DtFLUEhg.js +2 -0
  332. package/dashboard/dist/assets/{TasksListPage-C_QF23c1.js.map → TasksListPage-DtFLUEhg.js.map} +1 -1
  333. package/dashboard/dist/assets/TimeAgo-WuM6xImZ.js +2 -0
  334. package/dashboard/dist/assets/TimeAgo-WuM6xImZ.js.map +1 -0
  335. package/dashboard/dist/assets/TimestampCell-IVL_-Upy.js +2 -0
  336. package/dashboard/dist/assets/TimestampCell-IVL_-Upy.js.map +1 -0
  337. package/dashboard/dist/assets/UserName-DU9qeg13.js +2 -0
  338. package/dashboard/dist/assets/{UserName-DaP4YAKr.js.map → UserName-DU9qeg13.js.map} +1 -1
  339. package/dashboard/dist/assets/WorkflowExecutionPage-DOocX81f.js +2 -0
  340. package/dashboard/dist/assets/WorkflowExecutionPage-DOocX81f.js.map +1 -0
  341. package/dashboard/dist/assets/WorkflowPill-Diw8iWBP.js +2 -0
  342. package/dashboard/dist/assets/WorkflowPill-Diw8iWBP.js.map +1 -0
  343. package/dashboard/dist/assets/WorkflowsDashboard-DDtUIrTy.js +2 -0
  344. package/dashboard/dist/assets/WorkflowsDashboard-DDtUIrTy.js.map +1 -0
  345. package/dashboard/dist/assets/WorkflowsOverview-CPuvA4t3.js +2 -0
  346. package/dashboard/dist/assets/{WorkflowsOverview-D9OzzQqw.js.map → WorkflowsOverview-CPuvA4t3.js.map} +1 -1
  347. package/dashboard/dist/assets/YamlWorkflowsPage-DlwwkluN.js +2 -0
  348. package/dashboard/dist/assets/YamlWorkflowsPage-DlwwkluN.js.map +1 -0
  349. package/dashboard/dist/assets/{bots-BkKVMbUW.js → bots-BPiZXf2h.js} +2 -2
  350. package/dashboard/dist/assets/{bots-BkKVMbUW.js.map → bots-BPiZXf2h.js.map} +1 -1
  351. package/dashboard/dist/assets/constants-BHkpVaqx.js +2 -0
  352. package/dashboard/dist/assets/constants-BHkpVaqx.js.map +1 -0
  353. package/dashboard/dist/assets/escalation-DTY_OKRh.js +2 -0
  354. package/dashboard/dist/assets/escalation-DTY_OKRh.js.map +1 -0
  355. package/dashboard/dist/assets/escalation-columns-C91fHSkp.js +2 -0
  356. package/dashboard/dist/assets/{escalation-columns-D6aqStaY.js.map → escalation-columns-C91fHSkp.js.map} +1 -1
  357. package/dashboard/dist/assets/helpers-DBUZ9pnG.js +2 -0
  358. package/dashboard/dist/assets/helpers-DBUZ9pnG.js.map +1 -0
  359. package/dashboard/dist/assets/index-BOeA-gfK.js +17 -0
  360. package/dashboard/dist/assets/{index-X85K5bHC.js.map → index-BOeA-gfK.js.map} +1 -1
  361. package/dashboard/dist/assets/index-BZ6K_kmL.js +3 -0
  362. package/dashboard/dist/assets/index-BZ6K_kmL.js.map +1 -0
  363. package/dashboard/dist/assets/index-Bpm0yeoi.js +2 -0
  364. package/dashboard/dist/assets/index-Bpm0yeoi.js.map +1 -0
  365. package/dashboard/dist/assets/index-BtOwLI0K.js +2 -0
  366. package/dashboard/dist/assets/{index-DTPzZr_X.js.map → index-BtOwLI0K.js.map} +1 -1
  367. package/dashboard/dist/assets/index-CBF3ZvRZ.js +6 -0
  368. package/dashboard/dist/assets/index-CBF3ZvRZ.js.map +1 -0
  369. package/dashboard/dist/assets/index-CDWOfCmi.js +2 -0
  370. package/dashboard/dist/assets/index-CDWOfCmi.js.map +1 -0
  371. package/dashboard/dist/assets/index-Ce6sL__n.js +2 -0
  372. package/dashboard/dist/assets/index-Ce6sL__n.js.map +1 -0
  373. package/dashboard/dist/assets/index-DSzSoku1.js +283 -0
  374. package/dashboard/dist/assets/index-DSzSoku1.js.map +1 -0
  375. package/dashboard/dist/assets/index-D_qEAYrg.js +2 -0
  376. package/dashboard/dist/assets/index-D_qEAYrg.js.map +1 -0
  377. package/dashboard/dist/assets/index-gCy9XX3W.css +1 -0
  378. package/dashboard/dist/assets/mcp-BzVpaaKF.js +2 -0
  379. package/dashboard/dist/assets/{mcp-blCW6IL7.js.map → mcp-BzVpaaKF.js.map} +1 -1
  380. package/dashboard/dist/assets/mcp-query-wTuxTTCV.js +2 -0
  381. package/dashboard/dist/assets/mcp-query-wTuxTTCV.js.map +1 -0
  382. package/dashboard/dist/assets/{mcp-runs-ChPbpvXK.js → mcp-runs-DmXYJD19.js} +2 -2
  383. package/dashboard/dist/assets/{mcp-runs-ChPbpvXK.js.map → mcp-runs-DmXYJD19.js.map} +1 -1
  384. package/dashboard/dist/assets/namespaces-DoGa7jc7.js +2 -0
  385. package/dashboard/dist/assets/{namespaces-BgbaC3ow.js.map → namespaces-DoGa7jc7.js.map} +1 -1
  386. package/dashboard/dist/assets/{roles-ZNrqqnQl.js → roles-wCdQ2Z7k.js} +2 -2
  387. package/dashboard/dist/assets/{roles-ZNrqqnQl.js.map → roles-wCdQ2Z7k.js.map} +1 -1
  388. package/dashboard/dist/assets/settings-DDe_L7JT.js +2 -0
  389. package/dashboard/dist/assets/{settings-eBRSE0mQ.js.map → settings-DDe_L7JT.js.map} +1 -1
  390. package/dashboard/dist/assets/tasks-3Hih8Bt7.js +2 -0
  391. package/dashboard/dist/assets/{tasks-tRqClPns.js.map → tasks-3Hih8Bt7.js.map} +1 -1
  392. package/dashboard/dist/assets/{useFilterParams-BaXUAkYK.js → useFilterParams-BUyLHcx_.js} +2 -2
  393. package/dashboard/dist/assets/{useFilterParams-BaXUAkYK.js.map → useFilterParams-BUyLHcx_.js.map} +1 -1
  394. package/dashboard/dist/assets/{useNatsEvents-Xr43X1fG.js → useNatsEvents-DeGKHFTX.js} +2 -2
  395. package/dashboard/dist/assets/{useNatsEvents-Xr43X1fG.js.map → useNatsEvents-DeGKHFTX.js.map} +1 -1
  396. package/dashboard/dist/assets/{useYamlActivityEvents-BO51u8tm.js → useYamlActivityEvents-B5dHec6Y.js} +2 -2
  397. package/dashboard/dist/assets/{useYamlActivityEvents-BO51u8tm.js.map → useYamlActivityEvents-B5dHec6Y.js.map} +1 -1
  398. package/dashboard/dist/assets/{users-tMvNyOo8.js → users-BTagPmGW.js} +2 -2
  399. package/dashboard/dist/assets/{users-tMvNyOo8.js.map → users-BTagPmGW.js.map} +1 -1
  400. package/dashboard/dist/assets/{vendor-icons-ZTAKVwGc.js → vendor-icons-DCLlGYO9.js} +112 -57
  401. package/dashboard/dist/assets/vendor-icons-DCLlGYO9.js.map +1 -0
  402. package/dashboard/dist/assets/vendor-query-DLp59M9_.js +35 -0
  403. package/dashboard/dist/assets/vendor-query-DLp59M9_.js.map +1 -0
  404. package/dashboard/dist/assets/vendor-react-Co3Y8ikm.js +26 -0
  405. package/dashboard/dist/assets/vendor-react-Co3Y8ikm.js.map +1 -0
  406. package/dashboard/dist/assets/{workflows-Cc4VHcrp.js → workflows-B20dR3NE.js} +2 -2
  407. package/dashboard/dist/assets/{workflows-Cc4VHcrp.js.map → workflows-B20dR3NE.js.map} +1 -1
  408. package/dashboard/dist/assets/yaml-workflows-CaLPMQha.js +2 -0
  409. package/dashboard/dist/assets/yaml-workflows-CaLPMQha.js.map +1 -0
  410. package/dashboard/dist/index.html +5 -5
  411. package/docs/api/dba.md +81 -0
  412. package/docs/api/escalations.md +575 -0
  413. package/docs/api/exports.md +170 -0
  414. package/docs/api/maintenance.md +93 -0
  415. package/docs/api/mcp-runs.md +128 -0
  416. package/docs/api/mcp-servers.md +195 -0
  417. package/docs/api/namespaces.md +48 -0
  418. package/docs/api/roles.md +390 -0
  419. package/docs/api/service-accounts.md +188 -0
  420. package/docs/api/settings.md +33 -0
  421. package/docs/api/tasks.md +167 -0
  422. package/docs/api/users.md +180 -0
  423. package/docs/api/workflows.md +616 -0
  424. package/docs/api/yaml-workflows.md +312 -0
  425. package/docs/architecture.md +221 -0
  426. package/docs/auth.md +181 -0
  427. package/docs/cloud.md +272 -0
  428. package/docs/compilation.md +136 -0
  429. package/docs/contributing.md +56 -0
  430. package/docs/dashboard.md +145 -0
  431. package/docs/data.md +478 -0
  432. package/docs/escalation-strategies.md +264 -0
  433. package/docs/events.md +251 -0
  434. package/docs/iam.md +222 -0
  435. package/docs/img/01-login.png +0 -0
  436. package/docs/img/02-dashboard-home.png +0 -0
  437. package/docs/img/03-processes-list.png +0 -0
  438. package/docs/img/04-escalations-list.png +0 -0
  439. package/docs/img/05-mcp-servers.png +0 -0
  440. package/docs/img/06-mcp-pipelines.png +0 -0
  441. package/docs/img/07-workflows-list.png +0 -0
  442. package/docs/img/compilation/01-query-submit.png +0 -0
  443. package/docs/img/compilation/02-mcp-servers.png +0 -0
  444. package/docs/img/compilation/03-query-completed.png +0 -0
  445. package/docs/img/compilation/04-wizard-original.png +0 -0
  446. package/docs/img/compilation/05-wizard-timeline.png +0 -0
  447. package/docs/img/compilation/06-wizard-profile.png +0 -0
  448. package/docs/img/compilation/07-wizard-deploy.png +0 -0
  449. package/docs/img/compilation/08-wizard-test-modal.png +0 -0
  450. package/docs/img/compilation/09-wizard-test-compare.png +0 -0
  451. package/docs/img/compilation/10-wizard-verify.png +0 -0
  452. package/docs/logging.md +110 -0
  453. package/docs/maintenance.md +221 -0
  454. package/docs/mcp.md +715 -0
  455. package/docs/oauth-and-delegation.md +469 -0
  456. package/docs/telemetry.md +144 -0
  457. package/docs/workflows.md +695 -0
  458. package/lib/db/schemas/015_knowledge.sql +23 -0
  459. package/package.json +8 -9
  460. package/build/services/db/index.d.ts +0 -3
  461. package/build/services/mcp/vision-server.d.ts +0 -15
  462. package/build/services/mcp/vision-server.js +0 -214
  463. package/build/system/mcp-servers/document-vision.js +0 -228
  464. package/build/system/mcp-servers/prompts.d.ts +0 -4
  465. package/build/system/mcp-servers/prompts.js +0 -10
  466. package/dashboard/dist/assets/AdminDashboard-jfacvOC7.js +0 -2
  467. package/dashboard/dist/assets/AdminDashboard-jfacvOC7.js.map +0 -1
  468. package/dashboard/dist/assets/AvailableEscalationsPage-BglLDoT8.js +0 -2
  469. package/dashboard/dist/assets/AvailableEscalationsPage-BglLDoT8.js.map +0 -1
  470. package/dashboard/dist/assets/BotPicker-D6FYW1Gt.js +0 -2
  471. package/dashboard/dist/assets/CollapsibleSection-Cxk4wvjT.js +0 -2
  472. package/dashboard/dist/assets/ConfirmDeleteModal-FSXyKjaB.js +0 -2
  473. package/dashboard/dist/assets/CopyableId-CBdxWfp8.js +0 -2
  474. package/dashboard/dist/assets/CredentialsPage-Ikzsot0w.js +0 -2
  475. package/dashboard/dist/assets/CustomDurationPicker-CAninCbl.js +0 -2
  476. package/dashboard/dist/assets/DataTable-BDn1WBHS.js +0 -2
  477. package/dashboard/dist/assets/DataTable-BDn1WBHS.js.map +0 -1
  478. package/dashboard/dist/assets/EmptyState-2CmV-IaS.js +0 -2
  479. package/dashboard/dist/assets/EscalationsOverview-GXYFPASS.js +0 -2
  480. package/dashboard/dist/assets/EventTable-B01oJf6Y.js +0 -2
  481. package/dashboard/dist/assets/Field-DuFBAYhu.js +0 -2
  482. package/dashboard/dist/assets/Field-DuFBAYhu.js.map +0 -1
  483. package/dashboard/dist/assets/FilterBar-Ck4K4rzu.js +0 -2
  484. package/dashboard/dist/assets/McpOverview-JkvRcX2e.js +0 -2
  485. package/dashboard/dist/assets/McpQueryDetailPage-CUMqhQdS.js +0 -2
  486. package/dashboard/dist/assets/McpQueryDetailPage-CUMqhQdS.js.map +0 -1
  487. package/dashboard/dist/assets/McpQueryPage-DRRhw4nN.js +0 -2
  488. package/dashboard/dist/assets/McpQueryPage-DRRhw4nN.js.map +0 -1
  489. package/dashboard/dist/assets/McpRunDetailPage-CmPs5EvE.js +0 -2
  490. package/dashboard/dist/assets/McpRunDetailPage-CmPs5EvE.js.map +0 -1
  491. package/dashboard/dist/assets/McpRunsPage-Dl5Y2u6k.js +0 -2
  492. package/dashboard/dist/assets/McpRunsPage-Dl5Y2u6k.js.map +0 -1
  493. package/dashboard/dist/assets/Modal-B4rbIVAn.js +0 -2
  494. package/dashboard/dist/assets/OperatorDashboard-B56il28q.js +0 -2
  495. package/dashboard/dist/assets/OperatorDashboard-B56il28q.js.map +0 -1
  496. package/dashboard/dist/assets/PageHeader-CpWFly5S.js +0 -2
  497. package/dashboard/dist/assets/PageHeader-CpWFly5S.js.map +0 -1
  498. package/dashboard/dist/assets/PriorityBadge-DfQY9St9.js +0 -2
  499. package/dashboard/dist/assets/ProcessDetailPage-CMLq4M7D.js +0 -2
  500. package/dashboard/dist/assets/ProcessDetailPage-CMLq4M7D.js.map +0 -1
  501. package/dashboard/dist/assets/ProcessesListPage-CZ_HF06v.js +0 -2
  502. package/dashboard/dist/assets/ProcessesListPage-CZ_HF06v.js.map +0 -1
  503. package/dashboard/dist/assets/RolePill-BTPa8L-P.js +0 -2
  504. package/dashboard/dist/assets/RolesPage-9grZW7yR.js +0 -2
  505. package/dashboard/dist/assets/RolesPage-9grZW7yR.js.map +0 -1
  506. package/dashboard/dist/assets/RowActions-Dg-Fsm5O.js +0 -2
  507. package/dashboard/dist/assets/SimpleMarkdown-CBlvaWP4.js +0 -4
  508. package/dashboard/dist/assets/SimpleMarkdown-CBlvaWP4.js.map +0 -1
  509. package/dashboard/dist/assets/StatCard-DlgF0CJC.js +0 -2
  510. package/dashboard/dist/assets/StatusBadge-TlC4jiig.js +0 -2
  511. package/dashboard/dist/assets/StatusBadge-TlC4jiig.js.map +0 -1
  512. package/dashboard/dist/assets/StickyPagination-F9FZsRy9.js +0 -2
  513. package/dashboard/dist/assets/SwimlaneTimeline-7SiwATsZ.js +0 -2
  514. package/dashboard/dist/assets/SwimlaneTimeline-7SiwATsZ.js.map +0 -1
  515. package/dashboard/dist/assets/TaskDetailPage-CbPVTakt.js +0 -2
  516. package/dashboard/dist/assets/TaskDetailPage-CbPVTakt.js.map +0 -1
  517. package/dashboard/dist/assets/TaskQueuePill-awmtb0qw.js +0 -2
  518. package/dashboard/dist/assets/TasksListPage-C_QF23c1.js +0 -2
  519. package/dashboard/dist/assets/TimeAgo-UPG6DoH8.js +0 -2
  520. package/dashboard/dist/assets/TimeAgo-UPG6DoH8.js.map +0 -1
  521. package/dashboard/dist/assets/TimestampCell-DoWMKg6w.js +0 -2
  522. package/dashboard/dist/assets/TimestampCell-DoWMKg6w.js.map +0 -1
  523. package/dashboard/dist/assets/UserName-DaP4YAKr.js +0 -2
  524. package/dashboard/dist/assets/VersionHistory-Bt7WBr6m.js +0 -5
  525. package/dashboard/dist/assets/VersionHistory-Bt7WBr6m.js.map +0 -1
  526. package/dashboard/dist/assets/WorkflowExecutionPage-DjtAQ3hy.js +0 -2
  527. package/dashboard/dist/assets/WorkflowExecutionPage-DjtAQ3hy.js.map +0 -1
  528. package/dashboard/dist/assets/WorkflowPill-CCDSVaQj.js +0 -2
  529. package/dashboard/dist/assets/WorkflowPill-CCDSVaQj.js.map +0 -1
  530. package/dashboard/dist/assets/WorkflowsDashboard-D8z9uBNB.js +0 -2
  531. package/dashboard/dist/assets/WorkflowsDashboard-D8z9uBNB.js.map +0 -1
  532. package/dashboard/dist/assets/WorkflowsOverview-D9OzzQqw.js +0 -2
  533. package/dashboard/dist/assets/YamlWorkflowDetailPage-DrDvvP62.js +0 -3
  534. package/dashboard/dist/assets/YamlWorkflowDetailPage-DrDvvP62.js.map +0 -1
  535. package/dashboard/dist/assets/YamlWorkflowsPage-COqiNCQK.js +0 -2
  536. package/dashboard/dist/assets/YamlWorkflowsPage-COqiNCQK.js.map +0 -1
  537. package/dashboard/dist/assets/constants-CgaZfe5d.js +0 -2
  538. package/dashboard/dist/assets/constants-CgaZfe5d.js.map +0 -1
  539. package/dashboard/dist/assets/escalation-columns-D6aqStaY.js +0 -2
  540. package/dashboard/dist/assets/escalation-qalymbKB.js +0 -2
  541. package/dashboard/dist/assets/escalation-qalymbKB.js.map +0 -1
  542. package/dashboard/dist/assets/format-gXZXQ-HJ.js +0 -2
  543. package/dashboard/dist/assets/format-gXZXQ-HJ.js.map +0 -1
  544. package/dashboard/dist/assets/helpers-0gSleuzT.js +0 -2
  545. package/dashboard/dist/assets/helpers-0gSleuzT.js.map +0 -1
  546. package/dashboard/dist/assets/index-BWvMHed7.js +0 -6
  547. package/dashboard/dist/assets/index-BWvMHed7.js.map +0 -1
  548. package/dashboard/dist/assets/index-BaszoPO_.css +0 -1
  549. package/dashboard/dist/assets/index-Cn2jyj9A.js +0 -2
  550. package/dashboard/dist/assets/index-Cn2jyj9A.js.map +0 -1
  551. package/dashboard/dist/assets/index-D8VH6K8B.js +0 -54
  552. package/dashboard/dist/assets/index-D8VH6K8B.js.map +0 -1
  553. package/dashboard/dist/assets/index-D9SYwJsi.js +0 -3
  554. package/dashboard/dist/assets/index-D9SYwJsi.js.map +0 -1
  555. package/dashboard/dist/assets/index-DTPzZr_X.js +0 -2
  556. package/dashboard/dist/assets/index-D_6AB5BE.js +0 -2
  557. package/dashboard/dist/assets/index-D_6AB5BE.js.map +0 -1
  558. package/dashboard/dist/assets/index-S9Ks2Lj2.js +0 -2
  559. package/dashboard/dist/assets/index-S9Ks2Lj2.js.map +0 -1
  560. package/dashboard/dist/assets/index-X85K5bHC.js +0 -17
  561. package/dashboard/dist/assets/index-rjmgHlSH.js +0 -2
  562. package/dashboard/dist/assets/index-rjmgHlSH.js.map +0 -1
  563. package/dashboard/dist/assets/mcp-blCW6IL7.js +0 -2
  564. package/dashboard/dist/assets/mcp-query-DoAyPbjC.js +0 -2
  565. package/dashboard/dist/assets/mcp-query-DoAyPbjC.js.map +0 -1
  566. package/dashboard/dist/assets/namespaces-BgbaC3ow.js +0 -2
  567. package/dashboard/dist/assets/settings-eBRSE0mQ.js +0 -2
  568. package/dashboard/dist/assets/tasks-tRqClPns.js +0 -2
  569. package/dashboard/dist/assets/vendor-icons-ZTAKVwGc.js.map +0 -1
  570. package/dashboard/dist/assets/vendor-query-B2UbickB.js +0 -18
  571. package/dashboard/dist/assets/vendor-query-B2UbickB.js.map +0 -1
  572. package/dashboard/dist/assets/vendor-react-Cw8Gy8NJ.js +0 -22
  573. package/dashboard/dist/assets/vendor-react-Cw8Gy8NJ.js.map +0 -1
  574. package/dashboard/dist/assets/yaml-workflows-BL4V5CQy.js +0 -2
  575. package/dashboard/dist/assets/yaml-workflows-BL4V5CQy.js.map +0 -1
  576. /package/build/{services → lib}/db/migrate.d.ts +0 -0
  577. /package/build/{services → lib}/events/index.d.ts +0 -0
  578. /package/build/{services → lib}/events/index.js +0 -0
  579. /package/build/{services → lib}/events/memory.d.ts +0 -0
  580. /package/build/{services → lib}/events/memory.js +0 -0
  581. /package/build/{services → lib}/events/nats.d.ts +0 -0
  582. /package/build/{services → lib}/events/nats.js +0 -0
  583. /package/build/{services → lib}/events/publish.d.ts +0 -0
  584. /package/build/{services → lib}/events/publish.js +0 -0
  585. /package/build/{services → lib}/events/socketio.d.ts +0 -0
  586. /package/build/{services → lib}/events/socketio.js +0 -0
  587. /package/build/{services → lib}/logger/index.d.ts +0 -0
  588. /package/build/{services → lib}/logger/index.js +0 -0
  589. /package/build/{services → lib}/logger/pino.d.ts +0 -0
  590. /package/build/{services → lib}/logger/pino.js +0 -0
  591. /package/build/{services → lib}/storage/index.d.ts +0 -0
  592. /package/build/{services → lib}/storage/index.js +0 -0
  593. /package/build/{services → lib}/storage/local.d.ts +0 -0
  594. /package/build/{services → lib}/storage/local.js +0 -0
  595. /package/build/{services → lib}/storage/s3.d.ts +0 -0
  596. /package/build/{services → lib}/storage/s3.js +0 -0
  597. /package/build/{services → lib}/storage/types.d.ts +0 -0
  598. /package/build/{services → lib}/storage/types.js +0 -0
  599. /package/build/{services → lib}/telemetry/index.d.ts +0 -0
  600. /package/build/{services → lib}/telemetry/index.js +0 -0
  601. /package/{services → lib}/db/README.md +0 -0
  602. /package/{services → lib}/db/schemas/001_schema.sql +0 -0
  603. /package/{services → lib}/db/schemas/002_seed.sql +0 -0
  604. /package/{services → lib}/db/schemas/003_workflow_discovery.sql +0 -0
  605. /package/{services → lib}/db/schemas/004_query_router.sql +0 -0
  606. /package/{services → lib}/db/schemas/005_triage_router.sql +0 -0
  607. /package/{services → lib}/db/schemas/006_oauth.sql +0 -0
  608. /package/{services → lib}/db/schemas/007_security.sql +0 -0
  609. /package/{services → lib}/db/schemas/008_bot_accounts.sql +0 -0
  610. /package/{services → lib}/db/schemas/009_audit_trail.sql +0 -0
  611. /package/{services → lib}/db/schemas/010_credential_providers.sql +0 -0
  612. /package/{services → lib}/db/schemas/011_system_workflow_configs.sql +0 -0
  613. /package/{services → lib}/db/schemas/012_drop_modality.sql +0 -0
  614. /package/{services → lib}/db/schemas/013_execute_as.sql +0 -0
  615. /package/{services → lib}/db/schemas/014_ephemeral_credentials.sql +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"McpQueryDetailPage-CUMqhQdS.js","sources":["../../src/components/common/layout/WizardSteps.tsx","../../src/hooks/useWizardStep.ts","../../src/pages/mcp/mcp-query-detail/helpers.ts","../../src/components/common/layout/WizardNav.tsx","../../src/pages/mcp/mcp-query-detail/PanelTitle.tsx","../../src/pages/mcp/mcp-query-detail/ResultSummary.tsx","../../src/pages/mcp/mcp-query-detail/OriginalQueryPanel.tsx","../../src/pages/mcp/mcp-query-detail/TimelinePanel.tsx","../../src/pages/mcp/mcp-query-detail/SectionHeading.tsx","../../src/pages/mcp/mcp-query-detail/ProfilePanel.tsx","../../src/pages/mcp/mcp-query-detail/DeployPanel.tsx","../../src/pages/mcp/mcp-query-detail/TestPanel.tsx","../../src/pages/mcp/mcp-query-detail/RouterProgressTracker.tsx","../../src/pages/mcp/mcp-query-detail/VerifyPanel.tsx","../../src/pages/mcp/mcp-query-detail/EscalationBanner.tsx","../../src/pages/mcp/mcp-query-detail/McpQueryDetailPage.tsx"],"sourcesContent":["/**\n * Reusable wizard step indicator — sticky at top on scroll.\n * Numbered-circle pattern for multi-step wizard flows.\n */\n\ninterface WizardStepsProps {\n labels: readonly string[];\n current: number;\n /** Highest step the user can navigate to */\n maxReachable: number;\n onStepClick: (step: number) => void;\n}\n\nexport function WizardSteps({ labels, current, maxReachable, onStepClick }: WizardStepsProps) {\n return (\n <div className=\"sticky top-0 z-10 bg-surface/95 backdrop-blur-sm pb-6 pt-1 -mt-1\">\n <div className=\"flex items-center gap-3\">\n {labels.map((label, i) => {\n const s = i + 1;\n const isReachable = s <= maxReachable;\n return (\n <div key={s} className=\"flex items-center gap-2\">\n {s > 1 && <div className={`w-8 h-px ${current >= s ? 'bg-accent' : 'bg-surface-border'}`} />}\n <button\n onClick={() => isReachable && onStepClick(s)}\n disabled={!isReachable}\n className={`w-6 h-6 rounded-full text-[11px] font-semibold flex items-center justify-center transition-colors ${\n current === s\n ? 'bg-accent text-text-inverse'\n : isReachable\n ? 'bg-accent/20 text-accent cursor-pointer hover:bg-accent/30'\n : 'bg-surface-sunken text-text-tertiary cursor-default'\n }`}\n >\n {s}\n </button>\n <span className={`text-xs ${current === s ? 'text-text-primary font-medium' : 'text-text-tertiary'}`}>\n {label}\n </span>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","import { useCallback } from 'react';\nimport { useSearchParams } from 'react-router-dom';\n\n/**\n * Manage wizard step via URL search param for deep-linkable browser history.\n * Returns [currentStep, setStep] where step is synced to ?step=N in the URL.\n * When step param is absent, returns null (caller should use autoStep).\n */\nexport function useWizardStep(): [number | null, (step: number | null) => void] {\n const [searchParams, setSearchParams] = useSearchParams();\n\n const current = searchParams.get('step');\n const stepValue = current ? parseInt(current, 10) : null;\n\n const setStep = useCallback((step: number | null) => {\n setSearchParams((prev) => {\n const next = new URLSearchParams(prev);\n if (step === null) {\n next.delete('step');\n } else {\n next.set('step', String(step));\n }\n return next;\n }, { replace: false }); // push to history for back/forward nav\n }, [setSearchParams]);\n\n return [stepValue, setStep];\n}\n","// ── Shared helpers for MCP Query Detail wizard panels ────────────────────────\n\nexport type Step = 1 | 2 | 3 | 4 | 5 | 6;\n\nexport const STEP_LABELS_BASE = ['Original', 'Timeline', 'Profile', 'Deploy', 'Test', 'Verify'] as const;\n\n/**\n * Maps an execution record to a simplified status string.\n */\nexport function mapStatus(exec: { status?: string } | undefined): string {\n if (!exec) return 'pending';\n if (exec.status === 'completed') return 'completed';\n if (exec.status === 'failed') return 'failed';\n return 'in_progress';\n}\n\n/**\n * Extracts the first JSON object from an LLM summary that may contain\n * fenced code blocks or inline JSON.\n */\nexport function extractJsonFromSummary(summary: string): Record<string, unknown> | null {\n const match = summary.match(/```json\\s*([\\s\\S]*?)```/) || summary.match(/\\{[\\s\\S]*?\\n\\}/);\n if (!match) return null;\n try { return JSON.parse((match[1] ?? match[0]).trim()); } catch { return null; }\n}\n","/**\n * Sticky bottom navigation bar for wizard flows.\n * Pins Back/Next buttons to the bottom of the viewport.\n */\n\ninterface WizardNavProps {\n children: React.ReactNode;\n}\n\nexport function WizardNav({ children }: WizardNavProps) {\n return (\n <div className=\"sticky bg-surface/95 backdrop-blur-sm border-t border-surface-border -mx-10 px-10 pt-3 pb-5 z-10 flex justify-between items-center mt-8\" style={{ bottom: 'calc(var(--feed-height, 0px) - 8px)' }}>\n {children}\n </div>\n );\n}\n","/**\n * Consistent heading for each wizard panel: a title and optional subtitle.\n */\nexport function PanelTitle({ title, subtitle }: { title: string; subtitle?: string }) {\n return (\n <div className=\"mb-6\">\n <h2 className=\"text-lg font-light text-text-primary\">{title}</h2>\n {subtitle && <p className=\"text-xs text-text-tertiary mt-0.5\">{subtitle}</p>}\n </div>\n );\n}\n","import { JsonViewer } from '../../../components/common/data/JsonViewer';\nimport { SimpleMarkdown } from '../../../components/common/display/SimpleMarkdown';\n\n/**\n * Renders an LLM result string that may contain interleaved prose and JSON blocks.\n * JSON blocks are rendered as interactive tree viewers; prose as markdown.\n */\nexport function ResultSummary({ text }: { text: string }) {\n const parts: Array<{ type: 'text' | 'json'; content: string }> = [];\n const jsonBlockRe = /\\n?\\{[\\s\\S]*?\\n\\}/g;\n let lastIndex = 0;\n for (const match of text.matchAll(jsonBlockRe)) {\n try {\n JSON.parse(match[0].trim());\n if (match.index! > lastIndex) parts.push({ type: 'text', content: text.slice(lastIndex, match.index) });\n parts.push({ type: 'json', content: match[0].trim() });\n lastIndex = match.index! + match[0].length;\n } catch { /* not JSON */ }\n }\n if (lastIndex < text.length) parts.push({ type: 'text', content: text.slice(lastIndex) });\n if (!parts.length) parts.push({ type: 'text', content: text });\n return (\n <div className=\"space-y-3\">\n {parts.map((p, i) => p.type === 'json'\n ? <JsonViewer key={i} data={JSON.parse(p.content)} defaultMode=\"tree\" />\n : p.content.trim() ? <SimpleMarkdown key={i} content={p.content.trim()} /> : null)}\n </div>\n );\n}\n","import { JsonViewer } from '../../../components/common/data/JsonViewer';\nimport { WizardNav } from '../../../components/common/layout/WizardNav';\nimport { PanelTitle } from './PanelTitle';\nimport { ResultSummary } from './ResultSummary';\n\ninterface OriginalQueryPanelProps {\n status: string;\n originalEnvelope: Record<string, unknown> | null;\n originalPrompt: string | undefined;\n originalOutput: unknown;\n originalDurationMs: number | null | undefined;\n resultSummary: string | undefined;\n onNext: () => void;\n}\n\nexport function OriginalQueryPanel({\n status,\n originalEnvelope,\n originalPrompt,\n originalOutput,\n originalDurationMs,\n resultSummary,\n onNext,\n}: OriginalQueryPanelProps) {\n return (\n <div>\n <PanelTitle title=\"Original Query\" subtitle=\"Dynamic LLM-orchestrated execution — the discovery run\" />\n\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-8\">\n {/* Left: Input */}\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-2\">Input</p>\n {originalEnvelope ? (\n <JsonViewer data={originalEnvelope} defaultMode=\"tree\" />\n ) : originalPrompt ? (\n <JsonViewer data={{ prompt: originalPrompt }} defaultMode=\"tree\" />\n ) : (\n <p className=\"text-xs text-text-tertiary italic\">Loading...</p>\n )}\n </div>\n\n {/* Right: Output */}\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-2\">Output</p>\n {status !== 'completed' && status !== 'failed' ? (\n <p className=\"text-sm text-text-secondary animate-pulse\">Pending...</p>\n ) : originalOutput ? (\n <JsonViewer data={originalOutput} defaultMode=\"tree\" />\n ) : resultSummary ? (\n <ResultSummary text={resultSummary} />\n ) : (\n <p className=\"text-xs text-text-tertiary italic\">No structured output</p>\n )}\n {originalDurationMs != null && (\n <p className=\"text-[10px] text-text-tertiary mt-2\">{(originalDurationMs / 1000).toFixed(1)}s</p>\n )}\n </div>\n </div>\n\n <WizardNav><span /><button onClick={onNext} className=\"btn-primary text-xs\">Next: Timeline</button></WizardNav>\n </div>\n );\n}\n","import { WizardNav } from '../../../components/common/layout/WizardNav';\nimport { SwimlaneTimeline } from '../../workflows/workflow-execution/SwimlaneTimeline';\nimport { PanelTitle } from './PanelTitle';\n\ninterface TimelinePanelProps {\n events: any[];\n onBack: () => void;\n onNext: () => void;\n}\n\nexport function TimelinePanel({ events, onBack, onNext }: TimelinePanelProps) {\n return (\n <div>\n <PanelTitle title=\"Execution Timeline\" subtitle=\"Activity swimlane showing tool calls and their durations\" />\n <SwimlaneTimeline events={events} />\n <WizardNav>\n <button onClick={onBack} className=\"px-3 py-1.5 text-xs text-text-secondary hover:text-text-primary\">Back</button>\n <button onClick={onNext} className=\"btn-primary text-xs\">Next: Profile</button>\n </WizardNav>\n </div>\n );\n}\n","/**\n * A thin section divider: uppercase label with a trailing border line.\n * Reused across multiple wizard panels.\n */\nexport function SectionHeading({ children }: { children: React.ReactNode }) {\n return (\n <div className=\"flex items-center gap-3 mb-3\">\n <span className=\"text-xs font-semibold uppercase tracking-widest text-text-tertiary\">{children}</span>\n <span className=\"flex-1 border-b border-surface-border\" />\n </div>\n );\n}\n","import { useState } from 'react';\nimport { Link } from 'react-router-dom';\n\nimport { StatusBadge } from '../../../components/common/display/StatusBadge';\nimport { WizardNav } from '../../../components/common/layout/WizardNav';\nimport { TagInput } from '../../../components/common/form/TagInput';\nimport { PanelTitle } from './PanelTitle';\nimport { SectionHeading } from './SectionHeading';\n\n// ── Sub-components ───────────────────────────────────────────────────────────\n\ninterface ExistingProfileViewProps {\n compiledYaml: any;\n onBack: () => void;\n onNext: () => void;\n}\n\n/**\n * Read-only view of an already-compiled workflow profile (step 3, existing path).\n */\nfunction ExistingProfileView({ compiledYaml, onBack, onNext }: ExistingProfileViewProps) {\n return (\n <div>\n <PanelTitle title=\"Pipeline Profile\" subtitle=\"Configure the compiled tool — name, tags, input schema, and deployment target\" />\n\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-8 mb-6\">\n {/* Left: identity + description */}\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5\">Name</p>\n <p className=\"text-sm font-mono text-text-primary\">{compiledYaml.name}</p>\n </div>\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5\">Status</p>\n <StatusBadge status={compiledYaml.status} />\n </div>\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5\">Namespace</p>\n <p className=\"text-xs font-mono text-text-primary\">{compiledYaml.app_id || '\\u2014'}</p>\n </div>\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5\">Topic</p>\n <p className=\"text-xs font-mono text-text-primary\">{compiledYaml.graph_topic || '\\u2014'}</p>\n </div>\n </div>\n {compiledYaml.description && (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5\">Description</p>\n <p className=\"text-xs text-text-secondary leading-relaxed\">{compiledYaml.description}</p>\n </div>\n )}\n </div>\n\n {/* Right: pipeline + tags */}\n <div className=\"space-y-4\">\n {compiledYaml.activity_manifest?.length > 0 && (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">Pipeline</p>\n <div className=\"flex items-center gap-1 flex-wrap\">\n {(compiledYaml.activity_manifest as any[])\n .filter((a: any) => a.tool_source !== 'trigger')\n .map((a: any, i: number, arr: any[]) => (\n <span key={i} className=\"flex items-center gap-1\">\n <span className=\"text-[10px] px-2 py-0.5 rounded bg-surface-sunken font-mono text-text-primary\">{a.mcp_tool_name || a.title}</span>\n {i < arr.length - 1 && <span className=\"text-text-tertiary text-[10px]\">{'\\u2192'}</span>}\n </span>\n ))}\n </div>\n </div>\n )}\n {compiledYaml.tags?.length > 0 && (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">Tags</p>\n <div className=\"flex gap-1.5 flex-wrap\">\n {(compiledYaml.tags as string[]).slice(0, 12).map((tag: string) => (\n <span key={tag} className=\"text-[10px] px-2 py-0.5 rounded-full bg-surface-sunken text-text-secondary\">{tag}</span>\n ))}\n {(compiledYaml.tags as string[]).length > 12 && (\n <span className=\"text-[10px] text-text-tertiary\">+{(compiledYaml.tags as string[]).length - 12} more</span>\n )}\n </div>\n </div>\n )}\n </div>\n </div>\n\n <WizardNav>\n <button onClick={onBack} className=\"px-3 py-1.5 text-xs text-text-secondary hover:text-text-primary\">Back</button>\n <div className=\"flex gap-3\">\n <Link to={`/mcp/workflows/${compiledYaml.id}`} className=\"px-3 py-1.5 text-xs border border-surface-border rounded text-text-primary hover:bg-surface-sunken transition-colors\">\n Edit Workflow\n </Link>\n {compiledYaml.status !== 'active'\n ? <button onClick={onNext} className=\"btn-primary text-xs\">Next: Deploy</button>\n : <button onClick={onNext} className=\"btn-primary text-xs\">Next: Test</button>}\n </div>\n </WizardNav>\n </div>\n );\n}\n\n// ── Create-new form ──────────────────────────────────────────────────────────\n\ninterface CreateProfileFormProps {\n originalPrompt: string | undefined;\n compileAppId: string;\n setCompileAppId: (v: string) => void;\n compileName: string;\n setCompileName: (v: string) => void;\n compileDescription: string;\n setCompileDescription: (v: string) => void;\n compileTags: string[];\n setCompileTags: (v: string[]) => void;\n describeData: { tool_name?: string; description: string; tags: string[] } | undefined;\n describePrompt: string | undefined;\n allAppIds: string[];\n compileFeedback: string;\n setCompileFeedback: (v: string) => void;\n onCompile: () => Promise<void>;\n isCompiling: boolean;\n compileError: string | undefined;\n onBack: () => void;\n}\n\nfunction CreateProfileForm({\n originalPrompt,\n compileAppId,\n setCompileAppId,\n compileName,\n setCompileName,\n compileDescription,\n setCompileDescription,\n compileTags,\n setCompileTags,\n describeData,\n describePrompt,\n allAppIds,\n compileFeedback,\n setCompileFeedback,\n onCompile,\n isCompiling,\n compileError,\n onBack,\n}: CreateProfileFormProps) {\n const [showFeedback, setShowFeedback] = useState(!!compileFeedback);\n return (\n <div>\n <PanelTitle title=\"Create Workflow Profile\" subtitle=\"Define the deterministic workflow tool from this execution\" />\n\n {originalPrompt && (\n <div className=\"mb-6\">\n <SectionHeading>Original Query</SectionHeading>\n <p className=\"text-xs text-text-primary leading-relaxed\">{originalPrompt}</p>\n </div>\n )}\n\n <SectionHeading>Workflow Configuration</SectionHeading>\n <div className=\"space-y-5\">\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">Namespace *</label>\n <input type=\"text\" value={compileAppId} onChange={(e) => setCompileAppId(e.target.value.toLowerCase().replace(/[^a-z0-9]/g, ''))}\n className=\"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-2 font-mono text-xs text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary\" placeholder=\"e.g. longtail\" />\n {allAppIds.length > 0 && (\n <div className=\"flex gap-1.5 mt-1.5 flex-wrap\">\n {allAppIds.map((id) => (\n <button key={id} type=\"button\" onClick={() => setCompileAppId(id)}\n className={`text-[10px] px-2 py-0.5 rounded-full transition-colors ${compileAppId === id ? 'bg-accent/20 text-accent' : 'bg-surface-sunken text-text-tertiary hover:text-text-secondary'}`}>{id}</button>\n ))}\n </div>\n )}\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">Tool Name *</label>\n <input type=\"text\" value={compileName} onChange={(e) => setCompileName(e.target.value)}\n className=\"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-2 text-xs text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary\" placeholder=\"e.g. auth-screenshot-all-nav-pages\" />\n </div>\n <div>\n <div className=\"flex items-center justify-between mb-1\">\n <label className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">Description</label>\n {!compileDescription && !describeData && describePrompt && <span className=\"text-[10px] text-accent animate-pulse\">Generating...</span>}\n </div>\n <textarea value={compileDescription} onChange={(e) => setCompileDescription(e.target.value)}\n placeholder=\"Describe what this workflow does as a reusable tool...\"\n className=\"w-full min-h-[80px] px-3 py-2 bg-surface-sunken border border-surface-border rounded-md text-xs text-text-primary placeholder:text-text-tertiary resize-y focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary\" />\n <p className=\"text-[10px] text-text-tertiary mt-1\">{describeData ? 'AI-generated. Edit to refine.' : 'Describe what this workflow does so future queries can find it.'}</p>\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">Tags</label>\n <TagInput tags={compileTags} onChange={setCompileTags} placeholder=\"e.g. browser, screenshots, login\" />\n <p className=\"text-[10px] text-text-tertiary mt-1\">Press Enter or comma to add.</p>\n </div>\n </div>\n\n <div className=\"mt-5\">\n <button type=\"button\" onClick={() => setShowFeedback(!showFeedback)}\n className=\"text-xs text-accent hover:text-accent/80 transition-colors\">\n {showFeedback ? 'Hide refinement feedback' : 'Refine compilation'}\n </button>\n {showFeedback && (\n <div className=\"mt-2\">\n <textarea value={compileFeedback} onChange={(e) => setCompileFeedback(e.target.value)}\n placeholder=\"Describe what should change. E.g.: 'Only url, username, password, and screenshot_dir should be dynamic inputs. The steps array is an implementation detail.'\"\n className=\"w-full min-h-[80px] px-3 py-2 bg-surface-sunken border border-surface-border rounded-md text-xs text-text-primary placeholder:text-text-tertiary resize-y focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary\" />\n <p className=\"text-[10px] text-text-tertiary mt-1\">This feedback is sent to the compiler so it can adjust inputs, outputs, and step selection.</p>\n </div>\n )}\n </div>\n\n <WizardNav>\n <button onClick={onBack} className=\"px-3 py-1.5 text-xs text-text-secondary hover:text-text-primary\">Back</button>\n <button onClick={onCompile} disabled={!compileName.trim() || !compileAppId.trim() || isCompiling} className=\"btn-primary text-xs\">\n {isCompiling ? 'Creating...' : 'Create Profile'}\n </button>\n </WizardNav>\n {compileError && <p className=\"mt-3 text-sm text-status-error\">{compileError}</p>}\n </div>\n );\n}\n\n// ── Composite panel ──────────────────────────────────────────────────────────\n\ninterface ProfilePanelProps {\n compiledYaml: any | undefined;\n /* Create-form props (only used when compiledYaml is absent) */\n originalPrompt: string | undefined;\n compileAppId: string;\n setCompileAppId: (v: string) => void;\n compileName: string;\n setCompileName: (v: string) => void;\n compileDescription: string;\n setCompileDescription: (v: string) => void;\n compileTags: string[];\n setCompileTags: (v: string[]) => void;\n describeData: { tool_name?: string; description: string; tags: string[] } | undefined;\n describePrompt: string | undefined;\n allAppIds: string[];\n compileFeedback: string;\n setCompileFeedback: (v: string) => void;\n onCompile: () => Promise<void>;\n isCompiling: boolean;\n compileError: string | undefined;\n isUncompilable?: boolean;\n onBack: () => void;\n onNext: () => void;\n}\n\nexport function ProfilePanel(props: ProfilePanelProps) {\n const { compiledYaml, isUncompilable, onBack, onNext } = props;\n\n if (isUncompilable && !compiledYaml) {\n return (\n <div>\n <PanelTitle title=\"Create Workflow Profile\" subtitle=\"Define the deterministic workflow tool from this execution\" />\n <div className=\"rounded-md bg-status-warning/5 border border-status-warning/20 px-4 py-3 mb-6\">\n <p className=\"text-xs text-status-warning font-medium\">Cannot compile this query</p>\n <p className=\"text-xs text-text-secondary mt-1\">\n This query did not complete successfully. Resolve the escalation before compiling to a deterministic workflow.\n </p>\n </div>\n <WizardNav>\n <button onClick={onBack} className=\"px-3 py-1.5 text-xs text-text-secondary hover:text-text-primary\">Back</button>\n <span />\n </WizardNav>\n </div>\n );\n }\n\n if (compiledYaml) {\n return <ExistingProfileView compiledYaml={compiledYaml} onBack={onBack} onNext={onNext} />;\n }\n\n return (\n <CreateProfileForm\n originalPrompt={props.originalPrompt}\n compileAppId={props.compileAppId}\n setCompileAppId={props.setCompileAppId}\n compileName={props.compileName}\n setCompileName={props.setCompileName}\n compileDescription={props.compileDescription}\n setCompileDescription={props.setCompileDescription}\n compileTags={props.compileTags}\n setCompileTags={props.setCompileTags}\n describeData={props.describeData}\n describePrompt={props.describePrompt}\n allAppIds={props.allAppIds}\n compileFeedback={props.compileFeedback}\n setCompileFeedback={props.setCompileFeedback}\n onCompile={props.onCompile}\n isCompiling={props.isCompiling}\n compileError={props.compileError}\n onBack={onBack}\n />\n );\n}\n","import { useState, useEffect, useRef, useMemo, useCallback } from 'react';\nimport { MessageSquarePlus, Pencil } from 'lucide-react';\nimport { useQueryClient } from '@tanstack/react-query';\n\nimport { WizardNav } from '../../../components/common/layout/WizardNav';\nimport { ConfigurationSection } from '../../workflows/yaml-workflow-detail/ConfigurationSection';\nimport { LifecycleSidebar } from '../../workflows/yaml-workflow-detail/LifecycleSidebar';\nimport { VersionHistory } from '../../workflows/yaml-workflow-detail/VersionHistory';\nimport {\n useYamlWorkflow,\n useYamlWorkflowVersions,\n useYamlWorkflowVersion,\n useUpdateYamlWorkflow,\n useDeployYamlWorkflow,\n useActivateYamlWorkflow,\n useArchiveYamlWorkflow,\n useRegenerateYamlWorkflow,\n useDeleteYamlWorkflow,\n} from '../../../api/yaml-workflows';\nimport type { InputFieldMeta } from '../../../api/types';\n\ninterface DeployPanelProps {\n yamlId: string;\n onAdvance: () => void;\n onBack: () => void;\n}\n\nexport function DeployPanel({ yamlId, onAdvance, onBack }: DeployPanelProps) {\n const queryClient = useQueryClient();\n const yamlTextareaRef = useRef<HTMLTextAreaElement>(null);\n const [feedbackText, setFeedbackText] = useState('');\n const [showFeedback, setShowFeedback] = useState(false);\n\n const { data: wf, refetch } = useYamlWorkflow(yamlId);\n const { data: versionsData } = useYamlWorkflowVersions(yamlId);\n\n const deployMutation = useDeployYamlWorkflow();\n const activateMutation = useActivateYamlWorkflow();\n const archiveMutation = useArchiveYamlWorkflow();\n const deleteMutation = useDeleteYamlWorkflow();\n const regenerateMutation = useRegenerateYamlWorkflow();\n const updateMutation = useUpdateYamlWorkflow();\n\n // Config editing state\n const [yamlDraft, setYamlDraft] = useState('');\n const [inputSchemaDraft, setInputSchemaDraft] = useState('');\n const [outputSchemaDraft, setOutputSchemaDraft] = useState('');\n const [inputFieldMetaDraft, setInputFieldMetaDraft] = useState<InputFieldMeta[]>([]);\n const [configEditing, setConfigEditing] = useState(false);\n\n // Version browsing\n const [versionParam, setVersionParam] = useState<number | null>(null);\n const isViewingHistory = versionParam !== null && wf != null && versionParam !== wf.content_version;\n const { data: versionSnapshot } = useYamlWorkflowVersion(yamlId, isViewingHistory ? versionParam : null);\n\n const resolvedYaml = isViewingHistory && versionSnapshot ? versionSnapshot.yaml_content : wf?.yaml_content;\n const resolvedInputSchema = isViewingHistory && versionSnapshot ? versionSnapshot.input_schema : wf?.input_schema;\n const resolvedOutputSchema = isViewingHistory && versionSnapshot ? versionSnapshot.output_schema : wf?.output_schema;\n\n // Sync drafts when workflow loads\n useEffect(() => {\n if (wf) {\n setYamlDraft(wf.yaml_content);\n setInputSchemaDraft(JSON.stringify(wf.input_schema, null, 2));\n setOutputSchemaDraft(JSON.stringify(wf.output_schema, null, 2));\n if (wf.input_field_meta) setInputFieldMetaDraft(wf.input_field_meta);\n }\n }, [wf?.id, wf?.content_version]);\n\n // Version history adapter (VersionHistory expects URLSearchParams)\n const versionSearchParams = useMemo(() => {\n const sp = new URLSearchParams();\n if (versionParam !== null) sp.set('version', String(versionParam));\n return sp;\n }, [versionParam]);\n const setVersionSearchParams = useCallback((sp: URLSearchParams) => {\n const v = sp.get('version');\n setVersionParam(v ? parseInt(v, 10) : null);\n }, []);\n\n const canEditConfig = wf?.status !== 'archived' && !isViewingHistory;\n\n const handleSaveConfig = async () => {\n if (!wf) return;\n let inputSchema, outputSchema;\n try { inputSchema = JSON.parse(inputSchemaDraft); } catch { /* keep existing */ }\n try { outputSchema = JSON.parse(outputSchemaDraft); } catch { /* keep existing */ }\n await updateMutation.mutateAsync({\n id: wf.id,\n yaml_content: yamlDraft,\n ...(inputSchema ? { input_schema: inputSchema } : {}),\n ...(outputSchema ? { output_schema: outputSchema } : {}),\n });\n setConfigEditing(false);\n refetch();\n };\n\n const handleCancelEdit = () => {\n if (!wf) return;\n setYamlDraft(wf.yaml_content);\n setInputSchemaDraft(JSON.stringify(wf.input_schema, null, 2));\n setOutputSchemaDraft(JSON.stringify(wf.output_schema, null, 2));\n setConfigEditing(false);\n };\n\n const handleDeploy = async () => {\n if (!wf) return;\n // Always deploy (updates deployed_content_version), then activate\n await deployMutation.mutateAsync(wf.id);\n await activateMutation.mutateAsync(wf.id);\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflowForSource'], refetchType: 'all' });\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflow'], refetchType: 'all' });\n refetch();\n };\n\n const handleRegenerate = async () => {\n await regenerateMutation.mutateAsync({\n id: yamlId,\n compilation_feedback: feedbackText.trim() || undefined,\n });\n setFeedbackText('');\n setShowFeedback(false);\n refetch();\n };\n\n if (!wf) return <p className=\"text-sm text-text-secondary animate-pulse\">Loading workflow...</p>;\n\n const isPending = deployMutation.isPending || activateMutation.isPending || archiveMutation.isPending || regenerateMutation.isPending || deleteMutation.isPending;\n\n return (\n <div className=\"grid grid-cols-1 lg:grid-cols-[1fr_200px] gap-8\">\n {/* Left: config */}\n <div>\n <div className=\"flex items-start justify-between mb-6\">\n <div>\n <h2 className=\"text-lg font-light text-text-primary\">\n {wf.status === 'active' ? 'Redeploy' : 'Deploy'} Workflow\n </h2>\n <p className=\"text-xs text-text-tertiary mt-0.5\">Review configuration, input/output schemas, and YAML definition</p>\n </div>\n <div className=\"flex items-center gap-3 shrink-0\">\n <button type=\"button\" onClick={() => { setShowFeedback(!showFeedback); setConfigEditing(false); }}\n className={`inline-flex items-center gap-1 text-xs transition-colors hover:underline ${showFeedback ? 'text-accent font-medium' : 'text-accent/70 hover:text-accent'}`}>\n <MessageSquarePlus className=\"w-3 h-3\" />\n Recompile with Feedback\n </button>\n <span className=\"text-text-tertiary/30\">|</span>\n <button type=\"button\" onClick={() => { setConfigEditing(!configEditing); setShowFeedback(false); }}\n className={`inline-flex items-center gap-1 text-xs transition-colors hover:underline ${configEditing ? 'text-accent font-medium' : 'text-accent/70 hover:text-accent'}`}>\n <Pencil className=\"w-3 h-3\" />\n Manual Edit\n </button>\n </div>\n </div>\n\n {/* Recompile feedback panel */}\n {showFeedback && (\n <div className=\"mb-4 p-4 bg-surface-sunken border border-surface-border rounded-lg\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-2\">What should change?</p>\n <textarea value={feedbackText} onChange={(e) => setFeedbackText(e.target.value)}\n placeholder=\"E.g.: 'Only url, username, password, and screenshot_dir should be dynamic inputs. The steps array and script are implementation details.'\"\n className=\"w-full min-h-[80px] px-3 py-2 bg-surface border border-surface-border rounded-md text-xs text-text-primary placeholder:text-text-tertiary resize-y focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary\" />\n <div className=\"flex items-center justify-between mt-2\">\n <p className=\"text-[10px] text-text-tertiary\">This feedback guides the compiler. The current YAML will be replaced.</p>\n <button onClick={handleRegenerate} disabled={!feedbackText.trim() || regenerateMutation.isPending} className=\"btn-primary text-xs shrink-0 ml-4\">\n {regenerateMutation.isPending ? 'Recompiling...' : 'Recompile Pipeline'}\n </button>\n </div>\n </div>\n )}\n\n {/* Version history banner */}\n {isViewingHistory && (\n <div className=\"mb-4 px-3 py-2 bg-accent-muted/20 border border-accent-muted/40 rounded-md flex items-center justify-between\">\n <span className=\"text-xs text-accent\">Viewing version {versionParam}</span>\n <button onClick={() => setVersionParam(null)} className=\"text-xs text-accent hover:underline\">Back to current</button>\n </div>\n )}\n\n <ConfigurationSection\n wf={wf}\n resolvedInputSchema={resolvedInputSchema}\n resolvedOutputSchema={resolvedOutputSchema}\n resolvedYaml={resolvedYaml}\n configEditing={configEditing}\n setConfigEditing={setConfigEditing}\n canEditConfig={canEditConfig}\n yamlDraft={yamlDraft}\n setYamlDraft={setYamlDraft}\n inputSchemaDraft={inputSchemaDraft}\n setInputSchemaDraft={setInputSchemaDraft}\n outputSchemaDraft={outputSchemaDraft}\n setOutputSchemaDraft={setOutputSchemaDraft}\n inputFieldMetaDraft={inputFieldMetaDraft}\n setInputFieldMetaDraft={setInputFieldMetaDraft}\n onSave={handleSaveConfig}\n onCancel={handleCancelEdit}\n updateMutation={updateMutation}\n yamlTextareaRef={yamlTextareaRef}\n isCollapsed={false}\n onToggle={() => {}}\n schemasGrid\n />\n\n <WizardNav>\n <button onClick={onBack} className=\"px-3 py-1.5 text-xs text-text-secondary hover:text-text-primary\">Back</button>\n {wf.status === 'active'\n ? <button onClick={onAdvance} disabled={showFeedback} className=\"btn-primary text-xs\">Next: Test</button>\n : <button onClick={handleDeploy} disabled={isPending || showFeedback} className=\"btn-primary text-xs\">{isPending ? 'Deploying...' : 'Deploy & Activate'}</button>\n }\n </WizardNav>\n </div>\n\n {/* Right: lifecycle + versions — sticky on scroll */}\n <div className=\"space-y-6\">\n <div className=\"sticky top-6\">\n <LifecycleSidebar\n status={wf.status}\n sourceWorkflowId={wf.source_workflow_id}\n contentVersion={wf.content_version}\n deployedContentVersion={wf.deployed_content_version}\n onDeploy={handleDeploy}\n onArchive={() => archiveMutation.mutateAsync(yamlId).then(() => refetch())}\n onDelete={() => deleteMutation.mutateAsync(yamlId)}\n onRegenerate={handleRegenerate}\n isPending={isPending}\n error={undefined}\n />\n {(versionsData?.versions?.length ?? 0) > 1 && (\n <VersionHistory\n versionsData={versionsData}\n searchParams={versionSearchParams}\n setSearchParams={setVersionSearchParams}\n currentVersion={wf.content_version}\n viewingVersion={isViewingHistory ? versionParam : null}\n />\n )}\n </div>{/* end sticky */}\n </div>\n </div>\n );\n}\n","import { useState, useEffect, useMemo } from 'react';\nimport { Link } from 'react-router-dom';\nimport { useQueryClient } from '@tanstack/react-query';\n\nimport { JsonViewer } from '../../../components/common/data/JsonViewer';\nimport { WizardNav } from '../../../components/common/layout/WizardNav';\nimport { Modal } from '../../../components/common/modal/Modal';\nimport { useYamlWorkflow, useInvokeYamlWorkflow } from '../../../api/yaml-workflows';\nimport { useMcpRuns, useMcpRunExecution } from '../../../api/mcp-runs';\nimport { useWorkflowExecution } from '../../../api/workflows';\nimport { useTaskByWorkflowId } from '../../../api/tasks';\nimport { useYamlActivityEvents } from '../../../hooks/useYamlActivityEvents';\nimport { buildSkeleton } from '../../workflows/yaml-workflow-detail/helpers';\nimport type { LTJob, ActivityManifestEntry } from '../../../api/types';\nimport { extractJsonFromSummary } from './helpers';\nimport { SectionHeading } from './SectionHeading';\n\nfunction jobLabel(job: LTJob): string {\n const date = new Date(job.created_at);\n const time = date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });\n const day = date.toLocaleDateString([], { month: 'short', day: 'numeric' });\n const status = job.status === 'completed' || Number(job.status) === 0 ? 'completed' : job.is_live ? 'running' : 'failed';\n return `${day} ${time} — ${status}`;\n}\n\ninterface TestPanelProps {\n yamlId: string;\n originalWorkflowId: string | undefined;\n originalResult: Record<string, unknown> | undefined;\n originalPrompt: string | undefined;\n onBack: () => void;\n onAdvance: () => void;\n}\n\nexport function TestPanel({ yamlId, originalWorkflowId, originalResult, originalPrompt, onBack, onAdvance }: TestPanelProps) {\n const queryClient = useQueryClient();\n const { data: wf } = useYamlWorkflow(yamlId);\n const invokeMutation = useInvokeYamlWorkflow();\n\n const { data: runs } = useMcpRuns({\n entity: wf?.graph_topic, app_id: wf?.app_id || 'longtail', limit: 10,\n });\n\n const [selectedRunId, setSelectedRunId] = useState<string | null>(null);\n const { data: selectedRunExecution } = useMcpRunExecution(\n selectedRunId ?? '', wf?.app_id || 'longtail',\n );\n\n // Invoke modal state\n const [showInvokeModal, setShowInvokeModal] = useState(false);\n const [invokeJsonMode, setInvokeJsonMode] = useState(false);\n const [invokeFields, setInvokeFields] = useState<Record<string, any>>({});\n const [invokeJson, setInvokeJson] = useState('{}');\n const [activeJobId, setActiveJobId] = useState<string | null>(null);\n const { steps: activitySteps, isComplete: jobComplete } = useYamlActivityEvents(activeJobId);\n\n // Original execution + task envelope\n const { data: originalExecution } = useWorkflowExecution(originalWorkflowId ?? '');\n const { data: originalTask } = useTaskByWorkflowId(originalWorkflowId ?? '');\n const originalExecResult = (originalExecution?.result as any)?.data as Record<string, unknown> | undefined;\n\n const originalEnvelope = useMemo(() => {\n if (!originalTask?.envelope) return null;\n try { return typeof originalTask.envelope === 'string' ? JSON.parse(originalTask.envelope) : originalTask.envelope; }\n catch { return null; }\n }, [originalTask?.envelope]);\n\n const resolvedPrompt = (originalEnvelope as any)?.data?.prompt ?? originalPrompt;\n\n const jobs = runs?.jobs ?? [];\n useEffect(() => {\n if (!selectedRunId && jobs.length > 0) setSelectedRunId(jobs[0].workflow_id);\n }, [jobs.length]);\n\n // Build form skeleton from input schema\n useEffect(() => {\n if (wf?.input_schema) {\n const skeleton = buildSkeleton(wf.input_schema);\n setInvokeFields(skeleton);\n setInvokeJson(JSON.stringify(skeleton, null, 2));\n }\n }, [wf?.id]);\n\n const handleInvoke = async () => {\n if (!wf) return;\n try {\n const data = invokeJsonMode ? JSON.parse(invokeJson) : invokeFields;\n const result = await invokeMutation.mutateAsync({ id: wf.id, data, sync: false });\n if (result.job_id) {\n setActiveJobId(result.job_id);\n }\n } catch { /* error shown in modal */ }\n };\n\n // When job completes via NATS events, dismiss modal and select the new run\n useEffect(() => {\n if (jobComplete && activeJobId) {\n const completedJobId = activeJobId;\n const timer = setTimeout(() => {\n setShowInvokeModal(false);\n setActiveJobId(null);\n setSelectedRunId(completedJobId);\n queryClient.invalidateQueries({ queryKey: ['mcpRuns'], refetchType: 'all' });\n }, 1000); // brief pause to show final completed state\n return () => clearTimeout(timer);\n }\n }, [jobComplete, activeJobId, queryClient]);\n\n if (!wf) return <p className=\"text-sm text-text-secondary animate-pulse\">Loading...</p>;\n\n // Original output\n const originalOutput = originalExecResult?.result ??\n (typeof originalExecResult?.summary === 'string' ? extractJsonFromSummary(originalExecResult.summary) : null) ??\n originalResult?.result ??\n (typeof originalResult?.summary === 'string' ? extractJsonFromSummary(originalResult.summary) : null) ??\n originalResult;\n\n // Deterministic run data\n let deterministicOutput: unknown = null;\n let deterministicInput: unknown = null;\n if (selectedRunExecution?.result) {\n const execResult = selectedRunExecution.result as Record<string, unknown>;\n if (typeof execResult.response === 'string') {\n const jsonMatch = (execResult.response as string).match(/```json\\s*([\\s\\S]*?)```/);\n if (jsonMatch) {\n try { deterministicOutput = JSON.parse(jsonMatch[1].trim()); } catch { deterministicOutput = execResult; }\n } else {\n deterministicOutput = extractJsonFromSummary(execResult.response as string) ?? execResult;\n }\n } else {\n deterministicOutput = execResult;\n }\n }\n if (selectedRunExecution?.events?.length) {\n const triggerEvent = selectedRunExecution.events.find(\n (e) => e.event_type === 'activity_task_completed' && e.is_system &&\n (e.attributes as any)?.result && Object.keys((e.attributes as any).result).length > 0,\n );\n deterministicInput = triggerEvent ? (triggerEvent.attributes as any).result : null;\n }\n\n return (\n <div>\n {/* Header */}\n <div className=\"mb-6\">\n <h2 className=\"text-lg font-light text-text-primary\">Compare Runs</h2>\n <div className=\"flex items-center gap-3 mt-1\">\n <span className=\"text-xs font-mono text-text-secondary\">{wf.name}</span>\n <span className=\"text-[10px] text-text-tertiary\">v{wf.content_version}</span>\n <Link to={`/mcp/workflows/${yamlId}`} className=\"text-[10px] text-accent hover:underline\">View workflow</Link>\n </div>\n </div>\n\n {/* Grid-aligned comparison: column headers */}\n <div className=\"grid grid-cols-2 gap-8 mb-4\">\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">Original MCP Query</p>\n <p className=\"text-[10px] text-text-tertiary mt-0.5\">Dynamic LLM orchestration</p>\n </div>\n <div className=\"flex items-start justify-between\">\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">Compiled Pipeline Run</p>\n {jobs.length > 0 && selectedRunId && (\n <select\n value={selectedRunId}\n onChange={(e) => setSelectedRunId(e.target.value)}\n className=\"mt-0.5 bg-transparent border-none text-[10px] text-accent hover:text-accent/80 cursor-pointer focus:outline-none -ml-1 p-0\"\n >\n {jobs.map((job) => <option key={job.workflow_id} value={job.workflow_id}>{jobLabel(job)}</option>)}\n </select>\n )}\n {!selectedRunId && <p className=\"text-[10px] text-text-tertiary mt-0.5\">No runs yet</p>}\n </div>\n <button\n onClick={() => setShowInvokeModal(true)}\n className=\"inline-flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium bg-accent/10 text-accent rounded-md hover:bg-accent/20 transition-colors shrink-0\"\n >\n <svg className=\"w-3 h-3\" viewBox=\"0 0 12 12\" fill=\"currentColor\"><path d=\"M3 1.5v9l7.5-4.5z\" /></svg>\n Run Test\n </button>\n </div>\n </div>\n\n {/* Row 1: Inputs */}\n <SectionHeading>Input</SectionHeading>\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-8 mb-6\">\n <div>\n {originalEnvelope ? (\n <JsonViewer data={originalEnvelope} defaultMode=\"tree\" />\n ) : resolvedPrompt ? (\n <p className=\"text-xs text-text-primary leading-relaxed px-3 py-2 bg-surface-sunken rounded-md\">{resolvedPrompt}</p>\n ) : (\n <p className=\"text-xs text-text-tertiary italic\">Loading...</p>\n )}\n </div>\n <div>\n {deterministicInput ? (\n <JsonViewer data={deterministicInput} defaultMode=\"tree\" />\n ) : selectedRunId && wf.input_schema ? (\n <div>\n <p className=\"text-[10px] text-text-tertiary italic mb-1\">Stored defaults</p>\n <JsonViewer data={wf.input_schema} defaultMode=\"tree\" />\n </div>\n ) : (\n <p className=\"text-xs text-text-tertiary italic\">No runs yet</p>\n )}\n </div>\n </div>\n\n {/* Row 2: Outputs */}\n <SectionHeading>Output</SectionHeading>\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-8 mb-6\">\n <div>\n {originalOutput ? (\n <JsonViewer data={originalOutput} defaultMode=\"tree\" />\n ) : (\n <p className=\"text-xs text-text-tertiary italic\">No output</p>\n )}\n {originalExecution?.duration_ms != null && (\n <p className=\"text-[10px] text-text-tertiary mt-2\">{(originalExecution.duration_ms / 1000).toFixed(1)}s</p>\n )}\n </div>\n <div>\n {deterministicOutput ? (\n <JsonViewer data={deterministicOutput} defaultMode=\"tree\" />\n ) : selectedRunId ? (\n <p className=\"text-xs text-text-tertiary animate-pulse\">Loading...</p>\n ) : (\n <p className=\"text-xs text-text-tertiary italic\">No runs yet</p>\n )}\n {selectedRunExecution?.duration_ms != null && (\n <p className=\"text-[10px] text-text-tertiary mt-2\">{(selectedRunExecution.duration_ms / 1000).toFixed(1)}s</p>\n )}\n </div>\n </div>\n\n {/* Invoke modal with form/JSON toggle or live timeline */}\n <Modal\n open={showInvokeModal}\n onClose={() => { if (!activeJobId) { setShowInvokeModal(false); } }}\n title={activeJobId ? 'Executing...' : 'Test Compiled Pipeline'}\n maxWidth=\"max-w-lg\"\n >\n {activeJobId ? (\n /* ── Live execution timeline ── */\n <LiveActivityTimeline\n steps={activitySteps}\n manifest={wf.activity_manifest}\n isComplete={jobComplete}\n />\n ) : (\n /* ── Input form ── */\n <>\n <p className=\"text-xs text-text-secondary mb-3 leading-relaxed\">\n Invoke <span className=\"font-mono text-text-primary\">{wf.name}</span> with explicit inputs.\n </p>\n\n <div className=\"flex justify-end mb-2\">\n <button onClick={() => {\n if (!invokeJsonMode) setInvokeJson(JSON.stringify(invokeFields, null, 2));\n else try { setInvokeFields(JSON.parse(invokeJson)); } catch { /* keep fields */ }\n setInvokeJsonMode(!invokeJsonMode);\n }} className=\"text-[10px] text-accent hover:underline\">\n {invokeJsonMode ? 'Form view' : 'JSON view'}\n </button>\n </div>\n\n {invokeJsonMode ? (\n <textarea\n value={invokeJson}\n onChange={(e) => setInvokeJson(e.target.value)}\n className=\"w-full min-h-[200px] px-3 py-2 bg-surface-sunken border border-surface-border rounded-md font-mono text-xs text-text-primary resize-y focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary\"\n />\n ) : (\n <div className=\"space-y-3 max-h-[400px] overflow-y-auto\">\n {Object.entries(invokeFields).map(([key, value]) => (\n <div key={key}>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">{key}</label>\n {typeof value === 'boolean' ? (\n <select\n value={String(value)}\n onChange={(e) => setInvokeFields({ ...invokeFields, [key]: e.target.value === 'true' })}\n className=\"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-1.5 text-xs text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary\"\n >\n <option value=\"true\">true</option>\n <option value=\"false\">false</option>\n </select>\n ) : typeof value === 'object' ? (\n <textarea\n value={JSON.stringify(value, null, 2)}\n onChange={(e) => { try { setInvokeFields({ ...invokeFields, [key]: JSON.parse(e.target.value) }); } catch { /* invalid json */ } }}\n className=\"w-full min-h-[60px] px-3 py-1.5 bg-surface-sunken border border-surface-border rounded-md font-mono text-xs text-text-primary resize-y focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary\"\n />\n ) : (\n <input\n type={typeof value === 'number' ? 'number' : 'text'}\n value={String(value ?? '')}\n onChange={(e) => setInvokeFields({ ...invokeFields, [key]: typeof value === 'number' ? Number(e.target.value) : e.target.value })}\n className=\"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-1.5 text-xs text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary\"\n />\n )}\n </div>\n ))}\n </div>\n )}\n\n {invokeMutation.isError && (\n <p className=\"mt-2 text-xs text-status-error\">{invokeMutation.error.message}</p>\n )}\n\n <div className=\"flex justify-end gap-3 pt-4\">\n <button onClick={() => setShowInvokeModal(false)} className=\"px-3 py-1.5 text-xs text-text-secondary hover:text-text-primary\">Cancel</button>\n <button onClick={handleInvoke} disabled={invokeMutation.isPending} className=\"btn-primary text-xs\">\n {invokeMutation.isPending ? 'Starting...' : 'Invoke'}\n </button>\n </div>\n </>\n )}\n </Modal>\n\n <WizardNav>\n <button onClick={onBack} className=\"px-3 py-1.5 text-xs text-text-secondary hover:text-text-primary\">Back</button>\n <button onClick={onAdvance} className=\"btn-primary text-xs\">Next: Verify</button>\n </WizardNav>\n </div>\n );\n}\n\n// ── Live activity timeline shown inside the invoke modal ──────────────────\n\nconst TOOL_SOURCE_COLORS: Record<string, { border: string; text: string; icon: string }> = {\n mcp: { border: 'border-blue-500', text: 'text-blue-500', icon: 'MCP' },\n db: { border: 'border-blue-500', text: 'text-blue-500', icon: 'DB' },\n llm: { border: 'border-violet-500', text: 'text-violet-500', icon: 'LLM' },\n transform: { border: 'border-emerald-500', text: 'text-emerald-500', icon: 'Map' },\n};\n\nfunction LiveActivityTimeline({\n steps,\n manifest,\n isComplete,\n}: {\n steps: import('../../../hooks/useYamlActivityEvents').ActivityStep[];\n manifest: ActivityManifestEntry[];\n isComplete: boolean;\n}) {\n // Build the full skeleton from manifest, overlay live step status\n const workerActivities = manifest.filter((a) => a.type === 'worker');\n const totalSteps = workerActivities.length;\n\n const merged = workerActivities.map((a, i) => {\n const live = steps.find((s) => s.activityId === a.activity_id);\n const source = a.tool_source || 'mcp';\n const colors = TOOL_SOURCE_COLORS[source] || TOOL_SOURCE_COLORS.mcp;\n return {\n activityId: a.activity_id,\n title: a.title || a.mcp_tool_name || a.activity_id,\n toolName: a.mcp_tool_name,\n toolSource: source,\n colors,\n stepIndex: i,\n status: live?.status || 'pending' as const,\n error: live?.error,\n };\n });\n\n return (\n <div>\n <p className=\"text-xs text-text-secondary mb-4\">\n {isComplete\n ? `All ${totalSteps} steps completed`\n : `Running step ${merged.filter((s) => s.status === 'completed').length + 1} of ${totalSteps}...`}\n </p>\n\n <div className=\"space-y-0\">\n {merged.map((step, idx) => {\n const isLast = idx === merged.length - 1;\n return (\n <div key={step.activityId} className=\"flex items-stretch gap-3\">\n {/* Vertical track */}\n <div className=\"flex flex-col items-center w-5 shrink-0\">\n <span className={`w-3 h-3 rounded-full shrink-0 border-2 transition-colors ${\n step.status === 'completed' ? 'bg-status-success border-status-success'\n : step.status === 'running' ? `${step.colors.border} bg-transparent animate-pulse`\n : step.status === 'failed' ? 'bg-status-error border-status-error'\n : 'bg-surface-sunken border-surface-border'\n }`} />\n {!isLast && (\n <span className={`w-px flex-1 transition-colors ${\n step.status === 'completed' ? 'bg-status-success/30' : 'bg-surface-border'\n }`} />\n )}\n </div>\n\n {/* Step content */}\n <div className={`pb-4 ${isLast ? 'pb-0' : ''}`}>\n <p className={`text-xs font-medium ${\n step.status === 'running' ? 'text-text-primary'\n : step.status === 'completed' ? 'text-text-secondary'\n : step.status === 'failed' ? 'text-status-error'\n : 'text-text-tertiary'\n }`}>\n {step.title}\n </p>\n <div className=\"flex items-center gap-2 mt-0.5\">\n <span className={`text-[9px] font-mono px-1 py-0.5 rounded border ${step.colors.border} ${step.colors.text} bg-transparent`}>\n {step.colors.icon}\n </span>\n {step.toolName && (\n <span className=\"text-[10px] text-text-tertiary font-mono\">{step.toolName}</span>\n )}\n </div>\n {step.error && (\n <p className=\"text-[10px] text-status-error mt-1\">{step.error}</p>\n )}\n </div>\n </div>\n );\n })}\n </div>\n\n {isComplete && (\n <p className=\"text-[10px] text-text-tertiary mt-3 text-center\">Closing...</p>\n )}\n </div>\n );\n}\n","import { Link } from 'react-router-dom';\nimport type { WorkflowExecutionEvent } from '../../../api/types';\n\ninterface RouterPhase {\n step: number; // 0=starting, 1=discover, 2=evaluate, 3=execute\n label: string;\n detail: string;\n path: 'deterministic' | 'dynamic' | null;\n childWorkflowId?: string;\n}\n\nconst STEPS = ['Discover', 'Evaluate', 'Execute'] as const;\n\nfunction derivePhase(events: WorkflowExecutionEvent[] | undefined): RouterPhase {\n if (!events?.length) return { step: 0, label: 'Starting...', detail: 'Initializing query router', path: null };\n\n // Check for child workflow — this reveals the routing decision\n const childStart = events.find((e) => e.event_type === 'child_workflow_execution_started');\n if (childStart) {\n const childId = childStart.attributes.child_workflow_id ?? '';\n const isDeterministic = childId.includes('mcpDeterministic');\n const childCompleted = events.some((e) => e.event_type === 'child_workflow_execution_completed');\n if (childCompleted) {\n return {\n step: 3, label: isDeterministic ? 'Deterministic complete' : 'Dynamic complete',\n detail: isDeterministic ? 'Compiled workflow executed successfully' : 'Dynamic MCP orchestration completed',\n path: isDeterministic ? 'deterministic' : 'dynamic', childWorkflowId: childId,\n };\n }\n return {\n step: 3,\n label: isDeterministic ? 'Running deterministic workflow' : 'Running dynamic MCP query',\n detail: isDeterministic ? 'Executing compiled workflow' : 'LLM agentic orchestration in progress (30\\u201360s)',\n path: isDeterministic ? 'deterministic' : 'dynamic',\n childWorkflowId: childId,\n };\n }\n\n // Derive from activity names\n const activityTypes = events\n .filter((e) => e.category === 'activity')\n .map((e) => e.attributes.activity_type ?? '');\n\n if (activityTypes.some((a) => a === 'extractWorkflowInputs')) {\n return { step: 2, label: 'Extracting inputs...', detail: 'Preparing structured inputs for compiled workflow', path: null };\n }\n if (activityTypes.some((a) => a === 'evaluateWorkflowMatch')) {\n return { step: 2, label: 'Evaluating match...', detail: 'LLM judge determining best compiled workflow', path: null };\n }\n if (activityTypes.some((a) => a === 'findCompiledWorkflows')) {\n return { step: 1, label: 'Searching compiled workflows...', detail: 'Full-text + tag discovery of candidates', path: null };\n }\n\n return { step: 0, label: 'Starting...', detail: 'Initializing query router', path: null };\n}\n\ninterface RouterProgressTrackerProps {\n events: WorkflowExecutionEvent[] | undefined;\n status: string | undefined;\n verifyRunId: string | null;\n}\n\nexport function RouterProgressTracker({ events, status, verifyRunId }: RouterProgressTrackerProps) {\n const phase = derivePhase(events);\n const isDone = status === 'completed' || status === 'failed';\n\n return (\n <div className=\"space-y-4\">\n {/* Stepper */}\n <div className=\"flex items-center gap-1\">\n {STEPS.map((label, i) => {\n const stepNum = i + 1;\n const isComplete = phase.step > stepNum || isDone;\n const isActive = phase.step === stepNum && !isDone;\n return (\n <div key={label} className=\"flex items-center gap-1 flex-1\">\n <div className=\"flex items-center gap-2 flex-1\">\n <div className={`w-5 h-5 rounded-full flex items-center justify-center text-[9px] font-medium shrink-0 transition-colors ${\n isComplete ? 'bg-status-success/20 text-status-success' :\n isActive ? 'bg-accent/20 text-accent animate-pulse' :\n 'bg-surface-sunken text-text-tertiary'\n }`}>\n {isComplete ? (\n <svg className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={3}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 13l4 4L19 7\" />\n </svg>\n ) : stepNum}\n </div>\n <span className={`text-[10px] font-medium whitespace-nowrap ${\n isComplete ? 'text-text-secondary' : isActive ? 'text-text-primary' : 'text-text-tertiary'\n }`}>{label}</span>\n </div>\n {i < STEPS.length - 1 && (\n <div className={`h-px flex-1 min-w-4 ${isComplete ? 'bg-status-success/30' : 'bg-surface-border'}`} />\n )}\n </div>\n );\n })}\n </div>\n\n {/* Detail + badges */}\n <div className=\"flex items-center gap-2 flex-wrap\">\n <p className=\"text-xs text-text-secondary\">{phase.detail}</p>\n {phase.path === 'deterministic' && (\n <span className=\"text-[10px] bg-status-success/10 text-status-success px-2 py-0.5 rounded-full\">\n Deterministic\n </span>\n )}\n {phase.path === 'dynamic' && (\n <span className=\"text-[10px] bg-status-pending/10 text-status-pending px-2 py-0.5 rounded-full\">\n Dynamic\n </span>\n )}\n </div>\n\n {/* Escape hatch link */}\n {verifyRunId && phase.step >= 1 && (\n <Link\n to={`/workflows/executions/${verifyRunId}`}\n className=\"text-[10px] text-accent hover:underline\"\n >\n View execution tree\n </Link>\n )}\n </div>\n );\n}\n","import { useState, useMemo } from 'react';\nimport { Link, useSearchParams } from 'react-router-dom';\n\nimport { StatusBadge } from '../../../components/common/display/StatusBadge';\nimport { JsonViewer } from '../../../components/common/data/JsonViewer';\nimport { WizardNav } from '../../../components/common/layout/WizardNav';\nimport { useSubmitMcpQueryRouted, useMcpQueryExecution, useMcpQueryResult } from '../../../api/mcp-query';\nimport { useTaskByWorkflowId } from '../../../api/tasks';\nimport { RouterProgressTracker } from './RouterProgressTracker';\n\ninterface VerifyPanelProps {\n originalWorkflowId: string | undefined;\n originalPrompt: string | undefined;\n workflowName: string;\n onBack: () => void;\n onGoToDeploy: () => void;\n}\n\nexport function VerifyPanel({ originalWorkflowId, originalPrompt, workflowName, onBack, onGoToDeploy }: VerifyPanelProps) {\n const submitQuery = useSubmitMcpQueryRouted();\n const [searchParams, setSearchParams] = useSearchParams();\n\n const [testPrompt, setTestPrompt] = useState('');\n const [promptInitialized, setPromptInitialized] = useState(false);\n\n // Persist verifyRunId in URL so it survives navigation\n const verifyRunId = searchParams.get('verifyRun');\n const setVerifyRunId = (id: string | null) => {\n setSearchParams((prev) => {\n const next = new URLSearchParams(prev);\n if (id) next.set('verifyRun', id);\n else next.delete('verifyRun');\n return next;\n }, { replace: true });\n };\n\n // Original prompt\n const { data: originalTask } = useTaskByWorkflowId(originalWorkflowId ?? '');\n const originalEnvelope = useMemo(() => {\n if (!originalTask?.envelope) return null;\n try { return typeof originalTask.envelope === 'string' ? JSON.parse(originalTask.envelope) : originalTask.envelope; }\n catch { return null; }\n }, [originalTask?.envelope]);\n const resolvedPrompt = (originalEnvelope as any)?.data?.prompt ?? originalPrompt;\n\n // Pre-fill prompt once\n if (resolvedPrompt && !promptInitialized) {\n setPromptInitialized(true);\n setTestPrompt(resolvedPrompt);\n }\n\n // Verify run\n const { data: verifyExecution } = useMcpQueryExecution(verifyRunId ?? undefined);\n const { data: verifyResult } = useMcpQueryResult(\n verifyExecution?.status === 'completed' ? verifyRunId ?? undefined : undefined,\n );\n\n const verifyStatus = verifyExecution?.status;\n const verifyData = (verifyResult?.result?.data ?? {}) as Record<string, unknown>;\n const verifyDiscovery = verifyData.discovery as Record<string, unknown> | undefined;\n const usedDeterministic = verifyDiscovery?.method === 'compiled-workflow';\n const isRunning = verifyRunId && verifyStatus !== 'completed' && verifyStatus !== 'failed';\n\n const handleSubmit = async () => {\n if (!testPrompt.trim()) return;\n const res = await submitQuery.mutateAsync({ prompt: testPrompt.trim() });\n setVerifyRunId(res.workflow_id);\n };\n\n return (\n <div>\n <div className=\"mb-6\">\n <h2 className=\"text-lg font-light text-text-primary\">End-to-End Verification</h2>\n <p className=\"text-xs text-text-tertiary mt-0.5\">\n Submit the original prompt (or a variant) to verify that\n <span className=\"font-mono text-text-primary mx-1\">{workflowName}</span>\n handles it deterministically.\n If results are unexpected, go <button onClick={onGoToDeploy} className=\"text-accent hover:underline\">back</button> to adjust.\n </p>\n </div>\n\n {/* Row 1: Headers + metadata (aligned) */}\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-8 mb-4\">\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">Query Prompt</p>\n <p className=\"text-[10px] text-text-tertiary\">\n {testPrompt !== resolvedPrompt && resolvedPrompt\n ? <button onClick={() => setTestPrompt(resolvedPrompt)} className=\"text-accent hover:underline\">Reset to original</button>\n : 'Edit and submit to verify'}\n </p>\n </div>\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">Result</p>\n {!verifyRunId && (\n <p className=\"text-[10px] text-text-tertiary italic\">Awaiting submission</p>\n )}\n {isRunning && (\n <div className=\"flex items-center gap-2\">\n <StatusBadge status=\"in_progress\" />\n <span className=\"text-[10px] text-text-secondary animate-pulse\">Routing...</span>\n </div>\n )}\n {verifyStatus === 'failed' && (\n <div className=\"flex items-center gap-2\">\n <StatusBadge status=\"failed\" />\n <span className=\"text-[10px] text-status-error\">Failed</span>\n </div>\n )}\n {verifyStatus === 'completed' && (\n <div className=\"flex items-center gap-2 flex-wrap\">\n <StatusBadge status=\"completed\" />\n {usedDeterministic ? (\n <span className=\"text-[10px] bg-status-success/10 text-status-success px-2 py-0.5 rounded-full\">\n Deterministic ({((verifyDiscovery?.confidence as number) * 100).toFixed(0)}%)\n </span>\n ) : (\n <span className=\"text-[10px] bg-status-pending/10 text-status-pending px-2 py-0.5 rounded-full\">\n Dynamic (no match)\n </span>\n )}\n {verifyExecution?.duration_ms != null && (\n <span className=\"text-[10px] text-text-tertiary\">{(verifyExecution.duration_ms / 1000).toFixed(1)}s</span>\n )}\n </div>\n )}\n </div>\n </div>\n\n {/* Row 2: Prompt input + output (aligned) */}\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-8\">\n {/* Left: editable prompt */}\n <div>\n <textarea\n value={testPrompt}\n onChange={(e) => setTestPrompt(e.target.value)}\n className=\"w-full min-h-[160px] px-3 py-2 bg-surface-sunken border border-surface-border rounded-md text-xs text-text-primary placeholder:text-text-tertiary resize-y focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary\"\n placeholder=\"Type a natural language query...\"\n />\n <div className=\"flex justify-end mt-2\">\n <button\n onClick={handleSubmit}\n disabled={!testPrompt.trim() || submitQuery.isPending || !!isRunning}\n className=\"inline-flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium bg-accent/10 text-accent rounded-md hover:bg-accent/20 transition-colors disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n <svg className=\"w-3 h-3\" viewBox=\"0 0 12 12\" fill=\"currentColor\"><path d=\"M3 1.5v9l7.5-4.5z\" /></svg>\n {submitQuery.isPending ? 'Starting...' : isRunning ? 'Running...' : verifyRunId ? 'Resubmit' : 'Submit'}\n </button>\n </div>\n </div>\n\n {/* Right: output */}\n <div>\n {!verifyRunId && (\n <div className=\"flex items-center justify-center min-h-[160px] text-xs text-text-tertiary italic\">\n Submit a query to see the result\n </div>\n )}\n\n {isRunning && (\n <div className=\"min-h-[160px] flex items-start pt-4\">\n <RouterProgressTracker\n events={verifyExecution?.events}\n status={verifyStatus}\n verifyRunId={verifyRunId}\n />\n </div>\n )}\n\n {verifyStatus === 'completed' && (\n <div className=\"space-y-3\">\n {typeof verifyData.title === 'string' && (\n <p className=\"text-sm text-text-primary\">{verifyData.title}</p>\n )}\n {verifyData.result != null && (\n <JsonViewer data={verifyData.result} defaultMode=\"tree\" />\n )}\n <div className=\"flex items-center gap-3 pt-1\">\n <Link to={`/mcp/queries/${verifyRunId}`} className=\"text-[10px] text-accent hover:underline\">\n View full details\n </Link>\n <button onClick={() => setVerifyRunId(null)} className=\"text-[10px] text-text-tertiary hover:text-text-primary\">\n Clear\n </button>\n </div>\n </div>\n )}\n\n {verifyStatus === 'failed' && (\n <p className=\"text-xs text-status-error py-4\">Query failed. Try modifying the prompt.</p>\n )}\n </div>\n </div>\n\n <WizardNav>\n <button onClick={onBack} className=\"px-3 py-1.5 text-xs text-text-secondary hover:text-text-primary\">Back</button>\n <span className=\"text-[10px] text-text-tertiary\">End-to-end verification — modify the prompt and submit to test the full pipeline</span>\n </WizardNav>\n </div>\n );\n}\n","import { Link, useNavigate } from 'react-router-dom';\n\ninterface EscalationBannerProps {\n escalation: any | undefined;\n isRoundsExhausted: boolean;\n diagnosis: string | undefined;\n onRetryTriage?: () => void;\n isRetrying?: boolean;\n /** The successful re-run workflow ID (discovered from triage result) */\n rerunWorkflowId?: string;\n}\n\nexport function EscalationBanner({ escalation, isRoundsExhausted, diagnosis, onRetryTriage, isRetrying, rerunWorkflowId }: EscalationBannerProps) {\n const navigate = useNavigate();\n\n if (!escalation && !isRoundsExhausted) return null;\n\n const isPending = escalation?.status === 'pending';\n const isResolved = escalation?.status === 'resolved';\n\n // Extract triage metadata from resolver_payload\n const resolverPayload = (() => {\n if (!escalation?.resolver_payload) return null;\n try {\n return typeof escalation.resolver_payload === 'string'\n ? JSON.parse(escalation.resolver_payload)\n : escalation.resolver_payload;\n } catch { return null; }\n })();\n const wasTriaged = resolverPayload?._lt?.triaged === true;\n\n // Extract original failure context from escalation_payload\n const escalationPayload = (() => {\n if (!escalation?.escalation_payload) return null;\n try {\n return typeof escalation.escalation_payload === 'string'\n ? JSON.parse(escalation.escalation_payload)\n : escalation.escalation_payload;\n } catch { return null; }\n })();\n const originalDiagnosis = escalationPayload?.diagnosis as string | undefined;\n\n // ── Resolved by triage: outcome-focused ────────────────────────\n if (isResolved && wasTriaged) {\n return (\n <div className=\"rounded-md mb-4 border border-status-success/30 bg-surface-raised overflow-hidden\">\n <div className=\"px-4 pt-3 pb-2\">\n <div className=\"flex items-start gap-3\">\n <svg className=\"w-4 h-4 mt-0.5 shrink-0 text-status-success\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M8 1a7 7 0 110 14A7 7 0 018 1zm3.36 4.65a.5.5 0 00-.72 0L7 9.29 5.36 7.65a.5.5 0 10-.72.7l2 2a.5.5 0 00.72 0l4-4a.5.5 0 000-.7z\" />\n </svg>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-xs font-medium text-status-success\">\n {rerunWorkflowId\n ? 'This query succeeded after AI triage'\n : 'AI triage resolved this query'}\n </p>\n <p className=\"text-xs text-text-secondary mt-1.5 leading-relaxed\">\n {rerunWorkflowId\n ? 'The original run hit a wall, but AI triage diagnosed the issue and re-ran the query successfully. The successful run is ready to compile into a deterministic workflow.'\n : 'The original run hit a wall. AI triage diagnosed the issue and resolved it.'}\n </p>\n </div>\n </div>\n </div>\n\n {originalDiagnosis && (\n <div className=\"px-4 py-2 mx-4 mb-2 rounded bg-surface-sunken\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">What went wrong</p>\n <p className=\"text-xs text-text-secondary leading-relaxed line-clamp-2\">{originalDiagnosis}</p>\n </div>\n )}\n\n {/* Clear outcomes */}\n <div className=\"px-4 py-3 border-t border-surface-border bg-surface-sunken/50\">\n <div className=\"flex items-center gap-3\">\n {rerunWorkflowId && (\n <button\n onClick={() => navigate(`/mcp/queries/${rerunWorkflowId}`)}\n className=\"inline-flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium bg-accent text-text-inverse rounded-md hover:bg-accent/90 transition-colors\"\n >\n Continue to successful run\n <svg className=\"w-3 h-3\" viewBox=\"0 0 12 12\" fill=\"currentColor\">\n <path d=\"M4.5 2l4 4-4 4\" />\n </svg>\n </button>\n )}\n <button\n onClick={() => navigate('/mcp/queries')}\n className=\"inline-flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium text-text-secondary border border-surface-border rounded-md hover:bg-surface-sunken transition-colors\"\n >\n Start fresh\n </button>\n <Link\n to={`/escalations/detail/${escalation.id}`}\n className=\"text-[10px] text-text-tertiary hover:text-accent hover:underline ml-auto\"\n >\n Details\n </Link>\n </div>\n </div>\n </div>\n );\n }\n\n // ── Resolved (non-triage) ──────────────────────────────────────\n if (isResolved) {\n return (\n <div className=\"rounded-md px-4 py-3 mb-4 border bg-surface-raised border-status-success/30\">\n <div className=\"flex items-start gap-3\">\n <svg className=\"w-4 h-4 mt-0.5 shrink-0 text-status-success\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M8 1a7 7 0 110 14A7 7 0 018 1zm3.36 4.65a.5.5 0 00-.72 0L7 9.29 5.36 7.65a.5.5 0 10-.72.7l2 2a.5.5 0 00.72 0l4-4a.5.5 0 000-.7z\" />\n </svg>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-xs font-medium text-status-success\">Escalation resolved</p>\n <p className=\"text-xs text-text-tertiary mt-1\">\n This escalation was resolved manually. You can continue to compile.\n </p>\n <div className=\"flex items-center gap-3 mt-2\">\n {escalation && (\n <Link to={`/escalations/detail/${escalation.id}`} className=\"text-[10px] text-accent hover:underline\">\n View escalation\n </Link>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n // ── Pending / rounds exhausted ─────────────────────────────────\n return (\n <div className=\"rounded-md px-4 py-3 mb-4 border bg-surface-raised border-status-warning/30\">\n <div className=\"flex items-start gap-3\">\n <svg className=\"w-4 h-4 mt-0.5 shrink-0 text-status-warning\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M8 1a7 7 0 110 14A7 7 0 018 1zm0 3a.75.75 0 00-.75.75v3.5a.75.75 0 001.5 0v-3.5A.75.75 0 008 4zm0 7a.75.75 0 100-1.5.75.75 0 000 1.5z\" />\n </svg>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-xs font-medium text-status-warning\">\n {isRoundsExhausted\n ? 'This query exceeded the maximum tool rounds'\n : 'This query has a pending escalation'}\n </p>\n {diagnosis && (\n <p className=\"text-xs text-text-secondary mt-1 line-clamp-2\">{diagnosis}</p>\n )}\n <div className=\"flex items-center gap-3 mt-2\">\n {isPending && onRetryTriage && (\n <button\n onClick={onRetryTriage}\n disabled={isRetrying}\n className=\"inline-flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium bg-accent text-text-inverse rounded-md hover:bg-accent/90 disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n >\n <svg className=\"w-3 h-3\" viewBox=\"0 0 12 12\" fill=\"currentColor\"><path d=\"M6 0.5a5.5 5.5 0 100 11 5.5 5.5 0 000-11zm2 6l-3 1.75v-3.5l3 1.75z\" /></svg>\n {isRetrying ? 'Sending...' : 'Retry with AI Triage'}\n </button>\n )}\n {escalation && (\n <Link to={`/escalations/detail/${escalation.id}`} className=\"text-[10px] text-accent hover:underline\">\n View escalation\n </Link>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import { useState, useMemo, useEffect, useRef } from 'react';\nimport { useParams, useNavigate, useSearchParams } from 'react-router-dom';\nimport { useQueryClient } from '@tanstack/react-query';\n\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { WizardSteps } from '../../../components/common/layout/WizardSteps';\nimport { StatusBadge } from '../../../components/common/display/StatusBadge';\nimport { CopyableId } from '../../../components/common/display/CopyableId';\nimport { TimeAgo } from '../../../components/common/display/TimeAgo';\nimport { useWorkflowDetailEvents } from '../../../hooks/useNatsEvents';\nimport { useWizardStep } from '../../../hooks/useWizardStep';\nimport { useMcpQueryExecution, useMcpQueryResult, useYamlWorkflowForSource, useDescribeMcpQuery } from '../../../api/mcp-query';\nimport { useCreateYamlWorkflow, useYamlWorkflowAppIds } from '../../../api/yaml-workflows';\nimport { useWorkflowExecution } from '../../../api/workflows';\nimport { useTaskByWorkflowId } from '../../../api/tasks';\nimport { useEscalationsByWorkflowId, useClaimEscalation, useResolveEscalation } from '../../../api/escalations';\n\nimport { mapStatus, extractJsonFromSummary, STEP_LABELS_BASE } from './helpers';\nimport type { Step } from './helpers';\nimport { OriginalQueryPanel } from './OriginalQueryPanel';\nimport { TimelinePanel } from './TimelinePanel';\nimport { ProfilePanel } from './ProfilePanel';\nimport { DeployPanel } from './DeployPanel';\nimport { TestPanel } from './TestPanel';\nimport { VerifyPanel } from './VerifyPanel';\nimport { EscalationBanner } from './EscalationBanner';\n\n// ── Main component ──────────────────────────────────────────────────────────\n\nexport function McpQueryDetailPage() {\n const { workflowId } = useParams<{ workflowId: string }>();\n const navigate = useNavigate();\n const [searchParams, setSearchParams] = useSearchParams();\n const queryClient = useQueryClient();\n\n // Strip ?prompt= from URL on mount (keep only step)\n const promptFromUrl = useRef(searchParams.get('prompt'));\n useEffect(() => {\n if (searchParams.has('prompt')) {\n setSearchParams((prev) => {\n const next = new URLSearchParams(prev);\n next.delete('prompt');\n return next;\n }, { replace: true });\n }\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n const [compileAppId, setCompileAppId] = useState('longtail');\n const [compileName, setCompileName] = useState('');\n const [compileDescription, setCompileDescription] = useState('');\n const [compileTags, setCompileTags] = useState<string[]>([]);\n const [compileInitialized, setCompileInitialized] = useState(false);\n const [compileFeedback, setCompileFeedback] = useState('');\n\n const { data: execution } = useMcpQueryExecution(workflowId);\n const { data: resultData } = useMcpQueryResult(workflowId);\n const { data: yamlSearch } = useYamlWorkflowForSource(workflowId);\n useWorkflowDetailEvents(workflowId);\n\n const createYaml = useCreateYamlWorkflow();\n const { data: appIdData } = useYamlWorkflowAppIds();\n\n // Original execution + task envelope (for Panel 1 and prompt extraction)\n const { data: originalExecution } = useWorkflowExecution(workflowId ?? '');\n const { data: originalTask } = useTaskByWorkflowId(workflowId ?? '');\n const originalEnvelope = useMemo(() => {\n if (!originalTask?.envelope) return null;\n try { return typeof originalTask.envelope === 'string' ? JSON.parse(originalTask.envelope) : originalTask.envelope; }\n catch { return null; }\n }, [originalTask?.envelope]);\n const originalExecResult = (originalExecution?.result as any)?.data as Record<string, unknown> | undefined;\n\n const status = mapStatus(execution);\n const result = resultData?.result?.data as Record<string, unknown> | undefined;\n const discovery = (result?.discovery as Record<string, unknown>) || {};\n const events = execution?.events ?? [];\n\n // Escalation data + triage action hooks\n const { data: escalationData } = useEscalationsByWorkflowId(workflowId);\n const activeEscalation = escalationData?.escalations?.find((e: any) => e.status === 'pending');\n const resolvedEscalation = escalationData?.escalations?.find((e: any) => e.status === 'resolved');\n const displayEscalation = activeEscalation || resolvedEscalation;\n const claimMutation = useClaimEscalation();\n const resolveMutation = useResolveEscalation();\n\n // Extract triage metadata from resolved escalation\n const resolvedPayload = useMemo(() => {\n if (!resolvedEscalation?.resolver_payload) return null;\n try {\n return typeof resolvedEscalation.resolver_payload === 'string'\n ? JSON.parse(resolvedEscalation.resolver_payload)\n : resolvedEscalation.resolver_payload;\n } catch { return null; }\n }, [resolvedEscalation?.resolver_payload]);\n const triageWorkflowId = resolvedPayload?._lt?.triageWorkflowId as string | undefined;\n\n // Fetch the triage result to discover the re-run workflow ID\n const { data: triageResultData } = useWorkflowExecution(\n resolvedPayload?._lt?.triaged ? (triageWorkflowId ?? '') : '',\n );\n const triageResult = (triageResultData?.result as any)?.data as Record<string, unknown> | undefined;\n const rerunWorkflowId = triageResult?.rerunWorkflowId as string | undefined;\n\n // Detect rounds_exhausted from result data OR milestones (covers old + new runs)\n const milestones = (resultData?.result as any)?.milestones as Array<{ name: string; value: string }> | undefined;\n const isRoundsExhausted = !!(result as any)?.rounds_exhausted ||\n !!milestones?.some((m) => m.name === 'rounds_exhausted');\n\n // This run is uncompilable if it failed — triage resolving doesn't make THIS run compilable\n const isUncompilable = isRoundsExhausted || !!activeEscalation;\n\n // Extract original prompt: envelope > URL param (captured on mount) > execution events\n const originalPrompt = useMemo(() => {\n const fromEnvelope = (originalEnvelope as any)?.data?.prompt;\n if (fromEnvelope) return fromEnvelope as string;\n if (promptFromUrl.current) return promptFromUrl.current;\n for (const e of events) {\n const attrs = e.attributes as Record<string, unknown>;\n if (attrs.activity_type === 'findCompiledWorkflows' && Array.isArray(attrs.input) && typeof (attrs.input as unknown[])[0] === 'string') {\n return (attrs.input as string[])[0];\n }\n }\n return undefined;\n }, [originalEnvelope, events]);\n\n // Extract structured output from original execution\n const originalOutput = useMemo(() => {\n return originalExecResult?.result ??\n (typeof originalExecResult?.summary === 'string' ? extractJsonFromSummary(originalExecResult.summary) : null) ??\n result?.result ??\n (typeof result?.summary === 'string' ? extractJsonFromSummary(result.summary as string) : null) ??\n null;\n }, [originalExecResult, result]);\n\n const describePrompt = originalPrompt || (result?.title as string | undefined);\n const { data: describeData } = useDescribeMcpQuery({\n prompt: status === 'completed' ? describePrompt : undefined,\n resultTitle: result?.title as string | undefined,\n resultSummary: result?.summary as string | undefined,\n });\n\n const compiledYaml = yamlSearch?.workflows?.find(\n (w) => w.status === 'active' || w.status === 'deployed' || w.status === 'draft',\n );\n\n const autoStep: Step = useMemo(() => {\n if (status === 'pending') return 1;\n if (status === 'in_progress') return 2;\n if (!result) return 1;\n if (!compiledYaml) return 2;\n if (compiledYaml.status === 'draft' || compiledYaml.status === 'deployed') return 4;\n return 5;\n }, [status, result, compiledYaml]);\n\n const [manualStep, setManualStep] = useWizardStep();\n const step = (manualStep as Step | null) ?? autoStep;\n\n // Sequential unlock: each step requires the prior step to be satisfied\n // 1 (Query) — always available\n // 2 (Timeline) — available when workflow has started (not pending)\n // 3 (Profile) — available when workflow completed and not uncompilable\n // 4 (Deploy) — available when a compiled YAML exists (draft or later)\n // 5 (Test) — available when YAML is deployed or active\n // 6 (Verify) — available when YAML is active (deployed + tested)\n const maxReachable: Step = (() => {\n if (status === 'pending') return 1;\n if (status === 'in_progress' || !result) return 2;\n if (isUncompilable) return 2;\n if (!compiledYaml) return 3;\n if (compiledYaml.status === 'draft') return 4;\n if (compiledYaml.status === 'deployed') return 5;\n return 6; // active\n })() as Step;\n\n // Auto-advance from step 2 → step 3 when workflow completes\n const prevStatusRef = useRef(status);\n useEffect(() => {\n if (prevStatusRef.current === 'in_progress' && status === 'completed' && manualStep === null) {\n setManualStep(3);\n }\n prevStatusRef.current = status;\n }, [status, manualStep, setManualStep]);\n\n const stepLabels = useMemo((): string[] => {\n const labels: string[] = [...STEP_LABELS_BASE];\n if (compiledYaml?.status === 'active') labels[3] = 'Redeploy';\n return labels;\n }, [compiledYaml?.status]);\n\n // Pre-fill compile fields from LLM\n if (describeData && !compileInitialized) {\n setCompileInitialized(true);\n if (!compileDescription) setCompileDescription(describeData.description);\n if (compileTags.length === 0 && describeData.tags.length > 0) setCompileTags(describeData.tags);\n if (!compileName && describeData.tool_name) setCompileName(describeData.tool_name);\n }\n\n // Topic always derives from namespace\n const derivedSubscribes = compileAppId.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');\n const allAppIds = useMemo(() => appIdData?.app_ids ?? [], [appIdData?.app_ids]);\n\n const handleCompile = async () => {\n if (!workflowId || !compileName.trim() || !compileAppId.trim()) return;\n await createYaml.mutateAsync({\n workflow_id: workflowId, task_queue: 'long-tail-system', workflow_name: 'mcpQuery',\n name: compileName.trim(), description: compileDescription.trim() || undefined,\n app_id: compileAppId.trim(), subscribes: derivedSubscribes, tags: compileTags,\n compilation_feedback: compileFeedback.trim() || undefined,\n });\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflowForSource'], refetchType: 'all' });\n setManualStep(4);\n };\n\n const handleRetryTriage = async () => {\n if (!activeEscalation) return;\n await claimMutation.mutateAsync({ id: activeEscalation.id, durationMinutes: 30 });\n const diagnosis = (result as any)?.diagnosis as string || activeEscalation.description || '';\n await resolveMutation.mutateAsync({\n id: activeEscalation.id,\n resolverPayload: { _lt: { needsTriage: true }, notes: diagnosis },\n });\n };\n\n // Determine the correct next step for profile panel navigation\n const profileNextStep = compiledYaml?.status === 'active' ? 5 : 4;\n\n return (\n <div className=\"flex flex-col min-h-[calc(100vh-12rem)]\">\n <PageHeader\n title=\"Compilation Wizard\"\n actions={\n <button onClick={() => navigate('/mcp/queries')} className=\"text-sm text-text-secondary hover:text-text-primary\">\n Back to list\n </button>\n }\n />\n\n {/* Status card */}\n <div className=\"bg-surface-raised border border-surface-border rounded-md px-6 py-5 mb-6\">\n <div className=\"flex items-center gap-4 mb-4\">\n <StatusBadge status={status} />\n {discovery?.method === 'compiled-workflow' && (\n <span className=\"text-xs bg-status-success/10 text-status-success px-2 py-0.5 rounded-full\">\n Deterministic ({((discovery.confidence as number) * 100).toFixed(0)}% match)\n </span>\n )}\n </div>\n <div className=\"grid grid-cols-2 sm:grid-cols-4 gap-y-3 gap-x-8\">\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5\">Run ID</p>\n <CopyableId label=\"\" value={workflowId ?? null} href={`/workflows/executions/${workflowId}`} />\n </div>\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5\">Duration</p>\n <p className=\"text-xs text-text-primary font-mono\">\n {execution?.duration_ms != null ? `${(execution.duration_ms / 1000).toFixed(1)}s` : '\\u2014'}\n </p>\n </div>\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5\">Started</p>\n <p className=\"text-xs text-text-primary\">\n {execution?.start_time ? <TimeAgo date={execution.start_time} /> : '\\u2014'}\n </p>\n </div>\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5\">Tool Calls</p>\n <p className=\"text-xs text-text-primary\">\n {typeof result?.tool_calls_made === 'number' ? result.tool_calls_made : '\\u2014'}\n </p>\n </div>\n </div>\n </div>\n\n {/* Escalation banner */}\n <EscalationBanner\n escalation={displayEscalation}\n isRoundsExhausted={isRoundsExhausted}\n diagnosis={(result as any)?.diagnosis as string | undefined}\n onRetryTriage={activeEscalation ? handleRetryTriage : undefined}\n isRetrying={claimMutation.isPending || resolveMutation.isPending}\n rerunWorkflowId={rerunWorkflowId}\n />\n\n <WizardSteps labels={stepLabels} current={step} maxReachable={maxReachable} onStepClick={(s) => setManualStep(s as Step)} />\n\n {/* Panel content */}\n <div className=\"flex-1\">\n\n {step === 1 && (\n <OriginalQueryPanel\n status={status}\n originalEnvelope={originalEnvelope}\n originalPrompt={originalPrompt}\n originalOutput={originalOutput}\n originalDurationMs={originalExecution?.duration_ms}\n resultSummary={result?.summary as string | undefined}\n onNext={() => setManualStep(2)}\n />\n )}\n\n {step === 2 && (\n <TimelinePanel\n events={events}\n onBack={() => setManualStep(1)}\n onNext={() => setManualStep(3)}\n />\n )}\n\n {step === 3 && (\n <ProfilePanel\n compiledYaml={compiledYaml}\n originalPrompt={originalPrompt}\n compileAppId={compileAppId}\n setCompileAppId={setCompileAppId}\n compileName={compileName}\n setCompileName={setCompileName}\n compileDescription={compileDescription}\n setCompileDescription={setCompileDescription}\n compileTags={compileTags}\n setCompileTags={setCompileTags}\n describeData={describeData}\n describePrompt={describePrompt}\n allAppIds={allAppIds}\n compileFeedback={compileFeedback}\n setCompileFeedback={setCompileFeedback}\n onCompile={handleCompile}\n isCompiling={createYaml.isPending}\n compileError={createYaml.isError ? createYaml.error.message : undefined}\n isUncompilable={isUncompilable}\n onBack={() => setManualStep(2)}\n onNext={() => setManualStep(profileNextStep as Step)}\n />\n )}\n\n {step === 4 && compiledYaml && (\n <DeployPanel\n yamlId={compiledYaml.id}\n onAdvance={() => setManualStep(5)}\n onBack={() => setManualStep(3)}\n />\n )}\n\n {step === 5 && compiledYaml && (\n <TestPanel\n yamlId={compiledYaml.id}\n originalWorkflowId={workflowId}\n originalResult={result}\n originalPrompt={originalPrompt}\n onBack={() => setManualStep(4)}\n onAdvance={() => setManualStep(6)}\n />\n )}\n\n {step === 6 && compiledYaml && (\n <VerifyPanel\n originalWorkflowId={workflowId}\n originalPrompt={originalPrompt}\n workflowName={compiledYaml.name}\n onBack={() => setManualStep(5)}\n onGoToDeploy={() => setManualStep(4)}\n />\n )}\n\n </div>{/* end flex-1 panel content */}\n </div>\n );\n}\n"],"names":["WizardSteps","labels","current","maxReachable","onStepClick","jsx","label","i","isReachable","jsxs","useWizardStep","searchParams","setSearchParams","useSearchParams","stepValue","setStep","useCallback","step","prev","next","STEP_LABELS_BASE","mapStatus","exec","extractJsonFromSummary","summary","match","WizardNav","children","PanelTitle","title","subtitle","ResultSummary","text","parts","jsonBlockRe","lastIndex","p","JsonViewer","SimpleMarkdown","OriginalQueryPanel","status","originalEnvelope","originalPrompt","originalOutput","originalDurationMs","resultSummary","onNext","TimelinePanel","events","onBack","SwimlaneTimeline","SectionHeading","ExistingProfileView","compiledYaml","StatusBadge","_a","a","arr","_b","tag","Link","CreateProfileForm","compileAppId","setCompileAppId","compileName","setCompileName","compileDescription","setCompileDescription","compileTags","setCompileTags","describeData","describePrompt","allAppIds","compileFeedback","setCompileFeedback","onCompile","isCompiling","compileError","showFeedback","setShowFeedback","useState","e","id","TagInput","ProfilePanel","props","isUncompilable","DeployPanel","yamlId","onAdvance","queryClient","useQueryClient","yamlTextareaRef","useRef","feedbackText","setFeedbackText","wf","refetch","useYamlWorkflow","versionsData","useYamlWorkflowVersions","deployMutation","useDeployYamlWorkflow","activateMutation","useActivateYamlWorkflow","archiveMutation","useArchiveYamlWorkflow","deleteMutation","useDeleteYamlWorkflow","regenerateMutation","useRegenerateYamlWorkflow","updateMutation","useUpdateYamlWorkflow","yamlDraft","setYamlDraft","inputSchemaDraft","setInputSchemaDraft","outputSchemaDraft","setOutputSchemaDraft","inputFieldMetaDraft","setInputFieldMetaDraft","configEditing","setConfigEditing","versionParam","setVersionParam","isViewingHistory","versionSnapshot","useYamlWorkflowVersion","resolvedYaml","resolvedInputSchema","resolvedOutputSchema","useEffect","versionSearchParams","useMemo","sp","setVersionSearchParams","v","canEditConfig","handleSaveConfig","inputSchema","outputSchema","handleCancelEdit","handleDeploy","handleRegenerate","isPending","MessageSquarePlus","Pencil","ConfigurationSection","LifecycleSidebar","VersionHistory","jobLabel","job","date","time","day","TestPanel","originalWorkflowId","originalResult","invokeMutation","useInvokeYamlWorkflow","runs","useMcpRuns","selectedRunId","setSelectedRunId","selectedRunExecution","useMcpRunExecution","showInvokeModal","setShowInvokeModal","invokeJsonMode","setInvokeJsonMode","invokeFields","setInvokeFields","invokeJson","setInvokeJson","activeJobId","setActiveJobId","activitySteps","jobComplete","useYamlActivityEvents","originalExecution","useWorkflowExecution","originalTask","useTaskByWorkflowId","originalExecResult","resolvedPrompt","jobs","skeleton","buildSkeleton","handleInvoke","data","result","completedJobId","timer","deterministicOutput","deterministicInput","execResult","jsonMatch","_c","triggerEvent","Modal","LiveActivityTimeline","Fragment","key","value","TOOL_SOURCE_COLORS","steps","manifest","isComplete","workerActivities","totalSteps","merged","live","s","source","colors","idx","isLast","STEPS","derivePhase","childStart","childId","isDeterministic","activityTypes","RouterProgressTracker","verifyRunId","phase","isDone","stepNum","isActive","VerifyPanel","workflowName","onGoToDeploy","submitQuery","useSubmitMcpQueryRouted","testPrompt","setTestPrompt","promptInitialized","setPromptInitialized","setVerifyRunId","verifyExecution","useMcpQueryExecution","verifyResult","useMcpQueryResult","verifyStatus","verifyData","verifyDiscovery","usedDeterministic","isRunning","handleSubmit","res","EscalationBanner","escalation","isRoundsExhausted","diagnosis","onRetryTriage","isRetrying","rerunWorkflowId","navigate","useNavigate","isResolved","resolverPayload","wasTriaged","escalationPayload","originalDiagnosis","McpQueryDetailPage","workflowId","useParams","promptFromUrl","compileInitialized","setCompileInitialized","execution","resultData","yamlSearch","useYamlWorkflowForSource","useWorkflowDetailEvents","createYaml","useCreateYamlWorkflow","appIdData","useYamlWorkflowAppIds","discovery","escalationData","useEscalationsByWorkflowId","activeEscalation","resolvedEscalation","_d","displayEscalation","claimMutation","useClaimEscalation","resolveMutation","useResolveEscalation","resolvedPayload","triageWorkflowId","_e","triageResultData","_f","triageResult","_g","milestones","_h","m","fromEnvelope","attrs","useDescribeMcpQuery","_i","w","autoStep","manualStep","setManualStep","prevStatusRef","stepLabels","derivedSubscribes","handleCompile","handleRetryTriage","profileNextStep","PageHeader","CopyableId","TimeAgo"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{a as h,j as e}from"./vendor-query-B2UbickB.js";import{P as v}from"./PageHeader-CpWFly5S.js";import{D as S}from"./DataTable-BDn1WBHS.js";import{F as P,b as C}from"./FilterBar-Ck4K4rzu.js";import{S as D}from"./StickyPagination-F9FZsRy9.js";import{T as b}from"./TimestampCell-DoWMKg6w.js";import{W as _}from"./WorkflowPill-CCDSVaQj.js";import{E as M}from"./EmptyState-2CmV-IaS.js";import{u as R}from"./useFilterParams-BaXUAkYK.js";import{a as F}from"./useNatsEvents-Xr43X1fG.js";import{u as E,a as W,b as L}from"./mcp-query-DoAyPbjC.js";import{e as T,Z as z,i as $,j as Q,k as K}from"./vendor-icons-ZTAKVwGc.js";import{b as U}from"./vendor-react-Cw8Gy8NJ.js";import"./TimeAgo-UPG6DoH8.js";import"./format-gXZXQ-HJ.js";import"./index-D8VH6K8B.js";function q(t){return t.status==="completed"||Number(t.status)===0?"completed":t.is_live?"in_progress":"failed"}const A=[{key:"entity",label:"Workflow Type",className:"whitespace-nowrap",render:t=>{const r=q(t),n=r==="completed"?"fill-status-success text-status-success":r==="in_progress"?"fill-status-active text-status-active animate-pulse":"fill-status-error text-status-error";return e.jsxs("span",{className:"inline-flex items-center gap-2",children:[e.jsx(Q,{className:`w-2.5 h-2.5 shrink-0 ${n}`}),e.jsx(_,{type:t.entity||"unknown"})]})}},{key:"workflow_id",label:"Workflow ID",render:t=>e.jsx("span",{className:"text-xs font-mono text-text-primary truncate block",children:t.workflow_id})},{key:"created_at",label:"Created",className:"w-36",sortable:!0,render:t=>e.jsx(b,{date:t.created_at})},{key:"updated_at",label:"Updated",className:"w-36",render:t=>e.jsx(b,{date:t.updated_at})},{key:"actions",label:"",className:"w-10",render:()=>e.jsx("span",{className:"opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-accent",children:e.jsx(K,{className:"w-4 h-4",strokeWidth:1.5})})}];function oe(){const t=U(),[r,n]=h.useState(""),[l,g]=h.useState(!0),y=E(),j=W(),o=l?y:j,{filters:c,setFilter:w,pagination:a,sort:N,setSort:k}=R({filters:{search:"",status:""},pageSize:20}),{data:i,isLoading:m}=L({limit:a.pageSize,offset:a.offset,search:c.search,status:c.status});F();const p=async s=>{s.preventDefault();const d=r.trim();if(!d)return;const f=await o.mutateAsync({prompt:d});n(""),t(l?`/mcp/queries/${f.workflow_id}?prompt=${encodeURIComponent(d)}`:`/workflows/executions/${f.workflow_id}`)},x=(i==null?void 0:i.jobs)??[],u=(i==null?void 0:i.total)??0;return e.jsxs(e.Fragment,{children:[e.jsx(v,{title:"Pipeline Designer"}),e.jsx("p",{className:"text-sm text-text-secondary mb-6 max-w-2xl leading-relaxed",children:"Describe a task and MCP discovers the right tools, executes the workflow, and compiles the result into a reusable pipeline."}),e.jsxs("div",{className:"grid grid-cols-3 gap-4 mb-8",children:[e.jsxs("div",{className:"flex items-start gap-3 p-3 rounded-lg border border-surface-border bg-surface-raised/50",children:[e.jsx(T,{className:"w-4 h-4 mt-0.5 text-accent shrink-0"}),e.jsxs("div",{children:[e.jsx("p",{className:"text-xs font-medium text-text-primary",children:"1. Describe"}),e.jsx("p",{className:"text-[10px] text-text-tertiary mt-0.5 leading-relaxed",children:"Write a specific prompt. Mention tools, URLs, credentials, and expected outputs."})]})]}),e.jsxs("div",{className:"flex items-start gap-3 p-3 rounded-lg border border-surface-border bg-surface-raised/50",children:[e.jsx(z,{className:"w-4 h-4 mt-0.5 text-status-warning shrink-0"}),e.jsxs("div",{children:[e.jsx("p",{className:"text-xs font-medium text-text-primary",children:"2. Discover"}),e.jsx("p",{className:"text-[10px] text-text-tertiary mt-0.5 leading-relaxed",children:"MCP selects servers, calls tools, and chains results. You review the execution."})]})]}),e.jsxs("div",{className:"flex items-start gap-3 p-3 rounded-lg border border-surface-border bg-surface-raised/50",children:[e.jsx($,{className:"w-4 h-4 mt-0.5 text-status-success shrink-0"}),e.jsxs("div",{children:[e.jsx("p",{className:"text-xs font-medium text-text-primary",children:"3. Compile"}),e.jsx("p",{className:"text-[10px] text-text-tertiary mt-0.5 leading-relaxed",children:"Successful runs compile into deterministic pipelines. No LLM needed at runtime."})]})]})]}),e.jsxs("form",{onSubmit:p,className:"mb-8",children:[e.jsxs("div",{className:"rounded-lg border border-surface-border bg-surface-raised overflow-hidden",children:[e.jsx("textarea",{value:r,onChange:s=>n(s.target.value),placeholder:"Describe what you want to accomplish. Be specific about which tools to use, what data to capture, and how results should be structured...",className:"w-full min-h-[100px] max-h-[200px] px-4 py-3 bg-transparent text-sm text-text-primary placeholder:text-text-tertiary resize-y focus:outline-none border-none",onKeyDown:s=>{s.key==="Enter"&&(s.metaKey||s.ctrlKey)&&p(s)}}),e.jsxs("div",{className:"flex items-center justify-between px-4 py-2 border-t border-surface-border bg-surface-sunken/30",children:[e.jsxs("label",{className:"flex items-center gap-2 cursor-pointer select-none group",children:[e.jsx("input",{type:"checkbox",checked:l,onChange:s=>g(s.target.checked),className:"w-3.5 h-3.5 rounded border-border text-accent-primary focus:ring-accent-primary/50 bg-surface-sunken cursor-pointer"}),e.jsx("span",{className:"text-[10px] text-text-secondary group-hover:text-text-primary transition-colors",children:"Force discovery"}),e.jsx("span",{className:"text-[10px] text-text-tertiary",children:l?"— skip compiled pipelines":"— prefer compiled pipelines"})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("span",{className:"text-[10px] text-text-tertiary",children:"Cmd+Enter"}),e.jsx("button",{type:"submit",disabled:!r.trim()||o.isPending,className:"px-4 py-1.5 bg-accent text-white text-xs font-medium rounded-md hover:bg-accent/90 disabled:opacity-50 disabled:cursor-not-allowed transition-colors",children:o.isPending?"Starting...":"Design Pipeline"})]})]})]}),o.isError&&e.jsx("p",{className:"mt-2 text-sm text-status-error",children:o.error.message})]}),e.jsxs("div",{className:"flex items-center justify-between mb-3",children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Recent Runs"}),e.jsx(P,{children:e.jsx(C,{label:"Status",value:c.status,onChange:s=>w("status",s),options:[{value:"completed",label:"Completed"},{value:"running",label:"Running"},{value:"failed",label:"Failed"}]})})]}),e.jsx(S,{columns:A,data:x,keyFn:s=>s.workflow_id,onRowClick:s=>t(`/mcp/queries/${s.workflow_id}`),isLoading:m,emptyMessage:"",sort:N,onSort:k}),!m&&x.length===0&&e.jsx(M,{title:"No pipeline runs yet",description:"Describe a task above to start designing"}),e.jsx(D,{page:a.page,pageSize:a.pageSize,total:u,totalPages:a.totalPages(u),onPageChange:a.setPage})]})}export{oe as McpQueryPage};
2
- //# sourceMappingURL=McpQueryPage-DRRhw4nN.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"McpQueryPage-DRRhw4nN.js","sources":["../../src/pages/mcp/McpQueryPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { ArrowRight, Wand2, Zap, Layers, Circle } from 'lucide-react';\n\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { DataTable, type Column } from '../../components/common/data/DataTable';\nimport { FilterBar, FilterSelect } from '../../components/common/data/FilterBar';\nimport { StickyPagination } from '../../components/common/data/StickyPagination';\nimport { TimestampCell } from '../../components/common/display/TimestampCell';\nimport { WorkflowPill } from '../../components/common/display/WorkflowPill';\nimport { EmptyState } from '../../components/common/display/EmptyState';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { useWorkflowListEvents } from '../../hooks/useNatsEvents';\nimport { useMcpQueryJobs, useSubmitMcpQuery, useSubmitMcpQueryRouted } from '../../api/mcp-query';\nimport type { LTJob } from '../../api/types';\n\nfunction mapStatus(job: LTJob): string {\n if (job.status === 'completed') return 'completed';\n if (Number(job.status) === 0) return 'completed';\n if (job.is_live) return 'in_progress';\n return 'failed';\n}\n\n\nconst columns: Column<LTJob>[] = [\n {\n key: 'entity',\n label: 'Workflow Type',\n className: 'whitespace-nowrap',\n render: (row) => {\n const s = mapStatus(row);\n const dotColor = s === 'completed' ? 'fill-status-success text-status-success'\n : s === 'in_progress' ? 'fill-status-active text-status-active animate-pulse'\n : 'fill-status-error text-status-error';\n return (\n <span className=\"inline-flex items-center gap-2\">\n <Circle className={`w-2.5 h-2.5 shrink-0 ${dotColor}`} />\n <WorkflowPill type={(row as any).entity || 'unknown'} />\n </span>\n );\n },\n },\n {\n key: 'workflow_id',\n label: 'Workflow ID',\n render: (row) => (\n <span className=\"text-xs font-mono text-text-primary truncate block\">\n {row.workflow_id}\n </span>\n ),\n },\n {\n key: 'created_at',\n label: 'Created',\n className: 'w-36',\n sortable: true,\n render: (row) => <TimestampCell date={row.created_at} />,\n },\n {\n key: 'updated_at',\n label: 'Updated',\n className: 'w-36',\n render: (row) => <TimestampCell date={row.updated_at} />,\n },\n {\n key: 'actions',\n label: '',\n className: 'w-10',\n render: () => (\n <span className=\"opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-accent\">\n <ArrowRight className=\"w-4 h-4\" strokeWidth={1.5} />\n </span>\n ),\n },\n];\n\nexport function McpQueryPage() {\n const navigate = useNavigate();\n const [promptText, setPromptText] = useState('');\n const [direct, setDirect] = useState(true);\n const submitDirect = useSubmitMcpQuery();\n const submitRouted = useSubmitMcpQueryRouted();\n const activeMutation = direct ? submitDirect : submitRouted;\n\n const { filters, setFilter, pagination, sort, setSort } = useFilterParams({\n filters: { search: '', status: '' },\n pageSize: 20,\n });\n\n const { data, isLoading } = useMcpQueryJobs({\n limit: pagination.pageSize,\n offset: pagination.offset,\n search: filters.search,\n status: filters.status,\n });\n\n useWorkflowListEvents();\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n const prompt = promptText.trim();\n if (!prompt) return;\n\n const result = await activeMutation.mutateAsync({ prompt });\n setPromptText('');\n if (direct) {\n navigate(`/mcp/queries/${result.workflow_id}?prompt=${encodeURIComponent(prompt)}`);\n } else {\n navigate(`/workflows/executions/${result.workflow_id}`);\n }\n };\n\n const jobs = data?.jobs ?? [];\n const total = data?.total ?? 0;\n\n return (\n <>\n <PageHeader title=\"Pipeline Designer\" />\n\n <p className=\"text-sm text-text-secondary mb-6 max-w-2xl leading-relaxed\">\n Describe a task and MCP discovers the right tools, executes the workflow, and compiles the result into a reusable pipeline.\n </p>\n\n {/* Design lifecycle steps */}\n <div className=\"grid grid-cols-3 gap-4 mb-8\">\n <div className=\"flex items-start gap-3 p-3 rounded-lg border border-surface-border bg-surface-raised/50\">\n <Wand2 className=\"w-4 h-4 mt-0.5 text-accent shrink-0\" />\n <div>\n <p className=\"text-xs font-medium text-text-primary\">1. Describe</p>\n <p className=\"text-[10px] text-text-tertiary mt-0.5 leading-relaxed\">Write a specific prompt. Mention tools, URLs, credentials, and expected outputs.</p>\n </div>\n </div>\n <div className=\"flex items-start gap-3 p-3 rounded-lg border border-surface-border bg-surface-raised/50\">\n <Zap className=\"w-4 h-4 mt-0.5 text-status-warning shrink-0\" />\n <div>\n <p className=\"text-xs font-medium text-text-primary\">2. Discover</p>\n <p className=\"text-[10px] text-text-tertiary mt-0.5 leading-relaxed\">MCP selects servers, calls tools, and chains results. You review the execution.</p>\n </div>\n </div>\n <div className=\"flex items-start gap-3 p-3 rounded-lg border border-surface-border bg-surface-raised/50\">\n <Layers className=\"w-4 h-4 mt-0.5 text-status-success shrink-0\" />\n <div>\n <p className=\"text-xs font-medium text-text-primary\">3. Compile</p>\n <p className=\"text-[10px] text-text-tertiary mt-0.5 leading-relaxed\">Successful runs compile into deterministic pipelines. No LLM needed at runtime.</p>\n </div>\n </div>\n </div>\n\n {/* Prompt input */}\n <form onSubmit={handleSubmit} className=\"mb-8\">\n <div className=\"rounded-lg border border-surface-border bg-surface-raised overflow-hidden\">\n <textarea\n value={promptText}\n onChange={(e) => setPromptText(e.target.value)}\n placeholder=\"Describe what you want to accomplish. Be specific about which tools to use, what data to capture, and how results should be structured...\"\n className=\"w-full min-h-[100px] max-h-[200px] px-4 py-3 bg-transparent text-sm text-text-primary placeholder:text-text-tertiary resize-y focus:outline-none border-none\"\n onKeyDown={(e) => {\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n handleSubmit(e);\n }\n }}\n />\n <div className=\"flex items-center justify-between px-4 py-2 border-t border-surface-border bg-surface-sunken/30\">\n <label className=\"flex items-center gap-2 cursor-pointer select-none group\">\n <input\n type=\"checkbox\"\n checked={direct}\n onChange={(e) => setDirect(e.target.checked)}\n className=\"w-3.5 h-3.5 rounded border-border text-accent-primary focus:ring-accent-primary/50 bg-surface-sunken cursor-pointer\"\n />\n <span className=\"text-[10px] text-text-secondary group-hover:text-text-primary transition-colors\">\n Force discovery\n </span>\n <span className=\"text-[10px] text-text-tertiary\">\n {direct ? '— skip compiled pipelines' : '— prefer compiled pipelines'}\n </span>\n </label>\n <div className=\"flex items-center gap-3\">\n <span className=\"text-[10px] text-text-tertiary\">Cmd+Enter</span>\n <button\n type=\"submit\"\n disabled={!promptText.trim() || activeMutation.isPending}\n className=\"px-4 py-1.5 bg-accent text-white text-xs font-medium rounded-md hover:bg-accent/90 disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n >\n {activeMutation.isPending ? 'Starting...' : 'Design Pipeline'}\n </button>\n </div>\n </div>\n </div>\n {activeMutation.isError && (\n <p className=\"mt-2 text-sm text-status-error\">{activeMutation.error.message}</p>\n )}\n </form>\n\n {/* Recent runs */}\n <div className=\"flex items-center justify-between mb-3\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">Recent Runs</p>\n <FilterBar>\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={[\n { value: 'completed', label: 'Completed' },\n { value: 'running', label: 'Running' },\n { value: 'failed', label: 'Failed' },\n ]}\n />\n </FilterBar>\n </div>\n\n <DataTable\n columns={columns}\n data={jobs}\n keyFn={(row) => row.workflow_id}\n onRowClick={(row) => navigate(`/mcp/queries/${row.workflow_id}`)}\n isLoading={isLoading}\n emptyMessage=\"\"\n sort={sort}\n onSort={setSort}\n />\n\n {!isLoading && jobs.length === 0 && (\n <EmptyState title=\"No pipeline runs yet\" description=\"Describe a task above to start designing\" />\n )}\n\n <StickyPagination\n page={pagination.page}\n pageSize={pagination.pageSize}\n total={total}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n />\n </>\n );\n}\n"],"names":["mapStatus","job","columns","row","s","dotColor","jsxs","jsx","Circle","WorkflowPill","TimestampCell","ArrowRight","McpQueryPage","navigate","useNavigate","promptText","setPromptText","useState","direct","setDirect","submitDirect","useSubmitMcpQuery","submitRouted","useSubmitMcpQueryRouted","activeMutation","filters","setFilter","pagination","sort","setSort","useFilterParams","data","isLoading","useMcpQueryJobs","useWorkflowListEvents","handleSubmit","e","prompt","result","jobs","total","Fragment","PageHeader","Wand2","Zap","Layers","FilterBar","FilterSelect","v","DataTable","EmptyState","StickyPagination"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{b as R,a as D,j as e}from"./vendor-query-B2UbickB.js";import{b as K}from"./mcp-runs-ChPbpvXK.js";import{b as U}from"./yaml-workflows-BL4V5CQy.js";import{u as B}from"./settings-eBRSE0mQ.js";import{S as J}from"./StatusBadge-TlC4jiig.js";import{u as L,J as T,N as $}from"./index-D8VH6K8B.js";import{P as _}from"./PageHeader-CpWFly5S.js";import{C as q}from"./CopyableId-CBdxWfp8.js";import{C as j}from"./CollapsibleSection-Cxk4wvjT.js";import{u as H,E as M}from"./EventTable-B01oJf6Y.js";import{f as Q}from"./format-gXZXQ-HJ.js";import{S as W}from"./SwimlaneTimeline-7SiwATsZ.js";import{d as A,e as F,L as V}from"./vendor-react-Cw8Gy8NJ.js";import"./vendor-icons-ZTAKVwGc.js";import"./FilterBar-Ck4K4rzu.js";const X={running:"in_progress",completed:"completed",failed:"failed"};function S(s){return s?s.replace("T"," ").replace("Z","").slice(0,23):"—"}function de(){var y,N,w;const{jobId:s}=A(),[c]=F(),l=c.get("namespace")||"longtail",h=R(),{data:t,isLoading:C,error:r}=K(s,l),{data:d}=B(),{isCollapsed:x,toggle:m}=H("mcp-run-detail"),E=(t==null?void 0:t.workflow_name)||(t==null?void 0:t.workflow_type),{data:p}=U(E,l),b=(y=p==null?void 0:p.workflows)==null?void 0:y[0],v=((N=d==null?void 0:d.telemetry)==null?void 0:N.traceUrl)??null,P=D.useCallback(o=>{!s||o.workflowId!==s||h.invalidateQueries({queryKey:["mcpRunExecution",s]})},[s,h]);if(L(`${$}.activity.>`,P),C)return e.jsxs("div",{className:"animate-pulse space-y-4",children:[e.jsx("div",{className:"h-8 bg-surface-sunken rounded w-64"}),e.jsx("div",{className:"h-60 bg-surface-sunken rounded"})]});if(r||!t)return e.jsxs("div",{children:[e.jsx(_,{title:"Pipeline Execution"}),e.jsxs("div",{className:"mt-4 text-center py-8",children:[e.jsx("p",{className:"text-sm text-text-primary mb-1",children:(w=r==null?void 0:r.message)!=null&&w.includes("expired")?"Execution data is no longer available":"Unable to load execution"}),e.jsx("p",{className:"text-xs text-text-tertiary",children:(r==null?void 0:r.message)??"The run could not be resolved."})]})]});const{events:u,summary:a}=t,f=u.find(o=>{var k;return o.category==="activity"&&((k=o.attributes.kind)==null?void 0:k.includes("completed"))}),I=(f==null?void 0:f.attributes.result)??null,n=t.result,g=(n==null?void 0:n.data)??n??null;return e.jsxs("div",{children:[e.jsx(_,{title:"Pipeline Execution"}),e.jsxs("div",{className:"bg-surface-raised border border-surface-border rounded-md p-5 mb-8",children:[e.jsxs("div",{className:"flex items-center gap-4 mb-4",children:[e.jsx("h2",{className:"text-sm font-mono text-text-primary truncate flex-1",children:t.workflow_id}),e.jsx(J,{status:X[t.status]??t.status})]}),e.jsxs("div",{className:"grid grid-cols-5 gap-x-6",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5",children:"Tool Server"}),e.jsx("p",{className:"text-xs font-mono text-text-primary truncate",children:l})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5",children:"Pipeline Tool"}),b?e.jsx(V,{to:`/mcp/workflows/${b.id}`,className:"text-xs font-mono text-accent hover:underline truncate block",children:t.workflow_type}):e.jsx("p",{className:"text-xs font-mono text-text-primary truncate",children:t.workflow_type||"—"})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5",children:"Duration"}),e.jsx("p",{className:"text-xs font-mono text-text-primary",children:Q(t.duration_ms)})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5",children:"Started"}),e.jsx("p",{className:"text-xs font-mono text-text-primary",children:S(t.start_time)})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5",children:"Completed"}),e.jsx("p",{className:"text-xs font-mono text-text-primary",children:S(t.close_time)})]})]}),e.jsxs("div",{className:"flex items-center mt-4 pt-3 border-t border-surface-border",children:[e.jsx("div",{className:"flex-1",children:t.trace_id?e.jsx(q,{label:"Trace",value:t.trace_id,href:v?v.replace("{traceId}",t.trace_id):void 0,external:!0}):e.jsx("span",{className:"text-[10px] text-text-tertiary",children:"No trace"})}),e.jsxs("div",{className:"flex items-center gap-5",children:[e.jsx(i,{label:"Tools",value:a.activities.user}),e.jsx(i,{label:"System",value:a.activities.system,muted:!0}),a.child_workflows.total>0&&e.jsx(i,{label:"Children",value:a.child_workflows.total}),a.timers>0&&e.jsx(i,{label:"Timers",value:a.timers}),a.signals>0&&e.jsx(i,{label:"Signals",value:a.signals}),e.jsx(i,{label:"Total",value:a.total_events,muted:!0})]})]})]}),e.jsxs("div",{className:"space-y-6",children:[e.jsx(j,{title:"Details",sectionKey:"details",isCollapsed:x("details"),onToggle:m,children:e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4 mb-6",children:[e.jsx("div",{children:e.jsx(T,{data:I??{},label:"Input"})}),g!==null&&e.jsx("div",{children:e.jsx(T,{data:g,label:"Result"})})]})}),e.jsx(j,{title:"Execution Timeline",sectionKey:"timeline",isCollapsed:x("timeline"),onToggle:m,children:e.jsx(W,{events:u,outline:!0})}),e.jsx(j,{title:"Events",sectionKey:"events",isCollapsed:x("events"),onToggle:m,children:e.jsx(M,{events:u})})]})]})}function i({label:s,value:c,muted:l}){return e.jsxs("div",{className:"flex items-center gap-1.5 text-xs",children:[e.jsx("span",{className:"text-text-tertiary",children:s}),e.jsx("span",{className:`font-medium tabular-nums ${l?"text-text-tertiary":"text-text-primary"}`,children:c})]})}export{de as McpRunDetailPage};
2
- //# sourceMappingURL=McpRunDetailPage-CmPs5EvE.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"McpRunDetailPage-CmPs5EvE.js","sources":["../../src/pages/mcp/McpRunDetailPage.tsx"],"sourcesContent":["import { useParams, Link, useSearchParams } from 'react-router-dom';\nimport { useCallback } from 'react';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { useMcpRunExecution } from '../../api/mcp-runs';\nimport { useYamlWorkflowByTopic } from '../../api/yaml-workflows';\nimport { useSettings } from '../../api/settings';\nimport { StatusBadge } from '../../components/common/display/StatusBadge';\nimport { JsonViewer } from '../../components/common/data/JsonViewer';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { CopyableId } from '../../components/common/display/CopyableId';\nimport { CollapsibleSection } from '../../components/common/layout/CollapsibleSection';\nimport { useCollapsedSections } from '../../hooks/useCollapsedSections';\nimport { useEventSubscription } from '../../hooks/useEventContext';\nimport { NATS_SUBJECT_PREFIX } from '../../lib/nats/config';\nimport { formatDuration } from '../../lib/format';\n\nimport { SwimlaneTimeline } from '../workflows/workflow-execution/SwimlaneTimeline';\nimport { EventTable } from '../workflows/workflow-execution/EventTable';\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nconst statusMap: Record<string, string> = {\n running: 'in_progress',\n completed: 'completed',\n failed: 'failed',\n};\n\nfunction formatTimestamp(iso: string | null): string {\n if (!iso) return '—';\n return iso.replace('T', ' ').replace('Z', '').slice(0, 23);\n}\n\n// ── Main page ────────────────────────────────────────────────────────────────\n\nexport function McpRunDetailPage() {\n const { jobId } = useParams<{ jobId: string }>();\n const [searchParams] = useSearchParams();\n const namespace = searchParams.get('namespace') || 'longtail';\n const queryClient = useQueryClient();\n const { data: execution, isLoading, error } = useMcpRunExecution(jobId!, namespace);\n const { data: settings } = useSettings();\n const { isCollapsed, toggle } = useCollapsedSections('mcp-run-detail');\n const workflowTopic = execution?.workflow_name || execution?.workflow_type;\n const { data: yamlMatch } = useYamlWorkflowByTopic(workflowTopic, namespace);\n const sourceWorkflow = yamlMatch?.workflows?.[0];\n\n const traceUrl = settings?.telemetry?.traceUrl ?? null;\n\n // Subscribe to activity events for this job — refetch execution on each step\n const activityHandler = useCallback((event: any) => {\n if (!jobId || event.workflowId !== jobId) return;\n queryClient.invalidateQueries({ queryKey: ['mcpRunExecution', jobId] });\n }, [jobId, queryClient]);\n useEventSubscription(`${NATS_SUBJECT_PREFIX}.activity.>`, activityHandler);\n\n if (isLoading) {\n return (\n <div className=\"animate-pulse space-y-4\">\n <div className=\"h-8 bg-surface-sunken rounded w-64\" />\n <div className=\"h-60 bg-surface-sunken rounded\" />\n </div>\n );\n }\n\n if (error || !execution) {\n return (\n <div>\n <PageHeader title=\"Pipeline Execution\" />\n <div className=\"mt-4 text-center py-8\">\n <p className=\"text-sm text-text-primary mb-1\">\n {(error as Error)?.message?.includes('expired')\n ? 'Execution data is no longer available'\n : 'Unable to load execution'}\n </p>\n <p className=\"text-xs text-text-tertiary\">\n {(error as Error)?.message ?? 'The run could not be resolved.'}\n </p>\n </div>\n </div>\n );\n }\n\n const { events, summary } = execution;\n\n // The trigger activity's result is the effective input to the flow —\n // it accepts outside job input and provides it to descendant activities.\n const triggerCompleted = events.find(\n (e) => e.category === 'activity' && e.attributes.kind?.includes('completed'),\n );\n const triggerInput = triggerCompleted?.attributes.result ?? null;\n\n // Unwrap result — the `data` field is what users care about\n const rawResult = execution.result as Record<string, unknown> | null | undefined;\n const result = rawResult?.data ?? rawResult ?? null;\n\n return (\n <div>\n <PageHeader title=\"Pipeline Execution\" />\n\n {/* ── Header card ─────────────────────────────────── */}\n <div className=\"bg-surface-raised border border-surface-border rounded-md p-5 mb-8\">\n {/* Row 0: Job ID + status */}\n <div className=\"flex items-center gap-4 mb-4\">\n <h2 className=\"text-sm font-mono text-text-primary truncate flex-1\">{execution.workflow_id}</h2>\n <StatusBadge status={statusMap[execution.status] ?? execution.status} />\n </div>\n\n {/* Row 1: Namespace, Topic, Duration, Started, Completed */}\n <div className=\"grid grid-cols-5 gap-x-6\">\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5\">Tool Server</p>\n <p className=\"text-xs font-mono text-text-primary truncate\">{namespace}</p>\n </div>\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5\">Pipeline Tool</p>\n {sourceWorkflow ? (\n <Link to={`/mcp/workflows/${sourceWorkflow.id}`} className=\"text-xs font-mono text-accent hover:underline truncate block\">\n {execution.workflow_type}\n </Link>\n ) : (\n <p className=\"text-xs font-mono text-text-primary truncate\">{execution.workflow_type || '—'}</p>\n )}\n </div>\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5\">Duration</p>\n <p className=\"text-xs font-mono text-text-primary\">{formatDuration(execution.duration_ms)}</p>\n </div>\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5\">Started</p>\n <p className=\"text-xs font-mono text-text-primary\">{formatTimestamp(execution.start_time)}</p>\n </div>\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5\">Completed</p>\n <p className=\"text-xs font-mono text-text-primary\">{formatTimestamp(execution.close_time)}</p>\n </div>\n </div>\n\n {/* Row 2: Trace (left) + Stats (right) */}\n <div className=\"flex items-center mt-4 pt-3 border-t border-surface-border\">\n <div className=\"flex-1\">\n {execution.trace_id ? (\n <CopyableId\n label=\"Trace\"\n value={execution.trace_id}\n href={traceUrl ? traceUrl.replace('{traceId}', execution.trace_id) : undefined}\n external\n />\n ) : (\n <span className=\"text-[10px] text-text-tertiary\">No trace</span>\n )}\n </div>\n <div className=\"flex items-center gap-5\">\n <Stat label=\"Tools\" value={summary.activities.user} />\n <Stat label=\"System\" value={summary.activities.system} muted />\n {summary.child_workflows.total > 0 && (\n <Stat label=\"Children\" value={summary.child_workflows.total} />\n )}\n {summary.timers > 0 && <Stat label=\"Timers\" value={summary.timers} />}\n {summary.signals > 0 && <Stat label=\"Signals\" value={summary.signals} />}\n <Stat label=\"Total\" value={summary.total_events} muted />\n </div>\n </div>\n </div>\n\n {/* ── Sections ────────────────────────────────────── */}\n <div className=\"space-y-6\">\n {/* Details: Input + Result */}\n <CollapsibleSection title=\"Details\" sectionKey=\"details\" isCollapsed={isCollapsed('details')} onToggle={toggle}>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4 mb-6\">\n <div>\n <JsonViewer data={triggerInput ?? {}} label=\"Input\" />\n </div>\n {result !== null && (\n <div>\n <JsonViewer data={result} label=\"Result\" />\n </div>\n )}\n </div>\n </CollapsibleSection>\n\n {/* Execution Timeline (swimlane) */}\n <CollapsibleSection title=\"Execution Timeline\" sectionKey=\"timeline\" isCollapsed={isCollapsed('timeline')} onToggle={toggle}>\n <SwimlaneTimeline events={events} outline />\n </CollapsibleSection>\n\n {/* Events (table) */}\n <CollapsibleSection title=\"Events\" sectionKey=\"events\" isCollapsed={isCollapsed('events')} onToggle={toggle}>\n <EventTable events={events} />\n </CollapsibleSection>\n </div>\n </div>\n );\n}\n\n// ── Stat pill ────────────────────────────────────────────────────────────────\n\nfunction Stat({ label, value, muted }: { label: string; value: number; muted?: boolean }) {\n return (\n <div className=\"flex items-center gap-1.5 text-xs\">\n <span className=\"text-text-tertiary\">{label}</span>\n <span className={`font-medium tabular-nums ${muted ? 'text-text-tertiary' : 'text-text-primary'}`}>{value}</span>\n </div>\n );\n}\n"],"names":["statusMap","formatTimestamp","iso","McpRunDetailPage","jobId","useParams","searchParams","useSearchParams","namespace","queryClient","useQueryClient","execution","isLoading","error","useMcpRunExecution","settings","useSettings","isCollapsed","toggle","useCollapsedSections","workflowTopic","yamlMatch","useYamlWorkflowByTopic","sourceWorkflow","_a","traceUrl","_b","activityHandler","useCallback","event","useEventSubscription","NATS_SUBJECT_PREFIX","jsxs","jsx","PageHeader","_c","events","summary","triggerCompleted","e","triggerInput","rawResult","result","StatusBadge","Link","formatDuration","CopyableId","Stat","CollapsibleSection","JsonViewer","SwimlaneTimeline","EventTable","label","value","muted"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{a as p,j as t}from"./vendor-query-B2UbickB.js";import{a as T,u as C}from"./mcp-runs-ChPbpvXK.js";import{a as M}from"./yaml-workflows-BL4V5CQy.js";import{u as R}from"./namespaces-BgbaC3ow.js";import{u as F}from"./useFilterParams-BaXUAkYK.js";import{D as E}from"./DataTable-BDn1WBHS.js";import{S as z}from"./StatusBadge-TlC4jiig.js";import{P as I}from"./PageHeader-CpWFly5S.js";import{F as O,b as f}from"./FilterBar-Ck4K4rzu.js";import{S as U}from"./StickyPagination-F9FZsRy9.js";import{b as A}from"./vendor-react-Cw8Gy8NJ.js";import"./index-D8VH6K8B.js";import"./vendor-icons-ZTAKVwGc.js";import"./EmptyState-2CmV-IaS.js";const B={running:"in_progress",completed:"completed",failed:"failed"},$=[{key:"status",label:"Status",render:a=>t.jsx(z,{status:B[a.status]??a.status}),className:"w-32"},{key:"entity",label:"Tool",render:a=>t.jsx("span",{className:"font-mono text-xs text-text-secondary",children:a.entity||"—"})},{key:"workflow_id",label:"Run ID",render:a=>t.jsx("span",{className:"font-mono text-xs text-text-secondary truncate max-w-[280px] block",children:a.workflow_id})},{key:"created_at",label:"Started",render:a=>t.jsx("span",{className:"text-xs text-text-secondary font-mono",children:new Date(a.created_at).toISOString().replace("T"," ").slice(0,23)}),className:"w-52"},{key:"updated_at",label:"Updated",render:a=>t.jsx("span",{className:"text-xs text-text-secondary font-mono",children:new Date(a.updated_at).toISOString().replace("T"," ").slice(0,23)}),className:"w-52"}];function te(){const a=A(),{filters:s,setFilter:u,setFilters:b,pagination:r}=F({filters:{search:"",entity:"",status:"",namespace:""}}),[d,j]=p.useState(s.search);p.useEffect(()=>{if(d===s.search)return;const e=setTimeout(()=>u("search",d),300);return()=>clearTimeout(e)},[d,u,s.search]);const{data:l}=M(),{data:c}=R(),x=p.useMemo(()=>{const e=new Set((l==null?void 0:l.app_ids)??[]);for(const n of(c==null?void 0:c.namespaces)??[])e.add(n.name);return[...e].sort()},[l==null?void 0:l.app_ids,c==null?void 0:c.namespaces]),v=x.includes("longtail")?"longtail":x[0]??"",i=s.namespace||v,{data:m}=T(i),{data:o,isLoading:N}=C({app_id:i,limit:r.pageSize,offset:r.offset,entity:s.entity||void 0,search:s.search||void 0,status:s.status||void 0}),g=(o==null?void 0:o.total)??0,k=p.useMemo(()=>{const e=(o==null?void 0:o.jobs)??[],n={running:0,failed:1,completed:2};return[...e].sort((y,S)=>{const h=n[y.status]??9,w=n[S.status]??9;return h!==w?h-w:new Date(S.created_at).getTime()-new Date(y.created_at).getTime()})},[o==null?void 0:o.jobs]),_=p.useMemo(()=>{const e=new Set(x);return i&&e.add(i),[...e].sort().map(n=>({value:n,label:n}))},[x,i]),P=p.useMemo(()=>{const e=new Set((m==null?void 0:m.entities)??[]);return s.entity&&!e.has(s.entity)&&e.add(s.entity),[...e].sort().map(n=>({value:n,label:n}))},[m==null?void 0:m.entities,s.entity]);return t.jsxs("div",{children:[t.jsx(I,{title:"Pipeline Executions"}),t.jsxs(O,{children:[t.jsx(f,{label:"Namespace",value:i,onChange:e=>{b({namespace:e,entity:""})},options:_,required:!0}),t.jsx("input",{type:"text",placeholder:"Search run ID...",value:d,onChange:e=>j(e.target.value),className:"input text-[11px] py-1 px-2 w-56"}),t.jsx(f,{label:"Tool",value:s.entity,onChange:e=>u("entity",e),options:P}),t.jsx(f,{label:"Status",value:s.status,onChange:e=>u("status",e),options:[{value:"running",label:"Running"},{value:"completed",label:"Completed"},{value:"failed",label:"Failed"}]})]}),t.jsx(E,{columns:$,data:k,keyFn:e=>e.workflow_id,onRowClick:e=>a(`/mcp/executions/${encodeURIComponent(e.workflow_id)}?namespace=${i}`),isLoading:N,emptyMessage:"No runs found"}),t.jsx(U,{page:r.page,totalPages:r.totalPages(g),onPageChange:r.setPage,total:g,pageSize:r.pageSize,onPageSizeChange:r.setPageSize})]})}export{te as McpRunsPage};
2
- //# sourceMappingURL=McpRunsPage-Dl5Y2u6k.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"McpRunsPage-Dl5Y2u6k.js","sources":["../../src/pages/mcp/McpRunsPage.tsx"],"sourcesContent":["import { useState, useEffect, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { useMcpRuns, useMcpEntities } from '../../api/mcp-runs';\nimport { useYamlWorkflowAppIds } from '../../api/yaml-workflows';\nimport { useNamespaces } from '../../api/namespaces';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { DataTable, type Column } from '../../components/common/data/DataTable';\nimport { StatusBadge } from '../../components/common/display/StatusBadge';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { FilterBar, FilterSelect } from '../../components/common/data/FilterBar';\nimport { StickyPagination } from '../../components/common/data/StickyPagination';\nimport type { LTJob } from '../../api/types';\n\nconst statusMap: Record<string, string> = {\n running: 'in_progress',\n completed: 'completed',\n failed: 'failed',\n};\n\nconst columns: Column<LTJob>[] = [\n {\n key: 'status',\n label: 'Status',\n render: (row) => <StatusBadge status={statusMap[row.status] ?? row.status} />,\n className: 'w-32',\n },\n {\n key: 'entity',\n label: 'Tool',\n render: (row) => (\n <span className=\"font-mono text-xs text-text-secondary\">{row.entity || '—'}</span>\n ),\n },\n {\n key: 'workflow_id',\n label: 'Run ID',\n render: (row) => (\n <span className=\"font-mono text-xs text-text-secondary truncate max-w-[280px] block\">\n {row.workflow_id}\n </span>\n ),\n },\n {\n key: 'created_at',\n label: 'Started',\n render: (row) => (\n <span className=\"text-xs text-text-secondary font-mono\">\n {new Date(row.created_at).toISOString().replace('T', ' ').slice(0, 23)}\n </span>\n ),\n className: 'w-52',\n },\n {\n key: 'updated_at',\n label: 'Updated',\n render: (row) => (\n <span className=\"text-xs text-text-secondary font-mono\">\n {new Date(row.updated_at).toISOString().replace('T', ' ').slice(0, 23)}\n </span>\n ),\n className: 'w-52',\n },\n];\n\nexport function McpRunsPage() {\n const navigate = useNavigate();\n const { filters, setFilter, setFilters, pagination } = useFilterParams({\n filters: { search: '', entity: '', status: '', namespace: '' },\n });\n\n const [searchInput, setSearchInput] = useState(filters.search);\n\n useEffect(() => {\n if (searchInput === filters.search) return;\n const timer = setTimeout(() => setFilter('search', searchInput), 300);\n return () => clearTimeout(timer);\n }, [searchInput, setFilter, filters.search]);\n\n const { data: appIdData } = useYamlWorkflowAppIds();\n const { data: nsData } = useNamespaces();\n\n // Build the full namespace list: YAML app_ids + registered namespaces\n const allNamespaceNames = useMemo(() => {\n const set = new Set(appIdData?.app_ids ?? []);\n for (const ns of nsData?.namespaces ?? []) {\n set.add(ns.name);\n }\n return [...set].sort();\n }, [appIdData?.app_ids, nsData?.namespaces]);\n\n // Default: URL param > 'longtail' (if exists) > first in list\n const defaultNamespace = allNamespaceNames.includes('longtail')\n ? 'longtail'\n : allNamespaceNames[0] ?? '';\n const activeNamespace = filters.namespace || defaultNamespace;\n const { data: entitiesData } = useMcpEntities(activeNamespace);\n\n const { data: runsData, isLoading } = useMcpRuns({\n app_id: activeNamespace,\n limit: pagination.pageSize,\n offset: pagination.offset,\n entity: filters.entity || undefined,\n search: filters.search || undefined,\n status: filters.status || undefined,\n });\n\n const total = runsData?.total ?? 0;\n\n const jobs = useMemo(() => {\n const raw = runsData?.jobs ?? [];\n const STATUS_ORDER: Record<string, number> = { running: 0, failed: 1, completed: 2 };\n return [...raw].sort((a, b) => {\n const sa = STATUS_ORDER[a.status] ?? 9;\n const sb = STATUS_ORDER[b.status] ?? 9;\n if (sa !== sb) return sa - sb;\n return new Date(b.created_at).getTime() - new Date(a.created_at).getTime();\n });\n }, [runsData?.jobs]);\n\n const namespaces = useMemo(() => {\n const set = new Set(allNamespaceNames);\n // Always include the active namespace so deep-linked values appear\n if (activeNamespace) set.add(activeNamespace);\n return [...set].sort().map((id) => ({ value: id, label: id }));\n }, [allNamespaceNames, activeNamespace]);\n\n const entities = useMemo(() => {\n const known = new Set(entitiesData?.entities ?? []);\n if (filters.entity && !known.has(filters.entity)) known.add(filters.entity);\n return [...known].sort().map((e) => ({ value: e, label: e }));\n }, [entitiesData?.entities, filters.entity]);\n\n return (\n <div>\n <PageHeader title=\"Pipeline Executions\" />\n\n <FilterBar>\n <FilterSelect\n label=\"Namespace\"\n value={activeNamespace}\n onChange={(v) => {\n setFilters({ namespace: v, entity: '' });\n }}\n options={namespaces}\n required\n />\n <input\n type=\"text\"\n placeholder=\"Search run ID...\"\n value={searchInput}\n onChange={(e) => setSearchInput(e.target.value)}\n className=\"input text-[11px] py-1 px-2 w-56\"\n />\n <FilterSelect\n label=\"Tool\"\n value={filters.entity}\n onChange={(v) => setFilter('entity', v)}\n options={entities}\n />\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={[\n { value: 'running', label: 'Running' },\n { value: 'completed', label: 'Completed' },\n { value: 'failed', label: 'Failed' },\n ]}\n />\n </FilterBar>\n\n <DataTable\n columns={columns}\n data={jobs}\n keyFn={(row) => row.workflow_id}\n onRowClick={(row) => navigate(`/mcp/executions/${encodeURIComponent(row.workflow_id)}?namespace=${activeNamespace}`)}\n isLoading={isLoading}\n emptyMessage=\"No runs found\"\n />\n\n <StickyPagination\n page={pagination.page}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n total={total}\n pageSize={pagination.pageSize}\n onPageSizeChange={pagination.setPageSize}\n />\n </div>\n );\n}\n"],"names":["statusMap","columns","row","jsx","StatusBadge","McpRunsPage","navigate","useNavigate","filters","setFilter","setFilters","pagination","useFilterParams","searchInput","setSearchInput","useState","useEffect","timer","appIdData","useYamlWorkflowAppIds","nsData","useNamespaces","allNamespaceNames","useMemo","set","ns","defaultNamespace","activeNamespace","entitiesData","useMcpEntities","runsData","isLoading","useMcpRuns","total","jobs","raw","STATUS_ORDER","a","b","sa","sb","namespaces","id","entities","known","e","PageHeader","FilterBar","FilterSelect","v","DataTable","StickyPagination"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{a as x,j as e}from"./vendor-query-B2UbickB.js";import{f as c}from"./vendor-react-Cw8Gy8NJ.js";function o({open:r,onClose:t,title:a,children:i,maxWidth:n}){return x.useEffect(()=>{if(!r)return;const s=d=>{d.key==="Escape"&&t()};return document.addEventListener("keydown",s),()=>document.removeEventListener("keydown",s)},[r,t]),r?c.createPortal(e.jsxs("div",{className:"fixed inset-0 z-50 flex items-center justify-center",children:[e.jsx("div",{className:"absolute inset-0 bg-text-primary/30",onClick:t}),e.jsxs("div",{className:`relative bg-surface-raised border border-surface-border rounded-lg shadow-xl w-full ${n??"max-w-md"} mx-4 max-h-[85vh] flex flex-col`,children:[e.jsxs("div",{className:"flex items-center justify-between px-6 py-4 border-b shrink-0",children:[e.jsx("h2",{className:"text-sm font-medium text-text-primary",children:a}),e.jsx("button",{onClick:t,className:"text-text-tertiary hover:text-text-primary text-lg leading-none",children:"×"})]}),e.jsx("div",{className:"px-6 py-5 overflow-y-auto",children:i})]})]}),document.body):null}export{o as M};
2
- //# sourceMappingURL=Modal-B4rbIVAn.js.map
@@ -1,2 +0,0 @@
1
- import{j as t}from"./vendor-query-B2UbickB.js";import{f as b,n as v,l as S,m as P}from"./index-D8VH6K8B.js";import{d as h}from"./useNatsEvents-Xr43X1fG.js";import{u as j}from"./roles-ZNrqqnQl.js";import{u as C}from"./useFilterParams-BaXUAkYK.js";import{D as _}from"./DataTable-BDn1WBHS.js";import{P as R}from"./PageHeader-CpWFly5S.js";import{S as w}from"./StickyPagination-F9FZsRy9.js";import{R as L,a as N}from"./RowActions-Dg-Fsm5O.js";import{a as k,T as F,E as T}from"./escalation-columns-D6aqStaY.js";import{n as z}from"./vendor-icons-ZTAKVwGc.js";import{b as A}from"./vendor-react-Cw8Gy8NJ.js";import"./EmptyState-2CmV-IaS.js";import"./FilterBar-Ck4K4rzu.js";import"./PriorityBadge-DfQY9St9.js";import"./RolePill-BTPa8L-P.js";import"./WorkflowPill-CCDSVaQj.js";import"./TimestampCell-DoWMKg6w.js";import"./TimeAgo-UPG6DoH8.js";import"./format-gXZXQ-HJ.js";import"./escalation-qalymbKB.js";function oe(){h();const c=A(),{user:n}=b(),{filters:a,setFilter:d,pagination:s,sort:r,setSort:g}=C({filters:{role:"",type:"",priority:""}}),u=v(),{data:l}=j(),{data:m}=S(),{data:o,isLoading:f,error:i}=P({assigned_to:n==null?void 0:n.userId,status:"pending",role:a.role||void 0,type:a.type||void 0,priority:a.priority?parseInt(a.priority):void 0,limit:s.pageSize,offset:s.offset,sort_by:r.sort_by||void 0,order:r.sort_by?r.order:void 0}),x=((o==null?void 0:o.escalations)??[]).filter(e=>e.assigned_until&&new Date(e.assigned_until)>new Date),p=(o==null?void 0:o.total)??0,y={key:"actions",label:"",render:e=>t.jsx(L,{children:t.jsx(N,{icon:z,title:"Release escalation",onClick:()=>u.mutate(e.id),colorClass:"text-text-tertiary hover:text-status-warning"})}),className:"w-16 text-right"},E=[F,...T,y];return t.jsxs("div",{children:[t.jsx(R,{title:"My Escalations"}),t.jsx(k,{filters:a,setFilter:d,roles:(l==null?void 0:l.roles)??[],types:(m==null?void 0:m.types)??[]}),i&&t.jsx("div",{className:"mb-4 px-4 py-3 rounded-md bg-status-error/10 border border-status-error/20 text-xs text-status-error",children:i.message==="Session expired"?"Your session has expired. Please log in again.":`Failed to load escalations: ${i.message}`}),t.jsx(_,{columns:E,data:x,keyFn:e=>e.id,onRowClick:e=>c(`/escalations/detail/${e.id}`,{state:{from:"/escalations/queue"}}),isLoading:f,emptyMessage:i?"Unable to load data":"No assigned escalations",sort:r,onSort:g}),t.jsx(w,{page:s.page,totalPages:s.totalPages(p),onPageChange:s.setPage,total:p,pageSize:s.pageSize,onPageSizeChange:s.setPageSize})]})}export{oe as OperatorDashboard};
2
- //# sourceMappingURL=OperatorDashboard-B56il28q.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"OperatorDashboard-B56il28q.js","sources":["../../src/pages/operator/OperatorDashboard.tsx"],"sourcesContent":["import { useNavigate } from 'react-router-dom';\nimport { LockOpen } from 'lucide-react';\nimport { useAuth } from '../../hooks/useAuth';\nimport { useEscalations, useEscalationTypes, useReleaseEscalation } from '../../api/escalations';\nimport { useEscalationListEvents } from '../../hooks/useNatsEvents';\nimport { useRoles } from '../../api/roles';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { DataTable, type Column } from '../../components/common/data/DataTable';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { StickyPagination } from '../../components/common/data/StickyPagination';\nimport { RowAction, RowActionGroup } from '../../components/common/layout/RowActions';\nimport { ESCALATION_COLUMNS, TIME_LEFT_COLUMN, EscalationFilterBar } from './escalation-columns';\nimport type { LTEscalationRecord } from '../../api/types';\n\nexport function OperatorDashboard() {\n useEscalationListEvents();\n const navigate = useNavigate();\n const { user } = useAuth();\n const { filters, setFilter, pagination, sort, setSort } = useFilterParams({\n filters: { role: '', type: '', priority: '' },\n });\n const release = useReleaseEscalation();\n const { data: rolesData } = useRoles();\n const { data: typesData } = useEscalationTypes();\n\n const { data, isLoading, error: queryError } = useEscalations({\n assigned_to: user?.userId,\n status: 'pending',\n role: filters.role || undefined,\n type: filters.type || undefined,\n priority: filters.priority ? parseInt(filters.priority) : undefined,\n limit: pagination.pageSize,\n offset: pagination.offset,\n sort_by: sort.sort_by || undefined,\n order: sort.sort_by ? sort.order : undefined,\n });\n\n // Exclude expired claims — they're back in the available pool\n const activeClaims = (data?.escalations ?? []).filter(\n (e) => e.assigned_until && new Date(e.assigned_until) > new Date(),\n );\n const total = data?.total ?? 0;\n\n const releaseColumn: Column<LTEscalationRecord> = {\n key: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n <RowAction\n icon={LockOpen}\n title=\"Release escalation\"\n onClick={() => release.mutate(row.id)}\n colorClass=\"text-text-tertiary hover:text-status-warning\"\n />\n </RowActionGroup>\n ),\n className: 'w-16 text-right',\n };\n\n // Time-left first (aligns with checkbox on All Escalations), then summary + base columns + actions\n const columns: Column<LTEscalationRecord>[] = [\n TIME_LEFT_COLUMN,\n ...ESCALATION_COLUMNS,\n releaseColumn,\n ];\n\n return (\n <div>\n <PageHeader title=\"My Escalations\" />\n\n <EscalationFilterBar\n filters={filters}\n setFilter={setFilter}\n roles={rolesData?.roles ?? []}\n types={typesData?.types ?? []}\n />\n\n {queryError && (\n <div className=\"mb-4 px-4 py-3 rounded-md bg-status-error/10 border border-status-error/20 text-xs text-status-error\">\n {(queryError as Error).message === 'Session expired'\n ? 'Your session has expired. Please log in again.'\n : `Failed to load escalations: ${(queryError as Error).message}`}\n </div>\n )}\n\n <DataTable\n columns={columns}\n data={activeClaims}\n keyFn={(row) => row.id}\n onRowClick={(row) => navigate(`/escalations/detail/${row.id}`, { state: { from: '/escalations/queue' } })}\n isLoading={isLoading}\n emptyMessage={queryError ? 'Unable to load data' : 'No assigned escalations'}\n sort={sort}\n onSort={setSort}\n />\n\n <StickyPagination\n page={pagination.page}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n total={total}\n pageSize={pagination.pageSize}\n onPageSizeChange={pagination.setPageSize}\n />\n </div>\n );\n}\n"],"names":["OperatorDashboard","useEscalationListEvents","navigate","useNavigate","user","useAuth","filters","setFilter","pagination","sort","setSort","useFilterParams","release","useReleaseEscalation","rolesData","useRoles","typesData","useEscalationTypes","data","isLoading","queryError","useEscalations","activeClaims","total","releaseColumn","row","jsx","RowActionGroup","RowAction","LockOpen","columns","TIME_LEFT_COLUMN","ESCALATION_COLUMNS","PageHeader","EscalationFilterBar","DataTable","StickyPagination"],"mappings":"83BAcO,SAASA,IAAoB,CAClCC,EAAA,EACA,MAAMC,EAAWC,EAAA,EACX,CAAE,KAAAC,CAAA,EAASC,EAAA,EACX,CAAE,QAAAC,EAAS,UAAAC,EAAW,WAAAC,EAAY,KAAAC,EAAM,QAAAC,CAAA,EAAYC,EAAgB,CACxE,QAAS,CAAE,KAAM,GAAI,KAAM,GAAI,SAAU,EAAA,CAAG,CAC7C,EACKC,EAAUC,EAAA,EACV,CAAE,KAAMC,CAAA,EAAcC,EAAA,EACtB,CAAE,KAAMC,CAAA,EAAcC,EAAA,EAEtB,CAAE,KAAAC,EAAM,UAAAC,EAAW,MAAOC,CAAA,EAAeC,EAAe,CAC5D,YAAajB,GAAA,YAAAA,EAAM,OACnB,OAAQ,UACR,KAAME,EAAQ,MAAQ,OACtB,KAAMA,EAAQ,MAAQ,OACtB,SAAUA,EAAQ,SAAW,SAASA,EAAQ,QAAQ,EAAI,OAC1D,MAAOE,EAAW,SAClB,OAAQA,EAAW,OACnB,QAASC,EAAK,SAAW,OACzB,MAAOA,EAAK,QAAUA,EAAK,MAAQ,MAAA,CACpC,EAGKa,IAAgBJ,GAAA,YAAAA,EAAM,cAAe,CAAA,GAAI,OAC5C,GAAM,EAAE,gBAAkB,IAAI,KAAK,EAAE,cAAc,EAAI,IAAI,IAAK,EAE7DK,GAAQL,GAAA,YAAAA,EAAM,QAAS,EAEvBM,EAA4C,CAChD,IAAK,UACL,MAAO,GACP,OAASC,GACPC,EAAAA,IAACC,EAAA,CACC,SAAAD,EAAAA,IAACE,EAAA,CACC,KAAMC,EACN,MAAM,qBACN,QAAS,IAAMjB,EAAQ,OAAOa,EAAI,EAAE,EACpC,WAAW,8CAAA,CAAA,EAEf,EAEF,UAAW,iBAAA,EAIPK,EAAwC,CAC5CC,EACA,GAAGC,EACHR,CAAA,EAGF,cACG,MAAA,CACC,SAAA,CAAAE,EAAAA,IAACO,EAAA,CAAW,MAAM,gBAAA,CAAiB,EAEnCP,EAAAA,IAACQ,EAAA,CACC,QAAA5B,EACA,UAAAC,EACA,OAAOO,GAAA,YAAAA,EAAW,QAAS,CAAA,EAC3B,OAAOE,GAAA,YAAAA,EAAW,QAAS,CAAA,CAAC,CAAA,EAG7BI,GACCM,EAAAA,IAAC,MAAA,CAAI,UAAU,uGACX,SAAAN,EAAqB,UAAY,kBAC/B,iDACA,+BAAgCA,EAAqB,OAAO,GAClE,EAGFM,EAAAA,IAACS,EAAA,CACC,QAAAL,EACA,KAAMR,EACN,MAAQG,GAAQA,EAAI,GACpB,WAAaA,GAAQvB,EAAS,uBAAuBuB,EAAI,EAAE,GAAI,CAAE,MAAO,CAAE,KAAM,oBAAA,EAAwB,EACxG,UAAAN,EACA,aAAcC,EAAa,sBAAwB,0BACnD,KAAAX,EACA,OAAQC,CAAA,CAAA,EAGVgB,EAAAA,IAACU,EAAA,CACC,KAAM5B,EAAW,KACjB,WAAYA,EAAW,WAAWe,CAAK,EACvC,aAAcf,EAAW,QACzB,MAAAe,EACA,SAAUf,EAAW,SACrB,iBAAkBA,EAAW,WAAA,CAAA,CAC/B,EACF,CAEJ"}