@hotmeshio/long-tail 0.22.0 → 0.22.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (265) hide show
  1. package/build/api/escalations/accumulate.d.ts +10 -1
  2. package/build/api/escalations/accumulate.js +83 -15
  3. package/build/api/escalations/metadata.d.ts +5 -0
  4. package/build/api/escalations/metadata.js +6 -2
  5. package/build/api/scan-codes/choice.js +3 -2
  6. package/build/api/scan-codes/verbs.d.ts +6 -1
  7. package/build/api/scan-codes/verbs.js +13 -3
  8. package/build/api/workflows/invocation.d.ts +8 -4
  9. package/build/api/workflows/invocation.js +26 -9
  10. package/build/lib/cli/commands/workflows.js +9 -4
  11. package/build/routes/escalations/accumulate.js +13 -6
  12. package/build/sdk/index.d.ts +3 -0
  13. package/build/services/escalation/crud.d.ts +2 -2
  14. package/build/services/escalation/crud.js +4 -2
  15. package/build/services/escalation/facet-sql.js +8 -0
  16. package/build/services/escalation/sql.d.ts +4 -2
  17. package/build/services/escalation/sql.js +10 -2
  18. package/build/services/export/index.d.ts +8 -3
  19. package/build/services/export/index.js +15 -21
  20. package/build/services/pipelines/events.js +2 -1
  21. package/build/services/pipelines/execution-builder.js +2 -1
  22. package/build/services/pipelines/queries.js +2 -1
  23. package/build/services/scan-code/validate.js +19 -0
  24. package/build/services/workflow-state.d.ts +21 -0
  25. package/build/services/workflow-state.js +39 -0
  26. package/build/shared/workflow-state.d.ts +17 -0
  27. package/build/shared/workflow-state.js +29 -0
  28. package/build/system/mcp-servers/admin/escalations.js +8 -4
  29. package/build/system/mcp-servers/admin/schemas.d.ts +38 -0
  30. package/build/system/mcp-servers/admin/schemas.js +4 -0
  31. package/build/system/mcp-servers/admin/workflows.js +20 -31
  32. package/build/system/seed/tool-manifests-admin.d.ts +94 -0
  33. package/build/system/seed/tool-manifests-admin.js +3 -3
  34. package/build/tsconfig.tsbuildinfo +1 -1
  35. package/build/types/facets.d.ts +14 -0
  36. package/build/types/index.d.ts +1 -1
  37. package/build/types/scan-code.d.ts +10 -1
  38. package/build/types/scan-code.js +0 -11
  39. package/dashboard/dist/assets/{AdminDashboard-Covdam48.js → AdminDashboard-BbWve-Ax.js} +2 -2
  40. package/dashboard/dist/assets/{AdminDashboard-Covdam48.js.map → AdminDashboard-BbWve-Ax.js.map} +1 -1
  41. package/dashboard/dist/assets/{AgentConfigPage-CE1k6J5r.js → AgentConfigPage-M-9eTKhP.js} +2 -2
  42. package/dashboard/dist/assets/{AgentConfigPage-CE1k6J5r.js.map → AgentConfigPage-M-9eTKhP.js.map} +1 -1
  43. package/dashboard/dist/assets/{AgentDetailPage-CWJZIZP1.js → AgentDetailPage-CsakSlx5.js} +3 -3
  44. package/dashboard/dist/assets/{AgentDetailPage-CWJZIZP1.js.map → AgentDetailPage-CsakSlx5.js.map} +1 -1
  45. package/dashboard/dist/assets/{AgentsPage---Dg5ufF.js → AgentsPage-Cj_cRTT1.js} +2 -2
  46. package/dashboard/dist/assets/{AgentsPage---Dg5ufF.js.map → AgentsPage-Cj_cRTT1.js.map} +1 -1
  47. package/dashboard/dist/assets/AvailableEscalationsPage-BXJmMBM1.js +2 -0
  48. package/dashboard/dist/assets/AvailableEscalationsPage-BXJmMBM1.js.map +1 -0
  49. package/dashboard/dist/assets/{BotPicker-D3drO3-T.js → BotPicker-CGB16rYU.js} +2 -2
  50. package/dashboard/dist/assets/{BotPicker-D3drO3-T.js.map → BotPicker-CGB16rYU.js.map} +1 -1
  51. package/dashboard/dist/assets/{BulkAssignModal-BOAWsViq.js → BulkAssignModal-MjxcU7N1.js} +2 -2
  52. package/dashboard/dist/assets/{BulkAssignModal-BOAWsViq.js.map → BulkAssignModal-MjxcU7N1.js.map} +1 -1
  53. package/dashboard/dist/assets/{CapabilitiesPage-RGgD3YZO.js → CapabilitiesPage-BxadotXn.js} +2 -2
  54. package/dashboard/dist/assets/{CapabilitiesPage-RGgD3YZO.js.map → CapabilitiesPage-BxadotXn.js.map} +1 -1
  55. package/dashboard/dist/assets/{CollapsibleSection-DNkZn87n.js → CollapsibleSection-BBNpP-6h.js} +2 -2
  56. package/dashboard/dist/assets/{CollapsibleSection-DNkZn87n.js.map → CollapsibleSection-BBNpP-6h.js.map} +1 -1
  57. package/dashboard/dist/assets/{ConfirmDeleteModal-BqzOwhPr.js → ConfirmDeleteModal-D_kAbT_D.js} +2 -2
  58. package/dashboard/dist/assets/{ConfirmDeleteModal-BqzOwhPr.js.map → ConfirmDeleteModal-D_kAbT_D.js.map} +1 -1
  59. package/dashboard/dist/assets/{CountdownTimer-BaexQMK6.js → CountdownTimer-CI_JOAvk.js} +2 -2
  60. package/dashboard/dist/assets/{CountdownTimer-BaexQMK6.js.map → CountdownTimer-CI_JOAvk.js.map} +1 -1
  61. package/dashboard/dist/assets/{CredentialsPage-D7abp0aS.js → CredentialsPage-C9OA1Q2J.js} +2 -2
  62. package/dashboard/dist/assets/{CredentialsPage-D7abp0aS.js.map → CredentialsPage-C9OA1Q2J.js.map} +1 -1
  63. package/dashboard/dist/assets/{CronLabel-DZiWmTwJ.js → CronLabel-sxLLBf2I.js} +2 -2
  64. package/dashboard/dist/assets/{CronLabel-DZiWmTwJ.js.map → CronLabel-sxLLBf2I.js.map} +1 -1
  65. package/dashboard/dist/assets/{DropZone-f1o-GLM8.js → DropZone-B1Tdfddc.js} +2 -2
  66. package/dashboard/dist/assets/{DropZone-f1o-GLM8.js.map → DropZone-B1Tdfddc.js.map} +1 -1
  67. package/dashboard/dist/assets/{ElapsedCell-BdGO_w4v.js → ElapsedCell-jH9m8Dgl.js} +2 -2
  68. package/dashboard/dist/assets/{ElapsedCell-BdGO_w4v.js.map → ElapsedCell-jH9m8Dgl.js.map} +1 -1
  69. package/dashboard/dist/assets/{EntityTimelinePanel-DIDcF5Yu.js → EntityTimelinePanel-Dl3Nr2kk.js} +2 -2
  70. package/dashboard/dist/assets/{EntityTimelinePanel-DIDcF5Yu.js.map → EntityTimelinePanel-Dl3Nr2kk.js.map} +1 -1
  71. package/dashboard/dist/assets/{EscalationListSchemaPage-C28rn9XC.js → EscalationListSchemaPage-DAK6It5J.js} +3 -3
  72. package/dashboard/dist/assets/{EscalationListSchemaPage-C28rn9XC.js.map → EscalationListSchemaPage-DAK6It5J.js.map} +1 -1
  73. package/dashboard/dist/assets/{EscalationListView-CkBnkpDJ.js → EscalationListView-CAHbdxKR.js} +2 -2
  74. package/dashboard/dist/assets/{EscalationListView-CkBnkpDJ.js.map → EscalationListView-CAHbdxKR.js.map} +1 -1
  75. package/dashboard/dist/assets/EscalationSchemaPage-DotfAMCL.js +9 -0
  76. package/dashboard/dist/assets/EscalationSchemaPage-DotfAMCL.js.map +1 -0
  77. package/dashboard/dist/assets/EscalationTimeline-DqmFydnU.js +2 -0
  78. package/dashboard/dist/assets/EscalationTimeline-DqmFydnU.js.map +1 -0
  79. package/dashboard/dist/assets/{EscalationTitleSelect-CzKfavri.js → EscalationTitleSelect-BpRquguO.js} +2 -2
  80. package/dashboard/dist/assets/{EscalationTitleSelect-CzKfavri.js.map → EscalationTitleSelect-BpRquguO.js.map} +1 -1
  81. package/dashboard/dist/assets/{EscalationsOverview-Tdu3Yx2c.js → EscalationsOverview-DtGOqnP4.js} +2 -2
  82. package/dashboard/dist/assets/{EscalationsOverview-Tdu3Yx2c.js.map → EscalationsOverview-DtGOqnP4.js.map} +1 -1
  83. package/dashboard/dist/assets/{EventTable-DiIxOJwO.js → EventTable-DSHqKyX2.js} +2 -2
  84. package/dashboard/dist/assets/{EventTable-DiIxOJwO.js.map → EventTable-DSHqKyX2.js.map} +1 -1
  85. package/dashboard/dist/assets/{FilterBar-CvMBCVIo.js → FilterBar-Dxd0wNSW.js} +2 -2
  86. package/dashboard/dist/assets/{FilterBar-CvMBCVIo.js.map → FilterBar-Dxd0wNSW.js.map} +1 -1
  87. package/dashboard/dist/assets/{GraphInvokePage-DO-yyhi6.js → GraphInvokePage-ChqqGkro.js} +2 -2
  88. package/dashboard/dist/assets/{GraphInvokePage-DO-yyhi6.js.map → GraphInvokePage-ChqqGkro.js.map} +1 -1
  89. package/dashboard/dist/assets/{HomePage-DSS3eHR2.js → HomePage-ByKesG8w.js} +2 -2
  90. package/dashboard/dist/assets/{HomePage-DSS3eHR2.js.map → HomePage-ByKesG8w.js.map} +1 -1
  91. package/dashboard/dist/assets/{ListToolbar-C3-Tqqub.js → ListToolbar-Ddz_S2av.js} +2 -2
  92. package/dashboard/dist/assets/{ListToolbar-C3-Tqqub.js.map → ListToolbar-Ddz_S2av.js.map} +1 -1
  93. package/dashboard/dist/assets/{McpOverview-DEJmsdVi.js → McpOverview-CVe13tEv.js} +2 -2
  94. package/dashboard/dist/assets/{McpOverview-DEJmsdVi.js.map → McpOverview-CVe13tEv.js.map} +1 -1
  95. package/dashboard/dist/assets/McpQueryDetailPage-BQYF2Mjq.js +5 -0
  96. package/dashboard/dist/assets/McpQueryDetailPage-BQYF2Mjq.js.map +1 -0
  97. package/dashboard/dist/assets/{McpQueryPage-BBcG_UuU.js → McpQueryPage-DZi5lm7s.js} +2 -2
  98. package/dashboard/dist/assets/{McpQueryPage-BBcG_UuU.js.map → McpQueryPage-DZi5lm7s.js.map} +1 -1
  99. package/dashboard/dist/assets/{McpRunDetailPage-C6xw0kBg.js → McpRunDetailPage-DreARTE1.js} +2 -2
  100. package/dashboard/dist/assets/{McpRunDetailPage-C6xw0kBg.js.map → McpRunDetailPage-DreARTE1.js.map} +1 -1
  101. package/dashboard/dist/assets/{McpRunsPage-CRQqrF4Q.js → McpRunsPage-DmO0YVhT.js} +2 -2
  102. package/dashboard/dist/assets/{McpRunsPage-CRQqrF4Q.js.map → McpRunsPage-DmO0YVhT.js.map} +1 -1
  103. package/dashboard/dist/assets/{NamespacePill-DADRJOUl.js → NamespacePill-DwM5pNA4.js} +2 -2
  104. package/dashboard/dist/assets/{NamespacePill-DADRJOUl.js.map → NamespacePill-DwM5pNA4.js.map} +1 -1
  105. package/dashboard/dist/assets/{OperationsPage-Dlfwzf-0.js → OperationsPage-DpjCO85T.js} +2 -2
  106. package/dashboard/dist/assets/{OperationsPage-Dlfwzf-0.js.map → OperationsPage-DpjCO85T.js.map} +1 -1
  107. package/dashboard/dist/assets/{OperatorDashboard-DoiDGZ9R.js → OperatorDashboard-Vv_MEBkv.js} +2 -2
  108. package/dashboard/dist/assets/{OperatorDashboard-DoiDGZ9R.js.map → OperatorDashboard-Vv_MEBkv.js.map} +1 -1
  109. package/dashboard/dist/assets/{PageHeader-Csq434-v.js → PageHeader-CMd3f4bz.js} +2 -2
  110. package/dashboard/dist/assets/{PageHeader-Csq434-v.js.map → PageHeader-CMd3f4bz.js.map} +1 -1
  111. package/dashboard/dist/assets/{PageHeaderWithStats-CSnk1p5A.js → PageHeaderWithStats-DHj8Mqox.js} +2 -2
  112. package/dashboard/dist/assets/{PageHeaderWithStats-CSnk1p5A.js.map → PageHeaderWithStats-DHj8Mqox.js.map} +1 -1
  113. package/dashboard/dist/assets/{PersonaDetailPage-BzbA4Prr.js → PersonaDetailPage-CW-2uBHY.js} +2 -2
  114. package/dashboard/dist/assets/{PersonaDetailPage-BzbA4Prr.js.map → PersonaDetailPage-CW-2uBHY.js.map} +1 -1
  115. package/dashboard/dist/assets/{PersonasPage-B36yn4hU.js → PersonasPage-CO6yYQdm.js} +2 -2
  116. package/dashboard/dist/assets/{PersonasPage-B36yn4hU.js.map → PersonasPage-CO6yYQdm.js.map} +1 -1
  117. package/dashboard/dist/assets/{PortalPage-BkD4YfDf.js → PortalPage-DcNqhBlg.js} +2 -2
  118. package/dashboard/dist/assets/{PortalPage-BkD4YfDf.js.map → PortalPage-DcNqhBlg.js.map} +1 -1
  119. package/dashboard/dist/assets/{ProcessDetailPage-BT0eiBWY.js → ProcessDetailPage-BuipGZcC.js} +2 -2
  120. package/dashboard/dist/assets/{ProcessDetailPage-BT0eiBWY.js.map → ProcessDetailPage-BuipGZcC.js.map} +1 -1
  121. package/dashboard/dist/assets/{ProcessesListPage-BEqeeNae.js → ProcessesListPage-D9DYntvl.js} +2 -2
  122. package/dashboard/dist/assets/{ProcessesListPage-BEqeeNae.js.map → ProcessesListPage-D9DYntvl.js.map} +1 -1
  123. package/dashboard/dist/assets/ResolverForm-BVG8X0sS.js +8 -0
  124. package/dashboard/dist/assets/ResolverForm-BVG8X0sS.js.map +1 -0
  125. package/dashboard/dist/assets/{RoleDetailPage-BFuLNJXa.js → RoleDetailPage-KCXDqoJz.js} +3 -3
  126. package/dashboard/dist/assets/{RoleDetailPage-BFuLNJXa.js.map → RoleDetailPage-KCXDqoJz.js.map} +1 -1
  127. package/dashboard/dist/assets/{RolePill-BafrASDX.js → RolePill-Di2CAHuD.js} +2 -2
  128. package/dashboard/dist/assets/{RolePill-BafrASDX.js.map → RolePill-Di2CAHuD.js.map} +1 -1
  129. package/dashboard/dist/assets/{RolesPage-80quJU5-.js → RolesPage-0QJOBSzF.js} +2 -2
  130. package/dashboard/dist/assets/{RolesPage-80quJU5-.js.map → RolesPage-0QJOBSzF.js.map} +1 -1
  131. package/dashboard/dist/assets/{RunAsSelector-BoePhWVD.js → RunAsSelector-Dh4lyyRo.js} +2 -2
  132. package/dashboard/dist/assets/{RunAsSelector-BoePhWVD.js.map → RunAsSelector-Dh4lyyRo.js.map} +1 -1
  133. package/dashboard/dist/assets/{ScanCodesPage-Cu1bKEix.js → ScanCodesPage-CUhCz-Yr.js} +2 -2
  134. package/dashboard/dist/assets/{ScanCodesPage-Cu1bKEix.js.map → ScanCodesPage-CUhCz-Yr.js.map} +1 -1
  135. package/dashboard/dist/assets/{ScanSchemeDetailPage-D9AbS6UY.js → ScanSchemeDetailPage-qzXKNqJK.js} +2 -2
  136. package/dashboard/dist/assets/{ScanSchemeDetailPage-D9AbS6UY.js.map → ScanSchemeDetailPage-qzXKNqJK.js.map} +1 -1
  137. package/dashboard/dist/assets/{ScanStationPage-gcZGefvT.js → ScanStationPage-D8e8cG3t.js} +2 -2
  138. package/dashboard/dist/assets/{ScanStationPage-gcZGefvT.js.map → ScanStationPage-D8e8cG3t.js.map} +1 -1
  139. package/dashboard/dist/assets/{ScopeBadge-b6MIBiYD.js → ScopeBadge-CSItPVOH.js} +2 -2
  140. package/dashboard/dist/assets/{ScopeBadge-b6MIBiYD.js.map → ScopeBadge-CSItPVOH.js.map} +1 -1
  141. package/dashboard/dist/assets/{StickyPagination-9ITrei_d.js → StickyPagination-BSUyf5ja.js} +2 -2
  142. package/dashboard/dist/assets/{StickyPagination-9ITrei_d.js.map → StickyPagination-BSUyf5ja.js.map} +1 -1
  143. package/dashboard/dist/assets/{StreamMessageDetail-BkYvEHFY.js → StreamMessageDetail--tp7l2Sd.js} +2 -2
  144. package/dashboard/dist/assets/{StreamMessageDetail-BkYvEHFY.js.map → StreamMessageDetail--tp7l2Sd.js.map} +1 -1
  145. package/dashboard/dist/assets/{SwimlaneTimeline-B1rotFix.js → SwimlaneTimeline-CxBZ2THh.js} +2 -2
  146. package/dashboard/dist/assets/{SwimlaneTimeline-B1rotFix.js.map → SwimlaneTimeline-CxBZ2THh.js.map} +1 -1
  147. package/dashboard/dist/assets/{TagInput-ZrIIrEUP.js → TagInput-CAgdLN_b.js} +2 -2
  148. package/dashboard/dist/assets/{TagInput-ZrIIrEUP.js.map → TagInput-CAgdLN_b.js.map} +1 -1
  149. package/dashboard/dist/assets/{TaskDetailPage-zhn_U_eC.js → TaskDetailPage-BJ1QrmPH.js} +2 -2
  150. package/dashboard/dist/assets/{TaskDetailPage-zhn_U_eC.js.map → TaskDetailPage-BJ1QrmPH.js.map} +1 -1
  151. package/dashboard/dist/assets/{TaskQueuePill-DkQ1uc6y.js → TaskQueuePill-h0oorVMe.js} +2 -2
  152. package/dashboard/dist/assets/{TaskQueuePill-DkQ1uc6y.js.map → TaskQueuePill-h0oorVMe.js.map} +1 -1
  153. package/dashboard/dist/assets/{TasksListPage-CNbNeagx.js → TasksListPage-5BydGWmt.js} +2 -2
  154. package/dashboard/dist/assets/{TasksListPage-CNbNeagx.js.map → TasksListPage-5BydGWmt.js.map} +1 -1
  155. package/dashboard/dist/assets/{TimeAgo-0YVMBwls.js → TimeAgo-CCnz84Y4.js} +2 -2
  156. package/dashboard/dist/assets/{TimeAgo-0YVMBwls.js.map → TimeAgo-CCnz84Y4.js.map} +1 -1
  157. package/dashboard/dist/assets/{TimestampCell-DB7r3np8.js → TimestampCell-D0ru7Lya.js} +2 -2
  158. package/dashboard/dist/assets/{TimestampCell-DB7r3np8.js.map → TimestampCell-D0ru7Lya.js.map} +1 -1
  159. package/dashboard/dist/assets/{ToolPill-Baxm02L6.js → ToolPill-CQCsVdzD.js} +2 -2
  160. package/dashboard/dist/assets/{ToolPill-Baxm02L6.js.map → ToolPill-CQCsVdzD.js.map} +1 -1
  161. package/dashboard/dist/assets/{ToolTestPanel-BLfA02wv.js → ToolTestPanel-3Kpofmen.js} +2 -2
  162. package/dashboard/dist/assets/{ToolTestPanel-BLfA02wv.js.map → ToolTestPanel-3Kpofmen.js.map} +1 -1
  163. package/dashboard/dist/assets/{TopicDetailPage-eAqPKShq.js → TopicDetailPage-BaBXD_AK.js} +4 -4
  164. package/dashboard/dist/assets/{TopicDetailPage-eAqPKShq.js.map → TopicDetailPage-BaBXD_AK.js.map} +1 -1
  165. package/dashboard/dist/assets/{TopicsPage-BNNWD-zl.js → TopicsPage-Cnm1AAjh.js} +2 -2
  166. package/dashboard/dist/assets/{TopicsPage-BNNWD-zl.js.map → TopicsPage-Cnm1AAjh.js.map} +1 -1
  167. package/dashboard/dist/assets/{UserName-Pw46tO_k.js → UserName-CXsdPiMZ.js} +2 -2
  168. package/dashboard/dist/assets/{UserName-Pw46tO_k.js.map → UserName-CXsdPiMZ.js.map} +1 -1
  169. package/dashboard/dist/assets/{WorkflowExecutionPage-DvA51lT3.js → WorkflowExecutionPage-zx3AUJFd.js} +2 -2
  170. package/dashboard/dist/assets/{WorkflowExecutionPage-DvA51lT3.js.map → WorkflowExecutionPage-zx3AUJFd.js.map} +1 -1
  171. package/dashboard/dist/assets/{WorkflowPill-ZepbO_ny.js → WorkflowPill-Dg7BDTyM.js} +2 -2
  172. package/dashboard/dist/assets/{WorkflowPill-ZepbO_ny.js.map → WorkflowPill-Dg7BDTyM.js.map} +1 -1
  173. package/dashboard/dist/assets/{WorkflowsDashboard-DFDTwnhn.js → WorkflowsDashboard-DfAGK1l7.js} +2 -2
  174. package/dashboard/dist/assets/{WorkflowsDashboard-DFDTwnhn.js.map → WorkflowsDashboard-DfAGK1l7.js.map} +1 -1
  175. package/dashboard/dist/assets/{WorkflowsOverview-5i2Tcy-p.js → WorkflowsOverview-QIYvoa13.js} +2 -2
  176. package/dashboard/dist/assets/{WorkflowsOverview-5i2Tcy-p.js.map → WorkflowsOverview-QIYvoa13.js.map} +1 -1
  177. package/dashboard/dist/assets/{YamlWorkflowDetailPage-p4VEYZS0.js → YamlWorkflowDetailPage-DGgO3hyB.js} +2 -2
  178. package/dashboard/dist/assets/{YamlWorkflowDetailPage-p4VEYZS0.js.map → YamlWorkflowDetailPage-DGgO3hyB.js.map} +1 -1
  179. package/dashboard/dist/assets/{YamlWorkflowsPage-Cq-hMVxl.js → YamlWorkflowsPage-CEsHm0B9.js} +2 -2
  180. package/dashboard/dist/assets/{YamlWorkflowsPage-Cq-hMVxl.js.map → YamlWorkflowsPage-CEsHm0B9.js.map} +1 -1
  181. package/dashboard/dist/assets/{agents-EyBPJMYa.js → agents-v_HH3Rji.js} +2 -2
  182. package/dashboard/dist/assets/{agents-EyBPJMYa.js.map → agents-v_HH3Rji.js.map} +1 -1
  183. package/dashboard/dist/assets/{bots-DX6jjqtF.js → bots-bwvWYrXz.js} +2 -2
  184. package/dashboard/dist/assets/{bots-DX6jjqtF.js.map → bots-bwvWYrXz.js.map} +1 -1
  185. package/dashboard/dist/assets/{capabilities-ZdLv9xBQ.js → capabilities-D4vaw_nQ.js} +2 -2
  186. package/dashboard/dist/assets/{capabilities-ZdLv9xBQ.js.map → capabilities-D4vaw_nQ.js.map} +1 -1
  187. package/dashboard/dist/assets/{controlplane-CpvZaJuw.js → controlplane-CiiZ6LJF.js} +2 -2
  188. package/dashboard/dist/assets/{controlplane-CpvZaJuw.js.map → controlplane-CiiZ6LJF.js.map} +1 -1
  189. package/dashboard/dist/assets/{escalation-columns-Mvsze5eV.js → escalation-columns-Dv-MB3eC.js} +2 -2
  190. package/dashboard/dist/assets/{escalation-columns-Mvsze5eV.js.map → escalation-columns-Dv-MB3eC.js.map} +1 -1
  191. package/dashboard/dist/assets/{index-oFKUFGQL.js → index-2tzsxFat.js} +2 -2
  192. package/dashboard/dist/assets/{index-oFKUFGQL.js.map → index-2tzsxFat.js.map} +1 -1
  193. package/dashboard/dist/assets/{index-DZhtP2Ok.js → index-BLB77tc8.js} +2 -2
  194. package/dashboard/dist/assets/{index-DZhtP2Ok.js.map → index-BLB77tc8.js.map} +1 -1
  195. package/dashboard/dist/assets/{index-PfSRKerc.js → index-C3WutFpT.js} +2 -2
  196. package/dashboard/dist/assets/{index-PfSRKerc.js.map → index-C3WutFpT.js.map} +1 -1
  197. package/dashboard/dist/assets/{index-DkrBFFSO.js → index-C4Lce2ET.js} +2 -2
  198. package/dashboard/dist/assets/{index-DkrBFFSO.js.map → index-C4Lce2ET.js.map} +1 -1
  199. package/dashboard/dist/assets/index-CT-FN6CW.js +3 -0
  200. package/dashboard/dist/assets/index-CT-FN6CW.js.map +1 -0
  201. package/dashboard/dist/assets/{index-Eo-l3Lqo.js → index-C_ISDOWJ.js} +2 -2
  202. package/dashboard/dist/assets/{index-Eo-l3Lqo.js.map → index-C_ISDOWJ.js.map} +1 -1
  203. package/dashboard/dist/assets/{index-Bhb89oHH.js → index-CcuvGdvf.js} +2 -2
  204. package/dashboard/dist/assets/{index-Bhb89oHH.js.map → index-CcuvGdvf.js.map} +1 -1
  205. package/dashboard/dist/assets/{index-BbCjGO3M.js → index-CjenRVX_.js} +2 -2
  206. package/dashboard/dist/assets/{index-BbCjGO3M.js.map → index-CjenRVX_.js.map} +1 -1
  207. package/dashboard/dist/assets/{index-DGmzBY9D.js → index-CzjUgFt_.js} +2 -2
  208. package/dashboard/dist/assets/{index-DGmzBY9D.js.map → index-CzjUgFt_.js.map} +1 -1
  209. package/dashboard/dist/assets/{index-D-Xs4rAW.js → index-D2VKBMng.js} +2 -2
  210. package/dashboard/dist/assets/{index-D-Xs4rAW.js.map → index-D2VKBMng.js.map} +1 -1
  211. package/dashboard/dist/assets/{index-z5Hpeidu.js → index-D6pBLZFu.js} +2 -2
  212. package/dashboard/dist/assets/{index-z5Hpeidu.js.map → index-D6pBLZFu.js.map} +1 -1
  213. package/dashboard/dist/assets/{index-Cn8uJsd7.js → index-IJmtbuLh.js} +2 -2
  214. package/dashboard/dist/assets/{index-Cn8uJsd7.js.map → index-IJmtbuLh.js.map} +1 -1
  215. package/dashboard/dist/assets/{index-CgUcYveM.js → index-N71QQ3J5.js} +5 -5
  216. package/dashboard/dist/assets/index-N71QQ3J5.js.map +1 -0
  217. package/dashboard/dist/assets/{knowledge-CgloEkaf.js → knowledge-D1YP2NzS.js} +2 -2
  218. package/dashboard/dist/assets/{knowledge-CgloEkaf.js.map → knowledge-D1YP2NzS.js.map} +1 -1
  219. package/dashboard/dist/assets/{mcp-Bix7QYO7.js → mcp-Bb5psC61.js} +2 -2
  220. package/dashboard/dist/assets/{mcp-Bix7QYO7.js.map → mcp-Bb5psC61.js.map} +1 -1
  221. package/dashboard/dist/assets/{mcp-query-o-sGX2ST.js → mcp-query-D5jUdZwN.js} +2 -2
  222. package/dashboard/dist/assets/{mcp-query-o-sGX2ST.js.map → mcp-query-D5jUdZwN.js.map} +1 -1
  223. package/dashboard/dist/assets/{personas-30azkJ_s.js → personas-CDndbkp4.js} +2 -2
  224. package/dashboard/dist/assets/{personas-30azkJ_s.js.map → personas-CDndbkp4.js.map} +1 -1
  225. package/dashboard/dist/assets/{pipelines-Bfk2GFK7.js → pipelines-Dq3kNhKu.js} +2 -2
  226. package/dashboard/dist/assets/{pipelines-Bfk2GFK7.js.map → pipelines-Dq3kNhKu.js.map} +1 -1
  227. package/dashboard/dist/assets/{tasks-CpdopewW.js → tasks-BlpDsWCy.js} +2 -2
  228. package/dashboard/dist/assets/{tasks-CpdopewW.js.map → tasks-BlpDsWCy.js.map} +1 -1
  229. package/dashboard/dist/assets/{topics--bvCV9Yp.js → topics-C0YaR9fu.js} +2 -2
  230. package/dashboard/dist/assets/{topics--bvCV9Yp.js.map → topics-C0YaR9fu.js.map} +1 -1
  231. package/dashboard/dist/assets/{useDebouncedValue-Da0lPmj3.js → useDebouncedValue-B-KC5ba3.js} +2 -2
  232. package/dashboard/dist/assets/{useDebouncedValue-Da0lPmj3.js.map → useDebouncedValue-B-KC5ba3.js.map} +1 -1
  233. package/dashboard/dist/assets/{useNamespace-DD_Esl6n.js → useNamespace-Dkr5g2Ac.js} +2 -2
  234. package/dashboard/dist/assets/{useNamespace-DD_Esl6n.js.map → useNamespace-Dkr5g2Ac.js.map} +1 -1
  235. package/dashboard/dist/assets/{useYamlActivityEvents-AeAhZJJk.js → useYamlActivityEvents-BANBOshA.js} +2 -2
  236. package/dashboard/dist/assets/{useYamlActivityEvents-AeAhZJJk.js.map → useYamlActivityEvents-BANBOshA.js.map} +1 -1
  237. package/dashboard/dist/assets/{vendor-icons-B7OcUM6b.js → vendor-icons-CeVtUKyP.js} +2 -2
  238. package/dashboard/dist/assets/{vendor-icons-B7OcUM6b.js.map → vendor-icons-CeVtUKyP.js.map} +1 -1
  239. package/dashboard/dist/assets/{yaml-workflows-BHAOOGvn.js → yaml-workflows-BLYoJfmB.js} +2 -2
  240. package/dashboard/dist/assets/{yaml-workflows-BHAOOGvn.js.map → yaml-workflows-BLYoJfmB.js.map} +1 -1
  241. package/dashboard/dist/index.html +2 -2
  242. package/docs/accumulator.md +37 -1
  243. package/docs/api/mcp/admin.md +3 -2
  244. package/docs/api/sdk/escalations.md +6 -0
  245. package/docs/api/sdk/exports.md +1 -1
  246. package/docs/api/sdk/workflows.md +23 -4
  247. package/docs/cli.md +1 -1
  248. package/docs/dashboard.md +1 -1
  249. package/docs/faceted-routing.md +2 -0
  250. package/docs/hitl/x-lt-widget.md +5 -0
  251. package/docs/scan-codes.md +40 -7
  252. package/package.json +1 -1
  253. package/dashboard/dist/assets/AvailableEscalationsPage-CpbC8oTN.js +0 -2
  254. package/dashboard/dist/assets/AvailableEscalationsPage-CpbC8oTN.js.map +0 -1
  255. package/dashboard/dist/assets/EscalationSchemaPage-W5r0A1kj.js +0 -9
  256. package/dashboard/dist/assets/EscalationSchemaPage-W5r0A1kj.js.map +0 -1
  257. package/dashboard/dist/assets/EscalationTimeline-DKyTz6sM.js +0 -2
  258. package/dashboard/dist/assets/EscalationTimeline-DKyTz6sM.js.map +0 -1
  259. package/dashboard/dist/assets/McpQueryDetailPage-DYJr16l7.js +0 -5
  260. package/dashboard/dist/assets/McpQueryDetailPage-DYJr16l7.js.map +0 -1
  261. package/dashboard/dist/assets/ResolverForm-BwgjIX97.js +0 -7
  262. package/dashboard/dist/assets/ResolverForm-BwgjIX97.js.map +0 -1
  263. package/dashboard/dist/assets/index-B_GT23TE.js +0 -3
  264. package/dashboard/dist/assets/index-B_GT23TE.js.map +0 -1
  265. package/dashboard/dist/assets/index-CgUcYveM.js.map +0 -1
