@hotmeshio/long-tail 0.24.2 → 0.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (280) hide show
  1. package/build/api/escalations/accumulate.js +8 -4
  2. package/build/api/escalations/metadata.js +4 -3
  3. package/build/api/escalations/related.d.ts +1 -1
  4. package/build/api/escalations/related.js +28 -18
  5. package/build/services/escalation/accumulate.d.ts +3 -1
  6. package/build/services/escalation/facet-sql.js +4 -2
  7. package/build/services/escalation/index.d.ts +1 -0
  8. package/build/services/escalation/index.js +4 -1
  9. package/build/services/escalation/related-extremes.d.ts +17 -0
  10. package/build/services/escalation/related-extremes.js +65 -0
  11. package/build/services/escalation/related.d.ts +4 -0
  12. package/build/services/escalation/related.js +2 -0
  13. package/build/services/escalation/resolver-validation.js +7 -0
  14. package/build/services/escalation/roster.d.ts +13 -0
  15. package/build/services/escalation/roster.js +37 -0
  16. package/build/services/escalation/submit-guard.d.ts +3 -0
  17. package/build/services/escalation/submit-guard.js +21 -2
  18. package/build/services/mcp/server-tools.js +1 -1
  19. package/build/shared/form-validation/display-only-widgets.d.ts +1 -0
  20. package/build/shared/form-validation/display-only-widgets.js +1 -0
  21. package/build/shared/form-validation/index.d.ts +1 -0
  22. package/build/shared/form-validation/index.js +1 -0
  23. package/build/shared/form-validation/validate-resolver-payload.d.ts +1 -0
  24. package/build/shared/form-validation/validate-resolver-payload.js +2 -1
  25. package/build/shared/form-validation/x-lt-help.d.ts +1 -1
  26. package/build/shared/form-validation/x-lt-help.js +2 -1
  27. package/build/shared/form-validation/x-lt-roster.d.ts +92 -0
  28. package/build/shared/form-validation/x-lt-roster.js +234 -0
  29. package/build/shared/form-validation/x-lt-show-if.d.ts +8 -0
  30. package/build/shared/form-validation/x-lt-show-if.js +13 -0
  31. package/build/shared/form-validation/x-lt-submit-guard.d.ts +14 -1
  32. package/build/shared/form-validation/x-lt-submit-guard.js +4 -1
  33. package/build/shared/list-schema/aggregate.d.ts +19 -0
  34. package/build/shared/list-schema/aggregate.js +66 -0
  35. package/build/shared/list-schema/index.d.ts +2 -0
  36. package/build/shared/list-schema/index.js +7 -1
  37. package/build/shared/list-schema/types.d.ts +15 -2
  38. package/build/shared/list-schema/types.js +6 -1
  39. package/build/shared/list-schema/validate.js +28 -2
  40. package/build/tsconfig.tsbuildinfo +1 -1
  41. package/dashboard/dist/assets/{AdminDashboard-B3mkMIOT.js → AdminDashboard-DWVRAu63.js} +2 -2
  42. package/dashboard/dist/assets/{AdminDashboard-B3mkMIOT.js.map → AdminDashboard-DWVRAu63.js.map} +1 -1
  43. package/dashboard/dist/assets/{AgentConfigPage-CQj2B678.js → AgentConfigPage-Exjtjbvp.js} +6 -6
  44. package/dashboard/dist/assets/{AgentConfigPage-CQj2B678.js.map → AgentConfigPage-Exjtjbvp.js.map} +1 -1
  45. package/dashboard/dist/assets/{AgentDetailPage-CzrD8JJI.js → AgentDetailPage-nDbZo6RB.js} +3 -3
  46. package/dashboard/dist/assets/{AgentDetailPage-CzrD8JJI.js.map → AgentDetailPage-nDbZo6RB.js.map} +1 -1
  47. package/dashboard/dist/assets/{AgentsPage-jg2OFwyW.js → AgentsPage-Dsk9iHps.js} +2 -2
  48. package/dashboard/dist/assets/{AgentsPage-jg2OFwyW.js.map → AgentsPage-Dsk9iHps.js.map} +1 -1
  49. package/dashboard/dist/assets/AvailableEscalationsPage-D1mCqj8Z.js +2 -0
  50. package/dashboard/dist/assets/{AvailableEscalationsPage-IS28XBRe.js.map → AvailableEscalationsPage-D1mCqj8Z.js.map} +1 -1
  51. package/dashboard/dist/assets/{BotPicker-DvEJFpwS.js → BotPicker-u5760MWZ.js} +2 -2
  52. package/dashboard/dist/assets/{BotPicker-DvEJFpwS.js.map → BotPicker-u5760MWZ.js.map} +1 -1
  53. package/dashboard/dist/assets/{BulkAssignModal-BoQCi-YC.js → BulkAssignModal-CtISXXmW.js} +2 -2
  54. package/dashboard/dist/assets/{BulkAssignModal-BoQCi-YC.js.map → BulkAssignModal-CtISXXmW.js.map} +1 -1
  55. package/dashboard/dist/assets/{CapabilitiesPage-kwlrcb_t.js → CapabilitiesPage-BKIlrQfU.js} +2 -2
  56. package/dashboard/dist/assets/{CapabilitiesPage-kwlrcb_t.js.map → CapabilitiesPage-BKIlrQfU.js.map} +1 -1
  57. package/dashboard/dist/assets/{CollapsibleSection-UMIV4KIj.js → CollapsibleSection-DlBVTFqc.js} +2 -2
  58. package/dashboard/dist/assets/{CollapsibleSection-UMIV4KIj.js.map → CollapsibleSection-DlBVTFqc.js.map} +1 -1
  59. package/dashboard/dist/assets/{ConfirmDeleteModal-C5puwMg7.js → ConfirmDeleteModal-Pabkchg_.js} +2 -2
  60. package/dashboard/dist/assets/{ConfirmDeleteModal-C5puwMg7.js.map → ConfirmDeleteModal-Pabkchg_.js.map} +1 -1
  61. package/dashboard/dist/assets/{ConnectedAppsPage-drZa65kP.js → ConnectedAppsPage-DG2YZGN3.js} +2 -2
  62. package/dashboard/dist/assets/{ConnectedAppsPage-drZa65kP.js.map → ConnectedAppsPage-DG2YZGN3.js.map} +1 -1
  63. package/dashboard/dist/assets/CountdownTimer-5t8S2qMi.js +2 -0
  64. package/dashboard/dist/assets/CountdownTimer-5t8S2qMi.js.map +1 -0
  65. package/dashboard/dist/assets/{CredentialsPage-CaFQ6vLb.js → CredentialsPage-CPVbYQow.js} +2 -2
  66. package/dashboard/dist/assets/{CredentialsPage-CaFQ6vLb.js.map → CredentialsPage-CPVbYQow.js.map} +1 -1
  67. package/dashboard/dist/assets/{CronLabel-Co5j7tzW.js → CronLabel-C7UbTrO-.js} +2 -2
  68. package/dashboard/dist/assets/{CronLabel-Co5j7tzW.js.map → CronLabel-C7UbTrO-.js.map} +1 -1
  69. package/dashboard/dist/assets/{DropZone-B1Tdfddc.js → DropZone-DCZpORx-.js} +2 -2
  70. package/dashboard/dist/assets/{DropZone-B1Tdfddc.js.map → DropZone-DCZpORx-.js.map} +1 -1
  71. package/dashboard/dist/assets/{ElapsedCell-WJyE9G0T.js → ElapsedCell-Yz7-LbtE.js} +2 -2
  72. package/dashboard/dist/assets/{ElapsedCell-WJyE9G0T.js.map → ElapsedCell-Yz7-LbtE.js.map} +1 -1
  73. package/dashboard/dist/assets/{EntityTimelinePanel-CDFFfX9d.js → EntityTimelinePanel-xgPRdKEq.js} +2 -2
  74. package/dashboard/dist/assets/{EntityTimelinePanel-CDFFfX9d.js.map → EntityTimelinePanel-xgPRdKEq.js.map} +1 -1
  75. package/dashboard/dist/assets/{EscalationListSchemaPage-CMrUlaKI.js → EscalationListSchemaPage-CqCd-y6B.js} +3 -3
  76. package/dashboard/dist/assets/{EscalationListSchemaPage-CMrUlaKI.js.map → EscalationListSchemaPage-CqCd-y6B.js.map} +1 -1
  77. package/dashboard/dist/assets/{EscalationSchemaPage-Dx2Lyfrz.js → EscalationSchemaPage-D8YVQNph.js} +3 -3
  78. package/dashboard/dist/assets/{EscalationSchemaPage-Dx2Lyfrz.js.map → EscalationSchemaPage-D8YVQNph.js.map} +1 -1
  79. package/dashboard/dist/assets/EscalationTimeline-D6jrDcBb.js +2 -0
  80. package/dashboard/dist/assets/{EscalationTimeline-d3nvshOk.js.map → EscalationTimeline-D6jrDcBb.js.map} +1 -1
  81. package/dashboard/dist/assets/{EscalationTitleSelect-DWQieOM9.js → EscalationTitleSelect-CGGT-QTu.js} +2 -2
  82. package/dashboard/dist/assets/{EscalationTitleSelect-DWQieOM9.js.map → EscalationTitleSelect-CGGT-QTu.js.map} +1 -1
  83. package/dashboard/dist/assets/{EscalationsOverview-BX8Cpi0X.js → EscalationsOverview-B7O4ttP4.js} +2 -2
  84. package/dashboard/dist/assets/{EscalationsOverview-BX8Cpi0X.js.map → EscalationsOverview-B7O4ttP4.js.map} +1 -1
  85. package/dashboard/dist/assets/{EventTable-D1-ITVXS.js → EventTable-DJniXnhe.js} +2 -2
  86. package/dashboard/dist/assets/{EventTable-D1-ITVXS.js.map → EventTable-DJniXnhe.js.map} +1 -1
  87. package/dashboard/dist/assets/{FilterBar-ABC9ctin.js → FilterBar-f-LEKcHI.js} +2 -2
  88. package/dashboard/dist/assets/{FilterBar-ABC9ctin.js.map → FilterBar-f-LEKcHI.js.map} +1 -1
  89. package/dashboard/dist/assets/{FormattedValue-k27T4bG7.js → FormattedValue-CUtv1g3k.js} +2 -2
  90. package/dashboard/dist/assets/{FormattedValue-k27T4bG7.js.map → FormattedValue-CUtv1g3k.js.map} +1 -1
  91. package/dashboard/dist/assets/{GraphInvokePage-DKUErxWc.js → GraphInvokePage-CR0MtYv8.js} +2 -2
  92. package/dashboard/dist/assets/{GraphInvokePage-DKUErxWc.js.map → GraphInvokePage-CR0MtYv8.js.map} +1 -1
  93. package/dashboard/dist/assets/{HomePage-C6u9dIpR.js → HomePage-HVw7T5ER.js} +2 -2
  94. package/dashboard/dist/assets/{HomePage-C6u9dIpR.js.map → HomePage-HVw7T5ER.js.map} +1 -1
  95. package/dashboard/dist/assets/{ListToolbar-gA5rFzkz.js → ListToolbar-CTGK5BXW.js} +2 -2
  96. package/dashboard/dist/assets/{ListToolbar-gA5rFzkz.js.map → ListToolbar-CTGK5BXW.js.map} +1 -1
  97. package/dashboard/dist/assets/{McpOverview-BOPo3J_i.js → McpOverview-B2bbKKu2.js} +2 -2
  98. package/dashboard/dist/assets/{McpOverview-BOPo3J_i.js.map → McpOverview-B2bbKKu2.js.map} +1 -1
  99. package/dashboard/dist/assets/{McpQueryDetailPage-BRVVi0Zh.js → McpQueryDetailPage-DgLxwwJy.js} +2 -2
  100. package/dashboard/dist/assets/{McpQueryDetailPage-BRVVi0Zh.js.map → McpQueryDetailPage-DgLxwwJy.js.map} +1 -1
  101. package/dashboard/dist/assets/{McpQueryPage-Dmbb6SAc.js → McpQueryPage-CSkczeJP.js} +2 -2
  102. package/dashboard/dist/assets/{McpQueryPage-Dmbb6SAc.js.map → McpQueryPage-CSkczeJP.js.map} +1 -1
  103. package/dashboard/dist/assets/McpRunDetailPage-CrUsDPRD.js +2 -0
  104. package/dashboard/dist/assets/{McpRunDetailPage-bMXNO-6V.js.map → McpRunDetailPage-CrUsDPRD.js.map} +1 -1
  105. package/dashboard/dist/assets/{McpRunsPage-Bi9AMWja.js → McpRunsPage-twxFdTtJ.js} +2 -2
  106. package/dashboard/dist/assets/{McpRunsPage-Bi9AMWja.js.map → McpRunsPage-twxFdTtJ.js.map} +1 -1
  107. package/dashboard/dist/assets/{NamespacePill-DwM5pNA4.js → NamespacePill-CSZT2fA4.js} +2 -2
  108. package/dashboard/dist/assets/{NamespacePill-DwM5pNA4.js.map → NamespacePill-CSZT2fA4.js.map} +1 -1
  109. package/dashboard/dist/assets/{OperationsPage-CvR74ZUJ.js → OperationsPage-gOVMrL_a.js} +3 -3
  110. package/dashboard/dist/assets/{OperationsPage-CvR74ZUJ.js.map → OperationsPage-gOVMrL_a.js.map} +1 -1
  111. package/dashboard/dist/assets/OperatorDashboard-BoeZIyup.js +2 -0
  112. package/dashboard/dist/assets/{OperatorDashboard-DctmZw10.js.map → OperatorDashboard-BoeZIyup.js.map} +1 -1
  113. package/dashboard/dist/assets/{PageHeader-CMd3f4bz.js → PageHeader-C4z1ExF7.js} +2 -2
  114. package/dashboard/dist/assets/{PageHeader-CMd3f4bz.js.map → PageHeader-C4z1ExF7.js.map} +1 -1
  115. package/dashboard/dist/assets/{PageHeaderWithStats-DHj8Mqox.js → PageHeaderWithStats-B_f_Sz_Q.js} +2 -2
  116. package/dashboard/dist/assets/{PageHeaderWithStats-DHj8Mqox.js.map → PageHeaderWithStats-B_f_Sz_Q.js.map} +1 -1
  117. package/dashboard/dist/assets/{PersonaDetailPage-Ubqm2rQH.js → PersonaDetailPage-CDktk1mi.js} +2 -2
  118. package/dashboard/dist/assets/{PersonaDetailPage-Ubqm2rQH.js.map → PersonaDetailPage-CDktk1mi.js.map} +1 -1
  119. package/dashboard/dist/assets/{PersonasPage-BpFL2rpo.js → PersonasPage-Bs097x07.js} +2 -2
  120. package/dashboard/dist/assets/{PersonasPage-BpFL2rpo.js.map → PersonasPage-Bs097x07.js.map} +1 -1
  121. package/dashboard/dist/assets/PortalPage-DjfjerpF.js +2 -0
  122. package/dashboard/dist/assets/{PortalPage-Dfc_Q02R.js.map → PortalPage-DjfjerpF.js.map} +1 -1
  123. package/dashboard/dist/assets/{ProcessDetailPage-liJspvQh.js → ProcessDetailPage-B30RatjD.js} +2 -2
  124. package/dashboard/dist/assets/{ProcessDetailPage-liJspvQh.js.map → ProcessDetailPage-B30RatjD.js.map} +1 -1
  125. package/dashboard/dist/assets/{ProcessesListPage-C3OM5ZUy.js → ProcessesListPage-DrvjzgWT.js} +2 -2
  126. package/dashboard/dist/assets/{ProcessesListPage-C3OM5ZUy.js.map → ProcessesListPage-DrvjzgWT.js.map} +1 -1
  127. package/dashboard/dist/assets/ResolverForm-Bl8Pibyz.js +8 -0
  128. package/dashboard/dist/assets/ResolverForm-Bl8Pibyz.js.map +1 -0
  129. package/dashboard/dist/assets/{RoleDetailPage-CrlYCh-R.js → RoleDetailPage-ClYgn-3d.js} +3 -3
  130. package/dashboard/dist/assets/{RoleDetailPage-CrlYCh-R.js.map → RoleDetailPage-ClYgn-3d.js.map} +1 -1
  131. package/dashboard/dist/assets/{RolePill-Di2CAHuD.js → RolePill-Bw_n7EpR.js} +2 -2
  132. package/dashboard/dist/assets/{RolePill-Di2CAHuD.js.map → RolePill-Bw_n7EpR.js.map} +1 -1
  133. package/dashboard/dist/assets/{RolesPage-BaazL_pt.js → RolesPage-B_3qWsvQ.js} +2 -2
  134. package/dashboard/dist/assets/{RolesPage-BaazL_pt.js.map → RolesPage-B_3qWsvQ.js.map} +1 -1
  135. package/dashboard/dist/assets/{RunAsSelector-DxuV0fa1.js → RunAsSelector-CbJT50Hp.js} +2 -2
  136. package/dashboard/dist/assets/{RunAsSelector-DxuV0fa1.js.map → RunAsSelector-CbJT50Hp.js.map} +1 -1
  137. package/dashboard/dist/assets/{ScanCodesPage-C0mvmYTq.js → ScanCodesPage-CIIDuh8w.js} +2 -2
  138. package/dashboard/dist/assets/{ScanCodesPage-C0mvmYTq.js.map → ScanCodesPage-CIIDuh8w.js.map} +1 -1
  139. package/dashboard/dist/assets/{ScanSchemeDetailPage-CiJgt5dZ.js → ScanSchemeDetailPage-Bd3P3eyh.js} +2 -2
  140. package/dashboard/dist/assets/{ScanSchemeDetailPage-CiJgt5dZ.js.map → ScanSchemeDetailPage-Bd3P3eyh.js.map} +1 -1
  141. package/dashboard/dist/assets/ScanStationPage-BiO34nov.js +2 -0
  142. package/dashboard/dist/assets/ScanStationPage-BiO34nov.js.map +1 -0
  143. package/dashboard/dist/assets/{ScopeBadge-CSItPVOH.js → ScopeBadge-CKgfwTy3.js} +2 -2
  144. package/dashboard/dist/assets/{ScopeBadge-CSItPVOH.js.map → ScopeBadge-CKgfwTy3.js.map} +1 -1
  145. package/dashboard/dist/assets/{StickyPagination-CqbjVY6T.js → StickyPagination-BNOuYZ1m.js} +2 -2
  146. package/dashboard/dist/assets/{StickyPagination-CqbjVY6T.js.map → StickyPagination-BNOuYZ1m.js.map} +1 -1
  147. package/dashboard/dist/assets/{StreamMessageDetail-wX3i0aqs.js → StreamMessageDetail-ALVUnfF1.js} +2 -2
  148. package/dashboard/dist/assets/{StreamMessageDetail-wX3i0aqs.js.map → StreamMessageDetail-ALVUnfF1.js.map} +1 -1
  149. package/dashboard/dist/assets/{SwimlaneTimeline-C50PsFoV.js → SwimlaneTimeline-B5b8-xqI.js} +2 -2
  150. package/dashboard/dist/assets/{SwimlaneTimeline-C50PsFoV.js.map → SwimlaneTimeline-B5b8-xqI.js.map} +1 -1
  151. package/dashboard/dist/assets/{TagInput-CAgdLN_b.js → TagInput-B6fMAqxd.js} +2 -2
  152. package/dashboard/dist/assets/{TagInput-CAgdLN_b.js.map → TagInput-B6fMAqxd.js.map} +1 -1
  153. package/dashboard/dist/assets/{TaskDetailPage-bbNSv4Ae.js → TaskDetailPage-CoV3WcTA.js} +2 -2
  154. package/dashboard/dist/assets/{TaskDetailPage-bbNSv4Ae.js.map → TaskDetailPage-CoV3WcTA.js.map} +1 -1
  155. package/dashboard/dist/assets/{TaskQueuePill-h0oorVMe.js → TaskQueuePill-BnDp_DE6.js} +2 -2
  156. package/dashboard/dist/assets/{TaskQueuePill-h0oorVMe.js.map → TaskQueuePill-BnDp_DE6.js.map} +1 -1
  157. package/dashboard/dist/assets/{TasksListPage-CDWnm_d9.js → TasksListPage-CkMmOYOE.js} +2 -2
  158. package/dashboard/dist/assets/{TasksListPage-CDWnm_d9.js.map → TasksListPage-CkMmOYOE.js.map} +1 -1
  159. package/dashboard/dist/assets/{TimeAgo-BLjqlfoX.js → TimeAgo-DVkFgECX.js} +2 -2
  160. package/dashboard/dist/assets/{TimeAgo-BLjqlfoX.js.map → TimeAgo-DVkFgECX.js.map} +1 -1
  161. package/dashboard/dist/assets/{TimestampCell-CnW0ENb5.js → TimestampCell-CfTc6Txy.js} +2 -2
  162. package/dashboard/dist/assets/{TimestampCell-CnW0ENb5.js.map → TimestampCell-CfTc6Txy.js.map} +1 -1
  163. package/dashboard/dist/assets/{ToolPill-CQCsVdzD.js → ToolPill-BRZWo4l8.js} +2 -2
  164. package/dashboard/dist/assets/{ToolPill-CQCsVdzD.js.map → ToolPill-BRZWo4l8.js.map} +1 -1
  165. package/dashboard/dist/assets/{ToolTestPanel-DkMgCB-k.js → ToolTestPanel-kvqZqM0A.js} +2 -2
  166. package/dashboard/dist/assets/{ToolTestPanel-DkMgCB-k.js.map → ToolTestPanel-kvqZqM0A.js.map} +1 -1
  167. package/dashboard/dist/assets/{TopicDetailPage-g3pljKKX.js → TopicDetailPage-CjkAAyy8.js} +4 -4
  168. package/dashboard/dist/assets/{TopicDetailPage-g3pljKKX.js.map → TopicDetailPage-CjkAAyy8.js.map} +1 -1
  169. package/dashboard/dist/assets/{TopicsPage-CVcCYdy-.js → TopicsPage-CJZnv50y.js} +2 -2
  170. package/dashboard/dist/assets/{TopicsPage-CVcCYdy-.js.map → TopicsPage-CJZnv50y.js.map} +1 -1
  171. package/dashboard/dist/assets/{UserName-D6zGIK2i.js → UserName-CPJPZnN1.js} +2 -2
  172. package/dashboard/dist/assets/{UserName-D6zGIK2i.js.map → UserName-CPJPZnN1.js.map} +1 -1
  173. package/dashboard/dist/assets/WorkflowExecutionPage-46UV5pJd.js +2 -0
  174. package/dashboard/dist/assets/{WorkflowExecutionPage-B8g81FCJ.js.map → WorkflowExecutionPage-46UV5pJd.js.map} +1 -1
  175. package/dashboard/dist/assets/{WorkflowPill-Dg7BDTyM.js → WorkflowPill-Cly9Ln_3.js} +2 -2
  176. package/dashboard/dist/assets/{WorkflowPill-Dg7BDTyM.js.map → WorkflowPill-Cly9Ln_3.js.map} +1 -1
  177. package/dashboard/dist/assets/{WorkflowsDashboard-nxT3bv6W.js → WorkflowsDashboard-DtxYdQbQ.js} +2 -2
  178. package/dashboard/dist/assets/{WorkflowsDashboard-nxT3bv6W.js.map → WorkflowsDashboard-DtxYdQbQ.js.map} +1 -1
  179. package/dashboard/dist/assets/{WorkflowsOverview-grI-KAI2.js → WorkflowsOverview-Cg4LSfck.js} +2 -2
  180. package/dashboard/dist/assets/{WorkflowsOverview-grI-KAI2.js.map → WorkflowsOverview-Cg4LSfck.js.map} +1 -1
  181. package/dashboard/dist/assets/{YamlWorkflowDetailPage-BoZ-hfBE.js → YamlWorkflowDetailPage-Del-RCgi.js} +12 -12
  182. package/dashboard/dist/assets/{YamlWorkflowDetailPage-BoZ-hfBE.js.map → YamlWorkflowDetailPage-Del-RCgi.js.map} +1 -1
  183. package/dashboard/dist/assets/{YamlWorkflowsPage-Bf04rwRv.js → YamlWorkflowsPage-BF6Jtx24.js} +2 -2
  184. package/dashboard/dist/assets/{YamlWorkflowsPage-Bf04rwRv.js.map → YamlWorkflowsPage-BF6Jtx24.js.map} +1 -1
  185. package/dashboard/dist/assets/{agents-Dphpdi8l.js → agents-wL-3dMOX.js} +2 -2
  186. package/dashboard/dist/assets/{agents-Dphpdi8l.js.map → agents-wL-3dMOX.js.map} +1 -1
  187. package/dashboard/dist/assets/{bots-DIFE298x.js → bots-D72EsztP.js} +2 -2
  188. package/dashboard/dist/assets/{bots-DIFE298x.js.map → bots-D72EsztP.js.map} +1 -1
  189. package/dashboard/dist/assets/{capabilities-D7Y7LClY.js → capabilities-DXFo6bRb.js} +2 -2
  190. package/dashboard/dist/assets/{capabilities-D7Y7LClY.js.map → capabilities-DXFo6bRb.js.map} +1 -1
  191. package/dashboard/dist/assets/{controlplane-D1TGcYsS.js → controlplane-gQdOgVtH.js} +2 -2
  192. package/dashboard/dist/assets/{controlplane-D1TGcYsS.js.map → controlplane-gQdOgVtH.js.map} +1 -1
  193. package/dashboard/dist/assets/escalation-columns-CSE5wfWQ.js +2 -0
  194. package/dashboard/dist/assets/escalation-columns-CSE5wfWQ.js.map +1 -0
  195. package/dashboard/dist/assets/escalation-items-BIgBWbaw.js +2 -0
  196. package/dashboard/dist/assets/escalation-items-BIgBWbaw.js.map +1 -0
  197. package/dashboard/dist/assets/{index-CeCtqujG.js → index-BaCDL5fh.js} +38 -38
  198. package/dashboard/dist/assets/index-BaCDL5fh.js.map +1 -0
  199. package/dashboard/dist/assets/{index-Dl_8hbYI.js → index-Btm8FtTQ.js} +2 -2
  200. package/dashboard/dist/assets/{index-Dl_8hbYI.js.map → index-Btm8FtTQ.js.map} +1 -1
  201. package/dashboard/dist/assets/index-BvH8T-jb.js +2 -0
  202. package/dashboard/dist/assets/{index-CxdjT1Yk.js.map → index-BvH8T-jb.js.map} +1 -1
  203. package/dashboard/dist/assets/{index-HLu98Sqh.js → index-C-QQ5rKF.js} +2 -2
  204. package/dashboard/dist/assets/{index-HLu98Sqh.js.map → index-C-QQ5rKF.js.map} +1 -1
  205. package/dashboard/dist/assets/{index-DpKOr311.js → index-C1iuZ4Q5.js} +2 -2
  206. package/dashboard/dist/assets/{index-DpKOr311.js.map → index-C1iuZ4Q5.js.map} +1 -1
  207. package/dashboard/dist/assets/{index-ChV7pBjM.js → index-CDxOQ84B.js} +2 -2
  208. package/dashboard/dist/assets/{index-ChV7pBjM.js.map → index-CDxOQ84B.js.map} +1 -1
  209. package/dashboard/dist/assets/index-CED9cLE2.js +3 -0
  210. package/dashboard/dist/assets/index-CED9cLE2.js.map +1 -0
  211. package/dashboard/dist/assets/index-CnU7Jjz3.css +1 -0
  212. package/dashboard/dist/assets/{index-DAvi5_2T.js → index-CptTEhWp.js} +2 -2
  213. package/dashboard/dist/assets/{index-DAvi5_2T.js.map → index-CptTEhWp.js.map} +1 -1
  214. package/dashboard/dist/assets/{index-ag2pCAPu.js → index-Cu0xdX2t.js} +2 -2
  215. package/dashboard/dist/assets/{index-ag2pCAPu.js.map → index-Cu0xdX2t.js.map} +1 -1
  216. package/dashboard/dist/assets/index-D1lfq5iZ.js +13 -0
  217. package/dashboard/dist/assets/{index-gkxPN7Vx.js.map → index-D1lfq5iZ.js.map} +1 -1
  218. package/dashboard/dist/assets/{index-Dy1wWu2e.js → index-czgLyfSo.js} +2 -2
  219. package/dashboard/dist/assets/{index-Dy1wWu2e.js.map → index-czgLyfSo.js.map} +1 -1
  220. package/dashboard/dist/assets/{index-DN-kX7hL.js → index-h1Useskt.js} +2 -2
  221. package/dashboard/dist/assets/{index-DN-kX7hL.js.map → index-h1Useskt.js.map} +1 -1
  222. package/dashboard/dist/assets/{index-BzYcUPdD.js → index-ujGmmwl6.js} +2 -2
  223. package/dashboard/dist/assets/{index-BzYcUPdD.js.map → index-ujGmmwl6.js.map} +1 -1
  224. package/dashboard/dist/assets/{knowledge-DnMs-SOJ.js → knowledge-150lsM68.js} +2 -2
  225. package/dashboard/dist/assets/{knowledge-DnMs-SOJ.js.map → knowledge-150lsM68.js.map} +1 -1
  226. package/dashboard/dist/assets/{mcp-CwW-K3r4.js → mcp-CRtY4v5W.js} +2 -2
  227. package/dashboard/dist/assets/{mcp-CwW-K3r4.js.map → mcp-CRtY4v5W.js.map} +1 -1
  228. package/dashboard/dist/assets/{mcp-query-BZt5e8_Q.js → mcp-query-CDsSMaYq.js} +2 -2
  229. package/dashboard/dist/assets/{mcp-query-BZt5e8_Q.js.map → mcp-query-CDsSMaYq.js.map} +1 -1
  230. package/dashboard/dist/assets/{personas-UA-Xn60f.js → personas-C2Wm4ng1.js} +2 -2
  231. package/dashboard/dist/assets/{personas-UA-Xn60f.js.map → personas-C2Wm4ng1.js.map} +1 -1
  232. package/dashboard/dist/assets/{pipelines-Cu3PARum.js → pipelines-BH0F9-jf.js} +2 -2
  233. package/dashboard/dist/assets/{pipelines-Cu3PARum.js.map → pipelines-BH0F9-jf.js.map} +1 -1
  234. package/dashboard/dist/assets/{tasks-BO6h8GJE.js → tasks-BkUVpaOa.js} +2 -2
  235. package/dashboard/dist/assets/{tasks-BO6h8GJE.js.map → tasks-BkUVpaOa.js.map} +1 -1
  236. package/dashboard/dist/assets/{topics-CWjCR-17.js → topics-Crl8HKHq.js} +2 -2
  237. package/dashboard/dist/assets/{topics-CWjCR-17.js.map → topics-Crl8HKHq.js.map} +1 -1
  238. package/dashboard/dist/assets/{useDebouncedValue-6t0jx1RB.js → useDebouncedValue-Dk3r5xo-.js} +2 -2
  239. package/dashboard/dist/assets/{useDebouncedValue-6t0jx1RB.js.map → useDebouncedValue-Dk3r5xo-.js.map} +1 -1
  240. package/dashboard/dist/assets/{useNamespace-CqpoQx6D.js → useNamespace-BXuyHKAs.js} +2 -2
  241. package/dashboard/dist/assets/{useNamespace-CqpoQx6D.js.map → useNamespace-BXuyHKAs.js.map} +1 -1
  242. package/dashboard/dist/assets/{useYamlActivityEvents-hmCQQwzB.js → useYamlActivityEvents-DSlkjQfb.js} +2 -2
  243. package/dashboard/dist/assets/{useYamlActivityEvents-hmCQQwzB.js.map → useYamlActivityEvents-DSlkjQfb.js.map} +1 -1
  244. package/dashboard/dist/assets/{vendor-icons-CeVtUKyP.js → vendor-icons-C_DQEeBy.js} +2 -2
  245. package/dashboard/dist/assets/{vendor-icons-CeVtUKyP.js.map → vendor-icons-C_DQEeBy.js.map} +1 -1
  246. package/dashboard/dist/assets/{yaml-workflows-ziUdZhKY.js → yaml-workflows-B230v5Za.js} +2 -2
  247. package/dashboard/dist/assets/{yaml-workflows-ziUdZhKY.js.map → yaml-workflows-B230v5Za.js.map} +1 -1
  248. package/dashboard/dist/index.html +3 -3
  249. package/docs/faceted-routing.md +14 -1
  250. package/docs/hitl/x-lt-embed.md +4 -1
  251. package/docs/hitl/x-lt-list-schema.md +19 -2
  252. package/docs/hitl/x-lt-roster.md +112 -0
  253. package/docs/hitl/x-lt-show-if.md +15 -0
  254. package/docs/hitl/x-lt-widget.md +1 -0
  255. package/docs/hitl-guide.md +3 -1
  256. package/docs/scan-codes.md +4 -0
  257. package/docs/schema-enforcement.md +5 -0
  258. package/package.json +2 -2
  259. package/dashboard/dist/assets/AvailableEscalationsPage-IS28XBRe.js +0 -2
  260. package/dashboard/dist/assets/CountdownTimer-LG03dVgR.js +0 -2
  261. package/dashboard/dist/assets/CountdownTimer-LG03dVgR.js.map +0 -1
  262. package/dashboard/dist/assets/EscalationTimeline-d3nvshOk.js +0 -2
  263. package/dashboard/dist/assets/McpRunDetailPage-bMXNO-6V.js +0 -2
  264. package/dashboard/dist/assets/OperatorDashboard-DctmZw10.js +0 -2
  265. package/dashboard/dist/assets/PortalPage-Dfc_Q02R.js +0 -2
  266. package/dashboard/dist/assets/ResolverForm-B1_x8Blv.js +0 -8
  267. package/dashboard/dist/assets/ResolverForm-B1_x8Blv.js.map +0 -1
  268. package/dashboard/dist/assets/ScanStationPage-DzGaXc40.js +0 -2
  269. package/dashboard/dist/assets/ScanStationPage-DzGaXc40.js.map +0 -1
  270. package/dashboard/dist/assets/WorkflowExecutionPage-B8g81FCJ.js +0 -2
  271. package/dashboard/dist/assets/escalation-columns-cwZE6xyo.js +0 -2
  272. package/dashboard/dist/assets/escalation-columns-cwZE6xyo.js.map +0 -1
  273. package/dashboard/dist/assets/index-CeCtqujG.js.map +0 -1
  274. package/dashboard/dist/assets/index-CniRa65p.js +0 -3
  275. package/dashboard/dist/assets/index-CniRa65p.js.map +0 -1
  276. package/dashboard/dist/assets/index-CxdjT1Yk.js +0 -2
  277. package/dashboard/dist/assets/index-gkxPN7Vx.js +0 -13
  278. package/dashboard/dist/assets/index-m9A3UYst.css +0 -1
  279. package/dashboard/dist/assets/validate-BIRn4a6d.js +0 -2
  280. package/dashboard/dist/assets/validate-BIRn4a6d.js.map +0 -1
