@hotmeshio/long-tail 0.7.5 → 0.8.1

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 (364) hide show
  1. package/build/api/workflows/config.d.ts +7 -1
  2. package/build/api/workflows/config.js +7 -1
  3. package/build/api/workflows/discovery.js +1 -4
  4. package/build/lib/db/schemas/020_workflow_certified.sql +34 -0
  5. package/build/modules/ltconfig.d.ts +3 -2
  6. package/build/modules/ltconfig.js +4 -4
  7. package/build/routes/workflows/config.js +1 -0
  8. package/build/services/config/cache.js +1 -0
  9. package/build/services/config/read.js +2 -0
  10. package/build/services/config/sql.d.ts +2 -2
  11. package/build/services/config/sql.js +6 -5
  12. package/build/services/config/write.js +13 -0
  13. package/build/services/escalation/bulk.d.ts +3 -1
  14. package/build/services/escalation/bulk.js +3 -1
  15. package/build/services/escalation/crud.d.ts +4 -3
  16. package/build/services/escalation/crud.js +4 -3
  17. package/build/start/workers.js +1 -0
  18. package/build/system/mcp-servers/admin/schemas.d.ts +3 -0
  19. package/build/system/mcp-servers/admin/schemas.js +3 -1
  20. package/build/system/mcp-servers/admin/workflow-config.js +1 -0
  21. package/build/types/config.d.ts +16 -0
  22. package/build/types/startup.d.ts +11 -1
  23. package/dashboard/dist/assets/AdminDashboard-Ck5-jV9T.js +2 -0
  24. package/dashboard/dist/assets/{AdminDashboard-Bgomc_jH.js.map → AdminDashboard-Ck5-jV9T.js.map} +1 -1
  25. package/dashboard/dist/assets/AgentConfigPage-DFiXRBWs.js +16 -0
  26. package/dashboard/dist/assets/AgentConfigPage-DFiXRBWs.js.map +1 -0
  27. package/dashboard/dist/assets/AgentDetailPage-BBgM_pMe.js +4 -0
  28. package/dashboard/dist/assets/AgentDetailPage-BBgM_pMe.js.map +1 -0
  29. package/dashboard/dist/assets/AgentsPage-DxwFuedf.js +2 -0
  30. package/dashboard/dist/assets/AgentsPage-DxwFuedf.js.map +1 -0
  31. package/dashboard/dist/assets/AvailableEscalationsPage-DNQbeIcn.js +2 -0
  32. package/dashboard/dist/assets/{AvailableEscalationsPage-C9DAtNGp.js.map → AvailableEscalationsPage-DNQbeIcn.js.map} +1 -1
  33. package/dashboard/dist/assets/BotPicker-mqwKVOE3.js +2 -0
  34. package/dashboard/dist/assets/{BotPicker-MnI3OyE7.js.map → BotPicker-mqwKVOE3.js.map} +1 -1
  35. package/dashboard/dist/assets/CapabilitiesPage-Biffm0kW.js +2 -0
  36. package/dashboard/dist/assets/CapabilitiesPage-Biffm0kW.js.map +1 -0
  37. package/dashboard/dist/assets/CollapsibleSection-Bn6Ks79X.js +2 -0
  38. package/dashboard/dist/assets/{CollapsibleSection-Ne-Q3QFM.js.map → CollapsibleSection-Bn6Ks79X.js.map} +1 -1
  39. package/dashboard/dist/assets/ConfirmDeleteModal-no0-c_1G.js +2 -0
  40. package/dashboard/dist/assets/{ConfirmDeleteModal-D9_1b4MW.js.map → ConfirmDeleteModal-no0-c_1G.js.map} +1 -1
  41. package/dashboard/dist/assets/CopyableId-DS6IDMIX.js +2 -0
  42. package/dashboard/dist/assets/{CopyableId-blg-gZvT.js.map → CopyableId-DS6IDMIX.js.map} +1 -1
  43. package/dashboard/dist/assets/CredentialsPage-C3NyncEB.js +2 -0
  44. package/dashboard/dist/assets/CredentialsPage-C3NyncEB.js.map +1 -0
  45. package/dashboard/dist/assets/CronLabel-DQWBx57H.js +2 -0
  46. package/dashboard/dist/assets/CronLabel-DQWBx57H.js.map +1 -0
  47. package/dashboard/dist/assets/CustomDurationPicker-DV42oZ1G.js +2 -0
  48. package/dashboard/dist/assets/{CustomDurationPicker-Cp1fgzPX.js.map → CustomDurationPicker-DV42oZ1G.js.map} +1 -1
  49. package/dashboard/dist/assets/DataTable-Bf4dgxll.js +2 -0
  50. package/dashboard/dist/assets/{DataTable-ZWgVQg7F.js.map → DataTable-Bf4dgxll.js.map} +1 -1
  51. package/dashboard/dist/assets/DropZone-CTSXBb3c.js +2 -0
  52. package/dashboard/dist/assets/{DropZone-CZDmNBn-.js.map → DropZone-CTSXBb3c.js.map} +1 -1
  53. package/dashboard/dist/assets/ElapsedCell-roy4G5SQ.js +2 -0
  54. package/dashboard/dist/assets/{ElapsedCell-Gr5UlUbn.js.map → ElapsedCell-roy4G5SQ.js.map} +1 -1
  55. package/dashboard/dist/assets/EmptyState-CLVm9KmA.js +2 -0
  56. package/dashboard/dist/assets/{EmptyState-BcsfPq9T.js.map → EmptyState-CLVm9KmA.js.map} +1 -1
  57. package/dashboard/dist/assets/EscalationSchemaPage-DulCCxea.js +9 -0
  58. package/dashboard/dist/assets/EscalationSchemaPage-DulCCxea.js.map +1 -0
  59. package/dashboard/dist/assets/EscalationsOverview-DDwxn_mT.js +2 -0
  60. package/dashboard/dist/assets/{EscalationsOverview-BIZVnSBF.js.map → EscalationsOverview-DDwxn_mT.js.map} +1 -1
  61. package/dashboard/dist/assets/EventTable-BaLNvCew.js +2 -0
  62. package/dashboard/dist/assets/EventTable-BaLNvCew.js.map +1 -0
  63. package/dashboard/dist/assets/FilterBar-DEAbNQqp.js +2 -0
  64. package/dashboard/dist/assets/FilterBar-DEAbNQqp.js.map +1 -0
  65. package/dashboard/dist/assets/GraphInvokePage-BmM8r0R3.js +2 -0
  66. package/dashboard/dist/assets/GraphInvokePage-BmM8r0R3.js.map +1 -0
  67. package/dashboard/dist/assets/HomePage-Ds3PzWWr.js +2 -0
  68. package/dashboard/dist/assets/HomePage-Ds3PzWWr.js.map +1 -0
  69. package/dashboard/dist/assets/ListToolbar-Dviaskni.js +2 -0
  70. package/dashboard/dist/assets/{ListToolbar-CdmIvEIF.js.map → ListToolbar-Dviaskni.js.map} +1 -1
  71. package/dashboard/dist/assets/McpOverview-BBm66wbF.js +2 -0
  72. package/dashboard/dist/assets/{McpOverview-C-Ypezuv.js.map → McpOverview-BBm66wbF.js.map} +1 -1
  73. package/dashboard/dist/assets/McpQueryDetailPage-B6GJOMcz.js +5 -0
  74. package/dashboard/dist/assets/McpQueryDetailPage-B6GJOMcz.js.map +1 -0
  75. package/dashboard/dist/assets/McpQueryPage-C-8nIdBL.js +2 -0
  76. package/dashboard/dist/assets/McpQueryPage-C-8nIdBL.js.map +1 -0
  77. package/dashboard/dist/assets/McpRunDetailPage-CSq_0qqi.js +2 -0
  78. package/dashboard/dist/assets/{McpRunDetailPage-B1sCxKLD.js.map → McpRunDetailPage-CSq_0qqi.js.map} +1 -1
  79. package/dashboard/dist/assets/McpRunsPage-BdK8ahX7.js +2 -0
  80. package/dashboard/dist/assets/McpRunsPage-BdK8ahX7.js.map +1 -0
  81. package/dashboard/dist/assets/Modal-C6HI6btY.js +2 -0
  82. package/dashboard/dist/assets/{Modal-CSrxpXeM.js.map → Modal-C6HI6btY.js.map} +1 -1
  83. package/dashboard/dist/assets/NamespacePill-eGsbJBFa.js +2 -0
  84. package/dashboard/dist/assets/{NamespacePill-DlqBTvFR.js.map → NamespacePill-eGsbJBFa.js.map} +1 -1
  85. package/dashboard/dist/assets/OperationsPage-DODPFmf2.js +2 -0
  86. package/dashboard/dist/assets/OperationsPage-DODPFmf2.js.map +1 -0
  87. package/dashboard/dist/assets/OperatorDashboard-BbmgsOmQ.js +2 -0
  88. package/dashboard/dist/assets/{OperatorDashboard-YP6kP-f_.js.map → OperatorDashboard-BbmgsOmQ.js.map} +1 -1
  89. package/dashboard/dist/assets/PageHeader-DcgGV0Y2.js +2 -0
  90. package/dashboard/dist/assets/{PageHeader-CFta2VaS.js.map → PageHeader-DcgGV0Y2.js.map} +1 -1
  91. package/dashboard/dist/assets/PageHeaderWithStats-Cf8TYFRh.js +2 -0
  92. package/dashboard/dist/assets/PageHeaderWithStats-Cf8TYFRh.js.map +1 -0
  93. package/dashboard/dist/assets/PriorityBadge-a7u8C9uY.js +2 -0
  94. package/dashboard/dist/assets/{PriorityBadge-B4ykBH7f.js.map → PriorityBadge-a7u8C9uY.js.map} +1 -1
  95. package/dashboard/dist/assets/ProcessDetailPage-D80w44rV.js +2 -0
  96. package/dashboard/dist/assets/ProcessDetailPage-D80w44rV.js.map +1 -0
  97. package/dashboard/dist/assets/ProcessesListPage-BjW5xUkv.js +2 -0
  98. package/dashboard/dist/assets/{ProcessesListPage-BNhFwTLl.js.map → ProcessesListPage-BjW5xUkv.js.map} +1 -1
  99. package/dashboard/dist/assets/RoleDetailPage-oahg0cdT.js +11 -0
  100. package/dashboard/dist/assets/RoleDetailPage-oahg0cdT.js.map +1 -0
  101. package/dashboard/dist/assets/RolePill-BAeaQUXX.js +2 -0
  102. package/dashboard/dist/assets/RolePill-BAeaQUXX.js.map +1 -0
  103. package/dashboard/dist/assets/RolesPage-BI1Xtqq_.js +2 -0
  104. package/dashboard/dist/assets/RolesPage-BI1Xtqq_.js.map +1 -0
  105. package/dashboard/dist/assets/RowActions--m4F6GW8.js +2 -0
  106. package/dashboard/dist/assets/{RowActions-BA9L9djf.js.map → RowActions--m4F6GW8.js.map} +1 -1
  107. package/dashboard/dist/assets/RunAsSelector-DiGzSfiG.js +2 -0
  108. package/dashboard/dist/assets/{RunAsSelector-CokM3Ifp.js.map → RunAsSelector-DiGzSfiG.js.map} +1 -1
  109. package/dashboard/dist/assets/StatCard-DCPGFzCv.js +2 -0
  110. package/dashboard/dist/assets/StatCard-DCPGFzCv.js.map +1 -0
  111. package/dashboard/dist/assets/StatusBadge-mk-dJwPT.js +2 -0
  112. package/dashboard/dist/assets/{StatusBadge-D9MeQHrh.js.map → StatusBadge-mk-dJwPT.js.map} +1 -1
  113. package/dashboard/dist/assets/StickyPagination-Clm9H840.js +2 -0
  114. package/dashboard/dist/assets/{StickyPagination-_H2j2CAH.js.map → StickyPagination-Clm9H840.js.map} +1 -1
  115. package/dashboard/dist/assets/StreamMessageDetail-Bikvs1Cz.js +2 -0
  116. package/dashboard/dist/assets/StreamMessageDetail-Bikvs1Cz.js.map +1 -0
  117. package/dashboard/dist/assets/SwimlaneTimeline-C9X3IVqI.js +2 -0
  118. package/dashboard/dist/assets/SwimlaneTimeline-C9X3IVqI.js.map +1 -0
  119. package/dashboard/dist/assets/TagInput-DmJLnghg.js +2 -0
  120. package/dashboard/dist/assets/{TagInput-CQg-TrV9.js.map → TagInput-DmJLnghg.js.map} +1 -1
  121. package/dashboard/dist/assets/TaskDetailPage-C0tbiUi7.js +2 -0
  122. package/dashboard/dist/assets/TaskDetailPage-C0tbiUi7.js.map +1 -0
  123. package/dashboard/dist/assets/TaskQueuePill--1OX6egx.js +2 -0
  124. package/dashboard/dist/assets/{TaskQueuePill-DyvtL8X4.js.map → TaskQueuePill--1OX6egx.js.map} +1 -1
  125. package/dashboard/dist/assets/TasksListPage-DcYV-GMA.js +2 -0
  126. package/dashboard/dist/assets/{TasksListPage-B71FxvrY.js.map → TasksListPage-DcYV-GMA.js.map} +1 -1
  127. package/dashboard/dist/assets/TimeAgo-pYn3T9IZ.js +2 -0
  128. package/dashboard/dist/assets/{TimeAgo-JgT0U_sd.js.map → TimeAgo-pYn3T9IZ.js.map} +1 -1
  129. package/dashboard/dist/assets/TimestampCell-BPMCscic.js +2 -0
  130. package/dashboard/dist/assets/{TimestampCell-gEreK8Nn.js.map → TimestampCell-BPMCscic.js.map} +1 -1
  131. package/dashboard/dist/assets/ToolPill-BnF9lCUX.js +2 -0
  132. package/dashboard/dist/assets/{ToolPill-miuRcj1Q.js.map → ToolPill-BnF9lCUX.js.map} +1 -1
  133. package/dashboard/dist/assets/ToolTestPanel-Bw4z_Tya.js +2 -0
  134. package/dashboard/dist/assets/{ToolTestPanel-ChfHw9Aq.js.map → ToolTestPanel-Bw4z_Tya.js.map} +1 -1
  135. package/dashboard/dist/assets/TopicDetailPage-CtFztOnn.js +9 -0
  136. package/dashboard/dist/assets/TopicDetailPage-CtFztOnn.js.map +1 -0
  137. package/dashboard/dist/assets/TopicsPage-BXdc6pAU.js +2 -0
  138. package/dashboard/dist/assets/TopicsPage-BXdc6pAU.js.map +1 -0
  139. package/dashboard/dist/assets/UserName-R96NG6xB.js +2 -0
  140. package/dashboard/dist/assets/{UserName-uncbaKYf.js.map → UserName-R96NG6xB.js.map} +1 -1
  141. package/dashboard/dist/assets/WorkflowExecutionPage-DmRJabMQ.js +2 -0
  142. package/dashboard/dist/assets/{WorkflowExecutionPage-DwzLKTkt.js.map → WorkflowExecutionPage-DmRJabMQ.js.map} +1 -1
  143. package/dashboard/dist/assets/WorkflowPill-Cc2MlYbB.js +2 -0
  144. package/dashboard/dist/assets/WorkflowPill-Cc2MlYbB.js.map +1 -0
  145. package/dashboard/dist/assets/WorkflowsDashboard-uLU5ZToY.js +2 -0
  146. package/dashboard/dist/assets/WorkflowsDashboard-uLU5ZToY.js.map +1 -0
  147. package/dashboard/dist/assets/WorkflowsOverview-BhgE0RS8.js +2 -0
  148. package/dashboard/dist/assets/{WorkflowsOverview-ihhW8DiS.js.map → WorkflowsOverview-BhgE0RS8.js.map} +1 -1
  149. package/dashboard/dist/assets/YamlWorkflowDetailPage-CvIgB5y7.js +33 -0
  150. package/dashboard/dist/assets/{YamlWorkflowDetailPage-C61-8y-E.js.map → YamlWorkflowDetailPage-CvIgB5y7.js.map} +1 -1
  151. package/dashboard/dist/assets/YamlWorkflowsPage-DWnsgl2v.js +2 -0
  152. package/dashboard/dist/assets/{YamlWorkflowsPage-CMpgsLEo.js.map → YamlWorkflowsPage-DWnsgl2v.js.map} +1 -1
  153. package/dashboard/dist/assets/{agents-27sErp5R.js → agents-BpYMwrsB.js} +2 -2
  154. package/dashboard/dist/assets/{agents-27sErp5R.js.map → agents-BpYMwrsB.js.map} +1 -1
  155. package/dashboard/dist/assets/{bots-CPHuAvjW.js → bots-DI6Wqp5X.js} +2 -2
  156. package/dashboard/dist/assets/{bots-CPHuAvjW.js.map → bots-DI6Wqp5X.js.map} +1 -1
  157. package/dashboard/dist/assets/capabilities-BKZZb8eM.js +2 -0
  158. package/dashboard/dist/assets/{capabilities-BBTPqF-V.js.map → capabilities-BKZZb8eM.js.map} +1 -1
  159. package/dashboard/dist/assets/{controlplane-C9j2mwX8.js → controlplane-Djshb7fm.js} +2 -2
  160. package/dashboard/dist/assets/{controlplane-C9j2mwX8.js.map → controlplane-Djshb7fm.js.map} +1 -1
  161. package/dashboard/dist/assets/escalation-D8mrXtjS.js +2 -0
  162. package/dashboard/dist/assets/{escalation-CyJ_wz-f.js.map → escalation-D8mrXtjS.js.map} +1 -1
  163. package/dashboard/dist/assets/escalation-columns-CyLzgPkz.js +2 -0
  164. package/dashboard/dist/assets/escalation-columns-CyLzgPkz.js.map +1 -0
  165. package/dashboard/dist/assets/index-B5MAG4Uv.js +2 -0
  166. package/dashboard/dist/assets/{index-CCHGKErT.js.map → index-B5MAG4Uv.js.map} +1 -1
  167. package/dashboard/dist/assets/index-BfxiRwk2.js +6 -0
  168. package/dashboard/dist/assets/index-BfxiRwk2.js.map +1 -0
  169. package/dashboard/dist/assets/index-C71I-f5G.js +2 -0
  170. package/dashboard/dist/assets/{index-D9pi0fs6.js.map → index-C71I-f5G.js.map} +1 -1
  171. package/dashboard/dist/assets/index-CC4g-6QE.css +1 -0
  172. package/dashboard/dist/assets/index-CJb3dXku.js +2 -0
  173. package/dashboard/dist/assets/index-CJb3dXku.js.map +1 -0
  174. package/dashboard/dist/assets/index-CQtv2rj6.js +2 -0
  175. package/dashboard/dist/assets/index-CQtv2rj6.js.map +1 -0
  176. package/dashboard/dist/assets/index-CphzO7b8.js +2 -0
  177. package/dashboard/dist/assets/{index-CNprOGuS.js.map → index-CphzO7b8.js.map} +1 -1
  178. package/dashboard/dist/assets/index-CwAmiy_j.js +2 -0
  179. package/dashboard/dist/assets/index-CwAmiy_j.js.map +1 -0
  180. package/dashboard/dist/assets/index-DgCS2Frb.js +281 -0
  181. package/dashboard/dist/assets/index-DgCS2Frb.js.map +1 -0
  182. package/dashboard/dist/assets/index-DkbnD-Te.js +2 -0
  183. package/dashboard/dist/assets/{index-Dzqt3g-K.js.map → index-DkbnD-Te.js.map} +1 -1
  184. package/dashboard/dist/assets/index-Y6yj36QR.js +9 -0
  185. package/dashboard/dist/assets/index-Y6yj36QR.js.map +1 -0
  186. package/dashboard/dist/assets/index-eshNd6NY.js +6 -0
  187. package/dashboard/dist/assets/{index-BiLZJ43R.js.map → index-eshNd6NY.js.map} +1 -1
  188. package/dashboard/dist/assets/index-xn9fmkHC.js +2 -0
  189. package/dashboard/dist/assets/index-xn9fmkHC.js.map +1 -0
  190. package/dashboard/dist/assets/index-yxnQew1X.js +2 -0
  191. package/dashboard/dist/assets/index-yxnQew1X.js.map +1 -0
  192. package/dashboard/dist/assets/{knowledge-BErJA3Je.js → knowledge-C_1r0faY.js} +2 -2
  193. package/dashboard/dist/assets/{knowledge-BErJA3Je.js.map → knowledge-C_1r0faY.js.map} +1 -1
  194. package/dashboard/dist/assets/{mcp-Cx9L42EN.js → mcp-BtG54ZAx.js} +2 -2
  195. package/dashboard/dist/assets/{mcp-Cx9L42EN.js.map → mcp-BtG54ZAx.js.map} +1 -1
  196. package/dashboard/dist/assets/{mcp-query-Cf6kcBoW.js → mcp-query-CSdQWxmv.js} +2 -2
  197. package/dashboard/dist/assets/{mcp-query-Cf6kcBoW.js.map → mcp-query-CSdQWxmv.js.map} +1 -1
  198. package/dashboard/dist/assets/{pipelines-CFctrv71.js → pipelines-DVkwxN64.js} +2 -2
  199. package/dashboard/dist/assets/{pipelines-CFctrv71.js.map → pipelines-DVkwxN64.js.map} +1 -1
  200. package/dashboard/dist/assets/{roles-CCXZtqDr.js → roles-CpRcUIMm.js} +2 -2
  201. package/dashboard/dist/assets/{roles-CCXZtqDr.js.map → roles-CpRcUIMm.js.map} +1 -1
  202. package/dashboard/dist/assets/{tasks-BPNj8ZWL.js → tasks-DNdvW5H6.js} +2 -2
  203. package/dashboard/dist/assets/{tasks-BPNj8ZWL.js.map → tasks-DNdvW5H6.js.map} +1 -1
  204. package/dashboard/dist/assets/{topics-CR4UBuSV.js → topics-DNC77Chw.js} +2 -2
  205. package/dashboard/dist/assets/{topics-CR4UBuSV.js.map → topics-DNC77Chw.js.map} +1 -1
  206. package/dashboard/dist/assets/{useCollapsedSections-BU5HULGs.js → useCollapsedSections-CGNA5oKV.js} +2 -2
  207. package/dashboard/dist/assets/{useCollapsedSections-BU5HULGs.js.map → useCollapsedSections-CGNA5oKV.js.map} +1 -1
  208. package/dashboard/dist/assets/{useDebouncedValue-BA5S7V54.js → useDebouncedValue-DmL3uNt_.js} +2 -2
  209. package/dashboard/dist/assets/{useDebouncedValue-BA5S7V54.js.map → useDebouncedValue-DmL3uNt_.js.map} +1 -1
  210. package/dashboard/dist/assets/{useEventHooks-BgdnN8Rj.js → useEventHooks-CUUeBSH1.js} +2 -2
  211. package/dashboard/dist/assets/{useEventHooks-BgdnN8Rj.js.map → useEventHooks-CUUeBSH1.js.map} +1 -1
  212. package/dashboard/dist/assets/{useFilterParams-x-Dg0Vgz.js → useFilterParams-Ch-a71bE.js} +2 -2
  213. package/dashboard/dist/assets/{useFilterParams-x-Dg0Vgz.js.map → useFilterParams-Ch-a71bE.js.map} +1 -1
  214. package/dashboard/dist/assets/{useNamespace-BDsKfT0f.js → useNamespace-D-AjLnPK.js} +2 -2
  215. package/dashboard/dist/assets/{useNamespace-BDsKfT0f.js.map → useNamespace-D-AjLnPK.js.map} +1 -1
  216. package/dashboard/dist/assets/{useYamlActivityEvents-CWZwHIlR.js → useYamlActivityEvents-DRdetOb_.js} +2 -2
  217. package/dashboard/dist/assets/{useYamlActivityEvents-CWZwHIlR.js.map → useYamlActivityEvents-DRdetOb_.js.map} +1 -1
  218. package/dashboard/dist/assets/{users-BqmKVXR1.js → users-BUgdEsec.js} +2 -2
  219. package/dashboard/dist/assets/{users-BqmKVXR1.js.map → users-BUgdEsec.js.map} +1 -1
  220. package/dashboard/dist/assets/{vendor-icons-BaQqUm-e.js → vendor-icons-CNyYGNsk.js} +3 -3
  221. package/dashboard/dist/assets/{vendor-icons-BaQqUm-e.js.map → vendor-icons-CNyYGNsk.js.map} +1 -1
  222. package/dashboard/dist/assets/vendor-query-DLp59M9_.js +35 -0
  223. package/dashboard/dist/assets/vendor-query-DLp59M9_.js.map +1 -0
  224. package/dashboard/dist/assets/vendor-react-zA2lQFDs.js +26 -0
  225. package/dashboard/dist/assets/vendor-react-zA2lQFDs.js.map +1 -0
  226. package/dashboard/dist/assets/{workflows-Dps45zjk.js → workflows-BfyR5VJt.js} +2 -2
  227. package/dashboard/dist/assets/workflows-BfyR5VJt.js.map +1 -0
  228. package/dashboard/dist/assets/{yaml-workflows-DhlTkbvY.js → yaml-workflows-Bz7yEnhl.js} +2 -2
  229. package/dashboard/dist/assets/{yaml-workflows-DhlTkbvY.js.map → yaml-workflows-Bz7yEnhl.js.map} +1 -1
  230. package/dashboard/dist/index.html +5 -5
  231. package/docs/api/http/escalations.md +3 -3
  232. package/docs/api/http/workflows.md +2 -1
  233. package/docs/api/mcp/admin.md +13 -7
  234. package/docs/api/sdk/escalations.md +3 -1
  235. package/docs/api/sdk/workflows.md +3 -2
  236. package/docs/architecture.md +2 -2
  237. package/docs/dashboard.md +6 -5
  238. package/docs/iam.md +3 -3
  239. package/docs/workflows.md +7 -5
  240. package/package.json +2 -2
  241. package/dashboard/dist/assets/AdminDashboard-Bgomc_jH.js +0 -2
  242. package/dashboard/dist/assets/AgentConfigPage-C6gDgz21.js +0 -16
  243. package/dashboard/dist/assets/AgentConfigPage-C6gDgz21.js.map +0 -1
  244. package/dashboard/dist/assets/AgentDetailPage-0rrH5FmV.js +0 -4
  245. package/dashboard/dist/assets/AgentDetailPage-0rrH5FmV.js.map +0 -1
  246. package/dashboard/dist/assets/AgentsPage-DkIU2zed.js +0 -2
  247. package/dashboard/dist/assets/AgentsPage-DkIU2zed.js.map +0 -1
  248. package/dashboard/dist/assets/AvailableEscalationsPage-C9DAtNGp.js +0 -2
  249. package/dashboard/dist/assets/BotPicker-MnI3OyE7.js +0 -2
  250. package/dashboard/dist/assets/CapabilitiesPage-Cv_AD_5i.js +0 -2
  251. package/dashboard/dist/assets/CapabilitiesPage-Cv_AD_5i.js.map +0 -1
  252. package/dashboard/dist/assets/CollapsibleSection-Ne-Q3QFM.js +0 -2
  253. package/dashboard/dist/assets/ConfirmDeleteModal-D9_1b4MW.js +0 -2
  254. package/dashboard/dist/assets/CopyableId-blg-gZvT.js +0 -2
  255. package/dashboard/dist/assets/CredentialsPage-B3Mfwl22.js +0 -2
  256. package/dashboard/dist/assets/CredentialsPage-B3Mfwl22.js.map +0 -1
  257. package/dashboard/dist/assets/CronLabel-CtjUBRPo.js +0 -2
  258. package/dashboard/dist/assets/CronLabel-CtjUBRPo.js.map +0 -1
  259. package/dashboard/dist/assets/CustomDurationPicker-Cp1fgzPX.js +0 -2
  260. package/dashboard/dist/assets/DataTable-ZWgVQg7F.js +0 -2
  261. package/dashboard/dist/assets/DropZone-CZDmNBn-.js +0 -2
  262. package/dashboard/dist/assets/ElapsedCell-Gr5UlUbn.js +0 -2
  263. package/dashboard/dist/assets/EmptyState-BcsfPq9T.js +0 -2
  264. package/dashboard/dist/assets/EscalationSchemaPage-C5tuV6SJ.js +0 -9
  265. package/dashboard/dist/assets/EscalationSchemaPage-C5tuV6SJ.js.map +0 -1
  266. package/dashboard/dist/assets/EscalationsOverview-BIZVnSBF.js +0 -2
  267. package/dashboard/dist/assets/EventTable-90aUfsNr.js +0 -2
  268. package/dashboard/dist/assets/EventTable-90aUfsNr.js.map +0 -1
  269. package/dashboard/dist/assets/FilterBar-BQ2JGg8U.js +0 -2
  270. package/dashboard/dist/assets/FilterBar-BQ2JGg8U.js.map +0 -1
  271. package/dashboard/dist/assets/GraphInvokePage-Io5ZucT8.js +0 -2
  272. package/dashboard/dist/assets/GraphInvokePage-Io5ZucT8.js.map +0 -1
  273. package/dashboard/dist/assets/HomePage-Cu0vUzTF.js +0 -2
  274. package/dashboard/dist/assets/HomePage-Cu0vUzTF.js.map +0 -1
  275. package/dashboard/dist/assets/ListToolbar-CdmIvEIF.js +0 -2
  276. package/dashboard/dist/assets/McpOverview-C-Ypezuv.js +0 -2
  277. package/dashboard/dist/assets/McpQueryDetailPage-DdontKcj.js +0 -5
  278. package/dashboard/dist/assets/McpQueryDetailPage-DdontKcj.js.map +0 -1
  279. package/dashboard/dist/assets/McpQueryPage-D-1TaOGG.js +0 -2
  280. package/dashboard/dist/assets/McpQueryPage-D-1TaOGG.js.map +0 -1
  281. package/dashboard/dist/assets/McpRunDetailPage-B1sCxKLD.js +0 -2
  282. package/dashboard/dist/assets/McpRunsPage-eWJ7cDa3.js +0 -2
  283. package/dashboard/dist/assets/McpRunsPage-eWJ7cDa3.js.map +0 -1
  284. package/dashboard/dist/assets/Modal-CSrxpXeM.js +0 -2
  285. package/dashboard/dist/assets/NamespacePill-DlqBTvFR.js +0 -2
  286. package/dashboard/dist/assets/OperationsPage-C5phWL0O.js +0 -2
  287. package/dashboard/dist/assets/OperationsPage-C5phWL0O.js.map +0 -1
  288. package/dashboard/dist/assets/OperatorDashboard-YP6kP-f_.js +0 -2
  289. package/dashboard/dist/assets/PageHeader-CFta2VaS.js +0 -2
  290. package/dashboard/dist/assets/PageHeaderWithStats-CcVAji-7.js +0 -2
  291. package/dashboard/dist/assets/PageHeaderWithStats-CcVAji-7.js.map +0 -1
  292. package/dashboard/dist/assets/PriorityBadge-B4ykBH7f.js +0 -2
  293. package/dashboard/dist/assets/ProcessDetailPage-C_BXQvBs.js +0 -2
  294. package/dashboard/dist/assets/ProcessDetailPage-C_BXQvBs.js.map +0 -1
  295. package/dashboard/dist/assets/ProcessesListPage-BNhFwTLl.js +0 -2
  296. package/dashboard/dist/assets/RoleDetailPage-8GLNjj9I.js +0 -11
  297. package/dashboard/dist/assets/RoleDetailPage-8GLNjj9I.js.map +0 -1
  298. package/dashboard/dist/assets/RolePill-CXEyPMqb.js +0 -2
  299. package/dashboard/dist/assets/RolePill-CXEyPMqb.js.map +0 -1
  300. package/dashboard/dist/assets/RolesPage-B59tE2lZ.js +0 -2
  301. package/dashboard/dist/assets/RolesPage-B59tE2lZ.js.map +0 -1
  302. package/dashboard/dist/assets/RowActions-BA9L9djf.js +0 -2
  303. package/dashboard/dist/assets/RunAsSelector-CokM3Ifp.js +0 -2
  304. package/dashboard/dist/assets/StatCard-DlgF0CJC.js +0 -2
  305. package/dashboard/dist/assets/StatCard-DlgF0CJC.js.map +0 -1
  306. package/dashboard/dist/assets/StatusBadge-D9MeQHrh.js +0 -2
  307. package/dashboard/dist/assets/StickyPagination-_H2j2CAH.js +0 -2
  308. package/dashboard/dist/assets/StreamMessageDetail-sSfHDYIa.js +0 -2
  309. package/dashboard/dist/assets/StreamMessageDetail-sSfHDYIa.js.map +0 -1
  310. package/dashboard/dist/assets/SwimlaneTimeline-LZWtfBK3.js +0 -2
  311. package/dashboard/dist/assets/SwimlaneTimeline-LZWtfBK3.js.map +0 -1
  312. package/dashboard/dist/assets/TagInput-CQg-TrV9.js +0 -2
  313. package/dashboard/dist/assets/TaskDetailPage-CHBV2V6R.js +0 -2
  314. package/dashboard/dist/assets/TaskDetailPage-CHBV2V6R.js.map +0 -1
  315. package/dashboard/dist/assets/TaskQueuePill-DyvtL8X4.js +0 -2
  316. package/dashboard/dist/assets/TasksListPage-B71FxvrY.js +0 -2
  317. package/dashboard/dist/assets/TimeAgo-JgT0U_sd.js +0 -2
  318. package/dashboard/dist/assets/TimestampCell-gEreK8Nn.js +0 -2
  319. package/dashboard/dist/assets/ToolPill-miuRcj1Q.js +0 -2
  320. package/dashboard/dist/assets/ToolTestPanel-ChfHw9Aq.js +0 -2
  321. package/dashboard/dist/assets/TopicDetailPage-DigI0HGt.js +0 -9
  322. package/dashboard/dist/assets/TopicDetailPage-DigI0HGt.js.map +0 -1
  323. package/dashboard/dist/assets/TopicsPage-BHjlFpPN.js +0 -2
  324. package/dashboard/dist/assets/TopicsPage-BHjlFpPN.js.map +0 -1
  325. package/dashboard/dist/assets/UserName-uncbaKYf.js +0 -2
  326. package/dashboard/dist/assets/WorkflowExecutionPage-DwzLKTkt.js +0 -2
  327. package/dashboard/dist/assets/WorkflowPill-BegV-iRF.js +0 -2
  328. package/dashboard/dist/assets/WorkflowPill-BegV-iRF.js.map +0 -1
  329. package/dashboard/dist/assets/WorkflowsDashboard-rpnGhGnl.js +0 -2
  330. package/dashboard/dist/assets/WorkflowsDashboard-rpnGhGnl.js.map +0 -1
  331. package/dashboard/dist/assets/WorkflowsOverview-ihhW8DiS.js +0 -2
  332. package/dashboard/dist/assets/YamlWorkflowDetailPage-C61-8y-E.js +0 -33
  333. package/dashboard/dist/assets/YamlWorkflowsPage-CMpgsLEo.js +0 -2
  334. package/dashboard/dist/assets/capabilities-BBTPqF-V.js +0 -2
  335. package/dashboard/dist/assets/escalation-CyJ_wz-f.js +0 -2
  336. package/dashboard/dist/assets/escalation-columns-DU4Jyxxo.js +0 -2
  337. package/dashboard/dist/assets/escalation-columns-DU4Jyxxo.js.map +0 -1
  338. package/dashboard/dist/assets/index-BBQggGcf.js +0 -2
  339. package/dashboard/dist/assets/index-BBQggGcf.js.map +0 -1
  340. package/dashboard/dist/assets/index-BHS-ubrT.js +0 -6
  341. package/dashboard/dist/assets/index-BHS-ubrT.js.map +0 -1
  342. package/dashboard/dist/assets/index-BVHXREYZ.js +0 -2
  343. package/dashboard/dist/assets/index-BVHXREYZ.js.map +0 -1
  344. package/dashboard/dist/assets/index-BiLZJ43R.js +0 -6
  345. package/dashboard/dist/assets/index-BoZydcaW.js +0 -63
  346. package/dashboard/dist/assets/index-BoZydcaW.js.map +0 -1
  347. package/dashboard/dist/assets/index-CCHGKErT.js +0 -2
  348. package/dashboard/dist/assets/index-CNprOGuS.js +0 -2
  349. package/dashboard/dist/assets/index-CZ6-l8_0.css +0 -1
  350. package/dashboard/dist/assets/index-CgeFUhUr.js +0 -2
  351. package/dashboard/dist/assets/index-CgeFUhUr.js.map +0 -1
  352. package/dashboard/dist/assets/index-ChniBGqD.js +0 -9
  353. package/dashboard/dist/assets/index-ChniBGqD.js.map +0 -1
  354. package/dashboard/dist/assets/index-CjXzZ19T.js +0 -2
  355. package/dashboard/dist/assets/index-CjXzZ19T.js.map +0 -1
  356. package/dashboard/dist/assets/index-D9pi0fs6.js +0 -2
  357. package/dashboard/dist/assets/index-DoivEaUZ.js +0 -2
  358. package/dashboard/dist/assets/index-DoivEaUZ.js.map +0 -1
  359. package/dashboard/dist/assets/index-Dzqt3g-K.js +0 -2
  360. package/dashboard/dist/assets/vendor-query-B2UbickB.js +0 -18
  361. package/dashboard/dist/assets/vendor-query-B2UbickB.js.map +0 -1
  362. package/dashboard/dist/assets/vendor-react-CXumBFUA.js +0 -22
  363. package/dashboard/dist/assets/vendor-react-CXumBFUA.js.map +0 -1
  364. package/dashboard/dist/assets/workflows-Dps45zjk.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProcessDetailPage-D80w44rV.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 dot-ring 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 dot-ring 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-status-warning\" />\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 docsHash=\"#docs:dashboard.md: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 dot-ring 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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"}
