@hotmeshio/long-tail 0.1.14 → 0.1.16

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 (360) hide show
  1. package/README.md +15 -0
  2. package/build/api/escalations/bulk.d.ts +78 -0
  3. package/build/api/escalations/bulk.js +279 -0
  4. package/build/api/escalations/claim.d.ts +30 -0
  5. package/build/api/escalations/claim.js +121 -0
  6. package/build/api/escalations/create.d.ts +29 -0
  7. package/build/api/escalations/create.js +101 -0
  8. package/build/api/escalations/helpers.d.ts +10 -0
  9. package/build/api/escalations/helpers.js +80 -0
  10. package/build/api/escalations/index.d.ts +6 -0
  11. package/build/api/escalations/index.js +26 -0
  12. package/build/api/escalations/list.d.ts +75 -0
  13. package/build/api/escalations/list.js +170 -0
  14. package/build/api/escalations/resolve.d.ts +18 -0
  15. package/build/api/escalations/resolve.js +243 -0
  16. package/build/api/escalations/single.d.ts +37 -0
  17. package/build/api/escalations/single.js +123 -0
  18. package/build/api/files.d.ts +3 -0
  19. package/build/api/files.js +18 -1
  20. package/build/api/knowledge.d.ts +36 -0
  21. package/build/api/knowledge.js +112 -0
  22. package/build/api/mcp/index.d.ts +2 -0
  23. package/build/api/mcp/index.js +16 -0
  24. package/build/api/{mcp.d.ts → mcp/servers.d.ts} +1 -33
  25. package/build/api/{mcp.js → mcp/servers.js} +4 -65
  26. package/build/api/mcp/tools.d.ts +33 -0
  27. package/build/api/mcp/tools.js +64 -0
  28. package/build/api/settings.js +6 -1
  29. package/build/api/workflows/config.d.ts +64 -0
  30. package/build/api/workflows/config.js +142 -0
  31. package/build/api/workflows/discovery.d.ts +29 -0
  32. package/build/api/workflows/discovery.js +153 -0
  33. package/build/api/workflows/index.d.ts +3 -0
  34. package/build/api/workflows/index.js +18 -0
  35. package/build/api/workflows/invocation.d.ts +67 -0
  36. package/build/api/workflows/invocation.js +188 -0
  37. package/build/api/yaml-workflows/cron.d.ts +39 -0
  38. package/build/api/yaml-workflows/cron.js +127 -0
  39. package/build/api/{yaml-workflows.d.ts → yaml-workflows/crud.d.ts} +22 -146
  40. package/build/api/{yaml-workflows.js → yaml-workflows/crud.js} +99 -380
  41. package/build/api/yaml-workflows/deploy.d.ts +71 -0
  42. package/build/api/yaml-workflows/deploy.js +223 -0
  43. package/build/api/yaml-workflows/helpers.d.ts +2 -0
  44. package/build/api/yaml-workflows/helpers.js +8 -0
  45. package/build/api/yaml-workflows/index.d.ts +4 -0
  46. package/build/api/yaml-workflows/index.js +27 -0
  47. package/build/api/yaml-workflows/versions.d.ts +43 -0
  48. package/build/api/yaml-workflows/versions.js +124 -0
  49. package/build/bin/ltc.d.ts +2 -0
  50. package/build/bin/ltc.js +220 -0
  51. package/build/examples/seed-data.d.ts +55 -0
  52. package/build/examples/seed-data.js +161 -0
  53. package/build/examples/seed.js +7 -164
  54. package/build/index.d.ts +1 -1
  55. package/build/lib/cli/auth.d.ts +23 -0
  56. package/build/lib/cli/auth.js +167 -0
  57. package/build/lib/cli/client.d.ts +6 -0
  58. package/build/lib/cli/client.js +31 -0
  59. package/build/lib/cli/commands/escalations.d.ts +19 -0
  60. package/build/lib/cli/commands/escalations.js +69 -0
  61. package/build/lib/cli/commands/knowledge.d.ts +18 -0
  62. package/build/lib/cli/commands/knowledge.js +87 -0
  63. package/build/lib/cli/commands/mcp.d.ts +8 -0
  64. package/build/lib/cli/commands/mcp.js +33 -0
  65. package/build/lib/cli/commands/pipelines.d.ts +16 -0
  66. package/build/lib/cli/commands/pipelines.js +67 -0
  67. package/build/lib/cli/commands/status.d.ts +1 -0
  68. package/build/lib/cli/commands/status.js +28 -0
  69. package/build/lib/cli/commands/users.d.ts +7 -0
  70. package/build/lib/cli/commands/users.js +25 -0
  71. package/build/lib/cli/commands/workflows.d.ts +16 -0
  72. package/build/lib/cli/commands/workflows.js +104 -0
  73. package/build/lib/cli/compile.d.ts +2 -0
  74. package/build/lib/cli/compile.js +165 -0
  75. package/build/lib/cli/format.d.ts +23 -0
  76. package/build/lib/cli/format.js +94 -0
  77. package/build/lib/cli/init.d.ts +1 -0
  78. package/build/lib/cli/init.js +61 -0
  79. package/build/lib/cli/output.d.ts +27 -0
  80. package/build/lib/cli/output.js +126 -0
  81. package/build/lib/cli/scanner.d.ts +10 -0
  82. package/build/lib/cli/scanner.js +164 -0
  83. package/build/lib/cli/types.d.ts +16 -0
  84. package/build/lib/cli/types.js +2 -0
  85. package/build/lib/db/schemas/schemas/001_schema.sql +485 -0
  86. package/build/lib/db/schemas/schemas/002_seed.sql +92 -0
  87. package/build/lib/events/socketio.d.ts +12 -0
  88. package/build/lib/events/socketio.js +24 -1
  89. package/build/lib/logger/index.d.ts +0 -9
  90. package/build/lib/logger/index.js +9 -4
  91. package/build/lib/storage/index.js +2 -2
  92. package/build/routes/file-browser.js +14 -0
  93. package/build/routes/index.js +4 -0
  94. package/build/routes/knowledge.d.ts +2 -0
  95. package/build/routes/knowledge.js +141 -0
  96. package/build/routes/nats-credentials.d.ts +2 -0
  97. package/build/routes/nats-credentials.js +22 -0
  98. package/build/routes/yaml-workflows/crud.js +9 -0
  99. package/build/sdk/index.d.ts +17 -0
  100. package/build/sdk/index.js +19 -0
  101. package/build/services/mcp/client/connection-dispatch.d.ts +18 -0
  102. package/build/services/mcp/client/connection-dispatch.js +78 -0
  103. package/build/services/mcp/client/connection-lifecycle.d.ts +48 -0
  104. package/build/services/mcp/client/connection-lifecycle.js +296 -0
  105. package/build/services/mcp/client/connection-test.d.ts +10 -0
  106. package/build/services/mcp/client/connection-test.js +49 -0
  107. package/build/services/mcp/client/connection.d.ts +3 -68
  108. package/build/services/mcp/client/connection.js +15 -393
  109. package/build/services/mcp/server-lifecycle.d.ts +27 -0
  110. package/build/services/mcp/server-lifecycle.js +49 -0
  111. package/build/services/mcp/server-tools.d.ts +13 -0
  112. package/build/services/mcp/server-tools.js +287 -0
  113. package/build/services/mcp/server.d.ts +2 -26
  114. package/build/services/mcp/server.js +7 -315
  115. package/build/services/yaml-workflow/builder-regenerate.d.ts +25 -0
  116. package/build/services/yaml-workflow/builder-regenerate.js +111 -0
  117. package/build/services/yaml-workflow/db-versions.d.ts +17 -0
  118. package/build/services/yaml-workflow/db-versions.js +76 -0
  119. package/build/services/yaml-workflow/db.d.ts +3 -13
  120. package/build/services/yaml-workflow/db.js +15 -71
  121. package/build/services/yaml-workflow/deployer-helpers.js +48 -17
  122. package/build/services/yaml-workflow/durable-compiler/index.d.ts +22 -0
  123. package/build/services/yaml-workflow/durable-compiler/index.js +168 -0
  124. package/build/services/yaml-workflow/durable-compiler/parser.d.ts +12 -0
  125. package/build/services/yaml-workflow/durable-compiler/parser.js +110 -0
  126. package/build/services/yaml-workflow/durable-compiler/prompts.d.ts +18 -0
  127. package/build/services/yaml-workflow/durable-compiler/prompts.js +570 -0
  128. package/build/services/yaml-workflow/durable-compiler/types.d.ts +51 -0
  129. package/build/services/yaml-workflow/durable-compiler/types.js +5 -0
  130. package/build/services/yaml-workflow/pipeline/build/dag-assembly.d.ts +17 -0
  131. package/build/services/yaml-workflow/pipeline/build/dag-assembly.js +192 -0
  132. package/build/services/yaml-workflow/pipeline/build/dag.d.ts +4 -13
  133. package/build/services/yaml-workflow/pipeline/build/dag.js +9 -185
  134. package/build/services/yaml-workflow/pipeline/prompt-templates.d.ts +10 -0
  135. package/build/services/yaml-workflow/pipeline/prompt-templates.js +270 -0
  136. package/build/services/yaml-workflow/pipeline/prompts.d.ts +3 -6
  137. package/build/services/yaml-workflow/pipeline/prompts.js +8 -263
  138. package/build/services/yaml-workflow/workers/register.js +4 -2
  139. package/build/start/adapters.js +4 -1
  140. package/build/start/socket-auth.d.ts +13 -0
  141. package/build/start/socket-auth.js +32 -0
  142. package/build/start/workers.js +6 -5
  143. package/build/system/activities/file-storage.d.ts +4 -0
  144. package/build/system/activities/file-storage.js +7 -1
  145. package/build/system/activities/knowledge.d.ts +23 -0
  146. package/build/system/activities/knowledge.js +50 -10
  147. package/build/system/activities/sql.d.ts +3 -0
  148. package/build/system/activities/sql.js +25 -1
  149. package/build/system/mcp-servers/file-storage.js +3 -1
  150. package/build/system/mcp-servers/human-queue-schemas.d.ts +91 -0
  151. package/build/system/mcp-servers/human-queue-schemas.js +42 -0
  152. package/build/system/mcp-servers/human-queue.d.ts +2 -6
  153. package/build/system/mcp-servers/human-queue.js +9 -51
  154. package/build/system/mcp-servers/knowledge.js +43 -9
  155. package/build/system/mcp-servers/workflow-compiler.js +54 -0
  156. package/build/system/workflows/mcp-triage/activities-proxy.d.ts +21 -0
  157. package/build/system/workflows/mcp-triage/activities-proxy.js +70 -0
  158. package/build/system/workflows/mcp-triage/index.js +17 -75
  159. package/build/system/workflows/mcp-workflow-planner/activities/persist.d.ts +1 -0
  160. package/build/system/workflows/mcp-workflow-planner/activities/persist.js +1 -0
  161. package/build/system/workflows/mcp-workflow-planner/index.js +2 -0
  162. package/build/tsconfig.tsbuildinfo +1 -1
  163. package/dashboard/dist/assets/{AdminDashboard-Cngijp4Q.js → AdminDashboard-Bprul9Eb.js} +2 -2
  164. package/dashboard/dist/assets/{AdminDashboard-Cngijp4Q.js.map → AdminDashboard-Bprul9Eb.js.map} +1 -1
  165. package/dashboard/dist/assets/AvailableEscalationsPage-H_z5mC10.js +2 -0
  166. package/dashboard/dist/assets/AvailableEscalationsPage-H_z5mC10.js.map +1 -0
  167. package/dashboard/dist/assets/{BotPicker-B8Uvw9Si.js → BotPicker-DcvILNUf.js} +2 -2
  168. package/dashboard/dist/assets/{BotPicker-B8Uvw9Si.js.map → BotPicker-DcvILNUf.js.map} +1 -1
  169. package/dashboard/dist/assets/{CollapsibleSection-DiFPuWOY.js → CollapsibleSection-BWPbzgEe.js} +2 -2
  170. package/dashboard/dist/assets/{CollapsibleSection-DiFPuWOY.js.map → CollapsibleSection-BWPbzgEe.js.map} +1 -1
  171. package/dashboard/dist/assets/{ConfirmDeleteModal-CpXG9uyu.js → ConfirmDeleteModal-Cy6KVLfC.js} +2 -2
  172. package/dashboard/dist/assets/{ConfirmDeleteModal-CpXG9uyu.js.map → ConfirmDeleteModal-Cy6KVLfC.js.map} +1 -1
  173. package/dashboard/dist/assets/{CopyableId-DKsTR9lK.js → CopyableId-CRED8hvk.js} +2 -2
  174. package/dashboard/dist/assets/{CopyableId-DKsTR9lK.js.map → CopyableId-CRED8hvk.js.map} +1 -1
  175. package/dashboard/dist/assets/{CredentialsPage-DlS7Kf40.js → CredentialsPage-BUdvxiE3.js} +2 -2
  176. package/dashboard/dist/assets/{CredentialsPage-DlS7Kf40.js.map → CredentialsPage-BUdvxiE3.js.map} +1 -1
  177. package/dashboard/dist/assets/{CustomDurationPicker-B-9eW3pm.js → CustomDurationPicker-eOk2EqQ5.js} +2 -2
  178. package/dashboard/dist/assets/{CustomDurationPicker-B-9eW3pm.js.map → CustomDurationPicker-eOk2EqQ5.js.map} +1 -1
  179. package/dashboard/dist/assets/{DataTable-DkOokbtL.js → DataTable-bd2PTBJd.js} +2 -2
  180. package/dashboard/dist/assets/{DataTable-DkOokbtL.js.map → DataTable-bd2PTBJd.js.map} +1 -1
  181. package/dashboard/dist/assets/{ElapsedCell-DVtHqM-5.js → ElapsedCell-BGo8vyus.js} +2 -2
  182. package/dashboard/dist/assets/{ElapsedCell-DVtHqM-5.js.map → ElapsedCell-BGo8vyus.js.map} +1 -1
  183. package/dashboard/dist/assets/{EmptyState-C7KIMIbE.js → EmptyState-BygtU-Rh.js} +2 -2
  184. package/dashboard/dist/assets/{EmptyState-C7KIMIbE.js.map → EmptyState-BygtU-Rh.js.map} +1 -1
  185. package/dashboard/dist/assets/{EscalationsOverview-BMKBlkPx.js → EscalationsOverview-DUEcN5MP.js} +2 -2
  186. package/dashboard/dist/assets/{EscalationsOverview-BMKBlkPx.js.map → EscalationsOverview-DUEcN5MP.js.map} +1 -1
  187. package/dashboard/dist/assets/{EventTable-BYZ5OVdQ.js → EventTable-CmFhswLW.js} +2 -2
  188. package/dashboard/dist/assets/{EventTable-BYZ5OVdQ.js.map → EventTable-CmFhswLW.js.map} +1 -1
  189. package/dashboard/dist/assets/{FilterBar-C5r3n6YO.js → FilterBar-BQNzsd3A.js} +2 -2
  190. package/dashboard/dist/assets/{FilterBar-C5r3n6YO.js.map → FilterBar-BQNzsd3A.js.map} +1 -1
  191. package/dashboard/dist/assets/{ListToolbar-BGUajIsW.js → ListToolbar-OWOn-HiC.js} +2 -2
  192. package/dashboard/dist/assets/{ListToolbar-BGUajIsW.js.map → ListToolbar-OWOn-HiC.js.map} +1 -1
  193. package/dashboard/dist/assets/{McpOverview-B_kJYHea.js → McpOverview-OkEzvClD.js} +2 -2
  194. package/dashboard/dist/assets/{McpOverview-B_kJYHea.js.map → McpOverview-OkEzvClD.js.map} +1 -1
  195. package/dashboard/dist/assets/McpQueryDetailPage-C6Ih5sC_.js +5 -0
  196. package/dashboard/dist/assets/McpQueryDetailPage-C6Ih5sC_.js.map +1 -0
  197. package/dashboard/dist/assets/{McpQueryPage-BgAq_bQg.js → McpQueryPage-BAuOf5TL.js} +2 -2
  198. package/dashboard/dist/assets/{McpQueryPage-BgAq_bQg.js.map → McpQueryPage-BAuOf5TL.js.map} +1 -1
  199. package/dashboard/dist/assets/{McpRunDetailPage-B8c0OszR.js → McpRunDetailPage-DMeiG4i_.js} +2 -2
  200. package/dashboard/dist/assets/{McpRunDetailPage-B8c0OszR.js.map → McpRunDetailPage-DMeiG4i_.js.map} +1 -1
  201. package/dashboard/dist/assets/{McpRunsPage-BY8C6k78.js → McpRunsPage-CG3cNJh8.js} +2 -2
  202. package/dashboard/dist/assets/{McpRunsPage-BY8C6k78.js.map → McpRunsPage-CG3cNJh8.js.map} +1 -1
  203. package/dashboard/dist/assets/{Modal-E1yRnCeW.js → Modal-Dir9Rlnx.js} +2 -2
  204. package/dashboard/dist/assets/{Modal-E1yRnCeW.js.map → Modal-Dir9Rlnx.js.map} +1 -1
  205. package/dashboard/dist/assets/{OperatorDashboard-C8MSTzey.js → OperatorDashboard-OqWC6Azy.js} +2 -2
  206. package/dashboard/dist/assets/{OperatorDashboard-C8MSTzey.js.map → OperatorDashboard-OqWC6Azy.js.map} +1 -1
  207. package/dashboard/dist/assets/{PageHeader-Cm5HBQF_.js → PageHeader-FJIemmrC.js} +2 -2
  208. package/dashboard/dist/assets/{PageHeader-Cm5HBQF_.js.map → PageHeader-FJIemmrC.js.map} +1 -1
  209. package/dashboard/dist/assets/{PageHeaderWithStats-CNmWJFSN.js → PageHeaderWithStats-Br5y9qNO.js} +2 -2
  210. package/dashboard/dist/assets/{PageHeaderWithStats-CNmWJFSN.js.map → PageHeaderWithStats-Br5y9qNO.js.map} +1 -1
  211. package/dashboard/dist/assets/{PriorityBadge-HSI4RVhs.js → PriorityBadge-C7D5d_HY.js} +2 -2
  212. package/dashboard/dist/assets/{PriorityBadge-HSI4RVhs.js.map → PriorityBadge-C7D5d_HY.js.map} +1 -1
  213. package/dashboard/dist/assets/{ProcessDetailPage-Dln8622H.js → ProcessDetailPage-DZIP6grw.js} +2 -2
  214. package/dashboard/dist/assets/{ProcessDetailPage-Dln8622H.js.map → ProcessDetailPage-DZIP6grw.js.map} +1 -1
  215. package/dashboard/dist/assets/{ProcessesListPage-bIsd9N_h.js → ProcessesListPage-BQoPYkeB.js} +2 -2
  216. package/dashboard/dist/assets/{ProcessesListPage-bIsd9N_h.js.map → ProcessesListPage-BQoPYkeB.js.map} +1 -1
  217. package/dashboard/dist/assets/{RolePill-BVUp2bF0.js → RolePill-D6nMxMvp.js} +2 -2
  218. package/dashboard/dist/assets/{RolePill-BVUp2bF0.js.map → RolePill-D6nMxMvp.js.map} +1 -1
  219. package/dashboard/dist/assets/RolesPage-CwLnJFhy.js +2 -0
  220. package/dashboard/dist/assets/{RolesPage-kH-Njt25.js.map → RolesPage-CwLnJFhy.js.map} +1 -1
  221. package/dashboard/dist/assets/{RowActions-DbUJPfaW.js → RowActions-JqgAB0p3.js} +2 -2
  222. package/dashboard/dist/assets/{RowActions-DbUJPfaW.js.map → RowActions-JqgAB0p3.js.map} +1 -1
  223. package/dashboard/dist/assets/RunAsSelector-KAlKtitB.js +2 -0
  224. package/dashboard/dist/assets/RunAsSelector-KAlKtitB.js.map +1 -0
  225. package/dashboard/dist/assets/{StatCard-Bs3JbyAz.js → StatCard-B-WLhOaH.js} +2 -2
  226. package/dashboard/dist/assets/{StatCard-Bs3JbyAz.js.map → StatCard-B-WLhOaH.js.map} +1 -1
  227. package/dashboard/dist/assets/{StatusBadge-CakDdsCw.js → StatusBadge-DVCf2ncM.js} +2 -2
  228. package/dashboard/dist/assets/{StatusBadge-CakDdsCw.js.map → StatusBadge-DVCf2ncM.js.map} +1 -1
  229. package/dashboard/dist/assets/{StepIndicator-Cd_SG_yA.js → StepIndicator-D9Xvdf18.js} +2 -2
  230. package/dashboard/dist/assets/{StepIndicator-Cd_SG_yA.js.map → StepIndicator-D9Xvdf18.js.map} +1 -1
  231. package/dashboard/dist/assets/{StickyPagination-Bz0C18nC.js → StickyPagination-CJHMzYJj.js} +2 -2
  232. package/dashboard/dist/assets/{StickyPagination-Bz0C18nC.js.map → StickyPagination-CJHMzYJj.js.map} +1 -1
  233. package/dashboard/dist/assets/SwimlaneTimeline-YiXPDyEL.js +2 -0
  234. package/dashboard/dist/assets/SwimlaneTimeline-YiXPDyEL.js.map +1 -0
  235. package/dashboard/dist/assets/{TagInput-ClFhXG-U.js → TagInput-DcPnUnSJ.js} +2 -2
  236. package/dashboard/dist/assets/{TagInput-ClFhXG-U.js.map → TagInput-DcPnUnSJ.js.map} +1 -1
  237. package/dashboard/dist/assets/{TaskDetailPage-SuMBdARt.js → TaskDetailPage-DftmYWD7.js} +2 -2
  238. package/dashboard/dist/assets/{TaskDetailPage-SuMBdARt.js.map → TaskDetailPage-DftmYWD7.js.map} +1 -1
  239. package/dashboard/dist/assets/{TaskQueuePill-lJR1JW_W.js → TaskQueuePill-BzduBqwy.js} +2 -2
  240. package/dashboard/dist/assets/{TaskQueuePill-lJR1JW_W.js.map → TaskQueuePill-BzduBqwy.js.map} +1 -1
  241. package/dashboard/dist/assets/{TasksListPage-Dkq1Vtbt.js → TasksListPage-DeewV4Gp.js} +2 -2
  242. package/dashboard/dist/assets/{TasksListPage-Dkq1Vtbt.js.map → TasksListPage-DeewV4Gp.js.map} +1 -1
  243. package/dashboard/dist/assets/{TimeAgo-DgfDZ1pl.js → TimeAgo-DJZq-e4R.js} +2 -2
  244. package/dashboard/dist/assets/{TimeAgo-DgfDZ1pl.js.map → TimeAgo-DJZq-e4R.js.map} +1 -1
  245. package/dashboard/dist/assets/{TimestampCell-MpHZ1hMD.js → TimestampCell-Dx5uwGfS.js} +2 -2
  246. package/dashboard/dist/assets/{TimestampCell-MpHZ1hMD.js.map → TimestampCell-Dx5uwGfS.js.map} +1 -1
  247. package/dashboard/dist/assets/{UserName-DqsosA4B.js → UserName-CnGk7MgL.js} +2 -2
  248. package/dashboard/dist/assets/{UserName-DqsosA4B.js.map → UserName-CnGk7MgL.js.map} +1 -1
  249. package/dashboard/dist/assets/{WorkflowExecutionPage-CVlg38C3.js → WorkflowExecutionPage-CPQ0fIwf.js} +2 -2
  250. package/dashboard/dist/assets/{WorkflowExecutionPage-CVlg38C3.js.map → WorkflowExecutionPage-CPQ0fIwf.js.map} +1 -1
  251. package/dashboard/dist/assets/{WorkflowPill-CRpZhjGR.js → WorkflowPill-BrD5d1AG.js} +2 -2
  252. package/dashboard/dist/assets/{WorkflowPill-CRpZhjGR.js.map → WorkflowPill-BrD5d1AG.js.map} +1 -1
  253. package/dashboard/dist/assets/{WorkflowsDashboard-Ugzbs8mV.js → WorkflowsDashboard-BzjhABZP.js} +2 -2
  254. package/dashboard/dist/assets/{WorkflowsDashboard-Ugzbs8mV.js.map → WorkflowsDashboard-BzjhABZP.js.map} +1 -1
  255. package/dashboard/dist/assets/{WorkflowsOverview-CIp_lTNl.js → WorkflowsOverview-lBp2E6rN.js} +2 -2
  256. package/dashboard/dist/assets/{WorkflowsOverview-CIp_lTNl.js.map → WorkflowsOverview-lBp2E6rN.js.map} +1 -1
  257. package/dashboard/dist/assets/YamlWorkflowsPage-C_MkAp2i.js +2 -0
  258. package/dashboard/dist/assets/YamlWorkflowsPage-C_MkAp2i.js.map +1 -0
  259. package/dashboard/dist/assets/{bots-DPfUpVqI.js → bots-fc_O_YIq.js} +2 -2
  260. package/dashboard/dist/assets/{bots-DPfUpVqI.js.map → bots-fc_O_YIq.js.map} +1 -1
  261. package/dashboard/dist/assets/{escalation-RrCDbMC3.js → escalation-BYhLYHBz.js} +2 -2
  262. package/dashboard/dist/assets/{escalation-RrCDbMC3.js.map → escalation-BYhLYHBz.js.map} +1 -1
  263. package/dashboard/dist/assets/{escalation-columns-CDGa9wsD.js → escalation-columns-DjJyuC1g.js} +2 -2
  264. package/dashboard/dist/assets/{escalation-columns-CDGa9wsD.js.map → escalation-columns-DjJyuC1g.js.map} +1 -1
  265. package/dashboard/dist/assets/{helpers-ZSKqdkdS.js → helpers-CQG3Rh2y.js} +2 -2
  266. package/dashboard/dist/assets/{helpers-ZSKqdkdS.js.map → helpers-CQG3Rh2y.js.map} +1 -1
  267. package/dashboard/dist/assets/{index-DX6zxr6t.js → index-2nBhR7Dg.js} +2 -2
  268. package/dashboard/dist/assets/{index-DX6zxr6t.js.map → index-2nBhR7Dg.js.map} +1 -1
  269. package/dashboard/dist/assets/index-4IUoh_hd.js +2 -0
  270. package/dashboard/dist/assets/{index-K40Qw1tk.js.map → index-4IUoh_hd.js.map} +1 -1
  271. package/dashboard/dist/assets/index-B2CqPzLK.js +2 -0
  272. package/dashboard/dist/assets/index-B2CqPzLK.js.map +1 -0
  273. package/dashboard/dist/assets/index-B78xalb4.js +2 -0
  274. package/dashboard/dist/assets/index-B78xalb4.js.map +1 -0
  275. package/dashboard/dist/assets/index-BI8r69O_.js +2 -0
  276. package/dashboard/dist/assets/{index-C90ZPzXk.js.map → index-BI8r69O_.js.map} +1 -1
  277. package/dashboard/dist/assets/index-C5TUqJu0.css +1 -0
  278. package/dashboard/dist/assets/{index-BmVCyB6C.js → index-CUqCBBZG.js} +2 -2
  279. package/dashboard/dist/assets/{index-BmVCyB6C.js.map → index-CUqCBBZG.js.map} +1 -1
  280. package/dashboard/dist/assets/index-D51PaQZY.js +2 -0
  281. package/dashboard/dist/assets/index-D51PaQZY.js.map +1 -0
  282. package/dashboard/dist/assets/{index-BbI2dzhJ.js → index-DNtXXy1o.js} +2 -2
  283. package/dashboard/dist/assets/{index-BbI2dzhJ.js.map → index-DNtXXy1o.js.map} +1 -1
  284. package/dashboard/dist/assets/{index-DNytWfSZ.js → index-DR4qQvlW.js} +2 -2
  285. package/dashboard/dist/assets/{index-DNytWfSZ.js.map → index-DR4qQvlW.js.map} +1 -1
  286. package/dashboard/dist/assets/index-Dh0PCbR-.js +15 -0
  287. package/dashboard/dist/assets/index-Dh0PCbR-.js.map +1 -0
  288. package/dashboard/dist/assets/index-KYpLvJKB.js +5 -0
  289. package/dashboard/dist/assets/index-KYpLvJKB.js.map +1 -0
  290. package/dashboard/dist/assets/{index-Cmgrk7PQ.js → index-sNrqYt0Q.js} +73 -73
  291. package/dashboard/dist/assets/index-sNrqYt0Q.js.map +1 -0
  292. package/dashboard/dist/assets/{mcp-CNE44TSp.js → mcp-D2XfRh8v.js} +2 -2
  293. package/dashboard/dist/assets/{mcp-CNE44TSp.js.map → mcp-D2XfRh8v.js.map} +1 -1
  294. package/dashboard/dist/assets/{mcp-query-RQX0uN-5.js → mcp-query-CIx_mIC7.js} +2 -2
  295. package/dashboard/dist/assets/{mcp-query-RQX0uN-5.js.map → mcp-query-CIx_mIC7.js.map} +1 -1
  296. package/dashboard/dist/assets/{mcp-runs-0w40bdz-.js → mcp-runs-C9_J4LIH.js} +2 -2
  297. package/dashboard/dist/assets/{mcp-runs-0w40bdz-.js.map → mcp-runs-C9_J4LIH.js.map} +1 -1
  298. package/dashboard/dist/assets/{namespaces-BbmdXuPp.js → namespaces-BwMljx6f.js} +2 -2
  299. package/dashboard/dist/assets/{namespaces-BbmdXuPp.js.map → namespaces-BwMljx6f.js.map} +1 -1
  300. package/dashboard/dist/assets/{roles-DoHYlhWH.js → roles-Bd_sTV6I.js} +2 -2
  301. package/dashboard/dist/assets/{roles-DoHYlhWH.js.map → roles-Bd_sTV6I.js.map} +1 -1
  302. package/dashboard/dist/assets/{settings-BAiJiCHS.js → settings-BCb8eFyA.js} +2 -2
  303. package/dashboard/dist/assets/{settings-BAiJiCHS.js.map → settings-BCb8eFyA.js.map} +1 -1
  304. package/dashboard/dist/assets/{tasks-CvroqHtm.js → tasks-Bq54qGGq.js} +2 -2
  305. package/dashboard/dist/assets/{tasks-CvroqHtm.js.map → tasks-Bq54qGGq.js.map} +1 -1
  306. package/dashboard/dist/assets/useEventHooks-BTbGf536.js +2 -0
  307. package/dashboard/dist/assets/{useEventHooks-BHMbzR_y.js.map → useEventHooks-BTbGf536.js.map} +1 -1
  308. package/dashboard/dist/assets/useYamlActivityEvents-CsYP09W5.js +2 -0
  309. package/dashboard/dist/assets/{useYamlActivityEvents-D56KV14X.js.map → useYamlActivityEvents-CsYP09W5.js.map} +1 -1
  310. package/dashboard/dist/assets/{users-CxIMy_xw.js → users-BTBhafGc.js} +2 -2
  311. package/dashboard/dist/assets/{users-CxIMy_xw.js.map → users-BTBhafGc.js.map} +1 -1
  312. package/dashboard/dist/assets/{vendor-icons-AFGxSeQS.js → vendor-icons-CWl44VA6.js} +77 -77
  313. package/dashboard/dist/assets/vendor-icons-CWl44VA6.js.map +1 -0
  314. package/dashboard/dist/assets/{workflows-yR9yais7.js → workflows-BkzA4ahe.js} +2 -2
  315. package/dashboard/dist/assets/{workflows-yR9yais7.js.map → workflows-BkzA4ahe.js.map} +1 -1
  316. package/dashboard/dist/assets/{yaml-workflows-QVF2MZ0l.js → yaml-workflows-Cs0EYp0F.js} +2 -2
  317. package/dashboard/dist/assets/{yaml-workflows-QVF2MZ0l.js.map → yaml-workflows-Cs0EYp0F.js.map} +1 -1
  318. package/dashboard/dist/index.html +3 -3
  319. package/docs/api/http/file-browser.md +101 -0
  320. package/docs/api/http/knowledge.md +203 -0
  321. package/docs/api/http/settings.md +6 -4
  322. package/docs/api/sdk/files.md +68 -0
  323. package/docs/api/sdk/knowledge.md +126 -0
  324. package/docs/api/sdk/settings.md +3 -2
  325. package/docs/cli.md +171 -0
  326. package/docs/compilation.md +16 -0
  327. package/docs/compiler.md +311 -0
  328. package/docs/events.md +19 -0
  329. package/docs/workflows.md +19 -0
  330. package/package.json +13 -2
  331. package/build/api/escalations.d.ts +0 -271
  332. package/build/api/escalations.js +0 -932
  333. package/build/api/workflows.d.ts +0 -158
  334. package/build/api/workflows.js +0 -414
  335. package/dashboard/dist/assets/AvailableEscalationsPage-CpBfGV1h.js +0 -2
  336. package/dashboard/dist/assets/AvailableEscalationsPage-CpBfGV1h.js.map +0 -1
  337. package/dashboard/dist/assets/McpQueryDetailPage-Czsmovqw.js +0 -5
  338. package/dashboard/dist/assets/McpQueryDetailPage-Czsmovqw.js.map +0 -1
  339. package/dashboard/dist/assets/RolesPage-kH-Njt25.js +0 -2
  340. package/dashboard/dist/assets/SwimlaneTimeline-Cfe-xQRX.js +0 -2
  341. package/dashboard/dist/assets/SwimlaneTimeline-Cfe-xQRX.js.map +0 -1
  342. package/dashboard/dist/assets/YamlWorkflowsPage-BICF0fRO.js +0 -2
  343. package/dashboard/dist/assets/YamlWorkflowsPage-BICF0fRO.js.map +0 -1
  344. package/dashboard/dist/assets/helpers-rMEcLwKs.js +0 -2
  345. package/dashboard/dist/assets/helpers-rMEcLwKs.js.map +0 -1
  346. package/dashboard/dist/assets/index-ABcJHHlN.js +0 -5
  347. package/dashboard/dist/assets/index-ABcJHHlN.js.map +0 -1
  348. package/dashboard/dist/assets/index-B91h_jZ0.js +0 -15
  349. package/dashboard/dist/assets/index-B91h_jZ0.js.map +0 -1
  350. package/dashboard/dist/assets/index-C1E5GTs9.js +0 -2
  351. package/dashboard/dist/assets/index-C1E5GTs9.js.map +0 -1
  352. package/dashboard/dist/assets/index-C90ZPzXk.js +0 -2
  353. package/dashboard/dist/assets/index-Cmgrk7PQ.js.map +0 -1
  354. package/dashboard/dist/assets/index-DeX-ezqf.css +0 -1
  355. package/dashboard/dist/assets/index-K40Qw1tk.js +0 -2
  356. package/dashboard/dist/assets/index-lCyNr5Xk.js +0 -2
  357. package/dashboard/dist/assets/index-lCyNr5Xk.js.map +0 -1
  358. package/dashboard/dist/assets/useEventHooks-BHMbzR_y.js +0 -2
  359. package/dashboard/dist/assets/useYamlActivityEvents-D56KV14X.js +0 -2
  360. package/dashboard/dist/assets/vendor-icons-AFGxSeQS.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ProcessDetailPage-Dln8622H.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 whitespace-nowrap\"\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 { TimestampCell } from '../../../components/common/display/TimestampCell';\nimport { DurationValue } from '../../../components/common/display/DurationValue';\nimport type { LTTaskRecord } from '../../../api/types';\nimport { MetricCell } from './MetricCell';\nimport { TraceLink } from './TraceLink';\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 <TimestampCell date={task.created_at} />\n </MetricCell>\n\n <MetricCell label=\"Completed\">\n {task.completed_at ? (\n <TimestampCell date={task.completed_at} />\n ) : (\n <span className=\"text-text-tertiary italic text-xs\">In progress</span>\n )}\n </MetricCell>\n\n <MetricCell label=\"Duration\">\n <DurationValue ms={elapsed} className=\"font-mono text-sm\" />\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 { TimestampCell } from '../../../components/common/display/TimestampCell';\nimport { DurationValue } from '../../../components/common/display/DurationValue';\nimport type { LTEscalationRecord } from '../../../api/types';\nimport { MetricCell } from './MetricCell';\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 <TimestampCell date={escalation.created_at} />\n </MetricCell>\n\n <MetricCell label=\"Claimed\">\n {escalation.claimed_at ? (\n <>\n <TimestampCell date={escalation.claimed_at} />\n <p className=\"text-[10px] text-text-tertiary mt-0.5\">\n after <DurationValue ms={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 text-xs\">Unclaimed</span>\n )}\n </MetricCell>\n\n <MetricCell label=\"Resolved\">\n {escalation.resolved_at ? (\n <>\n <TimestampCell date={escalation.resolved_at} />\n <p className=\"text-[10px] text-text-tertiary mt-0.5\">\n <DurationValue ms={resolvedMs} /> total\n </p>\n </>\n ) : (\n <span className=\"text-text-tertiary italic text-xs\">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 { useProcessDetailEvents } from '../../hooks/useEventHooks';\nimport { useSettings } from '../../api/settings';\nimport { PageHeaderWithStats, type InlineStat } from '../../components/common/layout/PageHeaderWithStats';\nimport { SectionLabel } from '../../components/common/layout/SectionLabel';\nimport { JsonViewer } from '../../components/common/data/JsonViewer';\nimport { ProcessSwimlaneTimeline } from './process-swimlane/ProcessSwimlaneTimeline';\nimport { formatElapsed } from '../../lib/format';\nimport type { LTTaskRecord } from '../../api/types';\n\nfunction safeParseJson(raw: string | null | undefined): Record<string, unknown> | null {\n if (!raw) return null;\n try { return JSON.parse(raw); } catch { return null; }\n}\n\nfunction extractRootTask(tasks: LTTaskRecord[]): LTTaskRecord | null {\n if (tasks.length === 0) return null;\n return [...tasks].sort(\n (a, b) => new Date(a.created_at).getTime() - new Date(b.created_at).getTime(),\n )[0];\n}\n\nexport function ProcessDetailPage() {\n const { originId } = useParams<{ originId: string }>();\n useProcessDetailEvents(originId);\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 rootTask = useMemo(() => extractRootTask(tasks), [tasks]);\n const rootEnvelope = useMemo(() => safeParseJson(rootTask?.envelope), [rootTask]);\n const rootResult = useMemo(() => {\n if (rootTask?.data) return safeParseJson(rootTask.data);\n const completed = tasks\n .filter((t) => t.status === 'completed' && t.data)\n .sort((a, b) => new Date(b.completed_at!).getTime() - new Date(a.completed_at!).getTime());\n return completed.length > 0 ? safeParseJson(completed[0].data) : null;\n }, [rootTask, tasks]);\n\n const isRunning = useMemo(() => {\n return tasks.length > 0 && tasks.some(\n (t) => t.status !== 'completed' && t.status !== 'cancelled',\n );\n }, [tasks]);\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 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 const inlineStats = useMemo<InlineStat[]>(() => {\n const items: InlineStat[] = [];\n if (duration) {\n items.push({\n label: duration.isFinished ? 'Completed' : 'Running',\n value: duration.elapsed,\n dotClass: duration.isFinished ? 'bg-status-success' : 'bg-status-pending animate-pulse',\n });\n }\n items.push(\n { label: 'Tasks', value: `${stats.completed}/${stats.tasks}` },\n { label: 'Escalations', value: `${stats.resolved}/${stats.escalations}` },\n );\n return items;\n }, [duration, stats]);\n\n if (isLoading && tasks.length === 0) {\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 const hasMessages = rootEnvelope || rootResult || isRunning;\n\n return (\n <div>\n <PageHeaderWithStats\n title=\"Process Detail\"\n subtitle={originId}\n stats={inlineStats}\n />\n\n {hasMessages && (\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-8 mb-10\">\n <div>\n {rootEnvelope ? (\n <JsonViewer data={rootEnvelope} label=\"Input\" defaultMode=\"json\" defaultCollapsed />\n ) : (\n <div>\n <SectionLabel>Input</SectionLabel>\n <div className=\"font-mono text-xs bg-surface-sunken rounded-md p-4 text-text-tertiary italic mt-2\">\n Waiting for task...\n </div>\n </div>\n )}\n </div>\n <div>\n {rootResult ? (\n <JsonViewer data={rootResult} label=\"Output\" defaultMode=\"json\" defaultCollapsed />\n ) : isRunning ? (\n <div>\n <SectionLabel>Output</SectionLabel>\n <div className=\"flex items-center gap-2 font-mono text-xs bg-surface-sunken rounded-md p-4 text-text-secondary mt-2\">\n <span className=\"w-1.5 h-1.5 rounded-full bg-status-pending animate-pulse\" />\n Processing...\n </div>\n </div>\n ) : null}\n </div>\n </div>\n )}\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","buildLanes","tasks","escalations","now","escByTask","unlinked","e","sorted","b","allTimes","t","timeMin","timeMax","span","toPct","ms","lanes","task","tStart","tEnd","tOpen","taskEscs","a","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","SparkleIcon","BellIcon","UserIcon","SwimlaneHeader","allExpanded","onToggleAll","jsxDEV","TimeAxis","ticks","tick","MetricCell","label","children","TraceLink","traceId","href","copied","setCopied","handleCopy","handleNav","TaskDetailPanel","traceUrl","StatusBadge","WorkflowPill","TimestampCell","DurationValue","m","i","Link","EscalationDetailPanel","escalation","created","claimedMs","resolvedMs","RolePill","Fragment","UserName","SwimlaneRow","isExpanded","onToggle","anim","animDone","isTask","barBase","visible","_a","formatDuration","_b","Collapsible","ProcessSwimlaneTimeline","expanded","setExpanded","useMemo","tickCount","_","toggle","id","prev","next","allIds","l","toggleAll","safeParseJson","raw","extractRootTask","ProcessDetailPage","originId","useParams","useProcessDetailEvents","data","isLoading","useProcessDetail","settings","useSettings","rootTask","rootEnvelope","rootResult","completed","isRunning","stats","escalated","resolved","duration","startIso","allCompleted","allResolved","isFinished","endIso","formatElapsed","inlineStats","items","hasMessages","PageHeaderWithStats","JsonViewer","SectionLabel"],"mappings":"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"}
