@hotmeshio/long-tail 0.9.0 → 0.9.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 (207) hide show
  1. package/build/api/settings.js +2 -0
  2. package/build/index.js +1 -0
  3. package/build/modules/branding.d.ts +13 -0
  4. package/build/modules/branding.js +19 -0
  5. package/build/start/adapters.js +2 -0
  6. package/build/tsconfig.tsbuildinfo +1 -1
  7. package/build/types/startup.d.ts +8 -0
  8. package/dashboard/dist/assets/{AdminDashboard-5bWcBxyS.js → AdminDashboard-JobmypiO.js} +2 -2
  9. package/dashboard/dist/assets/{AdminDashboard-5bWcBxyS.js.map → AdminDashboard-JobmypiO.js.map} +1 -1
  10. package/dashboard/dist/assets/{AgentConfigPage-CVg_tFbf.js → AgentConfigPage-D_HuaRN9.js} +4 -4
  11. package/dashboard/dist/assets/{AgentConfigPage-CVg_tFbf.js.map → AgentConfigPage-D_HuaRN9.js.map} +1 -1
  12. package/dashboard/dist/assets/{AgentDetailPage-CLlkIoRQ.js → AgentDetailPage-Cj22NZLI.js} +4 -4
  13. package/dashboard/dist/assets/{AgentDetailPage-CLlkIoRQ.js.map → AgentDetailPage-Cj22NZLI.js.map} +1 -1
  14. package/dashboard/dist/assets/{AgentsPage-CjruF_ek.js → AgentsPage-DTKto-gL.js} +2 -2
  15. package/dashboard/dist/assets/{AgentsPage-CjruF_ek.js.map → AgentsPage-DTKto-gL.js.map} +1 -1
  16. package/dashboard/dist/assets/AvailableEscalationsPage-CUvrKkgS.js +2 -0
  17. package/dashboard/dist/assets/AvailableEscalationsPage-CUvrKkgS.js.map +1 -0
  18. package/dashboard/dist/assets/{BotPicker-CGEFHHDE.js → BotPicker-AwKouk26.js} +2 -2
  19. package/dashboard/dist/assets/{BotPicker-CGEFHHDE.js.map → BotPicker-AwKouk26.js.map} +1 -1
  20. package/dashboard/dist/assets/{CapabilitiesPage-BI1tNYun.js → CapabilitiesPage-1ZMO_0UU.js} +2 -2
  21. package/dashboard/dist/assets/{CapabilitiesPage-BI1tNYun.js.map → CapabilitiesPage-1ZMO_0UU.js.map} +1 -1
  22. package/dashboard/dist/assets/{CollapsibleSection-B9f52Z2K.js → CollapsibleSection-D6kUTrq4.js} +2 -2
  23. package/dashboard/dist/assets/{CollapsibleSection-B9f52Z2K.js.map → CollapsibleSection-D6kUTrq4.js.map} +1 -1
  24. package/dashboard/dist/assets/{CountdownTimer-C71erQ67.js → CountdownTimer-Bj9YbInO.js} +2 -2
  25. package/dashboard/dist/assets/{CountdownTimer-C71erQ67.js.map → CountdownTimer-Bj9YbInO.js.map} +1 -1
  26. package/dashboard/dist/assets/CredentialsPage-D5H_kyRL.js +2 -0
  27. package/dashboard/dist/assets/{CredentialsPage-smk5H_mP.js.map → CredentialsPage-D5H_kyRL.js.map} +1 -1
  28. package/dashboard/dist/assets/{CronLabel-CCJLmkIq.js → CronLabel-DvmJ0EFz.js} +2 -2
  29. package/dashboard/dist/assets/{CronLabel-CCJLmkIq.js.map → CronLabel-DvmJ0EFz.js.map} +1 -1
  30. package/dashboard/dist/assets/{CustomDurationPicker-DQ28g5GB.js → CustomDurationPicker-DT_g8Hr4.js} +2 -2
  31. package/dashboard/dist/assets/{CustomDurationPicker-DQ28g5GB.js.map → CustomDurationPicker-DT_g8Hr4.js.map} +1 -1
  32. package/dashboard/dist/assets/{DropZone-C_Mc4UrO.js → DropZone-wJqP4zA4.js} +2 -2
  33. package/dashboard/dist/assets/{DropZone-C_Mc4UrO.js.map → DropZone-wJqP4zA4.js.map} +1 -1
  34. package/dashboard/dist/assets/{ElapsedCell-Cw1uvJKx.js → ElapsedCell-7_8YpC3D.js} +2 -2
  35. package/dashboard/dist/assets/{ElapsedCell-Cw1uvJKx.js.map → ElapsedCell-7_8YpC3D.js.map} +1 -1
  36. package/dashboard/dist/assets/{EscalationListSchemaPage-3v2tiCnq.js → EscalationListSchemaPage-ClFRLeKV.js} +2 -2
  37. package/dashboard/dist/assets/{EscalationListSchemaPage-3v2tiCnq.js.map → EscalationListSchemaPage-ClFRLeKV.js.map} +1 -1
  38. package/dashboard/dist/assets/{EscalationSchemaPage-DIq2pMED.js → EscalationSchemaPage-BcYcj-b8.js} +3 -3
  39. package/dashboard/dist/assets/{EscalationSchemaPage-DIq2pMED.js.map → EscalationSchemaPage-BcYcj-b8.js.map} +1 -1
  40. package/dashboard/dist/assets/{EscalationsOverview-BqOZ1v8w.js → EscalationsOverview-uHb8ni_5.js} +2 -2
  41. package/dashboard/dist/assets/{EscalationsOverview-BqOZ1v8w.js.map → EscalationsOverview-uHb8ni_5.js.map} +1 -1
  42. package/dashboard/dist/assets/{EventTable-CyfHfOWj.js → EventTable-CkdWqmEL.js} +2 -2
  43. package/dashboard/dist/assets/{EventTable-CyfHfOWj.js.map → EventTable-CkdWqmEL.js.map} +1 -1
  44. package/dashboard/dist/assets/{GraphInvokePage-DbNUaWhH.js → GraphInvokePage-C6sfPjSc.js} +2 -2
  45. package/dashboard/dist/assets/{GraphInvokePage-DbNUaWhH.js.map → GraphInvokePage-C6sfPjSc.js.map} +1 -1
  46. package/dashboard/dist/assets/HomePage-CUHZxihq.js +2 -0
  47. package/dashboard/dist/assets/{HomePage-Cj9sLt4Z.js.map → HomePage-CUHZxihq.js.map} +1 -1
  48. package/dashboard/dist/assets/{ListToolbar-D7PoQOZC.js → ListToolbar-nWxpujpH.js} +2 -2
  49. package/dashboard/dist/assets/{ListToolbar-D7PoQOZC.js.map → ListToolbar-nWxpujpH.js.map} +1 -1
  50. package/dashboard/dist/assets/{McpOverview-D9g1iJyn.js → McpOverview-DXrkDkU-.js} +2 -2
  51. package/dashboard/dist/assets/{McpOverview-D9g1iJyn.js.map → McpOverview-DXrkDkU-.js.map} +1 -1
  52. package/dashboard/dist/assets/{McpQueryDetailPage-DwS1pXdT.js → McpQueryDetailPage-CnLYE26v.js} +2 -2
  53. package/dashboard/dist/assets/{McpQueryDetailPage-DwS1pXdT.js.map → McpQueryDetailPage-CnLYE26v.js.map} +1 -1
  54. package/dashboard/dist/assets/{McpQueryPage-DZQ1z6-H.js → McpQueryPage-oE9eWAus.js} +2 -2
  55. package/dashboard/dist/assets/{McpQueryPage-DZQ1z6-H.js.map → McpQueryPage-oE9eWAus.js.map} +1 -1
  56. package/dashboard/dist/assets/{McpRunDetailPage-Bx6w39lr.js → McpRunDetailPage-B7e6AVl1.js} +2 -2
  57. package/dashboard/dist/assets/{McpRunDetailPage-Bx6w39lr.js.map → McpRunDetailPage-B7e6AVl1.js.map} +1 -1
  58. package/dashboard/dist/assets/{McpRunsPage-C-oS_tTh.js → McpRunsPage-Bx5DiGk7.js} +2 -2
  59. package/dashboard/dist/assets/{McpRunsPage-C-oS_tTh.js.map → McpRunsPage-Bx5DiGk7.js.map} +1 -1
  60. package/dashboard/dist/assets/{NamespacePill-DhgC3EUO.js → NamespacePill-BlhSWa5S.js} +2 -2
  61. package/dashboard/dist/assets/{NamespacePill-DhgC3EUO.js.map → NamespacePill-BlhSWa5S.js.map} +1 -1
  62. package/dashboard/dist/assets/OperationsPage-BmG3qzdR.js +2 -0
  63. package/dashboard/dist/assets/OperationsPage-BmG3qzdR.js.map +1 -0
  64. package/dashboard/dist/assets/{OperatorDashboard-Cqf87ojd.js → OperatorDashboard-r6hQ57eO.js} +2 -2
  65. package/dashboard/dist/assets/{OperatorDashboard-Cqf87ojd.js.map → OperatorDashboard-r6hQ57eO.js.map} +1 -1
  66. package/dashboard/dist/assets/{PageHeader-sGNTmSXX.js → PageHeader-Ji1AtA4f.js} +2 -2
  67. package/dashboard/dist/assets/{PageHeader-sGNTmSXX.js.map → PageHeader-Ji1AtA4f.js.map} +1 -1
  68. package/dashboard/dist/assets/{PageHeaderWithStats-87STTAJX.js → PageHeaderWithStats-B2qrFAaG.js} +2 -2
  69. package/dashboard/dist/assets/{PageHeaderWithStats-87STTAJX.js.map → PageHeaderWithStats-B2qrFAaG.js.map} +1 -1
  70. package/dashboard/dist/assets/{ProcessDetailPage-CplnDXkz.js → ProcessDetailPage-C3gE4OHq.js} +2 -2
  71. package/dashboard/dist/assets/{ProcessDetailPage-CplnDXkz.js.map → ProcessDetailPage-C3gE4OHq.js.map} +1 -1
  72. package/dashboard/dist/assets/{ProcessesListPage-DFOJC27f.js → ProcessesListPage-DSsIGmBB.js} +2 -2
  73. package/dashboard/dist/assets/{ProcessesListPage-DFOJC27f.js.map → ProcessesListPage-DSsIGmBB.js.map} +1 -1
  74. package/dashboard/dist/assets/{RoleDetailPage-VrWOaPlg.js → RoleDetailPage-DiFISbnq.js} +3 -3
  75. package/dashboard/dist/assets/{RoleDetailPage-VrWOaPlg.js.map → RoleDetailPage-DiFISbnq.js.map} +1 -1
  76. package/dashboard/dist/assets/{RolePill-C91qbDOW.js → RolePill-ColM_ynA.js} +2 -2
  77. package/dashboard/dist/assets/{RolePill-C91qbDOW.js.map → RolePill-ColM_ynA.js.map} +1 -1
  78. package/dashboard/dist/assets/{RolesPage-DdI1rVAP.js → RolesPage-CE5fui18.js} +2 -2
  79. package/dashboard/dist/assets/{RolesPage-DdI1rVAP.js.map → RolesPage-CE5fui18.js.map} +1 -1
  80. package/dashboard/dist/assets/{RunAsSelector-C6EozzKV.js → RunAsSelector-Ct8NNadu.js} +2 -2
  81. package/dashboard/dist/assets/{RunAsSelector-C6EozzKV.js.map → RunAsSelector-Ct8NNadu.js.map} +1 -1
  82. package/dashboard/dist/assets/{SlidePanel-BpWveV1T.js → SlidePanel-BzeKveus.js} +2 -2
  83. package/dashboard/dist/assets/{SlidePanel-BpWveV1T.js.map → SlidePanel-BzeKveus.js.map} +1 -1
  84. package/dashboard/dist/assets/{StickyPagination-BEgkYJ0-.js → StickyPagination-BfgBtP_B.js} +2 -2
  85. package/dashboard/dist/assets/{StickyPagination-BEgkYJ0-.js.map → StickyPagination-BfgBtP_B.js.map} +1 -1
  86. package/dashboard/dist/assets/{StreamMessageDetail-DWVPtzj7.js → StreamMessageDetail-2rwp7Ynx.js} +2 -2
  87. package/dashboard/dist/assets/{StreamMessageDetail-DWVPtzj7.js.map → StreamMessageDetail-2rwp7Ynx.js.map} +1 -1
  88. package/dashboard/dist/assets/{SwimlaneTimeline-4NrDJNYc.js → SwimlaneTimeline-BwWyYBCo.js} +2 -2
  89. package/dashboard/dist/assets/{SwimlaneTimeline-4NrDJNYc.js.map → SwimlaneTimeline-BwWyYBCo.js.map} +1 -1
  90. package/dashboard/dist/assets/{TagInput-Csm36_pS.js → TagInput-By0E_Jym.js} +2 -2
  91. package/dashboard/dist/assets/{TagInput-Csm36_pS.js.map → TagInput-By0E_Jym.js.map} +1 -1
  92. package/dashboard/dist/assets/{TaskDetailPage-BvdaAUtF.js → TaskDetailPage-BUKHu2oD.js} +2 -2
  93. package/dashboard/dist/assets/{TaskDetailPage-BvdaAUtF.js.map → TaskDetailPage-BUKHu2oD.js.map} +1 -1
  94. package/dashboard/dist/assets/{TaskQueuePill-5XdNaqwM.js → TaskQueuePill-CY1ZSwWu.js} +2 -2
  95. package/dashboard/dist/assets/{TaskQueuePill-5XdNaqwM.js.map → TaskQueuePill-CY1ZSwWu.js.map} +1 -1
  96. package/dashboard/dist/assets/{TasksListPage-BxA161LH.js → TasksListPage-C_PwExQC.js} +2 -2
  97. package/dashboard/dist/assets/{TasksListPage-BxA161LH.js.map → TasksListPage-C_PwExQC.js.map} +1 -1
  98. package/dashboard/dist/assets/{TimeAgo-ChwJ4fjZ.js → TimeAgo-Bagm-L2o.js} +2 -2
  99. package/dashboard/dist/assets/{TimeAgo-ChwJ4fjZ.js.map → TimeAgo-Bagm-L2o.js.map} +1 -1
  100. package/dashboard/dist/assets/{TimestampCell-C7KzmvyC.js → TimestampCell-BwDo7knq.js} +2 -2
  101. package/dashboard/dist/assets/{TimestampCell-C7KzmvyC.js.map → TimestampCell-BwDo7knq.js.map} +1 -1
  102. package/dashboard/dist/assets/{ToolPill-CAwj7EPw.js → ToolPill-D0IzqLEe.js} +2 -2
  103. package/dashboard/dist/assets/{ToolPill-CAwj7EPw.js.map → ToolPill-D0IzqLEe.js.map} +1 -1
  104. package/dashboard/dist/assets/{ToolTestPanel-ISkuXtkT.js → ToolTestPanel-CVZ2M1yv.js} +2 -2
  105. package/dashboard/dist/assets/{ToolTestPanel-ISkuXtkT.js.map → ToolTestPanel-CVZ2M1yv.js.map} +1 -1
  106. package/dashboard/dist/assets/{TopicDetailPage-D8uZ8Wbs.js → TopicDetailPage-DKAvbkxD.js} +2 -2
  107. package/dashboard/dist/assets/{TopicDetailPage-D8uZ8Wbs.js.map → TopicDetailPage-DKAvbkxD.js.map} +1 -1
  108. package/dashboard/dist/assets/TopicsPage-BZknsApe.js +2 -0
  109. package/dashboard/dist/assets/{TopicsPage-rj88vA_1.js.map → TopicsPage-BZknsApe.js.map} +1 -1
  110. package/dashboard/dist/assets/{UserName-D03Lh6Aj.js → UserName-ByDxLHPZ.js} +2 -2
  111. package/dashboard/dist/assets/{UserName-D03Lh6Aj.js.map → UserName-ByDxLHPZ.js.map} +1 -1
  112. package/dashboard/dist/assets/{WorkflowExecutionPage-LD9WzPee.js → WorkflowExecutionPage-DrwKB2x8.js} +2 -2
  113. package/dashboard/dist/assets/{WorkflowExecutionPage-LD9WzPee.js.map → WorkflowExecutionPage-DrwKB2x8.js.map} +1 -1
  114. package/dashboard/dist/assets/{WorkflowPill-fodIWnT3.js → WorkflowPill-BXmmLR0t.js} +2 -2
  115. package/dashboard/dist/assets/{WorkflowPill-fodIWnT3.js.map → WorkflowPill-BXmmLR0t.js.map} +1 -1
  116. package/dashboard/dist/assets/{WorkflowsDashboard-DH0jitAb.js → WorkflowsDashboard-DEq9fkhl.js} +2 -2
  117. package/dashboard/dist/assets/{WorkflowsDashboard-DH0jitAb.js.map → WorkflowsDashboard-DEq9fkhl.js.map} +1 -1
  118. package/dashboard/dist/assets/{WorkflowsOverview-D6BVaH9e.js → WorkflowsOverview-l-0KYP7Y.js} +2 -2
  119. package/dashboard/dist/assets/{WorkflowsOverview-D6BVaH9e.js.map → WorkflowsOverview-l-0KYP7Y.js.map} +1 -1
  120. package/dashboard/dist/assets/{YamlWorkflowDetailPage-D_CfNEqW.js → YamlWorkflowDetailPage-BgimL3VT.js} +25 -25
  121. package/dashboard/dist/assets/{YamlWorkflowDetailPage-D_CfNEqW.js.map → YamlWorkflowDetailPage-BgimL3VT.js.map} +1 -1
  122. package/dashboard/dist/assets/{YamlWorkflowsPage-BMJgtcAq.js → YamlWorkflowsPage-CabXXA9r.js} +2 -2
  123. package/dashboard/dist/assets/{YamlWorkflowsPage-BMJgtcAq.js.map → YamlWorkflowsPage-CabXXA9r.js.map} +1 -1
  124. package/dashboard/dist/assets/{agents-Ci0tZDO3.js → agents-D_L6lV0f.js} +2 -2
  125. package/dashboard/dist/assets/{agents-Ci0tZDO3.js.map → agents-D_L6lV0f.js.map} +1 -1
  126. package/dashboard/dist/assets/{bots-DZyt1oO4.js → bots-wdZz1nJw.js} +2 -2
  127. package/dashboard/dist/assets/{bots-DZyt1oO4.js.map → bots-wdZz1nJw.js.map} +1 -1
  128. package/dashboard/dist/assets/{capabilities-DzVKeWyC.js → capabilities-C35_V8eu.js} +2 -2
  129. package/dashboard/dist/assets/{capabilities-DzVKeWyC.js.map → capabilities-C35_V8eu.js.map} +1 -1
  130. package/dashboard/dist/assets/{controlplane-CQzrn-rD.js → controlplane-kR2P6zYv.js} +2 -2
  131. package/dashboard/dist/assets/{controlplane-CQzrn-rD.js.map → controlplane-kR2P6zYv.js.map} +1 -1
  132. package/dashboard/dist/assets/escalation-columns-BVj16HuR.js +2 -0
  133. package/dashboard/dist/assets/escalation-columns-BVj16HuR.js.map +1 -0
  134. package/dashboard/dist/assets/{index-sdc9ecdW.js → index-1WCiN-pF.js} +2 -2
  135. package/dashboard/dist/assets/{index-sdc9ecdW.js.map → index-1WCiN-pF.js.map} +1 -1
  136. package/dashboard/dist/assets/{index-BWy4UvaT.js → index-B4zWCfQr.js} +2 -2
  137. package/dashboard/dist/assets/{index-BWy4UvaT.js.map → index-B4zWCfQr.js.map} +1 -1
  138. package/dashboard/dist/assets/{index-B2dB90aC.js → index-BMQopgAx.js} +3 -3
  139. package/dashboard/dist/assets/{index-B2dB90aC.js.map → index-BMQopgAx.js.map} +1 -1
  140. package/dashboard/dist/assets/{index-BqKxJ2fB.js → index-BZfX_ziz.js} +2 -2
  141. package/dashboard/dist/assets/{index-BqKxJ2fB.js.map → index-BZfX_ziz.js.map} +1 -1
  142. package/dashboard/dist/assets/{index-3SrgIA7w.js → index-BfDn7j4K.js} +2 -2
  143. package/dashboard/dist/assets/{index-3SrgIA7w.js.map → index-BfDn7j4K.js.map} +1 -1
  144. package/dashboard/dist/assets/{index-DTn4XzYN.js → index-BmbO85oT.js} +2 -2
  145. package/dashboard/dist/assets/{index-DTn4XzYN.js.map → index-BmbO85oT.js.map} +1 -1
  146. package/dashboard/dist/assets/{index-CcKXMU-s.js → index-C75E0-Wd.js} +2 -2
  147. package/dashboard/dist/assets/{index-CcKXMU-s.js.map → index-C75E0-Wd.js.map} +1 -1
  148. package/dashboard/dist/assets/{index-DOHGHMP7.js → index-CJFA7aLp.js} +2 -2
  149. package/dashboard/dist/assets/{index-DOHGHMP7.js.map → index-CJFA7aLp.js.map} +1 -1
  150. package/dashboard/dist/assets/index-CsMAT5cs.css +1 -0
  151. package/dashboard/dist/assets/index-DIrYjyRG.js +5 -0
  152. package/dashboard/dist/assets/index-DIrYjyRG.js.map +1 -0
  153. package/dashboard/dist/assets/{index-kPipMHZx.js → index-QOTnrFd1.js} +2 -2
  154. package/dashboard/dist/assets/{index-kPipMHZx.js.map → index-QOTnrFd1.js.map} +1 -1
  155. package/dashboard/dist/assets/index-so192yXP.js +63 -0
  156. package/dashboard/dist/assets/{index-C9moIiIq.js.map → index-so192yXP.js.map} +1 -1
  157. package/dashboard/dist/assets/{index-Dv8mzG9B.js → index-wZzl3bcK.js} +2 -2
  158. package/dashboard/dist/assets/{index-Dv8mzG9B.js.map → index-wZzl3bcK.js.map} +1 -1
  159. package/dashboard/dist/assets/{index-LwodswlU.js → index-xBNf5aFb.js} +3 -3
  160. package/dashboard/dist/assets/{index-LwodswlU.js.map → index-xBNf5aFb.js.map} +1 -1
  161. package/dashboard/dist/assets/{knowledge-fi5z5YLq.js → knowledge-DDt599ea.js} +2 -2
  162. package/dashboard/dist/assets/{knowledge-fi5z5YLq.js.map → knowledge-DDt599ea.js.map} +1 -1
  163. package/dashboard/dist/assets/{mcp-CH8Tj9Pw.js → mcp-BPXRXEje.js} +2 -2
  164. package/dashboard/dist/assets/{mcp-CH8Tj9Pw.js.map → mcp-BPXRXEje.js.map} +1 -1
  165. package/dashboard/dist/assets/{mcp-query-6alwNh7K.js → mcp-query-HUZuboi-.js} +2 -2
  166. package/dashboard/dist/assets/{mcp-query-6alwNh7K.js.map → mcp-query-HUZuboi-.js.map} +1 -1
  167. package/dashboard/dist/assets/{pipelines-Dqh9PLUw.js → pipelines-CH8q3ok_.js} +2 -2
  168. package/dashboard/dist/assets/{pipelines-Dqh9PLUw.js.map → pipelines-CH8q3ok_.js.map} +1 -1
  169. package/dashboard/dist/assets/roles-B7rzw8wD.js +2 -0
  170. package/dashboard/dist/assets/{roles-dJKBZUBh.js.map → roles-B7rzw8wD.js.map} +1 -1
  171. package/dashboard/dist/assets/{tasks-BYz490un.js → tasks-j-mVt2EA.js} +2 -2
  172. package/dashboard/dist/assets/{tasks-BYz490un.js.map → tasks-j-mVt2EA.js.map} +1 -1
  173. package/dashboard/dist/assets/{topics-Dt975EWi.js → topics-DATyaYWW.js} +2 -2
  174. package/dashboard/dist/assets/{topics-Dt975EWi.js.map → topics-DATyaYWW.js.map} +1 -1
  175. package/dashboard/dist/assets/{useEventHooks-ZT6RV2Gj.js → useEventHooks-CwIAhqJk.js} +2 -2
  176. package/dashboard/dist/assets/{useEventHooks-ZT6RV2Gj.js.map → useEventHooks-CwIAhqJk.js.map} +1 -1
  177. package/dashboard/dist/assets/{useNamespace-B_G1iE9i.js → useNamespace-hV7rcAfa.js} +2 -2
  178. package/dashboard/dist/assets/{useNamespace-B_G1iE9i.js.map → useNamespace-hV7rcAfa.js.map} +1 -1
  179. package/dashboard/dist/assets/{useYamlActivityEvents-DGkvIadL.js → useYamlActivityEvents-Dwuuu3F0.js} +2 -2
  180. package/dashboard/dist/assets/{useYamlActivityEvents-DGkvIadL.js.map → useYamlActivityEvents-Dwuuu3F0.js.map} +1 -1
  181. package/dashboard/dist/assets/{users-C2jopvM1.js → users-DS9yeHe4.js} +2 -2
  182. package/dashboard/dist/assets/{users-C2jopvM1.js.map → users-DS9yeHe4.js.map} +1 -1
  183. package/dashboard/dist/assets/{vendor-icons-BXhWQC7l.js → vendor-icons-BX2Vih4L.js} +138 -123
  184. package/dashboard/dist/assets/vendor-icons-BX2Vih4L.js.map +1 -0
  185. package/dashboard/dist/assets/{workflows-By8Wgvig.js → workflows-FF8WUHaC.js} +2 -2
  186. package/dashboard/dist/assets/{workflows-By8Wgvig.js.map → workflows-FF8WUHaC.js.map} +1 -1
  187. package/dashboard/dist/assets/{yaml-workflows-Cq_vp41d.js → yaml-workflows-y-eo6Rwj.js} +2 -2
  188. package/dashboard/dist/assets/{yaml-workflows-Cq_vp41d.js.map → yaml-workflows-y-eo6Rwj.js.map} +1 -1
  189. package/dashboard/dist/index.html +3 -3
  190. package/docs/api/http/settings.md +4 -0
  191. package/docs/api/sdk/settings.md +2 -1
  192. package/package.json +1 -1
  193. package/dashboard/dist/assets/AvailableEscalationsPage-h6awiuVk.js +0 -2
  194. package/dashboard/dist/assets/AvailableEscalationsPage-h6awiuVk.js.map +0 -1
  195. package/dashboard/dist/assets/CredentialsPage-smk5H_mP.js +0 -2
  196. package/dashboard/dist/assets/HomePage-Cj9sLt4Z.js +0 -2
  197. package/dashboard/dist/assets/OperationsPage-CQzX6jM1.js +0 -2
  198. package/dashboard/dist/assets/OperationsPage-CQzX6jM1.js.map +0 -1
  199. package/dashboard/dist/assets/TopicsPage-rj88vA_1.js +0 -2
  200. package/dashboard/dist/assets/escalation-columns-s29Q4mrF.js +0 -2
  201. package/dashboard/dist/assets/escalation-columns-s29Q4mrF.js.map +0 -1
  202. package/dashboard/dist/assets/index-BSOcWfeR.js +0 -5
  203. package/dashboard/dist/assets/index-BSOcWfeR.js.map +0 -1
  204. package/dashboard/dist/assets/index-C9moIiIq.js +0 -63
  205. package/dashboard/dist/assets/index-DIPe82gq.css +0 -1
  206. package/dashboard/dist/assets/roles-dJKBZUBh.js +0 -2
  207. package/dashboard/dist/assets/vendor-icons-BXhWQC7l.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"OperationsPage-CQzX6jM1.js","sources":["../../src/lib/role-display.ts","../../src/pages/operations/PaceChart.tsx","../../src/pages/operations/priority-link.ts","../../src/pages/operations/StationDetailPanel.tsx","../../src/pages/operations/OperationsPage.tsx"],"sourcesContent":["/**\n * Derive a human-readable name from a role id. camelCase, kebab-case, and\n * snake_case all read as spaced Title Case — printFarm, print-farm, and\n * print_farm each become \"Print Farm\". Interior capitals are preserved so\n * acronym segments keep their shape (printQA → \"Print QA\").\n */\nexport function deriveRoleTitle(role: string): string {\n return role\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2') // camelCase boundary\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2') // acronym → word boundary (QAReview)\n .split(/[-_\\s]+/)\n .filter(Boolean)\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(' ');\n}\n\n/**\n * The display name for a role: a user-set title wins; otherwise the name is\n * derived from the role id. Every role therefore has a friendly name — the\n * display name leads, and the exact role id renders as the secondary field.\n */\nexport function displayRoleTitle(r: { role: string; title?: string | null }): string {\n return r.title?.trim() || deriveRoleTitle(r.role);\n}\n","import { useState } from 'react';\nimport type { StationMetric } from '../../api/escalations';\nimport { displayRoleTitle } from '../../lib/role-display';\n\nexport interface ChartStation {\n role: string;\n title: string | null;\n target_per_hour: number | null;\n parent_role: string | null;\n /** Roles feeding this station from other sequences — drawn as a merge glyph, not a bend in the line. */\n upstream_roles?: string[];\n metric: StationMetric | undefined;\n}\n\ninterface PaceChartProps {\n stations: ChartStation[];\n selectedRole: string | null;\n onSelect: (role: string) => void;\n /** Merge-glyph click — jump to the sequence that feeds this station. */\n onUpstreamSelect?: (upstreamRole: string) => void;\n /** Priority-badge click — open the station's queue oldest-first by its age facet. */\n onPrioritySelect?: (role: string) => void;\n /** Selected window length in hours — target count = target_per_hour × this. */\n periodHours: number;\n}\n\n// ── SVG layout ────────────────────────────────────────────────────────────────\n\nconst W = 800;\nconst H = 270;\nconst ML = 40;\nconst MR = 76;\nconst MT = 24;\nconst MB = 72;\n\nconst chartW = W - ML - MR;\nconst chartH = H - MT - MB;\nconst bottom = MT + chartH;\nconst right = ML + chartW;\n\n// Smooth transition applied when the window changes and values re-scale.\nconst EASE = '0.5s cubic-bezier(0.4, 0, 0.2, 1)';\n\n// ── Path builders ─────────────────────────────────────────────────────────────\n\n// A one-point curve still needs a stroke: a short segment — slightly longer\n// than an em dash — centered through the point. It anchors the dot and its\n// end label in vertical space when a sequence has a single station (or a\n// single station carries a target).\nconst SOLO_HALF = 9;\nfunction soloSegment(p: { x: number; y: number }): string {\n return `M ${(p.x - SOLO_HALF).toFixed(1)} ${p.y.toFixed(1)} L ${(p.x + SOLO_HALF).toFixed(1)} ${p.y.toFixed(1)}`;\n}\n\n/** Catmull-Rom → cubic bezier — smooth curves for the target, actual, and active lines. */\nfunction catmullPath(pts: { x: number; y: number }[]): string {\n if (pts.length === 0) return '';\n if (pts.length === 1) return soloSegment(pts[0]);\n const segs: string[] = [];\n for (let i = 0; i < pts.length - 1; i++) {\n const p0 = pts[Math.max(0, i - 1)];\n const p1 = pts[i];\n const p2 = pts[i + 1];\n const p3 = pts[Math.min(pts.length - 1, i + 2)];\n const cp1x = (p1.x + (p2.x - p0.x) / 6).toFixed(1);\n const cp1y = (p1.y + (p2.y - p0.y) / 6).toFixed(1);\n const cp2x = (p2.x - (p3.x - p1.x) / 6).toFixed(1);\n const cp2y = (p2.y - (p3.y - p1.y) / 6).toFixed(1);\n if (i === 0) segs.push(`M ${p1.x.toFixed(1)} ${p1.y.toFixed(1)}`);\n segs.push(`C ${cp1x} ${cp1y}, ${cp2x} ${cp2y}, ${p2.x.toFixed(1)} ${p2.y.toFixed(1)}`);\n }\n return segs.join(' ');\n}\n\n/**\n * Closed region between two curves — upper spline forward, lower spline back.\n * Used for the queue-composition bands: the vertical thickness at any station\n * is the count difference between the two curves.\n */\nfunction bandPath(upper: { x: number; y: number }[], lower: { x: number; y: number }[]): string {\n if (upper.length < 2 || lower.length < 2) return '';\n const forward = catmullPath(upper);\n const rev = [...lower].reverse();\n const back = catmullPath(rev);\n // Drop the back path's leading M — the L below connects the two curves.\n const backSegs = back.slice(back.indexOf('C'));\n return `${forward} L ${rev[0].x.toFixed(1)} ${rev[0].y.toFixed(1)} ${backSegs} Z`;\n}\n\nfunction compact(n: number): string {\n return n >= 10000 ? `${Math.round(n / 1000)}k` : n >= 1000 ? `${(n / 1000).toFixed(1)}k` : String(n);\n}\n\nfunction last<T>(a: T[]): T | undefined {\n return a.length > 0 ? a[a.length - 1] : undefined;\n}\n\n// ── Colors ────────────────────────────────────────────────────────────────────\n\n// Shared queue-state palette — the chart bands and the station table columns\n// use the same hues so the two views read as one.\nexport const ACTIVE_COLOR = '#6366f1'; // claimed, being worked right now — indigo\nexport const QUEUED_COLOR = '#0ea5e9'; // pending and unclaimed, waiting in the queue — sky\nexport const RESOLVED_COLOR = '#1E3A8A'; // done — navy, matches the default theme accent\nexport const TARGET_COLOR = '#059669'; // target pace line — emerald\n\n// Priority — unclaimed items past the role's age threshold, the count the\n// floor pulls to the front of the rack. Powder blue for the badge circle;\n// the count text uses the same hue deepened enough to read at chart sizes.\nexport const PRIORITY_COLOR = '#b0e0e6';\nexport const PRIORITY_TEXT_COLOR = '#5b93ad';\n\n// ── End-label stacking — spread close labels so text doesn't collide ────────────\n\nconst MIN_GAP = 13;\nfunction spreadLabels<T extends { y: number }>(labels: T[], maxY: number): (T & { labelY: number })[] {\n const sorted = [...labels].sort((a, b) => a.y - b.y);\n let prev = -Infinity;\n const placed = sorted.map((l) => {\n const labelY = Math.max(l.y + 3, prev + MIN_GAP);\n prev = labelY;\n return { ...l, labelY };\n });\n // On a quiet window every curve sits at zero and the stack would descend\n // past the floor into the station titles — lift the whole stack back above\n // maxY instead.\n const overflow = placed.length > 0 ? placed[placed.length - 1].labelY - maxY : 0;\n if (overflow > 0) {\n for (const l of placed) l.labelY -= overflow;\n }\n return placed;\n}\n\n// ── Chart ─────────────────────────────────────────────────────────────────────\n\nexport function PaceChart({ stations, selectedRole, onSelect, onUpstreamSelect, onPrioritySelect, periodHours }: PaceChartProps) {\n const [hoveredIdx, setHoveredIdx] = useState<number | null>(null);\n\n const n = stations.length;\n if (n === 0) return null;\n\n const xOf = (i: number) => (n === 1 ? ML + chartW / 2 : ML + (i / (n - 1)) * chartW);\n const xMap = new Map(stations.map((s, i) => [s.role, xOf(i)]));\n\n // Per-station counts for the selected window:\n // - target : expected units = target_per_hour × periodHours (e.g. 22/h · 15m ≈ 5).\n // - actual : units resolved in the window (\"the number we see\").\n // - active : units in the queue being worked right now (claimed).\n const rows = stations.map((s, i) => {\n const target = s.target_per_hour ?? null;\n const expected = target != null ? target * periodHours : null;\n return {\n idx: i,\n x: xOf(i),\n expected,\n actual: s.metric?.resolved ?? 0,\n active: s.metric?.claimed ?? 0,\n pending: s.metric?.pending ?? 0,\n priorityCount: s.metric?.priority_count ?? 0,\n };\n });\n\n const hasTargets = rows.some((r) => r.expected != null);\n\n const dataMax = Math.max(\n 1,\n ...rows.map((r) => r.expected ?? 0),\n ...rows.map((r) => r.actual),\n ...rows.map((r) => (r.expected != null ? r.pending : 0)),\n );\n const maxVal = dataMax * 1.15;\n const yScale = (v: number) => MT + chartH * (1 - Math.max(0, Math.min(v, maxVal)) / maxVal);\n\n const withTarget = rows.filter((r) => r.expected != null);\n const targetPts = withTarget.map((r) => ({ ...r, y: yScale(r.expected as number) }));\n const actualPts = withTarget.map((r) => ({ ...r, y: yScale(r.actual) }));\n const activePts = withTarget.map((r) => ({ ...r, y: yScale(r.active) }));\n const pendingPts = withTarget.map((r) => ({ ...r, y: yScale(r.pending) }));\n\n const targetLinePath = catmullPath(targetPts);\n const actualSplinePath = catmullPath(actualPts);\n const activeSplinePath = catmullPath(activePts);\n const pendingSplinePath = catmullPath(pendingPts);\n\n const lastActual = last(actualPts);\n const lastTarget = last(targetPts);\n const lastActive = last(activePts);\n const lastPending = last(pendingPts);\n\n const areaPath =\n actualPts.length >= 2 && lastActual\n ? `${actualSplinePath} L ${lastActual.x.toFixed(1)} ${bottom} L ${actualPts[0].x.toFixed(1)} ${bottom} Z`\n : '';\n\n // Queue composition — pending splits into two stacked bands:\n // floor → active curve = claimed, being worked (indigo)\n // active → pending curve = waiting, unclaimed (sky)\n // When workers claim everything the instant it lands, the sky band collapses\n // to zero and the whole queue reads as indigo.\n const hasQueue = withTarget.some((r) => r.pending > 0 || r.active > 0);\n const workedBandPath =\n hasQueue && activePts.length >= 2 && lastActive\n ? `${activeSplinePath} L ${lastActive.x.toFixed(1)} ${bottom} L ${activePts[0].x.toFixed(1)} ${bottom} Z`\n : '';\n const queuedBandPath = hasQueue ? bandPath(pendingPts, activePts) : '';\n\n // Quiet lines keep their curves (flat at zero) but skip their end labels —\n // a stack of names pointing at nothing is noise.\n const showActiveLabel = withTarget.some((r) => r.active > 0);\n const showQueuedLabel = withTarget.some((r) => r.pending > r.active);\n const endLabels = spreadLabels(\n [\n lastTarget ? { key: 'target', text: 'Target', color: TARGET_COLOR, y: lastTarget.y } : null,\n lastActual ? { key: 'actual', text: 'Resolved', color: RESOLVED_COLOR, y: lastActual.y } : null,\n showActiveLabel && lastActive\n ? { key: 'active', text: 'Claimed', color: ACTIVE_COLOR, y: lastActive.y }\n : null,\n showQueuedLabel && lastPending\n ? { key: 'queued', text: 'Pending', color: QUEUED_COLOR, y: lastPending.y }\n : null,\n ].filter(Boolean) as { key: string; text: string; color: string; y: number }[],\n bottom + 4,\n );\n\n return (\n <svg viewBox={`0 0 ${W} ${H}`} className=\"w-full h-full\" preserveAspectRatio=\"xMidYMid meet\" style={{ display: 'block' }}>\n {/* Dependency connector lines (parent → child), drawn at chart floor */}\n {stations.map((s) => {\n if (!s.parent_role) return null;\n const px = xMap.get(s.parent_role);\n if (px == null) return null;\n const cx = xOf(stations.findIndex((r) => r.role === s.role));\n return <line key={`dep-${s.role}`} x1={px} y1={bottom} x2={cx} y2={bottom} stroke=\"#e2e8f0\" strokeWidth={0.75} />;\n })}\n\n {/* Area under the actual curve */}\n {areaPath && <path d={areaPath} fill={RESOLVED_COLOR} opacity={0.05} style={{ transition: `d ${EASE}` }} />}\n\n {/* Queue composition bands — the band heights split each station's\n pending total into claimed-and-worked (indigo, floor→active) and\n waiting-unclaimed (sky, active→pending). */}\n {workedBandPath && (\n <path d={workedBandPath} fill={ACTIVE_COLOR} opacity={0.12} style={{ transition: `d ${EASE}` }} />\n )}\n {queuedBandPath && (\n <path d={queuedBandPath} fill={QUEUED_COLOR} opacity={0.12} style={{ transition: `d ${EASE}` }} />\n )}\n\n {/* Target — thin emerald reference curve at the window's expected count */}\n {targetLinePath && (\n <path d={targetLinePath} fill=\"none\" stroke={TARGET_COLOR} strokeWidth={0.5} strokeLinejoin=\"round\" opacity={0.9} style={{ transition: `d ${EASE}` }} />\n )}\n\n {/* Per-station target markers — a small emerald dot on the target line\n (mirroring the Resolved line's dots) with the window's expected count\n (target_per_hour × duration) just above it */}\n {targetPts.map((tp) => (\n <g key={`tval-${tp.idx}`} transform={`translate(${tp.x} ${tp.y})`} style={{ transition: `transform ${EASE}` }}>\n <circle r={2} fill={TARGET_COLOR} opacity={0.8} />\n <text\n y={-5}\n textAnchor=\"middle\"\n fontSize={6.5}\n fill={TARGET_COLOR}\n fontFamily=\"ui-monospace, monospace\"\n fontWeight=\"500\"\n opacity={0.7}\n >\n {Math.round(tp.expected as number)}\n </text>\n </g>\n ))}\n\n {/* Pending — thin dotted sky edge along the queue total (top of the bands) */}\n {hasQueue && pendingSplinePath && (\n <path d={pendingSplinePath} fill=\"none\" stroke={QUEUED_COLOR} strokeWidth={0.75} strokeDasharray=\"2 3\" strokeLinecap=\"round\" opacity={0.55} style={{ transition: `d ${EASE}` }} />\n )}\n\n {/* Active — thin dotted indigo, how many are claimed and being worked */}\n {activeSplinePath && (\n <path d={activeSplinePath} fill=\"none\" stroke={ACTIVE_COLOR} strokeWidth={0.75} strokeDasharray=\"2 3\" strokeLinecap=\"round\" opacity={0.5} style={{ transition: `d ${EASE}` }} />\n )}\n\n {/* Actual — thin solid, primary line */}\n {actualSplinePath && (\n <path d={actualSplinePath} fill=\"none\" stroke={RESOLVED_COLOR} strokeWidth={0.6} strokeLinejoin=\"round\" strokeLinecap=\"round\" opacity={0.65} style={{ transition: `d ${EASE}` }} />\n )}\n\n {/* Queue markers — a dot on the active line per station.\n Above the dot, at the pending edge: the queue total (sky when part of\n it is still waiting, slate when everything is claimed).\n Below the dot: active (claimed, being worked right now). */}\n {activePts.map((ap, i) => {\n if (ap.pending <= 0 && ap.active <= 0) return null;\n const ar = Math.max(2.5, Math.min(5, 2.5 + ap.active / 10));\n const hasWaiting = ap.pending > ap.active;\n // Anchor the queue-total label to the pending edge so it rides the top\n // of the band; keep it clear of the dot when the two curves touch.\n const pendingLabelY = Math.min(pendingPts[i].y - 4, ap.y - ar - 4);\n return (\n <g key={`active-${ap.idx}`}>\n {ap.pending > 0 && (\n <text\n x={ap.x}\n y={pendingLabelY}\n textAnchor=\"middle\"\n fontSize={7.5}\n fill={hasWaiting ? QUEUED_COLOR : '#64748b'}\n fontFamily=\"ui-monospace, monospace\"\n fontWeight=\"600\"\n style={{ transition: `y ${EASE}` }}\n >\n {ap.pending}\n </text>\n )}\n <g transform={`translate(${ap.x} ${ap.y})`} style={{ transition: `transform ${EASE}` }}>\n <circle r={ar} fill={ACTIVE_COLOR} opacity={0.85} />\n {ap.active > 0 && (\n <text y={ar + 9} textAnchor=\"middle\" fontSize={7.5} fill={ACTIVE_COLOR} fontFamily=\"ui-monospace, monospace\" fontWeight=\"600\">\n {ap.active}\n </text>\n )}\n </g>\n </g>\n );\n })}\n\n {/* Station nodes — actual (resolved) as a dot on the actual line, styled like\n the active dot but a bit larger (actual is the most important number).\n The count sits below the dot so it stays legible as numbers grow. */}\n {rows.map((row) => {\n const s = stations[row.idx];\n const x = row.x;\n const cy = row.expected != null ? yScale(row.actual) : bottom;\n // Same small scale as the active dot — a hair larger.\n const r = Math.max(2.25, Math.min(4, 2.25 + row.actual / 160));\n const isSelected = s.role === selectedRole;\n const isHovered = hoveredIdx === row.idx;\n\n const tooltip =\n row.expected == null\n ? 'idle · set a target rate to plot pace'\n : `${row.actual} resolved · target ${Math.round(row.expected)}`\n + (row.pending > row.active ? ` · ${row.pending - row.active} pending` : '')\n + (row.active > 0 ? ` · ${row.active} claimed` : '')\n + (row.priorityCount > 0 ? ` · ${row.priorityCount} priority` : '');\n const tipW = tooltip.length * 5.5 + 20;\n const tipX = Math.max(ML + tipW / 2 + 4, Math.min(right - tipW / 2 - 4, x));\n const tipY = cy - r - 10;\n\n return (\n <g\n key={s.role}\n onClick={() => onSelect(s.role)}\n onMouseEnter={() => setHoveredIdx(row.idx)}\n onMouseLeave={() => setHoveredIdx(null)}\n style={{ cursor: 'pointer' }}\n >\n {/* Animated marker group — slides vertically as the window rescales */}\n <g transform={`translate(${x} ${cy})`} style={{ transition: `transform ${EASE}` }}>\n <circle r={22} fill=\"transparent\" />\n <circle r={r} fill={RESOLVED_COLOR} opacity={0.9} style={{ transition: `r ${EASE}` }} />\n {row.expected != null && (\n <text y={-r - 5} textAnchor=\"middle\" fontSize={9.5} fill={RESOLVED_COLOR} fontFamily=\"ui-monospace, monospace\" fontWeight=\"500\">\n {compact(row.actual)}\n </text>\n )}\n {isHovered && !isSelected && <circle r={r + 3} fill=\"none\" stroke={RESOLVED_COLOR} strokeWidth={1} opacity={0.4} />}\n {isSelected && <circle r={r + 4} fill=\"none\" stroke=\"#6366f1\" strokeWidth={2} />}\n </g>\n\n {/* Priority badge — powder blue circle carrying the count of\n unclaimed items past the role's age threshold. Clicking opens\n the station's queue oldest-first by the priority facet so the\n runner grabs the top few and moves them to the front. */}\n {row.priorityCount > 0 && (\n <g\n transform={`translate(${x + 15} ${Math.max(cy - 15, 12)})`}\n onClick={(e) => {\n e.stopPropagation();\n onPrioritySelect?.(s.role);\n }}\n style={{ cursor: 'pointer', transition: `transform ${EASE}` }}\n >\n <title>{`${row.priorityCount} past the priority threshold — click to pull oldest first`}</title>\n <circle\n r={6.5 + (String(row.priorityCount).length - 1) * 2}\n fill={PRIORITY_COLOR}\n opacity={0.9}\n />\n <text\n y={2.5}\n textAnchor=\"middle\"\n fontSize={7}\n fill={PRIORITY_TEXT_COLOR}\n fontFamily=\"ui-monospace, monospace\"\n fontWeight=\"700\"\n >\n {row.priorityCount}\n </text>\n </g>\n )}\n\n {/* Merge affordance — this station also receives input from another\n sequence. The dashed drop into the floor says \"a side-quest\n lands here\"; clicking it opens that sequence. It is a symbol,\n deliberately not a line — the upstream is NOT a descendant. */}\n {(s.upstream_roles?.length ?? 0) > 0 && (\n <g\n transform={`translate(${x - 20} ${bottom})`}\n onClick={(e) => {\n e.stopPropagation();\n onUpstreamSelect?.(s.upstream_roles![0]);\n }}\n style={{ cursor: 'pointer' }}\n >\n <title>{`Fed by ${s.upstream_roles!.join(', ')} — click to view that sequence`}</title>\n <circle r={9} cy={-6} fill=\"transparent\" />\n <path d=\"M -7 -14 C -3 -14 -1 -9 0 -2\" fill=\"none\" stroke=\"#94a3b8\" strokeWidth={1} strokeDasharray=\"2 2\" strokeLinecap=\"round\" />\n <path d=\"M 0 -2 L 8 -2\" stroke=\"#94a3b8\" strokeWidth={1} strokeLinecap=\"round\" />\n <path d=\"M 8 -2 l -3.5 -2 v 4 z\" fill=\"#94a3b8\" />\n </g>\n )}\n\n {/* Station label — the display name (user-set title, or derived\n from the role id). The exact id lives in the table below.\n Adjacent labels alternate depth from the baseline so dense\n sequences don't collide. */}\n <text\n x={x}\n y={bottom + (row.idx % 2 === 0 ? 14 : 27)}\n textAnchor=\"middle\"\n fontSize={9.5}\n fill=\"#475569\"\n fontFamily=\"ui-sans-serif, sans-serif\"\n fontWeight=\"500\"\n >\n {displayRoleTitle(s)}\n </text>\n\n {/* Tooltip */}\n {isHovered && (\n <g>\n <rect x={tipX - tipW / 2} y={tipY - 16} width={tipW} height={19} rx={3} fill=\"#0f172a\" opacity={0.88} />\n <text x={tipX} y={tipY - 3} textAnchor=\"middle\" fontSize={8.5} fill=\"white\" fontFamily=\"ui-monospace, monospace\">\n {tooltip}\n </text>\n </g>\n )}\n </g>\n );\n })}\n\n {/* No-target hint */}\n {!hasTargets && (\n <text x={ML + chartW / 2} y={bottom + 48} textAnchor=\"middle\" fontSize={8.5} fill=\"#94a3b8\" fontFamily=\"ui-sans-serif, sans-serif\">\n Set target_per_hour on each role in Admin → Roles to enable the pace chart\n </text>\n )}\n\n {/* End labels — text + count, rendered last so they sit above everything */}\n {endLabels.map((l) => (\n <text\n key={l.key}\n x={right + 6}\n y={l.labelY}\n fontSize={8}\n fill={l.color}\n fontFamily=\"ui-sans-serif, sans-serif\"\n fontWeight={l.key === 'actual' ? 700 : 500}\n opacity={l.key === 'active' ? 0.85 : 1}\n style={{ transition: `y ${EASE}` }}\n >\n {l.text}\n </text>\n ))}\n </svg>\n );\n}\n","import type { RoleDetail } from '../../api/roles';\n\n/**\n * Deep link to the available-escalations queue ordered oldest-first by the\n * role's priority age origin: the metadata facet when configured (faceted\n * orderBy, nulls last), else created_at. Mirrors the priority_count SQL so\n * the counted items sit at the top of the list the runner opens.\n */\nexport function priorityQueueLink(role: Pick<RoleDetail, 'role' | 'priority_facet'>): string {\n const base = `/escalations/available?role=${encodeURIComponent(role.role)}`;\n if (role.priority_facet) {\n const orderBy = JSON.stringify([{ field: `metadata.${role.priority_facet}`, direction: 'asc' }]);\n return `${base}&orderBy=${encodeURIComponent(orderBy)}`;\n }\n return `${base}&sort_by=created_at&order=asc`;\n}\n","import { useState } from 'react';\nimport { Link } from 'react-router-dom';\nimport { X, ExternalLink, Settings, List } from 'lucide-react';\nimport { useStationMetrics } from '../../api/escalations';\nimport type { StationMetric } from '../../api/escalations';\nimport type { RoleDetail } from '../../api/roles';\nimport { PRIORITY_TEXT_COLOR } from './PaceChart';\nimport { priorityQueueLink } from './priority-link';\nimport { displayRoleTitle } from '../../lib/role-display';\n\ninterface StationDetailPanelProps {\n role: RoleDetail | null;\n allMetrics: StationMetric[];\n orderedRoles: RoleDetail[];\n globalPeriod: string;\n onClose: () => void;\n}\n\n// Mirrors OperationsPage's selector — the panel reports the same windows the\n// chart can show, and opens on whichever one the chart has selected.\nconst PERIODS = ['15m', '1h', '24h', '7d', '30d'] as const;\ntype Period = (typeof PERIODS)[number];\n\nconst isPeriod = (p: string): p is Period => (PERIODS as readonly string[]).includes(p);\n\nfunction fmt(min: number | null): string {\n if (min == null) return '—';\n if (min < 1) {\n const s = Math.round(min * 60);\n return s <= 0 ? '< 1s' : `${s}s`;\n }\n if (min < 60) return `${min.toFixed(0)}m`;\n return `${(min / 60).toFixed(1)}h`;\n}\n\nfunction MetricRow({ label, value }: { label: string; value: string }) {\n return (\n <div className=\"flex items-center justify-between py-1\">\n <span className=\"text-[10px] text-text-tertiary uppercase tracking-wider\">{label}</span>\n <span className=\"text-xs font-mono font-medium text-text-primary tabular-nums\">{value}</span>\n </div>\n );\n}\n\nfunction PeriodSelector({ period, onChange }: { period: Period; onChange: (p: Period) => void }) {\n return (\n <div className=\"flex items-center gap-1 mb-4\">\n {PERIODS.map((p) => (\n <button\n key={p}\n onClick={() => onChange(p)}\n className={`px-2 py-0.5 text-[10px] font-mono rounded transition-colors ${\n period === p\n ? 'bg-accent/10 text-accent font-semibold'\n : 'text-text-quaternary hover:text-text-secondary'\n }`}\n >\n {p}\n </button>\n ))}\n </div>\n );\n}\n\nfunction RoleView({ role, globalPeriod, onClose }: { role: RoleDetail; globalPeriod: string; onClose: () => void }) {\n // Open on the chart's selected window so the panel's numbers agree with the\n // chart beside it; the local selector still lets the viewer drill around.\n const [period, setPeriod] = useState<Period>(isPeriod(globalPeriod) ? globalPeriod : '24h');\n const { data } = useStationMetrics(period);\n const metric = data?.stations.find((s) => s.role === role.role);\n const slaMinutes = role.sla_minutes ?? undefined;\n const targetPerHour = role.target_per_hour ?? undefined;\n const workerCount = role.worker_count ?? undefined;\n\n return (\n <>\n {/* Header */}\n <div className=\"flex items-start justify-between mb-1\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-baseline gap-1.5 flex-wrap\">\n <span className=\"text-sm font-bold text-text-primary\">{displayRoleTitle(role)}</span>\n <span className=\"text-[10px] font-mono text-text-secondary\">{role.role}</span>\n </div>\n {role.description && (\n <p className=\"text-[10px] text-text-tertiary mt-0.5 line-clamp-2 leading-relaxed\">\n {role.description}\n </p>\n )}\n </div>\n <button\n onClick={onClose}\n className=\"text-text-quaternary hover:text-text-secondary transition-colors mt-0.5 shrink-0 ml-2\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n\n <div className=\"flex items-center gap-3 mb-4\">\n <Link\n to={`/admin/roles/${encodeURIComponent(role.role)}`}\n className=\"flex items-center gap-1 text-[10px] text-accent hover:underline\"\n >\n <Settings className=\"w-2.5 h-2.5\" />\n Edit in Roles\n </Link>\n <Link\n to={`/escalations/available?role=${encodeURIComponent(role.role)}`}\n className=\"flex items-center gap-1 text-[10px] text-accent hover:underline\"\n >\n <List className=\"w-2.5 h-2.5\" />\n View full queue\n </Link>\n </div>\n\n <PeriodSelector period={period} onChange={setPeriod} />\n\n {/* Capacity settings */}\n {(targetPerHour || slaMinutes || workerCount) && (\n <div className=\"flex items-center gap-4 mb-4 text-[10px]\">\n {targetPerHour && (\n <div>\n <div className=\"font-mono font-semibold text-text-primary\">{targetPerHour}/h</div>\n <div className=\"text-text-quaternary uppercase tracking-wider text-[8.5px]\">target</div>\n </div>\n )}\n {slaMinutes && (\n <div>\n <div className=\"font-mono font-semibold text-text-primary\">{slaMinutes}m</div>\n <div className=\"text-text-quaternary uppercase tracking-wider text-[8.5px]\">SLA</div>\n </div>\n )}\n {workerCount && (\n <div>\n <div className=\"font-mono font-semibold text-text-primary\">{workerCount}</div>\n <div className=\"text-text-quaternary uppercase tracking-wider text-[8.5px]\">workers</div>\n </div>\n )}\n </div>\n )}\n\n {/* Two-column wait / work grid */}\n <div className=\"grid grid-cols-2 gap-x-3\">\n <div>\n <p className=\"text-[9px] text-text-quaternary uppercase tracking-wider mb-1.5\">Wait (queue)</p>\n <MetricRow label=\"P99\" value={fmt(metric?.wait.p99 ?? null)} />\n <MetricRow label=\"avg\" value={fmt(metric?.wait.avg ?? null)} />\n </div>\n <div>\n <p className=\"text-[9px] text-text-quaternary uppercase tracking-wider mb-1.5\">Work (proc.)</p>\n <MetricRow label=\"P99\" value={fmt(metric?.work.p99 ?? null)} />\n <MetricRow label=\"avg\" value={fmt(metric?.work.avg ?? null)} />\n </div>\n </div>\n\n {/* SLA + priority */}\n <div className=\"border-t border-surface-border/40 pt-2 mt-3 space-y-1.5\">\n {slaMinutes && (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-[10px] text-text-tertiary\">SLA target</span>\n <span className=\"text-xs font-mono text-text-secondary\">{slaMinutes}m</span>\n </div>\n )}\n {metric && metric.priority_count > 0 && (\n <Link\n to={priorityQueueLink(role)}\n className=\"flex items-center justify-between group\"\n >\n <span className=\"text-[10px]\" style={{ color: PRIORITY_TEXT_COLOR }}>\n {metric.priority_count} priority — pull oldest first\n </span>\n <ExternalLink className=\"w-3 h-3 transition-colors\" style={{ color: PRIORITY_TEXT_COLOR }} />\n </Link>\n )}\n </div>\n\n </>\n );\n}\n\nfunction OverviewPanel({\n allMetrics,\n orderedRoles,\n period,\n}: {\n allMetrics: StationMetric[];\n orderedRoles: RoleDetail[];\n period: string;\n}) {\n const totalPending = allMetrics.reduce((s, m) => s + m.pending, 0);\n const totalResolved = allMetrics.reduce((s, m) => s + m.resolved, 0);\n const totalPriority = allMetrics.reduce((s, m) => s + m.priority_count, 0);\n\n const metricByRole = new Map(allMetrics.map((m) => [m.role, m]));\n const stationsAtRisk = allMetrics.filter((m) => m.priority_count > 0).length;\n const stationsWithLoad = allMetrics.filter((m) => m.pending > 0).length;\n\n return (\n <>\n <p className=\"text-[9px] text-text-quaternary uppercase tracking-wider mb-3\">\n Pipeline · {period}\n </p>\n\n {/* Health headline */}\n <div className=\"mb-4\">\n {stationsAtRisk > 0 ? (\n <p className=\"text-[11px]\" style={{ color: PRIORITY_TEXT_COLOR }}>\n {stationsAtRisk} station{stationsAtRisk > 1 ? 's' : ''} with priority items\n </p>\n ) : stationsWithLoad > 0 ? (\n <p className=\"text-[11px] text-status-warning\">\n {stationsWithLoad} station{stationsWithLoad > 1 ? 's' : ''} with backlog\n </p>\n ) : totalResolved > 0 ? (\n <p className=\"text-[11px] text-status-success\">Flowing — queue clear</p>\n ) : (\n <p className=\"text-[11px] text-text-quaternary\">Quiet — awaiting work</p>\n )}\n </div>\n\n {/* Key counters */}\n <div className=\"space-y-1.5 mb-4\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-[9px] text-text-quaternary uppercase tracking-wider\">Pending</span>\n <span className={`text-xs font-mono tabular-nums ${totalPending > 0 ? 'text-text-primary font-semibold' : 'text-text-quaternary'}`}>\n {totalPending}\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-[9px] text-text-quaternary uppercase tracking-wider\">Resolved · {period}</span>\n <span className=\"text-xs font-mono tabular-nums text-text-secondary\">{totalResolved}</span>\n </div>\n {totalPriority > 0 && (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-[9px] text-text-quaternary uppercase tracking-wider\">Priority</span>\n <span className=\"text-xs font-mono tabular-nums font-semibold\" style={{ color: PRIORITY_TEXT_COLOR }}>\n {totalPriority}\n </span>\n </div>\n )}\n </div>\n\n {/* Divider + column headers */}\n <div className=\"border-t border-surface-border/40 pt-2 mb-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-[8px] text-text-quaternary uppercase tracking-wider flex-1\">Station</span>\n <span className=\"text-[8px] text-text-quaternary uppercase tracking-wider w-8 text-right shrink-0\">pend</span>\n <span className=\"text-[8px] text-text-quaternary uppercase tracking-wider w-8 text-right shrink-0\">clmd</span>\n <span className=\"text-[8px] text-text-quaternary uppercase tracking-wider w-8 text-right shrink-0\">res</span>\n </div>\n </div>\n\n {/* Station list in pipeline order */}\n <div className=\"space-y-0.5\">\n {orderedRoles.map((r) => {\n const m = metricByRole.get(r.role);\n const pending = m?.pending ?? 0;\n const claimed = m?.claimed ?? 0;\n const resolved = m?.resolved ?? 0;\n const priorityCount = m?.priority_count ?? 0;\n const label = r.title || r.role;\n const hasAlert = priorityCount > 0;\n const hasLoad = pending > 0;\n\n return (\n <div key={r.role} className=\"flex items-center gap-2 py-0.5\">\n <span\n className={`text-[10px] font-mono flex-1 truncate ${\n hasLoad ? 'text-text-primary' : 'text-text-quaternary'\n }`}\n >\n {label}\n {hasAlert && (\n <span className=\"ml-1 text-[8px] font-semibold\" style={{ color: PRIORITY_TEXT_COLOR }}>\n {priorityCount} PRIORITY\n </span>\n )}\n </span>\n <span\n className={`text-[10px] font-mono tabular-nums w-8 text-right shrink-0 ${\n hasLoad ? 'text-text-primary font-semibold' : 'text-text-quaternary'\n }`}\n >\n {pending > 0 ? pending : '—'}\n </span>\n <span className={`text-[10px] font-mono tabular-nums w-8 text-right shrink-0 ${claimed > 0 ? 'text-accent' : 'text-text-quaternary'}`}>\n {claimed > 0 ? claimed : '—'}\n </span>\n <span className={`text-[10px] font-mono tabular-nums w-8 text-right shrink-0 ${resolved > 0 ? 'text-text-secondary' : 'text-text-quaternary'}`}>\n {resolved > 0 ? resolved : '—'}\n </span>\n </div>\n );\n })}\n </div>\n\n <p className=\"text-[9px] text-text-quaternary mt-5\">\n Select a station for queue detail.\n </p>\n </>\n );\n}\n\nexport function StationDetailPanel({\n role,\n allMetrics,\n orderedRoles,\n globalPeriod,\n onClose,\n}: StationDetailPanelProps) {\n return (\n <div className=\"w-[280px] shrink-0 px-6 py-8 flex flex-col overflow-y-auto min-h-0\">\n {role ? (\n <RoleView role={role} globalPeriod={globalPeriod} onClose={onClose} />\n ) : (\n <OverviewPanel allMetrics={allMetrics} orderedRoles={orderedRoles} period={globalPeriod} />\n )}\n </div>\n );\n}\n","import { useState, useMemo, useCallback } from 'react';\nimport { Link, useNavigate, useSearchParams } from 'react-router-dom';\nimport { GitMerge, RefreshCw, List } from 'lucide-react';\nimport { useRoleDetails, type RoleDetail } from '../../api/roles';\nimport { useStationMetrics } from '../../api/escalations';\nimport type { StationMetric } from '../../api/escalations';\nimport { useStationMetricsEvents } from '../../hooks/useEventHooks';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport {\n PaceChart,\n ACTIVE_COLOR,\n QUEUED_COLOR,\n RESOLVED_COLOR,\n TARGET_COLOR,\n PRIORITY_COLOR,\n PRIORITY_TEXT_COLOR,\n type ChartStation,\n} from './PaceChart';\nimport { StationDetailPanel } from './StationDetailPanel';\nimport { priorityQueueLink } from './priority-link';\nimport { displayRoleTitle } from '../../lib/role-display';\n\n// Column band tints — the same hues as the chart's queue-composition bands\n// (~8% alpha), so PENDING/ACTIVE/RESOLVED in the table visually continue the\n// sky/indigo/sage story told above.\nconst TARGET_BAND = `${TARGET_COLOR}14`;\nconst PENDING_BAND = `${QUEUED_COLOR}14`;\nconst ACTIVE_BAND = `${ACTIVE_COLOR}14`;\nconst RESOLVED_BAND = `${RESOLVED_COLOR}14`;\n\n// Station table grid — shared by the header and every row. The display name\n// leads (user-set title or derived from the id); the exact role id follows.\nconst STATION_GRID_COLS = 'minmax(120px, 1.1fr) minmax(100px, 0.9fr) 64px 56px 56px 60px 72px 72px 104px 36px';\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\nconst PERIODS = ['15m', '1h', '24h', '7d', '30d'] as const;\ntype Period = (typeof PERIODS)[number];\n\n// Window length in hours — used to express the target as a count for the\n// selected window (target_per_hour × hours), e.g. 22/h over 15m ≈ 5 expected.\nconst PERIOD_HOURS: Record<Period, number> = {\n '15m': 0.25,\n '1h': 1,\n '24h': 24,\n '7d': 168,\n '30d': 720,\n};\n\ninterface OrderedStation {\n role: RoleDetail;\n depth: number;\n}\n\n/**\n * One sequence of stations, named by its origin role. Execution is a graph;\n * each fragment is the human-readable line the user composed via parent_role.\n * Cross-fragment edges live in upstream_roles and render as a merge affordance\n * on the chart, never as a bend in the line.\n */\ninterface SequenceFragment {\n origin: RoleDetail;\n stations: OrderedStation[];\n}\n\n// ── Fragment builder — BFS per parent_role root, tracking actual depth ────────\n\nexport function buildFragments(roles: RoleDetail[]): SequenceFragment[] {\n const opsRoles = roles.filter((r) => r.ops_visible);\n const roleMap = new Map(opsRoles.map((r) => [r.role, r]));\n const visited = new Set<string>();\n\n // Roots: no parent, or parent not in ops set — each roots its own fragment.\n const roots = opsRoles.filter((r) => !r.parent_role || !roleMap.has(r.parent_role));\n\n const fragments: SequenceFragment[] = roots.map((root) => {\n const stations: OrderedStation[] = [];\n const queue: OrderedStation[] = [{ role: root, depth: 0 }];\n while (queue.length > 0) {\n const item = queue.shift()!;\n if (visited.has(item.role.role)) continue;\n visited.add(item.role.role);\n stations.push(item);\n opsRoles\n .filter((c) => c.parent_role === item.role.role && !visited.has(c.role))\n .forEach((c) => queue.push({ role: c, depth: item.depth + 1 }));\n }\n return { origin: root, stations };\n });\n\n // Unreachable (cycles / dangling) — each stands alone rather than vanishing.\n opsRoles\n .filter((r) => !visited.has(r.role))\n .forEach((r) => fragments.push({ origin: r, stations: [{ role: r, depth: 0 }] }));\n\n // Longest line first — the primary sequence leads; side-quests follow.\n return fragments.sort(\n (a, b) => b.stations.length - a.stations.length || a.origin.role.localeCompare(b.origin.role),\n );\n}\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\nfunction fmtMin(v: number | null): string {\n if (v == null) return '—';\n if (v < 1) {\n const s = Math.round(v * 60);\n return s <= 0 ? '< 1s' : `${s}s`;\n }\n if (v < 60) return `${v.toFixed(0)}m`;\n return `${(v / 60).toFixed(1)}h`;\n}\n\nfunction loadBar(pending: number, target: number | null) {\n // No target, or nothing pending — there is no live load to trend. Show the\n // empty state rather than inventing a rate from historical throughput.\n if (!target || pending === 0) return { pct: null, color: 'bg-surface-border' };\n\n const ratio = pending / target;\n const pct = Math.round(ratio * 100);\n // Amber: backlog. Orange: some work but well under pace. Green: healthy.\n const color = ratio > 1.0 ? 'bg-status-warning' : ratio < 0.2 ? 'bg-status-draft' : 'bg-status-success';\n return { pct, color };\n}\n\n// ── Station table row ─────────────────────────────────────────────────────────\n\nfunction StationRow({\n role,\n metric,\n selected,\n onClick,\n}: {\n role: RoleDetail;\n metric: StationMetric | undefined;\n selected: boolean;\n onClick: () => void;\n}) {\n const pending = metric?.pending ?? 0;\n const claimed = metric?.claimed ?? 0;\n const resolved = metric?.resolved ?? 0;\n const priorityCount = metric?.priority_count ?? 0;\n const target = role.target_per_hour ?? null;\n const { pct, color } = loadBar(pending, target);\n const barWidth = pct != null ? Math.min(100, pct) : 0;\n\n return (\n <>\n <div\n role=\"button\"\n tabIndex={0}\n onClick={onClick}\n onKeyDown={(e) => { if (e.key === 'Enter') onClick(); }}\n className={`grid items-center gap-4 pr-3 cursor-pointer transition-colors ${\n selected ? 'border-l-2 !border-l-accent pl-2.5' : 'pl-3'\n }`}\n style={{ gridTemplateColumns: STATION_GRID_COLS }}\n >\n {/* Name — user-set title, or derived from the role id */}\n <div className=\"flex items-center gap-1.5 min-w-0 py-1.5\">\n <span className=\"font-bold text-text-primary truncate text-xs\">\n {displayRoleTitle(role)}\n </span>\n {(role.upstream_roles?.length ?? 0) > 0 && (\n <span title={`Fed by ${role.upstream_roles.join(', ')}`} className=\"shrink-0 leading-none\">\n <GitMerge className=\"w-3 h-3 text-text-quaternary\" />\n </span>\n )}\n </div>\n\n {/* Role id — the exact format */}\n <span className=\"font-mono text-[11px] text-text-tertiary truncate py-1.5\">\n {role.role}\n </span>\n\n {/* Target / hour — emerald band, same hue as the chart's target line */}\n <div\n className=\"self-stretch flex items-center justify-end px-1.5\"\n style={{ backgroundColor: TARGET_BAND }}\n >\n <span\n className={`text-xs font-mono tabular-nums ${\n target != null ? 'text-text-secondary' : 'text-text-quaternary'\n }`}\n >\n {target != null ? target : '—'}\n </span>\n </div>\n\n {/* Pending — sky band, same hue as the chart's waiting band */}\n <div\n className=\"self-stretch flex items-center justify-end px-1.5\"\n style={{ backgroundColor: PENDING_BAND }}\n >\n <Link\n to={`/escalations/available?role=${encodeURIComponent(role.role)}&status=available`}\n className={`text-xs font-mono tabular-nums hover:underline ${\n pending > 0 ? 'text-text-primary font-semibold' : 'text-text-quaternary'\n }`}\n onClick={(e) => e.stopPropagation()}\n >\n {pending}\n </Link>\n </div>\n\n {/* Active — indigo band, same hue as the chart's worked band */}\n <div\n className=\"self-stretch flex items-center justify-end px-1.5\"\n style={{ backgroundColor: ACTIVE_BAND }}\n >\n <Link\n to={`/escalations/available?role=${encodeURIComponent(role.role)}&status=claimed`}\n className={`text-xs font-mono tabular-nums hover:underline ${\n claimed > 0 ? 'text-accent font-semibold' : 'text-text-quaternary'\n }`}\n onClick={(e) => e.stopPropagation()}\n >\n {claimed}\n </Link>\n </div>\n\n {/* Resolved — sage band, same hue as the chart's actual curve */}\n <div\n className=\"self-stretch flex items-center justify-end px-1.5\"\n style={{ backgroundColor: RESOLVED_BAND }}\n >\n <Link\n to={`/escalations/available?role=${encodeURIComponent(role.role)}&status=resolved`}\n className=\"text-xs font-mono tabular-nums hover:underline text-text-quaternary\"\n onClick={(e) => e.stopPropagation()}\n >\n {resolved}\n </Link>\n </div>\n\n {/* P99 wait */}\n <span className=\"text-xs font-mono tabular-nums text-right py-1.5 text-text-secondary\">\n {fmtMin(metric?.wait.p99 ?? null)}\n </span>\n\n {/* P99 work */}\n <span className=\"text-xs font-mono tabular-nums text-right py-1.5 text-text-secondary\">\n {fmtMin(metric?.work.p99 ?? null)}\n </span>\n\n {/* Load mini-bar */}\n <div className=\"flex items-center gap-2 py-1.5\">\n <div className=\"w-12 h-1.5 bg-surface-sunken rounded-full overflow-hidden shrink-0\">\n <div className={`h-full rounded-full ${color}`} style={{ width: `${barWidth}%` }} />\n </div>\n <span\n className={`text-[10px] font-mono tabular-nums ${\n pct != null && pct > 100\n ? 'text-status-warning font-semibold'\n : 'text-text-quaternary'\n }`}\n >\n {pct != null ? `${pct}%` : '—'}\n </span>\n </div>\n\n {/* Actions */}\n <div className=\"flex items-center justify-center py-1.5\">\n <Link\n to={`/escalations/available?role=${encodeURIComponent(role.role)}`}\n className=\"text-text-quaternary hover:text-accent transition-colors\"\n title=\"View full queue\"\n onClick={(e) => e.stopPropagation()}\n >\n <List className=\"w-3.5 h-3.5\" />\n </Link>\n </div>\n </div>\n\n {/* Priority sub-row — unclaimed items past the role's age threshold */}\n {priorityCount > 0 && (\n <div className=\"flex items-center gap-1.5 pb-2 pl-3.5\">\n <span\n className=\"w-2.5 h-2.5 rounded-full dot-ring shrink-0\"\n style={{ backgroundColor: PRIORITY_COLOR }}\n />\n <Link\n to={priorityQueueLink(role)}\n className=\"text-[10px] hover:underline\"\n style={{ color: PRIORITY_TEXT_COLOR }}\n onClick={(e) => e.stopPropagation()}\n >\n {priorityCount} priority — pull oldest first →\n </Link>\n </div>\n )}\n </>\n );\n}\n\n// ── Table header ──────────────────────────────────────────────────────────────\n\nfunction TableHead() {\n // Queue-state columns carry the chart's band hue into the table.\n const cols: { label: string; band?: string; hue?: string }[] = [\n { label: 'NAME' },\n { label: 'ROLE' },\n { label: 'TARGET/H', band: TARGET_BAND, hue: TARGET_COLOR },\n { label: 'PENDING', band: PENDING_BAND, hue: QUEUED_COLOR },\n { label: 'CLAIMED', band: ACTIVE_BAND, hue: ACTIVE_COLOR },\n { label: 'RESOLVED', band: RESOLVED_BAND, hue: RESOLVED_COLOR },\n { label: 'P99 WAIT' },\n { label: 'P99 WORK' },\n { label: 'TREND' },\n { label: 'ACTIONS' },\n ];\n return (\n <div\n className=\"grid items-center gap-4 px-3 border-b border-surface-border mb-0.5\"\n style={{ gridTemplateColumns: STATION_GRID_COLS }}\n >\n {cols.map((col, i) =>\n col.band ? (\n <div\n key={col.label}\n className=\"self-stretch flex items-center justify-end px-1.5\"\n style={{ backgroundColor: col.band }}\n >\n <span\n className=\"text-[9px] font-semibold uppercase tracking-wider\"\n style={{ color: col.hue }}\n >\n {col.label}\n </span>\n </div>\n ) : (\n <span\n key={col.label}\n className={`text-[9px] font-semibold uppercase tracking-wider text-text-quaternary py-1.5 ${\n i > 1 && i < 8 ? 'text-right' : i === 9 ? 'text-center' : ''\n }`}\n >\n {col.label}\n </span>\n ),\n )}\n </div>\n );\n}\n\n\n// ── Page ──────────────────────────────────────────────────────────────────────\n\nexport function OperationsPage() {\n // 1h default: long enough to show a whole simulation shift's shape,\n // short enough that stale history doesn't drown the current run.\n const [period, setPeriod] = useState<Period>('1h');\n const [selectedRole, setSelectedRole] = useState<string | null>(null);\n const [refreshing, setRefreshing] = useState(false);\n\n // Push-driven refresh: every escalation event invalidates ['stationMetrics']\n // through the central event system (debounced, transport-agnostic). The\n // header's refresh button covers user-initiated reloads.\n useStationMetricsEvents();\n\n const { data: roleData, isLoading: rolesLoading, refetch: refetchRoles } = useRoleDetails();\n const {\n data: metricsData,\n isLoading: metricsLoading,\n refetch: refetchMetrics,\n } = useStationMetrics(period);\n\n const roles = roleData?.roles ?? [];\n const metrics = metricsData?.stations ?? [];\n\n // Sequence fragments, one per parent_role root. The active one is\n // DEEP-LINKED (?fragment=<origin role>) and each switch is a history entry,\n // so a shared link opens the same sequence and back/forward walks them.\n const fragments = useMemo((): SequenceFragment[] => buildFragments(roles), [roles]);\n const [searchParams, setSearchParams] = useSearchParams();\n const fragmentParam = searchParams.get('fragment');\n const activeFragment =\n fragments.find((f) => f.origin.role === fragmentParam) ?? fragments[0] ?? null;\n const selectFragment = useCallback(\n (origin: string) => {\n setSelectedRole(null);\n setSearchParams((prev) => {\n const p = new URLSearchParams(prev);\n p.set('fragment', origin);\n return p;\n });\n },\n [setSearchParams],\n );\n\n const ordered = activeFragment?.stations ?? [];\n const fragmentRoleSet = useMemo(\n () => new Set(ordered.map(({ role }) => role.role)),\n [ordered],\n );\n const fragmentMetrics = useMemo(\n () => metrics.filter((m) => fragmentRoleSet.has(m.role)),\n [metrics, fragmentRoleSet],\n );\n\n const chartStations = useMemo(\n (): ChartStation[] =>\n ordered.map(({ role: r }) => ({\n role: r.role,\n title: r.title,\n parent_role: r.parent_role,\n target_per_hour: r.target_per_hour ?? null,\n upstream_roles: r.upstream_roles ?? [],\n metric: metrics.find((m) => m.role === r.role),\n })),\n [ordered, metrics],\n );\n\n // Jump to the sequence that feeds this station — the merge glyph's click.\n const handleUpstreamSelect = useCallback(\n (upstreamRole: string) => {\n const target = fragments.find((f) =>\n f.stations.some(({ role }) => role.role === upstreamRole),\n );\n if (target) selectFragment(target.origin.role);\n },\n [fragments, selectFragment],\n );\n\n // Priority-badge click — open the station's queue oldest-first by its facet.\n const navigate = useNavigate();\n const handlePrioritySelect = useCallback(\n (roleName: string) => {\n const detail = roles.find((r) => r.role === roleName);\n if (detail) navigate(priorityQueueLink(detail));\n },\n [roles, navigate],\n );\n\n const selectedRoleDetail =\n ordered.find(({ role }) => role.role === selectedRole)?.role ?? null;\n\n const isLoading = rolesLoading || metricsLoading;\n\n const handleRefresh = async () => {\n setRefreshing(true);\n await Promise.all([refetchRoles(), refetchMetrics()]);\n setRefreshing(false);\n };\n\n const handleSelect = (role: string) =>\n setSelectedRole((prev) => (prev === role ? null : role));\n\n const periodSelector = (\n <div className=\"flex items-center gap-0.5\">\n {PERIODS.map((p) => (\n <button\n key={p}\n onClick={() => setPeriod(p)}\n className={`px-2.5 py-1 text-[10px] font-mono rounded transition-colors ${\n period === p\n ? 'bg-accent/10 text-accent font-semibold'\n : 'text-text-quaternary hover:text-text-secondary'\n }`}\n >\n {p}\n </button>\n ))}\n </div>\n );\n\n return (\n <div className=\"flex flex-col flex-1 min-h-0\">\n <PageHeader\n title=\"Pace Board\"\n docsHash=\"#docs:dashboard.md:pace-board\"\n center={periodSelector}\n actions={\n <button\n onClick={handleRefresh}\n disabled={refreshing}\n className=\"text-text-quaternary hover:text-text-secondary transition-colors disabled:opacity-40\"\n >\n <RefreshCw className={`w-3.5 h-3.5 ${refreshing ? 'animate-spin' : ''}`} />\n </button>\n }\n />\n\n {isLoading ? (\n <div className=\"animate-pulse space-y-6 mt-4\">\n <div className=\"h-8 bg-surface-sunken rounded w-64\" />\n <div className=\"h-64 bg-surface-sunken rounded w-full\" />\n <div className=\"space-y-3\">\n {[1, 2, 3].map((i) => (\n <div key={i} className=\"h-8 bg-surface-sunken rounded w-full\" />\n ))}\n </div>\n </div>\n ) : fragments.length === 0 ? (\n <div className=\"mt-8\">\n <p className=\"text-sm text-text-secondary mb-2\">Stations appear here once roles are marked visible in Operations.</p>\n <p className=\"text-xs text-text-tertiary\">\n Go to{' '}\n <Link to=\"/admin/roles\" className=\"text-accent hover:underline\">\n Roles\n </Link>{' '}\n and enable <strong>Visible in Operations</strong> on roles that represent pipeline\n stations.\n </p>\n </div>\n ) : (\n /* Console layout: fixed header (above) → chart row (min 40vh) → table row (max 30vh) */\n <div className=\"flex flex-col flex-1 min-h-0\">\n\n {/* Sequence picker — one tab per fragment, named by its origin role.\n Only rendered when there is more than one story to tell. */}\n {fragments.length > 1 && (\n <div className=\"flex items-center gap-0.5 px-4 pt-2\">\n {fragments.map((f) => {\n const isActive = f.origin.role === activeFragment?.origin.role;\n return (\n <button\n key={f.origin.role}\n onClick={() => selectFragment(f.origin.role)}\n className={`px-2.5 py-1 text-[10px] font-mono rounded transition-colors ${\n isActive\n ? 'bg-accent/10 text-accent font-semibold'\n : 'text-text-quaternary hover:text-text-secondary'\n }`}\n >\n {displayRoleTitle(f.origin)}\n <span className={`ml-1.5 tabular-nums ${isActive ? 'text-accent/60' : 'text-text-quaternary/60'}`}>\n {f.stations.length}\n </span>\n </button>\n );\n })}\n </div>\n )}\n\n {/* Middle row: flexible, never below 40vh — SVG fills left, sidebar fixed-width right */}\n <div className=\"flex-1 min-h-[40vh] flex items-stretch overflow-hidden\">\n {/* SVG chart — scales to fill available space */}\n <div className=\"flex-1 min-w-0 min-h-0 flex flex-col justify-center overflow-hidden p-4\">\n <PaceChart\n stations={chartStations}\n selectedRole={selectedRole}\n onSelect={handleSelect}\n onUpstreamSelect={handleUpstreamSelect}\n onPrioritySelect={handlePrioritySelect}\n periodHours={PERIOD_HOURS[period]}\n />\n </div>\n {/* Vertical divider */}\n <div className=\"w-px bg-surface-border shrink-0 self-stretch\" />\n {/* Right sidebar — fixed width, scrolls its own content */}\n <StationDetailPanel\n role={selectedRoleDetail}\n allMetrics={fragmentMetrics}\n orderedRoles={ordered.map((o) => o.role)}\n globalPeriod={period}\n onClose={() => setSelectedRole(null)}\n />\n </div>\n\n {/* Bottom row: sized to its rows up to 30vh — header sticky, rows scroll */}\n <div className=\"max-h-[30vh] flex-none flex flex-col border-t border-surface-border overflow-hidden\">\n <TableHead />\n <div className=\"flex-1 min-h-0 overflow-y-auto divide-y divide-surface-border/30\">\n {ordered.map(({ role }) => (\n <StationRow\n key={role.role}\n role={role}\n metric={metrics.find((m) => m.role === role.role)}\n selected={selectedRole === role.role}\n onClick={() => handleSelect(role.role)}\n />\n ))}\n </div>\n </div>\n\n </div>\n )}\n </div>\n );\n}\n"],"names":["deriveRoleTitle","role","w","displayRoleTitle","r","_a","W","H","ML","MR","MT","MB","chartW","chartH","bottom","right","EASE","SOLO_HALF","soloSegment","p","catmullPath","pts","segs","i","p0","p1","p2","p3","cp1x","cp1y","cp2x","cp2y","bandPath","upper","lower","forward","rev","back","backSegs","compact","n","last","a","ACTIVE_COLOR","QUEUED_COLOR","RESOLVED_COLOR","TARGET_COLOR","PRIORITY_COLOR","PRIORITY_TEXT_COLOR","MIN_GAP","spreadLabels","labels","maxY","sorted","b","prev","placed","l","labelY","overflow","PaceChart","stations","selectedRole","onSelect","onUpstreamSelect","onPrioritySelect","periodHours","hoveredIdx","setHoveredIdx","useState","xOf","xMap","rows","target","expected","_b","_c","_d","hasTargets","maxVal","yScale","v","withTarget","targetPts","actualPts","activePts","pendingPts","targetLinePath","actualSplinePath","activeSplinePath","pendingSplinePath","lastActual","lastTarget","lastActive","lastPending","areaPath","hasQueue","workedBandPath","queuedBandPath","showActiveLabel","showQueuedLabel","endLabels","px","cx","jsx","tp","ap","ar","hasWaiting","pendingLabelY","row","s","x","cy","isSelected","isHovered","tooltip","tipW","tipX","tipY","jsxs","e","priorityQueueLink","base","orderBy","PERIODS","isPeriod","fmt","min","MetricRow","label","value","PeriodSelector","period","onChange","RoleView","globalPeriod","onClose","setPeriod","data","useStationMetrics","metric","slaMinutes","targetPerHour","workerCount","Fragment","X","Link","Settings","List","ExternalLink","OverviewPanel","allMetrics","orderedRoles","totalPending","m","totalResolved","totalPriority","metricByRole","stationsAtRisk","stationsWithLoad","pending","claimed","resolved","priorityCount","hasAlert","hasLoad","StationDetailPanel","TARGET_BAND","PENDING_BAND","ACTIVE_BAND","RESOLVED_BAND","STATION_GRID_COLS","PERIOD_HOURS","buildFragments","roles","opsRoles","roleMap","visited","fragments","root","queue","item","c","fmtMin","loadBar","ratio","pct","color","StationRow","selected","onClick","barWidth","GitMerge","TableHead","cols","col","OperationsPage","setSelectedRole","refreshing","setRefreshing","useStationMetricsEvents","roleData","rolesLoading","refetchRoles","useRoleDetails","metricsData","metricsLoading","refetchMetrics","metrics","useMemo","searchParams","setSearchParams","useSearchParams","fragmentParam","activeFragment","f","selectFragment","useCallback","origin","ordered","fragmentRoleSet","fragmentMetrics","chartStations","handleUpstreamSelect","upstreamRole","navigate","useNavigate","handlePrioritySelect","roleName","detail","selectedRoleDetail","isLoading","handleRefresh","handleSelect","periodSelector","PageHeader","RefreshCw","isActive","o"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{a as x,j as e}from"./vendor-query-B2UbickB.js";import{u as j}from"./topics-Dt975EWi.js";import{P as y}from"./PageHeader-sGNTmSXX.js";import{F as v,b,a as N}from"./FilterBar-DDIn8TOs.js";import{a_ as k,a$ as w,b as C,B as S,Z as T,b0 as B,v as R,b1 as q,R as g}from"./vendor-icons-BXhWQC7l.js";import{c as A}from"./vendor-react-CXumBFUA.js";import"./index-C9moIiIq.js";const E={task:q,workflow:R,escalation:B,activity:T,knowledge:S,agent:C,app:w,milestone:k};function z(){const s=A(),[a,l]=x.useState(""),[c,f]=x.useState(null),{data:m,isLoading:p}=j({limit:500}),i=(m==null?void 0:m.topics)??[],d=x.useMemo(()=>{const t=new Set;for(const r of i)t.add(r.category);return Array.from(t).sort()},[i]),u=x.useMemo(()=>{const t=a.toLowerCase().trim();return(c?[c]:d).map(o=>({name:o,topics:i.filter(n=>{var h;return n.category===o&&(!t||n.topic.toLowerCase().includes(t)||((h=n.description)==null?void 0:h.toLowerCase().includes(t)))})})).filter(o=>o.topics.length>0)},[i,d,a,c]);return e.jsxs("div",{children:[e.jsx(y,{title:"Event Topics",docsHash:"#docs:topics.md"}),!p&&d.length>0&&e.jsxs(v,{children:[e.jsx(b,{label:"Category",value:c??"",onChange:t=>f(t||null),options:d.map(t=>({value:t,label:t}))}),e.jsx(N,{label:"Search",value:a,onChange:l,placeholder:`${i.length} topics…`})]}),p?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(r=>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"})]},r))})]},t))}):u.length===0?e.jsx("p",{className:"text-sm text-text-tertiary mt-8",children:a||c?"No topics match your filter.":"No topics registered yet."}):e.jsx("div",{className:"space-y-10",children:u.map(({name:t,topics:r})=>{const o=E[t]??g;return e.jsxs("div",{children:[e.jsxs("div",{className:"sticky top-[60px] z-10 bg-surface flex items-center gap-2 py-2 mb-2 border-b border-surface-border",children:[e.jsx(o,{className:"w-3 h-3 text-accent",strokeWidth:1.5}),e.jsx("h2",{className:"section-h2 capitalize",children:t}),e.jsx("span",{className:"text-xs text-text-quaternary",children:r.length})]}),e.jsx("div",{className:"divide-y divide-surface-border/30",children:r.map(n=>e.jsx(F,{topic:n,onClick:()=>s(`/topics/${encodeURIComponent(n.topic)}`)},n.topic))})]},t)})})]})}function F({topic:s,onClick:a}){return e.jsx("div",{role:"button",tabIndex:0,onClick:a,onKeyDown:l=>{(l.key==="Enter"||l.key===" ")&&a()},className:"group py-2 px-3 -mx-3 rounded-md cursor-pointer transition-colors text-left",children:e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(g,{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 shrink-0 max-w-[24rem]",children:s.topic}),e.jsx("span",{className:"inline-flex items-center px-1.5 py-0.5 rounded text-[10px] font-medium shrink-0 bg-accent/10 text-accent",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}),s.description&&e.jsx("p",{className:"flex-1 min-w-0 truncate text-[11px] text-text-tertiary group-hover:text-text-secondary transition-colors",children:s.description}),e.jsx("span",{className:"ml-auto text-[10px] font-mono text-text-quaternary shrink-0",children:s.source})]})})}export{z as TopicsPage};
