@hotmeshio/long-tail 0.10.7 → 0.10.9
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.js +7 -1
- package/build/api/escalations/helpers.d.ts +10 -1
- package/build/api/escalations/helpers.js +52 -12
- package/build/lib/events/matching.d.ts +10 -0
- package/build/lib/events/matching.js +14 -0
- package/build/lib/events/publish.d.ts +8 -2
- package/build/lib/events/publish.js +9 -2
- package/build/lib/events/socketio.d.ts +8 -2
- package/build/lib/events/socketio.js +36 -3
- package/build/lib/events/system-events.js +9 -1
- package/build/services/escalation/crud.js +40 -2
- package/build/services/orchestrator/condition.d.ts +1 -1
- package/build/services/orchestrator/condition.js +1 -1
- package/build/services/topics/system-topics.d.ts +0 -4
- package/build/services/topics/system-topics.js +57 -14
- package/build/types/events.d.ts +11 -3
- package/build/types/index.d.ts +1 -1
- package/dashboard/dist/assets/{AdminDashboard-CYlm0_J0.js → AdminDashboard-DWSYdAeW.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-CYlm0_J0.js.map → AdminDashboard-DWSYdAeW.js.map} +1 -1
- package/dashboard/dist/assets/{AgentConfigPage-BttOMcj_.js → AgentConfigPage-Dm6gL76m.js} +2 -2
- package/dashboard/dist/assets/{AgentConfigPage-BttOMcj_.js.map → AgentConfigPage-Dm6gL76m.js.map} +1 -1
- package/dashboard/dist/assets/{AgentDetailPage-D9JdkWV8.js → AgentDetailPage-D-Xbyrb6.js} +3 -3
- package/dashboard/dist/assets/AgentDetailPage-D-Xbyrb6.js.map +1 -0
- package/dashboard/dist/assets/{AgentsPage-AqGtEOL1.js → AgentsPage-DKaDRk-Y.js} +2 -2
- package/dashboard/dist/assets/{AgentsPage-AqGtEOL1.js.map → AgentsPage-DKaDRk-Y.js.map} +1 -1
- package/dashboard/dist/assets/{AvailableEscalationsPage-rKbrcY8Y.js → AvailableEscalationsPage-B-aHvGKD.js} +2 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-B-aHvGKD.js.map +1 -0
- package/dashboard/dist/assets/{BotPicker-Bj4MB_so.js → BotPicker-DRv_orzI.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-Bj4MB_so.js.map → BotPicker-DRv_orzI.js.map} +1 -1
- package/dashboard/dist/assets/{CapabilitiesPage-DzLP5-ad.js → CapabilitiesPage-DqRVzMol.js} +2 -2
- package/dashboard/dist/assets/{CapabilitiesPage-DzLP5-ad.js.map → CapabilitiesPage-DqRVzMol.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-CReMhtzK.js → CollapsibleSection-D0psvw8i.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-CReMhtzK.js.map → CollapsibleSection-D0psvw8i.js.map} +1 -1
- package/dashboard/dist/assets/CountdownTimer-BhF3oqS8.js +2 -0
- package/dashboard/dist/assets/CountdownTimer-BhF3oqS8.js.map +1 -0
- package/dashboard/dist/assets/{CredentialsPage-D_2T6vSb.js → CredentialsPage-Axdci1z-.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-D_2T6vSb.js.map → CredentialsPage-Axdci1z-.js.map} +1 -1
- package/dashboard/dist/assets/{CronLabel-DBmKrLvL.js → CronLabel-BjZ_wZA8.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-DBmKrLvL.js.map → CronLabel-BjZ_wZA8.js.map} +1 -1
- package/dashboard/dist/assets/CustomDurationPicker-CkUCMUfk.js +2 -0
- package/dashboard/dist/assets/CustomDurationPicker-CkUCMUfk.js.map +1 -0
- package/dashboard/dist/assets/{DropZone-BrnAkQxF.js → DropZone-_tmC3jEe.js} +2 -2
- package/dashboard/dist/assets/{DropZone-BrnAkQxF.js.map → DropZone-_tmC3jEe.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-C0LbM8o2.js → ElapsedCell-BE_CN5sP.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-C0LbM8o2.js.map → ElapsedCell-BE_CN5sP.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationListSchemaPage-CkEJnFKd.js → EscalationListSchemaPage-CgcVIiYR.js} +3 -3
- package/dashboard/dist/assets/{EscalationListSchemaPage-CkEJnFKd.js.map → EscalationListSchemaPage-CgcVIiYR.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationSchemaPage-CnlwGAIE.js → EscalationSchemaPage-BaAn1Hcr.js} +3 -3
- package/dashboard/dist/assets/{EscalationSchemaPage-CnlwGAIE.js.map → EscalationSchemaPage-BaAn1Hcr.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-DFM-f7do.js → EscalationsOverview-Dbq7tKzr.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-DFM-f7do.js.map → EscalationsOverview-Dbq7tKzr.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-Q3iICRf_.js → EventTable-0RUK9jqt.js} +2 -2
- package/dashboard/dist/assets/{EventTable-Q3iICRf_.js.map → EventTable-0RUK9jqt.js.map} +1 -1
- package/dashboard/dist/assets/{FilterBar-B0taDH7I.js → FilterBar-B_dy2Jhj.js} +2 -2
- package/dashboard/dist/assets/{FilterBar-B0taDH7I.js.map → FilterBar-B_dy2Jhj.js.map} +1 -1
- package/dashboard/dist/assets/{GraphInvokePage-B_P3pJeA.js → GraphInvokePage-CvLYp1nL.js} +2 -2
- package/dashboard/dist/assets/{GraphInvokePage-B_P3pJeA.js.map → GraphInvokePage-CvLYp1nL.js.map} +1 -1
- package/dashboard/dist/assets/HomePage-B6s1ZeyA.js +2 -0
- package/dashboard/dist/assets/HomePage-B6s1ZeyA.js.map +1 -0
- package/dashboard/dist/assets/{ListToolbar-ueCQtu5C.js → ListToolbar-DVhlAKZ3.js} +2 -2
- package/dashboard/dist/assets/{ListToolbar-ueCQtu5C.js.map → ListToolbar-DVhlAKZ3.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-DMaRUXnA.js → McpOverview-Ca8cpc8g.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-DMaRUXnA.js.map → McpOverview-Ca8cpc8g.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryDetailPage-D6YSD94n.js → McpQueryDetailPage-D0r2lyZg.js} +2 -2
- package/dashboard/dist/assets/{McpQueryDetailPage-D6YSD94n.js.map → McpQueryDetailPage-D0r2lyZg.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryPage-CNGNB59o.js → McpQueryPage-DPP6BB3d.js} +2 -2
- package/dashboard/dist/assets/{McpQueryPage-CNGNB59o.js.map → McpQueryPage-DPP6BB3d.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunDetailPage-CJ9hDTNs.js → McpRunDetailPage-C76mfUtG.js} +2 -2
- package/dashboard/dist/assets/{McpRunDetailPage-CJ9hDTNs.js.map → McpRunDetailPage-C76mfUtG.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunsPage-_UaoIwzX.js → McpRunsPage-B43BqEyw.js} +2 -2
- package/dashboard/dist/assets/{McpRunsPage-_UaoIwzX.js.map → McpRunsPage-B43BqEyw.js.map} +1 -1
- package/dashboard/dist/assets/{NamespacePill-DQGzN0Ph.js → NamespacePill-B5gHotsd.js} +2 -2
- package/dashboard/dist/assets/{NamespacePill-DQGzN0Ph.js.map → NamespacePill-B5gHotsd.js.map} +1 -1
- package/dashboard/dist/assets/OperationsPage-DbHzQCuE.js +2 -0
- package/dashboard/dist/assets/OperationsPage-DbHzQCuE.js.map +1 -0
- package/dashboard/dist/assets/OperatorDashboard-B70nS_Ah.js +2 -0
- package/dashboard/dist/assets/OperatorDashboard-B70nS_Ah.js.map +1 -0
- package/dashboard/dist/assets/{PageHeader-DlcE3U5L.js → PageHeader-DrbNMGxm.js} +2 -2
- package/dashboard/dist/assets/{PageHeader-DlcE3U5L.js.map → PageHeader-DrbNMGxm.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeaderWithStats-BMhnR3-9.js → PageHeaderWithStats-SbQkaQLG.js} +2 -2
- package/dashboard/dist/assets/{PageHeaderWithStats-BMhnR3-9.js.map → PageHeaderWithStats-SbQkaQLG.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessDetailPage-CxJ5BSDk.js → ProcessDetailPage-eLLUCWFf.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-CxJ5BSDk.js.map → ProcessDetailPage-eLLUCWFf.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessesListPage-GQMOo5Wo.js → ProcessesListPage-Di0n8TR4.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-GQMOo5Wo.js.map → ProcessesListPage-Di0n8TR4.js.map} +1 -1
- package/dashboard/dist/assets/{RoleDetailPage-Bh5qdI0w.js → RoleDetailPage-Dhn9zU5l.js} +3 -3
- package/dashboard/dist/assets/{RoleDetailPage-Bh5qdI0w.js.map → RoleDetailPage-Dhn9zU5l.js.map} +1 -1
- package/dashboard/dist/assets/{RolePill-dzo14hB_.js → RolePill-Cz-AAWqA.js} +2 -2
- package/dashboard/dist/assets/{RolePill-dzo14hB_.js.map → RolePill-Cz-AAWqA.js.map} +1 -1
- package/dashboard/dist/assets/{RolesPage-BIg3_Em6.js → RolesPage-BnAwjUiG.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-BIg3_Em6.js.map → RolesPage-BnAwjUiG.js.map} +1 -1
- package/dashboard/dist/assets/{RunAsSelector-DQp_keSD.js → RunAsSelector-DFv0VNVZ.js} +2 -2
- package/dashboard/dist/assets/{RunAsSelector-DQp_keSD.js.map → RunAsSelector-DFv0VNVZ.js.map} +1 -1
- package/dashboard/dist/assets/{StickyPagination-qLaLa33X.js → StickyPagination-D5zxe_l9.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-qLaLa33X.js.map → StickyPagination-D5zxe_l9.js.map} +1 -1
- package/dashboard/dist/assets/{StreamMessageDetail-Bi37x95H.js → StreamMessageDetail-BmBfNSEr.js} +2 -2
- package/dashboard/dist/assets/{StreamMessageDetail-Bi37x95H.js.map → StreamMessageDetail-BmBfNSEr.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-BdNhoiW8.js → SwimlaneTimeline-CA0TKDIi.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-BdNhoiW8.js.map → SwimlaneTimeline-CA0TKDIi.js.map} +1 -1
- package/dashboard/dist/assets/{TagInput-cyhTZTwe.js → TagInput-Bf9dZSG6.js} +2 -2
- package/dashboard/dist/assets/{TagInput-cyhTZTwe.js.map → TagInput-Bf9dZSG6.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-ngdXRgQp.js → TaskDetailPage-C15nADUW.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-ngdXRgQp.js.map → TaskDetailPage-C15nADUW.js.map} +1 -1
- package/dashboard/dist/assets/{TaskQueuePill-_zIpG4bG.js → TaskQueuePill-DfiBYQy2.js} +2 -2
- package/dashboard/dist/assets/{TaskQueuePill-_zIpG4bG.js.map → TaskQueuePill-DfiBYQy2.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-BIE7nrdE.js → TasksListPage-DQdAayqc.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-BIE7nrdE.js.map → TasksListPage-DQdAayqc.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-C6FZSNZp.js → TimeAgo-CvslqTB7.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-C6FZSNZp.js.map → TimeAgo-CvslqTB7.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-DI5zPUgV.js → TimestampCell-BZCQQONl.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-DI5zPUgV.js.map → TimestampCell-BZCQQONl.js.map} +1 -1
- package/dashboard/dist/assets/{ToolPill-CKHYG6eV.js → ToolPill-gA4sXukc.js} +2 -2
- package/dashboard/dist/assets/{ToolPill-CKHYG6eV.js.map → ToolPill-gA4sXukc.js.map} +1 -1
- package/dashboard/dist/assets/{ToolTestPanel-Dli94RPI.js → ToolTestPanel-BgLVc6R5.js} +2 -2
- package/dashboard/dist/assets/{ToolTestPanel-Dli94RPI.js.map → ToolTestPanel-BgLVc6R5.js.map} +1 -1
- package/dashboard/dist/assets/{TopicDetailPage-vPtXb7gD.js → TopicDetailPage-9A0aPb4t.js} +2 -2
- package/dashboard/dist/assets/{TopicDetailPage-vPtXb7gD.js.map → TopicDetailPage-9A0aPb4t.js.map} +1 -1
- package/dashboard/dist/assets/{TopicsPage-BwiEX0pU.js → TopicsPage-o0EZxKbR.js} +2 -2
- package/dashboard/dist/assets/{TopicsPage-BwiEX0pU.js.map → TopicsPage-o0EZxKbR.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-YozoXJA1.js → UserName-DKMLxBJ5.js} +2 -2
- package/dashboard/dist/assets/{UserName-YozoXJA1.js.map → UserName-DKMLxBJ5.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowExecutionPage-Bce8g08l.js → WorkflowExecutionPage-C-snB_dD.js} +2 -2
- package/dashboard/dist/assets/{WorkflowExecutionPage-Bce8g08l.js.map → WorkflowExecutionPage-C-snB_dD.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowPill-DlSVXnnj.js → WorkflowPill-Djt2AtZk.js} +2 -2
- package/dashboard/dist/assets/{WorkflowPill-DlSVXnnj.js.map → WorkflowPill-Djt2AtZk.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsDashboard-DpVAH35I.js → WorkflowsDashboard-BRQmgsLR.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsDashboard-DpVAH35I.js.map → WorkflowsDashboard-BRQmgsLR.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsOverview-Bp2pxXJO.js → WorkflowsOverview-DmMdIRHQ.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-Bp2pxXJO.js.map → WorkflowsOverview-DmMdIRHQ.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-CL_kD0mX.js → YamlWorkflowDetailPage-Bj7QkCry.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-CL_kD0mX.js.map → YamlWorkflowDetailPage-Bj7QkCry.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowsPage-Dtt3x3_T.js → YamlWorkflowsPage-BIi77mE0.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowsPage-Dtt3x3_T.js.map → YamlWorkflowsPage-BIi77mE0.js.map} +1 -1
- package/dashboard/dist/assets/{agents-xhtLVBwq.js → agents-EBIsjLCr.js} +2 -2
- package/dashboard/dist/assets/{agents-xhtLVBwq.js.map → agents-EBIsjLCr.js.map} +1 -1
- package/dashboard/dist/assets/{bots-DZ1MQUms.js → bots-BXzxybS6.js} +2 -2
- package/dashboard/dist/assets/{bots-DZ1MQUms.js.map → bots-BXzxybS6.js.map} +1 -1
- package/dashboard/dist/assets/{capabilities-B8j2h7Jn.js → capabilities-CnprG6q_.js} +2 -2
- package/dashboard/dist/assets/{capabilities-B8j2h7Jn.js.map → capabilities-CnprG6q_.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-DKijNA6h.js → controlplane-DiC0xtNq.js} +2 -2
- package/dashboard/dist/assets/{controlplane-DKijNA6h.js.map → controlplane-DiC0xtNq.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-columns-DjoZ4dDb.js → escalation-columns-D0aYpJkF.js} +2 -2
- package/dashboard/dist/assets/{escalation-columns-DjoZ4dDb.js.map → escalation-columns-D0aYpJkF.js.map} +1 -1
- package/dashboard/dist/assets/index-B2iZG_HP.css +1 -0
- package/dashboard/dist/assets/{index-BCIJE--_.js → index-B6ldRx_s.js} +2 -2
- package/dashboard/dist/assets/{index-BCIJE--_.js.map → index-B6ldRx_s.js.map} +1 -1
- package/dashboard/dist/assets/{index-DrPWIFSv.js → index-BHAjQoOy.js} +2 -2
- package/dashboard/dist/assets/{index-DrPWIFSv.js.map → index-BHAjQoOy.js.map} +1 -1
- package/dashboard/dist/assets/{index-DcDEJ6b_.js → index-BzRXMicE.js} +2 -2
- package/dashboard/dist/assets/{index-DcDEJ6b_.js.map → index-BzRXMicE.js.map} +1 -1
- package/dashboard/dist/assets/{index-CMv6YMJY.js → index-C7KY8GTF.js} +2 -2
- package/dashboard/dist/assets/{index-CMv6YMJY.js.map → index-C7KY8GTF.js.map} +1 -1
- package/dashboard/dist/assets/index-CSTwyrwu.js +63 -0
- package/dashboard/dist/assets/index-CSTwyrwu.js.map +1 -0
- package/dashboard/dist/assets/{index-DYCCUmSM.js → index-CcMIca5t.js} +2 -2
- package/dashboard/dist/assets/{index-DYCCUmSM.js.map → index-CcMIca5t.js.map} +1 -1
- package/dashboard/dist/assets/{index-BqeQGQ4K.js → index-CjBdB8Ht.js} +2 -2
- package/dashboard/dist/assets/{index-BqeQGQ4K.js.map → index-CjBdB8Ht.js.map} +1 -1
- package/dashboard/dist/assets/{index-B0ktIiOY.js → index-D-7mT0ew.js} +2 -2
- package/dashboard/dist/assets/{index-B0ktIiOY.js.map → index-D-7mT0ew.js.map} +1 -1
- package/dashboard/dist/assets/{index-Cp1jJHm1.js → index-DDA7FvqT.js} +2 -2
- package/dashboard/dist/assets/{index-Cp1jJHm1.js.map → index-DDA7FvqT.js.map} +1 -1
- package/dashboard/dist/assets/index-DVmC_UfQ.js +5 -0
- package/dashboard/dist/assets/index-DVmC_UfQ.js.map +1 -0
- package/dashboard/dist/assets/{index-ChHD9p_I.js → index-Dht0ihGT.js} +2 -2
- package/dashboard/dist/assets/{index-ChHD9p_I.js.map → index-Dht0ihGT.js.map} +1 -1
- package/dashboard/dist/assets/{index-DWDEa8jS.js → index-gBnGEubX.js} +2 -2
- package/dashboard/dist/assets/{index-DWDEa8jS.js.map → index-gBnGEubX.js.map} +1 -1
- package/dashboard/dist/assets/{index-0SzWFShg.js → index-ovFEZ9SV.js} +2 -2
- package/dashboard/dist/assets/{index-0SzWFShg.js.map → index-ovFEZ9SV.js.map} +1 -1
- package/dashboard/dist/assets/{knowledge-Dl3cOfFR.js → knowledge-W5QSKkYQ.js} +2 -2
- package/dashboard/dist/assets/{knowledge-Dl3cOfFR.js.map → knowledge-W5QSKkYQ.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-BwjeqkHn.js → mcp-n877HyOj.js} +2 -2
- package/dashboard/dist/assets/{mcp-BwjeqkHn.js.map → mcp-n877HyOj.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-C1Rlt4az.js → mcp-query-C9kV4sUm.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-C1Rlt4az.js.map → mcp-query-C9kV4sUm.js.map} +1 -1
- package/dashboard/dist/assets/{pipelines-BGIUgIH_.js → pipelines-CBR68T8R.js} +2 -2
- package/dashboard/dist/assets/{pipelines-BGIUgIH_.js.map → pipelines-CBR68T8R.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-CnC1xEaD.js → tasks-DHpWqKMk.js} +2 -2
- package/dashboard/dist/assets/{tasks-CnC1xEaD.js.map → tasks-DHpWqKMk.js.map} +1 -1
- package/dashboard/dist/assets/{topics-C6EcHi07.js → topics-CaLtyqSh.js} +2 -2
- package/dashboard/dist/assets/{topics-C6EcHi07.js.map → topics-CaLtyqSh.js.map} +1 -1
- package/dashboard/dist/assets/useEventHooks-B8p56JlB.js +2 -0
- package/dashboard/dist/assets/useEventHooks-B8p56JlB.js.map +1 -0
- package/dashboard/dist/assets/{useNamespace-Ci_oA5Tq.js → useNamespace-ej71FCvu.js} +2 -2
- package/dashboard/dist/assets/{useNamespace-Ci_oA5Tq.js.map → useNamespace-ej71FCvu.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-u8RUiMma.js → useYamlActivityEvents-DgpiFXib.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-u8RUiMma.js.map → useYamlActivityEvents-DgpiFXib.js.map} +1 -1
- package/dashboard/dist/assets/{users-DtiYvg8z.js → users-CHnjI_Ca.js} +2 -2
- package/dashboard/dist/assets/{users-DtiYvg8z.js.map → users-CHnjI_Ca.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-BE_WrH2z.js → vendor-icons-Bg6eJX4Z.js} +136 -141
- package/dashboard/dist/assets/vendor-icons-Bg6eJX4Z.js.map +1 -0
- package/dashboard/dist/assets/{workflows-BysPDsh9.js → workflows-DtnXUL0U.js} +2 -2
- package/dashboard/dist/assets/{workflows-BysPDsh9.js.map → workflows-DtnXUL0U.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-31qtxg5W.js → yaml-workflows-DDclYAID.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-31qtxg5W.js.map → yaml-workflows-DDclYAID.js.map} +1 -1
- package/dashboard/dist/index.html +3 -3
- package/docs/api/http/escalations.md +2 -2
- package/docs/api/sdk/escalations.md +2 -2
- package/docs/events.md +4 -2
- package/docs/hitl/escalation.md +2 -2
- package/docs/hitl/x-lt-embed.md +41 -12
- package/docs/hitl/x-lt-list-schema.md +26 -3
- package/package.json +1 -1
- package/dashboard/dist/assets/AgentDetailPage-D9JdkWV8.js.map +0 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-rKbrcY8Y.js.map +0 -1
- package/dashboard/dist/assets/CountdownTimer-Z8N8ccJ1.js +0 -2
- package/dashboard/dist/assets/CountdownTimer-Z8N8ccJ1.js.map +0 -1
- package/dashboard/dist/assets/CustomDurationPicker-BTmpAQOL.js +0 -2
- package/dashboard/dist/assets/CustomDurationPicker-BTmpAQOL.js.map +0 -1
- package/dashboard/dist/assets/HomePage-lu88PzQH.js +0 -2
- package/dashboard/dist/assets/HomePage-lu88PzQH.js.map +0 -1
- package/dashboard/dist/assets/OperationsPage-CTfwuWXR.js +0 -2
- package/dashboard/dist/assets/OperationsPage-CTfwuWXR.js.map +0 -1
- package/dashboard/dist/assets/OperatorDashboard-DMPJmgP_.js +0 -2
- package/dashboard/dist/assets/OperatorDashboard-DMPJmgP_.js.map +0 -1
- package/dashboard/dist/assets/index-C6UuVkz7.js +0 -63
- package/dashboard/dist/assets/index-C6UuVkz7.js.map +0 -1
- package/dashboard/dist/assets/index-Dh5Y3hq7.js +0 -5
- package/dashboard/dist/assets/index-Dh5Y3hq7.js.map +0 -1
- package/dashboard/dist/assets/index-WSGppNeK.css +0 -1
- package/dashboard/dist/assets/useEventHooks-Cyq4DiQA.js +0 -2
- package/dashboard/dist/assets/useEventHooks-Cyq4DiQA.js.map +0 -1
- package/dashboard/dist/assets/vendor-icons-BE_WrH2z.js.map +0 -1
|
@@ -362,7 +362,7 @@ Reach for native `condition(signalId, config)` when you want the leanest path; r
|
|
|
362
362
|
|
|
363
363
|
### Atomic form (recommended)
|
|
364
364
|
|
|
365
|
-
Pass an escalation config as the second argument. The escalation row is written inside the workflow's Leg1 checkpoint — one commit, crash-safe: no separate `ltCreateEscalation` activity, no enrich step. `signal_key` is set to `signalId`, so the dashboard resolve endpoint (resolve-by-id → Path 0) and `POST /escalations/resolve-by-signal-key` resume *this* job in place, and `system.escalation.{id}.created` fires automatically.
|
|
365
|
+
Pass an escalation config as the second argument. The escalation row is written inside the workflow's Leg1 checkpoint — one commit, crash-safe: no separate `ltCreateEscalation` activity, no enrich step. `signal_key` is set to `signalId`, so the dashboard resolve endpoint (resolve-by-id → Path 0) and `POST /escalations/resolve-by-signal-key` resume *this* job in place, and `system.escalation.{role}.{id}.created` fires automatically.
|
|
366
366
|
|
|
367
367
|
`conditionLT` returns `T | false | null`:
|
|
368
368
|
- `T` — the resolver's payload (normal resolution)
|
|
@@ -393,7 +393,7 @@ export async function stationWorker(envelope: LTEnvelope) {
|
|
|
393
393
|
if (decision === false) {
|
|
394
394
|
// SLA passed: the workflow resumed on the timer and the engine transitioned
|
|
395
395
|
// the row pending → expired atomically. A late resolve returns
|
|
396
|
-
// already-expired, and system.escalation.{id}.expired fired for dashboards.
|
|
396
|
+
// already-expired, and system.escalation.{role}.{id}.expired fired for dashboards.
|
|
397
397
|
return { type: 'return' as const, data: { autoRejected: 'sla' } };
|
|
398
398
|
}
|
|
399
399
|
if (decision === null) {
|
package/docs/events.md
CHANGED
|
@@ -71,13 +71,15 @@ System families declare the fields they populate. Which fields exist is a functi
|
|
|
71
71
|
|---|---|---|
|
|
72
72
|
| workflow | `system.workflow.{id}.{started\|completed\|failed}` | `workflowId`, `workflowName`, `taskQueue`, `status` |
|
|
73
73
|
| task | `system.task.{taskId}.{created\|started\|completed\|escalated\|failed}` | + `taskId` |
|
|
74
|
-
| escalation | `system.escalation.{id}.{created\|resolved\|claimed\|released}` | `escalationId` (+ workflow context), `status` |
|
|
74
|
+
| escalation | `system.escalation.{role}.{id}.{created\|resolved\|claimed\|released\|cancelled\|reassigned\|expired}` | `escalationId`, `role` (+ workflow context), `status` |
|
|
75
75
|
| activity | `system.activity.{wfId}.{activity}.{started\|completed\|failed}` | `activityName` (+ workflow context) |
|
|
76
76
|
| milestone | `system.milestone.{wfId}` | `milestones` (+ workflow context) |
|
|
77
77
|
| agent | `system.agent.{name}.{started\|completed\|failed\|…}` | `workflowId`=agentId, `workflowName`=agentName |
|
|
78
78
|
| knowledge / file | `system.knowledge.{domain}.*` / `system.file.*` | none — payload only |
|
|
79
79
|
|
|
80
|
-
`status` is a **per-family vocabulary**, not one global enum: workflow `started|in_progress|running|completed|failed`; task `created|in_progress|completed|needs_intervention|failed`; escalation `pending|claimed|released|resolved|cancelled`.
|
|
80
|
+
`status` is a **per-family vocabulary**, not one global enum: workflow `started|in_progress|running|completed|failed`; task `created|in_progress|completed|needs_intervention|failed`; escalation `pending|claimed|released|resolved|cancelled|expired`.
|
|
81
|
+
|
|
82
|
+
Escalation subjects carry the **role** (the queue) as the organizing token. Subscribe to one queue (`system.escalation.{role}.>`), one verb across queues (`system.escalation.*.*.created`), or one item across role hops (`system.escalation.*.{id}.>`). The role token is sanitized to subject-safe characters (`[A-Za-z0-9_-]`); a `reassigned` event publishes under **both** the departing and arriving role so either queue's subscribers observe the move.
|
|
81
83
|
|
|
82
84
|
Consumers (adapters, the agent trigger registry, input_mapping) type against the broad **`LTEvent`** — the base plus every extension as **optional** — since they can't assume any extension is present. Producers (`lib/events/publish.ts`) construct the precise `LT*Event` family types, all assignable to `LTEvent`.
|
|
83
85
|
|
package/docs/hitl/escalation.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
## `conditionLT` — Atomic Pattern
|
|
4
4
|
|
|
5
|
-
Pass an escalation config to `conditionLT`. The escalation row, its metadata, and the resume timer all commit inside the workflow's Leg1 checkpoint — one write, crash-safe. The `signal_key` on the row is the resume key: the dashboard resolve endpoint and `POST /api/escalations/resolve-by-signal-key` both resume this job in place, and the `system.escalation.{id}.created` event fires automatically.
|
|
5
|
+
Pass an escalation config to `conditionLT`. The escalation row, its metadata, and the resume timer all commit inside the workflow's Leg1 checkpoint — one write, crash-safe. The `signal_key` on the row is the resume key: the dashboard resolve endpoint and `POST /api/escalations/resolve-by-signal-key` both resume this job in place, and the `system.escalation.{role}.{id}.created` event fires automatically.
|
|
6
6
|
|
|
7
7
|
```typescript
|
|
8
8
|
import { conditionLT } from '@hotmeshio/long-tail';
|
|
@@ -63,7 +63,7 @@ import type { EscalationResolution } from '@hotmeshio/long-tail';
|
|
|
63
63
|
const decision = await conditionLT<{
|
|
64
64
|
approved: boolean;
|
|
65
65
|
$resolution?: EscalationResolution;
|
|
66
|
-
}>(signalId, { role: '
|
|
66
|
+
}>(signalId, { role: 'order-reviewer', metadata: { orderId } });
|
|
67
67
|
|
|
68
68
|
if (decision && decision.$resolution) {
|
|
69
69
|
const { escalationId, resolvedBy, resolvedByEmail } = decision.$resolution;
|
package/docs/hitl/x-lt-embed.md
CHANGED
|
@@ -143,13 +143,32 @@ A structured query object. String values inside `facets` support `{{domain.path}
|
|
|
143
143
|
| Field | Type | Description |
|
|
144
144
|
|-------|------|-------------|
|
|
145
145
|
| `role` | `string` | Role queue to query |
|
|
146
|
-
| `status` | `string` | `"pending"
|
|
146
|
+
| `status` | `string` | `"pending"` (default), `"resolved"`, `"cancelled"`, `"expired"` |
|
|
147
147
|
| `facets` | `Record<string, string>` | Metadata containment filter; string values support `{{domain.path}}` tokens |
|
|
148
|
-
| `
|
|
148
|
+
| `assigned` | `"me"` \| `"any"` | Ownership scope — see below |
|
|
149
149
|
| `limit` | `number` | Max rows to show (default: 5) |
|
|
150
|
+
| `available` | `boolean` | Legacy availability flag; superseded by `assigned` |
|
|
150
151
|
|
|
151
152
|
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
|
|
|
154
|
+
### Ownership scope (`assigned`)
|
|
155
|
+
|
|
156
|
+
Ownership is one more dimension of the same faceted query language — "claimed" is the implied status the API manages (pending, held, claim window live), not a separate list:
|
|
157
|
+
|
|
158
|
+
- `"me"` — rows claimed by the **viewing user**. The batch case: an earlier step assigned a set of order items to whoever claimed the batch; the follow-up form shows that person their own items with working inline actions.
|
|
159
|
+
- `"any"` — all matching rows regardless of claim state.
|
|
160
|
+
- omitted — available rows only (unclaimed, or claim window lapsed).
|
|
161
|
+
|
|
162
|
+
The scope resolves through ONE shared mapping consumed by the escalation-list widget, its `x-lt-actions`, and `x-lt-submit-guard` — a guard and an embed declaring the same query always agree on count and rows. Inline actions on claimed-to-me rows fire the standard resolve endpoint as the claim holder; RBAC and `enforce_schema` apply unchanged.
|
|
163
|
+
|
|
164
|
+
```json
|
|
165
|
+
"x-lt-query": {
|
|
166
|
+
"role": "order-items",
|
|
167
|
+
"facets": { "orderId": "{{metadata.orderId}}" },
|
|
168
|
+
"assigned": "me"
|
|
169
|
+
}
|
|
170
|
+
```
|
|
171
|
+
|
|
153
172
|
### `x-lt-columns` (optional)
|
|
154
173
|
|
|
155
174
|
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).
|
|
@@ -167,13 +186,13 @@ Inline row actions: each row gains a button that fires a canned resolve against
|
|
|
167
186
|
```json
|
|
168
187
|
"x-lt-actions": [
|
|
169
188
|
{
|
|
170
|
-
"label": "
|
|
189
|
+
"label": "Picked ✓",
|
|
171
190
|
"resolverPayload": {
|
|
172
191
|
"approved": true,
|
|
173
|
-
"checks": { "
|
|
192
|
+
"checks": { "picked": true, "scanned": true },
|
|
174
193
|
"orderId": "{{metadata.orderId}}"
|
|
175
194
|
},
|
|
176
|
-
"confirm": "
|
|
195
|
+
"confirm": "Mark {{metadata.sku}} picked for {{metadata.orderId}}?"
|
|
177
196
|
}
|
|
178
197
|
]
|
|
179
198
|
```
|
|
@@ -186,7 +205,7 @@ Inline row actions: each row gains a button that fires a canned resolve against
|
|
|
186
205
|
|
|
187
206
|
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
207
|
|
|
189
|
-
Declare one action for the happy path and leave the exception path to the form. A
|
|
208
|
+
Declare one action for the happy path and leave the exception path to the form. A batch of N sibling items collapses from N navigations to N clicks on one page.
|
|
190
209
|
|
|
191
210
|
### Empty and loading states
|
|
192
211
|
|
|
@@ -203,12 +222,12 @@ A top-level form_schema token (a peer of `x-lt-help`) that keeps the resolve but
|
|
|
203
222
|
{
|
|
204
223
|
"x-lt-submit-guard": {
|
|
205
224
|
"query": {
|
|
206
|
-
"role": "
|
|
207
|
-
"
|
|
208
|
-
"
|
|
225
|
+
"role": "order-items",
|
|
226
|
+
"facets": { "orderId": "{{metadata.orderId}}" },
|
|
227
|
+
"assigned": "me"
|
|
209
228
|
},
|
|
210
229
|
"mustBeEmpty": true,
|
|
211
|
-
"message": "{{count}}
|
|
230
|
+
"message": "{{count}} item(s) still pending — pick them before closing the order."
|
|
212
231
|
},
|
|
213
232
|
"type": "object",
|
|
214
233
|
"properties": { ... }
|
|
@@ -217,10 +236,12 @@ A top-level form_schema token (a peer of `x-lt-help`) that keeps the resolve but
|
|
|
217
236
|
|
|
218
237
|
| Field | Type | Description |
|
|
219
238
|
|-------|------|-------------|
|
|
220
|
-
| `query` | `object` | Same shape as `x-lt-query
|
|
239
|
+
| `query` | `object` | Same shape as `x-lt-query` — including the `assigned` ownership scope; facet string values interpolate against the host escalation's context |
|
|
221
240
|
| `mustBeEmpty` | `boolean` | The gate condition (default `true`) |
|
|
222
241
|
| `message` | `string` | Shown beside the disabled submit; `{{count}}` carries the live row count, `{{domain.path}}` tokens also interpolate |
|
|
223
242
|
|
|
243
|
+
The guard and an escalation-list embed declaring the same query resolve through one shared mapping — the count and the visible rows always agree, whatever the scope.
|
|
244
|
+
|
|
224
245
|
Pair it with an `escalation-list` embed on the same query so the operator sees exactly which rows are holding the gate.
|
|
225
246
|
|
|
226
247
|
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.
|
|
@@ -270,4 +291,12 @@ The link widget generates a client-side URL; the queue it points to applies its
|
|
|
270
291
|
|
|
271
292
|
## Example workflow
|
|
272
293
|
|
|
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
|
|
294
|
+
The `examples/workflows/related-escalations/` workflow demonstrates all three widgets in a realistic two-stage review scenario, followed by a claimed walk. See `forms.ts` and `forms-walk.ts` in that directory for the complete form schemas.
|
|
295
|
+
|
|
296
|
+
The claimed walk (stage 3, after the manager approves) is the ownership-scope reference:
|
|
297
|
+
|
|
298
|
+
1. Three plate rows park in `rel-plate`, each faceted with the walk's `originId`.
|
|
299
|
+
2. A walk-claim row parks in `rel-walker`. Resolving it IS the "start walk" button — the resolver's identity arrives on the workflow via `$resolution`, and one atomic query-form bulk assign claims every plate for that person.
|
|
300
|
+
3. The closeout row parks in `rel-closer`. Its form declares the walk query ONCE — `{ role: "rel-plate", facets: { originId: "{{metadata.originId}}" }, assigned: "me" }` — consumed by the embedded list, its `Bagged ✓` inline actions, and the submit guard. The walker bags each plate in place; the count beside the locked submit falls with each click; the last plate unlocks the submit.
|
|
301
|
+
|
|
302
|
+
The whole journey is two form submits and N inline clicks, with zero navigation.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# List Schema (`x-lt-list-schema`)
|
|
2
2
|
|
|
3
|
-
The form schema formats one escalation on the detail page. A role can also own a `list_schema` that formats its whole list page — the list-page analog of the resolve form. It is opt-in and applies only when the list is scoped to exactly one role (`/escalations/available?role=<role>`). Absent, the list renders the standard engineer table; present, a rich role-authored view renders with a "Table view" toggle one click away.
|
|
3
|
+
The form schema formats one escalation on the detail page. A role can also own a `list_schema` that formats its whole list page — the list-page analog of the resolve form. It is opt-in and applies only when the list is scoped to exactly one role (`/escalations/available?role=<role>`, and the personal inbox at `/escalations/queue?role=<role>`). Absent, the list renders the standard engineer table; present, a rich role-authored view renders with a "Table view" toggle one click away.
|
|
4
4
|
|
|
5
5
|
The list schema is versioned independently of the form schema — a list edit never bumps the form version. Edit it at `/admin/roles/:role/list-schema`. The list always renders the latest version.
|
|
6
6
|
|
|
@@ -16,14 +16,31 @@ Every string is a markdown/text template run through the same `{{domain.path}}`
|
|
|
16
16
|
| `x-lt-help` | schema | Optional markdown header, interpolated with the active row |
|
|
17
17
|
| `x-lt-active` | schema | The live item card: `{ title, subtitle?, body?, fields?: [{ label, value }] }` |
|
|
18
18
|
| `x-lt-history` | schema | History column: `{ row: { title, subtitle?, meta? }, limit?, status? }` |
|
|
19
|
-
| `x-lt-columns` | schema | Column definitions for `facet-table` layout: `[{ label, value, format? }]` |
|
|
19
|
+
| `x-lt-columns` | schema | Column definitions for `facet-table` layout: `[{ label, value, format?, priority? }]` |
|
|
20
20
|
| `x-lt-group-by` | schema | `facet-board`: the `"domain.path"` whose value identifies each entity |
|
|
21
21
|
| `x-lt-card` | schema | `facet-board`: the per-entity card — `{ title, state?, fields?: [{ label, value, format? }] }` |
|
|
22
|
+
| `x-lt-row-action` | schema | The per-row action button: `{ action?, label?, durationMinutes? }` — see below |
|
|
22
23
|
|
|
23
24
|
`format: "age"` on a `facet-table` column or `facet-board` field renders a timestamp as a compact age (`12m`, `3h`, `2d`) with the absolute time as its tooltip, repainted each minute — aging interim states are scannable at a glance.
|
|
24
25
|
|
|
25
26
|
The **active** item is the first non-terminal escalation. The **history** column is lazy-loaded — a "Load full history" link fetches resolved items on demand (`status` defaults to `"resolved"`, `limit` to 25). Unknown or absent `x-lt-layout` is a safe no-op that falls back to the table.
|
|
26
27
|
|
|
28
|
+
### Row action (`x-lt-row-action`)
|
|
29
|
+
|
|
30
|
+
Every layout carries a persistent action button — the active card's CTA, a trailing button on each `facet-table` row, a footer button on each `facet-board` card. The template sets what it does:
|
|
31
|
+
|
|
32
|
+
```jsonc
|
|
33
|
+
"x-lt-row-action": {
|
|
34
|
+
"action": "claim", // "claim" | "view" — default "claim"
|
|
35
|
+
"label": "Service", // button text; defaults "Claim" / "View"
|
|
36
|
+
"durationMinutes": 60 // claim hold time; default 30
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
`claim` is one click: the row is claimed for the template's duration and the detail page opens already claimed — the fast path for working a queue. The button appears only on claimable rows (pending, no live claim window), and a rejected claim (someone else won the race) surfaces its message inline. `view` opens the detail page — for read-only templates where claiming from the list is wrong. Row and card clicks continue to navigate; the button is the deliberate gesture.
|
|
41
|
+
|
|
42
|
+
On My Escalations (`/escalations/queue`) every row is already held by the viewer, so a `claim` template renders as a View action there: the button opens the detail page with the default "View" label. Authored `view` actions keep their label.
|
|
43
|
+
|
|
27
44
|
---
|
|
28
45
|
|
|
29
46
|
## Layouts
|
|
@@ -76,7 +93,13 @@ Use when the queue contains many concurrent rows and the role's context is best
|
|
|
76
93
|
}
|
|
77
94
|
```
|
|
78
95
|
|
|
79
|
-
A status dot precedes the first column automatically. ISO datetime values render as a readable relative date with a full-timestamp tooltip. Missing token values render as an em dash. Clicking any row navigates to the detail page. `x-lt-help` and `x-lt-active` are ignored in this layout.
|
|
96
|
+
A status dot precedes the first column automatically. ISO datetime values render as a readable relative date with a full-timestamp tooltip. Missing token values render as an em dash. Clicking any row navigates to the detail page. The table stands alone — `x-lt-help` and `x-lt-active` are ignored in this layout; totals live in the pagination bar.
|
|
97
|
+
|
|
98
|
+
The table renders through the same engine as the platform's built-in tables: padded cells, a sticky header, and a card fold at narrow widths — **a table never scrolls horizontally, it folds**. Below the fold threshold each row becomes a console card: `priority: 1` columns form the card's title line, `priority: 2` columns fold into label/value pairs, and `priority: 3` columns are dropped. Undeclared, the first column is the identity and the rest fold — declare priorities when the author knows which columns matter at a glance.
|
|
99
|
+
|
|
100
|
+
The seeded `print` role (ortho pipeline) is the reference example for this layout, including fold priorities.
|
|
101
|
+
|
|
102
|
+
A column whose `value` is a pure metadata binding (`{{metadata.key}}`) carries the platform's filter/search pair on each cell — the same affordance the engineer table's metadata cells offer. The filter icon opens this role's queue narrowed to that value; the search icon spans every role; ⇧ click merges the value into the live filter set.
|
|
80
103
|
|
|
81
104
|
### `"facet-board"` — entity board
|
|
82
105
|
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AgentDetailPage-D9JdkWV8.js","sources":["../../src/pages/agents/AgentDetailPage.tsx"],"sourcesContent":["import { useState, useCallback } from 'react';\nimport { useParams, useNavigate } from 'react-router-dom';\nimport {\n Bot, Play, Pause, Trash2, ArrowRight, ArrowUpRight, Pencil, BookOpen,\n Radio, Clock, Brain, Compass,\n} from 'lucide-react';\nimport { useAgent, useUpdateAgent, useDeleteAgent } from '../../api/agents';\nimport { useSettings } from '../../api/settings';\nimport { getAiOverride } from '../../lib/view-as';\nimport { useAgentSubscriptions } from '../../api/agent-subscriptions';\nimport { useAgentEvents } from '../../hooks/useEventHooks';\nimport { useEventSubscription } from '../../hooks/useEventContext';\nimport { NATS_SUBJECT_PREFIX } from '../../lib/nats/config';\nimport { EventTopicPill } from '../../components/common/display/EventTopicPill';\nimport { CronLabel } from '../../components/common/display/CronLabel';\nimport { WorkflowPill } from '../../components/common/display/WorkflowPill';\n\n// ── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction formatTime(iso: string): string {\n return new Date(iso).toLocaleTimeString('en-US', { hour12: false, hour: '2-digit', minute: '2-digit', second: '2-digit' });\n}\n\nfunction SectionHeader({ icon: Icon, color, children, actions }: { icon: React.ElementType; color: string; children: React.ReactNode; actions?: React.ReactNode }) {\n return (\n <div className=\"flex items-center justify-between mb-3 pb-2 border-b border-surface-border\">\n <div className=\"flex items-center gap-2\">\n <Icon className={`w-4 h-4 ${color}`} strokeWidth={1.5} />\n <h2 className=\"section-h2\">{children}</h2>\n </div>\n {actions}\n </div>\n );\n}\n\nfunction EmptyHint({ text }: { text: string }) {\n return <p className=\"text-2xs text-text-quaternary py-2\">{text}</p>;\n}\n\n/** Per-section deeplink — jumps straight to that section instead of Edit → navigate. */\nfunction SectionViewLink({ to, label }: { to: string; label: string }) {\n const navigate = useNavigate();\n return (\n <button\n onClick={() => navigate(to)}\n className=\"text-text-quaternary hover:text-accent transition-colors\"\n title={`View ${label}`}\n aria-label={`View ${label}`}\n >\n <ArrowUpRight className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n );\n}\n\n// ── Live feed ───────────────────────────────────────────────────────────────\n\ninterface FeedEvent { id: number; type: string; timestamp: string; label: string; }\nlet feedCounter = 0;\n\nfunction useAgentFeed(agentName?: string) {\n const [events, setEvents] = useState<FeedEvent[]>([]);\n const [pulse, setPulse] = useState(false);\n const handler = useCallback((event: any) => {\n if (event.type?.startsWith('mesh.')) return;\n const label = event.activityName || event.data?.domain || event.workflowId?.slice(0, 16) || '';\n setEvents((prev) => [{ id: ++feedCounter, type: event.type, timestamp: event.timestamp, label }, ...prev].slice(0, 10));\n setPulse(true);\n setTimeout(() => setPulse(false), 2000);\n }, []);\n useEventSubscription(\n agentName ? `${NATS_SUBJECT_PREFIX}.system.agent.${agentName}.>` : '',\n handler,\n );\n return { events, pulse };\n}\n\n// ── Page ─────────────────────────────────────────────────────────────────────\n\nexport function AgentDetailPage() {\n const { id } = useParams<{ id: string }>();\n const navigate = useNavigate();\n const { data: settings } = useSettings();\n const aiOverride = getAiOverride();\n const aiEnabled = aiOverride !== null ? aiOverride : !!settings?.ai?.enabled;\n const label = aiEnabled ? 'Agent' : 'Automation';\n const { data: agent, isLoading } = useAgent(id ?? null);\n const { data: subsData } = useAgentSubscriptions(id ?? null);\n const updateMutation = useUpdateAgent();\n const deleteMutation = useDeleteAgent();\n const { events: liveEvents, pulse } = useAgentFeed(id);\n useAgentEvents();\n\n if (isLoading) {\n return <div className=\"animate-pulse space-y-4\"><div className=\"h-8 bg-surface-sunken rounded w-48\" /><div className=\"h-40 bg-surface-sunken rounded\" /></div>;\n }\n\n if (!agent) {\n return (\n <div className=\"flex flex-col items-center justify-center py-20 text-center\">\n <Bot className=\"w-12 h-12 text-text-quaternary mb-4\" strokeWidth={1} />\n <h2 className=\"heading-3 mb-2\">{label} not found</h2>\n <button onClick={() => navigate('/agents')} className=\"text-sm text-accent hover:text-accent-hover transition-colors\">Back to {label.toLowerCase()}s</button>\n </div>\n );\n }\n\n const statusDot = agent.status === 'active' ? 'bg-status-success' : agent.status === 'paused' ? 'bg-status-warning' : agent.status === 'error' ? 'bg-status-error' : 'bg-surface-border';\n const subs = subsData?.subscriptions ?? [];\n const statusLabel = agent.status === 'active' ? 'Active' : agent.status === 'paused' ? 'Paused' : agent.status === 'error' ? 'Error' : 'Inactive';\n const schedules = (agent.behaviors as any)?.schedules as any[] | undefined;\n const legacyCron = agent.behaviors?.cron;\n const schedCount = schedules?.length || (legacyCron ? 1 : 0);\n\n const handlePause = () => {\n const msg = [\n `Pause \"${agent.id}\"?`,\n '',\n 'This will:',\n subs.length > 0 ? `• Stop ${subs.length} event subscription${subs.length !== 1 ? 's' : ''}` : null,\n schedCount > 0 ? `• Stop ${schedCount} schedule${schedCount !== 1 ? 's' : ''}` : null,\n '',\n 'Knowledge and workflow history are preserved. You can reactivate anytime.',\n ].filter(Boolean).join('\\n');\n if (confirm(msg)) updateMutation.mutate({ id: agent.id, status: 'paused' as any });\n };\n\n const handleDelete = () => {\n const msg = [\n `Delete \"${agent.id}\"?`,\n '',\n 'This permanently removes:',\n '• The agent configuration',\n subs.length > 0 ? `• ${subs.length} event subscription${subs.length !== 1 ? 's' : ''}` : null,\n schedCount > 0 ? `• ${schedCount} schedule${schedCount !== 1 ? 's' : ''}` : null,\n '',\n 'Knowledge entries and workflow history are preserved.',\n ].filter(Boolean).join('\\n');\n if (confirm(msg)) deleteMutation.mutate(agent.id, { onSuccess: () => navigate('/agents') });\n };\n\n return (\n <div>\n {/* ── Hero ──────────────────────────────────────────────────────────── */}\n <div className=\"flex items-start justify-between mb-3\">\n <div className=\"flex items-center gap-2\">\n <h1 className=\"heading-1\">{label}: {agent.id}</h1>\n <button onClick={() => { window.location.hash = '#docs:agents.md'; }} className=\"text-text-quaternary hover:text-accent transition-colors mt-1\" title=\"Docs\">\n <BookOpen className=\"w-4 h-4\" strokeWidth={1.5} />\n </button>\n </div>\n <div className=\"flex items-center gap-3\">\n <div className=\"flex items-center gap-1.5 mr-2\">\n <span className={`w-2 h-2 rounded-full dot-ring ${statusDot}`} />\n <span className=\"text-xs text-text-secondary capitalize\">{statusLabel}</span>\n </div>\n <button onClick={() => navigate(`/agents/${agent.id}/edit`)} className=\"flex items-center gap-1.5 px-4 py-1.5 text-xs rounded-md bg-accent text-text-inverse hover:bg-accent-hover transition-colors\">\n <Pencil className=\"w-3 h-3\" /> Edit\n </button>\n {agent.status !== 'active' && (\n <button onClick={() => updateMutation.mutate({ id: agent.id, status: 'active' as any })} className=\"flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md text-status-success hover:bg-status-success/10 transition-colors\">\n <Play className=\"w-3 h-3\" /> Activate\n </button>\n )}\n {agent.status === 'active' && (\n <button onClick={handlePause} className=\"flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md text-text-tertiary hover:text-text-primary hover:bg-surface-hover transition-colors\">\n <Pause className=\"w-3 h-3\" /> Pause\n </button>\n )}\n <button onClick={handleDelete} className=\"flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md text-status-error/60 hover:text-status-error hover:bg-status-error/10 transition-colors\">\n <Trash2 className=\"w-3 h-3\" /> Delete\n </button>\n </div>\n </div>\n\n {/* Description callout */}\n {agent.description && (\n <div className=\"border-l-2 border-accent/30 pl-4 py-1 mb-10\">\n <p className=\"text-sm text-text-secondary italic leading-relaxed\">{agent.description}</p>\n </div>\n )}\n\n {/* Motivation */}\n {(agent.goals || agent.rules) && (\n <div className=\"mb-10\">\n <SectionHeader\n icon={Compass}\n color=\"text-accent\"\n actions={<SectionViewLink to={`/agents/${agent.id}/edit?step=2`} label=\"Motivation\" />}\n >Motivation</SectionHeader>\n <div className=\"grid grid-cols-2 gap-x-14 bg-surface-sunken/20 rounded-lg px-5 py-4\">\n {agent.goals && (\n <div>\n <p className=\"text-2xs text-text-quaternary uppercase tracking-widest mb-1.5\">Goals</p>\n <p className=\"text-sm text-text-primary leading-relaxed\">{agent.goals}</p>\n </div>\n )}\n {agent.rules && (\n <div>\n <p className=\"text-2xs text-text-quaternary uppercase tracking-widest mb-1.5\">Rules</p>\n <p className=\"text-sm text-text-primary leading-relaxed\">{agent.rules}</p>\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* ── 3-column grid ─────────────────────────────────────────────────── */}\n <div className=\"grid grid-cols-1 @wall:grid-cols-3 gap-x-14 gap-y-10\">\n\n {/* Col 1: Subscriptions */}\n <div>\n <SectionHeader\n icon={Radio}\n color=\"text-accent\"\n actions={<SectionViewLink to={`/agents/${agent.id}/edit?step=4`} label=\"Subscriptions\" />}\n >\n Subscriptions ({subs.length})\n </SectionHeader>\n {subs.length === 0 ? (\n <EmptyHint text=\"No event subscriptions\" />\n ) : (\n <div className=\"divide-y divide-surface-border/30\">\n {subs.map((sub: any) => (\n <div key={sub.id} className=\"flex items-center py-2\">\n <div className=\"flex-1 min-w-0\"><EventTopicPill topic={sub.topic} /></div>\n <div className=\"flex items-center gap-1.5 shrink-0\">\n <span className=\"text-text-quaternary text-2xs\">→</span>\n <WorkflowPill\n type={sub.reaction_type === 'capability' ? sub.tool_name : sub.workflow_type || sub.reaction_type}\n variant={sub.reaction_type === 'pipeline' ? 'pipeline' : sub.reaction_type === 'capability' ? 'capability' : 'durable'}\n />\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* Col 2: Schedules */}\n <div>\n <SectionHeader\n icon={Clock}\n color=\"text-accent\"\n actions={<SectionViewLink to={`/agents/${agent.id}/edit?step=5`} label=\"Schedules\" />}\n >Schedules ({schedCount})</SectionHeader>\n {schedules?.length ? (\n <div className=\"divide-y divide-surface-border/30\">\n {schedules.map((s: any, i: number) => (\n <div key={i} className=\"flex items-center py-2\">\n <div className=\"flex-1 min-w-0\"><CronLabel cron={s.cron} /></div>\n <div className=\"flex items-center gap-1.5 shrink-0\"><span className=\"text-text-quaternary text-2xs\">→</span><WorkflowPill type={s.workflow_type || 'workflow'} /></div>\n </div>\n ))}\n </div>\n ) : legacyCron ? (\n <div className=\"flex items-center py-1\">\n <div className=\"flex-1 min-w-0\"><CronLabel cron={legacyCron} /></div>\n {agent.workflow_type && <div className=\"flex items-center gap-1.5 shrink-0\"><span className=\"text-text-quaternary text-2xs\">→</span><WorkflowPill type={agent.workflow_type} /></div>}\n </div>\n ) : (\n <EmptyHint text=\"No schedules configured\" />\n )}\n </div>\n\n {/* Col 3: Knowledge + Activity */}\n <div className=\"space-y-10\">\n <div>\n <SectionHeader\n icon={Brain}\n color=\"text-accent\"\n actions={\n <SectionViewLink\n to={agent.knowledge_domain ? `/knowledge?domain=${agent.knowledge_domain}` : `/agents/${agent.id}/edit?step=3`}\n label=\"Knowledge\"\n />\n }\n >Knowledge</SectionHeader>\n {agent.knowledge_domain ? (\n <button onClick={() => navigate(`/knowledge?domain=${agent.knowledge_domain}`)} className=\"group text-left flex items-center gap-3\">\n <span className=\"text-sm font-mono text-text-primary group-hover:text-accent transition-colors\">{agent.knowledge_domain}</span>\n <span className=\"text-2xs text-text-quaternary\">{agent.stats?.knowledge_count?.toLocaleString() ?? 0} entries</span>\n <ArrowRight className=\"w-3 h-3 text-accent opacity-0 group-hover:opacity-100 transition-opacity\" />\n </button>\n ) : (\n <EmptyHint text=\"No knowledge domain\" />\n )}\n </div>\n\n <div>\n <SectionHeader icon={Radio} color=\"text-accent\"\n actions={\n <div className=\"flex items-center gap-1.5\">\n <span className={`w-1.5 h-1.5 rounded-full dot-ring transition-colors duration-500 ${pulse ? 'bg-status-success' : 'bg-surface-border'}`} />\n <span className=\"text-2xs text-text-quaternary\">live</span>\n </div>\n }\n >\n Activity\n </SectionHeader>\n {liveEvents.length === 0 ? (\n <EmptyHint text=\"Events appear here as the agent runs\" />\n ) : (\n <div className=\"space-y-1.5\">\n {liveEvents.map((ev) => (\n <div key={ev.id}>\n <div className=\"flex items-center justify-between mb-0.5\">\n <span className=\"text-2xs text-text-primary font-mono truncate flex-1\">{ev.label || '—'}</span>\n <span className=\"text-2xs text-text-quaternary shrink-0 ml-2\">{formatTime(ev.timestamp)}</span>\n </div>\n <EventTopicPill topic={ev.type} />\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n"],"names":["formatTime","iso","SectionHeader","Icon","color","children","actions","jsxs","jsx","EmptyHint","text","SectionViewLink","to","label","navigate","useNavigate","ArrowUpRight","feedCounter","useAgentFeed","agentName","events","setEvents","useState","pulse","setPulse","handler","useCallback","event","_a","_b","_c","prev","useEventSubscription","NATS_SUBJECT_PREFIX","AgentDetailPage","id","useParams","settings","useSettings","aiOverride","getAiOverride","agent","isLoading","useAgent","subsData","useAgentSubscriptions","updateMutation","useUpdateAgent","deleteMutation","useDeleteAgent","liveEvents","useAgentEvents","Bot","statusDot","subs","statusLabel","schedules","legacyCron","schedCount","handlePause","msg","handleDelete","BookOpen","Pencil","Play","Pause","Trash2","Compass","Radio","sub","EventTopicPill","WorkflowPill","Clock","s","i","CronLabel","Brain","_e","_d","ArrowRight","ev"],"mappings":"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"}
|