@hotmeshio/long-tail 0.1.0

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 (809) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +262 -0
  3. package/build/examples/external-mcp-server/server.d.ts +17 -0
  4. package/build/examples/external-mcp-server/server.js +116 -0
  5. package/build/examples/index.d.ts +2 -0
  6. package/build/examples/index.js +7 -0
  7. package/build/examples/seed.d.ts +5 -0
  8. package/build/examples/seed.js +221 -0
  9. package/build/examples/types/envelopes.d.ts +34 -0
  10. package/build/examples/types/envelopes.js +8 -0
  11. package/build/examples/types/index.d.ts +10 -0
  12. package/build/examples/types/index.js +9 -0
  13. package/build/examples/types/resolvers.d.ts +27 -0
  14. package/build/examples/types/resolvers.js +9 -0
  15. package/build/examples/workers.d.ts +10 -0
  16. package/build/examples/workers.js +49 -0
  17. package/build/examples/workflows/basic-echo/activities.d.ts +20 -0
  18. package/build/examples/workflows/basic-echo/activities.js +55 -0
  19. package/build/examples/workflows/basic-echo/index.d.ts +14 -0
  20. package/build/examples/workflows/basic-echo/index.js +66 -0
  21. package/build/examples/workflows/kitchen-sink/activities.d.ts +40 -0
  22. package/build/examples/workflows/kitchen-sink/activities.js +46 -0
  23. package/build/examples/workflows/kitchen-sink/index.d.ts +22 -0
  24. package/build/examples/workflows/kitchen-sink/index.js +123 -0
  25. package/build/examples/workflows/review-content/activities.d.ts +10 -0
  26. package/build/examples/workflows/review-content/activities.js +44 -0
  27. package/build/examples/workflows/review-content/index.d.ts +10 -0
  28. package/build/examples/workflows/review-content/index.js +95 -0
  29. package/build/examples/workflows/review-content/types.d.ts +28 -0
  30. package/build/examples/workflows/review-content/types.js +2 -0
  31. package/build/index.d.ts +37 -0
  32. package/build/index.js +151 -0
  33. package/build/modules/auth.d.ts +58 -0
  34. package/build/modules/auth.js +163 -0
  35. package/build/modules/config.d.ts +19 -0
  36. package/build/modules/config.js +26 -0
  37. package/build/modules/defaults.d.ts +58 -0
  38. package/build/modules/defaults.js +95 -0
  39. package/build/modules/ltconfig.d.ts +21 -0
  40. package/build/modules/ltconfig.js +110 -0
  41. package/build/modules/maintenance.d.ts +18 -0
  42. package/build/modules/maintenance.js +47 -0
  43. package/build/routes/auth.d.ts +2 -0
  44. package/build/routes/auth.js +48 -0
  45. package/build/routes/bot-accounts.d.ts +2 -0
  46. package/build/routes/bot-accounts.js +280 -0
  47. package/build/routes/controlplane.d.ts +2 -0
  48. package/build/routes/controlplane.js +144 -0
  49. package/build/routes/dba.d.ts +2 -0
  50. package/build/routes/dba.js +86 -0
  51. package/build/routes/delegation.d.ts +2 -0
  52. package/build/routes/delegation.js +81 -0
  53. package/build/routes/escalations/bulk.d.ts +2 -0
  54. package/build/routes/escalations/bulk.js +324 -0
  55. package/build/routes/escalations/helpers.d.ts +5 -0
  56. package/build/routes/escalations/helpers.js +48 -0
  57. package/build/routes/escalations/index.d.ts +2 -0
  58. package/build/routes/escalations/index.js +20 -0
  59. package/build/routes/escalations/list.d.ts +2 -0
  60. package/build/routes/escalations/list.js +140 -0
  61. package/build/routes/escalations/resolve.d.ts +2 -0
  62. package/build/routes/escalations/resolve.js +240 -0
  63. package/build/routes/escalations/single.d.ts +2 -0
  64. package/build/routes/escalations/single.js +195 -0
  65. package/build/routes/exports.d.ts +2 -0
  66. package/build/routes/exports.js +163 -0
  67. package/build/routes/files.d.ts +2 -0
  68. package/build/routes/files.js +47 -0
  69. package/build/routes/index.d.ts +2 -0
  70. package/build/routes/index.js +52 -0
  71. package/build/routes/insight.d.ts +2 -0
  72. package/build/routes/insight.js +58 -0
  73. package/build/routes/maintenance.d.ts +2 -0
  74. package/build/routes/maintenance.js +38 -0
  75. package/build/routes/mcp-runs.d.ts +2 -0
  76. package/build/routes/mcp-runs.js +85 -0
  77. package/build/routes/mcp.d.ts +2 -0
  78. package/build/routes/mcp.js +264 -0
  79. package/build/routes/namespaces.d.ts +2 -0
  80. package/build/routes/namespaces.js +71 -0
  81. package/build/routes/oauth.d.ts +7 -0
  82. package/build/routes/oauth.js +217 -0
  83. package/build/routes/resolve.d.ts +9 -0
  84. package/build/routes/resolve.js +19 -0
  85. package/build/routes/roles.d.ts +2 -0
  86. package/build/routes/roles.js +195 -0
  87. package/build/routes/settings.d.ts +2 -0
  88. package/build/routes/settings.js +35 -0
  89. package/build/routes/tasks.d.ts +2 -0
  90. package/build/routes/tasks.js +133 -0
  91. package/build/routes/users.d.ts +2 -0
  92. package/build/routes/users.js +206 -0
  93. package/build/routes/workflows/config.d.ts +2 -0
  94. package/build/routes/workflows/config.js +123 -0
  95. package/build/routes/workflows/discovery.d.ts +2 -0
  96. package/build/routes/workflows/discovery.js +146 -0
  97. package/build/routes/workflows/index.d.ts +2 -0
  98. package/build/routes/workflows/index.js +18 -0
  99. package/build/routes/workflows/invocation.d.ts +2 -0
  100. package/build/routes/workflows/invocation.js +162 -0
  101. package/build/routes/yaml-workflows/crud.d.ts +2 -0
  102. package/build/routes/yaml-workflows/crud.js +276 -0
  103. package/build/routes/yaml-workflows/deployment.d.ts +2 -0
  104. package/build/routes/yaml-workflows/deployment.js +179 -0
  105. package/build/routes/yaml-workflows/helpers.d.ts +2 -0
  106. package/build/routes/yaml-workflows/helpers.js +8 -0
  107. package/build/routes/yaml-workflows/index.d.ts +2 -0
  108. package/build/routes/yaml-workflows/index.js +21 -0
  109. package/build/routes/yaml-workflows/versions.d.ts +2 -0
  110. package/build/routes/yaml-workflows/versions.js +116 -0
  111. package/build/scripts/process-helpers.d.ts +11 -0
  112. package/build/scripts/process-helpers.js +59 -0
  113. package/build/scripts/process.d.ts +18 -0
  114. package/build/scripts/process.js +191 -0
  115. package/build/scripts/token.d.ts +13 -0
  116. package/build/scripts/token.js +42 -0
  117. package/build/services/auth/bot-api-key.d.ts +32 -0
  118. package/build/services/auth/bot-api-key.js +112 -0
  119. package/build/services/auth/delegation.d.ts +20 -0
  120. package/build/services/auth/delegation.js +53 -0
  121. package/build/services/auth/service-token.d.ts +23 -0
  122. package/build/services/auth/service-token.js +105 -0
  123. package/build/services/config/cache.d.ts +2 -0
  124. package/build/services/config/cache.js +24 -0
  125. package/build/services/config/index.d.ts +4 -0
  126. package/build/services/config/index.js +13 -0
  127. package/build/services/config/provider.d.ts +2 -0
  128. package/build/services/config/provider.js +30 -0
  129. package/build/services/config/read.d.ts +3 -0
  130. package/build/services/config/read.js +68 -0
  131. package/build/services/config/sql.d.ts +14 -0
  132. package/build/services/config/sql.js +58 -0
  133. package/build/services/config/write.d.ts +5 -0
  134. package/build/services/config/write.js +61 -0
  135. package/build/services/controlplane/index.d.ts +47 -0
  136. package/build/services/controlplane/index.js +124 -0
  137. package/build/services/controlplane/quorum-bridge.d.ts +15 -0
  138. package/build/services/controlplane/quorum-bridge.js +62 -0
  139. package/build/services/controlplane/sql.d.ts +21 -0
  140. package/build/services/controlplane/sql.js +70 -0
  141. package/build/services/controlplane/types.d.ts +13 -0
  142. package/build/services/controlplane/types.js +3 -0
  143. package/build/services/cron/index.d.ts +46 -0
  144. package/build/services/cron/index.js +199 -0
  145. package/build/services/db/index.d.ts +3 -0
  146. package/build/services/db/index.js +19 -0
  147. package/build/services/db/migrate.d.ts +1 -0
  148. package/build/services/db/migrate.js +78 -0
  149. package/build/services/dba.d.ts +28 -0
  150. package/build/services/dba.js +32 -0
  151. package/build/services/escalation/bulk.d.ts +27 -0
  152. package/build/services/escalation/bulk.js +57 -0
  153. package/build/services/escalation/crud.d.ts +47 -0
  154. package/build/services/escalation/crud.js +150 -0
  155. package/build/services/escalation/index.d.ts +4 -0
  156. package/build/services/escalation/index.js +20 -0
  157. package/build/services/escalation/queries.d.ts +37 -0
  158. package/build/services/escalation/queries.js +163 -0
  159. package/build/services/escalation/sql.d.ts +21 -0
  160. package/build/services/escalation/sql.js +135 -0
  161. package/build/services/escalation/types.d.ts +43 -0
  162. package/build/services/escalation/types.js +13 -0
  163. package/build/services/escalation-strategy/default.d.ts +12 -0
  164. package/build/services/escalation-strategy/default.js +17 -0
  165. package/build/services/escalation-strategy/index.d.ts +21 -0
  166. package/build/services/escalation-strategy/index.js +32 -0
  167. package/build/services/escalation-strategy/mcp.d.ts +13 -0
  168. package/build/services/escalation-strategy/mcp.js +51 -0
  169. package/build/services/events/index.d.ts +37 -0
  170. package/build/services/events/index.js +64 -0
  171. package/build/services/events/memory.d.ts +27 -0
  172. package/build/services/events/memory.js +40 -0
  173. package/build/services/events/nats.d.ts +29 -0
  174. package/build/services/events/nats.js +50 -0
  175. package/build/services/events/publish.d.ts +72 -0
  176. package/build/services/events/publish.js +106 -0
  177. package/build/services/events/socketio.d.ts +33 -0
  178. package/build/services/events/socketio.js +70 -0
  179. package/build/services/export/client.d.ts +2 -0
  180. package/build/services/export/client.js +16 -0
  181. package/build/services/export/index.d.ts +39 -0
  182. package/build/services/export/index.js +158 -0
  183. package/build/services/export/post-process.d.ts +16 -0
  184. package/build/services/export/post-process.js +133 -0
  185. package/build/services/export/types.d.ts +25 -0
  186. package/build/services/export/types.js +2 -0
  187. package/build/services/hotmesh-utils.d.ts +61 -0
  188. package/build/services/hotmesh-utils.js +204 -0
  189. package/build/services/iam/activity.d.ts +52 -0
  190. package/build/services/iam/activity.js +59 -0
  191. package/build/services/iam/bots.d.ts +83 -0
  192. package/build/services/iam/bots.js +157 -0
  193. package/build/services/iam/context.d.ts +14 -0
  194. package/build/services/iam/context.js +61 -0
  195. package/build/services/iam/credentials.d.ts +42 -0
  196. package/build/services/iam/credentials.js +86 -0
  197. package/build/services/iam/envelope.d.ts +10 -0
  198. package/build/services/iam/envelope.js +32 -0
  199. package/build/services/iam/ephemeral.d.ts +50 -0
  200. package/build/services/iam/ephemeral.js +131 -0
  201. package/build/services/iam/index.d.ts +19 -0
  202. package/build/services/iam/index.js +37 -0
  203. package/build/services/iam/principal.d.ts +12 -0
  204. package/build/services/iam/principal.js +53 -0
  205. package/build/services/iam/resolve.d.ts +48 -0
  206. package/build/services/iam/resolve.js +89 -0
  207. package/build/services/insight/index.d.ts +30 -0
  208. package/build/services/insight/index.js +81 -0
  209. package/build/services/insight/prompts.d.ts +4 -0
  210. package/build/services/insight/prompts.js +15 -0
  211. package/build/services/interceptor/activities/config.d.ts +21 -0
  212. package/build/services/interceptor/activities/config.js +26 -0
  213. package/build/services/interceptor/activities/escalation.d.ts +58 -0
  214. package/build/services/interceptor/activities/escalation.js +110 -0
  215. package/build/services/interceptor/activities/index.d.ts +4 -0
  216. package/build/services/interceptor/activities/index.js +23 -0
  217. package/build/services/interceptor/activities/task.d.ts +65 -0
  218. package/build/services/interceptor/activities/task.js +168 -0
  219. package/build/services/interceptor/activities/workflow.d.ts +26 -0
  220. package/build/services/interceptor/activities/workflow.js +41 -0
  221. package/build/services/interceptor/activity-interceptor.d.ts +32 -0
  222. package/build/services/interceptor/activity-interceptor.js +86 -0
  223. package/build/services/interceptor/completion.d.ts +16 -0
  224. package/build/services/interceptor/completion.js +149 -0
  225. package/build/services/interceptor/context.d.ts +11 -0
  226. package/build/services/interceptor/context.js +20 -0
  227. package/build/services/interceptor/escalation.d.ts +26 -0
  228. package/build/services/interceptor/escalation.js +150 -0
  229. package/build/services/interceptor/index.d.ts +45 -0
  230. package/build/services/interceptor/index.js +160 -0
  231. package/build/services/interceptor/lifecycle.d.ts +44 -0
  232. package/build/services/interceptor/lifecycle.js +174 -0
  233. package/build/services/interceptor/state.d.ts +22 -0
  234. package/build/services/interceptor/state.js +36 -0
  235. package/build/services/interceptor/types.d.ts +43 -0
  236. package/build/services/interceptor/types.js +3 -0
  237. package/build/services/llm/detect.d.ts +16 -0
  238. package/build/services/llm/detect.js +33 -0
  239. package/build/services/llm/index.d.ts +34 -0
  240. package/build/services/llm/index.js +106 -0
  241. package/build/services/llm/providers/anthropic.d.ts +11 -0
  242. package/build/services/llm/providers/anthropic.js +85 -0
  243. package/build/services/llm/providers/openai.d.ts +9 -0
  244. package/build/services/llm/providers/openai.js +46 -0
  245. package/build/services/llm/translate.d.ts +66 -0
  246. package/build/services/llm/translate.js +192 -0
  247. package/build/services/llm/types.d.ts +64 -0
  248. package/build/services/llm/types.js +8 -0
  249. package/build/services/logger/index.d.ts +32 -0
  250. package/build/services/logger/index.js +69 -0
  251. package/build/services/logger/pino.d.ts +24 -0
  252. package/build/services/logger/pino.js +59 -0
  253. package/build/services/maintenance/index.d.ts +43 -0
  254. package/build/services/maintenance/index.js +183 -0
  255. package/build/services/mcp/adapter.d.ts +23 -0
  256. package/build/services/mcp/adapter.js +119 -0
  257. package/build/services/mcp/client/connection.d.ts +46 -0
  258. package/build/services/mcp/client/connection.js +280 -0
  259. package/build/services/mcp/client/index.d.ts +2 -0
  260. package/build/services/mcp/client/index.js +16 -0
  261. package/build/services/mcp/client/tools.d.ts +22 -0
  262. package/build/services/mcp/client/tools.js +118 -0
  263. package/build/services/mcp/db-server/index.d.ts +25 -0
  264. package/build/services/mcp/db-server/index.js +49 -0
  265. package/build/services/mcp/db-server/schemas.d.ts +52 -0
  266. package/build/services/mcp/db-server/schemas.js +34 -0
  267. package/build/services/mcp/db-server/tools.d.ts +5 -0
  268. package/build/services/mcp/db-server/tools.js +224 -0
  269. package/build/services/mcp/db.d.ts +26 -0
  270. package/build/services/mcp/db.js +141 -0
  271. package/build/services/mcp/index.d.ts +25 -0
  272. package/build/services/mcp/index.js +47 -0
  273. package/build/services/mcp/playwright-server/index.d.ts +14 -0
  274. package/build/services/mcp/playwright-server/index.js +25 -0
  275. package/build/services/mcp/playwright-server/lifecycle.d.ts +7 -0
  276. package/build/services/mcp/playwright-server/lifecycle.js +63 -0
  277. package/build/services/mcp/playwright-server/schemas.d.ts +81 -0
  278. package/build/services/mcp/playwright-server/schemas.js +48 -0
  279. package/build/services/mcp/playwright-server/tools.d.ts +2 -0
  280. package/build/services/mcp/playwright-server/tools.js +224 -0
  281. package/build/services/mcp/server.d.ts +26 -0
  282. package/build/services/mcp/server.js +286 -0
  283. package/build/services/mcp/sql.d.ts +12 -0
  284. package/build/services/mcp/sql.js +59 -0
  285. package/build/services/mcp/types.d.ts +17 -0
  286. package/build/services/mcp/types.js +3 -0
  287. package/build/services/mcp/vision-server.d.ts +15 -0
  288. package/build/services/mcp/vision-server.js +214 -0
  289. package/build/services/mcp/workflow-compiler-server.d.ts +15 -0
  290. package/build/services/mcp/workflow-compiler-server.js +206 -0
  291. package/build/services/mcp/workflow-server.d.ts +24 -0
  292. package/build/services/mcp/workflow-server.js +230 -0
  293. package/build/services/mcp-runs/enrichment.d.ts +12 -0
  294. package/build/services/mcp-runs/enrichment.js +39 -0
  295. package/build/services/mcp-runs/events.d.ts +6 -0
  296. package/build/services/mcp-runs/events.js +126 -0
  297. package/build/services/mcp-runs/execution-builder.d.ts +12 -0
  298. package/build/services/mcp-runs/execution-builder.js +100 -0
  299. package/build/services/mcp-runs/index.d.ts +4 -0
  300. package/build/services/mcp-runs/index.js +8 -0
  301. package/build/services/mcp-runs/queries.d.ts +28 -0
  302. package/build/services/mcp-runs/queries.js +71 -0
  303. package/build/services/mcp-runs/sql.d.ts +4 -0
  304. package/build/services/mcp-runs/sql.js +17 -0
  305. package/build/services/mcp-runs/types.d.ts +65 -0
  306. package/build/services/mcp-runs/types.js +2 -0
  307. package/build/services/namespace/index.d.ts +17 -0
  308. package/build/services/namespace/index.js +41 -0
  309. package/build/services/namespace/sql.d.ts +4 -0
  310. package/build/services/namespace/sql.js +23 -0
  311. package/build/services/namespace/types.d.ts +11 -0
  312. package/build/services/namespace/types.js +3 -0
  313. package/build/services/oauth/crypto.d.ts +19 -0
  314. package/build/services/oauth/crypto.js +95 -0
  315. package/build/services/oauth/db.d.ts +20 -0
  316. package/build/services/oauth/db.js +140 -0
  317. package/build/services/oauth/index.d.ts +12 -0
  318. package/build/services/oauth/index.js +77 -0
  319. package/build/services/oauth/providers/anthropic.d.ts +3 -0
  320. package/build/services/oauth/providers/anthropic.js +111 -0
  321. package/build/services/oauth/providers/github.d.ts +3 -0
  322. package/build/services/oauth/providers/github.js +46 -0
  323. package/build/services/oauth/providers/google.d.ts +3 -0
  324. package/build/services/oauth/providers/google.js +44 -0
  325. package/build/services/oauth/providers/index.d.ts +2 -0
  326. package/build/services/oauth/providers/index.js +7 -0
  327. package/build/services/oauth/providers/microsoft.d.ts +3 -0
  328. package/build/services/oauth/providers/microsoft.js +46 -0
  329. package/build/services/oauth/providers/mock.d.ts +3 -0
  330. package/build/services/oauth/providers/mock.js +76 -0
  331. package/build/services/oauth/providers/registry.d.ts +8 -0
  332. package/build/services/oauth/providers/registry.js +46 -0
  333. package/build/services/oauth/providers/types.d.ts +13 -0
  334. package/build/services/oauth/providers/types.js +2 -0
  335. package/build/services/oauth/state.d.ts +30 -0
  336. package/build/services/oauth/state.js +83 -0
  337. package/build/services/orchestrator/index.d.ts +23 -0
  338. package/build/services/orchestrator/index.js +156 -0
  339. package/build/services/orchestrator/types.d.ts +15 -0
  340. package/build/services/orchestrator/types.js +3 -0
  341. package/build/services/role/index.d.ts +47 -0
  342. package/build/services/role/index.js +136 -0
  343. package/build/services/role/sql.d.ts +14 -0
  344. package/build/services/role/sql.js +80 -0
  345. package/build/services/role/types.d.ts +11 -0
  346. package/build/services/role/types.js +3 -0
  347. package/build/services/storage/index.d.ts +12 -0
  348. package/build/services/storage/index.js +31 -0
  349. package/build/services/storage/local.d.ts +26 -0
  350. package/build/services/storage/local.js +129 -0
  351. package/build/services/storage/s3.d.ts +31 -0
  352. package/build/services/storage/s3.js +180 -0
  353. package/build/services/storage/types.d.ts +41 -0
  354. package/build/services/storage/types.js +2 -0
  355. package/build/services/task/crud.d.ts +21 -0
  356. package/build/services/task/crud.js +123 -0
  357. package/build/services/task/index.d.ts +4 -0
  358. package/build/services/task/index.js +20 -0
  359. package/build/services/task/process.d.ts +14 -0
  360. package/build/services/task/process.js +98 -0
  361. package/build/services/task/resolve.d.ts +12 -0
  362. package/build/services/task/resolve.js +49 -0
  363. package/build/services/task/sql.d.ts +19 -0
  364. package/build/services/task/sql.js +92 -0
  365. package/build/services/task/types.d.ts +56 -0
  366. package/build/services/task/types.js +9 -0
  367. package/build/services/telemetry/honeycomb.d.ts +53 -0
  368. package/build/services/telemetry/honeycomb.js +79 -0
  369. package/build/services/telemetry/index.d.ts +46 -0
  370. package/build/services/telemetry/index.js +68 -0
  371. package/build/services/user/auth.d.ts +7 -0
  372. package/build/services/user/auth.js +26 -0
  373. package/build/services/user/crud.d.ts +19 -0
  374. package/build/services/user/crud.js +151 -0
  375. package/build/services/user/index.d.ts +5 -0
  376. package/build/services/user/index.js +26 -0
  377. package/build/services/user/rbac.d.ts +15 -0
  378. package/build/services/user/rbac.js +32 -0
  379. package/build/services/user/roles.d.ts +7 -0
  380. package/build/services/user/roles.js +42 -0
  381. package/build/services/user/sql.d.ts +22 -0
  382. package/build/services/user/sql.js +45 -0
  383. package/build/services/user/types.d.ts +23 -0
  384. package/build/services/user/types.js +4 -0
  385. package/build/services/workers/registry.d.ts +10 -0
  386. package/build/services/workers/registry.js +26 -0
  387. package/build/services/workflow-invocation.d.ts +46 -0
  388. package/build/services/workflow-invocation.js +184 -0
  389. package/build/services/yaml-workflow/db-utils.d.ts +25 -0
  390. package/build/services/yaml-workflow/db-utils.js +93 -0
  391. package/build/services/yaml-workflow/db.d.ts +27 -0
  392. package/build/services/yaml-workflow/db.js +196 -0
  393. package/build/services/yaml-workflow/deployer-helpers.d.ts +13 -0
  394. package/build/services/yaml-workflow/deployer-helpers.js +133 -0
  395. package/build/services/yaml-workflow/deployer.d.ts +54 -0
  396. package/build/services/yaml-workflow/deployer.js +203 -0
  397. package/build/services/yaml-workflow/generator.d.ts +21 -0
  398. package/build/services/yaml-workflow/generator.js +117 -0
  399. package/build/services/yaml-workflow/index.d.ts +4 -0
  400. package/build/services/yaml-workflow/index.js +20 -0
  401. package/build/services/yaml-workflow/input-analyzer-helpers.d.ts +48 -0
  402. package/build/services/yaml-workflow/input-analyzer-helpers.js +183 -0
  403. package/build/services/yaml-workflow/input-analyzer.d.ts +30 -0
  404. package/build/services/yaml-workflow/input-analyzer.js +109 -0
  405. package/build/services/yaml-workflow/pattern-detector/array-source.d.ts +22 -0
  406. package/build/services/yaml-workflow/pattern-detector/array-source.js +120 -0
  407. package/build/services/yaml-workflow/pattern-detector/collapse.d.ts +27 -0
  408. package/build/services/yaml-workflow/pattern-detector/collapse.js +92 -0
  409. package/build/services/yaml-workflow/pattern-detector/index.d.ts +18 -0
  410. package/build/services/yaml-workflow/pattern-detector/index.js +22 -0
  411. package/build/services/yaml-workflow/pattern-detector/run-detection.d.ts +28 -0
  412. package/build/services/yaml-workflow/pattern-detector/run-detection.js +81 -0
  413. package/build/services/yaml-workflow/pattern-detector/types.d.ts +29 -0
  414. package/build/services/yaml-workflow/pattern-detector/types.js +8 -0
  415. package/build/services/yaml-workflow/pipeline/analyze.d.ts +11 -0
  416. package/build/services/yaml-workflow/pipeline/analyze.js +64 -0
  417. package/build/services/yaml-workflow/pipeline/build/dag.d.ts +25 -0
  418. package/build/services/yaml-workflow/pipeline/build/dag.js +254 -0
  419. package/build/services/yaml-workflow/pipeline/build/index.d.ts +20 -0
  420. package/build/services/yaml-workflow/pipeline/build/index.js +115 -0
  421. package/build/services/yaml-workflow/pipeline/build/iteration.d.ts +25 -0
  422. package/build/services/yaml-workflow/pipeline/build/iteration.js +231 -0
  423. package/build/services/yaml-workflow/pipeline/build/metadata.d.ts +15 -0
  424. package/build/services/yaml-workflow/pipeline/build/metadata.js +126 -0
  425. package/build/services/yaml-workflow/pipeline/build/transform.d.ts +17 -0
  426. package/build/services/yaml-workflow/pipeline/build/transform.js +94 -0
  427. package/build/services/yaml-workflow/pipeline/build/utils.d.ts +22 -0
  428. package/build/services/yaml-workflow/pipeline/build/utils.js +129 -0
  429. package/build/services/yaml-workflow/pipeline/build/wiring.d.ts +9 -0
  430. package/build/services/yaml-workflow/pipeline/build/wiring.js +148 -0
  431. package/build/services/yaml-workflow/pipeline/compile/index.d.ts +17 -0
  432. package/build/services/yaml-workflow/pipeline/compile/index.js +64 -0
  433. package/build/services/yaml-workflow/pipeline/compile/llm-call.d.ts +14 -0
  434. package/build/services/yaml-workflow/pipeline/compile/llm-call.js +153 -0
  435. package/build/services/yaml-workflow/pipeline/compile/parse-plan.d.ts +12 -0
  436. package/build/services/yaml-workflow/pipeline/compile/parse-plan.js +88 -0
  437. package/build/services/yaml-workflow/pipeline/compile/summarize.d.ts +39 -0
  438. package/build/services/yaml-workflow/pipeline/compile/summarize.js +174 -0
  439. package/build/services/yaml-workflow/pipeline/extract-helpers.d.ts +42 -0
  440. package/build/services/yaml-workflow/pipeline/extract-helpers.js +88 -0
  441. package/build/services/yaml-workflow/pipeline/extract.d.ts +24 -0
  442. package/build/services/yaml-workflow/pipeline/extract.js +235 -0
  443. package/build/services/yaml-workflow/pipeline/prompts.d.ts +15 -0
  444. package/build/services/yaml-workflow/pipeline/prompts.js +254 -0
  445. package/build/services/yaml-workflow/pipeline/validate.d.ts +12 -0
  446. package/build/services/yaml-workflow/pipeline/validate.js +111 -0
  447. package/build/services/yaml-workflow/sql.d.ts +19 -0
  448. package/build/services/yaml-workflow/sql.js +83 -0
  449. package/build/services/yaml-workflow/types.d.ts +223 -0
  450. package/build/services/yaml-workflow/types.js +8 -0
  451. package/build/services/yaml-workflow/workers/callbacks.d.ts +17 -0
  452. package/build/services/yaml-workflow/workers/callbacks.js +194 -0
  453. package/build/services/yaml-workflow/workers/events.d.ts +7 -0
  454. package/build/services/yaml-workflow/workers/events.js +49 -0
  455. package/build/services/yaml-workflow/workers/index.d.ts +4 -0
  456. package/build/services/yaml-workflow/workers/index.js +15 -0
  457. package/build/services/yaml-workflow/workers/register.d.ts +15 -0
  458. package/build/services/yaml-workflow/workers/register.js +233 -0
  459. package/build/services/yaml-workflow/workers/scope.d.ts +13 -0
  460. package/build/services/yaml-workflow/workers/scope.js +37 -0
  461. package/build/start/adapters.d.ts +6 -0
  462. package/build/start/adapters.js +80 -0
  463. package/build/start/config.d.ts +10 -0
  464. package/build/start/config.js +88 -0
  465. package/build/start/index.d.ts +21 -0
  466. package/build/start/index.js +87 -0
  467. package/build/start/server.d.ts +6 -0
  468. package/build/start/server.js +46 -0
  469. package/build/start/workers.d.ts +32 -0
  470. package/build/start/workers.js +144 -0
  471. package/build/system/activities/claude-code.d.ts +56 -0
  472. package/build/system/activities/claude-code.js +258 -0
  473. package/build/system/activities/file-storage.d.ts +31 -0
  474. package/build/system/activities/file-storage.js +71 -0
  475. package/build/system/activities/http.d.ts +27 -0
  476. package/build/system/activities/http.js +56 -0
  477. package/build/system/activities/oauth.d.ts +39 -0
  478. package/build/system/activities/oauth.js +33 -0
  479. package/build/system/activities/triage/cache.d.ts +7 -0
  480. package/build/system/activities/triage/cache.js +10 -0
  481. package/build/system/activities/triage/context.d.ts +21 -0
  482. package/build/system/activities/triage/context.js +92 -0
  483. package/build/system/activities/triage/discovery.d.ts +25 -0
  484. package/build/system/activities/triage/discovery.js +170 -0
  485. package/build/system/activities/triage/index.d.ts +5 -0
  486. package/build/system/activities/triage/index.js +22 -0
  487. package/build/system/activities/triage/llm.d.ts +9 -0
  488. package/build/system/activities/triage/llm.js +34 -0
  489. package/build/system/activities/triage/tools.d.ts +24 -0
  490. package/build/system/activities/triage/tools.js +178 -0
  491. package/build/system/index.d.ts +16 -0
  492. package/build/system/index.js +100 -0
  493. package/build/system/mcp-servers/claude-code.d.ts +17 -0
  494. package/build/system/mcp-servers/claude-code.js +110 -0
  495. package/build/system/mcp-servers/db-query/index.d.ts +25 -0
  496. package/build/system/mcp-servers/db-query/index.js +49 -0
  497. package/build/system/mcp-servers/db-query/schemas.d.ts +52 -0
  498. package/build/system/mcp-servers/db-query/schemas.js +34 -0
  499. package/build/system/mcp-servers/db-query/tools.d.ts +5 -0
  500. package/build/system/mcp-servers/db-query/tools.js +224 -0
  501. package/build/system/mcp-servers/document-vision.d.ts +15 -0
  502. package/build/system/mcp-servers/document-vision.js +228 -0
  503. package/build/system/mcp-servers/file-storage.d.ts +4 -0
  504. package/build/system/mcp-servers/file-storage.js +101 -0
  505. package/build/system/mcp-servers/http-fetch.d.ts +4 -0
  506. package/build/system/mcp-servers/http-fetch.js +100 -0
  507. package/build/system/mcp-servers/human-queue.d.ts +26 -0
  508. package/build/system/mcp-servers/human-queue.js +287 -0
  509. package/build/system/mcp-servers/oauth.d.ts +11 -0
  510. package/build/system/mcp-servers/oauth.js +100 -0
  511. package/build/system/mcp-servers/playwright/browser-lifecycle.d.ts +26 -0
  512. package/build/system/mcp-servers/playwright/browser-lifecycle.js +125 -0
  513. package/build/system/mcp-servers/playwright/index.d.ts +25 -0
  514. package/build/system/mcp-servers/playwright/index.js +42 -0
  515. package/build/system/mcp-servers/playwright/schemas.d.ts +383 -0
  516. package/build/system/mcp-servers/playwright/schemas.js +87 -0
  517. package/build/system/mcp-servers/playwright/tools-atomic.d.ts +2 -0
  518. package/build/system/mcp-servers/playwright/tools-atomic.js +9 -0
  519. package/build/system/mcp-servers/playwright/tools-navigation.d.ts +2 -0
  520. package/build/system/mcp-servers/playwright/tools-navigation.js +140 -0
  521. package/build/system/mcp-servers/playwright/tools-page-interaction.d.ts +2 -0
  522. package/build/system/mcp-servers/playwright/tools-page-interaction.js +162 -0
  523. package/build/system/mcp-servers/playwright/tools-run-script.d.ts +2 -0
  524. package/build/system/mcp-servers/playwright/tools-run-script.js +190 -0
  525. package/build/system/mcp-servers/playwright/types.d.ts +8 -0
  526. package/build/system/mcp-servers/playwright/types.js +30 -0
  527. package/build/system/mcp-servers/playwright-cli/helpers.d.ts +11 -0
  528. package/build/system/mcp-servers/playwright-cli/helpers.js +20 -0
  529. package/build/system/mcp-servers/playwright-cli/index.d.ts +4 -0
  530. package/build/system/mcp-servers/playwright-cli/index.js +15 -0
  531. package/build/system/mcp-servers/playwright-cli/schemas.d.ts +219 -0
  532. package/build/system/mcp-servers/playwright-cli/schemas.js +75 -0
  533. package/build/system/mcp-servers/playwright-cli/tools-auth.d.ts +2 -0
  534. package/build/system/mcp-servers/playwright-cli/tools-auth.js +183 -0
  535. package/build/system/mcp-servers/playwright-cli/tools-capture.d.ts +2 -0
  536. package/build/system/mcp-servers/playwright-cli/tools-capture.js +267 -0
  537. package/build/system/mcp-servers/prompts.d.ts +4 -0
  538. package/build/system/mcp-servers/prompts.js +10 -0
  539. package/build/system/mcp-servers/workflow-compiler.d.ts +15 -0
  540. package/build/system/mcp-servers/workflow-compiler.js +230 -0
  541. package/build/system/mcp-servers/workflow.d.ts +24 -0
  542. package/build/system/mcp-servers/workflow.js +231 -0
  543. package/build/system/seed/index.d.ts +7 -0
  544. package/build/system/seed/index.js +36 -0
  545. package/build/system/seed/server-definitions.d.ts +1460 -0
  546. package/build/system/seed/server-definitions.js +160 -0
  547. package/build/system/seed/tool-manifests-browser.d.ts +577 -0
  548. package/build/system/seed/tool-manifests-browser.js +158 -0
  549. package/build/system/seed/tool-manifests-data.d.ts +322 -0
  550. package/build/system/seed/tool-manifests-data.js +173 -0
  551. package/build/system/seed/tool-manifests-escalation.d.ts +173 -0
  552. package/build/system/seed/tool-manifests-escalation.js +76 -0
  553. package/build/system/seed/tool-manifests-workflows.d.ts +211 -0
  554. package/build/system/seed/tool-manifests-workflows.js +136 -0
  555. package/build/system/workflows/mcp-deterministic/activities.d.ts +6 -0
  556. package/build/system/workflows/mcp-deterministic/activities.js +56 -0
  557. package/build/system/workflows/mcp-deterministic/index.d.ts +9 -0
  558. package/build/system/workflows/mcp-deterministic/index.js +72 -0
  559. package/build/system/workflows/mcp-query/activities/caches.d.ts +7 -0
  560. package/build/system/workflows/mcp-query/activities/caches.js +10 -0
  561. package/build/system/workflows/mcp-query/activities/discovery.d.ts +31 -0
  562. package/build/system/workflows/mcp-query/activities/discovery.js +172 -0
  563. package/build/system/workflows/mcp-query/activities/index.d.ts +4 -0
  564. package/build/system/workflows/mcp-query/activities/index.js +13 -0
  565. package/build/system/workflows/mcp-query/activities/llm.d.ts +8 -0
  566. package/build/system/workflows/mcp-query/activities/llm.js +33 -0
  567. package/build/system/workflows/mcp-query/activities/tool-executor.d.ts +5 -0
  568. package/build/system/workflows/mcp-query/activities/tool-executor.js +112 -0
  569. package/build/system/workflows/mcp-query/activities/tool-loader.d.ts +14 -0
  570. package/build/system/workflows/mcp-query/activities/tool-loader.js +93 -0
  571. package/build/system/workflows/mcp-query/index.d.ts +14 -0
  572. package/build/system/workflows/mcp-query/index.js +227 -0
  573. package/build/system/workflows/mcp-query/prompts.d.ts +4 -0
  574. package/build/system/workflows/mcp-query/prompts.js +101 -0
  575. package/build/system/workflows/mcp-query/strategy-advisors.d.ts +14 -0
  576. package/build/system/workflows/mcp-query/strategy-advisors.js +109 -0
  577. package/build/system/workflows/mcp-query/types.d.ts +10 -0
  578. package/build/system/workflows/mcp-query/types.js +3 -0
  579. package/build/system/workflows/mcp-query-router/activities.d.ts +6 -0
  580. package/build/system/workflows/mcp-query-router/activities.js +12 -0
  581. package/build/system/workflows/mcp-query-router/index.d.ts +13 -0
  582. package/build/system/workflows/mcp-query-router/index.js +107 -0
  583. package/build/system/workflows/mcp-query-router/prompts.d.ts +1 -0
  584. package/build/system/workflows/mcp-query-router/prompts.js +8 -0
  585. package/build/system/workflows/mcp-triage/index.d.ts +31 -0
  586. package/build/system/workflows/mcp-triage/index.js +222 -0
  587. package/build/system/workflows/mcp-triage/prompts.d.ts +7 -0
  588. package/build/system/workflows/mcp-triage/prompts.js +159 -0
  589. package/build/system/workflows/mcp-triage/response-builders.d.ts +17 -0
  590. package/build/system/workflows/mcp-triage/response-builders.js +96 -0
  591. package/build/system/workflows/mcp-triage/response.d.ts +8 -0
  592. package/build/system/workflows/mcp-triage/response.js +157 -0
  593. package/build/system/workflows/mcp-triage/types.d.ts +20 -0
  594. package/build/system/workflows/mcp-triage/types.js +3 -0
  595. package/build/system/workflows/mcp-triage-deterministic/activities.d.ts +4 -0
  596. package/build/system/workflows/mcp-triage-deterministic/activities.js +8 -0
  597. package/build/system/workflows/mcp-triage-deterministic/index.d.ts +12 -0
  598. package/build/system/workflows/mcp-triage-deterministic/index.js +83 -0
  599. package/build/system/workflows/mcp-triage-router/activities.d.ts +9 -0
  600. package/build/system/workflows/mcp-triage-router/activities.js +15 -0
  601. package/build/system/workflows/mcp-triage-router/index.d.ts +13 -0
  602. package/build/system/workflows/mcp-triage-router/index.js +122 -0
  603. package/build/tsconfig.tsbuildinfo +1 -0
  604. package/build/types/auth.d.ts +34 -0
  605. package/build/types/auth.js +2 -0
  606. package/build/types/config.d.ts +48 -0
  607. package/build/types/config.js +2 -0
  608. package/build/types/delegation.d.ts +41 -0
  609. package/build/types/delegation.js +2 -0
  610. package/build/types/discovery.d.ts +12 -0
  611. package/build/types/discovery.js +3 -0
  612. package/build/types/envelope.d.ts +53 -0
  613. package/build/types/envelope.js +2 -0
  614. package/build/types/escalation-strategy.d.ts +37 -0
  615. package/build/types/escalation-strategy.js +2 -0
  616. package/build/types/escalation.d.ts +39 -0
  617. package/build/types/escalation.js +21 -0
  618. package/build/types/events.d.ts +65 -0
  619. package/build/types/events.js +2 -0
  620. package/build/types/export.d.ts +78 -0
  621. package/build/types/export.js +11 -0
  622. package/build/types/index.d.ts +21 -0
  623. package/build/types/index.js +6 -0
  624. package/build/types/logger.d.ts +26 -0
  625. package/build/types/logger.js +2 -0
  626. package/build/types/maintenance.d.ts +24 -0
  627. package/build/types/maintenance.js +2 -0
  628. package/build/types/mcp.d.ts +80 -0
  629. package/build/types/mcp.js +2 -0
  630. package/build/types/oauth.d.ts +74 -0
  631. package/build/types/oauth.js +2 -0
  632. package/build/types/startup.d.ts +110 -0
  633. package/build/types/startup.js +2 -0
  634. package/build/types/task.d.ts +39 -0
  635. package/build/types/task.js +2 -0
  636. package/build/types/telemetry.d.ts +32 -0
  637. package/build/types/telemetry.js +2 -0
  638. package/build/types/tool-context.d.ts +68 -0
  639. package/build/types/tool-context.js +14 -0
  640. package/build/types/user.d.ts +18 -0
  641. package/build/types/user.js +2 -0
  642. package/build/types/workflow.d.ts +35 -0
  643. package/build/types/workflow.js +2 -0
  644. package/build/types/yaml-workflow.d.ts +101 -0
  645. package/build/types/yaml-workflow.js +5 -0
  646. package/build/vitest.config.d.ts +2 -0
  647. package/build/vitest.config.js +32 -0
  648. package/build/vitest.integration.config.d.ts +2 -0
  649. package/build/vitest.integration.config.js +25 -0
  650. package/build/workers/index.d.ts +6 -0
  651. package/build/workers/index.js +20 -0
  652. package/dashboard/dist/assets/AdminDashboard-jfacvOC7.js +2 -0
  653. package/dashboard/dist/assets/AdminDashboard-jfacvOC7.js.map +1 -0
  654. package/dashboard/dist/assets/AvailableEscalationsPage-BglLDoT8.js +2 -0
  655. package/dashboard/dist/assets/AvailableEscalationsPage-BglLDoT8.js.map +1 -0
  656. package/dashboard/dist/assets/BotPicker-D6FYW1Gt.js +2 -0
  657. package/dashboard/dist/assets/BotPicker-D6FYW1Gt.js.map +1 -0
  658. package/dashboard/dist/assets/CollapsibleSection-Cxk4wvjT.js +2 -0
  659. package/dashboard/dist/assets/CollapsibleSection-Cxk4wvjT.js.map +1 -0
  660. package/dashboard/dist/assets/ConfirmDeleteModal-FSXyKjaB.js +2 -0
  661. package/dashboard/dist/assets/ConfirmDeleteModal-FSXyKjaB.js.map +1 -0
  662. package/dashboard/dist/assets/CopyableId-CBdxWfp8.js +2 -0
  663. package/dashboard/dist/assets/CopyableId-CBdxWfp8.js.map +1 -0
  664. package/dashboard/dist/assets/CredentialsPage-Ikzsot0w.js +2 -0
  665. package/dashboard/dist/assets/CredentialsPage-Ikzsot0w.js.map +1 -0
  666. package/dashboard/dist/assets/CustomDurationPicker-CAninCbl.js +2 -0
  667. package/dashboard/dist/assets/CustomDurationPicker-CAninCbl.js.map +1 -0
  668. package/dashboard/dist/assets/DataTable-BDn1WBHS.js +2 -0
  669. package/dashboard/dist/assets/DataTable-BDn1WBHS.js.map +1 -0
  670. package/dashboard/dist/assets/EmptyState-2CmV-IaS.js +2 -0
  671. package/dashboard/dist/assets/EmptyState-2CmV-IaS.js.map +1 -0
  672. package/dashboard/dist/assets/EscalationsOverview-GXYFPASS.js +2 -0
  673. package/dashboard/dist/assets/EscalationsOverview-GXYFPASS.js.map +1 -0
  674. package/dashboard/dist/assets/EventTable-B01oJf6Y.js +2 -0
  675. package/dashboard/dist/assets/EventTable-B01oJf6Y.js.map +1 -0
  676. package/dashboard/dist/assets/Field-DuFBAYhu.js +2 -0
  677. package/dashboard/dist/assets/Field-DuFBAYhu.js.map +1 -0
  678. package/dashboard/dist/assets/FilterBar-Ck4K4rzu.js +2 -0
  679. package/dashboard/dist/assets/FilterBar-Ck4K4rzu.js.map +1 -0
  680. package/dashboard/dist/assets/McpOverview-JkvRcX2e.js +2 -0
  681. package/dashboard/dist/assets/McpOverview-JkvRcX2e.js.map +1 -0
  682. package/dashboard/dist/assets/McpQueryDetailPage-CUMqhQdS.js +2 -0
  683. package/dashboard/dist/assets/McpQueryDetailPage-CUMqhQdS.js.map +1 -0
  684. package/dashboard/dist/assets/McpQueryPage-DRRhw4nN.js +2 -0
  685. package/dashboard/dist/assets/McpQueryPage-DRRhw4nN.js.map +1 -0
  686. package/dashboard/dist/assets/McpRunDetailPage-CmPs5EvE.js +2 -0
  687. package/dashboard/dist/assets/McpRunDetailPage-CmPs5EvE.js.map +1 -0
  688. package/dashboard/dist/assets/McpRunsPage-Dl5Y2u6k.js +2 -0
  689. package/dashboard/dist/assets/McpRunsPage-Dl5Y2u6k.js.map +1 -0
  690. package/dashboard/dist/assets/Modal-B4rbIVAn.js +2 -0
  691. package/dashboard/dist/assets/Modal-B4rbIVAn.js.map +1 -0
  692. package/dashboard/dist/assets/OperatorDashboard-B56il28q.js +2 -0
  693. package/dashboard/dist/assets/OperatorDashboard-B56il28q.js.map +1 -0
  694. package/dashboard/dist/assets/PageHeader-CpWFly5S.js +2 -0
  695. package/dashboard/dist/assets/PageHeader-CpWFly5S.js.map +1 -0
  696. package/dashboard/dist/assets/PriorityBadge-DfQY9St9.js +2 -0
  697. package/dashboard/dist/assets/PriorityBadge-DfQY9St9.js.map +1 -0
  698. package/dashboard/dist/assets/ProcessDetailPage-CMLq4M7D.js +2 -0
  699. package/dashboard/dist/assets/ProcessDetailPage-CMLq4M7D.js.map +1 -0
  700. package/dashboard/dist/assets/ProcessesListPage-CZ_HF06v.js +2 -0
  701. package/dashboard/dist/assets/ProcessesListPage-CZ_HF06v.js.map +1 -0
  702. package/dashboard/dist/assets/RolePill-BTPa8L-P.js +2 -0
  703. package/dashboard/dist/assets/RolePill-BTPa8L-P.js.map +1 -0
  704. package/dashboard/dist/assets/RolesPage-9grZW7yR.js +2 -0
  705. package/dashboard/dist/assets/RolesPage-9grZW7yR.js.map +1 -0
  706. package/dashboard/dist/assets/RowActions-Dg-Fsm5O.js +2 -0
  707. package/dashboard/dist/assets/RowActions-Dg-Fsm5O.js.map +1 -0
  708. package/dashboard/dist/assets/SimpleMarkdown-CBlvaWP4.js +4 -0
  709. package/dashboard/dist/assets/SimpleMarkdown-CBlvaWP4.js.map +1 -0
  710. package/dashboard/dist/assets/StatCard-DlgF0CJC.js +2 -0
  711. package/dashboard/dist/assets/StatCard-DlgF0CJC.js.map +1 -0
  712. package/dashboard/dist/assets/StatusBadge-TlC4jiig.js +2 -0
  713. package/dashboard/dist/assets/StatusBadge-TlC4jiig.js.map +1 -0
  714. package/dashboard/dist/assets/StickyPagination-F9FZsRy9.js +2 -0
  715. package/dashboard/dist/assets/StickyPagination-F9FZsRy9.js.map +1 -0
  716. package/dashboard/dist/assets/SwimlaneTimeline-7SiwATsZ.js +2 -0
  717. package/dashboard/dist/assets/SwimlaneTimeline-7SiwATsZ.js.map +1 -0
  718. package/dashboard/dist/assets/TaskDetailPage-CbPVTakt.js +2 -0
  719. package/dashboard/dist/assets/TaskDetailPage-CbPVTakt.js.map +1 -0
  720. package/dashboard/dist/assets/TaskQueuePill-awmtb0qw.js +2 -0
  721. package/dashboard/dist/assets/TaskQueuePill-awmtb0qw.js.map +1 -0
  722. package/dashboard/dist/assets/TasksListPage-C_QF23c1.js +2 -0
  723. package/dashboard/dist/assets/TasksListPage-C_QF23c1.js.map +1 -0
  724. package/dashboard/dist/assets/TimeAgo-UPG6DoH8.js +2 -0
  725. package/dashboard/dist/assets/TimeAgo-UPG6DoH8.js.map +1 -0
  726. package/dashboard/dist/assets/TimestampCell-DoWMKg6w.js +2 -0
  727. package/dashboard/dist/assets/TimestampCell-DoWMKg6w.js.map +1 -0
  728. package/dashboard/dist/assets/UserName-DaP4YAKr.js +2 -0
  729. package/dashboard/dist/assets/UserName-DaP4YAKr.js.map +1 -0
  730. package/dashboard/dist/assets/VersionHistory-Bt7WBr6m.js +5 -0
  731. package/dashboard/dist/assets/VersionHistory-Bt7WBr6m.js.map +1 -0
  732. package/dashboard/dist/assets/WorkflowExecutionPage-DjtAQ3hy.js +2 -0
  733. package/dashboard/dist/assets/WorkflowExecutionPage-DjtAQ3hy.js.map +1 -0
  734. package/dashboard/dist/assets/WorkflowPill-CCDSVaQj.js +2 -0
  735. package/dashboard/dist/assets/WorkflowPill-CCDSVaQj.js.map +1 -0
  736. package/dashboard/dist/assets/WorkflowsDashboard-D8z9uBNB.js +2 -0
  737. package/dashboard/dist/assets/WorkflowsDashboard-D8z9uBNB.js.map +1 -0
  738. package/dashboard/dist/assets/WorkflowsOverview-D9OzzQqw.js +2 -0
  739. package/dashboard/dist/assets/WorkflowsOverview-D9OzzQqw.js.map +1 -0
  740. package/dashboard/dist/assets/YamlWorkflowDetailPage-DrDvvP62.js +3 -0
  741. package/dashboard/dist/assets/YamlWorkflowDetailPage-DrDvvP62.js.map +1 -0
  742. package/dashboard/dist/assets/YamlWorkflowsPage-COqiNCQK.js +2 -0
  743. package/dashboard/dist/assets/YamlWorkflowsPage-COqiNCQK.js.map +1 -0
  744. package/dashboard/dist/assets/bots-BkKVMbUW.js +2 -0
  745. package/dashboard/dist/assets/bots-BkKVMbUW.js.map +1 -0
  746. package/dashboard/dist/assets/constants-CgaZfe5d.js +2 -0
  747. package/dashboard/dist/assets/constants-CgaZfe5d.js.map +1 -0
  748. package/dashboard/dist/assets/escalation-columns-D6aqStaY.js +2 -0
  749. package/dashboard/dist/assets/escalation-columns-D6aqStaY.js.map +1 -0
  750. package/dashboard/dist/assets/escalation-qalymbKB.js +2 -0
  751. package/dashboard/dist/assets/escalation-qalymbKB.js.map +1 -0
  752. package/dashboard/dist/assets/format-gXZXQ-HJ.js +2 -0
  753. package/dashboard/dist/assets/format-gXZXQ-HJ.js.map +1 -0
  754. package/dashboard/dist/assets/helpers-0gSleuzT.js +2 -0
  755. package/dashboard/dist/assets/helpers-0gSleuzT.js.map +1 -0
  756. package/dashboard/dist/assets/index-BWvMHed7.js +6 -0
  757. package/dashboard/dist/assets/index-BWvMHed7.js.map +1 -0
  758. package/dashboard/dist/assets/index-BaszoPO_.css +1 -0
  759. package/dashboard/dist/assets/index-Cn2jyj9A.js +2 -0
  760. package/dashboard/dist/assets/index-Cn2jyj9A.js.map +1 -0
  761. package/dashboard/dist/assets/index-D8VH6K8B.js +54 -0
  762. package/dashboard/dist/assets/index-D8VH6K8B.js.map +1 -0
  763. package/dashboard/dist/assets/index-D9SYwJsi.js +3 -0
  764. package/dashboard/dist/assets/index-D9SYwJsi.js.map +1 -0
  765. package/dashboard/dist/assets/index-DTPzZr_X.js +2 -0
  766. package/dashboard/dist/assets/index-DTPzZr_X.js.map +1 -0
  767. package/dashboard/dist/assets/index-D_6AB5BE.js +2 -0
  768. package/dashboard/dist/assets/index-D_6AB5BE.js.map +1 -0
  769. package/dashboard/dist/assets/index-S9Ks2Lj2.js +2 -0
  770. package/dashboard/dist/assets/index-S9Ks2Lj2.js.map +1 -0
  771. package/dashboard/dist/assets/index-X85K5bHC.js +17 -0
  772. package/dashboard/dist/assets/index-X85K5bHC.js.map +1 -0
  773. package/dashboard/dist/assets/index-rjmgHlSH.js +2 -0
  774. package/dashboard/dist/assets/index-rjmgHlSH.js.map +1 -0
  775. package/dashboard/dist/assets/mcp-blCW6IL7.js +2 -0
  776. package/dashboard/dist/assets/mcp-blCW6IL7.js.map +1 -0
  777. package/dashboard/dist/assets/mcp-query-DoAyPbjC.js +2 -0
  778. package/dashboard/dist/assets/mcp-query-DoAyPbjC.js.map +1 -0
  779. package/dashboard/dist/assets/mcp-runs-ChPbpvXK.js +2 -0
  780. package/dashboard/dist/assets/mcp-runs-ChPbpvXK.js.map +1 -0
  781. package/dashboard/dist/assets/namespaces-BgbaC3ow.js +2 -0
  782. package/dashboard/dist/assets/namespaces-BgbaC3ow.js.map +1 -0
  783. package/dashboard/dist/assets/roles-ZNrqqnQl.js +2 -0
  784. package/dashboard/dist/assets/roles-ZNrqqnQl.js.map +1 -0
  785. package/dashboard/dist/assets/settings-eBRSE0mQ.js +2 -0
  786. package/dashboard/dist/assets/settings-eBRSE0mQ.js.map +1 -0
  787. package/dashboard/dist/assets/tasks-tRqClPns.js +2 -0
  788. package/dashboard/dist/assets/tasks-tRqClPns.js.map +1 -0
  789. package/dashboard/dist/assets/useFilterParams-BaXUAkYK.js +2 -0
  790. package/dashboard/dist/assets/useFilterParams-BaXUAkYK.js.map +1 -0
  791. package/dashboard/dist/assets/useNatsEvents-Xr43X1fG.js +2 -0
  792. package/dashboard/dist/assets/useNatsEvents-Xr43X1fG.js.map +1 -0
  793. package/dashboard/dist/assets/useYamlActivityEvents-BO51u8tm.js +2 -0
  794. package/dashboard/dist/assets/useYamlActivityEvents-BO51u8tm.js.map +1 -0
  795. package/dashboard/dist/assets/users-tMvNyOo8.js +2 -0
  796. package/dashboard/dist/assets/users-tMvNyOo8.js.map +1 -0
  797. package/dashboard/dist/assets/vendor-icons-ZTAKVwGc.js +292 -0
  798. package/dashboard/dist/assets/vendor-icons-ZTAKVwGc.js.map +1 -0
  799. package/dashboard/dist/assets/vendor-query-B2UbickB.js +18 -0
  800. package/dashboard/dist/assets/vendor-query-B2UbickB.js.map +1 -0
  801. package/dashboard/dist/assets/vendor-react-Cw8Gy8NJ.js +22 -0
  802. package/dashboard/dist/assets/vendor-react-Cw8Gy8NJ.js.map +1 -0
  803. package/dashboard/dist/assets/workflows-Cc4VHcrp.js +2 -0
  804. package/dashboard/dist/assets/workflows-Cc4VHcrp.js.map +1 -0
  805. package/dashboard/dist/assets/yaml-workflows-BL4V5CQy.js +2 -0
  806. package/dashboard/dist/assets/yaml-workflows-BL4V5CQy.js.map +1 -0
  807. package/dashboard/dist/index.html +20 -0
  808. package/dashboard/dist/logo512.png +0 -0
  809. package/package.json +96 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkflowsDashboard-D8z9uBNB.js","sources":["../../src/pages/workflows/WorkflowsDashboard.tsx"],"sourcesContent":["import { useState, useEffect, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { Filter, Settings } from 'lucide-react';\nimport { TimestampCell } from '../../components/common/display/TimestampCell';\nimport { useJobs, useWorkflowConfigs } from '../../api/workflows';\nimport { useAuth } from '../../hooks/useAuth';\nimport { useWorkflowListEvents } from '../../hooks/useNatsEvents';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { DataTable, type Column } from '../../components/common/data/DataTable';\nimport { WorkflowPill } from '../../components/common/display/WorkflowPill';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { FilterBar, FilterSelect } from '../../components/common/data/FilterBar';\nimport { StickyPagination } from '../../components/common/data/StickyPagination';\nimport { RowAction, RowActionGroup } from '../../components/common/layout/RowActions';\nimport type { LTJob } from '../../api/types';\n\nexport type ExecutionsTier = 'all' | 'certified' | 'durable';\n\nconst jobStatusMap: Record<string, string> = {\n running: 'in_progress',\n completed: 'completed',\n failed: 'failed',\n};\n\nconst STATUS_DOT: Record<string, string> = {\n in_progress: 'bg-status-active',\n completed: 'bg-status-success',\n failed: 'bg-status-error',\n};\n\nconst STATUS_COLORS: Record<string, string> = {\n running: 'text-status-active',\n completed: 'text-status-success',\n failed: 'text-status-error',\n};\n\nfunction buildColumns(\n onFilterEntity: (entity: string) => void,\n onFilterStatus: (status: string) => void,\n isSuperAdmin: boolean,\n navigate: (path: string) => void,\n certifiedTypes: Set<string>,\n): Column<LTJob>[] {\n return [\n {\n key: 'workflow_id',\n label: 'Workflow ID / Type',\n render: (row) => {\n const dotClass = STATUS_DOT[jobStatusMap[row.status] ?? row.status] ?? 'bg-status-pending';\n const pulseClass = row.status === 'running' ? ' animate-pulse' : '';\n return (\n <div className=\"flex items-start gap-2 min-w-0\">\n <span className={`w-[9px] h-[9px] shrink-0 rounded-full mt-1 ${dotClass}${pulseClass}`} title={row.status} />\n <div className=\"min-w-0\">\n <span className=\"font-mono text-xs text-text-primary truncate block\">\n {row.workflow_id}\n </span>\n <div className=\"mt-0.5\">\n <WorkflowPill type={row.entity} certified={certifiedTypes.has(row.entity)} />\n </div>\n </div>\n </div>\n );\n },\n },\n {\n key: 'created_at',\n label: 'Created',\n render: (row) => <TimestampCell date={row.created_at} />,\n className: 'w-40',\n sortable: true,\n },\n {\n key: 'updated_at',\n label: 'Updated',\n render: (row) => <TimestampCell date={row.updated_at} />,\n className: 'w-40',\n sortable: true,\n },\n {\n key: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n <RowAction\n icon={Filter}\n title={`Filter by ${row.entity}`}\n onClick={() => onFilterEntity(row.entity)}\n />\n <button\n onClick={(e) => { e.stopPropagation(); onFilterStatus(row.status); }}\n className=\"opacity-0 group-hover/row:opacity-100 transition-opacity\"\n title={`Filter by ${row.status}`}\n >\n <svg className={`w-[18px] h-[18px] ${STATUS_COLORS[row.status] ?? 'text-text-tertiary'} hover:opacity-70`} viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <circle cx=\"12\" cy=\"12\" r=\"6\" />\n </svg>\n </button>\n {isSuperAdmin && (\n <RowAction\n icon={Settings}\n title=\"View config\"\n onClick={() => navigate(`/workflows/registry/${encodeURIComponent(row.entity)}`)}\n />\n )}\n </RowActionGroup>\n ),\n className: 'w-24 text-right',\n },\n ];\n}\n\nexport function WorkflowsDashboard({ tier: initialTier = 'all' }: { tier?: ExecutionsTier }) {\n useWorkflowListEvents();\n const navigate = useNavigate();\n const { isSuperAdmin } = useAuth();\n\n const { filters, setFilter, pagination, sort, setSort } = useFilterParams({\n filters: { search: '', entity: '', status: '', tier: initialTier },\n });\n\n const activeTier = (filters.tier || 'all') as ExecutionsTier;\n\n // Map tier to server-side registered filter\n const registeredFilter = activeTier === 'certified' ? 'true'\n : activeTier === 'durable' ? 'false'\n : undefined;\n\n const { data: configs } = useWorkflowConfigs();\n\n const certifiedTypes = useMemo(\n () => new Set((configs ?? []).map((c) => c.workflow_type)),\n [configs],\n );\n\n const columns = buildColumns(\n (entity) => setFilter('entity', entity),\n (status) => setFilter('status', status),\n isSuperAdmin,\n navigate,\n certifiedTypes,\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: jobsData, isLoading } = useJobs({\n limit: pagination.pageSize,\n offset: pagination.offset,\n entity: filters.entity || undefined,\n search: filters.search || undefined,\n status: filters.status || undefined,\n sort_by: sort.sort_by || undefined,\n order: sort.sort_by ? sort.order : undefined,\n registered: registeredFilter,\n });\n\n const total = jobsData?.total ?? 0;\n const jobs = jobsData?.jobs ?? [];\n\n const entities = useMemo(() => {\n return [...new Set((configs ?? []).map((c) => c.workflow_type))].sort();\n }, [configs]);\n\n const pageTitle = 'Durable Executions';\n\n const emptyMessage = activeTier === 'certified'\n ? 'No certified workflow executions found'\n : activeTier === 'durable'\n ? 'No durable workflow executions found'\n : 'No workflow executions found';\n\n return (\n <div>\n <PageHeader title={pageTitle} />\n\n <FilterBar>\n <input\n type=\"text\"\n placeholder=\"Search workflow 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=\"Type\"\n value={filters.entity}\n onChange={(v) => setFilter('entity', v)}\n options={entities.map((e) => ({ value: e, label: e }))}\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 <FilterSelect\n label=\"Tier\"\n value={filters.tier === 'all' ? '' : filters.tier}\n onChange={(v) => setFilter('tier', v || 'all')}\n options={[\n { value: 'certified', label: 'Certified' },\n { value: 'durable', label: 'Durable' },\n ]}\n />\n </FilterBar>\n\n <DataTable\n columns={columns}\n data={jobs}\n keyFn={(row) => row.workflow_id}\n onRowClick={(row) => navigate(`/workflows/executions/${row.workflow_id}`)}\n isLoading={isLoading}\n emptyMessage={emptyMessage}\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":["jobStatusMap","STATUS_DOT","STATUS_COLORS","buildColumns","onFilterEntity","onFilterStatus","isSuperAdmin","navigate","certifiedTypes","row","dotClass","pulseClass","jsxs","jsx","WorkflowPill","TimestampCell","RowActionGroup","RowAction","Filter","e","Settings","WorkflowsDashboard","initialTier","useWorkflowListEvents","useNavigate","useAuth","filters","setFilter","pagination","sort","setSort","useFilterParams","activeTier","registeredFilter","configs","useWorkflowConfigs","useMemo","c","columns","entity","status","searchInput","setSearchInput","useState","useEffect","timer","jobsData","isLoading","useJobs","total","jobs","entities","pageTitle","emptyMessage","PageHeader","FilterBar","FilterSelect","v","DataTable","StickyPagination"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{a as x,j as t}from"./vendor-query-B2UbickB.js";import{b as C,u as k}from"./workflows-Cc4VHcrp.js";import{a as $}from"./useNatsEvents-Xr43X1fG.js";import{P as D}from"./PageHeader-CpWFly5S.js";import{S as h}from"./StatCard-DlgF0CJC.js";import{b as w}from"./vendor-react-Cw8Gy8NJ.js";import"./index-D8VH6K8B.js";import"./vendor-icons-ZTAKVwGc.js";const v=[{label:"1h",ms:36e5},{label:"24h",ms:864e5},{label:"7d",ms:6048e5},{label:"30d",ms:2592e6}];function T(r){return r<1e3?`${Math.round(r)}ms`:r<6e4?`${(r/1e3).toFixed(1)}s`:r<36e5?`${(r/6e4).toFixed(1)}m`:`${(r/36e5).toFixed(1)}h`}function p({value:r,colorClass:o,onClick:f}){return r===0?t.jsx("span",{className:"text-text-tertiary",children:"0"}):t.jsx("button",{onClick:f,className:`${o} hover:underline tabular-nums font-medium`,children:r})}function _(){$();const r=w(),[o,f]=x.useState("24h"),{data:c}=C({limit:500}),{data:g}=k(),b=x.useMemo(()=>{const e=v.find(i=>i.label===o);return Date.now()-e.ms},[o]),n=x.useMemo(()=>((c==null?void 0:c.jobs)??[]).filter(e=>new Date(e.created_at).getTime()>=b),[c==null?void 0:c.jobs,b]),j=x.useMemo(()=>{const e=new Map;for(const a of n){const s=e.get(a.entity)??{total:0,running:0,completed:0,failed:0,durations:[]};if(s.total++,a.status==="running"&&s.running++,a.status==="completed"){s.completed++;const m=new Date(a.updated_at).getTime()-new Date(a.created_at).getTime();m>0&&s.durations.push(m)}a.status==="failed"&&s.failed++,e.set(a.entity,s)}const i=[];for(const[a,s]of e)i.push({type:a,...s,avgDuration:s.durations.length>0?s.durations.reduce((m,N)=>m+N,0)/s.durations.length:null});return i.sort((a,s)=>s.total-a.total)},[n]),u=x.useMemo(()=>({total:n.length,running:n.filter(e=>e.status==="running").length,completed:n.filter(e=>e.status==="completed").length,failed:n.filter(e=>e.status==="failed").length}),[n]),y=(g==null?void 0:g.length)??0,l=(e,i)=>{const a=new URLSearchParams;e&&a.set("entity",e),i&&a.set("status",i);const s=a.toString();r(`/workflows/executions${s?`?${s}`:""}`)},d="pb-2 text-[10px] font-semibold uppercase tracking-widest text-text-tertiary";return t.jsxs("div",{children:[t.jsx(D,{title:"Workflows",actions:t.jsxs("span",{className:"text-xs text-text-tertiary",children:[y," certified type",y!==1?"s":""]})}),t.jsx("div",{className:"flex items-center gap-1 mb-6",children:v.map(e=>t.jsx("button",{onClick:()=>f(e.label),className:`px-3 py-1 text-xs rounded-full transition-colors ${o===e.label?"bg-accent text-text-inverse":"text-text-tertiary hover:text-text-primary hover:bg-surface-hover"}`,children:e.label},e.label))}),t.jsxs("div",{className:"grid grid-cols-4 gap-4 mb-8",children:[t.jsx(h,{label:"Total",value:u.total,onClick:()=>l()}),t.jsx(h,{label:"Running",value:u.running,colorClass:"text-status-active",onClick:()=>l(void 0,"running")}),t.jsx(h,{label:"Completed",value:u.completed,colorClass:"text-status-success",onClick:()=>l(void 0,"completed")}),t.jsx(h,{label:"Failed",value:u.failed,colorClass:"text-status-error",onClick:()=>l(void 0,"failed")})]}),j.length>0&&t.jsxs("table",{className:"w-full text-left",children:[t.jsx("thead",{children:t.jsxs("tr",{className:"border-b border-surface-border",children:[t.jsx("th",{className:d,children:"Type"}),t.jsx("th",{className:`${d} text-right w-20`,children:"Total"}),t.jsx("th",{className:`${d} text-right w-20`,children:"Running"}),t.jsx("th",{className:`${d} text-right w-24`,children:"Completed"}),t.jsx("th",{className:`${d} text-right w-20`,children:"Failed"}),t.jsx("th",{className:`${d} text-right w-28`,children:"Avg Duration"})]})}),t.jsx("tbody",{children:j.map(e=>t.jsxs("tr",{className:"border-b border-surface-border last:border-b-0",children:[t.jsx("td",{className:"py-3 text-sm font-mono text-text-primary",children:t.jsx("button",{onClick:()=>l(e.type),className:"hover:text-accent hover:underline",children:e.type})}),t.jsx("td",{className:"py-3 text-sm text-right",children:t.jsx(p,{value:e.total,colorClass:"text-text-secondary",onClick:()=>l(e.type)})}),t.jsx("td",{className:"py-3 text-sm text-right",children:t.jsx(p,{value:e.running,colorClass:"text-status-active",onClick:()=>l(e.type,"running")})}),t.jsx("td",{className:"py-3 text-sm text-right",children:t.jsx(p,{value:e.completed,colorClass:"text-status-success",onClick:()=>l(e.type,"completed")})}),t.jsx("td",{className:"py-3 text-sm text-right",children:t.jsx(p,{value:e.failed,colorClass:"text-status-error",onClick:()=>l(e.type,"failed")})}),t.jsx("td",{className:"py-3 text-sm font-mono text-text-secondary text-right",children:e.avgDuration!==null?T(e.avgDuration):"—"})]},e.type))})]}),j.length===0&&t.jsx("div",{className:"py-16 text-center",children:t.jsxs("p",{className:"text-sm text-text-tertiary",children:["No workflow activity in the last ",o]})})]})}export{_ as WorkflowsOverview};
2
+ //# sourceMappingURL=WorkflowsOverview-D9OzzQqw.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkflowsOverview-D9OzzQqw.js","sources":["../../src/pages/workflows/WorkflowsOverview.tsx"],"sourcesContent":["import { useState, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { useJobs, useWorkflowConfigs } from '../../api/workflows';\nimport { useWorkflowListEvents } from '../../hooks/useNatsEvents';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { StatCard } from '../../components/common/data/StatCard';\n\n// ── Duration filter ──────────────────────────────────────────────────────────\n\nconst DURATIONS = [\n { label: '1h', ms: 3_600_000 },\n { label: '24h', ms: 86_400_000 },\n { label: '7d', ms: 604_800_000 },\n { label: '30d', ms: 2_592_000_000 },\n] as const;\n\ntype DurationLabel = (typeof DURATIONS)[number]['label'];\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction formatDuration(ms: number): string {\n if (ms < 1000) return `${Math.round(ms)}ms`;\n if (ms < 60_000) return `${(ms / 1000).toFixed(1)}s`;\n if (ms < 3_600_000) return `${(ms / 60_000).toFixed(1)}m`;\n return `${(ms / 3_600_000).toFixed(1)}h`;\n}\n\ninterface TypeStats {\n type: string;\n total: number;\n running: number;\n completed: number;\n failed: number;\n avgDuration: number | null;\n}\n\n// ── Clickable stat cell ──────────────────────────────────────────────────────\n\nfunction StatCell({\n value,\n colorClass,\n onClick,\n}: {\n value: number;\n colorClass: string;\n onClick: () => void;\n}) {\n if (value === 0) {\n return <span className=\"text-text-tertiary\">0</span>;\n }\n return (\n <button\n onClick={onClick}\n className={`${colorClass} hover:underline tabular-nums font-medium`}\n >\n {value}\n </button>\n );\n}\n\n// ── Page ─────────────────────────────────────────────────────────────────────\n\nexport function WorkflowsOverview() {\n useWorkflowListEvents();\n const navigate = useNavigate();\n const [duration, setDuration] = useState<DurationLabel>('24h');\n\n const { data: allJobs } = useJobs({ limit: 500 });\n const { data: configs } = useWorkflowConfigs();\n\n const cutoff = useMemo(() => {\n const d = DURATIONS.find((d) => d.label === duration)!;\n return Date.now() - d.ms;\n }, [duration]);\n\n const jobs = useMemo(\n () => (allJobs?.jobs ?? []).filter((j) => new Date(j.created_at).getTime() >= cutoff),\n [allJobs?.jobs, cutoff],\n );\n\n const byType = useMemo(() => {\n const map = new Map<string, { total: number; running: number; completed: number; failed: number; durations: number[] }>();\n for (const j of jobs) {\n const entry = map.get(j.entity) ?? { total: 0, running: 0, completed: 0, failed: 0, durations: [] };\n entry.total++;\n if (j.status === 'running') entry.running++;\n if (j.status === 'completed') {\n entry.completed++;\n const dur = new Date(j.updated_at).getTime() - new Date(j.created_at).getTime();\n if (dur > 0) entry.durations.push(dur);\n }\n if (j.status === 'failed') entry.failed++;\n map.set(j.entity, entry);\n }\n\n const result: TypeStats[] = [];\n for (const [type, stats] of map) {\n result.push({\n type,\n ...stats,\n avgDuration: stats.durations.length > 0\n ? stats.durations.reduce((a, b) => a + b, 0) / stats.durations.length\n : null,\n });\n }\n return result.sort((a, b) => b.total - a.total);\n }, [jobs]);\n\n // Totals\n const totals = useMemo(() => ({\n total: jobs.length,\n running: jobs.filter((j) => j.status === 'running').length,\n completed: jobs.filter((j) => j.status === 'completed').length,\n failed: jobs.filter((j) => j.status === 'failed').length,\n }), [jobs]);\n\n const registered = configs?.length ?? 0;\n\n const goToList = (entity?: string, status?: string) => {\n const params = new URLSearchParams();\n if (entity) params.set('entity', entity);\n if (status) params.set('status', status);\n const qs = params.toString();\n navigate(`/workflows/executions${qs ? `?${qs}` : ''}`);\n };\n\n const thCls = 'pb-2 text-[10px] font-semibold uppercase tracking-widest text-text-tertiary';\n\n return (\n <div>\n <PageHeader\n title=\"Workflows\"\n actions={\n <span className=\"text-xs text-text-tertiary\">\n {registered} certified type{registered !== 1 ? 's' : ''}\n </span>\n }\n />\n\n {/* Duration tabs */}\n <div className=\"flex items-center gap-1 mb-6\">\n {DURATIONS.map((d) => (\n <button\n key={d.label}\n onClick={() => setDuration(d.label)}\n className={`px-3 py-1 text-xs rounded-full transition-colors ${\n duration === d.label\n ? 'bg-accent text-text-inverse'\n : 'text-text-tertiary hover:text-text-primary hover:bg-surface-hover'\n }`}\n >\n {d.label}\n </button>\n ))}\n </div>\n\n {/* Summary cards */}\n <div className=\"grid grid-cols-4 gap-4 mb-8\">\n <StatCard label=\"Total\" value={totals.total} onClick={() => goToList()} />\n <StatCard label=\"Running\" value={totals.running} colorClass=\"text-status-active\" onClick={() => goToList(undefined, 'running')} />\n <StatCard label=\"Completed\" value={totals.completed} colorClass=\"text-status-success\" onClick={() => goToList(undefined, 'completed')} />\n <StatCard label=\"Failed\" value={totals.failed} colorClass=\"text-status-error\" onClick={() => goToList(undefined, 'failed')} />\n </div>\n\n {/* By-type table */}\n {byType.length > 0 && (\n <table className=\"w-full text-left\">\n <thead>\n <tr className=\"border-b border-surface-border\">\n <th className={thCls}>Type</th>\n <th className={`${thCls} text-right w-20`}>Total</th>\n <th className={`${thCls} text-right w-20`}>Running</th>\n <th className={`${thCls} text-right w-24`}>Completed</th>\n <th className={`${thCls} text-right w-20`}>Failed</th>\n <th className={`${thCls} text-right w-28`}>Avg Duration</th>\n </tr>\n </thead>\n <tbody>\n {byType.map((row) => (\n <tr key={row.type} className=\"border-b border-surface-border last:border-b-0\">\n <td className=\"py-3 text-sm font-mono text-text-primary\">\n <button\n onClick={() => goToList(row.type)}\n className=\"hover:text-accent hover:underline\"\n >\n {row.type}\n </button>\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell value={row.total} colorClass=\"text-text-secondary\" onClick={() => goToList(row.type)} />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell value={row.running} colorClass=\"text-status-active\" onClick={() => goToList(row.type, 'running')} />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell value={row.completed} colorClass=\"text-status-success\" onClick={() => goToList(row.type, 'completed')} />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell value={row.failed} colorClass=\"text-status-error\" onClick={() => goToList(row.type, 'failed')} />\n </td>\n <td className=\"py-3 text-sm font-mono text-text-secondary text-right\">\n {row.avgDuration !== null ? formatDuration(row.avgDuration) : '—'}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n )}\n\n {byType.length === 0 && (\n <div className=\"py-16 text-center\">\n <p className=\"text-sm text-text-tertiary\">\n No workflow activity in the last {duration}\n </p>\n </div>\n )}\n </div>\n );\n}"],"names":["DURATIONS","formatDuration","ms","StatCell","value","colorClass","onClick","jsx","WorkflowsOverview","useWorkflowListEvents","navigate","useNavigate","duration","setDuration","useState","allJobs","useJobs","configs","useWorkflowConfigs","cutoff","useMemo","d","jobs","j","byType","map","entry","dur","result","type","stats","a","b","totals","registered","goToList","entity","status","params","qs","thCls","PageHeader","jsxs","StatCard","row"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import{j as e,a as d,b as Se}from"./vendor-query-B2UbickB.js";import{T as we,C as ke,L as Ce,V as Oe}from"./VersionHistory-Bt7WBr6m.js";import{c as Ie,e as De,f as Pe,l as Te,g as We,h as Re,i as Ae,j as Me,d as Je,k as Le}from"./yaml-workflows-BL4V5CQy.js";import{S as Ve}from"./StatusBadge-TlC4jiig.js";import{P as $e}from"./PageHeader-CpWFly5S.js";import{F as S}from"./Field-DuFBAYhu.js";import{C as ce}from"./CollapsibleSection-Cxk4wvjT.js";import{u as Ye}from"./settings-eBRSE0mQ.js";import{s as Ee,a as Ue,m as le,f as He,i as Ke,b as Fe}from"./helpers-0gSleuzT.js";import{J as ie,C as Be,S as qe}from"./index-D8VH6K8B.js";import{L as A,d as ze,e as Qe}from"./vendor-react-Cw8Gy8NJ.js";import{P as de}from"./vendor-icons-ZTAKVwGc.js";function Ge({activities:s,selectedIdx:x,onSelect:l}){return e.jsx("div",{className:"flex items-center gap-1 overflow-x-auto pb-2",children:s.map((c,t)=>{const r=t===x;return e.jsxs("div",{className:"flex items-center shrink-0",children:[t>0&&e.jsx("div",{className:"w-4 h-px bg-surface-border mx-0.5"}),e.jsxs("button",{type:"button",onClick:()=>l(t),className:"flex items-center gap-1.5 cursor-pointer",children:[e.jsx("span",{className:`w-5 h-5 rounded-full text-[10px] font-semibold flex items-center justify-center shrink-0 transition-colors ${r?"bg-accent text-text-inverse":"bg-surface-sunken text-text-tertiary hover:bg-accent-muted hover:text-accent"}`,children:t+1}),e.jsx("span",{className:`text-[10px] font-semibold uppercase tracking-wider whitespace-nowrap transition-colors ${r?"text-text-primary":"text-text-tertiary hover:text-text-primary"}`,children:c.title})]})]},c.activity_id)})})}function Xe({activity:s}){const x=Object.keys(s.input_mappings).length>0,l=s.output_fields.length>0,c=s.tool_source==="llm",t=s.mcp_server_id||(s.tool_source==="db"?"db":""),r=!c&&s.mcp_tool_name?`${t}/${s.mcp_tool_name}`:null,m=!c&&s.mcp_tool_name&&t;return e.jsxs("div",{className:"pt-2 space-y-6",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("h4",{className:"text-base font-medium text-text-primary",children:s.title}),e.jsx("span",{className:`text-[10px] px-2 py-0.5 rounded-full font-medium ${Ue(s.tool_source)}`,children:Ee(s.tool_source)})]}),e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-x-10 gap-y-4",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Mapped Workflow Topic"}),e.jsx("p",{className:"text-sm font-mono text-text-primary",children:s.topic})]}),r&&e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Tool"}),m?e.jsx(A,{to:`/mcp/servers?search=${encodeURIComponent(s.mcp_tool_name)}`,className:"text-sm font-mono text-accent hover:underline",children:r}):e.jsx("p",{className:"text-sm font-mono text-text-primary",children:r})]}),c&&e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Model"}),e.jsx("p",{className:"text-sm font-mono text-text-primary",children:s.model||"gpt-4o-mini"})]})]}),(x||l)&&e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-x-6 gap-y-0",children:[x&&e.jsxs("div",{className:"border border-surface-border rounded-md p-4",children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-2",children:"Inputs"}),e.jsx("div",{className:"space-y-1.5",children:Object.entries(s.input_mappings).map(([h,b])=>e.jsxs("p",{className:"text-xs font-mono text-text-secondary leading-relaxed",children:[e.jsx("span",{className:"text-text-primary",children:h}),e.jsx("span",{className:"text-text-tertiary mx-1.5",children:"←"}),e.jsx("span",{className:"text-accent",children:b})]},h))})]}),l&&e.jsxs("div",{className:"border border-surface-border rounded-md p-4",children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-2",children:"Outputs"}),e.jsx("div",{className:"space-y-1.5",children:s.output_fields.map(h=>e.jsx("p",{className:"text-xs font-mono text-text-secondary leading-relaxed",children:h},h))})]})]}),!c&&s.tool_arguments&&Object.keys(s.tool_arguments).length>0&&e.jsx(ie,{data:s.tool_arguments,label:"Default Arguments",variant:"panel"}),c&&s.prompt_template&&e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-2",children:"Prompt Template"}),e.jsx("pre",{className:"p-4 bg-surface-sunken rounded-lg text-xs font-mono text-text-secondary whitespace-pre-wrap leading-relaxed max-h-64 overflow-y-auto",children:s.prompt_template})]})]})}function Ze({result:s,showMetadata:x,onToggleMetadata:l,traceUrl:c,namespace:t}){const r=(s==null?void 0:s.result)??s,m=s==null?void 0:s.job_id,h=(r==null?void 0:r.metadata)&&(r==null?void 0:r.data),b=h?r.data:r;return e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Result"}),e.jsxs("div",{className:"flex items-center gap-3",children:[m&&e.jsx(A,{to:`/mcp/executions/${encodeURIComponent(m)}?namespace=${encodeURIComponent(t||"longtail")}`,className:"text-[10px] text-accent hover:underline",children:"View Execution Details"}),h&&e.jsx("button",{type:"button",onClick:l,className:"text-[10px] text-accent hover:underline",children:x?"Hide metadata":"Show metadata"})]})]}),e.jsx(Be,{open:x&&!!h,children:e.jsxs("div",{className:"bg-surface-raised border border-surface-border rounded-md p-3 mb-2",children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-2",children:"Metadata"}),e.jsx("div",{className:"grid grid-cols-2 gap-x-6 gap-y-2",children:h&&Object.entries(r.metadata).sort((g,p)=>{const N=Object.keys(le);return(N.indexOf(g[0])===-1?99:N.indexOf(g[0]))-(N.indexOf(p[0])===-1?99:N.indexOf(p[0]))}).map(([g,p])=>e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] text-text-tertiary",children:le[g]??g}),g==="trc"&&c&&p?e.jsx("a",{href:c.replace("{traceId}",String(p)),target:"_blank",rel:"noopener noreferrer",className:"text-xs font-mono text-accent hover:underline truncate block",title:String(p),children:String(p)}):e.jsx("p",{className:"text-xs font-mono text-text-primary truncate",title:String(p??""),children:He(g,p)})]},g))})]})}),e.jsx(ie,{data:b,label:"Data"})]})}function et({wf:s,inputSchema:x,invokeFields:l,setInvokeFields:c,invokeJson:t,setInvokeJson:r,invokeJsonMode:m,setInvokeJsonMode:h,invokeResult:b,setInvokeResult:g,showMetadata:p,setShowMetadata:N,invokeMutation:y,inputFieldMeta:v,settings:w,onInvoke:M,isCollapsed:J,onToggle:L}){var P;const V=(x==null?void 0:x.properties)||{},$=Object.keys(V),k=v&&v.length>0,[T,I]=d.useState(!1),Y=k?v.filter(a=>a.classification==="dynamic").map(a=>a.key):$,C=k?v.filter(a=>a.classification==="fixed").map(a=>a.key):[],O=T?[...Y,...C]:Y,D=(a,j,o)=>{let i=j;o==="number"||o==="integer"?i=j===""?0:Number(j):o==="boolean"&&(i=j==="true"||j===!0);const u={...l,[a]:i};c(u),r(JSON.stringify(u,null,2))};return e.jsx(ce,{sectionKey:"invoke",title:"Invoke / Try",isCollapsed:J,onToggle:L,children:e.jsxs("div",{className:"space-y-4",children:[!b&&e.jsxs("form",{className:"space-y-4",onSubmit:a=>{a.preventDefault(),M()},children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(qe,{children:"Input"}),e.jsxs("div",{className:"flex items-center gap-3",children:[k&&C.length>0&&!m&&e.jsx("button",{type:"button",onClick:()=>I(!T),className:"text-[10px] text-text-tertiary hover:text-text-primary",children:T?`Hide ${C.length} fixed`:`Show ${C.length} fixed`}),e.jsx("button",{type:"button",onClick:()=>{if(!m)r(JSON.stringify(l,null,2));else try{c(JSON.parse(t))}catch{}h(!m)},className:"text-[10px] text-accent hover:underline",children:m?"Form view":"JSON view"})]})]}),m?e.jsx("textarea",{value:t,onChange:a=>r(a.target.value),className:"input font-mono text-[11px] w-full leading-relaxed",rows:8,spellCheck:!1}):O.length>0?e.jsx("div",{className:"space-y-3",children:O.map(a=>{var E,W;const j=V[a],o=Ke(j),i=j==null?void 0:j.description,u=typeof l[a]=="string"?l[a]:JSON.stringify(l[a]??(o==="array"?[]:{}),null,2),f=Math.min(20,Math.max(4,((W=(E=u==null?void 0:u.split)==null?void 0:E.call(u,`
2
+ `))==null?void 0:W.length)??4));return e.jsxs("div",{children:[e.jsxs("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:[a,e.jsx("span",{className:"ml-2 font-normal normal-case",children:o}),k&&C.includes(a)&&e.jsx("span",{className:"ml-2 px-1 py-0.5 text-[8px] bg-surface-sunken rounded",children:"fixed"})]}),i&&e.jsx("p",{className:"text-[10px] text-text-tertiary mb-1",children:i}),o==="boolean"?e.jsxs("select",{value:String(l[a]??!1),onChange:_=>D(a,_.target.value,o),className:"select text-xs w-full",children:[e.jsx("option",{value:"true",children:"true"}),e.jsx("option",{value:"false",children:"false"})]}):o==="object"||o==="array"?e.jsx("textarea",{value:u,onChange:_=>{try{D(a,JSON.parse(_.target.value),o)}catch{c({...l,[a]:_.target.value})}},className:"input font-mono text-[11px] w-full leading-relaxed",rows:f,spellCheck:!1}):e.jsx("input",{type:o==="number"||o==="integer"?"number":"text",value:l[a]??"",onChange:_=>D(a,_.target.value,o),className:"input text-xs w-full"})]},a)})}):e.jsx("p",{className:"text-xs text-text-tertiary",children:"No input schema defined. Switch to JSON view to provide custom input."}),y.error&&!b&&e.jsx("p",{className:"text-xs text-status-error",children:y.error.message}),e.jsx("button",{type:"submit",disabled:y.isPending,className:"btn-primary text-xs",children:y.isPending?e.jsxs("span",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"inline-block w-3 h-3 border-2 border-text-inverse border-t-transparent rounded-full animate-spin"}),"Running..."]}):e.jsxs("span",{className:"flex items-center gap-1.5",children:[e.jsx(de,{className:"w-3 h-3",fill:"currentColor"}),"Invoke"]})})]}),b&&e.jsxs("div",{className:"space-y-4",children:[e.jsx(Ze,{result:b,showMetadata:p,onToggleMetadata:()=>N(!p),traceUrl:(P=w==null?void 0:w.telemetry)==null?void 0:P.traceUrl,namespace:s.app_id}),e.jsx("button",{onClick:()=>{g(null),y.reset()},className:"text-xs text-accent hover:underline",children:"Run again"})]})]})})}function pt(){var se,ae,ne,re,oe;const{id:s}=ze(),[x,l]=Qe(),c=Se(),{data:t,isLoading:r,refetch:m}=Ie(s),{data:h}=Ye(),b=De(),g=Pe(),p=Te(),N=We(),y=Re(),v=Ae(),w=Me(),[M,J]=d.useState({}),[L,V]=d.useState(!1),[$,k]=d.useState("{}"),[T,I]=d.useState(null),[Y,C]=d.useState(!1),[O,D]=d.useState("tools"),[P,a]=d.useState(0),j=x.get("version"),o=j?parseInt(j,10):null,i=o!==null&&t&&o!==t.content_version,{data:u}=Je(s),{data:f}=Le(s,i?o:null),E=i&&f?f.activity_manifest:t==null?void 0:t.activity_manifest,W=i&&f?f.input_schema:t==null?void 0:t.input_schema,_=i&&f?f.output_schema:t==null?void 0:t.output_schema,xe=i&&f?f.yaml_content:t==null?void 0:t.yaml_content,[z,H]=d.useState(""),[Q,K]=d.useState(""),[G,F]=d.useState(""),[me,X]=d.useState([]),[pe,B]=d.useState(!1),ue=d.useRef(null);if(d.useEffect(()=>{t!=null&&t.yaml_content&&H(t.yaml_content),t!=null&&t.input_schema&&K(JSON.stringify(t.input_schema,null,2)),t!=null&&t.output_schema&&F(JSON.stringify(t.output_schema,null,2)),t!=null&&t.input_field_meta&&X(t.input_field_meta)},[t==null?void 0:t.id,t==null?void 0:t.yaml_content,t==null?void 0:t.input_schema,t==null?void 0:t.output_schema,t==null?void 0:t.input_field_meta]),d.useEffect(()=>{if(t!=null&&t.input_schema){const n=Fe(t.input_schema);J(n),k(JSON.stringify(n,null,2))}},[t==null?void 0:t.id]),r)return e.jsxs("div",{className:"animate-pulse space-y-4",children:[e.jsx("div",{className:"h-8 bg-surface-sunken rounded w-48"}),e.jsx("div",{className:"h-60 bg-surface-sunken rounded"})]});if(!t)return e.jsx("p",{className:"text-sm text-text-secondary",children:"Workflow server not found."});const U=(E??t.activity_manifest).filter(n=>n.type==="worker"),he=((se=b.error)==null?void 0:se.message)||((ae=g.error)==null?void 0:ae.message)||((ne=N.error)==null?void 0:ne.message)||((re=y.error)==null?void 0:re.message)||((oe=v.error)==null?void 0:oe.message),Z=b.isPending||g.isPending||N.isPending||y.isPending||v.isPending,ee=async()=>{await b.mutateAsync(t.id),m()},fe=async()=>{confirm("Archive this workflow server? It will no longer accept invocations.")&&(await N.mutateAsync(t.id),m())},ge=async()=>{confirm("Delete this workflow server permanently?")&&await y.mutateAsync(t.id)},je=async()=>{confirm("Re-generate from the source execution? This will overwrite the current definition.")&&(await v.mutateAsync({id:t.id}),m())},be=async()=>{let n,R;try{n=JSON.parse(Q)}catch{}try{R=JSON.parse(G)}catch{}await w.mutateAsync({id:t.id,yaml_content:z,...n?{input_schema:n}:{},...R?{output_schema:R}:{}}),B(!1),m()},Ne=()=>{H(t.yaml_content),K(JSON.stringify(t.input_schema,null,2)),F(JSON.stringify(t.output_schema,null,2)),B(!1)},ye=async()=>{I(null);try{const n=L?JSON.parse($):M,R=await p.mutateAsync({id:t.id,data:n,sync:!0});I(R)}catch(n){I({error:n.message})}},te=t.status==="active"||t.status==="deployed",ve=t.status!=="archived"&&!i,_e=te&&!i,q=n=>D(O===n?null:n);return e.jsxs("div",{children:[e.jsx($e,{title:"Workflow Tool",actions:t.status==="draft"&&!i?e.jsxs("button",{onClick:ee,disabled:Z,className:"group flex items-center gap-2 text-left",children:[e.jsx("span",{className:"flex items-center justify-center w-5 h-5 rounded-full bg-accent/10 text-accent shrink-0",children:e.jsx("svg",{className:"w-3 h-3",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M9.663 17h4.674M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"})})}),e.jsxs("span",{className:"text-xs text-text-secondary group-hover:text-text-primary transition-colors",children:[e.jsx("span",{className:"inline-flex items-center px-2 py-0.5 rounded bg-accent/10 text-accent font-medium group-hover:bg-accent/20 transition-colors mr-1",children:"Deploy"})," ","to register ",e.jsxs("span",{className:"font-mono font-medium text-text-primary",children:[t.app_id,"/",t.graph_topic]})," as an MCP Workflow Tool."]})]}):void 0}),i&&e.jsxs("div",{className:"mb-6 px-4 py-3 rounded-md bg-purple-500/10 border border-purple-500/20 flex items-center justify-between",children:[e.jsxs("p",{className:"text-xs text-text-primary",children:["Viewing version ",e.jsx("span",{className:"font-mono font-medium",children:o}),(f==null?void 0:f.change_summary)&&e.jsxs("span",{className:"text-text-tertiary ml-2",children:["— ",f.change_summary]}),e.jsx("span",{className:"ml-2 text-text-tertiary",children:"(read-only)"})]}),e.jsx("button",{onClick:()=>{const n=new URLSearchParams(x);n.delete("version"),l(n)},className:"text-xs text-accent hover:underline",children:"Back to current"})]}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-[1fr_220px] gap-12",children:[e.jsxs("div",{children:[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-lg font-medium text-text-primary font-mono truncate flex-1",children:t.name}),e.jsx(Ve,{status:t.status}),te&&!i&&e.jsxs("button",{type:"button",onClick:()=>D("invoke"),className:"flex items-center gap-1.5 px-3 py-1.5 rounded-md bg-emerald-500/10 text-emerald-600 border border-emerald-500/20 text-xs font-medium hover:bg-emerald-500/20 transition-colors",children:[e.jsx(de,{className:"w-3 h-3"}),"Invoke"]})]}),t.description&&e.jsx("p",{className:"text-xs text-text-secondary mb-4",children:t.description}),e.jsxs("div",{className:"grid grid-cols-2 sm:grid-cols-4 gap-y-3 gap-x-8",children:[e.jsx(S,{label:"Tool Server",value:e.jsx("span",{className:"font-mono text-xs",children:t.app_id})}),e.jsx(S,{label:"Pipeline Tool",value:e.jsx("span",{className:"font-mono text-xs",children:t.graph_topic})}),e.jsx(S,{label:"Version",value:e.jsxs("span",{className:"font-mono text-xs",children:[t.app_version,u&&u.total>1&&e.jsxs("span",{className:"text-text-tertiary ml-1",children:["(v",t.content_version,")"]})]})}),e.jsx(S,{label:"Tool Calls",value:e.jsx("span",{className:"text-xs",children:U.length})}),t.source_workflow_id&&e.jsxs(e.Fragment,{children:[e.jsx(S,{label:"Compiled From Workflow",value:e.jsx(A,{to:`/workflows/executions/${t.source_workflow_id}`,className:"font-mono text-xs text-accent hover:underline",children:t.source_workflow_id})}),e.jsx(S,{label:"",value:e.jsx(A,{to:`/mcp/queries/${t.source_workflow_id}`,className:"text-xs text-accent hover:underline",children:"Open in Compilation Wizard"})})]}),e.jsx(S,{label:"Invocations",value:e.jsx(A,{to:`/mcp/executions?entity=${encodeURIComponent(t.graph_topic)}&namespace=${encodeURIComponent(t.app_id)}`,className:"text-xs text-accent hover:underline",children:"View runs"})}),e.jsx(S,{label:"Created",value:e.jsx("span",{className:"text-xs",children:new Date(t.created_at).toLocaleString()})})]}),e.jsxs("div",{className:"mt-4 pt-4 border-t border-surface-border",children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-2",children:"Tags"}),t.status!=="archived"?e.jsx(we,{tags:t.tags??[],onChange:n=>{c.setQueryData(["yamlWorkflows",t.id],{...t,tags:n}),w.mutate({id:t.id,tags:n})},placeholder:"Add tags for tool discovery..."}):e.jsx("div",{className:"flex flex-wrap gap-1.5",children:(t.tags??[]).length>0?(t.tags??[]).map(n=>e.jsx("span",{className:"inline-flex items-center px-2 py-0.5 rounded-full bg-accent/10 text-accent text-[11px] font-medium",children:n},n)):e.jsx("span",{className:"text-xs text-text-tertiary",children:"No tags"})})]})]}),e.jsxs("div",{className:"space-y-6",children:[_e&&e.jsx(et,{wf:t,inputSchema:W,invokeFields:M,setInvokeFields:J,invokeJson:$,setInvokeJson:k,invokeJsonMode:L,setInvokeJsonMode:V,invokeResult:T,setInvokeResult:I,showMetadata:Y,setShowMetadata:C,invokeMutation:p,inputFieldMeta:t.input_field_meta,settings:h,onInvoke:ye,isCollapsed:O!=="invoke",onToggle:q}),e.jsx(ce,{sectionKey:"tools",title:"Tools",isCollapsed:O!=="tools",onToggle:q,children:e.jsxs("div",{className:"space-y-4",children:[e.jsx(Ge,{activities:U,selectedIdx:P,onSelect:a}),U[P]&&e.jsx(Xe,{activity:U[P]})]})}),e.jsx(ke,{wf:t,resolvedInputSchema:W,resolvedOutputSchema:_,resolvedYaml:xe,configEditing:pe,setConfigEditing:B,canEditConfig:ve,yamlDraft:z,setYamlDraft:H,inputSchemaDraft:Q,setInputSchemaDraft:K,outputSchemaDraft:G,setOutputSchemaDraft:F,inputFieldMetaDraft:me,setInputFieldMetaDraft:X,onSave:be,onCancel:Ne,updateMutation:w,yamlTextareaRef:ue,isCollapsed:O!=="config",onToggle:q})]})]}),e.jsxs("div",{className:"lg:border-l lg:border-surface-border lg:pl-8 space-y-8",children:[e.jsx(Ce,{status:t.status,sourceWorkflowId:t.source_workflow_id,contentVersion:t.content_version,deployedContentVersion:t.deployed_content_version,onDeploy:ee,onArchive:fe,onDelete:ge,onRegenerate:je,isPending:Z,error:he}),u&&u.versions.length>1&&e.jsx(Oe,{versionsData:u,searchParams:x,setSearchParams:l,currentVersion:t.content_version,viewingVersion:o})]})]})]})}export{pt as YamlWorkflowDetailPage};
3
+ //# sourceMappingURL=YamlWorkflowDetailPage-DrDvvP62.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"YamlWorkflowDetailPage-DrDvvP62.js","sources":["../../src/pages/workflows/yaml-workflow-detail/PipelineStrip.tsx","../../src/pages/workflows/yaml-workflow-detail/InvokeResultView.tsx","../../src/pages/workflows/yaml-workflow-detail/InvokeSection.tsx","../../src/pages/workflows/yaml-workflow-detail/YamlWorkflowDetailPage.tsx"],"sourcesContent":["import { Link } from 'react-router-dom';\nimport { JsonViewer } from '../../../components/common/data/JsonViewer';\nimport type { ActivityManifestEntry } from '../../../api/types/yaml-workflows';\nimport { sourceLabel, sourceColor } from './helpers';\n\nexport function PipelineStrip({ activities, selectedIdx, onSelect }: {\n activities: ActivityManifestEntry[]; selectedIdx: number; onSelect: (i: number) => void;\n}) {\n return (\n <div className=\"flex items-center gap-1 overflow-x-auto pb-2\">\n {activities.map((a, idx) => {\n const isSelected = idx === selectedIdx;\n return (\n <div key={a.activity_id} className=\"flex items-center shrink-0\">\n {idx > 0 && (\n <div className=\"w-4 h-px bg-surface-border mx-0.5\" />\n )}\n <button\n type=\"button\"\n onClick={() => onSelect(idx)}\n className=\"flex items-center gap-1.5 cursor-pointer\"\n >\n <span\n className={`w-5 h-5 rounded-full text-[10px] font-semibold flex items-center justify-center shrink-0 transition-colors ${\n isSelected\n ? 'bg-accent text-text-inverse'\n : 'bg-surface-sunken text-text-tertiary hover:bg-accent-muted hover:text-accent'\n }`}\n >\n {idx + 1}\n </span>\n <span\n className={`text-[10px] font-semibold uppercase tracking-wider whitespace-nowrap transition-colors ${\n isSelected ? 'text-text-primary' : 'text-text-tertiary hover:text-text-primary'\n }`}\n >\n {a.title}\n </span>\n </button>\n </div>\n );\n })}\n </div>\n );\n}\n\nexport function StepDetail({ activity }: { activity: ActivityManifestEntry }) {\n const hasInputs = Object.keys(activity.input_mappings).length > 0;\n const hasOutputs = activity.output_fields.length > 0;\n const isLlm = activity.tool_source === 'llm';\n\n const serverId = activity.mcp_server_id || (activity.tool_source === 'db' ? 'db' : '');\n const toolDisplay = !isLlm && activity.mcp_tool_name\n ? `${serverId}/${activity.mcp_tool_name}`\n : null;\n const toolIsLinkable = !isLlm && activity.mcp_tool_name && serverId;\n\n return (\n <div className=\"pt-2 space-y-6\">\n {/* Header */}\n <div className=\"flex items-center gap-3\">\n <h4 className=\"text-base font-medium text-text-primary\">{activity.title}</h4>\n <span className={`text-[10px] px-2 py-0.5 rounded-full font-medium ${sourceColor(activity.tool_source)}`}>\n {sourceLabel(activity.tool_source)}\n </span>\n </div>\n\n {/* Identity */}\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-x-10 gap-y-4\">\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">Mapped Workflow Topic</p>\n <p className=\"text-sm font-mono text-text-primary\">{activity.topic}</p>\n </div>\n {toolDisplay && (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">Tool</p>\n {toolIsLinkable ? (\n <Link\n to={`/mcp/servers?search=${encodeURIComponent(activity.mcp_tool_name!)}`}\n className=\"text-sm font-mono text-accent hover:underline\"\n >\n {toolDisplay}\n </Link>\n ) : (\n <p className=\"text-sm font-mono text-text-primary\">{toolDisplay}</p>\n )}\n </div>\n )}\n {isLlm && (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">Model</p>\n <p className=\"text-sm font-mono text-text-primary\">{activity.model || 'gpt-4o-mini'}</p>\n </div>\n )}\n </div>\n\n {/* Input -> Output */}\n {(hasInputs || hasOutputs) && (\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-x-6 gap-y-0\">\n {hasInputs && (\n <div className=\"border border-surface-border rounded-md p-4\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-2\">Inputs</p>\n <div className=\"space-y-1.5\">\n {Object.entries(activity.input_mappings).map(([k, v]) => (\n <p key={k} className=\"text-xs font-mono text-text-secondary leading-relaxed\">\n <span className=\"text-text-primary\">{k}</span>\n <span className=\"text-text-tertiary mx-1.5\">&larr;</span>\n <span className=\"text-accent\">{v}</span>\n </p>\n ))}\n </div>\n </div>\n )}\n\n {hasOutputs && (\n <div className=\"border border-surface-border rounded-md p-4\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-2\">Outputs</p>\n <div className=\"space-y-1.5\">\n {activity.output_fields.map((f) => (\n <p key={f} className=\"text-xs font-mono text-text-secondary leading-relaxed\">{f}</p>\n ))}\n </div>\n </div>\n )}\n </div>\n )}\n\n {/* Tool Arguments -- captured from the original execution */}\n {!isLlm && activity.tool_arguments && Object.keys(activity.tool_arguments).length > 0 && (\n <JsonViewer data={activity.tool_arguments} label=\"Default Arguments\" variant=\"panel\" />\n )}\n\n {/* LLM Prompt -- special treatment */}\n {isLlm && activity.prompt_template && (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-2\">Prompt Template</p>\n <pre className=\"p-4 bg-surface-sunken rounded-lg text-xs font-mono text-text-secondary whitespace-pre-wrap leading-relaxed max-h-64 overflow-y-auto\">\n {activity.prompt_template}\n </pre>\n </div>\n )}\n </div>\n );\n}\n","import { Link } from 'react-router-dom';\nimport { Collapsible } from '../../../components/common/layout/Collapsible';\nimport { JsonViewer } from '../../../components/common/data/JsonViewer';\nimport { metadataLabels, formatMetadataValue } from './helpers';\n\nexport function InvokeResultView({ result, showMetadata, onToggleMetadata, traceUrl, namespace }: {\n result: Record<string, unknown>; showMetadata: boolean;\n onToggleMetadata: () => void; traceUrl?: string | null; namespace?: string;\n}) {\n const raw = (result as any)?.result ?? result;\n const jobId = (result as any)?.job_id as string | undefined;\n const hasEnvelope = raw?.metadata && raw?.data;\n const displayData = hasEnvelope ? raw.data : raw;\n return (\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">Result</span>\n <div className=\"flex items-center gap-3\">\n {jobId && (\n <Link\n to={`/mcp/executions/${encodeURIComponent(jobId)}?namespace=${encodeURIComponent(namespace || 'longtail')}`}\n className=\"text-[10px] text-accent hover:underline\"\n >\n View Execution Details\n </Link>\n )}\n {hasEnvelope && (\n <button type=\"button\" onClick={onToggleMetadata} className=\"text-[10px] text-accent hover:underline\">\n {showMetadata ? 'Hide metadata' : 'Show metadata'}\n </button>\n )}\n </div>\n </div>\n <Collapsible open={showMetadata && !!hasEnvelope}>\n <div className=\"bg-surface-raised border border-surface-border rounded-md p-3 mb-2\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-2\">Metadata</p>\n <div className=\"grid grid-cols-2 gap-x-6 gap-y-2\">\n {hasEnvelope && Object.entries(raw.metadata as Record<string, unknown>)\n .sort((a, b) => {\n const order = Object.keys(metadataLabels);\n return (order.indexOf(a[0]) === -1 ? 99 : order.indexOf(a[0])) - (order.indexOf(b[0]) === -1 ? 99 : order.indexOf(b[0]));\n })\n .map(([key, val]) => (\n <div key={key}>\n <p className=\"text-[10px] text-text-tertiary\">{metadataLabels[key] ?? key}</p>\n {key === 'trc' && traceUrl && val ? (\n <a href={traceUrl.replace('{traceId}', String(val))} target=\"_blank\" rel=\"noopener noreferrer\"\n className=\"text-xs font-mono text-accent hover:underline truncate block\" title={String(val)}>\n {String(val)}\n </a>\n ) : (\n <p className=\"text-xs font-mono text-text-primary truncate\" title={String(val ?? '')}>\n {formatMetadataValue(key, val)}\n </p>\n )}\n </div>\n ))}\n </div>\n </div>\n </Collapsible>\n <JsonViewer data={displayData} label=\"Data\" />\n </div>\n );\n}\n","import { useState } from 'react';\nimport { Play } from 'lucide-react';\nimport { SectionLabel } from '../../../components/common/layout/SectionLabel';\nimport { CollapsibleSection } from '../../../components/common/layout/CollapsibleSection';\nimport { InvokeResultView } from './InvokeResultView';\nimport { inferFieldType } from './helpers';\nimport type { InputFieldMeta } from '../../../api/types';\n\nexport function InvokeSection({\n wf,\n inputSchema,\n invokeFields,\n setInvokeFields,\n invokeJson,\n setInvokeJson,\n invokeJsonMode,\n setInvokeJsonMode,\n invokeResult,\n setInvokeResult,\n showMetadata,\n setShowMetadata,\n invokeMutation,\n inputFieldMeta,\n settings,\n onInvoke,\n isCollapsed,\n onToggle,\n}: {\n wf: any;\n inputSchema: any;\n invokeFields: Record<string, any>;\n setInvokeFields: (v: Record<string, any>) => void;\n invokeJson: string;\n setInvokeJson: (v: string) => void;\n invokeJsonMode: boolean;\n setInvokeJsonMode: (v: boolean) => void;\n invokeResult: Record<string, unknown> | null;\n setInvokeResult: (v: Record<string, unknown> | null) => void;\n showMetadata: boolean;\n setShowMetadata: (v: boolean) => void;\n invokeMutation: any;\n settings: any;\n inputFieldMeta?: InputFieldMeta[];\n onInvoke: () => void;\n isCollapsed: boolean;\n onToggle: (key: string) => void;\n}) {\n const inputProps = (inputSchema as any)?.properties || {};\n const allKeys = Object.keys(inputProps);\n const hasFieldMeta = inputFieldMeta && inputFieldMeta.length > 0;\n\n // When field meta is available, show only dynamic fields by default\n const [showFixedFields, setShowFixedFields] = useState(false);\n const dynamicKeys = hasFieldMeta\n ? inputFieldMeta.filter(f => f.classification === 'dynamic').map(f => f.key)\n : allKeys;\n const fixedKeys = hasFieldMeta\n ? inputFieldMeta.filter(f => f.classification === 'fixed').map(f => f.key)\n : [];\n const inputKeys = showFixedFields ? [...dynamicKeys, ...fixedKeys] : dynamicKeys;\n\n const updateField = (key: string, value: any, type: string) => {\n let parsed = value;\n if (type === 'number' || type === 'integer') parsed = value === '' ? 0 : Number(value);\n else if (type === 'boolean') parsed = value === 'true' || value === true;\n const updated = { ...invokeFields, [key]: parsed };\n setInvokeFields(updated);\n setInvokeJson(JSON.stringify(updated, null, 2));\n };\n\n return (\n <CollapsibleSection sectionKey=\"invoke\" title=\"Invoke / Try\" isCollapsed={isCollapsed} onToggle={onToggle} >\n <div className=\"space-y-4\">\n {/* Input form */}\n {!invokeResult && (\n <form className=\"space-y-4\" onSubmit={(e) => { e.preventDefault(); onInvoke(); }}>\n <div className=\"flex items-center justify-between\">\n <SectionLabel>Input</SectionLabel>\n <div className=\"flex items-center gap-3\">\n {hasFieldMeta && fixedKeys.length > 0 && !invokeJsonMode && (\n <button type=\"button\" onClick={() => setShowFixedFields(!showFixedFields)}\n className=\"text-[10px] text-text-tertiary hover:text-text-primary\">\n {showFixedFields ? `Hide ${fixedKeys.length} fixed` : `Show ${fixedKeys.length} fixed`}\n </button>\n )}\n <button type=\"button\" onClick={() => {\n if (!invokeJsonMode) setInvokeJson(JSON.stringify(invokeFields, null, 2));\n else { try { setInvokeFields(JSON.parse(invokeJson)); } catch { /* keep */ } }\n setInvokeJsonMode(!invokeJsonMode);\n }} className=\"text-[10px] text-accent hover:underline\">\n {invokeJsonMode ? 'Form view' : 'JSON view'}\n </button>\n </div>\n </div>\n\n {invokeJsonMode ? (\n <textarea value={invokeJson} onChange={(e) => setInvokeJson(e.target.value)}\n className=\"input font-mono text-[11px] w-full leading-relaxed\"\n rows={8} spellCheck={false} />\n ) : inputKeys.length > 0 ? (\n <div className=\"space-y-3\">\n {inputKeys.map((key) => {\n const prop = inputProps[key] as any;\n const fieldType = inferFieldType(prop);\n const desc = prop?.description as string | undefined;\n const jsonValue = typeof invokeFields[key] === 'string'\n ? invokeFields[key]\n : JSON.stringify(invokeFields[key] ?? (fieldType === 'array' ? [] : {}), null, 2);\n const textareaRows = Math.min(20, Math.max(4, (jsonValue?.split?.('\\n')?.length ?? 4)));\n return (\n <div key={key}>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n {key}<span className=\"ml-2 font-normal normal-case\">{fieldType}</span>\n {hasFieldMeta && fixedKeys.includes(key) && (\n <span className=\"ml-2 px-1 py-0.5 text-[8px] bg-surface-sunken rounded\">fixed</span>\n )}\n </label>\n {desc && (\n <p className=\"text-[10px] text-text-tertiary mb-1\">{desc}</p>\n )}\n {fieldType === 'boolean' ? (\n <select value={String(invokeFields[key] ?? false)} onChange={(e) => updateField(key, e.target.value, fieldType)}\n className=\"select text-xs w-full\">\n <option value=\"true\">true</option><option value=\"false\">false</option>\n </select>\n ) : fieldType === 'object' || fieldType === 'array' ? (\n <textarea\n value={jsonValue}\n onChange={(e) => { try { updateField(key, JSON.parse(e.target.value), fieldType); } catch { setInvokeFields({ ...invokeFields, [key]: e.target.value }); } }}\n className=\"input font-mono text-[11px] w-full leading-relaxed\"\n rows={textareaRows} spellCheck={false} />\n ) : (\n <input type={fieldType === 'number' || fieldType === 'integer' ? 'number' : 'text'}\n value={invokeFields[key] ?? ''} onChange={(e) => updateField(key, e.target.value, fieldType)}\n className=\"input text-xs w-full\" />\n )}\n </div>\n );\n })}\n </div>\n ) : (\n <p className=\"text-xs text-text-tertiary\">No input schema defined. Switch to JSON view to provide custom input.</p>\n )}\n\n {invokeMutation.error && !invokeResult && (\n <p className=\"text-xs text-status-error\">{invokeMutation.error.message}</p>\n )}\n\n <button type=\"submit\" disabled={invokeMutation.isPending} className=\"btn-primary text-xs\">\n {invokeMutation.isPending ? (\n <span className=\"flex items-center gap-2\">\n <span className=\"inline-block w-3 h-3 border-2 border-text-inverse border-t-transparent rounded-full animate-spin\" />\n Running...\n </span>\n ) : (\n <span className=\"flex items-center gap-1.5\">\n <Play className=\"w-3 h-3\" fill=\"currentColor\" />\n Invoke\n </span>\n )}\n </button>\n </form>\n )}\n\n {/* Result */}\n {invokeResult && (\n <div className=\"space-y-4\">\n <InvokeResultView\n result={invokeResult}\n showMetadata={showMetadata}\n onToggleMetadata={() => setShowMetadata(!showMetadata)}\n traceUrl={settings?.telemetry?.traceUrl}\n namespace={wf.app_id}\n />\n <button\n onClick={() => { setInvokeResult(null); invokeMutation.reset(); }}\n className=\"text-xs text-accent hover:underline\"\n >\n Run again\n </button>\n </div>\n )}\n </div>\n </CollapsibleSection>\n );\n}\n","import { useState, useEffect, useRef } from 'react';\nimport { useParams, Link, useSearchParams } from 'react-router-dom';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { Play } from 'lucide-react';\nimport { TagInput } from '../../../components/common/form/TagInput';\nimport {\n useYamlWorkflow,\n useDeployYamlWorkflow,\n useActivateYamlWorkflow,\n useInvokeYamlWorkflow,\n useArchiveYamlWorkflow,\n useDeleteYamlWorkflow,\n useRegenerateYamlWorkflow,\n useUpdateYamlWorkflow,\n useYamlWorkflowVersions,\n useYamlWorkflowVersion,\n} from '../../../api/yaml-workflows';\nimport { StatusBadge } from '../../../components/common/display/StatusBadge';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { Field } from '../../../components/common/data/Field';\nimport { CollapsibleSection } from '../../../components/common/layout/CollapsibleSection';\nimport { useSettings } from '../../../api/settings';\nimport { buildSkeleton } from './helpers';\nimport type { Section } from './helpers';\nimport { PipelineStrip, StepDetail } from './PipelineStrip';\nimport { LifecycleSidebar } from './LifecycleSidebar';\nimport { InvokeSection } from './InvokeSection';\nimport { ConfigurationSection } from './ConfigurationSection';\nimport { VersionHistory } from './VersionHistory';\n\n// Status values (draft, deployed, active, archived) are passed directly\n// to StatusBadge which handles styling and labels natively.\n\nexport function YamlWorkflowDetailPage() {\n const { id } = useParams<{ id: string }>();\n const [searchParams, setSearchParams] = useSearchParams();\n const queryClient = useQueryClient();\n const { data: wf, isLoading, refetch } = useYamlWorkflow(id!);\n const { data: settings } = useSettings();\n const deployMutation = useDeployYamlWorkflow();\n const activateMutation = useActivateYamlWorkflow();\n const invokeMutation = useInvokeYamlWorkflow();\n const archiveMutation = useArchiveYamlWorkflow();\n const deleteMutation = useDeleteYamlWorkflow();\n const regenerateMutation = useRegenerateYamlWorkflow();\n const updateMutation = useUpdateYamlWorkflow();\n const [invokeFields, setInvokeFields] = useState<Record<string, any>>({});\n const [invokeJsonMode, setInvokeJsonMode] = useState(false);\n const [invokeJson, setInvokeJson] = useState('{}');\n const [invokeResult, setInvokeResult] = useState<Record<string, unknown> | null>(null);\n const [showMetadata, setShowMetadata] = useState(false);\n const [openSection, setOpenSection] = useState<Section | null>('tools');\n const [selectedStep, setSelectedStep] = useState(0);\n\n // ── Version browsing ──────────────────────────────────────────\n const versionParam = searchParams.get('version');\n const viewingVersion = versionParam ? parseInt(versionParam, 10) : null;\n const isViewingHistory = viewingVersion !== null && wf && viewingVersion !== wf.content_version;\n const { data: versionsData } = useYamlWorkflowVersions(id!);\n const { data: versionSnapshot } = useYamlWorkflowVersion(id!, isViewingHistory ? viewingVersion : null);\n\n // Resolved data: use version snapshot if viewing history, otherwise current\n const resolvedManifest = isViewingHistory && versionSnapshot ? versionSnapshot.activity_manifest : wf?.activity_manifest;\n const resolvedInputSchema = isViewingHistory && versionSnapshot ? versionSnapshot.input_schema : wf?.input_schema;\n const resolvedOutputSchema = isViewingHistory && versionSnapshot ? versionSnapshot.output_schema : wf?.output_schema;\n const resolvedYaml = isViewingHistory && versionSnapshot ? versionSnapshot.yaml_content : wf?.yaml_content;\n\n // ── Configuration editing state ─────────────────────────────\n const [yamlDraft, setYamlDraft] = useState('');\n const [inputSchemaDraft, setInputSchemaDraft] = useState('');\n const [outputSchemaDraft, setOutputSchemaDraft] = useState('');\n const [inputFieldMetaDraft, setInputFieldMetaDraft] = useState<import('../../../api/types').InputFieldMeta[]>([]);\n const [configEditing, setConfigEditing] = useState(false);\n const yamlTextareaRef = useRef<HTMLTextAreaElement>(null);\n\n useEffect(() => {\n if (wf?.yaml_content) setYamlDraft(wf.yaml_content);\n if (wf?.input_schema) setInputSchemaDraft(JSON.stringify(wf.input_schema, null, 2));\n if (wf?.output_schema) setOutputSchemaDraft(JSON.stringify(wf.output_schema, null, 2));\n if (wf?.input_field_meta) setInputFieldMetaDraft(wf.input_field_meta);\n }, [wf?.id, wf?.yaml_content, wf?.input_schema, wf?.output_schema, wf?.input_field_meta]);\n\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]); // eslint-disable-line react-hooks/exhaustive-deps\n\n if (isLoading) {\n return (\n <div className=\"animate-pulse space-y-4\">\n <div className=\"h-8 bg-surface-sunken rounded w-48\" />\n <div className=\"h-60 bg-surface-sunken rounded\" />\n </div>\n );\n }\n\n if (!wf) {\n return <p className=\"text-sm text-text-secondary\">Workflow server not found.</p>;\n }\n\n const workerActivities = (resolvedManifest ?? wf.activity_manifest).filter((a) => a.type === 'worker');\n const lifecycleError =\n deployMutation.error?.message || activateMutation.error?.message ||\n archiveMutation.error?.message || deleteMutation.error?.message ||\n regenerateMutation.error?.message;\n const lifecyclePending =\n deployMutation.isPending || activateMutation.isPending ||\n archiveMutation.isPending || deleteMutation.isPending ||\n regenerateMutation.isPending;\n\n const handleDeploy = async () => { await deployMutation.mutateAsync(wf.id); refetch(); };\n\n const handleArchive = async () => {\n if (!confirm('Archive this workflow server? It will no longer accept invocations.')) return;\n await archiveMutation.mutateAsync(wf.id); refetch();\n };\n const handleDelete = async () => {\n if (!confirm('Delete this workflow server permanently?')) return;\n await deleteMutation.mutateAsync(wf.id);\n };\n const handleRegenerate = async () => {\n if (!confirm('Re-generate from the source execution? This will overwrite the current definition.')) return;\n await regenerateMutation.mutateAsync({ id: wf.id }); refetch();\n };\n const handleSaveConfig = async () => {\n let inputSchema: Record<string, unknown> | undefined;\n let outputSchema: Record<string, unknown> | undefined;\n try { inputSchema = JSON.parse(inputSchemaDraft); } catch { /* keep current */ }\n try { outputSchema = JSON.parse(outputSchemaDraft); } catch { /* keep current */ }\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 const handleCancelEdit = () => {\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 const handleInvoke = async () => {\n setInvokeResult(null);\n try {\n const data = invokeJsonMode ? JSON.parse(invokeJson) : invokeFields;\n const result = await invokeMutation.mutateAsync({ id: wf.id, data, sync: true });\n setInvokeResult(result);\n } catch (err: any) {\n setInvokeResult({ error: err.message });\n }\n };\n\n const isActive = wf.status === 'active' || wf.status === 'deployed';\n const canEditConfig = wf.status !== 'archived' && !isViewingHistory;\n const showInvoke = isActive && !isViewingHistory;\n const toggleSection = (key: string) => setOpenSection(openSection === key ? null : key as Section);\n\n return (\n <div>\n <PageHeader\n title=\"Workflow Tool\"\n actions={\n wf.status === 'draft' && !isViewingHistory ? (\n <button\n onClick={handleDeploy}\n disabled={lifecyclePending}\n className=\"group flex items-center gap-2 text-left\"\n >\n <span className=\"flex items-center justify-center w-5 h-5 rounded-full bg-accent/10 text-accent shrink-0\">\n <svg className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9.663 17h4.674M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z\" />\n </svg>\n </span>\n <span className=\"text-xs text-text-secondary group-hover:text-text-primary transition-colors\">\n <span className=\"inline-flex items-center px-2 py-0.5 rounded bg-accent/10 text-accent font-medium group-hover:bg-accent/20 transition-colors mr-1\">Deploy</span>\n {' '}to register <span className=\"font-mono font-medium text-text-primary\">{wf.app_id}/{wf.graph_topic}</span> as an MCP Workflow Tool.\n </span>\n </button>\n ) : undefined\n }\n />\n\n {/* History banner */}\n {isViewingHistory && (\n <div className=\"mb-6 px-4 py-3 rounded-md bg-purple-500/10 border border-purple-500/20 flex items-center justify-between\">\n <p className=\"text-xs text-text-primary\">\n Viewing version <span className=\"font-mono font-medium\">{viewingVersion}</span>\n {versionSnapshot?.change_summary && (\n <span className=\"text-text-tertiary ml-2\">— {versionSnapshot.change_summary}</span>\n )}\n <span className=\"ml-2 text-text-tertiary\">(read-only)</span>\n </p>\n <button\n onClick={() => { const next = new URLSearchParams(searchParams); next.delete('version'); setSearchParams(next); }}\n className=\"text-xs text-accent hover:underline\"\n >\n Back to current\n </button>\n </div>\n )}\n\n <div className=\"grid grid-cols-1 lg:grid-cols-[1fr_220px] gap-12\">\n {/* ── Left: main content ─────────────────────────── */}\n <div>\n {/* Header card */}\n <div className=\"bg-surface-raised border border-surface-border rounded-md p-5 mb-8\">\n <div className=\"flex items-center gap-4 mb-4\">\n <h2 className=\"text-lg font-medium text-text-primary font-mono truncate flex-1\">{wf.name}</h2>\n <StatusBadge status={wf.status} />\n {isActive && !isViewingHistory && (\n <button\n type=\"button\"\n onClick={() => setOpenSection('invoke')}\n className=\"flex items-center gap-1.5 px-3 py-1.5 rounded-md bg-emerald-500/10 text-emerald-600 border border-emerald-500/20 text-xs font-medium hover:bg-emerald-500/20 transition-colors\"\n >\n <Play className=\"w-3 h-3\" />\n Invoke\n </button>\n )}\n </div>\n\n {wf.description && <p className=\"text-xs text-text-secondary mb-4\">{wf.description}</p>}\n\n <div className=\"grid grid-cols-2 sm:grid-cols-4 gap-y-3 gap-x-8\">\n <Field label=\"Tool Server\" value={<span className=\"font-mono text-xs\">{wf.app_id}</span>} />\n <Field label=\"Pipeline Tool\" value={<span className=\"font-mono text-xs\">{wf.graph_topic}</span>} />\n <Field label=\"Version\" value={\n <span className=\"font-mono text-xs\">\n {wf.app_version}\n {versionsData && versionsData.total > 1 && (\n <span className=\"text-text-tertiary ml-1\">(v{wf.content_version})</span>\n )}\n </span>\n } />\n <Field label=\"Tool Calls\" value={<span className=\"text-xs\">{workerActivities.length}</span>} />\n {wf.source_workflow_id && (\n <>\n <Field label=\"Compiled From Workflow\" value={\n <Link to={`/workflows/executions/${wf.source_workflow_id}`} className=\"font-mono text-xs text-accent hover:underline\">\n {wf.source_workflow_id}\n </Link>\n } />\n <Field label=\"\" value={\n <Link to={`/mcp/queries/${wf.source_workflow_id}`} className=\"text-xs text-accent hover:underline\">\n Open in Compilation Wizard\n </Link>\n } />\n </>\n )}\n <Field label=\"Invocations\" value={\n <Link to={`/mcp/executions?entity=${encodeURIComponent(wf.graph_topic)}&namespace=${encodeURIComponent(wf.app_id)}`} className=\"text-xs text-accent hover:underline\">\n View runs\n </Link>\n } />\n <Field label=\"Created\" value={<span className=\"text-xs\">{new Date(wf.created_at).toLocaleString()}</span>} />\n </div>\n\n {/* Tags */}\n <div className=\"mt-4 pt-4 border-t border-surface-border\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-2\">Tags</p>\n {wf.status !== 'archived' ? (\n <TagInput\n tags={wf.tags ?? []}\n onChange={(next) => {\n // Optimistically update the cache so the UI reflects instantly\n queryClient.setQueryData(['yamlWorkflows', wf.id], { ...wf, tags: next });\n updateMutation.mutate({ id: wf.id, tags: next });\n }}\n placeholder=\"Add tags for tool discovery...\"\n />\n ) : (\n <div className=\"flex flex-wrap gap-1.5\">\n {(wf.tags ?? []).length > 0 ? (\n (wf.tags ?? []).map((tag) => (\n <span key={tag} className=\"inline-flex items-center px-2 py-0.5 rounded-full bg-accent/10 text-accent text-[11px] font-medium\">\n {tag}\n </span>\n ))\n ) : (\n <span className=\"text-xs text-text-tertiary\">No tags</span>\n )}\n </div>\n )}\n </div>\n </div>\n\n {/* ── Collapsible sections ─────────────────────── */}\n <div className=\"space-y-6\">\n\n {/* ── Invoke / Try ────────────────────────────── */}\n {showInvoke && (\n <InvokeSection\n wf={wf}\n inputSchema={resolvedInputSchema}\n invokeFields={invokeFields}\n setInvokeFields={setInvokeFields}\n invokeJson={invokeJson}\n setInvokeJson={setInvokeJson}\n invokeJsonMode={invokeJsonMode}\n setInvokeJsonMode={setInvokeJsonMode}\n invokeResult={invokeResult}\n setInvokeResult={setInvokeResult}\n showMetadata={showMetadata}\n setShowMetadata={setShowMetadata}\n invokeMutation={invokeMutation}\n inputFieldMeta={wf.input_field_meta}\n settings={settings}\n onInvoke={handleInvoke}\n isCollapsed={openSection !== 'invoke'}\n onToggle={toggleSection}\n />\n )}\n\n {/* ── Tools ──────────────────────────────────── */}\n <CollapsibleSection sectionKey=\"tools\" title=\"Tools\" isCollapsed={openSection !== 'tools'} onToggle={toggleSection} >\n <div className=\"space-y-4\">\n <PipelineStrip\n activities={workerActivities}\n selectedIdx={selectedStep}\n onSelect={setSelectedStep}\n />\n\n {workerActivities[selectedStep] && (\n <StepDetail activity={workerActivities[selectedStep]} />\n )}\n </div>\n </CollapsibleSection>\n\n {/* ── Config ─────────────────────────────────── */}\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={openSection !== 'config'}\n onToggle={toggleSection}\n />\n\n </div>\n </div>\n\n {/* ── Right sidebar: lifecycle ────────────────────── */}\n <div className=\"lg:border-l lg:border-surface-border lg:pl-8 space-y-8\">\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\n onArchive={handleArchive}\n onDelete={handleDelete}\n onRegenerate={handleRegenerate}\n isPending={lifecyclePending}\n error={lifecycleError}\n />\n\n {/* Version history */}\n {versionsData && versionsData.versions.length > 1 && (\n <VersionHistory\n versionsData={versionsData}\n searchParams={searchParams}\n setSearchParams={setSearchParams}\n currentVersion={wf.content_version}\n viewingVersion={viewingVersion}\n />\n )}\n </div>\n </div>\n </div>\n );\n}\n"],"names":["PipelineStrip","activities","selectedIdx","onSelect","jsx","a","idx","isSelected","jsxs","StepDetail","activity","hasInputs","hasOutputs","isLlm","serverId","toolDisplay","toolIsLinkable","sourceColor","sourceLabel","Link","k","v","f","JsonViewer","InvokeResultView","result","showMetadata","onToggleMetadata","traceUrl","namespace","raw","jobId","hasEnvelope","displayData","Collapsible","b","order","metadataLabels","key","val","formatMetadataValue","InvokeSection","wf","inputSchema","invokeFields","setInvokeFields","invokeJson","setInvokeJson","invokeJsonMode","setInvokeJsonMode","invokeResult","setInvokeResult","setShowMetadata","invokeMutation","inputFieldMeta","settings","onInvoke","isCollapsed","onToggle","inputProps","allKeys","hasFieldMeta","showFixedFields","setShowFixedFields","useState","dynamicKeys","fixedKeys","inputKeys","updateField","value","type","parsed","updated","CollapsibleSection","e","SectionLabel","prop","fieldType","inferFieldType","desc","jsonValue","textareaRows","_b","_a","Play","YamlWorkflowDetailPage","id","useParams","searchParams","setSearchParams","useSearchParams","queryClient","useQueryClient","isLoading","refetch","useYamlWorkflow","useSettings","deployMutation","useDeployYamlWorkflow","activateMutation","useActivateYamlWorkflow","useInvokeYamlWorkflow","archiveMutation","useArchiveYamlWorkflow","deleteMutation","useDeleteYamlWorkflow","regenerateMutation","useRegenerateYamlWorkflow","updateMutation","useUpdateYamlWorkflow","openSection","setOpenSection","selectedStep","setSelectedStep","versionParam","viewingVersion","isViewingHistory","versionsData","useYamlWorkflowVersions","versionSnapshot","useYamlWorkflowVersion","resolvedManifest","resolvedInputSchema","resolvedOutputSchema","resolvedYaml","yamlDraft","setYamlDraft","inputSchemaDraft","setInputSchemaDraft","outputSchemaDraft","setOutputSchemaDraft","inputFieldMetaDraft","setInputFieldMetaDraft","configEditing","setConfigEditing","yamlTextareaRef","useRef","useEffect","skeleton","buildSkeleton","workerActivities","lifecycleError","_c","_d","_e","lifecyclePending","handleDeploy","handleArchive","handleDelete","handleRegenerate","handleSaveConfig","outputSchema","handleCancelEdit","handleInvoke","data","err","isActive","canEditConfig","showInvoke","toggleSection","PageHeader","next","StatusBadge","Field","Fragment","TagInput","tag","ConfigurationSection","LifecycleSidebar","VersionHistory"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{a as x,j as e}from"./vendor-query-B2UbickB.js";import{l as _,u as T}from"./yaml-workflows-BL4V5CQy.js";import{u as I}from"./useFilterParams-BaXUAkYK.js";import{S as C}from"./StatusBadge-TlC4jiig.js";import{P as v}from"./PageHeader-CpWFly5S.js";import{F as L,a as P,b as N}from"./FilterBar-Ck4K4rzu.js";import{E}from"./EmptyState-2CmV-IaS.js";import{M as R}from"./Modal-B4rbIVAn.js";import{u as $}from"./useYamlActivityEvents-BO51u8tm.js";import{b as w}from"./helpers-0gSleuzT.js";import{o as M,t as A,P as S,u as O}from"./vendor-icons-ZTAKVwGc.js";import{L as z,b as J}from"./vendor-react-Cw8Gy8NJ.js";import"./index-D8VH6K8B.js";const k={mcp:{border:"border-blue-500",text:"text-blue-500",icon:"MCP"},db:{border:"border-blue-500",text:"text-blue-500",icon:"DB"},llm:{border:"border-violet-500",text:"text-violet-500",icon:"LLM"},transform:{border:"border-emerald-500",text:"text-emerald-500",icon:"Map"}};function W({steps:o,manifest:a,isComplete:r}){const s=a.filter(t=>t.type==="worker"),c=s.length,n=s.map(t=>{const i=o.find(h=>h.activityId===t.activity_id),d=t.tool_source||"mcp",p=k[d]||k.mcp;return{activityId:t.activity_id,title:t.title||t.mcp_tool_name||t.activity_id,toolName:t.mcp_tool_name,colors:p,status:(i==null?void 0:i.status)||"pending",error:i==null?void 0:i.error}});return e.jsxs("div",{children:[e.jsx("p",{className:"text-xs text-text-secondary mb-4",children:r?`All ${c} steps completed`:`Running step ${n.filter(t=>t.status==="completed").length+1} of ${c}...`}),e.jsx("div",{className:"space-y-0",children:n.map((t,i)=>{const d=i===n.length-1;return e.jsxs("div",{className:"flex items-stretch gap-3",children:[e.jsxs("div",{className:"flex flex-col items-center w-5 shrink-0",children:[e.jsx("span",{className:`w-3 h-3 rounded-full shrink-0 border-2 transition-colors ${t.status==="completed"?"bg-status-success border-status-success":t.status==="running"?`${t.colors.border} bg-transparent animate-pulse`:t.status==="failed"?"bg-status-error border-status-error":"bg-surface-sunken border-surface-border"}`}),!d&&e.jsx("span",{className:`w-px flex-1 transition-colors ${t.status==="completed"?"bg-status-success/30":"bg-surface-border"}`})]}),e.jsxs("div",{className:`pb-4 ${d?"pb-0":""}`,children:[e.jsx("p",{className:`text-xs font-medium ${t.status==="running"?"text-text-primary":t.status==="completed"?"text-text-secondary":t.status==="failed"?"text-status-error":"text-text-tertiary"}`,children:t.title}),e.jsxs("div",{className:"flex items-center gap-2 mt-0.5",children:[e.jsx("span",{className:`text-[9px] font-mono px-1 py-0.5 rounded border ${t.colors.border} ${t.colors.text} bg-transparent`,children:t.colors.icon}),t.toolName&&e.jsx("span",{className:"text-[10px] text-text-tertiary font-mono",children:t.toolName})]}),t.error&&e.jsx("p",{className:"text-[10px] text-status-error mt-1",children:t.error})]})]},t.activityId)})})]})}function F({open:o,onClose:a,workflow:r}){const s=_(),[c,n]=x.useState(()=>JSON.stringify(w(r.input_schema),null,2)),[t,i]=x.useState(""),[d,p]=x.useState(null),[h,m]=x.useState(null),{steps:g,isComplete:j}=$(d);x.useEffect(()=>{o&&(p(null),m(null),i(""),s.reset(),n(JSON.stringify(w(r.input_schema),null,2)))},[o,r.id]),x.useEffect(()=>{if(j&&d){const b=d,y=setTimeout(()=>{m({jobId:b,data:null}),p(null)},800);return()=>clearTimeout(y)}},[j,d]);const l=async()=>{i(""),m(null);let b;try{b=JSON.parse(c)}catch{i("Invalid JSON");return}try{const y=await s.mutateAsync({id:r.id,data:b,sync:!1});y.job_id&&p(y.job_id)}catch{}},u=!!d,f=r.app_id||"longtail";return e.jsx(R,{open:o,onClose:()=>{u||a()},title:u?"Executing...":`Try ${r.graph_topic}`,maxWidth:"max-w-lg",children:u?e.jsx(W,{steps:g,manifest:r.activity_manifest,isComplete:j}):h?e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("svg",{className:"w-4 h-4 text-status-success",viewBox:"0 0 16 16",fill:"currentColor",children:e.jsx("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"})}),e.jsx("p",{className:"text-xs font-medium text-status-success",children:"Workflow completed"})]}),e.jsxs(z,{to:`/mcp/executions/${encodeURIComponent(h.jobId)}?namespace=${encodeURIComponent(f)}`,className:"inline-flex items-center gap-1.5 text-xs text-accent hover:underline",children:[e.jsx(M,{size:12}),"View execution details"]}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2 border-t border-surface-border",children:[e.jsx("button",{onClick:a,className:"btn-ghost text-xs",children:"Close"}),e.jsxs("button",{onClick:()=>{m(null)},className:"btn-primary text-xs inline-flex items-center gap-1.5",children:[e.jsx(A,{size:12})," Run again"]})]})]}):e.jsxs("div",{className:"flex flex-col gap-4",children:[r.description&&e.jsx("p",{className:"text-xs text-text-secondary",children:r.description}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Input"}),e.jsx("textarea",{value:c,onChange:b=>n(b.target.value),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",rows:8,spellCheck:!1}),t&&e.jsx("p",{className:"text-xs text-status-error mt-1",children:t})]}),s.isError&&e.jsx("div",{className:"bg-status-error/10 border border-status-error/20 rounded-md px-3 py-2",children:e.jsx("p",{className:"text-xs text-status-error",children:s.error instanceof Error?s.error.message:"Invocation failed"})}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2 border-t border-surface-border",children:[e.jsx("button",{onClick:a,className:"btn-ghost text-xs",children:"Close"}),e.jsx("button",{onClick:l,disabled:s.isPending,className:"btn-primary text-xs disabled:opacity-50 inline-flex items-center gap-1.5",children:s.isPending?"Starting...":e.jsxs(e.Fragment,{children:[e.jsx(S,{size:12})," Run"]})})]})]})})}function B(o){const a=new Map;for(const r of o){const s=a.get(r.app_id)??[];s.push(r),a.set(r.app_id,s)}return[...a.entries()].map(([r,s])=>{const c={active:0,deployed:1,draft:2,archived:3},n=s.reduce((i,d)=>(c[d.status]??9)<(c[i]??9)?d.status:i,s[0].status),t=s.reduce((i,d)=>d.updated_at>i?d.updated_at:i,s[0].updated_at);return{appId:r,workflows:s,toolCount:s.length,status:n,updatedAt:t}})}function D(o,a){if(!a)return!0;const r=a.toLowerCase();return o.appId.toLowerCase().includes(r)?!0:o.workflows.some(s=>{var c,n;return s.graph_topic.toLowerCase().includes(r)||((c=s.name)==null?void 0:c.toLowerCase().includes(r))||((n=s.description)==null?void 0:n.toLowerCase().includes(r))})}function q(o,a){if(!a)return o;const r=a.toLowerCase();return o.filter(s=>{var c,n;return s.graph_topic.toLowerCase().includes(r)||((c=s.name)==null?void 0:c.toLowerCase().includes(r))||((n=s.description)==null?void 0:n.toLowerCase().includes(r))})}function U({wf:o,onClick:a,onTry:r}){const s=o.status==="active";return e.jsxs("div",{onClick:a,className:"group/row flex items-center cursor-pointer hover:bg-surface-hover/50 transition-colors border-b border-surface-border/30",children:[e.jsxs("div",{className:"flex-1 pl-14 pr-6 py-2 min-w-0",children:[e.jsx("code",{className:"text-xs font-mono text-accent-primary truncate block",children:o.graph_topic}),o.description&&e.jsx("p",{className:"text-[10px] text-text-tertiary mt-0.5 line-clamp-1",children:o.description})]}),e.jsx("div",{className:"w-28 px-6 py-2 whitespace-nowrap shrink-0",children:e.jsx(C,{status:o.status})}),e.jsx("div",{className:"w-12 px-3 py-2 flex justify-end shrink-0",children:s&&e.jsx("button",{onClick:c=>{c.stopPropagation(),r()},className:"opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-accent",title:"Try tool",children:e.jsx(S,{className:"w-[18px] h-[18px]",strokeWidth:1.5})})})]})}function Y({server:o,expanded:a,onToggle:r,onToolClick:s,onTryTool:c,visibleTools:n}){return e.jsxs(e.Fragment,{children:[e.jsxs("tr",{onClick:r,className:"group/row border-b transition-colors duration-100 cursor-pointer row-hover",children:[e.jsx("td",{className:"px-6 py-3.5",children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:`transition-transform duration-150 ${a?"rotate-90":""} text-text-tertiary`,children:e.jsx(O,{size:14})}),e.jsx("p",{className:"text-sm text-text-primary font-medium font-mono",children:o.appId})]})}),e.jsx("td",{className:"px-6 py-3.5 w-28 whitespace-nowrap",children:e.jsx(C,{status:o.status})}),e.jsx("td",{className:"w-12 text-center",children:e.jsx("span",{className:"inline-flex items-center justify-center w-5 h-5 rounded-full border border-accent/30 text-[10px] font-medium text-accent",children:o.toolCount})})]}),e.jsx("tr",{children:e.jsx("td",{colSpan:5,className:"p-0 border-0",children:e.jsx("div",{className:"grid transition-[grid-template-rows] duration-200 ease-in-out",style:{gridTemplateRows:a?"1fr":"0fr"},children:e.jsxs("div",{className:"overflow-hidden",children:[n.map(t=>e.jsx(U,{wf:t,onClick:()=>s(t),onTry:()=>c(t)},t.id)),e.jsx("div",{className:"h-1 bg-surface-sunken/20"})]})})})})]})}function ne(){const o=J(),{filters:a,setFilter:r}=I({filters:{status:"",server:"",search:""}}),{data:s,isLoading:c}=T({status:a.status||void 0,app_id:a.server||void 0,search:a.search||void 0,limit:200,offset:0}),n=(s==null?void 0:s.workflows)??[],t=x.useMemo(()=>B(n),[n]),i=x.useMemo(()=>[...new Set(n.map(u=>u.app_id))].sort().map(u=>({value:u,label:u})),[n]),d=x.useMemo(()=>a.search?t.filter(l=>D(l,a.search)):t,[t,a.search]),[p,h]=x.useState(new Set),[m,g]=x.useState(null),j=l=>{h(u=>{const f=new Set(u);return f.has(l)?f.delete(l):f.add(l),f})};return c?e.jsxs("div",{children:[e.jsx(v,{title:"MCP Pipeline Tools"}),e.jsx("div",{className:"animate-pulse space-y-0",children:Array.from({length:4}).map((l,u)=>e.jsx("div",{className:"h-14 border-b last:border-b-0 px-6 flex items-center",children:e.jsx("div",{className:"h-3 bg-surface-sunken rounded w-full"})},u))})]}):e.jsxs("div",{children:[e.jsx(v,{title:"MCP Pipeline Tools",actions:e.jsx("button",{onClick:()=>o("/mcp/queries"),className:"btn-primary text-xs",children:"Design Pipeline"})}),e.jsx("p",{className:"text-sm text-text-secondary mb-6 max-w-2xl leading-relaxed",children:"Compiled from successful triage runs. Each workflow is a deterministic tool."}),e.jsxs(L,{children:[e.jsx(P,{label:"Search",value:a.search,onChange:l=>r("search",l),placeholder:"Server or tool name…"}),i.length>1&&e.jsx(N,{label:"Server",value:a.server,onChange:l=>r("server",l),options:i}),e.jsx(N,{label:"Status",value:a.status,onChange:l=>r("status",l),options:[{value:"draft",label:"Draft"},{value:"deployed",label:"Deployed"},{value:"active",label:"Active"},{value:"archived",label:"Archived"}]})]}),d.length===0?e.jsx(E,{title:"No pipelines yet",description:"Use the Pipeline Designer to create your first MCP pipeline."}):e.jsxs("table",{className:"w-full",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b",children:[e.jsx("th",{className:"sticky top-[2.75rem] z-10 bg-surface px-6 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Server / Tool"}),e.jsx("th",{className:"sticky top-[2.75rem] z-10 bg-surface px-6 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary w-28",children:"Status"}),e.jsx("th",{className:"sticky top-[2.75rem] z-10 bg-surface w-12"})]})}),e.jsx("tbody",{children:d.map(l=>e.jsx(Y,{server:l,expanded:p.has(l.appId),onToggle:()=>j(l.appId),onToolClick:u=>o(u.source_workflow_id?`/mcp/queries/${u.source_workflow_id}`:`/mcp/workflows/${u.id}`),onTryTool:u=>g(u),visibleTools:q(l.workflows,a.search)},l.appId))})]}),m&&e.jsx(F,{open:!!m,onClose:()=>g(null),workflow:m})]})}export{ne as YamlWorkflowsPage};
2
+ //# sourceMappingURL=YamlWorkflowsPage-COqiNCQK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"YamlWorkflowsPage-COqiNCQK.js","sources":["../../src/pages/workflows/yaml-workflow-detail/TryWorkflowModal.tsx","../../src/pages/workflows/yaml-helpers.ts","../../src/pages/workflows/YamlWorkflowsPage.tsx"],"sourcesContent":["import { useState, useEffect } from 'react';\nimport { Link } from 'react-router-dom';\nimport { Play, RotateCcw, ExternalLink } from 'lucide-react';\n\nimport { Modal } from '../../../components/common/modal/Modal';\nimport { useInvokeYamlWorkflow } from '../../../api/yaml-workflows';\nimport { useYamlActivityEvents } from '../../../hooks/useYamlActivityEvents';\nimport type { LTYamlWorkflowRecord, ActivityManifestEntry } from '../../../api/types';\nimport { buildSkeleton } from './helpers';\n\n// ── Tool source colors (matches TestPanel pattern) ───────────────────────────\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\n// ── Live timeline ────────────────────────────────────────────────────────────\n\nfunction LiveTimeline({\n steps,\n manifest,\n isComplete,\n}: {\n steps: import('../../../hooks/useYamlActivityEvents').ActivityStep[];\n manifest: ActivityManifestEntry[];\n isComplete: boolean;\n}) {\n const workerActivities = manifest.filter((a) => a.type === 'worker');\n const totalSteps = workerActivities.length;\n\n const merged = workerActivities.map((a) => {\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 colors,\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 <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 <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 <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 </div>\n );\n}\n\n// ── Modal ────────────────────────────────────────────────────────────────────\n\ninterface TryWorkflowModalProps {\n open: boolean;\n onClose: () => void;\n workflow: LTYamlWorkflowRecord;\n}\n\nexport function TryWorkflowModal({ open, onClose, workflow }: TryWorkflowModalProps) {\n const invokeMutation = useInvokeYamlWorkflow();\n const [argsJson, setArgsJson] = useState(() =>\n JSON.stringify(buildSkeleton(workflow.input_schema), null, 2),\n );\n const [jsonError, setJsonError] = useState('');\n const [activeJobId, setActiveJobId] = useState<string | null>(null);\n const [completedResult, setCompletedResult] = useState<{ jobId: string; data: unknown } | null>(null);\n const { steps, isComplete } = useYamlActivityEvents(activeJobId);\n\n // Reset state when modal opens with a new workflow\n useEffect(() => {\n if (open) {\n setActiveJobId(null);\n setCompletedResult(null);\n setJsonError('');\n invokeMutation.reset();\n setArgsJson(JSON.stringify(buildSkeleton(workflow.input_schema), null, 2));\n }\n }, [open, workflow.id]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // When job completes, transition from timeline to result view\n useEffect(() => {\n if (isComplete && activeJobId) {\n const jobId = activeJobId;\n const timer = setTimeout(() => {\n setCompletedResult({ jobId, data: null });\n setActiveJobId(null);\n }, 800);\n return () => clearTimeout(timer);\n }\n }, [isComplete, activeJobId]);\n\n const handleRun = async () => {\n setJsonError('');\n setCompletedResult(null);\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(argsJson);\n } catch {\n setJsonError('Invalid JSON');\n return;\n }\n try {\n const result = await invokeMutation.mutateAsync({ id: workflow.id, data: parsed, sync: false });\n if (result.job_id) {\n setActiveJobId(result.job_id);\n }\n } catch { /* error shown in modal */ }\n };\n\n const isRunning = !!activeJobId;\n const ns = workflow.app_id || 'longtail';\n\n return (\n <Modal\n open={open}\n onClose={() => { if (!isRunning) onClose(); }}\n title={isRunning ? 'Executing...' : `Try ${workflow.graph_topic}`}\n maxWidth=\"max-w-lg\"\n >\n {isRunning ? (\n /* ── Live timeline ── */\n <LiveTimeline\n steps={steps}\n manifest={workflow.activity_manifest}\n isComplete={isComplete}\n />\n ) : completedResult ? (\n /* ── Completed result ── */\n <div className=\"space-y-4\">\n <div className=\"flex items-center gap-2\">\n <svg className=\"w-4 h-4 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 <p className=\"text-xs font-medium text-status-success\">Workflow completed</p>\n </div>\n\n <Link\n to={`/mcp/executions/${encodeURIComponent(completedResult.jobId)}?namespace=${encodeURIComponent(ns)}`}\n className=\"inline-flex items-center gap-1.5 text-xs text-accent hover:underline\"\n >\n <ExternalLink size={12} />\n View execution details\n </Link>\n\n <div className=\"flex justify-end gap-3 pt-2 border-t border-surface-border\">\n <button onClick={onClose} className=\"btn-ghost text-xs\">Close</button>\n <button\n onClick={() => { setCompletedResult(null); }}\n className=\"btn-primary text-xs inline-flex items-center gap-1.5\"\n >\n <RotateCcw size={12} /> Run again\n </button>\n </div>\n </div>\n ) : (\n /* ── Input form ── */\n <div className=\"flex flex-col gap-4\">\n {workflow.description && (\n <p className=\"text-xs text-text-secondary\">{workflow.description}</p>\n )}\n\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Input\n </label>\n <textarea\n value={argsJson}\n onChange={(e) => setArgsJson(e.target.value)}\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\"\n rows={8}\n spellCheck={false}\n />\n {jsonError && <p className=\"text-xs text-status-error mt-1\">{jsonError}</p>}\n </div>\n\n {invokeMutation.isError && (\n <div className=\"bg-status-error/10 border border-status-error/20 rounded-md px-3 py-2\">\n <p className=\"text-xs text-status-error\">\n {invokeMutation.error instanceof Error ? invokeMutation.error.message : 'Invocation failed'}\n </p>\n </div>\n )}\n\n <div className=\"flex justify-end gap-3 pt-2 border-t border-surface-border\">\n <button onClick={onClose} className=\"btn-ghost text-xs\">Close</button>\n <button\n onClick={handleRun}\n disabled={invokeMutation.isPending}\n className=\"btn-primary text-xs disabled:opacity-50 inline-flex items-center gap-1.5\"\n >\n {invokeMutation.isPending ? 'Starting...' : <><Play size={12} /> Run</>}\n </button>\n </div>\n </div>\n )}\n </Modal>\n );\n}\n","import type { LTYamlWorkflowRecord } from '../../api/types';\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\nexport interface ProcessServer {\n appId: string;\n workflows: LTYamlWorkflowRecord[];\n toolCount: number;\n status: string;\n updatedAt: string;\n}\n\n// ── Grouping & filtering helpers ──────────────────────────────────────────────\n\nexport function groupByAppId(workflows: LTYamlWorkflowRecord[]): ProcessServer[] {\n const map = new Map<string, LTYamlWorkflowRecord[]>();\n for (const wf of workflows) {\n const list = map.get(wf.app_id) ?? [];\n list.push(wf);\n map.set(wf.app_id, list);\n }\n\n return [...map.entries()].map(([appId, wfs]) => {\n const statusPriority: Record<string, number> = { active: 0, deployed: 1, draft: 2, archived: 3 };\n const bestStatus = wfs.reduce(\n (best, wf) => ((statusPriority[wf.status] ?? 9) < (statusPriority[best] ?? 9) ? wf.status : best),\n wfs[0].status,\n );\n const latest = wfs.reduce((max, wf) => (wf.updated_at > max ? wf.updated_at : max), wfs[0].updated_at);\n\n return {\n appId,\n workflows: wfs,\n toolCount: wfs.length,\n status: bestStatus,\n updatedAt: latest,\n };\n });\n}\n\n/** Client-side search: match server name or any tool's graph_topic/description */\nexport function matchesSearch(server: ProcessServer, search: string): boolean {\n if (!search) return true;\n const q = search.toLowerCase();\n if (server.appId.toLowerCase().includes(q)) return true;\n return server.workflows.some(\n (wf) =>\n wf.graph_topic.toLowerCase().includes(q) ||\n wf.name?.toLowerCase().includes(q) ||\n wf.description?.toLowerCase().includes(q),\n );\n}\n\n/** Filter tools within a server that match the search term */\nexport function filterTools(workflows: LTYamlWorkflowRecord[], search: string): LTYamlWorkflowRecord[] {\n if (!search) return workflows;\n const q = search.toLowerCase();\n return workflows.filter(\n (wf) =>\n wf.graph_topic.toLowerCase().includes(q) ||\n wf.name?.toLowerCase().includes(q) ||\n wf.description?.toLowerCase().includes(q),\n );\n}\n","import { useState, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { ChevronRight, Play } from 'lucide-react';\nimport { useYamlWorkflows } from '../../api/yaml-workflows';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { StatusBadge } from '../../components/common/display/StatusBadge';\n\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { FilterBar, FilterSelect, FilterInput } from '../../components/common/data/FilterBar';\nimport { EmptyState } from '../../components/common/display/EmptyState';\nimport { TryWorkflowModal } from './yaml-workflow-detail/TryWorkflowModal';\nimport { groupByAppId, matchesSearch, filterTools, type ProcessServer } from './yaml-helpers';\nimport type { LTYamlWorkflowRecord } from '../../api/types';\n\n// ── Tool row (individual workflow inside expanded server) ─────────────────────\n\nfunction ToolRow({ wf, onClick, onTry }: { wf: LTYamlWorkflowRecord; onClick: () => void; onTry: () => void }) {\n const canTry = wf.status === 'active';\n\n return (\n <div onClick={onClick} className=\"group/row flex items-center cursor-pointer hover:bg-surface-hover/50 transition-colors border-b border-surface-border/30\">\n {/* Tool name — indented to align under server name */}\n <div className=\"flex-1 pl-14 pr-6 py-2 min-w-0\">\n <code className=\"text-xs font-mono text-accent-primary truncate block\">{wf.graph_topic}</code>\n {wf.description && (\n <p className=\"text-[10px] text-text-tertiary mt-0.5 line-clamp-1\">{wf.description}</p>\n )}\n </div>\n {/* Status */}\n <div className=\"w-28 px-6 py-2 whitespace-nowrap shrink-0\">\n <StatusBadge status={wf.status} />\n </div>\n {/* Try — hover-reveal icon */}\n <div className=\"w-12 px-3 py-2 flex justify-end shrink-0\">\n {canTry && (\n <button\n onClick={(e) => { e.stopPropagation(); onTry(); }}\n className=\"opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-accent\"\n title=\"Try tool\"\n >\n <Play className=\"w-[18px] h-[18px]\" strokeWidth={1.5} />\n </button>\n )}\n </div>\n </div>\n );\n}\n\n// ── Server row (expandable namespace) ────────────────────────────────────────\n\nfunction ServerRow({\n server,\n expanded,\n onToggle,\n onToolClick,\n onTryTool,\n visibleTools,\n}: {\n server: ProcessServer;\n expanded: boolean;\n onToggle: () => void;\n onToolClick: (wf: LTYamlWorkflowRecord) => void;\n onTryTool: (wf: LTYamlWorkflowRecord) => void;\n visibleTools: LTYamlWorkflowRecord[];\n}) {\n return (\n <>\n <tr\n onClick={onToggle}\n className=\"group/row border-b transition-colors duration-100 cursor-pointer row-hover\"\n >\n {/* Name + badge + timestamp */}\n <td className=\"px-6 py-3.5\">\n <div className=\"flex items-center gap-2\">\n <span className={`transition-transform duration-150 ${expanded ? 'rotate-90' : ''} text-text-tertiary`}>\n <ChevronRight size={14} />\n </span>\n <p className=\"text-sm text-text-primary font-medium font-mono\">{server.appId}</p>\n </div>\n </td>\n\n {/* Status */}\n <td className=\"px-6 py-3.5 w-28 whitespace-nowrap\">\n <StatusBadge status={server.status} />\n </td>\n\n {/* Tool count badge — aligned with child row hover icons */}\n <td className=\"w-12 text-center\">\n <span className=\"inline-flex items-center justify-center w-5 h-5 rounded-full border border-accent/30 text-[10px] font-medium text-accent\">\n {server.toolCount}\n </span>\n </td>\n </tr>\n\n {/* Expanded tool rows — no sub-header, aligned to outer columns */}\n <tr>\n <td colSpan={5} className=\"p-0 border-0\">\n <div\n className=\"grid transition-[grid-template-rows] duration-200 ease-in-out\"\n style={{ gridTemplateRows: expanded ? '1fr' : '0fr' }}\n >\n <div className=\"overflow-hidden\">\n {visibleTools.map((wf) => (\n <ToolRow key={wf.id} wf={wf} onClick={() => onToolClick(wf)} onTry={() => onTryTool(wf)} />\n ))}\n <div className=\"h-1 bg-surface-sunken/20\" />\n </div>\n </div>\n </td>\n </tr>\n </>\n );\n}\n\n// ── Page ──────────────────────────────────────────────────────────────────────\n\nexport function YamlWorkflowsPage() {\n const navigate = useNavigate();\n const { filters, setFilter } = useFilterParams({\n filters: { status: '', server: '', search: '' },\n });\n\n // Fetch a larger page to get all workflows for grouping\n const { data, isLoading } = useYamlWorkflows({\n status: (filters.status || undefined) as any,\n app_id: filters.server || undefined,\n search: filters.search || undefined,\n limit: 200,\n offset: 0,\n });\n\n const workflows = data?.workflows ?? [];\n\n const servers = useMemo(() => groupByAppId(workflows), [workflows]);\n\n // Build server options from unfiltered results; re-derive when status/search change\n const serverOptions = useMemo(() => {\n const ids = [...new Set(workflows.map((wf) => wf.app_id))].sort();\n return ids.map((id) => ({ value: id, label: id }));\n }, [workflows]);\n\n // Client-side search filtering for tool-level matches within expanded rows\n const filteredServers = useMemo(() => {\n if (!filters.search) return servers;\n return servers.filter((s) => matchesSearch(s, filters.search));\n }, [servers, filters.search]);\n\n const [expandedIds, setExpandedIds] = useState<Set<string>>(new Set());\n const [tryWorkflow, setTryWorkflow] = useState<LTYamlWorkflowRecord | null>(null);\n\n const toggleExpand = (appId: string) => {\n setExpandedIds((prev) => {\n const next = new Set(prev);\n if (next.has(appId)) next.delete(appId);\n else next.add(appId);\n return next;\n });\n };\n\n if (isLoading) {\n return (\n <div>\n <PageHeader title=\"MCP Pipeline Tools\" />\n <div className=\"animate-pulse space-y-0\">\n {Array.from({ length: 4 }).map((_, i) => (\n <div key={i} className=\"h-14 border-b last:border-b-0 px-6 flex items-center\">\n <div className=\"h-3 bg-surface-sunken rounded w-full\" />\n </div>\n ))}\n </div>\n </div>\n );\n }\n\n return (\n <div>\n <PageHeader\n title=\"MCP Pipeline Tools\"\n actions={\n <button onClick={() => navigate('/mcp/queries')} className=\"btn-primary text-xs\">\n Design Pipeline\n </button>\n }\n />\n\n <p className=\"text-sm text-text-secondary mb-6 max-w-2xl leading-relaxed\">\n Compiled from successful triage runs. Each workflow is a deterministic tool.\n </p>\n\n <FilterBar>\n <FilterInput\n label=\"Search\"\n value={filters.search}\n onChange={(v) => setFilter('search', v)}\n placeholder=\"Server or tool name…\"\n />\n {serverOptions.length > 1 && (\n <FilterSelect\n label=\"Server\"\n value={filters.server}\n onChange={(v) => setFilter('server', v)}\n options={serverOptions}\n />\n )}\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={[\n { value: 'draft', label: 'Draft' },\n { value: 'deployed', label: 'Deployed' },\n { value: 'active', label: 'Active' },\n { value: 'archived', label: 'Archived' },\n ]}\n />\n </FilterBar>\n\n {filteredServers.length === 0 ? (\n <EmptyState title=\"No pipelines yet\" description=\"Use the Pipeline Designer to create your first MCP pipeline.\" />\n ) : (\n <table className=\"w-full\">\n <thead>\n <tr className=\"border-b\">\n <th className=\"sticky top-[2.75rem] z-10 bg-surface px-6 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Server / Tool\n </th>\n <th className=\"sticky top-[2.75rem] z-10 bg-surface px-6 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary w-28\">\n Status\n </th>\n <th className=\"sticky top-[2.75rem] z-10 bg-surface w-12\" />\n </tr>\n </thead>\n <tbody>\n {filteredServers.map((server) => (\n <ServerRow\n key={server.appId}\n server={server}\n expanded={expandedIds.has(server.appId)}\n onToggle={() => toggleExpand(server.appId)}\n onToolClick={(wf) => navigate(\n wf.source_workflow_id\n ? `/mcp/queries/${wf.source_workflow_id}`\n : `/mcp/workflows/${wf.id}`\n )}\n onTryTool={(wf) => setTryWorkflow(wf)}\n visibleTools={filterTools(server.workflows, filters.search)}\n />\n ))}\n </tbody>\n </table>\n )}\n\n {tryWorkflow && (\n <TryWorkflowModal\n open={!!tryWorkflow}\n onClose={() => setTryWorkflow(null)}\n workflow={tryWorkflow}\n />\n )}\n </div>\n );\n}\n"],"names":["TOOL_SOURCE_COLORS","LiveTimeline","steps","manifest","isComplete","workerActivities","a","totalSteps","merged","live","s","source","colors","jsx","step","idx","isLast","jsxs","TryWorkflowModal","open","onClose","workflow","invokeMutation","useInvokeYamlWorkflow","argsJson","setArgsJson","useState","buildSkeleton","jsonError","setJsonError","activeJobId","setActiveJobId","completedResult","setCompletedResult","useYamlActivityEvents","useEffect","jobId","timer","handleRun","parsed","result","isRunning","ns","Modal","Link","ExternalLink","RotateCcw","e","Fragment","Play","groupByAppId","workflows","map","wf","list","appId","wfs","statusPriority","bestStatus","best","latest","max","matchesSearch","server","search","q","_a","_b","filterTools","ToolRow","onClick","onTry","canTry","StatusBadge","ServerRow","expanded","onToggle","onToolClick","onTryTool","visibleTools","ChevronRight","YamlWorkflowsPage","navigate","useNavigate","filters","setFilter","useFilterParams","data","isLoading","useYamlWorkflows","servers","useMemo","serverOptions","id","filteredServers","expandedIds","setExpandedIds","tryWorkflow","setTryWorkflow","toggleExpand","prev","next","PageHeader","_","i","FilterBar","FilterInput","v","FilterSelect","EmptyState"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{b as s,c as u,u as a}from"./vendor-query-B2UbickB.js";import{a as n}from"./index-D8VH6K8B.js";function y(e={}){const t=new URLSearchParams;return e.limit&&t.set("limit",String(e.limit)),e.offset!==void 0&&t.set("offset",String(e.offset)),a({queryKey:["bots",e],queryFn:()=>n(`/bot-accounts?${t}`)})}function d(e){return a({queryKey:["bots",e,"api-keys"],queryFn:()=>n(`/bot-accounts/${e}/api-keys`),enabled:!!e})}function b(){const e=s();return u({mutationFn:t=>n("/bot-accounts",{method:"POST",body:JSON.stringify(t)}),onSuccess:()=>{e.invalidateQueries({queryKey:["bots"]})}})}function m(){const e=s();return u({mutationFn:({id:t,...o})=>n(`/bot-accounts/${t}`,{method:"PUT",body:JSON.stringify(o)}),onSuccess:()=>{e.invalidateQueries({queryKey:["bots"]})}})}function f(){const e=s();return u({mutationFn:t=>n(`/bot-accounts/${t}`,{method:"DELETE"}),onSuccess:()=>{e.invalidateQueries({queryKey:["bots"]})}})}function l(){const e=s();return u({mutationFn:({botId:t,name:o,scopes:i})=>n(`/bot-accounts/${t}/api-keys`,{method:"POST",body:JSON.stringify({name:o,scopes:i})}),onSuccess:(t,o)=>{e.invalidateQueries({queryKey:["bots",o.botId,"api-keys"]})}})}function q(){const e=s();return u({mutationFn:({botId:t,keyId:o})=>n(`/bot-accounts/${t}/api-keys/${o}`,{method:"DELETE"}),onSuccess:(t,o)=>{e.invalidateQueries({queryKey:["bots",o.botId,"api-keys"]})}})}function S(){const e=s();return u({mutationFn:({botId:t,role:o,type:i})=>n(`/bot-accounts/${t}/roles`,{method:"POST",body:JSON.stringify({role:o,type:i})}),onSuccess:()=>{e.invalidateQueries({queryKey:["bots"]})}})}function p(){const e=s();return u({mutationFn:({botId:t,role:o})=>n(`/bot-accounts/${t}/roles/${encodeURIComponent(o)}`,{method:"DELETE"}),onSuccess:()=>{e.invalidateQueries({queryKey:["bots"]})}})}export{b as a,m as b,f as c,d,l as e,q as f,S as g,p as h,y as u};
2
+ //# sourceMappingURL=bots-BkKVMbUW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bots-BkKVMbUW.js","sources":["../../src/api/bots.ts"],"sourcesContent":["import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { apiFetch } from './client';\nimport type { BotRecord, BotApiKeyRecord } from './types';\nimport type { LTRoleType } from './types';\n\ninterface BotListResponse {\n bots: BotRecord[];\n total: number;\n}\n\ninterface BotFilters {\n limit?: number;\n offset?: number;\n}\n\n// ── Query hooks ──────────────────────────────────────────────────────────────\n\nexport function useBots(filters: BotFilters = {}) {\n const params = new URLSearchParams();\n if (filters.limit) params.set('limit', String(filters.limit));\n if (filters.offset !== undefined) params.set('offset', String(filters.offset));\n\n return useQuery<BotListResponse>({\n queryKey: ['bots', filters],\n queryFn: () => apiFetch(`/bot-accounts?${params}`),\n });\n}\n\nexport function useBotApiKeys(botId: string) {\n return useQuery<{ keys: BotApiKeyRecord[] }>({\n queryKey: ['bots', botId, 'api-keys'],\n queryFn: () => apiFetch(`/bot-accounts/${botId}/api-keys`),\n enabled: !!botId,\n });\n}\n\n// ── Mutation hooks ───────────────────────────────────────────────────────────\n\nexport function useCreateBot() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (data: {\n name: string;\n description?: string;\n display_name?: string;\n roles?: { role: string; type: LTRoleType }[];\n }) =>\n apiFetch('/bot-accounts', {\n method: 'POST',\n body: JSON.stringify(data),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['bots'] });\n },\n });\n}\n\nexport function useUpdateBot() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({\n id,\n ...data\n }: {\n id: string;\n display_name?: string;\n description?: string;\n status?: string;\n }) =>\n apiFetch(`/bot-accounts/${id}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['bots'] });\n },\n });\n}\n\nexport function useDeleteBot() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch(`/bot-accounts/${id}`, { method: 'DELETE' }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['bots'] });\n },\n });\n}\n\nexport function useCreateBotApiKey() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({\n botId,\n name,\n scopes,\n }: {\n botId: string;\n name: string;\n scopes?: string[];\n }) =>\n apiFetch<{ id: string; rawKey: string }>(`/bot-accounts/${botId}/api-keys`, {\n method: 'POST',\n body: JSON.stringify({ name, scopes }),\n }),\n onSuccess: (_data, vars) => {\n queryClient.invalidateQueries({ queryKey: ['bots', vars.botId, 'api-keys'] });\n },\n });\n}\n\nexport function useRevokeBotApiKey() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ botId, keyId }: { botId: string; keyId: string }) =>\n apiFetch(`/bot-accounts/${botId}/api-keys/${keyId}`, { method: 'DELETE' }),\n onSuccess: (_data, vars) => {\n queryClient.invalidateQueries({ queryKey: ['bots', vars.botId, 'api-keys'] });\n },\n });\n}\n\nexport function useAddBotRole() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({\n botId,\n role,\n type,\n }: {\n botId: string;\n role: string;\n type: LTRoleType;\n }) =>\n apiFetch(`/bot-accounts/${botId}/roles`, {\n method: 'POST',\n body: JSON.stringify({ role, type }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['bots'] });\n },\n });\n}\n\nexport function useRemoveBotRole() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ botId, role }: { botId: string; role: string }) =>\n apiFetch(`/bot-accounts/${botId}/roles/${encodeURIComponent(role)}`, {\n method: 'DELETE',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['bots'] });\n },\n });\n}\n"],"names":["useBots","filters","params","useQuery","apiFetch","useBotApiKeys","botId","useCreateBot","queryClient","useQueryClient","useMutation","data","useUpdateBot","id","useDeleteBot","useCreateBotApiKey","name","scopes","_data","vars","useRevokeBotApiKey","keyId","useAddBotRole","role","type","useRemoveBotRole"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ const e=[15,30,60,240];function r(a){if(a<60)return`${a} min`;const l=a/60;return Number.isInteger(l)?l===1?"1 hour":`${l} hours`:`${a} min`}const u=[{value:"1",label:"P1 — Critical"},{value:"2",label:"P2 — High"},{value:"3",label:"P3 — Normal"},{value:"4",label:"P4 — Low"}],s=[{value:"1 hour",label:"1 hour"},{value:"1 day",label:"1 day"},{value:"3 days",label:"3 days"},{value:"7 days",label:"7 days"},{value:"30 days",label:"30 days"},{value:"90 days",label:"90 days"}];export{e as D,u as P,s as R,r as f};
2
+ //# sourceMappingURL=constants-CgaZfe5d.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants-CgaZfe5d.js","sources":["../../src/lib/constants.ts"],"sourcesContent":["/** Fallback claim durations (minutes) when settings haven't loaded yet. */\nexport const DEFAULT_CLAIM_DURATIONS = [15, 30, 60, 240];\n\n/** Format a duration in minutes to a human-readable label. */\nexport function formatClaimDuration(minutes: number): string {\n if (minutes < 60) return `${minutes} min`;\n const hours = minutes / 60;\n if (Number.isInteger(hours)) return hours === 1 ? '1 hour' : `${hours} hours`;\n return `${minutes} min`;\n}\n\nexport const PRIORITY_OPTIONS = [\n { value: '1', label: 'P1 — Critical' },\n { value: '2', label: 'P2 — High' },\n { value: '3', label: 'P3 — Normal' },\n { value: '4', label: 'P4 — Low' },\n] as const;\n\nexport const RETENTION_PERIOD_OPTIONS = [\n { value: '1 hour', label: '1 hour' },\n { value: '1 day', label: '1 day' },\n { value: '3 days', label: '3 days' },\n { value: '7 days', label: '7 days' },\n { value: '30 days', label: '30 days' },\n { value: '90 days', label: '90 days' },\n] as const;\n"],"names":["DEFAULT_CLAIM_DURATIONS","formatClaimDuration","minutes","hours","PRIORITY_OPTIONS","RETENTION_PERIOD_OPTIONS"],"mappings":"AACO,MAAMA,EAA0B,CAAC,GAAI,GAAI,GAAI,GAAG,EAGhD,SAASC,EAAoBC,EAAyB,CAC3D,GAAIA,EAAU,GAAI,MAAO,GAAGA,CAAO,OACnC,MAAMC,EAAQD,EAAU,GACxB,OAAI,OAAO,UAAUC,CAAK,EAAUA,IAAU,EAAI,SAAW,GAAGA,CAAK,SAC9D,GAAGD,CAAO,MACnB,CAEO,MAAME,EAAmB,CAC9B,CAAE,MAAO,IAAK,MAAO,eAAA,EACrB,CAAE,MAAO,IAAK,MAAO,WAAA,EACrB,CAAE,MAAO,IAAK,MAAO,aAAA,EACrB,CAAE,MAAO,IAAK,MAAO,UAAA,CACvB,EAEaC,EAA2B,CACtC,CAAE,MAAO,SAAU,MAAO,QAAA,EAC1B,CAAE,MAAO,QAAS,MAAO,OAAA,EACzB,CAAE,MAAO,SAAU,MAAO,QAAA,EAC1B,CAAE,MAAO,SAAU,MAAO,QAAA,EAC1B,CAAE,MAAO,UAAW,MAAO,SAAA,EAC3B,CAAE,MAAO,UAAW,MAAO,SAAA,CAC7B"}
@@ -0,0 +1,2 @@
1
+ import{j as s}from"./vendor-query-B2UbickB.js";import{F as c,b as l}from"./FilterBar-Ck4K4rzu.js";import{P as x}from"./PriorityBadge-DfQY9St9.js";import{R as m}from"./RolePill-BTPa8L-P.js";import{W as p}from"./WorkflowPill-CCDSVaQj.js";import{T as u}from"./TimestampCell-DoWMKg6w.js";import{C as d,i as y,a as h}from"./escalation-qalymbKB.js";import{o as j,p as v,B as b,j as r}from"./vendor-icons-ZTAKVwGc.js";import{L as f}from"./vendor-react-Cw8Gy8NJ.js";function k({row:e}){if(y(e)){const t=e.status==="resolved"?"text-status-success":"text-text-tertiary";return s.jsx(b,{className:`w-3 h-3 shrink-0 ${t}`})}return e.status==="resolved"?s.jsx(r,{className:"w-2.5 h-2.5 shrink-0 fill-status-success text-status-success"}):e.status==="cancelled"?s.jsx(r,{className:"w-2.5 h-2.5 shrink-0 fill-status-error text-status-error"}):h(e)?s.jsx(r,{className:"w-2.5 h-2.5 shrink-0 fill-status-warning text-status-warning"}):s.jsx(r,{className:"w-2.5 h-2.5 shrink-0 fill-status-active text-status-active"})}const L=[{key:"description",label:"Summary",render:e=>s.jsxs("div",{className:"flex items-start gap-2 overflow-hidden",children:[s.jsx("span",{className:"mt-1 shrink-0",children:s.jsx(k,{row:e})}),s.jsxs("div",{className:"min-w-0 overflow-hidden",children:[s.jsx("p",{className:"text-xs text-text-primary truncate",children:e.description||e.type}),s.jsxs("div",{className:"flex items-center gap-2 mt-0.5",children:[s.jsx(p,{type:e.type}),e.subtype&&e.subtype!==e.type&&s.jsx("span",{className:"text-[10px] text-text-tertiary whitespace-nowrap",children:e.subtype})]})]})]}),className:"max-w-0"},{key:"task_id",label:"Task",render:e=>e.task_id?s.jsxs(f,{to:`/workflows/tasks/detail/${e.task_id}`,onClick:t=>t.stopPropagation(),className:"group/task inline-flex items-center gap-1 text-xs font-mono text-text-secondary hover:text-accent transition-colors",children:[e.task_id.slice(0,12),"…",s.jsx(j,{size:10,className:"opacity-0 group-hover/task:opacity-100 transition-opacity"})]}):s.jsx("span",{className:"text-xs text-text-tertiary",children:"—"}),className:"w-36 whitespace-nowrap"},{key:"role",label:"Role",render:e=>s.jsx(m,{role:e.role}),className:"w-28"},{key:"priority",label:"Priority",render:e=>s.jsx(x,{priority:e.priority}),className:"w-20",sortable:!0},{key:"created_at",label:"Created",render:e=>s.jsx(u,{date:e.created_at}),className:"w-40",sortable:!0}],I={key:"expires",label:s.jsx(v,{className:"w-3.5 h-3.5 text-text-tertiary"}),render:e=>e.assigned_until?s.jsx(d,{until:e.assigned_until}):s.jsx("span",{className:"text-xs text-text-tertiary",children:"—"}),className:"w-10"},N=[{value:"1",label:"P1"},{value:"2",label:"P2"},{value:"3",label:"P3"},{value:"4",label:"P4"}],C=[{value:"available",label:"Available"},{value:"claimed",label:"Claimed"},{value:"resolved",label:"Resolved"}];function A({filters:e,setFilter:t,roles:i,types:n,showStatus:o=!1}){return s.jsxs(c,{children:[o&&s.jsx(l,{label:"Status",value:e.status??"",onChange:a=>t("status",a),options:C}),s.jsx(l,{label:"Role",value:e.role,onChange:a=>t("role",a),options:i.map(a=>({value:a,label:a}))}),s.jsx(l,{label:"Type",value:e.type,onChange:a=>t("type",a),options:n.map(a=>({value:a,label:a}))}),s.jsx(l,{label:"Priority",value:e.priority,onChange:a=>t("priority",a),options:N})]})}export{L as E,I as T,A as a};
2
+ //# sourceMappingURL=escalation-columns-D6aqStaY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escalation-columns-D6aqStaY.js","sources":["../../src/pages/operator/escalation-columns.tsx"],"sourcesContent":["import { Link } from 'react-router-dom';\nimport { ExternalLink, Circle, Bell, Clock } from 'lucide-react';\nimport type { Column } from '../../components/common/data/DataTable';\nimport { FilterBar, FilterSelect } from '../../components/common/data/FilterBar';\nimport { PriorityBadge } from '../../components/common/display/PriorityBadge';\nimport { RolePill } from '../../components/common/display/RolePill';\nimport { WorkflowPill } from '../../components/common/display/WorkflowPill';\nimport { TimestampCell } from '../../components/common/display/TimestampCell';\nimport { CountdownTimer } from '../../components/common/display/CountdownTimer';\nimport { isEffectivelyClaimed, isAckEscalation } from '../../lib/escalation';\nimport type { LTEscalationRecord } from '../../api/types';\n\n/** Status dot — rendered inline before summary. */\nfunction StatusDot({ row }: { row: LTEscalationRecord }) {\n if (isAckEscalation(row)) {\n const color = row.status === 'resolved' ? 'text-status-success' : 'text-text-tertiary';\n return <Bell className={`w-3 h-3 shrink-0 ${color}`} />;\n }\n if (row.status === 'resolved') {\n return <Circle className=\"w-2.5 h-2.5 shrink-0 fill-status-success text-status-success\" />;\n }\n if (row.status === 'cancelled') {\n return <Circle className=\"w-2.5 h-2.5 shrink-0 fill-status-error text-status-error\" />;\n }\n if (isEffectivelyClaimed(row)) {\n return <Circle className=\"w-2.5 h-2.5 shrink-0 fill-status-warning text-status-warning\" />;\n }\n // pending (unclaimed)\n return <Circle className=\"w-2.5 h-2.5 shrink-0 fill-status-active text-status-active\" />;\n}\n\n/** Base columns shared by all escalation list pages. */\nexport const ESCALATION_COLUMNS: Column<LTEscalationRecord>[] = [\n {\n key: 'description',\n label: 'Summary',\n render: (row) => (\n <div className=\"flex items-start gap-2 overflow-hidden\">\n <span className=\"mt-1 shrink-0\"><StatusDot row={row} /></span>\n <div className=\"min-w-0 overflow-hidden\">\n <p className=\"text-xs text-text-primary truncate\">{row.description || row.type}</p>\n <div className=\"flex items-center gap-2 mt-0.5\">\n <WorkflowPill type={row.type} />\n {row.subtype && row.subtype !== row.type && (\n <span className=\"text-[10px] text-text-tertiary whitespace-nowrap\">{row.subtype}</span>\n )}\n </div>\n </div>\n </div>\n ),\n className: 'max-w-0',\n },\n {\n key: 'task_id',\n label: 'Task',\n render: (row) =>\n row.task_id ? (\n <Link\n to={`/workflows/tasks/detail/${row.task_id}`}\n onClick={(e) => e.stopPropagation()}\n className=\"group/task inline-flex items-center gap-1 text-xs font-mono text-text-secondary hover:text-accent transition-colors\"\n >\n {row.task_id.slice(0, 12)}…\n <ExternalLink size={10} className=\"opacity-0 group-hover/task:opacity-100 transition-opacity\" />\n </Link>\n ) : (\n <span className=\"text-xs text-text-tertiary\">—</span>\n ),\n className: 'w-36 whitespace-nowrap',\n },\n {\n key: 'role',\n label: 'Role',\n render: (row) => <RolePill role={row.role} />,\n className: 'w-28',\n },\n {\n key: 'priority',\n label: 'Priority',\n render: (row) => <PriorityBadge priority={row.priority} />,\n className: 'w-20',\n sortable: true,\n },\n {\n key: 'created_at',\n label: 'Created',\n render: (row) => <TimestampCell date={row.created_at} />,\n className: 'w-40',\n sortable: true,\n },\n];\n\n/** Time-remaining column for claimed escalations — aligns with checkbox column on All Escalations. */\nexport const TIME_LEFT_COLUMN: Column<LTEscalationRecord> = {\n key: 'expires',\n label: (<Clock className=\"w-3.5 h-3.5 text-text-tertiary\" />) as any,\n render: (row) =>\n row.assigned_until ? (\n <CountdownTimer until={row.assigned_until} />\n ) : (\n <span className=\"text-xs text-text-tertiary\">—</span>\n ),\n className: 'w-10',\n};\n\n/** Status icon column — color-coded filled circle, or bell for ACK/notification escalations. */\nexport const STATUS_COLUMN: Column<LTEscalationRecord> = {\n key: 'status',\n label: '',\n render: (row) => {\n if (isAckEscalation(row)) {\n const color = row.status === 'resolved' ? 'text-status-success' : 'text-text-tertiary';\n return <Bell className={`w-3 h-3 ${color}`} />;\n }\n if (row.status === 'resolved') {\n return <Circle className=\"w-2.5 h-2.5 fill-status-success text-status-success\" />;\n }\n if (isEffectivelyClaimed(row)) {\n return <Circle className=\"w-2.5 h-2.5 fill-status-warning text-status-warning\" />;\n }\n // pending (unclaimed)\n return <Circle className=\"w-2.5 h-2.5 fill-text-tertiary text-text-tertiary\" />;\n },\n className: 'w-8',\n};\n\n/** Claimed-only status icon (always orange, or bell for ACK). */\nexport const CLAIMED_STATUS_COLUMN: Column<LTEscalationRecord> = {\n key: 'status',\n label: '',\n render: (row) =>\n isAckEscalation(row)\n ? <Bell className=\"w-3 h-3 text-status-warning\" />\n : <Circle className=\"w-2.5 h-2.5 fill-status-warning text-status-warning\" />,\n className: 'w-8',\n};\n\n/** Priority filter options shared by both pages. */\nexport const PRIORITY_OPTIONS = [\n { value: '1', label: 'P1' },\n { value: '2', label: 'P2' },\n { value: '3', label: 'P3' },\n { value: '4', label: 'P4' },\n];\n\n/** Status filter options for escalation list pages. */\nexport const STATUS_OPTIONS = [\n { value: 'available', label: 'Available' },\n { value: 'claimed', label: 'Claimed' },\n { value: 'resolved', label: 'Resolved' },\n];\n\n/** Shared filter bar for escalation list pages. */\nexport function EscalationFilterBar({\n filters,\n setFilter,\n roles,\n types,\n showStatus = false,\n}: {\n filters: { role: string; type: string; priority: string; status?: string };\n setFilter: (key: any, value: string) => void;\n roles: string[];\n types: string[];\n showStatus?: boolean;\n}) {\n return (\n <FilterBar>\n {showStatus && (\n <FilterSelect\n label=\"Status\"\n value={filters.status ?? ''}\n onChange={(v) => setFilter('status', v)}\n options={STATUS_OPTIONS}\n />\n )}\n <FilterSelect\n label=\"Role\"\n value={filters.role}\n onChange={(v) => setFilter('role', v)}\n options={roles.map((r) => ({ value: r, label: r }))}\n />\n <FilterSelect\n label=\"Type\"\n value={filters.type}\n onChange={(v) => setFilter('type', v)}\n options={types.map((t) => ({ value: t, label: t }))}\n />\n <FilterSelect\n label=\"Priority\"\n value={filters.priority}\n onChange={(v) => setFilter('priority', v)}\n options={PRIORITY_OPTIONS}\n />\n </FilterBar>\n );\n}\n"],"names":["StatusDot","row","isAckEscalation","color","jsx","Bell","Circle","isEffectivelyClaimed","ESCALATION_COLUMNS","jsxs","WorkflowPill","Link","e","ExternalLink","RolePill","PriorityBadge","TimestampCell","TIME_LEFT_COLUMN","Clock","CountdownTimer","PRIORITY_OPTIONS","STATUS_OPTIONS","EscalationFilterBar","filters","setFilter","roles","types","showStatus","FilterBar","FilterSelect","v","r","t"],"mappings":"0cAaA,SAASA,EAAU,CAAE,IAAAC,GAAoC,CACvD,GAAIC,EAAgBD,CAAG,EAAG,CACxB,MAAME,EAAQF,EAAI,SAAW,WAAa,sBAAwB,qBAClE,OAAOG,EAAAA,IAACC,EAAA,CAAK,UAAW,oBAAoBF,CAAK,GAAI,CACvD,CACA,OAAIF,EAAI,SAAW,WACVG,EAAAA,IAACE,EAAA,CAAO,UAAU,8DAAA,CAA+D,EAEtFL,EAAI,SAAW,YACVG,EAAAA,IAACE,EAAA,CAAO,UAAU,0DAAA,CAA2D,EAElFC,EAAqBN,CAAG,EACnBG,EAAAA,IAACE,EAAA,CAAO,UAAU,8DAAA,CAA+D,EAGnFF,EAAAA,IAACE,EAAA,CAAO,UAAU,4DAAA,CAA6D,CACxF,CAGO,MAAME,EAAmD,CAC9D,CACE,IAAK,cACL,MAAO,UACP,OAASP,GACPQ,EAAAA,KAAC,MAAA,CAAI,UAAU,yCACb,SAAA,CAAAL,EAAAA,IAAC,QAAK,UAAU,gBAAgB,SAAAA,EAAAA,IAACJ,EAAA,CAAU,IAAAC,EAAU,EAAE,EACvDQ,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAL,MAAC,KAAE,UAAU,qCAAsC,SAAAH,EAAI,aAAeA,EAAI,KAAK,EAC/EQ,EAAAA,KAAC,MAAA,CAAI,UAAU,iCACb,SAAA,CAAAL,EAAAA,IAACM,EAAA,CAAa,KAAMT,EAAI,IAAA,CAAM,EAC7BA,EAAI,SAAWA,EAAI,UAAYA,EAAI,MAClCG,EAAAA,IAAC,OAAA,CAAK,UAAU,mDAAoD,SAAAH,EAAI,OAAA,CAAQ,CAAA,CAAA,CAEpF,CAAA,CAAA,CACF,CAAA,EACF,EAEF,UAAW,SAAA,EAEb,CACE,IAAK,UACL,MAAO,OACP,OAASA,GACPA,EAAI,QACFQ,EAAAA,KAACE,EAAA,CACC,GAAI,2BAA2BV,EAAI,OAAO,GAC1C,QAAUW,GAAMA,EAAE,gBAAA,EAClB,UAAU,sHAET,SAAA,CAAAX,EAAI,QAAQ,MAAM,EAAG,EAAE,EAAE,IAC1BG,EAAAA,IAACS,EAAA,CAAa,KAAM,GAAI,UAAU,2DAAA,CAA4D,CAAA,CAAA,CAAA,EAGhGT,EAAAA,IAAC,OAAA,CAAK,UAAU,6BAA6B,SAAA,IAAC,EAElD,UAAW,wBAAA,EAEb,CACE,IAAK,OACL,MAAO,OACP,OAASH,SAASa,EAAA,CAAS,KAAMb,EAAI,KAAM,EAC3C,UAAW,MAAA,EAEb,CACE,IAAK,WACL,MAAO,WACP,OAASA,SAASc,EAAA,CAAc,SAAUd,EAAI,SAAU,EACxD,UAAW,OACX,SAAU,EAAA,EAEZ,CACE,IAAK,aACL,MAAO,UACP,OAASA,SAASe,EAAA,CAAc,KAAMf,EAAI,WAAY,EACtD,UAAW,OACX,SAAU,EAAA,CAEd,EAGagB,EAA+C,CAC1D,IAAK,UACL,MAAQb,EAAAA,IAACc,EAAA,CAAM,UAAU,gCAAA,CAAiC,EAC1D,OAASjB,GACPA,EAAI,eACFG,MAACe,EAAA,CAAe,MAAOlB,EAAI,eAAgB,EAE3CG,EAAAA,IAAC,OAAA,CAAK,UAAU,6BAA6B,SAAA,IAAC,EAElD,UAAW,MACb,EAmCagB,EAAmB,CAC9B,CAAE,MAAO,IAAK,MAAO,IAAA,EACrB,CAAE,MAAO,IAAK,MAAO,IAAA,EACrB,CAAE,MAAO,IAAK,MAAO,IAAA,EACrB,CAAE,MAAO,IAAK,MAAO,IAAA,CACvB,EAGaC,EAAiB,CAC5B,CAAE,MAAO,YAAa,MAAO,WAAA,EAC7B,CAAE,MAAO,UAAW,MAAO,SAAA,EAC3B,CAAE,MAAO,WAAY,MAAO,UAAA,CAC9B,EAGO,SAASC,EAAoB,CAClC,QAAAC,EACA,UAAAC,EACA,MAAAC,EACA,MAAAC,EACA,WAAAC,EAAa,EACf,EAMG,CACD,cACGC,EAAA,CACE,SAAA,CAAAD,GACCvB,EAAAA,IAACyB,EAAA,CACC,MAAM,SACN,MAAON,EAAQ,QAAU,GACzB,SAAWO,GAAMN,EAAU,SAAUM,CAAC,EACtC,QAAST,CAAA,CAAA,EAGbjB,EAAAA,IAACyB,EAAA,CACC,MAAM,OACN,MAAON,EAAQ,KACf,SAAWO,GAAMN,EAAU,OAAQM,CAAC,EACpC,QAASL,EAAM,IAAKM,IAAO,CAAE,MAAOA,EAAG,MAAOA,GAAI,CAAA,CAAA,EAEpD3B,EAAAA,IAACyB,EAAA,CACC,MAAM,OACN,MAAON,EAAQ,KACf,SAAWO,GAAMN,EAAU,OAAQM,CAAC,EACpC,QAASJ,EAAM,IAAKM,IAAO,CAAE,MAAOA,EAAG,MAAOA,GAAI,CAAA,CAAA,EAEpD5B,EAAAA,IAACyB,EAAA,CACC,MAAM,WACN,MAAON,EAAQ,SACf,SAAWO,GAAMN,EAAU,WAAYM,CAAC,EACxC,QAASV,CAAA,CAAA,CACX,EACF,CAEJ"}
@@ -0,0 +1,2 @@
1
+ import{a as o,j as s}from"./vendor-query-B2UbickB.js";import{a as i}from"./format-gXZXQ-HJ.js";const n=[{maxMs:0,color:"text-status-error"},{maxMs:300*1e3,color:"text-status-error"},{maxMs:900*1e3,color:"text-status-warning"},{maxMs:1/0,color:"text-accent"}];function c(t){if(t<=0)return n[0].color;for(const e of n)if(t<e.maxMs)return e.color;return n[n.length-1].color}function u({until:t}){const[e,r]=o.useState(()=>new Date(t).getTime()-Date.now());return o.useEffect(()=>{const a=setInterval(()=>{r(new Date(t).getTime()-Date.now())},1e3);return()=>clearInterval(a)},[t]),s.jsx("span",{className:`text-xs font-mono ${c(e)}`,children:i(e)})}function f(t){return!!(t.assigned_to&&t.assigned_until&&new Date(t.assigned_until)>new Date)}function x(t){return!t.workflow_type}export{u as C,f as a,x as i};
2
+ //# sourceMappingURL=escalation-qalymbKB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escalation-qalymbKB.js","sources":["../../src/components/common/display/CountdownTimer.tsx","../../src/lib/escalation.ts"],"sourcesContent":["import { useState, useEffect } from 'react';\nimport { formatRemaining } from '../../../lib/format';\n\n/** Countdown thresholds in milliseconds with corresponding color classes. */\nconst COUNTDOWN_THRESHOLDS = [\n { maxMs: 0, color: 'text-status-error' }, // expired\n { maxMs: 5 * 60 * 1000, color: 'text-status-error' }, // < 5 min — red\n { maxMs: 15 * 60 * 1000, color: 'text-status-warning' }, // < 15 min — orange\n { maxMs: Infinity, color: 'text-accent' }, // plenty of time — blue\n] as const;\n\nfunction countdownColor(remainingMs: number): string {\n if (remainingMs <= 0) return COUNTDOWN_THRESHOLDS[0].color;\n for (const t of COUNTDOWN_THRESHOLDS) {\n if (remainingMs < t.maxMs) return t.color;\n }\n return COUNTDOWN_THRESHOLDS[COUNTDOWN_THRESHOLDS.length - 1].color;\n}\n\nexport function CountdownTimer({ until }: { until: string }) {\n const [remaining, setRemaining] = useState(() => new Date(until).getTime() - Date.now());\n\n useEffect(() => {\n const interval = setInterval(() => {\n setRemaining(new Date(until).getTime() - Date.now());\n }, 1000);\n return () => clearInterval(interval);\n }, [until]);\n\n return (\n <span className={`text-xs font-mono ${countdownColor(remaining)}`}>\n {formatRemaining(remaining)}\n </span>\n );\n}\n","import type { LTEscalationRecord } from '../api/types';\n\nexport function isEffectivelyClaimed(esc: LTEscalationRecord): boolean {\n return !!(\n esc.assigned_to &&\n esc.assigned_until &&\n new Date(esc.assigned_until) > new Date()\n );\n}\n\n/** An ACK escalation has no associated workflow — it's a notification, not a task. */\nexport function isAckEscalation(esc: LTEscalationRecord): boolean {\n return !esc.workflow_type;\n}\n\nexport function isAvailable(esc: LTEscalationRecord): boolean {\n return (\n esc.status === 'pending' &&\n (!esc.assigned_to ||\n !esc.assigned_until ||\n new Date(esc.assigned_until) <= new Date())\n );\n}\n"],"names":["COUNTDOWN_THRESHOLDS","countdownColor","remainingMs","t","CountdownTimer","until","remaining","setRemaining","useState","useEffect","interval","jsx","formatRemaining","isEffectivelyClaimed","esc","isAckEscalation"],"mappings":"+FAIA,MAAMA,EAAuB,CAC3B,CAAE,MAAO,EAAgB,MAAO,mBAAA,EAChC,CAAE,MAAO,IAAS,IAAO,MAAO,mBAAA,EAChC,CAAE,MAAO,IAAU,IAAM,MAAO,qBAAA,EAChC,CAAE,MAAO,IAAiB,MAAO,aAAA,CACnC,EAEA,SAASC,EAAeC,EAA6B,CACnD,GAAIA,GAAe,EAAG,OAAOF,EAAqB,CAAC,EAAE,MACrD,UAAWG,KAAKH,EACd,GAAIE,EAAcC,EAAE,MAAO,OAAOA,EAAE,MAEtC,OAAOH,EAAqBA,EAAqB,OAAS,CAAC,EAAE,KAC/D,CAEO,SAASI,EAAe,CAAE,MAAAC,GAA4B,CAC3D,KAAM,CAACC,EAAWC,CAAY,EAAIC,EAAAA,SAAS,IAAM,IAAI,KAAKH,CAAK,EAAE,QAAA,EAAY,KAAK,KAAK,EAEvFI,OAAAA,EAAAA,UAAU,IAAM,CACd,MAAMC,EAAW,YAAY,IAAM,CACjCH,EAAa,IAAI,KAAKF,CAAK,EAAE,UAAY,KAAK,KAAK,CACrD,EAAG,GAAI,EACP,MAAO,IAAM,cAAcK,CAAQ,CACrC,EAAG,CAACL,CAAK,CAAC,EAGRM,EAAAA,IAAC,OAAA,CAAK,UAAW,qBAAqBV,EAAeK,CAAS,CAAC,GAC5D,SAAAM,EAAgBN,CAAS,CAAA,CAC5B,CAEJ,CChCO,SAASO,EAAqBC,EAAkC,CACrE,MAAO,CAAC,EACNA,EAAI,aACJA,EAAI,gBACJ,IAAI,KAAKA,EAAI,cAAc,EAAI,IAAI,KAEvC,CAGO,SAASC,EAAgBD,EAAkC,CAChE,MAAO,CAACA,EAAI,aACd"}
@@ -0,0 +1,2 @@
1
+ function u(t){const n=Date.now(),o=new Date(t).getTime(),r=n-o;if(r<0)return"just now";const e=Math.floor(r/1e3);if(e<60)return`${e}s ago`;const a=Math.floor(e/60);if(a<60)return`${a}m ago`;const f=Math.floor(a/60);if(f<24)return`${f}h ago`;const i=Math.floor(f/24);return i<30?`${i}d ago`:new Date(t).toLocaleDateString()}function s(t){if(t<=0)return"Expired";const n=Math.floor(t/1e3),o=Math.floor(n/60),r=Math.floor(o/60);return r>0?`${r}h ${o%60}m`:o>0?`${o}m ${n%60}s`:`${n}s`}function c(t){return t==null?"--":t<1e3?`${t}ms`:t<6e4?`${(t/1e3).toFixed(1)}s`:`${(t/6e4).toFixed(1)}m`}function h(t){return t?new Date(t).toLocaleString():"--"}export{s as a,h as b,u as c,c as f};
2
+ //# sourceMappingURL=format-gXZXQ-HJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format-gXZXQ-HJ.js","sources":["../../src/lib/format.ts"],"sourcesContent":["export function formatTimeAgo(dateStr: string): string {\n const now = Date.now();\n const then = new Date(dateStr).getTime();\n const diff = now - then;\n\n if (diff < 0) return 'just now';\n\n const seconds = Math.floor(diff / 1000);\n if (seconds < 60) return `${seconds}s ago`;\n\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes}m ago`;\n\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ago`;\n\n const days = Math.floor(hours / 24);\n if (days < 30) return `${days}d ago`;\n\n return new Date(dateStr).toLocaleDateString();\n}\n\nexport function formatRemaining(ms: number): string {\n if (ms <= 0) return 'Expired';\n\n const seconds = Math.floor(ms / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n\n if (hours > 0) {\n return `${hours}h ${minutes % 60}m`;\n }\n if (minutes > 0) {\n return `${minutes}m ${seconds % 60}s`;\n }\n return `${seconds}s`;\n}\n\nexport function formatDuration(ms: number | null | undefined): string {\n if (ms === null || ms === undefined) return '--';\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60_000) return `${(ms / 1000).toFixed(1)}s`;\n return `${(ms / 60_000).toFixed(1)}m`;\n}\n\nexport function formatDateTime(iso: string | null): string {\n if (!iso) return '--';\n return new Date(iso).toLocaleString();\n}\n"],"names":["formatTimeAgo","dateStr","now","then","diff","seconds","minutes","hours","days","formatRemaining","ms","formatDuration","formatDateTime","iso"],"mappings":"AAAO,SAASA,EAAcC,EAAyB,CACrD,MAAMC,EAAM,KAAK,IAAA,EACXC,EAAO,IAAI,KAAKF,CAAO,EAAE,QAAA,EACzBG,EAAOF,EAAMC,EAEnB,GAAIC,EAAO,EAAG,MAAO,WAErB,MAAMC,EAAU,KAAK,MAAMD,EAAO,GAAI,EACtC,GAAIC,EAAU,GAAI,MAAO,GAAGA,CAAO,QAEnC,MAAMC,EAAU,KAAK,MAAMD,EAAU,EAAE,EACvC,GAAIC,EAAU,GAAI,MAAO,GAAGA,CAAO,QAEnC,MAAMC,EAAQ,KAAK,MAAMD,EAAU,EAAE,EACrC,GAAIC,EAAQ,GAAI,MAAO,GAAGA,CAAK,QAE/B,MAAMC,EAAO,KAAK,MAAMD,EAAQ,EAAE,EAClC,OAAIC,EAAO,GAAW,GAAGA,CAAI,QAEtB,IAAI,KAAKP,CAAO,EAAE,mBAAA,CAC3B,CAEO,SAASQ,EAAgBC,EAAoB,CAClD,GAAIA,GAAM,EAAG,MAAO,UAEpB,MAAML,EAAU,KAAK,MAAMK,EAAK,GAAI,EAC9BJ,EAAU,KAAK,MAAMD,EAAU,EAAE,EACjCE,EAAQ,KAAK,MAAMD,EAAU,EAAE,EAErC,OAAIC,EAAQ,EACH,GAAGA,CAAK,KAAKD,EAAU,EAAE,IAE9BA,EAAU,EACL,GAAGA,CAAO,KAAKD,EAAU,EAAE,IAE7B,GAAGA,CAAO,GACnB,CAEO,SAASM,EAAeD,EAAuC,CACpE,OAAIA,GAAO,KAAiC,KACxCA,EAAK,IAAa,GAAGA,CAAE,KACvBA,EAAK,IAAe,IAAIA,EAAK,KAAM,QAAQ,CAAC,CAAC,IAC1C,IAAIA,EAAK,KAAQ,QAAQ,CAAC,CAAC,GACpC,CAEO,SAASE,EAAeC,EAA4B,CACzD,OAAKA,EACE,IAAI,KAAKA,CAAG,EAAE,eAAA,EADJ,IAEnB"}
@@ -0,0 +1,2 @@
1
+ function c(e){if(!(e!=null&&e.properties))return{};const t={};for(const[n,i]of Object.entries(e.properties)){const r=i;r.default!==void 0?t[n]=r.default:r.type==="string"?t[n]="":r.type==="number"||r.type==="integer"?t[n]=0:r.type==="boolean"?t[n]=!1:r.type==="object"?t[n]={}:r.type==="array"?t[n]=[]:t[n]=null}return t}function d(e){return e&&e.type||"string"}const l={app:"MCP Workflow Server",tpc:"MCP Workflow Tool",vrs:"Version",ngn:"Engine ID",jid:"Job ID",gid:"Run ID",aid:"Activity ID",ts:"Time Series",jc:"Created",ju:"Updated",trc:"Trace ID",js:"Job Status"},f={0:"Completed",1:"Pending",2:"Error"};function a(e){const t=e.match(/^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})\.(\d+)$/);if(!t)return e;const[,n,i,r,o,s,p,u]=t;return`${n}-${i}-${r} ${o}:${s}:${p}.${u}`}function b(e,t){return e==="js"&&typeof t=="number"?f[t]??`Unknown (${t})`:(e==="jc"||e==="ju")&&typeof t=="string"?a(t):String(t??"")}function y(e){return e==="llm"?"LLM":e==="db"?"DB":"MCP"}function m(e){return e==="llm"?"bg-purple-500/10 text-purple-400 border-purple-500/20":"bg-accent-primary/10 text-accent border-accent-primary/20"}export{m as a,c as b,b as f,d as i,l as m,y as s};
2
+ //# sourceMappingURL=helpers-0gSleuzT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers-0gSleuzT.js","sources":["../../src/pages/workflows/yaml-workflow-detail/helpers.ts"],"sourcesContent":["export type Section = 'invoke' | 'tools' | 'config';\n\nexport function buildSkeleton(schema: Record<string, any>): Record<string, any> {\n if (!schema?.properties) return {};\n const result: Record<string, any> = {};\n for (const [key, prop] of Object.entries(schema.properties)) {\n const p = prop as any;\n if (p.default !== undefined) result[key] = p.default;\n else if (p.type === 'string') result[key] = '';\n else if (p.type === 'number' || p.type === 'integer') result[key] = 0;\n else if (p.type === 'boolean') result[key] = false;\n else if (p.type === 'object') result[key] = {};\n else if (p.type === 'array') result[key] = [];\n else result[key] = null;\n }\n return result;\n}\n\nexport function inferFieldType(schemaProp: any): string {\n if (!schemaProp) return 'string';\n return schemaProp.type || 'string';\n}\n\nexport const metadataLabels: Record<string, string> = {\n app: 'MCP Workflow Server', tpc: 'MCP Workflow Tool', vrs: 'Version', ngn: 'Engine ID',\n jid: 'Job ID', gid: 'Run ID', aid: 'Activity ID', ts: 'Time Series',\n jc: 'Created', ju: 'Updated', trc: 'Trace ID', js: 'Job Status',\n};\n\nexport const jobStatusLabels: Record<number, string> = { 0: 'Completed', 1: 'Pending', 2: 'Error' };\n\nexport function parseCompactTimestamp(val: string): string {\n const match = val.match(/^(\\d{4})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})\\.(\\d+)$/);\n if (!match) return val;\n const [, y, mo, d, h, mi, s, ms] = match;\n return `${y}-${mo}-${d} ${h}:${mi}:${s}.${ms}`;\n}\n\nexport function formatMetadataValue(key: string, value: unknown): string {\n if (key === 'js' && typeof value === 'number') return jobStatusLabels[value] ?? `Unknown (${value})`;\n if ((key === 'jc' || key === 'ju') && typeof value === 'string') return parseCompactTimestamp(value);\n return String(value ?? '');\n}\n\nexport function sourceLabel(s: string | undefined) {\n if (s === 'llm') return 'LLM';\n if (s === 'db') return 'DB';\n return 'MCP';\n}\n\nexport function sourceColor(s: string | undefined) {\n if (s === 'llm') return 'bg-purple-500/10 text-purple-400 border-purple-500/20';\n return 'bg-accent-primary/10 text-accent border-accent-primary/20';\n}\n"],"names":["buildSkeleton","schema","result","key","prop","p","inferFieldType","schemaProp","metadataLabels","jobStatusLabels","parseCompactTimestamp","val","match","y","mo","d","h","mi","s","ms","formatMetadataValue","value","sourceLabel","sourceColor"],"mappings":"AAEO,SAASA,EAAcC,EAAkD,CAC9E,GAAI,EAACA,GAAA,MAAAA,EAAQ,YAAY,MAAO,CAAA,EAChC,MAAMC,EAA8B,CAAA,EACpC,SAAW,CAACC,EAAKC,CAAI,IAAK,OAAO,QAAQH,EAAO,UAAU,EAAG,CAC3D,MAAMI,EAAID,EACNC,EAAE,UAAY,OAAWH,EAAOC,CAAG,EAAIE,EAAE,QACpCA,EAAE,OAAS,SAAUH,EAAOC,CAAG,EAAI,GACnCE,EAAE,OAAS,UAAYA,EAAE,OAAS,UAAWH,EAAOC,CAAG,EAAI,EAC3DE,EAAE,OAAS,UAAWH,EAAOC,CAAG,EAAI,GACpCE,EAAE,OAAS,SAAUH,EAAOC,CAAG,EAAI,CAAA,EACnCE,EAAE,OAAS,QAASH,EAAOC,CAAG,EAAI,CAAA,EACtCD,EAAOC,CAAG,EAAI,IACrB,CACA,OAAOD,CACT,CAEO,SAASI,EAAeC,EAAyB,CACtD,OAAKA,GACEA,EAAW,MAAQ,QAC5B,CAEO,MAAMC,EAAyC,CACpD,IAAK,sBAAuB,IAAK,oBAAqB,IAAK,UAAW,IAAK,YAC3E,IAAK,SAAU,IAAK,SAAU,IAAK,cAAe,GAAI,cACtD,GAAI,UAAW,GAAI,UAAW,IAAK,WAAY,GAAI,YACrD,EAEaC,EAA0C,CAAE,EAAG,YAAa,EAAG,UAAW,EAAG,OAAA,EAEnF,SAASC,EAAsBC,EAAqB,CACzD,MAAMC,EAAQD,EAAI,MAAM,qDAAqD,EAC7E,GAAI,CAACC,EAAO,OAAOD,EACnB,KAAM,CAAA,CAAGE,EAAGC,EAAIC,EAAGC,EAAGC,EAAIC,EAAGC,CAAE,EAAIP,EACnC,MAAO,GAAGC,CAAC,IAAIC,CAAE,IAAIC,CAAC,IAAIC,CAAC,IAAIC,CAAE,IAAIC,CAAC,IAAIC,CAAE,EAC9C,CAEO,SAASC,EAAoBjB,EAAakB,EAAwB,CACvE,OAAIlB,IAAQ,MAAQ,OAAOkB,GAAU,SAAiBZ,EAAgBY,CAAK,GAAK,YAAYA,CAAK,KAC5FlB,IAAQ,MAAQA,IAAQ,OAAS,OAAOkB,GAAU,SAAiBX,EAAsBW,CAAK,EAC5F,OAAOA,GAAS,EAAE,CAC3B,CAEO,SAASC,EAAYJ,EAAuB,CACjD,OAAIA,IAAM,MAAc,MACpBA,IAAM,KAAa,KAChB,KACT,CAEO,SAASK,EAAYL,EAAuB,CACjD,OAAIA,IAAM,MAAc,wDACjB,2DACT"}