@hotmeshio/long-tail 0.5.10 → 0.5.12
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/controlplane.d.ts +1 -0
- package/build/api/controlplane.js +1 -0
- package/build/api/diagnostics.d.ts +8 -1
- package/build/api/diagnostics.js +5 -1
- package/build/api/escalations/list.d.ts +2 -0
- package/build/api/escalations/list.js +2 -0
- package/build/api/settings.d.ts +3 -2
- package/build/api/settings.js +13 -2
- package/build/api/workflows/invocation.d.ts +6 -0
- package/build/api/workflows/invocation.js +6 -2
- package/build/modules/features.d.ts +19 -0
- package/build/modules/features.js +16 -0
- package/build/modules/version.d.ts +16 -0
- package/build/modules/version.js +34 -0
- package/build/routes/controlplane.js +1 -0
- package/build/routes/diagnostics.js +32 -11
- package/build/routes/escalations/list.js +2 -0
- package/build/routes/workflows/invocation.js +12 -4
- package/build/sdk/index.d.ts +2 -0
- package/build/services/controlplane/index.js +3 -2
- package/build/services/controlplane/stream-messages-sql.d.ts +4 -3
- package/build/services/controlplane/stream-messages-sql.js +12 -7
- package/build/services/controlplane/types.d.ts +2 -0
- package/build/services/diagnostics/index.d.ts +53 -7
- package/build/services/diagnostics/index.js +124 -36
- package/build/services/diagnostics/patterns.d.ts +13 -3
- package/build/services/diagnostics/patterns.js +25 -14
- package/build/services/escalation/queries.d.ts +2 -0
- package/build/services/escalation/queries.js +84 -2
- package/build/services/escalation/sql.d.ts +7 -0
- package/build/services/escalation/sql.js +50 -1
- package/build/services/task/resolve.d.ts +5 -3
- package/build/services/task/resolve.js +9 -6
- package/build/services/task/sql.d.ts +6 -1
- package/build/services/task/sql.js +7 -1
- package/build/start/adapters.js +3 -0
- package/build/system/mcp-servers/admin/diagnostics.d.ts +11 -4
- package/build/system/mcp-servers/admin/diagnostics.js +34 -22
- package/build/system/mcp-servers/admin/escalations.d.ts +6 -0
- package/build/system/mcp-servers/admin/escalations.js +182 -54
- package/build/system/mcp-servers/admin/index.js +3 -3
- package/build/system/mcp-servers/admin/schemas.d.ts +101 -6
- package/build/system/mcp-servers/admin/schemas.js +43 -6
- package/build/system/mcp-servers/admin/workflows.js +23 -12
- package/build/system/seed/tool-manifests-admin.d.ts +1324 -562
- package/build/system/seed/tool-manifests-admin.js +10 -2
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/auth.d.ts +1 -1
- package/build/types/startup.d.ts +9 -0
- package/dashboard/dist/assets/{AdminDashboard-0LSslIQ7.js → AdminDashboard-LTiYLuzq.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-0LSslIQ7.js.map → AdminDashboard-LTiYLuzq.js.map} +1 -1
- package/dashboard/dist/assets/{AgentConfigPage-hqBr1540.js → AgentConfigPage-nlOudfpZ.js} +7 -7
- package/dashboard/dist/assets/{AgentConfigPage-hqBr1540.js.map → AgentConfigPage-nlOudfpZ.js.map} +1 -1
- package/dashboard/dist/assets/AgentDetailPage-BSUnDvGp.js +4 -0
- package/dashboard/dist/assets/AgentDetailPage-BSUnDvGp.js.map +1 -0
- package/dashboard/dist/assets/AgentsPage-DpS0cCYe.js +2 -0
- package/dashboard/dist/assets/AgentsPage-DpS0cCYe.js.map +1 -0
- package/dashboard/dist/assets/AvailableEscalationsPage-BEylRqjP.js +2 -0
- package/dashboard/dist/assets/AvailableEscalationsPage-BEylRqjP.js.map +1 -0
- package/dashboard/dist/assets/{BotPicker-fFE4GAaO.js → BotPicker-BhKmq7M7.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-fFE4GAaO.js.map → BotPicker-BhKmq7M7.js.map} +1 -1
- package/dashboard/dist/assets/CapabilitiesPage-DLIleX2L.js +2 -0
- package/dashboard/dist/assets/{CapabilitiesPage-DotZ7iQc.js.map → CapabilitiesPage-DLIleX2L.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-D97SYypF.js → CollapsibleSection-D7SVwNVk.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-D97SYypF.js.map → CollapsibleSection-D7SVwNVk.js.map} +1 -1
- package/dashboard/dist/assets/{CredentialsPage-C08U6dlv.js → CredentialsPage-fat5Z2U9.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-C08U6dlv.js.map → CredentialsPage-fat5Z2U9.js.map} +1 -1
- package/dashboard/dist/assets/{CronLabel-C2TuCl4h.js → CronLabel-OOP4P2mJ.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-C2TuCl4h.js.map → CronLabel-OOP4P2mJ.js.map} +1 -1
- package/dashboard/dist/assets/{CustomDurationPicker-C3zGsESx.js → CustomDurationPicker-COacSAXO.js} +2 -2
- package/dashboard/dist/assets/{CustomDurationPicker-C3zGsESx.js.map → CustomDurationPicker-COacSAXO.js.map} +1 -1
- package/dashboard/dist/assets/{DropZone-Dwpgbueb.js → DropZone-Bfw2YLVS.js} +2 -2
- package/dashboard/dist/assets/{DropZone-Dwpgbueb.js.map → DropZone-Bfw2YLVS.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-DF4m0cv_.js → ElapsedCell-CkfCD-m7.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-DF4m0cv_.js.map → ElapsedCell-CkfCD-m7.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-blGOYKtJ.js → EscalationsOverview-BmI8jxlh.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-blGOYKtJ.js.map → EscalationsOverview-BmI8jxlh.js.map} +1 -1
- package/dashboard/dist/assets/EventTable-CeKfFk3m.js +2 -0
- package/dashboard/dist/assets/EventTable-CeKfFk3m.js.map +1 -0
- package/dashboard/dist/assets/{GraphInvokePage-QVAUHmjI.js → GraphInvokePage-BZBPBCSq.js} +2 -2
- package/dashboard/dist/assets/{GraphInvokePage-QVAUHmjI.js.map → GraphInvokePage-BZBPBCSq.js.map} +1 -1
- package/dashboard/dist/assets/{HomePage-DvYgvCcO.js → HomePage-dM7U2tl6.js} +2 -2
- package/dashboard/dist/assets/{HomePage-DvYgvCcO.js.map → HomePage-dM7U2tl6.js.map} +1 -1
- package/dashboard/dist/assets/{ListToolbar-D6tQ3ZG2.js → ListToolbar-BJaCzAXS.js} +2 -2
- package/dashboard/dist/assets/{ListToolbar-D6tQ3ZG2.js.map → ListToolbar-BJaCzAXS.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-BClbGYb8.js → McpOverview-CvnDG5OB.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-BClbGYb8.js.map → McpOverview-CvnDG5OB.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryDetailPage-DHjfDRdm.js → McpQueryDetailPage-DwmSIcIL.js} +3 -3
- package/dashboard/dist/assets/{McpQueryDetailPage-DHjfDRdm.js.map → McpQueryDetailPage-DwmSIcIL.js.map} +1 -1
- package/dashboard/dist/assets/McpQueryPage-CU6FMEEk.js +2 -0
- package/dashboard/dist/assets/McpQueryPage-CU6FMEEk.js.map +1 -0
- package/dashboard/dist/assets/McpRunDetailPage-8a6lsehv.js +2 -0
- package/dashboard/dist/assets/{McpRunDetailPage-DRbIZMU2.js.map → McpRunDetailPage-8a6lsehv.js.map} +1 -1
- package/dashboard/dist/assets/McpRunsPage-CPMYWgm_.js +2 -0
- package/dashboard/dist/assets/McpRunsPage-CPMYWgm_.js.map +1 -0
- package/dashboard/dist/assets/{NamespacePill-DnJl4Lre.js → NamespacePill-D6btr6e8.js} +2 -2
- package/dashboard/dist/assets/{NamespacePill-DnJl4Lre.js.map → NamespacePill-D6btr6e8.js.map} +1 -1
- package/dashboard/dist/assets/OperatorDashboard-g9o7I925.js +2 -0
- package/dashboard/dist/assets/OperatorDashboard-g9o7I925.js.map +1 -0
- package/dashboard/dist/assets/{PageHeader-Bnt2iQQa.js → PageHeader-Dk2Pe44Q.js} +2 -2
- package/dashboard/dist/assets/{PageHeader-Bnt2iQQa.js.map → PageHeader-Dk2Pe44Q.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeaderWithStats-BuKc9MKt.js → PageHeaderWithStats-DJQCZ0FR.js} +2 -2
- package/dashboard/dist/assets/{PageHeaderWithStats-BuKc9MKt.js.map → PageHeaderWithStats-DJQCZ0FR.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessDetailPage-DjQuNERz.js → ProcessDetailPage-ByyWCs2A.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-DjQuNERz.js.map → ProcessDetailPage-ByyWCs2A.js.map} +1 -1
- package/dashboard/dist/assets/ProcessesListPage-BTsXds4l.js +2 -0
- package/dashboard/dist/assets/ProcessesListPage-BTsXds4l.js.map +1 -0
- package/dashboard/dist/assets/{RolePill-DQTT1s9v.js → RolePill-Du-aNnjR.js} +2 -2
- package/dashboard/dist/assets/{RolePill-DQTT1s9v.js.map → RolePill-Du-aNnjR.js.map} +1 -1
- package/dashboard/dist/assets/{RolesPage-CFCN_mRF.js → RolesPage-B2Kdf-L9.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-CFCN_mRF.js.map → RolesPage-B2Kdf-L9.js.map} +1 -1
- package/dashboard/dist/assets/{RunAsSelector-sBxAvlRf.js → RunAsSelector-BzkZXpSX.js} +2 -2
- package/dashboard/dist/assets/{RunAsSelector-sBxAvlRf.js.map → RunAsSelector-BzkZXpSX.js.map} +1 -1
- package/dashboard/dist/assets/StreamMessageDetail-B6ch-6SY.js +2 -0
- package/dashboard/dist/assets/StreamMessageDetail-B6ch-6SY.js.map +1 -0
- package/dashboard/dist/assets/SwimlaneTimeline-CjvfUkls.js +2 -0
- package/dashboard/dist/assets/SwimlaneTimeline-CjvfUkls.js.map +1 -0
- package/dashboard/dist/assets/{TagInput-B00uqhjX.js → TagInput-CZSeyesi.js} +2 -2
- package/dashboard/dist/assets/{TagInput-B00uqhjX.js.map → TagInput-CZSeyesi.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-CgFN5uWn.js → TaskDetailPage-BjHU6opi.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-CgFN5uWn.js.map → TaskDetailPage-BjHU6opi.js.map} +1 -1
- package/dashboard/dist/assets/{TaskQueuePill-CUsofm0X.js → TaskQueuePill-CQrXrSxk.js} +2 -2
- package/dashboard/dist/assets/{TaskQueuePill-CUsofm0X.js.map → TaskQueuePill-CQrXrSxk.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-qj25rRZL.js → TasksListPage-Bem44zd0.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-qj25rRZL.js.map → TasksListPage-Bem44zd0.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-C7LylVjP.js → TimeAgo-CUIYqSt_.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-C7LylVjP.js.map → TimeAgo-CUIYqSt_.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-CrCtoBlo.js → TimestampCell--tnreI1i.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-CrCtoBlo.js.map → TimestampCell--tnreI1i.js.map} +1 -1
- package/dashboard/dist/assets/{ToolPill-DjvedZSn.js → ToolPill-O09jsTQM.js} +2 -2
- package/dashboard/dist/assets/{ToolPill-DjvedZSn.js.map → ToolPill-O09jsTQM.js.map} +1 -1
- package/dashboard/dist/assets/{ToolTestPanel-DYGlB-QW.js → ToolTestPanel-OD99H7Pk.js} +2 -2
- package/dashboard/dist/assets/{ToolTestPanel-DYGlB-QW.js.map → ToolTestPanel-OD99H7Pk.js.map} +1 -1
- package/dashboard/dist/assets/{TopicDetailPage-DLY6X_R6.js → TopicDetailPage-rh_dsTJI.js} +3 -3
- package/dashboard/dist/assets/{TopicDetailPage-DLY6X_R6.js.map → TopicDetailPage-rh_dsTJI.js.map} +1 -1
- package/dashboard/dist/assets/{TopicsPage-C5nOLsLx.js → TopicsPage-CD_40_v-.js} +2 -2
- package/dashboard/dist/assets/{TopicsPage-C5nOLsLx.js.map → TopicsPage-CD_40_v-.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-CgUZyiwm.js → UserName-C__c8BN0.js} +2 -2
- package/dashboard/dist/assets/{UserName-CgUZyiwm.js.map → UserName-C__c8BN0.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowExecutionPage-Bw6QdtUO.js +2 -0
- package/dashboard/dist/assets/{WorkflowExecutionPage-CDr5CTM2.js.map → WorkflowExecutionPage-Bw6QdtUO.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowPill-F1oKUzmc.js → WorkflowPill-CS-IsR0U.js} +2 -2
- package/dashboard/dist/assets/{WorkflowPill-F1oKUzmc.js.map → WorkflowPill-CS-IsR0U.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowsDashboard-BgI-iOP6.js +2 -0
- package/dashboard/dist/assets/WorkflowsDashboard-BgI-iOP6.js.map +1 -0
- package/dashboard/dist/assets/{WorkflowsOverview-CaMeZwde.js → WorkflowsOverview-BRc0QbA7.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-CaMeZwde.js.map → WorkflowsOverview-BRc0QbA7.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-C3uyCiIX.js → YamlWorkflowDetailPage-DdzspNQR.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-C3uyCiIX.js.map → YamlWorkflowDetailPage-DdzspNQR.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowsPage-DRnYgsvA.js → YamlWorkflowsPage-Djw5ZbgQ.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowsPage-DRnYgsvA.js.map → YamlWorkflowsPage-Djw5ZbgQ.js.map} +1 -1
- package/dashboard/dist/assets/{agents-HMkTc425.js → agents-xstNkF6c.js} +2 -2
- package/dashboard/dist/assets/{agents-HMkTc425.js.map → agents-xstNkF6c.js.map} +1 -1
- package/dashboard/dist/assets/api-path-u2Jf9QXS.js +2 -0
- package/dashboard/dist/assets/api-path-u2Jf9QXS.js.map +1 -0
- package/dashboard/dist/assets/{bots-CDe2jXNx.js → bots-BztAI0s_.js} +2 -2
- package/dashboard/dist/assets/{bots-CDe2jXNx.js.map → bots-BztAI0s_.js.map} +1 -1
- package/dashboard/dist/assets/{capabilities-DhnM7Ztb.js → capabilities-CEDwtxNL.js} +2 -2
- package/dashboard/dist/assets/{capabilities-DhnM7Ztb.js.map → capabilities-CEDwtxNL.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-BwIJ9ZC_.js → controlplane-BlGEsRKe.js} +2 -2
- package/dashboard/dist/assets/{controlplane-BwIJ9ZC_.js.map → controlplane-BlGEsRKe.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-columns-BKqSywVA.js → escalation-columns-nVYVt7Gl.js} +2 -2
- package/dashboard/dist/assets/{escalation-columns-BKqSywVA.js.map → escalation-columns-nVYVt7Gl.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-Djk5XKmX.js → escalation-iI4QKlP-.js} +2 -2
- package/dashboard/dist/assets/{escalation-Djk5XKmX.js.map → escalation-iI4QKlP-.js.map} +1 -1
- package/dashboard/dist/assets/{index-BW-fIquS.js → index-B5qsp8lb.js} +2 -2
- package/dashboard/dist/assets/{index-BW-fIquS.js.map → index-B5qsp8lb.js.map} +1 -1
- package/dashboard/dist/assets/{index-DBi9Q9Hw.js → index-B7VC0vjf.js} +2 -2
- package/dashboard/dist/assets/{index-DBi9Q9Hw.js.map → index-B7VC0vjf.js.map} +1 -1
- package/dashboard/dist/assets/{index-CPIYW81T.js → index-BUmnJ4eT.js} +2 -2
- package/dashboard/dist/assets/{index-CPIYW81T.js.map → index-BUmnJ4eT.js.map} +1 -1
- package/dashboard/dist/assets/{index-BNkpns_E.js → index-CAqEy2Db.js} +2 -2
- package/dashboard/dist/assets/{index-BNkpns_E.js.map → index-CAqEy2Db.js.map} +1 -1
- package/dashboard/dist/assets/{index-BYpWOUEe.js → index-CMviPjXQ.js} +2 -2
- package/dashboard/dist/assets/{index-BYpWOUEe.js.map → index-CMviPjXQ.js.map} +1 -1
- package/dashboard/dist/assets/index-CP0JEQhZ.js +6 -0
- package/dashboard/dist/assets/{index-E2hQ8DIi.js.map → index-CP0JEQhZ.js.map} +1 -1
- package/dashboard/dist/assets/index-CUfgt3mV.js +2 -0
- package/dashboard/dist/assets/index-CUfgt3mV.js.map +1 -0
- package/dashboard/dist/assets/index-ClvYSNZd.css +1 -0
- package/dashboard/dist/assets/{index-BFQ2t-p1.js → index-D1xVY4JR.js} +27 -27
- package/dashboard/dist/assets/index-D1xVY4JR.js.map +1 -0
- package/dashboard/dist/assets/{index-rUST2YsO.js → index-DPLy-jwO.js} +2 -2
- package/dashboard/dist/assets/{index-rUST2YsO.js.map → index-DPLy-jwO.js.map} +1 -1
- package/dashboard/dist/assets/{index-DRIJM1L-.js → index-DjJ6VCuc.js} +2 -2
- package/dashboard/dist/assets/{index-DRIJM1L-.js.map → index-DjJ6VCuc.js.map} +1 -1
- package/dashboard/dist/assets/{index-Dhy2PVAw.js → index-Dsi5o7dx.js} +2 -2
- package/dashboard/dist/assets/{index-Dhy2PVAw.js.map → index-Dsi5o7dx.js.map} +1 -1
- package/dashboard/dist/assets/{index-mEQ6kCnt.js → index-DzVYjoex.js} +3 -3
- package/dashboard/dist/assets/{index-mEQ6kCnt.js.map → index-DzVYjoex.js.map} +1 -1
- package/dashboard/dist/assets/index-FuhiJuHL.js +2 -0
- package/dashboard/dist/assets/index-FuhiJuHL.js.map +1 -0
- package/dashboard/dist/assets/{knowledge-jQE3dBVi.js → knowledge-BKg0cr39.js} +2 -2
- package/dashboard/dist/assets/{knowledge-jQE3dBVi.js.map → knowledge-BKg0cr39.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-DtEGfZiz.js → mcp-CVdHpKlz.js} +2 -2
- package/dashboard/dist/assets/{mcp-DtEGfZiz.js.map → mcp-CVdHpKlz.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-CiTLVuDC.js → mcp-query-CYxZcbwQ.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-CiTLVuDC.js.map → mcp-query-CYxZcbwQ.js.map} +1 -1
- package/dashboard/dist/assets/{pipelines-ClNdzuUK.js → pipelines-BOEv7P6O.js} +2 -2
- package/dashboard/dist/assets/{pipelines-ClNdzuUK.js.map → pipelines-BOEv7P6O.js.map} +1 -1
- package/dashboard/dist/assets/{roles-BmHbRaPT.js → roles-c5cV2QYQ.js} +2 -2
- package/dashboard/dist/assets/{roles-BmHbRaPT.js.map → roles-c5cV2QYQ.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-BPONxLcq.js → tasks-JV3BjeEF.js} +2 -2
- package/dashboard/dist/assets/{tasks-BPONxLcq.js.map → tasks-JV3BjeEF.js.map} +1 -1
- package/dashboard/dist/assets/{topics-XREPRxwo.js → topics-BDaPnhnQ.js} +2 -2
- package/dashboard/dist/assets/{topics-XREPRxwo.js.map → topics-BDaPnhnQ.js.map} +1 -1
- package/dashboard/dist/assets/useDebouncedValue-BA5S7V54.js +2 -0
- package/dashboard/dist/assets/useDebouncedValue-BA5S7V54.js.map +1 -0
- package/dashboard/dist/assets/{useEventHooks-M7SaEfel.js → useEventHooks-a7Dnh8G4.js} +2 -2
- package/dashboard/dist/assets/{useEventHooks-M7SaEfel.js.map → useEventHooks-a7Dnh8G4.js.map} +1 -1
- package/dashboard/dist/assets/{useNamespace-BQHGkdBv.js → useNamespace-BSwEV0e9.js} +2 -2
- package/dashboard/dist/assets/{useNamespace-BQHGkdBv.js.map → useNamespace-BSwEV0e9.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-B7JtUGSE.js → useYamlActivityEvents-BuqvL-cn.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-B7JtUGSE.js.map → useYamlActivityEvents-BuqvL-cn.js.map} +1 -1
- package/dashboard/dist/assets/{users-BpjSNhQe.js → users-Pn85K_3C.js} +2 -2
- package/dashboard/dist/assets/{users-BpjSNhQe.js.map → users-Pn85K_3C.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-Dj2F0Jrb.js → vendor-icons-D5ycKPA2.js} +114 -109
- package/dashboard/dist/assets/vendor-icons-D5ycKPA2.js.map +1 -0
- package/dashboard/dist/assets/{workflows-k4jE0ECC.js → workflows-DF-9Voyi.js} +2 -2
- package/dashboard/dist/assets/{workflows-k4jE0ECC.js.map → workflows-DF-9Voyi.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-DpviSLEL.js → yaml-workflows-2roKaSSK.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-DpviSLEL.js.map → yaml-workflows-2roKaSSK.js.map} +1 -1
- package/dashboard/dist/index.html +3 -3
- package/docs/api/mcp/admin.md +242 -5
- package/docs/mcp.md +102 -0
- package/package.json +1 -1
- package/dashboard/dist/assets/AgentDetailPage-bnXR1ezD.js +0 -4
- package/dashboard/dist/assets/AgentDetailPage-bnXR1ezD.js.map +0 -1
- package/dashboard/dist/assets/AgentsPage-tJIlrnfM.js +0 -2
- package/dashboard/dist/assets/AgentsPage-tJIlrnfM.js.map +0 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-B7gEfcw3.js +0 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-B7gEfcw3.js.map +0 -1
- package/dashboard/dist/assets/CapabilitiesPage-DotZ7iQc.js +0 -2
- package/dashboard/dist/assets/EventTable-DzrMH-ux.js +0 -2
- package/dashboard/dist/assets/EventTable-DzrMH-ux.js.map +0 -1
- package/dashboard/dist/assets/McpQueryPage-qtEuMDrd.js +0 -2
- package/dashboard/dist/assets/McpQueryPage-qtEuMDrd.js.map +0 -1
- package/dashboard/dist/assets/McpRunDetailPage-DRbIZMU2.js +0 -2
- package/dashboard/dist/assets/McpRunsPage-CMfwXQ4R.js +0 -2
- package/dashboard/dist/assets/McpRunsPage-CMfwXQ4R.js.map +0 -1
- package/dashboard/dist/assets/OperatorDashboard-Dq2pfV68.js +0 -2
- package/dashboard/dist/assets/OperatorDashboard-Dq2pfV68.js.map +0 -1
- package/dashboard/dist/assets/ProcessesListPage-vJimii8-.js +0 -2
- package/dashboard/dist/assets/ProcessesListPage-vJimii8-.js.map +0 -1
- package/dashboard/dist/assets/SwimlaneTimeline-2Eet4OOL.js +0 -2
- package/dashboard/dist/assets/SwimlaneTimeline-2Eet4OOL.js.map +0 -1
- package/dashboard/dist/assets/WorkflowExecutionPage-CDr5CTM2.js +0 -2
- package/dashboard/dist/assets/WorkflowsDashboard-tCBP0i0Y.js +0 -2
- package/dashboard/dist/assets/WorkflowsDashboard-tCBP0i0Y.js.map +0 -1
- package/dashboard/dist/assets/index-BFQ2t-p1.js.map +0 -1
- package/dashboard/dist/assets/index-Cydgj_Co.js +0 -2
- package/dashboard/dist/assets/index-Cydgj_Co.js.map +0 -1
- package/dashboard/dist/assets/index-DSki_Ub6.css +0 -1
- package/dashboard/dist/assets/index-E2hQ8DIi.js +0 -6
- package/dashboard/dist/assets/index-u08vQUaw.js +0 -2
- package/dashboard/dist/assets/index-u08vQUaw.js.map +0 -1
- package/dashboard/dist/assets/vendor-icons-Dj2F0Jrb.js.map +0 -1
package/docs/api/mcp/admin.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Admin
|
|
2
2
|
|
|
3
|
-
Unified system management — tasks, escalations, workflows, agents, bot accounts, control plane, pipelines, topics, users, roles, and settings.
|
|
3
|
+
Unified system management — tasks, escalations, workflows, diagnostics, agents, bot accounts, control plane, pipelines, topics, users, roles, and settings.
|
|
4
4
|
|
|
5
5
|
| Property | Value |
|
|
6
6
|
|----------|-------|
|
|
@@ -9,6 +9,10 @@ Unified system management — tasks, escalations, workflows, agents, bot account
|
|
|
9
9
|
| AI required | No |
|
|
10
10
|
| Credential providers | — |
|
|
11
11
|
|
|
12
|
+
## Access
|
|
13
|
+
|
|
14
|
+
Each tool below is marked **Read-safe**. A service-account key scoped `mcp:read` can call the Read-safe tools; the rest (Read-safe: No) change state and require an `mcp:full` key, and the account's role must permit the action on the target. See the MCP guide's [Access](../../mcp.md#access-which-tools-and-which-records) section for the full model.
|
|
15
|
+
|
|
12
16
|
## Compile Hints
|
|
13
17
|
|
|
14
18
|
Admin tools modify system configuration. certify_workflow and decertify_workflow change interceptor behavior.
|
|
@@ -52,7 +56,8 @@ Get all tasks and escalations for a process (origin_id).
|
|
|
52
56
|
|
|
53
57
|
### find_escalations
|
|
54
58
|
|
|
55
|
-
Search escalations with optional filters
|
|
59
|
+
Search escalations with optional filters and sorting. Returns full records
|
|
60
|
+
including `metadata`, workflow linkage, assignment, and `signal_key`.
|
|
56
61
|
|
|
57
62
|
| | |
|
|
58
63
|
|---|---|
|
|
@@ -62,13 +67,48 @@ Search escalations with optional filters by status, role, type, priority.
|
|
|
62
67
|
|
|
63
68
|
| Field | Type | Required | Description |
|
|
64
69
|
|-------|------|----------|-------------|
|
|
65
|
-
| status | string | No | pending or
|
|
70
|
+
| status | string | No | pending, resolved, or cancelled |
|
|
66
71
|
| role | string | No | Filter by role |
|
|
67
72
|
| type | string | No | Filter by type |
|
|
73
|
+
| subtype | string | No | Filter by subtype |
|
|
74
|
+
| assigned_to | string | No | Filter by assigned user UUID (active claim holder) |
|
|
75
|
+
| search | string | No | Free-text search across description, type/subtype, role, workflow/origin id, and metadata values (e.g. a correlation key like an order id). Server-side over the full result set. |
|
|
68
76
|
| priority | integer | No | Filter by priority |
|
|
77
|
+
| sort_by | string | No | Sort column: created_at, priority, updated_at |
|
|
78
|
+
| order | string | No | Sort direction (asc, desc) for sort_by |
|
|
69
79
|
| limit | integer | No | Max results |
|
|
70
80
|
| offset | integer | No | Pagination offset |
|
|
71
81
|
|
|
82
|
+
### get_escalation
|
|
83
|
+
|
|
84
|
+
Get a single escalation by ID — the full record including metadata, payloads,
|
|
85
|
+
`signal_key`, and assignment state.
|
|
86
|
+
|
|
87
|
+
| | |
|
|
88
|
+
|---|---|
|
|
89
|
+
| Read-safe | Yes |
|
|
90
|
+
|
|
91
|
+
**Parameters:**
|
|
92
|
+
|
|
93
|
+
| Field | Type | Required | Description |
|
|
94
|
+
|-------|------|----------|-------------|
|
|
95
|
+
| id | string | Yes | Escalation ID |
|
|
96
|
+
|
|
97
|
+
### get_escalations_by_workflow
|
|
98
|
+
|
|
99
|
+
List all escalations linked to a workflow ID, newest first. Returns full records
|
|
100
|
+
including metadata.
|
|
101
|
+
|
|
102
|
+
| | |
|
|
103
|
+
|---|---|
|
|
104
|
+
| Read-safe | Yes |
|
|
105
|
+
|
|
106
|
+
**Parameters:**
|
|
107
|
+
|
|
108
|
+
| Field | Type | Required | Description |
|
|
109
|
+
|-------|------|----------|-------------|
|
|
110
|
+
| workflow_id | string | Yes | Workflow ID to list escalations for |
|
|
111
|
+
|
|
72
112
|
### get_escalation_stats
|
|
73
113
|
|
|
74
114
|
Aggregated escalation statistics: pending, claimed, created, resolved counts with breakdown by role.
|
|
@@ -98,6 +138,85 @@ Claim an escalation for a time-boxed lock.
|
|
|
98
138
|
| id | string | Yes | Escalation ID |
|
|
99
139
|
| duration_minutes | integer | No | Lock duration |
|
|
100
140
|
|
|
141
|
+
### release_escalation
|
|
142
|
+
|
|
143
|
+
Release a claimed escalation back to the available pool (reverses `claim_escalation`).
|
|
144
|
+
|
|
145
|
+
| | |
|
|
146
|
+
|---|---|
|
|
147
|
+
| Read-safe | No |
|
|
148
|
+
|
|
149
|
+
**Parameters:**
|
|
150
|
+
|
|
151
|
+
| Field | Type | Required | Description |
|
|
152
|
+
|-------|------|----------|-------------|
|
|
153
|
+
| id | string | Yes | Escalation ID to release |
|
|
154
|
+
|
|
155
|
+
### resolve_escalation
|
|
156
|
+
|
|
157
|
+
Resolve a pending escalation with a human-provided payload. Routes by escalation
|
|
158
|
+
shape: efficient (`signal_key`) escalations resume the waiting workflow in place;
|
|
159
|
+
legacy paths signal via routing metadata or re-run the original workflow. Password
|
|
160
|
+
fields in the payload are replaced with ephemeral tokens.
|
|
161
|
+
|
|
162
|
+
| | |
|
|
163
|
+
|---|---|
|
|
164
|
+
| Read-safe | No |
|
|
165
|
+
|
|
166
|
+
**Parameters:**
|
|
167
|
+
|
|
168
|
+
| Field | Type | Required | Description |
|
|
169
|
+
|-------|------|----------|-------------|
|
|
170
|
+
| id | string | Yes | Escalation ID to resolve |
|
|
171
|
+
| resolverPayload | object | Yes | Resolution payload |
|
|
172
|
+
|
|
173
|
+
### resolve_by_signal_key
|
|
174
|
+
|
|
175
|
+
Resolve an efficient (atomic) escalation directly by its `signal_key` and resume
|
|
176
|
+
the waiting workflow in place. For callers that know the deterministic signal id
|
|
177
|
+
and want to skip the id lookup.
|
|
178
|
+
|
|
179
|
+
| | |
|
|
180
|
+
|---|---|
|
|
181
|
+
| Read-safe | No |
|
|
182
|
+
|
|
183
|
+
**Parameters:**
|
|
184
|
+
|
|
185
|
+
| Field | Type | Required | Description |
|
|
186
|
+
|-------|------|----------|-------------|
|
|
187
|
+
| signalKey | string | Yes | Deterministic signal key of the escalation |
|
|
188
|
+
| resolverPayload | object | Yes | Resolution payload |
|
|
189
|
+
|
|
190
|
+
### escalate_escalation
|
|
191
|
+
|
|
192
|
+
Route a pending escalation to a different role per the escalation chain.
|
|
193
|
+
|
|
194
|
+
| | |
|
|
195
|
+
|---|---|
|
|
196
|
+
| Read-safe | No |
|
|
197
|
+
|
|
198
|
+
**Parameters:**
|
|
199
|
+
|
|
200
|
+
| Field | Type | Required | Description |
|
|
201
|
+
|-------|------|----------|-------------|
|
|
202
|
+
| id | string | Yes | Escalation ID |
|
|
203
|
+
| targetRole | string | Yes | Role to route the escalation to |
|
|
204
|
+
|
|
205
|
+
### cancel_escalation
|
|
206
|
+
|
|
207
|
+
Permanently cancel a pending escalation (e.g. its workflow has terminated and can
|
|
208
|
+
never receive the resolution signal). Preserved for audit.
|
|
209
|
+
|
|
210
|
+
| | |
|
|
211
|
+
|---|---|
|
|
212
|
+
| Read-safe | No |
|
|
213
|
+
|
|
214
|
+
**Parameters:**
|
|
215
|
+
|
|
216
|
+
| Field | Type | Required | Description |
|
|
217
|
+
|-------|------|----------|-------------|
|
|
218
|
+
| id | string | Yes | Escalation ID to cancel |
|
|
219
|
+
|
|
101
220
|
### release_expired_claims
|
|
102
221
|
|
|
103
222
|
Release all escalation claims that exceeded their lock duration.
|
|
@@ -125,7 +244,8 @@ Resolve escalations for triage and start mcpTriage workflows.
|
|
|
125
244
|
|
|
126
245
|
### find_by_metadata
|
|
127
246
|
|
|
128
|
-
Find escalations by a metadata key-value pair.
|
|
247
|
+
Find escalations by a metadata key-value pair — e.g. a correlation key (order id,
|
|
248
|
+
ticket id, request id) written into metadata when the escalation was raised.
|
|
129
249
|
|
|
130
250
|
| | |
|
|
131
251
|
|---|---|
|
|
@@ -223,6 +343,20 @@ Escalate multiple escalations to a different role.
|
|
|
223
343
|
| ids | string[] | Yes | Escalation IDs |
|
|
224
344
|
| targetRole | string | Yes | Target role |
|
|
225
345
|
|
|
346
|
+
### bulk_cancel
|
|
347
|
+
|
|
348
|
+
Cancel multiple pending escalations in a single operation.
|
|
349
|
+
|
|
350
|
+
| | |
|
|
351
|
+
|---|---|
|
|
352
|
+
| Read-safe | No |
|
|
353
|
+
|
|
354
|
+
**Parameters:**
|
|
355
|
+
|
|
356
|
+
| Field | Type | Required | Description |
|
|
357
|
+
|-------|------|----------|-------------|
|
|
358
|
+
| ids | string[] | Yes | Escalation IDs to cancel |
|
|
359
|
+
|
|
226
360
|
### update_priority
|
|
227
361
|
|
|
228
362
|
Update the priority of multiple escalations.
|
|
@@ -323,7 +457,9 @@ Start a certified workflow by type. Returns workflow ID immediately.
|
|
|
323
457
|
|
|
324
458
|
### get_workflow_status
|
|
325
459
|
|
|
326
|
-
Check workflow status and result. Returns status (
|
|
460
|
+
Check workflow status and result. Returns status (`running` | `complete`) and the
|
|
461
|
+
result when complete. Resolution is namespace-aware — pass `app_id` to read a
|
|
462
|
+
workflow (e.g. a child) running in a non-default HotMesh namespace.
|
|
327
463
|
|
|
328
464
|
| | |
|
|
329
465
|
|---|---|
|
|
@@ -334,6 +470,7 @@ Check workflow status and result. Returns status (0=complete, positive=running)
|
|
|
334
470
|
| Field | Type | Required | Description |
|
|
335
471
|
|-------|------|----------|-------------|
|
|
336
472
|
| workflow_id | string | Yes | Workflow ID to check |
|
|
473
|
+
| app_id | string | No | HotMesh namespace for resolution (default: durable) |
|
|
337
474
|
|
|
338
475
|
## MCP Servers
|
|
339
476
|
|
|
@@ -949,6 +1086,106 @@ Browse stream messages with pagination, filtering, and sorting.
|
|
|
949
1086
|
| workflow_name | string | No | Filter by workflow name |
|
|
950
1087
|
| jid | string | No | Filter by job ID |
|
|
951
1088
|
| aid | string | No | Filter by activity ID |
|
|
1089
|
+
| dad | string | No | Filter by dimension/ancestor path (worker-only) — pins one execution among siblings sharing an aid |
|
|
1090
|
+
|
|
1091
|
+
## Diagnostics
|
|
1092
|
+
|
|
1093
|
+
Read-only inspection of workflow execution. These tools never mutate state —
|
|
1094
|
+
HotMesh execution only moves forward and cannot be unwound, so they describe what
|
|
1095
|
+
happened and where to look, not how to "fix" a job.
|
|
1096
|
+
|
|
1097
|
+
**Read this first — what is and isn't a problem.** A workflow suspended at a
|
|
1098
|
+
`condition()` / `waitFor()` / `sleepFor()` can sit idle for days legitimately,
|
|
1099
|
+
and HotMesh only bumps `updated_at` when a job's status changes. A frozen
|
|
1100
|
+
`updated_at` is therefore the *normal* signature of a wait, **not** a fault. The
|
|
1101
|
+
genuinely broken signals are: a dead-lettered message (retries exhausted), a
|
|
1102
|
+
reservation leak (claimed but never ACK'd past the reclaim window), and a
|
|
1103
|
+
suspended waiter with **no** escalation row.
|
|
1104
|
+
|
|
1105
|
+
**Recommended flow:** start fleet-wide with `find_orphaned_signals` (the
|
|
1106
|
+
genuinely-broken case) or `find_stalled_jobs` (candidates worth a look), then run
|
|
1107
|
+
`diagnose_job` on a specific id for root cause. `diagnose_job` is compact by
|
|
1108
|
+
default — the verdict only. Opt into the heavy arrays with `include`, and for the
|
|
1109
|
+
full raw JSONB of a specific message use `list_stream_messages` (Control Plane)
|
|
1110
|
+
filtered by `jid` (and `aid`/`dad`).
|
|
1111
|
+
|
|
1112
|
+
### diagnose_job
|
|
1113
|
+
|
|
1114
|
+
Read-only diagnosis of one workflow. **Compact by default** — returns the verdict
|
|
1115
|
+
only: `status`, `idle_for_ms`, `workflow_type`, `stream_summary` (counts), the
|
|
1116
|
+
`escalation` summary, and structured `findings[]` with confidence, evidence, and
|
|
1117
|
+
read-only guidance. Classifies a healthy long-wait as such rather than flagging it
|
|
1118
|
+
as stalled.
|
|
1119
|
+
|
|
1120
|
+
To opt into the heavy arrays pass `include: ["events"]` for the execution timeline
|
|
1121
|
+
and/or `include: ["streams"]` for raw engine+worker messages (`verbosity: "full"`
|
|
1122
|
+
adds both). Large `result`/`message` payloads are summarized to
|
|
1123
|
+
`{ bytes, preview, truncated }`; for full untruncated payloads use
|
|
1124
|
+
`list_stream_messages` filtered by `jid` (surfaced as `raw_messages` when streams
|
|
1125
|
+
are omitted).
|
|
1126
|
+
|
|
1127
|
+
| | |
|
|
1128
|
+
|---|---|
|
|
1129
|
+
| Read-safe | Yes |
|
|
1130
|
+
|
|
1131
|
+
**Parameters:**
|
|
1132
|
+
|
|
1133
|
+
| Field | Type | Required | Description |
|
|
1134
|
+
|-------|------|----------|-------------|
|
|
1135
|
+
| workflow_id | string | Yes | Workflow (job) ID to diagnose |
|
|
1136
|
+
| app_id | string | No | HotMesh namespace / DB schema (default: durable) |
|
|
1137
|
+
| include | string[] | No | Heavy sections to add: `events`, `streams`. Omit for the compact verdict. |
|
|
1138
|
+
| verbosity | string | No | `summary` (default, verdict only) or `full` (events + streams) |
|
|
1139
|
+
| max_events | integer | No | Cap on execution events returned when included, most recent kept (default: 500). Use `list_stream_messages` for full payloads. |
|
|
1140
|
+
|
|
1141
|
+
### find_stalled_jobs
|
|
1142
|
+
|
|
1143
|
+
Find running jobs with no status change in N minutes (bounded, indexed). Each
|
|
1144
|
+
result is classified `likely`: `waiting` (has a pending escalation — healthy) or
|
|
1145
|
+
`no_recent_progress` (worth a closer look). Triage the `no_recent_progress` rows
|
|
1146
|
+
with `diagnose_job`.
|
|
1147
|
+
|
|
1148
|
+
| | |
|
|
1149
|
+
|---|---|
|
|
1150
|
+
| Read-safe | Yes |
|
|
1151
|
+
|
|
1152
|
+
**Parameters:**
|
|
1153
|
+
|
|
1154
|
+
| Field | Type | Required | Description |
|
|
1155
|
+
|-------|------|----------|-------------|
|
|
1156
|
+
| app_id | string | No | HotMesh namespace / DB schema (default: durable) |
|
|
1157
|
+
| idle_minutes | integer | No | Minimum minutes since last status change (default: 5) |
|
|
1158
|
+
| workflow_type | string | No | Filter by workflow function name |
|
|
1159
|
+
| limit | integer | No | Max results (default: 50, max: 200) |
|
|
1160
|
+
|
|
1161
|
+
### find_orphaned_signals
|
|
1162
|
+
|
|
1163
|
+
Find running workflows suspended at a `condition()` (waiter committed, signal
|
|
1164
|
+
registered) that have **no** escalation row — the genuinely broken case: the
|
|
1165
|
+
workflow waits for a signal nothing will send. Scans a recent time window only,
|
|
1166
|
+
so it never degenerates into a full-history scan of the partitioned
|
|
1167
|
+
`worker_streams` table.
|
|
1168
|
+
|
|
1169
|
+
| | |
|
|
1170
|
+
|---|---|
|
|
1171
|
+
| Read-safe | Yes |
|
|
1172
|
+
|
|
1173
|
+
**Parameters:**
|
|
1174
|
+
|
|
1175
|
+
| Field | Type | Required | Description |
|
|
1176
|
+
|-------|------|----------|-------------|
|
|
1177
|
+
| app_id | string | No | HotMesh namespace / DB schema (default: durable) |
|
|
1178
|
+
| within_hours | integer | No | Recent window to scan, in hours (default: 24, max: 720). Widen to reach older orphans; narrow to go faster. |
|
|
1179
|
+
| limit | integer | No | Max results (default: 100, max: 500) |
|
|
1180
|
+
|
|
1181
|
+
### Example prompts
|
|
1182
|
+
|
|
1183
|
+
- "Diagnose workflow `ortho-eff-1782084825-b9-3-2-printer-0` and tell me whether it's a healthy wait or genuinely stuck."
|
|
1184
|
+
- "Find any orphaned signals in the last 48 hours and summarize the common cause."
|
|
1185
|
+
- "List stalled jobs of type `printerEfficient` idle more than 30 minutes, then diagnose the ones classified `no_recent_progress`."
|
|
1186
|
+
- "Are there dead-lettered messages or reservation leaks behind job `<id>`? Show the evidence."
|
|
1187
|
+
- "Diagnose `<id>`, then pull the raw worker stream message for its failing activity so I can see the full input payload."
|
|
1188
|
+
- "Scan the fleet for genuinely broken workflows (not normal waits) and give me the job IDs to investigate."
|
|
952
1189
|
|
|
953
1190
|
## Pipelines
|
|
954
1191
|
|
package/docs/mcp.md
CHANGED
|
@@ -8,6 +8,7 @@ Your agents speak MCP. Long Tail makes their tool calls durable and exposes huma
|
|
|
8
8
|
- [Humans as Tools](#humans-as-tools)
|
|
9
9
|
- [Compiled Workflows as Tools](#compiled-workflows-as-tools)
|
|
10
10
|
- [The Cycle](#the-cycle)
|
|
11
|
+
- [Connecting an Agent to Long Tail](#connecting-an-agent-to-long-tail) — the `/mcp` endpoint, service accounts, multi-environment `.mcp.json`, example prompts
|
|
11
12
|
- [Human Queue Server](#human-queue-server) — escalation as MCP tools
|
|
12
13
|
- [Document Vision Server](#document-vision-server) — AI tools as 3 MCP tools
|
|
13
14
|
- [MCP-Native Workflow](#mcp-native-workflow) — both sides MCP, end to end
|
|
@@ -142,6 +143,107 @@ Over time, the YAML replaces the procedural. The MCP triage workflow stops entro
|
|
|
142
143
|
|
|
143
144
|
The sections above describe the concept. The rest of this guide covers the concrete servers, tools, and APIs that implement it.
|
|
144
145
|
|
|
146
|
+
## Connecting an Agent to Long Tail
|
|
147
|
+
|
|
148
|
+
Long Tail is itself an MCP server. Any MCP-aware client — Claude Code, Claude Desktop, Cursor, a custom agent — connects to its full tool surface and operates the system in conversation: read its state, work its queues, run its workflows, inspect its plumbing. Diagnostics are one part of that surface, not the whole of it.
|
|
149
|
+
|
|
150
|
+
### The endpoint
|
|
151
|
+
|
|
152
|
+
| | |
|
|
153
|
+
|---|---|
|
|
154
|
+
| URL | `POST https://<host>/mcp` |
|
|
155
|
+
| Transport | Streamable HTTP, stateless — one request and one response per call |
|
|
156
|
+
| Auth | `Authorization: Bearer <token>` — a signed user token (JWT) or a service-account key |
|
|
157
|
+
|
|
158
|
+
### Access: which tools, and which records
|
|
159
|
+
|
|
160
|
+
Two things decide what a connected agent can do, and both must pass.
|
|
161
|
+
|
|
162
|
+
**Scope decides which tools appear.** Every service-account key carries one of two scopes:
|
|
163
|
+
|
|
164
|
+
- `mcp:read` — the read-only tools: listing, searching, diagnosing, stream and escalation stats, exports. Anything that only reports.
|
|
165
|
+
- `mcp:full` — those, plus the tools that change state: create an escalation, claim and resolve one, invoke a workflow, update a configuration, prune the database.
|
|
166
|
+
|
|
167
|
+
A deployment can also be set read-only as a whole, which holds every key to read access whatever its scope, and can hide entire groups of tools. Production is the place to do this by default.
|
|
168
|
+
|
|
169
|
+
**Role decides which records.** Scope opens a tool; the account's role decides whether the action is allowed on a given target. An account with `mcp:full` but only the `reviewer` role can resolve reviewer escalations — it cannot route work to finance or manage users. Administrative tools (users, roles, configuration, pruning) require an admin or superadmin role.
|
|
170
|
+
|
|
171
|
+
Put plainly: **scope is which tools, role is which records.** A read key answers questions; a full key with the right role also acts.
|
|
172
|
+
|
|
173
|
+
Creating an escalation shows both at work. `escalate_to_human` changes state, so the key needs `mcp:full`, and the account needs a role allowed to route to that queue. Reading the same queue back — `get_available_work`, `check_resolution` — needs only `mcp:read`. The rule holds for every tool: reading is cheap to grant, writing is deliberate.
|
|
174
|
+
|
|
175
|
+
### 1. Create a service account
|
|
176
|
+
|
|
177
|
+
In the dashboard: **Admin → Bot Accounts → Create**, assign the role(s) the account should act under, then generate an API key and choose its scope — `mcp:read` for an investigator, `mcp:full` for an operator that also makes changes. The raw key is shown once. The same is available as admin tools: `create_bot_account`, then `create_bot_api_key`.
|
|
178
|
+
|
|
179
|
+
Give each environment its own account and key, scoped to the least it needs.
|
|
180
|
+
|
|
181
|
+
### 2. Point a client at it — `.mcp.json`
|
|
182
|
+
|
|
183
|
+
Long Tail speaks the standard transport, so a single HTTP server entry connects an MCP client:
|
|
184
|
+
|
|
185
|
+
```jsonc
|
|
186
|
+
{
|
|
187
|
+
"mcpServers": {
|
|
188
|
+
"longtail-prod": {
|
|
189
|
+
"type": "http",
|
|
190
|
+
"url": "https://your-host.example.com/mcp",
|
|
191
|
+
"headers": { "Authorization": "Bearer ${LONGTAIL_PROD_KEY}" }
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
Use `${VAR}` for the key so the file holds no secrets — keep the key itself in your shell environment or a secret manager, and never commit it.
|
|
198
|
+
|
|
199
|
+
### 3. Local, staging, and production in one conversation
|
|
200
|
+
|
|
201
|
+
Add one server entry per environment:
|
|
202
|
+
|
|
203
|
+
```jsonc
|
|
204
|
+
{
|
|
205
|
+
"mcpServers": {
|
|
206
|
+
"longtail-local": { "type": "http", "url": "http://localhost:3000/mcp", "headers": { "Authorization": "Bearer ${LONGTAIL_LOCAL_KEY}" } },
|
|
207
|
+
"longtail-staging": { "type": "http", "url": "https://staging.example.com/mcp", "headers": { "Authorization": "Bearer ${LONGTAIL_STAGING_KEY}" } },
|
|
208
|
+
"longtail-prod": { "type": "http", "url": "https://prod.example.com/mcp", "headers": { "Authorization": "Bearer ${LONGTAIL_PROD_KEY}" } }
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
Each server keeps its tools under its own name, so the three copies of every tool never collide — you choose one by naming the environment: *"on production, find orphaned signals,"* *"reproduce it locally and diagnose."*
|
|
214
|
+
|
|
215
|
+
Two things stay separate:
|
|
216
|
+
|
|
217
|
+
- The server names the deployment; a tool's `app_id` argument names the workspace inside it. Together they say where to look.
|
|
218
|
+
- Every server you list is live at once. Give production a read key by default, and reach for a full key only when you mean to change something there.
|
|
219
|
+
|
|
220
|
+
### Usage — example prompts
|
|
221
|
+
|
|
222
|
+
The full tool reference is in [the admin server doc](api/mcp/admin.md). A read key covers everything marked *read*; a *write* action needs a full key and a role that fits.
|
|
223
|
+
|
|
224
|
+
**Find and diagnose** — *read*
|
|
225
|
+
- "Diagnose workflow `<id>` — is it waiting normally or genuinely stuck?"
|
|
226
|
+
- "Find orphaned signals from the last 48 hours and group them by cause."
|
|
227
|
+
|
|
228
|
+
**Escalations and human work** — *read* to view, *write* to act
|
|
229
|
+
- "How many escalations are pending, by role?"
|
|
230
|
+
- "Find the escalation where `orderId` is `<id>` and show its status."
|
|
231
|
+
- "Create an escalation to the `reviewer` role for order `<id>` with this context."
|
|
232
|
+
- "Claim escalation `<id>` and resolve it as approved."
|
|
233
|
+
|
|
234
|
+
**Workflows and pipelines** — *read* for status, *write* to run
|
|
235
|
+
- "List the workflows this deployment knows about."
|
|
236
|
+
- "Invoke `reviewContent` with this input and return the job id."
|
|
237
|
+
- "What is the status and result of workflow `<id>`?"
|
|
238
|
+
|
|
239
|
+
**Operations and stats** — *read*, a few actions *write*
|
|
240
|
+
- "Roll call app `durable` — which engines and workers are live?"
|
|
241
|
+
- "Show stream stats for the last hour; is the backlog growing?"
|
|
242
|
+
- "Pause the mesh for app `durable`."
|
|
243
|
+
|
|
244
|
+
**Settings** — *read*
|
|
245
|
+
- "What versions and features is this deployment running?"
|
|
246
|
+
|
|
145
247
|
## Human Queue Server
|
|
146
248
|
|
|
147
249
|
The Human Queue is a built-in MCP server that exposes Long Tail's escalation API as standard MCP tools. Any MCP-compatible client — Claude, LangGraph, CrewAI, a custom agent — can connect and work the queue.
|
package/package.json
CHANGED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import{j as e,a as y}from"./vendor-query-B2UbickB.js";import{a as D,b as L,c as R}from"./agents-HMkTc425.js";import{u as W,b as K,N as M}from"./index-BFQ2t-p1.js";import{u as z,E,C as S}from"./CronLabel-C2TuCl4h.js";import{i as I}from"./useEventHooks-M7SaEfel.js";import{W as N}from"./WorkflowPill-F1oKUzmc.js";import{a as U,B as F,Q as H,P as G,aK as J,q as O,aL as Q,R as _,a7 as X,d as Y,aM as V}from"./vendor-icons-Dj2F0Jrb.js";import{e as Z,c as ee}from"./vendor-react-CXumBFUA.js";function te(a){return new Date(a).toLocaleTimeString("en-US",{hour12:!1,hour:"2-digit",minute:"2-digit",second:"2-digit"})}function u({icon:a,color:i,children:c,actions:h}){return e.jsxs("div",{className:"flex items-center justify-between mb-3 pb-2 border-b border-surface-border",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(a,{className:`w-4 h-4 ${i}`,strokeWidth:1.5}),e.jsx("h2",{className:"text-xs font-semibold uppercase tracking-widest text-accent/80",children:c})]}),h]})}function j({text:a}){return e.jsx("p",{className:"text-[11px] text-text-quaternary py-2",children:a})}let se=0;function ae(a){const[i,c]=y.useState([]),[h,d]=y.useState(!1),t=y.useCallback(r=>{var m,g,p;if((m=r.type)!=null&&m.startsWith("mesh."))return;const x=r.activityName||((g=r.data)==null?void 0:g.domain)||((p=r.workflowId)==null?void 0:p.slice(0,16))||"";c(f=>[{id:++se,type:r.type,timestamp:r.timestamp,label:x},...f].slice(0,10)),d(!0),setTimeout(()=>d(!1),2e3)},[]);return K(a?`${M}.system.agent.${a}.>`:"",t),{events:i,pulse:h}}function me(){var b,w,k,C,$;const{id:a}=Z(),i=ee(),{data:c}=W(),d=!!((b=c==null?void 0:c.ai)!=null&&b.enabled)?"Agent":"Automation",{data:t,isLoading:r}=D(a??null),{data:x}=z(a??null),m=L(),g=R(),{events:p,pulse:f}=ae(a);if(I(),r)return e.jsxs("div",{className:"animate-pulse space-y-4",children:[e.jsx("div",{className:"h-8 bg-surface-sunken rounded w-48"}),e.jsx("div",{className:"h-40 bg-surface-sunken rounded"})]});if(!t)return e.jsxs("div",{className:"flex flex-col items-center justify-center py-20 text-center",children:[e.jsx(U,{className:"w-12 h-12 text-text-quaternary mb-4",strokeWidth:1}),e.jsxs("h2",{className:"text-lg font-medium text-text-primary mb-2",children:[d," not found"]}),e.jsxs("button",{onClick:()=>i("/agents"),className:"text-sm text-accent hover:text-accent-hover transition-colors",children:["Back to ",d.toLowerCase(),"s"]})]});const A=t.status==="active"?"bg-emerald-400":t.status==="paused"?"bg-amber-400":t.status==="error"?"bg-red-400":"bg-zinc-500",n=(x==null?void 0:x.subscriptions)??[],P=t.status==="active"?"Active":t.status==="paused"?"Paused":t.status==="error"?"Error":"Inactive",l=(w=t.behaviors)==null?void 0:w.schedules,v=(k=t.behaviors)==null?void 0:k.cron,o=(l==null?void 0:l.length)||(v?1:0),q=()=>{const s=[`Pause "${t.id}"?`,"","This will:",n.length>0?`• Stop ${n.length} event subscription${n.length!==1?"s":""}`:null,o>0?`• Stop ${o} schedule${o!==1?"s":""}`:null,"","Knowledge and workflow history are preserved. You can reactivate anytime."].filter(Boolean).join(`
|
|
2
|
-
`);confirm(s)&&m.mutate({id:t.id,status:"paused"})},T=()=>{const s=[`Delete "${t.id}"?`,"","This permanently removes:","• The agent configuration",n.length>0?`• ${n.length} event subscription${n.length!==1?"s":""}`:null,o>0?`• ${o} schedule${o!==1?"s":""}`:null,"","Knowledge entries and workflow history are preserved."].filter(Boolean).join(`
|
|
3
|
-
`);confirm(s)&&g.mutate(t.id,{onSuccess:()=>i("/agents")})};return e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-start justify-between mb-3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("h1",{className:"text-3xl font-light text-text-primary",children:[d,": ",t.id]}),e.jsx("button",{onClick:()=>{window.location.hash="#docs:agents.md"},className:"text-text-quaternary hover:text-accent transition-colors mt-1",title:"Docs",children:e.jsx(F,{className:"w-4 h-4",strokeWidth:1.5})})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsxs("div",{className:"flex items-center gap-1.5 mr-2",children:[e.jsx("span",{className:`w-2 h-2 rounded-full ${A}`}),e.jsx("span",{className:"text-xs text-text-secondary capitalize",children:P})]}),e.jsxs("button",{onClick:()=>i(`/agents/${t.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",children:[e.jsx(H,{className:"w-3 h-3"})," Edit"]}),t.status!=="active"&&e.jsxs("button",{onClick:()=>m.mutate({id:t.id,status:"active"}),className:"flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md text-emerald-400 hover:bg-emerald-600/10 transition-colors",children:[e.jsx(G,{className:"w-3 h-3"})," Activate"]}),t.status==="active"&&e.jsxs("button",{onClick:q,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",children:[e.jsx(J,{className:"w-3 h-3"})," Pause"]}),e.jsxs("button",{onClick:T,className:"flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md text-red-400/60 hover:text-red-400 hover:bg-red-600/10 transition-colors",children:[e.jsx(O,{className:"w-3 h-3"})," Delete"]})]})]}),t.description&&e.jsx("div",{className:"border-l-2 border-accent/30 pl-4 py-1 mb-10",children:e.jsx("p",{className:"text-[13px] text-text-secondary italic leading-relaxed",children:t.description})}),(t.goals||t.rules)&&e.jsxs("div",{className:"mb-10",children:[e.jsx(u,{icon:Q,color:"text-rose-400",children:"Motivation"}),e.jsxs("div",{className:"grid grid-cols-2 gap-x-14 bg-surface-sunken/20 rounded-lg px-5 py-4",children:[t.goals&&e.jsxs("div",{children:[e.jsx("p",{className:"text-[9px] text-text-quaternary uppercase tracking-widest mb-1.5",children:"Goals"}),e.jsx("p",{className:"text-[13px] text-text-primary leading-relaxed",children:t.goals})]}),t.rules&&e.jsxs("div",{children:[e.jsx("p",{className:"text-[9px] text-text-quaternary uppercase tracking-widest mb-1.5",children:"Rules"}),e.jsx("p",{className:"text-[13px] text-text-primary leading-relaxed",children:t.rules})]})]})]}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-3 gap-x-14 gap-y-10",children:[e.jsxs("div",{children:[e.jsxs(u,{icon:_,color:"text-cyan-400",children:["Subscriptions (",n.length,")"]}),n.length===0?e.jsx(j,{text:"No event subscriptions"}):e.jsx("div",{className:"divide-y divide-surface-border/30",children:n.map(s=>e.jsxs("div",{className:"flex items-center py-2",children:[e.jsx("div",{className:"flex-1 min-w-0",children:e.jsx(E,{topic:s.topic})}),e.jsxs("div",{className:"flex items-center gap-1.5 shrink-0",children:[e.jsx("span",{className:"text-text-quaternary text-[10px]",children:"→"}),e.jsx(N,{type:s.reaction_type==="capability"?s.tool_name:s.workflow_type||s.reaction_type,variant:s.reaction_type==="pipeline"?"pipeline":s.reaction_type==="capability"?"capability":"durable"})]})]},s.id))})]}),e.jsxs("div",{children:[e.jsxs(u,{icon:X,color:"text-amber-400",children:["Schedules (",o,")"]}),l!=null&&l.length?e.jsx("div",{className:"divide-y divide-surface-border/30",children:l.map((s,B)=>e.jsxs("div",{className:"flex items-center py-2",children:[e.jsx("div",{className:"flex-1 min-w-0",children:e.jsx(S,{cron:s.cron})}),e.jsxs("div",{className:"flex items-center gap-1.5 shrink-0",children:[e.jsx("span",{className:"text-text-quaternary text-[10px]",children:"→"}),e.jsx(N,{type:s.workflow_type||"workflow"})]})]},B))}):v?e.jsxs("div",{className:"flex items-center py-1",children:[e.jsx("div",{className:"flex-1 min-w-0",children:e.jsx(S,{cron:v})}),t.workflow_type&&e.jsxs("div",{className:"flex items-center gap-1.5 shrink-0",children:[e.jsx("span",{className:"text-text-quaternary text-[10px]",children:"→"}),e.jsx(N,{type:t.workflow_type})]})]}):e.jsx(j,{text:"No schedules configured"})]}),e.jsxs("div",{className:"space-y-10",children:[e.jsxs("div",{children:[e.jsx(u,{icon:Y,color:"text-emerald-400",children:"Knowledge"}),t.knowledge_domain?e.jsxs("button",{onClick:()=>i(`/knowledge?domain=${t.knowledge_domain}`),className:"group text-left flex items-center gap-3",children:[e.jsx("span",{className:"text-sm font-mono text-text-primary group-hover:text-accent transition-colors",children:t.knowledge_domain}),e.jsxs("span",{className:"text-[10px] text-text-quaternary",children:[(($=(C=t.stats)==null?void 0:C.knowledge_count)==null?void 0:$.toLocaleString())??0," entries"]}),e.jsx(V,{className:"w-3 h-3 text-accent opacity-0 group-hover:opacity-100 transition-opacity"})]}):e.jsx(j,{text:"No knowledge domain"})]}),e.jsxs("div",{children:[e.jsx(u,{icon:_,color:"text-cyan-400",actions:e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:`w-1.5 h-1.5 rounded-full transition-colors duration-500 ${f?"bg-emerald-400":"bg-zinc-600"}`}),e.jsx("span",{className:"text-[10px] text-text-quaternary",children:"live"})]}),children:"Activity"}),p.length===0?e.jsx(j,{text:"Events appear here as the agent runs"}):e.jsx("div",{className:"space-y-1.5",children:p.map(s=>e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-0.5",children:[e.jsx("span",{className:"text-[11px] text-text-primary font-mono truncate flex-1",children:s.label||"—"}),e.jsx("span",{className:"text-[10px] text-text-quaternary shrink-0 ml-2",children:te(s.timestamp)})]}),e.jsx(E,{topic:s.type})]},s.id))})]})]})]})]})}export{me as AgentDetailPage};
|
|
4
|
-
//# sourceMappingURL=AgentDetailPage-bnXR1ezD.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AgentDetailPage-bnXR1ezD.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, Pencil, BookOpen,\n Radio, Clock, Brain, Compass,\n} from 'lucide-react';\nimport { useAgent, useUpdateAgent, useDeleteAgent } from '../../api/agents';\nimport { useSettings } from '../../api/settings';\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=\"text-xs font-semibold uppercase tracking-widest text-accent/80\">{children}</h2>\n </div>\n {actions}\n </div>\n );\n}\n\nfunction EmptyHint({ text }: { text: string }) {\n return <p className=\"text-[11px] text-text-quaternary py-2\">{text}</p>;\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 aiEnabled = !!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=\"text-lg font-medium text-text-primary 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-emerald-400' : agent.status === 'paused' ? 'bg-amber-400' : agent.status === 'error' ? 'bg-red-400' : 'bg-zinc-500';\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=\"text-3xl font-light text-text-primary\">{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 ${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-emerald-400 hover:bg-emerald-600/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-red-400/60 hover:text-red-400 hover:bg-red-600/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-[13px] 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 icon={Compass} color=\"text-rose-400\">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-[9px] text-text-quaternary uppercase tracking-widest mb-1.5\">Goals</p>\n <p className=\"text-[13px] text-text-primary leading-relaxed\">{agent.goals}</p>\n </div>\n )}\n {agent.rules && (\n <div>\n <p className=\"text-[9px] text-text-quaternary uppercase tracking-widest mb-1.5\">Rules</p>\n <p className=\"text-[13px] 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 lg:grid-cols-3 gap-x-14 gap-y-10\">\n\n {/* Col 1: Subscriptions */}\n <div>\n <SectionHeader icon={Radio} color=\"text-cyan-400\">\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-[10px]\">→</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 icon={Clock} color=\"text-amber-400\">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-[10px]\">→</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-[10px]\">→</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 icon={Brain} color=\"text-emerald-400\">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-[10px] 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-cyan-400\"\n actions={\n <div className=\"flex items-center gap-1.5\">\n <span className={`w-1.5 h-1.5 rounded-full transition-colors duration-500 ${pulse ? 'bg-emerald-400' : 'bg-zinc-600'}`} />\n <span className=\"text-[10px] 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-[11px] text-text-primary font-mono truncate flex-1\">{ev.label || '—'}</span>\n <span className=\"text-[10px] 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","feedCounter","useAgentFeed","agentName","events","setEvents","useState","pulse","setPulse","handler","useCallback","event","_a","label","_b","_c","prev","useEventSubscription","NATS_SUBJECT_PREFIX","AgentDetailPage","id","useParams","navigate","useNavigate","settings","useSettings","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","i","CronLabel","Brain","_e","_d","ArrowRight","ev"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{j as e}from"./vendor-query-B2UbickB.js";import{u as h}from"./agents-HMkTc425.js";import{u as f,c as b}from"./index-BFQ2t-p1.js";import{i as j}from"./useEventHooks-M7SaEfel.js";import{u as v}from"./useFilterParams-x-Dg0Vgz.js";import{D as N}from"./DataTable-D9yuBv0w.js";import{S as y}from"./StickyPagination-BWhFSr2d.js";import{F as P,b as S}from"./FilterBar-Ck4K4rzu.js";import{P as k}from"./PageHeader-Bnt2iQQa.js";import{L as w}from"./ListToolbar-D6tQ3ZG2.js";import{m as _}from"./vendor-icons-Dj2F0Jrb.js";import{c as A}from"./vendor-react-CXumBFUA.js";import"./EmptyState-BcsfPq9T.js";const $=[{value:"active",label:"Active"},{value:"inactive",label:"Inactive"},{value:"paused",label:"Paused"},{value:"error",label:"Error"}],z=[{key:"name",label:"Agent",render:t=>e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:`w-1.5 h-1.5 rounded-full shrink-0 ${t.status==="active"?"bg-emerald-400":t.status==="paused"?"bg-amber-400":t.status==="error"?"bg-red-400":"bg-zinc-500"}`}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("span",{className:"text-xs font-medium text-text-primary block",children:t.id}),t.description&&e.jsx("p",{className:"text-[10px] text-text-tertiary truncate",children:t.description})]})]})},{key:"knowledge_domain",label:"Knowledge",render:t=>t.knowledge_domain?e.jsx("span",{className:"text-[10px] font-mono text-text-secondary whitespace-nowrap",children:t.knowledge_domain}):e.jsx("span",{className:"text-text-quaternary",children:"—"}),className:"w-28"},{key:"schedules",label:"Schedules",render:t=>{var o,r;const s=(o=t.behaviors)==null?void 0:o.schedules,a=s!=null&&s.length?s.map(i=>i.cron):(r=t.behaviors)!=null&&r.cron?[t.behaviors.cron]:[];return a.length?e.jsxs("span",{className:"text-[10px] font-mono text-text-secondary whitespace-nowrap",children:[a[0],a.length>1?` +${a.length-1}`:""]}):e.jsx("span",{className:"text-text-quaternary",children:"—"})},className:"w-28"},{key:"subscriptions",label:"Subscriptions",render:t=>{var r;const s=t.subscription_count??0,a=t.sub_topics??[];if(!s)return e.jsx("span",{className:"text-text-quaternary",children:"—"});const o=((r=a[0])==null?void 0:r.replace(/^lt\.events\./,""))??"";return e.jsxs("span",{className:"text-[10px] font-mono text-text-secondary whitespace-nowrap",children:[o,s>1?` +${s-1}`:""]})},className:"w-36"},{key:"last_run_at",label:"Last Run",render:t=>t.last_run_at?e.jsx("span",{className:"whitespace-nowrap",children:e.jsx(b,{date:t.last_run_at})}):e.jsx("span",{className:"text-text-quaternary",children:"—"}),className:"w-32"}];function M(){var u;const t=A(),{data:s}=f(),a=!!((u=s==null?void 0:s.ai)!=null&&u.enabled),o=a?"Agent":"Automation",r=a?"Agents":"Automations";j();const{filters:i,setFilter:p,pagination:n}=v({filters:{status:""}}),{data:l,isLoading:d,refetch:x,isFetching:g}=h({status:i.status||void 0,limit:n.pageSize,offset:n.offset}),m=(l==null?void 0:l.total)??0;return e.jsxs("div",{children:[e.jsx(k,{title:r,docsHash:"#docs:agents.md",actions:e.jsxs("button",{onClick:()=>t("/agents/new"),className:"flex items-center gap-2 px-4 py-2 text-sm rounded-md bg-accent text-text-inverse hover:bg-accent-hover transition-colors",children:[e.jsx(_,{className:"w-4 h-4"})," Create ",o]})}),e.jsx(P,{actions:e.jsx(w,{onRefresh:()=>x(),isFetching:g,apiPath:`/agents?limit=${n.pageSize}&offset=${n.offset}${i.status?`&status=${i.status}`:""}`}),children:e.jsx(S,{label:"Status",value:i.status,onChange:c=>p("status",c),options:$})}),e.jsx(N,{columns:z,data:(l==null?void 0:l.agents)??[],keyFn:c=>c.id,onRowClick:c=>t(`/agents/${c.id}`),isLoading:d,emptyMessage:`No ${r.toLowerCase()} found`}),e.jsx(y,{page:n.page,totalPages:n.totalPages(m),onPageChange:n.setPage,total:m,pageSize:n.pageSize,onPageSizeChange:n.setPageSize})]})}export{M as AgentsPage};
|
|
2
|
-
//# sourceMappingURL=AgentsPage-tJIlrnfM.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AgentsPage-tJIlrnfM.js","sources":["../../src/pages/agents/AgentsPage.tsx"],"sourcesContent":["import { useNavigate } from 'react-router-dom';\nimport { Plus } from 'lucide-react';\nimport { useAgents, type Agent } from '../../api/agents';\nimport { useSettings } from '../../api/settings';\nimport { useAgentEvents } from '../../hooks/useEventHooks';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { DataTable, type Column } from '../../components/common/data/DataTable';\nimport { StickyPagination } from '../../components/common/data/StickyPagination';\nimport { FilterBar, FilterSelect } from '../../components/common/data/FilterBar';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport { DateValue } from '../../components/common/display/DateValue';\n\nconst STATUS_OPTIONS = [\n { value: 'active', label: 'Active' },\n { value: 'inactive', label: 'Inactive' },\n { value: 'paused', label: 'Paused' },\n { value: 'error', label: 'Error' },\n];\n\nconst columns: Column<Agent>[] = [\n {\n key: 'name',\n label: 'Agent',\n render: (row) => (\n <div className=\"flex items-center gap-2\">\n <span className={`w-1.5 h-1.5 rounded-full shrink-0 ${row.status === 'active' ? 'bg-emerald-400' : row.status === 'paused' ? 'bg-amber-400' : row.status === 'error' ? 'bg-red-400' : 'bg-zinc-500'}`} />\n <div className=\"min-w-0\">\n <span className=\"text-xs font-medium text-text-primary block\">{row.id}</span>\n {row.description && <p className=\"text-[10px] text-text-tertiary truncate\">{row.description}</p>}\n </div>\n </div>\n ),\n },\n {\n key: 'knowledge_domain',\n label: 'Knowledge',\n render: (row) => row.knowledge_domain\n ? <span className=\"text-[10px] font-mono text-text-secondary whitespace-nowrap\">{row.knowledge_domain}</span>\n : <span className=\"text-text-quaternary\">—</span>,\n className: 'w-28',\n },\n {\n key: 'schedules',\n label: 'Schedules',\n render: (row) => {\n const scheds = (row.behaviors as any)?.schedules as any[] | undefined;\n const crons = scheds?.length ? scheds.map((s: any) => s.cron) : row.behaviors?.cron ? [row.behaviors.cron] : [];\n if (!crons.length) return <span className=\"text-text-quaternary\">—</span>;\n return <span className=\"text-[10px] font-mono text-text-secondary whitespace-nowrap\">{crons[0]}{crons.length > 1 ? ` +${crons.length - 1}` : ''}</span>;\n },\n className: 'w-28',\n },\n {\n key: 'subscriptions',\n label: 'Subscriptions',\n render: (row) => {\n const count = row.subscription_count ?? 0;\n const topics = row.sub_topics ?? [];\n if (!count) return <span className=\"text-text-quaternary\">—</span>;\n const first = topics[0]?.replace(/^lt\\.events\\./, '') ?? '';\n return <span className=\"text-[10px] font-mono text-text-secondary whitespace-nowrap\">{first}{count > 1 ? ` +${count - 1}` : ''}</span>;\n },\n className: 'w-36',\n },\n {\n key: 'last_run_at',\n label: 'Last Run',\n render: (row) => row.last_run_at\n ? <span className=\"whitespace-nowrap\"><DateValue date={row.last_run_at} /></span>\n : <span className=\"text-text-quaternary\">—</span>,\n className: 'w-32',\n },\n];\n\nexport function AgentsPage() {\n const navigate = useNavigate();\n const { data: settings } = useSettings();\n const aiEnabled = !!settings?.ai?.enabled;\n const label = aiEnabled ? 'Agent' : 'Automation';\n const labelPlural = aiEnabled ? 'Agents' : 'Automations';\n useAgentEvents();\n\n const { filters, setFilter, pagination } = useFilterParams({\n filters: { status: '' },\n });\n\n const { data, isLoading, refetch, isFetching } = useAgents({\n status: filters.status || undefined,\n limit: pagination.pageSize,\n offset: pagination.offset,\n });\n\n const total = data?.total ?? 0;\n\n return (\n <div>\n <PageHeader\n title={labelPlural}\n docsHash=\"#docs:agents.md\"\n actions={\n <button\n onClick={() => navigate('/agents/new')}\n className=\"flex items-center gap-2 px-4 py-2 text-sm rounded-md bg-accent text-text-inverse hover:bg-accent-hover transition-colors\"\n >\n <Plus className=\"w-4 h-4\" /> Create {label}\n </button>\n }\n />\n\n <FilterBar actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={`/agents?limit=${pagination.pageSize}&offset=${pagination.offset}${filters.status ? `&status=${filters.status}` : ''}`}\n />\n }>\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={STATUS_OPTIONS}\n />\n </FilterBar>\n\n <DataTable\n columns={columns}\n data={data?.agents ?? []}\n keyFn={(row) => row.id}\n onRowClick={(row) => navigate(`/agents/${row.id}`)}\n isLoading={isLoading}\n emptyMessage={`No ${labelPlural.toLowerCase()} found`}\n />\n\n <StickyPagination\n page={pagination.page}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n total={total}\n pageSize={pagination.pageSize}\n onPageSizeChange={pagination.setPageSize}\n />\n </div>\n );\n}\n"],"names":["STATUS_OPTIONS","columns","row","jsxs","jsx","scheds","_a","crons","s","_b","count","topics","first","DateValue","AgentsPage","navigate","useNavigate","settings","useSettings","aiEnabled","label","labelPlural","useAgentEvents","filters","setFilter","pagination","useFilterParams","data","isLoading","refetch","isFetching","useAgents","total","PageHeader","Plus","FilterBar","ListToolbar","FilterSelect","v","DataTable","StickyPagination"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{j as e,a as o}from"./vendor-query-B2UbickB.js";import{j as pe,g as Ce,k as fe,l as be,m as ye,n as je,o as ve,p as ke,q as Se,r as Ne,s as Pe,t as Ae}from"./index-BFQ2t-p1.js";import{f as we}from"./useEventHooks-M7SaEfel.js";import{u as q,C as K,a as Ee}from"./CustomDurationPicker-C3zGsESx.js";import{u as Be}from"./roles-BmHbRaPT.js";import{u as Me}from"./useFilterParams-x-Dg0Vgz.js";import{D as Te}from"./DataTable-D9yuBv0w.js";import{S as Le}from"./StickyPagination-BWhFSr2d.js";import{P as ze}from"./PageHeader-Bnt2iQQa.js";import{P as Fe}from"./constants-BHkpVaqx.js";import{M as D}from"./Modal-CSrxpXeM.js";import{u as Ie}from"./users-BpjSNhQe.js";import{E as Oe,a as $e}from"./escalation-columns-BKqSywVA.js";import{R as Re,a as _e}from"./RowActions-Dg-Fsm5O.js";import{L as Ue}from"./ListToolbar-D6tQ3ZG2.js";import{a4 as He}from"./vendor-icons-Dj2F0Jrb.js";import{c as qe}from"./vendor-react-CXumBFUA.js";import"./EmptyState-BcsfPq9T.js";import"./FilterBar-Ck4K4rzu.js";import"./PriorityBadge-DfQY9St9.js";import"./RolePill-DQTT1s9v.js";import"./WorkflowPill-F1oKUzmc.js";import"./TimestampCell-CrCtoBlo.js";import"./escalation-Djk5XKmX.js";const De=t=>t.isPriorityPending||t.isClaimPending||t.isAssignPending||t.isEscalatePending||t.isTriagePending||t.isCancelPending;function Qe(t){const a=De(t),c=q();return e.jsxs("div",{className:"flex flex-wrap items-center gap-3 px-4 py-3 bg-accent/5 border border-accent/20 rounded-lg mb-4",children:[e.jsxs("span",{className:"text-xs font-medium text-accent",children:[t.selectedCount," selected"]}),e.jsx("div",{className:"w-px h-5 bg-surface-border"}),e.jsxs("select",{onChange:s=>{s.target.value&&(t.onSetPriority(parseInt(s.target.value)),s.target.value="")},disabled:a,className:"select text-xs py-1.5",defaultValue:"",children:[e.jsx("option",{value:"",disabled:!0,children:"Priority..."}),Fe.map(s=>e.jsx("option",{value:s.value,children:s.label},s.value))]}),e.jsxs("select",{onChange:s=>{s.target.value&&(t.onClaim(parseInt(s.target.value)),s.target.value="")},disabled:a,className:"select text-xs py-1.5",defaultValue:"",children:[e.jsx("option",{value:"",disabled:!0,children:"Claim for..."}),c.map(s=>e.jsx("option",{value:s.value,children:s.label},s.value))]}),e.jsx("button",{onClick:t.onAssign,disabled:a,className:"btn-secondary text-xs py-1.5",children:t.isAssignPending?"Assigning...":"Assign to..."}),t.availableRoles.length>0&&e.jsxs("select",{onChange:s=>{s.target.value&&(t.onEscalate(s.target.value),s.target.value="")},disabled:a,className:"select text-xs py-1.5",defaultValue:"",children:[e.jsx("option",{value:"",disabled:!0,children:"Escalate to..."}),t.availableRoles.map(s=>e.jsx("option",{value:s,children:s},s))]}),e.jsx("button",{onClick:t.onTriage,disabled:a,className:"btn-secondary text-xs py-1.5",children:t.isTriagePending?"Triaging...":"Triage"}),e.jsx("button",{onClick:t.onCancel,disabled:a,className:"text-xs py-1.5 px-3 rounded-md border border-status-error/40 text-status-error hover:bg-status-error/10 transition-colors disabled:opacity-50",children:t.isCancelPending?"Cancelling...":"Cancel"}),e.jsx("div",{className:"flex-1"}),e.jsx("button",{onClick:t.onClearSelection,className:"text-xs text-text-tertiary hover:text-text-primary transition-colors",children:"Clear"}),a&&e.jsx("span",{className:"text-xs text-text-tertiary animate-pulse",children:"Processing..."})]})}function Ve({open:t,onClose:a,selectedCount:c,selectedRoles:s,onSubmit:m,isPending:x}){const{isSuperAdmin:C}=pe(),u=q(),[i,g]=o.useState("user"),[y,E]=o.useState(null),[j,F]=o.useState(""),[r,h]=o.useState("30"),[R,v]=o.useState(0),_=o.useCallback(l=>v(l),[]),B=!C&&s.length===1?s[0]:void 0,{data:f,isLoading:N}=Ie({role:B,status:"active",limit:200}),M=o.useMemo(()=>{const l=(f==null?void 0:f.users)??[];if(!j.trim())return l;const k=j.toLowerCase();return l.filter(p=>{var P,S;return((P=p.display_name)==null?void 0:P.toLowerCase().includes(k))||((S=p.email)==null?void 0:S.toLowerCase().includes(k))})},[f==null?void 0:f.users,j]),T=()=>{g("user"),E(null),F(""),h("30"),v(0),a()},I=l=>{E(l),g("duration")},L=()=>{g("user")},O=()=>{if(!y)return;const l=r==="custom"?R:parseInt(r);!l||l<=0||m(y.id,l)};return e.jsx(D,{open:t,onClose:T,title:"Assign Escalations",children:e.jsxs("div",{className:"space-y-4",children:[i==="user"&&e.jsxs(e.Fragment,{children:[e.jsxs("p",{className:"text-sm text-text-secondary",children:["Select a user to assign"," ",e.jsx("span",{className:"font-medium text-text-primary",children:c})," ","escalation(s) to:"]}),e.jsx("input",{type:"text",value:j,onChange:l=>F(l.target.value),placeholder:"Search by name or email...",className:"input text-xs w-full",autoFocus:!0}),e.jsxs("div",{className:"max-h-60 overflow-y-auto border border-surface-border rounded-lg divide-y divide-surface-border",children:[N&&e.jsx("p",{className:"text-xs text-text-tertiary p-3",children:"Loading users..."}),!N&&M.length===0&&e.jsx("p",{className:"text-xs text-text-tertiary p-3",children:"No users found"}),M.map(l=>e.jsxs("button",{onClick:()=>I(l),className:"w-full text-left px-3 py-2 hover:bg-surface-hover transition-colors",children:[e.jsx("p",{className:"text-xs font-medium text-text-primary",children:l.display_name||l.external_id}),l.email&&e.jsx("p",{className:"text-[10px] text-text-tertiary",children:l.email})]},l.id))]}),e.jsx("div",{className:"flex justify-end pt-2",children:e.jsx("button",{onClick:T,className:"btn-secondary text-xs",children:"Cancel"})})]}),i==="duration"&&y&&e.jsxs(e.Fragment,{children:[e.jsxs("p",{className:"text-sm text-text-secondary",children:["Assign to"," ",e.jsx("span",{className:"font-medium text-text-primary",children:y.display_name||y.external_id})," ","for:"]}),e.jsxs("select",{value:r,onChange:l=>{h(l.target.value),v(0)},className:"select w-full text-sm",children:[u.map(l=>e.jsx("option",{value:l.value,children:l.label},l.value)),e.jsx("option",{value:"custom",children:"Other..."})]}),r==="custom"&&e.jsx(K,{onChange:_,autoFocus:!0}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsx("button",{onClick:L,className:"btn-secondary text-xs",children:"Back"}),e.jsx("button",{onClick:O,disabled:x,className:"btn-primary text-xs",children:x?"Assigning...":"Assign"})]})]})]})})}function Ge({open:t,onClose:a,selectedCount:c,onSubmit:s,isPending:m}){const[x,C]=o.useState(""),u=()=>{s(x||void 0)};return e.jsx(D,{open:t,onClose:a,title:"Submit for AI Triage",children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("p",{className:"text-sm text-text-secondary",children:["Submit ",e.jsx("span",{className:"font-medium text-text-primary",children:c})," escalation(s) for AI triage? The triage orchestrator will take over resolution."]}),e.jsxs("div",{children:[e.jsxs("label",{className:"text-xs font-medium text-text-secondary block mb-1",children:["Triage hint ",e.jsx("span",{className:"text-text-tertiary",children:"(optional)"})]}),e.jsx("input",{type:"text",value:x,onChange:i=>C(i.target.value),placeholder:"e.g., image_orientation",className:"input text-xs font-mono w-full"}),e.jsx("p",{className:"text-[10px] text-text-tertiary mt-1",children:"Guides the triage workflow on what remediation to apply"})]}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsx("button",{onClick:a,className:"btn-secondary text-xs",children:"Cancel"}),e.jsx("button",{onClick:u,disabled:m,className:"btn-primary text-xs",children:m?"Submitting...":"Submit for Triage"})]})]})})}function w(t,a,c){return s=>{t.mutate(s,{onSuccess:()=>{a(),c==null||c()}})}}function Ye(t){const a=()=>[...t.selectedIds];return{handleSetPriority:i=>{w(t.setPriority,t.clearSelection)({ids:a(),priority:i})},handleBulkClaim:i=>{w(t.bulkClaim,t.clearSelection)({ids:a(),durationMinutes:i})},handleBulkEscalate:i=>{w(t.bulkEscalate,t.clearSelection)({ids:a(),targetRole:i})},handleBulkTriage:i=>{w(t.bulkTriage,t.clearSelection,t.closeTriageModal)({ids:a(),hint:i})},handleBulkAssign:(i,g)=>{w(t.bulkAssign,t.clearSelection,t.closeAssignModal)({ids:a(),targetUserId:i,durationMinutes:g})},handleBulkCancel:()=>{w(t.bulkCancel,t.clearSelection,t.closeCancelModal)({ids:a()})}}}function Je({claimTarget:t,onClose:a,claimDuration:c,onDurationChange:s,claimDurations:m,onCustomClaimChange:x,onClaim:C,isPending:u}){return e.jsx(D,{open:!!t,onClose:a,title:"Claim Escalation",children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("p",{className:"text-sm text-text-secondary",children:["Claim ",e.jsx("span",{className:"font-medium text-text-primary",children:t==null?void 0:t.type})," for:"]}),e.jsxs("select",{value:c,onChange:i=>{s(i.target.value)},className:"select w-full text-sm",children:[m.map(i=>e.jsx("option",{value:i.value,children:i.label},i.value)),e.jsx("option",{value:"custom",children:"Other..."})]}),c==="custom"&&e.jsx(K,{onChange:x,autoFocus:!0}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsx("button",{onClick:a,className:"btn-secondary text-xs",children:"Cancel"}),e.jsx("button",{onClick:C,className:"btn-primary text-xs",disabled:u,children:u?"Claiming...":"Claim"})]})]})})}function yt(){we();const t=qe(),{filters:a,setFilter:c,pagination:s,sort:m,setSort:x}=Me({filters:{role:"",type:"",priority:"",status:"available",search:""}}),C=q(),[u,i]=o.useState(null),[g,y]=o.useState("30"),[E,j]=o.useState(0),F=o.useCallback(n=>j(n),[]),[r,h]=o.useState(new Set),[R,v]=o.useState(!1),[_,B]=o.useState(!1),[f,N]=o.useState(!1),M=Ce(),T=fe(),I=be(),L=ye(),O=je(),l=ve(),k=ke(),{data:p}=Be(),{data:P}=Se();o.useEffect(()=>{h(new Set)},[a.role,a.type,a.priority,a.status,s.page,s.pageSize]);const S=a.status||"",z=S==="available",Q=S==="claimed",U=Q?"pending":S==="resolved"?"resolved":S==="cancelled"?"cancelled":void 0,V={role:a.role||void 0,type:a.type||void 0,priority:a.priority?parseInt(a.priority):void 0,limit:s.pageSize,offset:s.offset,sort_by:m.sort_by||"created_at",order:m.order||"desc"},W=Ne({...V,enabled:z}),X=Pe({status:U,claimed:Q||void 0,...V,enabled:!z}),Z=z?W:X,{data:A,isLoading:ee,error:$,refetch:te,isFetching:se}=Z,G=(A==null?void 0:A.escalations)??[],H=(a.search??"").toLowerCase(),b=H?G.filter(n=>{const d=[n.id,n.type,n.subtype,n.description,n.workflow_id,n.origin_id,n.role];return n.metadata&&d.push(...Object.values(n.metadata).map(String)),d.some(J=>J&&String(J).toLowerCase().includes(H))}):G,Y=H?b.length:(A==null?void 0:A.total)??0,{canBulk:ae}=Ae(),ne=o.useMemo(()=>{const n=new Set;for(const d of b)r.has(d.id)&&n.add(d.role);return[...n]},[b,r]),le=o.useCallback(()=>h(new Set),[]),ie=()=>{if(!u)return;const n=g==="custom"?E:parseInt(g);!n||n<=0||M.mutate({id:u.id,durationMinutes:n},{onSuccess:()=>{i(null),t(`/escalations/detail/${u.id}`)}})},{handleSetPriority:oe,handleBulkClaim:re,handleBulkEscalate:ce,handleBulkTriage:de,handleBulkAssign:ue,handleBulkCancel:me}=Ye({selectedIds:r,clearSelection:le,setPriority:T,bulkClaim:I,bulkEscalate:O,bulkTriage:l,bulkAssign:L,bulkCancel:k,closeTriageModal:()=>v(!1),closeAssignModal:()=>B(!1),closeCancelModal:()=>N(!1)}),xe=n=>{const d=new Set(r);d.has(n)?d.delete(n):d.add(n),h(d)},ge=()=>{r.size===b.length?h(new Set):h(new Set(b.map(n=>n.id)))},he=[ae?{key:"select",label:e.jsx("input",{type:"checkbox",checked:b.length>0&&r.size===b.length,onChange:ge,className:"rounded"}),render:n=>e.jsx("input",{type:"checkbox",checked:r.has(n.id),onChange:d=>{d.stopPropagation(),xe(n.id)},onClick:d=>d.stopPropagation(),className:"rounded"}),className:"w-10"}:{key:"spacer",label:"",render:()=>null,className:"w-10"},...Oe,{key:"actions",label:"",render:n=>e.jsx(Re,{children:e.jsx(_e,{icon:He,title:"Claim escalation",onClick:()=>i(n)})}),className:"w-16 text-right"}];return e.jsxs("div",{children:[e.jsx(ze,{title:"Available Escalations",docsHash:"#docs:dashboard.md:all-escalations"}),e.jsx($e,{filters:a,setFilter:c,roles:(p==null?void 0:p.roles)??[],types:(P==null?void 0:P.types)??[],showStatus:!0,actions:e.jsx(Ue,{onRefresh:()=>te(),isFetching:se,apiPath:`/escalations${z?"/available":""}?limit=${s.pageSize}&offset=${s.offset}${U?`&status=${U}`:""}${a.role?`&role=${a.role}`:""}${a.type?`&type=${a.type}`:""}${a.priority?`&priority=${a.priority}`:""}`})}),r.size>0&&e.jsx(Qe,{selectedCount:r.size,onClearSelection:()=>h(new Set),onSetPriority:oe,onClaim:re,onAssign:()=>B(!0),onEscalate:ce,onTriage:()=>v(!0),onCancel:()=>N(!0),isPriorityPending:T.isPending,isClaimPending:I.isPending,isAssignPending:L.isPending,isEscalatePending:O.isPending,isTriagePending:l.isPending,isCancelPending:k.isPending,availableRoles:(p==null?void 0:p.roles)??[]}),$&&e.jsx("div",{className:"mb-4 px-4 py-3 rounded-md bg-status-error/10 border border-status-error/20 text-xs text-status-error",children:$.message==="Session expired"?"Your session has expired. Please log in again.":`Failed to load escalations: ${$.message}`}),e.jsx(Te,{columns:he,data:b,keyFn:n=>n.id,onRowClick:n=>t(`/escalations/detail/${n.id}`,{state:{from:"/escalations/available"}}),isLoading:ee,emptyMessage:$?"Unable to load data":"No available escalations",sort:m,onSort:x}),e.jsx(Le,{page:s.page,totalPages:s.totalPages(Y),onPageChange:s.setPage,total:Y,pageSize:s.pageSize,onPageSizeChange:s.setPageSize}),e.jsx(Je,{claimTarget:u,onClose:()=>i(null),claimDuration:g,onDurationChange:n=>{y(n),j(0)},claimDurations:C,customClaimMinutes:E,onCustomClaimChange:F,onClaim:ie,isPending:M.isPending}),e.jsx(Ge,{open:R,onClose:()=>v(!1),selectedCount:r.size,onSubmit:de,isPending:l.isPending}),e.jsx(Ve,{open:_,onClose:()=>B(!1),selectedCount:r.size,selectedRoles:ne,onSubmit:ue,isPending:L.isPending}),e.jsx(Ee,{open:f,onClose:()=>N(!1),onConfirm:me,selectedCount:r.size,isPending:k.isPending,error:k.error})]})}export{yt as AvailableEscalationsPage};
|
|
2
|
-
//# sourceMappingURL=AvailableEscalationsPage-B7gEfcw3.js.map
|