@@ -0,0 +1,2 @@
1
+ import{j as s}from"./index-DgCS2Frb.js";import{u as g}from"./tasks-DNdvW5H6.js";import{u as N}from"./workflows-BfyR5VJt.js";import{u as h}from"./useEventHooks-CUUeBSH1.js";import{u as P}from"./useFilterParams-Ch-a71bE.js";import{u as x}from"./useDebouncedValue-DmL3uNt_.js";import{b as v}from"./api-path-u2Jf9QXS.js";import{D as w}from"./DataTable-Bf4dgxll.js";import{T as p}from"./TimestampCell-BPMCscic.js";import{S as k}from"./StickyPagination-Clm9H840.js";import{F as y,a as L,b as n}from"./FilterBar-DEAbNQqp.js";import{P as D}from"./PageHeader-DcgGV0Y2.js";import{L as _}from"./ListToolbar-Dviaskni.js";import{W as E}from"./WorkflowPill-Cc2MlYbB.js";import{c as j}from"./vendor-react-zA2lQFDs.js";import"./vendor-query-DLp59M9_.js";import"./vendor-icons-CNyYGNsk.js";import"./EmptyState-CLVm9KmA.js";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:27,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(r=>s.jsxDEV(E,{type:r},r,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:38,columnNumber:11},void 0))},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:36,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:46,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:54,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:55,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:63,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:64,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:70,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:76,columnNumber:22},void 0),className:"w-44"}];function Q(){h();const e=j(),{filters:r,setFilter:i,pagination:o}=P({filters:{workflow_type:"",status:"",search:""}}),l=x(r.search,300),{data:m}=N(),d=[...new Set((m??[]).map(a=>a.workflow_type))].sort(),{data:t,isLoading:u,refetch:f,isFetching:b}=g({workflow_type:r.workflow_type||void 0,status:r.status||void 0,search:l||void 0,limit:o.pageSize,offset:o.offset}),c=(t==null?void 0:t.total)??0;return s.jsxDEV("div",{children:[s.jsxDEV(D,{title:"All Processes",docsHash:"#docs:dashboard.md:processes-overview"},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:105,columnNumber:7},this),s.jsxDEV(y,{actions:s.jsxDEV(_,{onRefresh:()=>f(),isFetching:b,apiPath:v("/tasks/processes",{limit:o.pageSize,offset:o.offset,workflow_type:r.workflow_type||void 0,status:r.status||void 0,search:l||void 0})},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:108,columnNumber:9},this),children:[s.jsxDEV(L,{label:"Search",value:r.search,onChange:a=>i("search",a),placeholder:"origin, workflow, or trace ID"},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:120,columnNumber:9},this),s.jsxDEV(n,{label:"Status",value:r.status,onChange:a=>i("status",a),options:V},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:126,columnNumber:9},this),s.jsxDEV(n,{label:"Workflow Type",value:r.workflow_type,onChange:a=>i("workflow_type",a),options:d.map(a=>({value:a,label:a}))},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:132,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:107,columnNumber:7},this),s.jsxDEV(w,{columns:S,data:(t==null?void 0:t.processes)??[],keyFn:a=>a.origin_id,onRowClick:a=>e(`/processes/detail/${encodeURIComponent(a.origin_id)}`),isLoading:u,emptyMessage:"No business processes found"},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:140,columnNumber:7},this),s.jsxDEV(k,{page:o.page,totalPages:o.totalPages(c),onPageChange:o.setPage,total:c,pageSize:o.pageSize,onPageSizeChange:o.setPageSize},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:149,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:104,columnNumber:5},this)}export{Q as ProcessesListPage};
2
+ //# sourceMappingURL=ProcessesListPage-BjW5xUkv.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProcessesListPage-BNhFwTLl.js","sources":["../../src/pages/processes/ProcessesListPage.tsx"],"sourcesContent":["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 { buildApiPath } from '../../lib/api-path';\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\" docsHash=\"#docs:dashboard.md:processes-overview\" />\n\n <FilterBar actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={buildApiPath('/tasks/processes', {\n limit: pagination.pageSize,\n offset: pagination.offset,\n workflow_type: filters.workflow_type || undefined,\n status: filters.status || undefined,\n search: debouncedSearch || undefined,\n })}\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":["STATUS_OPTIONS","columns","row","jsx","wt","WorkflowPill","TimestampCell","ProcessesListPage","useProcessListEvents","navigate","useNavigate","filters","setFilter","pagination","useFilterParams","debouncedSearch","useDebouncedValue","configs","useWorkflowConfigs","workflowTypes","c","data","isLoading","refetch","isFetching","useProcesses","total","PageHeader","jsxs","FilterBar","ListToolbar","buildApiPath","FilterInput","v","FilterSelect","DataTable","StickyPagination"],"mappings":"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"}
1
+ {"version":3,"file":"ProcessesListPage-BjW5xUkv.js","sources":["../../src/pages/processes/ProcessesListPage.tsx"],"sourcesContent":["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 { buildApiPath } from '../../lib/api-path';\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\" docsHash=\"#docs:dashboard.md:processes-overview\" />\n\n <FilterBar actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={buildApiPath('/tasks/processes', {\n limit: pagination.pageSize,\n offset: pagination.offset,\n workflow_type: filters.workflow_type || undefined,\n status: filters.status || undefined,\n search: debouncedSearch || undefined,\n })}\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":["STATUS_OPTIONS","columns","row","jsxDEV","this","wt","WorkflowPill","TimestampCell","ProcessesListPage","useProcessListEvents","navigate","useNavigate","filters","setFilter","pagination","useFilterParams","debouncedSearch","useDebouncedValue","configs","useWorkflowConfigs","workflowTypes","c","data","isLoading","refetch","isFetching","useProcesses","total","PageHeader","FilterBar","ListToolbar","buildApiPath","FilterInput","v","FilterSelect","t","DataTable","StickyPagination"],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import{j as e,J as T}from"./index-DgCS2Frb.js";import{a as p}from"./vendor-query-DLp59M9_.js";import{b as Q,f as B,g as X,e as ee,h as ae,i as se}from"./roles-CpRcUIMm.js";import{C as te}from"./ConfirmDeleteModal-no0-c_1G.js";import{u as re}from"./users-BUgdEsec.js";import{T as A,B as le,v as U,V as ie,p as oe,ar as ne,N as me,f as de,g as M}from"./vendor-icons-CNyYGNsk.js";import{e as ce,c as ue,L as pe}from"./vendor-react-zA2lQFDs.js";import"./Modal-C6HI6btY.js";function he({role:s}){const{data:d}=re({role:s,limit:100}),l=(d==null?void 0:d.users)??[];return l.length===0?e.jsxDEV("p",{className:"text-[11px] text-text-tertiary",children:"Assign users to this role to staff its queue. Members see and resolve escalations here according to their read/write scope; admins manage the role itself."},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleMembersSection.tsx",lineNumber:16,columnNumber:7},this):e.jsxDEV("div",{className:"divide-y divide-surface-border/40",children:l.map(n=>{const c=n.roles.find(m=>m.role===s);return c?e.jsxDEV("div",{className:"flex items-center justify-between py-1.5 gap-2",children:[e.jsxDEV("span",{className:"text-xs text-text-secondary truncate",children:n.display_name||n.external_id},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleMembersSection.tsx",lineNumber:31,columnNumber:13},this),e.jsxDEV("span",{className:"text-[10px] text-text-quaternary font-mono shrink-0",children:be(c)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleMembersSection.tsx",lineNumber:34,columnNumber:13},this)]},n.id,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleMembersSection.tsx",lineNumber:30,columnNumber:11},this):null})},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleMembersSection.tsx",lineNumber:25,columnNumber:5},this)}function be(s){return s.type==="superadmin"||s.type==="admin"?s.type:`member · read ${s.read_scope} · write ${s.write_scope}`}function L(s){return s==null?"":JSON.stringify(s,null,2)}function y(s){const d=s.trim();if(!d)return{ok:!0,value:void 0};try{const l=JSON.parse(d);return typeof l!="object"||Array.isArray(l)||l===null?{ok:!1}:{ok:!0,value:l}}catch{return{ok:!1}}}function x({icon:s,color:d,label:l,aside:n}){return e.jsxDEV("div",{className:"flex items-center justify-between mb-3 pb-2 border-b border-surface-border",children:[e.jsxDEV("div",{className:"flex items-center gap-2",children:[e.jsxDEV(s,{className:`w-4 h-4 ${d}`,strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:54,columnNumber:9},this),e.jsxDEV("h2",{className:"section-h2",children:l},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:55,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:53,columnNumber:7},this),n]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:52,columnNumber:5},this)}function Ne({role:s,allRoles:d}){const{data:l}=ee(),n=ae(),c=se(),[m,h]=p.useState(""),t=(l==null?void 0:l.chains)??[],a=p.useMemo(()=>t.filter(o=>o.source_role===s.role).map(o=>o.target_role),[t,s.role]),g=p.useMemo(()=>d.map(o=>o.role).filter(o=>o!==s.role&&o!=="superadmin"&&!a.includes(o)),[d,s.role,a]);return s.role==="superadmin"?e.jsxDEV("p",{className:"text-[11px] text-text-tertiary",children:"Superadmins can escalate to any role implicitly."},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:83,columnNumber:12},this):e.jsxDEV("div",{className:"space-y-3",children:[a.length===0?e.jsxDEV("p",{className:"text-[11px] text-text-tertiary",children:"Add a target role to route hand-offs."},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:89,columnNumber:9},this):e.jsxDEV("div",{className:"flex flex-wrap gap-1.5",children:a.map(o=>e.jsxDEV("span",{className:"inline-flex items-center gap-1 px-2 py-0.5 text-[10px] bg-surface-sunken rounded font-mono text-text-secondary",children:[o,e.jsxDEV("button",{onClick:()=>c.mutate({source_role:s.role,target_role:o}),className:"text-text-quaternary hover:text-status-error transition-colors leading-none ml-0.5",children:"×"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:98,columnNumber:15},this)]},o,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:93,columnNumber:13},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:91,columnNumber:9},this),g.length>0&&e.jsxDEV("div",{className:"flex items-center gap-2",children:[e.jsxDEV("select",{value:m,onChange:o=>h(o.target.value),className:"select text-xs font-mono flex-1",children:[e.jsxDEV("option",{value:"",children:"Add target…"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:115,columnNumber:13},this),g.map(o=>e.jsxDEV("option",{value:o,children:o},o,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:116,columnNumber:35},this))]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:110,columnNumber:11},this),e.jsxDEV("button",{onClick:()=>{m&&n.mutate({source_role:s.role,target_role:m},{onSuccess:()=>h("")})},disabled:!m||n.isPending,className:"px-2.5 py-1 text-xs rounded bg-accent text-text-inverse hover:bg-accent-hover transition-colors disabled:opacity-40 disabled:cursor-not-allowed shrink-0",children:n.isPending?"…":"Add"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:118,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:109,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:87,columnNumber:5},this)}function xe({role:s,allRoles:d}){const l=B(),[n,c]=p.useState(""),m=s.upstream_roles??[],h=p.useMemo(()=>d.map(a=>a.role).filter(a=>a!==s.role&&a!=="superadmin"&&!m.includes(a)),[d,s.role,m]),t=a=>l.mutate({role:s.role,upstream_roles:a},{onSuccess:()=>c("")});return e.jsxDEV("div",{className:"space-y-3",children:[m.length===0?e.jsxDEV("p",{className:"text-[11px] text-text-tertiary",children:"Add a role from another sequence that this station draws input from. Prior Step sets where this role sits in its own sequence; upstream inputs mark the side-quests that land here."},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:161,columnNumber:9},this):e.jsxDEV("div",{className:"flex flex-wrap gap-1.5",children:m.map(a=>e.jsxDEV("span",{className:"inline-flex items-center gap-1 px-2 py-0.5 text-[10px] bg-surface-sunken rounded font-mono text-text-secondary",children:[a,e.jsxDEV("button",{onClick:()=>t(m.filter(g=>g!==a)),className:"text-text-quaternary hover:text-status-error transition-colors leading-none ml-0.5",children:"×"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:174,columnNumber:15},this)]},a,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:169,columnNumber:13},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:167,columnNumber:9},this),h.length>0&&e.jsxDEV("div",{className:"flex items-center gap-2",children:[e.jsxDEV("select",{value:n,onChange:a=>c(a.target.value),className:"select text-xs font-mono flex-1",children:[e.jsxDEV("option",{value:"",children:"Add upstream input…"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:191,columnNumber:13},this),h.map(a=>e.jsxDEV("option",{value:a,children:a},a,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:192,columnNumber:35},this))]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:186,columnNumber:11},this),e.jsxDEV("button",{onClick:()=>{n&&t([...m,n])},disabled:!n||l.isPending,className:"px-2.5 py-1 text-xs rounded bg-accent text-text-inverse hover:bg-accent-hover transition-colors disabled:opacity-40 disabled:cursor-not-allowed shrink-0",children:l.isPending?"…":"Add"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:194,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:185,columnNumber:9},this),l.error&&e.jsxDEV("p",{className:"text-[10px] text-status-error",children:l.error.message},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:204,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:159,columnNumber:5},this)}function ge(s){return{title:s.title??"",description:s.description??"",ops_visible:s.ops_visible,parent_role:s.parent_role??"",metadata_schema:L(s.metadata_schema),properties:L(s.properties)||"{}",sla_minutes:s.sla_minutes!=null?String(s.sla_minutes):"",target_per_hour:s.target_per_hour!=null?String(s.target_per_hour):"",worker_count:s.worker_count!=null?String(s.worker_count):"",priority_threshold_minutes:s.priority_threshold_minutes!=null?String(s.priority_threshold_minutes):"",priority_facet:s.priority_facet??""}}const fe=/^[a-zA-Z0-9_]+$/;function ye(){const{role:s}=ce(),d=ue(),{data:l,isLoading:n}=Q(),c=B(),m=X(),h=(l==null?void 0:l.roles)??[],t=h.find(r=>r.role===s),[a,g]=p.useState({title:"",description:"",ops_visible:!1,parent_role:"",metadata_schema:"",properties:"{}",sla_minutes:"",target_per_hour:"",worker_count:"",priority_threshold_minutes:"",priority_facet:""}),[o,w]=p.useState(!1),[I,P]=p.useState(!1),[f,E]=p.useState({}),[z,$]=p.useState(!1),[R,k]=p.useState(new Set),F=r=>k(i=>new Set([...i,r]));p.useEffect(()=>{t&&(g(ge(t)),w(!1),P(!1),E({}),k(new Set))},[s,t==null?void 0:t.role]);const b=r=>{g(i=>({...i,...r})),w(!0),P(!1)},W=p.useMemo(()=>h.filter(r=>{if(!t||r.role===t.role)return!1;let i=r;const u=new Set;for(;i!=null&&i.parent_role;){if(i.parent_role===t.role)return!1;if(u.has(i.parent_role))break;u.add(i.parent_role),i=h.find(N=>N.role===i.parent_role)}return!0}),[h,t]),K=()=>{const r=y(a.metadata_schema),i=y(a.properties),u=a.priority_facet.trim(),N={};if(r.ok||(N.metadata_schema="Invalid JSON"),i.ok||(N.properties="Invalid JSON"),u&&!fe.test(u)&&(N.priority_facet="Letters, numbers, underscores only"),E(N),Object.keys(N).length||!t)return;const D=O=>{const v=parseFloat(O);return isNaN(v)?null:v},Z=O=>{const v=D(O);return v==null?null:Math.round(v)};c.mutate({role:t.role,title:a.title.trim()||null,description:a.description.trim()||null,ops_visible:a.ops_visible,parent_role:a.parent_role||null,metadata_schema:r.value??null,properties:i.value??{},sla_minutes:D(a.sla_minutes),target_per_hour:D(a.target_per_hour),worker_count:Z(a.worker_count),priority_threshold_minutes:D(a.priority_threshold_minutes),priority_facet:u||null},{onSuccess:()=>{w(!1),P(!0),k(new Set),window.setTimeout(()=>P(!1),2500)}})},G=()=>{t&&m.mutate(t.role,{onSuccess:()=>d("/admin/roles")})};if(n)return e.jsxDEV("div",{className:"animate-pulse space-y-4",children:[e.jsxDEV("div",{className:"h-8 bg-surface-sunken rounded w-48"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:354,columnNumber:9},this),e.jsxDEV("div",{className:"h-4 bg-surface-sunken rounded w-64"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:355,columnNumber:9},this),e.jsxDEV("div",{className:"h-64 bg-surface-sunken rounded"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:356,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:353,columnNumber:7},this);if(!t)return e.jsxDEV("div",{className:"flex flex-col items-center justify-center py-20 text-center",children:[e.jsxDEV(A,{className:"w-12 h-12 text-text-quaternary mb-4",strokeWidth:1},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:364,columnNumber:9},this),e.jsxDEV("h2",{className:"text-lg font-medium text-text-primary mb-2",children:"Role not found"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:365,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:363,columnNumber:7},this);const H=t.user_count>0||t.chain_count>0||t.workflow_count>0,Y=o&&!Object.values(f).some(Boolean),j=parseFloat(a.sla_minutes),V=parseFloat(a.target_per_hour),_=parseFloat(a.worker_count),S=!isNaN(j)&&j>0,C=!isNaN(V)&&V>0,q=!isNaN(_)&&_>0,J=S&&q&&!C?`→ target ≈ ${(_/(j/60)).toFixed(1)}/h`:S&&C&&!q?`→ workers ≈ ${(V*(j/60)).toFixed(1)}`:C&&q&&!S?`→ SLA ≈ ${(_/V*60).toFixed(0)}m`:null;return e.jsxDEV("div",{children:[e.jsxDEV("div",{className:"grid grid-cols-3 gap-16 items-center mb-12",children:[e.jsxDEV("div",{className:"flex items-center justify-between gap-4 min-w-0",children:[e.jsxDEV("div",{className:"min-w-0",children:[e.jsxDEV("div",{className:"flex items-center gap-3 mb-1",children:[e.jsxDEV(A,{className:"w-5 h-5 text-accent",strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:394,columnNumber:15},this),e.jsxDEV("h1",{className:"text-lg font-mono font-medium text-text-primary",children:t.role},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:395,columnNumber:15},this),e.jsxDEV("button",{onClick:()=>{window.location.hash="#docs:dashboard.md:role-detail"},className:"text-text-quaternary hover:text-accent transition-colors",title:"Open docs for this page",children:e.jsxDEV(le,{className:"w-4 h-4",strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:401,columnNumber:17},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:396,columnNumber:15},this),t.parent_role&&e.jsxDEV("span",{className:"flex items-center gap-1 text-[10px] text-text-quaternary font-mono",children:[e.jsxDEV(U,{className:"w-3 h-3"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:405,columnNumber:19},this)," ",t.parent_role]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:404,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:393,columnNumber:13},this),t.title&&e.jsxDEV("p",{className:"text-sm text-text-secondary pl-8",children:t.title},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:409,columnNumber:28},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:392,columnNumber:11},this),e.jsxDEV("div",{className:"flex items-center gap-2 shrink-0",title:"Show as a station on the Pace Board",children:[e.jsxDEV("span",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Ops"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:414,columnNumber:13},this),e.jsxDEV("button",{onClick:()=>b({ops_visible:!a.ops_visible}),className:`w-9 h-5 rounded-full transition-colors relative shrink-0 ${a.ops_visible?"bg-accent":"bg-surface-border"}`,children:e.jsxDEV("span",{className:`absolute top-[3px] left-0 w-3.5 h-3.5 rounded-full bg-white transition-transform shadow ${a.ops_visible?"translate-x-[18px]":"translate-x-[3px]"}`},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:421,columnNumber:15},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:415,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:413,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:391,columnNumber:9},this),e.jsxDEV("div",{className:"flex items-end justify-center gap-4 bg-surface-sunken rounded-lg px-4 py-2.5 w-full",title:"throughput = workers / (sla / 60)",children:[[{key:"sla_minutes",label:"SLA",unit:"min",placeholder:"30"},{key:"target_per_hour",label:"Target",unit:"/h",placeholder:"20"},{key:"worker_count",label:"Workers",unit:"",placeholder:"4"}].map(({key:r,label:i,unit:u,placeholder:N})=>e.jsxDEV("div",{children:[e.jsxDEV("label",{className:"block text-[9px] font-semibold uppercase tracking-widest text-text-quaternary mb-1",children:[i,u&&e.jsxDEV("span",{className:"normal-case font-normal ml-1",children:u},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:444,columnNumber:26},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:442,columnNumber:15},this),e.jsxDEV("input",{type:"number",min:"0",step:"any",value:a[r],onChange:D=>b({[r]:D.target.value}),placeholder:N,className:"input text-xs w-16 font-mono"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:446,columnNumber:15},this)]},r,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:441,columnNumber:13},this)),J&&e.jsxDEV("span",{className:"text-[10px] text-accent font-mono whitespace-nowrap pb-2",children:J},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:458,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:432,columnNumber:9},this),e.jsxDEV("div",{className:"flex items-center justify-between gap-4 min-w-0",children:[e.jsxDEV("div",{className:"flex items-end gap-4 bg-surface-sunken rounded-lg px-4 py-2.5 shrink-0",title:"Pending unclaimed items older than the threshold count as priority on the Pace Board. Age is measured from the metadata facet (an ISO 8601 UTC timestamp, e.g. authorized_at) or from created_at when the facet is blank; the threshold falls back to SLA when blank.",children:[e.jsxDEV("div",{children:[e.jsxDEV("label",{className:"block text-[9px] font-semibold uppercase tracking-widest text-text-quaternary mb-1",children:["Priority",e.jsxDEV("span",{className:"normal-case font-normal ml-1",children:"min"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:475,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:473,columnNumber:15},this),e.jsxDEV("input",{type:"number",min:"0",step:"any",value:a.priority_threshold_minutes,onChange:r=>b({priority_threshold_minutes:r.target.value}),placeholder:a.sla_minutes||"60",className:"input text-xs w-16 font-mono"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:477,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:472,columnNumber:13},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:"block text-[9px] font-semibold uppercase tracking-widest text-text-quaternary mb-1",children:"Facet"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:488,columnNumber:15},this),e.jsxDEV("input",{type:"text",value:a.priority_facet,onChange:r=>b({priority_facet:r.target.value}),placeholder:"created_at",className:"input text-xs w-28 font-mono"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:491,columnNumber:15},this),f.priority_facet&&e.jsxDEV("p",{className:"text-[9px] text-status-error mt-0.5",children:f.priority_facet},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:499,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:487,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:468,columnNumber:11},this),e.jsxDEV("div",{className:"flex items-center gap-3 shrink-0",children:[I&&e.jsxDEV("span",{className:"flex items-center gap-1 text-xs text-status-success animate-page-enter",children:[e.jsxDEV(ie,{className:"w-3 h-3"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:507,columnNumber:17},this)," Saved"]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:506,columnNumber:15},this),c.error&&e.jsxDEV("span",{className:"text-xs text-status-error max-w-[180px] truncate",children:c.error.message},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:511,columnNumber:15},this),e.jsxDEV("button",{onClick:K,disabled:!Y||c.isPending,className:"px-3 py-1.5 text-xs rounded-md bg-accent text-text-inverse hover:bg-accent-hover transition-colors disabled:opacity-40 disabled:cursor-not-allowed",children:c.isPending?"Saving…":"Save"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:515,columnNumber:13},this),!H&&e.jsxDEV("button",{onClick:()=>$(!0),className:"px-3 py-1.5 text-xs rounded-md text-status-error/60 hover:text-status-error hover:bg-status-error/10 transition-colors flex items-center gap-1",children:[e.jsxDEV(oe,{className:"w-3 h-3"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:527,columnNumber:17},this)," Delete"]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:523,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:504,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:467,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:389,columnNumber:7},this),e.jsxDEV("div",{className:"grid grid-cols-3 gap-16 items-start",children:[e.jsxDEV("div",{className:"space-y-14",children:[e.jsxDEV("div",{className:"space-y-8",children:[e.jsxDEV(x,{icon:A,color:"text-accent",label:"Identity"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:542,columnNumber:13},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1.5",children:"Display Name"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:545,columnNumber:15},this),e.jsxDEV("input",{type:"text",value:a.title,onChange:r=>b({title:r.target.value}),placeholder:`e.g., ${t.role.charAt(0).toUpperCase()+t.role.slice(1)}`,className:"input text-sm w-full"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:548,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:544,columnNumber:13},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1.5",children:"Description"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:558,columnNumber:15},this),e.jsxDEV("textarea",{value:a.description,onChange:r=>b({description:r.target.value}),placeholder:"A short description shown on role cards and in the operations view.",rows:4,className:"input text-sm w-full resize-none"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:561,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:557,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:541,columnNumber:11},this),e.jsxDEV("div",{className:`space-y-14 overflow-hidden transition-all duration-300 ease-out ${a.ops_visible?"opacity-100 max-h-[900px]":"opacity-0 max-h-0 pointer-events-none"}`,"aria-hidden":!a.ops_visible,children:[e.jsxDEV("div",{className:"space-y-5",children:[e.jsxDEV(x,{icon:U,color:"text-text-tertiary",label:"Prior Step"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:581,columnNumber:15},this),e.jsxDEV("select",{value:a.parent_role,onChange:r=>b({parent_role:r.target.value}),className:"select text-sm w-full font-mono",children:[e.jsxDEV("option",{value:"",children:"None — root process"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:587,columnNumber:17},this),W.map(r=>e.jsxDEV("option",{value:r.role,children:r.title?`${r.role} — ${r.title}`:r.role},r.role,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:589,columnNumber:19},this))]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:582,columnNumber:15},this),e.jsxDEV("p",{className:"text-[10px] text-text-tertiary leading-relaxed",children:"Places this role in one Pace Board sequence. A role with no prior step starts its own sequence."},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:594,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:580,columnNumber:13},this),e.jsxDEV("div",{className:"space-y-5",children:[e.jsxDEV(x,{icon:ne,color:"text-text-tertiary",label:"Upstream Inputs",aside:e.jsxDEV("div",{className:"flex items-center gap-1",children:[e.jsxDEV("span",{className:"w-1.5 h-1.5 rounded-full dot-ring bg-status-success"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:608,columnNumber:21},this),e.jsxDEV("span",{className:"text-[9px] font-semibold uppercase tracking-widest text-status-success",children:"Live"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:609,columnNumber:21},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:607,columnNumber:19},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:602,columnNumber:15},this),e.jsxDEV(xe,{role:t,allRoles:h},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:613,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:601,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:573,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:538,columnNumber:9},this),e.jsxDEV("div",{className:"space-y-14",children:[e.jsxDEV("div",{children:[e.jsxDEV(x,{icon:me,color:"text-text-quaternary",label:"Escalation Targets",aside:e.jsxDEV("div",{className:"flex items-center gap-1",children:[e.jsxDEV("span",{className:"w-1.5 h-1.5 rounded-full dot-ring bg-status-success"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:630,columnNumber:19},this),e.jsxDEV("span",{className:"text-[9px] font-semibold uppercase tracking-widest text-status-success",children:"Live"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:631,columnNumber:19},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:629,columnNumber:17},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:624,columnNumber:13},this),e.jsxDEV(Ne,{role:t,allRoles:h},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:635,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:623,columnNumber:11},this),e.jsxDEV("div",{className:"pt-3 pb-4 border-t border-surface-border/40",children:[e.jsxDEV(x,{icon:de,color:"text-text-quaternary",label:"Members",aside:e.jsxDEV("span",{className:"text-[9px] font-normal normal-case text-text-quaternary",children:"read = what appears · write = what they can act on"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:645,columnNumber:17},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:640,columnNumber:13},this),e.jsxDEV(he,{role:t.role},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:650,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:639,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:620,columnNumber:9},this),e.jsxDEV("div",{className:"space-y-14",children:[e.jsxDEV("div",{children:[e.jsxDEV(x,{icon:M,color:"text-accent",label:"Escalation Schema",aside:t.current_schema_version!=null?e.jsxDEV("span",{className:"text-[9px] font-mono text-text-quaternary",children:["v",t.current_schema_version," in use"]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:664,columnNumber:19},this):void 0},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:658,columnNumber:13},this),e.jsxDEV("p",{className:"text-[10px] text-text-tertiary mb-3 leading-relaxed",children:["The form a person completes to resolve this role's escalations. Versioned — each save adds one; workflows pin any version via"," ",e.jsxDEV("code",{className:"font-mono",children:"schemaVersion"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:671,columnNumber:15},this),"."]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:668,columnNumber:13},this),e.jsxDEV(pe,{to:`/admin/roles/${encodeURIComponent(t.role)}/schema`,className:"text-xs text-accent hover:underline",children:t.form_schema?`Open schema editor — v${t.current_schema_version??1} in use →`:"Define the escalation form →"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:673,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:657,columnNumber:11},this),e.jsxDEV("div",{children:[e.jsxDEV(x,{icon:M,color:"text-accent",label:"Metadata Schema",aside:!R.has("metadata_schema")&&t.metadata_schema?e.jsxDEV("button",{onClick:()=>F("metadata_schema"),className:"text-[9px] text-accent hover:underline",children:"Edit"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:691,columnNumber:19},this):void 0},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:685,columnNumber:13},this),e.jsxDEV("p",{className:"text-[10px] text-text-tertiary mb-3 leading-relaxed",children:["Validates ",e.jsxDEV("code",{className:"font-mono",children:"metadata"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:696,columnNumber:25},this)," at creation time. Keys appear in faceted search autocomplete."]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:695,columnNumber:13},this),!R.has("metadata_schema")&&t.metadata_schema?e.jsxDEV(T,{data:t.metadata_schema},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:699,columnNumber:15},this):e.jsxDEV(e.Fragment,{children:[e.jsxDEV("textarea",{value:a.metadata_schema,onChange:r=>{const i=r.target.value;b({metadata_schema:i}),E(u=>({...u,metadata_schema:y(i).ok?void 0:"Invalid JSON"}))},rows:10,spellCheck:!1,className:"input text-xs font-mono w-full resize-y",placeholder:`{
2
+ "type": "object",
3
+ "properties": {
4
+ "order_id": { "type": "string" }
5
+ },
6
+ "required": ["order_id"]
7
+ }`},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:702,columnNumber:17},this),f.metadata_schema&&e.jsxDEV("p",{className:"text-[10px] text-status-error mt-1",children:f.metadata_schema},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:714,columnNumber:44},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:701,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:684,columnNumber:11},this),e.jsxDEV("div",{children:[e.jsxDEV(x,{icon:M,color:"text-text-quaternary",label:"Properties",aside:!R.has("properties")&&t.properties&&Object.keys(t.properties).length>0?e.jsxDEV("button",{onClick:()=>F("properties"),className:"text-[9px] text-accent hover:underline",children:"Edit"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:727,columnNumber:19},this):e.jsxDEV("span",{className:"text-[9px] font-normal normal-case text-text-quaternary",children:"custom JSON"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:729,columnNumber:19},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:721,columnNumber:13},this),!R.has("properties")&&t.properties&&Object.keys(t.properties).length>0?e.jsxDEV(T,{data:t.properties,defaultCollapsed:!0},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:734,columnNumber:15},this):e.jsxDEV(e.Fragment,{children:[e.jsxDEV("textarea",{value:a.properties,onChange:r=>{const i=r.target.value;b({properties:i}),E(u=>({...u,properties:y(i).ok?void 0:"Invalid JSON"}))},rows:5,spellCheck:!1,className:"input text-xs font-mono w-full resize-none",placeholder:`{
8
+ "icon": "wrench",
9
+ "color": "#6366f1"
10
+ }`},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:737,columnNumber:17},this),f.properties&&e.jsxDEV("p",{className:"text-[10px] text-status-error mt-1",children:f.properties},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:749,columnNumber:39},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:736,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:720,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:655,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:535,columnNumber:7},this),e.jsxDEV(te,{open:z,onClose:()=>$(!1),onConfirm:G,title:"Delete Role",description:e.jsxDEV(e.Fragment,{children:["Delete role ",e.jsxDEV("span",{className:"font-medium font-mono text-text-primary",children:t.role},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:764,columnNumber:25},this),"? This cannot be undone."]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:763,columnNumber:11},this),isPending:m.isPending,error:m.error},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:757,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RoleDetailPage.tsx",lineNumber:386,columnNumber:5},this)}export{ye as RoleDetailPage};
11
+ //# sourceMappingURL=RoleDetailPage-oahg0cdT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RoleDetailPage-oahg0cdT.js","sources":["../../src/pages/admin/roles/RoleMembersSection.tsx","../../src/pages/admin/roles/RoleDetailPage.tsx"],"sourcesContent":["import { useUsers } from '../../../api/users';\nimport type { LTUserRole } from '../../../api/types/users';\n\n/**\n * Who can see through this role's window, and how far. Membership is admin or\n * member; a member's reach over the queue is two axes — read (which\n * escalations appear: their own, or the whole queue) and write (which they can\n * claim and resolve: none, their own, or the whole queue).\n */\nexport function RoleMembersSection({ role }: { role: string }) {\n const { data } = useUsers({ role, limit: 100 });\n const users = data?.users ?? [];\n\n if (users.length === 0) {\n return (\n <p className=\"text-[11px] text-text-tertiary\">\n Assign users to this role to staff its queue. Members see and resolve\n escalations here according to their read/write scope; admins manage the\n role itself.\n </p>\n );\n }\n\n return (\n <div className=\"divide-y divide-surface-border/40\">\n {users.map((u) => {\n const membership = u.roles.find((r) => r.role === role);\n if (!membership) return null;\n return (\n <div key={u.id} className=\"flex items-center justify-between py-1.5 gap-2\">\n <span className=\"text-xs text-text-secondary truncate\">\n {u.display_name || u.external_id}\n </span>\n <span className=\"text-[10px] text-text-quaternary font-mono shrink-0\">\n {describeMembership(membership)}\n </span>\n </div>\n );\n })}\n </div>\n );\n}\n\nfunction describeMembership(m: LTUserRole): string {\n if (m.type === 'superadmin' || m.type === 'admin') return m.type;\n return `member · read ${m.read_scope} · write ${m.write_scope}`;\n}\n","import { useState, useEffect, useMemo } from 'react';\nimport { useParams, useNavigate, Link } from 'react-router-dom';\nimport {\n Tag, GitBranch, GitMerge, Network, Trash2, Check, Braces, Users, BookOpen,\n} from 'lucide-react';\nimport {\n useRoleDetails,\n useUpdateRole,\n useDeleteRole,\n useEscalationChains,\n useAddEscalationChain,\n useRemoveEscalationChain,\n type RoleDetail,\n} from '../../../api/roles';\nimport { JsonViewer } from '../../../components/common/data/JsonViewer';\nimport { ConfirmDeleteModal } from '../../../components/common/modal/ConfirmDeleteModal';\nimport { RoleMembersSection } from './RoleMembersSection';\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\nfunction safePrettyPrint(value: unknown): string {\n if (value == null) return '';\n return JSON.stringify(value, null, 2);\n}\n\nfunction safeParseJson(text: string): { ok: boolean; value?: Record<string, unknown> } {\n const trimmed = text.trim();\n if (!trimmed) return { ok: true, value: undefined };\n try {\n const parsed = JSON.parse(trimmed);\n if (typeof parsed !== 'object' || Array.isArray(parsed) || parsed === null) return { ok: false };\n return { ok: true, value: parsed };\n } catch {\n return { ok: false };\n }\n}\n\n// ── Section header ────────────────────────────────────────────────────────────\n\nfunction SectionHead({\n icon: Icon,\n color,\n label,\n aside,\n}: {\n icon: React.ElementType;\n color: string;\n label: string;\n aside?: React.ReactNode;\n}) {\n return (\n <div className=\"flex items-center justify-between mb-3 pb-2 border-b border-surface-border\">\n <div className=\"flex items-center gap-2\">\n <Icon className={`w-4 h-4 ${color}`} strokeWidth={1.5} />\n <h2 className=\"section-h2\">{label}</h2>\n </div>\n {aside}\n </div>\n );\n}\n\n// ── Escalation section (live-save) ────────────────────────────────────────────\n\nfunction EscalationSection({ role, allRoles }: { role: RoleDetail; allRoles: RoleDetail[] }) {\n const { data: chainsData } = useEscalationChains();\n const addChain = useAddEscalationChain();\n const removeChain = useRemoveEscalationChain();\n const [newTarget, setNewTarget] = useState('');\n\n const chains = chainsData?.chains ?? [];\n const targets = useMemo(\n () => chains.filter((c) => c.source_role === role.role).map((c) => c.target_role),\n [chains, role.role],\n );\n const available = useMemo(\n () => allRoles\n .map((r) => r.role)\n .filter((r) => r !== role.role && r !== 'superadmin' && !targets.includes(r)),\n [allRoles, role.role, targets],\n );\n\n if (role.role === 'superadmin') {\n return <p className=\"text-[11px] text-text-tertiary\">Superadmins can escalate to any role implicitly.</p>;\n }\n\n return (\n <div className=\"space-y-3\">\n {targets.length === 0 ? (\n <p className=\"text-[11px] text-text-tertiary\">Add a target role to route hand-offs.</p>\n ) : (\n <div className=\"flex flex-wrap gap-1.5\">\n {targets.map((t) => (\n <span\n key={t}\n className=\"inline-flex items-center gap-1 px-2 py-0.5 text-[10px] bg-surface-sunken rounded font-mono text-text-secondary\"\n >\n {t}\n <button\n onClick={() => removeChain.mutate({ source_role: role.role, target_role: t })}\n className=\"text-text-quaternary hover:text-status-error transition-colors leading-none ml-0.5\"\n >\n ×\n </button>\n </span>\n ))}\n </div>\n )}\n {available.length > 0 && (\n <div className=\"flex items-center gap-2\">\n <select\n value={newTarget}\n onChange={(e) => setNewTarget(e.target.value)}\n className=\"select text-xs font-mono flex-1\"\n >\n <option value=\"\">Add target…</option>\n {available.map((r) => <option key={r} value={r}>{r}</option>)}\n </select>\n <button\n onClick={() => {\n if (!newTarget) return;\n addChain.mutate({ source_role: role.role, target_role: newTarget }, { onSuccess: () => setNewTarget('') });\n }}\n disabled={!newTarget || addChain.isPending}\n className=\"px-2.5 py-1 text-xs rounded bg-accent text-text-inverse hover:bg-accent-hover transition-colors disabled:opacity-40 disabled:cursor-not-allowed shrink-0\"\n >\n {addChain.isPending ? '…' : 'Add'}\n </button>\n </div>\n )}\n </div>\n );\n}\n\n// ── Upstream inputs section (live-save) ───────────────────────────────────────\n\n/**\n * The graph edges that don't fit the line. Prior Step (parent_role) places\n * this role in ONE sequence on the Operations page; upstream inputs declare\n * the roles it also draws from in OTHER sequences — mixin-like, many allowed.\n * The chart shows them as a merge glyph on the station, never as a bend in\n * the sequence.\n */\nfunction UpstreamSection({ role, allRoles }: { role: RoleDetail; allRoles: RoleDetail[] }) {\n const updateRole = useUpdateRole();\n const [newUpstream, setNewUpstream] = useState('');\n\n const upstreams = role.upstream_roles ?? [];\n const available = useMemo(\n () => allRoles\n .map((r) => r.role)\n .filter((r) => r !== role.role && r !== 'superadmin' && !upstreams.includes(r)),\n [allRoles, role.role, upstreams],\n );\n\n const save = (next: string[]) =>\n updateRole.mutate({ role: role.role, upstream_roles: next }, { onSuccess: () => setNewUpstream('') });\n\n return (\n <div className=\"space-y-3\">\n {upstreams.length === 0 ? (\n <p className=\"text-[11px] text-text-tertiary\">\n Add a role from another sequence that this station draws input from.\n Prior Step sets where this role sits in its own sequence; upstream\n inputs mark the side-quests that land here.\n </p>\n ) : (\n <div className=\"flex flex-wrap gap-1.5\">\n {upstreams.map((u) => (\n <span\n key={u}\n className=\"inline-flex items-center gap-1 px-2 py-0.5 text-[10px] bg-surface-sunken rounded font-mono text-text-secondary\"\n >\n {u}\n <button\n onClick={() => save(upstreams.filter((x) => x !== u))}\n className=\"text-text-quaternary hover:text-status-error transition-colors leading-none ml-0.5\"\n >\n ×\n </button>\n </span>\n ))}\n </div>\n )}\n {available.length > 0 && (\n <div className=\"flex items-center gap-2\">\n <select\n value={newUpstream}\n onChange={(e) => setNewUpstream(e.target.value)}\n className=\"select text-xs font-mono flex-1\"\n >\n <option value=\"\">Add upstream input…</option>\n {available.map((r) => <option key={r} value={r}>{r}</option>)}\n </select>\n <button\n onClick={() => { if (newUpstream) save([...upstreams, newUpstream]); }}\n disabled={!newUpstream || updateRole.isPending}\n className=\"px-2.5 py-1 text-xs rounded bg-accent text-text-inverse hover:bg-accent-hover transition-colors disabled:opacity-40 disabled:cursor-not-allowed shrink-0\"\n >\n {updateRole.isPending ? '…' : 'Add'}\n </button>\n </div>\n )}\n {updateRole.error && (\n <p className=\"text-[10px] text-status-error\">{(updateRole.error as Error).message}</p>\n )}\n </div>\n );\n}\n\n// ── Draft state ───────────────────────────────────────────────────────────────\n\ninterface Draft {\n title: string;\n description: string;\n ops_visible: boolean;\n parent_role: string;\n metadata_schema: string;\n properties: string;\n sla_minutes: string;\n target_per_hour: string;\n worker_count: string;\n priority_threshold_minutes: string;\n priority_facet: string;\n}\n\nfunction draftFrom(role: RoleDetail): Draft {\n return {\n title: role.title ?? '',\n description: role.description ?? '',\n ops_visible: role.ops_visible,\n parent_role: role.parent_role ?? '',\n metadata_schema: safePrettyPrint(role.metadata_schema),\n properties: safePrettyPrint(role.properties) || '{}',\n sla_minutes: role.sla_minutes != null ? String(role.sla_minutes) : '',\n target_per_hour: role.target_per_hour != null ? String(role.target_per_hour) : '',\n worker_count: role.worker_count != null ? String(role.worker_count) : '',\n priority_threshold_minutes: role.priority_threshold_minutes != null ? String(role.priority_threshold_minutes) : '',\n priority_facet: role.priority_facet ?? '',\n };\n}\n\n// Mirrors the server-side facet key rule (metadata keys are interpolated as a\n// JSON path, so they are strictly validated).\nconst FACET_KEY = /^[a-zA-Z0-9_]+$/;\n\n// ── Page ──────────────────────────────────────────────────────────────────────\n\nexport function RoleDetailPage() {\n const { role: roleKey } = useParams<{ role: string }>();\n const navigate = useNavigate();\n const { data, isLoading } = useRoleDetails();\n const updateRole = useUpdateRole();\n const deleteRole = useDeleteRole();\n\n const roles = data?.roles ?? [];\n const role = roles.find((r) => r.role === roleKey);\n\n const [draft, setDraft] = useState<Draft>({\n title: '', description: '', ops_visible: false, parent_role: '',\n metadata_schema: '', properties: '{}',\n sla_minutes: '', target_per_hour: '', worker_count: '',\n priority_threshold_minutes: '', priority_facet: '',\n });\n const [dirty, setDirty] = useState(false);\n const [savedOk, setSavedOk] = useState(false);\n const [errors, setErrors] = useState<{ metadata_schema?: string; properties?: string; priority_facet?: string }>({});\n const [confirmDelete, setConfirmDelete] = useState(false);\n const [editingJson, setEditingJson] = useState(new Set<string>());\n\n const startEditingJson = (field: string) => setEditingJson((prev) => new Set([...prev, field]));\n\n useEffect(() => {\n if (!role) return;\n setDraft(draftFrom(role));\n setDirty(false);\n setSavedOk(false);\n setErrors({});\n setEditingJson(new Set());\n }, [roleKey, role?.role]);\n\n const update = (changes: Partial<Draft>) => {\n setDraft((d) => ({ ...d, ...changes }));\n setDirty(true);\n setSavedOk(false);\n };\n\n const availableParents = useMemo(\n () => roles.filter((r) => {\n if (!role || r.role === role.role) return false;\n let cur: RoleDetail | undefined = r;\n const seen = new Set<string>();\n while (cur?.parent_role) {\n if (cur.parent_role === role.role) return false;\n if (seen.has(cur.parent_role)) break;\n seen.add(cur.parent_role);\n cur = roles.find((x) => x.role === cur!.parent_role);\n }\n return true;\n }),\n [roles, role],\n );\n\n const handleSave = () => {\n const metaResult = safeParseJson(draft.metadata_schema);\n const propsResult = safeParseJson(draft.properties);\n const facet = draft.priority_facet.trim();\n const newErrors: typeof errors = {};\n if (!metaResult.ok) newErrors.metadata_schema = 'Invalid JSON';\n if (!propsResult.ok) newErrors.properties = 'Invalid JSON';\n if (facet && !FACET_KEY.test(facet)) newErrors.priority_facet = 'Letters, numbers, underscores only';\n setErrors(newErrors);\n if (Object.keys(newErrors).length || !role) return;\n\n const parseNum = (s: string) => { const v = parseFloat(s); return isNaN(v) ? null : v; };\n // Staff counts are whole people/machines — round rather than persist 2.5 workers.\n const parseCount = (s: string) => { const v = parseNum(s); return v == null ? null : Math.round(v); };\n\n updateRole.mutate(\n {\n role: role.role,\n title: draft.title.trim() || null,\n description: draft.description.trim() || null,\n ops_visible: draft.ops_visible,\n parent_role: draft.parent_role || null,\n metadata_schema: metaResult.value ?? null,\n properties: propsResult.value ?? {},\n sla_minutes: parseNum(draft.sla_minutes),\n target_per_hour: parseNum(draft.target_per_hour),\n worker_count: parseCount(draft.worker_count),\n priority_threshold_minutes: parseNum(draft.priority_threshold_minutes),\n priority_facet: facet || null,\n },\n {\n onSuccess: () => {\n setDirty(false);\n setSavedOk(true);\n setEditingJson(new Set());\n window.setTimeout(() => setSavedOk(false), 2500);\n },\n },\n );\n };\n\n const handleDelete = () => {\n if (!role) return;\n deleteRole.mutate(role.role, { onSuccess: () => navigate('/admin/roles') });\n };\n\n // ── Loading / not found ───────────────────────────────────────────────────\n\n if (isLoading) {\n return (\n <div className=\"animate-pulse space-y-4\">\n <div className=\"h-8 bg-surface-sunken rounded w-48\" />\n <div className=\"h-4 bg-surface-sunken rounded w-64\" />\n <div className=\"h-64 bg-surface-sunken rounded\" />\n </div>\n );\n }\n\n if (!role) {\n return (\n <div className=\"flex flex-col items-center justify-center py-20 text-center\">\n <Tag className=\"w-12 h-12 text-text-quaternary mb-4\" strokeWidth={1} />\n <h2 className=\"text-lg font-medium text-text-primary mb-2\">Role not found</h2>\n </div>\n );\n }\n\n const inUse = role.user_count > 0 || role.chain_count > 0 || role.workflow_count > 0;\n const canSave = dirty && !Object.values(errors).some(Boolean);\n\n // Any two capacity settings derive the third — hint the missing one.\n const sla = parseFloat(draft.sla_minutes);\n const tph = parseFloat(draft.target_per_hour);\n const wc = parseFloat(draft.worker_count);\n const slaOk = !isNaN(sla) && sla > 0;\n const tphOk = !isNaN(tph) && tph > 0;\n const wcOk = !isNaN(wc) && wc > 0;\n const derivedCapacityHint =\n slaOk && wcOk && !tphOk ? `→ target ≈ ${(wc / (sla / 60)).toFixed(1)}/h` :\n slaOk && tphOk && !wcOk ? `→ workers ≈ ${(tph * (sla / 60)).toFixed(1)}` :\n tphOk && wcOk && !slaOk ? `→ SLA ≈ ${(wc / tph * 60).toFixed(0)}m` : null;\n\n return (\n <div>\n {/* ── Header: mirrors the three-column body grid so each section sits\n exactly atop its column — identity + ops · capacity · priority + actions ── */}\n <div className=\"grid grid-cols-3 gap-16 items-center mb-12\">\n {/* Col 1: identity, with the Ops toggle at the column's right edge */}\n <div className=\"flex items-center justify-between gap-4 min-w-0\">\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-3 mb-1\">\n <Tag className=\"w-5 h-5 text-accent\" strokeWidth={1.5} />\n <h1 className=\"text-lg font-mono font-medium text-text-primary\">{role.role}</h1>\n <button\n onClick={() => { window.location.hash = '#docs:dashboard.md:role-detail'; }}\n className=\"text-text-quaternary hover:text-accent transition-colors\"\n title=\"Open docs for this page\"\n >\n <BookOpen className=\"w-4 h-4\" strokeWidth={1.5} />\n </button>\n {role.parent_role && (\n <span className=\"flex items-center gap-1 text-[10px] text-text-quaternary font-mono\">\n <GitBranch className=\"w-3 h-3\" /> {role.parent_role}\n </span>\n )}\n </div>\n {role.title && <p className=\"text-sm text-text-secondary pl-8\">{role.title}</p>}\n </div>\n\n {/* Ops — this role is (or isn't) a station on the Pace Board */}\n <div className=\"flex items-center gap-2 shrink-0\" title=\"Show as a station on the Pace Board\">\n <span className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">Ops</span>\n <button\n onClick={() => update({ ops_visible: !draft.ops_visible })}\n className={`w-9 h-5 rounded-full transition-colors relative shrink-0 ${\n draft.ops_visible ? 'bg-accent' : 'bg-surface-border'\n }`}\n >\n <span\n className={`absolute top-[3px] left-0 w-3.5 h-3.5 rounded-full bg-white transition-transform shadow ${\n draft.ops_visible ? 'translate-x-[18px]' : 'translate-x-[3px]'\n }`}\n />\n </button>\n </div>\n </div>\n\n {/* Col 2: capacity — full column width, settings centered atop the\n column below. Any two settings derive the third. */}\n <div\n className=\"flex items-end justify-center gap-4 bg-surface-sunken rounded-lg px-4 py-2.5 w-full\"\n title=\"throughput = workers / (sla / 60)\"\n >\n {[\n { key: 'sla_minutes' as const, label: 'SLA', unit: 'min', placeholder: '30' },\n { key: 'target_per_hour' as const, label: 'Target', unit: '/h', placeholder: '20' },\n { key: 'worker_count' as const, label: 'Workers', unit: '', placeholder: '4' },\n ].map(({ key, label, unit, placeholder }) => (\n <div key={key}>\n <label className=\"block text-[9px] font-semibold uppercase tracking-widest text-text-quaternary mb-1\">\n {label}\n {unit && <span className=\"normal-case font-normal ml-1\">{unit}</span>}\n </label>\n <input\n type=\"number\"\n min=\"0\"\n step=\"any\"\n value={draft[key]}\n onChange={(e) => update({ [key]: e.target.value })}\n placeholder={placeholder}\n className=\"input text-xs w-16 font-mono\"\n />\n </div>\n ))}\n {derivedCapacityHint && (\n <span className=\"text-[10px] text-accent font-mono whitespace-nowrap pb-2\">\n {derivedCapacityHint}\n </span>\n )}\n </div>\n\n {/* Col 3: priority left-aligned to the column edge, actions at the right.\n Pending unclaimed items older than the threshold appear as the Pace\n Board priority count, ordered by the facet for the pull. */}\n <div className=\"flex items-center justify-between gap-4 min-w-0\">\n <div\n className=\"flex items-end gap-4 bg-surface-sunken rounded-lg px-4 py-2.5 shrink-0\"\n title=\"Pending unclaimed items older than the threshold count as priority on the Pace Board. Age is measured from the metadata facet (an ISO 8601 UTC timestamp, e.g. authorized_at) or from created_at when the facet is blank; the threshold falls back to SLA when blank.\"\n >\n <div>\n <label className=\"block text-[9px] font-semibold uppercase tracking-widest text-text-quaternary mb-1\">\n Priority\n <span className=\"normal-case font-normal ml-1\">min</span>\n </label>\n <input\n type=\"number\"\n min=\"0\"\n step=\"any\"\n value={draft.priority_threshold_minutes}\n onChange={(e) => update({ priority_threshold_minutes: e.target.value })}\n placeholder={draft.sla_minutes || '60'}\n className=\"input text-xs w-16 font-mono\"\n />\n </div>\n <div>\n <label className=\"block text-[9px] font-semibold uppercase tracking-widest text-text-quaternary mb-1\">\n Facet\n </label>\n <input\n type=\"text\"\n value={draft.priority_facet}\n onChange={(e) => update({ priority_facet: e.target.value })}\n placeholder=\"created_at\"\n className=\"input text-xs w-28 font-mono\"\n />\n {errors.priority_facet && (\n <p className=\"text-[9px] text-status-error mt-0.5\">{errors.priority_facet}</p>\n )}\n </div>\n </div>\n\n <div className=\"flex items-center gap-3 shrink-0\">\n {savedOk && (\n <span className=\"flex items-center gap-1 text-xs text-status-success animate-page-enter\">\n <Check className=\"w-3 h-3\" /> Saved\n </span>\n )}\n {updateRole.error && (\n <span className=\"text-xs text-status-error max-w-[180px] truncate\">\n {(updateRole.error as Error).message}\n </span>\n )}\n <button\n onClick={handleSave}\n disabled={!canSave || updateRole.isPending}\n className=\"px-3 py-1.5 text-xs rounded-md bg-accent text-text-inverse hover:bg-accent-hover transition-colors disabled:opacity-40 disabled:cursor-not-allowed\"\n >\n {updateRole.isPending ? 'Saving…' : 'Save'}\n </button>\n {!inUse && (\n <button\n onClick={() => setConfirmDelete(true)}\n className=\"px-3 py-1.5 text-xs rounded-md text-status-error/60 hover:text-status-error hover:bg-status-error/10 transition-colors flex items-center gap-1\"\n >\n <Trash2 className=\"w-3 h-3\" /> Delete\n </button>\n )}\n </div>\n </div>\n </div>\n\n {/* ── Three-column body ── */}\n <div className=\"grid grid-cols-3 gap-16 items-start\">\n\n {/* ── Col 1: Identity ── */}\n <div className=\"space-y-14\">\n\n {/* Identity */}\n <div className=\"space-y-8\">\n <SectionHead icon={Tag} color=\"text-accent\" label=\"Identity\" />\n\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1.5\">\n Display Name\n </label>\n <input\n type=\"text\"\n value={draft.title}\n onChange={(e) => update({ title: e.target.value })}\n placeholder={`e.g., ${role.role.charAt(0).toUpperCase() + role.role.slice(1)}`}\n className=\"input text-sm w-full\"\n />\n </div>\n\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1.5\">\n Description\n </label>\n <textarea\n value={draft.description}\n onChange={(e) => update({ description: e.target.value })}\n placeholder=\"A short description shown on role cards and in the operations view.\"\n rows={4}\n className=\"input text-sm w-full resize-none\"\n />\n </div>\n </div>\n\n {/* Sequence placement — only meaningful for stations, so these two\n sections follow the Ops toggle, easing in and out with it. */}\n <div\n className={`space-y-14 overflow-hidden transition-all duration-300 ease-out ${\n draft.ops_visible ? 'opacity-100 max-h-[900px]' : 'opacity-0 max-h-0 pointer-events-none'\n }`}\n aria-hidden={!draft.ops_visible}\n >\n {/* Prior Step */}\n <div className=\"space-y-5\">\n <SectionHead icon={GitBranch} color=\"text-text-tertiary\" label=\"Prior Step\" />\n <select\n value={draft.parent_role}\n onChange={(e) => update({ parent_role: e.target.value })}\n className=\"select text-sm w-full font-mono\"\n >\n <option value=\"\">None — root process</option>\n {availableParents.map((r) => (\n <option key={r.role} value={r.role}>\n {r.title ? `${r.role} — ${r.title}` : r.role}\n </option>\n ))}\n </select>\n <p className=\"text-[10px] text-text-tertiary leading-relaxed\">\n Places this role in one Pace Board sequence. A role with no prior\n step starts its own sequence.\n </p>\n </div>\n\n {/* Upstream inputs — cross-sequence graph edges, live-save */}\n <div className=\"space-y-5\">\n <SectionHead\n icon={GitMerge}\n color=\"text-text-tertiary\"\n label=\"Upstream Inputs\"\n aside={\n <div className=\"flex items-center gap-1\">\n <span className=\"w-1.5 h-1.5 rounded-full dot-ring bg-status-success\" />\n <span className=\"text-[9px] font-semibold uppercase tracking-widest text-status-success\">Live</span>\n </div>\n }\n />\n <UpstreamSection role={role} allRoles={roles} />\n </div>\n </div>\n\n </div>\n\n {/* ── Col 2: Routing & People ── */}\n <div className=\"space-y-14\">\n\n {/* Escalation targets — live */}\n <div>\n <SectionHead\n icon={Network}\n color=\"text-text-quaternary\"\n label=\"Escalation Targets\"\n aside={\n <div className=\"flex items-center gap-1\">\n <span className=\"w-1.5 h-1.5 rounded-full dot-ring bg-status-success\" />\n <span className=\"text-[9px] font-semibold uppercase tracking-widest text-status-success\">Live</span>\n </div>\n }\n />\n <EscalationSection role={role} allRoles={roles} />\n </div>\n\n {/* Members — who can see through this window, and how far */}\n <div className=\"pt-3 pb-4 border-t border-surface-border/40\">\n <SectionHead\n icon={Users}\n color=\"text-text-quaternary\"\n label=\"Members\"\n aside={\n <span className=\"text-[9px] font-normal normal-case text-text-quaternary\">\n read = what appears · write = what they can act on\n </span>\n }\n />\n <RoleMembersSection role={role.role} />\n </div>\n </div>\n\n {/* ── Col 3: Schemas & Properties ── */}\n <div className=\"space-y-14\">\n {/* Escalation Schema — versioned, edited on its own page */}\n <div>\n <SectionHead\n icon={Braces}\n color=\"text-accent\"\n label=\"Escalation Schema\"\n aside={\n role.current_schema_version != null ? (\n <span className=\"text-[9px] font-mono text-text-quaternary\">v{role.current_schema_version} in use</span>\n ) : undefined\n }\n />\n <p className=\"text-[10px] text-text-tertiary mb-3 leading-relaxed\">\n The form a person completes to resolve this role's escalations.\n Versioned — each save adds one; workflows pin any version via{' '}\n <code className=\"font-mono\">schemaVersion</code>.\n </p>\n <Link\n to={`/admin/roles/${encodeURIComponent(role.role)}/schema`}\n className=\"text-xs text-accent hover:underline\"\n >\n {role.form_schema\n ? `Open schema editor — v${role.current_schema_version ?? 1} in use →`\n : 'Define the escalation form →'}\n </Link>\n </div>\n\n {/* Metadata Schema */}\n <div>\n <SectionHead\n icon={Braces}\n color=\"text-accent\"\n label=\"Metadata Schema\"\n aside={\n !editingJson.has('metadata_schema') && role.metadata_schema ? (\n <button onClick={() => startEditingJson('metadata_schema')} className=\"text-[9px] text-accent hover:underline\">Edit</button>\n ) : undefined\n }\n />\n <p className=\"text-[10px] text-text-tertiary mb-3 leading-relaxed\">\n Validates <code className=\"font-mono\">metadata</code> at creation time. Keys appear in faceted search autocomplete.\n </p>\n {!editingJson.has('metadata_schema') && role.metadata_schema ? (\n <JsonViewer data={role.metadata_schema} />\n ) : (\n <>\n <textarea\n value={draft.metadata_schema}\n onChange={(e) => {\n const val = e.target.value;\n update({ metadata_schema: val });\n setErrors((prev) => ({ ...prev, metadata_schema: safeParseJson(val).ok ? undefined : 'Invalid JSON' }));\n }}\n rows={10}\n spellCheck={false}\n className=\"input text-xs font-mono w-full resize-y\"\n placeholder={'{\\n \"type\": \"object\",\\n \"properties\": {\\n \"order_id\": { \"type\": \"string\" }\\n },\\n \"required\": [\"order_id\"]\\n}'}\n />\n {errors.metadata_schema && <p className=\"text-[10px] text-status-error mt-1\">{errors.metadata_schema}</p>}\n </>\n )}\n </div>\n\n {/* Properties (free bag) */}\n <div>\n <SectionHead\n icon={Braces}\n color=\"text-text-quaternary\"\n label=\"Properties\"\n aside={\n !editingJson.has('properties') && role.properties && Object.keys(role.properties).length > 0 ? (\n <button onClick={() => startEditingJson('properties')} className=\"text-[9px] text-accent hover:underline\">Edit</button>\n ) : (\n <span className=\"text-[9px] font-normal normal-case text-text-quaternary\">custom JSON</span>\n )\n }\n />\n {!editingJson.has('properties') && role.properties && Object.keys(role.properties).length > 0 ? (\n <JsonViewer data={role.properties} defaultCollapsed />\n ) : (\n <>\n <textarea\n value={draft.properties}\n onChange={(e) => {\n const val = e.target.value;\n update({ properties: val });\n setErrors((prev) => ({ ...prev, properties: safeParseJson(val).ok ? undefined : 'Invalid JSON' }));\n }}\n rows={5}\n spellCheck={false}\n className=\"input text-xs font-mono w-full resize-none\"\n placeholder={'{\\n \"icon\": \"wrench\",\\n \"color\": \"#6366f1\"\\n}'}\n />\n {errors.properties && <p className=\"text-[10px] text-status-error mt-1\">{errors.properties}</p>}\n </>\n )}\n </div>\n </div>\n </div>\n\n {/* ── Delete confirmation ── */}\n <ConfirmDeleteModal\n open={confirmDelete}\n onClose={() => setConfirmDelete(false)}\n onConfirm={handleDelete}\n title=\"Delete Role\"\n description={\n <>\n Delete role <span className=\"font-medium font-mono text-text-primary\">{role.role}</span>? This cannot be undone.\n </>\n }\n isPending={deleteRole.isPending}\n error={deleteRole.error as Error | null}\n />\n </div>\n );\n}\n"],"names":["RoleMembersSection","role","data","useUsers","users","jsxDEV","u","membership","r","describeMembership","m","safePrettyPrint","value","safeParseJson","text","trimmed","parsed","SectionHead","Icon","color","label","aside","EscalationSection","allRoles","chainsData","useEscalationChains","addChain","useAddEscalationChain","removeChain","useRemoveEscalationChain","newTarget","setNewTarget","useState","chains","targets","useMemo","c","available","t","e","UpstreamSection","updateRole","useUpdateRole","newUpstream","setNewUpstream","upstreams","save","next","x","draftFrom","FACET_KEY","RoleDetailPage","roleKey","useParams","navigate","useNavigate","isLoading","useRoleDetails","deleteRole","useDeleteRole","roles","draft","setDraft","dirty","setDirty","savedOk","setSavedOk","errors","setErrors","confirmDelete","setConfirmDelete","editingJson","setEditingJson","startEditingJson","field","prev","useEffect","update","changes","d","availableParents","cur","seen","handleSave","metaResult","propsResult","facet","newErrors","parseNum","s","parseCount","handleDelete","Tag","inUse","canSave","sla","tph","wc","slaOk","tphOk","wcOk","derivedCapacityHint","BookOpen","GitBranch","key","unit","placeholder","Check","Trash2","GitMerge","Network","Users","Braces","Link","JsonViewer","Fragment","val","ConfirmDeleteModal"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{j as s}from"./index-DgCS2Frb.js";import{U as i}from"./vendor-icons-CNyYGNsk.js";function c({role:t,size:e="sm",tone:o="default"}){const l=e==="md"?"py-0.5 text-xs gap-1.5":"py-0.5 text-[10px] gap-1",n=e==="md"?"w-3 h-3":"w-2.5 h-2.5",a=o==="inherit"?"text-inherit":"text-text-secondary";return s.jsxDEV("span",{className:`inline-flex items-center ${l} ${a}`,children:[s.jsxDEV(i,{className:`${n} shrink-0 text-accent/75`},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/RolePill.tsx",lineNumber:19,columnNumber:7},this),t]},void 0,!0,{fileName:"/app/dashboard/src/components/common/display/RolePill.tsx",lineNumber:18,columnNumber:5},this)}export{c as R};
2
+ //# sourceMappingURL=RolePill-BAeaQUXX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RolePill-BAeaQUXX.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 /** `default` uses secondary text; `inherit` takes the surrounding text colour. */\n tone?: 'default' | 'inherit';\n}\n\nexport function RolePill({ role, size = 'sm', tone = 'default' }: RolePillProps) {\n const sizeClass = size === 'md'\n ? 'py-0.5 text-xs gap-1.5'\n : 'py-0.5 text-[10px] gap-1';\n const iconClass = size === 'md' ? 'w-3 h-3' : 'w-2.5 h-2.5';\n const colorClass = tone === 'inherit' ? 'text-inherit' : 'text-text-secondary';\n\n return (\n <span className={`inline-flex items-center ${sizeClass} ${colorClass}`}>\n <User className={`${iconClass} shrink-0 text-accent/75`} />\n {role}\n </span>\n );\n}\n"],"names":["RolePill","role","size","tone","sizeClass","iconClass","colorClass","jsxDEV","User"],"mappings":"uFASO,SAASA,EAAS,CAAE,KAAAC,EAAM,KAAAC,EAAO,KAAM,KAAAC,EAAO,WAA4B,CAC/E,MAAMC,EAAYF,IAAS,KACvB,yBACA,2BACEG,EAAYH,IAAS,KAAO,UAAY,cACxCI,EAAaH,IAAS,UAAY,eAAiB,sBAEzD,gBACG,OAAA,CAAK,UAAW,4BAA4BC,CAAS,IAAIE,CAAU,GAClE,SAAA,CAAAC,SAACC,EAAA,CAAK,UAAW,GAAGH,CAAS,0BAAA,EAA7B,OAAA,GAAA,CAAA,SAAA,4DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAyD,EACxDJ,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-DgCS2Frb.js";import{a as u}from"./vendor-query-DLp59M9_.js";import{d as P,b as V,e as C}from"./roles-CpRcUIMm.js";import{P as y}from"./PageHeader-DcgGV0Y2.js";import{M as w}from"./Modal-C6HI6btY.js";import{ag as $}from"./vendor-icons-CNyYGNsk.js";import{c as k,L}from"./vendor-react-zA2lQFDs.js";function _({open:s,onClose:o}){const t=P(),[r,b]=u.useState(""),[N,i]=u.useState(s);s!==N&&(i(s),s&&(b(""),t.reset()));const h=()=>{const l=r.trim().toLowerCase();l&&t.mutate(l,{onSuccess:o})};return e.jsxDEV(w,{open:s,onClose:o,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:r,onChange:l=>b(l.target.value),placeholder:"e.g., reviewer",className:"input text-xs w-full",onKeyDown:l=>{l.key==="Enter"&&h()}},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),t.error&&e.jsxDEV("p",{className:"text-xs text-status-error",children:t.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:o,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:h,disabled:!r.trim()||t.isPending,className:"btn-primary text-xs",children:t.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)}const D="176px 160px 1fr 130px 160px 88px 204px",d="text-text-secondary transition-colors group-hover/row:text-text-primary",n="text-[9px] font-semibold uppercase tracking-widest text-text-quaternary",v=`${n} text-right flex-1 min-w-0`,c="py-2",p="py-2.5";function M(){return e.jsxDEV("div",{className:"grid gap-4 px-3 border-b border-surface-border bg-surface",style:{gridTemplateColumns:D},children:[e.jsxDEV("span",{className:`${n} ${c} flex items-center pl-[18px]`,children:"Role"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:30,columnNumber:7},this),e.jsxDEV("span",{className:`${n} ${c} flex items-center`,children:"Label"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:31,columnNumber:7},this),e.jsxDEV("span",{className:`${n} ${c} flex items-center`,children:"Description"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:32,columnNumber:7},this),e.jsxDEV("span",{className:`${n} ${c} flex items-center`,children:"Preceded By"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:33,columnNumber:7},this),e.jsxDEV("span",{className:`${n} ${c} flex items-center`,children:"Escalates To"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:34,columnNumber:7},this),e.jsxDEV("span",{className:`${n} ${c} flex items-center justify-end`,children:"Member Count"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:35,columnNumber:7},this),e.jsxDEV("div",{className:"flex gap-3 items-center bg-surface-sunken px-3",children:[e.jsxDEV("span",{className:v,children:"SLA/M"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:38,columnNumber:9},this),e.jsxDEV("span",{className:v,children:"Target/h"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:39,columnNumber:9},this),e.jsxDEV("span",{className:v,children:"Staff"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:40,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:37,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:26,columnNumber:5},this)}const R="text-[11px] tabular-nums text-right flex-1 min-w-0 transition-colors";function S({role:s,targets:o,onClick:t}){return e.jsxDEV("div",{role:"button",tabIndex:0,onClick:t,onKeyDown:r=>{(r.key==="Enter"||r.key===" ")&&t()},className:"grid gap-4 px-3 cursor-pointer group/row",style:{gridTemplateColumns:D},children:[e.jsxDEV("div",{className:`flex items-center gap-2.5 min-w-0 ${p}`,children:[e.jsxDEV("span",{className:`w-2 h-2 rounded-full dot-ring shrink-0 ${s.ops_visible?"bg-status-success":"bg-surface-border"}`,title:s.ops_visible?"Visible in Operations":"Enable in role settings to show in Operations"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:71,columnNumber:9},this),e.jsxDEV("span",{className:`text-[11px] truncate ${d}`,children:s.role},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:75,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:70,columnNumber:7},this),e.jsxDEV("span",{className:`flex items-center text-[11px] truncate ${p} ${d}`,children:s.title??""},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:81,columnNumber:7},this),e.jsxDEV("span",{className:`flex items-center text-[10px] text-text-tertiary truncate ${p} transition-colors group-hover/row:text-text-secondary`,children:s.description??""},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:86,columnNumber:7},this),e.jsxDEV("div",{className:`flex items-center min-w-0 ${p}`,onClick:r=>r.stopPropagation(),children:s.parent_role&&e.jsxDEV(L,{to:`/admin/roles/${encodeURIComponent(s.parent_role)}`,className:"text-[9px] text-text-quaternary bg-surface-sunken px-1.5 py-0.5 rounded font-mono transition-colors hover:text-text-secondary hover:bg-surface-border/40",children:s.parent_role},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:93,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:91,columnNumber:7},this),e.jsxDEV("div",{className:`flex items-center flex-wrap gap-1 min-w-0 ${p}`,children:o.map(r=>e.jsxDEV("span",{className:"text-[9px] text-text-quaternary bg-surface-sunken px-1.5 py-0.5 rounded font-mono transition-colors group-hover/row:text-text-secondary",children:r},r,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:105,columnNumber:11},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:103,columnNumber:7},this),e.jsxDEV("span",{className:`flex items-center justify-end text-[11px] tabular-nums ${p} transition-colors ${d}`,children:s.user_count>0?s.user_count:""},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:116,columnNumber:7},this),e.jsxDEV("div",{className:"flex gap-3 items-center bg-surface-sunken px-3",children:[e.jsxDEV("span",{className:`${R} ${d}`,children:s.sla_minutes??""},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:122,columnNumber:9},this),e.jsxDEV("span",{className:`${R} ${d}`,children:s.target_per_hour??""},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:125,columnNumber:9},this),e.jsxDEV("span",{className:`${R} ${d}`,children:s.worker_count??""},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:128,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:121,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:61,columnNumber:5},this)}function B(){const s=k(),{data:o,isLoading:t}=V(),{data:r}=C(),[b,N]=u.useState(!1),[i,h]=u.useState(""),l=(o==null?void 0:o.roles)??[],E=(r==null?void 0:r.chains)??[],j=u.useMemo(()=>{const a=new Map;for(const{source_role:m,target_role:f}of E){const g=a.get(m)??[];a.set(m,[...g,f])}return a},[E]),x=u.useMemo(()=>{if(!i.trim())return l;const a=i.toLowerCase();return l.filter(m=>{var f,g;return m.role.toLowerCase().includes(a)||((f=m.title)==null?void 0:f.toLowerCase().includes(a))||((g=m.description)==null?void 0:g.toLowerCase().includes(a))})},[l,i]);return e.jsxDEV("div",{children:[e.jsxDEV(y,{title:"Roles",docsHash:"#docs:dashboard.md:roles",actions:e.jsxDEV("button",{onClick:()=>N(!0),className:"btn-primary text-xs flex items-center gap-1.5",children:"+ Add Role"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:175,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:171,columnNumber:7},this),!t&&l.length>0&&e.jsxDEV("div",{className:"sticky top-0 z-20 bg-surface pt-3",children:[e.jsxDEV("div",{className:"bg-surface-sunken rounded-lg px-5 py-3 mb-3 flex items-center gap-3",children:[e.jsxDEV($,{className:"w-3 h-3 text-text-quaternary shrink-0"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:188,columnNumber:13},this),e.jsxDEV("input",{type:"text",value:i,onChange:a=>h(a.target.value),placeholder:`Search ${l.length} roles…`,className:"w-[150px] py-0.5 text-sm bg-transparent border-b border-surface-border/60 text-text-primary placeholder:text-text-quaternary focus:outline-none focus:border-accent/50 transition-colors"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:189,columnNumber:13},this),i&&x.length!==l.length&&e.jsxDEV("span",{className:"text-[10px] text-text-quaternary tabular-nums shrink-0",children:[x.length," of ",l.length]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:197,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:187,columnNumber:11},this),x.length>0&&e.jsxDEV(M,{},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:202,columnNumber:35},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:186,columnNumber:9},this),t?e.jsxDEV("div",{className:"animate-pulse space-y-3 mt-6",children:[1,2,3,4,5].map(a=>e.jsxDEV("div",{className:"h-10 bg-surface-sunken rounded w-full"},a,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:210,columnNumber:13},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:208,columnNumber:9},this):x.length===0?e.jsxDEV("p",{className:"text-sm text-text-tertiary mt-8",children:i?"Clear the search to see all roles.":"Create a role to get started."},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:214,columnNumber:9},this):e.jsxDEV(e.Fragment,{children:e.jsxDEV("div",{className:"divide-y divide-surface-border/30",children:x.map(a=>e.jsxDEV(S,{role:a,targets:j.get(a.role)??[],onClick:()=>s(`/admin/roles/${encodeURIComponent(a.role)}`)},a.role,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:221,columnNumber:15},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:219,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:218,columnNumber:9},this),e.jsxDEV(_,{open:b,onClose:()=>N(!1)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:232,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:170,columnNumber:5},this)}export{B as RolesPage};
2
+ //# sourceMappingURL=RolesPage-BI1Xtqq_.js.map