1
+ {"version":3,"file":"ProcessDetailPage-DZIP6grw.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 whitespace-nowrap\"\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 { TimestampCell } from '../../../components/common/display/TimestampCell';\nimport { DurationValue } from '../../../components/common/display/DurationValue';\nimport type { LTTaskRecord } from '../../../api/types';\nimport { MetricCell } from './MetricCell';\nimport { TraceLink } from './TraceLink';\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 <TimestampCell date={task.created_at} />\n </MetricCell>\n\n <MetricCell label=\"Completed\">\n {task.completed_at ? (\n <TimestampCell date={task.completed_at} />\n ) : (\n <span className=\"text-text-tertiary italic text-xs\">In progress</span>\n )}\n </MetricCell>\n\n <MetricCell label=\"Duration\">\n <DurationValue ms={elapsed} className=\"font-mono text-sm\" />\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 { TimestampCell } from '../../../components/common/display/TimestampCell';\nimport { DurationValue } from '../../../components/common/display/DurationValue';\nimport type { LTEscalationRecord } from '../../../api/types';\nimport { MetricCell } from './MetricCell';\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 <TimestampCell date={escalation.created_at} />\n </MetricCell>\n\n <MetricCell label=\"Claimed\">\n {escalation.claimed_at ? (\n <>\n <TimestampCell date={escalation.claimed_at} />\n <p className=\"text-[10px] text-text-tertiary mt-0.5\">\n after <DurationValue ms={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 text-xs\">Unclaimed</span>\n )}\n </MetricCell>\n\n <MetricCell label=\"Resolved\">\n {escalation.resolved_at ? (\n <>\n <TimestampCell date={escalation.resolved_at} />\n <p className=\"text-[10px] text-text-tertiary mt-0.5\">\n <DurationValue ms={resolvedMs} /> total\n </p>\n </>\n ) : (\n <span className=\"text-text-tertiary italic text-xs\">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 { useProcessDetailEvents } from '../../hooks/useEventHooks';\nimport { useSettings } from '../../api/settings';\nimport { PageHeaderWithStats, type InlineStat } from '../../components/common/layout/PageHeaderWithStats';\nimport { SectionLabel } from '../../components/common/layout/SectionLabel';\nimport { JsonViewer } from '../../components/common/data/JsonViewer';\nimport { ProcessSwimlaneTimeline } from './process-swimlane/ProcessSwimlaneTimeline';\nimport { formatElapsed } from '../../lib/format';\nimport type { LTTaskRecord } from '../../api/types';\n\nfunction safeParseJson(raw: string | null | undefined): Record<string, unknown> | null {\n if (!raw) return null;\n try { return JSON.parse(raw); } catch { return null; }\n}\n\nfunction extractRootTask(tasks: LTTaskRecord[]): LTTaskRecord | null {\n if (tasks.length === 0) return null;\n return [...tasks].sort(\n (a, b) => new Date(a.created_at).getTime() - new Date(b.created_at).getTime(),\n )[0];\n}\n\nexport function ProcessDetailPage() {\n const { originId } = useParams<{ originId: string }>();\n useProcessDetailEvents(originId);\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 rootTask = useMemo(() => extractRootTask(tasks), [tasks]);\n const rootEnvelope = useMemo(() => safeParseJson(rootTask?.envelope), [rootTask]);\n const rootResult = useMemo(() => {\n if (rootTask?.data) return safeParseJson(rootTask.data);\n const completed = tasks\n .filter((t) => t.status === 'completed' && t.data)\n .sort((a, b) => new Date(b.completed_at!).getTime() - new Date(a.completed_at!).getTime());\n return completed.length > 0 ? safeParseJson(completed[0].data) : null;\n }, [rootTask, tasks]);\n\n const isRunning = useMemo(() => {\n return tasks.length > 0 && tasks.some(\n (t) => t.status !== 'completed' && t.status !== 'cancelled',\n );\n }, [tasks]);\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 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 const inlineStats = useMemo<InlineStat[]>(() => {\n const items: InlineStat[] = [];\n if (duration) {\n items.push({\n label: duration.isFinished ? 'Completed' : 'Running',\n value: duration.elapsed,\n dotClass: duration.isFinished ? 'bg-status-success' : 'bg-status-pending animate-pulse',\n });\n }\n items.push(\n { label: 'Tasks', value: `${stats.completed}/${stats.tasks}` },\n { label: 'Escalations', value: `${stats.resolved}/${stats.escalations}` },\n );\n return items;\n }, [duration, stats]);\n\n if (isLoading && tasks.length === 0) {\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 const hasMessages = rootEnvelope || rootResult || isRunning;\n\n return (\n <div>\n <PageHeaderWithStats\n title=\"Process Detail\"\n subtitle={originId}\n stats={inlineStats}\n />\n\n {hasMessages && (\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-8 mb-10\">\n <div>\n {rootEnvelope ? (\n <JsonViewer data={rootEnvelope} label=\"Input\" defaultMode=\"json\" defaultCollapsed />\n ) : (\n <div>\n <SectionLabel>Input</SectionLabel>\n <div className=\"font-mono text-xs bg-surface-sunken rounded-md p-4 text-text-tertiary italic mt-2\">\n Waiting for task...\n </div>\n </div>\n )}\n </div>\n <div>\n {rootResult ? (\n <JsonViewer data={rootResult} label=\"Output\" defaultMode=\"json\" defaultCollapsed />\n ) : isRunning ? (\n <div>\n <SectionLabel>Output</SectionLabel>\n <div className=\"flex items-center gap-2 font-mono text-xs bg-surface-sunken rounded-md p-4 text-text-secondary mt-2\">\n <span className=\"w-1.5 h-1.5 rounded-full bg-status-pending animate-pulse\" />\n Processing...\n </div>\n </div>\n ) : null}\n </div>\n </div>\n )}\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","buildLanes","tasks","escalations","now","escByTask","unlinked","e","sorted","b","allTimes","t","timeMin","timeMax","span","toPct","ms","lanes","task","tStart","tEnd","tOpen","taskEscs","a","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","SparkleIcon","BellIcon","UserIcon","SwimlaneHeader","allExpanded","onToggleAll","jsxDEV","TimeAxis","ticks","tick","MetricCell","label","children","TraceLink","traceId","href","copied","setCopied","handleCopy","handleNav","TaskDetailPanel","traceUrl","StatusBadge","WorkflowPill","TimestampCell","DurationValue","m","i","Link","EscalationDetailPanel","escalation","created","claimedMs","resolvedMs","RolePill","Fragment","UserName","SwimlaneRow","isExpanded","onToggle","anim","animDone","isTask","barBase","visible","_a","formatDuration","_b","Collapsible","ProcessSwimlaneTimeline","expanded","setExpanded","useMemo","tickCount","_","toggle","id","prev","next","allIds","l","toggleAll","safeParseJson","raw","extractRootTask","ProcessDetailPage","originId","useParams","useProcessDetailEvents","data","isLoading","useProcessDetail","settings","useSettings","rootTask","rootEnvelope","rootResult","completed","isRunning","stats","escalated","resolved","duration","startIso","allCompleted","allResolved","isFinished","endIso","formatElapsed","inlineStats","items","hasMessages","PageHeaderWithStats","JsonViewer","SectionLabel"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{j as s}from"./index-Cmgrk7PQ.js";import{u as N}from"./tasks-CvroqHtm.js";import{u as h}from"./workflows-yR9yais7.js";import{u as P}from"./useEventHooks-BHMbzR_y.js";import{u as x}from"./useFilterParams-CGRYFw_A.js";import{a as n}from"./vendor-query-DLp59M9_.js";import{D as v}from"./DataTable-DkOokbtL.js";import{T as p}from"./TimestampCell-MpHZ1hMD.js";import{S as w}from"./StickyPagination-Bz0C18nC.js";import{F as k,a as y,b as m}from"./FilterBar-C5r3n6YO.js";import{P as D}from"./PageHeader-Cm5HBQF_.js";import{L as E}from"./ListToolbar-BGUajIsW.js";import{W as L}from"./WorkflowPill-CRpZhjGR.js";import{c as _}from"./vendor-react-Co3Y8ikm.js";import"./vendor-icons-AFGxSeQS.js";import"./EmptyState-C7KIMIbE.js";function j(e,a=300){const[i,t]=n.useState(e);return n.useEffect(()=>{const l=setTimeout(()=>t(e),a);return()=>clearTimeout(l)},[e,a]),i}const V=[{value:"active",label:"Active"},{value:"completed",label:"Completed"},{value:"escalated",label:"Escalated"}],S=[{key:"origin_id",label:"Origin",render:e=>s.jsxDEV("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},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:26,columnNumber:7},void 0)},{key:"workflow_types",label:"Workflows",render:e=>s.jsxDEV("div",{className:"flex flex-wrap gap-1",children:e.workflow_types.map(a=>s.jsxDEV(L,{type:a},a,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:37,columnNumber:11},void 0))},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:35,columnNumber:7},void 0)},{key:"task_count",label:"Tasks",render:e=>s.jsxDEV("span",{children:e.task_count},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:45,columnNumber:22},void 0),className:"w-20 text-right"},{key:"completed",label:"Completed",render:e=>e.completed>0?s.jsxDEV("span",{className:"text-status-success",children:e.completed},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:53,columnNumber:11},void 0):s.jsxDEV("span",{className:"text-text-tertiary",children:"0"},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:54,columnNumber:11},void 0),className:"w-24 text-right"},{key:"escalated",label:"Escalated",render:e=>e.escalated>0?s.jsxDEV("span",{className:"text-status-error",children:e.escalated},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:62,columnNumber:11},void 0):s.jsxDEV("span",{className:"text-text-tertiary",children:"0"},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:63,columnNumber:11},void 0),className:"w-24 text-right"},{key:"started_at",label:"Started",render:e=>s.jsxDEV(p,{date:e.started_at},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:69,columnNumber:22},void 0),className:"w-44"},{key:"last_activity",label:"Last Activity",render:e=>s.jsxDEV(p,{date:e.last_activity},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:75,columnNumber:22},void 0),className:"w-44"}];function J(){P();const e=_(),{filters:a,setFilter:i,pagination:t}=x({filters:{workflow_type:"",status:"",search:""}}),l=j(a.search,300),{data:d}=h(),u=[...new Set((d??[]).map(r=>r.workflow_type))].sort(),{data:o,isLoading:f,refetch:g,isFetching:b}=N({workflow_type:a.workflow_type||void 0,status:a.status||void 0,search:l||void 0,limit:t.pageSize,offset:t.offset}),c=(o==null?void 0:o.total)??0;return s.jsxDEV("div",{children:[s.jsxDEV(D,{title:"All Processes"},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:104,columnNumber:7},this),s.jsxDEV(k,{actions:s.jsxDEV(E,{onRefresh:()=>g(),isFetching:b,apiPath:`/tasks/processes?limit=${t.pageSize}&offset=${t.offset}${a.workflow_type?`&workflow_type=${a.workflow_type}`:""}${a.status?`&status=${a.status}`:""}${l?`&search=${l}`:""}`},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:107,columnNumber:9},this),children:[s.jsxDEV(y,{label:"Search",value:a.search,onChange:r=>i("search",r),placeholder:"origin, workflow, or trace ID"},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:113,columnNumber:9},this),s.jsxDEV(m,{label:"Status",value:a.status,onChange:r=>i("status",r),options:V},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:119,columnNumber:9},this),s.jsxDEV(m,{label:"Workflow Type",value:a.workflow_type,onChange:r=>i("workflow_type",r),options:u.map(r=>({value:r,label:r}))},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:125,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:106,columnNumber:7},this),s.jsxDEV(v,{columns:S,data:(o==null?void 0:o.processes)??[],keyFn:r=>r.origin_id,onRowClick:r=>e(`/processes/detail/${encodeURIComponent(r.origin_id)}`),isLoading:f,emptyMessage:"No business processes found"},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:133,columnNumber:7},this),s.jsxDEV(w,{page:t.page,totalPages:t.totalPages(c),onPageChange:t.setPage,total:c,pageSize:t.pageSize,onPageSizeChange:t.setPageSize},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:142,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:103,columnNumber:5},this)}export{J as ProcessesListPage};
2
- //# sourceMappingURL=ProcessesListPage-bIsd9N_h.js.map
1
+ import{j as s}from"./index-sNrqYt0Q.js";import{u as N}from"./tasks-Bq54qGGq.js";import{u as h}from"./workflows-BkzA4ahe.js";import{u as P}from"./useEventHooks-BTbGf536.js";import{u as x}from"./useFilterParams-CGRYFw_A.js";import{a as n}from"./vendor-query-DLp59M9_.js";import{D as v}from"./DataTable-bd2PTBJd.js";import{T as p}from"./TimestampCell-Dx5uwGfS.js";import{S as w}from"./StickyPagination-CJHMzYJj.js";import{F as k,a as y,b as m}from"./FilterBar-BQNzsd3A.js";import{P as D}from"./PageHeader-FJIemmrC.js";import{L as E}from"./ListToolbar-OWOn-HiC.js";import{W as L}from"./WorkflowPill-BrD5d1AG.js";import{c as _}from"./vendor-react-Co3Y8ikm.js";import"./vendor-icons-CWl44VA6.js";import"./EmptyState-BygtU-Rh.js";function j(e,a=300){const[i,t]=n.useState(e);return n.useEffect(()=>{const l=setTimeout(()=>t(e),a);return()=>clearTimeout(l)},[e,a]),i}const V=[{value:"active",label:"Active"},{value:"completed",label:"Completed"},{value:"escalated",label:"Escalated"}],S=[{key:"origin_id",label:"Origin",render:e=>s.jsxDEV("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},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:26,columnNumber:7},void 0)},{key:"workflow_types",label:"Workflows",render:e=>s.jsxDEV("div",{className:"flex flex-wrap gap-1",children:e.workflow_types.map(a=>s.jsxDEV(L,{type:a},a,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:37,columnNumber:11},void 0))},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:35,columnNumber:7},void 0)},{key:"task_count",label:"Tasks",render:e=>s.jsxDEV("span",{children:e.task_count},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:45,columnNumber:22},void 0),className:"w-20 text-right"},{key:"completed",label:"Completed",render:e=>e.completed>0?s.jsxDEV("span",{className:"text-status-success",children:e.completed},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:53,columnNumber:11},void 0):s.jsxDEV("span",{className:"text-text-tertiary",children:"0"},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:54,columnNumber:11},void 0),className:"w-24 text-right"},{key:"escalated",label:"Escalated",render:e=>e.escalated>0?s.jsxDEV("span",{className:"text-status-error",children:e.escalated},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:62,columnNumber:11},void 0):s.jsxDEV("span",{className:"text-text-tertiary",children:"0"},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:63,columnNumber:11},void 0),className:"w-24 text-right"},{key:"started_at",label:"Started",render:e=>s.jsxDEV(p,{date:e.started_at},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:69,columnNumber:22},void 0),className:"w-44"},{key:"last_activity",label:"Last Activity",render:e=>s.jsxDEV(p,{date:e.last_activity},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:75,columnNumber:22},void 0),className:"w-44"}];function J(){P();const e=_(),{filters:a,setFilter:i,pagination:t}=x({filters:{workflow_type:"",status:"",search:""}}),l=j(a.search,300),{data:d}=h(),u=[...new Set((d??[]).map(r=>r.workflow_type))].sort(),{data:o,isLoading:f,refetch:g,isFetching:b}=N({workflow_type:a.workflow_type||void 0,status:a.status||void 0,search:l||void 0,limit:t.pageSize,offset:t.offset}),c=(o==null?void 0:o.total)??0;return s.jsxDEV("div",{children:[s.jsxDEV(D,{title:"All Processes"},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:104,columnNumber:7},this),s.jsxDEV(k,{actions:s.jsxDEV(E,{onRefresh:()=>g(),isFetching:b,apiPath:`/tasks/processes?limit=${t.pageSize}&offset=${t.offset}${a.workflow_type?`&workflow_type=${a.workflow_type}`:""}${a.status?`&status=${a.status}`:""}${l?`&search=${l}`:""}`},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:107,columnNumber:9},this),children:[s.jsxDEV(y,{label:"Search",value:a.search,onChange:r=>i("search",r),placeholder:"origin, workflow, or trace ID"},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:113,columnNumber:9},this),s.jsxDEV(m,{label:"Status",value:a.status,onChange:r=>i("status",r),options:V},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:119,columnNumber:9},this),s.jsxDEV(m,{label:"Workflow Type",value:a.workflow_type,onChange:r=>i("workflow_type",r),options:u.map(r=>({value:r,label:r}))},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:125,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:106,columnNumber:7},this),s.jsxDEV(v,{columns:S,data:(o==null?void 0:o.processes)??[],keyFn:r=>r.origin_id,onRowClick:r=>e(`/processes/detail/${encodeURIComponent(r.origin_id)}`),isLoading:f,emptyMessage:"No business processes found"},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:133,columnNumber:7},this),s.jsxDEV(w,{page:t.page,totalPages:t.totalPages(c),onPageChange:t.setPage,total:c,pageSize:t.pageSize,onPageSizeChange:t.setPageSize},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:142,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:103,columnNumber:5},this)}export{J as ProcessesListPage};
2
+ //# sourceMappingURL=ProcessesListPage-BQoPYkeB.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProcessesListPage-bIsd9N_h.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/useEventHooks';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { useDebouncedValue } from '../../hooks/useDebouncedValue';\nimport { DataTable, type Column } from '../../components/common/data/DataTable';\nimport { TimestampCell } from '../../components/common/display/TimestampCell';\nimport { StickyPagination } from '../../components/common/data/StickyPagination';\nimport { FilterBar, FilterSelect, FilterInput } from '../../components/common/data/FilterBar';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\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) => <TimestampCell date={row.started_at} />,\n className: 'w-44',\n },\n {\n key: 'last_activity',\n label: 'Last Activity',\n render: (row) => <TimestampCell date={row.last_activity} />,\n className: 'w-44',\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, refetch, isFetching } = 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 actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={`/tasks/processes?limit=${pagination.pageSize}&offset=${pagination.offset}${filters.workflow_type ? `&workflow_type=${filters.workflow_type}` : ''}${filters.status ? `&status=${filters.status}` : ''}${debouncedSearch ? `&search=${debouncedSearch}` : ''}`}\n />\n }>\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","jsxDEV","this","wt","WorkflowPill","TimestampCell","ProcessesListPage","useProcessListEvents","navigate","useNavigate","filters","setFilter","pagination","useFilterParams","debouncedSearch","configs","useWorkflowConfigs","workflowTypes","c","data","isLoading","refetch","isFetching","useProcesses","total","PageHeader","FilterBar","ListToolbar","FilterInput","v","FilterSelect","t","DataTable","StickyPagination"],"mappings":"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"}
1
+ {"version":3,"file":"ProcessesListPage-BQoPYkeB.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/useEventHooks';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { useDebouncedValue } from '../../hooks/useDebouncedValue';\nimport { DataTable, type Column } from '../../components/common/data/DataTable';\nimport { TimestampCell } from '../../components/common/display/TimestampCell';\nimport { StickyPagination } from '../../components/common/data/StickyPagination';\nimport { FilterBar, FilterSelect, FilterInput } from '../../components/common/data/FilterBar';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\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) => <TimestampCell date={row.started_at} />,\n className: 'w-44',\n },\n {\n key: 'last_activity',\n label: 'Last Activity',\n render: (row) => <TimestampCell date={row.last_activity} />,\n className: 'w-44',\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, refetch, isFetching } = 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 actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={`/tasks/processes?limit=${pagination.pageSize}&offset=${pagination.offset}${filters.workflow_type ? `&workflow_type=${filters.workflow_type}` : ''}${filters.status ? `&status=${filters.status}` : ''}${debouncedSearch ? `&search=${debouncedSearch}` : ''}`}\n />\n }>\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","jsxDEV","this","wt","WorkflowPill","TimestampCell","ProcessesListPage","useProcessListEvents","navigate","useNavigate","filters","setFilter","pagination","useFilterParams","debouncedSearch","configs","useWorkflowConfigs","workflowTypes","c","data","isLoading","refetch","isFetching","useProcesses","total","PageHeader","FilterBar","ListToolbar","FilterInput","v","FilterSelect","t","DataTable","StickyPagination"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{j as s}from"./index-Cmgrk7PQ.js";import{U as a}from"./vendor-icons-AFGxSeQS.js";function i({role:t,size:e="sm"}){const o=e==="md"?"px-2.5 py-0.5 text-[11px] gap-1.5":"px-2 py-0.5 text-[10px] gap-1",n=e==="md"?"w-3 h-3":"w-2.5 h-2.5";return s.jsxDEV("span",{className:`inline-flex items-center ${o} bg-accent/[0.06] text-text-secondary rounded-lg`,children:[s.jsxDEV(a,{className:`${n} shrink-0 text-accent/75`},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/RolePill.tsx",lineNumber:16,columnNumber:7},this),t]},void 0,!0,{fileName:"/app/dashboard/src/components/common/display/RolePill.tsx",lineNumber:15,columnNumber:5},this)}export{i as R};
2
- //# sourceMappingURL=RolePill-BVUp2bF0.js.map
1
+ import{j as s}from"./index-sNrqYt0Q.js";import{U as a}from"./vendor-icons-CWl44VA6.js";function i({role:t,size:e="sm"}){const o=e==="md"?"px-2.5 py-0.5 text-[11px] gap-1.5":"px-2 py-0.5 text-[10px] gap-1",n=e==="md"?"w-3 h-3":"w-2.5 h-2.5";return s.jsxDEV("span",{className:`inline-flex items-center ${o} bg-accent/[0.06] text-text-secondary rounded-lg`,children:[s.jsxDEV(a,{className:`${n} shrink-0 text-accent/75`},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/RolePill.tsx",lineNumber:16,columnNumber:7},this),t]},void 0,!0,{fileName:"/app/dashboard/src/components/common/display/RolePill.tsx",lineNumber:15,columnNumber:5},this)}export{i as R};
2
+ //# sourceMappingURL=RolePill-D6nMxMvp.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RolePill-BVUp2bF0.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","jsxDEV","User"],"mappings":"uFAOO,SAASA,EAAS,CAAE,KAAAC,EAAM,KAAAC,EAAO,MAAuB,CAC7D,MAAMC,EAAYD,IAAS,KACvB,oCACA,gCACEE,EAAYF,IAAS,KAAO,UAAY,cAE9C,OACEG,EAAAA,OAAC,OAAA,CAAK,UAAW,4BAA4BF,CAAS,mDACpD,SAAA,CAAAE,SAACC,EAAA,CAAK,UAAW,GAAGF,CAAS,0BAAA,EAA7B,OAAA,GAAA,CAAA,SAAA,4DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAyD,EACxDH,CAAA,CAAA,EAFH,OAAA,GAAA,CAAA,SAAA,4DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAGA,CAEJ"}
1
+ {"version":3,"file":"RolePill-D6nMxMvp.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","jsxDEV","User"],"mappings":"uFAOO,SAASA,EAAS,CAAE,KAAAC,EAAM,KAAAC,EAAO,MAAuB,CAC7D,MAAMC,EAAYD,IAAS,KACvB,oCACA,gCACEE,EAAYF,IAAS,KAAO,UAAY,cAE9C,OACEG,EAAAA,OAAC,OAAA,CAAK,UAAW,4BAA4BF,CAAS,mDACpD,SAAA,CAAAE,SAACC,EAAA,CAAK,UAAW,GAAGF,CAAS,0BAAA,EAA7B,OAAA,GAAA,CAAA,SAAA,4DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAyD,EACxDH,CAAA,CAAA,EAFH,OAAA,GAAA,CAAA,SAAA,4DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAGA,CAEJ"}
@@ -0,0 +1,2 @@
1
+ import{j as e}from"./index-sNrqYt0Q.js";import{a as n}from"./vendor-query-DLp59M9_.js";import{b,c as h,d as f,e as g,f as E,g as v}from"./roles-Bd_sTV6I.js";import{D}from"./DataTable-bd2PTBJd.js";import{C as j}from"./ConfirmDeleteModal-Cy6KVLfC.js";import{P as V}from"./PageHeader-FJIemmrC.js";import{M as C}from"./Modal-Dir9Rlnx.js";import{R}from"./RolePill-D6nMxMvp.js";import{R as P,a as y}from"./RowActions-JqgAB0p3.js";import{l as k}from"./vendor-icons-CWl44VA6.js";import"./vendor-react-Co3Y8ikm.js";import"./EmptyState-BygtU-Rh.js";function w({open:s,onClose:r}){const l=b(),[i,c]=n.useState(""),[t,m]=n.useState(s);s!==t&&(m(s),s&&(c(""),l.reset()));const d=()=>{const o=i.trim().toLowerCase();o&&l.mutate(o,{onSuccess:r})};return e.jsxDEV(C,{open:s,onClose:r,title:"Create Role",children:e.jsxDEV("div",{className:"space-y-4",children:[e.jsxDEV("div",{children:[e.jsxDEV("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Role Name (required)"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/CreateRoleModal.tsx",lineNumber:34,columnNumber:11},this),e.jsxDEV("input",{type:"text",value:i,onChange:o=>c(o.target.value),placeholder:"e.g., reviewer",className:"input text-xs w-full",onKeyDown:o=>{o.key==="Enter"&&d()}},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/CreateRoleModal.tsx",lineNumber:37,columnNumber:11},this),e.jsxDEV("p",{className:"text-[10px] text-text-tertiary mt-1",children:"Lowercase letters, numbers, hyphens, and underscores only."},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/CreateRoleModal.tsx",lineNumber:47,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/CreateRoleModal.tsx",lineNumber:33,columnNumber:9},this),l.error&&e.jsxDEV("p",{className:"text-xs text-status-error",children:l.error.message},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/CreateRoleModal.tsx",lineNumber:53,columnNumber:11},this),e.jsxDEV("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsxDEV("button",{onClick:r,className:"btn-secondary text-xs",children:"Cancel"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/CreateRoleModal.tsx",lineNumber:57,columnNumber:11},this),e.jsxDEV("button",{onClick:d,disabled:!i.trim()||l.isPending,className:"btn-primary text-xs",children:l.isPending?"Creating...":"Create"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/CreateRoleModal.tsx",lineNumber:60,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/CreateRoleModal.tsx",lineNumber:56,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/CreateRoleModal.tsx",lineNumber:32,columnNumber:7},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/CreateRoleModal.tsx",lineNumber:31,columnNumber:5},this)}function _({selectedRole:s,allRoles:r}){const{data:l}=h(),i=f(),c=g(),[t,m]=n.useState(""),d=(l==null?void 0:l.chains)??[],o=n.useMemo(()=>s?d.filter(a=>a.source_role===s).map(a=>a.target_role):[],[d,s]),u=n.useMemo(()=>s?r.filter(a=>a!==s&&a!=="superadmin"&&!o.includes(a)):[],[r,s,o]),p=()=>{!s||!t.trim()||i.mutate({source_role:s,target_role:t.trim()},{onSuccess:()=>m("")})},N=a=>{s&&c.mutate({source_role:s,target_role:a})},x=s==="superadmin";return e.jsxDEV("div",{className:"border-l border-surface-border pl-6 min-h-[300px]",children:[e.jsxDEV("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-4",children:"Escalation Routing"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationPanel.tsx",lineNumber:49,columnNumber:7},this),s?x?e.jsxDEV("div",{children:[e.jsxDEV("p",{className:"text-sm font-mono text-text-primary mb-2",children:s},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationPanel.tsx",lineNumber:59,columnNumber:11},this),e.jsxDEV("p",{className:"text-xs text-text-tertiary",children:"Superadmins can escalate to any role implicitly."},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationPanel.tsx",lineNumber:60,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationPanel.tsx",lineNumber:58,columnNumber:9},this):e.jsxDEV("div",{className:"space-y-4",children:[e.jsxDEV("div",{children:[e.jsxDEV("p",{className:"text-sm font-mono text-text-primary",children:s},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationPanel.tsx",lineNumber:67,columnNumber:13},this),e.jsxDEV("p",{className:"text-[10px] text-text-tertiary mt-0.5",children:"Can escalate to:"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationPanel.tsx",lineNumber:68,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationPanel.tsx",lineNumber:66,columnNumber:11},this),o.length===0?e.jsxDEV("p",{className:"text-xs text-text-tertiary",children:"No escalation targets configured."},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationPanel.tsx",lineNumber:72,columnNumber:13},this):e.jsxDEV("div",{className:"flex flex-wrap gap-2",children:o.map(a=>e.jsxDEV("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:[a,e.jsxDEV("button",{onClick:()=>N(a),className:"text-text-tertiary hover:text-status-error transition-colors",title:`Remove ${a}`,children:"×"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationPanel.tsx",lineNumber:83,columnNumber:19},this)]},a,!0,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationPanel.tsx",lineNumber:78,columnNumber:17},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationPanel.tsx",lineNumber:76,columnNumber:13},this),u.length>0&&e.jsxDEV("div",{className:"pt-3 border-t border-surface-border",children:[e.jsxDEV("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-2",children:"Add Target"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationPanel.tsx",lineNumber:97,columnNumber:15},this),e.jsxDEV("div",{className:"flex items-center gap-2",children:[e.jsxDEV("select",{value:t,onChange:a=>m(a.target.value),className:"select text-xs font-mono flex-1",children:[e.jsxDEV("option",{value:"",children:"Select a role..."},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationPanel.tsx",lineNumber:106,columnNumber:19},this),u.map(a=>e.jsxDEV("option",{value:a,children:a},a,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationPanel.tsx",lineNumber:108,columnNumber:21},this))]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationPanel.tsx",lineNumber:101,columnNumber:17},this),e.jsxDEV("button",{onClick:p,disabled:!t||i.isPending,className:"btn-primary text-xs",children:i.isPending?"Adding...":"Add"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationPanel.tsx",lineNumber:111,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationPanel.tsx",lineNumber:100,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationPanel.tsx",lineNumber:96,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationPanel.tsx",lineNumber:65,columnNumber:9},this):e.jsxDEV("p",{className:"text-xs text-text-tertiary",children:"Select a role to manage its escalation targets."},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationPanel.tsx",lineNumber:54,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationPanel.tsx",lineNumber:48,columnNumber:5},this)}function M(s){return[{key:"role",label:"Role",render:r=>e.jsxDEV(R,{role:r.role},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleColumns.tsx",lineNumber:14,columnNumber:24},this)},{key:"user_count",label:"Users",render:r=>r.user_count>0?e.jsxDEV("span",{className:"text-text-primary",children:r.user_count},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleColumns.tsx",lineNumber:21,columnNumber:13},this):e.jsxDEV("span",{className:"text-text-tertiary",children:"0"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleColumns.tsx",lineNumber:22,columnNumber:13},this),className:"w-24 text-right"},{key:"chain_count",label:"Escalations",render:r=>r.chain_count>0?e.jsxDEV("span",{className:"text-text-primary",children:r.chain_count},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleColumns.tsx",lineNumber:30,columnNumber:13},this):e.jsxDEV("span",{className:"text-text-tertiary",children:"0"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleColumns.tsx",lineNumber:31,columnNumber:13},this),className:"w-28 text-right"},{key:"workflow_count",label:"Workflows",render:r=>r.workflow_count>0?e.jsxDEV("span",{className:"text-text-primary",children:r.workflow_count},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleColumns.tsx",lineNumber:39,columnNumber:13},this):e.jsxDEV("span",{className:"text-text-tertiary",children:"0"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleColumns.tsx",lineNumber:40,columnNumber:13},this),className:"w-28 text-right"},{key:"actions",label:"",render:r=>r.user_count>0||r.chain_count>0||r.workflow_count>0?null:e.jsxDEV(P,{children:e.jsxDEV(y,{icon:k,title:"Delete role",onClick:()=>s(r),colorClass:"text-text-tertiary hover:text-status-error"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleColumns.tsx",lineNumber:51,columnNumber:13},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleColumns.tsx",lineNumber:50,columnNumber:11},this),className:"w-16 text-right"}]}function $(){const{data:s,isLoading:r}=E(),l=v(),[i,c]=n.useState(!1),[t,m]=n.useState(null),[d,o]=n.useState(null),u=(s==null?void 0:s.roles)??[],p=n.useMemo(()=>u.map(a=>a.role),[u]),N=M(a=>m(a)),x=()=>{t&&l.mutate(t.role,{onSuccess:()=>m(null)})};return e.jsxDEV("div",{children:[e.jsxDEV(V,{title:"Roles",actions:e.jsxDEV("button",{onClick:()=>c(!0),className:"btn-primary text-xs",children:"Add Role"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:35,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:32,columnNumber:7},this),e.jsxDEV("div",{className:"grid grid-cols-1 lg:grid-cols-[1fr_320px] gap-6",children:[e.jsxDEV("div",{children:e.jsxDEV(D,{columns:N,data:u,keyFn:a=>a.role,isLoading:r,emptyMessage:"No roles found",onRowClick:a=>o(a.role),activeRowKey:d},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:43,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:42,columnNumber:9},this),e.jsxDEV(_,{selectedRole:d,allRoles:p},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:54,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:41,columnNumber:7},this),e.jsxDEV(w,{open:i,onClose:()=>c(!1)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:57,columnNumber:7},this),e.jsxDEV(j,{open:!!t,onClose:()=>m(null),onConfirm:x,title:"Delete Role",description:e.jsxDEV(e.Fragment,{children:["Delete role"," ",e.jsxDEV("span",{className:"font-medium font-mono text-text-primary",children:t==null?void 0:t.role},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:67,columnNumber:13},this),"? This action cannot be undone."]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:65,columnNumber:11},this),isPending:l.isPending,error:l.error},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:59,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:31,columnNumber:5},this)}export{$ as RolesPage};
2
+ //# sourceMappingURL=RolesPage-CwLnJFhy.js.map