@hotmeshio/long-tail 0.8.0 → 0.8.2

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 (256) hide show
  1. package/dashboard/dist/assets/{AdminDashboard-9JLg41f-.js → AdminDashboard-Nvja-XIJ.js} +2 -2
  2. package/dashboard/dist/assets/{AdminDashboard-9JLg41f-.js.map → AdminDashboard-Nvja-XIJ.js.map} +1 -1
  3. package/dashboard/dist/assets/AgentConfigPage-Sf2god7q.js +16 -0
  4. package/dashboard/dist/assets/AgentConfigPage-Sf2god7q.js.map +1 -0
  5. package/dashboard/dist/assets/AgentDetailPage-DtgDeZJR.js +4 -0
  6. package/dashboard/dist/assets/AgentDetailPage-DtgDeZJR.js.map +1 -0
  7. package/dashboard/dist/assets/AgentsPage-C6zqP_xC.js +2 -0
  8. package/dashboard/dist/assets/AgentsPage-C6zqP_xC.js.map +1 -0
  9. package/dashboard/dist/assets/{AvailableEscalationsPage-CoZ4Lufr.js → AvailableEscalationsPage-D61kC7Is.js} +2 -2
  10. package/dashboard/dist/assets/{AvailableEscalationsPage-CoZ4Lufr.js.map → AvailableEscalationsPage-D61kC7Is.js.map} +1 -1
  11. package/dashboard/dist/assets/{BotPicker-xGUCxJo-.js → BotPicker-ChgljKHj.js} +2 -2
  12. package/dashboard/dist/assets/{BotPicker-xGUCxJo-.js.map → BotPicker-ChgljKHj.js.map} +1 -1
  13. package/dashboard/dist/assets/CapabilitiesPage-DeybKoZM.js +2 -0
  14. package/dashboard/dist/assets/CapabilitiesPage-DeybKoZM.js.map +1 -0
  15. package/dashboard/dist/assets/{CollapsibleSection-CXMPecjj.js → CollapsibleSection-BPiTuPBk.js} +2 -2
  16. package/dashboard/dist/assets/{CollapsibleSection-CXMPecjj.js.map → CollapsibleSection-BPiTuPBk.js.map} +1 -1
  17. package/dashboard/dist/assets/CredentialsPage-DXOcPWtd.js +2 -0
  18. package/dashboard/dist/assets/CredentialsPage-DXOcPWtd.js.map +1 -0
  19. package/dashboard/dist/assets/CronLabel-D3411N8x.js +2 -0
  20. package/dashboard/dist/assets/CronLabel-D3411N8x.js.map +1 -0
  21. package/dashboard/dist/assets/{CustomDurationPicker-id6Tq64R.js → CustomDurationPicker-WG2tPSbV.js} +2 -2
  22. package/dashboard/dist/assets/{CustomDurationPicker-id6Tq64R.js.map → CustomDurationPicker-WG2tPSbV.js.map} +1 -1
  23. package/dashboard/dist/assets/{DropZone-CZDmNBn-.js → DropZone-SgiK1WOl.js} +2 -2
  24. package/dashboard/dist/assets/{DropZone-CZDmNBn-.js.map → DropZone-SgiK1WOl.js.map} +1 -1
  25. package/dashboard/dist/assets/{ElapsedCell-B8TrnyT5.js → ElapsedCell-BFWEGSD7.js} +2 -2
  26. package/dashboard/dist/assets/{ElapsedCell-B8TrnyT5.js.map → ElapsedCell-BFWEGSD7.js.map} +1 -1
  27. package/dashboard/dist/assets/EscalationSchemaPage-D2Y5Yeqn.js +9 -0
  28. package/dashboard/dist/assets/EscalationSchemaPage-D2Y5Yeqn.js.map +1 -0
  29. package/dashboard/dist/assets/{EscalationsOverview-CjLyujJ3.js → EscalationsOverview-VlLcX2YM.js} +2 -2
  30. package/dashboard/dist/assets/{EscalationsOverview-CjLyujJ3.js.map → EscalationsOverview-VlLcX2YM.js.map} +1 -1
  31. package/dashboard/dist/assets/EventTable-3MJw14jp.js +2 -0
  32. package/dashboard/dist/assets/EventTable-3MJw14jp.js.map +1 -0
  33. package/dashboard/dist/assets/FilterBar-B4Mk2PvT.js +2 -0
  34. package/dashboard/dist/assets/FilterBar-B4Mk2PvT.js.map +1 -0
  35. package/dashboard/dist/assets/GraphInvokePage-QaUUrPnh.js +2 -0
  36. package/dashboard/dist/assets/GraphInvokePage-QaUUrPnh.js.map +1 -0
  37. package/dashboard/dist/assets/HomePage-Br0A3iOp.js +2 -0
  38. package/dashboard/dist/assets/HomePage-Br0A3iOp.js.map +1 -0
  39. package/dashboard/dist/assets/{ListToolbar--FkPpYDY.js → ListToolbar-d4MGQefV.js} +2 -2
  40. package/dashboard/dist/assets/{ListToolbar--FkPpYDY.js.map → ListToolbar-d4MGQefV.js.map} +1 -1
  41. package/dashboard/dist/assets/{McpOverview-CtAFXv-T.js → McpOverview-CUzJD5Z5.js} +2 -2
  42. package/dashboard/dist/assets/{McpOverview-CtAFXv-T.js.map → McpOverview-CUzJD5Z5.js.map} +1 -1
  43. package/dashboard/dist/assets/McpQueryDetailPage-pYSZmV3M.js +5 -0
  44. package/dashboard/dist/assets/McpQueryDetailPage-pYSZmV3M.js.map +1 -0
  45. package/dashboard/dist/assets/McpQueryPage-CA5C5dss.js +2 -0
  46. package/dashboard/dist/assets/McpQueryPage-CA5C5dss.js.map +1 -0
  47. package/dashboard/dist/assets/{McpRunDetailPage-BYIxBcA7.js → McpRunDetailPage-CrRkXwAe.js} +2 -2
  48. package/dashboard/dist/assets/{McpRunDetailPage-BYIxBcA7.js.map → McpRunDetailPage-CrRkXwAe.js.map} +1 -1
  49. package/dashboard/dist/assets/McpRunsPage-BqRBDbkn.js +2 -0
  50. package/dashboard/dist/assets/McpRunsPage-BqRBDbkn.js.map +1 -0
  51. package/dashboard/dist/assets/{NamespacePill-DlqBTvFR.js → NamespacePill-SErKwgkb.js} +2 -2
  52. package/dashboard/dist/assets/{NamespacePill-DlqBTvFR.js.map → NamespacePill-SErKwgkb.js.map} +1 -1
  53. package/dashboard/dist/assets/OperationsPage--uVJxzmP.js +2 -0
  54. package/dashboard/dist/assets/OperationsPage--uVJxzmP.js.map +1 -0
  55. package/dashboard/dist/assets/{OperatorDashboard-DMQwodfo.js → OperatorDashboard-D-UMrTqI.js} +2 -2
  56. package/dashboard/dist/assets/{OperatorDashboard-DMQwodfo.js.map → OperatorDashboard-D-UMrTqI.js.map} +1 -1
  57. package/dashboard/dist/assets/{PageHeader-CFta2VaS.js → PageHeader-DJo7yMUR.js} +2 -2
  58. package/dashboard/dist/assets/{PageHeader-CFta2VaS.js.map → PageHeader-DJo7yMUR.js.map} +1 -1
  59. package/dashboard/dist/assets/{PageHeaderWithStats-CcVAji-7.js → PageHeaderWithStats-W3akV6nB.js} +2 -2
  60. package/dashboard/dist/assets/{PageHeaderWithStats-CcVAji-7.js.map → PageHeaderWithStats-W3akV6nB.js.map} +1 -1
  61. package/dashboard/dist/assets/ProcessDetailPage-BV6D_wuR.js +2 -0
  62. package/dashboard/dist/assets/ProcessDetailPage-BV6D_wuR.js.map +1 -0
  63. package/dashboard/dist/assets/{ProcessesListPage-BVtkWVLY.js → ProcessesListPage-BAalEHpx.js} +2 -2
  64. package/dashboard/dist/assets/{ProcessesListPage-BVtkWVLY.js.map → ProcessesListPage-BAalEHpx.js.map} +1 -1
  65. package/dashboard/dist/assets/RoleDetailPage-ClE7rUoo.js +11 -0
  66. package/dashboard/dist/assets/RoleDetailPage-ClE7rUoo.js.map +1 -0
  67. package/dashboard/dist/assets/RolePill-DHWixsQR.js +2 -0
  68. package/dashboard/dist/assets/RolePill-DHWixsQR.js.map +1 -0
  69. package/dashboard/dist/assets/RolesPage-DMsgZioQ.js +2 -0
  70. package/dashboard/dist/assets/RolesPage-DMsgZioQ.js.map +1 -0
  71. package/dashboard/dist/assets/{RunAsSelector-Cc1i017Z.js → RunAsSelector-VCnEYIwj.js} +2 -2
  72. package/dashboard/dist/assets/{RunAsSelector-Cc1i017Z.js.map → RunAsSelector-VCnEYIwj.js.map} +1 -1
  73. package/dashboard/dist/assets/StatCard-DrdlUeQz.js +2 -0
  74. package/dashboard/dist/assets/StatCard-DrdlUeQz.js.map +1 -0
  75. package/dashboard/dist/assets/{StatusBadge-D9MeQHrh.js → StatusBadge-DZ9137bI.js} +2 -2
  76. package/dashboard/dist/assets/{StatusBadge-D9MeQHrh.js.map → StatusBadge-DZ9137bI.js.map} +1 -1
  77. package/dashboard/dist/assets/{StickyPagination-GQKFFTjL.js → StickyPagination-3eCY2-_V.js} +2 -2
  78. package/dashboard/dist/assets/{StickyPagination-GQKFFTjL.js.map → StickyPagination-3eCY2-_V.js.map} +1 -1
  79. package/dashboard/dist/assets/{StreamMessageDetail-BYzfjWe_.js → StreamMessageDetail-70kDFH4o.js} +2 -2
  80. package/dashboard/dist/assets/StreamMessageDetail-70kDFH4o.js.map +1 -0
  81. package/dashboard/dist/assets/{SwimlaneTimeline-DLVmRrd-.js → SwimlaneTimeline-BOXRit6t.js} +2 -2
  82. package/dashboard/dist/assets/SwimlaneTimeline-BOXRit6t.js.map +1 -0
  83. package/dashboard/dist/assets/{TagInput-CQg-TrV9.js → TagInput-CGGC3DTR.js} +2 -2
  84. package/dashboard/dist/assets/{TagInput-CQg-TrV9.js.map → TagInput-CGGC3DTR.js.map} +1 -1
  85. package/dashboard/dist/assets/{TaskDetailPage-HzQpzp6D.js → TaskDetailPage-YxGQE9Qg.js} +2 -2
  86. package/dashboard/dist/assets/{TaskDetailPage-HzQpzp6D.js.map → TaskDetailPage-YxGQE9Qg.js.map} +1 -1
  87. package/dashboard/dist/assets/{TaskQueuePill-DyvtL8X4.js → TaskQueuePill-D6omQJNY.js} +2 -2
  88. package/dashboard/dist/assets/{TaskQueuePill-DyvtL8X4.js.map → TaskQueuePill-D6omQJNY.js.map} +1 -1
  89. package/dashboard/dist/assets/{TasksListPage-DpqevgTz.js → TasksListPage-DuLJQN7Q.js} +2 -2
  90. package/dashboard/dist/assets/{TasksListPage-DpqevgTz.js.map → TasksListPage-DuLJQN7Q.js.map} +1 -1
  91. package/dashboard/dist/assets/{TimeAgo-CftB8aJE.js → TimeAgo-dnc1ZjKc.js} +2 -2
  92. package/dashboard/dist/assets/{TimeAgo-CftB8aJE.js.map → TimeAgo-dnc1ZjKc.js.map} +1 -1
  93. package/dashboard/dist/assets/{TimestampCell-BSKj1jqT.js → TimestampCell-CDR6cTyq.js} +2 -2
  94. package/dashboard/dist/assets/{TimestampCell-BSKj1jqT.js.map → TimestampCell-CDR6cTyq.js.map} +1 -1
  95. package/dashboard/dist/assets/{ToolPill-miuRcj1Q.js → ToolPill-BW0iRwZu.js} +2 -2
  96. package/dashboard/dist/assets/{ToolPill-miuRcj1Q.js.map → ToolPill-BW0iRwZu.js.map} +1 -1
  97. package/dashboard/dist/assets/{ToolTestPanel-DVQICZUQ.js → ToolTestPanel-CfwGdRdz.js} +2 -2
  98. package/dashboard/dist/assets/{ToolTestPanel-DVQICZUQ.js.map → ToolTestPanel-CfwGdRdz.js.map} +1 -1
  99. package/dashboard/dist/assets/TopicDetailPage-f2qaeGFz.js +9 -0
  100. package/dashboard/dist/assets/TopicDetailPage-f2qaeGFz.js.map +1 -0
  101. package/dashboard/dist/assets/TopicsPage-CwYdVmyK.js +2 -0
  102. package/dashboard/dist/assets/TopicsPage-CwYdVmyK.js.map +1 -0
  103. package/dashboard/dist/assets/{UserName-Ce9gvlT5.js → UserName-CRE7EZPU.js} +2 -2
  104. package/dashboard/dist/assets/{UserName-Ce9gvlT5.js.map → UserName-CRE7EZPU.js.map} +1 -1
  105. package/dashboard/dist/assets/{WorkflowExecutionPage-BI9NzeaH.js → WorkflowExecutionPage-BjNBu-Zt.js} +2 -2
  106. package/dashboard/dist/assets/{WorkflowExecutionPage-BI9NzeaH.js.map → WorkflowExecutionPage-BjNBu-Zt.js.map} +1 -1
  107. package/dashboard/dist/assets/WorkflowPill-BtNBSplz.js +2 -0
  108. package/dashboard/dist/assets/WorkflowPill-BtNBSplz.js.map +1 -0
  109. package/dashboard/dist/assets/WorkflowsDashboard-DfpvbzNt.js +2 -0
  110. package/dashboard/dist/assets/WorkflowsDashboard-DfpvbzNt.js.map +1 -0
  111. package/dashboard/dist/assets/{WorkflowsOverview-CjBWlwlH.js → WorkflowsOverview-BwD2lQwj.js} +2 -2
  112. package/dashboard/dist/assets/{WorkflowsOverview-CjBWlwlH.js.map → WorkflowsOverview-BwD2lQwj.js.map} +1 -1
  113. package/dashboard/dist/assets/{YamlWorkflowDetailPage-Ds5o1UK9.js → YamlWorkflowDetailPage-BhHb7j2s.js} +3 -3
  114. package/dashboard/dist/assets/{YamlWorkflowDetailPage-Ds5o1UK9.js.map → YamlWorkflowDetailPage-BhHb7j2s.js.map} +1 -1
  115. package/dashboard/dist/assets/YamlWorkflowsPage-SBRpY2dI.js +2 -0
  116. package/dashboard/dist/assets/YamlWorkflowsPage-SBRpY2dI.js.map +1 -0
  117. package/dashboard/dist/assets/{agents-A1U43853.js → agents-VbkdqWCr.js} +2 -2
  118. package/dashboard/dist/assets/{agents-A1U43853.js.map → agents-VbkdqWCr.js.map} +1 -1
  119. package/dashboard/dist/assets/{bots-CyzN6Uxi.js → bots-CsgYcYU_.js} +2 -2
  120. package/dashboard/dist/assets/{bots-CyzN6Uxi.js.map → bots-CsgYcYU_.js.map} +1 -1
  121. package/dashboard/dist/assets/{capabilities-BE1X5FVI.js → capabilities-CMhFyoDl.js} +2 -2
  122. package/dashboard/dist/assets/{capabilities-BE1X5FVI.js.map → capabilities-CMhFyoDl.js.map} +1 -1
  123. package/dashboard/dist/assets/{controlplane-BrwK_MT8.js → controlplane-BstXtPbV.js} +2 -2
  124. package/dashboard/dist/assets/{controlplane-BrwK_MT8.js.map → controlplane-BstXtPbV.js.map} +1 -1
  125. package/dashboard/dist/assets/{escalation-DDdt7UdU.js → escalation-C0BNAeIG.js} +2 -2
  126. package/dashboard/dist/assets/{escalation-DDdt7UdU.js.map → escalation-C0BNAeIG.js.map} +1 -1
  127. package/dashboard/dist/assets/escalation-columns-DajPgfuV.js +2 -0
  128. package/dashboard/dist/assets/escalation-columns-DajPgfuV.js.map +1 -0
  129. package/dashboard/dist/assets/index-BWLVqWLU.js +2 -0
  130. package/dashboard/dist/assets/index-BWLVqWLU.js.map +1 -0
  131. package/dashboard/dist/assets/index-BY5m8rhE.js +2 -0
  132. package/dashboard/dist/assets/index-BY5m8rhE.js.map +1 -0
  133. package/dashboard/dist/assets/{index-CGUBekEU.js → index-BYf0oNSQ.js} +2 -2
  134. package/dashboard/dist/assets/{index-CGUBekEU.js.map → index-BYf0oNSQ.js.map} +1 -1
  135. package/dashboard/dist/assets/index-BcaQ_hCz.js +9 -0
  136. package/dashboard/dist/assets/index-BcaQ_hCz.js.map +1 -0
  137. package/dashboard/dist/assets/index-BdqKh0UK.css +1 -0
  138. package/dashboard/dist/assets/{index-CKXSKsVZ.js → index-C8k3Z2su.js} +22 -22
  139. package/dashboard/dist/assets/index-C8k3Z2su.js.map +1 -0
  140. package/dashboard/dist/assets/index-CSixdp5W.js +2 -0
  141. package/dashboard/dist/assets/index-CSixdp5W.js.map +1 -0
  142. package/dashboard/dist/assets/{index-BNWKksZ6.js → index-CXnSqSFH.js} +2 -2
  143. package/dashboard/dist/assets/{index-BNWKksZ6.js.map → index-CXnSqSFH.js.map} +1 -1
  144. package/dashboard/dist/assets/{index-BtrNxebh.js → index-CaSMWhLU.js} +2 -2
  145. package/dashboard/dist/assets/{index-BtrNxebh.js.map → index-CaSMWhLU.js.map} +1 -1
  146. package/dashboard/dist/assets/index-Cl1vY8Lg.js +2 -0
  147. package/dashboard/dist/assets/index-Cl1vY8Lg.js.map +1 -0
  148. package/dashboard/dist/assets/{index-NnGsWGNS.js → index-CvFQtPWA.js} +2 -2
  149. package/dashboard/dist/assets/{index-NnGsWGNS.js.map → index-CvFQtPWA.js.map} +1 -1
  150. package/dashboard/dist/assets/index-DWlPFH3T.js +6 -0
  151. package/dashboard/dist/assets/index-DWlPFH3T.js.map +1 -0
  152. package/dashboard/dist/assets/{index-C-rJQ-vB.js → index-D_6JFBiM.js} +2 -2
  153. package/dashboard/dist/assets/{index-C-rJQ-vB.js.map → index-D_6JFBiM.js.map} +1 -1
  154. package/dashboard/dist/assets/{index-D4U--3Xo.js → index-fqU_l4dC.js} +2 -2
  155. package/dashboard/dist/assets/{index-D4U--3Xo.js.map → index-fqU_l4dC.js.map} +1 -1
  156. package/dashboard/dist/assets/{knowledge-B3ZIRTeu.js → knowledge-Bskl1MbC.js} +2 -2
  157. package/dashboard/dist/assets/{knowledge-B3ZIRTeu.js.map → knowledge-Bskl1MbC.js.map} +1 -1
  158. package/dashboard/dist/assets/{mcp-BJjWiHdc.js → mcp-C_qz25AB.js} +2 -2
  159. package/dashboard/dist/assets/{mcp-BJjWiHdc.js.map → mcp-C_qz25AB.js.map} +1 -1
  160. package/dashboard/dist/assets/{mcp-query-ksjBztwq.js → mcp-query-CJx58s1A.js} +2 -2
  161. package/dashboard/dist/assets/{mcp-query-ksjBztwq.js.map → mcp-query-CJx58s1A.js.map} +1 -1
  162. package/dashboard/dist/assets/{pipelines-DT1astmP.js → pipelines-B6GzpgtG.js} +2 -2
  163. package/dashboard/dist/assets/{pipelines-DT1astmP.js.map → pipelines-B6GzpgtG.js.map} +1 -1
  164. package/dashboard/dist/assets/roles-D8lPvFgG.js +2 -0
  165. package/dashboard/dist/assets/{roles-UboiQxXT.js.map → roles-D8lPvFgG.js.map} +1 -1
  166. package/dashboard/dist/assets/tasks-BWHakSYf.js +2 -0
  167. package/dashboard/dist/assets/{tasks-aL0K8WW3.js.map → tasks-BWHakSYf.js.map} +1 -1
  168. package/dashboard/dist/assets/{topics-CZO06VJl.js → topics-0dXzPX8t.js} +2 -2
  169. package/dashboard/dist/assets/{topics-CZO06VJl.js.map → topics-0dXzPX8t.js.map} +1 -1
  170. package/dashboard/dist/assets/{useEventHooks-DlWkui_n.js → useEventHooks-Dpixlgp-.js} +2 -2
  171. package/dashboard/dist/assets/{useEventHooks-DlWkui_n.js.map → useEventHooks-Dpixlgp-.js.map} +1 -1
  172. package/dashboard/dist/assets/{useNamespace-BBzCmCIN.js → useNamespace-DQMc77ok.js} +2 -2
  173. package/dashboard/dist/assets/{useNamespace-BBzCmCIN.js.map → useNamespace-DQMc77ok.js.map} +1 -1
  174. package/dashboard/dist/assets/{useYamlActivityEvents-ZS6wRSSc.js → useYamlActivityEvents-DO5bHOVE.js} +2 -2
  175. package/dashboard/dist/assets/{useYamlActivityEvents-ZS6wRSSc.js.map → useYamlActivityEvents-DO5bHOVE.js.map} +1 -1
  176. package/dashboard/dist/assets/{users-Dzh04pRB.js → users-B_LVbnUk.js} +2 -2
  177. package/dashboard/dist/assets/{users-Dzh04pRB.js.map → users-B_LVbnUk.js.map} +1 -1
  178. package/dashboard/dist/assets/{vendor-icons-BaQqUm-e.js → vendor-icons-DOIDKgo6.js} +115 -120
  179. package/dashboard/dist/assets/{vendor-icons-BaQqUm-e.js.map → vendor-icons-DOIDKgo6.js.map} +1 -1
  180. package/dashboard/dist/assets/{workflows-BTkHs6VT.js → workflows-WmmGDAvo.js} +2 -2
  181. package/dashboard/dist/assets/{workflows-BTkHs6VT.js.map → workflows-WmmGDAvo.js.map} +1 -1
  182. package/dashboard/dist/assets/{yaml-workflows-Df8u3lgx.js → yaml-workflows-BS7KHhU1.js} +2 -2
  183. package/dashboard/dist/assets/{yaml-workflows-Df8u3lgx.js.map → yaml-workflows-BS7KHhU1.js.map} +1 -1
  184. package/dashboard/dist/index.html +3 -3
  185. package/docs/dashboard.md +58 -42
  186. package/package.json +1 -1
  187. package/dashboard/dist/assets/AgentConfigPage-D5P1hcOc.js +0 -16
  188. package/dashboard/dist/assets/AgentConfigPage-D5P1hcOc.js.map +0 -1
  189. package/dashboard/dist/assets/AgentDetailPage-DrijeAV8.js +0 -4
  190. package/dashboard/dist/assets/AgentDetailPage-DrijeAV8.js.map +0 -1
  191. package/dashboard/dist/assets/AgentsPage-BW5d0JOt.js +0 -2
  192. package/dashboard/dist/assets/AgentsPage-BW5d0JOt.js.map +0 -1
  193. package/dashboard/dist/assets/CapabilitiesPage-ChaRJiyg.js +0 -2
  194. package/dashboard/dist/assets/CapabilitiesPage-ChaRJiyg.js.map +0 -1
  195. package/dashboard/dist/assets/CredentialsPage-BbdfZh1D.js +0 -2
  196. package/dashboard/dist/assets/CredentialsPage-BbdfZh1D.js.map +0 -1
  197. package/dashboard/dist/assets/CronLabel-CJUL50eO.js +0 -2
  198. package/dashboard/dist/assets/CronLabel-CJUL50eO.js.map +0 -1
  199. package/dashboard/dist/assets/EscalationSchemaPage-C6UuZgCD.js +0 -9
  200. package/dashboard/dist/assets/EscalationSchemaPage-C6UuZgCD.js.map +0 -1
  201. package/dashboard/dist/assets/EventTable-D_rNmyGG.js +0 -2
  202. package/dashboard/dist/assets/EventTable-D_rNmyGG.js.map +0 -1
  203. package/dashboard/dist/assets/FilterBar-BQ2JGg8U.js +0 -2
  204. package/dashboard/dist/assets/FilterBar-BQ2JGg8U.js.map +0 -1
  205. package/dashboard/dist/assets/GraphInvokePage-BMyrTnI6.js +0 -2
  206. package/dashboard/dist/assets/GraphInvokePage-BMyrTnI6.js.map +0 -1
  207. package/dashboard/dist/assets/HomePage-MBv6pwk4.js +0 -2
  208. package/dashboard/dist/assets/HomePage-MBv6pwk4.js.map +0 -1
  209. package/dashboard/dist/assets/McpQueryDetailPage-5Jzz2q2g.js +0 -5
  210. package/dashboard/dist/assets/McpQueryDetailPage-5Jzz2q2g.js.map +0 -1
  211. package/dashboard/dist/assets/McpQueryPage-DveeRF5I.js +0 -2
  212. package/dashboard/dist/assets/McpQueryPage-DveeRF5I.js.map +0 -1
  213. package/dashboard/dist/assets/McpRunsPage-Cgke6ask.js +0 -2
  214. package/dashboard/dist/assets/McpRunsPage-Cgke6ask.js.map +0 -1
  215. package/dashboard/dist/assets/OperationsPage-D2i7xrAI.js +0 -2
  216. package/dashboard/dist/assets/OperationsPage-D2i7xrAI.js.map +0 -1
  217. package/dashboard/dist/assets/ProcessDetailPage-Dodrk5-z.js +0 -2
  218. package/dashboard/dist/assets/ProcessDetailPage-Dodrk5-z.js.map +0 -1
  219. package/dashboard/dist/assets/RoleDetailPage-8NldZI49.js +0 -11
  220. package/dashboard/dist/assets/RoleDetailPage-8NldZI49.js.map +0 -1
  221. package/dashboard/dist/assets/RolePill-CXEyPMqb.js +0 -2
  222. package/dashboard/dist/assets/RolePill-CXEyPMqb.js.map +0 -1
  223. package/dashboard/dist/assets/RolesPage-BJBjtFNY.js +0 -2
  224. package/dashboard/dist/assets/RolesPage-BJBjtFNY.js.map +0 -1
  225. package/dashboard/dist/assets/StatCard-DlgF0CJC.js +0 -2
  226. package/dashboard/dist/assets/StatCard-DlgF0CJC.js.map +0 -1
  227. package/dashboard/dist/assets/StreamMessageDetail-BYzfjWe_.js.map +0 -1
  228. package/dashboard/dist/assets/SwimlaneTimeline-DLVmRrd-.js.map +0 -1
  229. package/dashboard/dist/assets/TopicDetailPage-B2LAQDEg.js +0 -9
  230. package/dashboard/dist/assets/TopicDetailPage-B2LAQDEg.js.map +0 -1
  231. package/dashboard/dist/assets/TopicsPage-SwPAnN2C.js +0 -2
  232. package/dashboard/dist/assets/TopicsPage-SwPAnN2C.js.map +0 -1
  233. package/dashboard/dist/assets/WorkflowPill-BuNkWUVM.js +0 -2
  234. package/dashboard/dist/assets/WorkflowPill-BuNkWUVM.js.map +0 -1
  235. package/dashboard/dist/assets/WorkflowsDashboard-CvWSgQdE.js +0 -2
  236. package/dashboard/dist/assets/WorkflowsDashboard-CvWSgQdE.js.map +0 -1
  237. package/dashboard/dist/assets/YamlWorkflowsPage-ChwvZS4Z.js +0 -2
  238. package/dashboard/dist/assets/YamlWorkflowsPage-ChwvZS4Z.js.map +0 -1
  239. package/dashboard/dist/assets/escalation-columns-D_zFY1zF.js +0 -2
  240. package/dashboard/dist/assets/escalation-columns-D_zFY1zF.js.map +0 -1
  241. package/dashboard/dist/assets/index-6MALVAEY.js +0 -2
  242. package/dashboard/dist/assets/index-6MALVAEY.js.map +0 -1
  243. package/dashboard/dist/assets/index-CKXSKsVZ.js.map +0 -1
  244. package/dashboard/dist/assets/index-CZ6-l8_0.css +0 -1
  245. package/dashboard/dist/assets/index-D2dDPGNk.js +0 -2
  246. package/dashboard/dist/assets/index-D2dDPGNk.js.map +0 -1
  247. package/dashboard/dist/assets/index-D4gAsCGh.js +0 -2
  248. package/dashboard/dist/assets/index-D4gAsCGh.js.map +0 -1
  249. package/dashboard/dist/assets/index-DEXouwBQ.js +0 -2
  250. package/dashboard/dist/assets/index-DEXouwBQ.js.map +0 -1
  251. package/dashboard/dist/assets/index-U27KBbTV.js +0 -9
  252. package/dashboard/dist/assets/index-U27KBbTV.js.map +0 -1
  253. package/dashboard/dist/assets/index-fwHQSJCp.js +0 -6
  254. package/dashboard/dist/assets/index-fwHQSJCp.js.map +0 -1
  255. package/dashboard/dist/assets/roles-UboiQxXT.js +0 -2
  256. package/dashboard/dist/assets/tasks-aL0K8WW3.js +0 -2
