@hotmeshio/long-tail 0.10.5 → 0.10.7
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.
- package/build/api/escalations/bulk.d.ts +16 -4
- package/build/api/escalations/bulk.js +42 -7
- package/build/api/escalations/resolve.js +57 -15
- package/build/routes/escalations/bulk.js +1 -0
- package/build/sdk/index.d.ts +5 -1
- package/build/services/escalation/bulk.d.ts +14 -0
- package/build/services/escalation/bulk.js +17 -0
- package/build/services/escalation/crud.d.ts +13 -2
- package/build/services/escalation/crud.js +9 -4
- package/build/services/orchestrator/condition.d.ts +20 -0
- package/build/services/orchestrator/condition.js +30 -6
- package/build/types/escalation.d.ts +8 -0
- package/dashboard/dist/assets/{AdminDashboard-Cma2NGsF.js → AdminDashboard-CYlm0_J0.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-Cma2NGsF.js.map → AdminDashboard-CYlm0_J0.js.map} +1 -1
- package/dashboard/dist/assets/AgentConfigPage-BttOMcj_.js +16 -0
- package/dashboard/dist/assets/{AgentConfigPage-CbIhM-fa.js.map → AgentConfigPage-BttOMcj_.js.map} +1 -1
- package/dashboard/dist/assets/AgentDetailPage-D9JdkWV8.js +4 -0
- package/dashboard/dist/assets/AgentDetailPage-D9JdkWV8.js.map +1 -0
- package/dashboard/dist/assets/AgentsPage-AqGtEOL1.js +2 -0
- package/dashboard/dist/assets/AgentsPage-AqGtEOL1.js.map +1 -0
- package/dashboard/dist/assets/AvailableEscalationsPage-rKbrcY8Y.js +2 -0
- package/dashboard/dist/assets/AvailableEscalationsPage-rKbrcY8Y.js.map +1 -0
- package/dashboard/dist/assets/{BotPicker-CidlGr6f.js → BotPicker-Bj4MB_so.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-CidlGr6f.js.map → BotPicker-Bj4MB_so.js.map} +1 -1
- package/dashboard/dist/assets/CapabilitiesPage-DzLP5-ad.js +2 -0
- package/dashboard/dist/assets/{CapabilitiesPage-BMNNTa0D.js.map → CapabilitiesPage-DzLP5-ad.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-W9F9lziT.js → CollapsibleSection-CReMhtzK.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-W9F9lziT.js.map → CollapsibleSection-CReMhtzK.js.map} +1 -1
- package/dashboard/dist/assets/{ConfirmDeleteModal-BUh-Dzba.js → ConfirmDeleteModal-DD7SEMeX.js} +2 -2
- package/dashboard/dist/assets/{ConfirmDeleteModal-BUh-Dzba.js.map → ConfirmDeleteModal-DD7SEMeX.js.map} +1 -1
- package/dashboard/dist/assets/{CopyableId-B1mxKfVb.js → CopyableId-BpB-NvDh.js} +2 -2
- package/dashboard/dist/assets/{CopyableId-B1mxKfVb.js.map → CopyableId-BpB-NvDh.js.map} +1 -1
- package/dashboard/dist/assets/{CountdownTimer-lkv_7msa.js → CountdownTimer-Z8N8ccJ1.js} +2 -2
- package/dashboard/dist/assets/{CountdownTimer-lkv_7msa.js.map → CountdownTimer-Z8N8ccJ1.js.map} +1 -1
- package/dashboard/dist/assets/{CredentialsPage-DyOgfnPB.js → CredentialsPage-D_2T6vSb.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-DyOgfnPB.js.map → CredentialsPage-D_2T6vSb.js.map} +1 -1
- package/dashboard/dist/assets/{CronLabel-geum95dj.js → CronLabel-DBmKrLvL.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-geum95dj.js.map → CronLabel-DBmKrLvL.js.map} +1 -1
- package/dashboard/dist/assets/CustomDurationPicker-BTmpAQOL.js +2 -0
- package/dashboard/dist/assets/CustomDurationPicker-BTmpAQOL.js.map +1 -0
- package/dashboard/dist/assets/{DropZone-C3hOjJtC.js → DropZone-BrnAkQxF.js} +2 -2
- package/dashboard/dist/assets/{DropZone-C3hOjJtC.js.map → DropZone-BrnAkQxF.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-DFOW9T4b.js → ElapsedCell-C0LbM8o2.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-DFOW9T4b.js.map → ElapsedCell-C0LbM8o2.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationListSchemaPage-_IhqXIQu.js → EscalationListSchemaPage-CkEJnFKd.js} +3 -3
- package/dashboard/dist/assets/{EscalationListSchemaPage-_IhqXIQu.js.map → EscalationListSchemaPage-CkEJnFKd.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationSchemaPage-BCC7iscN.js → EscalationSchemaPage-CnlwGAIE.js} +3 -3
- package/dashboard/dist/assets/{EscalationSchemaPage-BCC7iscN.js.map → EscalationSchemaPage-CnlwGAIE.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-CvIdOtoP.js → EscalationsOverview-DFM-f7do.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-CvIdOtoP.js.map → EscalationsOverview-DFM-f7do.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-DJWJ7J0m.js → EventTable-Q3iICRf_.js} +2 -2
- package/dashboard/dist/assets/{EventTable-DJWJ7J0m.js.map → EventTable-Q3iICRf_.js.map} +1 -1
- package/dashboard/dist/assets/{FilterBar-BR3ztZ8y.js → FilterBar-B0taDH7I.js} +2 -2
- package/dashboard/dist/assets/{FilterBar-BR3ztZ8y.js.map → FilterBar-B0taDH7I.js.map} +1 -1
- package/dashboard/dist/assets/{GraphInvokePage-Cwn-8Glr.js → GraphInvokePage-B_P3pJeA.js} +2 -2
- package/dashboard/dist/assets/{GraphInvokePage-Cwn-8Glr.js.map → GraphInvokePage-B_P3pJeA.js.map} +1 -1
- package/dashboard/dist/assets/HomePage-lu88PzQH.js +2 -0
- package/dashboard/dist/assets/HomePage-lu88PzQH.js.map +1 -0
- package/dashboard/dist/assets/{ListToolbar-DuoEdVtK.js → ListToolbar-ueCQtu5C.js} +2 -2
- package/dashboard/dist/assets/{ListToolbar-DuoEdVtK.js.map → ListToolbar-ueCQtu5C.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-NXKsGiWU.js → McpOverview-DMaRUXnA.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-NXKsGiWU.js.map → McpOverview-DMaRUXnA.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryDetailPage-BC-iXfIx.js → McpQueryDetailPage-D6YSD94n.js} +2 -2
- package/dashboard/dist/assets/{McpQueryDetailPage-BC-iXfIx.js.map → McpQueryDetailPage-D6YSD94n.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryPage-BPJmFYOY.js → McpQueryPage-CNGNB59o.js} +2 -2
- package/dashboard/dist/assets/{McpQueryPage-BPJmFYOY.js.map → McpQueryPage-CNGNB59o.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunDetailPage-B49nUXEl.js → McpRunDetailPage-CJ9hDTNs.js} +2 -2
- package/dashboard/dist/assets/{McpRunDetailPage-B49nUXEl.js.map → McpRunDetailPage-CJ9hDTNs.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunsPage-Ce_XIYpP.js → McpRunsPage-_UaoIwzX.js} +2 -2
- package/dashboard/dist/assets/{McpRunsPage-Ce_XIYpP.js.map → McpRunsPage-_UaoIwzX.js.map} +1 -1
- package/dashboard/dist/assets/{Modal-D4afnAjc.js → Modal-CA2Iv02H.js} +2 -2
- package/dashboard/dist/assets/{Modal-D4afnAjc.js.map → Modal-CA2Iv02H.js.map} +1 -1
- package/dashboard/dist/assets/{NamespacePill-LWvZXt_g.js → NamespacePill-DQGzN0Ph.js} +2 -2
- package/dashboard/dist/assets/{NamespacePill-LWvZXt_g.js.map → NamespacePill-DQGzN0Ph.js.map} +1 -1
- package/dashboard/dist/assets/OperationsPage-CTfwuWXR.js +2 -0
- package/dashboard/dist/assets/OperationsPage-CTfwuWXR.js.map +1 -0
- package/dashboard/dist/assets/{OperatorDashboard-DpXjhs-3.js → OperatorDashboard-DMPJmgP_.js} +2 -2
- package/dashboard/dist/assets/{OperatorDashboard-DpXjhs-3.js.map → OperatorDashboard-DMPJmgP_.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeader-DvEmMMP6.js → PageHeader-DlcE3U5L.js} +2 -2
- package/dashboard/dist/assets/{PageHeader-DvEmMMP6.js.map → PageHeader-DlcE3U5L.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeaderWithStats-X0eAmu-x.js → PageHeaderWithStats-BMhnR3-9.js} +2 -2
- package/dashboard/dist/assets/{PageHeaderWithStats-X0eAmu-x.js.map → PageHeaderWithStats-BMhnR3-9.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessDetailPage-DpYSMRj1.js → ProcessDetailPage-CxJ5BSDk.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-DpYSMRj1.js.map → ProcessDetailPage-CxJ5BSDk.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessesListPage-CQ9tSw7U.js → ProcessesListPage-GQMOo5Wo.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-CQ9tSw7U.js.map → ProcessesListPage-GQMOo5Wo.js.map} +1 -1
- package/dashboard/dist/assets/{RoleDetailPage-DKeQKDkW.js → RoleDetailPage-Bh5qdI0w.js} +3 -3
- package/dashboard/dist/assets/{RoleDetailPage-DKeQKDkW.js.map → RoleDetailPage-Bh5qdI0w.js.map} +1 -1
- package/dashboard/dist/assets/{RolePill-CWhoLwef.js → RolePill-dzo14hB_.js} +2 -2
- package/dashboard/dist/assets/{RolePill-CWhoLwef.js.map → RolePill-dzo14hB_.js.map} +1 -1
- package/dashboard/dist/assets/{RolesPage-D-6kIact.js → RolesPage-BIg3_Em6.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-D-6kIact.js.map → RolesPage-BIg3_Em6.js.map} +1 -1
- package/dashboard/dist/assets/{RunAsSelector-DzYcpQTm.js → RunAsSelector-DQp_keSD.js} +2 -2
- package/dashboard/dist/assets/{RunAsSelector-DzYcpQTm.js.map → RunAsSelector-DQp_keSD.js.map} +1 -1
- package/dashboard/dist/assets/{StickyPagination-BTGfmGV3.js → StickyPagination-qLaLa33X.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-BTGfmGV3.js.map → StickyPagination-qLaLa33X.js.map} +1 -1
- package/dashboard/dist/assets/{StreamMessageDetail-DqRpzA_6.js → StreamMessageDetail-Bi37x95H.js} +2 -2
- package/dashboard/dist/assets/{StreamMessageDetail-DqRpzA_6.js.map → StreamMessageDetail-Bi37x95H.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-CA106TYo.js → SwimlaneTimeline-BdNhoiW8.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-CA106TYo.js.map → SwimlaneTimeline-BdNhoiW8.js.map} +1 -1
- package/dashboard/dist/assets/{TagInput-CoR4MzsW.js → TagInput-cyhTZTwe.js} +2 -2
- package/dashboard/dist/assets/{TagInput-CoR4MzsW.js.map → TagInput-cyhTZTwe.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-BRg-w2Ev.js → TaskDetailPage-ngdXRgQp.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-BRg-w2Ev.js.map → TaskDetailPage-ngdXRgQp.js.map} +1 -1
- package/dashboard/dist/assets/{TaskQueuePill-Dw3YN8M-.js → TaskQueuePill-_zIpG4bG.js} +2 -2
- package/dashboard/dist/assets/{TaskQueuePill-Dw3YN8M-.js.map → TaskQueuePill-_zIpG4bG.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-kB_j9G8o.js → TasksListPage-BIE7nrdE.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-kB_j9G8o.js.map → TasksListPage-BIE7nrdE.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-D7dSIY7-.js → TimeAgo-C6FZSNZp.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-D7dSIY7-.js.map → TimeAgo-C6FZSNZp.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-BZe6bx18.js → TimestampCell-DI5zPUgV.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-BZe6bx18.js.map → TimestampCell-DI5zPUgV.js.map} +1 -1
- package/dashboard/dist/assets/{ToolPill-xX-buQtY.js → ToolPill-CKHYG6eV.js} +2 -2
- package/dashboard/dist/assets/{ToolPill-xX-buQtY.js.map → ToolPill-CKHYG6eV.js.map} +1 -1
- package/dashboard/dist/assets/{ToolTestPanel-U3NaF_T_.js → ToolTestPanel-Dli94RPI.js} +2 -2
- package/dashboard/dist/assets/{ToolTestPanel-U3NaF_T_.js.map → ToolTestPanel-Dli94RPI.js.map} +1 -1
- package/dashboard/dist/assets/{TopicDetailPage-BpALvXP1.js → TopicDetailPage-vPtXb7gD.js} +3 -3
- package/dashboard/dist/assets/{TopicDetailPage-BpALvXP1.js.map → TopicDetailPage-vPtXb7gD.js.map} +1 -1
- package/dashboard/dist/assets/{TopicsPage-Cy3chaca.js → TopicsPage-BwiEX0pU.js} +2 -2
- package/dashboard/dist/assets/{TopicsPage-Cy3chaca.js.map → TopicsPage-BwiEX0pU.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-VXM1oHMC.js → UserName-YozoXJA1.js} +2 -2
- package/dashboard/dist/assets/{UserName-VXM1oHMC.js.map → UserName-YozoXJA1.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowExecutionPage-BCq2cR1V.js → WorkflowExecutionPage-Bce8g08l.js} +2 -2
- package/dashboard/dist/assets/{WorkflowExecutionPage-BCq2cR1V.js.map → WorkflowExecutionPage-Bce8g08l.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowPill-CQ1AmhlC.js → WorkflowPill-DlSVXnnj.js} +2 -2
- package/dashboard/dist/assets/{WorkflowPill-CQ1AmhlC.js.map → WorkflowPill-DlSVXnnj.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsDashboard-BbM69MnB.js → WorkflowsDashboard-DpVAH35I.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsDashboard-BbM69MnB.js.map → WorkflowsDashboard-DpVAH35I.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsOverview-D5HthpAW.js → WorkflowsOverview-Bp2pxXJO.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-D5HthpAW.js.map → WorkflowsOverview-Bp2pxXJO.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-CDDVMYWi.js → YamlWorkflowDetailPage-CL_kD0mX.js} +10 -10
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-CDDVMYWi.js.map → YamlWorkflowDetailPage-CL_kD0mX.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowsPage-FFjWwydj.js → YamlWorkflowsPage-Dtt3x3_T.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowsPage-FFjWwydj.js.map → YamlWorkflowsPage-Dtt3x3_T.js.map} +1 -1
- package/dashboard/dist/assets/{agents-BwiSNu73.js → agents-xhtLVBwq.js} +2 -2
- package/dashboard/dist/assets/{agents-BwiSNu73.js.map → agents-xhtLVBwq.js.map} +1 -1
- package/dashboard/dist/assets/{bots-ClgSrxel.js → bots-DZ1MQUms.js} +2 -2
- package/dashboard/dist/assets/{bots-ClgSrxel.js.map → bots-DZ1MQUms.js.map} +1 -1
- package/dashboard/dist/assets/{capabilities-JUaKsby4.js → capabilities-B8j2h7Jn.js} +2 -2
- package/dashboard/dist/assets/{capabilities-JUaKsby4.js.map → capabilities-B8j2h7Jn.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-CuTQ7eUE.js → controlplane-DKijNA6h.js} +2 -2
- package/dashboard/dist/assets/{controlplane-CuTQ7eUE.js.map → controlplane-DKijNA6h.js.map} +1 -1
- package/dashboard/dist/assets/escalation-columns-DjoZ4dDb.js +2 -0
- package/dashboard/dist/assets/escalation-columns-DjoZ4dDb.js.map +1 -0
- package/dashboard/dist/assets/{index-CwQVaa7x.js → index-0SzWFShg.js} +2 -2
- package/dashboard/dist/assets/{index-CwQVaa7x.js.map → index-0SzWFShg.js.map} +1 -1
- package/dashboard/dist/assets/{index-CUguKMXZ.js → index-B0ktIiOY.js} +2 -2
- package/dashboard/dist/assets/{index-CUguKMXZ.js.map → index-B0ktIiOY.js.map} +1 -1
- package/dashboard/dist/assets/{index-CoPWHo_H.js → index-BCIJE--_.js} +2 -2
- package/dashboard/dist/assets/{index-CoPWHo_H.js.map → index-BCIJE--_.js.map} +1 -1
- package/dashboard/dist/assets/index-BqeQGQ4K.js +2 -0
- package/dashboard/dist/assets/{index-C9o2UNhC.js.map → index-BqeQGQ4K.js.map} +1 -1
- package/dashboard/dist/assets/index-C6UuVkz7.js +63 -0
- package/dashboard/dist/assets/index-C6UuVkz7.js.map +1 -0
- package/dashboard/dist/assets/{index-CnsPBTXL.js → index-CMv6YMJY.js} +2 -2
- package/dashboard/dist/assets/{index-CnsPBTXL.js.map → index-CMv6YMJY.js.map} +1 -1
- package/dashboard/dist/assets/{index-BBA4AxmL.js → index-ChHD9p_I.js} +2 -2
- package/dashboard/dist/assets/{index-BBA4AxmL.js.map → index-ChHD9p_I.js.map} +1 -1
- package/dashboard/dist/assets/index-Cp1jJHm1.js +2 -0
- package/dashboard/dist/assets/{index-Xd1jcHe7.js.map → index-Cp1jJHm1.js.map} +1 -1
- package/dashboard/dist/assets/{index-CBj-vstO.js → index-DWDEa8jS.js} +2 -2
- package/dashboard/dist/assets/{index-CBj-vstO.js.map → index-DWDEa8jS.js.map} +1 -1
- package/dashboard/dist/assets/{index-DSa-6Ux8.js → index-DYCCUmSM.js} +2 -2
- package/dashboard/dist/assets/{index-DSa-6Ux8.js.map → index-DYCCUmSM.js.map} +1 -1
- package/dashboard/dist/assets/{index-Cavwd8UU.js → index-DcDEJ6b_.js} +3 -3
- package/dashboard/dist/assets/{index-Cavwd8UU.js.map → index-DcDEJ6b_.js.map} +1 -1
- package/dashboard/dist/assets/index-Dh5Y3hq7.js +5 -0
- package/dashboard/dist/assets/index-Dh5Y3hq7.js.map +1 -0
- package/dashboard/dist/assets/{index-C1t0YIXC.js → index-DrPWIFSv.js} +3 -3
- package/dashboard/dist/assets/{index-C1t0YIXC.js.map → index-DrPWIFSv.js.map} +1 -1
- package/dashboard/dist/assets/index-WSGppNeK.css +1 -0
- package/dashboard/dist/assets/{knowledge-BHBt-6kW.js → knowledge-Dl3cOfFR.js} +2 -2
- package/dashboard/dist/assets/{knowledge-BHBt-6kW.js.map → knowledge-Dl3cOfFR.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-CBcz4BCS.js → mcp-BwjeqkHn.js} +2 -2
- package/dashboard/dist/assets/{mcp-CBcz4BCS.js.map → mcp-BwjeqkHn.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-C4fKTOYo.js → mcp-query-C1Rlt4az.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-C4fKTOYo.js.map → mcp-query-C1Rlt4az.js.map} +1 -1
- package/dashboard/dist/assets/{pipelines-CmAAH3B6.js → pipelines-BGIUgIH_.js} +2 -2
- package/dashboard/dist/assets/{pipelines-CmAAH3B6.js.map → pipelines-BGIUgIH_.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-BAEsqcz2.js → tasks-CnC1xEaD.js} +2 -2
- package/dashboard/dist/assets/{tasks-BAEsqcz2.js.map → tasks-CnC1xEaD.js.map} +1 -1
- package/dashboard/dist/assets/{topics-CY0pJ6_o.js → topics-C6EcHi07.js} +2 -2
- package/dashboard/dist/assets/{topics-CY0pJ6_o.js.map → topics-C6EcHi07.js.map} +1 -1
- package/dashboard/dist/assets/{useEventHooks-BlpwRvHO.js → useEventHooks-Cyq4DiQA.js} +2 -2
- package/dashboard/dist/assets/{useEventHooks-BlpwRvHO.js.map → useEventHooks-Cyq4DiQA.js.map} +1 -1
- package/dashboard/dist/assets/{useFilterParams-x-Dg0Vgz.js → useFilterParams-CvRyYHJN.js} +2 -2
- package/dashboard/dist/assets/{useFilterParams-x-Dg0Vgz.js.map → useFilterParams-CvRyYHJN.js.map} +1 -1
- package/dashboard/dist/assets/{useNamespace-CoNUlZ6Z.js → useNamespace-Ci_oA5Tq.js} +2 -2
- package/dashboard/dist/assets/{useNamespace-CoNUlZ6Z.js.map → useNamespace-Ci_oA5Tq.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-8GUn5Wie.js → useYamlActivityEvents-u8RUiMma.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-8GUn5Wie.js.map → useYamlActivityEvents-u8RUiMma.js.map} +1 -1
- package/dashboard/dist/assets/{users-uGtDRGxR.js → users-DtiYvg8z.js} +2 -2
- package/dashboard/dist/assets/{users-uGtDRGxR.js.map → users-DtiYvg8z.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-DKCAtTJ9.js → vendor-icons-BE_WrH2z.js} +2 -2
- package/dashboard/dist/assets/{vendor-icons-DKCAtTJ9.js.map → vendor-icons-BE_WrH2z.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-react-CXumBFUA.js → vendor-react-BpdAFEQc.js} +2 -2
- package/dashboard/dist/assets/{vendor-react-CXumBFUA.js.map → vendor-react-BpdAFEQc.js.map} +1 -1
- package/dashboard/dist/assets/{workflows-DoX-AtHN.js → workflows-BysPDsh9.js} +2 -2
- package/dashboard/dist/assets/{workflows-DoX-AtHN.js.map → workflows-BysPDsh9.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-DM3jVem2.js → yaml-workflows-31qtxg5W.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-DM3jVem2.js.map → yaml-workflows-31qtxg5W.js.map} +1 -1
- package/dashboard/dist/index.html +4 -4
- package/docs/api/http/escalations.md +12 -3
- package/docs/hitl/escalation.md +21 -0
- package/docs/hitl/x-lt-embed.md +273 -0
- package/docs/hitl/x-lt-widget.md +3 -0
- package/package.json +2 -2
- package/dashboard/dist/assets/AgentConfigPage-CbIhM-fa.js +0 -16
- package/dashboard/dist/assets/AgentDetailPage-DuLEKzRT.js +0 -4
- package/dashboard/dist/assets/AgentDetailPage-DuLEKzRT.js.map +0 -1
- package/dashboard/dist/assets/AgentsPage-DZO9i7Nl.js +0 -2
- package/dashboard/dist/assets/AgentsPage-DZO9i7Nl.js.map +0 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-DlVoNd8B.js +0 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-DlVoNd8B.js.map +0 -1
- package/dashboard/dist/assets/CapabilitiesPage-BMNNTa0D.js +0 -2
- package/dashboard/dist/assets/CustomDurationPicker-ClufO2ew.js +0 -2
- package/dashboard/dist/assets/CustomDurationPicker-ClufO2ew.js.map +0 -1
- package/dashboard/dist/assets/HomePage-D8RVntg0.js +0 -2
- package/dashboard/dist/assets/HomePage-D8RVntg0.js.map +0 -1
- package/dashboard/dist/assets/OperationsPage-DI7AQO9f.js +0 -2
- package/dashboard/dist/assets/OperationsPage-DI7AQO9f.js.map +0 -1
- package/dashboard/dist/assets/escalation-columns-CS0c7cAr.js +0 -2
- package/dashboard/dist/assets/escalation-columns-CS0c7cAr.js.map +0 -1
- package/dashboard/dist/assets/index-C-8xXyvr.js +0 -63
- package/dashboard/dist/assets/index-C-8xXyvr.js.map +0 -1
- package/dashboard/dist/assets/index-C9o2UNhC.js +0 -2
- package/dashboard/dist/assets/index-DeMs_aBT.css +0 -1
- package/dashboard/dist/assets/index-Ikj_NTuy.js +0 -5
- package/dashboard/dist/assets/index-Ikj_NTuy.js.map +0 -1
- package/dashboard/dist/assets/index-Xd1jcHe7.js +0 -2
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{u as n,b as t,c as u}from"./vendor-query-B2UbickB.js";import{d as s}from"./index-
|
|
2
|
-
//# sourceMappingURL=workflows-
|
|
1
|
+
import{u as n,b as t,c as u}from"./vendor-query-B2UbickB.js";import{d as s}from"./index-C6UuVkz7.js";function f(){return n({queryKey:["activeWorkers"],queryFn:async()=>(await s("/workflows/workers")).workers})}function w(){return n({queryKey:["discoveredWorkflows"],queryFn:async()=>(await s("/workflows/discovered")).workflows})}function l(){return n({queryKey:["workflowConfigs"],queryFn:async()=>(await s("/workflows/config")).workflows})}function d(){return n({queryKey:["cronStatus"],queryFn:async()=>(await s("/workflows/cron/status")).schedules})}function k(e){return n({queryKey:["workflowExecution",e],queryFn:()=>s(`/workflow-states/${e}/execution`),enabled:!!e})}function m(e,o){const r=new URLSearchParams;return e.limit&&r.set("limit",String(e.limit)),e.offset!==void 0&&r.set("offset",String(e.offset)),e.entity&&r.set("entity",e.entity),e.search&&r.set("search",e.search),e.status&&r.set("status",e.status),e.sort_by&&r.set("sort_by",e.sort_by),e.order&&r.set("order",e.order),e.registered&&r.set("registered",e.registered),e.namespace&&r.set("namespace",e.namespace),n({queryKey:["jobs",e],queryFn:()=>s(`/workflow-states/jobs?${r}`),enabled:(o==null?void 0:o.enabled)??!0})}function q(){const e=t();return u({mutationFn:o=>s(`/workflows/${o}/terminate`,{method:"POST"}),onSuccess:(o,r)=>{e.invalidateQueries({queryKey:["workflowExecution",r],refetchType:"all"}),e.invalidateQueries({queryKey:["jobs"],refetchType:"all"})}})}function g(){const e=t();return u({mutationFn:({workflow_type:o,...r})=>s(`/workflows/${encodeURIComponent(o)}/config`,{method:"PUT",body:JSON.stringify(r)}),onSuccess:()=>{e.invalidateQueries({queryKey:["workflowConfigs"],refetchType:"all"})}})}function h(){const e=t();return u({mutationFn:o=>s(`/workflows/${encodeURIComponent(o)}/config`,{method:"DELETE"}),onSuccess:()=>{e.invalidateQueries({queryKey:["workflowConfigs"],refetchType:"all"})}})}function b(){const e=t();return u({mutationFn:({workflowType:o,data:r,metadata:i,execute_as:a})=>s(`/workflows/${o}/invoke`,{method:"POST",body:JSON.stringify({data:r,metadata:i,...a?{execute_as:a}:{}})}),onSuccess:()=>{e.invalidateQueries({queryKey:["tasks"],refetchType:"all"}),e.invalidateQueries({queryKey:["jobs"],refetchType:"all"})}})}export{k as a,m as b,b as c,w as d,d as e,q as f,f as g,h,g as i,l as u};
|
|
2
|
+
//# sourceMappingURL=workflows-BysPDsh9.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflows-
|
|
1
|
+
{"version":3,"file":"workflows-BysPDsh9.js","sources":["../../src/api/workflows.ts"],"sourcesContent":["import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { apiFetch } from './client';\nimport type { ActiveWorker, CronScheduleEntry, DiscoveredWorkflow, LTJob, LTWorkflowConfig, WorkflowExecution } from './types';\n\nexport function useActiveWorkers() {\n return useQuery<ActiveWorker[]>({\n queryKey: ['activeWorkers'],\n queryFn: async () => {\n const res = await apiFetch<{ workers: ActiveWorker[] }>('/workflows/workers');\n return res.workers;\n },\n });\n}\n\nexport function useDiscoveredWorkflows() {\n return useQuery<DiscoveredWorkflow[]>({\n queryKey: ['discoveredWorkflows'],\n queryFn: async () => {\n const res = await apiFetch<{ workflows: DiscoveredWorkflow[] }>('/workflows/discovered');\n return res.workflows;\n },\n });\n}\n\nexport function useWorkflowConfigs() {\n return useQuery<LTWorkflowConfig[]>({\n queryKey: ['workflowConfigs'],\n queryFn: async () => {\n const res = await apiFetch<{ workflows: LTWorkflowConfig[] }>('/workflows/config');\n return res.workflows;\n },\n });\n}\n\nexport function useCronStatus() {\n return useQuery<CronScheduleEntry[]>({\n queryKey: ['cronStatus'],\n queryFn: async () => {\n const res = await apiFetch<{ schedules: CronScheduleEntry[] }>('/workflows/cron/status');\n return res.schedules;\n },\n });\n}\n\nexport function useWorkflowExecution(workflowId: string) {\n return useQuery<WorkflowExecution>({\n queryKey: ['workflowExecution', workflowId],\n queryFn: () =>\n apiFetch(`/workflow-states/${workflowId}/execution`),\n enabled: !!workflowId,\n });\n}\n\nexport function useWorkflowState(workflowId: string) {\n return useQuery<{ workflow_id: string; state: Record<string, unknown> }>({\n queryKey: ['workflowState', workflowId],\n queryFn: () => apiFetch(`/workflow-states/${workflowId}/state`),\n enabled: !!workflowId,\n });\n}\n\nexport function useJobs(filters: {\n limit?: number;\n offset?: number;\n entity?: string;\n search?: string;\n status?: string;\n sort_by?: string;\n order?: string;\n registered?: string;\n namespace?: string;\n}, options?: { enabled?: boolean }) {\n const params = new URLSearchParams();\n if (filters.limit) params.set('limit', String(filters.limit));\n if (filters.offset !== undefined) params.set('offset', String(filters.offset));\n if (filters.entity) params.set('entity', filters.entity);\n if (filters.search) params.set('search', filters.search);\n if (filters.status) params.set('status', filters.status);\n if (filters.sort_by) params.set('sort_by', filters.sort_by);\n if (filters.order) params.set('order', filters.order);\n if (filters.registered) params.set('registered', filters.registered);\n if (filters.namespace) params.set('namespace', filters.namespace);\n\n return useQuery<{ jobs: LTJob[]; total: number }>({\n queryKey: ['jobs', filters],\n queryFn: () => apiFetch(`/workflow-states/jobs?${params}`),\n enabled: options?.enabled ?? true,\n });\n}\n\nexport function useTerminateWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (workflowId: string) =>\n apiFetch(`/workflows/${workflowId}/terminate`, { method: 'POST' }),\n onSuccess: (_data, workflowId) => {\n queryClient.invalidateQueries({ queryKey: ['workflowExecution', workflowId], refetchType: 'all' });\n queryClient.invalidateQueries({ queryKey: ['jobs'], refetchType: 'all' });\n },\n });\n}\n\nexport function useUpsertWorkflowConfig() {\n const queryClient = useQueryClient();\n return useMutation<\n LTWorkflowConfig,\n Error,\n {\n workflow_type: string;\n description?: string | null;\n\n invocable?: boolean;\n certified?: boolean;\n task_queue?: string | null;\n default_role?: string;\n roles?: string[];\n invocation_roles?: string[];\n consumes?: string[];\n envelope_schema?: Record<string, unknown> | null;\n resolver_schema?: Record<string, unknown> | null;\n cron_schedule?: string | null;\n execute_as?: string | null;\n }\n >({\n mutationFn: ({ workflow_type, ...body }) =>\n apiFetch(`/workflows/${encodeURIComponent(workflow_type)}/config`, {\n method: 'PUT',\n body: JSON.stringify(body),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['workflowConfigs'], refetchType: 'all' });\n },\n });\n}\n\nexport function useDeleteWorkflowConfig() {\n const queryClient = useQueryClient();\n return useMutation<{ deleted: boolean; workflow_type: string }, Error, string>({\n mutationFn: (workflowType) =>\n apiFetch(`/workflows/${encodeURIComponent(workflowType)}/config`, {\n method: 'DELETE',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['workflowConfigs'], refetchType: 'all' });\n },\n });\n}\n\nexport function useSetCronSchedule() {\n const queryClient = useQueryClient();\n return useMutation<\n LTWorkflowConfig,\n Error,\n { config: LTWorkflowConfig; cron_schedule: string | null; envelope_schema?: Record<string, unknown> | null }\n >({\n mutationFn: ({ config, cron_schedule, envelope_schema }) =>\n apiFetch(`/workflows/${encodeURIComponent(config.workflow_type)}/config`, {\n method: 'PUT',\n body: JSON.stringify({\n ...config,\n cron_schedule,\n ...(envelope_schema !== undefined ? { envelope_schema } : {}),\n }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['workflowConfigs'], refetchType: 'all' });\n queryClient.invalidateQueries({ queryKey: ['cronStatus'], refetchType: 'all' });\n },\n });\n}\n\nexport function useInvokeWorkflow() {\n const queryClient = useQueryClient();\n return useMutation<\n { workflowId: string; message: string },\n Error,\n { workflowType: string; data: Record<string, unknown>; metadata?: Record<string, unknown>; execute_as?: string }\n >({\n mutationFn: ({ workflowType, data, metadata, execute_as }) =>\n apiFetch(`/workflows/${workflowType}/invoke`, {\n method: 'POST',\n body: JSON.stringify({ data, metadata, ...(execute_as ? { execute_as } : {}) }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['tasks'], refetchType: 'all' });\n queryClient.invalidateQueries({ queryKey: ['jobs'], refetchType: 'all' });\n },\n });\n}\n"],"names":["useActiveWorkers","useQuery","apiFetch","useDiscoveredWorkflows","useWorkflowConfigs","useCronStatus","useWorkflowExecution","workflowId","useJobs","filters","options","params","useTerminateWorkflow","queryClient","useQueryClient","useMutation","_data","useUpsertWorkflowConfig","workflow_type","body","useDeleteWorkflowConfig","workflowType","useInvokeWorkflow","data","metadata","execute_as"],"mappings":"qGAIO,SAASA,GAAmB,CACjC,OAAOC,EAAyB,CAC9B,SAAU,CAAC,eAAe,EAC1B,QAAS,UACK,MAAMC,EAAsC,oBAAoB,GACjE,OACb,CACD,CACH,CAEO,SAASC,GAAyB,CACvC,OAAOF,EAA+B,CACpC,SAAU,CAAC,qBAAqB,EAChC,QAAS,UACK,MAAMC,EAA8C,uBAAuB,GAC5E,SACb,CACD,CACH,CAEO,SAASE,GAAqB,CACnC,OAAOH,EAA6B,CAClC,SAAU,CAAC,iBAAiB,EAC5B,QAAS,UACK,MAAMC,EAA4C,mBAAmB,GACtE,SACb,CACD,CACH,CAEO,SAASG,GAAgB,CAC9B,OAAOJ,EAA8B,CACnC,SAAU,CAAC,YAAY,EACvB,QAAS,UACK,MAAMC,EAA6C,wBAAwB,GAC5E,SACb,CACD,CACH,CAEO,SAASI,EAAqBC,EAAoB,CACvD,OAAON,EAA4B,CACjC,SAAU,CAAC,oBAAqBM,CAAU,EAC1C,QAAS,IACPL,EAAS,oBAAoBK,CAAU,YAAY,EACrD,QAAS,CAAC,CAACA,CAAA,CACZ,CACH,CAUO,SAASC,EAAQC,EAUrBC,EAAiC,CAClC,MAAMC,EAAS,IAAI,gBACnB,OAAIF,EAAQ,OAAOE,EAAO,IAAI,QAAS,OAAOF,EAAQ,KAAK,CAAC,EACxDA,EAAQ,SAAW,QAAWE,EAAO,IAAI,SAAU,OAAOF,EAAQ,MAAM,CAAC,EACzEA,EAAQ,QAAQE,EAAO,IAAI,SAAUF,EAAQ,MAAM,EACnDA,EAAQ,QAAQE,EAAO,IAAI,SAAUF,EAAQ,MAAM,EACnDA,EAAQ,QAAQE,EAAO,IAAI,SAAUF,EAAQ,MAAM,EACnDA,EAAQ,SAASE,EAAO,IAAI,UAAWF,EAAQ,OAAO,EACtDA,EAAQ,OAAOE,EAAO,IAAI,QAASF,EAAQ,KAAK,EAChDA,EAAQ,YAAYE,EAAO,IAAI,aAAcF,EAAQ,UAAU,EAC/DA,EAAQ,WAAWE,EAAO,IAAI,YAAaF,EAAQ,SAAS,EAEzDR,EAA2C,CAChD,SAAU,CAAC,OAAQQ,CAAO,EAC1B,QAAS,IAAMP,EAAS,yBAAyBS,CAAM,EAAE,EACzD,SAASD,GAAA,YAAAA,EAAS,UAAW,EAAA,CAC9B,CACH,CAEO,SAASE,GAAuB,CACrC,MAAMC,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAaR,GACXL,EAAS,cAAcK,CAAU,aAAc,CAAE,OAAQ,OAAQ,EACnE,UAAW,CAACS,EAAOT,IAAe,CAChCM,EAAY,kBAAkB,CAAE,SAAU,CAAC,oBAAqBN,CAAU,EAAG,YAAa,MAAO,EACjGM,EAAY,kBAAkB,CAAE,SAAU,CAAC,MAAM,EAAG,YAAa,MAAO,CAC1E,CAAA,CACD,CACH,CAEO,SAASI,GAA0B,CACxC,MAAMJ,EAAcC,EAAA,EACpB,OAAOC,EAmBL,CACA,WAAY,CAAC,CAAE,cAAAG,EAAe,GAAGC,CAAA,IAC/BjB,EAAS,cAAc,mBAAmBgB,CAAa,CAAC,UAAW,CACjE,OAAQ,MACR,KAAM,KAAK,UAAUC,CAAI,CAAA,CAC1B,EACH,UAAW,IAAM,CACfN,EAAY,kBAAkB,CAAE,SAAU,CAAC,iBAAiB,EAAG,YAAa,MAAO,CACrF,CAAA,CACD,CACH,CAEO,SAASO,GAA0B,CACxC,MAAMP,EAAcC,EAAA,EACpB,OAAOC,EAAwE,CAC7E,WAAaM,GACXnB,EAAS,cAAc,mBAAmBmB,CAAY,CAAC,UAAW,CAChE,OAAQ,QAAA,CACT,EACH,UAAW,IAAM,CACfR,EAAY,kBAAkB,CAAE,SAAU,CAAC,iBAAiB,EAAG,YAAa,MAAO,CACrF,CAAA,CACD,CACH,CAyBO,SAASS,GAAoB,CAClC,MAAMT,EAAcC,EAAA,EACpB,OAAOC,EAIL,CACA,WAAY,CAAC,CAAE,aAAAM,EAAc,KAAAE,EAAM,SAAAC,EAAU,WAAAC,KAC3CvB,EAAS,cAAcmB,CAAY,UAAW,CAC5C,OAAQ,OACR,KAAM,KAAK,UAAU,CAAE,KAAAE,EAAM,SAAAC,EAAU,GAAIC,EAAa,CAAE,WAAAA,CAAA,EAAe,GAAK,CAAA,CAC/E,EACH,UAAW,IAAM,CACfZ,EAAY,kBAAkB,CAAE,SAAU,CAAC,OAAO,EAAG,YAAa,MAAO,EACzEA,EAAY,kBAAkB,CAAE,SAAU,CAAC,MAAM,EAAG,YAAa,MAAO,CAC1E,CAAA,CACD,CACH"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{u as l,b as a,c as s}from"./vendor-query-B2UbickB.js";import{d as r}from"./index-
|
|
2
|
-
//# sourceMappingURL=yaml-workflows-
|
|
1
|
+
import{u as l,b as a,c as s}from"./vendor-query-B2UbickB.js";import{d as r}from"./index-C6UuVkz7.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-31qtxg5W.js.map
|
package/dashboard/dist/assets/{yaml-workflows-DM3jVem2.js.map → yaml-workflows-31qtxg5W.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"yaml-workflows-DM3jVem2.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-31qtxg5W.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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"}
|
|
@@ -8,11 +8,11 @@
|
|
|
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-
|
|
11
|
+
<script type="module" crossorigin src="./assets/index-C6UuVkz7.js"></script>
|
|
12
12
|
<link rel="modulepreload" crossorigin href="./assets/vendor-query-B2UbickB.js">
|
|
13
|
-
<link rel="modulepreload" crossorigin href="./assets/vendor-react-
|
|
14
|
-
<link rel="modulepreload" crossorigin href="./assets/vendor-icons-
|
|
15
|
-
<link rel="stylesheet" crossorigin href="./assets/index-
|
|
13
|
+
<link rel="modulepreload" crossorigin href="./assets/vendor-react-BpdAFEQc.js">
|
|
14
|
+
<link rel="modulepreload" crossorigin href="./assets/vendor-icons-BE_WrH2z.js">
|
|
15
|
+
<link rel="stylesheet" crossorigin href="./assets/index-WSGppNeK.css">
|
|
16
16
|
</head>
|
|
17
17
|
<body>
|
|
18
18
|
<div id="root"></div>
|
|
@@ -619,22 +619,31 @@ Claim multiple escalations for the authenticated user. Requires admin or superad
|
|
|
619
619
|
POST /api/escalations/bulk-assign
|
|
620
620
|
```
|
|
621
621
|
|
|
622
|
-
Assign multiple escalations to a specific user. Superadmins can assign anyone. Admins can only assign to users who hold the escalation's role.
|
|
622
|
+
Assign multiple escalations to a specific user, by id-set or by query (exactly one). Superadmins can assign anyone. Admins can only assign to users who hold the escalation's role.
|
|
623
|
+
|
|
624
|
+
The query form is one atomic statement: selection and claim happen in the same UPDATE, so a row that re-parks between a search and an ids-assign is still captured. Use it whenever the population is describable by role + facets.
|
|
623
625
|
|
|
624
626
|
**Request body:**
|
|
625
627
|
|
|
626
628
|
| Field | Type | Default | Description |
|
|
627
629
|
|-------|------|---------|-------------|
|
|
628
|
-
| `ids` | `string[]` | | Escalation UUIDs to assign |
|
|
630
|
+
| `ids` | `string[]` | | Escalation UUIDs to assign (ids form) |
|
|
631
|
+
| `query` | `object` | | `{ role, facets? }` selector (query form); `role` is required, `facets` filter by metadata containment |
|
|
629
632
|
| `targetUserId` | `string` | | User ID to assign the escalations to |
|
|
630
633
|
| `durationMinutes` | `integer` | 30 | How long each assignment lasts |
|
|
631
634
|
|
|
632
|
-
**Example request:**
|
|
635
|
+
**Example request (ids form):**
|
|
633
636
|
|
|
634
637
|
```json
|
|
635
638
|
{ "ids": ["esc-a1b2c3d4-..."], "targetUserId": "user-x1y2z3", "durationMinutes": 60 }
|
|
636
639
|
```
|
|
637
640
|
|
|
641
|
+
**Example request (query form):**
|
|
642
|
+
|
|
643
|
+
```json
|
|
644
|
+
{ "query": { "role": "harvester", "facets": { "walkId": "walk-7" } }, "targetUserId": "user-x1y2z3", "durationMinutes": 60 }
|
|
645
|
+
```
|
|
646
|
+
|
|
638
647
|
**Response 200:** Result object with assignment outcomes.
|
|
639
648
|
|
|
640
649
|
**Response 400:**
|
package/docs/hitl/escalation.md
CHANGED
|
@@ -53,6 +53,27 @@ export async function approvalWorkflow(envelope: LTEnvelope) {
|
|
|
53
53
|
- `false` — SLA timeout (omit `timeout` for an open-ended wait)
|
|
54
54
|
- `null` — cancellation (workflow terminated or explicit cancel)
|
|
55
55
|
|
|
56
|
+
### Resolution provenance — `$resolution`
|
|
57
|
+
|
|
58
|
+
Interactive and webhook resolves deliver the resolver's identity alongside the payload under the reserved `$resolution` key. Declare it in the generic to consume it — the standard pattern for assigning follow-on work to whoever resolved:
|
|
59
|
+
|
|
60
|
+
```typescript
|
|
61
|
+
import type { EscalationResolution } from '@hotmeshio/long-tail';
|
|
62
|
+
|
|
63
|
+
const decision = await conditionLT<{
|
|
64
|
+
approved: boolean;
|
|
65
|
+
$resolution?: EscalationResolution;
|
|
66
|
+
}>(signalId, { role: 'print-operator', metadata: { orderId } });
|
|
67
|
+
|
|
68
|
+
if (decision && decision.$resolution) {
|
|
69
|
+
const { escalationId, resolvedBy, resolvedByEmail } = decision.$resolution;
|
|
70
|
+
// e.g. claim the follow-on rows for the same person, atomically:
|
|
71
|
+
// POST /api/escalations/bulk-assign { query: {...}, targetUserId: resolvedBy }
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
`$resolution` carries `escalationId`, `resolvedBy` (user id), and `resolvedByEmail` when known. It rides the signal only — the stored `resolver_payload` audit column receives the form payload untouched. The same resolve also merges `resolved_by` into the row's GIN-indexed `metadata`, so "who resolved it" is `@>`-queryable without a follow-up read. The `$`-prefixed key namespace is reserved for control data; consumer form fields never collide with it.
|
|
76
|
+
|
|
56
77
|
### Row completeness guarantee
|
|
57
78
|
|
|
58
79
|
Every field of the config — including all `metadata` facets — commits inside the Leg1 checkpoint. A claim-by-metadata router or a version-pinned facet reads a complete row from its first visible moment; there is no window where a row is visible but its metadata is still en route.
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
# Embed and Navigation Widgets
|
|
2
|
+
|
|
3
|
+
Three display-only widgets that surface related information inside an escalation's resolver form without leaving the page. All three produce **no resolver payload** — they must never appear in the schema's `required` array and are always declared `readOnly: true`.
|
|
4
|
+
|
|
5
|
+
| Widget | Token | What it shows |
|
|
6
|
+
|--------|-------|---------------|
|
|
7
|
+
| `"link"` | `x-lt-href` | A named hyperlink to any dashboard view, with pre-applied deep-link query |
|
|
8
|
+
| `"escalation"` | `x-lt-source`, `x-lt-fields` | A single embedded escalation record, with a flexible facts panel |
|
|
9
|
+
| `"escalation-list"` | `x-lt-query`, `x-lt-columns` | A compact in-form list of escalations driven by a facet query |
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Link widget (`x-lt-widget: "link"`)
|
|
14
|
+
|
|
15
|
+
Renders a named anchor whose URL is resolved from a `{{domain.path}}` template at render time. Use it to give reviewers a one-click path to a related queue, pre-filtered to the current item.
|
|
16
|
+
|
|
17
|
+
```json
|
|
18
|
+
{
|
|
19
|
+
"originator_queue": {
|
|
20
|
+
"type": "string",
|
|
21
|
+
"readOnly": true,
|
|
22
|
+
"x-lt-widget": "link",
|
|
23
|
+
"x-lt-href": "/escalations/available?role=rel-originator&facets={\"orderId\":\"{{metadata.orderId}}\"}",
|
|
24
|
+
"x-lt-span": 2,
|
|
25
|
+
"x-lt-section": "Related",
|
|
26
|
+
"title": "View originator queue for this order",
|
|
27
|
+
"description": "Opens the originator queue pre-filtered to this order"
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### `x-lt-href` (required)
|
|
33
|
+
|
|
34
|
+
A URL template string. `{{domain.path}}` tokens are interpolated using the same five domains as `x-lt-help` — `escalation`, `metadata`, `envelope`, `payload`, `resolver` — resolved against the current form's escalation context.
|
|
35
|
+
|
|
36
|
+
Paths starting with `/` navigate inside the dashboard via the React Router client. Everything else opens in a new tab with `rel="noreferrer"`.
|
|
37
|
+
|
|
38
|
+
When the URL is empty after interpolation (the template resolved to blank), the widget renders a muted "No link configured" placeholder.
|
|
39
|
+
|
|
40
|
+
### Display text
|
|
41
|
+
|
|
42
|
+
The field's `title` keyword is the link label. `description` renders as a one-line helper beneath it. If `title` is absent, `description` is used as the label.
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Escalation widget (`x-lt-widget: "escalation"`)
|
|
47
|
+
|
|
48
|
+
Embeds a single escalation record as a compact card. The escalation ID is resolved from the current form's escalation context via `x-lt-source`. An optional `x-lt-fields` array configures which metadata or resolver facts from the embedded record appear in the card.
|
|
49
|
+
|
|
50
|
+
```json
|
|
51
|
+
{
|
|
52
|
+
"parent_escalation": {
|
|
53
|
+
"type": "string",
|
|
54
|
+
"readOnly": true,
|
|
55
|
+
"x-lt-widget": "escalation",
|
|
56
|
+
"x-lt-source": "metadata.parent_escalation_id",
|
|
57
|
+
"x-lt-fields": [
|
|
58
|
+
{ "label": "Order ID", "value": "{{metadata.orderId}}" },
|
|
59
|
+
{ "label": "Decision", "value": "{{resolver.decision}}" },
|
|
60
|
+
{ "label": "Reason", "value": "{{resolver.reason}}" },
|
|
61
|
+
{ "label": "Age", "value": "{{escalation.created_at}}", "format": "age" }
|
|
62
|
+
],
|
|
63
|
+
"x-lt-span": 2,
|
|
64
|
+
"x-lt-section": "Related",
|
|
65
|
+
"title": "Originating request",
|
|
66
|
+
"description": "The escalation that created this item"
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### `x-lt-source` (required)
|
|
72
|
+
|
|
73
|
+
A `"domain.path"` expression — the same convention as the checklist widget — resolved against the current form's escalation context to obtain the embedded escalation's UUID. Example: `"metadata.parent_escalation_id"` reads the `parent_escalation_id` key from the row's metadata.
|
|
74
|
+
|
|
75
|
+
When `x-lt-source` resolves to nothing, or the fetched escalation is not found or is inaccessible (RBAC enforcement happens server-side), the widget renders a quiet "No linked record" placeholder.
|
|
76
|
+
|
|
77
|
+
### `x-lt-fields` (optional)
|
|
78
|
+
|
|
79
|
+
An array of `{ label, value, format? }` objects — the same shape as `x-lt-active.fields` and `x-lt-card.fields` in list schemas. The `value` strings use `{{domain.path}}` tokens, but resolved against the **embedded escalation's own data** — its `escalation` row, `metadata`, `envelope`, `payload`, and `resolver` — not the parent form's context.
|
|
80
|
+
|
|
81
|
+
Available domains for `x-lt-fields`:
|
|
82
|
+
|
|
83
|
+
| Domain | Resolves against |
|
|
84
|
+
|--------|-----------------|
|
|
85
|
+
| `escalation` | The embedded escalation's columns: `escalation.status`, `escalation.role`, `escalation.type` |
|
|
86
|
+
| `metadata` | The embedded escalation's metadata dict |
|
|
87
|
+
| `envelope` | The embedded escalation's workflow-sent envelope |
|
|
88
|
+
| `payload` | The embedded escalation's context payload |
|
|
89
|
+
| `resolver` | The embedded escalation's resolver payload |
|
|
90
|
+
|
|
91
|
+
`format: "age"` turns an ISO timestamp into a compact relative age (`12m`, `3h`).
|
|
92
|
+
|
|
93
|
+
When `x-lt-fields` is absent, the card renders only the type/status header, description, and footer.
|
|
94
|
+
|
|
95
|
+
### Card anatomy
|
|
96
|
+
|
|
97
|
+
```
|
|
98
|
+
esc-type · subtype [status]
|
|
99
|
+
─────────────────────────────
|
|
100
|
+
The escalation description
|
|
101
|
+
─────────────────────────────
|
|
102
|
+
Order ID ORD-123
|
|
103
|
+
Decision Approved
|
|
104
|
+
─────────────────────────────
|
|
105
|
+
rel-originator · 2h ago Detail →
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## Escalation list widget (`x-lt-widget: "escalation-list"`)
|
|
111
|
+
|
|
112
|
+
Embeds a compact, paginated-free list of escalations driven by a facet query. Use it to give reviewers visibility into sibling items — a set of pending items in a related role, filtered to the same customer, order, or any other metadata facet.
|
|
113
|
+
|
|
114
|
+
```json
|
|
115
|
+
{
|
|
116
|
+
"sibling_items": {
|
|
117
|
+
"type": "string",
|
|
118
|
+
"readOnly": true,
|
|
119
|
+
"x-lt-widget": "escalation-list",
|
|
120
|
+
"x-lt-query": {
|
|
121
|
+
"role": "rel-originator",
|
|
122
|
+
"facets": { "customerId": "{{metadata.customerId}}" },
|
|
123
|
+
"status": "pending",
|
|
124
|
+
"limit": 5
|
|
125
|
+
},
|
|
126
|
+
"x-lt-columns": [
|
|
127
|
+
{ "label": "Order", "value": "{{metadata.orderId}}" },
|
|
128
|
+
{ "label": "Status", "value": "{{escalation.status}}" },
|
|
129
|
+
{ "label": "Age", "value": "{{escalation.created_at}}", "format": "age" }
|
|
130
|
+
],
|
|
131
|
+
"x-lt-span": 2,
|
|
132
|
+
"x-lt-section": "Related",
|
|
133
|
+
"title": "Other pending items for this customer",
|
|
134
|
+
"description": "Up to 5 items currently waiting in the originator queue"
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### `x-lt-query` (required)
|
|
140
|
+
|
|
141
|
+
A structured query object. String values inside `facets` support `{{domain.path}}` token interpolation resolved against the parent form's escalation context (the current item's data).
|
|
142
|
+
|
|
143
|
+
| Field | Type | Description |
|
|
144
|
+
|-------|------|-------------|
|
|
145
|
+
| `role` | `string` | Role queue to query |
|
|
146
|
+
| `status` | `string` | `"pending"`, `"resolved"`, `"cancelled"`, `"expired"` |
|
|
147
|
+
| `facets` | `Record<string, string>` | Metadata containment filter; string values support `{{domain.path}}` tokens |
|
|
148
|
+
| `available` | `boolean` | `true` — unclaimed/expired only |
|
|
149
|
+
| `limit` | `number` | Max rows to show (default: 5) |
|
|
150
|
+
|
|
151
|
+
The widget is disabled (shows no list and makes no API call) when neither `role` nor any facet value is set — both are required to avoid broad unbounded queries.
|
|
152
|
+
|
|
153
|
+
### `x-lt-columns` (optional)
|
|
154
|
+
|
|
155
|
+
An array of `{ label, value, format? }` — the same shape as `x-lt-columns` in list schemas. The `value` strings use `{{domain.path}}` tokens resolved against each **displayed** escalation's own context (its row, metadata, envelope, payload, resolver).
|
|
156
|
+
|
|
157
|
+
When `x-lt-columns` is absent, three default columns are used: Description, Role, Age.
|
|
158
|
+
|
|
159
|
+
`format: "age"` turns an ISO timestamp into a compact relative age.
|
|
160
|
+
|
|
161
|
+
Each row links to the escalation's detail page.
|
|
162
|
+
|
|
163
|
+
### `x-lt-actions` (optional)
|
|
164
|
+
|
|
165
|
+
Inline row actions: each row gains a button that fires a canned resolve against that escalation through the standard resolve endpoint. RBAC and `enforce_schema` validation apply server-side exactly as a full-form resolve — the button is a shortcut, not a bypass.
|
|
166
|
+
|
|
167
|
+
```json
|
|
168
|
+
"x-lt-actions": [
|
|
169
|
+
{
|
|
170
|
+
"label": "Bagged ✓",
|
|
171
|
+
"resolverPayload": {
|
|
172
|
+
"approved": true,
|
|
173
|
+
"checks": { "bagged": true, "labeled": true },
|
|
174
|
+
"orderId": "{{metadata.orderId}}"
|
|
175
|
+
},
|
|
176
|
+
"confirm": "Bag {{metadata.orderId}} {{metadata.side}}?"
|
|
177
|
+
}
|
|
178
|
+
]
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
| Field | Type | Description |
|
|
182
|
+
|-------|------|-------------|
|
|
183
|
+
| `label` | `string` | Button text |
|
|
184
|
+
| `resolverPayload` | `object` | The canned payload. String leaves interpolate `{{domain.path}}` tokens against the row's own context; booleans and numbers pass through typed |
|
|
185
|
+
| `confirm` | `string` | Optional confirm prompt shown before firing; tokens interpolate per row |
|
|
186
|
+
|
|
187
|
+
On success the row updates in place through the standard query invalidation — no navigation. A rejected resolve (validation failure, lost claim) shows the server's message inline in the row; the detail link stays available, so the full form remains the path for rejects and anything the canned payload can't express.
|
|
188
|
+
|
|
189
|
+
Declare one action for the happy path and leave the exception path to the form. A "walk" of N sibling items collapses from N navigations to N clicks on one page.
|
|
190
|
+
|
|
191
|
+
### Empty and loading states
|
|
192
|
+
|
|
193
|
+
- **Loading** — three skeleton rows are displayed.
|
|
194
|
+
- **Empty** — a muted "No items found" message replaces the table.
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## Submit guard (`x-lt-submit-guard`)
|
|
199
|
+
|
|
200
|
+
A top-level form_schema token (a peer of `x-lt-help`) that keeps the resolve button honest while related work is still open. The submit stays disabled while the declared query returns rows; the message renders beside it with the live count. When the last row resolves, the socket-driven invalidation refires the query and the button lights up — no polling, no submit-and-get-rejected round trip.
|
|
201
|
+
|
|
202
|
+
```json
|
|
203
|
+
{
|
|
204
|
+
"x-lt-submit-guard": {
|
|
205
|
+
"query": {
|
|
206
|
+
"role": "print-harvest",
|
|
207
|
+
"status": "pending",
|
|
208
|
+
"facets": { "walkId": "{{metadata.walkId}}" }
|
|
209
|
+
},
|
|
210
|
+
"mustBeEmpty": true,
|
|
211
|
+
"message": "{{count}} plates still pending — bag them before closing the walk."
|
|
212
|
+
},
|
|
213
|
+
"type": "object",
|
|
214
|
+
"properties": { ... }
|
|
215
|
+
}
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
| Field | Type | Description |
|
|
219
|
+
|-------|------|-------------|
|
|
220
|
+
| `query` | `object` | Same shape as `x-lt-query`; facet string values interpolate against the host escalation's context |
|
|
221
|
+
| `mustBeEmpty` | `boolean` | The gate condition (default `true`) |
|
|
222
|
+
| `message` | `string` | Shown beside the disabled submit; `{{count}}` carries the live row count, `{{domain.path}}` tokens also interpolate |
|
|
223
|
+
|
|
224
|
+
Pair it with an `escalation-list` embed on the same query so the operator sees exactly which rows are holding the gate.
|
|
225
|
+
|
|
226
|
+
The guard is a UI layer: it makes the form honest, it does not enforce. A resolve arriving through the raw API bypasses it by design — the consuming workflow's own verification (reject and re-park with the remainder) is the durable backstop. Triage is never gated: when the guarded work itself is the problem, "Send to Triage" stays available.
|
|
227
|
+
|
|
228
|
+
---
|
|
229
|
+
|
|
230
|
+
## Composing with other tokens
|
|
231
|
+
|
|
232
|
+
All three embed widgets compose with the standard x-lt-* vocabulary:
|
|
233
|
+
|
|
234
|
+
```json
|
|
235
|
+
{
|
|
236
|
+
"related_link": {
|
|
237
|
+
"type": "string",
|
|
238
|
+
"readOnly": true,
|
|
239
|
+
"x-lt-widget": "link",
|
|
240
|
+
"x-lt-href": "/escalations/available?role=rel-originator&facets={\"orderId\":\"{{metadata.orderId}}\"}",
|
|
241
|
+
"x-lt-span": 2,
|
|
242
|
+
"x-lt-section": "Related resources",
|
|
243
|
+
"x-lt-showIf": "metadata.orderId",
|
|
244
|
+
"title": "Open originator queue for this order"
|
|
245
|
+
},
|
|
246
|
+
"parent_esc": {
|
|
247
|
+
"type": "string",
|
|
248
|
+
"readOnly": true,
|
|
249
|
+
"x-lt-widget": "escalation",
|
|
250
|
+
"x-lt-source": "metadata.parent_escalation_id",
|
|
251
|
+
"x-lt-span": 2,
|
|
252
|
+
"x-lt-section": "Related resources",
|
|
253
|
+
"x-lt-showIf": "metadata.parent_escalation_id",
|
|
254
|
+
"title": "Originating escalation"
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
`x-lt-showIf` suppresses an embed widget when its data isn't present — use this to hide the embedded escalation when `parent_escalation_id` is absent, or hide the list when no `customerId` is in metadata.
|
|
260
|
+
|
|
261
|
+
---
|
|
262
|
+
|
|
263
|
+
## Security
|
|
264
|
+
|
|
265
|
+
RBAC is enforced server-side. The escalation and escalation-list widgets only render what the authenticated user's roles permit them to see. A widget that resolves an escalation the caller cannot access renders "No linked record" — the same response as an unknown ID — with no information leak.
|
|
266
|
+
|
|
267
|
+
The link widget generates a client-side URL; the queue it points to applies its own RBAC when the user navigates there.
|
|
268
|
+
|
|
269
|
+
---
|
|
270
|
+
|
|
271
|
+
## Example workflow
|
|
272
|
+
|
|
273
|
+
The `examples/workflows/related-escalations/` workflow demonstrates all three widgets in a realistic two-stage review scenario. See `forms.ts` in that directory for the complete form schema.
|
package/docs/hitl/x-lt-widget.md
CHANGED
|
@@ -11,6 +11,9 @@ For rich inputs beyond standard HTML types, set `x-lt-widget` on any field:
|
|
|
11
11
|
| `"markdown"` | Markdown source rendered with headings, tables, lists, code blocks. Editable by default; set `readOnly: true` for a pure content block. |
|
|
12
12
|
| `"checklist"` | Dynamic labeled checkboxes driven by runtime data. Items come from a `"domain.path"` declared in `x-lt-source`. |
|
|
13
13
|
| `"attachment"` | ReadOnly display of a captured binary (data URL or fetchable URL): images inline with click-to-full-size, everything else as a safe open/download link. `"image"` is an accepted alias. |
|
|
14
|
+
| `"link"` | ReadOnly navigation link. URL is an `x-lt-href` template with `{{domain.path}}` tokens. See [x-lt-embed.md](x-lt-embed.md). |
|
|
15
|
+
| `"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). |
|
|
16
|
+
| `"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). |
|
|
14
17
|
|
|
15
18
|
---
|
|
16
19
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hotmeshio/long-tail",
|
|
3
|
-
"version": "0.10.
|
|
3
|
+
"version": "0.10.7",
|
|
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",
|
|
@@ -72,7 +72,7 @@
|
|
|
72
72
|
"@anthropic-ai/sdk": "^0.92.0",
|
|
73
73
|
"@aws-sdk/client-s3": "^3.1017.0",
|
|
74
74
|
"@aws-sdk/s3-request-presigner": "^3.1045.0",
|
|
75
|
-
"@hotmeshio/hotmesh": "^0.26.
|
|
75
|
+
"@hotmeshio/hotmesh": "^0.26.3",
|
|
76
76
|
"@modelcontextprotocol/sdk": "^1.27.1",
|
|
77
77
|
"@opentelemetry/exporter-trace-otlp-proto": "^0.215.0",
|
|
78
78
|
"@opentelemetry/resources": "^2.5.1",
|