@@ -1,2 +1,2 @@
1
- import{u as l,b as a,c as s}from"./vendor-query-DvWWuNIB.js";import{m as r}from"./index-CgUcYveM.js";function f(e={}){const o=new URLSearchParams;return e.status&&o.set("status",e.status),e.graph_topic&&o.set("graph_topic",e.graph_topic),e.app_id&&o.set("app_id",e.app_id),e.search&&o.set("search",e.search),e.set_id&&o.set("set_id",e.set_id),e.limit&&o.set("limit",String(e.limit)),e.offset!==void 0&&o.set("offset",String(e.offset)),l({queryKey:["yamlWorkflows",e],queryFn:()=>r(`/yaml-workflows?${o}`)})}function m(){return l({queryKey:["yamlWorkflowAppIds"],queryFn:()=>r("/yaml-workflows/app-ids")})}function c(e){return l({queryKey:["yamlWorkflows",e],queryFn:()=>r(`/yaml-workflows/${e}`),enabled:!!e})}function w(){const e=a();return s({mutationFn:o=>r("/yaml-workflows",{method:"POST",body:JSON.stringify(o)}),onSuccess:()=>{e.invalidateQueries({queryKey:["yamlWorkflows"],refetchType:"all"})}})}function k(){const e=a();return s({mutationFn:o=>r(`/yaml-workflows/${o}/deploy`,{method:"POST"}),onSuccess:()=>{e.invalidateQueries({queryKey:["yamlWorkflows"],refetchType:"all"})}})}function p(){const e=a();return s({mutationFn:o=>r(`/yaml-workflows/${o}/activate`,{method:"POST"}),onSuccess:()=>{e.invalidateQueries({queryKey:["yamlWorkflows"],refetchType:"all"})}})}function d(){const e=a();return s({mutationFn:({id:o,data:t,sync:n,execute_as:u})=>r(`/yaml-workflows/${o}/invoke`,{method:"POST",body:JSON.stringify({data:t,sync:n,...u?{execute_as:u}:{}})}),onSuccess:()=>{e.invalidateQueries({queryKey:["yamlWorkflows"],refetchType:"all"})}})}function h(){const e=a();return s({mutationFn:({id:o,task_queue:t,compilation_feedback:n})=>r(`/yaml-workflows/${o}/regenerate`,{method:"POST",body:JSON.stringify({task_queue:t,compilation_feedback:n})}),onSuccess:()=>{e.invalidateQueries({queryKey:["yamlWorkflows"],refetchType:"all"})}})}function q(){const e=a();return s({mutationFn:o=>r(`/yaml-workflows/${o}/archive`,{method:"POST"}),onSuccess:()=>{e.invalidateQueries({queryKey:["yamlWorkflows"],refetchType:"all"})}})}function W(){const e=a();return s({mutationFn:o=>r(`/yaml-workflows/${o}/restore`,{method:"POST"}),onSuccess:()=>{e.invalidateQueries({queryKey:["yamlWorkflows"],refetchType:"all"}),e.invalidateQueries({queryKey:["yamlWorkflow"],refetchType:"all"})}})}function S(){const e=a();return s({mutationFn:({id:o,...t})=>r(`/yaml-workflows/${o}`,{method:"PUT",body:JSON.stringify(t)}),onSuccess:()=>{e.invalidateQueries({queryKey:["yamlWorkflows"],refetchType:"all"})}})}function v(){const e=a();return s({mutationFn:o=>r(`/yaml-workflows/${o}`,{method:"DELETE"}),onSuccess:()=>{e.invalidateQueries({queryKey:["yamlWorkflows"],refetchType:"all"})}})}function T(e){return l({queryKey:["yamlWorkflows",e,"versions"],queryFn:()=>r(`/yaml-workflows/${e}/versions`),enabled:!!e})}function F(e,o){return l({queryKey:["yamlWorkflows",e,"versions",o],queryFn:()=>r(`/yaml-workflows/${e}/versions/${o}`),enabled:!!e&&o!==null})}export{m as a,S as b,c,T as d,k as e,p as f,q as g,W as h,v as i,h as j,F as k,d as l,w as m,f as u};
2
- //# sourceMappingURL=yaml-workflows-BHAOOGvn.js.map
1
+ import{u as l,b as a,c as s}from"./vendor-query-DvWWuNIB.js";import{m as r}from"./index-N71QQ3J5.js";function f(e={}){const o=new URLSearchParams;return e.status&&o.set("status",e.status),e.graph_topic&&o.set("graph_topic",e.graph_topic),e.app_id&&o.set("app_id",e.app_id),e.search&&o.set("search",e.search),e.set_id&&o.set("set_id",e.set_id),e.limit&&o.set("limit",String(e.limit)),e.offset!==void 0&&o.set("offset",String(e.offset)),l({queryKey:["yamlWorkflows",e],queryFn:()=>r(`/yaml-workflows?${o}`)})}function m(){return l({queryKey:["yamlWorkflowAppIds"],queryFn:()=>r("/yaml-workflows/app-ids")})}function c(e){return l({queryKey:["yamlWorkflows",e],queryFn:()=>r(`/yaml-workflows/${e}`),enabled:!!e})}function w(){const e=a();return s({mutationFn:o=>r("/yaml-workflows",{method:"POST",body:JSON.stringify(o)}),onSuccess:()=>{e.invalidateQueries({queryKey:["yamlWorkflows"],refetchType:"all"})}})}function k(){const e=a();return s({mutationFn:o=>r(`/yaml-workflows/${o}/deploy`,{method:"POST"}),onSuccess:()=>{e.invalidateQueries({queryKey:["yamlWorkflows"],refetchType:"all"})}})}function p(){const e=a();return s({mutationFn:o=>r(`/yaml-workflows/${o}/activate`,{method:"POST"}),onSuccess:()=>{e.invalidateQueries({queryKey:["yamlWorkflows"],refetchType:"all"})}})}function d(){const e=a();return s({mutationFn:({id:o,data:t,sync:n,execute_as:u})=>r(`/yaml-workflows/${o}/invoke`,{method:"POST",body:JSON.stringify({data:t,sync:n,...u?{execute_as:u}:{}})}),onSuccess:()=>{e.invalidateQueries({queryKey:["yamlWorkflows"],refetchType:"all"})}})}function h(){const e=a();return s({mutationFn:({id:o,task_queue:t,compilation_feedback:n})=>r(`/yaml-workflows/${o}/regenerate`,{method:"POST",body:JSON.stringify({task_queue:t,compilation_feedback:n})}),onSuccess:()=>{e.invalidateQueries({queryKey:["yamlWorkflows"],refetchType:"all"})}})}function q(){const e=a();return s({mutationFn:o=>r(`/yaml-workflows/${o}/archive`,{method:"POST"}),onSuccess:()=>{e.invalidateQueries({queryKey:["yamlWorkflows"],refetchType:"all"})}})}function W(){const e=a();return s({mutationFn:o=>r(`/yaml-workflows/${o}/restore`,{method:"POST"}),onSuccess:()=>{e.invalidateQueries({queryKey:["yamlWorkflows"],refetchType:"all"}),e.invalidateQueries({queryKey:["yamlWorkflow"],refetchType:"all"})}})}function S(){const e=a();return s({mutationFn:({id:o,...t})=>r(`/yaml-workflows/${o}`,{method:"PUT",body:JSON.stringify(t)}),onSuccess:()=>{e.invalidateQueries({queryKey:["yamlWorkflows"],refetchType:"all"})}})}function v(){const e=a();return s({mutationFn:o=>r(`/yaml-workflows/${o}`,{method:"DELETE"}),onSuccess:()=>{e.invalidateQueries({queryKey:["yamlWorkflows"],refetchType:"all"})}})}function T(e){return l({queryKey:["yamlWorkflows",e,"versions"],queryFn:()=>r(`/yaml-workflows/${e}/versions`),enabled:!!e})}function F(e,o){return l({queryKey:["yamlWorkflows",e,"versions",o],queryFn:()=>r(`/yaml-workflows/${e}/versions/${o}`),enabled:!!e&&o!==null})}export{m as a,S as b,c,T as d,k as e,p as f,q as g,W as h,v as i,h as j,F as k,d as l,w as m,f as u};
2
+ //# sourceMappingURL=yaml-workflows-BLYoJfmB.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"yaml-workflows-BHAOOGvn.js","sources":["../../src/api/yaml-workflows.ts"],"sourcesContent":["import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { apiFetch } from './client';\nimport type { LTYamlWorkflowRecord, LTYamlWorkflowStatus, LTYamlWorkflowVersion } from './types';\n\ninterface YamlWorkflowListResponse {\n workflows: LTYamlWorkflowRecord[];\n total: number;\n}\n\ninterface YamlWorkflowFilters {\n status?: LTYamlWorkflowStatus;\n graph_topic?: string;\n app_id?: string;\n search?: string;\n set_id?: string;\n limit?: number;\n offset?: number;\n}\n\nexport function useYamlWorkflows(filters: YamlWorkflowFilters = {}) {\n const params = new URLSearchParams();\n if (filters.status) params.set('status', filters.status);\n if (filters.graph_topic) params.set('graph_topic', filters.graph_topic);\n if (filters.app_id) params.set('app_id', filters.app_id);\n if (filters.search) params.set('search', filters.search);\n if (filters.set_id) params.set('set_id', filters.set_id);\n if (filters.limit) params.set('limit', String(filters.limit));\n if (filters.offset !== undefined) params.set('offset', String(filters.offset));\n\n return useQuery<YamlWorkflowListResponse>({\n queryKey: ['yamlWorkflows', filters],\n queryFn: () => apiFetch(`/yaml-workflows?${params}`),\n });\n}\n\nexport function useYamlWorkflowAppIds() {\n return useQuery<{ app_ids: string[] }>({\n queryKey: ['yamlWorkflowAppIds'],\n queryFn: () => apiFetch('/yaml-workflows/app-ids'),\n });\n}\n\nexport function useYamlWorkflowByTopic(graphTopic: string | undefined, appId?: string) {\n return useQuery<YamlWorkflowListResponse>({\n queryKey: ['yamlWorkflows', 'byTopic', graphTopic, appId],\n queryFn: () => {\n const params = new URLSearchParams({ graph_topic: graphTopic!, limit: '1' });\n if (appId) params.set('app_id', appId);\n return apiFetch(`/yaml-workflows?${params}`);\n },\n enabled: !!graphTopic,\n });\n}\n\nexport function useYamlWorkflow(id: string) {\n return useQuery<LTYamlWorkflowRecord>({\n queryKey: ['yamlWorkflows', id],\n queryFn: () => apiFetch(`/yaml-workflows/${id}`),\n enabled: !!id,\n });\n}\n\nexport function useCreateYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (input: {\n workflow_id: string;\n task_queue: string;\n workflow_name: string;\n name: string;\n description?: string;\n app_id?: string;\n subscribes?: string;\n tags?: string[];\n compilation_feedback?: string;\n }) =>\n apiFetch<LTYamlWorkflowRecord>('/yaml-workflows', {\n method: 'POST',\n body: JSON.stringify(input),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useDeployYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/deploy`, {\n method: 'POST',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useActivateYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/activate`, {\n method: 'POST',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useInvokeYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, data, sync, execute_as }: { id: string; data: Record<string, unknown>; sync?: boolean; execute_as?: string }) =>\n apiFetch<{ result?: unknown; job_id?: string }>(`/yaml-workflows/${id}/invoke`, {\n method: 'POST',\n body: JSON.stringify({ data, sync, ...(execute_as ? { execute_as } : {}) }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useRegenerateYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, task_queue, compilation_feedback }: { id: string; task_queue?: string; compilation_feedback?: string }) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/regenerate`, {\n method: 'POST',\n body: JSON.stringify({ task_queue, compilation_feedback }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useArchiveYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/archive`, {\n method: 'POST',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useRestoreYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/restore`, {\n method: 'POST',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflow'], refetchType: 'all' });\n },\n });\n}\n\nexport function useUpdateYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, ...updates }: { id: string; yaml_content?: string; name?: string; description?: string; input_schema?: Record<string, unknown>; output_schema?: Record<string, unknown>; tags?: string[]; app_id?: string; graph_topic?: string }) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}`, {\n method: 'PUT',\n body: JSON.stringify(updates),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useDeleteYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<{ deleted: boolean }>(`/yaml-workflows/${id}`, {\n method: 'DELETE',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\n// ── Cron scheduling ─────────────────────────────────────────────\n\nexport function useSetYamlCron() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, cron_schedule, cron_envelope, execute_as }: {\n id: string;\n cron_schedule: string;\n cron_envelope?: Record<string, unknown> | null;\n execute_as?: string | null;\n }) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/cron`, {\n method: 'PUT',\n body: JSON.stringify({ cron_schedule, cron_envelope, execute_as }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useClearYamlCron() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/cron`, {\n method: 'DELETE',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\n// ── Version history ─────────────────────────────────────────────\n\nexport function useYamlWorkflowVersions(id: string) {\n return useQuery<{ versions: LTYamlWorkflowVersion[]; total: number }>({\n queryKey: ['yamlWorkflows', id, 'versions'],\n queryFn: () => apiFetch(`/yaml-workflows/${id}/versions`),\n enabled: !!id,\n });\n}\n\nexport function useYamlWorkflowVersion(id: string, version: number | null) {\n return useQuery<LTYamlWorkflowVersion>({\n queryKey: ['yamlWorkflows', id, 'versions', version],\n queryFn: () => apiFetch(`/yaml-workflows/${id}/versions/${version}`),\n enabled: !!id && version !== null,\n });\n}\n"],"names":["useYamlWorkflows","filters","params","useQuery","apiFetch","useYamlWorkflowAppIds","useYamlWorkflow","id","useCreateYamlWorkflow","queryClient","useQueryClient","useMutation","input","useDeployYamlWorkflow","useActivateYamlWorkflow","useInvokeYamlWorkflow","data","sync","execute_as","useRegenerateYamlWorkflow","task_queue","compilation_feedback","useArchiveYamlWorkflow","useRestoreYamlWorkflow","useUpdateYamlWorkflow","updates","useDeleteYamlWorkflow","useYamlWorkflowVersions","useYamlWorkflowVersion","version"],"mappings":"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"}
1
+ {"version":3,"file":"yaml-workflows-BLYoJfmB.js","sources":["../../src/api/yaml-workflows.ts"],"sourcesContent":["import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { apiFetch } from './client';\nimport type { LTYamlWorkflowRecord, LTYamlWorkflowStatus, LTYamlWorkflowVersion } from './types';\n\ninterface YamlWorkflowListResponse {\n workflows: LTYamlWorkflowRecord[];\n total: number;\n}\n\ninterface YamlWorkflowFilters {\n status?: LTYamlWorkflowStatus;\n graph_topic?: string;\n app_id?: string;\n search?: string;\n set_id?: string;\n limit?: number;\n offset?: number;\n}\n\nexport function useYamlWorkflows(filters: YamlWorkflowFilters = {}) {\n const params = new URLSearchParams();\n if (filters.status) params.set('status', filters.status);\n if (filters.graph_topic) params.set('graph_topic', filters.graph_topic);\n if (filters.app_id) params.set('app_id', filters.app_id);\n if (filters.search) params.set('search', filters.search);\n if (filters.set_id) params.set('set_id', filters.set_id);\n if (filters.limit) params.set('limit', String(filters.limit));\n if (filters.offset !== undefined) params.set('offset', String(filters.offset));\n\n return useQuery<YamlWorkflowListResponse>({\n queryKey: ['yamlWorkflows', filters],\n queryFn: () => apiFetch(`/yaml-workflows?${params}`),\n });\n}\n\nexport function useYamlWorkflowAppIds() {\n return useQuery<{ app_ids: string[] }>({\n queryKey: ['yamlWorkflowAppIds'],\n queryFn: () => apiFetch('/yaml-workflows/app-ids'),\n });\n}\n\nexport function useYamlWorkflowByTopic(graphTopic: string | undefined, appId?: string) {\n return useQuery<YamlWorkflowListResponse>({\n queryKey: ['yamlWorkflows', 'byTopic', graphTopic, appId],\n queryFn: () => {\n const params = new URLSearchParams({ graph_topic: graphTopic!, limit: '1' });\n if (appId) params.set('app_id', appId);\n return apiFetch(`/yaml-workflows?${params}`);\n },\n enabled: !!graphTopic,\n });\n}\n\nexport function useYamlWorkflow(id: string) {\n return useQuery<LTYamlWorkflowRecord>({\n queryKey: ['yamlWorkflows', id],\n queryFn: () => apiFetch(`/yaml-workflows/${id}`),\n enabled: !!id,\n });\n}\n\nexport function useCreateYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (input: {\n workflow_id: string;\n task_queue: string;\n workflow_name: string;\n name: string;\n description?: string;\n app_id?: string;\n subscribes?: string;\n tags?: string[];\n compilation_feedback?: string;\n }) =>\n apiFetch<LTYamlWorkflowRecord>('/yaml-workflows', {\n method: 'POST',\n body: JSON.stringify(input),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useDeployYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/deploy`, {\n method: 'POST',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useActivateYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/activate`, {\n method: 'POST',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useInvokeYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, data, sync, execute_as }: { id: string; data: Record<string, unknown>; sync?: boolean; execute_as?: string }) =>\n apiFetch<{ result?: unknown; job_id?: string }>(`/yaml-workflows/${id}/invoke`, {\n method: 'POST',\n body: JSON.stringify({ data, sync, ...(execute_as ? { execute_as } : {}) }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useRegenerateYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, task_queue, compilation_feedback }: { id: string; task_queue?: string; compilation_feedback?: string }) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/regenerate`, {\n method: 'POST',\n body: JSON.stringify({ task_queue, compilation_feedback }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useArchiveYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/archive`, {\n method: 'POST',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useRestoreYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/restore`, {\n method: 'POST',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflow'], refetchType: 'all' });\n },\n });\n}\n\nexport function useUpdateYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, ...updates }: { id: string; yaml_content?: string; name?: string; description?: string; input_schema?: Record<string, unknown>; output_schema?: Record<string, unknown>; tags?: string[]; app_id?: string; graph_topic?: string }) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}`, {\n method: 'PUT',\n body: JSON.stringify(updates),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useDeleteYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<{ deleted: boolean }>(`/yaml-workflows/${id}`, {\n method: 'DELETE',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\n// ── Cron scheduling ─────────────────────────────────────────────\n\nexport function useSetYamlCron() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, cron_schedule, cron_envelope, execute_as }: {\n id: string;\n cron_schedule: string;\n cron_envelope?: Record<string, unknown> | null;\n execute_as?: string | null;\n }) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/cron`, {\n method: 'PUT',\n body: JSON.stringify({ cron_schedule, cron_envelope, execute_as }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useClearYamlCron() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/cron`, {\n method: 'DELETE',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\n// ── Version history ─────────────────────────────────────────────\n\nexport function useYamlWorkflowVersions(id: string) {\n return useQuery<{ versions: LTYamlWorkflowVersion[]; total: number }>({\n queryKey: ['yamlWorkflows', id, 'versions'],\n queryFn: () => apiFetch(`/yaml-workflows/${id}/versions`),\n enabled: !!id,\n });\n}\n\nexport function useYamlWorkflowVersion(id: string, version: number | null) {\n return useQuery<LTYamlWorkflowVersion>({\n queryKey: ['yamlWorkflows', id, 'versions', version],\n queryFn: () => apiFetch(`/yaml-workflows/${id}/versions/${version}`),\n enabled: !!id && version !== null,\n });\n}\n"],"names":["useYamlWorkflows","filters","params","useQuery","apiFetch","useYamlWorkflowAppIds","useYamlWorkflow","id","useCreateYamlWorkflow","queryClient","useQueryClient","useMutation","input","useDeployYamlWorkflow","useActivateYamlWorkflow","useInvokeYamlWorkflow","data","sync","execute_as","useRegenerateYamlWorkflow","task_queue","compilation_feedback","useArchiveYamlWorkflow","useRestoreYamlWorkflow","useUpdateYamlWorkflow","updates","useDeleteYamlWorkflow","useYamlWorkflowVersions","useYamlWorkflowVersion","version"],"mappings":"qGAmBO,SAASA,EAAiBC,EAA+B,GAAI,CAClE,MAAMC,EAAS,IAAI,gBACnB,OAAID,EAAQ,QAAQC,EAAO,IAAI,SAAUD,EAAQ,MAAM,EACnDA,EAAQ,aAAaC,EAAO,IAAI,cAAeD,EAAQ,WAAW,EAClEA,EAAQ,QAAQC,EAAO,IAAI,SAAUD,EAAQ,MAAM,EACnDA,EAAQ,QAAQC,EAAO,IAAI,SAAUD,EAAQ,MAAM,EACnDA,EAAQ,QAAQC,EAAO,IAAI,SAAUD,EAAQ,MAAM,EACnDA,EAAQ,OAAOC,EAAO,IAAI,QAAS,OAAOD,EAAQ,KAAK,CAAC,EACxDA,EAAQ,SAAW,QAAWC,EAAO,IAAI,SAAU,OAAOD,EAAQ,MAAM,CAAC,EAEtEE,EAAmC,CACxC,SAAU,CAAC,gBAAiBF,CAAO,EACnC,QAAS,IAAMG,EAAS,mBAAmBF,CAAM,EAAE,CAAA,CACpD,CACH,CAEO,SAASG,GAAwB,CACtC,OAAOF,EAAgC,CACrC,SAAU,CAAC,oBAAoB,EAC/B,QAAS,IAAMC,EAAS,yBAAyB,CAAA,CAClD,CACH,CAcO,SAASE,EAAgBC,EAAY,CAC1C,OAAOJ,EAA+B,CACpC,SAAU,CAAC,gBAAiBI,CAAE,EAC9B,QAAS,IAAMH,EAAS,mBAAmBG,CAAE,EAAE,EAC/C,QAAS,CAAC,CAACA,CAAA,CACZ,CACH,CAEO,SAASC,GAAwB,CACtC,MAAMC,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAaC,GAWXR,EAA+B,kBAAmB,CAChD,OAAQ,OACR,KAAM,KAAK,UAAUQ,CAAK,CAAA,CAC3B,EACH,UAAW,IAAM,CACfH,EAAY,kBAAkB,CAAE,SAAU,CAAC,eAAe,EAAG,YAAa,MAAO,CACnF,CAAA,CACD,CACH,CAEO,SAASI,GAAwB,CACtC,MAAMJ,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAaJ,GACXH,EAA+B,mBAAmBG,CAAE,UAAW,CAC7D,OAAQ,MAAA,CACT,EACH,UAAW,IAAM,CACfE,EAAY,kBAAkB,CAAE,SAAU,CAAC,eAAe,EAAG,YAAa,MAAO,CACnF,CAAA,CACD,CACH,CAEO,SAASK,GAA0B,CACxC,MAAML,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAaJ,GACXH,EAA+B,mBAAmBG,CAAE,YAAa,CAC/D,OAAQ,MAAA,CACT,EACH,UAAW,IAAM,CACfE,EAAY,kBAAkB,CAAE,SAAU,CAAC,eAAe,EAAG,YAAa,MAAO,CACnF,CAAA,CACD,CACH,CAEO,SAASM,GAAwB,CACtC,MAAMN,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAY,CAAC,CAAE,GAAAJ,EAAI,KAAAS,EAAM,KAAAC,EAAM,WAAAC,KAC7Bd,EAAgD,mBAAmBG,CAAE,UAAW,CAC9E,OAAQ,OACR,KAAM,KAAK,UAAU,CAAE,KAAAS,EAAM,KAAAC,EAAM,GAAIC,EAAa,CAAE,WAAAA,CAAA,EAAe,GAAK,CAAA,CAC3E,EACH,UAAW,IAAM,CACfT,EAAY,kBAAkB,CAAE,SAAU,CAAC,eAAe,EAAG,YAAa,MAAO,CACnF,CAAA,CACD,CACH,CAEO,SAASU,GAA4B,CAC1C,MAAMV,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAY,CAAC,CAAE,GAAAJ,EAAI,WAAAa,EAAY,qBAAAC,KAC7BjB,EAA+B,mBAAmBG,CAAE,cAAe,CACjE,OAAQ,OACR,KAAM,KAAK,UAAU,CAAE,WAAAa,EAAY,qBAAAC,EAAsB,CAAA,CAC1D,EACH,UAAW,IAAM,CACfZ,EAAY,kBAAkB,CAAE,SAAU,CAAC,eAAe,EAAG,YAAa,MAAO,CACnF,CAAA,CACD,CACH,CAEO,SAASa,GAAyB,CACvC,MAAMb,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAaJ,GACXH,EAA+B,mBAAmBG,CAAE,WAAY,CAC9D,OAAQ,MAAA,CACT,EACH,UAAW,IAAM,CACfE,EAAY,kBAAkB,CAAE,SAAU,CAAC,eAAe,EAAG,YAAa,MAAO,CACnF,CAAA,CACD,CACH,CAEO,SAASc,GAAyB,CACvC,MAAMd,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAaJ,GACXH,EAA+B,mBAAmBG,CAAE,WAAY,CAC9D,OAAQ,MAAA,CACT,EACH,UAAW,IAAM,CACfE,EAAY,kBAAkB,CAAE,SAAU,CAAC,eAAe,EAAG,YAAa,MAAO,EACjFA,EAAY,kBAAkB,CAAE,SAAU,CAAC,cAAc,EAAG,YAAa,MAAO,CAClF,CAAA,CACD,CACH,CAEO,SAASe,GAAwB,CACtC,MAAMf,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAY,CAAC,CAAE,GAAAJ,EAAI,GAAGkB,KACpBrB,EAA+B,mBAAmBG,CAAE,GAAI,CACtD,OAAQ,MACR,KAAM,KAAK,UAAUkB,CAAO,CAAA,CAC7B,EACH,UAAW,IAAM,CACfhB,EAAY,kBAAkB,CAAE,SAAU,CAAC,eAAe,EAAG,YAAa,MAAO,CACnF,CAAA,CACD,CACH,CAEO,SAASiB,GAAwB,CACtC,MAAMjB,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAaJ,GACXH,EAA+B,mBAAmBG,CAAE,GAAI,CACtD,OAAQ,QAAA,CACT,EACH,UAAW,IAAM,CACfE,EAAY,kBAAkB,CAAE,SAAU,CAAC,eAAe,EAAG,YAAa,MAAO,CACnF,CAAA,CACD,CACH,CAsCO,SAASkB,EAAwBpB,EAAY,CAClD,OAAOJ,EAA+D,CACpE,SAAU,CAAC,gBAAiBI,EAAI,UAAU,EAC1C,QAAS,IAAMH,EAAS,mBAAmBG,CAAE,WAAW,EACxD,QAAS,CAAC,CAACA,CAAA,CACZ,CACH,CAEO,SAASqB,EAAuBrB,EAAYsB,EAAwB,CACzE,OAAO1B,EAAgC,CACrC,SAAU,CAAC,gBAAiBI,EAAI,WAAYsB,CAAO,EACnD,QAAS,IAAMzB,EAAS,mBAAmBG,CAAE,aAAasB,CAAO,EAAE,EACnE,QAAS,CAAC,CAACtB,GAAMsB,IAAY,IAAA,CAC9B,CACH"}
@@ -8,10 +8,10 @@
8
8
  <link rel="preconnect" href="https://fonts.googleapis.com" />