2
- //# sourceMappingURL=TopicsPage-rj88vA_1.js.map
@@ -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-DDIn8TOs.js";import{P as j}from"./PriorityBadge-B4ykBH7f.js";import{R as v}from"./RolePill-C91qbDOW.js";import{W as w}from"./WorkflowPill-fodIWnT3.js";import{C as f,a as y,i as b}from"./CountdownTimer-C71erQ67.js";import{x as N,y as k,J as g}from"./index-C9moIiIq.js";import{a9 as C,aa as _,ab as c,o as P}from"./vendor-icons-BXhWQC7l.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 text-status-success",strokeWidth:2.5}):a.status==="cancelled"?e.jsx(c,{className:"w-2.5 h-2.5 shrink-0 text-status-error",strokeWidth:2.5}):b(a)?e.jsx(c,{className:"w-2.5 h-2.5 shrink-0 text-status-warning",strokeWidth:2.5}):e.jsx(c,{className:"w-2.5 h-2.5 shrink-0 text-status-active",strokeWidth:2.5})}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),d=`${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(m=>!m)},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:`{ ${d} }`})]}),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(g,{data:a,defaultCollapsed:!0})})})})]})}const B=[{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(w,{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(v,{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:N(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:k(a.created_at)}),className:"w-12 whitespace-nowrap",sortable:!0}],D={key:"expires",label:e.jsx(C,{className:"w-3.5 h-3.5 text-text-tertiary"}),render:a=>a.assigned_until?e.jsx(f,{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 U({filters:a,setFilter:t,roles:x,types:r,showStatus:d=!1,showSearch:i=!0,actions:m}){return e.jsxs(u,{actions:m,children:[d&&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{B as E,D as T,U as a};
2
- //# sourceMappingURL=escalation-columns-s29Q4mrF.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"escalation-columns-s29Q4mrF.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 text-status-success\" strokeWidth={2.5} />;\n }\n if (row.status === 'cancelled') {\n return <Circle className=\"w-2.5 h-2.5 shrink-0 text-status-error\" strokeWidth={2.5} />;\n }\n if (isEffectivelyClaimed(row)) {\n return <Circle className=\"w-2.5 h-2.5 shrink-0 text-status-warning\" strokeWidth={2.5} />;\n }\n // pending (unclaimed)\n return <Circle className=\"w-2.5 h-2.5 shrink-0 text-status-active\" strokeWidth={2.5} />;\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 text-status-success\" strokeWidth={2.5} />;\n }\n if (isEffectivelyClaimed(row)) {\n return <Circle className=\"w-2.5 h-2.5 text-status-warning\" strokeWidth={2.5} />;\n }\n // pending (unclaimed)\n return <Circle className=\"w-2.5 h-2.5 text-text-tertiary\" strokeWidth={2.5} />;\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 text-status-warning\" strokeWidth={2.5} />,\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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"}
@@ -1,5 +0,0 @@
1
- import{j as e,a as h,b as Be}from"./vendor-query-B2UbickB.js";import{z as ce,M as pe,J as ae,b as de,k as Ke,A as Ye,g as Qe,h as Ge,B as Xe,E as Ze,u as et,v as tt}from"./index-C9moIiIq.js";import{b as st,d as at,u as nt,C as rt,m as it,c as Ee,a as lt}from"./CustomDurationPicker-DQ28g5GB.js";import{b as ot}from"./roles-dJKBZUBh.js";import{P as ct}from"./PageHeader-sGNTmSXX.js";import{L as dt}from"./ListToolbar-D7PoQOZC.js";import{i as Te,C as Re}from"./CountdownTimer-C71erQ67.js";import{u as xt}from"./workflows-By8Wgvig.js";import{g as ut}from"./useEventHooks-ZT6RV2Gj.js";import{S as mt,a as pt,P as H}from"./SlidePanel-BpWveV1T.js";import{S as ht}from"./StatusBadge-CEQMRmSQ.js";import{R as ft}from"./RolePill-C91qbDOW.js";import{C as Q}from"./CopyableId-uot2mE_g.js";import{U as Se}from"./UserName-D03Lh6Aj.js";import{A as gt,ac as jt,ad as bt,ae as yt,w as Nt,g as wt,U as vt,af as kt,ag as Ct,ah as ve,ai as _t,aj as Et}from"./vendor-icons-BXhWQC7l.js";import{c as Ae,L as re,e as Tt}from"./vendor-react-CXumBFUA.js";import"./Modal-CSrxpXeM.js";import"./constants-BHkpVaqx.js";import"./users-C2jopvM1.js";const xe=4;function ke({pct:t,place:n,label:o,title:a,emphasis:s}){const l=e.jsx("span",{className:"w-px h-1 bg-surface-border","aria-hidden":!0}),d=e.jsx("span",{className:`whitespace-nowrap leading-none ${s?"text-text-secondary":"text-text-tertiary"}`,children:o});return e.jsx("div",{title:a,className:`absolute ${n==="above"?"bottom-0":"top-0"} flex flex-col items-center gap-0 -translate-x-1/2 cursor-help`,style:{left:`${t}%`},children:n==="above"?e.jsxs(e.Fragment,{children:[d,l]}):e.jsxs(e.Fragment,{children:[l,d]})})}function Rt({esc:t,className:n=""}){const o=new Date(t.created_at).getTime(),a=t.claimed_at?new Date(t.claimed_at).getTime():null,s=t.status==="resolved",l=t.status==="cancelled",d=s||l,c=Te(t),r=!!a&&(c||d),i=s&&t.resolved_at?new Date(t.resolved_at).getTime():l?new Date(t.updated_at).getTime():Date.now(),x=Math.max(i-o,1),m=r&&a?Math.max(a-o,0):x,b=r&&a?Math.max(i-a,0):0,g=Math.min(100,Math.max(0,m/x*100)),u=r?Math.max(0,100-g):0,p=s?"bg-status-success":l?"bg-status-error":"bg-status-active",f=s?"Worked":l?"Open before cancel":"In progress",v=ce(m),j=ce(x),R=s?`Resolved in ${j} total`:l?`Cancelled after ${j}`:`Open ${j} so far (current age)`,A=`Lifecycle: amber = time spent waiting to be claimed, the colored end = ${f.toLowerCase()} after the claim. Top label is time-to-claim, bottom is total time.`;return e.jsxs("div",{className:n,title:A,children:[e.jsx("div",{className:"relative h-2.5 text-[9px] font-mono",children:r&&e.jsx(ke,{pct:g,place:"above",label:v,title:`Time to claim: ${v} (created → claimed)`})}),e.jsxs("div",{className:"flex w-full rounded-full overflow-hidden bg-surface-sunken cursor-help",style:{height:xe},title:A,children:[e.jsx("div",{style:{width:`${g}%`,minWidth:xe},className:"bg-status-pending",title:`Waiting ${v} — created → claimed`}),r&&e.jsx("div",{style:{width:`${u}%`,minWidth:xe},className:p,title:`${f} ${ce(b)} — claimed → ${s?"resolved":l?"cancelled":"now"}`})]}),e.jsx("div",{className:"relative h-2.5 text-[9px] font-mono",children:e.jsx(ke,{pct:100,place:"below",emphasis:!0,label:j,title:R})})]})}function St({triage:t,payload:n}){const o=t.confidence??0,a=o>=.8?"text-status-success":o>=.5?"text-status-pending":"text-status-error",s=At(t.originalData,n);return e.jsxs("div",{className:"space-y-5",children:[t.diagnosis&&e.jsx("p",{className:"text-sm text-text-primary leading-relaxed",children:t.diagnosis}),e.jsxs("div",{className:"flex flex-wrap items-center gap-3 text-xs text-text-tertiary",children:[t.tool_calls_made!=null&&e.jsxs("span",{children:[t.tool_calls_made," tool call",t.tool_calls_made!==1?"s":""]}),t.tool_calls_made!=null&&e.jsx("span",{className:"text-text-quaternary",children:"·"}),e.jsxs("span",{className:`font-medium ${a}`,children:[Math.round(o*100),"% confidence"]})]}),t.actions_taken&&t.actions_taken.length>0&&e.jsx("div",{className:"flex flex-wrap gap-1.5",children:t.actions_taken.map((l,d)=>e.jsxs("span",{className:`inline-flex items-center gap-1.5 px-2 py-0.5 text-[11px]
2
- text-text-secondary`,children:[e.jsx("svg",{className:"w-3 h-3 text-status-success shrink-0",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2.5,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M5 13l4 4L19 7"})}),l]},d))}),t.recommendation&&e.jsx("p",{className:"text-[11px] text-text-tertiary italic",children:t.recommendation}),s.length>0&&e.jsx("div",{className:"space-y-4 pt-2",children:s.map(l=>e.jsx($t,{diff:l},l.key))})]})}function At(t,n){if(!t)return[];const o=[];for(const a of Object.keys(t)){if(a.startsWith("_"))continue;const s=t[a],l=n[a];l!==void 0&&JSON.stringify(s)!==JSON.stringify(l)&&o.push({key:a,label:a.replace(/[_-]/g," "),original:s,corrected:l})}return o}function $t({diff:t}){const n=Ce(t.original),o=Ce(t.corrected);return n!==null&&o!==null?e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-x-8 gap-y-3",children:[e.jsxs("div",{children:[e.jsxs("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:[t.label," ",e.jsx("span",{className:"normal-case font-normal",children:"(original)"})]}),e.jsx("p",{className:"text-sm text-text-tertiary leading-relaxed line-through decoration-text-tertiary/30",children:n})]}),e.jsxs("div",{children:[e.jsxs("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:[t.label," ",e.jsx("span",{className:"normal-case font-normal text-status-success",children:"(corrected)"})]}),e.jsx("p",{className:"text-sm text-text-primary leading-relaxed",children:o})]})]}):e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{children:[e.jsxs("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:[t.label," ",e.jsx("span",{className:"normal-case font-normal",children:"(original)"})]}),e.jsx("pre",{className:"text-xs text-text-tertiary font-mono whitespace-pre-wrap leading-relaxed",children:typeof t.original=="object"?JSON.stringify(t.original,null,2):String(t.original)})]}),e.jsxs("div",{children:[e.jsxs("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:[t.label," ",e.jsx("span",{className:"normal-case font-normal text-status-success",children:"(corrected)"})]}),e.jsx("pre",{className:"text-xs text-text-primary font-mono whitespace-pre-wrap leading-relaxed",children:typeof t.corrected=="object"?JSON.stringify(t.corrected,null,2):String(t.corrected)})]})]})}function Ce(t){return t==null?"null":typeof t=="string"?t:typeof t=="number"||typeof t=="boolean"?String(t):null}const K={HELP:"help",DETAILS:"details",TRIAGE:"triage",METADATA:"metadata",CONTEXT:"context",RECORD:"record"},$e="lt:escalation:panel:view";function Mt(t){try{const n=localStorage.getItem($e);if(n&&t.includes(n))return n}catch{}return K.HELP}const Pt=new Set(["form_schema"]);function It({metadata:t,role:n}){const o=Object.entries(t??{}).filter(([a])=>!a.startsWith("_")&&!Pt.has(a));return o.length===0?e.jsx("p",{className:"text-xs text-text-tertiary italic",children:"No metadata on this escalation."}):e.jsx("dl",{className:"space-y-3.5",children:o.map(([a,s])=>{const l=typeof s=="object"&&s!==null?JSON.stringify(s):String(s),d=encodeURIComponent(JSON.stringify({[a]:l})),c=`/escalations/available?role=${encodeURIComponent(n)}&facets=${d}`,r=`/escalations/available?facets=${d}`;return e.jsxs("div",{className:"group relative",children:[e.jsx("dt",{className:"text-[11px] font-medium text-text-secondary uppercase tracking-wide",children:a.replace(/[_-]/g," ")}),e.jsxs("dd",{className:"mt-0.5 flex items-center gap-1",children:[e.jsx("span",{className:"text-[12px] text-text-primary font-mono break-all flex-1",children:l}),e.jsx(re,{to:c,title:`Filter this queue: ${a} = ${l}`,className:"opacity-0 group-hover:opacity-100 transition-opacity shrink-0 p-0.5 text-text-quaternary hover:text-accent",children:e.jsx(kt,{className:"w-3 h-3"})}),e.jsx(re,{to:r,title:`Search all queues: ${a} = ${l}`,className:"opacity-0 group-hover:opacity-100 transition-opacity shrink-0 p-0.5 text-text-quaternary hover:text-accent",children:e.jsx(Ct,{className:"w-3 h-3"})})]})]},a)})})}function Dt({esc:t,claimed:n,isTerminal:o,isBuilder:a,traceUrl:s}){return e.jsxs("div",{className:"space-y-5",children:[e.jsxs("dl",{className:"space-y-3.5",children:[e.jsx(H,{label:"Status",children:e.jsx(ht,{status:t.status})}),e.jsx(H,{label:"Assigned to Role",children:e.jsx(ft,{role:t.role,size:"md"})}),e.jsxs(H,{label:"Priority",children:["P",t.priority]}),(n||o)&&t.assigned_to&&e.jsx(H,{label:"Claimed By",children:e.jsxs("span",{className:"inline-flex items-center gap-1.5 font-medium text-text-primary",children:[e.jsx(vt,{className:"w-3 h-3 shrink-0 text-accent/75"}),e.jsx(Se,{userId:t.assigned_to})]})}),e.jsx(H,{label:"Created",children:e.jsx(de,{date:t.created_at})}),(n||o)&&t.claimed_at&&e.jsx(H,{label:"Claimed",children:e.jsx(de,{date:t.claimed_at})}),n&&!o&&t.assigned_until&&e.jsx(H,{label:"Time Remaining",children:e.jsx(Re,{until:t.assigned_until})}),t.resolved_at&&e.jsx(H,{label:"Completed",children:e.jsx("span",{className:"text-status-success",children:e.jsx(de,{date:t.resolved_at})})})]}),a&&e.jsxs(e.Fragment,{children:[e.jsx("hr",{className:"border-surface-border/60"}),e.jsxs("div",{className:"space-y-3.5",children:[e.jsx(Q,{label:"Escalation ID",value:t.id}),t.task_id&&e.jsx(Q,{label:"Task ID",value:t.task_id,href:`/workflows/tasks/detail/${t.task_id}`}),t.workflow_type&&e.jsx(Q,{label:"Workflow Name",value:t.workflow_type,href:`/workflows/executions?entity=${encodeURIComponent(t.workflow_type)}`}),t.workflow_id&&e.jsx(Q,{label:"Workflow ID",value:t.workflow_id,href:`/workflows/executions/${t.workflow_id}`}),t.task_queue&&e.jsx(Q,{label:"Task Queue",value:t.task_queue,href:`/admin/controlplane?queue=${encodeURIComponent(t.task_queue)}`}),t.origin_id&&t.origin_id!==t.workflow_id&&e.jsx(Q,{label:"Origin",value:t.origin_id,href:`/processes/detail/${t.origin_id}`}),t.trace_id&&e.jsx(Q,{label:"Trace",value:t.trace_id,href:s?s.replace("{traceId}",t.trace_id):void 0,external:!0})]})]})]})}function Lt({esc:t,schema:n,envelope:o,payload:a,resolver:s,triage:l,hasAI:d,claimed:c,claimedByMe:r,isTerminal:i,isBuilder:x,traceUrl:m,open:b}){const g=Ae(),u=Object.values(K),[p,f]=h.useState(()=>Mt(u)),v=h.useCallback(E=>{try{localStorage.setItem($e,E)}catch{}f(E)},[]),j=h.useMemo(()=>st(n,{escalation:t,metadata:t.metadata??null,envelope:o,payload:a,resolver:s})??at({isTerminal:i,status:t.status,claimed:c,claimedByMe:r}),[n,t,o,a,s,i,c,r]),R=h.useCallback(E=>{const _=E.target.closest("a"),T=_==null?void 0:_.getAttribute("href");T!=null&&T.startsWith("/")&&(E.preventDefault(),g(T))},[g]),A=[{id:K.HELP,icon:gt,label:"Instructions",content:e.jsx(pe,{content:j,onClick:R})},{id:K.DETAILS,icon:jt,label:"Details",content:e.jsx(Dt,{esc:t,claimed:c,isTerminal:i,isBuilder:x,traceUrl:m})},...d&&l?[{id:K.TRIAGE,icon:bt,label:"AI Analysis",content:e.jsx(St,{triage:l,payload:a??{}})}]:[],{id:K.METADATA,icon:yt,label:"Metadata",content:e.jsx(It,{metadata:t.metadata,role:t.role})},{id:K.CONTEXT,icon:Nt,label:"Context",content:e.jsxs("div",{className:"space-y-5",children:[o!=null&&e.jsx(ae,{data:o,label:"Input Envelope"}),a!=null&&e.jsx(ae,{data:a,label:"Escalation Context"}),s!=null&&e.jsx(ae,{data:s,label:"Resolver Payload"}),o==null&&a==null&&s==null&&e.jsx("p",{className:"text-xs text-text-tertiary italic",children:"No context on this escalation."})]})},...x?[{id:K.RECORD,icon:wt,label:"Record",content:e.jsx(ae,{data:t,label:"Escalation Record"})}]:[]];return e.jsx(mt,{open:b,width:384,className:"h-full",children:e.jsx("div",{className:"h-full pl-6",children:e.jsxs("div",{className:"h-full flex flex-col bg-surface-hover",children:[e.jsx("div",{className:"shrink-0 pt-1.5 pb-0.5 flex justify-center",children:e.jsx(Rt,{esc:t,className:"w-[80%]"})}),e.jsx("div",{className:"flex-1 min-h-0",children:e.jsx(pt,{views:A,activeId:p,onViewChange:v,stickyClassName:"h-full min-h-0"})})]})})})}function Wt(t){const{mode:n,activeView:o,onActiveViewChange:a,onClaim:s,claimPending:l,workflowType:d,json:c,onResolve:r,resolvePending:i,resolveError:x,requestTriage:m,triageNotes:b,currentRole:g,escalationTargets:u,onEscalate:p,escalatePending:f,escalateError:v,onRelease:j,releasePending:R,onCancel:A,assignedTo:E,assignedUntil:_,onSubmitAttempt:T}=t,V=nt(),[N,w]=h.useState("30"),[k,$]=h.useState(0),[W,U]=h.useState(""),[J,M]=h.useState(""),S=N==="custom",P=h.useCallback(y=>$(y),[]);if(n==="terminal")return null;const ee=()=>{const y=S?k:parseInt(N);!y||y<=0||s(y)},ie=()=>{if(U(""),m){const I={_lt:{needsTriage:!0}};b.trim()&&(I.notes=b.trim()),r(I);return}let y;try{y=JSON.parse(c)}catch{U("Invalid JSON");return}const X=y._form_schema,O=X==null?void 0:X.required;if(O!=null&&O.length){const I=O.filter(Y=>{const F=y[Y];return F==null||typeof F=="string"&&F.trim()===""});if(I.length>0){T==null||T();const Y=I.map(D=>D.replace(/[_-]/g," ")),F=Y.length<=2?Y.join(", "):`${Y.slice(0,2).join(", ")}...`;U(`Required: ${F}`);return}}const{_form_schema:te,...z}=y;r(it(z,X))},q=y=>`text-xs transition-colors ${y?"text-accent font-medium":"text-text-tertiary hover:text-accent"}`;return e.jsxs("div",{className:"shrink-0 h-[80px] bg-surface/95 backdrop-blur-sm border-t border-surface-border -ml-10 pl-10 pr-10 pt-3 pb-5","data-testid":"escalation-action-bar",children:[n==="available"&&e.jsxs("div",{"data-testid":"claim-bar",children:[e.jsxs("div",{className:"flex items-center gap-4 mb-2",children:[V.map(y=>e.jsx("button",{onClick:()=>{w(y.value),$(0)},className:q(!S&&N===y.value),children:y.label},y.value)),e.jsx("button",{onClick:()=>w("custom"),className:q(S),children:"Other"})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("button",{onClick:A,className:"text-xs text-text-tertiary hover:text-status-error transition-colors",children:"Cancel escalation"}),e.jsx("div",{className:"flex-1"}),S&&e.jsx(rt,{onChange:P,compact:!0,autoFocus:!0}),e.jsx("button",{onClick:ee,disabled:l||S&&k<=0,className:"btn-primary text-xs",children:l?"Claiming...":"Claim"})]})]}),n==="claimed_by_other"&&e.jsxs("div",{className:"flex items-center gap-4","data-testid":"claimed-other-bar",children:[e.jsxs("p",{className:"text-sm text-text-secondary",children:["Claimed by ",e.jsx("span",{className:"font-medium text-text-primary",children:E?e.jsx(Se,{userId:E}):"unknown"})]}),_&&e.jsx(Re,{until:_})]}),n==="claimed_by_me"&&e.jsxs("div",{"data-testid":"action-bar",children:[e.jsxs("div",{className:"flex items-center gap-4 mb-2",children:[e.jsx("button",{onClick:()=>a("resolve"),className:q(o==="resolve"),children:d?"Resolve":"Acknowledge"}),u.length>0&&e.jsx("button",{onClick:()=>a("escalate"),className:q(o==="escalate"),children:"Escalate"}),e.jsx("button",{onClick:()=>a("release"),className:`text-xs transition-colors ${o==="release"?"text-status-error font-medium":"text-text-tertiary hover:text-status-error"}`,children:"Release"}),e.jsx("button",{onClick:A,className:"text-xs transition-colors text-text-tertiary hover:text-status-error",children:"Cancel"})]}),o==="resolve"&&(d?e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsx("div",{className:"flex-1"}),W&&e.jsx("span",{className:"text-xs text-status-error",children:W}),x&&e.jsx("span",{className:"text-xs text-status-error",children:x.message}),e.jsx("button",{onClick:ie,disabled:i,className:"btn-primary text-xs",children:i?"Submitting...":m?"Send to Triage":"Submit"})]}):e.jsxs("div",{className:"flex items-center",children:[e.jsx("span",{className:"text-xs text-text-secondary",children:"Notification — acknowledge to resolve"}),e.jsx("div",{className:"flex-1"}),x&&e.jsx("span",{className:"text-xs text-status-error mr-3",children:x.message}),e.jsx("button",{onClick:()=>r({acknowledged:!0}),disabled:i,className:"btn-primary text-xs",children:i?"Acknowledging...":"Acknowledge"})]})),o==="escalate"&&e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsxs("span",{className:"text-xs text-text-secondary",children:["From ",e.jsx("span",{className:"font-medium text-text-primary",children:g})," to"]}),e.jsxs("select",{value:J,onChange:y=>M(y.target.value),className:"select text-xs","data-testid":"escalate-select",children:[e.jsx("option",{value:"",children:"Select role..."}),u.map(y=>e.jsx("option",{value:y,children:y},y))]}),e.jsx("div",{className:"flex-1"}),v&&e.jsx("span",{className:"text-xs text-status-error",children:v.message}),e.jsx("button",{onClick:()=>p(J),disabled:!J||f,className:"btn-primary text-xs",children:f?"Escalating...":"Escalate"})]}),o==="release"&&e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("span",{className:"text-xs text-text-secondary",children:"Release back to pool?"}),e.jsx("div",{className:"flex-1"}),e.jsx("button",{onClick:()=>a("resolve"),className:"btn-secondary text-xs",children:"Back"}),e.jsx("button",{onClick:j,disabled:R,className:"btn-primary text-xs bg-status-error hover:bg-status-error/80",children:R?"Releasing...":"Yes, Release"})]})]})]})}function B(t){return t.replace(/`([^`]+)`/g,'<code class="px-1 py-0.5 bg-surface-sunken rounded text-xs font-mono">$1</code>').replace(/\*\*\*(.+?)\*\*\*/g,"<strong><em>$1</em></strong>").replace(/\*\*(.+?)\*\*/g,"<strong>$1</strong>").replace(/\*(.+?)\*/g,"<em>$1</em>").replace(/\[([^\]]+)\]\(([^)]+)\)/g,'<a href="$2" class="text-accent-primary hover:underline" target="_blank" rel="noopener noreferrer">$1</a>')}function ue({content:t,compact:n}){const o=[],a=/^```(\w*)\n([\s\S]*?)^```$/gm;let s=0,l;for(;(l=a.exec(t))!==null;)l.index>s&&o.push({type:"text",text:t.slice(s,l.index)}),o.push({type:"code",lang:l[1],code:l[2].replace(/\n$/,"")}),s=l.index+l[0].length;s<t.length&&o.push({type:"text",text:t.slice(s)});const d=n?{text:"text-xs",heading:"text-xs",list:"text-xs",code:"text-[11px]"}:{text:"text-sm",heading:"text-sm",list:"text-sm",code:"text-xs"},c=[];for(const r of o){if(r.type==="code"){const i=r.code.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;");c.push(`<pre class="my-2 p-2.5 bg-surface-sunken rounded-md overflow-x-auto"><code class="${d.code} font-mono text-text-secondary leading-relaxed">${i}</code></pre>`);continue}c.push(...Ot(r.text,d))}return e.jsx("div",{className:"prose-sm",dangerouslySetInnerHTML:{__html:c.join(`
3
- `)}})}function Ot(t,n){const o=t.split(`
4
- `),a=[];let s=!1,l=!1,d=[];for(const c of o){const r=c.trim();if(r.startsWith("|")&&r.endsWith("|")){const i=r.slice(1,-1).split("|").map(x=>x.trim());if(i.every(x=>/^[-:]+$/.test(x)))continue;l||(l=!0,d=[]),d.push(i);continue}if(l){l=!1;const[i,...x]=d;a.push('<div class="overflow-x-auto my-2"><table class="text-xs w-full"><thead><tr>');for(const m of i)a.push(`<th class="text-left py-1 px-2 border-b border-border text-text-secondary font-medium">${B(m)}</th>`);a.push("</tr></thead><tbody>");for(const m of x){a.push("<tr>");for(const b of m)a.push(`<td class="py-1 px-2 border-b border-border/50">${B(b)}</td>`);a.push("</tr>")}a.push("</tbody></table></div>"),d=[]}if(!r){s&&(a.push("</ul>"),s=!1);continue}if(r.startsWith("### ")){s&&(a.push("</ul>"),s=!1),a.push(`<h4 class="${n.heading} font-semibold text-text-primary mt-3 mb-1">${B(r.slice(4))}</h4>`);continue}if(r.startsWith("## ")){s&&(a.push("</ul>"),s=!1),a.push(`<h3 class="${n.heading} font-semibold text-text-primary mt-3 mb-1">${B(r.slice(3))}</h3>`);continue}if(/^[-*_]{3,}$/.test(r)){s&&(a.push("</ul>"),s=!1),a.push('<hr class="border-border my-3" />');continue}if(/^[-*] /.test(r)){s||(a.push('<ul class="space-y-1 my-1">'),s=!0),a.push(`<li class="${n.list} text-text-secondary flex gap-2"><span class="text-text-tertiary shrink-0">-</span><span>${B(r.slice(2))}</span></li>`);continue}s&&(a.push("</ul>"),s=!1),a.push(`<p class="${n.text} text-text-secondary my-1">${B(r)}</p>`)}if(l&&d.length){const[c,...r]=d;a.push('<div class="overflow-x-auto my-2"><table class="text-xs w-full"><thead><tr>');for(const i of c)a.push(`<th class="text-left py-1 px-2 border-b border-border text-text-secondary font-medium">${B(i)}</th>`);a.push("</tr></thead><tbody>");for(const i of r){a.push("<tr>");for(const x of i)a.push(`<td class="py-1 px-2 border-b border-border/50">${B(x)}</td>`);a.push("</tr>")}a.push("</tbody></table></div>")}return s&&a.push("</ul>"),a}function me({children:t}){return e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1.5",children:t})}function Ft({payload:t,isTerminal:n,resolverPayload:o,onRetryTriage:a,isRetrying:s}){const l=t.title,d=t.summary,c=t.diagnosis,r=t.tool_calls_made,i=t.result,x=o==null?void 0:o._lt,m=(x==null?void 0:x.triaged)===!0,b=x==null?void 0:x.triageWorkflowId,g=n&&m,[u,p]=h.useState(!1);return g?e.jsxs("div",{className:"rounded-md border border-status-success/30 bg-surface-raised",children:[e.jsxs("div",{className:"flex items-center justify-between px-4 py-3 border-b border-surface-border",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("svg",{className:"w-4 h-4 text-status-success shrink-0",viewBox:"0 0 16 16",fill:"currentColor",children:e.jsx("path",{d:"M8 1a7 7 0 110 14A7 7 0 018 1zm3.36 4.65a.5.5 0 00-.72 0L7 9.29 5.36 7.65a.5.5 0 10-.72.7l2 2a.5.5 0 00.72 0l4-4a.5.5 0 000-.7z"})}),e.jsx("span",{className:"text-xs font-medium text-status-success",children:"Resolved by AI Triage"})]}),typeof r=="number"&&e.jsxs("span",{className:"text-[10px] font-mono px-2 py-0.5 rounded-full bg-status-success/10 text-status-success",children:[r," tool calls used"]})]}),e.jsxs("div",{className:"px-4 py-4 space-y-4",children:[l&&e.jsx("p",{className:"text-sm font-medium text-text-primary",children:l}),c&&e.jsxs("div",{children:[e.jsx(me,{children:"Triage diagnosis"}),e.jsx("div",{className:"text-xs text-text-primary leading-relaxed",children:e.jsx(ue,{content:c})})]}),e.jsx("div",{className:"flex items-center gap-3",children:b&&e.jsx(re,{to:`/workflows/executions/${b}`,className:"text-[10px] text-accent hover:underline",children:"View triage execution"})})]})]}):e.jsxs("div",{className:"rounded-md border border-status-warning/30 bg-surface-raised",children:[e.jsxs("div",{className:"flex items-center justify-between px-4 py-3 border-b border-surface-border",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("svg",{className:"w-4 h-4 text-status-warning shrink-0",viewBox:"0 0 16 16",fill:"currentColor",children:e.jsx("path",{d:"M8 1a7 7 0 110 14A7 7 0 018 1zm0 3a.75.75 0 00-.75.75v3.5a.75.75 0 001.5 0v-3.5A.75.75 0 008 4zm0 7a.75.75 0 100-1.5.75.75 0 000 1.5z"})}),e.jsx("span",{className:"text-xs font-medium text-status-warning",children:"Tool Rounds Exhausted"})]}),typeof r=="number"&&e.jsxs("span",{className:"text-[10px] font-mono px-2 py-0.5 rounded-full bg-status-warning/10 text-status-warning",children:[r," tool calls used"]})]}),e.jsxs("div",{className:"px-4 py-4 space-y-4",children:[l&&e.jsx("p",{className:"text-sm font-medium text-text-primary",children:l}),d&&e.jsxs("div",{children:[e.jsx(me,{children:"What happened"}),e.jsx("div",{className:"text-xs text-text-secondary leading-relaxed",children:e.jsx(ue,{content:d})})]}),c&&e.jsxs("div",{children:[e.jsx(me,{children:"What went wrong"}),e.jsx("div",{className:"text-xs text-text-primary leading-relaxed",children:e.jsx(ue,{content:c})})]}),i!=null&&e.jsxs("div",{children:[e.jsxs("button",{onClick:()=>p(!u),className:"flex items-center gap-1 text-[10px] font-semibold uppercase tracking-widest text-text-tertiary hover:text-text-secondary transition-colors",children:[e.jsx("svg",{className:`w-3 h-3 transition-transform ${u?"rotate-90":""}`,viewBox:"0 0 12 12",fill:"currentColor",children:e.jsx("path",{d:"M4.5 2l4 4-4 4"})}),"Partial results"]}),u&&e.jsx("div",{className:"mt-2",children:e.jsx(ae,{data:i,defaultMode:"tree"})})]}),a&&!n&&e.jsx("div",{className:"pt-2",children:e.jsxs("button",{onClick:a,disabled:s,className:"inline-flex items-center gap-2 px-4 py-2 text-xs font-medium bg-accent text-text-inverse rounded-md hover:bg-accent/90 disabled:opacity-50 disabled:cursor-not-allowed transition-colors",children:[e.jsx("svg",{className:"w-3.5 h-3.5",viewBox:"0 0 14 14",fill:"currentColor",children:e.jsx("path",{d:"M7 1a6 6 0 100 12A6 6 0 007 1zm2.5 6.5l-3.5 2V5.5l3.5 2z"})}),s?"Sending to triage...":"Retry with AI Triage"]})})]})]})}function Vt({src:t,escalation:n,schema:o,onResolve:a,onEscalate:s,submitAttempted:l}){const d=h.useRef(null),c=h.useRef("");h.useEffect(()=>{try{const i=new URL(t);c.current=i.origin}catch{c.current=""}},[t]);const r=h.useCallback(()=>{const i=d.current;if(!(i!=null&&i.contentWindow)||!c.current)return;const m={type:"lt:init",escalation:{id:n.id,type:n.type,subtype:n.subtype,description:n.description,status:n.status,priority:n.priority,role:n.role,workflow_type:n.workflow_type},schema:o};i.contentWindow.postMessage(m,c.current)},[n,o]);return h.useEffect(()=>{const i=x=>{if(x.origin!==c.current)return;const m=x.data;if(!(!m||typeof m!="object"||typeof m.type!="string"))switch(m.type){case"lt:ready":r();break;case"lt:submit":m.payload&&typeof m.payload=="object"&&a(m.payload);break;case"lt:escalate":typeof m.target=="string"&&m.target&&s(m.target);break;case"lt:resize":{const b=d.current;b&&typeof m.height=="number"&&m.height>0&&(b.style.height=`${Math.min(m.height,2e3)}px`);break}}};return window.addEventListener("message",i),()=>window.removeEventListener("message",i)},[r,a,s]),h.useEffect(()=>{if(!l)return;const i=d.current;i!=null&&i.contentWindow&&c.current&&i.contentWindow.postMessage({type:"lt:validate"},c.current)},[l]),e.jsx("div",{className:"rounded-md border border-surface-border overflow-hidden bg-white",children:e.jsx("iframe",{ref:d,src:t,sandbox:"allow-scripts allow-same-origin allow-forms",className:"w-full border-0",style:{minHeight:"400px"},title:"HITL Viewport",onLoad:r})})}function Ut({fieldKey:t,value:n,onChange:o,schema:a}){const s=h.useRef(null),l=(a==null?void 0:a.accept)??void 0,d=t.replace(/[_-]/g," "),c=a==null?void 0:a.description,r=h.useCallback(x=>{var g;const m=(g=x.target.files)==null?void 0:g[0];if(!m)return;const b=new FileReader;b.onload=()=>{typeof b.result=="string"&&o(b.result)},b.readAsDataURL(m)},[o]),i=n.startsWith("data:");return e.jsxs("div",{children:[e.jsx("label",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:d}),c&&e.jsx("p",{className:"text-[10px] text-text-tertiary mt-0.5",children:c}),e.jsxs("div",{className:"mt-1",children:[e.jsx("input",{ref:s,type:"file",accept:l,onChange:r,className:"hidden"}),e.jsx("button",{type:"button",onClick:()=>{var x;return(x=s.current)==null?void 0:x.click()},className:"btn-secondary text-xs px-3 py-1.5",children:i?"Replace file":"Choose file"}),i&&e.jsx("span",{className:"ml-2 text-xs text-status-success",children:"File attached"})]})]})}function Jt({fieldKey:t,value:n,onChange:o,schema:a}){const s=t.replace(/[_-]/g," "),l=a==null?void 0:a.description,d=(a==null?void 0:a["x-lt-language"])??"",c=h.useCallback(r=>{if(r.key==="Tab"){r.preventDefault();const i=r.currentTarget,x=i.selectionStart,m=i.selectionEnd,b=n.substring(0,x)+" "+n.substring(m);o(b),requestAnimationFrame(()=>{i.selectionStart=i.selectionEnd=x+2})}},[n,o]);return e.jsxs("div",{children:[e.jsxs("label",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:[s,d&&e.jsx("span",{className:"ml-2 text-text-tertiary/60 normal-case font-normal",children:d})]}),l&&e.jsx("p",{className:"text-[10px] text-text-tertiary mt-0.5",children:l}),e.jsx("textarea",{value:n,onChange:r=>o(r.target.value),onKeyDown:c,className:"input w-full mt-1 font-mono text-xs leading-relaxed",rows:10,spellCheck:!1})]})}function qt({fieldKey:t,value:n,onChange:o,schema:a}){const s=h.useRef(null),[l,d]=h.useState(!1),c=t.replace(/[_-]/g," "),r=a==null?void 0:a.description;h.useEffect(()=>{const u=s.current;if(!u)return;const p=u.getContext("2d");if(p&&(p.lineWidth=2,p.lineCap="round",p.strokeStyle="#1E1535",n&&n.startsWith("data:"))){const f=new Image;f.onload=()=>p.drawImage(f,0,0),f.src=n}},[]);const i=h.useCallback(u=>{const f=s.current.getBoundingClientRect();return"touches"in u?{x:u.touches[0].clientX-f.left,y:u.touches[0].clientY-f.top}:{x:u.clientX-f.left,y:u.clientY-f.top}},[]),x=h.useCallback(u=>{var v;d(!0);const p=(v=s.current)==null?void 0:v.getContext("2d");if(!p)return;const f=i(u);p.beginPath(),p.moveTo(f.x,f.y)},[i]),m=h.useCallback(u=>{var v;if(!l)return;const p=(v=s.current)==null?void 0:v.getContext("2d");if(!p)return;const f=i(u);p.lineTo(f.x,f.y),p.stroke()},[l,i]),b=h.useCallback(()=>{d(!1);const u=s.current;u&&o(u.toDataURL("image/png"))},[o]),g=h.useCallback(()=>{const u=s.current;if(!u)return;const p=u.getContext("2d");p&&(p.clearRect(0,0,u.width,u.height),o(""))},[o]);return e.jsxs("div",{children:[e.jsx("label",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:c}),r&&e.jsx("p",{className:"text-[10px] text-text-tertiary mt-0.5",children:r}),e.jsx("div",{className:"mt-1 border border-surface-border rounded-md overflow-hidden bg-white",children:e.jsx("canvas",{ref:s,width:400,height:150,className:"w-full cursor-crosshair touch-none",onMouseDown:x,onMouseMove:m,onMouseUp:b,onMouseLeave:b,onTouchStart:x,onTouchMove:m,onTouchEnd:b})}),e.jsx("button",{type:"button",onClick:g,className:"mt-1 text-[10px] text-text-tertiary hover:text-accent transition-colors",children:"Clear"})]})}function zt({fieldKey:t,value:n,onChange:o,schema:a}){const s=t.replace(/[_-]/g," "),l=a==null?void 0:a.description;return e.jsxs("div",{children:[e.jsx("label",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:s}),l&&e.jsx("p",{className:"text-[10px] text-text-tertiary mt-0.5",children:l}),e.jsx("textarea",{value:n,onChange:d=>o(d.target.value),className:"input w-full mt-1 text-sm leading-relaxed",rows:8,placeholder:"Supports plain text. Markdown formatting is preserved."})]})}function Ht({fieldKey:t,value:n,onChange:o,schema:a}){const[s,l]=h.useState("write"),d=t.replace(/[_-]/g," "),c=a==null?void 0:a.description;return(a==null?void 0:a.readOnly)===!0?e.jsx(pe,{content:n,className:"my-1"}):e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("label",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:d}),e.jsx("div",{className:"flex items-center gap-0.5",children:["write","preview"].map(i=>e.jsx("button",{type:"button",onClick:()=>l(i),className:`px-2 py-0.5 text-[10px] rounded transition-colors ${s===i?"bg-accent/10 text-accent font-semibold":"text-text-quaternary hover:text-text-secondary"}`,children:i==="write"?"Write":"Preview"},i))})]}),c&&e.jsx("p",{className:"text-[10px] text-text-tertiary mt-0.5",children:c}),s==="write"?e.jsx("textarea",{value:n,onChange:i=>o(i.target.value),className:"input w-full mt-1 text-sm font-mono leading-relaxed",rows:10,placeholder:"Write markdown — headings, lists, tables, code blocks, and links all render."}):e.jsx("div",{className:"mt-1 px-3 py-2 border border-surface-border rounded min-h-[120px]",children:n.trim()?e.jsx(pe,{content:n}):e.jsx("p",{className:"text-xs text-text-quaternary italic",children:"Nothing to preview."})})]})}const _e={"file-upload":Ut,"code-editor":Jt,signature:qt,"rich-text":zt,markdown:Ht};function Me({value:t,onChange:n,disabled:o,submitAttempted:a}){const[s,l]=h.useState({}),[d,c]=h.useState({}),[r,i]=h.useState(null),[x,m]=h.useState(!1),[b,g]=h.useState(new Set);h.useEffect(()=>{try{const N=JSON.parse(t);if(typeof N=="object"&&N!==null&&!Array.isArray(N)){const w={},k={};for(const[$,W]of Object.entries(N))$.startsWith("_")?k[$]=W:w[$]=W;l(w),c(k),i(k._form_schema&&typeof k._form_schema=="object"?k._form_schema:null),m(!1)}}catch{m(!0)}},[t]);const u=h.useCallback(N=>{l(N),n(JSON.stringify({...N,...d},null,2))},[d,n]),p=h.useCallback((N,w)=>{u({...s,[N]:w})},[s,u]),f=h.useCallback(N=>{g(w=>{if(w.has(N))return w;const k=new Set(w);return k.add(N),k})},[]);if(x)return e.jsx("p",{className:"text-xs text-status-error",children:"Unable to parse resolver data as form. Use the JSON editor below."});const v=Object.entries(s);if(v.length===0)return e.jsx("p",{className:"text-xs text-text-tertiary italic",children:"No resolver fields defined."});const j=r==null?void 0:r["x-lt-order"],R=j?[...v].sort((N,w)=>{const k=j.indexOf(N[0]),$=j.indexOf(w[0]);return(k===-1?1/0:k)-($===-1?1/0:$)}):v,A=new Set((r==null?void 0:r.required)??[]),E=r==null?void 0:r["x-lt-layout"],_=r==null?void 0:r.title,T=r==null?void 0:r.description,V=R.map(([N,w])=>{var S;const k=(S=r==null?void 0:r.properties)==null?void 0:S[N],$=(k==null?void 0:k.readOnly)===!0,W=(k==null?void 0:k["x-lt-span"])??1,U=A.has(N),J=b.has(N)||!!a;let M;if(U&&J&&(w==null||typeof w=="string"&&w.trim()==="")&&(M="Required"),J&&typeof w=="string"&&w.trim()!==""&&k){const P=k.format;P==="email"&&!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(w)&&(M="Enter a valid email address"),P==="uri"&&!/^https?:\/\/.+/.test(w)&&(M="Enter a valid URL")}return e.jsx("div",{className:E==="two-column"&&W>=2?"col-span-2":"",children:e.jsx(Pe,{fieldKey:N,value:w,onChange:P=>p(N,P),onBlur:()=>f(N),schema:r,isRequired:U,isReadOnly:$,error:M})},N)});return e.jsxs("div",{className:`pb-8 ${o?"opacity-60 pointer-events-none":""}`,children:[_&&e.jsx("h3",{className:"text-lg font-light text-text-primary mb-1",children:_}),T&&e.jsx("p",{className:"text-sm text-text-secondary leading-relaxed mb-6",children:T}),E==="two-column"?e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-x-14 gap-y-6",children:V}):e.jsx("div",{className:"space-y-6",children:V})]})}function Pe({fieldKey:t,value:n,onChange:o,onBlur:a,schema:s,isRequired:l,isReadOnly:d,error:c}){var b;const r=t.replace(/[_-]/g," "),i=(b=s==null?void 0:s.properties)==null?void 0:b[t],x=i==null?void 0:i["x-lt-widget"];if(d&&!(x==="markdown"&&typeof n=="string")){const g=n===null?"null":typeof n=="object"?JSON.stringify(n,null,2):String(n);return e.jsxs("div",{children:[e.jsx(L,{isRequired:l,children:r}),e.jsx("p",{className:"text-sm text-text-secondary mt-0.5 whitespace-pre-wrap",children:g})]})}if(x&&x in _e&&typeof n=="string"){const g=_e[x];return e.jsx(g,{fieldKey:t,value:n,onChange:u=>o(u),schema:i})}if(typeof n=="boolean")return e.jsxs("div",{children:[e.jsxs("label",{className:"flex items-center gap-2 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:n,onChange:g=>{o(g.target.checked),a==null||a()},className:"w-3.5 h-3.5 rounded accent-accent"}),e.jsxs("span",{className:"text-[11px] font-semibold uppercase tracking-wider text-text-secondary",children:[r,l&&e.jsx("span",{className:"text-status-error ml-0.5",children:"*"})]})]}),e.jsx(G,{error:c})]});if(typeof n=="number")return e.jsxs("div",{children:[e.jsx(L,{isRequired:l,children:r}),e.jsx("input",{type:"number",value:n,onChange:g=>o(parseFloat(g.target.value)||0),onBlur:a,step:"any",className:Z(!!c)}),e.jsx(G,{error:c})]});if(typeof n=="string"){const g=(i==null?void 0:i.format)==="password",u=i==null?void 0:i.enum,p=i==null?void 0:i.description;if(u!=null&&u.length)return e.jsxs("div",{children:[e.jsx(L,{isRequired:l,children:r}),p&&e.jsx("p",{className:"text-[10px] text-text-tertiary mt-0.5",children:p}),e.jsx("select",{value:n,onChange:j=>o(j.target.value),onBlur:a,className:Z(!!c),children:u.map(j=>e.jsx("option",{value:j,children:j},j))}),e.jsx(G,{error:c})]});if(g)return e.jsxs("div",{children:[e.jsx(L,{isRequired:l,children:r}),p&&e.jsx("p",{className:"text-[10px] text-text-tertiary mt-0.5",children:p}),e.jsx("input",{type:"password",value:n,onChange:j=>o(j.target.value),onBlur:a,className:Z(!!c),autoComplete:"off"}),e.jsx(G,{error:c})]});const f=i==null?void 0:i.format,v={date:"date","date-time":"datetime-local",email:"email",uri:"url"};return f&&f in v?e.jsxs("div",{children:[e.jsx(L,{isRequired:l,children:r}),p&&e.jsx("p",{className:"text-[10px] text-text-tertiary mt-0.5",children:p}),e.jsx("input",{type:v[f],value:n,onChange:j=>o(j.target.value),onBlur:a,className:Z(!!c)}),e.jsx(G,{error:c})]}):f==="textarea"||n.length>80?e.jsxs("div",{children:[e.jsx(L,{isRequired:l,children:r}),p&&e.jsx("p",{className:"text-[10px] text-text-tertiary mt-0.5",children:p}),e.jsx("textarea",{value:n,onChange:j=>o(j.target.value),onBlur:a,className:`${Z(!!c)} leading-relaxed`,rows:Math.min(6,Math.max(3,Math.ceil(n.length/60)))}),e.jsx(G,{error:c})]}):e.jsxs("div",{children:[e.jsx(L,{isRequired:l,children:r}),p&&e.jsx("p",{className:"text-[10px] text-text-tertiary mt-0.5",children:p}),e.jsx("input",{type:"text",value:n,onChange:j=>o(j.target.value),onBlur:a,className:Z(!!c)}),e.jsx(G,{error:c})]})}if(n===null)return e.jsxs("div",{children:[e.jsx(L,{isRequired:l,children:r}),e.jsx("p",{className:"text-xs text-text-tertiary italic mt-1",children:"null"})]});if(Array.isArray(n))return e.jsxs("div",{children:[e.jsx(L,{isRequired:l,children:r}),e.jsx("div",{className:"flex flex-wrap gap-1.5 mt-1",children:n.map((g,u)=>e.jsx("span",{className:"px-2 py-0.5 text-[11px] font-mono bg-surface-sunken rounded text-text-secondary",children:String(g)},u))})]});if(typeof n=="object"){const g=Object.entries(n);return e.jsxs("div",{children:[e.jsx(L,{isRequired:l,children:r}),e.jsx("div",{className:"ml-4 mt-2 pl-4 border-l border-accent-faint space-y-3",children:g.map(([u,p])=>e.jsx(Pe,{fieldKey:u,value:p,onChange:f=>o({...n,[u]:f})},u))})]})}return null}function L({children:t,isRequired:n}){return e.jsxs("label",{className:"text-[11px] font-semibold uppercase tracking-wider text-text-secondary",children:[t,n&&e.jsx("span",{className:"text-status-error ml-0.5",children:"*"})]})}function G({error:t}){return t?e.jsx("p",{className:"text-[10px] text-status-error mt-1 animate-[field-error-in_0.3s_ease-out]",children:t}):null}function Z(t){return t?"input text-sm w-full mt-1 border-status-error/50 focus:border-status-error animate-[field-shake_0.4s_ease-in-out]":"input text-sm w-full mt-1"}function Bt({json:t,onJsonChange:n,requestTriage:o,onRequestTriageChange:a,triageNotes:s,onTriageNotesChange:l,disabled:d=!1,submitAttempted:c=!1,showTriage:r=!1}){return e.jsxs(e.Fragment,{children:[r&&e.jsx("div",{className:"flex items-center justify-between mb-3",children:o?e.jsxs("button",{onClick:()=>a(!1),className:"group flex items-center gap-2 text-left","data-testid":"triage-cancel",children:[e.jsx("span",{className:"flex items-center justify-center w-5 h-5 rounded-full bg-accent/10 text-accent shrink-0",children:e.jsx("svg",{className:"w-3 h-3",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M6 18L18 6M6 6l12 12"})})}),e.jsxs("span",{className:"text-xs text-text-secondary group-hover:text-text-primary transition-colors",children:["AI Triage active."," ",e.jsx("span",{className:"text-accent group-hover:underline",children:"Cancel"})]})]}):e.jsxs("button",{onClick:()=>a(!0),className:"group flex items-center gap-2.5 text-left my-4","data-testid":"triage-callout",children:[e.jsx("span",{className:"flex items-center justify-center w-6 h-6 rounded-full bg-accent/10 text-accent shrink-0 animate-[triage-glow_6s_ease-in-out_infinite]",children:e.jsx("svg",{className:"w-3.5 h-3.5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M9.663 17h4.674M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"})})}),e.jsxs("span",{className:"text-[13px] text-text-secondary group-hover:text-text-primary transition-colors",children:["This form doesn't capture the issue?"," ",e.jsx("span",{className:"text-accent group-hover:underline",children:"Request AI Triage"})]})]})}),e.jsxs("div",{className:"relative min-h-[200px]",children:[e.jsx("div",{className:o?"pointer-events-none select-none":"",children:e.jsx(Me,{value:t,onChange:n,disabled:d,submitAttempted:c})}),o&&e.jsxs("div",{className:"absolute inset-0 z-10 flex flex-col bg-surface/90 backdrop-blur-[2px] rounded-md border border-accent/20 p-5","data-testid":"triage-overlay",children:[e.jsx("p",{className:"text-xs text-text-secondary mb-3 leading-relaxed",children:"The resolution form will not be submitted. Describe the issue so AI triage can diagnose and fix it using available tools. The corrected result will come back as a new escalation for your review."}),e.jsx("textarea",{value:s,onChange:i=>l(i.target.value),placeholder:"e.g. Content is in Spanish — needs translation to English before review...",className:"input text-xs w-full flex-1 min-h-[80px] resize-none",autoFocus:!0,"data-testid":"triage-notes"})]})]})]})}function Kt({isRoundsExhausted:t,payloadObj:n,isTerminal:o,resolverPayload:a,onRetryTriage:s,isRetrying:l}){return e.jsxs(e.Fragment,{children:[t&&n&&e.jsx("div",{className:"mt-8",children:e.jsx(Ft,{payload:n,isTerminal:o,resolverPayload:a,onRetryTriage:s,isRetrying:l})}),(n==null?void 0:n.category)==="missing_credential"&&e.jsxs("div",{className:"mt-8 bg-status-warning/10 border border-status-warning/30 rounded-md px-5 py-4 flex items-start gap-3",children:[e.jsx(ve,{size:20,className:"text-status-warning mt-0.5 shrink-0"}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-medium text-text-primary mb-1",children:"Missing Credential"}),e.jsxs("p",{className:"text-xs text-text-secondary mb-3",children:["This workflow requires a ",e.jsx("span",{className:"font-medium capitalize",children:String(n.provider)})," credential to continue. Register one and then resolve this escalation to retry."]}),e.jsxs(re,{to:"/credentials",className:"btn-primary text-xs inline-flex items-center gap-1.5",children:[e.jsx(ve,{size:12}),"Go to Credentials"]})]})]})]})}function Yt({esc:t,resolverPayload:n,isTerminal:o,claimedByMe:a,activeView:s,metadataFormSchema:l,effectiveSchema:d,json:c,onJsonChange:r,requestTriage:i,onRequestTriageChange:x,triageNotes:m,onTriageNotesChange:b,onResolve:g,onEscalate:u,submitAttempted:p,isCertified:f,hasAI:v}){const j=l;if(o){if(n==null)return null;const E=typeof n=="object"&&n!==null?n:{},_=d??j,T=_!=null&&_.properties?{...Ee(E,_),_form_schema:_}:E;return e.jsx("div",{className:"mt-8 pt-6",children:e.jsx(Me,{value:JSON.stringify(T,null,2),onChange:()=>{},disabled:!0})})}if(s!=="resolve"||!(t.workflow_type||l))return null;const R=j==null?void 0:j["x-lt-viewport"],A=(R==null?void 0:R.type)==="iframe"&&!!R.src&&g&&u;return e.jsx("div",{className:"mt-8 pt-6",children:A?e.jsx(Vt,{src:R.src,escalation:t,schema:j,onResolve:g,onEscalate:u}):e.jsx(Bt,{json:c,onJsonChange:r,requestTriage:i,onRequestTriageChange:x,triageNotes:m,onTriageNotesChange:b,disabled:!a,submitAttempted:p,showTriage:!!f&&!!v})})}const Ie="lt:escalation:panel:open";function Qt(){try{const t=localStorage.getItem(Ie);return t===null?!0:t==="true"}catch{return!0}}function Gt(t){try{localStorage.setItem(Ie,String(t))}catch{}}function ne(t){if(!t)return null;try{return JSON.parse(t)}catch{return t}}function gs(){var ge,je,be,ye;const{id:t}=Tt(),{user:n}=Ke(),o=Ae(),a=Be(),{data:s,isLoading:l,refetch:d,isFetching:c}=Ye(t);ut(t);const r=Qe(),i=Ge(),x=Xe(),m=Ze(),[b,g]=h.useState(!1),{data:u}=ot((s==null?void 0:s.role)??""),{data:p}=xt(),{data:f}=et(),{isBuilder:v}=tt(),j=p==null?void 0:p.find(C=>C.workflow_type===(s==null?void 0:s.workflow_type)),R=((ge=f==null?void 0:f.telemetry)==null?void 0:ge.traceUrl)??null,[A,E]=h.useState("resolve"),[_,T]=h.useState("{}"),[V,N]=h.useState(Qt),[w,k]=h.useState(!1),[$,W]=h.useState(""),[U,J]=h.useState(!1),M=((je=s==null?void 0:s.metadata)==null?void 0:je.form_schema)??null,S=(s==null?void 0:s.form_schema)??(j==null?void 0:j.resolver_schema)??null,P=M??S,ee=h.useRef(!1);h.useEffect(()=>{if(ee.current)return;const C=M??(S!=null&&S.properties?S:null);if(C!=null&&C.properties){ee.current=!0;const le=ne(s==null?void 0:s.envelope),oe=le==null?void 0:le.formDefaults,qe=oe&&typeof oe=="object"?Ee(oe,C):{},Ne={_form_schema:C};for(const[we,ze]of Object.entries(C.properties)){const He=ze;Ne[we]=qe[we]??He.default??""}T(JSON.stringify(Ne,null,2))}else P&&(ee.current=!0,T(JSON.stringify(P,null,2)))},[P,M,S,s==null?void 0:s.envelope]);const ie=(s==null?void 0:s.subtype)==="rounds_exhausted";if(l)return e.jsxs("div",{className:"animate-pulse space-y-8",children:[e.jsx("div",{className:"h-8 bg-surface-sunken rounded w-64"}),e.jsx("div",{className:"h-32 bg-surface-sunken rounded w-full"})]});if(!s)return e.jsx("p",{className:"text-sm text-text-secondary",children:"Escalation not found."});const q=Te(s),y=q&&s.assigned_to===(n==null?void 0:n.userId),X=q&&!y,O=s.status==="resolved"||s.status==="cancelled",te=ne(s.escalation_payload),z=ne(s.resolver_payload),I=ne(s.envelope),Y=!!((be=I==null?void 0:I.metadata)!=null&&be.certified),F=!!((ye=f==null?void 0:f.ai)!=null&&ye.enabled),D=typeof te=="object"&&te!==null&&!Array.isArray(te)?te:null,De=D==null?void 0:D._triage,Le=typeof z=="object"&&z!==null&&!Array.isArray(z)?z:null,We=O?"terminal":y?"claimed_by_me":X?"claimed_by_other":"available",Oe=C=>{r.mutate({id:s.id,durationMinutes:C})},se=()=>{a.resetQueries({queryKey:["escalations"]}),a.resetQueries({queryKey:["escalationStats"]}),o(-1)},he=async C=>{await i.mutateAsync({id:s.id,resolverPayload:C}),se()},fe=async C=>{C&&(await x.mutateAsync({id:s.id,targetRole:C}),se())},Fe=async()=>{y||await r.mutateAsync({id:s.id,durationMinutes:30});const C=(D==null?void 0:D.diagnosis)||s.description||"";await i.mutateAsync({id:s.id,resolverPayload:{_lt:{needsTriage:!0},notes:C}}),se()},Ve=async()=>{await r.mutateAsync({id:s.id,durationMinutes:0}),se()},Ue=async()=>{await m.mutateAsync(s.id),g(!1),se()},Je=e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(dt,{onRefresh:()=>d(),isFetching:c,apiPath:`/escalations/${s.id}`}),e.jsx("button",{onClick:()=>N(C=>(Gt(!C),!C)),className:"ml-2 text-text-tertiary hover:text-accent transition-colors",title:V?"Hide side panel":"Show side panel",children:V?e.jsx(_t,{className:"w-5 h-5",strokeWidth:1.5}):e.jsx(Et,{className:"w-5 h-5",strokeWidth:1.5})})]});return e.jsxs("div",{className:"flex-1 min-h-0 min-w-0 flex items-stretch -mt-10 -mr-10 -mb-16",children:[e.jsxs("div",{className:"flex-1 min-w-0 flex flex-col min-h-0",children:[e.jsx("div",{className:"shrink-0 pt-10 pr-10",children:e.jsx(ct,{title:s.description||"Escalation",actions:Je})}),e.jsxs("div",{className:"flex-1 min-h-0 overflow-y-auto pr-10",children:[e.jsx(Kt,{isRoundsExhausted:ie,payloadObj:D,isTerminal:O,resolverPayload:z,onRetryTriage:Fe,isRetrying:r.isPending||i.isPending}),e.jsx(Yt,{esc:s,resolverPayload:z,isTerminal:O,claimedByMe:y,activeView:A,metadataFormSchema:M,effectiveSchema:P,json:_,onJsonChange:T,requestTriage:w,onRequestTriageChange:k,triageNotes:$,onTriageNotesChange:W,onResolve:he,onEscalate:fe,submitAttempted:U,isCertified:Y,hasAI:F}),e.jsx("div",{className:"h-10"})]}),e.jsx(Wt,{mode:We,activeView:A,onActiveViewChange:E,onClaim:Oe,claimPending:r.isPending,workflowType:s.workflow_type,json:_,onResolve:he,resolvePending:i.isPending,resolveError:i.error,requestTriage:w,triageNotes:$,currentRole:s.role,escalationTargets:((u==null?void 0:u.targets)??[]).filter(C=>C!==s.role),onEscalate:fe,escalatePending:x.isPending,escalateError:x.error,onRelease:Ve,releasePending:r.isPending,onCancel:()=>g(!0),assignedTo:s.assigned_to,assignedUntil:s.assigned_until,onSubmitAttempt:()=>J(!0)})]}),e.jsx(Lt,{esc:s,schema:P,envelope:I,payload:D,resolver:Le,triage:De??null,hasAI:F,claimed:q,claimedByMe:y,isTerminal:O,isBuilder:v,traceUrl:R,open:V}),e.jsx(lt,{open:b,onClose:()=>g(!1),onConfirm:Ue,isPending:m.isPending,error:m.error})]})}export{gs as EscalationDetailPage};
5
- //# sourceMappingURL=index-BSOcWfeR.js.map