@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,2 @@
1
+ import{b as R,a as D,j as e}from"./vendor-query-B2UbickB.js";import{b as K}from"./mcp-runs-ChPbpvXK.js";import{b as U}from"./yaml-workflows-BL4V5CQy.js";import{u as B}from"./settings-eBRSE0mQ.js";import{S as J}from"./StatusBadge-TlC4jiig.js";import{u as L,J as T,N as $}from"./index-D8VH6K8B.js";import{P as _}from"./PageHeader-CpWFly5S.js";import{C as q}from"./CopyableId-CBdxWfp8.js";import{C as j}from"./CollapsibleSection-Cxk4wvjT.js";import{u as H,E as M}from"./EventTable-B01oJf6Y.js";import{f as Q}from"./format-gXZXQ-HJ.js";import{S as W}from"./SwimlaneTimeline-7SiwATsZ.js";import{d as A,e as F,L as V}from"./vendor-react-Cw8Gy8NJ.js";import"./vendor-icons-ZTAKVwGc.js";import"./FilterBar-Ck4K4rzu.js";const X={running:"in_progress",completed:"completed",failed:"failed"};function S(s){return s?s.replace("T"," ").replace("Z","").slice(0,23):"—"}function de(){var y,N,w;const{jobId:s}=A(),[c]=F(),l=c.get("namespace")||"longtail",h=R(),{data:t,isLoading:C,error:r}=K(s,l),{data:d}=B(),{isCollapsed:x,toggle:m}=H("mcp-run-detail"),E=(t==null?void 0:t.workflow_name)||(t==null?void 0:t.workflow_type),{data:p}=U(E,l),b=(y=p==null?void 0:p.workflows)==null?void 0:y[0],v=((N=d==null?void 0:d.telemetry)==null?void 0:N.traceUrl)??null,P=D.useCallback(o=>{!s||o.workflowId!==s||h.invalidateQueries({queryKey:["mcpRunExecution",s]})},[s,h]);if(L(`${$}.activity.>`,P),C)return e.jsxs("div",{className:"animate-pulse space-y-4",children:[e.jsx("div",{className:"h-8 bg-surface-sunken rounded w-64"}),e.jsx("div",{className:"h-60 bg-surface-sunken rounded"})]});if(r||!t)return e.jsxs("div",{children:[e.jsx(_,{title:"Pipeline Execution"}),e.jsxs("div",{className:"mt-4 text-center py-8",children:[e.jsx("p",{className:"text-sm text-text-primary mb-1",children:(w=r==null?void 0:r.message)!=null&&w.includes("expired")?"Execution data is no longer available":"Unable to load execution"}),e.jsx("p",{className:"text-xs text-text-tertiary",children:(r==null?void 0:r.message)??"The run could not be resolved."})]})]});const{events:u,summary:a}=t,f=u.find(o=>{var k;return o.category==="activity"&&((k=o.attributes.kind)==null?void 0:k.includes("completed"))}),I=(f==null?void 0:f.attributes.result)??null,n=t.result,g=(n==null?void 0:n.data)??n??null;return e.jsxs("div",{children:[e.jsx(_,{title:"Pipeline Execution"}),e.jsxs("div",{className:"bg-surface-raised border border-surface-border rounded-md p-5 mb-8",children:[e.jsxs("div",{className:"flex items-center gap-4 mb-4",children:[e.jsx("h2",{className:"text-sm font-mono text-text-primary truncate flex-1",children:t.workflow_id}),e.jsx(J,{status:X[t.status]??t.status})]}),e.jsxs("div",{className:"grid grid-cols-5 gap-x-6",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5",children:"Tool Server"}),e.jsx("p",{className:"text-xs font-mono text-text-primary truncate",children:l})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5",children:"Pipeline Tool"}),b?e.jsx(V,{to:`/mcp/workflows/${b.id}`,className:"text-xs font-mono text-accent hover:underline truncate block",children:t.workflow_type}):e.jsx("p",{className:"text-xs font-mono text-text-primary truncate",children:t.workflow_type||"—"})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5",children:"Duration"}),e.jsx("p",{className:"text-xs font-mono text-text-primary",children:Q(t.duration_ms)})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5",children:"Started"}),e.jsx("p",{className:"text-xs font-mono text-text-primary",children:S(t.start_time)})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5",children:"Completed"}),e.jsx("p",{className:"text-xs font-mono text-text-primary",children:S(t.close_time)})]})]}),e.jsxs("div",{className:"flex items-center mt-4 pt-3 border-t border-surface-border",children:[e.jsx("div",{className:"flex-1",children:t.trace_id?e.jsx(q,{label:"Trace",value:t.trace_id,href:v?v.replace("{traceId}",t.trace_id):void 0,external:!0}):e.jsx("span",{className:"text-[10px] text-text-tertiary",children:"No trace"})}),e.jsxs("div",{className:"flex items-center gap-5",children:[e.jsx(i,{label:"Tools",value:a.activities.user}),e.jsx(i,{label:"System",value:a.activities.system,muted:!0}),a.child_workflows.total>0&&e.jsx(i,{label:"Children",value:a.child_workflows.total}),a.timers>0&&e.jsx(i,{label:"Timers",value:a.timers}),a.signals>0&&e.jsx(i,{label:"Signals",value:a.signals}),e.jsx(i,{label:"Total",value:a.total_events,muted:!0})]})]})]}),e.jsxs("div",{className:"space-y-6",children:[e.jsx(j,{title:"Details",sectionKey:"details",isCollapsed:x("details"),onToggle:m,children:e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4 mb-6",children:[e.jsx("div",{children:e.jsx(T,{data:I??{},label:"Input"})}),g!==null&&e.jsx("div",{children:e.jsx(T,{data:g,label:"Result"})})]})}),e.jsx(j,{title:"Execution Timeline",sectionKey:"timeline",isCollapsed:x("timeline"),onToggle:m,children:e.jsx(W,{events:u,outline:!0})}),e.jsx(j,{title:"Events",sectionKey:"events",isCollapsed:x("events"),onToggle:m,children:e.jsx(M,{events:u})})]})]})}function i({label:s,value:c,muted:l}){return e.jsxs("div",{className:"flex items-center gap-1.5 text-xs",children:[e.jsx("span",{className:"text-text-tertiary",children:s}),e.jsx("span",{className:`font-medium tabular-nums ${l?"text-text-tertiary":"text-text-primary"}`,children:c})]})}export{de as McpRunDetailPage};
2
+ //# sourceMappingURL=McpRunDetailPage-CmPs5EvE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"McpRunDetailPage-CmPs5EvE.js","sources":["../../src/pages/mcp/McpRunDetailPage.tsx"],"sourcesContent":["import { useParams, Link, useSearchParams } from 'react-router-dom';\nimport { useCallback } from 'react';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { useMcpRunExecution } from '../../api/mcp-runs';\nimport { useYamlWorkflowByTopic } from '../../api/yaml-workflows';\nimport { useSettings } from '../../api/settings';\nimport { StatusBadge } from '../../components/common/display/StatusBadge';\nimport { JsonViewer } from '../../components/common/data/JsonViewer';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { CopyableId } from '../../components/common/display/CopyableId';\nimport { CollapsibleSection } from '../../components/common/layout/CollapsibleSection';\nimport { useCollapsedSections } from '../../hooks/useCollapsedSections';\nimport { useEventSubscription } from '../../hooks/useEventContext';\nimport { NATS_SUBJECT_PREFIX } from '../../lib/nats/config';\nimport { formatDuration } from '../../lib/format';\n\nimport { SwimlaneTimeline } from '../workflows/workflow-execution/SwimlaneTimeline';\nimport { EventTable } from '../workflows/workflow-execution/EventTable';\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nconst statusMap: Record<string, string> = {\n running: 'in_progress',\n completed: 'completed',\n failed: 'failed',\n};\n\nfunction formatTimestamp(iso: string | null): string {\n if (!iso) return '—';\n return iso.replace('T', ' ').replace('Z', '').slice(0, 23);\n}\n\n// ── Main page ────────────────────────────────────────────────────────────────\n\nexport function McpRunDetailPage() {\n const { jobId } = useParams<{ jobId: string }>();\n const [searchParams] = useSearchParams();\n const namespace = searchParams.get('namespace') || 'longtail';\n const queryClient = useQueryClient();\n const { data: execution, isLoading, error } = useMcpRunExecution(jobId!, namespace);\n const { data: settings } = useSettings();\n const { isCollapsed, toggle } = useCollapsedSections('mcp-run-detail');\n const workflowTopic = execution?.workflow_name || execution?.workflow_type;\n const { data: yamlMatch } = useYamlWorkflowByTopic(workflowTopic, namespace);\n const sourceWorkflow = yamlMatch?.workflows?.[0];\n\n const traceUrl = settings?.telemetry?.traceUrl ?? null;\n\n // Subscribe to activity events for this job — refetch execution on each step\n const activityHandler = useCallback((event: any) => {\n if (!jobId || event.workflowId !== jobId) return;\n queryClient.invalidateQueries({ queryKey: ['mcpRunExecution', jobId] });\n }, [jobId, queryClient]);\n useEventSubscription(`${NATS_SUBJECT_PREFIX}.activity.>`, activityHandler);\n\n if (isLoading) {\n return (\n <div className=\"animate-pulse space-y-4\">\n <div className=\"h-8 bg-surface-sunken rounded w-64\" />\n <div className=\"h-60 bg-surface-sunken rounded\" />\n </div>\n );\n }\n\n if (error || !execution) {\n return (\n <div>\n <PageHeader title=\"Pipeline Execution\" />\n <div className=\"mt-4 text-center py-8\">\n <p className=\"text-sm text-text-primary mb-1\">\n {(error as Error)?.message?.includes('expired')\n ? 'Execution data is no longer available'\n : 'Unable to load execution'}\n </p>\n <p className=\"text-xs text-text-tertiary\">\n {(error as Error)?.message ?? 'The run could not be resolved.'}\n </p>\n </div>\n </div>\n );\n }\n\n const { events, summary } = execution;\n\n // The trigger activity's result is the effective input to the flow —\n // it accepts outside job input and provides it to descendant activities.\n const triggerCompleted = events.find(\n (e) => e.category === 'activity' && e.attributes.kind?.includes('completed'),\n );\n const triggerInput = triggerCompleted?.attributes.result ?? null;\n\n // Unwrap result — the `data` field is what users care about\n const rawResult = execution.result as Record<string, unknown> | null | undefined;\n const result = rawResult?.data ?? rawResult ?? null;\n\n return (\n <div>\n <PageHeader title=\"Pipeline Execution\" />\n\n {/* ── Header card ─────────────────────────────────── */}\n <div className=\"bg-surface-raised border border-surface-border rounded-md p-5 mb-8\">\n {/* Row 0: Job ID + status */}\n <div className=\"flex items-center gap-4 mb-4\">\n <h2 className=\"text-sm font-mono text-text-primary truncate flex-1\">{execution.workflow_id}</h2>\n <StatusBadge status={statusMap[execution.status] ?? execution.status} />\n </div>\n\n {/* Row 1: Namespace, Topic, Duration, Started, Completed */}\n <div className=\"grid grid-cols-5 gap-x-6\">\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5\">Tool Server</p>\n <p className=\"text-xs font-mono text-text-primary truncate\">{namespace}</p>\n </div>\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5\">Pipeline Tool</p>\n {sourceWorkflow ? (\n <Link to={`/mcp/workflows/${sourceWorkflow.id}`} className=\"text-xs font-mono text-accent hover:underline truncate block\">\n {execution.workflow_type}\n </Link>\n ) : (\n <p className=\"text-xs font-mono text-text-primary truncate\">{execution.workflow_type || '—'}</p>\n )}\n </div>\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5\">Duration</p>\n <p className=\"text-xs font-mono text-text-primary\">{formatDuration(execution.duration_ms)}</p>\n </div>\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5\">Started</p>\n <p className=\"text-xs font-mono text-text-primary\">{formatTimestamp(execution.start_time)}</p>\n </div>\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5\">Completed</p>\n <p className=\"text-xs font-mono text-text-primary\">{formatTimestamp(execution.close_time)}</p>\n </div>\n </div>\n\n {/* Row 2: Trace (left) + Stats (right) */}\n <div className=\"flex items-center mt-4 pt-3 border-t border-surface-border\">\n <div className=\"flex-1\">\n {execution.trace_id ? (\n <CopyableId\n label=\"Trace\"\n value={execution.trace_id}\n href={traceUrl ? traceUrl.replace('{traceId}', execution.trace_id) : undefined}\n external\n />\n ) : (\n <span className=\"text-[10px] text-text-tertiary\">No trace</span>\n )}\n </div>\n <div className=\"flex items-center gap-5\">\n <Stat label=\"Tools\" value={summary.activities.user} />\n <Stat label=\"System\" value={summary.activities.system} muted />\n {summary.child_workflows.total > 0 && (\n <Stat label=\"Children\" value={summary.child_workflows.total} />\n )}\n {summary.timers > 0 && <Stat label=\"Timers\" value={summary.timers} />}\n {summary.signals > 0 && <Stat label=\"Signals\" value={summary.signals} />}\n <Stat label=\"Total\" value={summary.total_events} muted />\n </div>\n </div>\n </div>\n\n {/* ── Sections ────────────────────────────────────── */}\n <div className=\"space-y-6\">\n {/* Details: Input + Result */}\n <CollapsibleSection title=\"Details\" sectionKey=\"details\" isCollapsed={isCollapsed('details')} onToggle={toggle}>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4 mb-6\">\n <div>\n <JsonViewer data={triggerInput ?? {}} label=\"Input\" />\n </div>\n {result !== null && (\n <div>\n <JsonViewer data={result} label=\"Result\" />\n </div>\n )}\n </div>\n </CollapsibleSection>\n\n {/* Execution Timeline (swimlane) */}\n <CollapsibleSection title=\"Execution Timeline\" sectionKey=\"timeline\" isCollapsed={isCollapsed('timeline')} onToggle={toggle}>\n <SwimlaneTimeline events={events} outline />\n </CollapsibleSection>\n\n {/* Events (table) */}\n <CollapsibleSection title=\"Events\" sectionKey=\"events\" isCollapsed={isCollapsed('events')} onToggle={toggle}>\n <EventTable events={events} />\n </CollapsibleSection>\n </div>\n </div>\n );\n}\n\n// ── Stat pill ────────────────────────────────────────────────────────────────\n\nfunction Stat({ label, value, muted }: { label: string; value: number; muted?: boolean }) {\n return (\n <div className=\"flex items-center gap-1.5 text-xs\">\n <span className=\"text-text-tertiary\">{label}</span>\n <span className={`font-medium tabular-nums ${muted ? 'text-text-tertiary' : 'text-text-primary'}`}>{value}</span>\n </div>\n );\n}\n"],"names":["statusMap","formatTimestamp","iso","McpRunDetailPage","jobId","useParams","searchParams","useSearchParams","namespace","queryClient","useQueryClient","execution","isLoading","error","useMcpRunExecution","settings","useSettings","isCollapsed","toggle","useCollapsedSections","workflowTopic","yamlMatch","useYamlWorkflowByTopic","sourceWorkflow","_a","traceUrl","_b","activityHandler","useCallback","event","useEventSubscription","NATS_SUBJECT_PREFIX","jsxs","jsx","PageHeader","_c","events","summary","triggerCompleted","e","triggerInput","rawResult","result","StatusBadge","Link","formatDuration","CopyableId","Stat","CollapsibleSection","JsonViewer","SwimlaneTimeline","EventTable","label","value","muted"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{a as p,j as t}from"./vendor-query-B2UbickB.js";import{a as T,u as C}from"./mcp-runs-ChPbpvXK.js";import{a as M}from"./yaml-workflows-BL4V5CQy.js";import{u as R}from"./namespaces-BgbaC3ow.js";import{u as F}from"./useFilterParams-BaXUAkYK.js";import{D as E}from"./DataTable-BDn1WBHS.js";import{S as z}from"./StatusBadge-TlC4jiig.js";import{P as I}from"./PageHeader-CpWFly5S.js";import{F as O,b as f}from"./FilterBar-Ck4K4rzu.js";import{S as U}from"./StickyPagination-F9FZsRy9.js";import{b as A}from"./vendor-react-Cw8Gy8NJ.js";import"./index-D8VH6K8B.js";import"./vendor-icons-ZTAKVwGc.js";import"./EmptyState-2CmV-IaS.js";const B={running:"in_progress",completed:"completed",failed:"failed"},$=[{key:"status",label:"Status",render:a=>t.jsx(z,{status:B[a.status]??a.status}),className:"w-32"},{key:"entity",label:"Tool",render:a=>t.jsx("span",{className:"font-mono text-xs text-text-secondary",children:a.entity||"—"})},{key:"workflow_id",label:"Run ID",render:a=>t.jsx("span",{className:"font-mono text-xs text-text-secondary truncate max-w-[280px] block",children:a.workflow_id})},{key:"created_at",label:"Started",render:a=>t.jsx("span",{className:"text-xs text-text-secondary font-mono",children:new Date(a.created_at).toISOString().replace("T"," ").slice(0,23)}),className:"w-52"},{key:"updated_at",label:"Updated",render:a=>t.jsx("span",{className:"text-xs text-text-secondary font-mono",children:new Date(a.updated_at).toISOString().replace("T"," ").slice(0,23)}),className:"w-52"}];function te(){const a=A(),{filters:s,setFilter:u,setFilters:b,pagination:r}=F({filters:{search:"",entity:"",status:"",namespace:""}}),[d,j]=p.useState(s.search);p.useEffect(()=>{if(d===s.search)return;const e=setTimeout(()=>u("search",d),300);return()=>clearTimeout(e)},[d,u,s.search]);const{data:l}=M(),{data:c}=R(),x=p.useMemo(()=>{const e=new Set((l==null?void 0:l.app_ids)??[]);for(const n of(c==null?void 0:c.namespaces)??[])e.add(n.name);return[...e].sort()},[l==null?void 0:l.app_ids,c==null?void 0:c.namespaces]),v=x.includes("longtail")?"longtail":x[0]??"",i=s.namespace||v,{data:m}=T(i),{data:o,isLoading:N}=C({app_id:i,limit:r.pageSize,offset:r.offset,entity:s.entity||void 0,search:s.search||void 0,status:s.status||void 0}),g=(o==null?void 0:o.total)??0,k=p.useMemo(()=>{const e=(o==null?void 0:o.jobs)??[],n={running:0,failed:1,completed:2};return[...e].sort((y,S)=>{const h=n[y.status]??9,w=n[S.status]??9;return h!==w?h-w:new Date(S.created_at).getTime()-new Date(y.created_at).getTime()})},[o==null?void 0:o.jobs]),_=p.useMemo(()=>{const e=new Set(x);return i&&e.add(i),[...e].sort().map(n=>({value:n,label:n}))},[x,i]),P=p.useMemo(()=>{const e=new Set((m==null?void 0:m.entities)??[]);return s.entity&&!e.has(s.entity)&&e.add(s.entity),[...e].sort().map(n=>({value:n,label:n}))},[m==null?void 0:m.entities,s.entity]);return t.jsxs("div",{children:[t.jsx(I,{title:"Pipeline Executions"}),t.jsxs(O,{children:[t.jsx(f,{label:"Namespace",value:i,onChange:e=>{b({namespace:e,entity:""})},options:_,required:!0}),t.jsx("input",{type:"text",placeholder:"Search run ID...",value:d,onChange:e=>j(e.target.value),className:"input text-[11px] py-1 px-2 w-56"}),t.jsx(f,{label:"Tool",value:s.entity,onChange:e=>u("entity",e),options:P}),t.jsx(f,{label:"Status",value:s.status,onChange:e=>u("status",e),options:[{value:"running",label:"Running"},{value:"completed",label:"Completed"},{value:"failed",label:"Failed"}]})]}),t.jsx(E,{columns:$,data:k,keyFn:e=>e.workflow_id,onRowClick:e=>a(`/mcp/executions/${encodeURIComponent(e.workflow_id)}?namespace=${i}`),isLoading:N,emptyMessage:"No runs found"}),t.jsx(U,{page:r.page,totalPages:r.totalPages(g),onPageChange:r.setPage,total:g,pageSize:r.pageSize,onPageSizeChange:r.setPageSize})]})}export{te as McpRunsPage};
2
+ //# sourceMappingURL=McpRunsPage-Dl5Y2u6k.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"McpRunsPage-Dl5Y2u6k.js","sources":["../../src/pages/mcp/McpRunsPage.tsx"],"sourcesContent":["import { useState, useEffect, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { useMcpRuns, useMcpEntities } from '../../api/mcp-runs';\nimport { useYamlWorkflowAppIds } from '../../api/yaml-workflows';\nimport { useNamespaces } from '../../api/namespaces';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { DataTable, type Column } from '../../components/common/data/DataTable';\nimport { StatusBadge } from '../../components/common/display/StatusBadge';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { FilterBar, FilterSelect } from '../../components/common/data/FilterBar';\nimport { StickyPagination } from '../../components/common/data/StickyPagination';\nimport type { LTJob } from '../../api/types';\n\nconst statusMap: Record<string, string> = {\n running: 'in_progress',\n completed: 'completed',\n failed: 'failed',\n};\n\nconst columns: Column<LTJob>[] = [\n {\n key: 'status',\n label: 'Status',\n render: (row) => <StatusBadge status={statusMap[row.status] ?? row.status} />,\n className: 'w-32',\n },\n {\n key: 'entity',\n label: 'Tool',\n render: (row) => (\n <span className=\"font-mono text-xs text-text-secondary\">{row.entity || '—'}</span>\n ),\n },\n {\n key: 'workflow_id',\n label: 'Run ID',\n render: (row) => (\n <span className=\"font-mono text-xs text-text-secondary truncate max-w-[280px] block\">\n {row.workflow_id}\n </span>\n ),\n },\n {\n key: 'created_at',\n label: 'Started',\n render: (row) => (\n <span className=\"text-xs text-text-secondary font-mono\">\n {new Date(row.created_at).toISOString().replace('T', ' ').slice(0, 23)}\n </span>\n ),\n className: 'w-52',\n },\n {\n key: 'updated_at',\n label: 'Updated',\n render: (row) => (\n <span className=\"text-xs text-text-secondary font-mono\">\n {new Date(row.updated_at).toISOString().replace('T', ' ').slice(0, 23)}\n </span>\n ),\n className: 'w-52',\n },\n];\n\nexport function McpRunsPage() {\n const navigate = useNavigate();\n const { filters, setFilter, setFilters, pagination } = useFilterParams({\n filters: { search: '', entity: '', status: '', namespace: '' },\n });\n\n const [searchInput, setSearchInput] = useState(filters.search);\n\n useEffect(() => {\n if (searchInput === filters.search) return;\n const timer = setTimeout(() => setFilter('search', searchInput), 300);\n return () => clearTimeout(timer);\n }, [searchInput, setFilter, filters.search]);\n\n const { data: appIdData } = useYamlWorkflowAppIds();\n const { data: nsData } = useNamespaces();\n\n // Build the full namespace list: YAML app_ids + registered namespaces\n const allNamespaceNames = useMemo(() => {\n const set = new Set(appIdData?.app_ids ?? []);\n for (const ns of nsData?.namespaces ?? []) {\n set.add(ns.name);\n }\n return [...set].sort();\n }, [appIdData?.app_ids, nsData?.namespaces]);\n\n // Default: URL param > 'longtail' (if exists) > first in list\n const defaultNamespace = allNamespaceNames.includes('longtail')\n ? 'longtail'\n : allNamespaceNames[0] ?? '';\n const activeNamespace = filters.namespace || defaultNamespace;\n const { data: entitiesData } = useMcpEntities(activeNamespace);\n\n const { data: runsData, isLoading } = useMcpRuns({\n app_id: activeNamespace,\n limit: pagination.pageSize,\n offset: pagination.offset,\n entity: filters.entity || undefined,\n search: filters.search || undefined,\n status: filters.status || undefined,\n });\n\n const total = runsData?.total ?? 0;\n\n const jobs = useMemo(() => {\n const raw = runsData?.jobs ?? [];\n const STATUS_ORDER: Record<string, number> = { running: 0, failed: 1, completed: 2 };\n return [...raw].sort((a, b) => {\n const sa = STATUS_ORDER[a.status] ?? 9;\n const sb = STATUS_ORDER[b.status] ?? 9;\n if (sa !== sb) return sa - sb;\n return new Date(b.created_at).getTime() - new Date(a.created_at).getTime();\n });\n }, [runsData?.jobs]);\n\n const namespaces = useMemo(() => {\n const set = new Set(allNamespaceNames);\n // Always include the active namespace so deep-linked values appear\n if (activeNamespace) set.add(activeNamespace);\n return [...set].sort().map((id) => ({ value: id, label: id }));\n }, [allNamespaceNames, activeNamespace]);\n\n const entities = useMemo(() => {\n const known = new Set(entitiesData?.entities ?? []);\n if (filters.entity && !known.has(filters.entity)) known.add(filters.entity);\n return [...known].sort().map((e) => ({ value: e, label: e }));\n }, [entitiesData?.entities, filters.entity]);\n\n return (\n <div>\n <PageHeader title=\"Pipeline Executions\" />\n\n <FilterBar>\n <FilterSelect\n label=\"Namespace\"\n value={activeNamespace}\n onChange={(v) => {\n setFilters({ namespace: v, entity: '' });\n }}\n options={namespaces}\n required\n />\n <input\n type=\"text\"\n placeholder=\"Search run ID...\"\n value={searchInput}\n onChange={(e) => setSearchInput(e.target.value)}\n className=\"input text-[11px] py-1 px-2 w-56\"\n />\n <FilterSelect\n label=\"Tool\"\n value={filters.entity}\n onChange={(v) => setFilter('entity', v)}\n options={entities}\n />\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={[\n { value: 'running', label: 'Running' },\n { value: 'completed', label: 'Completed' },\n { value: 'failed', label: 'Failed' },\n ]}\n />\n </FilterBar>\n\n <DataTable\n columns={columns}\n data={jobs}\n keyFn={(row) => row.workflow_id}\n onRowClick={(row) => navigate(`/mcp/executions/${encodeURIComponent(row.workflow_id)}?namespace=${activeNamespace}`)}\n isLoading={isLoading}\n emptyMessage=\"No runs found\"\n />\n\n <StickyPagination\n page={pagination.page}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n total={total}\n pageSize={pagination.pageSize}\n onPageSizeChange={pagination.setPageSize}\n />\n </div>\n );\n}\n"],"names":["statusMap","columns","row","jsx","StatusBadge","McpRunsPage","navigate","useNavigate","filters","setFilter","setFilters","pagination","useFilterParams","searchInput","setSearchInput","useState","useEffect","timer","appIdData","useYamlWorkflowAppIds","nsData","useNamespaces","allNamespaceNames","useMemo","set","ns","defaultNamespace","activeNamespace","entitiesData","useMcpEntities","runsData","isLoading","useMcpRuns","total","jobs","raw","STATUS_ORDER","a","b","sa","sb","namespaces","id","entities","known","e","PageHeader","FilterBar","FilterSelect","v","DataTable","StickyPagination"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{a as x,j as e}from"./vendor-query-B2UbickB.js";import{f as c}from"./vendor-react-Cw8Gy8NJ.js";function o({open:r,onClose:t,title:a,children:i,maxWidth:n}){return x.useEffect(()=>{if(!r)return;const s=d=>{d.key==="Escape"&&t()};return document.addEventListener("keydown",s),()=>document.removeEventListener("keydown",s)},[r,t]),r?c.createPortal(e.jsxs("div",{className:"fixed inset-0 z-50 flex items-center justify-center",children:[e.jsx("div",{className:"absolute inset-0 bg-text-primary/30",onClick:t}),e.jsxs("div",{className:`relative bg-surface-raised border border-surface-border rounded-lg shadow-xl w-full ${n??"max-w-md"} mx-4 max-h-[85vh] flex flex-col`,children:[e.jsxs("div",{className:"flex items-center justify-between px-6 py-4 border-b shrink-0",children:[e.jsx("h2",{className:"text-sm font-medium text-text-primary",children:a}),e.jsx("button",{onClick:t,className:"text-text-tertiary hover:text-text-primary text-lg leading-none",children:"×"})]}),e.jsx("div",{className:"px-6 py-5 overflow-y-auto",children:i})]})]}),document.body):null}export{o as M};
2
+ //# sourceMappingURL=Modal-B4rbIVAn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Modal-B4rbIVAn.js","sources":["../../src/components/common/modal/Modal.tsx"],"sourcesContent":["import { useEffect, type ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\n\ninterface ModalProps {\n open: boolean;\n onClose: () => void;\n title: string;\n children: ReactNode;\n maxWidth?: string;\n}\n\nexport function Modal({ open, onClose, title, children, maxWidth }: ModalProps) {\n useEffect(() => {\n if (!open) return;\n const handler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n };\n document.addEventListener('keydown', handler);\n return () => document.removeEventListener('keydown', handler);\n }, [open, onClose]);\n\n if (!open) return null;\n\n return createPortal(\n <div className=\"fixed inset-0 z-50 flex items-center justify-center\">\n {/* Backdrop */}\n <div\n className=\"absolute inset-0 bg-text-primary/30\"\n onClick={onClose}\n />\n {/* Dialog */}\n <div className={`relative bg-surface-raised border border-surface-border rounded-lg shadow-xl w-full ${maxWidth ?? 'max-w-md'} mx-4 max-h-[85vh] flex flex-col`}>\n <div className=\"flex items-center justify-between px-6 py-4 border-b shrink-0\">\n <h2 className=\"text-sm font-medium text-text-primary\">{title}</h2>\n <button\n onClick={onClose}\n className=\"text-text-tertiary hover:text-text-primary text-lg leading-none\"\n >\n &times;\n </button>\n </div>\n <div className=\"px-6 py-5 overflow-y-auto\">{children}</div>\n </div>\n </div>,\n document.body,\n );\n}\n"],"names":["Modal","open","onClose","title","children","maxWidth","useEffect","handler","e","createPortal","jsxs","jsx"],"mappings":"qGAWO,SAASA,EAAM,CAAE,KAAAC,EAAM,QAAAC,EAAS,MAAAC,EAAO,SAAAC,EAAU,SAAAC,GAAwB,CAU9E,OATAC,EAAAA,UAAU,IAAM,CACd,GAAI,CAACL,EAAM,OACX,MAAMM,EAAWC,GAAqB,CAChCA,EAAE,MAAQ,UAAUN,EAAA,CAC1B,EACA,gBAAS,iBAAiB,UAAWK,CAAO,EACrC,IAAM,SAAS,oBAAoB,UAAWA,CAAO,CAC9D,EAAG,CAACN,EAAMC,CAAO,CAAC,EAEbD,EAEEQ,EAAAA,aACLC,EAAAA,KAAC,MAAA,CAAI,UAAU,sDAEb,SAAA,CAAAC,EAAAA,IAAC,MAAA,CACC,UAAU,sCACV,QAAST,CAAA,CAAA,SAGV,MAAA,CAAI,UAAW,uFAAuFG,GAAY,UAAU,mCAC3H,SAAA,CAAAK,EAAAA,KAAC,MAAA,CAAI,UAAU,gEACb,SAAA,CAAAC,EAAAA,IAAC,KAAA,CAAG,UAAU,wCAAyC,SAAAR,EAAM,EAC7DQ,EAAAA,IAAC,SAAA,CACC,QAAST,EACT,UAAU,kEACX,SAAA,GAAA,CAAA,CAED,EACF,EACAS,EAAAA,IAAC,MAAA,CAAI,UAAU,4BAA6B,SAAAP,CAAA,CAAS,CAAA,CAAA,CACvD,CAAA,EACF,EACA,SAAS,IAAA,EAvBO,IAyBpB"}
@@ -0,0 +1,2 @@
1
+ import{j as t}from"./vendor-query-B2UbickB.js";import{f as b,n as v,l as S,m as P}from"./index-D8VH6K8B.js";import{d as h}from"./useNatsEvents-Xr43X1fG.js";import{u as j}from"./roles-ZNrqqnQl.js";import{u as C}from"./useFilterParams-BaXUAkYK.js";import{D as _}from"./DataTable-BDn1WBHS.js";import{P as R}from"./PageHeader-CpWFly5S.js";import{S as w}from"./StickyPagination-F9FZsRy9.js";import{R as L,a as N}from"./RowActions-Dg-Fsm5O.js";import{a as k,T as F,E as T}from"./escalation-columns-D6aqStaY.js";import{n as z}from"./vendor-icons-ZTAKVwGc.js";import{b as A}from"./vendor-react-Cw8Gy8NJ.js";import"./EmptyState-2CmV-IaS.js";import"./FilterBar-Ck4K4rzu.js";import"./PriorityBadge-DfQY9St9.js";import"./RolePill-BTPa8L-P.js";import"./WorkflowPill-CCDSVaQj.js";import"./TimestampCell-DoWMKg6w.js";import"./TimeAgo-UPG6DoH8.js";import"./format-gXZXQ-HJ.js";import"./escalation-qalymbKB.js";function oe(){h();const c=A(),{user:n}=b(),{filters:a,setFilter:d,pagination:s,sort:r,setSort:g}=C({filters:{role:"",type:"",priority:""}}),u=v(),{data:l}=j(),{data:m}=S(),{data:o,isLoading:f,error:i}=P({assigned_to:n==null?void 0:n.userId,status:"pending",role:a.role||void 0,type:a.type||void 0,priority:a.priority?parseInt(a.priority):void 0,limit:s.pageSize,offset:s.offset,sort_by:r.sort_by||void 0,order:r.sort_by?r.order:void 0}),x=((o==null?void 0:o.escalations)??[]).filter(e=>e.assigned_until&&new Date(e.assigned_until)>new Date),p=(o==null?void 0:o.total)??0,y={key:"actions",label:"",render:e=>t.jsx(L,{children:t.jsx(N,{icon:z,title:"Release escalation",onClick:()=>u.mutate(e.id),colorClass:"text-text-tertiary hover:text-status-warning"})}),className:"w-16 text-right"},E=[F,...T,y];return t.jsxs("div",{children:[t.jsx(R,{title:"My Escalations"}),t.jsx(k,{filters:a,setFilter:d,roles:(l==null?void 0:l.roles)??[],types:(m==null?void 0:m.types)??[]}),i&&t.jsx("div",{className:"mb-4 px-4 py-3 rounded-md bg-status-error/10 border border-status-error/20 text-xs text-status-error",children:i.message==="Session expired"?"Your session has expired. Please log in again.":`Failed to load escalations: ${i.message}`}),t.jsx(_,{columns:E,data:x,keyFn:e=>e.id,onRowClick:e=>c(`/escalations/detail/${e.id}`,{state:{from:"/escalations/queue"}}),isLoading:f,emptyMessage:i?"Unable to load data":"No assigned escalations",sort:r,onSort:g}),t.jsx(w,{page:s.page,totalPages:s.totalPages(p),onPageChange:s.setPage,total:p,pageSize:s.pageSize,onPageSizeChange:s.setPageSize})]})}export{oe as OperatorDashboard};
2
+ //# sourceMappingURL=OperatorDashboard-B56il28q.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OperatorDashboard-B56il28q.js","sources":["../../src/pages/operator/OperatorDashboard.tsx"],"sourcesContent":["import { useNavigate } from 'react-router-dom';\nimport { LockOpen } from 'lucide-react';\nimport { useAuth } from '../../hooks/useAuth';\nimport { useEscalations, useEscalationTypes, useReleaseEscalation } from '../../api/escalations';\nimport { useEscalationListEvents } from '../../hooks/useNatsEvents';\nimport { useRoles } from '../../api/roles';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { DataTable, type Column } from '../../components/common/data/DataTable';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { StickyPagination } from '../../components/common/data/StickyPagination';\nimport { RowAction, RowActionGroup } from '../../components/common/layout/RowActions';\nimport { ESCALATION_COLUMNS, TIME_LEFT_COLUMN, EscalationFilterBar } from './escalation-columns';\nimport type { LTEscalationRecord } from '../../api/types';\n\nexport function OperatorDashboard() {\n useEscalationListEvents();\n const navigate = useNavigate();\n const { user } = useAuth();\n const { filters, setFilter, pagination, sort, setSort } = useFilterParams({\n filters: { role: '', type: '', priority: '' },\n });\n const release = useReleaseEscalation();\n const { data: rolesData } = useRoles();\n const { data: typesData } = useEscalationTypes();\n\n const { data, isLoading, error: queryError } = useEscalations({\n assigned_to: user?.userId,\n status: 'pending',\n role: filters.role || undefined,\n type: filters.type || undefined,\n priority: filters.priority ? parseInt(filters.priority) : undefined,\n limit: pagination.pageSize,\n offset: pagination.offset,\n sort_by: sort.sort_by || undefined,\n order: sort.sort_by ? sort.order : undefined,\n });\n\n // Exclude expired claims — they're back in the available pool\n const activeClaims = (data?.escalations ?? []).filter(\n (e) => e.assigned_until && new Date(e.assigned_until) > new Date(),\n );\n const total = data?.total ?? 0;\n\n const releaseColumn: Column<LTEscalationRecord> = {\n key: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n <RowAction\n icon={LockOpen}\n title=\"Release escalation\"\n onClick={() => release.mutate(row.id)}\n colorClass=\"text-text-tertiary hover:text-status-warning\"\n />\n </RowActionGroup>\n ),\n className: 'w-16 text-right',\n };\n\n // Time-left first (aligns with checkbox on All Escalations), then summary + base columns + actions\n const columns: Column<LTEscalationRecord>[] = [\n TIME_LEFT_COLUMN,\n ...ESCALATION_COLUMNS,\n releaseColumn,\n ];\n\n return (\n <div>\n <PageHeader title=\"My Escalations\" />\n\n <EscalationFilterBar\n filters={filters}\n setFilter={setFilter}\n roles={rolesData?.roles ?? []}\n types={typesData?.types ?? []}\n />\n\n {queryError && (\n <div className=\"mb-4 px-4 py-3 rounded-md bg-status-error/10 border border-status-error/20 text-xs text-status-error\">\n {(queryError as Error).message === 'Session expired'\n ? 'Your session has expired. Please log in again.'\n : `Failed to load escalations: ${(queryError as Error).message}`}\n </div>\n )}\n\n <DataTable\n columns={columns}\n data={activeClaims}\n keyFn={(row) => row.id}\n onRowClick={(row) => navigate(`/escalations/detail/${row.id}`, { state: { from: '/escalations/queue' } })}\n isLoading={isLoading}\n emptyMessage={queryError ? 'Unable to load data' : 'No assigned escalations'}\n sort={sort}\n onSort={setSort}\n />\n\n <StickyPagination\n page={pagination.page}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n total={total}\n pageSize={pagination.pageSize}\n onPageSizeChange={pagination.setPageSize}\n />\n </div>\n );\n}\n"],"names":["OperatorDashboard","useEscalationListEvents","navigate","useNavigate","user","useAuth","filters","setFilter","pagination","sort","setSort","useFilterParams","release","useReleaseEscalation","rolesData","useRoles","typesData","useEscalationTypes","data","isLoading","queryError","useEscalations","activeClaims","total","releaseColumn","row","jsx","RowActionGroup","RowAction","LockOpen","columns","TIME_LEFT_COLUMN","ESCALATION_COLUMNS","PageHeader","EscalationFilterBar","DataTable","StickyPagination"],"mappings":"83BAcO,SAASA,IAAoB,CAClCC,EAAA,EACA,MAAMC,EAAWC,EAAA,EACX,CAAE,KAAAC,CAAA,EAASC,EAAA,EACX,CAAE,QAAAC,EAAS,UAAAC,EAAW,WAAAC,EAAY,KAAAC,EAAM,QAAAC,CAAA,EAAYC,EAAgB,CACxE,QAAS,CAAE,KAAM,GAAI,KAAM,GAAI,SAAU,EAAA,CAAG,CAC7C,EACKC,EAAUC,EAAA,EACV,CAAE,KAAMC,CAAA,EAAcC,EAAA,EACtB,CAAE,KAAMC,CAAA,EAAcC,EAAA,EAEtB,CAAE,KAAAC,EAAM,UAAAC,EAAW,MAAOC,CAAA,EAAeC,EAAe,CAC5D,YAAajB,GAAA,YAAAA,EAAM,OACnB,OAAQ,UACR,KAAME,EAAQ,MAAQ,OACtB,KAAMA,EAAQ,MAAQ,OACtB,SAAUA,EAAQ,SAAW,SAASA,EAAQ,QAAQ,EAAI,OAC1D,MAAOE,EAAW,SAClB,OAAQA,EAAW,OACnB,QAASC,EAAK,SAAW,OACzB,MAAOA,EAAK,QAAUA,EAAK,MAAQ,MAAA,CACpC,EAGKa,IAAgBJ,GAAA,YAAAA,EAAM,cAAe,CAAA,GAAI,OAC5C,GAAM,EAAE,gBAAkB,IAAI,KAAK,EAAE,cAAc,EAAI,IAAI,IAAK,EAE7DK,GAAQL,GAAA,YAAAA,EAAM,QAAS,EAEvBM,EAA4C,CAChD,IAAK,UACL,MAAO,GACP,OAASC,GACPC,EAAAA,IAACC,EAAA,CACC,SAAAD,EAAAA,IAACE,EAAA,CACC,KAAMC,EACN,MAAM,qBACN,QAAS,IAAMjB,EAAQ,OAAOa,EAAI,EAAE,EACpC,WAAW,8CAAA,CAAA,EAEf,EAEF,UAAW,iBAAA,EAIPK,EAAwC,CAC5CC,EACA,GAAGC,EACHR,CAAA,EAGF,cACG,MAAA,CACC,SAAA,CAAAE,EAAAA,IAACO,EAAA,CAAW,MAAM,gBAAA,CAAiB,EAEnCP,EAAAA,IAACQ,EAAA,CACC,QAAA5B,EACA,UAAAC,EACA,OAAOO,GAAA,YAAAA,EAAW,QAAS,CAAA,EAC3B,OAAOE,GAAA,YAAAA,EAAW,QAAS,CAAA,CAAC,CAAA,EAG7BI,GACCM,EAAAA,IAAC,MAAA,CAAI,UAAU,uGACX,SAAAN,EAAqB,UAAY,kBAC/B,iDACA,+BAAgCA,EAAqB,OAAO,GAClE,EAGFM,EAAAA,IAACS,EAAA,CACC,QAAAL,EACA,KAAMR,EACN,MAAQG,GAAQA,EAAI,GACpB,WAAaA,GAAQvB,EAAS,uBAAuBuB,EAAI,EAAE,GAAI,CAAE,MAAO,CAAE,KAAM,oBAAA,EAAwB,EACxG,UAAAN,EACA,aAAcC,EAAa,sBAAwB,0BACnD,KAAAX,EACA,OAAQC,CAAA,CAAA,EAGVgB,EAAAA,IAACU,EAAA,CACC,KAAM5B,EAAW,KACjB,WAAYA,EAAW,WAAWe,CAAK,EACvC,aAAcf,EAAW,QACzB,MAAAe,EACA,SAAUf,EAAW,SACrB,iBAAkBA,EAAW,WAAA,CAAA,CAC/B,EACF,CAEJ"}
@@ -0,0 +1,2 @@
1
+ import{j as e}from"./vendor-query-B2UbickB.js";function x({title:s,actions:t}){return e.jsxs("div",{className:"flex items-center gap-4 mb-10",children:[e.jsx("h1",{className:"text-3xl font-light text-text-primary flex-1",children:s}),t&&e.jsx("div",{className:"flex items-center gap-3",children:t})]})}export{x as P};
2
+ //# sourceMappingURL=PageHeader-CpWFly5S.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PageHeader-CpWFly5S.js","sources":["../../src/components/common/layout/PageHeader.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\ninterface PageHeaderProps {\n title: string;\n actions?: ReactNode;\n}\n\nexport function PageHeader({ title, actions }: PageHeaderProps) {\n return (\n <div className=\"flex items-center gap-4 mb-10\">\n <h1 className=\"text-3xl font-light text-text-primary flex-1\">{title}</h1>\n {actions && <div className=\"flex items-center gap-3\">{actions}</div>}\n </div>\n );\n}\n"],"names":["PageHeader","title","actions","jsxs","jsx"],"mappings":"+CAOO,SAASA,EAAW,CAAE,MAAAC,EAAO,QAAAC,GAA4B,CAC9D,OACEC,EAAAA,KAAC,MAAA,CAAI,UAAU,gCACb,SAAA,CAAAC,EAAAA,IAAC,KAAA,CAAG,UAAU,+CAAgD,SAAAH,EAAM,EACnEC,GAAWE,EAAAA,IAAC,MAAA,CAAI,UAAU,0BAA2B,SAAAF,CAAA,CAAQ,CAAA,EAChE,CAEJ"}
@@ -0,0 +1,2 @@
1
+ import{j as e}from"./vendor-query-B2UbickB.js";const r={1:"P1",2:"P2",3:"P3",4:"P4"},s={1:"text-text-primary font-semibold",2:"text-text-primary font-medium",3:"text-text-secondary",4:"text-text-tertiary"};function o({priority:t}){return e.jsx("span",{className:`text-xs ${s[t]??"text-text-secondary"}`,children:r[t]??`P${t}`})}export{o as P};
2
+ //# sourceMappingURL=PriorityBadge-DfQY9St9.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PriorityBadge-DfQY9St9.js","sources":["../../src/components/common/display/PriorityBadge.tsx"],"sourcesContent":["const priorityLabels: Record<number, string> = {\n 1: 'P1',\n 2: 'P2',\n 3: 'P3',\n 4: 'P4',\n};\n\nconst priorityStyles: Record<number, string> = {\n 1: 'text-text-primary font-semibold',\n 2: 'text-text-primary font-medium',\n 3: 'text-text-secondary',\n 4: 'text-text-tertiary',\n};\n\nexport function PriorityBadge({ priority }: { priority: number }) {\n return (\n <span className={`text-xs ${priorityStyles[priority] ?? 'text-text-secondary'}`}>\n {priorityLabels[priority] ?? `P${priority}`}\n </span>\n );\n}\n"],"names":["priorityLabels","priorityStyles","PriorityBadge","priority","jsx"],"mappings":"+CAAA,MAAMA,EAAyC,CAC7C,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,IACL,EAEMC,EAAyC,CAC7C,EAAG,kCACH,EAAG,gCACH,EAAG,sBACH,EAAG,oBACL,EAEO,SAASC,EAAc,CAAE,SAAAC,GAAkC,CAChE,OACEC,EAAAA,IAAC,OAAA,CAAK,UAAW,WAAWH,EAAeE,CAAQ,GAAK,qBAAqB,GAC1E,SAAAH,EAAeG,CAAQ,GAAK,IAAIA,CAAQ,GAC3C,CAEJ"}
@@ -0,0 +1,2 @@
1
+ import{a as N,j as e}from"./vendor-query-B2UbickB.js";import{a as z}from"./tasks-tRqClPns.js";import{u as H}from"./settings-eBRSE0mQ.js";import{P as V}from"./PageHeader-CpWFly5S.js";import{C as q,S as L}from"./index-D8VH6K8B.js";import{S as M}from"./StatCard-DlgF0CJC.js";import{f as k}from"./format-gXZXQ-HJ.js";import{S as I}from"./StatusBadge-TlC4jiig.js";import{W as G}from"./WorkflowPill-CCDSVaQj.js";import{T}from"./TimeAgo-UPG6DoH8.js";import{L as D,d as J}from"./vendor-react-Cw8Gy8NJ.js";import{R as K}from"./RolePill-BTPa8L-P.js";import{U as Q}from"./UserName-DaP4YAKr.js";import"./vendor-icons-ZTAKVwGc.js";import"./users-tMvNyOo8.js";const X="bg-stripes animate-pulse opacity-70";function S(t){switch(t){case"completed":return"text-status-success";case"in_progress":case"pending":return"text-status-warning";case"needs_intervention":return"text-status-error";case"cancelled":return"text-text-tertiary";default:return"text-text-tertiary"}}function $(t){switch(t){case"resolved":return"text-status-success";case"pending":return"text-status-warning";case"cancelled":return"text-text-tertiary";default:return"text-text-tertiary"}}function Y(t,a,o){return`${t==="task"?"Task":o?"Notification":"Escalation"} is ${a.replace(/_/g," ")}`}function Z(t,a){if(a)return X;switch(t){case"completed":case"resolved":return"bg-status-success";case"pending":case"in_progress":case"needs_intervention":return"bg-status-warning";case"cancelled":return"bg-status-error";default:return"bg-text-tertiary"}}function ee(t){return t.startsWith("mcp")||t.startsWith("Mcp")}function P(t){return!t.workflow_type}function A(t,a){if(t.length<=a)return t;const o=Math.floor((a-1)/2);return`${t.slice(0,o)}…${t.slice(t.length-o)}`}function _(t){return new Date(t).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit"})}function te(t,a){const o=Date.now(),c=new Map,r=[];for(const s of a)s.task_id?(c.has(s.task_id)||c.set(s.task_id,[]),c.get(s.task_id).push(s)):r.push(s);const l=[...t].sort((s,d)=>new Date(s.created_at).getTime()-new Date(d.created_at).getTime()),n=[];for(const s of t)n.push(new Date(s.created_at).getTime()),s.completed_at&&n.push(new Date(s.completed_at).getTime());for(const s of a)n.push(new Date(s.created_at).getTime()),s.resolved_at&&n.push(new Date(s.resolved_at).getTime()),s.claimed_at&&n.push(new Date(s.claimed_at).getTime());if(n.length===0)return{lanes:[],timeMin:0,timeMax:1};const x=Math.min(...n),h=t.some(s=>!s.completed_at)||a.some(s=>!s.resolved_at)?Math.max(o,Math.max(...n)):Math.max(...n),m=h-x||1,p=s=>(s-x)/m*100,f=[];for(const s of l){const d=new Date(s.created_at).getTime(),g=s.completed_at?new Date(s.completed_at).getTime():o,u=!s.completed_at;f.push({kind:"task",id:s.id,label:s.workflow_type,taskId:s.id,startMs:d,endMs:g,startPct:p(d),widthPct:Math.max((g-d)/m*100,.5),durationMs:g-d,isOpen:u,task:s});const y=(c.get(s.id)||[]).sort((i,j)=>new Date(i.created_at).getTime()-new Date(j.created_at).getTime());for(const i of y){const j=new Date(i.created_at).getTime(),w=i.resolved_at?new Date(i.resolved_at).getTime():o,R=!i.resolved_at;let C=null;if(i.claimed_at){const O=new Date(i.claimed_at).getTime(),U=w-j||1;C=(O-j)/U*100}f.push({kind:"escalation",id:i.id,label:i.role,taskId:s.id,startMs:j,endMs:w,startPct:p(j),widthPct:Math.max((w-j)/m*100,.5),durationMs:w-j,isOpen:R,escalation:i,claimPct:C})}}for(const s of r){const d=new Date(s.created_at).getTime(),g=s.resolved_at?new Date(s.resolved_at).getTime():o;let u=null;if(s.claimed_at){const y=new Date(s.claimed_at).getTime(),i=g-d||1;u=(y-d)/i*100}f.push({kind:"escalation",id:s.id,label:s.role,taskId:"",startMs:d,endMs:g,startPct:p(d),widthPct:Math.max((g-d)/m*100,.5),durationMs:g-d,isOpen:!s.resolved_at,escalation:s,claimPct:u})}return{lanes:f,timeMin:x,timeMax:h}}function se(t,a,o,c=500){const[r,l]=N.useState(0),n=N.useRef(null),x=o-a||1;N.useEffect(()=>{if(t===0)return;n.current=null,l(0);let h;const m=p=>{n.current===null&&(n.current=p);const f=p-n.current,s=Math.min(f/c,1),d=1-Math.pow(1-s,3);l(d),s<1&&(h=requestAnimationFrame(m))};return h=requestAnimationFrame(m),()=>cancelAnimationFrame(h)},[t,c]);const v=N.useCallback(h=>{const m=(h.startMs-a)/x,p=(h.endMs-a)/x;if(r<m)return{width:0,opacity:0};const f=p-m||.001,s=Math.min((r-m)/f,1),d=h.widthPct*s,g=Math.min(s/.1,1);return{width:d,opacity:g}},[r,a,x]);return{progress:r,animatedBar:v}}function E({className:t}){return e.jsx("svg",{className:t,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"})})}function B({className:t}){return e.jsx("svg",{className:t,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M9.813 15.904L9 18.75l-.813-2.846a4.5 4.5 0 00-3.09-3.09L2.25 12l2.846-.813a4.5 4.5 0 003.09-3.09L9 5.25l.813 2.846a4.5 4.5 0 003.09 3.09L15.75 12l-2.846.813a4.5 4.5 0 00-3.09 3.09zM18.259 8.715L18 9.75l-.259-1.035a3.375 3.375 0 00-2.455-2.456L14.25 6l1.036-.259a3.375 3.375 0 002.455-2.456L18 2.25l.259 1.035a3.375 3.375 0 002.455 2.456L21.75 6l-1.036.259a3.375 3.375 0 00-2.455 2.456zM16.894 20.567L16.5 21.75l-.394-1.183a2.25 2.25 0 00-1.423-1.423L13.5 18.75l1.183-.394a2.25 2.25 0 001.423-1.423l.394-1.183.394 1.183a2.25 2.25 0 001.423 1.423l1.183.394-1.183.394a2.25 2.25 0 00-1.423 1.423z"})})}function F({className:t}){return e.jsx("svg",{className:t,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0"})})}function W({className:t}){return e.jsx("svg",{className:t,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M15.75 6a3.75 3.75 0 11-7.5 0 3.75 3.75 0 017.5 0zM4.501 20.118a7.5 7.5 0 0114.998 0A17.933 17.933 0 0112 21.75c-2.676 0-5.216-.584-7.499-1.632z"})})}function ae({allExpanded:t,onToggleAll:a}){return e.jsxs("div",{className:"flex items-center gap-4 mb-4 flex-wrap",children:[e.jsx("button",{onClick:a,className:"text-[10px] text-accent hover:underline",children:t?"Collapse all":"Expand all"}),e.jsxs("div",{className:"flex items-center gap-4 ml-auto",children:[e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(E,{className:"w-3.5 h-3.5 text-text-tertiary"}),e.jsx("span",{className:"text-[9px] text-text-tertiary",children:"Task"})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(B,{className:"w-3.5 h-3.5 text-text-tertiary"}),e.jsx("span",{className:"text-[9px] text-text-tertiary",children:"AI Task"})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(W,{className:"w-3.5 h-3.5 text-text-tertiary"}),e.jsx("span",{className:"text-[9px] text-text-tertiary",children:"Escalation"})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(F,{className:"w-3.5 h-3.5 text-text-tertiary"}),e.jsx("span",{className:"text-[9px] text-text-tertiary",children:"Notification"})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx("span",{className:"w-2 h-2 rounded-full bg-status-success"}),e.jsx("span",{className:"text-[9px] text-text-tertiary",children:"Done"})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx("span",{className:"w-2 h-2 rounded-full bg-status-warning"}),e.jsx("span",{className:"text-[9px] text-text-tertiary",children:"Active"})]})]})]})}function ne({ticks:t}){return e.jsxs("div",{className:"flex",children:[e.jsx("div",{className:"w-52 shrink-0"}),e.jsx("div",{className:"flex-1 relative h-6 border-b border-surface-border",children:t.map(a=>e.jsx("span",{className:"absolute text-[9px] font-mono text-text-tertiary -translate-x-1/2 bottom-1",style:{left:`${a.pct}%`},children:a.label},a.pct))})]})}function b({label:t,children:a}){return e.jsxs("div",{children:[e.jsx("p",{className:"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5",children:t}),e.jsx("div",{className:"text-xs text-text-primary",children:a})]})}function re({traceId:t,href:a}){const[o,c]=N.useState(!1),r=n=>{n.stopPropagation(),navigator.clipboard.writeText(t),c(!0),setTimeout(()=>c(!1),1500)},l=n=>{n.stopPropagation(),a&&window.open(a,"_blank","noopener,noreferrer")};return e.jsxs("span",{className:"group/trace inline-flex items-center gap-1.5",children:[a&&e.jsx("button",{onClick:l,title:"Open trace",className:"opacity-0 group-hover/trace:opacity-100 transition-opacity p-0.5",children:e.jsx("svg",{className:"w-3 h-3 text-text-tertiary hover:text-accent",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M13.5 6H5.25A2.25 2.25 0 003 8.25v10.5A2.25 2.25 0 005.25 21h10.5A2.25 2.25 0 0018 18.75V10.5m-4.5-4.5h6m0 0v6m0-6L10.5 15"})})}),e.jsx("button",{onClick:r,title:"Copy trace ID",className:"opacity-0 group-hover/trace:opacity-100 transition-opacity p-0.5",children:e.jsx("svg",{className:`w-3 h-3 transition-colors ${o?"text-status-success":"text-text-tertiary hover:text-accent"}`,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:o?e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M5 13l4 4L19 7"}):e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M8 5H6a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2v-1M8 5a2 2 0 002 2h2a2 2 0 002-2M8 5a2 2 0 012-2h2a2 2 0 012 2m0 0h2a2 2 0 012 2v3"})})}),e.jsx("span",{className:"text-[11px] text-accent",children:"Trace Details"})]})}function ie({task:t,traceUrl:a}){const o=t.completed_at?new Date(t.completed_at).getTime()-new Date(t.created_at).getTime():Date.now()-new Date(t.created_at).getTime();return e.jsxs("div",{className:"grid grid-cols-[3fr_1fr] gap-6",children:[e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(I,{status:t.status}),e.jsx(G,{type:t.workflow_type})]}),e.jsxs("div",{className:"grid grid-cols-3 gap-4",children:[e.jsxs(b,{label:"Started",children:[e.jsx("span",{className:"font-mono",children:_(t.created_at)}),e.jsx("p",{className:"text-[10px] text-text-tertiary mt-0.5",children:e.jsx(T,{date:t.created_at})})]}),e.jsx(b,{label:"Completed",children:t.completed_at?e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"font-mono",children:_(t.completed_at)}),e.jsx("p",{className:"text-[10px] text-text-tertiary mt-0.5",children:e.jsx(T,{date:t.completed_at})})]}):e.jsx("span",{className:"text-text-tertiary italic",children:"In progress"})}),e.jsx(b,{label:"Duration",children:e.jsx("span",{className:"font-mono text-sm",children:k(o)})})]}),t.milestones.length>0&&e.jsxs("div",{children:[e.jsx("p",{className:"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1.5",children:"Milestones"}),e.jsx("div",{className:"flex flex-wrap gap-1.5",children:t.milestones.map((c,r)=>e.jsxs("span",{className:"px-2 py-0.5 text-[10px] font-mono bg-accent-faint/50 rounded text-text-secondary",children:[c.name,": ",String(c.value)]},r))})]})]}),e.jsxs("div",{className:"flex flex-col items-end gap-2",children:[e.jsx(D,{to:`/workflows/executions/${encodeURIComponent(t.workflow_id)}`,className:"block text-[11px] text-accent hover:underline",children:"Execution Details"}),e.jsx(D,{to:`/workflows/tasks/detail/${t.id}`,className:"block text-[11px] text-accent hover:underline",children:"Task Details"}),t.trace_id&&e.jsx(re,{traceId:t.trace_id,href:a?a.replace("{traceId}",t.trace_id):void 0})]})]})}function oe({escalation:t}){const a=new Date(t.created_at).getTime(),o=t.claimed_at?new Date(t.claimed_at).getTime()-a:null,c=t.resolved_at?new Date(t.resolved_at).getTime()-a:null;return e.jsxs("div",{className:"grid grid-cols-[3fr_1fr] gap-6",children:[e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(I,{status:t.status}),e.jsx(K,{role:t.role}),t.type&&e.jsxs("span",{className:"text-[10px] text-text-tertiary",children:[t.type,t.subtype?` / ${t.subtype}`:""]})]}),e.jsxs("div",{className:"grid grid-cols-3 gap-4",children:[e.jsxs(b,{label:"Created",children:[e.jsx("span",{className:"font-mono",children:_(t.created_at)}),e.jsx("p",{className:"text-[10px] text-text-tertiary mt-0.5",children:e.jsx(T,{date:t.created_at})})]}),e.jsx(b,{label:"Claimed",children:t.claimed_at?e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"font-mono",children:_(t.claimed_at)}),e.jsxs("p",{className:"text-[10px] text-text-tertiary mt-0.5",children:["after ",k(o),t.assigned_to&&e.jsxs(e.Fragment,{children:[" ","by"," ",e.jsx("span",{className:"text-text-secondary font-medium",children:e.jsx(Q,{userId:t.assigned_to})})]})]})]}):e.jsx("span",{className:"text-text-tertiary italic",children:"Unclaimed"})}),e.jsx(b,{label:"Resolved",children:t.resolved_at?e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"font-mono",children:_(t.resolved_at)}),e.jsxs("p",{className:"text-[10px] text-text-tertiary mt-0.5",children:[k(c)," total"]})]}):e.jsx("span",{className:"text-text-tertiary italic",children:"Pending"})})]}),t.description&&e.jsxs("div",{children:[e.jsx("p",{className:"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Description"}),e.jsx("p",{className:"text-[11px] text-text-secondary leading-relaxed",children:t.description})]})]}),e.jsxs("div",{className:"flex flex-col items-end gap-2",children:[t.workflow_id&&e.jsx(D,{to:`/workflows/executions/${encodeURIComponent(t.workflow_id)}`,className:"block text-[11px] text-accent hover:underline",children:"Execution Details"}),e.jsx(D,{to:`/escalations/detail/${t.id}`,className:"block text-[11px] text-accent hover:underline",children:"Escalation Details"})]})]})}function ce({lane:t,ticks:a,isExpanded:o,onToggle:c,anim:r,animDone:l,traceUrl:n}){var p,f;const x=t.kind==="task",v=x?t.task.status:t.escalation.status,h=Z(v,t.isOpen),m=r.opacity>0;return e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center border-b border-surface-border cursor-pointer hover:bg-surface-sunken/40 transition-colors",onClick:c,children:[e.jsxs("div",{className:`w-52 shrink-0 py-3 pr-4 flex items-center gap-2 ${x?"":"pl-6"}`,style:{opacity:m?1:0,transition:"opacity 0.15s ease-out"},children:[x?ee(t.task.workflow_type)?e.jsx(B,{className:`w-4 h-4 shrink-0 ${S(t.task.status)}`}):e.jsx(E,{className:`w-4 h-4 shrink-0 ${S(t.task.status)}`}):P(t.escalation)?e.jsx(F,{className:`w-4 h-4 shrink-0 ${$(t.escalation.status)}`}):e.jsx(W,{className:`w-4 h-4 shrink-0 ${$(t.escalation.status)}`}),e.jsx("p",{className:"text-xs font-mono text-text-secondary whitespace-nowrap overflow-hidden",title:Y(t.kind,x?t.task.status:t.escalation.status,!x&&P(t.escalation)),children:x?A(t.label,24):A(((p=t.escalation)==null?void 0:p.role)??t.label,20)})]}),e.jsxs("div",{className:"flex-1 relative h-10",children:[a.map(s=>e.jsx("div",{className:"absolute top-0 bottom-0 w-px bg-surface-border opacity-30",style:{left:`${s.pct}%`}},s.pct)),e.jsxs("div",{className:`absolute top-2 h-6 rounded-sm ${o?`${h} ring-2 ring-accent ring-offset-1`:`${h} hover:opacity-80`}`,style:{left:`${t.startPct}%`,width:m?`${Math.max(r.width,.3)}%`:"0%",minWidth:m?"4px":"0px",opacity:r.opacity},title:`${t.label} — ${k(t.durationMs)} — ${new Date(t.startMs).toLocaleTimeString()}`,children:[r.width>8&&l&&e.jsx("span",{className:"absolute inset-0 flex items-center px-1.5 text-[9px] font-mono text-white truncate",children:k(t.durationMs)}),t.claimPct!=null&&l&&e.jsx("div",{className:"absolute top-0 bottom-0 w-px border-l border-dashed border-white/70",style:{left:`${t.claimPct}%`},title:(f=t.escalation)!=null&&f.assigned_to?`Claimed by ${t.escalation.assigned_to}`:"Claimed",children:e.jsx("div",{className:"absolute -top-1 -left-[3px] w-[7px] h-[7px] rounded-full bg-white border border-amber-600"})})]})]})]}),e.jsx(q,{open:o,children:e.jsx("div",{className:"py-4 px-6 pl-52 border-b border-surface-border bg-surface-sunken/20",children:x&&t.task?e.jsx(ie,{task:t.task,traceUrl:n}):t.escalation?e.jsx(oe,{escalation:t.escalation}):null})})]})}function le({tasks:t,escalations:a,traceUrl:o}){const[c,r]=N.useState(new Set),{lanes:l,timeMin:n,timeMax:x}=N.useMemo(()=>te(t,a),[t,a]),v=x-n||1,{progress:h,animatedBar:m}=se(l.length,n,x);if(l.length===0)return e.jsx("p",{className:"text-sm text-text-tertiary py-8 text-center",children:"No events in this process."});const p=5,f=Array.from({length:p+1},(i,j)=>({pct:j/p*100,label:k(Math.round(j/p*v))})),s=i=>{r(j=>{const w=new Set(j);return w.has(i)?w.delete(i):w.add(i),w})},d=l.map(i=>i.id),g=d.length>0&&d.every(i=>c.has(i)),u=()=>{r(g?new Set:new Set(d))},y=h>=1;return e.jsxs("div",{className:"py-2",children:[e.jsx(ae,{allExpanded:g,onToggleAll:u}),e.jsx(ne,{ticks:f}),l.map(i=>e.jsx(ce,{lane:i,ticks:f,isExpanded:c.has(i.id),onToggle:()=>s(i.id),anim:m(i),animDone:y,traceUrl:o},`${i.kind}-${i.id}`))]})}function de(t,a){const o=new Date(t).getTime(),r=(a?new Date(a).getTime():Date.now())-o;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 Me(){var h;const{originId:t}=J(),{data:a,isLoading:o}=z(t??""),{data:c}=H(),r=((h=c==null?void 0:c.telemetry)==null?void 0:h.traceUrl)??null,l=(a==null?void 0:a.tasks)??[],n=(a==null?void 0:a.escalations)??[],x=N.useMemo(()=>{const m=l.filter(s=>s.status==="completed").length,p=l.filter(s=>s.status==="needs_intervention").length,f=n.filter(s=>s.status==="resolved").length;return{tasks:l.length,completed:m,escalated:p,escalations:n.length,resolved:f}},[l,n]),v=N.useMemo(()=>{if(l.length===0&&n.length===0)return null;const p=[...l.map(u=>u.created_at),...n.map(u=>u.created_at)].sort()[0],f=l.every(u=>u.status==="completed"||u.status==="cancelled"),s=n.every(u=>u.status==="resolved"),d=l.length>0&&f&&s,g=d?[...l.map(u=>u.completed_at),...n.map(u=>u.resolved_at)].filter(Boolean).sort().pop()??null:null;return{startIso:p,endIso:g,isFinished:d,elapsed:de(p,g)}},[l,n]);return o?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-40 bg-surface-sunken rounded"})]}):e.jsxs("div",{children:[e.jsx(V,{title:"Process Detail",actions:v&&e.jsxs("span",{className:"text-xs text-text-tertiary",children:[v.isFinished?"Completed":"Running"," · ",v.elapsed]})}),e.jsxs("div",{className:"mb-8",children:[e.jsx(L,{className:"mb-1",children:"Origin ID"}),e.jsx("p",{className:"text-sm font-mono text-text-primary break-all",children:t})]}),e.jsxs("div",{className:"grid grid-cols-4 gap-4 mb-10",children:[e.jsx(M,{label:"Tasks",value:x.tasks}),e.jsx(M,{label:"Completed",value:x.completed,colorClass:"text-status-success"}),e.jsx(M,{label:"Escalations",value:x.escalations,colorClass:"text-status-pending"}),e.jsx(M,{label:"Resolved",value:x.resolved,colorClass:"text-status-success"})]}),e.jsx(L,{className:"mb-6",children:"Timeline"}),e.jsx(le,{tasks:l,escalations:n,traceUrl:r})]})}export{Me as ProcessDetailPage};
2
+ //# sourceMappingURL=ProcessDetailPage-CMLq4M7D.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProcessDetailPage-CMLq4M7D.js","sources":["../../src/pages/processes/process-swimlane/helpers.ts","../../src/pages/processes/process-swimlane/useTimelineAnimation.ts","../../src/pages/processes/process-swimlane/SwimlaneIcons.tsx","../../src/pages/processes/process-swimlane/SwimlaneHeader.tsx","../../src/pages/processes/process-swimlane/TimeAxis.tsx","../../src/pages/processes/process-swimlane/MetricCell.tsx","../../src/pages/processes/process-swimlane/TraceLink.tsx","../../src/pages/processes/process-swimlane/TaskDetailPanel.tsx","../../src/pages/processes/process-swimlane/EscalationDetailPanel.tsx","../../src/pages/processes/process-swimlane/SwimlaneRow.tsx","../../src/pages/processes/process-swimlane/ProcessSwimlaneTimeline.tsx","../../src/pages/processes/ProcessDetailPage.tsx"],"sourcesContent":["import type { LTTaskRecord, LTEscalationRecord, LTTaskStatus, LTEscalationStatus } from '../../../api/types';\n\nexport interface ProcessLane {\n kind: 'task' | 'escalation';\n id: string;\n label: string;\n taskId: string;\n startMs: number;\n endMs: number;\n startPct: number;\n widthPct: number;\n durationMs: number;\n isOpen: boolean;\n // task fields\n task?: LTTaskRecord;\n // escalation fields\n escalation?: LTEscalationRecord;\n claimPct?: number | null; // percent position of claim within the bar\n}\n\nexport interface ProcessSwimlaneTimelineProps {\n tasks: LTTaskRecord[];\n escalations: LTEscalationRecord[];\n traceUrl?: string | null;\n}\n\nexport const PENDING_CLASS = 'bg-stripes animate-pulse opacity-70';\n\nexport function taskStatusColor(status: LTTaskStatus): string {\n switch (status) {\n case 'completed': return 'text-status-success';\n case 'in_progress': case 'pending': return 'text-status-warning';\n case 'needs_intervention': return 'text-status-error';\n case 'cancelled': return 'text-text-tertiary';\n default: return 'text-text-tertiary';\n }\n}\n\nexport function escStatusColor(status: LTEscalationStatus): string {\n switch (status) {\n case 'resolved': return 'text-status-success';\n case 'pending': return 'text-status-warning';\n case 'cancelled': return 'text-text-tertiary';\n default: return 'text-text-tertiary';\n }\n}\n\nexport function statusLabel(kind: 'task' | 'escalation', status: string, isAck?: boolean): string {\n const noun = kind === 'task' ? 'Task' : isAck ? 'Notification' : 'Escalation';\n return `${noun} is ${status.replace(/_/g, ' ')}`;\n}\n\nexport function barColorForStatus(status: string, isOpen: boolean): string {\n if (isOpen) return PENDING_CLASS;\n switch (status) {\n case 'completed':\n case 'resolved':\n return 'bg-status-success';\n case 'pending':\n case 'in_progress':\n case 'needs_intervention':\n return 'bg-status-warning';\n case 'cancelled':\n return 'bg-status-error';\n default:\n return 'bg-text-tertiary';\n }\n}\n\nexport function isMcpWorkflow(workflowType: string): boolean {\n return workflowType.startsWith('mcp') || workflowType.startsWith('Mcp');\n}\n\nexport function isAckEscalation(esc: LTEscalationRecord): boolean {\n return !esc.workflow_type;\n}\n\nexport function middleTruncate(str: string, maxLen: number): string {\n if (str.length <= maxLen) return str;\n const keep = Math.floor((maxLen - 1) / 2);\n return `${str.slice(0, keep)}…${str.slice(str.length - keep)}`;\n}\n\nexport function formatAbsoluteTime(iso: string): string {\n const d = new Date(iso);\n return d.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', second: '2-digit' });\n}\n\n// ── Build lanes from raw task + escalation records ──────────────────────────\n\nexport function buildLanes(\n tasks: LTTaskRecord[],\n escalations: LTEscalationRecord[],\n): { lanes: ProcessLane[]; timeMin: number; timeMax: number } {\n const now = Date.now();\n\n // Group escalations by task_id\n const escByTask = new Map<string, LTEscalationRecord[]>();\n const unlinked: LTEscalationRecord[] = [];\n for (const e of escalations) {\n if (e.task_id) {\n if (!escByTask.has(e.task_id)) escByTask.set(e.task_id, []);\n escByTask.get(e.task_id)!.push(e);\n } else {\n unlinked.push(e);\n }\n }\n\n // Sort tasks by created_at\n const sorted = [...tasks].sort(\n (a, b) => new Date(a.created_at).getTime() - new Date(b.created_at).getTime(),\n );\n\n // Collect all timestamps for axis bounds\n const allTimes: number[] = [];\n for (const t of tasks) {\n allTimes.push(new Date(t.created_at).getTime());\n if (t.completed_at) allTimes.push(new Date(t.completed_at).getTime());\n }\n for (const e of escalations) {\n allTimes.push(new Date(e.created_at).getTime());\n if (e.resolved_at) allTimes.push(new Date(e.resolved_at).getTime());\n if (e.claimed_at) allTimes.push(new Date(e.claimed_at).getTime());\n }\n if (allTimes.length === 0) return { lanes: [], timeMin: 0, timeMax: 1 };\n\n const timeMin = Math.min(...allTimes);\n const hasOpen =\n tasks.some((t) => !t.completed_at) || escalations.some((e) => !e.resolved_at);\n const timeMax = hasOpen ? Math.max(now, Math.max(...allTimes)) : Math.max(...allTimes);\n const span = timeMax - timeMin || 1;\n\n const toPct = (ms: number) => ((ms - timeMin) / span) * 100;\n\n const lanes: ProcessLane[] = [];\n\n for (const task of sorted) {\n const tStart = new Date(task.created_at).getTime();\n const tEnd = task.completed_at ? new Date(task.completed_at).getTime() : now;\n const tOpen = !task.completed_at;\n\n lanes.push({\n kind: 'task',\n id: task.id,\n label: task.workflow_type,\n taskId: task.id,\n startMs: tStart,\n endMs: tEnd,\n startPct: toPct(tStart),\n widthPct: Math.max(((tEnd - tStart) / span) * 100, 0.5),\n durationMs: tEnd - tStart,\n isOpen: tOpen,\n task,\n });\n\n const taskEscs = (escByTask.get(task.id) || []).sort(\n (a, b) => new Date(a.created_at).getTime() - new Date(b.created_at).getTime(),\n );\n for (const esc of taskEscs) {\n const eStart = new Date(esc.created_at).getTime();\n const eEnd = esc.resolved_at ? new Date(esc.resolved_at).getTime() : now;\n const eOpen = !esc.resolved_at;\n\n let claimPct: number | null = null;\n if (esc.claimed_at) {\n const claimMs = new Date(esc.claimed_at).getTime();\n const escSpan = eEnd - eStart || 1;\n claimPct = ((claimMs - eStart) / escSpan) * 100;\n }\n\n lanes.push({\n kind: 'escalation',\n id: esc.id,\n label: esc.role,\n taskId: task.id,\n startMs: eStart,\n endMs: eEnd,\n startPct: toPct(eStart),\n widthPct: Math.max(((eEnd - eStart) / span) * 100, 0.5),\n durationMs: eEnd - eStart,\n isOpen: eOpen,\n escalation: esc,\n claimPct,\n });\n }\n }\n\n // Unlinked escalations at the bottom\n for (const esc of unlinked) {\n const eStart = new Date(esc.created_at).getTime();\n const eEnd = esc.resolved_at ? new Date(esc.resolved_at).getTime() : now;\n let claimPct: number | null = null;\n if (esc.claimed_at) {\n const claimMs = new Date(esc.claimed_at).getTime();\n const escSpan = eEnd - eStart || 1;\n claimPct = ((claimMs - eStart) / escSpan) * 100;\n }\n lanes.push({\n kind: 'escalation',\n id: esc.id,\n label: esc.role,\n taskId: '',\n startMs: eStart,\n endMs: eEnd,\n startPct: toPct(eStart),\n widthPct: Math.max(((eEnd - eStart) / span) * 100, 0.5),\n durationMs: eEnd - eStart,\n isOpen: !esc.resolved_at,\n escalation: esc,\n claimPct,\n });\n }\n\n return { lanes, timeMin, timeMax };\n}\n","import { useState, useEffect, useRef, useCallback } from 'react';\nimport type { ProcessLane } from './helpers';\n\nexport interface BarAnim {\n width: number;\n opacity: number;\n}\n\nexport function useTimelineAnimation(\n laneCount: number,\n timeMin: number,\n timeMax: number,\n durationMs = 500,\n) {\n const [progress, setProgress] = useState(0); // 0 → 1\n const startRef = useRef<number | null>(null);\n const totalSpanMs = timeMax - timeMin || 1;\n\n useEffect(() => {\n if (laneCount === 0) return;\n startRef.current = null;\n setProgress(0);\n\n let raf: number;\n const step = (ts: number) => {\n if (startRef.current === null) startRef.current = ts;\n const elapsed = ts - startRef.current;\n const t = Math.min(elapsed / durationMs, 1);\n // ease-out cubic for a smooth deceleration\n const eased = 1 - Math.pow(1 - t, 3);\n setProgress(eased);\n if (t < 1) raf = requestAnimationFrame(step);\n };\n raf = requestAnimationFrame(step);\n return () => cancelAnimationFrame(raf);\n }, [laneCount, durationMs]);\n\n const animatedBar = useCallback(\n (lane: ProcessLane): BarAnim => {\n const appearAt = (lane.startMs - timeMin) / totalSpanMs;\n const doneAt = (lane.endMs - timeMin) / totalSpanMs;\n\n if (progress < appearAt) {\n return { width: 0, opacity: 0 };\n }\n\n const laneSpan = doneAt - appearAt || 0.001;\n const fill = Math.min((progress - appearAt) / laneSpan, 1);\n const animatedWidth = lane.widthPct * fill;\n const fadeIn = Math.min(fill / 0.1, 1);\n\n return { width: animatedWidth, opacity: fadeIn };\n },\n [progress, timeMin, totalSpanMs],\n );\n\n return { progress, animatedBar };\n}\n","export function ClipboardIcon({ className }: { className?: string }) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\" />\n </svg>\n );\n}\n\n/** Sparkle/AI icon for mcp* system workflows */\nexport function SparkleIcon({ className }: { className?: string }) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9.813 15.904L9 18.75l-.813-2.846a4.5 4.5 0 00-3.09-3.09L2.25 12l2.846-.813a4.5 4.5 0 003.09-3.09L9 5.25l.813 2.846a4.5 4.5 0 003.09 3.09L15.75 12l-2.846.813a4.5 4.5 0 00-3.09 3.09zM18.259 8.715L18 9.75l-.259-1.035a3.375 3.375 0 00-2.455-2.456L14.25 6l1.036-.259a3.375 3.375 0 002.455-2.456L18 2.25l.259 1.035a3.375 3.375 0 002.455 2.456L21.75 6l-1.036.259a3.375 3.375 0 00-2.455 2.456zM16.894 20.567L16.5 21.75l-.394-1.183a2.25 2.25 0 00-1.423-1.423L13.5 18.75l1.183-.394a2.25 2.25 0 001.423-1.423l.394-1.183.394 1.183a2.25 2.25 0 001.423 1.423l1.183.394-1.183.394a2.25 2.25 0 00-1.423 1.423z\" />\n </svg>\n );\n}\n\n/** Bell icon for notification/ACK escalations */\nexport function BellIcon({ className }: { className?: string }) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0\" />\n </svg>\n );\n}\n\nexport function UserIcon({ className }: { className?: string }) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15.75 6a3.75 3.75 0 11-7.5 0 3.75 3.75 0 017.5 0zM4.501 20.118a7.5 7.5 0 0114.998 0A17.933 17.933 0 0112 21.75c-2.676 0-5.216-.584-7.499-1.632z\" />\n </svg>\n );\n}\n","import { ClipboardIcon, SparkleIcon, BellIcon, UserIcon } from './SwimlaneIcons';\n\ninterface SwimlaneHeaderProps {\n allExpanded: boolean;\n onToggleAll: () => void;\n}\n\nexport function SwimlaneHeader({ allExpanded, onToggleAll }: SwimlaneHeaderProps) {\n return (\n <div className=\"flex items-center gap-4 mb-4 flex-wrap\">\n <button onClick={onToggleAll} className=\"text-[10px] text-accent hover:underline\">\n {allExpanded ? 'Collapse all' : 'Expand all'}\n </button>\n\n {/* Legend */}\n <div className=\"flex items-center gap-4 ml-auto\">\n <div className=\"flex items-center gap-1\">\n <ClipboardIcon className=\"w-3.5 h-3.5 text-text-tertiary\" />\n <span className=\"text-[9px] text-text-tertiary\">Task</span>\n </div>\n <div className=\"flex items-center gap-1\">\n <SparkleIcon className=\"w-3.5 h-3.5 text-text-tertiary\" />\n <span className=\"text-[9px] text-text-tertiary\">AI Task</span>\n </div>\n <div className=\"flex items-center gap-1\">\n <UserIcon className=\"w-3.5 h-3.5 text-text-tertiary\" />\n <span className=\"text-[9px] text-text-tertiary\">Escalation</span>\n </div>\n <div className=\"flex items-center gap-1\">\n <BellIcon className=\"w-3.5 h-3.5 text-text-tertiary\" />\n <span className=\"text-[9px] text-text-tertiary\">Notification</span>\n </div>\n <div className=\"flex items-center gap-1\">\n <span className=\"w-2 h-2 rounded-full bg-status-success\" />\n <span className=\"text-[9px] text-text-tertiary\">Done</span>\n </div>\n <div className=\"flex items-center gap-1\">\n <span className=\"w-2 h-2 rounded-full bg-status-warning\" />\n <span className=\"text-[9px] text-text-tertiary\">Active</span>\n </div>\n </div>\n </div>\n );\n}\n","export interface Tick {\n pct: number;\n label: string;\n}\n\ninterface TimeAxisProps {\n ticks: Tick[];\n}\n\nexport function TimeAxis({ ticks }: TimeAxisProps) {\n return (\n <div className=\"flex\">\n <div className=\"w-52 shrink-0\" />\n <div className=\"flex-1 relative h-6 border-b border-surface-border\">\n {ticks.map((tick) => (\n <span\n key={tick.pct}\n className=\"absolute text-[9px] font-mono text-text-tertiary -translate-x-1/2 bottom-1\"\n style={{ left: `${tick.pct}%` }}\n >\n {tick.label}\n </span>\n ))}\n </div>\n </div>\n );\n}\n","/** Small labeled metric cell used inside detail panels */\nexport function MetricCell({\n label,\n children,\n}: {\n label: string;\n children: React.ReactNode;\n}) {\n return (\n <div>\n <p className=\"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5\">\n {label}\n </p>\n <div className=\"text-xs text-text-primary\">{children}</div>\n </div>\n );\n}\n","import { useState } from 'react';\n\nexport function TraceLink({ traceId, href }: { traceId: string; href?: string }) {\n const [copied, setCopied] = useState(false);\n\n const handleCopy = (e: React.MouseEvent) => {\n e.stopPropagation();\n navigator.clipboard.writeText(traceId);\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n };\n\n const handleNav = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (href) window.open(href, '_blank', 'noopener,noreferrer');\n };\n\n return (\n <span className=\"group/trace inline-flex items-center gap-1.5\">\n {href && (\n <button\n onClick={handleNav}\n title=\"Open trace\"\n className=\"opacity-0 group-hover/trace:opacity-100 transition-opacity p-0.5\"\n >\n <svg className=\"w-3 h-3 text-text-tertiary hover:text-accent\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M13.5 6H5.25A2.25 2.25 0 003 8.25v10.5A2.25 2.25 0 005.25 21h10.5A2.25 2.25 0 0018 18.75V10.5m-4.5-4.5h6m0 0v6m0-6L10.5 15\" />\n </svg>\n </button>\n )}\n <button\n onClick={handleCopy}\n title=\"Copy trace ID\"\n className=\"opacity-0 group-hover/trace:opacity-100 transition-opacity p-0.5\"\n >\n <svg\n className={`w-3 h-3 transition-colors ${copied ? 'text-status-success' : 'text-text-tertiary hover:text-accent'}`}\n fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}\n >\n {copied\n ? <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 13l4 4L19 7\" />\n : <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8 5H6a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2v-1M8 5a2 2 0 002 2h2a2 2 0 002-2M8 5a2 2 0 012-2h2a2 2 0 012 2m0 0h2a2 2 0 012 2v3\" />\n }\n </svg>\n </button>\n <span className=\"text-[11px] text-accent\">Trace Details</span>\n </span>\n );\n}\n","import { Link } from 'react-router-dom';\nimport { StatusBadge } from '../../../components/common/display/StatusBadge';\nimport { WorkflowPill } from '../../../components/common/display/WorkflowPill';\nimport { TimeAgo } from '../../../components/common/display/TimeAgo';\nimport { formatDuration } from '../../../lib/format';\nimport type { LTTaskRecord } from '../../../api/types';\nimport { MetricCell } from './MetricCell';\nimport { TraceLink } from './TraceLink';\nimport { formatAbsoluteTime } from './helpers';\n\nexport function TaskDetailPanel({\n task,\n traceUrl,\n}: {\n task: LTTaskRecord;\n traceUrl?: string | null;\n}) {\n const elapsed = task.completed_at\n ? new Date(task.completed_at).getTime() - new Date(task.created_at).getTime()\n : Date.now() - new Date(task.created_at).getTime();\n\n return (\n <div className=\"grid grid-cols-[3fr_1fr] gap-6\">\n {/* Left: timing metrics */}\n <div className=\"space-y-4\">\n <div className=\"flex items-center gap-3\">\n <StatusBadge status={task.status} />\n <WorkflowPill type={task.workflow_type} />\n </div>\n\n <div className=\"grid grid-cols-3 gap-4\">\n <MetricCell label=\"Started\">\n <span className=\"font-mono\">{formatAbsoluteTime(task.created_at)}</span>\n <p className=\"text-[10px] text-text-tertiary mt-0.5\">\n <TimeAgo date={task.created_at} />\n </p>\n </MetricCell>\n\n <MetricCell label=\"Completed\">\n {task.completed_at ? (\n <>\n <span className=\"font-mono\">{formatAbsoluteTime(task.completed_at)}</span>\n <p className=\"text-[10px] text-text-tertiary mt-0.5\">\n <TimeAgo date={task.completed_at} />\n </p>\n </>\n ) : (\n <span className=\"text-text-tertiary italic\">In progress</span>\n )}\n </MetricCell>\n\n <MetricCell label=\"Duration\">\n <span className=\"font-mono text-sm\">{formatDuration(elapsed)}</span>\n </MetricCell>\n </div>\n\n {task.milestones.length > 0 && (\n <div>\n <p className=\"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1.5\">\n Milestones\n </p>\n <div className=\"flex flex-wrap gap-1.5\">\n {task.milestones.map((m, i) => (\n <span\n key={i}\n className=\"px-2 py-0.5 text-[10px] font-mono bg-accent-faint/50 rounded text-text-secondary\"\n >\n {m.name}: {String(m.value)}\n </span>\n ))}\n </div>\n </div>\n )}\n </div>\n\n {/* Right: links */}\n <div className=\"flex flex-col items-end gap-2\">\n <Link\n to={`/workflows/executions/${encodeURIComponent(task.workflow_id)}`}\n className=\"block text-[11px] text-accent hover:underline\"\n >\n Execution Details\n </Link>\n <Link\n to={`/workflows/tasks/detail/${task.id}`}\n className=\"block text-[11px] text-accent hover:underline\"\n >\n Task Details\n </Link>\n {task.trace_id && (\n <TraceLink\n traceId={task.trace_id}\n href={traceUrl ? traceUrl.replace('{traceId}', task.trace_id) : undefined}\n />\n )}\n </div>\n </div>\n );\n}\n","import { Link } from 'react-router-dom';\nimport { StatusBadge } from '../../../components/common/display/StatusBadge';\nimport { RolePill } from '../../../components/common/display/RolePill';\nimport { UserName } from '../../../components/common/display/UserName';\nimport { TimeAgo } from '../../../components/common/display/TimeAgo';\nimport { formatDuration } from '../../../lib/format';\nimport type { LTEscalationRecord } from '../../../api/types';\nimport { MetricCell } from './MetricCell';\nimport { formatAbsoluteTime } from './helpers';\n\nexport function EscalationDetailPanel({\n escalation,\n}: {\n escalation: LTEscalationRecord;\n}) {\n const created = new Date(escalation.created_at).getTime();\n const claimedMs = escalation.claimed_at\n ? new Date(escalation.claimed_at).getTime() - created\n : null;\n const resolvedMs = escalation.resolved_at\n ? new Date(escalation.resolved_at).getTime() - created\n : null;\n\n return (\n <div className=\"grid grid-cols-[3fr_1fr] gap-6\">\n {/* Left: timing metrics */}\n <div className=\"space-y-4\">\n <div className=\"flex items-center gap-3\">\n <StatusBadge status={escalation.status} />\n <RolePill role={escalation.role} />\n {escalation.type && (\n <span className=\"text-[10px] text-text-tertiary\">\n {escalation.type}\n {escalation.subtype ? ` / ${escalation.subtype}` : ''}\n </span>\n )}\n </div>\n\n <div className=\"grid grid-cols-3 gap-4\">\n <MetricCell label=\"Created\">\n <span className=\"font-mono\">{formatAbsoluteTime(escalation.created_at)}</span>\n <p className=\"text-[10px] text-text-tertiary mt-0.5\">\n <TimeAgo date={escalation.created_at} />\n </p>\n </MetricCell>\n\n <MetricCell label=\"Claimed\">\n {escalation.claimed_at ? (\n <>\n <span className=\"font-mono\">{formatAbsoluteTime(escalation.claimed_at)}</span>\n <p className=\"text-[10px] text-text-tertiary mt-0.5\">\n after {formatDuration(claimedMs)}\n {escalation.assigned_to && (\n <>\n {' '}by{' '}\n <span className=\"text-text-secondary font-medium\">\n <UserName userId={escalation.assigned_to} />\n </span>\n </>\n )}\n </p>\n </>\n ) : (\n <span className=\"text-text-tertiary italic\">Unclaimed</span>\n )}\n </MetricCell>\n\n <MetricCell label=\"Resolved\">\n {escalation.resolved_at ? (\n <>\n <span className=\"font-mono\">{formatAbsoluteTime(escalation.resolved_at)}</span>\n <p className=\"text-[10px] text-text-tertiary mt-0.5\">\n {formatDuration(resolvedMs)} total\n </p>\n </>\n ) : (\n <span className=\"text-text-tertiary italic\">Pending</span>\n )}\n </MetricCell>\n </div>\n\n {escalation.description && (\n <div>\n <p className=\"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Description\n </p>\n <p className=\"text-[11px] text-text-secondary leading-relaxed\">\n {escalation.description}\n </p>\n </div>\n )}\n </div>\n\n {/* Right: links */}\n <div className=\"flex flex-col items-end gap-2\">\n {escalation.workflow_id && (\n <Link\n to={`/workflows/executions/${encodeURIComponent(escalation.workflow_id)}`}\n className=\"block text-[11px] text-accent hover:underline\"\n >\n Execution Details\n </Link>\n )}\n <Link\n to={`/escalations/detail/${escalation.id}`}\n className=\"block text-[11px] text-accent hover:underline\"\n >\n Escalation Details\n </Link>\n </div>\n </div>\n );\n}\n","import { Collapsible } from '../../../components/common/layout/Collapsible';\nimport { formatDuration } from '../../../lib/format';\nimport {\n taskStatusColor,\n escStatusColor,\n statusLabel,\n barColorForStatus,\n isMcpWorkflow,\n isAckEscalation,\n middleTruncate,\n} from './helpers';\nimport type { ProcessLane } from './helpers';\nimport type { BarAnim } from './useTimelineAnimation';\nimport type { Tick } from './TimeAxis';\nimport { ClipboardIcon, SparkleIcon, BellIcon, UserIcon } from './SwimlaneIcons';\nimport { TaskDetailPanel } from './TaskDetailPanel';\nimport { EscalationDetailPanel } from './EscalationDetailPanel';\n\ninterface SwimlaneRowProps {\n lane: ProcessLane;\n ticks: Tick[];\n isExpanded: boolean;\n onToggle: () => void;\n anim: BarAnim;\n animDone: boolean;\n traceUrl?: string | null;\n}\n\nexport function SwimlaneRow({\n lane,\n ticks,\n isExpanded,\n onToggle,\n anim,\n animDone,\n traceUrl,\n}: SwimlaneRowProps) {\n const isTask = lane.kind === 'task';\n const status = isTask ? lane.task!.status : lane.escalation!.status;\n const barBase = barColorForStatus(status, lane.isOpen);\n const visible = anim.opacity > 0;\n\n return (\n <div>\n {/* Lane row */}\n <div\n className=\"flex items-center border-b border-surface-border cursor-pointer hover:bg-surface-sunken/40 transition-colors\"\n onClick={onToggle}\n >\n {/* Label column */}\n <div\n className={`w-52 shrink-0 py-3 pr-4 flex items-center gap-2 ${\n isTask ? '' : 'pl-6'\n }`}\n style={{ opacity: visible ? 1 : 0, transition: 'opacity 0.15s ease-out' }}\n >\n {isTask ? (\n isMcpWorkflow(lane.task!.workflow_type) ? (\n <SparkleIcon\n className={`w-4 h-4 shrink-0 ${taskStatusColor(lane.task!.status)}`}\n />\n ) : (\n <ClipboardIcon\n className={`w-4 h-4 shrink-0 ${taskStatusColor(lane.task!.status)}`}\n />\n )\n ) : isAckEscalation(lane.escalation!) ? (\n <BellIcon\n className={`w-4 h-4 shrink-0 ${escStatusColor(lane.escalation!.status)}`}\n />\n ) : (\n <UserIcon\n className={`w-4 h-4 shrink-0 ${escStatusColor(lane.escalation!.status)}`}\n />\n )}\n <p\n className=\"text-xs font-mono text-text-secondary whitespace-nowrap overflow-hidden\"\n title={statusLabel(lane.kind, isTask ? lane.task!.status : lane.escalation!.status, !isTask && isAckEscalation(lane.escalation!))}\n >\n {isTask\n ? middleTruncate(lane.label, 24)\n : middleTruncate(lane.escalation?.role ?? lane.label, 20)}\n </p>\n </div>\n\n {/* Bar area */}\n <div className=\"flex-1 relative h-10\">\n {/* Tick gridlines */}\n {ticks.map((tick) => (\n <div\n key={tick.pct}\n className=\"absolute top-0 bottom-0 w-px bg-surface-border opacity-30\"\n style={{ left: `${tick.pct}%` }}\n />\n ))}\n\n {/* Duration bar (animated reveal + grow) */}\n <div\n className={`absolute top-2 h-6 rounded-sm ${\n isExpanded\n ? `${barBase} ring-2 ring-accent ring-offset-1`\n : `${barBase} hover:opacity-80`\n }`}\n style={{\n left: `${lane.startPct}%`,\n width: visible ? `${Math.max(anim.width, 0.3)}%` : '0%',\n minWidth: visible ? '4px' : '0px',\n opacity: anim.opacity,\n }}\n title={`${lane.label} — ${formatDuration(lane.durationMs)} — ${new Date(lane.startMs).toLocaleTimeString()}`}\n >\n {/* Duration text inside bar (show only when fully revealed) */}\n {anim.width > 8 && animDone && (\n <span className=\"absolute inset-0 flex items-center px-1.5 text-[9px] font-mono text-white truncate\">\n {formatDuration(lane.durationMs)}\n </span>\n )}\n\n {/* Claim marker (vertical dashed line) — show after animation */}\n {lane.claimPct != null && animDone && (\n <div\n className=\"absolute top-0 bottom-0 w-px border-l border-dashed border-white/70\"\n style={{ left: `${lane.claimPct}%` }}\n title={\n lane.escalation?.assigned_to\n ? `Claimed by ${lane.escalation.assigned_to}`\n : 'Claimed'\n }\n >\n {/* Claim dot */}\n <div className=\"absolute -top-1 -left-[3px] w-[7px] h-[7px] rounded-full bg-white border border-amber-600\" />\n </div>\n )}\n </div>\n </div>\n </div>\n\n {/* Expandable detail panel */}\n <Collapsible open={isExpanded}>\n <div className=\"py-4 px-6 pl-52 border-b border-surface-border bg-surface-sunken/20\">\n {isTask && lane.task ? (\n <TaskDetailPanel task={lane.task} traceUrl={traceUrl} />\n ) : lane.escalation ? (\n <EscalationDetailPanel escalation={lane.escalation} />\n ) : null}\n </div>\n </Collapsible>\n </div>\n );\n}\n","import { useState, useMemo } from 'react';\nimport { formatDuration } from '../../../lib/format';\nimport { buildLanes } from './helpers';\nimport type { ProcessSwimlaneTimelineProps } from './helpers';\nimport { useTimelineAnimation } from './useTimelineAnimation';\nimport { SwimlaneHeader } from './SwimlaneHeader';\nimport { TimeAxis } from './TimeAxis';\nimport { SwimlaneRow } from './SwimlaneRow';\n\nexport function ProcessSwimlaneTimeline({\n tasks,\n escalations,\n traceUrl,\n}: ProcessSwimlaneTimelineProps) {\n const [expanded, setExpanded] = useState<Set<string>>(new Set());\n\n const { lanes, timeMin, timeMax } = useMemo(\n () => buildLanes(tasks, escalations),\n [tasks, escalations],\n );\n\n const totalSpanMs = timeMax - timeMin || 1;\n const { progress, animatedBar } = useTimelineAnimation(lanes.length, timeMin, timeMax);\n\n if (lanes.length === 0) {\n return (\n <p className=\"text-sm text-text-tertiary py-8 text-center\">\n No events in this process.\n </p>\n );\n }\n\n // Time axis ticks\n const tickCount = 5;\n const ticks = Array.from({ length: tickCount + 1 }, (_, i) => ({\n pct: (i / tickCount) * 100,\n label: formatDuration(Math.round((i / tickCount) * totalSpanMs)),\n }));\n\n const toggle = (id: string) => {\n setExpanded((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n };\n\n const allIds = lanes.map((l) => l.id);\n const allExpanded = allIds.length > 0 && allIds.every((id) => expanded.has(id));\n const toggleAll = () => {\n if (allExpanded) setExpanded(new Set());\n else setExpanded(new Set(allIds));\n };\n\n const animDone = progress >= 1;\n\n return (\n <div className=\"py-2\">\n <SwimlaneHeader allExpanded={allExpanded} onToggleAll={toggleAll} />\n <TimeAxis ticks={ticks} />\n\n {lanes.map((lane) => (\n <SwimlaneRow\n key={`${lane.kind}-${lane.id}`}\n lane={lane}\n ticks={ticks}\n isExpanded={expanded.has(lane.id)}\n onToggle={() => toggle(lane.id)}\n anim={animatedBar(lane)}\n animDone={animDone}\n traceUrl={traceUrl}\n />\n ))}\n </div>\n );\n}\n","import { useMemo } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { useProcessDetail } from '../../api/tasks';\nimport { useSettings } from '../../api/settings';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { SectionLabel } from '../../components/common/layout/SectionLabel';\nimport { StatCard } from '../../components/common/data/StatCard';\nimport { ProcessSwimlaneTimeline } from './process-swimlane/ProcessSwimlaneTimeline';\n\nfunction formatElapsed(startIso: string, endIso?: string | null): string {\n const start = new Date(startIso).getTime();\n const end = endIso ? new Date(endIso).getTime() : Date.now();\n const ms = end - start;\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\nexport function ProcessDetailPage() {\n const { originId } = useParams<{ originId: string }>();\n const { data, isLoading } = useProcessDetail(originId ?? '');\n const { data: settings } = useSettings();\n const traceUrl = settings?.telemetry?.traceUrl ?? null;\n\n const tasks = data?.tasks ?? [];\n const escalations = data?.escalations ?? [];\n\n const stats = useMemo(() => {\n const completed = tasks.filter((t) => t.status === 'completed').length;\n const escalated = tasks.filter((t) => t.status === 'needs_intervention').length;\n const resolved = escalations.filter((e) => e.status === 'resolved').length;\n return { tasks: tasks.length, completed, escalated, escalations: escalations.length, resolved };\n }, [tasks, escalations]);\n\n // Duration: earliest created_at → latest completed_at (or now)\n const duration = useMemo(() => {\n if (tasks.length === 0 && escalations.length === 0) return null;\n const allDates = [\n ...tasks.map((t) => t.created_at),\n ...escalations.map((e) => e.created_at),\n ].sort();\n const startIso = allDates[0];\n const allCompleted = tasks.every((t) => t.status === 'completed' || t.status === 'cancelled');\n const allResolved = escalations.every((e) => e.status === 'resolved');\n const isFinished = tasks.length > 0 && allCompleted && allResolved;\n const endIso = isFinished\n ? [...tasks.map((t) => t.completed_at), ...escalations.map((e) => e.resolved_at)]\n .filter(Boolean)\n .sort()\n .pop() ?? null\n : null;\n return { startIso, endIso, isFinished, elapsed: formatElapsed(startIso, endIso) };\n }, [tasks, escalations]);\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-40 bg-surface-sunken rounded\" />\n </div>\n );\n }\n\n return (\n <div>\n <PageHeader\n title=\"Process Detail\"\n actions={\n duration && (\n <span className=\"text-xs text-text-tertiary\">\n {duration.isFinished ? 'Completed' : 'Running'} &middot; {duration.elapsed}\n </span>\n )\n }\n />\n\n <div className=\"mb-8\">\n <SectionLabel className=\"mb-1\">Origin ID</SectionLabel>\n <p className=\"text-sm font-mono text-text-primary break-all\">{originId}</p>\n </div>\n\n {/* Summary cards */}\n <div className=\"grid grid-cols-4 gap-4 mb-10\">\n <StatCard label=\"Tasks\" value={stats.tasks} />\n <StatCard label=\"Completed\" value={stats.completed} colorClass=\"text-status-success\" />\n <StatCard label=\"Escalations\" value={stats.escalations} colorClass=\"text-status-pending\" />\n <StatCard label=\"Resolved\" value={stats.resolved} colorClass=\"text-status-success\" />\n </div>\n\n <SectionLabel className=\"mb-6\">Timeline</SectionLabel>\n\n <ProcessSwimlaneTimeline\n tasks={tasks}\n escalations={escalations}\n traceUrl={traceUrl}\n />\n </div>\n );\n}\n"],"names":["PENDING_CLASS","taskStatusColor","status","escStatusColor","statusLabel","kind","isAck","barColorForStatus","isOpen","isMcpWorkflow","workflowType","isAckEscalation","esc","middleTruncate","str","maxLen","keep","formatAbsoluteTime","iso","buildLanes","tasks","escalations","now","escByTask","unlinked","e","sorted","a","b","allTimes","t","timeMin","timeMax","span","toPct","ms","lanes","task","tStart","tEnd","tOpen","taskEscs","eStart","eEnd","eOpen","claimPct","claimMs","escSpan","useTimelineAnimation","laneCount","durationMs","progress","setProgress","useState","startRef","useRef","totalSpanMs","useEffect","raf","step","ts","elapsed","eased","animatedBar","useCallback","lane","appearAt","doneAt","laneSpan","fill","animatedWidth","fadeIn","ClipboardIcon","className","jsx","SparkleIcon","BellIcon","UserIcon","SwimlaneHeader","allExpanded","onToggleAll","jsxs","TimeAxis","ticks","tick","MetricCell","label","children","TraceLink","traceId","href","copied","setCopied","handleCopy","handleNav","TaskDetailPanel","traceUrl","StatusBadge","WorkflowPill","TimeAgo","Fragment","formatDuration","m","i","Link","EscalationDetailPanel","escalation","created","claimedMs","resolvedMs","RolePill","UserName","SwimlaneRow","isExpanded","onToggle","anim","animDone","isTask","barBase","visible","_a","_b","Collapsible","ProcessSwimlaneTimeline","expanded","setExpanded","useMemo","tickCount","_","toggle","id","prev","next","allIds","l","toggleAll","formatElapsed","startIso","endIso","start","ProcessDetailPage","originId","useParams","data","isLoading","useProcessDetail","settings","useSettings","stats","completed","escalated","resolved","duration","allCompleted","allResolved","isFinished","PageHeader","SectionLabel","StatCard"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{a as c,j as t}from"./vendor-query-B2UbickB.js";import{u as g}from"./tasks-tRqClPns.js";import{u as x}from"./workflows-Cc4VHcrp.js";import{u as k}from"./useNatsEvents-Xr43X1fG.js";import{u as h}from"./useFilterParams-BaXUAkYK.js";import{D as w}from"./DataTable-BDn1WBHS.js";import{T as p}from"./TimeAgo-UPG6DoH8.js";import{S as y}from"./StickyPagination-F9FZsRy9.js";import{F as b,a as _,b as m}from"./FilterBar-Ck4K4rzu.js";import{P as j}from"./PageHeader-CpWFly5S.js";import{W as v}from"./WorkflowPill-CCDSVaQj.js";import{b as P}from"./vendor-react-Cw8Gy8NJ.js";import"./index-D8VH6K8B.js";import"./vendor-icons-ZTAKVwGc.js";import"./EmptyState-2CmV-IaS.js";import"./format-gXZXQ-HJ.js";function S(e,a=300){const[i,o]=c.useState(e);return c.useEffect(()=>{const l=setTimeout(()=>o(e),a);return()=>clearTimeout(l)},[e,a]),i}const N=[{value:"active",label:"Active"},{value:"completed",label:"Completed"},{value:"escalated",label:"Escalated"}],T=[{key:"origin_id",label:"Origin",render:e=>t.jsx("span",{className:"font-mono text-xs",title:e.origin_id,children:e.origin_id.length>40?`${e.origin_id.slice(0,40)}…`:e.origin_id})},{key:"workflow_types",label:"Workflows",render:e=>t.jsx("div",{className:"flex flex-wrap gap-1",children:e.workflow_types.map(a=>t.jsx(v,{type:a},a))})},{key:"task_count",label:"Tasks",render:e=>t.jsx("span",{children:e.task_count}),className:"w-20 text-right"},{key:"completed",label:"Completed",render:e=>e.completed>0?t.jsx("span",{className:"text-status-success",children:e.completed}):t.jsx("span",{className:"text-text-tertiary",children:"0"}),className:"w-24 text-right"},{key:"escalated",label:"Escalated",render:e=>e.escalated>0?t.jsx("span",{className:"text-status-error",children:e.escalated}):t.jsx("span",{className:"text-text-tertiary",children:"0"}),className:"w-24 text-right"},{key:"started_at",label:"Started",render:e=>t.jsx(p,{date:e.started_at}),className:"w-32"},{key:"last_activity",label:"Last Activity",render:e=>t.jsx(p,{date:e.last_activity}),className:"w-32"}];function V(){k();const e=P(),{filters:a,setFilter:i,pagination:o}=h({filters:{workflow_type:"",status:"",search:""}}),l=S(a.search,300),{data:d}=x(),u=[...new Set((d??[]).map(s=>s.workflow_type))].sort(),{data:r,isLoading:f}=g({workflow_type:a.workflow_type||void 0,status:a.status||void 0,search:l||void 0,limit:o.pageSize,offset:o.offset}),n=(r==null?void 0:r.total)??0;return t.jsxs("div",{children:[t.jsx(j,{title:"All Processes"}),t.jsxs(b,{children:[t.jsx(_,{label:"Search",value:a.search,onChange:s=>i("search",s),placeholder:"origin, workflow, or trace ID"}),t.jsx(m,{label:"Status",value:a.status,onChange:s=>i("status",s),options:N}),t.jsx(m,{label:"Workflow Type",value:a.workflow_type,onChange:s=>i("workflow_type",s),options:u.map(s=>({value:s,label:s}))})]}),t.jsx(w,{columns:T,data:(r==null?void 0:r.processes)??[],keyFn:s=>s.origin_id,onRowClick:s=>e(`/processes/detail/${encodeURIComponent(s.origin_id)}`),isLoading:f,emptyMessage:"No business processes found"}),t.jsx(y,{page:o.page,totalPages:o.totalPages(n),onPageChange:o.setPage,total:n,pageSize:o.pageSize,onPageSizeChange:o.setPageSize})]})}export{V as ProcessesListPage};
2
+ //# sourceMappingURL=ProcessesListPage-CZ_HF06v.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProcessesListPage-CZ_HF06v.js","sources":["../../src/hooks/useDebouncedValue.ts","../../src/pages/processes/ProcessesListPage.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\n\n/**\n * Returns a debounced copy of `value` that only updates\n * after `delay` ms of inactivity.\n */\nexport function useDebouncedValue<T>(value: T, delay = 300): T {\n const [debounced, setDebounced] = useState(value);\n useEffect(() => {\n const timer = setTimeout(() => setDebounced(value), delay);\n return () => clearTimeout(timer);\n }, [value, delay]);\n return debounced;\n}\n","import { useNavigate } from 'react-router-dom';\nimport { useProcesses, type ProcessSummary } from '../../api/tasks';\nimport { useWorkflowConfigs } from '../../api/workflows';\nimport { useProcessListEvents } from '../../hooks/useNatsEvents';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { useDebouncedValue } from '../../hooks/useDebouncedValue';\nimport { DataTable, type Column } from '../../components/common/data/DataTable';\nimport { TimeAgo } from '../../components/common/display/TimeAgo';\nimport { StickyPagination } from '../../components/common/data/StickyPagination';\nimport { FilterBar, FilterSelect, FilterInput } from '../../components/common/data/FilterBar';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { WorkflowPill } from '../../components/common/display/WorkflowPill';\n\nconst STATUS_OPTIONS = [\n { value: 'active', label: 'Active' },\n { value: 'completed', label: 'Completed' },\n { value: 'escalated', label: 'Escalated' },\n];\n\nconst columns: Column<ProcessSummary>[] = [\n {\n key: 'origin_id',\n label: 'Origin',\n render: (row) => (\n <span className=\"font-mono text-xs\" title={row.origin_id}>\n {row.origin_id.length > 40 ? `${row.origin_id.slice(0, 40)}…` : row.origin_id}\n </span>\n ),\n },\n {\n key: 'workflow_types',\n label: 'Workflows',\n render: (row) => (\n <div className=\"flex flex-wrap gap-1\">\n {row.workflow_types.map((wt) => (\n <WorkflowPill key={wt} type={wt} />\n ))}\n </div>\n ),\n },\n {\n key: 'task_count',\n label: 'Tasks',\n render: (row) => <span>{row.task_count}</span>,\n className: 'w-20 text-right',\n },\n {\n key: 'completed',\n label: 'Completed',\n render: (row) =>\n row.completed > 0\n ? <span className=\"text-status-success\">{row.completed}</span>\n : <span className=\"text-text-tertiary\">0</span>,\n className: 'w-24 text-right',\n },\n {\n key: 'escalated',\n label: 'Escalated',\n render: (row) =>\n row.escalated > 0\n ? <span className=\"text-status-error\">{row.escalated}</span>\n : <span className=\"text-text-tertiary\">0</span>,\n className: 'w-24 text-right',\n },\n {\n key: 'started_at',\n label: 'Started',\n render: (row) => <TimeAgo date={row.started_at} />,\n className: 'w-32',\n },\n {\n key: 'last_activity',\n label: 'Last Activity',\n render: (row) => <TimeAgo date={row.last_activity} />,\n className: 'w-32',\n },\n];\n\nexport function ProcessesListPage() {\n useProcessListEvents();\n const navigate = useNavigate();\n const { filters, setFilter, pagination } = useFilterParams({\n filters: { workflow_type: '', status: '', search: '' },\n });\n\n const debouncedSearch = useDebouncedValue(filters.search, 300);\n\n const { data: configs } = useWorkflowConfigs();\n const workflowTypes = [...new Set((configs ?? []).map((c) => c.workflow_type))].sort();\n\n const { data, isLoading } = useProcesses({\n workflow_type: filters.workflow_type || undefined,\n status: filters.status || undefined,\n search: debouncedSearch || undefined,\n limit: pagination.pageSize,\n offset: pagination.offset,\n });\n\n const total = data?.total ?? 0;\n\n return (\n <div>\n <PageHeader title=\"All Processes\" />\n\n <FilterBar>\n <FilterInput\n label=\"Search\"\n value={filters.search}\n onChange={(v) => setFilter('search', v)}\n placeholder=\"origin, workflow, or trace ID\"\n />\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={STATUS_OPTIONS}\n />\n <FilterSelect\n label=\"Workflow Type\"\n value={filters.workflow_type}\n onChange={(v) => setFilter('workflow_type', v)}\n options={workflowTypes.map((t) => ({ value: t, label: t }))}\n />\n </FilterBar>\n\n <DataTable\n columns={columns}\n data={data?.processes ?? []}\n keyFn={(row) => row.origin_id}\n onRowClick={(row) => navigate(`/processes/detail/${encodeURIComponent(row.origin_id)}`)}\n isLoading={isLoading}\n emptyMessage=\"No business processes found\"\n />\n\n <StickyPagination\n page={pagination.page}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n total={total}\n pageSize={pagination.pageSize}\n onPageSizeChange={pagination.setPageSize}\n />\n </div>\n );\n}\n"],"names":["useDebouncedValue","value","delay","debounced","setDebounced","useState","useEffect","timer","STATUS_OPTIONS","columns","row","jsx","wt","WorkflowPill","TimeAgo","ProcessesListPage","useProcessListEvents","navigate","useNavigate","filters","setFilter","pagination","useFilterParams","debouncedSearch","configs","useWorkflowConfigs","workflowTypes","c","data","isLoading","useProcesses","total","PageHeader","FilterBar","FilterInput","v","FilterSelect","t","DataTable","StickyPagination"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{j as t}from"./vendor-query-B2UbickB.js";import{U as x}from"./vendor-icons-ZTAKVwGc.js";function o({role:e,size:s="sm"}){const n=s==="md"?"px-2.5 py-0.5 text-[11px] gap-1.5":"px-2 py-0.5 text-[10px] gap-1",a=s==="md"?"w-3 h-3":"w-2.5 h-2.5";return t.jsxs("span",{className:`inline-flex items-center ${n} bg-accent/[0.06] text-text-secondary rounded-lg`,children:[t.jsx(x,{className:`${a} shrink-0 text-accent/75`}),e]})}export{o as R};
2
+ //# sourceMappingURL=RolePill-BTPa8L-P.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RolePill-BTPa8L-P.js","sources":["../../src/components/common/display/RolePill.tsx"],"sourcesContent":["import { User } from 'lucide-react';\n\ninterface RolePillProps {\n role: string;\n size?: 'sm' | 'md';\n}\n\nexport function RolePill({ role, size = 'sm' }: RolePillProps) {\n const sizeClass = size === 'md'\n ? 'px-2.5 py-0.5 text-[11px] gap-1.5'\n : 'px-2 py-0.5 text-[10px] gap-1';\n const iconClass = size === 'md' ? 'w-3 h-3' : 'w-2.5 h-2.5';\n\n return (\n <span className={`inline-flex items-center ${sizeClass} bg-accent/[0.06] text-text-secondary rounded-lg`}>\n <User className={`${iconClass} shrink-0 text-accent/75`} />\n {role}\n </span>\n );\n}\n"],"names":["RolePill","role","size","sizeClass","iconClass","jsxs","jsx","User"],"mappings":"8FAOO,SAASA,EAAS,CAAE,KAAAC,EAAM,KAAAC,EAAO,MAAuB,CAC7D,MAAMC,EAAYD,IAAS,KACvB,oCACA,gCACEE,EAAYF,IAAS,KAAO,UAAY,cAE9C,OACEG,EAAAA,KAAC,OAAA,CAAK,UAAW,4BAA4BF,CAAS,mDACpD,SAAA,CAAAG,EAAAA,IAACC,EAAA,CAAK,UAAW,GAAGH,CAAS,2BAA4B,EACxDH,CAAA,EACH,CAEJ"}
@@ -0,0 +1,2 @@
1
+ import{a as o,j as e}from"./vendor-query-B2UbickB.js";import{b as g,c as N,d as y,e as b,f as v,g as C}from"./roles-ZNrqqnQl.js";import{D as k}from"./DataTable-BDn1WBHS.js";import{C as w}from"./ConfirmDeleteModal-FSXyKjaB.js";import{M as _}from"./Modal-B4rbIVAn.js";import{P as S}from"./PageHeader-CpWFly5S.js";import{R as P}from"./RolePill-BTPa8L-P.js";import"./index-D8VH6K8B.js";import"./vendor-react-Cw8Gy8NJ.js";import"./vendor-icons-ZTAKVwGc.js";import"./EmptyState-2CmV-IaS.js";function R({open:s,onClose:i}){const r=C(),[l,d]=o.useState(""),[a,c]=o.useState(s);s!==a&&(c(s),s&&(d(""),r.reset()));const x=()=>{const n=l.trim().toLowerCase();n&&r.mutate(n,{onSuccess:i})};return e.jsx(_,{open:s,onClose:i,title:"Create Role",children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Role Name (required)"}),e.jsx("input",{type:"text",value:l,onChange:n=>d(n.target.value),placeholder:"e.g., reviewer",className:"input text-xs w-full",onKeyDown:n=>{n.key==="Enter"&&x()}}),e.jsx("p",{className:"text-[10px] text-text-tertiary mt-1",children:"Lowercase letters, numbers, hyphens, and underscores only."})]}),r.error&&e.jsx("p",{className:"text-xs text-status-error",children:r.error.message}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsx("button",{onClick:i,className:"btn-secondary text-xs",children:"Cancel"}),e.jsx("button",{onClick:x,disabled:!l.trim()||r.isPending,className:"btn-primary text-xs",children:r.isPending?"Creating...":"Create"})]})]})})}function D({selectedRole:s,allRoles:i}){const{data:r}=y(),l=b(),d=v(),[a,c]=o.useState(""),x=(r==null?void 0:r.chains)??[],n=o.useMemo(()=>s?x.filter(t=>t.source_role===s).map(t=>t.target_role):[],[x,s]),m=o.useMemo(()=>s?i.filter(t=>t!==s&&t!=="superadmin"&&!n.includes(t)):[],[i,s,n]),u=()=>{!s||!a.trim()||l.mutate({source_role:s,target_role:a.trim()},{onSuccess:()=>c("")})},p=t=>{s&&d.mutate({source_role:s,target_role:t})},h=s==="superadmin";return e.jsxs("div",{className:"border-l border-surface-border pl-6 min-h-[300px]",children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-4",children:"Escalation Routing"}),s?h?e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-mono text-text-primary mb-2",children:s}),e.jsx("p",{className:"text-xs text-text-tertiary",children:"Superadmins can escalate to any role implicitly."})]}):e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-mono text-text-primary",children:s}),e.jsx("p",{className:"text-[10px] text-text-tertiary mt-0.5",children:"Can escalate to:"})]}),n.length===0?e.jsx("p",{className:"text-xs text-text-tertiary",children:"No escalation targets configured."}):e.jsx("div",{className:"flex flex-wrap gap-2",children:n.map(t=>e.jsxs("span",{className:"inline-flex items-center gap-1.5 px-2.5 py-1 text-xs bg-surface-sunken rounded-full text-text-secondary font-mono",children:[t,e.jsx("button",{onClick:()=>p(t),className:"text-text-tertiary hover:text-status-error transition-colors",title:`Remove ${t}`,children:"×"})]},t))}),m.length>0&&e.jsxs("div",{className:"pt-3 border-t border-surface-border",children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-2",children:"Add Target"}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("select",{value:a,onChange:t=>c(t.target.value),className:"select text-xs font-mono flex-1",children:[e.jsx("option",{value:"",children:"Select a role..."}),m.map(t=>e.jsx("option",{value:t,children:t},t))]}),e.jsx("button",{onClick:u,disabled:!a||l.isPending,className:"btn-primary text-xs",children:l.isPending?"Adding...":"Add"})]})]})]}):e.jsx("p",{className:"text-xs text-text-tertiary",children:"Select a role to manage its escalation targets."})]})}function H(){const{data:s,isLoading:i}=g(),r=N(),[l,d]=o.useState(!1),[a,c]=o.useState(null),[x,n]=o.useState(null),m=(s==null?void 0:s.roles)??[],u=o.useMemo(()=>m.map(t=>t.role),[m]),p=[{key:"role",label:"Role",render:t=>e.jsx(P,{role:t.role})},{key:"user_count",label:"Users",render:t=>t.user_count>0?e.jsx("span",{className:"text-text-primary",children:t.user_count}):e.jsx("span",{className:"text-text-tertiary",children:"0"}),className:"w-24 text-right"},{key:"chain_count",label:"Escalations",render:t=>t.chain_count>0?e.jsx("span",{className:"text-text-primary",children:t.chain_count}):e.jsx("span",{className:"text-text-tertiary",children:"0"}),className:"w-28 text-right"},{key:"workflow_count",label:"Workflows",render:t=>t.workflow_count>0?e.jsx("span",{className:"text-text-primary",children:t.workflow_count}):e.jsx("span",{className:"text-text-tertiary",children:"0"}),className:"w-28 text-right"},{key:"actions",label:"",render:t=>{const f=t.user_count>0||t.chain_count>0||t.workflow_count>0;return e.jsx("button",{onClick:j=>{j.stopPropagation(),c(t)},disabled:f,className:`text-xs ${f?"text-text-tertiary cursor-not-allowed":"text-status-error hover:underline"}`,title:f?"Cannot delete a role that is in use":"Delete role",children:"Delete"})},className:"w-24 text-right"}],h=()=>{a&&r.mutate(a.role,{onSuccess:()=>c(null)})};return e.jsxs("div",{children:[e.jsx(S,{title:"Roles",actions:e.jsx("button",{onClick:()=>d(!0),className:"btn-primary text-xs",children:"Add Role"})}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-[1fr_320px] gap-6",children:[e.jsx("div",{children:e.jsx(k,{columns:p,data:m,keyFn:t=>t.role,isLoading:i,emptyMessage:"No roles found",onRowClick:t=>n(t.role),activeRowKey:x})}),e.jsx(D,{selectedRole:x,allRoles:u})]}),e.jsx(R,{open:l,onClose:()=>d(!1)}),e.jsx(w,{open:!!a,onClose:()=>c(null),onConfirm:h,title:"Delete Role",description:e.jsxs(e.Fragment,{children:["Delete role"," ",e.jsx("span",{className:"font-medium font-mono text-text-primary",children:a==null?void 0:a.role}),"? This action cannot be undone."]}),isPending:r.isPending,error:r.error})]})}export{H as RolesPage};
2
+ //# sourceMappingURL=RolesPage-9grZW7yR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RolesPage-9grZW7yR.js","sources":["../../src/pages/admin/roles/RolesPage.tsx"],"sourcesContent":["import { useState, useMemo } from 'react';\nimport {\n useRoleDetails,\n useCreateRole,\n useDeleteRole,\n useEscalationChains,\n useAddEscalationChain,\n useRemoveEscalationChain,\n type RoleDetail,\n} from '../../../api/roles';\nimport { DataTable, type Column } from '../../../components/common/data/DataTable';\nimport { ConfirmDeleteModal } from '../../../components/common/modal/ConfirmDeleteModal';\nimport { Modal } from '../../../components/common/modal/Modal';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { RolePill } from '../../../components/common/display/RolePill';\n\n// ── Create Role Modal ─────────────────────────────────────────\n\nfunction CreateRoleModal({\n open,\n onClose,\n}: {\n open: boolean;\n onClose: () => void;\n}) {\n const createRole = useCreateRole();\n const [roleName, setRoleName] = useState('');\n\n const [prevOpen, setPrevOpen] = useState(open);\n if (open !== prevOpen) {\n setPrevOpen(open);\n if (open) {\n setRoleName('');\n createRole.reset();\n }\n }\n\n const handleCreate = () => {\n const trimmed = roleName.trim().toLowerCase();\n if (!trimmed) return;\n createRole.mutate(trimmed, { onSuccess: onClose });\n };\n\n return (\n <Modal open={open} onClose={onClose} title=\"Create Role\">\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Role Name (required)\n </label>\n <input\n type=\"text\"\n value={roleName}\n onChange={(e) => setRoleName(e.target.value)}\n placeholder=\"e.g., reviewer\"\n className=\"input text-xs w-full\"\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleCreate();\n }}\n />\n <p className=\"text-[10px] text-text-tertiary mt-1\">\n Lowercase letters, numbers, hyphens, and underscores only.\n </p>\n </div>\n\n {createRole.error && (\n <p className=\"text-xs text-status-error\">{(createRole.error as Error).message}</p>\n )}\n\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={onClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={handleCreate}\n disabled={!roleName.trim() || createRole.isPending}\n className=\"btn-primary text-xs\"\n >\n {createRole.isPending ? 'Creating...' : 'Create'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n\n// ── Escalation Panel (right sidebar) ──────────────────────────\n\nfunction EscalationPanel({\n selectedRole,\n allRoles,\n}: {\n selectedRole: string | null;\n allRoles: string[];\n}) {\n const { data: chainsData } = useEscalationChains();\n const addChain = useAddEscalationChain();\n const removeChain = useRemoveEscalationChain();\n const [newTarget, setNewTarget] = useState('');\n\n const chains = chainsData?.chains ?? [];\n\n const targets = useMemo(() => {\n if (!selectedRole) return [];\n return chains.filter((c) => c.source_role === selectedRole).map((c) => c.target_role);\n }, [chains, selectedRole]);\n\n const available = useMemo(() => {\n if (!selectedRole) return [];\n return allRoles.filter((r) => r !== selectedRole && r !== 'superadmin' && !targets.includes(r));\n }, [allRoles, selectedRole, targets]);\n\n const handleAdd = () => {\n if (!selectedRole || !newTarget.trim()) return;\n addChain.mutate(\n { source_role: selectedRole, target_role: newTarget.trim() },\n { onSuccess: () => setNewTarget('') },\n );\n };\n\n const handleRemove = (target: string) => {\n if (!selectedRole) return;\n removeChain.mutate({ source_role: selectedRole, target_role: target });\n };\n\n const isSuperAdmin = selectedRole === 'superadmin';\n\n return (\n <div className=\"border-l border-surface-border pl-6 min-h-[300px]\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-4\">\n Escalation Routing\n </p>\n\n {!selectedRole ? (\n <p className=\"text-xs text-text-tertiary\">\n Select a role to manage its escalation targets.\n </p>\n ) : isSuperAdmin ? (\n <div>\n <p className=\"text-sm font-mono text-text-primary mb-2\">{selectedRole}</p>\n <p className=\"text-xs text-text-tertiary\">\n Superadmins can escalate to any role implicitly.\n </p>\n </div>\n ) : (\n <div className=\"space-y-4\">\n <div>\n <p className=\"text-sm font-mono text-text-primary\">{selectedRole}</p>\n <p className=\"text-[10px] text-text-tertiary mt-0.5\">Can escalate to:</p>\n </div>\n\n {targets.length === 0 ? (\n <p className=\"text-xs text-text-tertiary\">\n No escalation targets configured.\n </p>\n ) : (\n <div className=\"flex flex-wrap gap-2\">\n {targets.map((target) => (\n <span\n key={target}\n className=\"inline-flex items-center gap-1.5 px-2.5 py-1 text-xs bg-surface-sunken rounded-full text-text-secondary font-mono\"\n >\n {target}\n <button\n onClick={() => handleRemove(target)}\n className=\"text-text-tertiary hover:text-status-error transition-colors\"\n title={`Remove ${target}`}\n >\n &times;\n </button>\n </span>\n ))}\n </div>\n )}\n\n {available.length > 0 && (\n <div className=\"pt-3 border-t border-surface-border\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-2\">\n Add Target\n </p>\n <div className=\"flex items-center gap-2\">\n <select\n value={newTarget}\n onChange={(e) => setNewTarget(e.target.value)}\n className=\"select text-xs font-mono flex-1\"\n >\n <option value=\"\">Select a role...</option>\n {available.map((r) => (\n <option key={r} value={r}>{r}</option>\n ))}\n </select>\n <button\n onClick={handleAdd}\n disabled={!newTarget || addChain.isPending}\n className=\"btn-primary text-xs\"\n >\n {addChain.isPending ? 'Adding...' : 'Add'}\n </button>\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n\n// ── Main Page ─────────────────────────────────────────────────\n\nexport function RolesPage() {\n const { data, isLoading } = useRoleDetails();\n const deleteRole = useDeleteRole();\n\n const [showCreate, setShowCreate] = useState(false);\n const [confirmDelete, setConfirmDelete] = useState<RoleDetail | null>(null);\n const [selectedRole, setSelectedRole] = useState<string | null>(null);\n\n const roles = data?.roles ?? [];\n const allRoleNames = useMemo(() => roles.map((r) => r.role), [roles]);\n\n const columns: Column<RoleDetail>[] = [\n {\n key: 'role',\n label: 'Role',\n render: (row) => <RolePill role={row.role} />,\n },\n {\n key: 'user_count',\n label: 'Users',\n render: (row) =>\n row.user_count > 0\n ? <span className=\"text-text-primary\">{row.user_count}</span>\n : <span className=\"text-text-tertiary\">0</span>,\n className: 'w-24 text-right',\n },\n {\n key: 'chain_count',\n label: 'Escalations',\n render: (row) =>\n row.chain_count > 0\n ? <span className=\"text-text-primary\">{row.chain_count}</span>\n : <span className=\"text-text-tertiary\">0</span>,\n className: 'w-28 text-right',\n },\n {\n key: 'workflow_count',\n label: 'Workflows',\n render: (row) =>\n row.workflow_count > 0\n ? <span className=\"text-text-primary\">{row.workflow_count}</span>\n : <span className=\"text-text-tertiary\">0</span>,\n className: 'w-28 text-right',\n },\n {\n key: 'actions',\n label: '',\n render: (row) => {\n const inUse = row.user_count > 0 || row.chain_count > 0 || row.workflow_count > 0;\n return (\n <button\n onClick={(e) => {\n e.stopPropagation();\n setConfirmDelete(row);\n }}\n disabled={inUse}\n className={`text-xs ${\n inUse\n ? 'text-text-tertiary cursor-not-allowed'\n : 'text-status-error hover:underline'\n }`}\n title={inUse ? 'Cannot delete a role that is in use' : 'Delete role'}\n >\n Delete\n </button>\n );\n },\n className: 'w-24 text-right',\n },\n ];\n\n const handleDelete = () => {\n if (!confirmDelete) return;\n deleteRole.mutate(confirmDelete.role, {\n onSuccess: () => setConfirmDelete(null),\n });\n };\n\n return (\n <div>\n <PageHeader\n title=\"Roles\"\n actions={\n <button onClick={() => setShowCreate(true)} className=\"btn-primary text-xs\">\n Add Role\n </button>\n }\n />\n\n <div className=\"grid grid-cols-1 lg:grid-cols-[1fr_320px] gap-6\">\n {/* Left — roles table */}\n <div>\n <DataTable\n columns={columns}\n data={roles}\n keyFn={(row) => row.role}\n isLoading={isLoading}\n emptyMessage=\"No roles found\"\n onRowClick={(row) => setSelectedRole(row.role)}\n activeRowKey={selectedRole}\n />\n </div>\n\n {/* Right — escalation panel */}\n <EscalationPanel selectedRole={selectedRole} allRoles={allRoleNames} />\n </div>\n\n <CreateRoleModal open={showCreate} onClose={() => setShowCreate(false)} />\n\n <ConfirmDeleteModal\n open={!!confirmDelete}\n onClose={() => setConfirmDelete(null)}\n onConfirm={handleDelete}\n title=\"Delete Role\"\n description={\n <>\n Delete role{' '}\n <span className=\"font-medium font-mono text-text-primary\">\n {confirmDelete?.role}\n </span>\n ? This action cannot be undone.\n </>\n }\n isPending={deleteRole.isPending}\n error={deleteRole.error as Error | null}\n />\n </div>\n );\n}\n"],"names":["CreateRoleModal","open","onClose","createRole","useCreateRole","roleName","setRoleName","useState","prevOpen","setPrevOpen","handleCreate","trimmed","jsx","Modal","jsxs","e","EscalationPanel","selectedRole","allRoles","chainsData","useEscalationChains","addChain","useAddEscalationChain","removeChain","useRemoveEscalationChain","newTarget","setNewTarget","chains","targets","useMemo","c","available","r","handleAdd","handleRemove","target","isSuperAdmin","RolesPage","data","isLoading","useRoleDetails","deleteRole","useDeleteRole","showCreate","setShowCreate","confirmDelete","setConfirmDelete","setSelectedRole","roles","allRoleNames","columns","row","RolePill","inUse","handleDelete","PageHeader","DataTable","ConfirmDeleteModal","Fragment"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{j as o}from"./vendor-query-B2UbickB.js";function c({icon:t,title:e,onClick:i,colorClass:n="text-text-tertiary hover:text-accent",alwaysVisible:r}){return o.jsx("button",{onClick:a=>{a.stopPropagation(),i(a)},className:`transition-opacity ${r?"opacity-100":"opacity-0 group-hover/row:opacity-100"} ${n}`,title:e,children:o.jsx(t,{className:"w-[18px] h-[18px]",strokeWidth:1.5})})}function p({children:t}){return o.jsx("span",{className:"flex items-center justify-end gap-2.5",children:t})}export{p as R,c as a};
2
+ //# sourceMappingURL=RowActions-Dg-Fsm5O.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RowActions-Dg-Fsm5O.js","sources":["../../src/components/common/layout/RowActions.tsx"],"sourcesContent":["import type { LucideIcon } from 'lucide-react';\nimport type { ReactNode } from 'react';\n\n/**\n * Ephemeral icon button that appears on row hover.\n * Uses `group-hover/row:opacity-100` to show on hover — rows must have `group/row`.\n */\nexport function RowAction({\n icon: Icon,\n title,\n onClick,\n colorClass = 'text-text-tertiary hover:text-accent',\n alwaysVisible,\n}: {\n icon: LucideIcon;\n title: string;\n onClick: (e: React.MouseEvent) => void;\n colorClass?: string;\n alwaysVisible?: boolean;\n}) {\n return (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onClick(e);\n }}\n className={`transition-opacity ${\n alwaysVisible ? 'opacity-100' : 'opacity-0 group-hover/row:opacity-100'\n } ${colorClass}`}\n title={title}\n >\n <Icon className=\"w-[18px] h-[18px]\" strokeWidth={1.5} />\n </button>\n );\n}\n\n/**\n * Container for one or more RowAction icons in the last table column.\n */\nexport function RowActionGroup({ children }: { children: ReactNode }) {\n return (\n <span className=\"flex items-center justify-end gap-2.5\">\n {children}\n </span>\n );\n}\n"],"names":["RowAction","Icon","title","onClick","colorClass","alwaysVisible","jsx","e","RowActionGroup","children"],"mappings":"+CAOO,SAASA,EAAU,CACxB,KAAMC,EACN,MAAAC,EACA,QAAAC,EACA,WAAAC,EAAa,uCACb,cAAAC,CACF,EAMG,CACD,OACEC,EAAAA,IAAC,SAAA,CACC,QAAUC,GAAM,CACdA,EAAE,gBAAA,EACFJ,EAAQI,CAAC,CACX,EACA,UAAW,sBACTF,EAAgB,cAAgB,uCAClC,IAAID,CAAU,GACd,MAAAF,EAEA,SAAAI,EAAAA,IAACL,EAAA,CAAK,UAAU,oBAAoB,YAAa,GAAA,CAAK,CAAA,CAAA,CAG5D,CAKO,SAASO,EAAe,CAAE,SAAAC,GAAqC,CACpE,OACEH,EAAAA,IAAC,OAAA,CAAK,UAAU,wCACb,SAAAG,CAAA,CACH,CAEJ"}
@@ -0,0 +1,4 @@
1
+ import{j as h}from"./vendor-query-B2UbickB.js";function o(i){return i.replace(/`([^`]+)`/g,'<code class="px-1 py-0.5 bg-surface-sunken rounded text-xs font-mono">$1</code>').replace(/\*\*\*(.+?)\*\*\*/g,"<strong><em>$1</em></strong>").replace(/\*\*(.+?)\*\*/g,"<strong>$1</strong>").replace(/\*(.+?)\*/g,"<em>$1</em>").replace(/\[([^\]]+)\]\(([^)]+)\)/g,'<a href="$2" class="text-accent-primary hover:underline" target="_blank" rel="noopener noreferrer">$1</a>')}function m({content:i}){const u=i.split(`
2
+ `),t=[];let s=!1,a=!1,n=[];for(const c of u){const e=c.trim();if(e.startsWith("|")&&e.endsWith("|")){const r=e.slice(1,-1).split("|").map(l=>l.trim());if(r.every(l=>/^[-:]+$/.test(l)))continue;a||(a=!0,n=[]),n.push(r);continue}if(a){a=!1;const[r,...l]=n;t.push('<div class="overflow-x-auto my-2"><table class="text-xs w-full"><thead><tr>');for(const p of r)t.push(`<th class="text-left py-1 px-2 border-b border-border text-text-secondary font-medium">${o(p)}</th>`);t.push("</tr></thead><tbody>");for(const p of l){t.push("<tr>");for(const f of p)t.push(`<td class="py-1 px-2 border-b border-border/50">${o(f)}</td>`);t.push("</tr>")}t.push("</tbody></table></div>"),n=[]}if(!e){s&&(t.push("</ul>"),s=!1);continue}if(e.startsWith("### ")){s&&(t.push("</ul>"),s=!1),t.push(`<h4 class="text-sm font-semibold text-text-primary mt-3 mb-1">${o(e.slice(4))}</h4>`);continue}if(e.startsWith("## ")){s&&(t.push("</ul>"),s=!1),t.push(`<h3 class="text-sm font-semibold text-text-primary mt-3 mb-1">${o(e.slice(3))}</h3>`);continue}if(/^[-*_]{3,}$/.test(e)){s&&(t.push("</ul>"),s=!1),t.push('<hr class="border-border my-3" />');continue}if(/^[-*] /.test(e)){s||(t.push('<ul class="space-y-1 my-1">'),s=!0),t.push(`<li class="text-sm text-text-secondary flex gap-2"><span class="text-text-tertiary shrink-0">-</span><span>${o(e.slice(2))}</span></li>`);continue}s&&(t.push("</ul>"),s=!1),t.push(`<p class="text-sm text-text-secondary my-1">${o(e)}</p>`)}if(a&&n.length){const[c,...e]=n;t.push('<div class="overflow-x-auto my-2"><table class="text-xs w-full"><thead><tr>');for(const r of c)t.push(`<th class="text-left py-1 px-2 border-b border-border text-text-secondary font-medium">${o(r)}</th>`);t.push("</tr></thead><tbody>");for(const r of e){t.push("<tr>");for(const l of r)t.push(`<td class="py-1 px-2 border-b border-border/50">${o(l)}</td>`);t.push("</tr>")}t.push("</tbody></table></div>")}return s&&t.push("</ul>"),h.jsx("div",{className:"prose-sm",dangerouslySetInnerHTML:{__html:t.join(`
3
+ `)}})}export{m as S};
4
+ //# sourceMappingURL=SimpleMarkdown-CBlvaWP4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SimpleMarkdown-CBlvaWP4.js","sources":["../../src/components/common/display/SimpleMarkdown.tsx"],"sourcesContent":["/**\n * Lightweight markdown-to-HTML renderer for simple patterns.\n * No external dependency — handles bold, italic, code, links, headers, lists.\n */\n\nfunction renderInline(text: string): string {\n return text\n // Code spans\n .replace(/`([^`]+)`/g, '<code class=\"px-1 py-0.5 bg-surface-sunken rounded text-xs font-mono\">$1</code>')\n // Bold + italic\n .replace(/\\*\\*\\*(.+?)\\*\\*\\*/g, '<strong><em>$1</em></strong>')\n // Bold\n .replace(/\\*\\*(.+?)\\*\\*/g, '<strong>$1</strong>')\n // Italic\n .replace(/\\*(.+?)\\*/g, '<em>$1</em>')\n // Links\n .replace(/\\[([^\\]]+)\\]\\(([^)]+)\\)/g, '<a href=\"$2\" class=\"text-accent-primary hover:underline\" target=\"_blank\" rel=\"noopener noreferrer\">$1</a>');\n}\n\nexport function SimpleMarkdown({ content }: { content: string }) {\n const lines = content.split('\\n');\n const htmlParts: string[] = [];\n let inList = false;\n let inTable = false;\n let tableRows: string[][] = [];\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n // Table rows\n if (trimmed.startsWith('|') && trimmed.endsWith('|')) {\n const cells = trimmed.slice(1, -1).split('|').map((c) => c.trim());\n // Skip separator rows (|---|---|)\n if (cells.every((c) => /^[-:]+$/.test(c))) continue;\n if (!inTable) {\n inTable = true;\n tableRows = [];\n }\n tableRows.push(cells);\n continue;\n }\n if (inTable) {\n inTable = false;\n const [header, ...body] = tableRows;\n htmlParts.push('<div class=\"overflow-x-auto my-2\"><table class=\"text-xs w-full\"><thead><tr>');\n for (const h of header) {\n htmlParts.push(`<th class=\"text-left py-1 px-2 border-b border-border text-text-secondary font-medium\">${renderInline(h)}</th>`);\n }\n htmlParts.push('</tr></thead><tbody>');\n for (const row of body) {\n htmlParts.push('<tr>');\n for (const cell of row) {\n htmlParts.push(`<td class=\"py-1 px-2 border-b border-border/50\">${renderInline(cell)}</td>`);\n }\n htmlParts.push('</tr>');\n }\n htmlParts.push('</tbody></table></div>');\n tableRows = [];\n }\n\n // Empty line\n if (!trimmed) {\n if (inList) { htmlParts.push('</ul>'); inList = false; }\n continue;\n }\n\n // Headers\n if (trimmed.startsWith('### ')) {\n if (inList) { htmlParts.push('</ul>'); inList = false; }\n htmlParts.push(`<h4 class=\"text-sm font-semibold text-text-primary mt-3 mb-1\">${renderInline(trimmed.slice(4))}</h4>`);\n continue;\n }\n if (trimmed.startsWith('## ')) {\n if (inList) { htmlParts.push('</ul>'); inList = false; }\n htmlParts.push(`<h3 class=\"text-sm font-semibold text-text-primary mt-3 mb-1\">${renderInline(trimmed.slice(3))}</h3>`);\n continue;\n }\n\n // Horizontal rule\n if (/^[-*_]{3,}$/.test(trimmed)) {\n if (inList) { htmlParts.push('</ul>'); inList = false; }\n htmlParts.push('<hr class=\"border-border my-3\" />');\n continue;\n }\n\n // List items\n if (/^[-*] /.test(trimmed)) {\n if (!inList) { htmlParts.push('<ul class=\"space-y-1 my-1\">'); inList = true; }\n htmlParts.push(`<li class=\"text-sm text-text-secondary flex gap-2\"><span class=\"text-text-tertiary shrink-0\">-</span><span>${renderInline(trimmed.slice(2))}</span></li>`);\n continue;\n }\n\n // Paragraph\n if (inList) { htmlParts.push('</ul>'); inList = false; }\n htmlParts.push(`<p class=\"text-sm text-text-secondary my-1\">${renderInline(trimmed)}</p>`);\n }\n\n // Flush any remaining table\n if (inTable && tableRows.length) {\n const [header, ...body] = tableRows;\n htmlParts.push('<div class=\"overflow-x-auto my-2\"><table class=\"text-xs w-full\"><thead><tr>');\n for (const h of header) {\n htmlParts.push(`<th class=\"text-left py-1 px-2 border-b border-border text-text-secondary font-medium\">${renderInline(h)}</th>`);\n }\n htmlParts.push('</tr></thead><tbody>');\n for (const row of body) {\n htmlParts.push('<tr>');\n for (const cell of row) {\n htmlParts.push(`<td class=\"py-1 px-2 border-b border-border/50\">${renderInline(cell)}</td>`);\n }\n htmlParts.push('</tr>');\n }\n htmlParts.push('</tbody></table></div>');\n }\n\n if (inList) htmlParts.push('</ul>');\n\n return (\n <div\n className=\"prose-sm\"\n dangerouslySetInnerHTML={{ __html: htmlParts.join('\\n') }}\n />\n );\n}\n"],"names":["renderInline","text","SimpleMarkdown","content","lines","htmlParts","inList","inTable","tableRows","line","trimmed","cells","c","header","body","h","row","cell","jsx"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{j as e}from"./vendor-query-B2UbickB.js";function l({label:c,value:x,sub:t,dotClass:r,colorClass:i="text-text-primary",onClick:s}){const a=e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex items-center gap-2 mb-1",children:[r&&e.jsx("span",{className:`w-2 h-2 rounded-full ${r}`}),e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:c})]}),e.jsx("p",{className:`text-2xl font-light tabular-nums ${i}`,children:x}),t&&e.jsx("p",{className:"text-xs text-text-tertiary mt-1",children:t})]}),n="bg-surface-raised border border-surface-border rounded-md p-4 text-left";return s?e.jsx("button",{onClick:s,className:`${n} hover:border-accent/40 transition-colors`,children:a}):e.jsx("div",{className:n,children:a})}export{l as S};
2
+ //# sourceMappingURL=StatCard-DlgF0CJC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatCard-DlgF0CJC.js","sources":["../../src/components/common/data/StatCard.tsx"],"sourcesContent":["interface StatCardProps {\n label: string;\n value: string | number;\n sub?: string;\n dotClass?: string;\n colorClass?: string;\n onClick?: () => void;\n}\n\nexport function StatCard({\n label,\n value,\n sub,\n dotClass,\n colorClass = 'text-text-primary',\n onClick,\n}: StatCardProps) {\n const content = (\n <>\n <div className=\"flex items-center gap-2 mb-1\">\n {dotClass && <span className={`w-2 h-2 rounded-full ${dotClass}`} />}\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n {label}\n </p>\n </div>\n <p className={`text-2xl font-light tabular-nums ${colorClass}`}>{value}</p>\n {sub && <p className=\"text-xs text-text-tertiary mt-1\">{sub}</p>}\n </>\n );\n\n const base = 'bg-surface-raised border border-surface-border rounded-md p-4 text-left';\n\n if (onClick) {\n return (\n <button onClick={onClick} className={`${base} hover:border-accent/40 transition-colors`}>\n {content}\n </button>\n );\n }\n\n return <div className={base}>{content}</div>;\n}\n"],"names":["StatCard","label","value","sub","dotClass","colorClass","onClick","content","jsxs","Fragment","jsx","base"],"mappings":"+CASO,SAASA,EAAS,CACvB,MAAAC,EACA,MAAAC,EACA,IAAAC,EACA,SAAAC,EACA,WAAAC,EAAa,oBACb,QAAAC,CACF,EAAkB,CAChB,MAAMC,EACJC,EAAAA,KAAAC,EAAAA,SAAA,CACE,SAAA,CAAAD,EAAAA,KAAC,MAAA,CAAI,UAAU,+BACZ,SAAA,CAAAJ,GAAYM,EAAAA,IAAC,OAAA,CAAK,UAAW,wBAAwBN,CAAQ,GAAI,EAClEM,EAAAA,IAAC,IAAA,CAAE,UAAU,yEACV,SAAAT,CAAA,CACH,CAAA,EACF,QACC,IAAA,CAAE,UAAW,oCAAoCI,CAAU,GAAK,SAAAH,EAAM,EACtEC,GAAOO,EAAAA,IAAC,IAAA,CAAE,UAAU,kCAAmC,SAAAP,CAAA,CAAI,CAAA,EAC9D,EAGIQ,EAAO,0EAEb,OAAIL,QAEC,SAAA,CAAO,QAAAA,EAAkB,UAAW,GAAGK,CAAI,4CACzC,SAAAJ,CAAA,CACH,EAIGG,EAAAA,IAAC,MAAA,CAAI,UAAWC,EAAO,SAAAJ,EAAQ,CACxC"}
@@ -0,0 +1,2 @@
1
+ import{j as s}from"./vendor-query-B2UbickB.js";const a={pending:"bg-status-pending",in_progress:"bg-status-active animate-pulse",completed:"bg-status-success",resolved:"bg-status-success",needs_intervention:"bg-status-error",failed:"bg-status-error",cancelled:"bg-accent-muted",draft:"bg-status-pending",deployed:"bg-status-active",active:"bg-status-success",archived:"bg-text-tertiary"},d={pending:"Pending",in_progress:"In Progress",completed:"Completed",resolved:"Resolved",needs_intervention:"Needs Intervention",failed:"Failed",cancelled:"Cancelled",draft:"Draft",deployed:"Deployed",active:"Active",archived:"Archived"};function c({status:e}){const t=a[e]??"bg-status-pending",n=d[e]??e;return s.jsxs("span",{className:"inline-flex items-center gap-2",children:[s.jsx("span",{className:`w-2 h-2 rounded-full ${t}`}),s.jsx("span",{className:"text-xs text-text-secondary",children:n})]})}export{c as S};
2
+ //# sourceMappingURL=StatusBadge-TlC4jiig.js.map