@hotmeshio/long-tail 0.8.5 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/api/roles.d.ts +21 -0
- package/build/api/roles.js +50 -0
- package/build/lib/db/schemas/021_role_list_schema.sql +27 -0
- package/build/routes/roles.js +20 -0
- package/build/services/role/index.d.ts +13 -1
- package/build/services/role/index.js +27 -0
- package/build/services/role/sql.d.ts +14 -2
- package/build/services/role/sql.js +51 -3
- package/build/services/role/types.d.ts +27 -0
- package/dashboard/dist/assets/{AdminDashboard-RrSvb8d-.js → AdminDashboard-5bWcBxyS.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-RrSvb8d-.js.map → AdminDashboard-5bWcBxyS.js.map} +1 -1
- package/dashboard/dist/assets/{AgentConfigPage-5RMdI0ku.js → AgentConfigPage-CVg_tFbf.js} +6 -6
- package/dashboard/dist/assets/{AgentConfigPage-5RMdI0ku.js.map → AgentConfigPage-CVg_tFbf.js.map} +1 -1
- package/dashboard/dist/assets/{AgentDetailPage-C_-sIBcr.js → AgentDetailPage-CLlkIoRQ.js} +4 -4
- package/dashboard/dist/assets/{AgentDetailPage-C_-sIBcr.js.map → AgentDetailPage-CLlkIoRQ.js.map} +1 -1
- package/dashboard/dist/assets/{AgentsPage-CxNNtSsf.js → AgentsPage-CjruF_ek.js} +2 -2
- package/dashboard/dist/assets/{AgentsPage-CxNNtSsf.js.map → AgentsPage-CjruF_ek.js.map} +1 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-h6awiuVk.js +2 -0
- package/dashboard/dist/assets/AvailableEscalationsPage-h6awiuVk.js.map +1 -0
- package/dashboard/dist/assets/{BotPicker-BQVz6bye.js → BotPicker-CGEFHHDE.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-BQVz6bye.js.map → BotPicker-CGEFHHDE.js.map} +1 -1
- package/dashboard/dist/assets/{CapabilitiesPage-DlZ8SgO3.js → CapabilitiesPage-BI1tNYun.js} +2 -2
- package/dashboard/dist/assets/{CapabilitiesPage-DlZ8SgO3.js.map → CapabilitiesPage-BI1tNYun.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-lo8Qx4zb.js → CollapsibleSection-B9f52Z2K.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-lo8Qx4zb.js.map → CollapsibleSection-B9f52Z2K.js.map} +1 -1
- package/dashboard/dist/assets/{CopyableId-blg-gZvT.js → CopyableId-uot2mE_g.js} +2 -2
- package/dashboard/dist/assets/{CopyableId-blg-gZvT.js.map → CopyableId-uot2mE_g.js.map} +1 -1
- package/dashboard/dist/assets/CountdownTimer-C71erQ67.js +2 -0
- package/dashboard/dist/assets/CountdownTimer-C71erQ67.js.map +1 -0
- package/dashboard/dist/assets/{CredentialsPage-DJ9DyXsO.js → CredentialsPage-smk5H_mP.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-DJ9DyXsO.js.map → CredentialsPage-smk5H_mP.js.map} +1 -1
- package/dashboard/dist/assets/{CronLabel-o0dbisw1.js → CronLabel-CCJLmkIq.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-o0dbisw1.js.map → CronLabel-CCJLmkIq.js.map} +1 -1
- package/dashboard/dist/assets/CustomDurationPicker-DQ28g5GB.js +2 -0
- package/dashboard/dist/assets/CustomDurationPicker-DQ28g5GB.js.map +1 -0
- package/dashboard/dist/assets/DataTable-Byn3oyT9.js +2 -0
- package/dashboard/dist/assets/DataTable-Byn3oyT9.js.map +1 -0
- package/dashboard/dist/assets/{DropZone-SgiK1WOl.js → DropZone-C_Mc4UrO.js} +2 -2
- package/dashboard/dist/assets/{DropZone-SgiK1WOl.js.map → DropZone-C_Mc4UrO.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-N22STQcg.js → ElapsedCell-Cw1uvJKx.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-N22STQcg.js.map → ElapsedCell-Cw1uvJKx.js.map} +1 -1
- package/dashboard/dist/assets/EscalationListSchemaPage-3v2tiCnq.js +20 -0
- package/dashboard/dist/assets/EscalationListSchemaPage-3v2tiCnq.js.map +1 -0
- package/dashboard/dist/assets/{EscalationSchemaPage-Zsmewko2.js → EscalationSchemaPage-DIq2pMED.js} +2 -2
- package/dashboard/dist/assets/{EscalationSchemaPage-Zsmewko2.js.map → EscalationSchemaPage-DIq2pMED.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-CE2p70Ct.js → EscalationsOverview-BqOZ1v8w.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-CE2p70Ct.js.map → EscalationsOverview-BqOZ1v8w.js.map} +1 -1
- package/dashboard/dist/assets/EventTable-CyfHfOWj.js +2 -0
- package/dashboard/dist/assets/EventTable-CyfHfOWj.js.map +1 -0
- package/dashboard/dist/assets/{FilterBar-B4Mk2PvT.js → FilterBar-DDIn8TOs.js} +2 -2
- package/dashboard/dist/assets/{FilterBar-B4Mk2PvT.js.map → FilterBar-DDIn8TOs.js.map} +1 -1
- package/dashboard/dist/assets/{GraphInvokePage-DywWVSdj.js → GraphInvokePage-DbNUaWhH.js} +2 -2
- package/dashboard/dist/assets/{GraphInvokePage-DywWVSdj.js.map → GraphInvokePage-DbNUaWhH.js.map} +1 -1
- package/dashboard/dist/assets/{HomePage-CxtBiULd.js → HomePage-Cj9sLt4Z.js} +2 -2
- package/dashboard/dist/assets/{HomePage-CxtBiULd.js.map → HomePage-Cj9sLt4Z.js.map} +1 -1
- package/dashboard/dist/assets/{ListToolbar-Ok2O0wmC.js → ListToolbar-D7PoQOZC.js} +2 -2
- package/dashboard/dist/assets/{ListToolbar-Ok2O0wmC.js.map → ListToolbar-D7PoQOZC.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-CTCYZXIp.js → McpOverview-D9g1iJyn.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-CTCYZXIp.js.map → McpOverview-D9g1iJyn.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryDetailPage-BOaXf0bZ.js → McpQueryDetailPage-DwS1pXdT.js} +2 -2
- package/dashboard/dist/assets/{McpQueryDetailPage-BOaXf0bZ.js.map → McpQueryDetailPage-DwS1pXdT.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryPage-BbYojoHu.js → McpQueryPage-DZQ1z6-H.js} +2 -2
- package/dashboard/dist/assets/{McpQueryPage-BbYojoHu.js.map → McpQueryPage-DZQ1z6-H.js.map} +1 -1
- package/dashboard/dist/assets/McpRunDetailPage-Bx6w39lr.js +2 -0
- package/dashboard/dist/assets/{McpRunDetailPage-CXGCVmPq.js.map → McpRunDetailPage-Bx6w39lr.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunsPage-Df1GqxUg.js → McpRunsPage-C-oS_tTh.js} +2 -2
- package/dashboard/dist/assets/{McpRunsPage-Df1GqxUg.js.map → McpRunsPage-C-oS_tTh.js.map} +1 -1
- package/dashboard/dist/assets/{NamespacePill-SErKwgkb.js → NamespacePill-DhgC3EUO.js} +2 -2
- package/dashboard/dist/assets/{NamespacePill-SErKwgkb.js.map → NamespacePill-DhgC3EUO.js.map} +1 -1
- package/dashboard/dist/assets/OperationsPage-CQzX6jM1.js +2 -0
- package/dashboard/dist/assets/OperationsPage-CQzX6jM1.js.map +1 -0
- package/dashboard/dist/assets/OperatorDashboard-Cqf87ojd.js +2 -0
- package/dashboard/dist/assets/{OperatorDashboard-DIR7XDeD.js.map → OperatorDashboard-Cqf87ojd.js.map} +1 -1
- package/dashboard/dist/assets/PageHeader-sGNTmSXX.js +2 -0
- package/dashboard/dist/assets/PageHeader-sGNTmSXX.js.map +1 -0
- package/dashboard/dist/assets/{PageHeaderWithStats-W3akV6nB.js → PageHeaderWithStats-87STTAJX.js} +2 -2
- package/dashboard/dist/assets/{PageHeaderWithStats-W3akV6nB.js.map → PageHeaderWithStats-87STTAJX.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessDetailPage-BuSi654J.js → ProcessDetailPage-CplnDXkz.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-BuSi654J.js.map → ProcessDetailPage-CplnDXkz.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessesListPage-Dhik7XpW.js → ProcessesListPage-DFOJC27f.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-Dhik7XpW.js.map → ProcessesListPage-DFOJC27f.js.map} +1 -1
- package/dashboard/dist/assets/RoleDetailPage-VrWOaPlg.js +8 -0
- package/dashboard/dist/assets/RoleDetailPage-VrWOaPlg.js.map +1 -0
- package/dashboard/dist/assets/{RolePill-DHWixsQR.js → RolePill-C91qbDOW.js} +2 -2
- package/dashboard/dist/assets/{RolePill-DHWixsQR.js.map → RolePill-C91qbDOW.js.map} +1 -1
- package/dashboard/dist/assets/{RolesPage-BRicD5mx.js → RolesPage-DdI1rVAP.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-BRicD5mx.js.map → RolesPage-DdI1rVAP.js.map} +1 -1
- package/dashboard/dist/assets/{RunAsSelector-DipyBf_T.js → RunAsSelector-C6EozzKV.js} +2 -2
- package/dashboard/dist/assets/{RunAsSelector-DipyBf_T.js.map → RunAsSelector-C6EozzKV.js.map} +1 -1
- package/dashboard/dist/assets/SlidePanel-BpWveV1T.js +2 -0
- package/dashboard/dist/assets/SlidePanel-BpWveV1T.js.map +1 -0
- package/dashboard/dist/assets/{StatusBadge-DZ9137bI.js → StatusBadge-CEQMRmSQ.js} +2 -2
- package/dashboard/dist/assets/StatusBadge-CEQMRmSQ.js.map +1 -0
- package/dashboard/dist/assets/{StickyPagination-CD4W450h.js → StickyPagination-BEgkYJ0-.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-CD4W450h.js.map → StickyPagination-BEgkYJ0-.js.map} +1 -1
- package/dashboard/dist/assets/{StreamMessageDetail-BbDdWDUY.js → StreamMessageDetail-DWVPtzj7.js} +2 -2
- package/dashboard/dist/assets/{StreamMessageDetail-BbDdWDUY.js.map → StreamMessageDetail-DWVPtzj7.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-Bktv2vi5.js → SwimlaneTimeline-4NrDJNYc.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-Bktv2vi5.js.map → SwimlaneTimeline-4NrDJNYc.js.map} +1 -1
- package/dashboard/dist/assets/{TagInput-CGGC3DTR.js → TagInput-Csm36_pS.js} +2 -2
- package/dashboard/dist/assets/{TagInput-CGGC3DTR.js.map → TagInput-Csm36_pS.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-pSU3xuG9.js → TaskDetailPage-BvdaAUtF.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-pSU3xuG9.js.map → TaskDetailPage-BvdaAUtF.js.map} +1 -1
- package/dashboard/dist/assets/{TaskQueuePill-D6omQJNY.js → TaskQueuePill-5XdNaqwM.js} +2 -2
- package/dashboard/dist/assets/{TaskQueuePill-D6omQJNY.js.map → TaskQueuePill-5XdNaqwM.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-M6ok-Nfd.js → TasksListPage-BxA161LH.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-M6ok-Nfd.js.map → TasksListPage-BxA161LH.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-DVWhRNbi.js → TimeAgo-ChwJ4fjZ.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-DVWhRNbi.js.map → TimeAgo-ChwJ4fjZ.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-rG7pmIkW.js → TimestampCell-C7KzmvyC.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-rG7pmIkW.js.map → TimestampCell-C7KzmvyC.js.map} +1 -1
- package/dashboard/dist/assets/{ToolPill-BW0iRwZu.js → ToolPill-CAwj7EPw.js} +2 -2
- package/dashboard/dist/assets/{ToolPill-BW0iRwZu.js.map → ToolPill-CAwj7EPw.js.map} +1 -1
- package/dashboard/dist/assets/{ToolTestPanel-CLcMA8OE.js → ToolTestPanel-ISkuXtkT.js} +2 -2
- package/dashboard/dist/assets/{ToolTestPanel-CLcMA8OE.js.map → ToolTestPanel-ISkuXtkT.js.map} +1 -1
- package/dashboard/dist/assets/{TopicDetailPage-C9gvoWYu.js → TopicDetailPage-D8uZ8Wbs.js} +3 -3
- package/dashboard/dist/assets/{TopicDetailPage-C9gvoWYu.js.map → TopicDetailPage-D8uZ8Wbs.js.map} +1 -1
- package/dashboard/dist/assets/TopicsPage-rj88vA_1.js +2 -0
- package/dashboard/dist/assets/{TopicsPage-CIGi3TdT.js.map → TopicsPage-rj88vA_1.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-CifbOahk.js → UserName-D03Lh6Aj.js} +2 -2
- package/dashboard/dist/assets/{UserName-CifbOahk.js.map → UserName-D03Lh6Aj.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowExecutionPage-LD9WzPee.js +2 -0
- package/dashboard/dist/assets/WorkflowExecutionPage-LD9WzPee.js.map +1 -0
- package/dashboard/dist/assets/{WorkflowPill-BtNBSplz.js → WorkflowPill-fodIWnT3.js} +2 -2
- package/dashboard/dist/assets/{WorkflowPill-BtNBSplz.js.map → WorkflowPill-fodIWnT3.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsDashboard-CSYrYQsO.js → WorkflowsDashboard-DH0jitAb.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsDashboard-CSYrYQsO.js.map → WorkflowsDashboard-DH0jitAb.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsOverview-CaXWYZuw.js → WorkflowsOverview-D6BVaH9e.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-CaXWYZuw.js.map → WorkflowsOverview-D6BVaH9e.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-CRBXahFJ.js → YamlWorkflowDetailPage-D_CfNEqW.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-CRBXahFJ.js.map → YamlWorkflowDetailPage-D_CfNEqW.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowsPage-D5zc8Lta.js → YamlWorkflowsPage-BMJgtcAq.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowsPage-D5zc8Lta.js.map → YamlWorkflowsPage-BMJgtcAq.js.map} +1 -1
- package/dashboard/dist/assets/{agents-D7vYXeLj.js → agents-Ci0tZDO3.js} +2 -2
- package/dashboard/dist/assets/{agents-D7vYXeLj.js.map → agents-Ci0tZDO3.js.map} +1 -1
- package/dashboard/dist/assets/{bots-CKaYN2fL.js → bots-DZyt1oO4.js} +2 -2
- package/dashboard/dist/assets/{bots-CKaYN2fL.js.map → bots-DZyt1oO4.js.map} +1 -1
- package/dashboard/dist/assets/{capabilities-BknM6oFm.js → capabilities-DzVKeWyC.js} +2 -2
- package/dashboard/dist/assets/{capabilities-BknM6oFm.js.map → capabilities-DzVKeWyC.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-BodNGCr-.js → controlplane-CQzrn-rD.js} +2 -2
- package/dashboard/dist/assets/{controlplane-BodNGCr-.js.map → controlplane-CQzrn-rD.js.map} +1 -1
- package/dashboard/dist/assets/escalation-columns-s29Q4mrF.js +2 -0
- package/dashboard/dist/assets/{escalation-columns-CcbLKRI4.js.map → escalation-columns-s29Q4mrF.js.map} +1 -1
- package/dashboard/dist/assets/{index-Gt2Rebs9.js → index-3SrgIA7w.js} +2 -2
- package/dashboard/dist/assets/{index-Gt2Rebs9.js.map → index-3SrgIA7w.js.map} +1 -1
- package/dashboard/dist/assets/{index-BH67e1Ah.js → index-B2dB90aC.js} +2 -2
- package/dashboard/dist/assets/{index-BH67e1Ah.js.map → index-B2dB90aC.js.map} +1 -1
- package/dashboard/dist/assets/index-BSOcWfeR.js +5 -0
- package/dashboard/dist/assets/index-BSOcWfeR.js.map +1 -0
- package/dashboard/dist/assets/{index-B-LQ8fsJ.js → index-BWy4UvaT.js} +2 -2
- package/dashboard/dist/assets/{index-B-LQ8fsJ.js.map → index-BWy4UvaT.js.map} +1 -1
- package/dashboard/dist/assets/{index-C3QKGY5C.js → index-BqKxJ2fB.js} +2 -2
- package/dashboard/dist/assets/{index-C3QKGY5C.js.map → index-BqKxJ2fB.js.map} +1 -1
- package/dashboard/dist/assets/{index-B_aFcGv9.js → index-C9moIiIq.js} +5 -5
- package/dashboard/dist/assets/index-C9moIiIq.js.map +1 -0
- package/dashboard/dist/assets/{index-D7NHjvA4.js → index-CcKXMU-s.js} +2 -2
- package/dashboard/dist/assets/{index-D7NHjvA4.js.map → index-CcKXMU-s.js.map} +1 -1
- package/dashboard/dist/assets/index-DIPe82gq.css +1 -0
- package/dashboard/dist/assets/{index-DHhz71yv.js → index-DOHGHMP7.js} +2 -2
- package/dashboard/dist/assets/{index-DHhz71yv.js.map → index-DOHGHMP7.js.map} +1 -1
- package/dashboard/dist/assets/{index-CdN-Z8-r.js → index-DTn4XzYN.js} +2 -2
- package/dashboard/dist/assets/{index-CdN-Z8-r.js.map → index-DTn4XzYN.js.map} +1 -1
- package/dashboard/dist/assets/index-Dv8mzG9B.js +2 -0
- package/dashboard/dist/assets/index-Dv8mzG9B.js.map +1 -0
- package/dashboard/dist/assets/{index-CV8soXIM.js → index-LwodswlU.js} +2 -2
- package/dashboard/dist/assets/{index-CV8soXIM.js.map → index-LwodswlU.js.map} +1 -1
- package/dashboard/dist/assets/{index-_gh2K9DU.js → index-kPipMHZx.js} +2 -2
- package/dashboard/dist/assets/{index-_gh2K9DU.js.map → index-kPipMHZx.js.map} +1 -1
- package/dashboard/dist/assets/{index-Bwofyfi8.js → index-sdc9ecdW.js} +2 -2
- package/dashboard/dist/assets/{index-Bwofyfi8.js.map → index-sdc9ecdW.js.map} +1 -1
- package/dashboard/dist/assets/{knowledge-CE6gjN3G.js → knowledge-fi5z5YLq.js} +2 -2
- package/dashboard/dist/assets/{knowledge-CE6gjN3G.js.map → knowledge-fi5z5YLq.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-B4F-T-7R.js → mcp-CH8Tj9Pw.js} +2 -2
- package/dashboard/dist/assets/{mcp-B4F-T-7R.js.map → mcp-CH8Tj9Pw.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-CYOarL1K.js → mcp-query-6alwNh7K.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-CYOarL1K.js.map → mcp-query-6alwNh7K.js.map} +1 -1
- package/dashboard/dist/assets/{pipelines-B4gB9qMx.js → pipelines-Dqh9PLUw.js} +2 -2
- package/dashboard/dist/assets/{pipelines-B4gB9qMx.js.map → pipelines-Dqh9PLUw.js.map} +1 -1
- package/dashboard/dist/assets/roles-dJKBZUBh.js +2 -0
- package/dashboard/dist/assets/roles-dJKBZUBh.js.map +1 -0
- package/dashboard/dist/assets/{tasks-GG8c_U9w.js → tasks-BYz490un.js} +2 -2
- package/dashboard/dist/assets/{tasks-GG8c_U9w.js.map → tasks-BYz490un.js.map} +1 -1
- package/dashboard/dist/assets/{topics-C7-6oOgA.js → topics-Dt975EWi.js} +2 -2
- package/dashboard/dist/assets/{topics-C7-6oOgA.js.map → topics-Dt975EWi.js.map} +1 -1
- package/dashboard/dist/assets/{useEventHooks-82IiMmOc.js → useEventHooks-ZT6RV2Gj.js} +2 -2
- package/dashboard/dist/assets/{useEventHooks-82IiMmOc.js.map → useEventHooks-ZT6RV2Gj.js.map} +1 -1
- package/dashboard/dist/assets/{useNamespace-DQEqD2LA.js → useNamespace-B_G1iE9i.js} +2 -2
- package/dashboard/dist/assets/{useNamespace-DQEqD2LA.js.map → useNamespace-B_G1iE9i.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-Bm0-ewLx.js → useYamlActivityEvents-DGkvIadL.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-Bm0-ewLx.js.map → useYamlActivityEvents-DGkvIadL.js.map} +1 -1
- package/dashboard/dist/assets/{users-DHx2ium7.js → users-C2jopvM1.js} +2 -2
- package/dashboard/dist/assets/{users-DHx2ium7.js.map → users-C2jopvM1.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-DOIDKgo6.js → vendor-icons-BXhWQC7l.js} +161 -121
- package/dashboard/dist/assets/vendor-icons-BXhWQC7l.js.map +1 -0
- package/dashboard/dist/assets/{workflows-qIbkeQ_5.js → workflows-By8Wgvig.js} +2 -2
- package/dashboard/dist/assets/{workflows-qIbkeQ_5.js.map → workflows-By8Wgvig.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-FibyeHpo.js → yaml-workflows-Cq_vp41d.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-FibyeHpo.js.map → yaml-workflows-Cq_vp41d.js.map} +1 -1
- package/dashboard/dist/index.html +3 -3
- package/docs/dashboard.md +15 -2
- package/docs/hitl-guide.md +132 -22
- package/package.json +2 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-BcbhA6NE.js +0 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-BcbhA6NE.js.map +0 -1
- package/dashboard/dist/assets/CustomDurationPicker-CGiwKSVJ.js +0 -2
- package/dashboard/dist/assets/CustomDurationPicker-CGiwKSVJ.js.map +0 -1
- package/dashboard/dist/assets/DataTable-ZWgVQg7F.js +0 -2
- package/dashboard/dist/assets/DataTable-ZWgVQg7F.js.map +0 -1
- package/dashboard/dist/assets/EventTable-B3Gj7Ayg.js +0 -2
- package/dashboard/dist/assets/EventTable-B3Gj7Ayg.js.map +0 -1
- package/dashboard/dist/assets/McpRunDetailPage-CXGCVmPq.js +0 -2
- package/dashboard/dist/assets/OperationsPage-DgZYi-BC.js +0 -2
- package/dashboard/dist/assets/OperationsPage-DgZYi-BC.js.map +0 -1
- package/dashboard/dist/assets/OperatorDashboard-DIR7XDeD.js +0 -2
- package/dashboard/dist/assets/PageHeader-DJo7yMUR.js +0 -2
- package/dashboard/dist/assets/PageHeader-DJo7yMUR.js.map +0 -1
- package/dashboard/dist/assets/RoleDetailPage-BfzqQxMU.js +0 -8
- package/dashboard/dist/assets/RoleDetailPage-BfzqQxMU.js.map +0 -1
- package/dashboard/dist/assets/StatusBadge-DZ9137bI.js.map +0 -1
- package/dashboard/dist/assets/TopicsPage-CIGi3TdT.js +0 -2
- package/dashboard/dist/assets/WorkflowExecutionPage-BR0oVx_p.js +0 -2
- package/dashboard/dist/assets/WorkflowExecutionPage-BR0oVx_p.js.map +0 -1
- package/dashboard/dist/assets/escalation-CH_XK2XM.js +0 -2
- package/dashboard/dist/assets/escalation-CH_XK2XM.js.map +0 -1
- package/dashboard/dist/assets/escalation-columns-CcbLKRI4.js +0 -2
- package/dashboard/dist/assets/index--xNp5rx6.css +0 -1
- package/dashboard/dist/assets/index-B_aFcGv9.js.map +0 -1
- package/dashboard/dist/assets/index-CJpywoA8.js +0 -2
- package/dashboard/dist/assets/index-CJpywoA8.js.map +0 -1
- package/dashboard/dist/assets/index-IIq5Tkqs.js +0 -6
- package/dashboard/dist/assets/index-IIq5Tkqs.js.map +0 -1
- package/dashboard/dist/assets/roles-LZf98ePg.js +0 -2
- package/dashboard/dist/assets/roles-LZf98ePg.js.map +0 -1
- package/dashboard/dist/assets/useCollapsedSections-BU5HULGs.js +0 -2
- package/dashboard/dist/assets/useCollapsedSections-BU5HULGs.js.map +0 -1
- package/dashboard/dist/assets/vendor-icons-DOIDKgo6.js.map +0 -1
package/build/api/roles.d.ts
CHANGED
|
@@ -86,6 +86,8 @@ export declare function updateRole(input: {
|
|
|
86
86
|
/** The escalation resolve FORM schema (the JIT UI). Fields may carry x-lt-bind. */
|
|
87
87
|
form_schema?: Record<string, any> | null;
|
|
88
88
|
metadata_schema?: Record<string, any> | null;
|
|
89
|
+
/** The escalation LIST schema — rich formatting for this role's list page. */
|
|
90
|
+
list_schema?: Record<string, any> | null;
|
|
89
91
|
properties?: Record<string, any> | null;
|
|
90
92
|
ops_visible?: boolean;
|
|
91
93
|
parent_role?: string | null;
|
|
@@ -129,6 +131,25 @@ export declare function getRoleSchema(input: {
|
|
|
129
131
|
export declare function listRoleSchemaVersions(input: {
|
|
130
132
|
role: string;
|
|
131
133
|
}): Promise<LTApiResult>;
|
|
134
|
+
/**
|
|
135
|
+
* Fetch a role's LIST schema (independent version lineage from the form schema).
|
|
136
|
+
* With `version`, returns that immutable snapshot — a missing version is a 404.
|
|
137
|
+
* Without `version`, returns the live (latest) list schema with its version.
|
|
138
|
+
*
|
|
139
|
+
* @returns `{ status: 200, data: RoleListSchemaVersion }` on success
|
|
140
|
+
*/
|
|
141
|
+
export declare function getRoleListSchema(input: {
|
|
142
|
+
role: string;
|
|
143
|
+
version?: number;
|
|
144
|
+
}): Promise<LTApiResult>;
|
|
145
|
+
/**
|
|
146
|
+
* List a role's LIST schema version history, newest first.
|
|
147
|
+
*
|
|
148
|
+
* @returns `{ status: 200, data: { versions: RoleListSchemaVersionSummary[] } }`
|
|
149
|
+
*/
|
|
150
|
+
export declare function listRoleListSchemaVersions(input: {
|
|
151
|
+
role: string;
|
|
152
|
+
}): Promise<LTApiResult>;
|
|
132
153
|
/**
|
|
133
154
|
* Delete a role from the system. Requires admin privileges.
|
|
134
155
|
*
|
package/build/api/roles.js
CHANGED
|
@@ -44,6 +44,8 @@ exports.replaceEscalationTargets = replaceEscalationTargets;
|
|
|
44
44
|
exports.updateRole = updateRole;
|
|
45
45
|
exports.getRoleSchema = getRoleSchema;
|
|
46
46
|
exports.listRoleSchemaVersions = listRoleSchemaVersions;
|
|
47
|
+
exports.getRoleListSchema = getRoleListSchema;
|
|
48
|
+
exports.listRoleListSchemaVersions = listRoleListSchemaVersions;
|
|
47
49
|
exports.deleteRole = deleteRole;
|
|
48
50
|
const roleService = __importStar(require("../services/role"));
|
|
49
51
|
const facet_sql_1 = require("../services/escalation/facet-sql");
|
|
@@ -244,6 +246,7 @@ async function updateRole(input) {
|
|
|
244
246
|
description: input.description,
|
|
245
247
|
form_schema: input.form_schema,
|
|
246
248
|
metadata_schema: input.metadata_schema,
|
|
249
|
+
list_schema: input.list_schema,
|
|
247
250
|
properties: input.properties,
|
|
248
251
|
ops_visible: input.ops_visible,
|
|
249
252
|
parent_role: input.parent_role,
|
|
@@ -320,6 +323,53 @@ async function listRoleSchemaVersions(input) {
|
|
|
320
323
|
return { status: 500, error: err.message };
|
|
321
324
|
}
|
|
322
325
|
}
|
|
326
|
+
/**
|
|
327
|
+
* Fetch a role's LIST schema (independent version lineage from the form schema).
|
|
328
|
+
* With `version`, returns that immutable snapshot — a missing version is a 404.
|
|
329
|
+
* Without `version`, returns the live (latest) list schema with its version.
|
|
330
|
+
*
|
|
331
|
+
* @returns `{ status: 200, data: RoleListSchemaVersion }` on success
|
|
332
|
+
*/
|
|
333
|
+
async function getRoleListSchema(input) {
|
|
334
|
+
try {
|
|
335
|
+
if (!input.role) {
|
|
336
|
+
return { status: 400, error: 'role is required' };
|
|
337
|
+
}
|
|
338
|
+
if (input.version !== undefined && (!Number.isInteger(input.version) || input.version < 1)) {
|
|
339
|
+
return { status: 400, error: 'version must be a positive integer' };
|
|
340
|
+
}
|
|
341
|
+
const schema = await roleService.getRoleListSchema(input.role, input.version);
|
|
342
|
+
if (!schema) {
|
|
343
|
+
return {
|
|
344
|
+
status: 404,
|
|
345
|
+
error: input.version !== undefined
|
|
346
|
+
? `List schema version ${input.version} not found for role '${input.role}'`
|
|
347
|
+
: `Role '${input.role}' not found`,
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
return { status: 200, data: schema };
|
|
351
|
+
}
|
|
352
|
+
catch (err) {
|
|
353
|
+
return { status: 500, error: err.message };
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* List a role's LIST schema version history, newest first.
|
|
358
|
+
*
|
|
359
|
+
* @returns `{ status: 200, data: { versions: RoleListSchemaVersionSummary[] } }`
|
|
360
|
+
*/
|
|
361
|
+
async function listRoleListSchemaVersions(input) {
|
|
362
|
+
try {
|
|
363
|
+
if (!input.role) {
|
|
364
|
+
return { status: 400, error: 'role is required' };
|
|
365
|
+
}
|
|
366
|
+
const versions = await roleService.listRoleListSchemaVersions(input.role);
|
|
367
|
+
return { status: 200, data: { versions } };
|
|
368
|
+
}
|
|
369
|
+
catch (err) {
|
|
370
|
+
return { status: 500, error: err.message };
|
|
371
|
+
}
|
|
372
|
+
}
|
|
323
373
|
/**
|
|
324
374
|
* Delete a role from the system. Requires admin privileges.
|
|
325
375
|
*
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
-- Migration 021: Role escalations LIST schema
|
|
2
|
+
--
|
|
3
|
+
-- list_schema is the list-page analog of form_schema: it richly formats the
|
|
4
|
+
-- escalation LIST page when the list is scoped to exactly one role that owns a
|
|
5
|
+
-- list_schema (opt-in — absent leaves the engineer table unchanged). Unlike
|
|
6
|
+
-- form_schema it is NOT pinned per-escalation; the list always renders the
|
|
7
|
+
-- role's latest.
|
|
8
|
+
--
|
|
9
|
+
-- It versions INDEPENDENTLY of form_schema / metadata_schema: its own snapshot
|
|
10
|
+
-- table (lt_role_list_schemas) and its own counter (current_list_schema_version),
|
|
11
|
+
-- so editing the list view never advances the resolve form's version. The write
|
|
12
|
+
-- rides the same atomic UPDATE_ROLE_METADATA statement (services/role/sql.ts),
|
|
13
|
+
-- which bumps current_list_schema_version and appends a snapshot only when the
|
|
14
|
+
-- provided list_schema actually differs.
|
|
15
|
+
|
|
16
|
+
ALTER TABLE lt_roles
|
|
17
|
+
ADD COLUMN IF NOT EXISTS list_schema JSONB,
|
|
18
|
+
ADD COLUMN IF NOT EXISTS current_list_schema_version INTEGER;
|
|
19
|
+
|
|
20
|
+
CREATE TABLE IF NOT EXISTS lt_role_list_schemas (
|
|
21
|
+
role TEXT NOT NULL REFERENCES lt_roles(role) ON DELETE CASCADE,
|
|
22
|
+
version INTEGER NOT NULL,
|
|
23
|
+
list_schema JSONB,
|
|
24
|
+
change_summary TEXT,
|
|
25
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
26
|
+
PRIMARY KEY (role, version)
|
|
27
|
+
);
|
package/build/routes/roles.js
CHANGED
|
@@ -123,6 +123,26 @@ router.get('/:role/schema/versions', async (req, res) => {
|
|
|
123
123
|
const result = await api.listRoleSchemaVersions({ role: req.params.role });
|
|
124
124
|
res.status(result.status).json(result.data ?? { error: result.error });
|
|
125
125
|
});
|
|
126
|
+
/**
|
|
127
|
+
* GET /api/roles/:role/list-schema
|
|
128
|
+
* Fetch the role's LIST schema (rich list-page formatting). `?version=N` pins a
|
|
129
|
+
* snapshot; omitted, the live (latest) list schema is returned with its version.
|
|
130
|
+
* Versions independently from the resolve form schema.
|
|
131
|
+
*/
|
|
132
|
+
router.get('/:role/list-schema', async (req, res) => {
|
|
133
|
+
const versionParam = req.query.version;
|
|
134
|
+
const version = versionParam !== undefined ? Number(versionParam) : undefined;
|
|
135
|
+
const result = await api.getRoleListSchema({ role: req.params.role, version });
|
|
136
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
137
|
+
});
|
|
138
|
+
/**
|
|
139
|
+
* GET /api/roles/:role/list-schema/versions
|
|
140
|
+
* List the role's LIST schema version history (newest first).
|
|
141
|
+
*/
|
|
142
|
+
router.get('/:role/list-schema/versions', async (req, res) => {
|
|
143
|
+
const result = await api.listRoleListSchemaVersions({ role: req.params.role });
|
|
144
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
145
|
+
});
|
|
126
146
|
/**
|
|
127
147
|
* GET /api/roles/:role/escalation-targets
|
|
128
148
|
* Get allowed escalation targets for a specific role.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { EscalationChain, RoleDetail, RoleSchemaVersion, RoleSchemaVersionSummary, UpdateRoleInput } from './types';
|
|
1
|
+
import type { EscalationChain, RoleDetail, RoleSchemaVersion, RoleSchemaVersionSummary, RoleListSchemaVersion, RoleListSchemaVersionSummary, UpdateRoleInput } from './types';
|
|
2
2
|
/**
|
|
3
3
|
* Get the roles a given source role can escalate to.
|
|
4
4
|
*/
|
|
@@ -60,6 +60,18 @@ export declare function listRoleSchemaVersions(role: string): Promise<RoleSchema
|
|
|
60
60
|
* Returns null when the role (or the requested version) does not exist.
|
|
61
61
|
*/
|
|
62
62
|
export declare function getRoleSchema(role: string, version?: number): Promise<RoleSchemaVersion | null>;
|
|
63
|
+
/**
|
|
64
|
+
* List the list-schema version history for a role (newest first). The schema is
|
|
65
|
+
* elided — presence flag only; fetch a full snapshot via getRoleListSchema.
|
|
66
|
+
*/
|
|
67
|
+
export declare function listRoleListSchemaVersions(role: string): Promise<RoleListSchemaVersionSummary[]>;
|
|
68
|
+
/**
|
|
69
|
+
* Fetch a role's list schema. With a version, reads the immutable snapshot from
|
|
70
|
+
* lt_role_list_schemas; without one, the live (latest) column — a role that has
|
|
71
|
+
* never versioned its list schema still answers with version null. Returns null
|
|
72
|
+
* when the role (or the requested version) does not exist.
|
|
73
|
+
*/
|
|
74
|
+
export declare function getRoleListSchema(role: string, version?: number): Promise<RoleListSchemaVersion | null>;
|
|
63
75
|
/**
|
|
64
76
|
* Fetch a role's live form_schema — the escalation form the dashboard renders.
|
|
65
77
|
*/
|
|
@@ -13,6 +13,8 @@ exports.updateRoleMetadata = updateRoleMetadata;
|
|
|
13
13
|
exports.getRoleUpstreams = getRoleUpstreams;
|
|
14
14
|
exports.listRoleSchemaVersions = listRoleSchemaVersions;
|
|
15
15
|
exports.getRoleSchema = getRoleSchema;
|
|
16
|
+
exports.listRoleListSchemaVersions = listRoleListSchemaVersions;
|
|
17
|
+
exports.getRoleListSchema = getRoleListSchema;
|
|
16
18
|
exports.getRoleFormSchema = getRoleFormSchema;
|
|
17
19
|
exports.getRoleMetadataSchema = getRoleMetadataSchema;
|
|
18
20
|
exports.deleteRole = deleteRole;
|
|
@@ -143,6 +145,7 @@ async function updateRoleMetadata(role, input) {
|
|
|
143
145
|
provided('priority_facet'), input.priority_facet ?? null,
|
|
144
146
|
input.change_summary ?? null,
|
|
145
147
|
provided('upstream_roles'), upstreams,
|
|
148
|
+
provided('list_schema'), input.list_schema != null ? JSON.stringify(input.list_schema) : null,
|
|
146
149
|
]);
|
|
147
150
|
if (!rows[0])
|
|
148
151
|
return null;
|
|
@@ -184,6 +187,30 @@ async function getRoleSchema(role, version) {
|
|
|
184
187
|
return null;
|
|
185
188
|
return { ...rows[0], role };
|
|
186
189
|
}
|
|
190
|
+
/**
|
|
191
|
+
* List the list-schema version history for a role (newest first). The schema is
|
|
192
|
+
* elided — presence flag only; fetch a full snapshot via getRoleListSchema.
|
|
193
|
+
*/
|
|
194
|
+
async function listRoleListSchemaVersions(role) {
|
|
195
|
+
const pool = (0, db_1.getPool)();
|
|
196
|
+
const { rows } = await pool.query(sql_1.LIST_ROLE_LIST_SCHEMA_VERSIONS, [role]);
|
|
197
|
+
return rows;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Fetch a role's list schema. With a version, reads the immutable snapshot from
|
|
201
|
+
* lt_role_list_schemas; without one, the live (latest) column — a role that has
|
|
202
|
+
* never versioned its list schema still answers with version null. Returns null
|
|
203
|
+
* when the role (or the requested version) does not exist.
|
|
204
|
+
*/
|
|
205
|
+
async function getRoleListSchema(role, version) {
|
|
206
|
+
const pool = (0, db_1.getPool)();
|
|
207
|
+
const { rows } = version != null
|
|
208
|
+
? await pool.query(sql_1.GET_ROLE_LIST_SCHEMA_VERSION, [role, version])
|
|
209
|
+
: await pool.query(sql_1.GET_ROLE_LIST_SCHEMA_CURRENT, [role]);
|
|
210
|
+
if (!rows[0])
|
|
211
|
+
return null;
|
|
212
|
+
return { ...rows[0], role };
|
|
213
|
+
}
|
|
187
214
|
/**
|
|
188
215
|
* Fetch a role's live form_schema — the escalation form the dashboard renders.
|
|
189
216
|
*/
|
|
@@ -34,8 +34,13 @@ export declare const DELETE_ROLE = "\n DELETE FROM lt_roles WHERE role = $1";
|
|
|
34
34
|
* touching the same row: the DELETE only removes rows leaving the set, and the
|
|
35
35
|
* INSERT's ON CONFLICT DO NOTHING skips rows that stay (delete+insert of the
|
|
36
36
|
* SAME key in one statement would silently drop it — CTEs share a snapshot).
|
|
37
|
+
*
|
|
38
|
+
* The list_schema ($29 = provided sentinel, $30 = value) versions INDEPENDENTLY
|
|
39
|
+
* of the form/metadata pair: its own current_list_schema_version and its own
|
|
40
|
+
* snapshot table (lt_role_list_schemas), so a list-view edit never advances the
|
|
41
|
+
* resolve form's version. It shares $26 as the change summary.
|
|
37
42
|
*/
|
|
38
|
-
export declare const UPDATE_ROLE_METADATA = "\n WITH updated AS (\n UPDATE lt_roles SET\n title = CASE WHEN $2::boolean THEN $3 ELSE title END,\n description = CASE WHEN $4::boolean THEN $5 ELSE description END,\n form_schema = CASE WHEN $6::boolean THEN $7::jsonb ELSE form_schema END,\n metadata_schema = CASE WHEN $8::boolean THEN $9::jsonb ELSE metadata_schema END,\n properties = CASE WHEN $10::boolean THEN COALESCE($11::jsonb, '{}'::jsonb) ELSE properties END,\n ops_visible = CASE WHEN $12::boolean THEN $13::boolean ELSE ops_visible END,\n parent_role = CASE WHEN $14::boolean THEN $15 ELSE parent_role END,\n sla_minutes = CASE WHEN $16::boolean THEN $17::numeric ELSE sla_minutes END,\n target_per_hour = CASE WHEN $18::boolean THEN $19::numeric ELSE target_per_hour END,\n worker_count = CASE WHEN $20::boolean THEN $21::int ELSE worker_count END,\n priority_threshold_minutes\n = CASE WHEN $22::boolean THEN $23::numeric ELSE priority_threshold_minutes END,\n priority_facet = CASE WHEN $24::boolean THEN $25 ELSE priority_facet END,\n current_schema_version = CASE\n WHEN ($6::boolean AND $7::jsonb IS DISTINCT FROM form_schema)\n OR ($8::boolean AND $9::jsonb IS DISTINCT FROM metadata_schema)\n THEN COALESCE(current_schema_version, 0) + 1\n ELSE current_schema_version END\n WHERE role = $1\n RETURNING\n role, title, description, form_schema, metadata_schema, properties,\n ops_visible, parent_role, sla_minutes, target_per_hour, worker_count,\n priority_threshold_minutes, priority_facet,\n current_schema_version\n ), snapshot AS (\n INSERT INTO lt_role_schemas (role, version, form_schema, metadata_schema, change_summary)\n SELECT role, current_schema_version, form_schema, metadata_schema, $26\n FROM updated\n WHERE ($6::boolean OR $8::boolean) AND current_schema_version IS NOT NULL\n ON CONFLICT (role, version) DO NOTHING\n ), upstream_prune AS (\n DELETE FROM lt_role_upstreams\n WHERE $27::boolean AND role = $1 AND upstream_role <> ALL($28::text[])\n ), upstream_add AS (\n INSERT INTO lt_role_upstreams (role, upstream_role)\n SELECT $1, u FROM unnest($28::text[]) AS u\n WHERE $27::boolean\n ON CONFLICT DO NOTHING\n )\n SELECT * FROM updated";
|
|
43
|
+
export declare const UPDATE_ROLE_METADATA = "\n WITH updated AS (\n UPDATE lt_roles SET\n title = CASE WHEN $2::boolean THEN $3 ELSE title END,\n description = CASE WHEN $4::boolean THEN $5 ELSE description END,\n form_schema = CASE WHEN $6::boolean THEN $7::jsonb ELSE form_schema END,\n metadata_schema = CASE WHEN $8::boolean THEN $9::jsonb ELSE metadata_schema END,\n properties = CASE WHEN $10::boolean THEN COALESCE($11::jsonb, '{}'::jsonb) ELSE properties END,\n ops_visible = CASE WHEN $12::boolean THEN $13::boolean ELSE ops_visible END,\n parent_role = CASE WHEN $14::boolean THEN $15 ELSE parent_role END,\n sla_minutes = CASE WHEN $16::boolean THEN $17::numeric ELSE sla_minutes END,\n target_per_hour = CASE WHEN $18::boolean THEN $19::numeric ELSE target_per_hour END,\n worker_count = CASE WHEN $20::boolean THEN $21::int ELSE worker_count END,\n priority_threshold_minutes\n = CASE WHEN $22::boolean THEN $23::numeric ELSE priority_threshold_minutes END,\n priority_facet = CASE WHEN $24::boolean THEN $25 ELSE priority_facet END,\n list_schema = CASE WHEN $29::boolean THEN $30::jsonb ELSE list_schema END,\n current_schema_version = CASE\n WHEN ($6::boolean AND $7::jsonb IS DISTINCT FROM form_schema)\n OR ($8::boolean AND $9::jsonb IS DISTINCT FROM metadata_schema)\n THEN COALESCE(current_schema_version, 0) + 1\n ELSE current_schema_version END,\n current_list_schema_version = CASE\n WHEN $29::boolean AND $30::jsonb IS DISTINCT FROM list_schema\n THEN COALESCE(current_list_schema_version, 0) + 1\n ELSE current_list_schema_version END\n WHERE role = $1\n RETURNING\n role, title, description, form_schema, metadata_schema, properties,\n ops_visible, parent_role, sla_minutes, target_per_hour, worker_count,\n priority_threshold_minutes, priority_facet,\n current_schema_version, list_schema, current_list_schema_version\n ), snapshot AS (\n INSERT INTO lt_role_schemas (role, version, form_schema, metadata_schema, change_summary)\n SELECT role, current_schema_version, form_schema, metadata_schema, $26\n FROM updated\n WHERE ($6::boolean OR $8::boolean) AND current_schema_version IS NOT NULL\n ON CONFLICT (role, version) DO NOTHING\n ), list_snapshot AS (\n INSERT INTO lt_role_list_schemas (role, version, list_schema, change_summary)\n SELECT role, current_list_schema_version, list_schema, $26\n FROM updated\n WHERE $29::boolean AND current_list_schema_version IS NOT NULL\n ON CONFLICT (role, version) DO NOTHING\n ), upstream_prune AS (\n DELETE FROM lt_role_upstreams\n WHERE $27::boolean AND role = $1 AND upstream_role <> ALL($28::text[])\n ), upstream_add AS (\n INSERT INTO lt_role_upstreams (role, upstream_role)\n SELECT $1, u FROM unnest($28::text[]) AS u\n WHERE $27::boolean\n ON CONFLICT DO NOTHING\n )\n SELECT * FROM updated";
|
|
39
44
|
export declare const GET_ROLE_FORM_SCHEMA = "\n SELECT form_schema FROM lt_roles WHERE role = $1";
|
|
40
45
|
export declare const GET_ROLE_METADATA_SCHEMA = "\n SELECT metadata_schema FROM lt_roles WHERE role = $1";
|
|
41
46
|
export declare const GET_ROLE_UPSTREAMS = "\n SELECT upstream_role FROM lt_role_upstreams WHERE role = $1 ORDER BY upstream_role";
|
|
@@ -46,7 +51,14 @@ export declare const GET_ROLE_SCHEMA_VERSION = "\n SELECT s.role, s.version, s.
|
|
|
46
51
|
* versioned its schema still answers, with version NULL).
|
|
47
52
|
*/
|
|
48
53
|
export declare const GET_ROLE_SCHEMA_CURRENT = "\n SELECT r.role, r.current_schema_version AS version, r.form_schema,\n r.metadata_schema, s.change_summary, s.created_at,\n r.current_schema_version AS latest_version\n FROM lt_roles r\n LEFT JOIN lt_role_schemas s\n ON s.role = r.role AND s.version = r.current_schema_version\n WHERE r.role = $1";
|
|
49
|
-
export declare const
|
|
54
|
+
export declare const LIST_ROLE_LIST_SCHEMA_VERSIONS = "\n SELECT\n s.version,\n s.list_schema IS NOT NULL AS has_list_schema,\n s.change_summary,\n s.created_at,\n s.version = r.current_list_schema_version AS is_current\n FROM lt_role_list_schemas s\n JOIN lt_roles r ON r.role = s.role\n WHERE s.role = $1\n ORDER BY s.version DESC";
|
|
55
|
+
export declare const GET_ROLE_LIST_SCHEMA_VERSION = "\n SELECT s.role, s.version, s.list_schema,\n s.change_summary, s.created_at, r.current_list_schema_version AS latest_version\n FROM lt_role_list_schemas s\n JOIN lt_roles r ON r.role = s.role\n WHERE s.role = $1 AND s.version = $2";
|
|
56
|
+
/**
|
|
57
|
+
* Latest list schema resolves from the live lt_roles column (a role that has
|
|
58
|
+
* never versioned its list schema still answers, with version NULL).
|
|
59
|
+
*/
|
|
60
|
+
export declare const GET_ROLE_LIST_SCHEMA_CURRENT = "\n SELECT r.role, r.current_list_schema_version AS version, r.list_schema,\n s.change_summary, s.created_at,\n r.current_list_schema_version AS latest_version\n FROM lt_roles r\n LEFT JOIN lt_role_list_schemas s\n ON s.role = r.role AND s.version = r.current_list_schema_version\n WHERE r.role = $1";
|
|
61
|
+
export declare const LIST_ROLES_WITH_DETAILS = "\n WITH\n user_counts AS (\n SELECT role, COUNT(DISTINCT user_id)::int AS cnt\n FROM lt_user_roles\n GROUP BY role\n ),\n chain_counts AS (\n SELECT role, COUNT(*)::int AS cnt\n FROM (\n SELECT source_role AS role FROM lt_config_role_escalations\n UNION ALL\n SELECT target_role AS role FROM lt_config_role_escalations\n ) c\n GROUP BY role\n ),\n workflow_counts AS (\n SELECT role, COUNT(*)::int AS cnt\n FROM lt_config_roles\n GROUP BY role\n ),\n upstreams AS (\n SELECT role, array_agg(upstream_role ORDER BY upstream_role) AS ups\n FROM lt_role_upstreams\n GROUP BY role\n )\n SELECT\n r.role,\n r.title,\n r.description,\n r.form_schema,\n r.metadata_schema,\n r.properties,\n r.ops_visible,\n r.parent_role,\n r.sla_minutes,\n r.target_per_hour,\n r.worker_count,\n r.priority_threshold_minutes,\n r.priority_facet,\n r.current_schema_version,\n r.list_schema,\n r.current_list_schema_version,\n COALESCE(up.ups, '{}') AS upstream_roles,\n COALESCE(uc.cnt, 0) AS user_count,\n COALESCE(cc.cnt, 0) AS chain_count,\n COALESCE(wc.cnt, 0) AS workflow_count\n FROM lt_roles r\n LEFT JOIN user_counts uc ON uc.role = r.role\n LEFT JOIN chain_counts cc ON cc.role = r.role\n LEFT JOIN workflow_counts wc ON wc.role = r.role\n LEFT JOIN upstreams up ON up.role = r.role\n ORDER BY r.role";
|
|
50
62
|
export declare const COUNT_USER_ROLE_REFS = "\n SELECT COUNT(*)::int AS cnt FROM lt_user_roles WHERE role = $1";
|
|
51
63
|
export declare const COUNT_CHAIN_REFS = "\n SELECT COUNT(*)::int AS cnt\n FROM lt_config_role_escalations\n WHERE source_role = $1 OR target_role = $1";
|
|
52
64
|
export declare const COUNT_WORKFLOW_REFS = "\n SELECT COUNT(*)::int AS cnt FROM lt_config_roles WHERE role = $1";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
// ─── Escalation chain queries ───────────────────────────────────────────────
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.COUNT_ACTIVE_ESCALATION_REFS = exports.COUNT_WORKFLOW_REFS = exports.COUNT_CHAIN_REFS = exports.COUNT_USER_ROLE_REFS = exports.LIST_ROLES_WITH_DETAILS = exports.GET_ROLE_SCHEMA_CURRENT = exports.GET_ROLE_SCHEMA_VERSION = exports.LIST_ROLE_SCHEMA_VERSIONS = exports.GET_ROLE_UPSTREAMS = exports.GET_ROLE_METADATA_SCHEMA = exports.GET_ROLE_FORM_SCHEMA = exports.UPDATE_ROLE_METADATA = exports.DELETE_ROLE = exports.LIST_ROLES = exports.ENSURE_ROLE_EXISTS = exports.CHECK_ESCALATION_CHAIN_EXISTS = exports.DELETE_ESCALATION_CHAINS_BY_SOURCE = exports.DELETE_ESCALATION_CHAIN = exports.ADD_ESCALATION_CHAIN = exports.INSERT_ESCALATION_CHAIN = exports.GET_ALL_ESCALATION_CHAINS = exports.GET_ESCALATION_TARGETS = void 0;
|
|
4
|
+
exports.COUNT_ACTIVE_ESCALATION_REFS = exports.COUNT_WORKFLOW_REFS = exports.COUNT_CHAIN_REFS = exports.COUNT_USER_ROLE_REFS = exports.LIST_ROLES_WITH_DETAILS = exports.GET_ROLE_LIST_SCHEMA_CURRENT = exports.GET_ROLE_LIST_SCHEMA_VERSION = exports.LIST_ROLE_LIST_SCHEMA_VERSIONS = exports.GET_ROLE_SCHEMA_CURRENT = exports.GET_ROLE_SCHEMA_VERSION = exports.LIST_ROLE_SCHEMA_VERSIONS = exports.GET_ROLE_UPSTREAMS = exports.GET_ROLE_METADATA_SCHEMA = exports.GET_ROLE_FORM_SCHEMA = exports.UPDATE_ROLE_METADATA = exports.DELETE_ROLE = exports.LIST_ROLES = exports.ENSURE_ROLE_EXISTS = exports.CHECK_ESCALATION_CHAIN_EXISTS = exports.DELETE_ESCALATION_CHAINS_BY_SOURCE = exports.DELETE_ESCALATION_CHAIN = exports.ADD_ESCALATION_CHAIN = exports.INSERT_ESCALATION_CHAIN = exports.GET_ALL_ESCALATION_CHAINS = exports.GET_ESCALATION_TARGETS = void 0;
|
|
5
5
|
exports.GET_ESCALATION_TARGETS = `
|
|
6
6
|
SELECT target_role
|
|
7
7
|
FROM lt_config_role_escalations
|
|
@@ -68,6 +68,11 @@ exports.DELETE_ROLE = `
|
|
|
68
68
|
* touching the same row: the DELETE only removes rows leaving the set, and the
|
|
69
69
|
* INSERT's ON CONFLICT DO NOTHING skips rows that stay (delete+insert of the
|
|
70
70
|
* SAME key in one statement would silently drop it — CTEs share a snapshot).
|
|
71
|
+
*
|
|
72
|
+
* The list_schema ($29 = provided sentinel, $30 = value) versions INDEPENDENTLY
|
|
73
|
+
* of the form/metadata pair: its own current_list_schema_version and its own
|
|
74
|
+
* snapshot table (lt_role_list_schemas), so a list-view edit never advances the
|
|
75
|
+
* resolve form's version. It shares $26 as the change summary.
|
|
71
76
|
*/
|
|
72
77
|
exports.UPDATE_ROLE_METADATA = `
|
|
73
78
|
WITH updated AS (
|
|
@@ -85,23 +90,34 @@ exports.UPDATE_ROLE_METADATA = `
|
|
|
85
90
|
priority_threshold_minutes
|
|
86
91
|
= CASE WHEN $22::boolean THEN $23::numeric ELSE priority_threshold_minutes END,
|
|
87
92
|
priority_facet = CASE WHEN $24::boolean THEN $25 ELSE priority_facet END,
|
|
93
|
+
list_schema = CASE WHEN $29::boolean THEN $30::jsonb ELSE list_schema END,
|
|
88
94
|
current_schema_version = CASE
|
|
89
95
|
WHEN ($6::boolean AND $7::jsonb IS DISTINCT FROM form_schema)
|
|
90
96
|
OR ($8::boolean AND $9::jsonb IS DISTINCT FROM metadata_schema)
|
|
91
97
|
THEN COALESCE(current_schema_version, 0) + 1
|
|
92
|
-
ELSE current_schema_version END
|
|
98
|
+
ELSE current_schema_version END,
|
|
99
|
+
current_list_schema_version = CASE
|
|
100
|
+
WHEN $29::boolean AND $30::jsonb IS DISTINCT FROM list_schema
|
|
101
|
+
THEN COALESCE(current_list_schema_version, 0) + 1
|
|
102
|
+
ELSE current_list_schema_version END
|
|
93
103
|
WHERE role = $1
|
|
94
104
|
RETURNING
|
|
95
105
|
role, title, description, form_schema, metadata_schema, properties,
|
|
96
106
|
ops_visible, parent_role, sla_minutes, target_per_hour, worker_count,
|
|
97
107
|
priority_threshold_minutes, priority_facet,
|
|
98
|
-
current_schema_version
|
|
108
|
+
current_schema_version, list_schema, current_list_schema_version
|
|
99
109
|
), snapshot AS (
|
|
100
110
|
INSERT INTO lt_role_schemas (role, version, form_schema, metadata_schema, change_summary)
|
|
101
111
|
SELECT role, current_schema_version, form_schema, metadata_schema, $26
|
|
102
112
|
FROM updated
|
|
103
113
|
WHERE ($6::boolean OR $8::boolean) AND current_schema_version IS NOT NULL
|
|
104
114
|
ON CONFLICT (role, version) DO NOTHING
|
|
115
|
+
), list_snapshot AS (
|
|
116
|
+
INSERT INTO lt_role_list_schemas (role, version, list_schema, change_summary)
|
|
117
|
+
SELECT role, current_list_schema_version, list_schema, $26
|
|
118
|
+
FROM updated
|
|
119
|
+
WHERE $29::boolean AND current_list_schema_version IS NOT NULL
|
|
120
|
+
ON CONFLICT (role, version) DO NOTHING
|
|
105
121
|
), upstream_prune AS (
|
|
106
122
|
DELETE FROM lt_role_upstreams
|
|
107
123
|
WHERE $27::boolean AND role = $1 AND upstream_role <> ALL($28::text[])
|
|
@@ -149,6 +165,36 @@ exports.GET_ROLE_SCHEMA_CURRENT = `
|
|
|
149
165
|
LEFT JOIN lt_role_schemas s
|
|
150
166
|
ON s.role = r.role AND s.version = r.current_schema_version
|
|
151
167
|
WHERE r.role = $1`;
|
|
168
|
+
// ─── Versioned role LIST schemas (independent version lineage) ──────────────
|
|
169
|
+
exports.LIST_ROLE_LIST_SCHEMA_VERSIONS = `
|
|
170
|
+
SELECT
|
|
171
|
+
s.version,
|
|
172
|
+
s.list_schema IS NOT NULL AS has_list_schema,
|
|
173
|
+
s.change_summary,
|
|
174
|
+
s.created_at,
|
|
175
|
+
s.version = r.current_list_schema_version AS is_current
|
|
176
|
+
FROM lt_role_list_schemas s
|
|
177
|
+
JOIN lt_roles r ON r.role = s.role
|
|
178
|
+
WHERE s.role = $1
|
|
179
|
+
ORDER BY s.version DESC`;
|
|
180
|
+
exports.GET_ROLE_LIST_SCHEMA_VERSION = `
|
|
181
|
+
SELECT s.role, s.version, s.list_schema,
|
|
182
|
+
s.change_summary, s.created_at, r.current_list_schema_version AS latest_version
|
|
183
|
+
FROM lt_role_list_schemas s
|
|
184
|
+
JOIN lt_roles r ON r.role = s.role
|
|
185
|
+
WHERE s.role = $1 AND s.version = $2`;
|
|
186
|
+
/**
|
|
187
|
+
* Latest list schema resolves from the live lt_roles column (a role that has
|
|
188
|
+
* never versioned its list schema still answers, with version NULL).
|
|
189
|
+
*/
|
|
190
|
+
exports.GET_ROLE_LIST_SCHEMA_CURRENT = `
|
|
191
|
+
SELECT r.role, r.current_list_schema_version AS version, r.list_schema,
|
|
192
|
+
s.change_summary, s.created_at,
|
|
193
|
+
r.current_list_schema_version AS latest_version
|
|
194
|
+
FROM lt_roles r
|
|
195
|
+
LEFT JOIN lt_role_list_schemas s
|
|
196
|
+
ON s.role = r.role AND s.version = r.current_list_schema_version
|
|
197
|
+
WHERE r.role = $1`;
|
|
152
198
|
// ─── Role detail aggregation ────────────────────────────────────────────────
|
|
153
199
|
exports.LIST_ROLES_WITH_DETAILS = `
|
|
154
200
|
WITH
|
|
@@ -191,6 +237,8 @@ exports.LIST_ROLES_WITH_DETAILS = `
|
|
|
191
237
|
r.priority_threshold_minutes,
|
|
192
238
|
r.priority_facet,
|
|
193
239
|
r.current_schema_version,
|
|
240
|
+
r.list_schema,
|
|
241
|
+
r.current_list_schema_version,
|
|
194
242
|
COALESCE(up.ups, '{}') AS upstream_roles,
|
|
195
243
|
COALESCE(uc.cnt, 0) AS user_count,
|
|
196
244
|
COALESCE(cc.cnt, 0) AS chain_count,
|
|
@@ -46,6 +46,14 @@ export interface RoleDetail {
|
|
|
46
46
|
* role first carries a schema.
|
|
47
47
|
*/
|
|
48
48
|
current_schema_version: number | null;
|
|
49
|
+
/**
|
|
50
|
+
* JSON contract (x-lt-* markup) that richly formats the escalation LIST page
|
|
51
|
+
* when it is scoped to just this role. Opt-in and versioned INDEPENDENTLY of
|
|
52
|
+
* form_schema — a display template, always rendered at its latest version.
|
|
53
|
+
*/
|
|
54
|
+
list_schema: Record<string, any> | null;
|
|
55
|
+
/** Version of the live list_schema; null until the role first carries one. */
|
|
56
|
+
current_list_schema_version: number | null;
|
|
49
57
|
/**
|
|
50
58
|
* Roles this station draws input from that live in OTHER sequences.
|
|
51
59
|
* parent_role is the single "prior step" placing the role in one sequence;
|
|
@@ -77,11 +85,30 @@ export interface RoleSchemaVersionSummary {
|
|
|
77
85
|
created_at: string;
|
|
78
86
|
is_current: boolean;
|
|
79
87
|
}
|
|
88
|
+
/** One immutable snapshot of a role's LIST schema (independent version lineage). */
|
|
89
|
+
export interface RoleListSchemaVersion {
|
|
90
|
+
role: string;
|
|
91
|
+
version: number | null;
|
|
92
|
+
list_schema: Record<string, any> | null;
|
|
93
|
+
change_summary: string | null;
|
|
94
|
+
created_at: string | null;
|
|
95
|
+
latest_version: number | null;
|
|
96
|
+
}
|
|
97
|
+
/** Listing row for the list-schema version history (schema elided). */
|
|
98
|
+
export interface RoleListSchemaVersionSummary {
|
|
99
|
+
version: number;
|
|
100
|
+
has_list_schema: boolean;
|
|
101
|
+
change_summary: string | null;
|
|
102
|
+
created_at: string;
|
|
103
|
+
is_current: boolean;
|
|
104
|
+
}
|
|
80
105
|
export interface UpdateRoleInput {
|
|
81
106
|
title?: string | null;
|
|
82
107
|
description?: string | null;
|
|
83
108
|
form_schema?: Record<string, any> | null;
|
|
84
109
|
metadata_schema?: Record<string, any> | null;
|
|
110
|
+
/** JSON contract that richly formats this role's escalation list page. */
|
|
111
|
+
list_schema?: Record<string, any> | null;
|
|
85
112
|
properties?: Record<string, any> | null;
|
|
86
113
|
ops_visible?: boolean;
|
|
87
114
|
parent_role?: string | null;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{j as o}from"./vendor-query-B2UbickB.js";import{c as n}from"./tasks-
|
|
2
|
-
//# sourceMappingURL=AdminDashboard-
|
|
1
|
+
import{j as o}from"./vendor-query-B2UbickB.js";import{c as n}from"./tasks-BYz490un.js";import{j as m}from"./index-C9moIiIq.js";import{f as c}from"./useEventHooks-ZT6RV2Gj.js";import{u}from"./mcp-CH8Tj9Pw.js";import{P as d}from"./PageHeaderWithStats-87STTAJX.js";import"./vendor-react-CXumBFUA.js";import"./vendor-icons-BXhWQC7l.js";function S(){var a;c();const{data:s}=n({limit:1}),{data:e}=m({status:"pending",limit:1}),{data:t}=u(),r=((a=t==null?void 0:t.servers)==null?void 0:a.filter(i=>i.status==="connected").length)??0,l=t?`${r}/${t.total}`:"—";return o.jsx("div",{children:o.jsx(d,{title:"Admin",stats:[{label:"Tasks",value:(s==null?void 0:s.total)??"—"},{label:"Pending Escalations",value:(e==null?void 0:e.total)??"—",dotClass:"bg-status-pending"},{label:"MCP Servers",value:l},{label:"System",value:"Healthy",dotClass:"bg-status-success"}]})})}export{S as AdminDashboard};
|
|
2
|
+
//# sourceMappingURL=AdminDashboard-5bWcBxyS.js.map
|
package/dashboard/dist/assets/{AdminDashboard-RrSvb8d-.js.map → AdminDashboard-5bWcBxyS.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminDashboard-
|
|
1
|
+
{"version":3,"file":"AdminDashboard-5bWcBxyS.js","sources":["../../src/pages/admin/AdminDashboard.tsx"],"sourcesContent":["import { useTasks } from '../../api/tasks';\nimport { useEscalations } from '../../api/escalations';\nimport { useEscalationListEvents } from '../../hooks/useEventHooks';\nimport { useMcpServers } from '../../api/mcp';\nimport { PageHeaderWithStats } from '../../components/common/layout/PageHeaderWithStats';\n\nexport function AdminDashboard() {\n useEscalationListEvents();\n const { data: taskData } = useTasks({ limit: 1 });\n const { data: pendingEsc } = useEscalations({ status: 'pending', limit: 1 });\n const { data: mcpData } = useMcpServers();\n\n const connectedServers =\n mcpData?.servers?.filter((s) => s.status === 'connected').length ?? 0;\n const mcpLabel = mcpData ? `${connectedServers}/${mcpData.total}` : '—';\n\n return (\n <div>\n <PageHeaderWithStats\n title=\"Admin\"\n stats={[\n { label: 'Tasks', value: taskData?.total ?? '—' },\n { label: 'Pending Escalations', value: pendingEsc?.total ?? '—', dotClass: 'bg-status-pending' },\n { label: 'MCP Servers', value: mcpLabel },\n { label: 'System', value: 'Healthy', dotClass: 'bg-status-success' },\n ]}\n />\n </div>\n );\n}\n"],"names":["AdminDashboard","useEscalationListEvents","taskData","useTasks","pendingEsc","useEscalations","mcpData","useMcpServers","connectedServers","_a","s","mcpLabel","jsx","PageHeaderWithStats"],"mappings":"4UAMO,SAASA,GAAiB,OAC/BC,EAAA,EACA,KAAM,CAAE,KAAMC,CAAA,EAAaC,EAAS,CAAE,MAAO,EAAG,EAC1C,CAAE,KAAMC,CAAA,EAAeC,EAAe,CAAE,OAAQ,UAAW,MAAO,EAAG,EACrE,CAAE,KAAMC,CAAA,EAAYC,EAAA,EAEpBC,IACJC,EAAAH,GAAA,YAAAA,EAAS,UAAT,YAAAG,EAAkB,OAAQC,GAAMA,EAAE,SAAW,aAAa,SAAU,EAChEC,EAAWL,EAAU,GAAGE,CAAgB,IAAIF,EAAQ,KAAK,GAAK,IAEpE,aACG,MAAA,CACC,SAAAM,EAAAA,IAACC,EAAA,CACC,MAAM,QACN,MAAO,CACL,CAAE,MAAO,QAAS,OAAOX,GAAA,YAAAA,EAAU,QAAS,GAAA,EAC5C,CAAE,MAAO,sBAAuB,OAAOE,GAAA,YAAAA,EAAY,QAAS,IAAK,SAAU,mBAAA,EAC3E,CAAE,MAAO,cAAe,MAAOO,CAAA,EAC/B,CAAE,MAAO,SAAU,MAAO,UAAW,SAAU,mBAAA,CAAoB,CACrE,CAAA,EAEJ,CAEJ"}
|