9
9
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
10
10
  <link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet" />
11
- <script type="module" crossorigin src="./assets/index-CgUcYveM.js"></script>
11
+ <script type="module" crossorigin src="./assets/index-N71QQ3J5.js"></script>
12
12
  <link rel="modulepreload" crossorigin href="./assets/vendor-query-DvWWuNIB.js">
13
13
  <link rel="modulepreload" crossorigin href="./assets/vendor-react-_9U4mKFr.js">
14
- <link rel="modulepreload" crossorigin href="./assets/vendor-icons-B7OcUM6b.js">
14
+ <link rel="modulepreload" crossorigin href="./assets/vendor-icons-CeVtUKyP.js">
15
15
  <link rel="stylesheet" crossorigin href="./assets/index-Dh8MJl3L.css">
16
16
  </head>
17
17
  <body>
@@ -69,7 +69,43 @@ A batch wait may add `partialOnTimeout: true`; it stores `envelope.batch_partial
69
69
 
70
70
  A facet selector (`accumulateByMetadata`, `removeItemByMetadata`, a reciprocal named by `key` + `value`, the scan verb's item mode) considers only pending rows that carry the accumulator declaration, ordered by priority then age. A release or remediation row sharing the container's facet is never picked; with no open container the answer is `not-found`, and the scan answers `no_open_container`.
71
71
 
72
- An add takes `itemKey` (1 to 128 characters), an optional `payload` (validated against the container role's versioned form when present), an optional `metadata` patch (reserved keys rejected), `assertClaim` (by id), and an optional `reciprocal`.
72
+ `accumulateByMetadata` also takes `container: { types?, subtypes?, facets? }`, which narrows the pick to accumulators of that escalation type or subtype that also carry the extra facets. A narrowed add picks its container first, never choosing the add's own reciprocal row, then adds by id; the by-id statement re-checks `pending` under lock. Use it when items are themselves accumulators in the container's queue and share its facet:
73
+
74
+ ```ts
75
+ await lt.escalations.accumulateByMetadata({
76
+ key: 'boxKey', value: 'BX-1', itemKey: orderId,
77
+ restrictRoles: ['match-filling'],
78
+ container: { types: ['matchBox'] },
79
+ reciprocal: { id: slotEscalationId },
80
+ });
81
+ ```
82
+
83
+ An add takes `itemKey` (1 to 128 characters), an optional `payload` (validated against the container role's versioned form when present), an optional `metadata` patch (reserved keys rejected), `assertClaim` (by id), an optional `reciprocal`, and an optional `initiatedBy`.
84
+
85
+ ### Attribution
86
+
87
+ Each entry records its `actor`: the caller, or the user named by `initiatedBy`. A trusted service that adds or removes an item because a person acted elsewhere (submitted their row, scanned at another station) passes that person's `lt_users.id`, so the Items panel and the `escalation.updated` event credit the person. Only callers with global escalation access may name someone else, and the id must be a known user. `initiatedBy` is attribution only: the caller's rights gate the write, and the caller stays `metadata.resolved_by`. All six add and remove forms accept it, as do the admin MCP tools `accumulate_item` and `remove_item`.
88
+
89
+ ### Item labels
90
+
91
+ The Items panel lists each held item by its key. A container role's `form_schema` may declare `x-lt-item-label`, a template whose `{{item.*}}` tokens read the held item (`itemKey`, `payload`, `actor`, `at`) beside the usual `escalation`, `metadata`, `envelope`, and `payload` domains:
92
+
93
+ ```json
94
+ { "type": "object", "x-lt-item-label": "{{item.payload.stickerCode}}", "properties": { } }
95
+ ```
96
+
97
+ The panel shows the label with the key as its tooltip and still removes by key. When the template's tokens all resolve to nothing, the item shows its key.
98
+
99
+ A scan's item-mode `accumulate` step fills the same payload field from the row it located, through a `{item.<facet>}` token in `params.resolverPayload`:
100
+
101
+ ```jsonc
102
+ "params": {
103
+ "accumulate": { "containerFacet": "boxKey" },
104
+ "resolverPayload": { "stickerCode": "{item.orderSlug}" }
105
+ }
106
+ ```
107
+
108
+ A located row that lacks the facet makes the step fall through, so every row the step can locate carries it. When the container role enforces its form, declare the payload field there.
73
109
 
74
110
  ### Outcomes
75
111
 
@@ -552,8 +552,9 @@ Start a workflow registered read-safe (side-effect-free). Same contract as `invo
552
552
 