@@ -1 +0,0 @@
1
- {"version":3,"file":"SwimlaneTimeline-DLVmRrd-.js","sources":["../../src/pages/workflows/workflow-execution/EventMetadataGrid.tsx","../../src/pages/workflows/workflow-execution/RawStreamSection.tsx","../../src/pages/workflows/workflow-execution/EventDetailPanel.tsx","../../src/pages/workflows/workflow-execution/utils.ts","../../src/pages/workflows/workflow-execution/SwimlaneTimeline.tsx"],"sourcesContent":["import { Link } from 'react-router-dom';\nimport { JsonViewer } from '../../../components/common/data/JsonViewer';\nimport { StatusBadge } from '../../../components/common/display/StatusBadge';\nimport { DateValue } from '../../../components/common/display/DateValue';\nimport { DurationValue } from '../../../components/common/display/DurationValue';\nimport type { WorkflowExecutionEvent, LTTaskRecord } from '../../../api/types';\n\nfunction safeParseJson(raw: string | null | undefined): unknown {\n if (!raw) return null;\n try {\n return JSON.parse(raw);\n } catch {\n return raw;\n }\n}\n\nexport function EventMetadataGrid({ event }: { event: WorkflowExecutionEvent }) {\n return (\n <div className=\"grid grid-cols-2 sm:grid-cols-4 gap-3\">\n {event.attributes.activity_type && (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Activity\n </p>\n <p className=\"text-xs font-mono text-text-primary\">\n {event.attributes.activity_type}\n </p>\n </div>\n )}\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Kind\n </p>\n <p className=\"text-xs font-mono text-text-primary\">\n {event.attributes.kind}\n </p>\n </div>\n {event.duration_ms !== null && (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Duration\n </p>\n <DurationValue ms={event.duration_ms} className=\"font-mono text-text-primary\" />\n </div>\n )}\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Time\n </p>\n <DateValue date={event.event_time} format=\"datetime\" className=\"font-mono text-text-primary\" />\n </div>\n\n {event.attributes.signal_name && (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Signal\n </p>\n <p className=\"text-xs font-mono text-text-primary\">\n {event.attributes.signal_name}\n </p>\n </div>\n )}\n\n {event.attributes.awaited !== undefined && (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Awaited\n </p>\n <p className=\"text-xs font-mono text-text-primary\">\n {event.attributes.awaited ? 'Yes' : 'No (fire-and-forget)'}\n </p>\n </div>\n )}\n\n {event.attributes.timeline_key && (\n <div className=\"col-span-2\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Timeline Key\n </p>\n <p className=\"text-xs font-mono text-text-primary truncate\" title={event.attributes.timeline_key}>\n {event.attributes.timeline_key}\n </p>\n </div>\n )}\n\n {event.attributes.execution_index !== undefined && (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Exec Index\n </p>\n <p className=\"text-xs font-mono text-text-primary\">\n {event.attributes.execution_index}\n </p>\n </div>\n )}\n\n {event.attributes.scheduled_event_id != null && (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Scheduled Event\n </p>\n <p className=\"text-xs font-mono text-text-primary\">\n #{event.attributes.scheduled_event_id}\n </p>\n </div>\n )}\n {event.attributes.wait_event_id != null && (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Wait Started\n </p>\n <p className=\"text-xs font-mono text-text-primary\">\n Event #{event.attributes.wait_event_id}\n </p>\n </div>\n )}\n {event.attributes.initiated_event_id != null && (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Initiated Event\n </p>\n <p className=\"text-xs font-mono text-text-primary\">\n #{event.attributes.initiated_event_id}\n </p>\n </div>\n )}\n </div>\n );\n}\n\nexport function ChildWorkflowSection({ event, childTask }: {\n event: WorkflowExecutionEvent;\n childTask?: LTTaskRecord;\n}) {\n const childInput = childTask ? safeParseJson(childTask.envelope) : null;\n const childOutput = childTask ? safeParseJson(childTask.data) : null;\n\n // Link-only (no matching task record)\n if (!childTask && event.attributes.child_workflow_id) {\n return (\n <div className=\"border-t border-surface-border pt-3\">\n <div className=\"flex items-center gap-3 flex-wrap\">\n <span className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Child Workflow\n </span>\n <Link\n to={`/workflows/executions/${event.attributes.child_workflow_id}`}\n className=\"text-xs font-mono text-accent hover:underline\"\n onClick={(e) => e.stopPropagation()}\n >\n {event.attributes.child_workflow_id}\n </Link>\n </div>\n </div>\n );\n }\n\n // Full child task section\n if (childTask) {\n return (\n <div className=\"space-y-3 border-t border-surface-border pt-3\">\n <div className=\"flex items-center gap-3 flex-wrap\">\n <span className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Child Workflow\n </span>\n <Link\n to={`/workflows/executions/${childTask.workflow_id}`}\n className=\"text-xs font-mono text-accent hover:underline\"\n onClick={(e) => e.stopPropagation()}\n >\n {childTask.workflow_id}\n </Link>\n <StatusBadge status={childTask.status} />\n {childTask.completed_at && (\n <span className=\"text-[10px] text-text-tertiary\">\n Completed <DateValue date={childTask.completed_at} format=\"relative\" />\n </span>\n )}\n </div>\n\n {(childInput != null || childOutput != null) && (\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n {childInput != null ? (\n <JsonViewer data={childInput} label=\"Input (Envelope)\" variant=\"panel\" />\n ) : <div />}\n {childOutput != null ? (\n <JsonViewer data={childOutput} label=\"Output (Result)\" variant=\"panel\" />\n ) : <div />}\n </div>\n )}\n </div>\n );\n }\n\n return null;\n}\n\nexport function EventPayloadSection({ event, childTask }: {\n event: WorkflowExecutionEvent;\n childTask?: LTTaskRecord;\n}) {\n const input = event.attributes.input;\n const result = event.attributes.result;\n const isSignal = event.category === 'signal';\n const isActivity = event.category === 'activity';\n const isChild = event.category === 'child_workflow';\n const hasInput = input !== undefined && (isActivity || isChild);\n const hasResult = !childTask && result !== undefined && (isActivity || isChild);\n const resultLabel = event.attributes.activity_type === 'ltSignalParent' ? 'Signal Payload' : 'Result';\n\n if (hasInput || hasResult) {\n return (\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n {hasInput ? (\n <JsonViewer data={input} label=\"Input\" variant=\"panel\" />\n ) : <div />}\n {hasResult ? (\n <JsonViewer data={result} label={resultLabel} variant=\"panel\" />\n ) : <div />}\n </div>\n );\n }\n\n if (isSignal && input !== undefined) {\n return <JsonViewer data={input} label=\"Signal Payload\" variant=\"panel\" />;\n }\n\n return null;\n}\n","import { useState } from 'react';\n\nimport { Collapsible } from '../../../components/common/layout/Collapsible';\nimport { useStreamMessages, type StreamMessage } from '../../../api/stream-messages';\nimport { StreamMessageDetail } from '../../admin/streams/StreamMessageDetail';\nimport type { WorkflowExecutionEvent } from '../../../api/types';\n\n/**\n * How a timeline activity maps to an underlying stream row. Two encodings:\n *\n * - `path` — the raw DAG view exposes the full dimension path, e.g.\n * `0/0/0/worker` → aid `worker`, dad `,0,0,0`. Maps to one exact row by\n * jid+aid+dad (engine control flow matched on payload metadata instead).\n * - `proxyIndex` — the durable view abstracts the replaying workflow into an\n * ordered list of proxyActivity calls and uses an ordinal token (`-proxy-3-`).\n * The Nth call is the Nth `proxyer` stream row ordered by `created`.\n */\nexport type StreamRef =\n | { kind: 'path'; aid: string; dad: string }\n | { kind: 'proxyIndex'; index: number };\n\nexport function parseTimelineKey(timelineKey: string | undefined): StreamRef | null {\n if (!timelineKey) return null;\n const proxy = /^-proxy-(\\d+)-$/.exec(timelineKey);\n if (proxy) return { kind: 'proxyIndex', index: parseInt(proxy[1], 10) };\n if (timelineKey.startsWith('-')) return null; // other friendly tokens — unmappable\n const segments = timelineKey.split('/');\n if (segments.length < 2) return null;\n return { kind: 'path', aid: segments[segments.length - 1], dad: `,${segments.slice(0, -1).join(',')}` };\n}\n\n/** The aid/dad recorded inside a stream message's JSONB metadata. */\nfunction metaOf(msg: StreamMessage): { aid?: string; dad?: string } {\n try {\n const parsed = JSON.parse(msg.message) as { metadata?: { aid?: string; dad?: string } };\n return { aid: parsed?.metadata?.aid, dad: parsed?.metadata?.dad };\n } catch {\n return {};\n }\n}\n\ninterface RawStreamSectionProps {\n /** The job id (workflowId) — the `jid` on the underlying stream rows. */\n jid: string;\n /** HotMesh namespace / DB schema (e.g. `durable`). */\n appId: string;\n event: WorkflowExecutionEvent;\n}\n\n/**\n * Drill-down from a timeline activity to the underlying stream row(s) — the real\n * audit record — shown inline as JSON. Resolves the row from the activity's\n * timeline key for both the raw DAG view (exact jid+aid+dad) and the durable\n * view (Nth proxyActivity by created). Fetches only once expanded.\n */\nexport function RawStreamSection({ jid, appId, event }: RawStreamSectionProps) {\n const [open, setOpen] = useState(false);\n const ref = parseTimelineKey(event.attributes.timeline_key);\n\n return (\n <div className=\"space-y-2\">\n <button\n onClick={() => setOpen((v) => !v)}\n className=\"flex items-center gap-1.5 text-[10px] font-semibold uppercase tracking-widest text-text-tertiary hover:text-text-secondary transition-colors\"\n >\n <span className={`transition-transform duration-300 ${open ? 'rotate-90' : ''}`}>&#9654;</span>\n Raw stream message (audit)\n </button>\n <Collapsible open={open}>\n {open && (\n <div className=\"pt-1\">\n {!ref && <p className=\"text-[11px] text-text-tertiary\">No raw stream row maps to this activity.</p>}\n {ref?.kind === 'proxyIndex' && <ProxyBody namespace={appId || 'durable'} jid={jid} index={ref.index} />}\n {ref?.kind === 'path' && <PathBody namespace={appId || 'durable'} jid={jid} aid={ref.aid} dad={ref.dad} />}\n </div>\n )}\n </Collapsible>\n </div>\n );\n}\n\n/** Durable view: the Nth proxyActivity → the Nth `proxyer` row by created order. */\nfunction ProxyBody({ namespace, jid, index }: { namespace: string; jid: string; index: number }) {\n const q = useStreamMessages({\n namespace, source: 'worker', jid, aid: 'proxyer',\n sort_by: 'created_at', order: 'asc', offset: index - 1, limit: 1,\n });\n const msg = q.data?.messages?.[0];\n\n if (q.isLoading) return <Loading />;\n if (q.error) return <LoadError />;\n if (!msg) return <NotFound label={`proxy activity #${index}`} />;\n return (\n <Record note={`Proxy activity #${index} (durable) — the worker stream record for this step`} messages={[msg]} />\n );\n}\n\n/** Raw DAG view: exact jid+aid+dad worker row, or engine control flow by metadata. */\nfunction PathBody({ namespace, jid, aid, dad }: { namespace: string; jid: string; aid: string; dad: string }) {\n const worker = useStreamMessages({ namespace, source: 'worker', jid, aid, dad, limit: 1 });\n const workerMsg = worker.data?.messages?.[0];\n\n // engine_streams has no aid/dad columns — fetch this job's engine rows and\n // match on payload metadata. A control point can recur (one per cycle), so\n // all matches are shown. Runs only after a worker miss.\n const tryEngine = worker.isFetched && !workerMsg;\n const engine = useStreamMessages({ namespace, source: 'engine', jid, limit: 200 }, { enabled: tryEngine });\n const engineMatches = tryEngine\n ? (engine.data?.messages ?? []).filter((m) => { const x = metaOf(m); return x.aid === aid && x.dad === dad; })\n : [];\n\n const isWorker = !!workerMsg;\n const messages = workerMsg ? [workerMsg] : engineMatches;\n\n if (worker.isLoading || (tryEngine && engine.isLoading)) return <Loading />;\n if (worker.error) return <LoadError />;\n if (messages.length === 0) return <NotFound label={`${aid} ${dad}`} />;\n\n return (\n <Record\n note={isWorker\n ? 'Worker stream — the function-execution record behind this activity'\n : `Engine stream — control-flow record${messages.length > 1 ? `s (${messages.length}, one per occurrence)` : ' (trigger / hook / cycle)'}`}\n messages={messages}\n />\n );\n}\n\nfunction Record({ note, messages }: { note: string; messages: StreamMessage[] }) {\n return (\n <div className=\"space-y-3\">\n <p className=\"text-[10px] text-text-tertiary\">{note}</p>\n {messages.map((m) => (\n <div key={m.id} className=\"rounded-md bg-surface p-3\">\n <StreamMessageDetail message={m} />\n </div>\n ))}\n </div>\n );\n}\n\nconst Loading = () => <p className=\"text-[11px] text-text-tertiary\">Loading stream message…</p>;\nconst LoadError = () => <p className=\"text-[11px] text-status-error\">Failed to load stream message.</p>;\nconst NotFound = ({ label }: { label: string }) => (\n <p className=\"text-[11px] text-text-tertiary\">No stream row found for <span className=\"font-mono\">{label}</span>.</p>\n);\n","import { JsonViewer } from '../../../components/common/data/JsonViewer';\nimport type { WorkflowExecutionEvent, LTTaskRecord } from '../../../api/types';\nimport { EventMetadataGrid, ChildWorkflowSection, EventPayloadSection } from './EventMetadataGrid';\nimport { RawStreamSection } from './RawStreamSection';\n\ninterface EventDetailPanelProps {\n event: WorkflowExecutionEvent;\n childTask?: LTTaskRecord;\n /** When true, show a \"Pending\" badge. Caller determines this from the full event list. */\n pending?: boolean;\n /** Job id (workflowId) — when present, enables the raw-stream drill-down. */\n jid?: string;\n /** HotMesh namespace / DB schema for the raw-stream lookup (default: durable). */\n appId?: string;\n onClose?: () => void;\n}\n\n/**\n * Reusable detail panel for a workflow execution event.\n * Renders inline wherever placed — used by both SwimlaneTimeline\n * (below the lane row) and EventTable (below the event row).\n *\n * Shows rich detail for all event categories:\n * - Activities: activity_type, result, scheduled_event_id\n * - Signals: signal_name, payload, wait_event_id\n * - Timers: duration\n * - Child workflows: child_workflow_id link, awaited badge, result\n */\nexport function EventDetailPanel({ event, childTask, pending = false, jid, appId, onClose }: EventDetailPanelProps) {\n return (\n <div className=\"p-4 bg-surface-sunken rounded-md space-y-4\">\n {/* Header */}\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex items-center gap-2\">\n <p className=\"font-mono font-medium text-sm text-text-primary\">\n {event.attributes.activity_type\n ?? event.attributes.signal_name\n ?? event.attributes.child_workflow_id\n ?? event.event_type}\n </p>\n {pending && (\n <span className=\"inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-[10px] font-medium bg-status-warning/15 text-status-warning\">\n <span className=\"w-1.5 h-1.5 rounded-full bg-status-warning animate-pulse\" />\n Pending\n </span>\n )}\n </div>\n {onClose && (\n <button\n onClick={onClose}\n className=\"text-text-tertiary hover:text-text-primary text-xs\"\n >\n Close\n </button>\n )}\n </div>\n\n {/* Metadata grid */}\n <EventMetadataGrid event={event} />\n\n {/* Child workflow sections */}\n <ChildWorkflowSection event={event} childTask={childTask} />\n\n {/* Raw stream message drill-down — the real audit behind the export.\n Placed above INPUT/RESULT so the underlying record is the first thing\n available when auditing. */}\n {jid && <RawStreamSection jid={jid} appId={appId ?? 'durable'} event={event} />}\n\n {/* Input / Result payload */}\n <EventPayloadSection event={event} childTask={childTask} />\n\n {/* Failure detail */}\n {event.attributes.failure !== undefined && (\n <JsonViewer data={event.attributes.failure} label=\"Failure\" />\n )}\n\n {/* Remaining attributes (exclude the fields shown above) */}\n {(() => {\n const {\n kind,\n activity_type,\n result,\n timeline_key,\n execution_index,\n signal_name,\n input,\n child_workflow_id,\n awaited,\n wait_event_id,\n scheduled_event_id,\n initiated_event_id,\n failure,\n trace_id,\n span_id,\n ...rest\n } = event.attributes;\n return Object.keys(rest).length > 0 ? (\n <JsonViewer data={rest} label=\"Attributes\" />\n ) : null;\n })()}\n </div>\n );\n}\n","export { formatDuration, formatDateTime } from '../../../lib/format';\n\nimport type { WorkflowExecutionEvent } from '../../../api/types';\n\n// ── Types ────────────────────────────────────────────────────────────────────\n\nexport interface Segment {\n eventId: number;\n startPct: number;\n widthPct: number;\n duration: number | null;\n label: string;\n eventTime: string;\n pending: boolean;\n}\n\nexport interface Lane {\n name: string;\n category: string;\n segments: Segment[];\n}\n\n// ── Constants ────────────────────────────────────────────────────────────────\n\nexport const CATEGORY_COLORS: Record<string, { bar: string; outline: string; text: string; label: string }> = {\n activity: { bar: 'bg-blue-500', outline: 'border border-blue-400/40 bg-blue-400/15', text: 'text-blue-500', label: 'Activities' },\n signal: { bar: 'bg-emerald-500', outline: 'border border-emerald-400/40 bg-emerald-400/15', text: 'text-emerald-500', label: 'Signals' },\n timer: { bar: 'bg-status-warning', outline: 'border border-amber-400/40 bg-amber-400/15', text: 'text-status-warning', label: 'Timers' },\n child_workflow: { bar: 'bg-violet-500', outline: 'border border-violet-400/40 bg-violet-400/15', text: 'text-violet-500', label: 'Child Workflows' },\n};\n\nexport const PENDING_CLASS = 'bg-stripes animate-pulse opacity-70';\n\n/** Activity names that indicate LLM/MCP tool interaction */\nexport const MCP_ACTIVITY_NAMES = new Set([\n 'callLLM', 'callDbTool', 'callVisionTool', 'callMcpTool', 'getDBTools', 'getVisionTools',\n]);\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\n/** Truncate a string in the middle, keeping the start and end visible. */\nexport function middleTruncate(str: string, maxLen: number): string {\n if (!str || typeof str !== 'string') return str ?? '';\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 interface TimelineSpan {\n category: string;\n name: string;\n startTime: number;\n endTime: number | null;\n duration: number | null;\n eventId: number;\n pending: boolean;\n}\n\n/**\n * Group paired events (scheduled→completed, started→fired, wait→signaled)\n * into a single span using timeline_key, or treat standalone events as points.\n */\nexport function buildTimelineSpans(events: WorkflowExecutionEvent[]): TimelineSpan[] {\n const spans: TimelineSpan[] = [];\n\n // Index scheduled/started events by timeline_key for pairing\n const startedMap = new Map<string, WorkflowExecutionEvent>();\n const completedMap = new Map<string, WorkflowExecutionEvent>();\n\n for (const evt of events) {\n const tlKey = evt.attributes.timeline_key;\n if (!tlKey) continue;\n const type = evt.event_type;\n\n if (type === 'activity_task_scheduled'\n || type === 'timer_started'\n || type === 'child_workflow_execution_started'\n || type === 'signal_wait_started') {\n startedMap.set(tlKey, evt);\n } else {\n completedMap.set(tlKey, evt);\n }\n }\n\n // Build spans from pairs\n const seen = new Set<string>();\n\n for (const evt of events) {\n const tlKey = evt.attributes.timeline_key;\n\n // Skip if no timeline_key or already processed\n if (tlKey && seen.has(tlKey)) continue;\n if (tlKey) seen.add(tlKey);\n\n const started = tlKey ? startedMap.get(tlKey) : undefined;\n const completed = tlKey ? completedMap.get(tlKey) : undefined;\n\n // Determine the representative event for this span\n const primary = completed || started || evt;\n const cat = primary.category;\n const name = String(primary.attributes.activity_type\n || primary.attributes.signal_name\n || primary.attributes.child_workflow_id\n || primary.event_type\n || 'unknown');\n\n const startEvt = started || primary;\n const endEvt = completed;\n\n const startMs = new Date(startEvt.event_time).getTime();\n let endMs: number | null = null;\n let dur: number | null = null;\n let pending = false;\n\n if (endEvt) {\n endMs = new Date(endEvt.event_time).getTime();\n dur = endEvt.duration_ms ?? (endMs - startMs);\n } else if (primary.duration_ms !== null) {\n dur = primary.duration_ms;\n endMs = startMs + dur;\n } else {\n // Pending — no completion event\n pending = true;\n }\n\n spans.push({\n category: cat,\n name: name || primary.event_type,\n startTime: startMs,\n endTime: endMs,\n duration: dur,\n eventId: primary.event_id,\n pending,\n });\n }\n\n return spans;\n}\n","import { useState } from 'react';\nimport { Collapsible } from '../../../components/common/layout/Collapsible';\nimport type { WorkflowExecutionEvent, LTTaskRecord } from '../../../api/types';\nimport { EventDetailPanel } from './EventDetailPanel';\nimport {\n formatDuration,\n middleTruncate,\n buildTimelineSpans,\n CATEGORY_COLORS,\n PENDING_CLASS,\n MCP_ACTIVITY_NAMES,\n} from './utils';\nimport type { Segment, Lane } from './utils';\n\ninterface SwimlaneTimelineProps {\n events: WorkflowExecutionEvent[];\n childTasks?: LTTaskRecord[];\n /** Use outline-style bars (border + transparent fill) instead of solid fills */\n outline?: boolean;\n /** Job id (workflowId) — enables the per-activity raw-stream drill-down. */\n jid?: string;\n /** HotMesh namespace / DB schema for the raw-stream lookup (default: durable). */\n appId?: string;\n}\n\n// ── Component ────────────────────────────────────────────────────────────────\n\nexport function SwimlaneTimeline({ events, childTasks, outline, jid, appId }: SwimlaneTimelineProps) {\n const [selectedEvents, setSelectedEvents] = useState<Set<number>>(new Set());\n const [hoveredEvent, setHoveredEvent] = useState<number | null>(null);\n\n // Filter out workflow-level events (started/completed) — they aren't operations\n const timelineEvents = events.filter(\n (e) => e.category !== 'workflow',\n );\n\n // Show all activities (user + system), signals, timers, and child workflows.\n const displayEvents = timelineEvents;\n\n if (displayEvents.length === 0) return null;\n\n const spans = buildTimelineSpans(displayEvents);\n if (spans.length === 0) return null;\n\n // Compute time axis bounds\n const now = Date.now();\n const allTimes = spans.flatMap((s) => {\n const times = [s.startTime];\n if (s.endTime) times.push(s.endTime);\n else times.push(now); // pending extends to now\n return times;\n });\n const timeMin = Math.min(...allTimes);\n const timeMax = Math.max(...allTimes);\n const totalSpan = timeMax - timeMin || 1;\n\n // Group spans into lanes by \"category:name\"\n const laneMap = new Map<string, { name: string; category: string; segments: Segment[] }>();\n\n for (const span of spans) {\n const laneKey = `${span.category}:${span.name}`;\n const startOffset = span.startTime - timeMin;\n const endOffset = span.endTime ? span.endTime - timeMin : (now - timeMin);\n const widthMs = endOffset - startOffset;\n\n const segment: Segment = {\n eventId: span.eventId,\n startPct: (startOffset / totalSpan) * 100,\n widthPct: Math.max((widthMs / totalSpan) * 100, 0.5),\n duration: span.duration,\n label: `${span.name} — ${span.duration !== null ? formatDuration(span.duration) : 'pending'} — ${new Date(span.startTime).toLocaleTimeString()}`,\n eventTime: new Date(span.startTime).toISOString(),\n pending: span.pending,\n };\n\n if (!laneMap.has(laneKey)) {\n laneMap.set(laneKey, { name: span.name, category: span.category, segments: [] });\n }\n laneMap.get(laneKey)!.segments.push(segment);\n }\n\n const lanes: Lane[] = Array.from(laneMap.values());\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) * totalSpan)),\n }));\n\n // Active categories for legend\n const activeCategories = [...new Set(spans.map((s) => s.category))];\n\n /** Find a matching child task for an event */\n const findChildTask = (evt: WorkflowExecutionEvent): LTTaskRecord | undefined => {\n if (!childTasks?.length) return undefined;\n const activityType = evt.attributes.activity_type;\n if (!activityType) return undefined;\n return childTasks.find((t) => t.workflow_type === activityType);\n };\n\n const toggleEvent = (id: number) => {\n setSelectedEvents((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 allEventIds = spans.map((s) => s.eventId);\n const allExpanded = allEventIds.length > 0 && allEventIds.every((id) => selectedEvents.has(id));\n\n const toggleAll = () => {\n if (allExpanded) {\n setSelectedEvents(new Set());\n } else {\n setSelectedEvents(new Set(allEventIds));\n }\n };\n\n\n\n const barColor = (cat: string, pending: boolean) => {\n if (pending) return PENDING_CLASS;\n if (outline) return CATEGORY_COLORS[cat]?.outline ?? 'border-text-tertiary bg-transparent';\n return CATEGORY_COLORS[cat]?.bar ?? 'bg-text-tertiary';\n };\n\n const textColor = (cat: string) => {\n if (outline) return CATEGORY_COLORS[cat]?.text ?? 'text-text-tertiary';\n return 'text-white';\n };\n\n return (\n <div className=\"px-6 py-6 mb-6\">\n <div className=\"flex items-center gap-4 mb-4 flex-wrap\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Execution Timeline\n </p>\n <button onClick={toggleAll} 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-3 ml-auto\">\n {activeCategories.map((cat) => (\n <div key={cat} className=\"flex items-center gap-1\">\n <span className={`w-2 h-2 rounded-full ${outline ? `border ${CATEGORY_COLORS[cat]?.outline ?? 'border-text-tertiary'}` : CATEGORY_COLORS[cat]?.bar ?? 'bg-text-tertiary'}`} />\n <span className=\"text-[9px] text-text-tertiary\">\n {CATEGORY_COLORS[cat]?.label ?? cat}\n </span>\n </div>\n ))}\n {spans.some((s) => s.pending) && (\n <div className=\"flex items-center gap-1\">\n <span className=\"w-2 h-2 rounded-full bg-status-warning animate-pulse\" />\n <span className=\"text-[9px] text-text-tertiary\">Pending</span>\n </div>\n )}\n </div>\n </div>\n\n {/* Time axis */}\n <div className=\"flex\">\n <div className=\"w-56 shrink-0\" />\n <div className=\"flex-1 relative h-6 border-b border-surface-border\">\n {ticks.map((tick) => (\n <span\n key={tick.pct}\n className=\"absolute text-[9px] font-mono text-text-tertiary -translate-x-1/2 bottom-1\"\n style={{ left: `${tick.pct}%` }}\n >\n {tick.label}\n </span>\n ))}\n </div>\n </div>\n\n {/* Lanes */}\n {lanes.map((lane) => {\n const catColor = CATEGORY_COLORS[lane.category];\n\n return (\n <div key={`${lane.category}:${lane.name}`}>\n {/* Lane row */}\n <div className=\"flex items-center border-b border-surface-border\">\n <div className=\"w-56 shrink-0 py-3 pr-4 flex items-center gap-2\">\n <span className={`w-1.5 h-1.5 rounded-full shrink-0 ${catColor?.bar ?? 'bg-text-tertiary'}`} />\n <p\n className=\"text-xs font-mono text-text-secondary whitespace-nowrap overflow-hidden\"\n title={lane.name}\n >\n {middleTruncate(lane.name, 28)}\n </p>\n {MCP_ACTIVITY_NAMES.has(lane.name) && (\n <span className=\"shrink-0 text-accent/60\" title=\"MCP tool interaction\">\n <svg className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9.663 17h4.674M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z\" />\n </svg>\n </span>\n )}\n </div>\n\n <div className=\"flex-1 relative h-10\">\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 {lane.segments.map((seg) => {\n const isHovered = hoveredEvent === seg.eventId;\n const isSelected = selectedEvents.has(seg.eventId);\n const isNarrow = seg.widthPct < 3;\n return (\n <div\n key={seg.eventId}\n className={`absolute top-2 h-6 rounded-sm cursor-pointer transition-all duration-200 origin-center ${\n isSelected\n ? `${barColor(lane.category, seg.pending)} ring-2 ring-accent ring-offset-1`\n : `${barColor(lane.category, seg.pending)} hover:opacity-80`\n }`}\n style={{\n left: `${seg.startPct}%`,\n width: `${seg.widthPct}%`,\n minWidth: '4px',\n ...(isHovered && isNarrow ? {\n transform: 'scaleX(4) scaleY(1.3) translateY(-2px)',\n zIndex: 20,\n borderRadius: '4px',\n } : {\n zIndex: isSelected ? 10 : 1,\n }),\n }}\n title={seg.label}\n onClick={() => toggleEvent(seg.eventId)}\n onMouseEnter={() => setHoveredEvent(seg.eventId)}\n onMouseLeave={() => setHoveredEvent(null)}\n >\n {seg.widthPct > 8 && (\n <span className={`absolute inset-0 flex items-center px-1.5 text-[9px] font-mono ${textColor(lane.category)} truncate`}>\n {seg.duration !== null ? formatDuration(seg.duration) : 'pending'}\n </span>\n )}\n </div>\n );\n })}\n </div>\n </div>\n\n {/* Inline detail panels */}\n {lane.segments.map((seg) => {\n const isOpen = selectedEvents.has(seg.eventId);\n const evt = displayEvents.find((e) => e.event_id === seg.eventId);\n return (\n <Collapsible key={seg.eventId} open={isOpen}>\n {evt && (\n <div className=\"py-3\">\n <EventDetailPanel\n event={evt}\n childTask={findChildTask(evt)}\n pending={seg.pending}\n jid={jid}\n appId={appId}\n onClose={() => toggleEvent(evt.event_id)}\n />\n </div>\n )}\n </Collapsible>\n );\n })}\n </div>\n );\n })}\n\n </div>\n );\n}\n"],"names":["safeParseJson","raw","EventMetadataGrid","event","jsxs","jsx","DurationValue","DateValue","ChildWorkflowSection","childTask","childInput","childOutput","Link","e","StatusBadge","JsonViewer","EventPayloadSection","input","result","isSignal","isActivity","isChild","hasInput","hasResult","resultLabel","parseTimelineKey","timelineKey","proxy","segments","metaOf","msg","parsed","_a","_b","RawStreamSection","jid","appId","open","setOpen","useState","ref","v","Collapsible","ProxyBody","PathBody","namespace","index","q","useStreamMessages","Loading","LoadError","Record","NotFound","aid","dad","worker","workerMsg","tryEngine","engine","engineMatches","_c","m","x","isWorker","messages","note","StreamMessageDetail","label","EventDetailPanel","pending","onClose","kind","activity_type","timeline_key","execution_index","signal_name","child_workflow_id","awaited","wait_event_id","scheduled_event_id","initiated_event_id","failure","trace_id","span_id","rest","CATEGORY_COLORS","PENDING_CLASS","MCP_ACTIVITY_NAMES","middleTruncate","str","maxLen","keep","buildTimelineSpans","events","spans","startedMap","completedMap","evt","tlKey","type","seen","started","completed","primary","cat","name","startEvt","endEvt","startMs","endMs","dur","SwimlaneTimeline","childTasks","outline","selectedEvents","setSelectedEvents","hoveredEvent","setHoveredEvent","displayEvents","now","allTimes","times","timeMin","totalSpan","laneMap","span","laneKey","startOffset","widthMs","segment","formatDuration","lanes","tickCount","ticks","_","i","activeCategories","findChildTask","activityType","t","toggleEvent","id","prev","next","allEventIds","allExpanded","toggleAll","barColor","textColor","tick","lane","catColor","seg","isHovered","isSelected","isNarrow","isOpen"],"mappings":"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"}
@@ -1,9 +0,0 @@
1
- import{a,j as e}from"./vendor-query-B2UbickB.js";import{a as ue,b as he,c as be,d as fe}from"./topics-CZO06VJl.js";import{u as ge,b as y,J as Y}from"./index-CKXSKsVZ.js";import{L as je}from"./ListToolbar--FkPpYDY.js";import{R as N,B as ve,Q as ye,p as Ne,aX as ke,X as we,T as Se,g as Ce,aY as Pe,b as G,a9 as Ee,q as Te}from"./vendor-icons-BaQqUm-e.js";import{e as We,c as _e}from"./vendor-react-CXumBFUA.js";const qe={task:"bg-blue-400/15 text-blue-400",workflow:"bg-accent/15 text-accent",escalation:"bg-amber-400/15 text-amber-400",activity:"bg-cyan-400/15 text-cyan-400",knowledge:"bg-violet-400/15 text-violet-400",agent:"bg-emerald-400/15 text-emerald-400",app:"bg-rose-400/15 text-rose-400",milestone:"bg-violet-400/15 text-violet-400"};function k({icon:x,color:u,children:d}){return e.jsxs("div",{className:"flex items-center gap-2 mb-3 pb-2 border-b border-surface-border",children:[e.jsx(x,{className:`w-4 h-4 ${u}`,strokeWidth:1.5}),e.jsx("h2",{className:"section-h2",children:d})]})}function Me(){var z,F,V,X;const{topic:x}=We(),u=x?decodeURIComponent(x):null,d=_e(),{data:t,isLoading:H,refetch:h,isFetching:K}=ue(u),{data:b}=ge(),Z=(z=b==null?void 0:b.ai)!=null&&z.enabled?"agents":"automations",w=he(),ee=be(),r=fe(),[n,f]=a.useState(!1),[o,S]=a.useState(""),[C,P]=a.useState(()=>`evt-${Date.now()}-${Math.random().toString(16).slice(2,6)}`),[g,E]=a.useState(""),[T,te]=a.useState("myWorkflow"),[W,se]=a.useState("wf-001"),[_,ae]=a.useState("default"),[q,ie]=a.useState(""),[I,ce]=a.useState("esc-001"),[D,le]=a.useState("myActivity"),[O,J]=a.useState(""),[$,R]=a.useState(""),[j,A]=a.useState(""),[M,p]=a.useState("");if(H)return e.jsxs("div",{className:"animate-pulse space-y-4",children:[e.jsx("div",{className:"h-8 bg-surface-sunken rounded w-48"}),e.jsx("div",{className:"h-40 bg-surface-sunken rounded"})]});if(!t)return e.jsxs("div",{className:"flex flex-col items-center justify-center py-20 text-center",children:[e.jsx(N,{className:"w-12 h-12 text-text-quaternary mb-4",strokeWidth:1}),e.jsx("h2",{className:"text-lg font-medium text-text-primary mb-2",children:"Topic not found"})]});const ne=t.source==="system",L=!t.managed,re=qe[t.category]??"bg-zinc-400/15 text-zinc-400",m=t.example_payload?JSON.stringify(t.example_payload,null,2):(F=t.payload_schema)!=null&&F.properties?JSON.stringify(Object.fromEntries(Object.keys(t.payload_schema.properties).map(s=>[s,""])),null,2):"{}",c=t.topic.startsWith("system.workflow.")||t.topic.startsWith("system.task.")?"workflow":t.topic.startsWith("system.escalation.")?"escalation":t.topic.startsWith("system.activity.")?"activity":"none",B=c==="workflow"||c==="escalation"||c==="activity",Q=c==="workflow"||c==="escalation",v=(o||t.topic).split(".").pop()??"",U=()=>{let s={};try{s=JSON.parse(g||m)}catch{}const l=(o||t.topic)!==t.topic?o||t.topic:void 0,i={id:C||void 0,source:"dashboard",data:s};return l&&(i.subject=l),B&&(i.workflowName=T,i.workflowId=W,i.taskQueue=_),Q&&(i.status=q||v),c==="escalation"&&(i.escalationId=I),c==="activity"&&(i.activityName=D),i},oe=(()=>{const{subject:s,...l}=U();return JSON.stringify({type:s||t.topic,timestamp:"<minted>",...l},null,2)})();!g&&m!=="{}"&&E(m),o||S(t.topic);const xe=()=>{J(t.description??""),R((t.tags??[]).join(", ")),A(t.payload_schema?JSON.stringify(t.payload_schema,null,2):""),p(""),f(!0)},de=()=>f(!1),pe=()=>{const s=$.split(",").map(i=>i.trim()).filter(Boolean);let l;if(j.trim())try{l=JSON.parse(j),p("")}catch{p("Invalid JSON");return}w.mutate({topic:t.topic,description:O,tags:s,...l!==void 0?{payload_schema:l}:{}},{onSuccess:()=>{f(!1),h()}})},me=()=>{confirm(`Delete topic "${t.topic}"?
2
-
3
- This removes it from the catalog. Active subscriptions are not affected.`)&&ee.mutate(t.topic,{onSuccess:()=>d("/topics")})};return e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-start justify-between mb-4",children:[e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center gap-3 mb-1",children:[e.jsx(N,{className:"w-5 h-5 text-accent",strokeWidth:1.5}),e.jsx("h1",{className:"text-lg font-mono font-medium text-text-primary",children:t.topic}),e.jsx("button",{onClick:()=>{window.location.hash="#docs:topics.md"},className:"text-text-quaternary hover:text-accent transition-colors",title:"Topic docs",children:e.jsx(ve,{className:"w-4 h-4",strokeWidth:1.5})})]}),!n&&t.description?e.jsx("p",{className:"text-sm text-text-secondary leading-relaxed",children:t.description}):n?null:e.jsx("p",{className:"text-sm text-text-quaternary italic",children:"No description"})]}),e.jsxs("div",{className:"flex items-center gap-2 shrink-0",children:[!n&&L&&e.jsxs("button",{onClick:xe,className:"flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md bg-accent text-text-inverse hover:bg-accent-hover transition-colors",children:[e.jsx(ye,{className:"w-3 h-3"})," Edit"]}),!n&&!ne&&L&&e.jsxs("button",{onClick:me,className:"flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md text-red-400/60 hover:text-red-400 hover:bg-red-600/10 transition-colors",children:[e.jsx(Ne,{className:"w-3 h-3"})," Delete"]}),n&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{onClick:pe,disabled:w.isPending,className:"flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md bg-accent text-text-inverse hover:bg-accent-hover transition-colors",children:[e.jsx(ke,{className:"w-3 h-3"})," Save"]}),e.jsxs("button",{onClick:de,className:"flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md text-text-tertiary hover:text-text-primary hover:bg-surface-hover transition-colors",children:[e.jsx(we,{className:"w-3 h-3"})," Cancel"]})]})]})]}),e.jsxs("div",{className:"bg-surface-sunken/50 rounded-md px-5 py-3 flex flex-wrap gap-x-6 gap-y-3 items-start mb-5 relative",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Category"}),e.jsx("span",{className:`inline-flex items-center px-2 py-0.5 rounded text-[10px] font-medium ${re}`,children:t.category})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Source"}),e.jsx("span",{className:"text-xs font-mono text-text-secondary",children:t.source})]}),((V=t.tags)==null?void 0:V.length)>0&&e.jsxs("div",{children:[e.jsx("p",{className:"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Tags"}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx(Se,{className:"w-2.5 h-2.5 text-text-quaternary",strokeWidth:1.5}),t.tags.map(s=>e.jsx("span",{className:"inline-flex items-center px-1.5 py-0.5 rounded text-[10px] font-mono text-text-tertiary bg-surface-sunken",children:s},s))]})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Created"}),e.jsx("span",{className:"text-xs text-text-secondary",children:e.jsx(y,{date:t.created_at})})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Updated"}),e.jsx("span",{className:"text-xs text-text-secondary",children:e.jsx(y,{date:t.updated_at})})]}),t.last_seen_at&&e.jsxs("div",{children:[e.jsx("p",{className:"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Last Seen"}),e.jsx("span",{className:"text-xs text-text-secondary",children:e.jsx(y,{date:t.last_seen_at})})]}),e.jsx("div",{className:"ml-auto self-center",children:e.jsx(je,{onRefresh:()=>h(),isFetching:K,apiPath:`/topics/by-name/${encodeURIComponent(t.topic)}`})})]}),!n&&e.jsxs("div",{className:"grid grid-cols-3 gap-5",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx(k,{icon:N,color:"text-accent",children:"Payload Schema"}),t.payload_schema?e.jsx(Y,{data:t.payload_schema}):e.jsx("p",{className:"text-[11px] text-text-quaternary",children:"No schema defined. Click Edit to add one."})]}),e.jsxs("div",{className:"min-w-0",children:[e.jsx(k,{icon:Ce,color:"text-cyan-400",children:"Example Payload"}),t.example_payload?e.jsx(Y,{data:t.example_payload}):e.jsx("p",{className:"text-[11px] text-text-quaternary",children:"No example defined. Click Edit to add one."})]}),e.jsxs("div",{className:"min-w-0 space-y-4 animate-page-enter",children:[e.jsx(k,{icon:Pe,color:"text-violet-400",children:"Test"}),e.jsxs("div",{className:"bg-surface-sunken/30 rounded-md px-4 py-3",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-2",children:[e.jsx(G,{className:"w-3.5 h-3.5 text-emerald-400",strokeWidth:1.5}),e.jsx("h2",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Target Subscribers"}),e.jsxs("span",{className:"relative group ml-auto",children:[e.jsx(Ee,{className:"w-3 h-3 text-text-quaternary cursor-help",strokeWidth:1.5}),e.jsx("span",{className:"absolute right-0 top-full mt-1 w-48 p-2 rounded bg-surface-raised border border-surface-border shadow-lg text-[10px] text-text-secondary leading-relaxed hidden group-hover:block z-10",children:"Publishing a test event is live — these subscribers will receive and process the payload."})]})]}),(X=t.subscribers)!=null&&X.length?e.jsx("div",{className:"space-y-0.5",children:t.subscribers.map(s=>e.jsxs("button",{onClick:()=>d(`/agents/${s.agent_id}`),className:"flex items-center gap-2 w-full text-left py-1 rounded hover:bg-surface-hover/50 transition-colors",children:[e.jsx(G,{className:"w-2.5 h-2.5 text-emerald-400 shrink-0",strokeWidth:1.5}),e.jsx("span",{className:"text-[11px] text-text-primary hover:text-accent transition-colors truncate",children:s.agent_name}),e.jsx("span",{className:"text-[9px] font-mono text-text-quaternary ml-auto shrink-0",children:s.reaction_type})]},s.id))}):e.jsxs("p",{className:"text-[11px] text-text-quaternary",children:["No ",Z," subscribed."]})]}),e.jsxs("div",{className:"sticky top-16 bg-surface-sunken/40 rounded-md p-4",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-3",children:[e.jsx(Te,{className:"w-3.5 h-3.5 text-accent",strokeWidth:1.5}),e.jsx("h2",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Publish"})]}),e.jsx("label",{className:"block text-[10px] text-text-quaternary uppercase tracking-wide mb-1",children:"Event ID"}),e.jsx("input",{value:C,onChange:s=>P(s.target.value),className:"input w-full text-[11px] font-mono mb-3",spellCheck:!1,placeholder:"evt-1720368000000-a3f2"}),e.jsx("label",{className:"block text-[10px] text-text-quaternary uppercase tracking-wide mb-1",children:"Subject"}),e.jsx("input",{value:o||t.topic,onChange:s=>S(s.target.value),className:"input w-full text-[11px] font-mono mb-3",spellCheck:!1}),B&&e.jsxs("div",{className:"grid grid-cols-2 gap-x-3",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] text-text-quaternary uppercase tracking-wide mb-1",children:"Workflow Name"}),e.jsx("input",{value:T,onChange:s=>te(s.target.value),className:"input w-full text-[11px] font-mono mb-3",spellCheck:!1,placeholder:"myWorkflow"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] text-text-quaternary uppercase tracking-wide mb-1",children:"Workflow ID"}),e.jsx("input",{value:W,onChange:s=>se(s.target.value),className:"input w-full text-[11px] font-mono mb-3",spellCheck:!1,placeholder:"wf-001"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] text-text-quaternary uppercase tracking-wide mb-1",children:"Task Queue"}),e.jsx("input",{value:_,onChange:s=>ae(s.target.value),className:"input w-full text-[11px] font-mono mb-3",spellCheck:!1,placeholder:"default"})]}),Q&&e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] text-text-quaternary uppercase tracking-wide mb-1",children:"Status"}),e.jsx("input",{value:q||v,onChange:s=>ie(s.target.value),className:"input w-full text-[11px] font-mono mb-3",spellCheck:!1,placeholder:v})]}),c==="escalation"&&e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] text-text-quaternary uppercase tracking-wide mb-1",children:"Escalation ID"}),e.jsx("input",{value:I,onChange:s=>ce(s.target.value),className:"input w-full text-[11px] font-mono mb-3",spellCheck:!1,placeholder:"esc-001"})]}),c==="activity"&&e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] text-text-quaternary uppercase tracking-wide mb-1",children:"Activity Name"}),e.jsx("input",{value:D,onChange:s=>le(s.target.value),className:"input w-full text-[11px] font-mono mb-3",spellCheck:!1,placeholder:"myActivity"})]})]}),e.jsx("label",{className:"block text-[10px] text-text-quaternary uppercase tracking-wide mb-1",children:"Payload"}),e.jsx("textarea",{value:g||m,onChange:s=>E(s.target.value),className:"input-json w-full text-[11px]",rows:6,spellCheck:!1,placeholder:'{ "key": "value" }'}),e.jsx("label",{className:"block text-[10px] text-text-quaternary uppercase tracking-wide mb-1 mt-3",children:"Event Preview"}),e.jsx("pre",{className:"bg-surface-sunken/60 rounded px-2 py-2 text-[10px] font-mono text-text-tertiary overflow-auto max-h-44 whitespace-pre",children:oe}),e.jsx("div",{className:"mt-3",children:e.jsx("button",{onClick:()=>{r.mutate({topic:t.topic,event:U()},{onSuccess:()=>{h(),P(`evt-${Date.now()}-${Math.random().toString(16).slice(2,6)}`)}})},disabled:r.isPending,className:"btn-primary text-xs w-full",children:r.isPending?"Publishing…":"Publish"})}),r.isSuccess&&e.jsx("p",{className:"text-[10px] text-status-success mt-2 animate-page-enter",children:"Event published"}),r.isError&&e.jsx("p",{className:"text-[10px] text-status-error mt-2",children:r.error.message})]})]})]}),n&&e.jsxs("div",{className:"space-y-6 max-w-3xl",children:[e.jsxs("div",{children:[e.jsx("label",{className:"section-header",children:"Description"}),e.jsx("textarea",{value:O,onChange:s=>J(s.target.value),rows:3,className:"input resize-none",placeholder:"What this topic represents"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"section-header",children:"Tags"}),e.jsx("input",{type:"text",value:$,onChange:s=>R(s.target.value),placeholder:"lifecycle, core, error",className:"input font-mono"}),e.jsx("p",{className:"hint",children:"Comma-separated. Used for filtering in the catalog."})]}),e.jsxs("div",{children:[e.jsx("label",{className:"section-header",children:"Payload Schema"}),e.jsx("textarea",{value:j,onChange:s=>{A(s.target.value),p("")},rows:12,className:"input-json w-full",placeholder:`{
4
- "type": "object",
5
- "properties": {
6
- "orderId": { "type": "string" }
7
- }
8
- }`}),M&&e.jsx("p",{className:"text-[10px] text-red-400 mt-1",children:M}),e.jsx("p",{className:"hint",children:"JSON Schema describing the event.data shape."})]})]})]})}export{Me as TopicDetailPage};
9
- //# sourceMappingURL=TopicDetailPage-B2LAQDEg.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TopicDetailPage-B2LAQDEg.js","sources":["../../src/pages/topics/TopicDetailPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useParams, useNavigate } from 'react-router-dom';\nimport { Radio, Bot, Tag, Pencil, Trash2, Save, X, BookOpen, Send, FlaskConical, Info, Braces } from 'lucide-react';\nimport { useTopic, useUpdateTopic, useDeleteTopic, usePublishTopic } from '../../api/topics';\nimport { JsonViewer } from '../../components/common/data/JsonViewer';\nimport { DateValue } from '../../components/common/display/DateValue';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport { useSettings } from '../../api/settings';\n\nconst CATEGORY_COLORS: Record<string, string> = {\n task: 'bg-blue-400/15 text-blue-400',\n workflow: 'bg-accent/15 text-accent',\n escalation: 'bg-amber-400/15 text-amber-400',\n activity: 'bg-cyan-400/15 text-cyan-400',\n knowledge: 'bg-violet-400/15 text-violet-400',\n agent: 'bg-emerald-400/15 text-emerald-400',\n app: 'bg-rose-400/15 text-rose-400',\n milestone: 'bg-violet-400/15 text-violet-400',\n};\n\nfunction SectionHeader({ icon: Icon, color, children }: { icon: React.ElementType; color: string; children: React.ReactNode }) {\n return (\n <div className=\"flex items-center gap-2 mb-3 pb-2 border-b border-surface-border\">\n <Icon className={`w-4 h-4 ${color}`} strokeWidth={1.5} />\n <h2 className=\"section-h2\">{children}</h2>\n </div>\n );\n}\n\nexport function TopicDetailPage() {\n const { topic: encodedTopic } = useParams<{ topic: string }>();\n const topicKey = encodedTopic ? decodeURIComponent(encodedTopic) : null;\n const navigate = useNavigate();\n const { data: topic, isLoading, refetch, isFetching } = useTopic(topicKey);\n const { data: settings } = useSettings();\n const subscriberLabel = settings?.ai?.enabled ? 'agents' : 'automations';\n const updateMutation = useUpdateTopic();\n const deleteMutation = useDeleteTopic();\n const publishMutation = usePublishTopic();\n\n const [editing, setEditing] = useState(false);\n const [publishSubject, setPublishSubject] = useState('');\n const [publishEventId, setPublishEventId] = useState(() => `evt-${Date.now()}-${Math.random().toString(16).slice(2, 6)}`);\n const [publishPayload, setPublishPayload] = useState('');\n // Opt-in envelope extension fields. Which ones are shown depends on the topic\n // family (system.workflow.* shows workflow fields; a custom/file topic shows\n // none). Prefilled like Event ID; sent as top-level event fields.\n const [publishWorkflowName, setPublishWorkflowName] = useState('myWorkflow');\n const [publishWorkflowId, setPublishWorkflowId] = useState('wf-001');\n const [publishTaskQueue, setPublishTaskQueue] = useState('default');\n const [publishStatus, setPublishStatus] = useState('');\n const [publishEscalationId, setPublishEscalationId] = useState('esc-001');\n const [publishActivityName, setPublishActivityName] = useState('myActivity');\n const [editDescription, setEditDescription] = useState('');\n const [editTags, setEditTags] = useState('');\n const [editSchema, setEditSchema] = useState('');\n const [schemaError, setSchemaError] = useState('');\n\n if (isLoading) {\n return <div className=\"animate-pulse space-y-4\"><div className=\"h-8 bg-surface-sunken rounded w-48\" /><div className=\"h-40 bg-surface-sunken rounded\" /></div>;\n }\n\n if (!topic) {\n return (\n <div className=\"flex flex-col items-center justify-center py-20 text-center\">\n <Radio className=\"w-12 h-12 text-text-quaternary mb-4\" strokeWidth={1} />\n <h2 className=\"text-lg font-medium text-text-primary mb-2\">Topic not found</h2>\n </div>\n );\n }\n\n const isSystem = topic.source === 'system';\n const isManaged = topic.managed;\n const editable = !isManaged;\n const categoryPillCls = CATEGORY_COLORS[topic.category] ?? 'bg-zinc-400/15 text-zinc-400';\n\n const defaultPayload = topic.example_payload\n ? JSON.stringify(topic.example_payload, null, 2)\n : topic.payload_schema?.properties\n ? JSON.stringify(Object.fromEntries(Object.keys(topic.payload_schema.properties).map(k => [k, ''])), null, 2)\n : '{}';\n\n // Which envelope extensions belong to this topic's family (\"the system injects\n // fields by type\"). Custom / file / knowledge topics carry none — just data.\n const fam =\n topic.topic.startsWith('system.workflow.') || topic.topic.startsWith('system.task.') ? 'workflow'\n : topic.topic.startsWith('system.escalation.') ? 'escalation'\n : topic.topic.startsWith('system.activity.') ? 'activity'\n : 'none';\n const showWorkflowFields = fam === 'workflow' || fam === 'escalation' || fam === 'activity';\n const showStatus = fam === 'workflow' || fam === 'escalation';\n // Status default mirrors the subject's terminal verb (failed / completed / resolved …).\n const statusDefault = (publishSubject || topic.topic).split('.').pop() ?? '';\n\n // The literal event the publish will send — built from the universal envelope\n // (id, subject, source) + only the family's extension fields + the payload.\n const buildPublishEvent = (): Record<string, any> => {\n let data: Record<string, any> = {};\n try { data = JSON.parse(publishPayload || defaultPayload); } catch { /* invalid JSON */ }\n const subject = (publishSubject || topic.topic) !== topic.topic ? (publishSubject || topic.topic) : undefined;\n const event: Record<string, any> = { id: publishEventId || undefined, source: 'dashboard', data };\n if (subject) event.subject = subject;\n if (showWorkflowFields) {\n event.workflowName = publishWorkflowName;\n event.workflowId = publishWorkflowId;\n event.taskQueue = publishTaskQueue;\n }\n if (showStatus) event.status = publishStatus || statusDefault;\n if (fam === 'escalation') event.escalationId = publishEscalationId;\n if (fam === 'activity') event.activityName = publishActivityName;\n return event;\n };\n // A literal preview of the published envelope (type derived from subject).\n const eventPreview = (() => {\n const { subject, ...rest } = buildPublishEvent();\n return JSON.stringify({ type: subject || topic.topic, timestamp: '<minted>', ...rest }, null, 2);\n })();\n if (!publishPayload && defaultPayload !== '{}') {\n setPublishPayload(defaultPayload);\n }\n if (!publishSubject) {\n setPublishSubject(topic.topic);\n }\n\n const startEdit = () => {\n setEditDescription(topic.description ?? '');\n setEditTags((topic.tags ?? []).join(', '));\n setEditSchema(topic.payload_schema ? JSON.stringify(topic.payload_schema, null, 2) : '');\n setSchemaError('');\n setEditing(true);\n };\n\n const cancelEdit = () => setEditing(false);\n\n const saveEdit = () => {\n const tags = editTags.split(',').map((t) => t.trim()).filter(Boolean);\n let payload_schema: Record<string, any> | undefined;\n if (editSchema.trim()) {\n try {\n payload_schema = JSON.parse(editSchema);\n setSchemaError('');\n } catch {\n setSchemaError('Invalid JSON');\n return;\n }\n }\n updateMutation.mutate(\n { topic: topic.topic, description: editDescription, tags, ...(payload_schema !== undefined ? { payload_schema } : {}) },\n { onSuccess: () => { setEditing(false); refetch(); } },\n );\n };\n\n const handleDelete = () => {\n if (confirm(`Delete topic \"${topic.topic}\"?\\n\\nThis removes it from the catalog. Active subscriptions are not affected.`)) {\n deleteMutation.mutate(topic.topic, { onSuccess: () => navigate('/topics') });\n }\n };\n\n return (\n <div>\n {/* ── Header ───────────────────────────────────────────────── */}\n <div className=\"flex items-start justify-between mb-4\">\n <div>\n <div className=\"flex items-center gap-3 mb-1\">\n <Radio className=\"w-5 h-5 text-accent\" strokeWidth={1.5} />\n <h1 className=\"text-lg font-mono font-medium text-text-primary\">{topic.topic}</h1>\n <button onClick={() => { window.location.hash = '#docs:topics.md'; }} className=\"text-text-quaternary hover:text-accent transition-colors\" title=\"Topic docs\">\n <BookOpen className=\"w-4 h-4\" strokeWidth={1.5} />\n </button>\n </div>\n {!editing && topic.description ? (\n <p className=\"text-sm text-text-secondary leading-relaxed\">{topic.description}</p>\n ) : !editing ? (\n <p className=\"text-sm text-text-quaternary italic\">No description</p>\n ) : null}\n </div>\n <div className=\"flex items-center gap-2 shrink-0\">\n {!editing && editable && (\n <button onClick={startEdit} className=\"flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md bg-accent text-text-inverse hover:bg-accent-hover transition-colors\">\n <Pencil className=\"w-3 h-3\" /> Edit\n </button>\n )}\n {!editing && !isSystem && editable && (\n <button onClick={handleDelete} className=\"flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md text-red-400/60 hover:text-red-400 hover:bg-red-600/10 transition-colors\">\n <Trash2 className=\"w-3 h-3\" /> Delete\n </button>\n )}\n {editing && (\n <>\n <button onClick={saveEdit} disabled={updateMutation.isPending} className=\"flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md bg-accent text-text-inverse hover:bg-accent-hover transition-colors\">\n <Save className=\"w-3 h-3\" /> Save\n </button>\n <button onClick={cancelEdit} className=\"flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md text-text-tertiary hover:text-text-primary hover:bg-surface-hover transition-colors\">\n <X className=\"w-3 h-3\" /> Cancel\n </button>\n </>\n )}\n </div>\n </div>\n\n {/* ── Details band ─────────────────────────────────────────── */}\n <div className=\"bg-surface-sunken/50 rounded-md px-5 py-3 flex flex-wrap gap-x-6 gap-y-3 items-start mb-5 relative\">\n <div>\n <p className=\"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">Category</p>\n <span className={`inline-flex items-center px-2 py-0.5 rounded text-[10px] font-medium ${categoryPillCls}`}>{topic.category}</span>\n </div>\n <div>\n <p className=\"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">Source</p>\n <span className=\"text-xs font-mono text-text-secondary\">{topic.source}</span>\n </div>\n {topic.tags?.length > 0 && (\n <div>\n <p className=\"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">Tags</p>\n <div className=\"flex items-center gap-1.5\">\n <Tag className=\"w-2.5 h-2.5 text-text-quaternary\" strokeWidth={1.5} />\n {topic.tags.map((tag) => (\n <span key={tag} className=\"inline-flex items-center px-1.5 py-0.5 rounded text-[10px] font-mono text-text-tertiary bg-surface-sunken\">{tag}</span>\n ))}\n </div>\n </div>\n )}\n <div>\n <p className=\"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">Created</p>\n <span className=\"text-xs text-text-secondary\"><DateValue date={topic.created_at} /></span>\n </div>\n <div>\n <p className=\"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">Updated</p>\n <span className=\"text-xs text-text-secondary\"><DateValue date={topic.updated_at} /></span>\n </div>\n {topic.last_seen_at && (\n <div>\n <p className=\"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">Last Seen</p>\n <span className=\"text-xs text-text-secondary\"><DateValue date={topic.last_seen_at} /></span>\n </div>\n )}\n <div className=\"ml-auto self-center\">\n <ListToolbar onRefresh={() => refetch()} isFetching={isFetching} apiPath={`/topics/by-name/${encodeURIComponent(topic.topic)}`} />\n </div>\n </div>\n\n {/* ── Three-column layout: Schema | Example | Test ─── */}\n {!editing && (\n <div className=\"grid grid-cols-3 gap-5\">\n {/* Col 1 — Payload Schema */}\n <div className=\"min-w-0\">\n <SectionHeader icon={Radio} color=\"text-accent\">Payload Schema</SectionHeader>\n {topic.payload_schema ? (\n <JsonViewer data={topic.payload_schema} />\n ) : (\n <p className=\"text-[11px] text-text-quaternary\">No schema defined. Click Edit to add one.</p>\n )}\n </div>\n\n {/* Col 2 — Example Payload */}\n <div className=\"min-w-0\">\n <SectionHeader icon={Braces} color=\"text-cyan-400\">Example Payload</SectionHeader>\n {topic.example_payload ? (\n <JsonViewer data={topic.example_payload} />\n ) : (\n <p className=\"text-[11px] text-text-quaternary\">No example defined. Click Edit to add one.</p>\n )}\n </div>\n\n {/* Col 3 — Test */}\n <div className=\"min-w-0 space-y-4 animate-page-enter\">\n <SectionHeader icon={FlaskConical} color=\"text-violet-400\">Test</SectionHeader>\n {/* Target Subscribers */}\n <div className=\"bg-surface-sunken/30 rounded-md px-4 py-3\">\n <div className=\"flex items-center gap-2 mb-2\">\n <Bot className=\"w-3.5 h-3.5 text-emerald-400\" strokeWidth={1.5} />\n <h2 className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Target Subscribers\n </h2>\n <span className=\"relative group ml-auto\">\n <Info className=\"w-3 h-3 text-text-quaternary cursor-help\" strokeWidth={1.5} />\n <span className=\"absolute right-0 top-full mt-1 w-48 p-2 rounded bg-surface-raised border border-surface-border shadow-lg text-[10px] text-text-secondary leading-relaxed hidden group-hover:block z-10\">\n Publishing a test event is live — these subscribers will receive and process the payload.\n </span>\n </span>\n </div>\n {topic.subscribers?.length ? (\n <div className=\"space-y-0.5\">\n {topic.subscribers.map((sub) => (\n <button\n key={sub.id}\n onClick={() => navigate(`/agents/${sub.agent_id}`)}\n className=\"flex items-center gap-2 w-full text-left py-1 rounded hover:bg-surface-hover/50 transition-colors\"\n >\n <Bot className=\"w-2.5 h-2.5 text-emerald-400 shrink-0\" strokeWidth={1.5} />\n <span className=\"text-[11px] text-text-primary hover:text-accent transition-colors truncate\">{sub.agent_name}</span>\n <span className=\"text-[9px] font-mono text-text-quaternary ml-auto shrink-0\">{sub.reaction_type}</span>\n </button>\n ))}\n </div>\n ) : (\n <p className=\"text-[11px] text-text-quaternary\">No {subscriberLabel} subscribed.</p>\n )}\n </div>\n\n {/* Publish */}\n <div className=\"sticky top-16 bg-surface-sunken/40 rounded-md p-4\">\n <div className=\"flex items-center gap-2 mb-3\">\n <Send className=\"w-3.5 h-3.5 text-accent\" strokeWidth={1.5} />\n <h2 className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">Publish</h2>\n </div>\n <label className=\"block text-[10px] text-text-quaternary uppercase tracking-wide mb-1\">Event ID</label>\n <input\n value={publishEventId}\n onChange={(e) => setPublishEventId(e.target.value)}\n className=\"input w-full text-[11px] font-mono mb-3\"\n spellCheck={false}\n placeholder=\"evt-1720368000000-a3f2\"\n />\n <label className=\"block text-[10px] text-text-quaternary uppercase tracking-wide mb-1\">Subject</label>\n <input\n value={publishSubject || topic.topic}\n onChange={(e) => setPublishSubject(e.target.value)}\n className=\"input w-full text-[11px] font-mono mb-3\"\n spellCheck={false}\n />\n {showWorkflowFields && (\n <div className=\"grid grid-cols-2 gap-x-3\">\n <div>\n <label className=\"block text-[10px] text-text-quaternary uppercase tracking-wide mb-1\">Workflow Name</label>\n <input\n value={publishWorkflowName}\n onChange={(e) => setPublishWorkflowName(e.target.value)}\n className=\"input w-full text-[11px] font-mono mb-3\"\n spellCheck={false}\n placeholder=\"myWorkflow\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] text-text-quaternary uppercase tracking-wide mb-1\">Workflow ID</label>\n <input\n value={publishWorkflowId}\n onChange={(e) => setPublishWorkflowId(e.target.value)}\n className=\"input w-full text-[11px] font-mono mb-3\"\n spellCheck={false}\n placeholder=\"wf-001\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] text-text-quaternary uppercase tracking-wide mb-1\">Task Queue</label>\n <input\n value={publishTaskQueue}\n onChange={(e) => setPublishTaskQueue(e.target.value)}\n className=\"input w-full text-[11px] font-mono mb-3\"\n spellCheck={false}\n placeholder=\"default\"\n />\n </div>\n {showStatus && (\n <div>\n <label className=\"block text-[10px] text-text-quaternary uppercase tracking-wide mb-1\">Status</label>\n <input\n value={publishStatus || statusDefault}\n onChange={(e) => setPublishStatus(e.target.value)}\n className=\"input w-full text-[11px] font-mono mb-3\"\n spellCheck={false}\n placeholder={statusDefault}\n />\n </div>\n )}\n {fam === 'escalation' && (\n <div>\n <label className=\"block text-[10px] text-text-quaternary uppercase tracking-wide mb-1\">Escalation ID</label>\n <input\n value={publishEscalationId}\n onChange={(e) => setPublishEscalationId(e.target.value)}\n className=\"input w-full text-[11px] font-mono mb-3\"\n spellCheck={false}\n placeholder=\"esc-001\"\n />\n </div>\n )}\n {fam === 'activity' && (\n <div>\n <label className=\"block text-[10px] text-text-quaternary uppercase tracking-wide mb-1\">Activity Name</label>\n <input\n value={publishActivityName}\n onChange={(e) => setPublishActivityName(e.target.value)}\n className=\"input w-full text-[11px] font-mono mb-3\"\n spellCheck={false}\n placeholder=\"myActivity\"\n />\n </div>\n )}\n </div>\n )}\n <label className=\"block text-[10px] text-text-quaternary uppercase tracking-wide mb-1\">Payload</label>\n <textarea\n value={publishPayload || defaultPayload}\n onChange={(e) => setPublishPayload(e.target.value)}\n className=\"input-json w-full text-[11px]\"\n rows={6}\n spellCheck={false}\n placeholder='{ \"key\": \"value\" }'\n />\n <label className=\"block text-[10px] text-text-quaternary uppercase tracking-wide mb-1 mt-3\">Event Preview</label>\n <pre className=\"bg-surface-sunken/60 rounded px-2 py-2 text-[10px] font-mono text-text-tertiary overflow-auto max-h-44 whitespace-pre\">{eventPreview}</pre>\n <div className=\"mt-3\">\n <button\n onClick={() => {\n publishMutation.mutate(\n { topic: topic.topic, event: buildPublishEvent() },\n { onSuccess: () => {\n refetch();\n // Generate a fresh event ID for the next publish\n setPublishEventId(`evt-${Date.now()}-${Math.random().toString(16).slice(2, 6)}`);\n } },\n );\n }}\n disabled={publishMutation.isPending}\n className=\"btn-primary text-xs w-full\"\n >\n {publishMutation.isPending ? 'Publishing…' : 'Publish'}\n </button>\n </div>\n {publishMutation.isSuccess && (\n <p className=\"text-[10px] text-status-success mt-2 animate-page-enter\">Event published</p>\n )}\n {publishMutation.isError && (\n <p className=\"text-[10px] text-status-error mt-2\">{publishMutation.error.message}</p>\n )}\n </div>\n </div>\n </div>\n )}\n\n {/* ── Edit mode ────────────────────────────────────────────── */}\n {editing && (\n <div className=\"space-y-6 max-w-3xl\">\n <div>\n <label className=\"section-header\">Description</label>\n <textarea\n value={editDescription}\n onChange={(e) => setEditDescription(e.target.value)}\n rows={3}\n className=\"input resize-none\"\n placeholder=\"What this topic represents\"\n />\n </div>\n <div>\n <label className=\"section-header\">Tags</label>\n <input\n type=\"text\"\n value={editTags}\n onChange={(e) => setEditTags(e.target.value)}\n placeholder=\"lifecycle, core, error\"\n className=\"input font-mono\"\n />\n <p className=\"hint\">Comma-separated. Used for filtering in the catalog.</p>\n </div>\n <div>\n <label className=\"section-header\">Payload Schema</label>\n <textarea\n value={editSchema}\n onChange={(e) => { setEditSchema(e.target.value); setSchemaError(''); }}\n rows={12}\n className=\"input-json w-full\"\n placeholder={'{\\n \"type\": \"object\",\\n \"properties\": {\\n \"orderId\": { \"type\": \"string\" }\\n }\\n}'}\n />\n {schemaError && <p className=\"text-[10px] text-red-400 mt-1\">{schemaError}</p>}\n <p className=\"hint\">JSON Schema describing the event.data shape.</p>\n </div>\n </div>\n )}\n </div>\n );\n}\n"],"names":["CATEGORY_COLORS","SectionHeader","Icon","color","children","jsxs","jsx","TopicDetailPage","encodedTopic","useParams","topicKey","navigate","useNavigate","topic","isLoading","refetch","isFetching","useTopic","settings","useSettings","subscriberLabel","_a","updateMutation","useUpdateTopic","deleteMutation","useDeleteTopic","publishMutation","usePublishTopic","editing","setEditing","useState","publishSubject","setPublishSubject","publishEventId","setPublishEventId","publishPayload","setPublishPayload","publishWorkflowName","setPublishWorkflowName","publishWorkflowId","setPublishWorkflowId","publishTaskQueue","setPublishTaskQueue","publishStatus","setPublishStatus","publishEscalationId","setPublishEscalationId","publishActivityName","setPublishActivityName","editDescription","setEditDescription","editTags","setEditTags","editSchema","setEditSchema","schemaError","setSchemaError","Radio","isSystem","editable","categoryPillCls","defaultPayload","_b","k","fam","showWorkflowFields","showStatus","statusDefault","buildPublishEvent","data","subject","event","eventPreview","rest","startEdit","cancelEdit","saveEdit","tags","t","payload_schema","handleDelete","BookOpen","Pencil","Trash2","Fragment","Save","X","_c","Tag","tag","DateValue","ListToolbar","JsonViewer","Braces","FlaskConical","Bot","Info","_d","sub","Send","e"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{a as d,j as e}from"./vendor-query-B2UbickB.js";import{u as f}from"./topics-CZO06VJl.js";import{P as j}from"./PageHeader-CFta2VaS.js";import{ai as v,aT as N,aU as k,b as w,B as C,Z as T,aV as q,v as A,aW as R,R as u,ab as S}from"./vendor-icons-BaQqUm-e.js";import{c as E}from"./vendor-react-CXumBFUA.js";import"./index-CKXSKsVZ.js";const b={task:{icon:R,color:"text-blue-400"},workflow:{icon:A,color:"text-accent"},escalation:{icon:q,color:"text-amber-400"},activity:{icon:T,color:"text-cyan-400"},knowledge:{icon:C,color:"text-violet-400"},agent:{icon:w,color:"text-emerald-400"},app:{icon:k,color:"text-rose-400"},milestone:{icon:N,color:"text-violet-400"}},z={task:"bg-blue-400/15 text-blue-400",workflow:"bg-accent/15 text-accent",escalation:"bg-amber-400/15 text-amber-400",activity:"bg-cyan-400/15 text-cyan-400",knowledge:"bg-violet-400/15 text-violet-400",agent:"bg-emerald-400/15 text-emerald-400",app:"bg-rose-400/15 text-rose-400",milestone:"bg-violet-400/15 text-violet-400"};function I(){const s=E(),[c,m]=d.useState(""),[r,h]=d.useState(null),{data:p,isLoading:g}=f({limit:500}),l=(p==null?void 0:p.topics)??[],x=d.useMemo(()=>{const t=new Set;for(const a of l)t.add(a.category);return Array.from(t).sort()},[l]),y=d.useMemo(()=>{const t=c.toLowerCase().trim();return(r?[r]:x).map(o=>({name:o,topics:l.filter(n=>{var i;return n.category===o&&(!t||n.topic.toLowerCase().includes(t)||((i=n.description)==null?void 0:i.toLowerCase().includes(t)))})})).filter(o=>o.topics.length>0)},[l,x,c,r]);return e.jsxs("div",{children:[e.jsx(j,{title:"Event Topics",docsHash:"#docs:topics.md"}),!g&&x.length>0&&e.jsx("div",{className:"sticky top-0 z-20 bg-surface pt-3 pb-3",children:e.jsxs("div",{className:"bg-[#F7F7F7] rounded-lg px-5 pt-3 pb-3 flex items-center gap-5",children:[e.jsxs("button",{onClick:()=>h(null),className:`flex flex-col items-center gap-1 transition-colors ${r===null?"text-accent":"text-text-quaternary hover:text-text-secondary"}`,children:[e.jsx(v,{className:"w-3 h-3",strokeWidth:1.5}),e.jsx("span",{className:"text-[9px] font-medium",children:"All"})]}),x.map(t=>{const a=b[t]??{icon:u,color:"text-text-tertiary"},o=a.icon,n=r===t;return e.jsxs("button",{onClick:()=>h(n?null:t),className:`flex flex-col items-center gap-1 transition-colors ${n?a.color:"text-text-quaternary hover:text-text-secondary"}`,children:[e.jsx(o,{className:"w-3 h-3",strokeWidth:1.5}),e.jsx("span",{className:"text-[9px] font-medium capitalize",children:t})]},t)}),e.jsx("span",{className:"flex-1"}),e.jsxs("div",{className:"relative",children:[e.jsx(S,{className:"absolute left-0 top-1/2 -translate-y-1/2 w-3 h-3 text-text-quaternary"}),e.jsx("input",{type:"text",value:c,onChange:t=>m(t.target.value),placeholder:`Search ${l.length} topics…`,className:"pl-5 py-1 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 w-48"})]})]})}),g?e.jsx("div",{className:"animate-pulse space-y-8 mt-4",children:[1,2,3].map(t=>e.jsxs("div",{children:[e.jsx("div",{className:"h-4 bg-surface-sunken rounded w-28 mb-4"}),e.jsx("div",{className:"space-y-3",children:[1,2,3,4].map(a=>e.jsxs("div",{className:"space-y-1.5",children:[e.jsx("div",{className:"h-3 bg-surface-sunken rounded w-64"}),e.jsx("div",{className:"h-3 bg-surface-sunken rounded w-full"})]},a))})]},t))}):y.length===0?e.jsx("p",{className:"text-sm text-text-tertiary mt-8",children:c||r?"No topics match your filter.":"No topics registered yet."}):e.jsx("div",{className:"space-y-10",children:y.map(({name:t,topics:a})=>{const o=b[t]??{icon:u,color:"text-text-tertiary"},n=o.icon;return e.jsxs("div",{children:[e.jsxs("div",{className:"sticky top-[78px] z-10 bg-surface flex items-center gap-2 py-2 mb-2 border-b border-surface-border",children:[e.jsx(n,{className:`w-3 h-3 ${o.color}`,strokeWidth:1.5}),e.jsx("h2",{className:"section-h2 capitalize",children:t}),e.jsx("span",{className:"text-xs text-text-quaternary",children:a.length})]}),e.jsx("div",{className:"divide-y divide-surface-border/30",children:a.map(i=>e.jsx(L,{topic:i,onClick:()=>s(`/topics/${encodeURIComponent(i.topic)}`)},i.topic))})]},t)})})]})}function L({topic:s,onClick:c}){const m=z[s.category]??"bg-zinc-400/15 text-zinc-400";return e.jsxs("div",{role:"button",tabIndex:0,onClick:c,onKeyDown:r=>{(r.key==="Enter"||r.key===" ")&&c()},className:"group py-3 px-3 -mx-3 rounded-md cursor-pointer transition-colors text-left",children:[e.jsxs("div",{className:"flex items-center gap-3 mb-0.5",children:[e.jsx(u,{className:"w-3 h-3 shrink-0 text-text-quaternary group-hover:text-text-tertiary transition-colors",strokeWidth:1.5}),e.jsx("span",{className:"text-xs font-mono text-text-primary truncate",children:s.topic}),e.jsx("span",{className:`ml-1 inline-flex items-center px-1.5 py-0.5 rounded text-[10px] font-medium shrink-0 ${m}`,children:s.category}),(s.subscriber_count??0)>0&&e.jsx("span",{className:"inline-flex items-center justify-center min-w-[18px] px-1 py-0.5 rounded-full text-[10px] font-medium bg-accent/15 text-accent shrink-0",children:s.subscriber_count}),e.jsx("span",{className:"ml-auto text-[10px] font-mono text-text-quaternary shrink-0",children:s.source})]}),s.description&&e.jsx("p",{className:"pl-6 text-[11px] text-text-tertiary group-hover:text-text-secondary leading-relaxed line-clamp-1 transition-colors",children:s.description})]})}export{I as TopicsPage};
2
- //# sourceMappingURL=TopicsPage-SwPAnN2C.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TopicsPage-SwPAnN2C.js","sources":["../../src/pages/topics/TopicsPage.tsx"],"sourcesContent":["import { useState, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport {\n Search, LayoutGrid, Radio,\n CheckSquare, GitBranch, AlertTriangle, Zap,\n BookOpen, Bot, AppWindow, Flag,\n} from 'lucide-react';\nimport { useTopics, type TopicCatalogEntry } from '../../api/topics';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport type { LucideIcon } from 'lucide-react';\n\n// ── Category meta ──────────────────────────────────────────────────────────────\n\nconst CATEGORY_META: Record<string, { icon: LucideIcon; color: string }> = {\n task: { icon: CheckSquare, color: 'text-blue-400' },\n workflow: { icon: GitBranch, color: 'text-accent' },\n escalation: { icon: AlertTriangle, color: 'text-amber-400' },\n activity: { icon: Zap, color: 'text-cyan-400' },\n knowledge: { icon: BookOpen, color: 'text-violet-400' },\n agent: { icon: Bot, color: 'text-emerald-400' },\n app: { icon: AppWindow, color: 'text-rose-400' },\n milestone: { icon: Flag, color: 'text-violet-400' },\n};\n\nconst CATEGORY_COLORS: Record<string, string> = {\n task: 'bg-blue-400/15 text-blue-400',\n workflow: 'bg-accent/15 text-accent',\n escalation: 'bg-amber-400/15 text-amber-400',\n activity: 'bg-cyan-400/15 text-cyan-400',\n knowledge: 'bg-violet-400/15 text-violet-400',\n agent: 'bg-emerald-400/15 text-emerald-400',\n app: 'bg-rose-400/15 text-rose-400',\n milestone: 'bg-violet-400/15 text-violet-400',\n};\n\n// ── Page ──────────────────────────────────────────────────────────────────────\n\nexport function TopicsPage() {\n const navigate = useNavigate();\n const [search, setSearch] = useState('');\n const [activeCategory, setActiveCategory] = useState<string | null>(null);\n\n const { data, isLoading } = useTopics({ limit: 500 });\n const allTopics: TopicCatalogEntry[] = data?.topics ?? [];\n\n const categories = useMemo(() => {\n const seen = new Set<string>();\n for (const t of allTopics) seen.add(t.category);\n return Array.from(seen).sort();\n }, [allTopics]);\n\n const grouped = useMemo(() => {\n const q = search.toLowerCase().trim();\n const cats = activeCategory ? [activeCategory] : categories;\n return cats\n .map((cat) => ({\n name: cat,\n topics: allTopics.filter(\n (t) =>\n t.category === cat &&\n (!q || t.topic.toLowerCase().includes(q) || t.description?.toLowerCase().includes(q)),\n ),\n }))\n .filter((g) => g.topics.length > 0);\n }, [allTopics, categories, search, activeCategory]);\n\n return (\n <div>\n <PageHeader title=\"Event Topics\" docsHash=\"#docs:topics.md\" />\n\n {/* Sticky filter bar: category icons + search */}\n {!isLoading && categories.length > 0 && (\n <div className=\"sticky top-0 z-20 bg-surface pt-3 pb-3\">\n <div className=\"bg-[#F7F7F7] rounded-lg px-5 pt-3 pb-3 flex items-center gap-5\">\n <button\n onClick={() => setActiveCategory(null)}\n className={`flex flex-col items-center gap-1 transition-colors ${\n activeCategory === null ? 'text-accent' : 'text-text-quaternary hover:text-text-secondary'\n }`}\n >\n <LayoutGrid className=\"w-3 h-3\" strokeWidth={1.5} />\n <span className=\"text-[9px] font-medium\">All</span>\n </button>\n {categories.map((cat) => {\n const meta = CATEGORY_META[cat] ?? { icon: Radio, color: 'text-text-tertiary' };\n const Icon = meta.icon;\n const isActive = activeCategory === cat;\n return (\n <button\n key={cat}\n onClick={() => setActiveCategory(isActive ? null : cat)}\n className={`flex flex-col items-center gap-1 transition-colors ${\n isActive ? meta.color : 'text-text-quaternary hover:text-text-secondary'\n }`}\n >\n <Icon className=\"w-3 h-3\" strokeWidth={1.5} />\n <span className=\"text-[9px] font-medium capitalize\">{cat}</span>\n </button>\n );\n })}\n <span className=\"flex-1\" />\n <div className=\"relative\">\n <Search className=\"absolute left-0 top-1/2 -translate-y-1/2 w-3 h-3 text-text-quaternary\" />\n <input\n type=\"text\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder={`Search ${allTopics.length} topics…`}\n className=\"pl-5 py-1 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 w-48\"\n />\n </div>\n </div>\n </div>\n )}\n\n {/* Topic list */}\n {isLoading ? (\n <div className=\"animate-pulse space-y-8 mt-4\">\n {[1, 2, 3].map((i) => (\n <div key={i}>\n <div className=\"h-4 bg-surface-sunken rounded w-28 mb-4\" />\n <div className=\"space-y-3\">\n {[1, 2, 3, 4].map((j) => (\n <div key={j} className=\"space-y-1.5\">\n <div className=\"h-3 bg-surface-sunken rounded w-64\" />\n <div className=\"h-3 bg-surface-sunken rounded w-full\" />\n </div>\n ))}\n </div>\n </div>\n ))}\n </div>\n ) : grouped.length === 0 ? (\n <p className=\"text-sm text-text-tertiary mt-8\">\n {search || activeCategory ? 'No topics match your filter.' : 'No topics registered yet.'}\n </p>\n ) : (\n <div className=\"space-y-10\">\n {grouped.map(({ name, topics }) => {\n const meta = CATEGORY_META[name] ?? { icon: Radio, color: 'text-text-tertiary' };\n const Icon = meta.icon;\n return (\n <div key={name}>\n <div className=\"sticky top-[78px] z-10 bg-surface flex items-center gap-2 py-2 mb-2 border-b border-surface-border\">\n <Icon className={`w-3 h-3 ${meta.color}`} strokeWidth={1.5} />\n <h2 className=\"section-h2 capitalize\">{name}</h2>\n <span className=\"text-xs text-text-quaternary\">{topics.length}</span>\n </div>\n <div className=\"divide-y divide-surface-border/30\">\n {topics.map((topic) => (\n <TopicRow\n key={topic.topic}\n topic={topic}\n onClick={() => navigate(`/topics/${encodeURIComponent(topic.topic)}`)}\n />\n ))}\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n\n// ── Topic row ──────────────────────────────────────────────────────────────────\n\nfunction TopicRow({ topic, onClick }: { topic: TopicCatalogEntry; onClick: () => void }) {\n const pillCls = CATEGORY_COLORS[topic.category] ?? 'bg-zinc-400/15 text-zinc-400';\n return (\n <div\n role=\"button\"\n tabIndex={0}\n onClick={onClick}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') onClick(); }}\n className=\"group py-3 px-3 -mx-3 rounded-md cursor-pointer transition-colors text-left\"\n >\n <div className=\"flex items-center gap-3 mb-0.5\">\n <Radio className=\"w-3 h-3 shrink-0 text-text-quaternary group-hover:text-text-tertiary transition-colors\" strokeWidth={1.5} />\n <span className=\"text-xs font-mono text-text-primary truncate\">{topic.topic}</span>\n <span className={`ml-1 inline-flex items-center px-1.5 py-0.5 rounded text-[10px] font-medium shrink-0 ${pillCls}`}>\n {topic.category}\n </span>\n {(topic.subscriber_count ?? 0) > 0 && (\n <span className=\"inline-flex items-center justify-center min-w-[18px] px-1 py-0.5 rounded-full text-[10px] font-medium bg-accent/15 text-accent shrink-0\">\n {topic.subscriber_count}\n </span>\n )}\n <span className=\"ml-auto text-[10px] font-mono text-text-quaternary shrink-0\">{topic.source}</span>\n </div>\n {topic.description && (\n <p className=\"pl-6 text-[11px] text-text-tertiary group-hover:text-text-secondary leading-relaxed line-clamp-1 transition-colors\">\n {topic.description}\n </p>\n )}\n </div>\n );\n}\n"],"names":["CATEGORY_META","CheckSquare","GitBranch","AlertTriangle","Zap","BookOpen","Bot","AppWindow","Flag","CATEGORY_COLORS","TopicsPage","navigate","useNavigate","search","setSearch","useState","activeCategory","setActiveCategory","data","isLoading","useTopics","allTopics","categories","useMemo","seen","t","grouped","q","cat","_a","g","jsx","PageHeader","jsxs","LayoutGrid","meta","Radio","Icon","isActive","Search","e","i","j","name","topics","topic","TopicRow","onClick","pillCls"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{j as n}from"./vendor-query-B2UbickB.js";import{W as r,Z as u,c as m,S as d,ad as h}from"./vendor-icons-BaQqUm-e.js";const a=[{text:"text-rose-400",bg:"bg-rose-400/[0.08]"},{text:"text-pink-400",bg:"bg-pink-400/[0.08]"},{text:"text-fuchsia-400",bg:"bg-fuchsia-400/[0.08]"},{text:"text-purple-400",bg:"bg-purple-400/[0.08]"},{text:"text-violet-400",bg:"bg-violet-400/[0.08]"},{text:"text-indigo-400",bg:"bg-indigo-400/[0.08]"},{text:"text-blue-400",bg:"bg-blue-400/[0.08]"},{text:"text-sky-400",bg:"bg-sky-400/[0.08]"},{text:"text-cyan-400",bg:"bg-cyan-400/[0.08]"},{text:"text-teal-400",bg:"bg-teal-400/[0.08]"},{text:"text-emerald-400",bg:"bg-emerald-400/[0.08]"},{text:"text-green-400",bg:"bg-green-400/[0.08]"},{text:"text-lime-400",bg:"bg-lime-400/[0.08]"},{text:"text-yellow-400",bg:"bg-yellow-400/[0.08]"},{text:"text-amber-400",bg:"bg-amber-400/[0.08]"},{text:"text-orange-400",bg:"bg-orange-400/[0.08]"},{text:"text-red-400",bg:"bg-red-400/[0.08]"},{text:"text-stone-400",bg:"bg-stone-400/[0.08]"},{text:"text-rose-300",bg:"bg-rose-300/[0.08]"},{text:"text-violet-300",bg:"bg-violet-300/[0.08]"},{text:"text-sky-300",bg:"bg-sky-300/[0.08]"},{text:"text-teal-300",bg:"bg-teal-300/[0.08]"},{text:"text-amber-300",bg:"bg-amber-300/[0.08]"},{text:"text-pink-300",bg:"bg-pink-300/[0.08]"}];function f(t){let x=0;for(let g=0;g<t.length;g++)x=(x<<5)-x+t.charCodeAt(g)|0;return Math.abs(x)}function k(t){return a[f(t)%a.length]}const y={certified:h,registered:d,pipeline:m,capability:u,durable:r},w={certified:{text:"text-status-success",bg:"bg-status-success/10"},registered:{text:"text-amber-500/70",bg:"bg-amber-200/[0.12]"}},C={xs:{bulb:"w-4 h-4",icon:"w-2 h-2",text:"text-[9px]",pad:"pr-1.5 pl-0.5",gap:"-ml-1"},sm:{bulb:"w-5 h-5",icon:"w-2.5 h-2.5",text:"text-[11px]",pad:"pr-2 pl-1",gap:"-ml-1.5"},md:{bulb:"w-6 h-6",icon:"w-3 h-3",text:"text-[13px]",pad:"pr-2.5 pl-1.5",gap:"-ml-2"}};function I({type:t,size:x="sm",certified:g,variant:i}){const l=i??(g?"certified":"durable"),c=y[l]??r,b=C[x],e=w[l],s=e?null:k(t),p=(e==null?void 0:e.text)??(s==null?void 0:s.text)??"text-accent/75",o=(e==null?void 0:e.bg)??(s==null?void 0:s.bg)??"bg-accent/[0.08]";return n.jsxs("span",{className:"inline-flex items-center",children:[n.jsx("span",{className:`${b.bulb} rounded-full ${o} inline-flex items-center justify-center shrink-0 z-[1]`,children:n.jsx(c,{className:`${b.icon} ${p}`})}),n.jsx("span",{className:`${b.gap} ${b.pad} ${o} rounded-r-full font-mono text-text-secondary`,style:{fontSize:b.text==="text-[9px]"?"9px":b.text==="text-[11px]"?"11px":"13px",lineHeight:1.4},children:t})]})}export{I as W};
2
- //# sourceMappingURL=WorkflowPill-BuNkWUVM.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"WorkflowPill-BuNkWUVM.js","sources":["../../src/lib/type-color.ts","../../src/components/common/display/WorkflowPill.tsx"],"sourcesContent":["/**\n * Deterministic color assignment for workflow type names.\n *\n * Maps any string to a consistent color from a curated 24-color palette.\n * The same type name always produces the same color across the entire UI.\n * Uses a simple hash to distribute names evenly across the palette.\n *\n * Each entry provides:\n * text — icon and text color (Tailwind class)\n * bg — subtle background tint (Tailwind class)\n */\n\nconst PALETTE: Array<{ text: string; bg: string }> = [\n { text: 'text-rose-400', bg: 'bg-rose-400/[0.08]' },\n { text: 'text-pink-400', bg: 'bg-pink-400/[0.08]' },\n { text: 'text-fuchsia-400', bg: 'bg-fuchsia-400/[0.08]' },\n { text: 'text-purple-400', bg: 'bg-purple-400/[0.08]' },\n { text: 'text-violet-400', bg: 'bg-violet-400/[0.08]' },\n { text: 'text-indigo-400', bg: 'bg-indigo-400/[0.08]' },\n { text: 'text-blue-400', bg: 'bg-blue-400/[0.08]' },\n { text: 'text-sky-400', bg: 'bg-sky-400/[0.08]' },\n { text: 'text-cyan-400', bg: 'bg-cyan-400/[0.08]' },\n { text: 'text-teal-400', bg: 'bg-teal-400/[0.08]' },\n { text: 'text-emerald-400', bg: 'bg-emerald-400/[0.08]' },\n { text: 'text-green-400', bg: 'bg-green-400/[0.08]' },\n { text: 'text-lime-400', bg: 'bg-lime-400/[0.08]' },\n { text: 'text-yellow-400', bg: 'bg-yellow-400/[0.08]' },\n { text: 'text-amber-400', bg: 'bg-amber-400/[0.08]' },\n { text: 'text-orange-400', bg: 'bg-orange-400/[0.08]' },\n { text: 'text-red-400', bg: 'bg-red-400/[0.08]' },\n { text: 'text-stone-400', bg: 'bg-stone-400/[0.08]' },\n { text: 'text-rose-300', bg: 'bg-rose-300/[0.08]' },\n { text: 'text-violet-300', bg: 'bg-violet-300/[0.08]' },\n { text: 'text-sky-300', bg: 'bg-sky-300/[0.08]' },\n { text: 'text-teal-300', bg: 'bg-teal-300/[0.08]' },\n { text: 'text-amber-300', bg: 'bg-amber-300/[0.08]' },\n { text: 'text-pink-300', bg: 'bg-pink-300/[0.08]' },\n];\n\nfunction hash(str: string): number {\n let h = 0;\n for (let i = 0; i < str.length; i++) {\n h = ((h << 5) - h + str.charCodeAt(i)) | 0;\n }\n return Math.abs(h);\n}\n\nexport function typeColor(typeName: string): { text: string; bg: string } {\n return PALETTE[hash(typeName) % PALETTE.length];\n}\n","import { Workflow, ShieldCheck, SlidersHorizontal, Wand2, Zap } from 'lucide-react';\nimport { typeColor } from '../../../lib/type-color';\n\ntype WorkflowVariant = 'durable' | 'registered' | 'certified' | 'pipeline' | 'capability';\n\ninterface WorkflowPillProps {\n type: string;\n size?: 'xs' | 'sm' | 'md';\n /** @deprecated Use `variant` instead */\n certified?: boolean;\n variant?: WorkflowVariant;\n}\n\nconst VARIANT_ICON: Record<WorkflowVariant, typeof Workflow> = {\n certified: ShieldCheck,\n registered: SlidersHorizontal,\n pipeline: Wand2,\n capability: Zap,\n durable: Workflow,\n};\n\nconst VARIANT_FIXED_COLOR: Record<string, { text: string; bg: string }> = {\n certified: { text: 'text-status-success', bg: 'bg-status-success/10' },\n registered: { text: 'text-amber-500/70', bg: 'bg-amber-200/[0.12]' },\n};\n\nconst SIZE_CONFIG = {\n xs: { bulb: 'w-4 h-4', icon: 'w-2 h-2', text: 'text-[9px]', pad: 'pr-1.5 pl-0.5', gap: '-ml-1' },\n sm: { bulb: 'w-5 h-5', icon: 'w-2.5 h-2.5', text: 'text-[11px]', pad: 'pr-2 pl-1', gap: '-ml-1.5' },\n md: { bulb: 'w-6 h-6', icon: 'w-3 h-3', text: 'text-[13px]', pad: 'pr-2.5 pl-1.5', gap: '-ml-2' },\n} as const;\n\nexport function WorkflowPill({ type, size = 'sm', certified, variant }: WorkflowPillProps) {\n const resolved = variant ?? (certified ? 'certified' : 'durable');\n // Callers pass server-provided tier strings here — fall back to the durable\n // icon on an unrecognized value so version skew degrades instead of crashing.\n const Icon = VARIANT_ICON[resolved] ?? Workflow;\n const s = SIZE_CONFIG[size];\n\n const fixed = VARIANT_FIXED_COLOR[resolved];\n const derived = fixed ? null : typeColor(type);\n const iconColor = fixed?.text ?? derived?.text ?? 'text-accent/75';\n const bgColor = fixed?.bg ?? derived?.bg ?? 'bg-accent/[0.08]';\n\n return (\n <span className=\"inline-flex items-center\">\n {/* Bulb — circular icon container */}\n <span className={`${s.bulb} rounded-full ${bgColor} inline-flex items-center justify-center shrink-0 z-[1]`}>\n <Icon className={`${s.icon} ${iconColor}`} />\n </span>\n {/* Label — extends right, overlapping the bulb */}\n <span\n className={`${s.gap} ${s.pad} ${bgColor} rounded-r-full font-mono text-text-secondary`}\n style={{ fontSize: s.text === 'text-[9px]' ? '9px' : s.text === 'text-[11px]' ? '11px' : '13px', lineHeight: 1.4 }}\n >\n {type}\n </span>\n </span>\n );\n}\n"],"names":["PALETTE","hash","str","h","i","typeColor","typeName","VARIANT_ICON","ShieldCheck","SlidersHorizontal","Wand2","Zap","Workflow","VARIANT_FIXED_COLOR","SIZE_CONFIG","WorkflowPill","type","size","certified","variant","resolved","Icon","s","fixed","derived","iconColor","bgColor","jsxs","jsx"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{a as d,j as t}from"./vendor-query-B2UbickB.js";import{E as z}from"./ElapsedCell-B8TrnyT5.js";import{j as A,b as v}from"./index-CKXSKsVZ.js";import{u as E,d as $,b as L}from"./workflows-BTkHs6VT.js";import{u as M}from"./useNamespace-BBzCmCIN.js";import{b as I}from"./useEventHooks-DlWkui_n.js";import{u as U}from"./useFilterParams-x-Dg0Vgz.js";import{b as O}from"./api-path-u2Jf9QXS.js";import{D as B}from"./DataTable-ZWgVQg7F.js";import{W as H}from"./WorkflowPill-BuNkWUVM.js";import{P as V}from"./PageHeader-CFta2VaS.js";import{F as G,c as f,b as x}from"./FilterBar-BQ2JGg8U.js";import{S as J}from"./StickyPagination-GQKFFTjL.js";import{L as q}from"./ListToolbar--FkPpYDY.js";import{R as K,a as k}from"./RowActions-BA9L9djf.js";import{u as Q,y as X}from"./vendor-icons-BaQqUm-e.js";import{c as Y}from"./vendor-react-CXumBFUA.js";import"./controlplane-BrwK_MT8.js";import"./EmptyState-BcsfPq9T.js";const Z={running:"in_progress",completed:"completed",failed:"failed"},ee={in_progress:"bg-status-active",completed:"bg-status-success",failed:"bg-status-error"},te={running:"text-status-active",completed:"text-status-success",failed:"text-status-error"};function se(p,n,m,l,a){return[{key:"workflow_id",label:"Workflow ID",render:e=>{const o=ee[Z[e.status]??e.status]??"bg-status-pending",r=e.status==="running"?" animate-pulse":"";return t.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[t.jsx("span",{className:`w-1.5 h-1.5 shrink-0 rounded-full ${o}${r}`,title:e.status}),t.jsx("span",{className:"font-mono text-xs text-text-primary truncate",children:e.workflow_id})]})}},{key:"entity",label:"Type",render:e=>t.jsx(H,{type:e.entity,variant:a.get(e.entity)??"durable",size:"xs"}),className:"w-44 shrink-0"},{key:"created_at",label:"Created",render:e=>t.jsx(v,{date:e.created_at,format:"relative",className:"text-xs text-text-secondary whitespace-nowrap"}),className:"w-32",sortable:!0},{key:"updated_at",label:"Updated",render:e=>t.jsx(v,{date:e.updated_at,format:"relative",className:"text-xs text-text-secondary whitespace-nowrap"}),className:"w-32",sortable:!0},{key:"duration",label:"Duration",render:e=>t.jsx(z,{startDate:e.created_at,endDate:e.status==="running"?null:e.updated_at,isLive:e.status==="running"}),className:"w-28"},{key:"actions",label:"",render:e=>t.jsxs(K,{children:[t.jsx(k,{icon:Q,title:`Filter by ${e.entity}`,onClick:()=>p(e.entity)}),t.jsx("button",{onClick:o=>{o.stopPropagation(),n(e.status)},className:"opacity-0 group-hover/row:opacity-100 transition-opacity",title:`Filter by ${e.status}`,children:t.jsx("svg",{className:`w-[18px] h-[18px] ${te[e.status]??"text-text-tertiary"} hover:opacity-70`,viewBox:"0 0 24 24",fill:"currentColor",children:t.jsx("circle",{cx:"12",cy:"12",r:"6"})})}),m&&t.jsx(k,{icon:X,title:"View config",onClick:()=>l(`/workflows/registry/${encodeURIComponent(e.entity)}`)})]}),className:"w-24 text-right"}]}function ke({tier:p="all"}){I();const n=Y(),{isSuperAdmin:m}=A(),{namespace:l}=M(),{filters:a,setFilter:e,pagination:o,sort:r,setSort:j}=U({filters:{search:"",entity:"",status:"",tier:p}}),c=a.tier||"all",g=c==="certified"?"true":c==="durable"?"false":void 0,{data:b}=E(),{data:y}=$(),S=d.useMemo(()=>{const s=new Map;for(const w of y??[])s.set(w.workflow_type,w.tier??"durable");return s},[y]),_=se(s=>e("entity",s),s=>e("status",s),m,n,S),[u,C]=d.useState(a.search);d.useEffect(()=>{if(u===a.search)return;const s=setTimeout(()=>e("search",u),300);return()=>clearTimeout(s)},[u,e,a.search]);const{data:i,isLoading:N,refetch:P,isFetching:T}=L({limit:o.pageSize,offset:o.offset,entity:a.entity||void 0,search:a.search||void 0,status:a.status||void 0,sort_by:r.sort_by||"created_at",order:r.order||"desc",registered:g,namespace:l||void 0}),h=(i==null?void 0:i.total)??0,F=(i==null?void 0:i.jobs)??[],D=d.useMemo(()=>[...new Set((b??[]).map(s=>s.workflow_type))].sort(),[b]),R="Workflow Executions",W=c==="certified"?"No certified workflow executions found":c==="durable"?"No durable workflow executions found":"No workflow executions found";return t.jsxs("div",{children:[t.jsx(V,{title:R,docsHash:"#docs:dashboard.md:durable-executions"}),t.jsxs(G,{actions:t.jsx(q,{onRefresh:()=>P(),isFetching:T,apiPath:O("/workflow-states/jobs",{limit:o.pageSize,offset:o.offset,entity:a.entity||void 0,search:a.search||void 0,status:a.status||void 0,sort_by:r.sort_by||"created_at",order:r.order||"desc",registered:g,namespace:l||void 0})}),children:[t.jsx("input",{type:"text",placeholder:"Search workflow ID...",value:u,onChange:s=>C(s.target.value),className:"input text-[11px] py-1 px-2 w-56"}),t.jsx(f,{}),t.jsx(x,{label:"Type",value:a.entity,onChange:s=>e("entity",s),options:D.map(s=>({value:s,label:s}))}),t.jsx(f,{}),t.jsx(x,{label:"Status",value:a.status,onChange:s=>e("status",s),options:[{value:"running",label:"Running"},{value:"completed",label:"Completed"},{value:"failed",label:"Failed"}]}),t.jsx(f,{}),t.jsx(x,{label:"Tier",value:a.tier==="all"?"":a.tier,onChange:s=>e("tier",s||"all"),options:[{value:"certified",label:"Certified"},{value:"durable",label:"Durable"}]})]}),t.jsx(B,{columns:_,data:F,keyFn:s=>s.workflow_id,onRowClick:s=>n(`/workflows/executions/${s.workflow_id}`),isLoading:N,emptyMessage:W,sort:r,onSort:j}),t.jsx(J,{page:o.page,totalPages:o.totalPages(h),onPageChange:o.setPage,total:h,pageSize:o.pageSize,onPageSizeChange:o.setPageSize})]})}export{ke as WorkflowsDashboard};
2
- //# sourceMappingURL=WorkflowsDashboard-CvWSgQdE.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"WorkflowsDashboard-CvWSgQdE.js","sources":["../../src/pages/workflows/WorkflowsDashboard.tsx"],"sourcesContent":["import { useState, useEffect, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { Filter, Settings } from 'lucide-react';\nimport { ElapsedCell } from '../../components/common/display/ElapsedCell';\nimport { DateValue } from '../../components/common/display/DateValue';\nimport { useJobs, useWorkflowConfigs, useDiscoveredWorkflows } from '../../api/workflows';\nimport { useAuth } from '../../hooks/useAuth';\nimport { useNamespace } from '../../hooks/useNamespace';\nimport { useWorkflowListEvents } from '../../hooks/useEventHooks';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { buildApiPath } from '../../lib/api-path';\nimport { DataTable, type Column } from '../../components/common/data/DataTable';\nimport { WorkflowPill } from '../../components/common/display/WorkflowPill';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { FilterBar, FilterSelect, FilterDivider } from '../../components/common/data/FilterBar';\nimport { StickyPagination } from '../../components/common/data/StickyPagination';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport { RowAction, RowActionGroup } from '../../components/common/layout/RowActions';\nimport type { LTJob, WorkflowTier } from '../../api/types';\n\nexport type ExecutionsTier = 'all' | 'certified' | 'durable';\n\nconst jobStatusMap: Record<string, string> = {\n running: 'in_progress',\n completed: 'completed',\n failed: 'failed',\n};\n\nconst STATUS_DOT: Record<string, string> = {\n in_progress: 'bg-status-active',\n completed: 'bg-status-success',\n failed: 'bg-status-error',\n};\n\nconst STATUS_COLORS: Record<string, string> = {\n running: 'text-status-active',\n completed: 'text-status-success',\n failed: 'text-status-error',\n};\n\nfunction buildColumns(\n onFilterEntity: (entity: string) => void,\n onFilterStatus: (status: string) => void,\n isSuperAdmin: boolean,\n navigate: (path: string) => void,\n tierMap: Map<string, WorkflowTier>,\n): Column<LTJob>[] {\n return [\n {\n key: 'workflow_id',\n label: 'Workflow ID',\n render: (row) => {\n const dotClass = STATUS_DOT[jobStatusMap[row.status] ?? row.status] ?? 'bg-status-pending';\n const pulseClass = row.status === 'running' ? ' animate-pulse' : '';\n return (\n <div className=\"flex items-center gap-2 min-w-0\">\n <span className={`w-1.5 h-1.5 shrink-0 rounded-full ${dotClass}${pulseClass}`} title={row.status} />\n <span className=\"font-mono text-xs text-text-primary truncate\">{row.workflow_id}</span>\n </div>\n );\n },\n },\n {\n key: 'entity',\n label: 'Type',\n render: (row) => <WorkflowPill type={row.entity} variant={tierMap.get(row.entity) ?? 'durable'} size=\"xs\" />,\n className: 'w-44 shrink-0',\n },\n {\n key: 'created_at',\n label: 'Created',\n render: (row) => <DateValue date={row.created_at} format=\"relative\" className=\"text-xs text-text-secondary whitespace-nowrap\" />,\n className: 'w-32',\n sortable: true,\n },\n {\n key: 'updated_at',\n label: 'Updated',\n render: (row) => <DateValue date={row.updated_at} format=\"relative\" className=\"text-xs text-text-secondary whitespace-nowrap\" />,\n className: 'w-32',\n sortable: true,\n },\n {\n key: 'duration',\n label: 'Duration',\n render: (row) => (\n <ElapsedCell\n startDate={row.created_at}\n endDate={row.status === 'running' ? null : row.updated_at}\n isLive={row.status === 'running'}\n />\n ),\n className: 'w-28',\n },\n {\n key: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n <RowAction\n icon={Filter}\n title={`Filter by ${row.entity}`}\n onClick={() => onFilterEntity(row.entity)}\n />\n <button\n onClick={(e) => { e.stopPropagation(); onFilterStatus(row.status); }}\n className=\"opacity-0 group-hover/row:opacity-100 transition-opacity\"\n title={`Filter by ${row.status}`}\n >\n <svg className={`w-[18px] h-[18px] ${STATUS_COLORS[row.status] ?? 'text-text-tertiary'} hover:opacity-70`} viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <circle cx=\"12\" cy=\"12\" r=\"6\" />\n </svg>\n </button>\n {isSuperAdmin && (\n <RowAction\n icon={Settings}\n title=\"View config\"\n onClick={() => navigate(`/workflows/registry/${encodeURIComponent(row.entity)}`)}\n />\n )}\n </RowActionGroup>\n ),\n className: 'w-24 text-right',\n },\n ];\n}\n\nexport function WorkflowsDashboard({ tier: initialTier = 'all' }: { tier?: ExecutionsTier }) {\n useWorkflowListEvents();\n const navigate = useNavigate();\n const { isSuperAdmin } = useAuth();\n const { namespace } = useNamespace();\n\n const { filters, setFilter, pagination, sort, setSort } = useFilterParams({\n filters: { search: '', entity: '', status: '', tier: initialTier },\n });\n\n const activeTier = (filters.tier || 'all') as ExecutionsTier;\n\n // Map tier to server-side registered filter\n const registeredFilter = activeTier === 'certified' ? 'true'\n : activeTier === 'durable' ? 'false'\n : undefined;\n\n const { data: configs } = useWorkflowConfigs();\n const { data: discoveredData } = useDiscoveredWorkflows();\n\n const tierMap = useMemo(() => {\n const map = new Map<string, WorkflowTier>();\n for (const dw of discoveredData ?? []) {\n map.set(dw.workflow_type, dw.tier ?? 'durable');\n }\n return map;\n }, [discoveredData]);\n\n const columns = buildColumns(\n (entity) => setFilter('entity', entity),\n (status) => setFilter('status', status),\n isSuperAdmin,\n navigate,\n tierMap,\n );\n const [searchInput, setSearchInput] = useState(filters.search);\n\n useEffect(() => {\n if (searchInput === filters.search) return;\n const timer = setTimeout(() => setFilter('search', searchInput), 300);\n return () => clearTimeout(timer);\n }, [searchInput, setFilter, filters.search]);\n\n const { data: jobsData, isLoading, refetch, isFetching } = useJobs({\n limit: pagination.pageSize,\n offset: pagination.offset,\n entity: filters.entity || undefined,\n search: filters.search || undefined,\n status: filters.status || undefined,\n sort_by: sort.sort_by || 'created_at',\n order: sort.order || 'desc',\n registered: registeredFilter,\n namespace: namespace || undefined,\n });\n\n const total = jobsData?.total ?? 0;\n const jobs = jobsData?.jobs ?? [];\n\n const entities = useMemo(() => {\n return [...new Set((configs ?? []).map((c) => c.workflow_type))].sort();\n }, [configs]);\n\n const pageTitle = 'Workflow Executions';\n\n const emptyMessage = activeTier === 'certified'\n ? 'No certified workflow executions found'\n : activeTier === 'durable'\n ? 'No durable workflow executions found'\n : 'No workflow executions found';\n\n return (\n <div>\n <PageHeader title={pageTitle} docsHash=\"#docs:dashboard.md:durable-executions\" />\n\n <FilterBar actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={buildApiPath('/workflow-states/jobs', {\n limit: pagination.pageSize,\n offset: pagination.offset,\n entity: filters.entity || undefined,\n search: filters.search || undefined,\n status: filters.status || undefined,\n sort_by: sort.sort_by || 'created_at',\n order: sort.order || 'desc',\n registered: registeredFilter,\n namespace: namespace || undefined,\n })}\n />\n }>\n <input\n type=\"text\"\n placeholder=\"Search workflow ID...\"\n value={searchInput}\n onChange={(e) => setSearchInput(e.target.value)}\n className=\"input text-[11px] py-1 px-2 w-56\"\n />\n <FilterDivider />\n <FilterSelect\n label=\"Type\"\n value={filters.entity}\n onChange={(v) => setFilter('entity', v)}\n options={entities.map((e) => ({ value: e, label: e }))}\n />\n <FilterDivider />\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={[\n { value: 'running', label: 'Running' },\n { value: 'completed', label: 'Completed' },\n { value: 'failed', label: 'Failed' },\n ]}\n />\n <FilterDivider />\n <FilterSelect\n label=\"Tier\"\n value={filters.tier === 'all' ? '' : filters.tier}\n onChange={(v) => setFilter('tier', v || 'all')}\n options={[\n { value: 'certified', label: 'Certified' },\n { value: 'durable', label: 'Durable' },\n ]}\n />\n </FilterBar>\n\n <DataTable\n columns={columns}\n data={jobs}\n keyFn={(row) => row.workflow_id}\n onRowClick={(row) => navigate(`/workflows/executions/${row.workflow_id}`)}\n isLoading={isLoading}\n emptyMessage={emptyMessage}\n sort={sort}\n onSort={setSort}\n />\n\n <StickyPagination\n page={pagination.page}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n total={total}\n pageSize={pagination.pageSize}\n onPageSizeChange={pagination.setPageSize}\n />\n </div>\n );\n}\n"],"names":["jobStatusMap","STATUS_DOT","STATUS_COLORS","buildColumns","onFilterEntity","onFilterStatus","isSuperAdmin","navigate","tierMap","row","dotClass","pulseClass","jsxs","jsx","WorkflowPill","DateValue","ElapsedCell","RowActionGroup","RowAction","Filter","e","Settings","WorkflowsDashboard","initialTier","useWorkflowListEvents","useNavigate","useAuth","namespace","useNamespace","filters","setFilter","pagination","sort","setSort","useFilterParams","activeTier","registeredFilter","configs","useWorkflowConfigs","discoveredData","useDiscoveredWorkflows","useMemo","map","dw","columns","entity","status","searchInput","setSearchInput","useState","useEffect","timer","jobsData","isLoading","refetch","isFetching","useJobs","total","jobs","entities","c","pageTitle","emptyMessage","PageHeader","FilterBar","ListToolbar","buildApiPath","FilterDivider","FilterSelect","v","DataTable","StickyPagination"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{j as e}from"./vendor-query-B2UbickB.js";import{u as h}from"./yaml-workflows-Df8u3lgx.js";import{u}from"./index-CKXSKsVZ.js";import{u as f}from"./useFilterParams-x-Dg0Vgz.js";import{P as p}from"./PageHeader-CFta2VaS.js";import{F as g,a as j,b}from"./FilterBar-BQ2JGg8U.js";import{E as d}from"./EmptyState-BcsfPq9T.js";import{T as w}from"./ToolPill-miuRcj1Q.js";import{N as v}from"./NamespacePill-DlqBTvFR.js";import{S as y}from"./StatusBadge-D9MeQHrh.js";import{c as N,W as k}from"./vendor-icons-BaQqUm-e.js";import{c as F}from"./vendor-react-CXumBFUA.js";function O(){var c;const a=F(),{data:r}=u(),o=!!((c=r==null?void 0:r.ai)!=null&&c.enabled),{filters:s,setFilter:l}=f({filters:{status:"",search:""}}),{data:i,isLoading:m}=h({status:s.status||void 0,search:s.search||void 0,limit:200,offset:0}),n=(i==null?void 0:i.workflows)??[];return m?e.jsxs("div",{children:[e.jsx(p,{title:"Configure",docsHash:"#docs:dashboard.md:mcp-pipeline-tools"}),e.jsx("div",{className:"animate-pulse space-y-0",children:Array.from({length:4}).map((t,x)=>e.jsx("div",{className:"h-14 border-b last:border-b-0 px-6 flex items-center",children:e.jsx("div",{className:"h-3 bg-surface-sunken rounded w-full"})},x))})]}):e.jsxs("div",{children:[e.jsx(p,{title:"Configure",docsHash:"#docs:dashboard.md:mcp-pipeline-tools",actions:o?e.jsx("button",{onClick:()=>a("/mcp/queries/new"),className:"btn-primary text-xs",children:"Design Flow"}):void 0}),e.jsxs("p",{className:"text-sm text-text-secondary mb-6 max-w-2xl leading-relaxed",children:["The compiled form of a durable workflow — the same guarantees at roughly 3× the speed. Each flow is a graph the router discovers and runs on demand. Open one to inspect or run it",o?", or design a new one from a description.":"."]}),e.jsxs(g,{children:[e.jsx(j,{label:"Search",value:s.search,onChange:t=>l("search",t),placeholder:"Flow or namespace…"}),e.jsx(b,{label:"Status",value:s.status,onChange:t=>l("status",t),options:[{value:"draft",label:"Draft"},{value:"deployed",label:"Deployed"},{value:"active",label:"Active"},{value:"archived",label:"Archived"}]})]}),n.length===0?o?e.jsx("div",{className:"cursor-pointer",onClick:()=>a("/mcp/queries/new"),children:e.jsx(d,{icon:N,title:"No graph flows yet",description:"Open the Designer to compile your first flow from a description, or register flows at startup with the graphWorkflows config."})}):e.jsx(d,{icon:k,title:"No graph flows yet",description:"Register graph flows at startup with the graphWorkflows config — see the docs for an example."}):e.jsxs("table",{className:"w-full",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b",children:[e.jsx("th",{className:"px-6 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Flow"}),e.jsx("th",{className:"px-4 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary w-40",children:"Namespace"}),e.jsx("th",{className:"px-4 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary w-20",children:"Version"}),e.jsx("th",{className:"px-4 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary w-28",children:"Status"})]})}),e.jsx("tbody",{children:n.map(t=>e.jsxs("tr",{onClick:()=>a(`/mcp/workflows/${t.id}`),className:"border-b border-surface-border/50 hover:bg-surface-hover/40 transition-colors duration-100 cursor-pointer",children:[e.jsxs("td",{className:"px-6 py-2.5",children:[e.jsx(w,{name:t.graph_topic,size:"md"}),t.description&&e.jsx("p",{className:"text-[11px] leading-snug text-text-quaternary mt-0.5",children:t.description})]}),e.jsx("td",{className:"px-4 py-2.5",children:e.jsx(v,{namespace:t.app_id})}),e.jsxs("td",{className:"px-4 py-2.5 text-[10px] text-text-quaternary font-mono whitespace-nowrap",children:["v",t.content_version]}),e.jsx("td",{className:"px-4 py-2.5 whitespace-nowrap",children:e.jsx(y,{status:t.status})})]},t.id))})]})]})}export{O as YamlWorkflowsPage};
2
- //# sourceMappingURL=YamlWorkflowsPage-ChwvZS4Z.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"YamlWorkflowsPage-ChwvZS4Z.js","sources":["../../src/pages/workflows/YamlWorkflowsPage.tsx"],"sourcesContent":["import { useNavigate } from 'react-router-dom';\nimport { Wand2, Workflow } from 'lucide-react';\nimport { useYamlWorkflows } from '../../api/yaml-workflows';\nimport { useSettings } from '../../api/settings';\nimport { useFilterParams } from '../../hooks/useFilterParams';\n\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { FilterBar, FilterSelect, FilterInput } from '../../components/common/data/FilterBar';\nimport { EmptyState } from '../../components/common/display/EmptyState';\nimport { ToolPill } from '../../components/common/display/ToolPill';\nimport { NamespacePill } from '../../components/common/display/NamespacePill';\nimport { StatusBadge } from '../../components/common/display/StatusBadge';\n\n// ── Page: Graph › Configure ─────────────────────────────────────────────────\n\nexport function YamlWorkflowsPage() {\n const navigate = useNavigate();\n const { data: settings } = useSettings();\n const aiEnabled = !!settings?.ai?.enabled;\n const { filters, setFilter } = useFilterParams({\n filters: { status: '', search: '' },\n });\n\n const { data, isLoading } = useYamlWorkflows({\n status: (filters.status || undefined) as any,\n search: filters.search || undefined,\n limit: 200,\n offset: 0,\n });\n\n const flows = data?.workflows ?? [];\n\n if (isLoading) {\n return (\n <div>\n <PageHeader title=\"Configure\" docsHash=\"#docs:dashboard.md:mcp-pipeline-tools\" />\n <div className=\"animate-pulse space-y-0\">\n {Array.from({ length: 4 }).map((_, i) => (\n <div key={i} className=\"h-14 border-b last:border-b-0 px-6 flex items-center\">\n <div className=\"h-3 bg-surface-sunken rounded w-full\" />\n </div>\n ))}\n </div>\n </div>\n );\n }\n\n return (\n <div>\n <PageHeader\n title=\"Configure\"\n docsHash=\"#docs:dashboard.md:mcp-pipeline-tools\"\n actions={\n aiEnabled ? (\n <button onClick={() => navigate('/mcp/queries/new')} className=\"btn-primary text-xs\">\n Design Flow\n </button>\n ) : undefined\n }\n />\n\n <p className=\"text-sm text-text-secondary mb-6 max-w-2xl leading-relaxed\">\n The compiled form of a durable workflow — the same guarantees at roughly 3× the speed. Each\n flow is a graph the router discovers and runs on demand. Open one to inspect or run it\n {aiEnabled ? ', or design a new one from a description.' : '.'}\n </p>\n\n <FilterBar>\n <FilterInput\n label=\"Search\"\n value={filters.search}\n onChange={(v) => setFilter('search', v)}\n placeholder=\"Flow or namespace…\"\n />\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={[\n { value: 'draft', label: 'Draft' },\n { value: 'deployed', label: 'Deployed' },\n { value: 'active', label: 'Active' },\n { value: 'archived', label: 'Archived' },\n ]}\n />\n </FilterBar>\n\n {flows.length === 0 ? (\n aiEnabled ? (\n <div className=\"cursor-pointer\" onClick={() => navigate('/mcp/queries/new')}>\n <EmptyState\n icon={Wand2}\n title=\"No graph flows yet\"\n description=\"Open the Designer to compile your first flow from a description, or register flows at startup with the graphWorkflows config.\"\n />\n </div>\n ) : (\n <EmptyState\n icon={Workflow}\n title=\"No graph flows yet\"\n description=\"Register graph flows at startup with the graphWorkflows config — see the docs for an example.\"\n />\n )\n ) : (\n <table className=\"w-full\">\n <thead>\n <tr className=\"border-b\">\n <th className=\"px-6 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Flow\n </th>\n <th className=\"px-4 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary w-40\">\n Namespace\n </th>\n <th className=\"px-4 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary w-20\">\n Version\n </th>\n <th className=\"px-4 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary w-28\">\n Status\n </th>\n </tr>\n </thead>\n <tbody>\n {flows.map((flow) => (\n <tr\n key={flow.id}\n onClick={() => navigate(`/mcp/workflows/${flow.id}`)}\n className=\"border-b border-surface-border/50 hover:bg-surface-hover/40 transition-colors duration-100 cursor-pointer\"\n >\n <td className=\"px-6 py-2.5\">\n <ToolPill name={flow.graph_topic} size=\"md\" />\n {flow.description && (\n <p className=\"text-[11px] leading-snug text-text-quaternary mt-0.5\">{flow.description}</p>\n )}\n </td>\n <td className=\"px-4 py-2.5\">\n <NamespacePill namespace={flow.app_id} />\n </td>\n <td className=\"px-4 py-2.5 text-[10px] text-text-quaternary font-mono whitespace-nowrap\">\n v{flow.content_version}\n </td>\n <td className=\"px-4 py-2.5 whitespace-nowrap\">\n <StatusBadge status={flow.status} />\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n )}\n </div>\n );\n}\n"],"names":["YamlWorkflowsPage","navigate","useNavigate","settings","useSettings","aiEnabled","_a","filters","setFilter","useFilterParams","data","isLoading","useYamlWorkflows","flows","jsx","PageHeader","_","i","jsxs","FilterBar","FilterInput","v","FilterSelect","EmptyState","Wand2","Workflow","flow","ToolPill","NamespacePill","StatusBadge"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{j as e,a as p}from"./vendor-query-B2UbickB.js";import{F as u,b as n,c as o,a as h}from"./FilterBar-BQ2JGg8U.js";import{P as j}from"./PriorityBadge-B4ykBH7f.js";import{R as f}from"./RolePill-CXEyPMqb.js";import{W as v}from"./WorkflowPill-BuNkWUVM.js";import{C as w,i as y,a as N}from"./escalation-DDdt7UdU.js";import{x as b,y as g,J as k}from"./index-CKXSKsVZ.js";import{a6 as C,a7 as _,a8 as c,o as P}from"./vendor-icons-BaQqUm-e.js";const l="text-text-secondary transition-colors group-hover/row:text-text-primary";function T({row:a}){if(y(a)){const t=a.status==="resolved"?"text-status-success":"text-text-tertiary";return e.jsx(_,{className:`w-3 h-3 shrink-0 ${t}`})}return a.status==="resolved"?e.jsx(c,{className:"w-2.5 h-2.5 shrink-0 fill-status-success text-status-success"}):a.status==="cancelled"?e.jsx(c,{className:"w-2.5 h-2.5 shrink-0 fill-status-error text-status-error"}):N(a)?e.jsx(c,{className:"w-2.5 h-2.5 shrink-0 fill-status-warning text-status-warning"}):e.jsx(c,{className:"w-2.5 h-2.5 shrink-0 fill-status-active text-status-active"})}function E({metadata:a}){const[t,x]=p.useState(!1);if(!a||Object.keys(a).length===0)return e.jsx("span",{className:"text-[11px] text-text-tertiary",children:"—"});const r=Object.keys(a),m=`${r.slice(0,2).join(", ")}${r.length>2?` +${r.length-2}`:""}`;return e.jsxs("div",{className:"w-full",children:[e.jsxs("button",{onClick:i=>{i.stopPropagation(),x(d=>!d)},className:`inline-flex max-w-full items-center gap-1 font-mono text-[11px] ${l}`,title:t?"Collapse metadata":"Expand metadata",children:[e.jsx(P,{className:`h-3 w-3 shrink-0 transition-transform ${t?"rotate-90":""}`}),e.jsx("span",{className:"truncate",children:`{ ${m} }`})]}),e.jsx("div",{className:`grid transition-[grid-template-rows] duration-200 ease-out ${t?"grid-rows-[1fr]":"grid-rows-[0fr]"}`,children:e.jsx("div",{className:"overflow-hidden",children:e.jsx("div",{className:"mt-1 overflow-x-auto",onClick:i=>i.stopPropagation(),children:e.jsx(k,{data:a,defaultCollapsed:!0})})})})]})}const D=[{key:"description",label:"Summary",render:a=>e.jsxs("div",{className:"flex items-center gap-2 overflow-hidden",children:[e.jsx("span",{className:"shrink-0",children:e.jsx(T,{row:a})}),e.jsx("span",{className:`truncate text-xs ${l}`,children:a.description||a.type})]}),className:"max-w-0"},{key:"workflow_type",label:"Workflow",render:a=>e.jsx(v,{type:a.workflow_type||a.type}),className:"w-40 whitespace-nowrap"},{key:"metadata",label:"Metadata",render:a=>e.jsx(E,{metadata:a.metadata}),className:"w-80 max-w-[19rem] align-top"},{key:"role",label:"Role",render:a=>e.jsx("span",{className:l,children:e.jsx(f,{role:a.role,size:"md",tone:"inherit"})}),className:"w-28"},{key:"priority",label:"Priority",render:a=>e.jsx("span",{className:l,children:e.jsx(j,{priority:a.priority,size:"sm",tone:"inherit"})}),className:"w-14",sortable:!0},{key:"created_time",label:"Created",render:a=>e.jsx("span",{className:`text-[11px] font-mono whitespace-nowrap ${l}`,title:a.created_at,children:b(a.created_at)}),className:"w-40 whitespace-nowrap"},{key:"created_at",label:"Ago",render:a=>e.jsx("span",{className:`text-xs tabular-nums ${l}`,title:a.created_at,children:g(a.created_at)}),className:"w-12 whitespace-nowrap",sortable:!0}],U={key:"expires",label:e.jsx(C,{className:"w-3.5 h-3.5 text-text-tertiary"}),render:a=>a.assigned_until?e.jsx(w,{until:a.assigned_until}):e.jsx("span",{className:"text-xs text-text-tertiary",children:"—"}),className:"w-16 whitespace-nowrap"},S=[{value:"1",label:"P1"},{value:"2",label:"P2"},{value:"3",label:"P3"},{value:"4",label:"P4"}],O=[{value:"all",label:"All"},{value:"available",label:"Available"},{value:"claimed",label:"Claimed"},{value:"resolved",label:"Resolved"},{value:"cancelled",label:"Cancelled"},{value:"expired",label:"Expired"}];function W({filters:a,setFilter:t,roles:x,types:r,showStatus:m=!1,showSearch:i=!0,actions:d}){return e.jsxs(u,{actions:d,children:[m&&e.jsxs(e.Fragment,{children:[e.jsx(n,{label:"Status",value:a.status??"",onChange:s=>t("status",s),options:O}),e.jsx(o,{})]}),e.jsx(n,{label:"Role",value:a.role,onChange:s=>t("role",s),options:x.map(s=>({value:s,label:s}))}),e.jsx(o,{}),e.jsx(n,{label:"Type",value:a.type,onChange:s=>t("type",s),options:r.map(s=>({value:s,label:s}))}),e.jsx(o,{}),e.jsx(n,{label:"Priority",value:a.priority,onChange:s=>t("priority",s),options:S}),i&&e.jsxs(e.Fragment,{children:[e.jsx(o,{}),e.jsx(h,{label:"Search",value:a.search??"",onChange:s=>t("search",s),placeholder:"ID, workflow, origin…"})]})]})}export{D as E,U as T,W as a};
2
- //# sourceMappingURL=escalation-columns-D_zFY1zF.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"escalation-columns-D_zFY1zF.js","sources":["../../src/pages/operator/escalation-columns.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { Circle, Bell, Clock, ChevronRight } from 'lucide-react';\nimport type { Column } from '../../components/common/data/DataTable';\nimport { FilterBar, FilterSelect, FilterInput, FilterDivider } from '../../components/common/data/FilterBar';\nimport { PriorityBadge } from '../../components/common/display/PriorityBadge';\nimport { RolePill } from '../../components/common/display/RolePill';\nimport { WorkflowPill } from '../../components/common/display/WorkflowPill';\nimport { CountdownTimer } from '../../components/common/display/CountdownTimer';\nimport { JsonViewer } from '../../components/common/data/JsonViewer';\nimport { formatAgoCompact, formatDateTime } from '../../lib/format';\nimport { isEffectivelyClaimed, isAckEscalation } from '../../lib/escalation';\nimport type { LTEscalationRecord } from '../../api/types';\n\n// Shared cell text: a consistent resting shade for every cell, sharpening to\n// the primary text colour when the row is hovered. Cells (and pills via their\n// `inherit` tone) all read this single source so the whole row darkens as one.\nconst CELL_TEXT = 'text-text-secondary transition-colors group-hover/row:text-text-primary';\n\n/** Status dot — rendered inline before summary. */\nfunction StatusDot({ row }: { row: LTEscalationRecord }) {\n if (isAckEscalation(row)) {\n const color = row.status === 'resolved' ? 'text-status-success' : 'text-text-tertiary';\n return <Bell className={`w-3 h-3 shrink-0 ${color}`} />;\n }\n if (row.status === 'resolved') {\n return <Circle className=\"w-2.5 h-2.5 shrink-0 fill-status-success text-status-success\" />;\n }\n if (row.status === 'cancelled') {\n return <Circle className=\"w-2.5 h-2.5 shrink-0 fill-status-error text-status-error\" />;\n }\n if (isEffectivelyClaimed(row)) {\n return <Circle className=\"w-2.5 h-2.5 shrink-0 fill-status-warning text-status-warning\" />;\n }\n // pending (unclaimed)\n return <Circle className=\"w-2.5 h-2.5 shrink-0 fill-status-active text-status-active\" />;\n}\n\n/**\n * Metadata cell — a compact `{ key, key +N }` preview that expands inline to the\n * pretty-printed JSON. The same metadata the faceted query filters on, visible per row.\n */\nfunction MetadataCell({ metadata }: { metadata: Record<string, unknown> | null }) {\n const [open, setOpen] = useState(false);\n if (!metadata || Object.keys(metadata).length === 0) {\n return <span className=\"text-[11px] text-text-tertiary\">—</span>;\n }\n const keys = Object.keys(metadata);\n const preview = `${keys.slice(0, 2).join(', ')}${keys.length > 2 ? ` +${keys.length - 2}` : ''}`;\n // Width is fixed by the wrapper so toggling never changes the column width —\n // the JSON viewer reveals with an animated row-height transition, and long\n // lines scroll horizontally inside the cell rather than widening it.\n return (\n <div className=\"w-full\">\n <button\n onClick={(e) => { e.stopPropagation(); setOpen((v) => !v); }}\n className={`inline-flex max-w-full items-center gap-1 font-mono text-[11px] ${CELL_TEXT}`}\n title={open ? 'Collapse metadata' : 'Expand metadata'}\n >\n <ChevronRight className={`h-3 w-3 shrink-0 transition-transform ${open ? 'rotate-90' : ''}`} />\n <span className=\"truncate\">{`{ ${preview} }`}</span>\n </button>\n <div\n className={`grid transition-[grid-template-rows] duration-200 ease-out ${open ? 'grid-rows-[1fr]' : 'grid-rows-[0fr]'}`}\n >\n <div className=\"overflow-hidden\">\n <div className=\"mt-1 overflow-x-auto\" onClick={(e) => e.stopPropagation()}>\n {/* defaultCollapsed → root expanded, nested objects collapsed (one level). */}\n <JsonViewer data={metadata} defaultCollapsed />\n </div>\n </div>\n </div>\n </div>\n );\n}\n\n/** Base columns shared by all escalation list pages. */\nexport const ESCALATION_COLUMNS: Column<LTEscalationRecord>[] = [\n {\n key: 'description',\n label: 'Summary',\n render: (row) => (\n <div className=\"flex items-center gap-2 overflow-hidden\">\n <span className=\"shrink-0\"><StatusDot row={row} /></span>\n <span className={`truncate text-xs ${CELL_TEXT}`}>{row.description || row.type}</span>\n </div>\n ),\n className: 'max-w-0',\n },\n {\n key: 'workflow_type',\n label: 'Workflow',\n // The workflow function name (e.g. `richForm`, `basicSignal`) lives in\n // workflow_type; `type` is the escalation category. Fall back to type for\n // standalone escalations with no workflow.\n render: (row) => <WorkflowPill type={row.workflow_type || row.type} />,\n className: 'w-40 whitespace-nowrap',\n },\n {\n key: 'metadata',\n label: 'Metadata',\n render: (row) => <MetadataCell metadata={row.metadata} />,\n // Fixed width — never grows on expand (the viewer reveals via row-height).\n // Given extra room (borrowed from priority/ago/actions) so JSON wraps less.\n className: 'w-80 max-w-[19rem] align-top',\n },\n {\n key: 'role',\n label: 'Role',\n render: (row) => (\n <span className={CELL_TEXT}>\n <RolePill role={row.role} size=\"md\" tone=\"inherit\" />\n </span>\n ),\n className: 'w-28',\n },\n {\n key: 'priority',\n label: 'Priority',\n render: (row) => (\n <span className={CELL_TEXT}>\n <PriorityBadge priority={row.priority} size=\"sm\" tone=\"inherit\" />\n </span>\n ),\n className: 'w-14',\n sortable: true,\n },\n {\n key: 'created_time',\n label: 'Created',\n render: (row) => (\n <span className={`text-[11px] font-mono whitespace-nowrap ${CELL_TEXT}`} title={row.created_at}>\n {formatDateTime(row.created_at)}\n </span>\n ),\n className: 'w-40 whitespace-nowrap',\n },\n {\n key: 'created_at',\n label: 'Ago',\n render: (row) => (\n <span className={`text-xs tabular-nums ${CELL_TEXT}`} title={row.created_at}>\n {formatAgoCompact(row.created_at)}\n </span>\n ),\n className: 'w-12 whitespace-nowrap',\n sortable: true,\n },\n];\n\n/** Time-remaining column for claimed escalations — aligns with checkbox column on All Escalations. */\nexport const TIME_LEFT_COLUMN: Column<LTEscalationRecord> = {\n key: 'expires',\n label: (<Clock className=\"w-3.5 h-3.5 text-text-tertiary\" />) as any,\n render: (row) =>\n row.assigned_until ? (\n <CountdownTimer until={row.assigned_until} />\n ) : (\n <span className=\"text-xs text-text-tertiary\">—</span>\n ),\n className: 'w-16 whitespace-nowrap',\n};\n\n/** Status icon column — color-coded filled circle, or bell for ACK/notification escalations. */\nexport const STATUS_COLUMN: Column<LTEscalationRecord> = {\n key: 'status',\n label: '',\n render: (row) => {\n if (isAckEscalation(row)) {\n const color = row.status === 'resolved' ? 'text-status-success' : 'text-text-tertiary';\n return <Bell className={`w-3 h-3 ${color}`} />;\n }\n if (row.status === 'resolved') {\n return <Circle className=\"w-2.5 h-2.5 fill-status-success text-status-success\" />;\n }\n if (isEffectivelyClaimed(row)) {\n return <Circle className=\"w-2.5 h-2.5 fill-status-warning text-status-warning\" />;\n }\n // pending (unclaimed)\n return <Circle className=\"w-2.5 h-2.5 fill-text-tertiary text-text-tertiary\" />;\n },\n className: 'w-8',\n};\n\n/** Claimed-only status icon (always orange, or bell for ACK). */\nexport const CLAIMED_STATUS_COLUMN: Column<LTEscalationRecord> = {\n key: 'status',\n label: '',\n render: (row) =>\n isAckEscalation(row)\n ? <Bell className=\"w-3 h-3 text-status-warning\" />\n : <Circle className=\"w-2.5 h-2.5 fill-status-warning text-status-warning\" />,\n className: 'w-8',\n};\n\n/** Priority filter options shared by both pages. */\nexport const PRIORITY_OPTIONS = [\n { value: '1', label: 'P1' },\n { value: '2', label: 'P2' },\n { value: '3', label: 'P3' },\n { value: '4', label: 'P4' },\n];\n\n/** Status filter options for escalation list pages. `all` spans every status so a\n * metadata search (e.g. one order id) returns its escalations regardless of status. */\nexport const STATUS_OPTIONS = [\n { value: 'all', label: 'All' },\n { value: 'available', label: 'Available' },\n { value: 'claimed', label: 'Claimed' },\n { value: 'resolved', label: 'Resolved' },\n { value: 'cancelled', label: 'Cancelled' },\n { value: 'expired', label: 'Expired' },\n];\n\n/** Shared filter bar for escalation list pages. */\nexport function EscalationFilterBar({\n filters,\n setFilter,\n roles,\n types,\n showStatus = false,\n showSearch = true,\n actions,\n}: {\n filters: { role: string; type: string; priority: string; status?: string; search?: string };\n setFilter: (key: any, value: string) => void;\n roles: string[];\n types: string[];\n showStatus?: boolean;\n // Free-text search lives here by default, but the faceted page folds it into\n // the drawer instead so there's a single search surface.\n showSearch?: boolean;\n actions?: React.ReactNode;\n}) {\n return (\n <FilterBar actions={actions}>\n {showStatus && (\n <>\n <FilterSelect\n label=\"Status\"\n value={filters.status ?? ''}\n onChange={(v) => setFilter('status', v)}\n options={STATUS_OPTIONS}\n />\n <FilterDivider />\n </>\n )}\n <FilterSelect\n label=\"Role\"\n value={filters.role}\n onChange={(v) => setFilter('role', v)}\n options={roles.map((r) => ({ value: r, label: r }))}\n />\n <FilterDivider />\n <FilterSelect\n label=\"Type\"\n value={filters.type}\n onChange={(v) => setFilter('type', v)}\n options={types.map((t) => ({ value: t, label: t }))}\n />\n <FilterDivider />\n <FilterSelect\n label=\"Priority\"\n value={filters.priority}\n onChange={(v) => setFilter('priority', v)}\n options={PRIORITY_OPTIONS}\n />\n {showSearch && (\n <>\n <FilterDivider />\n <FilterInput\n label=\"Search\"\n value={filters.search ?? ''}\n onChange={(v) => setFilter('search', v)}\n placeholder=\"ID, workflow, origin…\"\n />\n </>\n )}\n </FilterBar>\n );\n}\n"],"names":["CELL_TEXT","StatusDot","row","isAckEscalation","color","jsx","Bell","Circle","isEffectivelyClaimed","MetadataCell","metadata","open","setOpen","useState","keys","preview","jsxs","e","v","ChevronRight","JsonViewer","ESCALATION_COLUMNS","WorkflowPill","RolePill","PriorityBadge","formatDateTime","formatAgoCompact","TIME_LEFT_COLUMN","Clock","CountdownTimer","PRIORITY_OPTIONS","STATUS_OPTIONS","EscalationFilterBar","filters","setFilter","roles","types","showStatus","showSearch","actions","FilterBar","Fragment","FilterSelect","FilterDivider","r","t","FilterInput"],"mappings":"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"}