@@ -1,2 +0,0 @@
1
- import{j as e,a as i}from"./vendor-query-DvWWuNIB.js";import{am as J,bw as X,bx as te,M as Y,aj as v,$ as se,ap as ae,by as ne,bz as f,bA as re,ae as B}from"./index-CeCtqujG.js";import{a as _,bJ as le,as as z,be as ce,aK as ie,aJ as oe}from"./vendor-icons-CeVtUKyP.js";import{s as xe}from"./metadata-display-B7X5hGxG.js";import{F as de}from"./FormattedValue-k27T4bG7.js";import{a as me,u as ue}from"./vendor-react-_9U4mKFr.js";import"./UserName-D6zGIK2i.js";function he({stationName:t,primedName:a}){return e.jsxs("div",{className:"flex-1 flex flex-col items-center justify-center text-center py-24",children:[e.jsx(_,{className:"w-10 h-10 text-accent-muted mb-8",strokeWidth:1}),e.jsx("h1",{className:"text-3xl font-light text-text-primary tracking-tight",children:t}),e.jsx("div",{className:"w-16 border-t border-surface-border my-8"}),a?e.jsxs(e.Fragment,{children:[e.jsx("p",{className:"text-lg text-text-secondary",children:"Scan the next item"}),e.jsxs("p",{className:"text-sm text-text-tertiary mt-2",children:["Badged in as ",a]})]}):e.jsxs(e.Fragment,{children:[e.jsx("p",{className:"text-lg text-text-secondary",children:"Scan your badge to begin"}),e.jsx("p",{className:"text-sm text-text-tertiary mt-2",children:"or scan an item"})]})]})}function fe(t){const a=Math.floor(t/60),r=t%60;return`${a}:${String(r).padStart(2,"0")}`}function pe(){const{identity:t,remainingSeconds:a}=J(),[,r]=i.useState(0);return i.useEffect(()=>{if(!(t!=null&&t.expiresAt))return;const n=setInterval(()=>r(d=>d+1),1e3);return()=>clearInterval(n)},[t]),t?e.jsxs("div",{className:"flex items-center gap-2.5 pb-3 mb-6 border-b border-surface-border",children:[e.jsx(le,{className:"w-4 h-4 text-status-success shrink-0",strokeWidth:1.5}),e.jsxs("span",{className:"text-sm font-medium text-text-primary",children:["Hi ",t.displayName]}),t.expiresAt&&e.jsx("span",{className:"ml-auto text-sm font-mono tabular-nums text-text-tertiary",children:fe(a())})]}):null}function G(t,a){return!t.withheld||a}function je(t,a,r){return t.find(n=>!!n.code&&n.code===r&&G(n,a))??null}function ge(t){return t==null||t===""?"—":typeof t=="boolean"?t?"Yes":"No":typeof t=="object"?JSON.stringify(t):String(t)}function be({label:t,value:a,format:r}){return e.jsxs("div",{className:"flex items-baseline gap-4 py-2",children:[e.jsx("span",{className:"w-32 shrink-0 text-2xs uppercase tracking-wide text-text-quaternary",children:t}),e.jsx("span",{className:"text-sm text-text-primary break-words","data-testid":"station-fact-value",children:r?e.jsx(de,{raw:a,format:r}):a})]})}function M(){return e.jsx("span",{className:"text-text-quaternary select-none",children:"·"})}function ye({response:t,hasActingIdentity:a,selfId:r,busy:n,onExecute:d,onWithheldSelect:b}){var I,D;const{pushCodeInterceptor:w}=X(),[o,l]=i.useState(null),x=t.escalation??{},k=t.choices??[],F=x.metadata??{},T=s=>{s.confirm?l(s):d(s)},c=i.useRef({choices:k,hasActingIdentity:a,select:T});c.current={choices:k,hasActingIdentity:a,select:T},i.useEffect(()=>w(s=>{const y=c.current,C=je(y.choices,y.hasActingIdentity,s);return C?(y.select(C),!0):!1}),[w]);const p=x.assigned_to??null,S=p?p===r?"Claimed by you":"Claimed":"Unclaimed",j=p===r?"text-accent":"text-text-secondary",g=[x.type,x.subtype].filter(Boolean).join(" · "),u=t.facts?t.facts.map(s=>[s.label,s.value,s.format]):xe(F);return e.jsxs("div",{className:"flex-1 min-h-0 flex flex-col max-w-form",children:[e.jsxs("div",{children:[((I=t.rule)==null?void 0:I.name)&&e.jsx("div",{className:"text-2xs font-semibold uppercase tracking-widest text-accent mb-2",children:t.rule.name}),e.jsx("h2",{className:"text-2xl font-medium leading-tight text-text-primary mb-2",children:x.description||g||"Located item"}),e.jsxs("div",{className:"flex flex-wrap items-center gap-x-2 gap-y-1 text-xs text-text-secondary mb-5",children:[e.jsx("span",{children:String(x.role??"—")}),g&&e.jsxs(e.Fragment,{children:[e.jsx(M,{}),e.jsx("span",{children:g})]}),e.jsx(M,{}),e.jsx("span",{className:j,children:S}),typeof x.created_at=="string"&&e.jsxs(e.Fragment,{children:[e.jsx(M,{}),e.jsx("span",{children:te(x.created_at)})]})]}),u.length>0&&e.jsx("div",{className:"divide-y divide-surface-border border-t border-surface-border",children:u.map(([s,y,C],L)=>e.jsx(be,{label:s,value:ge(y),format:C},`${L}-${s}`))})]}),e.jsx("div",{className:"mt-8 space-y-3",children:k.map(s=>{const y=G(s,a);return e.jsx("div",{children:e.jsx("button",{type:"button",disabled:n,onClick:()=>y?T(s):b(s),className:"w-full text-left px-5 py-4 text-lg text-text-primary border border-surface-border rounded hover:bg-surface-sunken transition-colors disabled:opacity-40 disabled:cursor-not-allowed",children:e.jsxs("span",{className:"flex items-baseline gap-3",children:[s.label,s.code&&e.jsx("span",{className:"ml-auto text-2xs font-mono text-text-quaternary",children:s.code})]})})},s.index)})}),o&&e.jsx(Y,{open:!0,onClose:()=>l(null),title:o.label,children:e.jsxs("div",{className:"space-y-4",children:[e.jsx("p",{className:"text-sm text-text-secondary",children:(D=o.confirm)==null?void 0:D.prompt}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsx("button",{type:"button",onClick:()=>l(null),disabled:n,className:"btn-secondary text-xs",children:"No, go back"}),e.jsx("button",{type:"button",onClick:()=>{const s=o;l(null),d(s)},disabled:n,className:"btn-primary text-xs",children:"Yes, continue"})]})]})})]})}function Ne({choice:t,notPrimedMarkdown:a,primed:r,busy:n,onExecute:d,onCancel:b}){var x;const[w,o]=i.useState(!1),l=i.useRef(!1);return i.useEffect(()=>{if(!r){l.current=!1;return}l.current||(l.current=!0,t.confirm?o(!0):d(t))},[r,t,d]),e.jsxs("div",{className:"flex-1 flex flex-col items-center justify-center text-center py-24",children:[e.jsxs("div",{className:"flex items-center gap-4 mb-8",children:[e.jsx(_,{className:"w-8 h-8 text-text-quaternary",strokeWidth:1}),e.jsx(z,{className:"w-10 h-10 text-accent-muted",strokeWidth:1})]}),e.jsx("h2",{className:"text-2xl font-light text-text-primary tracking-tight",children:"Scan your badge to continue"}),e.jsxs("p",{className:"text-lg text-text-secondary mt-2",children:["to ",t.label]}),a&&e.jsx("div",{className:"text-sm text-text-tertiary mt-6 max-w-prose",children:e.jsx(v,{content:a,compact:!0})}),e.jsx("div",{className:"w-16 border-t border-surface-border my-8"}),e.jsx("button",{type:"button",onClick:b,disabled:n,className:"text-sm text-text-tertiary hover:text-text-secondary hover:underline",children:"Cancel"}),w&&e.jsx(Y,{open:!0,onClose:b,title:t.label,children:e.jsxs("div",{className:"space-y-4",children:[e.jsx("p",{className:"text-sm text-text-secondary",children:(x=t.confirm)==null?void 0:x.prompt}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsx("button",{type:"button",onClick:b,disabled:n,className:"btn-secondary text-xs",children:"No, go back"}),e.jsx("button",{type:"button",onClick:()=>{o(!1),d(t)},disabled:n,className:"btn-primary text-xs",children:"Yes, continue"})]})]})})]})}function we(t){return Math.max(0,Math.ceil((Date.parse(t)-Date.now())/1e3))}function ke({subject:t,primedName:a,progress:r,progressLabel:n="checked off",note:d,onRelease:b}){var l;const[,w]=i.useState(0);i.useEffect(()=>{const x=setInterval(()=>w(k=>k+1),1e3);return()=>clearInterval(x)},[]);const o=!!t.headline;return e.jsxs("div",{className:"flex-1 flex flex-col items-center justify-center text-center py-16 animate-page-enter","data-testid":"hold-screen",children:[o?e.jsxs(e.Fragment,{children:[e.jsxs("p",{className:"text-sm text-text-tertiary",children:["Holding ",e.jsx("span",{className:"font-mono text-text-secondary",children:t.label})]}),e.jsx("h1",{className:"mt-6 font-mono font-light text-7xl leading-none tracking-tight text-text-primary max-w-full break-all","data-testid":"hold-headline",children:t.headline}),t.subline&&e.jsx("p",{className:"heading-2 mt-4","data-testid":"hold-subline",children:t.subline})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex items-center gap-4 mb-8",children:[e.jsx(ce,{className:"w-10 h-10 text-accent-muted",strokeWidth:1}),e.jsx(_,{className:"w-8 h-8 text-text-quaternary",strokeWidth:1})]}),e.jsx("p",{className:"text-sm text-text-tertiary",children:"Holding"}),e.jsx("h1",{className:"text-3xl font-light text-text-primary tracking-tight mt-1 font-mono",children:t.label})]}),(l=t.expect)!=null&&l.prompt?e.jsx("div",{className:"text-lg text-text-secondary mt-8 max-w-prose",children:e.jsx(v,{content:t.expect.prompt,inherit:!0})}):e.jsx("p",{className:"text-lg text-text-secondary mt-8",children:"Scan where it goes"}),d?e.jsx("div",{className:"text-base text-text-primary mt-4","data-testid":"hold-progress",children:e.jsx(v,{content:d,inherit:!0})}):r&&r.total>0&&e.jsxs("p",{className:"text-base text-text-primary mt-4 tabular-nums","data-testid":"hold-progress",children:[r.filled," of ",r.total," ",n]}),t.claimedBy&&e.jsxs("p",{className:"text-sm text-status-warning mt-4",children:["Claimed by ",t.claimedBy.displayName]}),e.jsx("div",{className:"w-16 border-t border-surface-border my-8"}),e.jsxs("p",{className:"text-sm text-text-tertiary",children:[a?`Badge: ${a}`:"Scan your badge when you place it",e.jsx("span",{className:"mx-2",children:"·"}),e.jsxs("span",{className:"font-mono tabular-nums",children:[we(t.expiresAt),"s"]})]}),e.jsx("button",{type:"button",onClick:b,className:"mt-6 text-sm text-text-tertiary hover:text-text-secondary hover:underline",children:"Put it down"})]},t.escalationId)}function Se({markdown:t,expected:a}){return e.jsxs("div",{role:"alert",className:"flex-1 flex flex-col items-center justify-center text-center py-24","data-testid":"refusal-panel",children:[e.jsx(ie,{className:"w-12 h-12 text-status-error mb-8",strokeWidth:1.25}),e.jsx("div",{className:"text-2xl font-light text-text-primary tracking-tight max-w-prose",children:e.jsx(v,{content:t,inherit:!0})}),a&&a.length>0&&e.jsxs("p",{className:"text-base text-text-secondary mt-6",children:["Expected ",e.jsx("span",{className:"font-mono text-text-primary",children:a.join(", ")})]}),e.jsx("div",{className:"w-16 border-t border-surface-border my-8"}),e.jsx("p",{className:"text-sm text-text-tertiary",children:"Scan the right one to place it."})]})}function Ce({what:t,notPrimedMarkdown:a,onCancel:r}){return e.jsxs("div",{className:"flex-1 flex flex-col items-center justify-center text-center py-24","data-testid":"scan-badge-prompt",children:[e.jsxs("div",{className:"flex items-center gap-4 mb-8",children:[e.jsx(_,{className:"w-8 h-8 text-text-quaternary",strokeWidth:1}),e.jsx(z,{className:"w-10 h-10 text-accent-muted",strokeWidth:1})]}),e.jsx("h2",{className:"text-2xl font-light text-text-primary tracking-tight",children:"Scan your badge to finish"}),t&&e.jsx("p",{className:"text-lg text-text-secondary mt-2 font-mono",children:t}),a&&e.jsx("div",{className:"text-sm text-text-tertiary mt-6 max-w-prose",children:e.jsx(v,{content:a,compact:!0})}),e.jsx("div",{className:"w-16 border-t border-surface-border my-8"}),e.jsx("button",{type:"button",onClick:r,className:"text-sm text-text-tertiary hover:text-text-secondary hover:underline",children:"Cancel"})]})}function ve({markdown:t,nextPrompt:a}){return e.jsxs("div",{role:"status",className:"flex-1 flex flex-col items-center justify-center text-center py-24 animate-page-enter","data-testid":"done-panel",children:[e.jsx(oe,{className:"w-14 h-14 text-status-success-graphic mb-8",strokeWidth:1.25}),e.jsx("div",{className:"text-4xl font-light text-text-primary tracking-tight max-w-prose leading-snug",children:e.jsx(v,{content:t,inherit:!0})}),e.jsx("div",{className:"w-16 border-t border-surface-border my-8"}),e.jsx("p",{className:"text-lg text-text-secondary",children:a})]})}const Ee=8e3,Te=[B.SHOW_DETAIL,B.CLAIM,B.CLAIM_SHOW_DETAIL];function q(t){switch(t.outcome){case f.HELD:case f.REFUSED:case f.SUBJECT_STALE:return!0;case f.NOT_PRIMED:return!!t.replayable;case f.EXECUTED:return!!(t.clearSubject||t.progress);default:return!1}}function Me(){var R,U,W,O,$,H;const t=me(),a=ue(),{user:r}=se(),{identity:n,clear:d,settle:b}=J(),{viewerId:w}=ae(),{lastResult:o,subject:l,dropSubject:x,adoptResponse:k,pendingScan:F,dropPendingScan:T}=X(),[c,p]=i.useState(null),[S,j]=i.useState(null),[g,u]=i.useState(null),[I,D]=i.useState(!1);i.useEffect(()=>{var E,V;const m=(E=t.state)==null?void 0:E[ne];if(!m)return;p(m),u(null);const h=((V=m.choices)==null?void 0:V.length)===1?m.choices[0]:void 0;j(m.autoSelect&&h?{choice:h,returnTo:"idle"}:null),a(t.pathname,{replace:!0,state:null})},[t,a]);const s=(o==null?void 0:o.response)??null,y=(o==null?void 0:o.at)??0;i.useEffect(()=>{!s||!q(s)||(p(null),j(null),u(null),s.outcome===f.SUBJECT_STALE&&u({at:Date.now(),tone:"text-status-warning",text:s.error||"Scan it again."}))},[s,y]),i.useEffect(()=>{if(!g)return;const m=setTimeout(()=>u(null),Ee);return()=>clearTimeout(m)},[g]);const C=i.useCallback(async m=>{if(!(!(c!=null&&c.rule)||!c.escalation)){D(!0);try{const h=await re({schemeVersion:c.rule.schemeVersion,category:c.rule.category,stepIndex:c.stepIndex??0,choiceIndex:m.index,escalationId:String(c.escalation.id),actingToken:n==null?void 0:n.actingToken});switch(n!=null&&n.actingToken&&b(n.actingToken,h),k(h),h.outcome){case f.HELD:p(null),j(null);break;case f.EXECUTED:if(p(null),j(null),Te.includes(m.verb)&&h.escalation){a(`/escalations/detail/${h.escalation.id}`);break}u({at:Date.now(),tone:"text-status-success",text:`${m.label} — done`});break;case f.CONFLICT:p(null),j(null),u({at:Date.now(),tone:"text-status-warning",text:h.error||"The item changed since it was scanned — scan it again."});break;case f.UNCONFIGURED:p(null),j(null),u({at:Date.now(),tone:"text-status-warning",text:h.error||"This choice is no longer configured."});break;case f.NOT_PRIMED:d(),u(null),j(E=>({choice:m,returnTo:(E==null?void 0:E.returnTo)??"choices"}));break;default:u({at:Date.now(),tone:"text-status-error",text:h.error||"The choice did not run."})}}catch(h){u({at:Date.now(),tone:"text-status-error",text:h.message})}finally{D(!1)}}},[c,n,a,d,b,k]),L=i.useCallback(m=>{j({choice:m,returnTo:"choices"})},[]),K=i.useCallback(()=>{(S==null?void 0:S.returnTo)==="idle"&&p(null),j(null)},[S]),Q=(r==null?void 0:r.displayName)||(r==null?void 0:r.username)||"Scan station",Z=!!(c!=null&&c.choices&&c.escalation),A=(s==null?void 0:s.outcome)===f.REFUSED?s:null,N=(s==null?void 0:s.outcome)===f.EXECUTED&&q(s)?s:null,ee=l&&N?N.progress:null,P=N&&!l?((R=N.done)==null?void 0:R.markdown)??(N.already?"Already there.":"Done."):null;return e.jsxs("div",{className:"flex-1 min-h-0 flex flex-col",children:[e.jsx(pe,{}),S&&c?e.jsx(Ne,{choice:S.choice,notPrimedMarkdown:(U=c.notPrimed)==null?void 0:U.markdown,primed:!!n,busy:I,onExecute:C,onCancel:K}):F?e.jsx(Ce,{what:l?l.headline?`${l.label} → ${l.headline}`:l.label:null,notPrimedMarkdown:(W=s==null?void 0:s.notPrimed)==null?void 0:W.markdown,onCancel:T}):A?e.jsx(Se,{markdown:((O=A.refusal)==null?void 0:O.markdown)??A.error??"Not placed.",expected:($=A.refusal)==null?void 0:$.expected}):l?e.jsx(ke,{subject:l,primedName:(n==null?void 0:n.displayName)??null,progress:ee,progressLabel:(N==null?void 0:N.verb)===B.ACCUMULATE?"added":"checked off",note:l&&N?((H=N.done)==null?void 0:H.markdown)??null:null,onRelease:x}):P?e.jsx(ve,{markdown:P,nextPrompt:"Scan the next item"},y):Z?e.jsx(ye,{response:c,hasActingIdentity:!!n,selfId:w??null,busy:I,onExecute:C,onWithheldSelect:L},String(c.escalation.id)):e.jsx(he,{stationName:Q,primedName:(n==null?void 0:n.displayName)??null}),g&&e.jsxs("div",{role:"status",className:"mt-8 pt-3 border-t border-surface-border",children:[e.jsx("span",{className:`text-sm font-medium ${g.tone}`,children:g.text}),g.markdown&&e.jsx("div",{className:"text-sm text-text-secondary mt-1",children:e.jsx(v,{content:g.markdown,compact:!0})})]})]})}export{Me as ScanStationPage};
2
- //# sourceMappingURL=ScanStationPage-DzGaXc40.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ScanStationPage-DzGaXc40.js","sources":["../../src/components/scan/station/StationIdle.tsx","../../src/components/scan/station/PrimedChrome.tsx","../../src/components/scan/station/choice-code.ts","../../src/components/scan/station/InfoChoiceScreen.tsx","../../src/components/scan/station/BadgePrompt.tsx","../../src/components/scan/station/HoldScreen.tsx","../../src/components/scan/station/RefusalPanel.tsx","../../src/components/scan/station/ScanBadgePrompt.tsx","../../src/components/scan/station/DonePanel.tsx","../../src/pages/scan/ScanStationPage.tsx"],"sourcesContent":["import { ScanBarcode } from 'lucide-react';\n\n/**\n * The station at rest: large, calm typography. The station is named for the\n * logged-in account. Before a badge, it asks for one; with a badge live, it\n * asks for the next item.\n */\nexport function StationIdle({ stationName, primedName }: { stationName: string; primedName?: string | null }) {\n return (\n <div className=\"flex-1 flex flex-col items-center justify-center text-center py-24\">\n <ScanBarcode className=\"w-10 h-10 text-accent-muted mb-8\" strokeWidth={1} />\n <h1 className=\"text-3xl font-light text-text-primary tracking-tight\">{stationName}</h1>\n <div className=\"w-16 border-t border-surface-border my-8\" />\n {primedName ? (\n <>\n <p className=\"text-lg text-text-secondary\">Scan the next item</p>\n <p className=\"text-sm text-text-tertiary mt-2\">Badged in as {primedName}</p>\n </>\n ) : (\n <>\n <p className=\"text-lg text-text-secondary\">Scan your badge to begin</p>\n <p className=\"text-sm text-text-tertiary mt-2\">or scan an item</p>\n </>\n )}\n </div>\n );\n}\n","import { useEffect, useState } from 'react';\nimport { BadgeCheck } from 'lucide-react';\nimport { useActingIdentity } from '../../../hooks/useActingIdentity';\n\nfunction formatMmSs(totalSeconds: number): string {\n const m = Math.floor(totalSeconds / 60);\n const s = totalSeconds % 60;\n return `${m}:${String(s).padStart(2, '0')}`;\n}\n\n/**\n * Slim persistent strip while an acting identity is primed: the greeting and\n * a mm:ss countdown to the grant's expiry. The context clears itself at the\n * expiry instant — this chrome only renders. The per-second tick is a visible\n * wall clock, not data polling; it runs only while a grant is live.\n */\nexport function PrimedChrome() {\n const { identity, remainingSeconds } = useActingIdentity();\n const [, setTick] = useState(0);\n\n useEffect(() => {\n if (!identity?.expiresAt) return;\n const interval = setInterval(() => setTick((t) => t + 1), 1_000);\n return () => clearInterval(interval);\n }, [identity]);\n\n if (!identity) return null;\n\n return (\n <div className=\"flex items-center gap-2.5 pb-3 mb-6 border-b border-surface-border\">\n <BadgeCheck className=\"w-4 h-4 text-status-success shrink-0\" strokeWidth={1.5} />\n <span className=\"text-sm font-medium text-text-primary\">Hi {identity.displayName}</span>\n {identity.expiresAt && (\n <span className=\"ml-auto text-sm font-mono tabular-nums text-text-tertiary\">\n {formatMmSs(remainingSeconds())}\n </span>\n )}\n </div>\n );\n}\n","import type { ScanPresentedChoice } from '../../../api/scan-codes';\n\n/**\n * Whether a presented choice can act right now. The server withholds choices\n * whose identity requirement was unsatisfied at scan time; a badge primed\n * afterwards satisfies it, so the withholding lifts client-side without a\n * fresh present. A choice the server did not withhold stays enabled.\n */\nexport function isChoiceEnabled(choice: ScanPresentedChoice, hasActingIdentity: boolean): boolean {\n return !choice.withheld || hasActingIdentity;\n}\n\n/**\n * The enabled choice whose double-scan code exactly equals the raw emitted\n * string, or null. Choice codes are short tokens that never parse as scheme\n * codes, so an exact match is unambiguous; anything else falls through to\n * normal scan execution.\n */\nexport function matchChoiceByCode(\n choices: ScanPresentedChoice[],\n hasActingIdentity: boolean,\n raw: string,\n): ScanPresentedChoice | null {\n return (\n choices.find((c) => !!c.code && c.code === raw && isChoiceEnabled(c, hasActingIdentity)) ?? null\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport { Modal } from '../../common/modal/Modal';\nimport { useScanInput } from '../../../hooks/useScanInput';\nimport { formatTimeAgo } from '../../../lib/format';\nimport { stationFactEntries } from '../../../lib/metadata-display';\nimport { FormattedValue } from '../../common/display/FormattedValue';\nimport { isChoiceEnabled, matchChoiceByCode } from './choice-code';\nimport type { ScanExecuteResponse, ScanPresentedChoice } from '../../../api/scan-codes';\n\n/** Format a metadata leaf for display: booleans read as Yes/No, objects compact\n * to JSON, empty values show an em dash. */\nfunction formatFactValue(value: unknown): string {\n if (value == null || value === '') return '—';\n if (typeof value === 'boolean') return value ? 'Yes' : 'No';\n if (typeof value === 'object') return JSON.stringify(value);\n return String(value);\n}\n\nfunction FactRow({ label, value, format }: { label: string; value: string; format?: string }) {\n return (\n <div className=\"flex items-baseline gap-4 py-2\">\n <span className=\"w-32 shrink-0 text-2xs uppercase tracking-wide text-text-quaternary\">{label}</span>\n <span className=\"text-sm text-text-primary break-words\" data-testid=\"station-fact-value\">\n {format ? <FormattedValue raw={value} format={format} /> : value}\n </span>\n </div>\n );\n}\n\n/** Inline dot separator for the dense summary line. */\nfunction Dot() {\n return <span className=\"text-text-quaternary select-none\">·</span>;\n}\n\n/**\n * A PRESENT response, rendered whole. Upper half states the located item's\n * reality plainly; lower half offers the step's labeled choices as large\n * buttons. Withheld choices show the badge affordance and enable fully the\n * moment an acting identity primes. While mounted, this screen\n * takes first look at raw scans: a code matching an enabled choice selects it\n * (confirm still applies); everything else falls through to normal execution.\n * Tapping a withheld choice hands it to the caller as a pending action — the\n * badge stop-over collects the identity and executes it.\n */\nexport function InfoChoiceScreen({\n response,\n hasActingIdentity,\n selfId,\n busy,\n onExecute,\n onWithheldSelect,\n}: {\n response: ScanExecuteResponse;\n hasActingIdentity: boolean;\n selfId: string | null;\n busy: boolean;\n onExecute: (choice: ScanPresentedChoice) => void;\n onWithheldSelect: (choice: ScanPresentedChoice) => void;\n}) {\n const { pushCodeInterceptor } = useScanInput();\n const [pendingChoice, setPendingChoice] = useState<ScanPresentedChoice | null>(null);\n\n const escalation = (response.escalation ?? {}) as Record<string, unknown>;\n const choices = response.choices ?? [];\n const metadata = (escalation.metadata ?? {}) as Record<string, unknown>;\n\n const select = (choice: ScanPresentedChoice) => {\n if (choice.confirm) setPendingChoice(choice);\n else onExecute(choice);\n };\n\n // Live refs so the interceptor installed once sees current state — a badge\n // primed after mount enables withheld choices for double-scan selection too.\n const liveRef = useRef({ choices, hasActingIdentity, select });\n liveRef.current = { choices, hasActingIdentity, select };\n\n useEffect(() => pushCodeInterceptor((raw) => {\n const live = liveRef.current;\n const match = matchChoiceByCode(live.choices, live.hasActingIdentity, raw);\n if (!match) return false;\n live.select(match);\n return true;\n }), [pushCodeInterceptor]);\n\n const assignedTo = (escalation.assigned_to as string | null) ?? null;\n const claimState = !assignedTo ? 'Unclaimed' : assignedTo === selfId ? 'Claimed by you' : 'Claimed';\n const claimClass = assignedTo === selfId ? 'text-accent' : 'text-text-secondary';\n const typeLine = [escalation.type, escalation.subtype].filter(Boolean).join(' · ');\n // The step's curated facts when it declares them, else the row's metadata.\n const metaEntries: [string, unknown, string?][] = response.facts\n ? response.facts.map((f) => [f.label, f.value, f.format])\n : stationFactEntries(metadata);\n\n return (\n <div className=\"flex-1 min-h-0 flex flex-col max-w-form\">\n {/* Reality — the located item's identity up top, dense summary beneath,\n then its metadata as a clean definition list. */}\n <div>\n {response.rule?.name && (\n <div className=\"text-2xs font-semibold uppercase tracking-widest text-accent mb-2\">\n {response.rule.name}\n </div>\n )}\n <h2 className=\"text-2xl font-medium leading-tight text-text-primary mb-2\">\n {(escalation.description as string) || typeLine || 'Located item'}\n </h2>\n {/* Dense one-line summary of the system facts. */}\n <div className=\"flex flex-wrap items-center gap-x-2 gap-y-1 text-xs text-text-secondary mb-5\">\n <span>{String(escalation.role ?? '—')}</span>\n {typeLine && (<><Dot /><span>{typeLine}</span></>)}\n <Dot /><span className={claimClass}>{claimState}</span>\n {typeof escalation.created_at === 'string' && (\n <><Dot /><span>{formatTimeAgo(escalation.created_at)}</span></>\n )}\n </div>\n {metaEntries.length > 0 && (\n <div className=\"divide-y divide-surface-border border-t border-surface-border\">\n {metaEntries.map(([key, value, format], i) => (\n <FactRow key={`${i}-${key}`} label={key} value={formatFactValue(value)} format={format} />\n ))}\n </div>\n )}\n </div>\n\n {/* Choices — the human's tap (or a second scan) disambiguates */}\n <div className=\"mt-8 space-y-3\">\n {choices.map((choice) => {\n const enabled = isChoiceEnabled(choice, hasActingIdentity);\n // Withheld choices stay fully presented and tappable — the identity\n // requirement is collected on the ensuing badge screen, not announced\n // here (one instruction at a time keeps this screen clear).\n return (\n <div key={choice.index}>\n <button\n type=\"button\"\n disabled={busy}\n onClick={() => (enabled ? select(choice) : onWithheldSelect(choice))}\n className=\"w-full text-left px-5 py-4 text-lg text-text-primary border border-surface-border rounded hover:bg-surface-sunken transition-colors disabled:opacity-40 disabled:cursor-not-allowed\"\n >\n <span className=\"flex items-baseline gap-3\">\n {choice.label}\n {choice.code && (\n <span className=\"ml-auto text-2xs font-mono text-text-quaternary\">{choice.code}</span>\n )}\n </span>\n </button>\n </div>\n );\n })}\n </div>\n\n {pendingChoice && (\n <Modal open onClose={() => setPendingChoice(null)} title={pendingChoice.label}>\n <div className=\"space-y-4\">\n <p className=\"text-sm text-text-secondary\">{pendingChoice.confirm?.prompt}</p>\n <div className=\"flex justify-end gap-3 pt-2\">\n <button\n type=\"button\"\n onClick={() => setPendingChoice(null)}\n disabled={busy}\n className=\"btn-secondary text-xs\"\n >\n No, go back\n </button>\n <button\n type=\"button\"\n onClick={() => {\n const choice = pendingChoice;\n setPendingChoice(null);\n onExecute(choice);\n }}\n disabled={busy}\n className=\"btn-primary text-xs\"\n >\n Yes, continue\n </button>\n </div>\n </div>\n </Modal>\n )}\n </div>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport { IdCard, ScanBarcode } from 'lucide-react';\nimport { Modal } from '../../common/modal/Modal';\nimport { SimpleMarkdown } from '../../common/display/SimpleMarkdown';\nimport type { ScanPresentedChoice } from '../../../api/scan-codes';\n\n/**\n * The badge stop-over: a chosen action wants an acting identity that is not\n * primed yet. The screen holds the choice and waits — a badge scan flows\n * through the normal scan pipeline and primes the identity; the moment\n * `primed` flips true this component executes the pending choice (asking\n * first when the choice carries a confirm). Cancel hands control back to the\n * caller, which decides where to return.\n */\nexport function BadgePrompt({\n choice,\n notPrimedMarkdown,\n primed,\n busy,\n onExecute,\n onCancel,\n}: {\n choice: ScanPresentedChoice;\n notPrimedMarkdown?: string;\n primed: boolean;\n busy: boolean;\n onExecute: (choice: ScanPresentedChoice) => void;\n onCancel: () => void;\n}) {\n const [confirming, setConfirming] = useState(false);\n // One execution per priming — re-arms if the grant lapses before it lands.\n const firedRef = useRef(false);\n\n useEffect(() => {\n if (!primed) {\n firedRef.current = false;\n return;\n }\n if (firedRef.current) return;\n firedRef.current = true;\n if (choice.confirm) setConfirming(true);\n else onExecute(choice);\n }, [primed, choice, onExecute]);\n\n return (\n <div className=\"flex-1 flex flex-col items-center justify-center text-center py-24\">\n <div className=\"flex items-center gap-4 mb-8\">\n <ScanBarcode className=\"w-8 h-8 text-text-quaternary\" strokeWidth={1} />\n <IdCard className=\"w-10 h-10 text-accent-muted\" strokeWidth={1} />\n </div>\n <h2 className=\"text-2xl font-light text-text-primary tracking-tight\">\n Scan your badge to continue\n </h2>\n <p className=\"text-lg text-text-secondary mt-2\">to {choice.label}</p>\n {notPrimedMarkdown && (\n <div className=\"text-sm text-text-tertiary mt-6 max-w-prose\">\n <SimpleMarkdown content={notPrimedMarkdown} compact />\n </div>\n )}\n <div className=\"w-16 border-t border-surface-border my-8\" />\n <button\n type=\"button\"\n onClick={onCancel}\n disabled={busy}\n className=\"text-sm text-text-tertiary hover:text-text-secondary hover:underline\"\n >\n Cancel\n </button>\n\n {confirming && (\n <Modal open onClose={onCancel} title={choice.label}>\n <div className=\"space-y-4\">\n <p className=\"text-sm text-text-secondary\">{choice.confirm?.prompt}</p>\n <div className=\"flex justify-end gap-3 pt-2\">\n <button type=\"button\" onClick={onCancel} disabled={busy} className=\"btn-secondary text-xs\">\n No, go back\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setConfirming(false);\n onExecute(choice);\n }}\n disabled={busy}\n className=\"btn-primary text-xs\"\n >\n Yes, continue\n </button>\n </div>\n </div>\n </Modal>\n )}\n </div>\n );\n}\n","import { useEffect, useState } from 'react';\nimport { Package, ScanBarcode } from 'lucide-react';\nimport { SimpleMarkdown } from '../../common/display/SimpleMarkdown';\nimport type { StationSubject } from '../../../lib/scan-subject';\n\nfunction secondsLeft(expiresAt: string): number {\n return Math.max(0, Math.ceil((Date.parse(expiresAt) - Date.now()) / 1000));\n}\n\n/**\n * The station holding an item. With a headline (where the item goes) the\n * destination leads, read from across the bench: the container code largest, its\n * place name under it, the item itself as a quiet line above. Without one,\n * the item leads. The subject lapses on its own (the scan pipeline clears it\n * at expiry); the per-second tick is a visible clock, not polling.\n */\nexport function HoldScreen({\n subject,\n primedName,\n progress,\n progressLabel = 'checked off',\n note,\n onRelease,\n}: {\n subject: StationSubject;\n primedName: string | null;\n progress?: { filled: number; total: number; remaining: number } | null;\n /** What the count measures: a fill checks items off, an accumulate adds them. */\n progressLabel?: string;\n /** The last act's done copy while the item is still held (a fill in progress). */\n note?: string | null;\n onRelease: () => void;\n}) {\n const [, setTick] = useState(0);\n useEffect(() => {\n const interval = setInterval(() => setTick((t) => t + 1), 1_000);\n return () => clearInterval(interval);\n }, []);\n\n const destination = !!subject.headline;\n\n return (\n <div\n key={subject.escalationId}\n className=\"flex-1 flex flex-col items-center justify-center text-center py-16 animate-page-enter\"\n data-testid=\"hold-screen\"\n >\n {destination ? (\n <>\n <p className=\"text-sm text-text-tertiary\">\n Holding <span className=\"font-mono text-text-secondary\">{subject.label}</span>\n </p>\n <h1\n className=\"mt-6 font-mono font-light text-7xl leading-none tracking-tight text-text-primary max-w-full break-all\"\n data-testid=\"hold-headline\"\n >\n {subject.headline}\n </h1>\n {subject.subline && (\n <p className=\"heading-2 mt-4\" data-testid=\"hold-subline\">{subject.subline}</p>\n )}\n </>\n ) : (\n <>\n <div className=\"flex items-center gap-4 mb-8\">\n <Package className=\"w-10 h-10 text-accent-muted\" strokeWidth={1} />\n <ScanBarcode className=\"w-8 h-8 text-text-quaternary\" strokeWidth={1} />\n </div>\n <p className=\"text-sm text-text-tertiary\">Holding</p>\n <h1 className=\"text-3xl font-light text-text-primary tracking-tight mt-1 font-mono\">{subject.label}</h1>\n </>\n )}\n {subject.expect?.prompt ? (\n <div className=\"text-lg text-text-secondary mt-8 max-w-prose\">\n <SimpleMarkdown content={subject.expect.prompt} inherit />\n </div>\n ) : (\n <p className=\"text-lg text-text-secondary mt-8\">Scan where it goes</p>\n )}\n {note ? (\n <div className=\"text-base text-text-primary mt-4\" data-testid=\"hold-progress\">\n <SimpleMarkdown content={note} inherit />\n </div>\n ) : progress && progress.total > 0 && (\n <p className=\"text-base text-text-primary mt-4 tabular-nums\" data-testid=\"hold-progress\">\n {progress.filled} of {progress.total} {progressLabel}\n </p>\n )}\n {subject.claimedBy && (\n <p className=\"text-sm text-status-warning mt-4\">Claimed by {subject.claimedBy.displayName}</p>\n )}\n <div className=\"w-16 border-t border-surface-border my-8\" />\n <p className=\"text-sm text-text-tertiary\">\n {primedName ? `Badge: ${primedName}` : 'Scan your badge when you place it'}\n <span className=\"mx-2\">·</span>\n <span className=\"font-mono tabular-nums\">{secondsLeft(subject.expiresAt)}s</span>\n </p>\n <button\n type=\"button\"\n onClick={onRelease}\n className=\"mt-6 text-sm text-text-tertiary hover:text-text-secondary hover:underline\"\n >\n Put it down\n </button>\n </div>\n );\n}\n","import { CircleX } from 'lucide-react';\nimport { SimpleMarkdown } from '../../common/display/SimpleMarkdown';\n\n/**\n * A refused scan, with nothing written. The words name what is wrong and,\n * when the rule knows it, where the item goes instead. It stays until the\n * next scan, so the associate can read it after looking up from the bench.\n */\nexport function RefusalPanel({\n markdown,\n expected,\n}: {\n markdown: string;\n expected?: string[];\n}) {\n return (\n <div\n role=\"alert\"\n className=\"flex-1 flex flex-col items-center justify-center text-center py-24\"\n data-testid=\"refusal-panel\"\n >\n <CircleX className=\"w-12 h-12 text-status-error mb-8\" strokeWidth={1.25} />\n <div className=\"text-2xl font-light text-text-primary tracking-tight max-w-prose\">\n <SimpleMarkdown content={markdown} inherit />\n </div>\n {expected && expected.length > 0 && (\n <p className=\"text-base text-text-secondary mt-6\">\n Expected <span className=\"font-mono text-text-primary\">{expected.join(', ')}</span>\n </p>\n )}\n <div className=\"w-16 border-t border-surface-border my-8\" />\n <p className=\"text-sm text-text-tertiary\">Scan the right one to place it.</p>\n </div>\n );\n}\n","import { IdCard, ScanBarcode } from 'lucide-react';\nimport { SimpleMarkdown } from '../../common/display/SimpleMarkdown';\n\n/**\n * A scan that needs a badge first. The scan is held by the pipeline; the\n * badge scan primes the identity and the held scan replays on its own. The\n * order of scans never matters: item, badge, container and item, container,\n * badge both land.\n */\nexport function ScanBadgePrompt({\n what,\n notPrimedMarkdown,\n onCancel,\n}: {\n what: string | null;\n notPrimedMarkdown?: string;\n onCancel: () => void;\n}) {\n return (\n <div className=\"flex-1 flex flex-col items-center justify-center text-center py-24\" data-testid=\"scan-badge-prompt\">\n <div className=\"flex items-center gap-4 mb-8\">\n <ScanBarcode className=\"w-8 h-8 text-text-quaternary\" strokeWidth={1} />\n <IdCard className=\"w-10 h-10 text-accent-muted\" strokeWidth={1} />\n </div>\n <h2 className=\"text-2xl font-light text-text-primary tracking-tight\">Scan your badge to finish</h2>\n {what && <p className=\"text-lg text-text-secondary mt-2 font-mono\">{what}</p>}\n {notPrimedMarkdown && (\n <div className=\"text-sm text-text-tertiary mt-6 max-w-prose\">\n <SimpleMarkdown content={notPrimedMarkdown} compact />\n </div>\n )}\n <div className=\"w-16 border-t border-surface-border my-8\" />\n <button\n type=\"button\"\n onClick={onCancel}\n className=\"text-sm text-text-tertiary hover:text-text-secondary hover:underline\"\n >\n Cancel\n </button>\n </div>\n );\n}\n","import { CircleCheck } from 'lucide-react';\nimport { SimpleMarkdown } from '../../common/display/SimpleMarkdown';\n\n/**\n * A write that landed at the bench: what to do with the item now (\"Place it\n * in **C-12**.\"), large, until the next scan replaces it. Neutral surface;\n * the check carries the status.\n */\nexport function DonePanel({ markdown, nextPrompt }: { markdown: string; nextPrompt: string }) {\n return (\n <div\n role=\"status\"\n className=\"flex-1 flex flex-col items-center justify-center text-center py-24 animate-page-enter\"\n data-testid=\"done-panel\"\n >\n <CircleCheck className=\"w-14 h-14 text-status-success-graphic mb-8\" strokeWidth={1.25} />\n <div className=\"text-4xl font-light text-text-primary tracking-tight max-w-prose leading-snug\">\n <SimpleMarkdown content={markdown} inherit />\n </div>\n <div className=\"w-16 border-t border-surface-border my-8\" />\n <p className=\"text-lg text-text-secondary\">{nextPrompt}</p>\n </div>\n );\n}\n","import { useCallback, useEffect, useState } from 'react';\nimport { useLocation, useNavigate } from 'react-router-dom';\nimport { useAuth } from '../../hooks/useAuth';\nimport { useActingIdentity } from '../../hooks/useActingIdentity';\nimport { useViewerIdentity } from '../../hooks/useViewerIdentity';\nimport { SCAN_CHOICES_STATE, useScanInput } from '../../hooks/useScanInput';\nimport {\n executeScanChoice,\n SCAN_OUTCOMES,\n SCAN_VERBS,\n type ScanExecuteResponse,\n type ScanPresentedChoice,\n type ScanVerb,\n} from '../../api/scan-codes';\nimport {\n StationIdle,\n PrimedChrome,\n InfoChoiceScreen,\n BadgePrompt,\n HoldScreen,\n RefusalPanel,\n ScanBadgePrompt,\n DonePanel,\n} from '../../components/scan/station';\nimport { SimpleMarkdown } from '../../components/common/display/SimpleMarkdown';\n\nconst NOTICE_DISMISS_MS = 8_000;\n\n/** Choice verbs whose execution lands the person on the escalation's detail page. */\nconst DETAIL_VERBS: ScanVerb[] = [\n SCAN_VERBS.SHOW_DETAIL,\n SCAN_VERBS.CLAIM,\n SCAN_VERBS.CLAIM_SHOW_DETAIL,\n];\n\n/** Responses from the bench motion (hold, place, refuse); badge scans and choices are not. */\nfunction isBenchResponse(response: ScanExecuteResponse): boolean {\n switch (response.outcome) {\n case SCAN_OUTCOMES.HELD:\n case SCAN_OUTCOMES.REFUSED:\n case SCAN_OUTCOMES.SUBJECT_STALE:\n return true;\n case SCAN_OUTCOMES.NOT_PRIMED:\n return !!response.replayable;\n case SCAN_OUTCOMES.EXECUTED:\n return !!(response.clearSubject || response.progress);\n default:\n return false;\n }\n}\n\ninterface StationNotice {\n at: number;\n tone: string;\n text: string;\n markdown?: string;\n}\n\n/** A choice waiting on a badge, and where Cancel returns. */\ninterface PendingBadge {\n choice: ScanPresentedChoice;\n returnTo: 'choices' | 'idle';\n}\n\n/**\n * The scan station: a full-page surface for badge + item work. Idle until a\n * scan presents an item's reality and choices; a badge scan primes an acting\n * identity that unlocks withheld choices and rides along on executions. A\n * choice that needs a badge first parks in the stop-over (BadgePrompt) — one\n * badge scan primes the identity and the pending choice executes itself.\n * Claim and show choices land on the escalation's detail page for the work.\n */\nexport function ScanStationPage() {\n const location = useLocation();\n const navigate = useNavigate();\n const { user } = useAuth();\n const { identity, clear, settle } = useActingIdentity();\n const { viewerId } = useViewerIdentity();\n const { lastResult, subject, dropSubject, adoptResponse, pendingScan, dropPendingScan } = useScanInput();\n const [screen, setScreen] = useState<ScanExecuteResponse | null>(null);\n const [pendingBadge, setPendingBadge] = useState<PendingBadge | null>(null);\n const [notice, setNotice] = useState<StationNotice | null>(null);\n const [busy, setBusy] = useState(false);\n\n // Adopt a CHOICES response arriving in route state, then drop it from\n // history so refresh/back land on the idle station, never a stale reality.\n // An autoSelect response skips the choice screen: the server would have\n // executed its single choice but identity stopped it — straight to the\n // stop-over with that choice pending; Cancel returns to idle.\n useEffect(() => {\n const incoming = (location.state as Record<string, unknown> | null)\n ?.[SCAN_CHOICES_STATE] as ScanExecuteResponse | undefined;\n if (!incoming) return;\n setScreen(incoming);\n setNotice(null);\n const single = incoming.choices?.length === 1 ? incoming.choices[0] : undefined;\n setPendingBadge(incoming.autoSelect && single ? { choice: single, returnTo: 'idle' } : null);\n navigate(location.pathname, { replace: true, state: null });\n }, [location, navigate]);\n\n // A bench scan (hold, refusal, placed) replaces whatever the station showed.\n const bench = lastResult?.response ?? null;\n const benchAt = lastResult?.at ?? 0;\n useEffect(() => {\n if (!bench || !isBenchResponse(bench)) return;\n setScreen(null);\n setPendingBadge(null);\n setNotice(null);\n if (bench.outcome === SCAN_OUTCOMES.SUBJECT_STALE) {\n setNotice({ at: Date.now(), tone: 'text-status-warning', text: bench.error || 'Scan it again.' });\n }\n }, [bench, benchAt]);\n\n // Notices self-dismiss — one timeout keyed to the notice.\n useEffect(() => {\n if (!notice) return;\n const timer = setTimeout(() => setNotice(null), NOTICE_DISMISS_MS);\n return () => clearTimeout(timer);\n }, [notice]);\n\n const executeChoice = useCallback(async (choice: ScanPresentedChoice) => {\n if (!screen?.rule || !screen.escalation) return;\n setBusy(true);\n try {\n const result = await executeScanChoice({\n schemeVersion: screen.rule.schemeVersion,\n category: screen.rule.category,\n stepIndex: screen.stepIndex ?? 0,\n choiceIndex: choice.index,\n escalationId: String(screen.escalation.id),\n actingToken: identity?.actingToken,\n });\n // A claim spends the badge: retire it when the server says none is left.\n if (identity?.actingToken) settle(identity.actingToken, result);\n adoptResponse(result);\n switch (result.outcome) {\n case SCAN_OUTCOMES.HELD:\n setScreen(null);\n setPendingBadge(null);\n break;\n case SCAN_OUTCOMES.EXECUTED:\n setScreen(null);\n setPendingBadge(null);\n if (DETAIL_VERBS.includes(choice.verb) && result.escalation) {\n // The claim (or show) landed — go work the item where it lives.\n navigate(`/escalations/detail/${result.escalation.id}`);\n break;\n }\n // Done — back to idle, ready for the next item.\n setNotice({ at: Date.now(), tone: 'text-status-success', text: `${choice.label} — done` });\n break;\n case SCAN_OUTCOMES.CONFLICT:\n // Someone else won the row; the presented reality is stale.\n setScreen(null);\n setPendingBadge(null);\n setNotice({\n at: Date.now(),\n tone: 'text-status-warning',\n text: result.error || 'The item changed since it was scanned — scan it again.',\n });\n break;\n case SCAN_OUTCOMES.UNCONFIGURED:\n setScreen(null);\n setPendingBadge(null);\n setNotice({\n at: Date.now(),\n tone: 'text-status-warning',\n text: result.error || 'This choice is no longer configured.',\n });\n break;\n case SCAN_OUTCOMES.NOT_PRIMED:\n // The grant died between render and tap — reflect that, then park\n // the choice in the stop-over; the next badge scan satisfies it.\n clear();\n setNotice(null);\n setPendingBadge((prev) => ({ choice, returnTo: prev?.returnTo ?? 'choices' }));\n break;\n default:\n setNotice({\n at: Date.now(),\n tone: 'text-status-error',\n text: result.error || 'The choice did not run.',\n });\n }\n } catch (err: any) {\n setNotice({ at: Date.now(), tone: 'text-status-error', text: err.message });\n } finally {\n setBusy(false);\n }\n }, [screen, identity, navigate, clear, settle, adoptResponse]);\n\n const holdForBadge = useCallback((choice: ScanPresentedChoice) => {\n setPendingBadge({ choice, returnTo: 'choices' });\n }, []);\n\n const cancelBadge = useCallback(() => {\n if (pendingBadge?.returnTo === 'idle') setScreen(null);\n setPendingBadge(null);\n }, [pendingBadge]);\n\n const stationName = user?.displayName || user?.username || 'Scan station';\n const showChoices = !!(screen?.choices && screen.escalation);\n const refusal = bench?.outcome === SCAN_OUTCOMES.REFUSED ? bench : null;\n const executedBench = bench?.outcome === SCAN_OUTCOMES.EXECUTED && isBenchResponse(bench) ? bench : null;\n const progress = subject && executedBench ? executedBench.progress : null;\n const doneMarkdown = executedBench && !subject\n ? executedBench.done?.markdown ?? (executedBench.already ? 'Already there.' : 'Done.')\n : null;\n\n return (\n <div className=\"flex-1 min-h-0 flex flex-col\">\n <PrimedChrome />\n {pendingBadge && screen ? (\n <BadgePrompt\n choice={pendingBadge.choice}\n notPrimedMarkdown={screen.notPrimed?.markdown}\n primed={!!identity}\n busy={busy}\n onExecute={executeChoice}\n onCancel={cancelBadge}\n />\n ) : pendingScan ? (\n <ScanBadgePrompt\n what={subject ? (subject.headline ? `${subject.label} → ${subject.headline}` : subject.label) : null}\n notPrimedMarkdown={bench?.notPrimed?.markdown}\n onCancel={dropPendingScan}\n />\n ) : refusal ? (\n <RefusalPanel\n markdown={refusal.refusal?.markdown ?? refusal.error ?? 'Not placed.'}\n expected={refusal.refusal?.expected}\n />\n ) : subject ? (\n <HoldScreen\n subject={subject}\n primedName={identity?.displayName ?? null}\n progress={progress}\n progressLabel={executedBench?.verb === SCAN_VERBS.ACCUMULATE ? 'added' : 'checked off'}\n note={subject && executedBench ? executedBench.done?.markdown ?? null : null}\n onRelease={dropSubject}\n />\n ) : doneMarkdown ? (\n <DonePanel key={benchAt} markdown={doneMarkdown} nextPrompt=\"Scan the next item\" />\n ) : showChoices ? (\n <InfoChoiceScreen\n key={String(screen!.escalation!.id)}\n response={screen!}\n hasActingIdentity={!!identity}\n selfId={viewerId ?? null}\n busy={busy}\n onExecute={executeChoice}\n onWithheldSelect={holdForBadge}\n />\n ) : (\n <StationIdle stationName={stationName} primedName={identity?.displayName ?? null} />\n )}\n {notice && (\n <div role=\"status\" className=\"mt-8 pt-3 border-t border-surface-border\">\n <span className={`text-sm font-medium ${notice.tone}`}>{notice.text}</span>\n {notice.markdown && (\n <div className=\"text-sm text-text-secondary mt-1\">\n <SimpleMarkdown content={notice.markdown} compact />\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n"],"names":["StationIdle","stationName","primedName","jsxs","jsx","ScanBarcode","Fragment","formatMmSs","totalSeconds","m","s","PrimedChrome","identity","remainingSeconds","useActingIdentity","setTick","useState","useEffect","interval","t","BadgeCheck","isChoiceEnabled","choice","hasActingIdentity","matchChoiceByCode","choices","raw","c","formatFactValue","value","FactRow","label","format","FormattedValue","Dot","InfoChoiceScreen","response","selfId","busy","onExecute","onWithheldSelect","pushCodeInterceptor","useScanInput","pendingChoice","setPendingChoice","escalation","metadata","select","liveRef","useRef","live","match","assignedTo","claimState","claimClass","typeLine","metaEntries","f","stationFactEntries","_a","formatTimeAgo","key","i","enabled","Modal","_b","BadgePrompt","notPrimedMarkdown","primed","onCancel","confirming","setConfirming","firedRef","IdCard","SimpleMarkdown","secondsLeft","expiresAt","HoldScreen","subject","progress","progressLabel","note","onRelease","destination","Package","RefusalPanel","markdown","expected","CircleX","ScanBadgePrompt","what","DonePanel","nextPrompt","CircleCheck","NOTICE_DISMISS_MS","DETAIL_VERBS","SCAN_VERBS","isBenchResponse","SCAN_OUTCOMES","ScanStationPage","location","useLocation","navigate","useNavigate","user","useAuth","clear","settle","viewerId","useViewerIdentity","lastResult","dropSubject","adoptResponse","pendingScan","dropPendingScan","screen","setScreen","pendingBadge","setPendingBadge","notice","setNotice","setBusy","incoming","SCAN_CHOICES_STATE","single","bench","benchAt","timer","executeChoice","useCallback","result","executeScanChoice","prev","err","holdForBadge","cancelBadge","showChoices","refusal","executedBench","doneMarkdown","_c","_d","_e","_f"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{a as w,j as e}from"./vendor-query-DvWWuNIB.js";import{P as d,g as b,D as F,h as O,i as Q,J as _,aF as M,n as z,q as H,aG as J}from"./index-CeCtqujG.js";import{u as Y,E as q}from"./EventTable-D1-ITVXS.js";import{b as K,e as G}from"./tasks-BO6h8GJE.js";import{P as Z}from"./PageHeader-CMd3f4bz.js";import{S as X}from"./SegmentedTabs-BpJh4Hwn.js";import{L as ee}from"./ListToolbar-gA5rFzkz.js";import{S as te,a as se}from"./StatusBadge-DHVwxre2.js";import{C as y}from"./CopyableId-Bn02zYxt.js";import{Q as S,aC as ae,V as ne,Y as re,_ as le,$ as oe,C as ie}from"./vendor-icons-CeVtUKyP.js";import{L as m,e as ce,u as de}from"./vendor-react-_9U4mKFr.js";import{S as xe}from"./SwimlaneTimeline-C50PsFoV.js";import"./FilterBar-ABC9ctin.js";import"./StreamMessageDetail-wX3i0aqs.js";function ue(t){const s=t.lastIndexOf("-");return s<=0?{taskQueue:t,workflowType:t}:{taskQueue:t.substring(0,s),workflowType:t.substring(s+1)}}function me({children:t}){return e.jsx("p",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-2",children:t})}function C({status:t}){return e.jsx("span",{className:`w-2.5 h-2.5 shrink-0 rounded-full dot-ring ${se[t]??"bg-status-active"}`,title:t})}function pe({escalations:t}){return e.jsx("div",{children:t.map(s=>e.jsxs(m,{to:`/escalations/detail/${s.id}`,className:"grid grid-cols-[auto_1fr_auto] items-center gap-x-3 py-2 border-b border-surface-border/40 last:border-b-0 group",children:[e.jsx(C,{status:s.status}),e.jsxs("span",{className:"min-w-0",children:[e.jsx("span",{className:"block text-xs font-mono text-text-primary group-hover:text-accent transition-colors truncate",title:s.type,children:s.type}),e.jsx("span",{className:"block text-2xs text-text-tertiary truncate",children:s.role})]}),e.jsx(b,{date:s.created_at,format:"relative",className:"text-2xs text-text-tertiary whitespace-nowrap text-right"})]},s.id))})}function fe({tasks:t}){return e.jsx("div",{children:t.map(s=>e.jsxs(m,{to:`/workflows/tasks/detail/${s.id}`,className:"grid grid-cols-[auto_1fr_auto] items-center gap-x-3 py-2 border-b border-surface-border/40 last:border-b-0 group",children:[e.jsx(C,{status:s.status}),e.jsxs("span",{className:"min-w-0",children:[e.jsx("span",{className:"block text-xs font-mono text-text-primary group-hover:text-accent transition-colors truncate",title:s.workflow_type,children:s.workflow_type}),e.jsx("span",{className:"block text-2xs text-text-tertiary truncate",children:s.lt_type})]}),e.jsx(b,{date:s.created_at,format:"relative",className:"text-2xs text-text-tertiary whitespace-nowrap text-right"})]},s.id))})}function he({execution:t,parentWorkflowId:s,childTasks:a,escalations:r,headerActions:l,open:i}){const u=r.length>0||a.length>0,[x,o]=w.useState(u?"escalations":"details"),{taskQueue:p,workflowType:j}=ue(t.workflow_type),f=[{id:"details",icon:S,label:"Details",content:e.jsxs("dl",{className:"space-y-3.5",children:[e.jsx(d,{label:"Status",children:e.jsx(te,{status:t.status})}),e.jsx(d,{label:"Workflow Type",children:e.jsx(y,{bare:!0,value:j,href:`/workflows/executions?entity=${encodeURIComponent(j)}`})}),e.jsx(d,{label:"Workflow ID",children:e.jsx(y,{bare:!0,value:t.workflow_id})}),s&&e.jsx(d,{label:"Parent",children:e.jsx(y,{bare:!0,value:s,href:`/workflows/executions/${s}`})}),e.jsx(d,{label:"Task Queue",children:e.jsx("span",{className:"font-mono",children:p})}),e.jsx(d,{label:"Start Time",children:t.start_time?e.jsx(b,{date:t.start_time,format:"datetime"}):e.jsx("span",{className:"text-text-tertiary",children:"--"})}),e.jsx(d,{label:"End Time",children:t.close_time?e.jsx(b,{date:t.close_time,format:"datetime"}):e.jsx("span",{className:"text-text-tertiary",children:"--"})}),e.jsx(d,{label:"Duration",children:e.jsx(F,{ms:t.duration_ms,className:"font-mono"})}),e.jsxs(d,{label:"History Size",children:[t.summary.total_events," events"]}),e.jsxs(d,{label:"Activities",children:[t.summary.activities.completed," / ",t.summary.activities.total]})]})},{id:"escalations",icon:ae,label:"Escalations",content:e.jsxs("div",{className:"space-y-6",children:[e.jsx("div",{children:r.length>0?e.jsx(pe,{escalations:r}):e.jsx("p",{className:"text-xs text-text-tertiary italic",children:"This workflow has not escalated."})}),a.length>0&&e.jsxs("div",{children:[e.jsx(me,{children:"Related Tasks"}),e.jsx(fe,{tasks:a})]})]})}];return e.jsx(O,{open:i,width:384,className:"h-full",children:e.jsx("div",{className:"h-full pl-6",children:e.jsx(Q,{views:f,activeId:x,onViewChange:o,headerActions:l,stickyClassName:"h-full min-h-0",labelInline:!0})})})}function we(t){var r;const s=t.events.find(l=>l.event_type==="workflow_execution_started"),a=(r=s==null?void 0:s.attributes)==null?void 0:r.input;return a&&typeof a=="object"?a:null}function je({execution:t}){const s=we(t),a=t.result,r=(a==null?void 0:a.data)??a??null;return!s&&!r?null:e.jsxs("div",{className:"grid grid-cols-1 @form-cols:grid-cols-2 gap-4 mb-6",children:[s!==null&&e.jsx("div",{children:e.jsx(_,{data:s,label:"Input Envelope"})}),r!==null&&e.jsx("div",{children:e.jsx(_,{data:r,label:"Result"})})]})}const be=["details","timeline","events"],T="lt:workflow-execution:tab";function ve({isRunning:t,hasToolCalls:s,workflowId:a,onAction:r}){const[l,i]=w.useState(!1),u=w.useRef(null);return w.useEffect(()=>{if(!l)return;const x=o=>{u.current&&!u.current.contains(o.target)&&i(!1)};return document.addEventListener("mousedown",x),()=>document.removeEventListener("mousedown",x)},[l]),e.jsxs("div",{className:"relative",ref:u,children:[e.jsxs("button",{onClick:()=>i(!l),className:"flex items-center gap-0.5 pl-2 pr-1 py-1 rounded-md text-2xs font-medium text-accent hover:text-accent-hover hover:bg-surface-hover transition-colors",title:"Actions",children:["Actions",e.jsx(ie,{className:`w-3 h-3 transition-transform ${l?"rotate-180":""}`})]}),l&&e.jsxs("div",{className:"absolute right-0 mt-1 w-44 bg-surface-raised border border-surface-border rounded-md shadow-lg z-[100]",children:[e.jsx("button",{onClick:()=>{r("restart"),i(!1)},className:"block w-full text-left px-4 py-2 text-xs text-text-secondary hover:bg-surface-hover",children:"Restart Workflow"}),t&&e.jsx("button",{onClick:()=>{r("terminate"),i(!1)},className:"block w-full text-left px-4 py-2 text-xs text-status-error hover:bg-surface-hover",children:"Terminate"}),s&&e.jsx(m,{to:`/mcp/queries/${a}?step=3`,className:"block w-full text-left px-4 py-2 text-xs text-accent hover:bg-surface-hover",onClick:()=>i(!1),children:"Compile into Pipeline"}),e.jsx(m,{to:`/mcp/executions/${encodeURIComponent(a)}?namespace=durable`,className:"block w-full text-left px-4 py-2 text-xs text-text-secondary hover:bg-surface-hover",onClick:()=>i(!1),children:"View Pipeline Execution"}),e.jsx(m,{to:`/admin/streams?source=worker&jid=${encodeURIComponent(a)}`,className:"block w-full text-left px-4 py-2 text-xs text-text-secondary hover:bg-surface-hover",onClick:()=>i(!1),children:"Worker Messages"}),e.jsx(m,{to:`/admin/streams?source=engine&jid=${encodeURIComponent(a)}`,className:"block w-full text-left px-4 py-2 text-xs text-text-secondary hover:bg-surface-hover",onClick:()=>i(!1),children:"Engine Messages"})]})]})}function Ae(){const{workflowId:t}=ce();M(t);const s="Workflow Execution",{data:a,isLoading:r,error:l,refetch:i,isFetching:u}=z(t),{data:x}=K(t),{data:o}=G(t),{data:p}=H(t),j=de(),f=J(),{isCollapsed:E,toggle:I}=Y("workflow-execution"),[h,P]=w.useState(()=>{try{const n=localStorage.getItem(T);return n&&be.includes(n)?n:"details"}catch{return"details"}}),R=n=>{P(n);try{localStorage.setItem(T,n)}catch{}},W=n=>{var c;if(n==="terminate")confirm("Are you sure you want to terminate this workflow?")&&f.mutate(t);else if(n==="restart"&&a){const U=a.workflow_id.replace(/-[A-Za-z0-9_-]{20,}$/,""),g=a.events.find(B=>B.event_type==="workflow_execution_started"),N=(c=g==null?void 0:g.attributes)==null?void 0:c.input;N&&sessionStorage.setItem("lt:invoke:prefill",JSON.stringify(N)),j(`/workflows/start?type=${encodeURIComponent(U)}&mode=now`)}};if(r)return e.jsxs("div",{className:"animate-pulse space-y-4",children:[e.jsx("div",{className:"h-8 bg-surface-sunken rounded w-64"}),e.jsx("div",{className:"h-60 bg-surface-sunken rounded"})]});if(l||!a){const n=(l==null?void 0:l.message)??"",c=n.includes("expired")||n.includes("no longer available");return e.jsxs("div",{children:[e.jsx(m,{to:"/workflows/executions",className:"text-xs text-text-tertiary hover:text-text-primary",children:"← Workflows"}),e.jsxs("div",{className:"mt-4 text-center py-8",children:[e.jsx("p",{className:"text-sm text-text-primary mb-1",children:c?"Execution data is no longer available":l?"Unable to load execution":"Execution not found"}),e.jsx("p",{className:"text-xs text-text-tertiary",children:c?"This workflow's underlying job has expired. The task record is preserved, but the execution timeline has been cleaned up.":n||"The workflow could not be resolved."})]})]})}const $=a.status!=="completed"&&a.status!=="failed",v=!E("side-panel"),A=a.parent_workflow_id,L=x&&x.workflow_id===a.workflow_id,k=A||(L?x.parent_workflow_id:null)||null,V=k&&k!==a.workflow_id?k:null,D=a.status==="completed"&&a.events.some(n=>{if(n.event_type!=="activity_task_completed")return!1;const c=n.attributes.activity_type;return c==="callDbTool"||c==="callVisionTool"||c==="callMcpTool"||(c==null?void 0:c.startsWith("mcp_"))});return e.jsxs("div",{className:"flex-1 min-h-0 min-w-0 flex items-stretch -mt-8 -mr-page-x -mb-16",children:[e.jsxs("div",{className:"flex-1 min-w-0 flex flex-col min-h-0",children:[e.jsxs("div",{className:"shrink-0 pt-8 pr-page-x",children:[e.jsx(Z,{title:s,actions:e.jsx("button",{onClick:()=>I("side-panel"),className:"text-accent/60 hover:text-accent transition-colors",title:v?"Hide side panel":"Show side panel",children:v?e.jsx(ne,{className:"w-5 h-5",strokeWidth:1.5}):e.jsx(re,{className:"w-5 h-5",strokeWidth:1.5})})}),f.error&&e.jsxs("p",{className:"text-xs text-status-error py-2",children:["Terminate failed: ",f.error.message]}),e.jsx("div",{className:"mt-2",children:e.jsx(X,{"aria-label":"Execution section",active:h,onChange:R,tabs:[{key:"details",label:"Details",icon:e.jsx(S,{className:"w-3.5 h-3.5"})},{key:"timeline",label:"Execution Timeline",icon:e.jsx(le,{className:"w-3.5 h-3.5"})},{key:"events",label:"Events",icon:e.jsx(oe,{className:"w-3.5 h-3.5"})}]})})]}),e.jsxs("div",{className:"flex-1 min-h-0 overflow-y-auto pr-page-x pt-6 pb-16 animate-page-in",children:[h==="details"&&e.jsx(je,{execution:a}),h==="timeline"&&e.jsx(xe,{events:a.events,childTasks:o==null?void 0:o.tasks,jid:t,appId:"durable"}),h==="events"&&e.jsx(q,{events:a.events,childTasks:o==null?void 0:o.tasks,jid:t,appId:"durable"})]},h)]}),e.jsx(he,{execution:a,parentWorkflowId:V,childTasks:(o==null?void 0:o.tasks)??[],escalations:(p==null?void 0:p.escalations)??[],headerActions:e.jsxs(e.Fragment,{children:[e.jsx(ee,{onRefresh:()=>i(),isFetching:u,apiPath:`/workflow-states/${t}/execution`}),e.jsx(ve,{isRunning:$,hasToolCalls:D,workflowId:t,onAction:W})]}),open:v})]})}export{Ae as WorkflowExecutionPage};
2
- //# sourceMappingURL=WorkflowExecutionPage-B8g81FCJ.js.map
@@ -1,2 +0,0 @@
1
- import{a as L,j as e,u as le}from"./vendor-query-DvWWuNIB.js";import{a as O,H as Se,g as oe,S as V,r as M,G as I,f as Te,h as ce,I as Ce,j as Z,R as de,k as Y,l as Oe,s as Le,M as _e,n as Ee,i as $e}from"./validate-BIRn4a6d.js";import{M as Fe,bd as G,m as xe,a0 as Me,be as Ie,ah as J,a9 as Pe,g as Re,a$ as Ae,aZ as qe,ai as ee}from"./index-CeCtqujG.js";import{E as $,F as H,i as De}from"./FormattedValue-k27T4bG7.js";import{S as te}from"./StickyPagination-CqbjVY6T.js";import{b as ue,ab as Ke,e as We,ax as He,aC as Be,bH as A,ar as Ue,aB as Ve}from"./vendor-icons-CeVtUKyP.js";import{D as me}from"./DataTable-FjFhx0SE.js";import{L as z,u as Q}from"./vendor-react-_9U4mKFr.js";import{a as Ge,C as Je}from"./CountdownTimer-LG03dVgR.js";import{E as ze}from"./EntityTimelinePanel-CDFFfX9d.js";import{F as Ye,b as K,c as W,a as Qe}from"./FilterBar-ABC9ctin.js";import{P as Xe}from"./PriorityBadge-r33mpDju.js";import{R as Ze}from"./RolePill-Di2CAHuD.js";import{W as et}from"./WorkflowPill-Dg7BDTyM.js";import{U as tt}from"./UserName-D6zGIK2i.js";const se=[{text:"text-rose-400",bg:"bg-rose-400/[0.08]"},{text:"text-pink-400",bg:"bg-pink-400/[0.08]"},{text:"text-fuchsia-400",bg:"bg-fuchsia-400/[0.08]"},{text:"text-purple-400",bg:"bg-purple-400/[0.08]"},{text:"text-violet-400",bg:"bg-violet-400/[0.08]"},{text:"text-indigo-400",bg:"bg-indigo-400/[0.08]"},{text:"text-blue-400",bg:"bg-blue-400/[0.08]"},{text:"text-sky-400",bg:"bg-sky-400/[0.08]"},{text:"text-cyan-400",bg:"bg-cyan-400/[0.08]"},{text:"text-teal-400",bg:"bg-teal-400/[0.08]"},{text:"text-emerald-400",bg:"bg-emerald-400/[0.08]"},{text:"text-green-400",bg:"bg-green-400/[0.08]"},{text:"text-lime-400",bg:"bg-lime-400/[0.08]"},{text:"text-yellow-400",bg:"bg-yellow-400/[0.08]"},{text:"text-amber-400",bg:"bg-amber-400/[0.08]"},{text:"text-orange-400",bg:"bg-orange-400/[0.08]"},{text:"text-red-400",bg:"bg-red-400/[0.08]"},{text:"text-stone-400",bg:"bg-stone-400/[0.08]"},{text:"text-rose-300",bg:"bg-rose-300/[0.08]"},{text:"text-violet-300",bg:"bg-violet-300/[0.08]"},{text:"text-sky-300",bg:"bg-sky-300/[0.08]"},{text:"text-teal-300",bg:"bg-teal-300/[0.08]"},{text:"text-amber-300",bg:"bg-amber-300/[0.08]"},{text:"text-pink-300",bg:"bg-pink-300/[0.08]"}];function st(t){let s=0;for(let n=0;n<t.length;n++)s=(s<<5)-s+t.charCodeAt(n)|0;return Math.abs(s)}function at(t){return se[st(t)%se.length]}const nt=6;function pe({open:t,onClose:s,role:n,pairs:a,onNavigate:r,onAddFacet:i}){const[l,p]=L.useState(new Set),[c,x]=L.useState(""),[u,h]=L.useState(t);if(t!==u&&(h(t),t)){const d=a.filter(N=>N.bound),b=d.length===1?[d[0].key]:a.length===1?[a[0].key]:[];p(new Set(b)),x("")}const y=c.trim().toLowerCase(),j=y?a.filter(d=>[d.label,d.key,String(d.value)].some(b=>b.toLowerCase().includes(y))):a,k=d=>{p(b=>{const N=new Set(b);return N.has(d)?N.delete(d):N.add(d),N})},g=a.filter(d=>l.has(d.key)),w=Object.fromEntries(g.map(d=>[d.key,d.value])),m=g.length===0,f=d=>{s(),r(d)};return e.jsx(Fe,{open:t,onClose:s,title:"Refine",children:e.jsxs("div",{className:"space-y-4",children:[e.jsx("p",{className:"text-2xs text-text-tertiary",children:"Pick the facts to match — several combine into one narrower query."}),a.length>nt&&e.jsxs("label",{className:"flex items-center gap-2 input text-xs py-1.5",children:[e.jsx(ue,{className:"w-3.5 h-3.5 shrink-0 text-text-quaternary",strokeWidth:1.5}),e.jsx("input",{type:"text",value:c,onChange:d=>x(d.target.value),placeholder:"Find a fact…",className:"flex-1 min-w-0 bg-transparent outline-none placeholder:text-text-quaternary","aria-label":"Find a fact","data-testid":"refine-find"}),e.jsxs("span",{className:"text-2xs tabular-nums text-text-quaternary",children:[j.length,"/",a.length]})]}),e.jsx("div",{className:"divide-y divide-surface-border/40 -mx-1 max-h-[50vh] overflow-y-auto",children:j.map(d=>{const b=l.has(d.key);return e.jsxs("button",{type:"button",onClick:()=>k(d.key),"aria-pressed":b,className:"w-full flex items-center gap-3 px-1 py-2.5 text-left group min-w-0","data-testid":"refine-pair",children:[e.jsx("span",{className:`w-4 h-4 rounded-[3px] border flex items-center justify-center shrink-0 transition-colors ${b?"bg-accent border-accent":"border-surface-border group-hover:border-accent/50"}`,"aria-hidden":!0,children:b&&e.jsx(Ke,{className:"w-3 h-3 text-text-inverse",strokeWidth:3})}),e.jsx("span",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary w-28 shrink-0 truncate",title:d.key,children:d.label}),e.jsx("span",{className:"text-xs text-text-primary truncate flex-1 min-w-0",title:String(d.value),children:String(d.value)})]},d.key)})}),e.jsxs("div",{className:"flex items-center justify-end gap-3 pt-2 flex-wrap",children:[i&&e.jsx("button",{onClick:()=>{g.forEach(d=>i(d.key,d.value)),s()},disabled:m,className:"text-xs text-text-secondary hover:text-accent transition-colors disabled:opacity-40 disabled:cursor-not-allowed mr-auto","data-testid":"refine-add-filters",children:"Add to filters"}),e.jsx("button",{onClick:()=>f(G(w)),disabled:m,className:"btn-secondary text-xs disabled:opacity-40 disabled:cursor-not-allowed","data-testid":"refine-search-all",children:"Search everywhere"}),e.jsxs("button",{onClick:()=>f(G(w,n)),disabled:m,className:"btn-primary text-xs disabled:opacity-40 disabled:cursor-not-allowed","data-testid":"refine-filter-role",children:["Filter ",n]})]})]})})}function rt(t,s,n,a=!0){const r=[...s].sort();return le({queryKey:["escalations","related",t,n??"latest",r],queryFn:()=>xe("/escalations/related",{method:"POST",body:JSON.stringify({role:t,ids:r,...n!=null?{version:n}:{}})}),enabled:a&&!!t&&r.length>0,placeholderData:i=>i})}function it(t,s,n,a,r,i=!0){return le({queryKey:["escalations","related-rows",t,a??"latest",s,n,r??null],queryFn:()=>xe("/escalations/related/rows",{method:"POST",body:JSON.stringify({role:t,id:s,set:n,...a!=null?{version:a}:{},...r?{limit:r}:{}})}),enabled:i&&!!t&&!!s&&!!n})}const lt=/^\{\{\s*([^{}]+?)\s*\}\}$/,ot=/\{\{\s*[^{}]+?\s*\}\}/,ct="—";function U(t){if(t&&typeof t=="object")return t;if(typeof t!="string"||!t)return null;try{const s=JSON.parse(t);return s&&typeof s=="object"?s:null}catch{return null}}function he(t){return{escalation:t,metadata:t.metadata??{},envelope:U(t.envelope)??{},payload:U(t.escalation_payload)??{},resolver:U(t.resolver_payload)??{}}}function dt(t,s){const n=t.indexOf("."),a=n===-1?t:t.slice(0,n);if(!Se.includes(a))return;const r=s[a];if(n===-1)return r??void 0;try{return oe(r,t.slice(n+1))}catch{return}}function ae(t,s){if(typeof t!="string")return t;const n=t.match(lt);if(n){const r=dt(n[1],s);return r===null||r===""?void 0:r}if(!ot.test(t))return t;const a=O(t,s);return a.includes(ct)?void 0:a}function fe(t,s,n){const a={};for(const[r,i]of Object.entries(t)){const l=ae(i,s);if(l===void 0)return null;a[r]=l}for(const[r,i]of Object.entries(n??{})){const l=ae(i,s);l!==void 0&&(a[r]=l)}return a}function xt(t,s,n){var a,r;return(a=s.labels)!=null&&a[t]?s.labels[t]:s.splitBy===V.ROLE&&((r=n==null?void 0:n.roleLabels)!=null&&r[t])?n.roleLabels[t]:t===""?"None":t}function ut({col:t,set:s,agg:n,drillUrl:a}){if(!n||n.unresolved)return e.jsx("span",{className:"text-text-quaternary",children:$});const r=t.splitBy===V.ROLE&&(s!=null&&s.roles)?s.roles:null,i=Object.entries(n.splits??{}).filter(([,c])=>c>0).sort(([c,x],[u,h])=>r?r.indexOf(c)-r.indexOf(u):h-x),l=t.splitBy===V.ROLE?(s==null?void 0:s.restricted)??[]:[],p=[n.hidden?`${n.hidden} not readable by you`:"",l.length?`Not counted (outside your view): ${l.map(c=>{var x;return((x=s==null?void 0:s.roleLabels)==null?void 0:x[c])??c}).join(", ")}`:""].filter(Boolean).join(" · ");return e.jsxs("span",{className:"inline-flex flex-wrap items-center gap-1 min-w-0",title:p||void 0,"data-testid":"related-cell",children:[e.jsx("span",{className:"tabular-nums font-medium text-text-primary",children:n.count}),i.map(([c,x])=>{const u=`${xt(c,t,s)} ${x}`,h=r&&a?a(c):null,y="px-1.5 py-0.5 rounded bg-surface-sunken text-2xs text-text-secondary whitespace-nowrap tabular-nums";return h?e.jsx(z,{to:h,onClick:j=>j.stopPropagation(),className:`${y} hover:text-accent`,"data-testid":"related-chip",children:u},c):e.jsx("span",{className:y,"data-testid":"related-chip",children:u},c)}),(n.hidden||l.length>0)&&e.jsx("span",{className:"text-2xs text-text-quaternary italic","data-testid":"related-restricted",children:n.hidden&&!i.length?"split restricted":"partial"})]})}const mt="role";function ne(t,s){const n=s.escalation?M(s.escalation):{};return Ge(t,s.item,n)}function pt({role:t,host:s,version:n,section:a,roleLabels:r}){var k,g,w;const i=Q(),l=it(t,s.id,a.related,n,a.limit),p=((k=l.data)==null?void 0:k.rows)??[],c=((g=l.data)==null?void 0:g.roleLabels)??r??{},x=((w=l.data)==null?void 0:w.restricted)??[],u=new Set(Object.values(s.metadata??{}).filter(m=>typeof m=="string"&&m!==""||typeof m=="number"||typeof m=="boolean").map(String)),y=a.columns.filter((m,f)=>{if(f===0||p.length===0)return!0;const d=new Set(p.map(b=>ne(m.value,b)));return!(d.size===1&&u.has([...d][0]))}).map((m,f)=>({key:`d-${f}`,label:m.label,priority:m.priority??(f===0?1:2),render:d=>{const b=ne(m.value,d);return m.format===mt&&b!==$?e.jsx("span",{className:"block truncate",children:c[b]??Me({role:b})}):e.jsx("span",{className:"block truncate",title:b!==$?b:void 0,children:e.jsx(H,{raw:b,format:m.format})})}})),j=m=>{var f,d;return((f=m.escalation)==null?void 0:f.id)??((d=m.item)==null?void 0:d.reciprocalId)??null};return e.jsxs("div",{"data-testid":"row-detail-section",children:[e.jsxs("p",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary pt-3 pb-1",children:[a.label??a.related,l.data&&e.jsx("span",{className:"ml-2 font-normal normal-case tracking-normal tabular-nums",children:l.data.total})]}),l.isLoading?e.jsx("p",{className:"text-2xs text-text-tertiary italic pb-2",children:"Loading…"}):e.jsx(me,{columns:y,data:p,keyFn:m=>{var f,d;return((f=m.item)==null?void 0:f.itemKey)??String((d=m.escalation)==null?void 0:d.id)},onRowClick:m=>{const f=j(m);f&&i(`/escalations/detail/${f}`)},layout:"fixed",density:"compact",inline:!0,emptyMessage:""}),!l.isLoading&&p.length===0&&e.jsx("p",{className:"text-2xs text-text-quaternary italic pb-2",children:"None."}),l.data&&l.data.total>p.length&&e.jsxs("p",{className:"text-2xs text-text-quaternary pb-2",children:["Showing ",p.length," of ",l.data.total,"."]}),x.length>0&&e.jsxs("p",{className:"text-2xs text-text-quaternary italic pb-2",children:["Not shown (outside your view): ",x.map(m=>c[m]??m).join(", ")]})]})}function ht({role:t,host:s,version:n,sections:a}){return e.jsx("div",{className:"space-y-1","data-testid":"row-detail",children:a.map((r,i)=>e.jsx(pt,{role:t,host:s,version:n,section:r},i))})}function ft(t,s){return t.flatMap(n=>{if(n.rows.length<2||!s.has(n.key))return[n];const a=n.rows.map((r,i)=>({key:`${n.key}/${r.id}`,rows:[r],groupKey:n.groupKey,depth:1,lastChild:i===n.rows.length-1,parent:n}));return[n,...a]})}function bt(t,s){if(!s)return t.map(a=>({key:a.id,rows:[a],groupKey:null}));const n=new Map(t.map(a=>[a.id,a]));return s.map(a=>({key:a.key!=null?`group:${a.key}`:a.ids[0],rows:a.ids.map(r=>n.get(r)).filter(r=>!!r),groupKey:a.key})).filter(a=>a.rows.length>0)}function yt(t){const s=t.map(n=>Number(n));return s.every(n=>Number.isFinite(n))?s:null}function re(t,s){const n=t.group??I.FIRST;if(n===I.COUNT)return String(s.length);const a=s.map(l=>O(t.value,M(l))).filter(l=>l&&l!==$);if(n===I.DISTINCT)return a.length?[...new Set(a)].join(", "):$;if(n===I.FIRST||s.length===1)return a[0]??$;if(!a.length)return $;const r=yt(a);if(n===I.SUM)return r?String(r.reduce((l,p)=>l+p,0)):$;if(r)return String(n===I.MIN?Math.min(...r):Math.max(...r));const i=[...a].sort();return n===I.MIN?i[0]:i[i.length-1]}function gt(t){const s=t.filter(a=>!!a);if(!s.length)return;if(s.every(a=>a.unresolved))return{count:0,unresolved:!0};const n={count:0};for(const a of s)if(!a.unresolved&&(n.count+=a.count,a.hidden&&(n.hidden=(n.hidden??0)+a.hidden),a.splits)){n.splits??(n.splits={});for(const[r,i]of Object.entries(a.splits))n.splits[r]=(n.splits[r]??0)+i}return n}function jt(t,s,n){const a=new Set;return t.filter(r=>{const i=fe(s,he(r),n);if(!i)return!0;const l=JSON.stringify(i);return a.has(l)?!1:(a.add(l),!0)})}function wt(t){try{return Te(t)}catch{return null}}function Nt(t){var a;const s=rt(t.role,t.rows.map(r=>r.id),t.version),n=((a=s.data)==null?void 0:a.sets)??{};return Ie(Object.values(n).flatMap(r=>r.roles??[])),e.jsx(be,{...t,sets:n,setsLoading:s.isLoading})}function vt(t){const s=L.useMemo(()=>wt(t.schema),[t.schema]);return s&&Object.keys(s.sets).length>0?e.jsx(Nt,{...t,relations:s}):e.jsx(be,{...t,relations:s,sets:{},setsLoading:!1})}function be({schema:t,rows:s,groups:n,role:a,version:r,onRowClick:i,onAddFacet:l,forceView:p,relations:c,sets:x,setsLoading:u}){const h=Q(),y=t["x-lt-columns"]??[],j=t["x-lt-row-action"],k=(c==null?void 0:c.rowDetail)??[],[g,w]=L.useState(null),[m,f]=L.useState(()=>new Set),d=L.useMemo(()=>bt(s,n),[s,n]),b=L.useMemo(()=>ft(d,m),[d,m]),N=!!n,C=k.length>0||N,v=o=>o.rows.length>1||k.length>0,D=o=>f(T=>{const S=new Set(T);return S.has(o)?S.delete(o):S.add(o),S}),P=(o,T)=>{var X;const S=o.related,E=x[S],_=(X=c==null?void 0:c.sets[S])==null?void 0:X.query,Ne=_!=null&&_.facets?jt(T,_.facets,_.narrow):T,ve=gt(Ne.map(B=>{var R;return(R=E==null?void 0:E.aggregates[o.splitBy??""])==null?void 0:R[B.id]})),ke=_!=null&&_.facets&&T.length===1?B=>{const R=fe(_.facets,he(T[0]),_.narrow);return R?G(R,B):null}:void 0;return e.jsx(ut,{col:o,set:E,agg:u?void 0:ve,drillUrl:ke})},ye=(j==null?void 0:j.label)??(p?"View":"Claim"),F=o=>o.rows[0],ge=[...C?[{key:"_expand",label:"",priority:1,className:"w-12 px-1",render:o=>e.jsx("span",{className:`flex ${o.depth?"pl-5":""}`,children:v(o)&&e.jsx("button",{type:"button",onClick:T=>{T.stopPropagation(),D(o.key)},className:"p-1 rounded icon-link hover:bg-surface-hover transition-colors","aria-expanded":m.has(o.key),"aria-label":m.has(o.key)?"Collapse row":"Expand row","data-testid":"row-expand",children:e.jsx(We,{className:`w-3.5 h-3.5 transition-transform ${m.has(o.key)?"rotate-90":""}`,strokeWidth:1.75})})})}]:[],{key:"_status",label:"",priority:1,className:"w-8",render:o=>e.jsxs("span",{className:"inline-flex items-center gap-1",children:[e.jsx("span",{className:`w-2.5 h-2.5 inline-block rounded-full dot-ring ${ce(F(o))}`,title:F(o).status}),o.rows.length>1&&e.jsx("span",{className:"text-2xs tabular-nums text-text-tertiary",title:`${o.rows.length} rows in this group`,"data-testid":"group-size",children:o.rows.length})]})},...y.map((o,T)=>({key:`col-${T}`,label:o.label,priority:o.priority??(T===0?1:2),width:o.width??(T===0&&!y.some(S=>S.width)?Ce:void 0),render:S=>{if(o.related)return P(o,S.rows);const E=S.rows.length>1?re(o,S.rows):O(o.value,M(F(S)));if(S.parent&&E===re(o,S.parent.rows))return null;const _=T===0&&S.depth?"pl-4":"";return e.jsx("span",{className:`block truncate ${_}`,title:E&&E!==$?E:void 0,children:e.jsx(H,{raw:E,format:o.format})})}})),{key:"_refine",label:"",priority:1,className:"w-8 px-1",render:o=>o.rows.length===1&&Z(F(o),y).length>0?e.jsx(de,{onOpen:()=>w(F(o))}):null},{key:"_action",label:"",priority:1,width:Oe(ye),className:"text-right whitespace-nowrap",render:o=>o.rows.length===1?e.jsx(Y,{row:F(o),def:j,onView:()=>i==null?void 0:i(F(o)),forceView:p}):null}],je=o=>o.depth?"bg-surface-sunken border-b-surface-border/40":m.has(o.key)&&v(o)?"bg-surface-sunken/50 border-b-surface-border/40":"",we=o=>!m.has(o.key)||o.rows.length>1||k.length===0?null:e.jsx("div",{onClick:T=>T.stopPropagation(),className:`${o.depth?"bg-surface-sunken pl-20":"bg-surface-sunken/50 pl-12"} pr-3 pt-1 pb-4`,"data-testid":"row-detail-block",children:e.jsx(ht,{role:a,host:F(o),version:r,sections:k})});return e.jsxs(e.Fragment,{children:[e.jsx(me,{columns:ge,data:b,layout:"fixed",density:"dense",keyFn:o=>o.key,onRowClick:i?o=>o.rows.length===1?i(F(o)):D(o.key):void 0,rowClassName:C?je:void 0,emptyMessage:"No pending items.",renderExpansion:C?we:void 0}),e.jsx(pe,{open:!!g,onClose:()=>w(null),role:a,pairs:g?Z(g,y):[],onNavigate:h,onAddFacet:l})]})}function kt(t){const[,s]=L.useState(0);L.useEffect(()=>{if(!t)return;const n=window.setInterval(()=>s(a=>a+1),6e4);return()=>window.clearInterval(n)},[t])}function St(t){var s;return[...t["x-lt-columns"]??[],...((s=t["x-lt-card"])==null?void 0:s.fields)??[]].some(n=>De(n.format))}function Tt({esc:t,card:s,rowAction:n,onOpen:a,forceView:r}){const i=M(t),l=s.title?O(s.title,i):t.type;return e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-start justify-between gap-6",children:[e.jsxs("button",{onClick:a,className:"text-left group min-w-0",children:[e.jsx("h3",{className:"heading-2 group-hover:text-accent transition-colors leading-tight",children:l}),s.subtitle&&e.jsx("p",{className:"text-xs text-text-tertiary mt-1.5",children:O(s.subtitle,i)})]}),e.jsx(Y,{row:t,def:n,onView:a,prominent:!0,forceView:r})]}),s.fields&&s.fields.length>0&&e.jsx("dl",{className:"flex flex-wrap gap-x-10 gap-y-4 mt-6",children:s.fields.map((p,c)=>e.jsxs("div",{children:[e.jsx("dt",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary",children:p.label}),e.jsx("dd",{className:"text-xs text-text-primary mt-1",children:e.jsx(H,{raw:O(p.value,i)})})]},c))}),s.body&&e.jsx("div",{className:"mt-7 pt-6 border-t border-surface-border/50",children:e.jsx(J,{content:O(s.body,i)})})]})}function Ct({role:t,def:s,onRowClick:n}){var x,u;const[a,r]=L.useState(!1),i=Pe({role:t,status:s.status??"resolved",sort_by:"resolved_at",order:"desc",limit:s.limit??25,enabled:a,include:Le(s)?"envelope":void 0}),l=((x=i.data)==null?void 0:x.escalations)??[],p=((u=i.data)==null?void 0:u.total)??0,c=s.row??{};return a?i.isLoading?e.jsx("p",{className:"text-xs text-text-tertiary italic",children:"Loading history…"}):l.length===0?e.jsx("p",{className:"text-xs text-text-tertiary italic",children:"No past revisions."}):e.jsxs("div",{children:[e.jsx("div",{className:"divide-y divide-surface-border/40",children:l.map(h=>{const y=M(h);return e.jsxs("button",{onClick:()=>n==null?void 0:n(h),className:"w-full text-left py-2.5 group flex items-center gap-3",children:[e.jsx("span",{className:`w-2.5 h-2.5 shrink-0 rounded-full dot-ring ${ce(h)}`,title:h.status}),e.jsxs("span",{className:"min-w-0 flex-1",children:[e.jsx("span",{className:"block text-xs text-text-primary group-hover:text-accent transition-colors truncate",children:c.title?O(c.title,y):h.type}),c.subtitle&&e.jsx("span",{className:"block text-2xs text-text-tertiary truncate",children:O(c.subtitle,y)})]}),c.meta?e.jsx("span",{className:"text-2xs text-text-tertiary shrink-0",children:O(c.meta,y)}):h.resolved_at&&e.jsx(Re,{date:h.resolved_at,format:"relative",className:"text-2xs text-text-tertiary shrink-0 whitespace-nowrap"})]},h.id)})}),p>l.length&&e.jsxs("p",{className:"text-2xs text-text-quaternary mt-3",children:["Showing ",l.length," of ",p,"."]})]}):e.jsx("button",{onClick:()=>r(!0),className:"text-xs text-accent hover:underline","data-testid":"load-history",children:"Load full history →"})}function ie({children:t}){return e.jsx("p",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-3",children:t})}function Ot(t,s){var i;const n=s.indexOf("."),a=s.startsWith("metadata.")?s.slice(9):null,r=new Map;for(const l of t){const p=M(l);let c;try{c=n===-1?p[s]:oe(p[s.slice(0,n)],s.slice(n+1))}catch{c=void 0}if(c==null||c==="")continue;const x=String(c),u=a?((i=l.metadata)==null?void 0:i[a])??c:c,h=r.get(x);h?(h.count+=1,new Date(l.created_at)>new Date(h.latest.created_at)&&(h.latest=l)):r.set(x,{key:x,rawValue:u,latest:l,count:1})}return[...r.values()].sort((l,p)=>l.key.localeCompare(p.key))}function Lt({schema:t,rows:s,role:n,onOpenDetail:a,onOpenGroup:r,onAddFacet:i,forceView:l}){const p=Q(),c=t["x-lt-group-by"],x=t["x-lt-card"]??{},u=t["x-lt-row-action"],[h,y]=L.useState(null);if(!c)return e.jsx("p",{className:"text-xs text-text-tertiary italic",children:"facet-board needs an x-lt-group-by path."});const j=c.startsWith("metadata.")?c.slice(9):null,k=Ot(s,c);if(k.length===0)return e.jsx("p",{className:"text-xs text-text-tertiary italic",children:"No entities in scope."});const g=w=>{var d,b;const m=[];j&&m.push({key:j,label:j,value:w.rawValue});const f=new Set(m.map(N=>N.key));for(const N of x.fields??[]){const C=(d=N.value.match(_e))==null?void 0:d[1];if(!C||f.has(C))continue;const v=(b=w.latest.metadata)==null?void 0:b[C];v==null||v===""||(f.add(C),m.push({key:C,label:N.label,value:v}))}return m};return e.jsxs("div",{className:"grid grid-cols-[repeat(auto-fill,minmax(15rem,1fr))] gap-4","data-testid":"facet-board",children:[k.map(w=>{const m=M(w.latest),f=x.title?O(x.title,m):w.key,d=x.state?O(x.state,m):w.latest.subtype||w.latest.status,b=at(d),N=g(w).length>0,C=v=>{if(v.shiftKey&&j&&i){i(j,w.rawValue);return}a==null||a(w.latest)};return e.jsxs("div",{role:"button",tabIndex:0,onClick:C,onKeyDown:v=>{(v.key==="Enter"||v.key===" ")&&(v.preventDefault(),C(v))},title:j?"Open the latest item · ⇧ click to filter the board":"Open the latest item",className:"group/card border-l-2 border-accent/30 bg-surface-sunken/40 rounded-[0.125em] px-4 py-3.5 cursor-pointer transition-colors hover:bg-surface-sunken/70 focus:outline-none focus-visible:ring-1 focus-visible:ring-accent/40","data-testid":"facet-board-card",children:[e.jsxs("div",{className:"flex items-center justify-between gap-2 mb-2.5",children:[e.jsx("span",{className:"text-2xs font-semibold uppercase tracking-wider text-text-secondary truncate",children:f}),e.jsxs("span",{className:"flex items-center gap-1 shrink-0",children:[e.jsx("span",{className:"px-1.5 py-0.5 rounded text-2xs font-mono font-medium",style:{color:b.text,backgroundColor:b.bg},title:d,children:d}),N&&e.jsx(de,{onOpen:()=>y(w),className:"-my-1 -mr-1"})]})]}),x.fields&&x.fields.length>0&&e.jsx("dl",{className:"space-y-1",children:x.fields.map((v,D)=>{const P=O(v.value,m);return e.jsxs("div",{className:"flex items-baseline justify-between gap-3",children:[e.jsx("dt",{className:"text-2xs uppercase tracking-wider text-text-quaternary shrink-0",children:v.label}),e.jsx("dd",{className:"min-w-0 truncate text-2xs text-text-primary",title:P&&P!==$?P:void 0,children:e.jsx(H,{raw:P,format:v.format})})]},D)})}),e.jsx("div",{className:"mt-3 flex justify-end",children:e.jsx(Y,{row:w.latest,def:u,onView:()=>a==null?void 0:a(w.latest),forceView:l})})]},w.key)}),e.jsx(pe,{open:!!h,onClose:()=>y(null),role:n,pairs:h?g(h):[],onNavigate:r??p,onAddFacet:i})]})}function Yt({role:t,listSchema:s,listSchemaVersion:n,activeEscalations:a,groups:r,onRowClick:i,onOpenGroup:l,onAddFacet:p,forceViewAction:c,total:x,page:u,totalPages:h,pageSize:y,onPageChange:j,onPageSizeChange:k}){const g=s["x-lt-layout"],w=s["x-lt-active"]??{},m=s["x-lt-row-action"],f=a[0],d=s["x-lt-help"];kt(St(s));const b=e.jsxs("div",{className:"border border-surface-border/60 bg-surface-sunken rounded-[0.25em] p-4",children:[e.jsx(ie,{children:"Active"}),f?e.jsx(Tt,{esc:f,card:w,rowAction:m,onOpen:()=>i==null?void 0:i(f),forceView:c}):e.jsx("p",{className:"text-xs text-text-tertiary italic",children:"No active item right now."})]}),N=d&&f?e.jsx("div",{className:"mb-8",children:e.jsx(J,{content:O(d,M(f))})}):d?e.jsx("div",{className:"mb-8",children:e.jsx(J,{content:d})}):null;if(g==="facet-table"){const C=x??a.length;return e.jsxs("div",{children:[e.jsx(vt,{schema:s,rows:a,groups:r,role:t,version:n,onRowClick:i,onAddFacet:p,forceView:c}),u!==void 0&&h!==void 0&&j&&e.jsx(te,{page:u,totalPages:h,onPageChange:j,total:C,pageSize:y??25,onPageSizeChange:k})]})}return g==="facet-board"?e.jsxs("div",{children:[N,e.jsx(Lt,{schema:s,rows:a,role:t,onOpenDetail:i,onOpenGroup:l,onAddFacet:p,forceView:c}),u!==void 0&&h!==void 0&&j&&h>1&&e.jsx(te,{page:u,totalPages:h,onPageChange:j,total:x??a.length,pageSize:y??25,onPageSizeChange:k})]}):g==="active-history"?e.jsxs("div",{children:[N,e.jsxs("div",{className:"grid grid-cols-1 @split:grid-cols-[1.6fr_1fr] gap-8 @split:gap-12 items-start",children:[b,e.jsxs("div",{className:"@split:pt-4",children:[e.jsx(ie,{children:"History"}),e.jsx(Ct,{role:t,def:s["x-lt-history"]??{},onRowClick:i})]})]})]}):e.jsxs("div",{children:[N,b]})}const q="text-text-secondary transition-colors group-hover/row:text-text-primary";function _t({row:t}){if(Ee(t)){const s=t.status==="resolved"?"text-status-success":"text-text-tertiary";return e.jsx(Be,{className:`w-3 h-3 shrink-0 ${s}`})}return t.status==="resolved"?e.jsx(A,{className:"w-2.5 h-2.5 shrink-0 text-status-success",strokeWidth:2.5}):t.status==="cancelled"?e.jsx(A,{className:"w-2.5 h-2.5 shrink-0 text-status-error",strokeWidth:2.5}):t.status==="expired"?e.jsx(A,{className:"w-2.5 h-2.5 shrink-0 text-text-tertiary",strokeWidth:2.5}):$e(t)?e.jsx(A,{className:"w-2.5 h-2.5 shrink-0 text-status-warning",strokeWidth:2.5}):e.jsx(A,{className:"w-2.5 h-2.5 shrink-0 text-status-active",strokeWidth:2.5})}function Et({metadata:t,role:s,highlightKeys:n}){const[a,r]=L.useState(!1),i=qe();if(!t||Object.keys(t).length===0)return e.jsx("span",{className:"text-2xs text-text-tertiary",children:"—"});const l=n??[],p=[...l.filter(u=>u in t),...Object.keys(t).filter(u=>!l.includes(u))],c=a?p:p.slice(0,1),x=p.length-1;return e.jsx("div",{className:"w-full",onClick:u=>u.stopPropagation(),children:e.jsx("div",{className:"space-y-px",children:c.map((u,h)=>{const y=typeof t[u]=="object"&&t[u]!==null?JSON.stringify(t[u]):String(t[u]),j=l.includes(u),k=h===c.length-1;return e.jsxs("div",{className:"group/mrow flex items-center gap-1 min-w-0",children:[e.jsx("span",{className:`shrink-0 w-14 text-2xs font-mono uppercase tracking-wide truncate ${j?"text-accent":"text-text-tertiary"}`,title:u,children:u}),e.jsx("span",{className:`flex-1 min-w-0 text-2xs font-medium truncate ${j?"text-text-primary":"text-text-secondary"}`,title:y,children:y}),e.jsxs("span",{className:"flex items-center gap-px shrink-0 opacity-50 group-hover/mrow:opacity-100 transition-opacity",children:[e.jsx(z,{to:ee(u,t[u],s),className:"p-0.5 rounded text-text-quaternary hover:text-accent transition-colors",title:`Filter ${s}: ${u} = ${y}`,onClick:g=>g.stopPropagation(),children:e.jsx(Ue,{className:"w-3 h-3"})}),e.jsx(z,{to:ee(u,t[u]),className:"p-0.5 rounded text-text-quaternary hover:text-accent transition-colors",title:`Search all: ${u} = ${y}`,onClick:g=>g.stopPropagation(),children:e.jsx(ue,{className:"w-3 h-3"})}),i&&typeof t[u]=="string"&&e.jsx("button",{className:"p-0.5 rounded text-text-quaternary hover:text-accent transition-colors",title:`Timeline: every station ${y} has moved through`,onClick:g=>{g.stopPropagation(),i.setPanel(e.jsx(ze,{facetKey:u,value:t[u],role:s}),{key:"entity-timeline",width:420})},children:e.jsx(Ve,{className:"w-3 h-3"})})]}),!a&&x>0&&e.jsxs("button",{onClick:g=>{g.stopPropagation(),r(!0)},className:"shrink-0 text-2xs text-text-quaternary hover:text-accent transition-colors font-mono",title:`Show ${x} more fields`,children:["+",x]}),a&&k&&x>0&&e.jsx("button",{onClick:g=>{g.stopPropagation(),r(!1)},className:"shrink-0 text-2xs text-text-quaternary hover:text-accent transition-colors",title:"Show less",children:"↑"})]},u)})})})}function $t(t={}){return[{key:"description",label:"Summary",priority:1,render:s=>e.jsxs("div",{className:"flex items-center gap-2 overflow-hidden",children:[e.jsx("span",{className:"shrink-0",children:e.jsx(_t,{row:s})}),e.jsx("span",{className:`truncate text-xs ${q}`,children:s.description||s.type})]}),className:"max-w-0"},{key:"assigned_to",label:"Assignee",priority:2,render:s=>s.assigned_to?e.jsx(tt,{userId:s.assigned_to,className:`block truncate text-xs ${q}`}):e.jsx("span",{className:"text-xs text-text-quaternary",children:"—"}),className:"w-36 max-w-[9rem]"},{key:"role",label:"Role",priority:2,render:s=>e.jsx("span",{className:q,children:e.jsx(Ze,{role:s.role,size:"md",tone:"inherit"})}),className:"w-44 min-w-[11rem]"},{key:"priority",label:"Pri",priority:2,render:s=>e.jsx("span",{className:q,children:e.jsx(Xe,{priority:s.priority,size:"sm",tone:"inherit"})}),className:"w-10"},{key:"workflow_type",label:"Workflow",priority:2,showFrom:"split",render:s=>e.jsx(et,{type:s.workflow_type||s.type}),className:"w-40 whitespace-nowrap"},{key:"metadata",label:"Metadata",priority:2,showFrom:"wall",render:s=>e.jsx(Et,{metadata:s.metadata,role:s.role,highlightKeys:t.highlightKeys}),className:"w-80 max-w-[19rem] align-top"},{key:"created_at",label:"Ago",priority:1,render:s=>e.jsx("span",{className:`text-xs tabular-nums ${q}`,title:s.created_at,children:Ae(s.created_at)}),className:"w-14 whitespace-nowrap"}]}const Qt=$t(),Xt={key:"expires",label:e.jsx(He,{className:"w-3.5 h-3.5 text-text-tertiary"}),render:t=>t.assigned_until?e.jsx(Je,{until:t.assigned_until}):e.jsx("span",{className:"text-xs text-text-tertiary",children:"—"}),className:"w-16 whitespace-nowrap",priority:1},Ft=[{value:"1",label:"P1"},{value:"2",label:"P2"},{value:"3",label:"P3"},{value:"4",label:"P4"}],Mt=[{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 Zt({filters:t,setFilter:s,roles:n,types:a,showStatus:r=!1,showSearch:i=!0,showRole:l=!0,actions:p}){const c=[t.role,t.type,t.priority,t.status&&t.status!=="all"?t.status:"",t.search??""].filter(Boolean).length;return e.jsxs(Ye,{actions:p,activeFilterCount:c,children:[r&&e.jsxs(e.Fragment,{children:[e.jsx(K,{label:"Status",value:t.status??"",onChange:x=>s("status",x),options:Mt}),e.jsx(W,{})]}),l&&e.jsxs(e.Fragment,{children:[e.jsx(K,{label:"Role",value:t.role,onChange:x=>s("role",x),options:n.map(x=>({value:x,label:x}))}),e.jsx(W,{})]}),e.jsx(K,{label:"Priority",value:t.priority,onChange:x=>s("priority",x),options:Ft}),e.jsx(W,{}),e.jsx(K,{label:"Workflow Type",value:t.type,onChange:x=>s("type",x),options:a.map(x=>({value:x,label:x}))}),i&&e.jsxs(e.Fragment,{children:[e.jsx(W,{}),e.jsx(Qe,{label:"Search",value:t.search??"",onChange:x=>s("search",x),placeholder:"ID, workflow, origin…"})]})]})}export{Zt as E,Xt as T,Yt as a,Qt as b,$t as m};
2
- //# sourceMappingURL=escalation-columns-cwZE6xyo.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"escalation-columns-cwZE6xyo.js","sources":["../../src/lib/type-color.ts","../../src/components/escalation/RefineDialog.tsx","../../src/api/escalation-related.ts","../../../shared/list-schema/template.ts","../../src/components/escalation/list-view/RelatedCell.tsx","../../src/components/escalation/list-view/RowDetail.tsx","../../src/components/escalation/list-view/group-rows.ts","../../src/components/escalation/list-view/FacetTable.tsx","../../src/components/escalation/EscalationListView.tsx","../../src/pages/operator/escalation-columns.tsx"],"sourcesContent":["/**\n * Deterministic color assignment for workflow type names.\n *\n * Maps any string to a consistent color from a curated 24-color palette.\n * The same type name always produces the same color across the entire UI.\n * Uses a simple hash to distribute names evenly across the palette.\n *\n * Each entry provides:\n * text — icon and text color (Tailwind class)\n * bg — subtle background tint (Tailwind class)\n */\n\nconst PALETTE: Array<{ text: string; bg: string }> = [\n { text: 'text-rose-400', bg: 'bg-rose-400/[0.08]' },\n { text: 'text-pink-400', bg: 'bg-pink-400/[0.08]' },\n { text: 'text-fuchsia-400', bg: 'bg-fuchsia-400/[0.08]' },\n { text: 'text-purple-400', bg: 'bg-purple-400/[0.08]' },\n { text: 'text-violet-400', bg: 'bg-violet-400/[0.08]' },\n { text: 'text-indigo-400', bg: 'bg-indigo-400/[0.08]' },\n { text: 'text-blue-400', bg: 'bg-blue-400/[0.08]' },\n { text: 'text-sky-400', bg: 'bg-sky-400/[0.08]' },\n { text: 'text-cyan-400', bg: 'bg-cyan-400/[0.08]' },\n { text: 'text-teal-400', bg: 'bg-teal-400/[0.08]' },\n { text: 'text-emerald-400', bg: 'bg-emerald-400/[0.08]' },\n { text: 'text-green-400', bg: 'bg-green-400/[0.08]' },\n { text: 'text-lime-400', bg: 'bg-lime-400/[0.08]' },\n { text: 'text-yellow-400', bg: 'bg-yellow-400/[0.08]' },\n { text: 'text-amber-400', bg: 'bg-amber-400/[0.08]' },\n { text: 'text-orange-400', bg: 'bg-orange-400/[0.08]' },\n { text: 'text-red-400', bg: 'bg-red-400/[0.08]' },\n { text: 'text-stone-400', bg: 'bg-stone-400/[0.08]' },\n { text: 'text-rose-300', bg: 'bg-rose-300/[0.08]' },\n { text: 'text-violet-300', bg: 'bg-violet-300/[0.08]' },\n { text: 'text-sky-300', bg: 'bg-sky-300/[0.08]' },\n { text: 'text-teal-300', bg: 'bg-teal-300/[0.08]' },\n { text: 'text-amber-300', bg: 'bg-amber-300/[0.08]' },\n { text: 'text-pink-300', bg: 'bg-pink-300/[0.08]' },\n];\n\nfunction hash(str: string): number {\n let h = 0;\n for (let i = 0; i < str.length; i++) {\n h = ((h << 5) - h + str.charCodeAt(i)) | 0;\n }\n return Math.abs(h);\n}\n\nexport function typeColor(typeName: string): { text: string; bg: string } {\n return PALETTE[hash(typeName) % PALETTE.length];\n}\n","import { useState } from 'react';\nimport { Check, Search } from 'lucide-react';\nimport { Modal } from '../common/modal/Modal';\nimport { metadataFacetsUrl } from '../../lib/facet-url';\n\n/** One refinable fact from a row: a metadata key with its authored label and value. */\nexport interface RefinePair {\n key: string;\n label: string;\n value: unknown;\n /** The author put this fact in the row's columns; a lone bound fact arrives preselected. */\n bound?: boolean;\n}\n\n/**\n * The row-level refine gesture for authored lists (facet-table rows, board\n * cards): the row's metadata-bound facts as full-width touch rows, each a\n * toggle. Pick one or several (multi-select ANDs the facets) and drill —\n * filter this role's queue, search every role, or merge into the live filter\n * set. One dialog replaces per-cell icon pairs, so table cells spend their\n * width on data and the affordance stays tappable on the iPad floor. The\n * list is the row's whole metadata; past a handful of facts a find box\n * narrows it by label, key, or value.\n */\nconst FIND_THRESHOLD = 6;\nexport function RefineDialog({ open, onClose, role, pairs, onNavigate, onAddFacet }: {\n open: boolean;\n onClose: () => void;\n role: string;\n pairs: RefinePair[];\n /** Receives the facet deep-link. Hosts navigate (or open a panel). */\n onNavigate: (url: string) => void;\n /** When provided, \"Add to filters\" merges the selection into the live set. */\n onAddFacet?: (key: string, value: unknown) => void;\n}) {\n // A single fact, or a single column-bound fact, arrives selected — the\n // one-glance, two-tap path — while the rest of the record waits below.\n const [selected, setSelected] = useState<Set<string>>(new Set());\n const [find, setFind] = useState('');\n const [prevOpen, setPrevOpen] = useState(open);\n if (open !== prevOpen) {\n setPrevOpen(open);\n if (open) {\n const bound = pairs.filter((p) => p.bound);\n const preset = bound.length === 1 ? [bound[0].key] : pairs.length === 1 ? [pairs[0].key] : [];\n setSelected(new Set(preset));\n setFind('');\n }\n }\n const needle = find.trim().toLowerCase();\n const visible = needle\n ? pairs.filter((p) => [p.label, p.key, String(p.value)].some((t) => t.toLowerCase().includes(needle)))\n : pairs;\n\n const toggle = (key: string) => {\n setSelected((prev) => {\n const next = new Set(prev);\n if (next.has(key)) next.delete(key); else next.add(key);\n return next;\n });\n };\n\n const chosen = pairs.filter((p) => selected.has(p.key));\n const facets = Object.fromEntries(chosen.map((p) => [p.key, p.value]));\n const none = chosen.length === 0;\n\n const go = (url: string) => {\n onClose();\n onNavigate(url);\n };\n\n return (\n <Modal open={open} onClose={onClose} title=\"Refine\">\n <div className=\"space-y-4\">\n <p className=\"text-2xs text-text-tertiary\">\n Pick the facts to match — several combine into one narrower query.\n </p>\n\n {pairs.length > FIND_THRESHOLD && (\n <label className=\"flex items-center gap-2 input text-xs py-1.5\">\n <Search className=\"w-3.5 h-3.5 shrink-0 text-text-quaternary\" strokeWidth={1.5} />\n <input\n type=\"text\"\n value={find}\n onChange={(e) => setFind(e.target.value)}\n placeholder=\"Find a fact…\"\n className=\"flex-1 min-w-0 bg-transparent outline-none placeholder:text-text-quaternary\"\n aria-label=\"Find a fact\"\n data-testid=\"refine-find\"\n />\n <span className=\"text-2xs tabular-nums text-text-quaternary\">{visible.length}/{pairs.length}</span>\n </label>\n )}\n\n <div className=\"divide-y divide-surface-border/40 -mx-1 max-h-[50vh] overflow-y-auto\">\n {visible.map((p) => {\n const on = selected.has(p.key);\n return (\n <button\n key={p.key}\n type=\"button\"\n onClick={() => toggle(p.key)}\n aria-pressed={on}\n className=\"w-full flex items-center gap-3 px-1 py-2.5 text-left group min-w-0\"\n data-testid=\"refine-pair\"\n >\n <span\n className={`w-4 h-4 rounded-[3px] border flex items-center justify-center shrink-0 transition-colors ${\n on ? 'bg-accent border-accent' : 'border-surface-border group-hover:border-accent/50'\n }`}\n aria-hidden\n >\n {on && <Check className=\"w-3 h-3 text-text-inverse\" strokeWidth={3} />}\n </span>\n <span className=\"text-2xs font-semibold uppercase tracking-widest text-text-tertiary w-28 shrink-0 truncate\" title={p.key}>\n {p.label}\n </span>\n <span className=\"text-xs text-text-primary truncate flex-1 min-w-0\" title={String(p.value)}>\n {String(p.value)}\n </span>\n </button>\n );\n })}\n </div>\n\n <div className=\"flex items-center justify-end gap-3 pt-2 flex-wrap\">\n {onAddFacet && (\n <button\n onClick={() => {\n chosen.forEach((p) => onAddFacet(p.key, p.value));\n onClose();\n }}\n disabled={none}\n className=\"text-xs text-text-secondary hover:text-accent transition-colors disabled:opacity-40 disabled:cursor-not-allowed mr-auto\"\n data-testid=\"refine-add-filters\"\n >\n Add to filters\n </button>\n )}\n <button\n onClick={() => go(metadataFacetsUrl(facets))}\n disabled={none}\n className=\"btn-secondary text-xs disabled:opacity-40 disabled:cursor-not-allowed\"\n data-testid=\"refine-search-all\"\n >\n Search everywhere\n </button>\n <button\n onClick={() => go(metadataFacetsUrl(facets, role))}\n disabled={none}\n className=\"btn-primary text-xs disabled:opacity-40 disabled:cursor-not-allowed\"\n data-testid=\"refine-filter-role\"\n >\n Filter {role}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import { useQuery } from '@tanstack/react-query';\nimport { apiFetch } from './client';\nimport type { RelatedAggregatesResponse, RelatedRowsResponse } from '../lib/list-schema';\n\n/**\n * Every related set a role's list schema declares, aggregated for one page\n * of host rows. Keyed under `escalations`, so the list's live invalidation\n * refreshes it with the rows.\n */\nexport function useRelatedAggregates(role: string, ids: string[], version: number | null | undefined, enabled = true) {\n const sorted = [...ids].sort();\n return useQuery<RelatedAggregatesResponse>({\n queryKey: ['escalations', 'related', role, version ?? 'latest', sorted],\n queryFn: () =>\n apiFetch('/escalations/related', {\n method: 'POST',\n body: JSON.stringify({ role, ids: sorted, ...(version != null ? { version } : {}) }),\n }),\n enabled: enabled && !!role && sorted.length > 0,\n placeholderData: (prev) => prev,\n });\n}\n\n/** One host row's rows in one related set, loaded when its detail opens. */\nexport function useRelatedRows(\n role: string,\n id: string,\n set: string,\n version: number | null | undefined,\n limit?: number,\n enabled = true,\n) {\n return useQuery<RelatedRowsResponse>({\n queryKey: ['escalations', 'related-rows', role, version ?? 'latest', id, set, limit ?? null],\n queryFn: () =>\n apiFetch('/escalations/related/rows', {\n method: 'POST',\n body: JSON.stringify({ role, id, set, ...(version != null ? { version } : {}), ...(limit ? { limit } : {}) }),\n }),\n enabled: enabled && !!role && !!id && !!set,\n });\n}\n","import { getDeep } from '../form-validation/x-lt-bind';\nimport { HELP_DOMAINS, interpolateHelp, type HelpDomain, type HelpTokenContext } from '../form-validation/x-lt-help';\n\nconst SINGLE_TOKEN = /^\\{\\{\\s*([^{}]+?)\\s*\\}\\}$/;\nconst ANY_TOKEN = /\\{\\{\\s*[^{}]+?\\s*\\}\\}/;\nconst MISSING_VALUE = '—';\n\nfunction parseJsonObject(value: unknown): Record<string, unknown> | null {\n if (value && typeof value === 'object') return value as Record<string, unknown>;\n if (typeof value !== 'string' || !value) return null;\n try {\n const parsed = JSON.parse(value);\n return parsed && typeof parsed === 'object' ? parsed : null;\n } catch {\n return null;\n }\n}\n\n/** The template domains of one escalation row, JSON-string columns parsed. */\nexport function rowTemplateContext(row: Record<string, unknown>): HelpTokenContext {\n return {\n escalation: row,\n metadata: (row.metadata as Record<string, unknown> | null) ?? {},\n envelope: parseJsonObject(row.envelope) ?? {},\n payload: parseJsonObject(row.escalation_payload) ?? {},\n resolver: parseJsonObject(row.resolver_payload) ?? {},\n };\n}\n\nfunction readToken(path: string, ctx: HelpTokenContext): unknown {\n const dot = path.indexOf('.');\n const domain = (dot === -1 ? path : path.slice(0, dot)) as HelpDomain;\n if (!HELP_DOMAINS.includes(domain)) return undefined;\n const root = ctx[domain];\n if (dot === -1) return root ?? undefined;\n try {\n return getDeep(root, path.slice(dot + 1));\n } catch {\n return undefined;\n }\n}\n\n/**\n * Resolve one facet value. A lone `{{token}}` keeps the value's own JSON type\n * (a numeric facet matches a numeric facet); a mixed template interpolates to\n * a string; a literal passes through. Undefined when a token is missing.\n */\nexport function resolveTemplateValue(value: unknown, ctx: HelpTokenContext): unknown {\n if (typeof value !== 'string') return value;\n const single = value.match(SINGLE_TOKEN);\n if (single) {\n const raw = readToken(single[1], ctx);\n return raw === null || raw === '' ? undefined : raw;\n }\n if (!ANY_TOKEN.test(value)) return value;\n const text = interpolateHelp(value, ctx);\n return text.includes(MISSING_VALUE) ? undefined : text;\n}\n\n/**\n * Resolve a related query's match against a host row: every required facet\n * (null when any is missing), plus each `narrow` facet the row resolves.\n */\nexport function resolveRelatedFacets(\n facets: Record<string, unknown>,\n ctx: HelpTokenContext,\n narrow?: Record<string, unknown>,\n): Record<string, unknown> | null {\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(facets)) {\n const resolved = resolveTemplateValue(value, ctx);\n if (resolved === undefined) return null;\n out[key] = resolved;\n }\n for (const [key, value] of Object.entries(narrow ?? {})) {\n const resolved = resolveTemplateValue(value, ctx);\n if (resolved !== undefined) out[key] = resolved;\n }\n return out;\n}\n","import { Link } from 'react-router-dom';\nimport { EM_DASH } from '../../common/display/FormattedValue';\nimport { SPLIT_PATHS, type RelatedColumnDecl, type RelatedHostAggregate, type RelatedSetResult } from '../../../lib/list-schema';\n\n/** A split value's display text: the declared label, a role title, or the value. */\nexport function splitLabel(value: string, col: RelatedColumnDecl, set?: RelatedSetResult): string {\n if (col.labels?.[value]) return col.labels[value];\n if (col.splitBy === SPLIT_PATHS.ROLE && set?.roleLabels?.[value]) return set.roleLabels[value];\n return value === '' ? 'None' : value;\n}\n\n/**\n * A related column cell: the count, then each split value as a chip in\n * declaration order (role order for a role split), largest first otherwise.\n * Splits the viewer cannot read show as a muted note, never a wrong split.\n */\nexport function RelatedCell({ col, set, agg, drillUrl }: {\n col: RelatedColumnDecl;\n set?: RelatedSetResult;\n agg?: RelatedHostAggregate;\n /** Query role splits: where a chip leads (the role list with the host's facets). */\n drillUrl?: (role: string) => string | null;\n}) {\n if (!agg || agg.unresolved) return <span className=\"text-text-quaternary\">{EM_DASH}</span>;\n const order = col.splitBy === SPLIT_PATHS.ROLE && set?.roles ? set.roles : null;\n const splits = Object.entries(agg.splits ?? {})\n .filter(([, n]) => n > 0)\n .sort(([a, x], [b, y]) => (order ? order.indexOf(a) - order.indexOf(b) : y - x));\n const restricted = col.splitBy === SPLIT_PATHS.ROLE ? (set?.restricted ?? []) : [];\n const title = [\n agg.hidden ? `${agg.hidden} not readable by you` : '',\n restricted.length ? `Not counted (outside your view): ${restricted.map((r) => set?.roleLabels?.[r] ?? r).join(', ')}` : '',\n ].filter(Boolean).join(' · ');\n\n return (\n <span className=\"inline-flex flex-wrap items-center gap-1 min-w-0\" title={title || undefined} data-testid=\"related-cell\">\n <span className=\"tabular-nums font-medium text-text-primary\">{agg.count}</span>\n {splits.map(([value, n]) => {\n const text = `${splitLabel(value, col, set)} ${n}`;\n const href = order && drillUrl ? drillUrl(value) : null;\n const chip = 'px-1.5 py-0.5 rounded bg-surface-sunken text-2xs text-text-secondary whitespace-nowrap tabular-nums';\n return href ? (\n <Link key={value} to={href} onClick={(e) => e.stopPropagation()} className={`${chip} hover:text-accent`} data-testid=\"related-chip\">\n {text}\n </Link>\n ) : (\n <span key={value} className={chip} data-testid=\"related-chip\">{text}</span>\n );\n })}\n {(agg.hidden || restricted.length > 0) && (\n <span className=\"text-2xs text-text-quaternary italic\" data-testid=\"related-restricted\">\n {agg.hidden && !splits.length ? 'split restricted' : 'partial'}\n </span>\n )}\n </span>\n );\n}\n","import { useNavigate } from 'react-router-dom';\nimport { DataTable, type Column } from '../../common/data/DataTable';\nimport { FormattedValue, EM_DASH } from '../../common/display/FormattedValue';\nimport { useRelatedRows } from '../../../api/escalation-related';\nimport { interpolateItemTemplate, type EscalationItem } from '../../../lib/escalation-items';\nimport { displayRoleTitle } from '../../../lib/role-display';\nimport type { RelatedRow, RowDetailSectionDecl } from '../../../lib/list-schema';\nimport { rowContext } from './row-parts';\nimport type { LTEscalationRecord } from '../../../api/types';\n\n/** `format: \"role\"` renders a role name as its title. */\nconst ROLE_FORMAT = 'role';\n\nfunction cellText(template: string, row: RelatedRow): string {\n const ctx = row.escalation ? rowContext(row.escalation as unknown as LTEscalationRecord) : {};\n return interpolateItemTemplate(template, row.item as EscalationItem | undefined, ctx);\n}\n\nfunction DetailSection({ role, host, version, section, roleLabels }: {\n role: string;\n host: LTEscalationRecord;\n version: number | null | undefined;\n section: RowDetailSectionDecl;\n roleLabels?: Record<string, string>;\n}) {\n const navigate = useNavigate();\n const query = useRelatedRows(role, host.id, section.related, version, section.limit);\n const rows = query.data?.rows ?? [];\n const labels = query.data?.roleLabels ?? roleLabels ?? {};\n const restricted = query.data?.restricted ?? [];\n\n // A column whose every row restates a facet the opened row carries says\n // nothing new beneath it: the row already shows that facet.\n const hostValues = new Set(\n Object.values(host.metadata ?? {})\n .filter((v) => (typeof v === 'string' && v !== '') || typeof v === 'number' || typeof v === 'boolean')\n .map(String),\n );\n const shown = section.columns.filter((col, i) => {\n // The first column names each row; it always stays.\n if (i === 0 || rows.length === 0) return true;\n const values = new Set(rows.map((row) => cellText(col.value, row)));\n return !(values.size === 1 && hostValues.has([...values][0]));\n });\n\n const columns: Column<RelatedRow>[] = shown.map((col, i) => ({\n key: `d-${i}`,\n label: col.label,\n priority: col.priority ?? (i === 0 ? 1 : 2),\n render: (row) => {\n const text = cellText(col.value, row);\n if (col.format === ROLE_FORMAT && text !== EM_DASH) {\n return <span className=\"block truncate\">{labels[text] ?? displayRoleTitle({ role: text })}</span>;\n }\n return (\n <span className=\"block truncate\" title={text !== EM_DASH ? text : undefined}>\n <FormattedValue raw={text} format={col.format} />\n </span>\n );\n },\n }));\n\n const target = (row: RelatedRow): string | null =>\n (row.escalation?.id as string | undefined) ?? row.item?.reciprocalId ?? null;\n\n return (\n <div data-testid=\"row-detail-section\">\n <p className=\"text-2xs font-semibold uppercase tracking-widest text-text-tertiary pt-3 pb-1\">\n {section.label ?? section.related}\n {query.data && <span className=\"ml-2 font-normal normal-case tracking-normal tabular-nums\">{query.data.total}</span>}\n </p>\n {query.isLoading ? (\n <p className=\"text-2xs text-text-tertiary italic pb-2\">Loading…</p>\n ) : (\n <DataTable\n columns={columns}\n data={rows}\n keyFn={(row) => row.item?.itemKey ?? String(row.escalation?.id)}\n onRowClick={(row) => {\n const id = target(row);\n if (id) navigate(`/escalations/detail/${id}`);\n }}\n layout=\"fixed\"\n density=\"compact\"\n inline\n emptyMessage=\"\"\n />\n )}\n {!query.isLoading && rows.length === 0 && (\n <p className=\"text-2xs text-text-quaternary italic pb-2\">None.</p>\n )}\n {query.data && query.data.total > rows.length && (\n <p className=\"text-2xs text-text-quaternary pb-2\">Showing {rows.length} of {query.data.total}.</p>\n )}\n {restricted.length > 0 && (\n <p className=\"text-2xs text-text-quaternary italic pb-2\">\n Not shown (outside your view): {restricted.map((r) => labels[r] ?? r).join(', ')}\n </p>\n )}\n </div>\n );\n}\n\n/** A host row's declared detail sections, each loaded when the row opens. */\nexport function RowDetail({ role, host, version, sections }: {\n role: string;\n host: LTEscalationRecord;\n version: number | null | undefined;\n sections: RowDetailSectionDecl[];\n}) {\n return (\n <div className=\"space-y-1\" data-testid=\"row-detail\">\n {sections.map((section, i) => (\n <DetailSection key={i} role={role} host={host} version={version} section={section} />\n ))}\n </div>\n );\n}\n","import { interpolateHelp } from '../../../lib/x-lt-help';\nimport { GROUP_FOLDS, type GroupFold, type RelatedHostAggregate } from '../../../lib/list-schema';\nimport { EM_DASH } from '../../common/display/FormattedValue';\nimport { rowContext, type ColumnDef } from './row-parts';\nimport type { LTEscalationRecord } from '../../../api/types';\n\n/** One page group from the grouped list read. */\nexport interface EscalationGroup {\n key: string | null;\n ids: string[];\n}\n\n/** A facet-table row: one escalation, or a group of rows sharing a facet. */\nexport interface TableRow {\n key: string;\n rows: LTEscalationRecord[];\n /** The shared facet value; null for an ungrouped row or a row without the facet. */\n groupKey: string | null;\n /** 0 for a top-level line; 1 for a member shown under its open group. */\n depth?: number;\n /** A member that closes its group's block. */\n lastChild?: boolean;\n /** A member's group line. */\n parent?: TableRow;\n}\n\n/** The lines the table draws: each open group followed by its members. */\nexport function withOpenMembers(rows: TableRow[], open: ReadonlySet<string>): TableRow[] {\n return rows.flatMap((row) => {\n if (row.rows.length < 2 || !open.has(row.key)) return [row];\n const members = row.rows.map((m, i): TableRow => ({\n key: `${row.key}/${m.id}`,\n rows: [m],\n groupKey: row.groupKey,\n depth: 1,\n lastChild: i === row.rows.length - 1,\n parent: row,\n }));\n return [row, ...members];\n });\n}\n\n/** Table rows in page order: one per group when grouped, else one per row. */\nexport function buildTableRows(rows: LTEscalationRecord[], groups?: EscalationGroup[] | null): TableRow[] {\n if (!groups) return rows.map((r) => ({ key: r.id, rows: [r], groupKey: null }));\n const byId = new Map(rows.map((r) => [r.id, r]));\n return groups\n .map((g) => ({\n key: g.key != null ? `group:${g.key}` : g.ids[0],\n rows: g.ids.map((id) => byId.get(id)).filter((r): r is LTEscalationRecord => !!r),\n groupKey: g.key,\n }))\n .filter((g) => g.rows.length > 0);\n}\n\nfunction numeric(values: string[]): number[] | null {\n const nums = values.map((v) => Number(v));\n return nums.every((n) => Number.isFinite(n)) ? nums : null;\n}\n\n/**\n * A plain column's text across a group's rows. `first` reads the lead row;\n * `min`/`max` compare numerically when every value is a number, else as text\n * (ISO instants order as text); `sum` adds numbers; `count` counts rows.\n */\nexport function foldColumnText(col: ColumnDef & { group?: GroupFold }, rows: LTEscalationRecord[]): string {\n const fold = col.group ?? GROUP_FOLDS.FIRST;\n if (fold === GROUP_FOLDS.COUNT) return String(rows.length);\n const values = rows.map((r) => interpolateHelp(col.value, rowContext(r))).filter((v) => v && v !== EM_DASH);\n if (fold === GROUP_FOLDS.DISTINCT) return values.length ? [...new Set(values)].join(', ') : EM_DASH;\n if (fold === GROUP_FOLDS.FIRST || rows.length === 1) return values[0] ?? EM_DASH;\n if (!values.length) return EM_DASH;\n const nums = numeric(values);\n if (fold === GROUP_FOLDS.SUM) return nums ? String(nums.reduce((a, b) => a + b, 0)) : EM_DASH;\n if (nums) return String(fold === GROUP_FOLDS.MIN ? Math.min(...nums) : Math.max(...nums));\n const sorted = [...values].sort();\n return fold === GROUP_FOLDS.MIN ? sorted[0] : sorted[sorted.length - 1];\n}\n\n/** One aggregate across several host rows: counts and splits sum. */\nexport function mergeAggregates(aggs: Array<RelatedHostAggregate | undefined>): RelatedHostAggregate | undefined {\n const present = aggs.filter((a): a is RelatedHostAggregate => !!a);\n if (!present.length) return undefined;\n if (present.every((a) => a.unresolved)) return { count: 0, unresolved: true };\n const out: RelatedHostAggregate = { count: 0 };\n for (const a of present) {\n if (a.unresolved) continue;\n out.count += a.count;\n if (a.hidden) out.hidden = (out.hidden ?? 0) + a.hidden;\n if (a.splits) {\n out.splits ??= {};\n for (const [k, n] of Object.entries(a.splits)) out.splits[k] = (out.splits[k] ?? 0) + n;\n }\n }\n return out;\n}\n","import { useMemo, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { ChevronRight } from 'lucide-react';\nimport { interpolateHelp } from '../../../lib/x-lt-help';\nimport { DataTable, type Column as TableColumn } from '../../common/data/DataTable';\nimport { FormattedValue, EM_DASH } from '../../common/display/FormattedValue';\nimport { RefineDialog } from '../RefineDialog';\nimport { useRelatedAggregates } from '../../../api/escalation-related';\nimport { useRelatedSetEvents } from '../../../hooks/useEventHooks';\nimport { metadataFacetsUrl } from '../../../lib/facet-url';\nimport {\n readListSchemaRelations,\n resolveRelatedFacets,\n rowTemplateContext,\n type GroupFold,\n type ListSchemaRelations,\n type RelatedColumnDecl,\n type RelatedSetResult,\n} from '../../../lib/list-schema';\nimport {\n escalationDotClass,\n rowContext,\n rowRefinePairs,\n RowActionButton,\n RefineTrigger,\n IDENTITY_COLUMN_WIDTH,\n actionColumnWidth,\n type ColumnDef,\n type RowActionDef,\n} from './row-parts';\nimport { RelatedCell } from './RelatedCell';\nimport { RowDetail } from './RowDetail';\nimport { buildTableRows, foldColumnText, mergeAggregates, withOpenMembers, type EscalationGroup, type TableRow } from './group-rows';\nimport type { LTEscalationRecord } from '../../../api/types';\n\nexport type { EscalationGroup } from './group-rows';\n\n/** A plain column (a `value` template) or a related column (a `related` set). */\ntype TableColumnDecl = ColumnDef & Partial<Omit<RelatedColumnDecl, 'label'>> & { group?: GroupFold };\n\nexport interface FacetTableSchema {\n 'x-lt-columns'?: Array<ColumnDef | (Omit<ColumnDef, 'value'> & RelatedColumnDecl)>;\n 'x-lt-row-action'?: RowActionDef;\n [key: string]: unknown;\n}\n\n/** One member per distinct resolved facet match (members whose facets do not resolve stay). */\nfunction distinctByMatch(members: LTEscalationRecord[], facets: Record<string, unknown>, narrow?: Record<string, unknown>): LTEscalationRecord[] {\n const seen = new Set<string>();\n return members.filter((m) => {\n const match = resolveRelatedFacets(facets, rowTemplateContext(m as unknown as Record<string, unknown>), narrow);\n if (!match) return true;\n const key = JSON.stringify(match);\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n}\n\n/** The related declaration, or none when the stored schema does not validate. */\nfunction safeRelations(schema: FacetTableSchema): ListSchemaRelations | null {\n try {\n return readListSchemaRelations(schema);\n } catch {\n return null;\n }\n}\n\n/**\n * The pending queue as a facet table. Plain columns template over each row;\n * related columns aggregate the row's related sets (one request per page);\n * a declared row detail expands each row into its related rows; grouped\n * rows fold their columns and expand to their members.\n */\ninterface FacetTableProps {\n schema: FacetTableSchema;\n rows: LTEscalationRecord[];\n /** Grouped reads: the page's groups, in order. */\n groups?: EscalationGroup[] | null;\n role: string;\n /** The list schema version the page rendered. */\n version?: number | null;\n onRowClick?: (row: LTEscalationRecord) => void;\n /** RefineDialog \"Add to filters\": merge into the live filter set. */\n onAddFacet?: (key: string, value: unknown) => void;\n forceView?: boolean;\n}\n\n/** Reads the page's related sets and keeps them live; mounted only when the schema declares sets. */\nfunction RelatedFacetTable(props: FacetTableProps & { relations: ListSchemaRelations }) {\n const related = useRelatedAggregates(props.role, props.rows.map((r) => r.id), props.version);\n const sets = related.data?.sets ?? {};\n useRelatedSetEvents(Object.values(sets).flatMap((set) => set.roles ?? []));\n return <FacetTableBody {...props} sets={sets} setsLoading={related.isLoading} />;\n}\n\nexport function FacetTable(props: FacetTableProps) {\n const relations = useMemo(() => safeRelations(props.schema), [props.schema]);\n return relations && Object.keys(relations.sets).length > 0\n ? <RelatedFacetTable {...props} relations={relations} />\n : <FacetTableBody {...props} relations={relations} sets={{}} setsLoading={false} />;\n}\n\nfunction FacetTableBody({ schema, rows, groups, role, version, onRowClick, onAddFacet, forceView, relations, sets, setsLoading }: FacetTableProps & {\n relations: ListSchemaRelations | null;\n sets: Record<string, RelatedSetResult>;\n setsLoading: boolean;\n}) {\n const navigate = useNavigate();\n const columnDefs = (schema['x-lt-columns'] ?? []) as TableColumnDecl[];\n const rowAction = schema['x-lt-row-action'];\n const sections = relations?.rowDetail ?? [];\n const [refineRow, setRefineRow] = useState<LTEscalationRecord | null>(null);\n const [open, setOpen] = useState<Set<string>>(() => new Set());\n\n const tableRows = useMemo(() => buildTableRows(rows, groups), [rows, groups]);\n const lines = useMemo(() => withOpenMembers(tableRows, open), [tableRows, open]);\n const grouped = !!groups;\n const expandable = sections.length > 0 || grouped;\n // A row opens when it has something beneath it: a group its members, a row its detail.\n const opens = (r: TableRow) => r.rows.length > 1 || sections.length > 0;\n\n const toggle = (key: string) =>\n setOpen((prev) => {\n const next = new Set(prev);\n if (next.has(key)) next.delete(key); else next.add(key);\n return next;\n });\n\n const relatedCell = (col: TableColumnDecl, members: LTEscalationRecord[]) => {\n const name = col.related!;\n const set = sets[name];\n const query = relations?.sets[name]?.query;\n // Members that share a facet match read the same related rows: count them once.\n const counted = query?.facets ? distinctByMatch(members, query.facets, query.narrow) : members;\n const agg = mergeAggregates(counted.map((m) => set?.aggregates[col.splitBy ?? '']?.[m.id]));\n const drillUrl = query?.facets && members.length === 1\n ? (relatedRole: string) => {\n const match = resolveRelatedFacets(query.facets!, rowTemplateContext(members[0] as unknown as Record<string, unknown>), query.narrow);\n return match ? metadataFacetsUrl(match, relatedRole) : null;\n }\n : undefined;\n return <RelatedCell col={col as RelatedColumnDecl} set={set} agg={setsLoading ? undefined : agg} drillUrl={drillUrl} />;\n };\n\n // The authored columns render through the same dense table the engineer\n // views use: the card fold at narrow widths, never a horizontal scroll.\n // Authors steer the fold with `priority` (1 title, 2 folds, 3 dropped).\n const actionLabel = rowAction?.label ?? (forceView ? 'View' : 'Claim');\n const lead = (r: TableRow) => r.rows[0];\n const columns: TableColumn<TableRow>[] = [\n ...(expandable ? [{\n key: '_expand',\n label: '',\n priority: 1 as const,\n className: 'w-12 px-1',\n render: (r: TableRow) => (\n // A member's chevron steps in under its group's, so depth reads at a glance.\n <span className={`flex ${r.depth ? 'pl-5' : ''}`}>\n {opens(r) && (\n <button\n type=\"button\"\n onClick={(e) => { e.stopPropagation(); toggle(r.key); }}\n className=\"p-1 rounded icon-link hover:bg-surface-hover transition-colors\"\n aria-expanded={open.has(r.key)}\n aria-label={open.has(r.key) ? 'Collapse row' : 'Expand row'}\n data-testid=\"row-expand\"\n >\n <ChevronRight className={`w-3.5 h-3.5 transition-transform ${open.has(r.key) ? 'rotate-90' : ''}`} strokeWidth={1.75} />\n </button>\n )}\n </span>\n ),\n }] : []),\n {\n key: '_status',\n label: '',\n priority: 1,\n className: 'w-8',\n render: (r) => (\n <span className=\"inline-flex items-center gap-1\">\n <span className={`w-2.5 h-2.5 inline-block rounded-full dot-ring ${escalationDotClass(lead(r))}`} title={lead(r).status} />\n {r.rows.length > 1 && (\n <span className=\"text-2xs tabular-nums text-text-tertiary\" title={`${r.rows.length} rows in this group`} data-testid=\"group-size\">\n {r.rows.length}\n </span>\n )}\n </span>\n ),\n },\n ...columnDefs.map((col, i): TableColumn<TableRow> => ({\n key: `col-${i}`,\n label: col.label,\n priority: col.priority ?? (i === 0 ? 1 : 2),\n width: col.width ?? (i === 0 && !columnDefs.some((c) => c.width) ? IDENTITY_COLUMN_WIDTH : undefined),\n render: (r) => {\n if (col.related) return relatedCell(col, r.rows);\n const text = r.rows.length > 1 ? foldColumnText(col, r.rows) : interpolateHelp(col.value, rowContext(lead(r)));\n // A member shows only what differs from its group: the group line already states the rest.\n if (r.parent && text === foldColumnText(col, r.parent.rows)) return null;\n // The identity steps in for a member, so the tree reads in the data too.\n const indent = i === 0 && r.depth ? 'pl-4' : '';\n return (\n <span className={`block truncate ${indent}`} title={text && text !== EM_DASH ? text : undefined}>\n <FormattedValue raw={text} format={col.format} />\n </span>\n );\n },\n })),\n {\n key: '_refine',\n label: '',\n priority: 1,\n className: 'w-8 px-1',\n render: (r) =>\n r.rows.length === 1 && rowRefinePairs(lead(r), columnDefs).length > 0\n ? <RefineTrigger onOpen={() => setRefineRow(lead(r))} />\n : null,\n },\n {\n // The action column sizes to its label so the button never wraps.\n key: '_action',\n label: '',\n priority: 1,\n width: actionColumnWidth(actionLabel),\n className: 'text-right whitespace-nowrap',\n render: (r) => r.rows.length === 1\n ? <RowActionButton row={lead(r)} def={rowAction} onView={() => onRowClick?.(lead(r))} forceView={forceView} />\n : null,\n },\n ];\n\n // Containment by depth: an open line takes a light band, its members a\n // stronger band stepped in under it, and a row's detail the band of its\n // row, indented past it. No rules: indentation and value carry the tree.\n const rowClassName = (r: TableRow) => {\n if (r.depth) return 'bg-surface-sunken border-b-surface-border/40';\n return open.has(r.key) && opens(r) ? 'bg-surface-sunken/50 border-b-surface-border/40' : '';\n };\n\n const renderExpansion = (r: TableRow) => {\n if (!open.has(r.key) || r.rows.length > 1 || sections.length === 0) return null;\n return (\n <div\n onClick={(e) => e.stopPropagation()}\n className={`${r.depth ? 'bg-surface-sunken pl-20' : 'bg-surface-sunken/50 pl-12'} pr-3 pt-1 pb-4`}\n data-testid=\"row-detail-block\"\n >\n <RowDetail role={role} host={lead(r)} version={version} sections={sections} />\n </div>\n );\n };\n\n return (\n <>\n <DataTable\n columns={columns}\n data={lines}\n layout=\"fixed\"\n density=\"dense\"\n keyFn={(r) => r.key}\n onRowClick={onRowClick ? (r) => (r.rows.length === 1 ? onRowClick(lead(r)) : toggle(r.key)) : undefined}\n rowClassName={expandable ? rowClassName : undefined}\n emptyMessage=\"No pending items.\"\n renderExpansion={expandable ? renderExpansion : undefined}\n />\n <RefineDialog\n open={!!refineRow}\n onClose={() => setRefineRow(null)}\n role={role}\n pairs={refineRow ? rowRefinePairs(refineRow, columnDefs) : []}\n onNavigate={navigate}\n onAddFacet={onAddFacet}\n />\n </>\n );\n}\n","import { useState, useEffect } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { interpolateHelp } from '../../lib/x-lt-help';\nimport { MarkdownRenderer } from '../common/display/MarkdownRenderer';\nimport { DateValue } from '../common/display/DateValue';\nimport { FormattedValue as FieldValue, EM_DASH, isAgeFormat } from '../common/display/FormattedValue';\nimport { StickyPagination } from '../common/data/StickyPagination';\nimport { useEscalations } from '../../api/escalations';\nimport { schemaNeedsEnvelope } from '../../lib/schema-needs-envelope';\nimport { getDeep } from '../../lib/x-lt-bind';\nimport { typeColor } from '../../lib/type-color';\nimport { RefineDialog, type RefinePair } from './RefineDialog';\nimport {\n escalationDotClass,\n rowContext,\n RowActionButton,\n RefineTrigger,\n METADATA_TOKEN,\n type ColumnDef,\n type RowActionDef,\n} from './list-view/row-parts';\nimport { FacetTable, type EscalationGroup } from './list-view/FacetTable';\nimport type { LTEscalationRecord } from '../../api/types';\n\nexport { rowContext, rowRefinePairs } from './list-view/row-parts';\nexport type { ColumnDef, RowActionDef } from './list-view/row-parts';\nexport { FIELD_FORMATS } from '../common/display/FormattedValue';\n\n/**\n * EscalationListView — the role-authored rich view of an escalation list, driven\n * by a versioned `list_schema` (x-lt-* markup). The list-page analog of the\n * resolve form: the same `{{domain.path}}` token binding (via interpolateHelp)\n * against each row's context, and MarkdownRenderer for rich bodies.\n *\n * Layouts:\n * active-history — single live item as a card on the left + history column on right\n * active — just the single live item card (no history)\n * facet-table — full pending queue as a table, columns from x-lt-columns\n * facet-board — one card per x-lt-group-by facet value (an entity board:\n * machines, stations), rendered from each group's latest row\n */\n\ninterface CardDef {\n title?: string;\n subtitle?: string;\n body?: string;\n fields?: { label: string; value: string; format?: string }[];\n}\n\ninterface HistoryDef {\n row?: { title?: string; subtitle?: string; meta?: string };\n limit?: number;\n status?: string;\n}\n\n\ninterface BoardCardDef {\n title?: string;\n /** Status chip — any token (commonly {{escalation.subtype}}). */\n state?: string;\n fields?: { label: string; value: string; format?: string }[];\n}\n\n\nexport interface ListSchema {\n 'x-lt-layout'?: string;\n 'x-lt-help'?: string;\n 'x-lt-active'?: CardDef;\n 'x-lt-history'?: HistoryDef;\n 'x-lt-columns'?: ColumnDef[];\n /** facet-board: the \"domain.path\" whose value identifies each entity. */\n 'x-lt-group-by'?: string;\n /** facet-board: the per-entity card definition. */\n 'x-lt-card'?: BoardCardDef;\n /** The per-row action button (claim | view, label, claim duration). */\n 'x-lt-row-action'?: RowActionDef;\n /** facet-table: related sets, row detail sections (see shared/list-schema). */\n 'x-lt-related'?: Record<string, unknown>;\n 'x-lt-row-detail'?: unknown[];\n}\n\n/**\n * Repaint-only minute tick so `format: \"age\"` values stay current. Pure\n * re-render — no network. Mounted once at the view root, only when the\n * schema actually uses ages.\n */\nfunction useAgeTick(enabled: boolean): void {\n const [, setTick] = useState(0);\n useEffect(() => {\n if (!enabled) return;\n const t = window.setInterval(() => setTick((n) => n + 1), 60_000);\n return () => window.clearInterval(t);\n }, [enabled]);\n}\n\nfunction schemaUsesAge(schema: ListSchema): boolean {\n return [...(schema['x-lt-columns'] ?? []), ...(schema['x-lt-card']?.fields ?? [])]\n .some((f) => isAgeFormat(f.format));\n}\n\n\n\n\n\nfunction ActiveCard({ esc, card, rowAction, onOpen, forceView }: {\n esc: LTEscalationRecord;\n card: CardDef;\n rowAction?: RowActionDef;\n onOpen?: () => void;\n forceView?: boolean;\n}) {\n const ctx = rowContext(esc);\n const title = card.title ? interpolateHelp(card.title, ctx) : esc.type;\n return (\n <div>\n <div className=\"flex items-start justify-between gap-6\">\n <button onClick={onOpen} className=\"text-left group min-w-0\">\n <h3 className=\"heading-2 group-hover:text-accent transition-colors leading-tight\">\n {title}\n </h3>\n {card.subtitle && (\n <p className=\"text-xs text-text-tertiary mt-1.5\">{interpolateHelp(card.subtitle, ctx)}</p>\n )}\n </button>\n\n {/* The row action — one-click claim (then the detail page opens already\n claimed), or view for read-only templates. */}\n <RowActionButton row={esc} def={rowAction} onView={onOpen} prominent forceView={forceView} />\n </div>\n\n {card.fields && card.fields.length > 0 && (\n <dl className=\"flex flex-wrap gap-x-10 gap-y-4 mt-6\">\n {card.fields.map((f, i) => (\n <div key={i}>\n <dt className=\"text-2xs font-semibold uppercase tracking-widest text-text-tertiary\">{f.label}</dt>\n <dd className=\"text-xs text-text-primary mt-1\"><FieldValue raw={interpolateHelp(f.value, ctx)} /></dd>\n </div>\n ))}\n </dl>\n )}\n\n {card.body && (\n <div className=\"mt-7 pt-6 border-t border-surface-border/50\">\n <MarkdownRenderer content={interpolateHelp(card.body, ctx)} />\n </div>\n )}\n </div>\n );\n}\n\nfunction HistoryColumn({ role, def, onRowClick }: {\n role: string;\n def: HistoryDef;\n onRowClick?: (row: LTEscalationRecord) => void;\n}) {\n const [show, setShow] = useState(false);\n const query = useEscalations({\n role,\n status: def.status ?? 'resolved',\n sort_by: 'resolved_at',\n order: 'desc',\n limit: def.limit ?? 25,\n enabled: show,\n include: schemaNeedsEnvelope(def) ? 'envelope' : undefined,\n });\n const rows = query.data?.escalations ?? [];\n const total = query.data?.total ?? 0;\n const rowDef = def.row ?? {};\n\n if (!show) {\n return (\n <button\n onClick={() => setShow(true)}\n className=\"text-xs text-accent hover:underline\"\n data-testid=\"load-history\"\n >\n Load full history →\n </button>\n );\n }\n\n if (query.isLoading) {\n return <p className=\"text-xs text-text-tertiary italic\">Loading history…</p>;\n }\n\n if (rows.length === 0) {\n return <p className=\"text-xs text-text-tertiary italic\">No past revisions.</p>;\n }\n\n return (\n <div>\n <div className=\"divide-y divide-surface-border/40\">\n {rows.map((e) => {\n const ctx = rowContext(e);\n return (\n <button\n key={e.id}\n onClick={() => onRowClick?.(e)}\n className=\"w-full text-left py-2.5 group flex items-center gap-3\"\n >\n {/* Status as a bare outlined dot — colour carries the meaning. */}\n <span\n className={`w-2.5 h-2.5 shrink-0 rounded-full dot-ring ${escalationDotClass(e)}`}\n title={e.status}\n />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block text-xs text-text-primary group-hover:text-accent transition-colors truncate\">\n {rowDef.title ? interpolateHelp(rowDef.title, ctx) : e.type}\n </span>\n {rowDef.subtitle && (\n <span className=\"block text-2xs text-text-tertiary truncate\">\n {interpolateHelp(rowDef.subtitle, ctx)}\n </span>\n )}\n </span>\n {rowDef.meta\n ? <span className=\"text-2xs text-text-tertiary shrink-0\">{interpolateHelp(rowDef.meta, ctx)}</span>\n : e.resolved_at && <DateValue date={e.resolved_at} format=\"relative\" className=\"text-2xs text-text-tertiary shrink-0 whitespace-nowrap\" />}\n </button>\n );\n })}\n </div>\n {total > rows.length && (\n <p className=\"text-2xs text-text-quaternary mt-3\">Showing {rows.length} of {total}.</p>\n )}\n </div>\n );\n}\n\n\n\nfunction SectionLabel({ children }: { children: React.ReactNode }) {\n return (\n <p className=\"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-3\">{children}</p>\n );\n}\n\n// ── facet-board — one card per entity (machine, station) ─────────────────────\n\ninterface BoardGroup {\n key: string;\n /** The group's identity as stored (native type preserved for the facet URL). */\n rawValue: unknown;\n latest: LTEscalationRecord;\n count: number;\n}\n\n/**\n * Group rows by the resolved x-lt-group-by value; each card renders from the\n * group's most recent row (by created_at). Rows without the facet are skipped —\n * the board reflects the scope, it doesn't invent entities.\n */\nexport function groupBoardRows(rows: LTEscalationRecord[], groupBy: string): BoardGroup[] {\n const dot = groupBy.indexOf('.');\n const facetKey = groupBy.startsWith('metadata.') ? groupBy.slice('metadata.'.length) : null;\n const groups = new Map<string, BoardGroup>();\n for (const row of rows) {\n const ctx = rowContext(row);\n let v: unknown;\n try {\n v = dot === -1\n ? (ctx as unknown as Record<string, unknown>)[groupBy]\n : getDeep((ctx as unknown as Record<string, unknown>)[groupBy.slice(0, dot)], groupBy.slice(dot + 1));\n } catch {\n v = undefined;\n }\n if (v === undefined || v === null || v === '') continue;\n const key = String(v);\n const rawValue = facetKey ? (row.metadata?.[facetKey] ?? v) : v;\n const existing = groups.get(key);\n if (!existing) {\n groups.set(key, { key, rawValue, latest: row, count: 1 });\n } else {\n existing.count += 1;\n if (new Date(row.created_at) > new Date(existing.latest.created_at)) existing.latest = row;\n }\n }\n return [...groups.values()].sort((a, b) => a.key.localeCompare(b.key));\n}\n\n\nfunction FacetBoard({ schema, rows, role, onOpenDetail, onOpenGroup, onAddFacet, forceView }: {\n schema: ListSchema;\n rows: LTEscalationRecord[];\n role: string;\n forceView?: boolean;\n /** Plain card click — the group's latest row opens in the detail view. */\n onOpenDetail?: (row: LTEscalationRecord) => void;\n /** History affordances — receive a filtered table/timeline deep link. */\n onOpenGroup?: (url: string) => void;\n /** Shift+click — merge one facet into the live filter set (additive). */\n onAddFacet?: (key: string, value: unknown) => void;\n}) {\n const navigate = useNavigate();\n const groupBy = schema['x-lt-group-by'];\n const card = schema['x-lt-card'] ?? {};\n const rowAction = schema['x-lt-row-action'];\n const [refineGroup, setRefineGroup] = useState<BoardGroup | null>(null);\n\n if (!groupBy) {\n return <p className=\"text-xs text-text-tertiary italic\">facet-board needs an x-lt-group-by path.</p>;\n }\n const facetKey = groupBy.startsWith('metadata.') ? groupBy.slice('metadata.'.length) : null;\n const groups = groupBoardRows(rows, groupBy);\n if (groups.length === 0) {\n return <p className=\"text-xs text-text-tertiary italic\">No entities in scope.</p>;\n }\n\n // The card's refinable facts: the entity identity (the group-by facet)\n // plus every metadata-bound card field — one dialog per card, replacing\n // hover-revealed per-field icons (hover-only fails the iPad floor).\n const groupRefinePairs = (g: BoardGroup): RefinePair[] => {\n const pairs: RefinePair[] = [];\n if (facetKey) pairs.push({ key: facetKey, label: facetKey, value: g.rawValue });\n const seen = new Set(pairs.map((p) => p.key));\n for (const f of card.fields ?? []) {\n const bound = f.value.match(METADATA_TOKEN)?.[1];\n if (!bound || seen.has(bound)) continue;\n const raw = g.latest.metadata?.[bound];\n if (raw === undefined || raw === null || raw === '') continue;\n seen.add(bound);\n pairs.push({ key: bound, label: f.label, value: raw });\n }\n return pairs;\n };\n\n return (\n <div className=\"grid grid-cols-[repeat(auto-fill,minmax(15rem,1fr))] gap-4\" data-testid=\"facet-board\">\n {groups.map((g) => {\n const ctx = rowContext(g.latest);\n const title = card.title ? interpolateHelp(card.title, ctx) : g.key;\n const state = card.state ? interpolateHelp(card.state, ctx) : (g.latest.subtype || g.latest.status);\n const stateHue = typeColor(state);\n const refinable = groupRefinePairs(g).length > 0;\n\n const activate = (e: { shiftKey: boolean }) => {\n if (e.shiftKey && facetKey && onAddFacet) {\n onAddFacet(facetKey, g.rawValue);\n return;\n }\n onOpenDetail?.(g.latest);\n };\n\n return (\n <div\n key={g.key}\n role=\"button\"\n tabIndex={0}\n onClick={activate}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); activate(e); }\n }}\n title={facetKey ? 'Open the latest item · ⇧ click to filter the board' : 'Open the latest item'}\n className=\"group/card border-l-2 border-accent/30 bg-surface-sunken/40 rounded-[0.125em] px-4 py-3.5 cursor-pointer transition-colors hover:bg-surface-sunken/70 focus:outline-none focus-visible:ring-1 focus-visible:ring-accent/40\"\n data-testid=\"facet-board-card\"\n >\n <div className=\"flex items-center justify-between gap-2 mb-2.5\">\n <span className=\"text-2xs font-semibold uppercase tracking-wider text-text-secondary truncate\">\n {title}\n </span>\n <span className=\"flex items-center gap-1 shrink-0\">\n <span\n className=\"px-1.5 py-0.5 rounded text-2xs font-mono font-medium\"\n style={{ color: stateHue.text, backgroundColor: stateHue.bg }}\n title={state}\n >\n {state}\n </span>\n {refinable && <RefineTrigger onOpen={() => setRefineGroup(g)} className=\"-my-1 -mr-1\" />}\n </span>\n </div>\n {card.fields && card.fields.length > 0 && (\n <dl className=\"space-y-1\">\n {card.fields.map((f, i) => {\n const text = interpolateHelp(f.value, ctx);\n return (\n <div key={i} className=\"flex items-baseline justify-between gap-3\">\n <dt className=\"text-2xs uppercase tracking-wider text-text-quaternary shrink-0\">{f.label}</dt>\n <dd\n className=\"min-w-0 truncate text-2xs text-text-primary\"\n title={text && text !== EM_DASH ? text : undefined}\n >\n <FieldValue raw={text} format={f.format} />\n </dd>\n </div>\n );\n })}\n </dl>\n )}\n\n <div className=\"mt-3 flex justify-end\">\n <RowActionButton row={g.latest} def={rowAction} onView={() => onOpenDetail?.(g.latest)} forceView={forceView} />\n </div>\n </div>\n );\n })}\n\n <RefineDialog\n open={!!refineGroup}\n onClose={() => setRefineGroup(null)}\n role={role}\n pairs={refineGroup ? groupRefinePairs(refineGroup) : []}\n onNavigate={onOpenGroup ?? navigate}\n onAddFacet={onAddFacet}\n />\n </div>\n );\n}\n\nexport function EscalationListView({ role, listSchema, listSchemaVersion, activeEscalations, groups, onRowClick, onOpenGroup, onAddFacet, forceViewAction, total, page, totalPages, pageSize, onPageChange, onPageSizeChange }: {\n role: string;\n listSchema: ListSchema;\n /** The list schema version rendered; related sets read the same version. */\n listSchemaVersion?: number | null;\n activeEscalations: LTEscalationRecord[];\n /** facet-table grouped reads: the page's groups, in order. */\n groups?: EscalationGroup[] | null;\n onRowClick?: (row: LTEscalationRecord) => void;\n /** facet-board history affordances — receive a filtered deep link. */\n onOpenGroup?: (url: string) => void;\n /** facet-board ⇧ click — merge one facet into the live filter set. */\n onAddFacet?: (key: string, value: unknown) => void;\n /** Render claim row-actions as view actions. For surfaces listing rows the\n * viewer already holds (e.g. My Escalations), where a claim gesture is\n * inapplicable — the button opens the detail page instead. */\n forceViewAction?: boolean;\n total?: number;\n page?: number;\n totalPages?: number;\n pageSize?: number;\n onPageChange?: (page: number) => void;\n onPageSizeChange?: (size: number) => void;\n}) {\n const layout = listSchema['x-lt-layout'];\n const card = listSchema['x-lt-active'] ?? {};\n const rowAction = listSchema['x-lt-row-action'];\n const active = activeEscalations[0];\n const help = listSchema['x-lt-help'];\n useAgeTick(schemaUsesAge(listSchema));\n\n // The active item is a distinct surface on the page wash — the same card\n // treatment the detail page gives its form sections. The label heads the\n // card; the history column beside it stays a quiet chronicle on the wash.\n const activeBlock = (\n <div className=\"border border-surface-border/60 bg-surface-sunken rounded-[0.25em] p-4\">\n <SectionLabel>Active</SectionLabel>\n {active ? (\n <ActiveCard esc={active} card={card} rowAction={rowAction} onOpen={() => onRowClick?.(active)} forceView={forceViewAction} />\n ) : (\n <p className=\"text-xs text-text-tertiary italic\">No active item right now.</p>\n )}\n </div>\n );\n\n const header = help && active ? (\n <div className=\"mb-8\"><MarkdownRenderer content={interpolateHelp(help, rowContext(active))} /></div>\n ) : help ? (\n <div className=\"mb-8\"><MarkdownRenderer content={help} /></div>\n ) : null;\n\n if (layout === 'facet-table') {\n // The table stands alone — no header text above it. Instructions belong\n // in the form's help surfaces; totals live in the pagination bar.\n const resolvedTotal = total ?? activeEscalations.length;\n return (\n <div>\n <FacetTable schema={listSchema as Record<string, unknown>} rows={activeEscalations} groups={groups} role={role} version={listSchemaVersion} onRowClick={onRowClick} onAddFacet={onAddFacet} forceView={forceViewAction} />\n {page !== undefined && totalPages !== undefined && onPageChange && (\n <StickyPagination\n page={page}\n totalPages={totalPages}\n onPageChange={onPageChange}\n total={resolvedTotal}\n pageSize={pageSize ?? 25}\n onPageSizeChange={onPageSizeChange}\n />\n )}\n </div>\n );\n }\n\n if (layout === 'facet-board') {\n return (\n <div>\n {header}\n <FacetBoard\n schema={listSchema}\n rows={activeEscalations}\n role={role}\n onOpenDetail={onRowClick}\n onOpenGroup={onOpenGroup}\n onAddFacet={onAddFacet}\n forceView={forceViewAction}\n />\n {page !== undefined && totalPages !== undefined && onPageChange && totalPages > 1 && (\n <StickyPagination\n page={page}\n totalPages={totalPages}\n onPageChange={onPageChange}\n total={total ?? activeEscalations.length}\n pageSize={pageSize ?? 25}\n onPageSizeChange={onPageSizeChange}\n />\n )}\n </div>\n );\n }\n\n if (layout === 'active-history') {\n return (\n <div>\n {header}\n <div className=\"grid grid-cols-1 @split:grid-cols-[1.6fr_1fr] gap-8 @split:gap-12 items-start\">\n {activeBlock}\n {/* pt-4 seats the History label on the Active label's optical line\n (the card's own padding provides that inset on the left). */}\n <div className=\"@split:pt-4\">\n <SectionLabel>History</SectionLabel>\n <HistoryColumn role={role} def={listSchema['x-lt-history'] ?? {}} onRowClick={onRowClick} />\n </div>\n </div>\n </div>\n );\n }\n\n // \"active\" (or any non-table layout): just the active card.\n return (\n <div>\n {header}\n {activeBlock}\n </div>\n );\n}\n","import { useState } from 'react';\nimport { Link } from 'react-router-dom';\nimport { Circle, Bell, Clock, ListFilter, Search, History } from 'lucide-react';\nimport { EntityTimelinePanel } from '../../components/escalation/EntityTimelinePanel';\nimport { useShellPanelOptional } from '../../hooks/useShellPanel';\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 { UserName } from '../../components/common/display/UserName';\nimport { CountdownTimer } from '../../components/common/display/CountdownTimer';\nimport { formatAgoCompact } from '../../lib/format';\nimport { isEffectivelyClaimed, isAckEscalation } from '../../lib/escalation';\nimport { metadataFacetUrl } from '../../lib/facet-url';\nimport type { LTEscalationRecord } from '../../api/types';\n\nexport interface EscalationColumnOpts {\n highlightKeys?: string[];\n}\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 (row.status === 'expired') {\n return <Circle className=\"w-2.5 h-2.5 shrink-0 text-text-tertiary\" 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/** Key/value metadata dict with 1 row collapsed by default, expand for the rest. */\nexport function MetadataCell({\n metadata,\n role,\n highlightKeys,\n}: {\n metadata: Record<string, unknown> | null;\n role: string;\n highlightKeys?: string[];\n}) {\n const [expanded, setExpanded] = useState(false);\n // Null outside the shell (tests, standalone renders) — the timeline\n // affordance simply doesn't render there.\n const shell = useShellPanelOptional();\n\n if (!metadata || Object.keys(metadata).length === 0) {\n return <span className=\"text-2xs text-text-tertiary\">—</span>;\n }\n\n const hl = highlightKeys ?? [];\n // Highlighted keys first, then the rest in insertion order.\n const allKeys = [\n ...hl.filter((k) => k in metadata),\n ...Object.keys(metadata).filter((k) => !hl.includes(k)),\n ];\n\n const shown = expanded ? allKeys : allKeys.slice(0, 1);\n const hiddenCount = allKeys.length - 1;\n\n return (\n <div className=\"w-full\" onClick={(e) => e.stopPropagation()}>\n <div className=\"space-y-px\">\n {shown.map((k, i) => {\n const sv = typeof metadata[k] === 'object' && metadata[k] !== null\n ? JSON.stringify(metadata[k])\n : String(metadata[k]);\n const isHl = hl.includes(k);\n const isLastShown = i === shown.length - 1;\n return (\n <div key={k} className=\"group/mrow flex items-center gap-1 min-w-0\">\n <span\n className={`shrink-0 w-14 text-2xs font-mono uppercase tracking-wide truncate ${isHl ? 'text-accent' : 'text-text-tertiary'}`}\n title={k}\n >\n {k}\n </span>\n <span\n className={`flex-1 min-w-0 text-2xs font-medium truncate ${isHl ? 'text-text-primary' : 'text-text-secondary'}`}\n title={sv}\n >\n {sv}\n </span>\n <span className=\"flex items-center gap-px shrink-0 opacity-50 group-hover/mrow:opacity-100 transition-opacity\">\n <Link\n to={metadataFacetUrl(k, metadata[k], role)}\n className=\"p-0.5 rounded text-text-quaternary hover:text-accent transition-colors\"\n title={`Filter ${role}: ${k} = ${sv}`}\n onClick={(ev) => ev.stopPropagation()}\n >\n <ListFilter className=\"w-3 h-3\" />\n </Link>\n <Link\n to={metadataFacetUrl(k, metadata[k])}\n className=\"p-0.5 rounded text-text-quaternary hover:text-accent transition-colors\"\n title={`Search all: ${k} = ${sv}`}\n onClick={(ev) => ev.stopPropagation()}\n >\n <Search className=\"w-3 h-3\" />\n </Link>\n {/* filter-present / search-present / history-past — the third\n verb of the triad. String values only: the timeline's GIN\n containment match only serves JSON-string facets. */}\n {shell && typeof metadata[k] === 'string' && (\n <button\n className=\"p-0.5 rounded text-text-quaternary hover:text-accent transition-colors\"\n title={`Timeline: every station ${sv} has moved through`}\n onClick={(ev) => {\n ev.stopPropagation();\n shell.setPanel(\n <EntityTimelinePanel facetKey={k} value={metadata[k] as string} role={role} />,\n { key: 'entity-timeline', width: 420 },\n );\n }}\n >\n <History className=\"w-3 h-3\" />\n </button>\n )}\n </span>\n {/* +N inline at end of single visible row when collapsed */}\n {!expanded && hiddenCount > 0 && (\n <button\n onClick={(ev) => { ev.stopPropagation(); setExpanded(true); }}\n className=\"shrink-0 text-2xs text-text-quaternary hover:text-accent transition-colors font-mono\"\n title={`Show ${hiddenCount} more fields`}\n >\n +{hiddenCount}\n </button>\n )}\n {/* ↑ inline at end of last row when expanded */}\n {expanded && isLastShown && hiddenCount > 0 && (\n <button\n onClick={(ev) => { ev.stopPropagation(); setExpanded(false); }}\n className=\"shrink-0 text-2xs text-text-quaternary hover:text-accent transition-colors\"\n title=\"Show less\"\n >\n ↑\n </button>\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\n/** Build the shared column set, optionally wiring metadata filter callbacks. */\nexport function makeEscalationColumns(opts: EscalationColumnOpts = {}): Column<LTEscalationRecord>[] {\n return [\n {\n key: 'description',\n label: 'Summary',\n priority: 1,\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 // The manufacturing-floor column budget: identity, owner, urgency, age.\n // Everything else (workflow type, metadata, exact timestamps) lives in\n // the facet drawer and the detail page — never as a scrolling column.\n {\n key: 'assigned_to',\n label: 'Assignee',\n priority: 2,\n render: (row) => (row.assigned_to\n ? <UserName userId={row.assigned_to} className={`block truncate text-xs ${CELL_TEXT}`} />\n : <span className=\"text-xs text-text-quaternary\">—</span>),\n className: 'w-36 max-w-[9rem]',\n },\n {\n key: 'role',\n label: 'Role',\n priority: 2,\n render: (row) => (\n <span className={CELL_TEXT}>\n <RolePill role={row.role} size=\"md\" tone=\"inherit\" />\n </span>\n ),\n className: 'w-44 min-w-[11rem]',\n },\n {\n key: 'priority',\n label: 'Pri',\n priority: 2,\n render: (row) => (\n <span className={CELL_TEXT}>\n <PriorityBadge priority={row.priority} size=\"sm\" tone=\"inherit\" />\n </span>\n ),\n className: 'w-10',\n },\n // Enrichment columns — the jumping-off facets. The budget governs the\n // floor: these return only when the table has room (@split / @wall),\n // and in card mode they fold to pairs. The metadata cell carries the\n // clickable refine icons: filter within the role, search across roles\n // (admins), shift+click to AND facets.\n {\n key: 'workflow_type',\n label: 'Workflow',\n priority: 2,\n showFrom: 'split',\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 priority: 2,\n showFrom: 'wall',\n render: (row) => (\n <MetadataCell\n metadata={row.metadata}\n role={row.role}\n highlightKeys={opts.highlightKeys}\n />\n ),\n className: 'w-80 max-w-[19rem] align-top',\n },\n {\n key: 'created_at',\n label: 'Ago',\n priority: 1,\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-14 whitespace-nowrap',\n },\n ];\n}\n\n/** Base columns shared by all escalation list pages (no filter callback). */\nexport const ESCALATION_COLUMNS: Column<LTEscalationRecord>[] = makeEscalationColumns();\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 priority: 1,\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 priority: 1,\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 priority: 1,\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 showRole = 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 /** Kiosk sessions hide the role filter — the session IS the role. */\n showRole?: boolean;\n actions?: React.ReactNode;\n}) {\n // Non-default filters power the folded Filters button's badge.\n const activeFilterCount = [\n filters.role,\n filters.type,\n filters.priority,\n filters.status && filters.status !== 'all' ? filters.status : '',\n filters.search ?? '',\n ].filter(Boolean).length;\n\n return (\n <FilterBar actions={actions} activeFilterCount={activeFilterCount}>\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 {/* Role is the queue's primary facet — URL-driven (?role=). Pages whose\n title doubles as a queue selector share the same param, so the two\n controls mirror each other. Kiosk sessions hide it: the session IS\n the role. */}\n {showRole && (\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 </>\n )}\n <FilterSelect\n label=\"Priority\"\n value={filters.priority}\n onChange={(v) => setFilter('priority', v)}\n options={PRIORITY_OPTIONS}\n />\n <FilterDivider />\n <FilterSelect\n label=\"Workflow Type\"\n value={filters.type}\n onChange={(v) => setFilter('type', v)}\n options={types.map((t) => ({ value: t, label: t }))}\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":["PALETTE","hash","str","h","i","typeColor","typeName","FIND_THRESHOLD","RefineDialog","open","onClose","role","pairs","onNavigate","onAddFacet","selected","setSelected","useState","find","setFind","prevOpen","setPrevOpen","bound","p","preset","needle","visible","t","toggle","key","prev","next","chosen","facets","none","go","url","jsx","Modal","jsxs","Search","e","on","Check","metadataFacetsUrl","useRelatedAggregates","ids","version","enabled","sorted","useQuery","apiFetch","useRelatedRows","id","set","limit","SINGLE_TOKEN","ANY_TOKEN","MISSING_VALUE","parseJsonObject","value","parsed","rowTemplateContext","row","readToken","path","ctx","dot","domain","HELP_DOMAINS","root","getDeep","resolveTemplateValue","single","raw","text","interpolateHelp","resolveRelatedFacets","narrow","out","resolved","splitLabel","col","_a","SPLIT_PATHS","_b","RelatedCell","agg","drillUrl","EM_DASH","order","splits","n","a","b","y","restricted","title","r","href","chip","Link","ROLE_FORMAT","cellText","template","rowContext","interpolateItemTemplate","DetailSection","host","section","roleLabels","navigate","useNavigate","query","rows","labels","_c","hostValues","v","columns","values","displayRoleTitle","FormattedValue","target","DataTable","RowDetail","sections","withOpenMembers","members","m","buildTableRows","groups","byId","g","numeric","nums","foldColumnText","fold","GROUP_FOLDS","mergeAggregates","aggs","present","k","distinctByMatch","seen","match","safeRelations","schema","readListSchemaRelations","RelatedFacetTable","props","related","sets","useRelatedSetEvents","FacetTableBody","FacetTable","relations","useMemo","onRowClick","forceView","setsLoading","columnDefs","rowAction","refineRow","setRefineRow","setOpen","tableRows","lines","grouped","expandable","opens","relatedCell","name","counted","relatedRole","actionLabel","lead","ChevronRight","escalationDotClass","c","IDENTITY_COLUMN_WIDTH","indent","rowRefinePairs","RefineTrigger","actionColumnWidth","RowActionButton","rowClassName","renderExpansion","Fragment","useAgeTick","setTick","useEffect","schemaUsesAge","f","isAgeFormat","ActiveCard","esc","card","onOpen","FieldValue","MarkdownRenderer","HistoryColumn","def","show","setShow","useEscalations","schemaNeedsEnvelope","total","rowDef","DateValue","SectionLabel","children","groupBoardRows","groupBy","facetKey","rawValue","existing","FacetBoard","onOpenDetail","onOpenGroup","refineGroup","setRefineGroup","groupRefinePairs","METADATA_TOKEN","state","stateHue","refinable","activate","EscalationListView","listSchema","listSchemaVersion","activeEscalations","forceViewAction","page","totalPages","pageSize","onPageChange","onPageSizeChange","layout","active","help","activeBlock","header","resolvedTotal","StickyPagination","CELL_TEXT","StatusDot","isAckEscalation","color","Bell","Circle","isEffectivelyClaimed","MetadataCell","metadata","highlightKeys","expanded","setExpanded","shell","useShellPanelOptional","hl","allKeys","shown","hiddenCount","sv","isHl","isLastShown","metadataFacetUrl","ev","ListFilter","EntityTimelinePanel","History","makeEscalationColumns","opts","UserName","RolePill","PriorityBadge","WorkflowPill","formatAgoCompact","ESCALATION_COLUMNS","TIME_LEFT_COLUMN","Clock","CountdownTimer","PRIORITY_OPTIONS","STATUS_OPTIONS","EscalationFilterBar","filters","setFilter","roles","types","showStatus","showSearch","showRole","actions","activeFilterCount","FilterBar","FilterSelect","FilterDivider","FilterInput"],"mappings":"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"}