553
553
  ### get_workflow_status
554
554
 
555
- Check workflow status and result. Returns status (`running` | `complete`) and the
556
- result when complete. Resolution is namespace-aware — pass `app_id` to read a
555
+ Check workflow status and result. Returns status (`running` | `complete` | `failed`)
556
+ and the result when complete; a failed run carries `terminated` (true when an
557
+ interrupt ended it) and `error`. Resolution is namespace-aware — pass `app_id` to read a
557
558
  workflow (e.g. a child) running in a non-default HotMesh namespace.
558
559
 
559
560
  | | |
@@ -888,6 +888,8 @@ await lt.escalations.accumulateByMetadata({ key: 'binKey', value: binKey, itemKe
888
888
  | `assertClaim` | `boolean` | No | By id only: require the caller's own live claim |
889
889
  | `reciprocal` | `object` | No | `{ id \| signalKey \| key + value, payload? }`: a second accumulator row written in the same statement, both or neither |
890
890
  | `restrictRoles` | `string[]` | No | By metadata only: expected queues, intersected with the caller's write scope. The facet selects among pending accumulator rows only; other rows sharing it are never candidates, and none open answers 404 |
891
+ | `container` | `{ types?, subtypes?, facets? }` | No | By metadata only: narrows the container to accumulators of these escalation types or subtypes that also carry these facets. The add's own reciprocal row is never its container |
892
+ | `initiatedBy` | `string` | No | The `lt_users.id` of the person who caused the add, recorded as the entry's `actor`. Global-access callers only; attribution, never privilege |
891
893
 
892
894
  **Returns:** `LTApiResult<{ outcome: 'accepted' \| 'completed', count, remaining, escalationId, signaled?, workflowId?, reciprocal? }>`. `remaining` is `null` on an unbounded accumulator. 409 on `Item already held`, `Accumulator is full`, claim blocks, terminal rows, and reciprocal blocks; 400 on a non-accumulator; 404 non-disclosure.
893
895
 
@@ -902,6 +904,8 @@ await lt.escalations.removeItem({ id: binId, itemKey: orderId, reciprocal: { id:
902
904
  // → { outcome: 'removed', count: 11, escalationId, reciprocal?: { count, escalationId } }
903
905
  ```
904
906
 
907
+ Removals take `initiatedBy` too, with the same rules.
908
+
905
909
  **Returns:** `LTApiResult<{ outcome: 'removed', count, escalationId, reciprocal? }>`. 404 `Item not held by this escalation`.
906
910
 
907
911
  **Auth:** Required
@@ -1087,6 +1091,8 @@ const result = await lt.escalations.searchByFacets({
1087
1091
  });
1088
1092
  ```
1089
1093
 
1094
+ `types` and `subtypes` narrow by the escalation's declared type and subtype (`type = ANY(types)`, `subtype = ANY(subtypes)`); every other `FacetQuery` element applies as documented in [Faceted Routing](../../faceted-routing.md#the-query--facetquery).
1095
+
1090
1096
  **Returns:** `LTApiResult<{ escalations; total }>`.
1091
1097
 
1092
1098
  ## claimGroups
@@ -99,7 +99,7 @@ const result = await lt.exports.getStatus({ workflowId: 'wf_abc123' });
99
99
  |-------|------|----------|-------------|
100
100
  | `workflowId` | `string` | Yes | The workflow's unique identifier |
101
101
 
102
- **Returns:** `LTApiResult<WorkflowStatus>` -- returns 404 if the workflow is not found or data has expired.
102
+ **Returns:** `LTApiResult<{ workflow_id, status, state, terminated }>`: the numeric HotMesh `status`, `state` (`running`, `completed`, or `failed`) and `terminated`. Returns 404 if the workflow is not found or data has expired.
103
103
 
104
104
  **Auth:** Not required
105
105
 
@@ -46,7 +46,21 @@ const result = await lt.workflows.getStatus({ workflowId: 'wf_abc' });
46
46
  |-------|------|----------|-------------|
47
47
  | `workflowId` | `string` | Yes | HotMesh workflow ID |
48
48
 
49
- **Returns:** `LTApiResult<{ workflowId, status }>` -- status 0 = completed, 1 = running. Returns 404 if not found.
49
+ **Returns:** `LTApiResult<{ workflowId, status, state, terminated, error? }>`. Returns 404 if not found.
50
+
51
+ | Field | Meaning |
52
+ |-------|---------|
53
+ | `status` | HotMesh job status: above 0 running, 0 closed, below 0 terminated |
54
+ | `state` | `running`, `completed`, or `failed`. A run that closed with an error is `failed` at status 0; a terminated run is `failed` |
55
+ | `terminated` | `true` when an interrupt ended the run |
56
+ | `error` | the failure message, when HotMesh still holds it |
57
+
58
+ ```typescript
59
+ // after lt.workflows.terminate({ workflowId: 'wf_abc' })
60
+ // result.data → { workflowId: 'wf_abc', status: -999999999, state: 'failed', terminated: true }
61
+ ```
62
+
63
+ Terminate acts on the named run; a child run is terminated by its own id.
50
64
 
51
65
  **Auth:** Not required
52
66
 
@@ -67,7 +81,7 @@ const result = await lt.workflows.getEnvelopes({ workflowId: 'reviewContent-a1b2
67
81
  |-------|------|----------|-------------|
68
82
  | `workflowId` | `string` | Yes | The workflow's unique identifier |
69
83
 
70
- **Returns:** `LTApiResult<{ workflow_id, status: 'running' | 'completed' | 'failed', input, output, error? }>` — 404 when the workflow is unknown or expired.
84
+ **Returns:** `LTApiResult<{ workflow_id, status: 'running' | 'completed' | 'failed', terminated?, input, output, error? }>` — `terminated: true` when an interrupt ended the run; 404 when the workflow is unknown or expired.
71
85
 
72
86
  **Auth:** Not required
73
87
 
@@ -77,7 +91,7 @@ const result = await lt.workflows.getEnvelopes({ workflowId: 'reviewContent-a1b2
77
91
 
78
92
  Get the result of a completed workflow.
79
93
 
80
- Returns 202 if the workflow is still running. Never blocks.
94
+ Returns 202 if the workflow is still running, and a failed or terminated run answers at once with its error. Never blocks.
81
95
 
82
96
  ```typescript
83
97
  const result = await lt.workflows.getResult({ workflowId: 'wf_abc' });
@@ -89,7 +103,12 @@ const result = await lt.workflows.getResult({ workflowId: 'wf_abc' });
89
103
  |-------|------|----------|-------------|
90
104
  | `workflowId` | `string` | Yes | HotMesh workflow ID |
91
105
 
92
- **Returns:** `LTApiResult<{ workflowId, result }>` (status 200 when complete) or `LTApiResult<{ workflowId, status: 'running' }>` (status 202 when still running). Returns 404 if not found.
106
+ **Returns:** one of
107
+ - `LTApiResult<{ workflowId, state: 'completed', result }>` (200)
108
+ - `LTApiResult<{ workflowId, state: 'failed', terminated, error?, result: null }>` (200)
109
+ - `LTApiResult<{ workflowId, status: 'running' }>` (202)
110
+
111
+ Returns 404 if not found.
93
112
 
94
113
  **Auth:** Not required
95
114
 
package/docs/cli.md CHANGED
@@ -96,7 +96,7 @@ ltc esc timeline serialNumber PRN-001 --entity serialNumber
96
96
  ```bash
97
97
  ltc wf list # Discovered workflows
98
98
  ltc wf invoke reviewContent --data '{"content": "test"}'
99
- ltc wf status wf-abc123 # Check status (running/completed)
99
+ ltc wf status wf-abc123 # Check status (running, completed, failed, failed (terminated))
100
100
  ltc wf result wf-abc123 # Get result payload
101
101
  ltc wf terminate wf-abc123 # Terminate a running workflow
102
102
  ```
package/docs/dashboard.md CHANGED
@@ -276,7 +276,7 @@ Accessible at `/admin/roles/:role`. One page per role — a quiet header carryin
276
276
 
277
277
  **Members** — who holds the role: admins manage it; members work its queue according to their read/write work-surface scope (read = which items appear; write = which they can claim and resolve). A `member` grant carries a scope chosen from five named profiles: full worker (`all`/`all`, default), see-all-act-own (`all`/`self`), own-items-only (`self`/`self`), read-only auditor (`all`/`none`), and read-only own (`self`/`none`). The picker enforces **write ⊆ read**. `admin` and `superadmin` grants always work the whole queue.
278
278
 
279
- **Pins** — two live-save groups. **Link Variables** leads: the facet names members bind per device (`properties.link_variables` — name, optional label, optional default). A pin below may reference a variable as a facet value, `facets={"facility":"{lt:facility}"}`; each member device opens it scoped to its own binding (set from the user menu → Link variables), falling back to the declared default or, unbound, applying no filter. A caption under each templated pin previews the binding on the viewing device (`facility = 'soleful'` / `facility = <empty>`). **Default Pins** follows — the pinned-view seeds this role hands its members (`default_pins`): label, dashboard-relative URL, optional badge. Members see them in their Pinned nav section from first login (marked role-provided) and may promote, hide, or reorder them via preferences; promoting a templated pin copies the template, so it keeps following the device's bindings. See [Faceted Routing — Link variables](faceted-routing.md#link-variables).
279
+ **Pins** — two live-save groups. **Link Variables** leads: the facet names members bind per device (`properties.link_variables` — name, optional label, optional default). A pin below may reference a variable as a facet value, `facets={"facility":"{lt:facility}"}`; each member device opens it scoped to its own binding (set from the user menu → Link variables), falling back to the declared default or, unbound, applying no filter. A caption under each templated pin previews the binding on the viewing device (`facility = 'soleful'` / `facility = <empty>`). **Default Pins** follows — the pinned-view seeds this role hands its members (`default_pins`): label, dashboard-relative URL, optional badge. A badge counts the list its URL opens, with every list filter it carries (role, type, subtype, priority, search, facets, status), so two pins that differ only by subtype count differently. Members see them in their Pinned nav section from first login (marked role-provided) and may promote, hide, or reorder them via preferences; promoting a templated pin copies the template, so it keeps following the device's bindings. See [Faceted Routing — Link variables](faceted-routing.md#link-variables).
280
280
 
281
281
  **Portal** — the role's named portals, each its pinned views laid out as one page. The editor mirrors the page: sheets, title bands, cell panels, dashed slots for adding. Name a portal and start it from a pin; then rows of cells, each cell a pin picked from the role's default pins or the admin's own pins, or typed as a label and URL, with editable panel titles (`portals`, up to 12 portals of 4 rows by 6). Edits join the page draft and **Save** writes them. A sketch shows each shape; **Open** opens `/portal/<role>/<key>`. See [Portal](hitl/portal.md).
282
282
 
@@ -38,6 +38,8 @@ count lives in a metadata facet so a group can be claimed all-or-nothing only wh
38
38
  interface FacetQuery {
39
39
  role?: string; // hard isolation (exact)
40
40
  roles?: string[]; // role = ANY(...)
41
+ types?: string[]; // type = ANY(...)
42
+ subtypes?: string[]; // subtype = ANY(...)
41
43
  facets?: Record<string, any>; // metadata @> facets — required (AND), GIN-served
42
44
  block?: Record<string, any>[]; // NOT (metadata @> ANY(block)) — exclusion list
43
45
  range?: { facet: string; op: '<' | '<=' | '>' | '>=' | '='; value: number }[];
@@ -16,6 +16,11 @@ For rich inputs beyond standard HTML types, set `x-lt-widget` on any field:
16
16
  | `"escalation"` | ReadOnly embedded escalation card. ID sourced from `x-lt-source`; optional `x-lt-fields` surfaces any metadata or resolver detail. See [x-lt-embed.md](x-lt-embed.md). |
17
17
  | `"escalation-list"` | ReadOnly embedded escalation list. Driven by an `x-lt-query` facet object; columns from `x-lt-columns`. See [x-lt-embed.md](x-lt-embed.md). |
18
18
  | `"invoke"` | ReadOnly control that starts a workflow, directly or in a prefilled dialog. Target and payload mapping in `x-lt-invoke`. See [x-lt-invoke.md](x-lt-invoke.md). |
19
+ | `"textarea"` | Alias of `format: "textarea"`: a multi-line text box. |
20
+
21
+ A string field renders as a textarea when it declares `format: "textarea"` or `x-lt-widget: "textarea"`, when its value holds a line break, or when its value runs past 80 characters. Read-only fields and dictionary displays keep the line breaks the value carries.
22
+
23
+ The escalation schema editor flags any `x-lt-widget` name outside this table. The schema still saves, and the field renders as its type's default control.
19
24
 
20
25
  ---
21
26
 
@@ -98,7 +98,21 @@ Verbs are the canonical escalation actions:
98
98
  | `resolve` | Atomic claim + resolve with a canned payload | `resolverPayload`, `metadata` |
99
99
  | `escalate` | Create an escalation in another queue, optionally closing the located one | `targetRole`, `closeCurrent`, `escalationType`, `description`, `metadata` |
100
100
  | `cancel` | Claim-as-lock, then cancel | — |
101
- | `accumulate` | Add the scanned item to an open accumulator escalation | `itemKey` (template), `resolverPayload`, `metadata`, `accumulate: { containerFacet, containerRoles, reciprocal }` |
101
+ | `accumulate` | Add the scanned item to an open accumulator escalation | `itemKey` (template), `resolverPayload`, `metadata`, `accumulate: { containerFacet, container, containerRoles, reciprocal }` |
102
+
103
+ `availability` names the claim state a step's row must be in:
104
+
105
+ | `availability` | Matches |
106
+ |---|---|
107
+ | `mine` | a row under a live claim held by the acting identity (the badged user, else the session user) |
108
+ | `available` | an unclaimed row, or one whose claim has lapsed |
109
+ | `claimed` | a row under anyone's live claim |
110
+ | `any` (default) | every row the rest of the query matches |
111
+
112
+ A `resolve` step applies it inside the atomic resolve: `mine` resolves the
113
+ actor's own claim, the most recently claimed first when there are several,
114
+ so a shelf scan bins the bag in the associate's hand even when another bag
115
+ for the same shelf is waiting. With no matching row the step falls through.
102
116
 
103
117
  String values inside `itemKey`, `resolverPayload`, and `metadata` interpolate
104
118
  `{scan.target}`, `{scan.category}`, and `{scan.scannedAt}`. Two facet bags
@@ -117,10 +131,27 @@ scanned target is the ITEM: the step locates the item's own pending row
117
131
  through the scheme facet, reads that facet from the row (a bag row carrying
118
132
  `binKey: "B-7"`), and adds the target to the pending accumulator whose
119
133
  metadata carries the same value, writing the item's row as the reciprocal in
120
- the same statement (`reciprocal: false` skips it; `containerRoles` names the
121
- container queues). The container pick considers only pending rows that carry
122
- the accumulator declaration, so a release row sharing the facet during a
123
- pack-out is never the target. Without it the scanned target is the CONTAINER and the step
134
+ the same statement (`reciprocal: false` skips it). The container pick
135
+ considers only pending rows that carry the accumulator declaration, so a
136
+ release row sharing the facet during a pack-out is never the target.
137
+ `container` narrows the pick further:
138
+
139
+ ```jsonc
140
+ "accumulate": {
141
+ "containerFacet": "boxKey",
142
+ "container": {
143
+ "roles": ["match-filling"], // container queues (containerRoles is an alias)
144
+ "types": ["matchBox"], // escalation type
145
+ "subtypes": ["box"], // escalation subtype
146
+ "facets": { "open": true } // extra metadata guards
147
+ }
148
+ }
149
+ ```
150
+
151
+ A design that parks each item as its own accumulator in the same queue as
152
+ its container (a bag's slot beside its box, both carrying `boxKey`) declares
153
+ the container's type or subtype, so the add lands in the box and never in a
154
+ sibling's slot. The item's own row is never its container. Without it the scanned target is the CONTAINER and the step
124
155
  adds `params.itemKey` (a template) to it. An item with no row or no container
125
156
  facet falls through to the next step; a container already holding the item
126
157
  reports a conflict. When the item's row exists but no pending container
@@ -178,8 +209,10 @@ unsatisfied. Picking one calls `POST /api/scan-codes/execute-choice` with a
178
209
  pointer (scheme, category, step index, choice index, escalation id) — and a
179
210
  pointer is never authority: the server re-reads live config, re-locates the
180
211
  row under the step's query, re-applies the identity gate, and runs the verb
181
- through the same atomic executors a direct scan uses. A row that moved on
182
- between render and tap answers `conflict`, exactly as a lost double-scan.
212
+ through the same atomic executors a direct scan uses. A resolve choice
213
+ resolves the exact row the screen presented, re-checked under the step's
214
+ query in the same statement. A row that moved on between render and tap
215
+ answers `conflict`, exactly as a lost double-scan.
183
216
 
184
217
  A choice's `code` is a short printable token (letters, digits, underscore,
185
218
  dash) enabling double-scan selection: scan the object, then scan an action
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hotmeshio/long-tail",
3
- "version": "0.22.0",
3
+ "version": "0.22.1",
4
4
  "description": "Long Tail Workflows — Durable AI workflows with human-in-the-loop escalation. Powered by PostgreSQL.",
5
5
  "main": "./build/index.js",
6
6
  "types": "./build/index.d.ts",
@@ -1,2 +0,0 @@
1
- import{a as m,j as e}from"./vendor-query-DvWWuNIB.js";import{w as dt,x as ut,c as mt,y as xt,M as Ee,z as ht,A as gt,B as ft,E as pt,G as bt,H as yt,I as jt,K as vt,L as Ct,O as kt,Q as Nt,r as wt,R as Pt,T as St,U as Rt,V as Et,W as Tt,X as Bt,Y as At,Z as Ot,_ as Lt,$ as Mt,a0 as Ft,a1 as zt,a2 as It,a3 as Ut,a4 as $t,a5 as Vt,a6 as _t}from"./index-CgUcYveM.js";import{a as Te,u as Be,f as qt}from"./vendor-react-_9U4mKFr.js";import{i as Ht}from"./task-queues-7-sHKPsN.js";import{X as ce,aj as Kt,x as Dt,ak as Gt,al as Qt,_ as Wt,i as Yt,am as Xt,P as Jt,an as Zt}from"./vendor-icons-B7OcUM6b.js";import{u as Ae,C as es,r as ts,B as ss,a as as}from"./BulkAssignModal-BOAWsViq.js";import{E as ns}from"./EscalationTitleSelect-CzKfavri.js";import{u as is,E as ls,a as rs,t as os}from"./EscalationTimeline-DKyTz6sM.js";import{i as cs,E as ds}from"./EscalationListView-CkBnkpDJ.js";import{u as us}from"./useFilterParams-DBRw1Hcv.js";import{u as ms}from"./useDebouncedValue-Da0lPmj3.js";import{D as xs}from"./DataTable-spX1dFyb.js";import{S as hs}from"./StickyPagination-9ITrei_d.js";import{P as gs}from"./constants-CeBBTzf5.js";import{m as fs,E as ps}from"./escalation-columns-Mvsze5eV.js";import{R as bs,a as ys}from"./RowActions-Bdd7z4eB.js";import"./UserName-Pw46tO_k.js";import"./StatusBadge-DHVwxre2.js";import"./EmptyState-DgC_6njU.js";import"./useContainerWidth-DSLp1gEm.js";import"./EntityTimelinePanel-DIDcF5Yu.js";import"./FilterBar-CvMBCVIo.js";import"./PriorityBadge-r33mpDju.js";import"./RolePill-BafrASDX.js";import"./WorkflowPill-ZepbO_ny.js";import"./CountdownTimer-BaexQMK6.js";function js(){const{pathname:t,search:a}=Te(),u=Be(),{resolveUrl:l}=dt();m.useEffect(()=>{const g=t+a;if(ut(g).length===0)return;const p=l(g);p!==g&&u(p,{replace:!0})},[t,a,l,u])}const vs=["<","<=",">",">=","="],Cs=["priority","created_at","updated_at","status","role"],O="input text-xs py-1",Pe="select text-xs py-1",K="text-text-tertiary hover:text-text-primary transition-colors";function Se(t){return t==="true"?!0:t==="false"?!1:t.trim()!==""&&!Number.isNaN(Number(t))?Number(t):t}const ks=t=>Object.entries(t??{}).map(([a,u])=>({key:a,value:String(u)})),Ns=t=>(t??[]).map(a=>{const[u,l]=Object.entries(a)[0]??["",""];return{key:u,value:String(l)}});function B({title:t,hint:a,children:u}){return e.jsxs("div",{className:"border-t border-surface-border/50 py-3 first:border-t-0 first:pt-1",children:[e.jsxs("div",{className:"mb-1.5 flex items-baseline justify-between",children:[e.jsx("span",{className:"text-2xs font-medium uppercase tracking-wide text-text-tertiary",children:t}),a&&e.jsx("span",{className:"text-2xs font-mono text-text-tertiary/70",children:a})]}),u]})}function D({value:t,onChange:a,placeholder:u}){return e.jsx("input",{list:"lt-facet-keys",className:`${O} w-40`,placeholder:u,value:t,onChange:l=>a(l.target.value)})}function ws({value:t,onChange:a,facetKeys:u=[],search:l="",onSearchChange:g}){const p=ks(t.facets),b=Ns(t.block),f=t.range??[],r=t.exists??[],k=t.orderBy??[],P=n=>{const o={};for(const c of n)c.key&&(o[c.key]=Se(c.value));a({...t,facets:Object.keys(o).length?o:void 0})},E=n=>{const o=n.filter(c=>c.key).map(c=>({[c.key]:Se(c.value)}));a({...t,block:o.length?o:void 0})},T=n=>a({...t,range:n.length?n:void 0}),y=n=>a({...t,exists:n.length?n:void 0}),v=n=>a({...t,orderBy:n.length?n:void 0});return e.jsxs("div",{className:"text-xs",children:[e.jsx("datalist",{id:"lt-facet-keys",children:u.map(n=>e.jsx("option",{value:n},n))}),e.jsxs("datalist",{id:"lt-sort-fields",children:[Cs.map(n=>e.jsx("option",{value:n},n)),u.map(n=>e.jsx("option",{value:`metadata.${n}`},n))]}),g&&e.jsx(B,{title:"Match id",hint:"id · workflow · origin",children:e.jsx("input",{className:`${O} w-full`,placeholder:"Exact escalation, workflow, or origin id…",value:l,onChange:n=>g(n.target.value)})}),e.jsx(B,{title:"Has facet",hint:"metadata @>",children:[...p,{key:"",value:""}].map((n,o)=>e.jsxs("div",{className:"mb-1 flex items-center gap-1",children:[e.jsx(D,{value:n.key,placeholder:"key",onChange:c=>{const i=[...p];i[o]={...n,key:c},P(i)}}),e.jsx("span",{className:"text-text-tertiary",children:"="}),e.jsx("input",{className:`${O} w-40`,placeholder:"value",value:n.value,onChange:c=>{const i=[...p];i[o]={...n,value:c.target.value},P(i)}}),o<p.length&&e.jsx("button",{className:K,onClick:()=>P(p.filter((c,i)=>i!==o)),children:"×"})]},o))}),e.jsx(B,{title:"Range",hint:"numeric",children:[...f,{facet:"",op:"<=",value:0}].map((n,o)=>e.jsxs("div",{className:"mb-1 flex items-center gap-1",children:[e.jsx(D,{value:n.facet,placeholder:"numeric facet",onChange:c=>{const i=[...f];i[o]={...n,facet:c},T(i.filter(j=>j.facet))}}),e.jsx("select",{className:Pe,value:n.op,onChange:c=>{const i=[...f];i[o]={...n,op:c.target.value},T(i.filter(j=>j.facet))},children:vs.map(c=>e.jsx("option",{value:c,children:c},c))}),e.jsx("input",{type:"number",className:`${O} w-24`,value:n.value,onChange:c=>{const i=[...f];i[o]={...n,value:Number(c.target.value)},T(i.filter(j=>j.facet))}}),o<f.length&&e.jsx("button",{className:K,onClick:()=>T(f.filter((c,i)=>i!==o)),children:"×"})]},o))}),e.jsx(B,{title:"Has key",hint:"metadata ? key",children:e.jsxs("div",{className:"flex flex-wrap items-center gap-1",children:[r.map(n=>e.jsxs("span",{className:"flex items-center gap-1 rounded bg-accent/15 px-1.5 py-0.5 text-accent",children:[n,e.jsx("button",{className:"text-accent/70 hover:text-accent",onClick:()=>y(r.filter(o=>o!==n)),children:"×"})]},n)),e.jsx(D,{value:"",placeholder:"+ key",onChange:n=>{n&&!r.includes(n)&&y([...r,n])}})]})}),e.jsx(B,{title:"Exclude",hint:"NOT @>",children:[...b,{key:"",value:""}].map((n,o)=>e.jsxs("div",{className:"mb-1 flex items-center gap-1",children:[e.jsx(D,{value:n.key,placeholder:"key",onChange:c=>{const i=[...b];i[o]={...n,key:c},E(i)}}),e.jsx("span",{className:"text-text-tertiary",children:"="}),e.jsx("input",{className:`${O} w-40`,placeholder:"value",value:n.value,onChange:c=>{const i=[...b];i[o]={...n,value:c.target.value},E(i)}}),o<b.length&&e.jsx("button",{className:K,onClick:()=>E(b.filter((c,i)=>i!==o)),children:"×"})]},o))}),e.jsx(B,{title:"Sort by",children:[...k,{field:"",direction:"asc"}].map((n,o)=>e.jsxs("div",{className:"mb-1 flex items-center gap-1",children:[e.jsx("input",{list:"lt-sort-fields",className:`${O} w-44`,placeholder:"column or metadata.key",value:n.field,onChange:c=>{const i=[...k];i[o]={...n,field:c.target.value},v(i.filter(j=>j.field))}}),e.jsxs("select",{className:Pe,value:n.direction??"asc",onChange:c=>{const i=[...k];i[o]={...n,direction:c.target.value},v(i.filter(j=>j.field))},children:[e.jsx("option",{value:"asc",children:"asc"}),e.jsx("option",{value:"desc",children:"desc"})]}),e.jsxs("label",{className:"flex items-center gap-1 text-text-tertiary",children:[e.jsx("input",{type:"checkbox",checked:!!n.numeric,onChange:c=>{const i=[...k];i[o]={...n,numeric:c.target.checked},v(i.filter(j=>j.field))}}),"num"]}),o<k.length&&e.jsx("button",{className:K,onClick:()=>v(k.filter((c,i)=>i!==o)),children:"×"})]},o))})]})}function Ps({value:t,onChange:a,facetKeys:u,search:l,onSearchChange:g,activeFacetCount:p,onClear:b,onClose:f}){return e.jsxs("div",{className:"h-full overflow-y-auto",children:[e.jsxs("div",{className:"sticky top-0 z-10 flex items-center justify-between px-4 py-3 bg-surface-raised border-b border-surface-border/50",children:[e.jsx("span",{className:"text-xs font-semibold text-text-primary",children:"Faceted query"}),e.jsxs("div",{className:"flex items-center gap-2",children:[p>0&&e.jsx("button",{onClick:b,className:"text-2xs text-text-tertiary hover:text-text-primary transition-colors",children:"Clear"}),e.jsx("button",{onClick:f,className:"p-1 rounded hover:bg-surface-hover text-text-tertiary hover:text-text-primary transition-colors",title:"Close",children:e.jsx(ce,{className:"w-4 h-4"})})]})]}),e.jsxs("div",{className:"px-4 py-2",children:[e.jsxs("p",{className:"mb-2 text-2xs leading-snug text-text-tertiary",children:["Precise metadata facets plus exact correlation-id lookup — they compose in one SQL query. Facet keys are the ones that actually exist in your visible escalations. Set status to ",e.jsx("span",{className:"font-medium",children:"All"})," to find an order across every status; the whole query is shareable via the URL."]}),e.jsx(ws,{value:t,onChange:a,facetKeys:u,search:l,onSearchChange:g})]})]})}const Ss=t=>t.isPriorityPending||t.isClaimPending||t.isAssignPending||t.isUnassignPending||t.isTriagePending||t.isCancelPending,G="inline-flex items-center h-7 px-2.5 text-2xs font-medium text-text-secondary bg-surface border border-surface-border rounded-[4px] hover:border-accent/50 hover:text-text-primary transition-colors disabled:opacity-50 disabled:hover:border-surface-border",Re=`${G} appearance-none cursor-pointer`,Rs="inline-flex items-center h-7 px-2.5 text-2xs font-medium text-status-error bg-surface border border-status-error/30 rounded-[4px] hover:border-status-error hover:bg-status-error/5 transition-colors disabled:opacity-50";function Es(t){var f;const a=Ss(t),u=Ae(),{data:l}=mt(),g=xt(),p=g!==null?g:((f=l==null?void 0:l.ai)==null?void 0:f.enabled)===!0,b=t.selectedCount>0;return e.jsx("div",{className:`grid transition-all duration-200 ease-in-out ${b?"grid-rows-[1fr] opacity-100":"grid-rows-[0fr] opacity-0 pointer-events-none"}`,children:e.jsx("div",{className:"overflow-hidden",children:e.jsxs("div",{className:"flex flex-wrap items-center gap-2 py-2.5 pl-3 pr-2 mt-4 mb-3 bg-surface-sunken/60 border-l-2 border-l-accent",children:[e.jsxs("span",{className:"text-2xs font-semibold uppercase tracking-wider text-accent tabular-nums",children:[t.selectedCount," selected"]}),e.jsx("div",{className:"mx-1 h-4 w-px bg-surface-border"}),e.jsxs("select",{onChange:r=>{r.target.value&&(t.onSetPriority(parseInt(r.target.value)),r.target.value="")},disabled:a,className:Re,defaultValue:"",children:[e.jsx("option",{value:"",disabled:!0,children:"Priority…"}),gs.map(r=>e.jsx("option",{value:r.value,children:r.label},r.value))]}),e.jsxs("select",{onChange:r=>{r.target.value&&(t.onClaim(parseInt(r.target.value)),r.target.value="")},disabled:a,className:Re,defaultValue:"",children:[e.jsx("option",{value:"",disabled:!0,children:"Claim for…"}),u.map(r=>e.jsx("option",{value:r.value,children:r.label},r.value))]}),e.jsx("button",{onClick:t.onAssign,disabled:a,className:G,children:t.isAssignPending?"Assigning…":"Assign to…"}),e.jsx("button",{onClick:t.onUnassign,disabled:a,className:G,children:t.isUnassignPending?"Unassigning…":"Unassign"}),p&&e.jsx("button",{onClick:t.onTriage,disabled:a,className:G,children:t.isTriagePending?"Triaging…":"Triage"}),t.cancelLabel!==!1&&e.jsx("button",{onClick:t.onCancel,disabled:a,className:Rs,children:t.isCancelPending?t.cancelLabel?`${t.cancelLabel}…`:"Cancelling…":t.cancelLabel||"Cancel"}),e.jsx("div",{className:"flex-1"}),a&&e.jsx("span",{className:"text-2xs text-text-tertiary animate-pulse",children:"Processing…"}),e.jsx("button",{onClick:t.onClearSelection,className:"px-1 text-2xs font-medium text-text-tertiary hover:text-text-primary transition-colors",children:"Clear"})]})})})}function Ts({open:t,onClose:a,selectedCount:u,onSubmit:l,isPending:g}){const[p,b]=m.useState(""),f=()=>{l(p||void 0)};return e.jsx(Ee,{open:t,onClose:a,title:"Submit for AI Triage",children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("p",{className:"text-sm text-text-secondary",children:["Submit ",e.jsx("span",{className:"font-medium text-text-primary",children:u})," escalation(s) for AI triage? The triage orchestrator will take over resolution."]}),e.jsxs("div",{children:[e.jsxs("label",{className:"text-xs font-medium text-text-secondary block mb-1",children:["Triage hint ",e.jsx("span",{className:"text-text-tertiary",children:"(optional)"})]}),e.jsx("input",{type:"text",value:p,onChange:r=>b(r.target.value),placeholder:"e.g., image_orientation",className:"input text-xs font-mono w-full"}),e.jsx("p",{className:"text-2xs text-text-tertiary mt-1",children:"Guides the triage workflow on what remediation to apply"})]}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsx("button",{onClick:a,className:"btn-secondary text-xs",children:"Cancel"}),e.jsx("button",{onClick:f,disabled:g,className:"btn-primary text-xs",children:g?"Submitting...":"Submit for Triage"})]})]})})}function A(t,a,u){return l=>{t.mutate(l,{onSuccess:()=>{a(),u==null||u()}})}}function Bs(t){const a=()=>[...t.selectedIds];return{handleSetPriority:r=>{A(t.setPriority,t.clearSelection)({ids:a(),priority:r})},handleBulkClaim:r=>{A(t.bulkClaim,t.clearSelection)({ids:a(),durationMinutes:r})},handleBulkTriage:r=>{A(t.bulkTriage,t.clearSelection,t.closeTriageModal)({ids:a(),hint:r})},handleBulkAssign:(r,k,P)=>{A(t.bulkAssign,t.clearSelection,t.closeAssignModal)({ids:a(),targetUserId:r,durationMinutes:k,reassign:P})},handleBulkUnassign:()=>{A(t.bulkUnassign,t.clearSelection)({ids:a()})},handleBulkCancel:()=>{A(t.bulkCancel,t.clearSelection,t.closeCancelModal)({ids:a()})}}}function As({claimTarget:t,onClose:a,claimDuration:u,onDurationChange:l,claimDurations:g,onCustomClaimChange:p,onClaim:b,isPending:f}){return e.jsx(Ee,{open:!!t,onClose:a,title:"Claim Escalation",children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("p",{className:"text-sm text-text-secondary",children:["Claim ",e.jsx("span",{className:"font-medium text-text-primary",children:t==null?void 0:t.type})," for:"]}),e.jsxs("select",{value:u,onChange:r=>{l(r.target.value)},className:"select w-full text-sm",children:[g.map(r=>e.jsx("option",{value:r.value,children:r.label},r.value)),e.jsx("option",{value:"custom",children:"Other..."})]}),u==="custom"&&e.jsx(es,{onChange:p,autoFocus:!0}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsx("button",{onClick:a,className:"btn-secondary text-xs",children:"Cancel"}),e.jsx("button",{onClick:b,className:"btn-primary text-xs",disabled:f,children:f?"Claiming...":"Claim"})]})]})})}function ia(){var we;js();const t=Be(),{filters:a,setFilter:u,pagination:l}=us({filters:{role:"",type:"",priority:"",status:"available",search:""}});ht({role:a.role||null,verbs:["created","claimed"]});const g=ms(a.search),p=Ae(),[b,f]=m.useState(null),[r,k]=m.useState("30"),[P,E]=m.useState(0),T=m.useCallback(s=>E(s),[]),[y,v]=m.useState(new Set),n=m.useRef(null),o=m.useRef(null),c=m.useCallback(s=>{var x;if((x=o.current)==null||x.disconnect(),o.current=null,!s||typeof ResizeObserver>"u")return;const d=new ResizeObserver(()=>{var H;(H=n.current)==null||H.style.setProperty("--lt-sticky-top",`${s.offsetHeight-1}px`)});d.observe(s),o.current=d},[]),[i,j]=m.useState(!1),[L,M]=qt(),h=m.useMemo(()=>gt(L),[L]),N=m.useCallback(s=>{M(d=>{const x=new URLSearchParams(d);return ft(x,s),x.delete("page"),x})},[M]),{data:F}=pt(i),z=bt(h)+(a.search?1:0),Q="facet-query",{setPanel:de,closePanel:ue,open:Oe,ownerKey:Le}=yt();m.useEffect(()=>{if(!i){ue(Q);return}de(e.jsx(Ps,{value:h,onChange:N,facetKeys:(F==null?void 0:F.keys)??[],search:a.search??"",onSearchChange:s=>u("search",s),activeFacetCount:z,onClear:()=>{N({}),u("search","")},onClose:()=>j(!1)}),{width:420,key:Q})},[i,h,N,F,a.search,u,z,de,ue]);const me=Oe&&Le===Q,W=m.useRef(!1);m.useEffect(()=>{if(me){W.current=!0;return}W.current&&(W.current=!1,j(!1))},[me]);const[Me,Y]=m.useState(!1),[Fe,X]=m.useState(!1),[ze,J]=m.useState(!1),Ie=m.useCallback(s=>N({...h,orderBy:s}),[h,N]),I=Te(),{data:U}=jt(),xe=vt(),Ue=m.useCallback(()=>{var x;const s=window.prompt("Pin label:");if(!(s!=null&&s.trim()))return;const d=((x=U==null?void 0:U.preferences)==null?void 0:x.pinnedViews)??[];xe.mutate({pinnedViews:[...d,{id:Ct(),label:s.trim(),url:I.pathname+I.search,badge:!0}]})},[I.pathname,I.search,U,xe]),{canBulk:$e}=kt(),{kiosk:Z}=Nt(),he=h.facets?Object.keys(h.facets):[],$=L.get("view"),ee=L.get("layout"),Ve=m.useCallback(s=>{M(d=>{const x=new URLSearchParams(d);return s?x.set("view",s):x.delete("view"),x},{replace:!0})},[M]),te=$==="timeline",_e=m.useCallback(s=>{const{[s]:d,...x}=h.facets??{};N({...h,facets:Object.keys(x).length>0?x:void 0})},[h,N]),ge=wt(),fe=Pt(),pe=St(),se=Rt(),be=Et(),ae=Tt(),V=Bt(),{data:ne}=At(),{data:S}=Ot(),{data:ie}=Lt(),{user:_,isSuperAdmin:qe,hasRoleType:He}=Mt(),ye=qe||He("admin"),je=m.useMemo(()=>new Set(((_==null?void 0:_.roles)??[]).map(s=>s.role)),[_]),Ke=m.useMemo(()=>{const s=(S==null?void 0:S.roles)??[];return(ye?s:s.filter(x=>je.has(x.role)&&!Ht(x.role))).map(x=>({value:x.role,label:Ft(x)})).sort((x,H)=>x.label.localeCompare(H.label))},[S,ye,je]);m.useEffect(()=>{v(new Set)},[a.role,a.type,a.priority,a.status,g,l.page,l.pageSize]);const le=m.useMemo(()=>({statusFilter:a.status||"",role:a.role||void 0,type:a.type||void 0,priority:a.priority?parseInt(a.priority):void 0,search:g||void 0,facets:h,view:It($)?$:null,layout:zt(ee)?ee:null}),[a.status,a.role,a.type,a.priority,g,h,$,ee]),ve=100,{escalations:C,total:w,listSchema:De,singleRole:R,hasRichView:Ce,isLoading:Ge,isFetching:ke,error:q,refetch:Qe}=is(le,{limit:te?ve:l.pageSize,offset:l.offset}),We=Ut(R??"",void 0,!!R),re=R?ts((we=We.data)==null?void 0:we.form_schema).cancel:void 0,oe=$t(le.view,Ce),Ye=oe===_t.RICH,Ne=m.useMemo(()=>{if(!h.jeopardy||!R)return null;const s=((S==null?void 0:S.roles)??[]).find(x=>x.role===R),d=(s==null?void 0:s.priority_threshold_minutes)??(s==null?void 0:s.sla_minutes)??null;return d!=null?Vt(d*6e4):null},[h.jeopardy,R,S]),Xe=m.useMemo(()=>{const s=new Set;for(const d of C)y.has(d.id)&&s.add(d.role);return[...s]},[C,y]),Je=m.useMemo(()=>C.filter(s=>y.has(s.id)&&cs(s)).length,[C,y]),Ze=m.useCallback(()=>v(new Set),[]),et=()=>{if(!b)return;const s=r==="custom"?P:parseInt(r);!s||s<=0||ge.mutate({id:b.id,durationMinutes:s},{onSuccess:()=>{f(null),t(`/escalations/detail/${b.id}`)}})},{handleSetPriority:tt,handleBulkClaim:st,handleBulkTriage:at,handleBulkAssign:nt,handleBulkUnassign:it,handleBulkCancel:lt}=Bs({selectedIds:y,clearSelection:Ze,setPriority:fe,bulkClaim:pe,bulkTriage:ae,bulkAssign:se,bulkUnassign:be,bulkCancel:V,closeTriageModal:()=>Y(!1),closeAssignModal:()=>X(!1),closeCancelModal:()=>J(!1)}),rt=s=>{const d=new Set(y);d.has(s)?d.delete(s):d.add(s),v(d)},ot=()=>{y.size===C.length?v(new Set):v(new Set(C.map(s=>s.id)))},ct=[$e?{key:"select",label:e.jsx("input",{type:"checkbox",checked:C.length>0&&y.size===C.length,onChange:ot,className:"rounded"}),render:s=>e.jsx("input",{type:"checkbox",checked:y.has(s.id),onChange:d=>{d.stopPropagation(),rt(s.id)},onClick:d=>d.stopPropagation(),className:"rounded"}),className:"w-10",priority:1}:{key:"spacer",label:"",render:()=>null,className:"w-10",priority:3},...fs({highlightKeys:he}),{key:"actions",label:"",render:s=>e.jsx(bs,{children:e.jsx(ys,{icon:Kt,title:"Claim escalation",onClick:()=>f(s),alwaysVisible:!0,colorClass:"text-accent/40 hover:text-accent",size:"sm"})}),className:"w-10 text-right"}];return e.jsxs("div",{ref:n,children:[e.jsxs("div",{className:"flex items-center gap-2 mb-10 min-w-0",children:[e.jsx(ns,{role:a.role,options:Ke,onChange:s=>u("role",s),locked:Z}),!Z&&e.jsx("button",{onClick:()=>{window.location.hash="#docs:dashboard.md:all-escalations"},className:"text-text-quaternary hover:text-accent transition-colors mt-1 shrink-0",title:"Open docs for this page",children:e.jsx(Dt,{className:"w-4 h-4",strokeWidth:1.5})})]}),e.jsxs("div",{ref:c,className:"sticky top-0 z-20 bg-surface",children:[e.jsx(ps,{filters:a,setFilter:u,roles:(ne==null?void 0:ne.roles)??[],types:(ie==null?void 0:ie.types)??[],showStatus:!0,showSearch:!1,showRole:!Z,actions:e.jsxs(e.Fragment,{children:[te&&e.jsxs("span",{className:"text-2xs text-text-tertiary whitespace-nowrap",children:[w>100&&e.jsxs(e.Fragment,{children:[e.jsxs("span",{className:"font-medium text-text-secondary",children:[(l.page-1)*100+1,"–",Math.min(l.page*100,w)]})," of "]}),e.jsx("span",{className:"font-medium text-text-secondary",children:w})," ",w===1?"escalation":"escalations"]}),e.jsx(ls,{orderBy:h.orderBy,onChange:Ie}),e.jsx("div",{role:"radiogroup","aria-label":"List view",className:"flex items-center rounded overflow-hidden border border-surface-border",children:[{key:"table",title:"Table view",Icon:Gt},{key:"rich",title:"Rich view",Icon:Qt},{key:"timeline",title:"Timeline view",Icon:Wt}].filter(s=>s.key!=="rich"||Ce).map(({key:s,title:d,Icon:x})=>e.jsx("button",{role:"radio","aria-checked":oe===s,onClick:()=>Ve(s),className:`px-1.5 py-1 transition-colors ${oe===s?"bg-accent text-text-inverse":"icon-link hover:bg-surface-hover"}`,title:d,children:e.jsx(x,{className:"w-3.5 h-3.5"})},s))}),e.jsxs("button",{onClick:()=>j(s=>!s),"aria-pressed":i,className:`relative rounded border border-surface-border px-1.5 py-1 transition-colors ${i?"bg-accent text-text-inverse":"icon-link hover:bg-surface-hover"}`,title:"Faceted query",children:[e.jsx(Yt,{className:"w-3.5 h-3.5"}),z>0&&e.jsx("span",{className:"absolute -right-1 -top-1 flex h-3.5 min-w-[14px] items-center justify-center rounded-full bg-accent px-0.5 text-2xs font-medium text-text-inverse",children:z})]}),e.jsxs("div",{className:"flex items-center gap-0.5",children:[e.jsx("button",{onClick:()=>Qe(),disabled:ke,className:"inline-flex h-7 w-7 items-center justify-center rounded icon-link hover:bg-surface-hover disabled:opacity-50",title:"Refresh",children:e.jsx(Xt,{className:`w-4 h-4 ${ke?"animate-spin":""}`})}),e.jsx("button",{onClick:Ue,className:"inline-flex h-7 w-7 items-center justify-center rounded icon-link hover:bg-surface-hover",title:"Pin this view — save the current filters to your Pinned section","data-testid":"pin-current-view",children:e.jsx(Jt,{className:"w-4 h-4"})})]})]})}),e.jsx(Es,{selectedCount:y.size,onClearSelection:()=>v(new Set),onSetPriority:tt,onClaim:st,onAssign:()=>X(!0),onUnassign:it,onTriage:()=>Y(!0),onCancel:()=>J(!0),isPriorityPending:fe.isPending,isClaimPending:pe.isPending,isAssignPending:se.isPending,isUnassignPending:be.isPending,isTriagePending:ae.isPending,isCancelPending:V.isPending,cancelLabel:re}),(h.facets&&Object.keys(h.facets).length>0||h.jeopardy)&&e.jsxs("div",{className:"bg-surface/98 backdrop-blur-sm border-b border-surface-border/30 -mx-page-x px-page-x py-2 flex items-center gap-1.5 flex-wrap",children:[h.jeopardy&&e.jsxs("span",{className:"inline-flex items-center gap-1 rounded-full bg-status-error px-2.5 py-0.5 text-2xs font-semibold text-text-inverse",children:[e.jsx(Zt,{className:"w-2.5 h-2.5",strokeWidth:2.5}),"in jeopardy",Ne&&e.jsxs("span",{className:"font-mono font-normal opacity-90",children:["> ",Ne]}),e.jsx("button",{onClick:()=>N({...h,jeopardy:void 0}),className:"ml-0.5 -mr-0.5 flex items-center text-text-inverse/70 hover:text-text-inverse transition-colors","aria-label":"Clear jeopardy filter",children:e.jsx(ce,{className:"w-2.5 h-2.5"})})]}),Object.entries(h.facets??{}).map(([s,d])=>e.jsxs("span",{className:"inline-flex items-center gap-1 rounded-full border border-accent/25 bg-accent/8 px-2.5 py-0.5 text-2xs font-medium text-accent/90",children:[e.jsx("span",{className:"font-mono text-text-tertiary",children:s}),e.jsx("span",{className:"text-text-quaternary",children:"="}),e.jsx("span",{className:"font-mono max-w-[160px] truncate",title:String(d),children:String(d)}),e.jsx("button",{onClick:()=>_e(s),className:"ml-0.5 -mr-0.5 flex items-center text-text-quaternary hover:text-status-error transition-colors","aria-label":`Remove ${s} filter`,children:e.jsx(ce,{className:"w-2.5 h-2.5"})})]},s)),Object.keys(h.facets??{}).length>1&&e.jsx("button",{onClick:()=>N({...h,facets:void 0}),className:"text-2xs text-text-quaternary hover:text-text-secondary transition-colors px-1",children:"clear all"})]})]}),q&&e.jsx("div",{className:"mb-4 px-4 py-3 rounded-md bg-status-error/10 border border-status-error/20 text-xs text-status-error",children:q.message==="Session expired"?"Your session has expired. Please log in again.":`Failed to load escalations: ${q.message}`}),te?e.jsx(rs,{escalations:C,highlightKeys:he,onRowClick:s=>t(`/escalations/detail/${s.id}`,{state:{from:"/escalations/available"}}),total:w,page:l.page,totalPages:Math.ceil(w/ve),onPageChange:l.setPage}):Ye?e.jsx(ds,{role:R,listSchema:De,activeEscalations:C,onRowClick:s=>t(`/escalations/detail/${s.id}`,{state:{from:"/escalations/available"}}),onOpenGroup:s=>t(s),onAddFacet:(s,d)=>N({...h,facets:{...h.facets??{},[s]:typeof d=="object"&&d!==null?JSON.stringify(d):d}}),total:w,page:l.page,totalPages:l.totalPages(w),pageSize:l.pageSize,onPageChange:l.setPage,onPageSizeChange:l.setPageSize}):e.jsxs(e.Fragment,{children:[e.jsx(xs,{columns:ct,data:C,layout:"fixed",...os(le.layout),keyFn:s=>s.id,onRowClick:s=>t(`/escalations/detail/${s.id}`,{state:{from:"/escalations/available"}}),isLoading:Ge,emptyMessage:q?"Unable to load data":"No escalations"}),e.jsx(hs,{page:l.page,totalPages:l.totalPages(w),onPageChange:l.setPage,total:w,pageSize:l.pageSize,onPageSizeChange:l.setPageSize})]}),e.jsx(As,{claimTarget:b,onClose:()=>f(null),claimDuration:r,onDurationChange:s=>{k(s),E(0)},claimDurations:p,customClaimMinutes:P,onCustomClaimChange:T,onClaim:et,isPending:ge.isPending}),e.jsx(Ts,{open:Me,onClose:()=>Y(!1),selectedCount:y.size,onSubmit:at,isPending:ae.isPending}),e.jsx(ss,{open:Fe,onClose:()=>X(!1),selectedCount:y.size,selectedRoles:Xe,claimedCount:Je,onSubmit:nt,isPending:se.isPending}),e.jsx(as,{open:ze,onClose:()=>J(!1),onConfirm:lt,selectedCount:y.size,isPending:V.isPending,error:V.error,actionLabel:typeof re=="string"?re:void 0})]})}export{ia as AvailableEscalationsPage};
2
- //# sourceMappingURL=AvailableEscalationsPage-CpbC8oTN.js.map