@hotmeshio/long-tail 0.23.0 → 0.23.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/api/escalations/index.d.ts +1 -0
- package/build/api/escalations/index.js +4 -1
- package/build/api/escalations/list.d.ts +5 -0
- package/build/api/escalations/list.js +19 -5
- package/build/api/escalations/related.d.ts +18 -0
- package/build/api/escalations/related.js +205 -0
- package/build/api/roles.js +4 -0
- package/build/api/scan-codes/present.js +5 -1
- package/build/api/settings.d.ts +1 -1
- package/build/api/settings.js +3 -1
- package/build/modules/display.d.ts +15 -0
- package/build/modules/display.js +27 -0
- package/build/routes/escalations/index.js +3 -0
- package/build/routes/escalations/list.js +2 -0
- package/build/routes/escalations/related.d.ts +7 -0
- package/build/routes/escalations/related.js +60 -0
- package/build/scripts/consolidation-sim.d.ts +25 -0
- package/build/scripts/consolidation-sim.js +141 -0
- package/build/sdk/index.d.ts +12 -0
- package/build/sdk/index.js +2 -0
- package/build/services/escalation/grouped-list.d.ts +19 -0
- package/build/services/escalation/grouped-list.js +54 -0
- package/build/services/escalation/index.d.ts +4 -0
- package/build/services/escalation/index.js +9 -1
- package/build/services/escalation/queries.d.ts +17 -13
- package/build/services/escalation/queries.js +31 -40
- package/build/services/escalation/read-scope-sql.d.ts +13 -0
- package/build/services/escalation/read-scope-sql.js +19 -0
- package/build/services/escalation/related.d.ts +58 -0
- package/build/services/escalation/related.js +196 -0
- package/build/services/role/index.js +6 -0
- package/build/services/role/seed.js +4 -0
- package/build/services/scan-code/validate-facts.d.ts +1 -1
- package/build/services/scan-code/validate-facts.js +12 -1
- package/build/shared/form-validation/x-lt-scan.d.ts +8 -0
- package/build/shared/form-validation/x-lt-scan.js +20 -1
- package/build/shared/list-schema/index.d.ts +3 -0
- package/build/shared/list-schema/index.js +27 -0
- package/build/shared/list-schema/template.d.ts +14 -0
- package/build/shared/list-schema/template.js +85 -0
- package/build/shared/list-schema/types.d.ts +154 -0
- package/build/shared/list-schema/types.js +55 -0
- package/build/shared/list-schema/validate.d.ts +12 -0
- package/build/shared/list-schema/validate.js +204 -0
- package/build/shared/roles/segment.d.ts +22 -0
- package/build/shared/roles/segment.js +42 -0
- package/build/start/adapters.js +2 -0
- package/build/system/mcp-servers/admin/users.js +8 -0
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/index.d.ts +2 -2
- package/build/types/index.js +2 -1
- package/build/types/scan-code/constants.d.ts +7 -0
- package/build/types/scan-code/constants.js +7 -1
- package/build/types/scan-code/response.d.ts +3 -2
- package/build/types/scan-code/rule.d.ts +6 -1
- package/build/types/startup.d.ts +8 -0
- package/dashboard/dist/assets/{AdminDashboard-DKrqLGjn.js → AdminDashboard-BPWsgMfZ.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-DKrqLGjn.js.map → AdminDashboard-BPWsgMfZ.js.map} +1 -1
- package/dashboard/dist/assets/{AgentConfigPage-BoQhRW6U.js → AgentConfigPage-De9imyo5.js} +2 -2
- package/dashboard/dist/assets/{AgentConfigPage-BoQhRW6U.js.map → AgentConfigPage-De9imyo5.js.map} +1 -1
- package/dashboard/dist/assets/{AgentDetailPage-DZhzuZmO.js → AgentDetailPage-B6o96Y5G.js} +3 -3
- package/dashboard/dist/assets/{AgentDetailPage-DZhzuZmO.js.map → AgentDetailPage-B6o96Y5G.js.map} +1 -1
- package/dashboard/dist/assets/{AgentsPage-5MynmbWX.js → AgentsPage-DMEmiK_W.js} +2 -2
- package/dashboard/dist/assets/{AgentsPage-5MynmbWX.js.map → AgentsPage-DMEmiK_W.js.map} +1 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-DeYMngwE.js +2 -0
- package/dashboard/dist/assets/AvailableEscalationsPage-DeYMngwE.js.map +1 -0
- package/dashboard/dist/assets/{BotPicker-C3LR6Sqy.js → BotPicker-DDmpgGHZ.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-C3LR6Sqy.js.map → BotPicker-DDmpgGHZ.js.map} +1 -1
- package/dashboard/dist/assets/{BulkAssignModal-COjoOIIH.js → BulkAssignModal-BqlklomG.js} +2 -2
- package/dashboard/dist/assets/{BulkAssignModal-COjoOIIH.js.map → BulkAssignModal-BqlklomG.js.map} +1 -1
- package/dashboard/dist/assets/CapabilitiesPage-DOtjDTbK.js +2 -0
- package/dashboard/dist/assets/{CapabilitiesPage-DKxLvOfB.js.map → CapabilitiesPage-DOtjDTbK.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-Cz5sRx-r.js → CollapsibleSection-CLr8LP0V.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-Cz5sRx-r.js.map → CollapsibleSection-CLr8LP0V.js.map} +1 -1
- package/dashboard/dist/assets/{ConfirmDeleteModal-Beq1vQtY.js → ConfirmDeleteModal-DW4DrPur.js} +2 -2
- package/dashboard/dist/assets/{ConfirmDeleteModal-Beq1vQtY.js.map → ConfirmDeleteModal-DW4DrPur.js.map} +1 -1
- package/dashboard/dist/assets/CountdownTimer-DxX72PwV.js +2 -0
- package/dashboard/dist/assets/CountdownTimer-DxX72PwV.js.map +1 -0
- package/dashboard/dist/assets/{CredentialsPage-DhiHiPsG.js → CredentialsPage-CObc9Rs5.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-DhiHiPsG.js.map → CredentialsPage-CObc9Rs5.js.map} +1 -1
- package/dashboard/dist/assets/{CronLabel-C9SkawB-.js → CronLabel-Bb8GoNY5.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-C9SkawB-.js.map → CronLabel-Bb8GoNY5.js.map} +1 -1
- package/dashboard/dist/assets/DataTable-FjFhx0SE.js +2 -0
- package/dashboard/dist/assets/DataTable-FjFhx0SE.js.map +1 -0
- package/dashboard/dist/assets/{ElapsedCell-BeK1SUDK.js → ElapsedCell-CmGhVlYl.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-BeK1SUDK.js.map → ElapsedCell-CmGhVlYl.js.map} +1 -1
- package/dashboard/dist/assets/{EntityTimelinePanel-BThdefKj.js → EntityTimelinePanel-B4Jwy1w3.js} +2 -2
- package/dashboard/dist/assets/{EntityTimelinePanel-BThdefKj.js.map → EntityTimelinePanel-B4Jwy1w3.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationListSchemaPage-DlDIYb-p.js → EscalationListSchemaPage-CZZbZ4Aa.js} +2 -2
- package/dashboard/dist/assets/{EscalationListSchemaPage-DlDIYb-p.js.map → EscalationListSchemaPage-CZZbZ4Aa.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationSchemaPage-CQt-Embr.js → EscalationSchemaPage-D0ko59_S.js} +3 -3
- package/dashboard/dist/assets/{EscalationSchemaPage-CQt-Embr.js.map → EscalationSchemaPage-D0ko59_S.js.map} +1 -1
- package/dashboard/dist/assets/EscalationTimeline-BcnJEKFD.js +2 -0
- package/dashboard/dist/assets/EscalationTimeline-BcnJEKFD.js.map +1 -0
- package/dashboard/dist/assets/{EscalationTitleSelect-Dewrv8wX.js → EscalationTitleSelect-P0q5sck4.js} +2 -2
- package/dashboard/dist/assets/{EscalationTitleSelect-Dewrv8wX.js.map → EscalationTitleSelect-P0q5sck4.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-BzH-Y-5x.js → EscalationsOverview-BLPmh4AF.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-BzH-Y-5x.js.map → EscalationsOverview-BLPmh4AF.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-C97m6IZv.js → EventTable-gBzi5tIS.js} +2 -2
- package/dashboard/dist/assets/{EventTable-C97m6IZv.js.map → EventTable-gBzi5tIS.js.map} +1 -1
- package/dashboard/dist/assets/{FilterBar-D-6xVHIw.js → FilterBar-BulSsWb2.js} +2 -2
- package/dashboard/dist/assets/{FilterBar-D-6xVHIw.js.map → FilterBar-BulSsWb2.js.map} +1 -1
- package/dashboard/dist/assets/FormattedValue-BMHRrvrL.js +2 -0
- package/dashboard/dist/assets/FormattedValue-BMHRrvrL.js.map +1 -0
- package/dashboard/dist/assets/{GraphInvokePage-Bwi8EF9Y.js → GraphInvokePage--997yNRr.js} +2 -2
- package/dashboard/dist/assets/{GraphInvokePage-Bwi8EF9Y.js.map → GraphInvokePage--997yNRr.js.map} +1 -1
- package/dashboard/dist/assets/{HomePage-Z_Q03C0z.js → HomePage-CwXFz--v.js} +2 -2
- package/dashboard/dist/assets/{HomePage-Z_Q03C0z.js.map → HomePage-CwXFz--v.js.map} +1 -1
- package/dashboard/dist/assets/{ListToolbar-_jWTw5no.js → ListToolbar-Df4qZryJ.js} +2 -2
- package/dashboard/dist/assets/{ListToolbar-_jWTw5no.js.map → ListToolbar-Df4qZryJ.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-CjqTuP0N.js → McpOverview-DrogIAKJ.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-CjqTuP0N.js.map → McpOverview-DrogIAKJ.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryDetailPage-leCsje1U.js → McpQueryDetailPage-CJmvCAE6.js} +2 -2
- package/dashboard/dist/assets/{McpQueryDetailPage-leCsje1U.js.map → McpQueryDetailPage-CJmvCAE6.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryPage-C-PyXYX4.js → McpQueryPage-lygo4Yq0.js} +2 -2
- package/dashboard/dist/assets/{McpQueryPage-C-PyXYX4.js.map → McpQueryPage-lygo4Yq0.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunDetailPage-JDrr3uUQ.js → McpRunDetailPage-hvns2sCm.js} +2 -2
- package/dashboard/dist/assets/{McpRunDetailPage-JDrr3uUQ.js.map → McpRunDetailPage-hvns2sCm.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunsPage-DERXQLgZ.js → McpRunsPage-C2_7spTX.js} +2 -2
- package/dashboard/dist/assets/{McpRunsPage-DERXQLgZ.js.map → McpRunsPage-C2_7spTX.js.map} +1 -1
- package/dashboard/dist/assets/{OperationsPage-B2DA7n9m.js → OperationsPage-BlK8WlsY.js} +3 -3
- package/dashboard/dist/assets/OperationsPage-BlK8WlsY.js.map +1 -0
- package/dashboard/dist/assets/OperatorDashboard-BeWBiMGX.js +2 -0
- package/dashboard/dist/assets/OperatorDashboard-BeWBiMGX.js.map +1 -0
- package/dashboard/dist/assets/{PersonaDetailPage-ChXwJ6u5.js → PersonaDetailPage-CNHpsX_i.js} +2 -2
- package/dashboard/dist/assets/{PersonaDetailPage-ChXwJ6u5.js.map → PersonaDetailPage-CNHpsX_i.js.map} +1 -1
- package/dashboard/dist/assets/{PersonasPage-BFFxncSE.js → PersonasPage-ChASEZRg.js} +2 -2
- package/dashboard/dist/assets/{PersonasPage-BFFxncSE.js.map → PersonasPage-ChASEZRg.js.map} +1 -1
- package/dashboard/dist/assets/PortalPage-D5Lk-PKF.js +2 -0
- package/dashboard/dist/assets/PortalPage-D5Lk-PKF.js.map +1 -0
- package/dashboard/dist/assets/{ProcessDetailPage-D7EYwW-j.js → ProcessDetailPage-DNgCIwRl.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-D7EYwW-j.js.map → ProcessDetailPage-DNgCIwRl.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessesListPage-CakYRtnE.js → ProcessesListPage-pRjWuWlH.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-CakYRtnE.js.map → ProcessesListPage-pRjWuWlH.js.map} +1 -1
- package/dashboard/dist/assets/ResolverForm-CKIOAGtY.js +8 -0
- package/dashboard/dist/assets/ResolverForm-CKIOAGtY.js.map +1 -0
- package/dashboard/dist/assets/{RoleDetailPage-CKbGwezP.js → RoleDetailPage-Bh_UcfYY.js} +2 -2
- package/dashboard/dist/assets/{RoleDetailPage-CKbGwezP.js.map → RoleDetailPage-Bh_UcfYY.js.map} +1 -1
- package/dashboard/dist/assets/{RolesPage-Czu7Zku4.js → RolesPage-CK17N7zz.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-Czu7Zku4.js.map → RolesPage-CK17N7zz.js.map} +1 -1
- package/dashboard/dist/assets/{RunAsSelector-6BLScYTX.js → RunAsSelector-BEKUP0p2.js} +2 -2
- package/dashboard/dist/assets/{RunAsSelector-6BLScYTX.js.map → RunAsSelector-BEKUP0p2.js.map} +1 -1
- package/dashboard/dist/assets/{ScanCodesPage-Cv9q8Bvt.js → ScanCodesPage-Bd0Pflqx.js} +2 -2
- package/dashboard/dist/assets/{ScanCodesPage-Cv9q8Bvt.js.map → ScanCodesPage-Bd0Pflqx.js.map} +1 -1
- package/dashboard/dist/assets/{ScanSchemeDetailPage-BxazXYIc.js → ScanSchemeDetailPage-CnuhozmJ.js} +2 -2
- package/dashboard/dist/assets/{ScanSchemeDetailPage-BxazXYIc.js.map → ScanSchemeDetailPage-CnuhozmJ.js.map} +1 -1
- package/dashboard/dist/assets/ScanStationPage-CoLc-q3h.js +2 -0
- package/dashboard/dist/assets/ScanStationPage-CoLc-q3h.js.map +1 -0
- package/dashboard/dist/assets/{StickyPagination-DsdtYoXR.js → StickyPagination-COrfvkBi.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-DsdtYoXR.js.map → StickyPagination-COrfvkBi.js.map} +1 -1
- package/dashboard/dist/assets/{StreamMessageDetail-CT3FQoT3.js → StreamMessageDetail-Cif2egLy.js} +2 -2
- package/dashboard/dist/assets/{StreamMessageDetail-CT3FQoT3.js.map → StreamMessageDetail-Cif2egLy.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-C8TjkJ10.js → SwimlaneTimeline-BnZYTrAh.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-C8TjkJ10.js.map → SwimlaneTimeline-BnZYTrAh.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-DGUzdBFN.js → TaskDetailPage-DEz_dqyR.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-DGUzdBFN.js.map → TaskDetailPage-DEz_dqyR.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-BVIP6-EZ.js → TasksListPage-oEfEGj0_.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-BVIP6-EZ.js.map → TasksListPage-oEfEGj0_.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-C-rd9F9g.js → TimeAgo-Dz5TgZZZ.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-C-rd9F9g.js.map → TimeAgo-Dz5TgZZZ.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-DPbchDOI.js → TimestampCell-BUTgE244.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-DPbchDOI.js.map → TimestampCell-BUTgE244.js.map} +1 -1
- package/dashboard/dist/assets/{ToolTestPanel-DAUC8DHK.js → ToolTestPanel-BS4g6vt-.js} +2 -2
- package/dashboard/dist/assets/{ToolTestPanel-DAUC8DHK.js.map → ToolTestPanel-BS4g6vt-.js.map} +1 -1
- package/dashboard/dist/assets/{TopicDetailPage-70mMKBzG.js → TopicDetailPage-C_I6JIVD.js} +2 -2
- package/dashboard/dist/assets/{TopicDetailPage-70mMKBzG.js.map → TopicDetailPage-C_I6JIVD.js.map} +1 -1
- package/dashboard/dist/assets/{TopicsPage-CE3hBthn.js → TopicsPage-Cr6-wfhJ.js} +2 -2
- package/dashboard/dist/assets/{TopicsPage-CE3hBthn.js.map → TopicsPage-Cr6-wfhJ.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-BDBDA-LR.js → UserName-ZFpWMaFF.js} +2 -2
- package/dashboard/dist/assets/{UserName-BDBDA-LR.js.map → UserName-ZFpWMaFF.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowExecutionPage-BbkLZ1co.js → WorkflowExecutionPage-ByPixDZW.js} +2 -2
- package/dashboard/dist/assets/{WorkflowExecutionPage-BbkLZ1co.js.map → WorkflowExecutionPage-ByPixDZW.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsDashboard-Bp1L7Ggz.js → WorkflowsDashboard-CWsJdMdR.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsDashboard-Bp1L7Ggz.js.map → WorkflowsDashboard-CWsJdMdR.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsOverview-IeTKHAi4.js → WorkflowsOverview-Dk9gyqZN.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-IeTKHAi4.js.map → WorkflowsOverview-Dk9gyqZN.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-DtKCXnKt.js → YamlWorkflowDetailPage-CHwcrsaT.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-DtKCXnKt.js.map → YamlWorkflowDetailPage-CHwcrsaT.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowsPage-CEcZBV_3.js → YamlWorkflowsPage-B5jRX2Ph.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowsPage-CEcZBV_3.js.map → YamlWorkflowsPage-B5jRX2Ph.js.map} +1 -1
- package/dashboard/dist/assets/{agents-BT-sEk81.js → agents-Dd7E-27d.js} +2 -2
- package/dashboard/dist/assets/{agents-BT-sEk81.js.map → agents-Dd7E-27d.js.map} +1 -1
- package/dashboard/dist/assets/{bots-DRoAdLek.js → bots-CpaYjZTk.js} +2 -2
- package/dashboard/dist/assets/{bots-DRoAdLek.js.map → bots-CpaYjZTk.js.map} +1 -1
- package/dashboard/dist/assets/{capabilities-Bc-nJk6y.js → capabilities-CNjg_qv1.js} +2 -2
- package/dashboard/dist/assets/{capabilities-Bc-nJk6y.js.map → capabilities-CNjg_qv1.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-aXceSIRf.js → controlplane-DgmvnAtU.js} +2 -2
- package/dashboard/dist/assets/{controlplane-aXceSIRf.js.map → controlplane-DgmvnAtU.js.map} +1 -1
- package/dashboard/dist/assets/escalation-columns-Uj4U9g5H.js +2 -0
- package/dashboard/dist/assets/escalation-columns-Uj4U9g5H.js.map +1 -0
- package/dashboard/dist/assets/{index-C3VTJcrp.js → index-BFASQ7_X.js} +2 -2
- package/dashboard/dist/assets/{index-C3VTJcrp.js.map → index-BFASQ7_X.js.map} +1 -1
- package/dashboard/dist/assets/{index-DH03y-UT.js → index-BT1Ms5Q5.js} +2 -2
- package/dashboard/dist/assets/{index-DH03y-UT.js.map → index-BT1Ms5Q5.js.map} +1 -1
- package/dashboard/dist/assets/{index-Djsoi8DI.js → index-BrwqtXRh.js} +2 -2
- package/dashboard/dist/assets/{index-Djsoi8DI.js.map → index-BrwqtXRh.js.map} +1 -1
- package/dashboard/dist/assets/index-BsHVgWH6.js +13 -0
- package/dashboard/dist/assets/{index-BEPKAjna.js.map → index-BsHVgWH6.js.map} +1 -1
- package/dashboard/dist/assets/index-ByBy9M3L.js +2 -0
- package/dashboard/dist/assets/{index-BCFEQEMC.js.map → index-ByBy9M3L.js.map} +1 -1
- package/dashboard/dist/assets/{index-CZyO9hRb.js → index-C_K7OlzT.js} +2 -2
- package/dashboard/dist/assets/{index-CZyO9hRb.js.map → index-C_K7OlzT.js.map} +1 -1
- package/dashboard/dist/assets/{index-Ba-s5Yb5.js → index-CnOvJz6U.js} +2 -2
- package/dashboard/dist/assets/{index-Ba-s5Yb5.js.map → index-CnOvJz6U.js.map} +1 -1
- package/dashboard/dist/assets/{index-CcgmR-7-.js → index-CtlBjl8o.js} +2 -2
- package/dashboard/dist/assets/{index-CcgmR-7-.js.map → index-CtlBjl8o.js.map} +1 -1
- package/dashboard/dist/assets/{index-DBxpyIw5.js → index-D4Dlznn9.js} +2 -2
- package/dashboard/dist/assets/{index-DBxpyIw5.js.map → index-D4Dlznn9.js.map} +1 -1
- package/dashboard/dist/assets/{index-BUYokcrl.js → index-LRYC__mE.js} +30 -30
- package/dashboard/dist/assets/index-LRYC__mE.js.map +1 -0
- package/dashboard/dist/assets/{index-DcppjzP5.css → index-MYI2_Xb3.css} +1 -1
- package/dashboard/dist/assets/index-OfO0173w.js +3 -0
- package/dashboard/dist/assets/index-OfO0173w.js.map +1 -0
- package/dashboard/dist/assets/{index-h2gX31B2.js → index-RIFT3RlO.js} +2 -2
- package/dashboard/dist/assets/{index-h2gX31B2.js.map → index-RIFT3RlO.js.map} +1 -1
- package/dashboard/dist/assets/{index-CuBGGwXf.js → index-x5z73M9N.js} +2 -2
- package/dashboard/dist/assets/{index-CuBGGwXf.js.map → index-x5z73M9N.js.map} +1 -1
- package/dashboard/dist/assets/{knowledge-BhW8V-Hq.js → knowledge-Cci_r6Kl.js} +2 -2
- package/dashboard/dist/assets/{knowledge-BhW8V-Hq.js.map → knowledge-Cci_r6Kl.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-BYfSMQzh.js → mcp-NY4iL0L-.js} +2 -2
- package/dashboard/dist/assets/{mcp-BYfSMQzh.js.map → mcp-NY4iL0L-.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-DUJoOk_q.js → mcp-query-CbvZo_I_.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-DUJoOk_q.js.map → mcp-query-CbvZo_I_.js.map} +1 -1
- package/dashboard/dist/assets/{personas-jT1O_SB4.js → personas-Fy-f7QQd.js} +2 -2
- package/dashboard/dist/assets/{personas-jT1O_SB4.js.map → personas-Fy-f7QQd.js.map} +1 -1
- package/dashboard/dist/assets/{pipelines-Bp-wIaz2.js → pipelines-DKiuozxV.js} +2 -2
- package/dashboard/dist/assets/{pipelines-Bp-wIaz2.js.map → pipelines-DKiuozxV.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-CCrvnXbz.js → tasks-CdM1Rkk9.js} +2 -2
- package/dashboard/dist/assets/{tasks-CCrvnXbz.js.map → tasks-CdM1Rkk9.js.map} +1 -1
- package/dashboard/dist/assets/{topics-Blft0I1L.js → topics-XNy2mf3n.js} +2 -2
- package/dashboard/dist/assets/{topics-Blft0I1L.js.map → topics-XNy2mf3n.js.map} +1 -1
- package/dashboard/dist/assets/{useDebouncedValue-BYqbcism.js → useDebouncedValue-CyGcU3_S.js} +2 -2
- package/dashboard/dist/assets/{useDebouncedValue-BYqbcism.js.map → useDebouncedValue-CyGcU3_S.js.map} +1 -1
- package/dashboard/dist/assets/{useNamespace-BfxJAUgG.js → useNamespace-C2RIh_IN.js} +2 -2
- package/dashboard/dist/assets/{useNamespace-BfxJAUgG.js.map → useNamespace-C2RIh_IN.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-BukJuWpb.js → useYamlActivityEvents-CDiV5fjf.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-BukJuWpb.js.map → useYamlActivityEvents-CDiV5fjf.js.map} +1 -1
- package/dashboard/dist/assets/validate-DcGWN82Y.js +2 -0
- package/dashboard/dist/assets/validate-DcGWN82Y.js.map +1 -0
- package/dashboard/dist/assets/{yaml-workflows-DeRWqMGk.js → yaml-workflows-CH8UrouH.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-DeRWqMGk.js.map → yaml-workflows-CH8UrouH.js.map} +1 -1
- package/dashboard/dist/index.html +2 -2
- package/docs/api/http/escalations.md +46 -0
- package/docs/api/sdk/escalations.md +16 -0
- package/docs/code-owned-configuration.md +12 -0
- package/docs/hitl/portal.md +2 -0
- package/docs/hitl/x-lt-list-schema.md +88 -1
- package/docs/hitl/x-lt-scan.md +4 -1
- package/docs/scan-codes.md +7 -1
- package/package.json +3 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-CWMyy3IL.js +0 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-CWMyy3IL.js.map +0 -1
- package/dashboard/dist/assets/CapabilitiesPage-DKxLvOfB.js +0 -2
- package/dashboard/dist/assets/CountdownTimer-BUBl_4mP.js +0 -2
- package/dashboard/dist/assets/CountdownTimer-BUBl_4mP.js.map +0 -1
- package/dashboard/dist/assets/DataTable-spX1dFyb.js +0 -2
- package/dashboard/dist/assets/DataTable-spX1dFyb.js.map +0 -1
- package/dashboard/dist/assets/EscalationListView-DTIVuym4.js +0 -2
- package/dashboard/dist/assets/EscalationListView-DTIVuym4.js.map +0 -1
- package/dashboard/dist/assets/EscalationTimeline-DNKNp6pL.js +0 -2
- package/dashboard/dist/assets/EscalationTimeline-DNKNp6pL.js.map +0 -1
- package/dashboard/dist/assets/OperationsPage-B2DA7n9m.js.map +0 -1
- package/dashboard/dist/assets/OperatorDashboard-C8RtPv8P.js +0 -2
- package/dashboard/dist/assets/OperatorDashboard-C8RtPv8P.js.map +0 -1
- package/dashboard/dist/assets/PortalPage-Xk1zVneM.js +0 -2
- package/dashboard/dist/assets/PortalPage-Xk1zVneM.js.map +0 -1
- package/dashboard/dist/assets/ResolverForm-BwVOJUpJ.js +0 -8
- package/dashboard/dist/assets/ResolverForm-BwVOJUpJ.js.map +0 -1
- package/dashboard/dist/assets/ScanStationPage-Cg8LCFR7.js +0 -2
- package/dashboard/dist/assets/ScanStationPage-Cg8LCFR7.js.map +0 -1
- package/dashboard/dist/assets/escalation-columns-Bf09Q89t.js +0 -2
- package/dashboard/dist/assets/escalation-columns-Bf09Q89t.js.map +0 -1
- package/dashboard/dist/assets/index-BCFEQEMC.js +0 -2
- package/dashboard/dist/assets/index-BEPKAjna.js +0 -13
- package/dashboard/dist/assets/index-BUYokcrl.js.map +0 -1
- package/dashboard/dist/assets/index-D1mKf_qz.js +0 -3
- package/dashboard/dist/assets/index-D1mKf_qz.js.map +0 -1
|
@@ -11,3 +11,4 @@ export { findByMetadata, claimByMetadata, resolveByMetadata } from './metadata';
|
|
|
11
11
|
export { cancelSingleEscalation, bulkCancel } from './cancel';
|
|
12
12
|
export { searchByFacets, claimGroups, claimByFacets } from './facets';
|
|
13
13
|
export { aggregateByFacets, timelineByFacet } from './analytics';
|
|
14
|
+
export { getRelatedAggregates, getRelatedRows } from './related';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.timelineByFacet = exports.aggregateByFacets = exports.claimByFacets = exports.claimGroups = exports.searchByFacets = exports.bulkCancel = exports.cancelSingleEscalation = exports.resolveByMetadata = exports.claimByMetadata = exports.findByMetadata = exports.itemsView = exports.getEscalationItemsBySignalKey = exports.getEscalationItems = exports.removeItemByMetadata = exports.removeItemBySignalKey = exports.removeItem = exports.accumulateItemByMetadata = exports.accumulateItemBySignalKey = exports.accumulateItem = exports.resolveBatchItemByMetadata = exports.resolveBatchItemBySignalKey = exports.resolveBatchItem = exports.resolveAllOrNone = exports.resolveByIds = exports.resolveBySignalKey = exports.resolveEscalation = exports.bulkTriage = exports.bulkEscalate = exports.bulkUnassign = exports.bulkAssign = exports.bulkClaim = exports.updatePriority = exports.releaseExpiredClaims = exports.releaseEscalation = exports.claimEscalation = exports.getEscalationLookups = exports.escalateToRole = exports.getEscalationsByWorkflowId = exports.getEscalation = exports.getStationMetrics = exports.getEscalationStats = exports.listFacetValues = exports.listFacetKeys = exports.listDistinctTypes = exports.listAvailableEscalations = exports.listEscalations = exports.createEscalation = void 0;
|
|
3
|
+
exports.getRelatedRows = exports.getRelatedAggregates = exports.timelineByFacet = exports.aggregateByFacets = exports.claimByFacets = exports.claimGroups = exports.searchByFacets = exports.bulkCancel = exports.cancelSingleEscalation = exports.resolveByMetadata = exports.claimByMetadata = exports.findByMetadata = exports.itemsView = exports.getEscalationItemsBySignalKey = exports.getEscalationItems = exports.removeItemByMetadata = exports.removeItemBySignalKey = exports.removeItem = exports.accumulateItemByMetadata = exports.accumulateItemBySignalKey = exports.accumulateItem = exports.resolveBatchItemByMetadata = exports.resolveBatchItemBySignalKey = exports.resolveBatchItem = exports.resolveAllOrNone = exports.resolveByIds = exports.resolveBySignalKey = exports.resolveEscalation = exports.bulkTriage = exports.bulkEscalate = exports.bulkUnassign = exports.bulkAssign = exports.bulkClaim = exports.updatePriority = exports.releaseExpiredClaims = exports.releaseEscalation = exports.claimEscalation = exports.getEscalationLookups = exports.escalateToRole = exports.getEscalationsByWorkflowId = exports.getEscalation = exports.getStationMetrics = exports.getEscalationStats = exports.listFacetValues = exports.listFacetKeys = exports.listDistinctTypes = exports.listAvailableEscalations = exports.listEscalations = exports.createEscalation = void 0;
|
|
4
4
|
var create_1 = require("./create");
|
|
5
5
|
Object.defineProperty(exports, "createEscalation", { enumerable: true, get: function () { return create_1.createEscalation; } });
|
|
6
6
|
var list_1 = require("./list");
|
|
@@ -61,3 +61,6 @@ Object.defineProperty(exports, "claimByFacets", { enumerable: true, get: functio
|
|
|
61
61
|
var analytics_1 = require("./analytics");
|
|
62
62
|
Object.defineProperty(exports, "aggregateByFacets", { enumerable: true, get: function () { return analytics_1.aggregateByFacets; } });
|
|
63
63
|
Object.defineProperty(exports, "timelineByFacet", { enumerable: true, get: function () { return analytics_1.timelineByFacet; } });
|
|
64
|
+
var related_1 = require("./related");
|
|
65
|
+
Object.defineProperty(exports, "getRelatedAggregates", { enumerable: true, get: function () { return related_1.getRelatedAggregates; } });
|
|
66
|
+
Object.defineProperty(exports, "getRelatedRows", { enumerable: true, get: function () { return related_1.getRelatedRows; } });
|
|
@@ -19,6 +19,11 @@ export interface FacetInput {
|
|
|
19
19
|
* carries the full record.
|
|
20
20
|
*/
|
|
21
21
|
include?: string;
|
|
22
|
+
/**
|
|
23
|
+
* Page by groups of this metadata key: a page holds whole groups and
|
|
24
|
+
* `total` counts groups. The response adds `groups: [{ key, ids }]`.
|
|
25
|
+
*/
|
|
26
|
+
groupBy?: string;
|
|
22
27
|
}
|
|
23
28
|
/**
|
|
24
29
|
* List escalations with optional filters.
|
|
@@ -43,6 +43,7 @@ exports.getStationMetrics = getStationMetrics;
|
|
|
43
43
|
const escalationService = __importStar(require("../../services/escalation"));
|
|
44
44
|
const features_1 = require("../../modules/features");
|
|
45
45
|
const helpers_1 = require("./helpers");
|
|
46
|
+
const facet_sql_1 = require("../../services/escalation/facet-sql");
|
|
46
47
|
/** Strip the heavyweight JSON columns from list rows unless asked back. */
|
|
47
48
|
function projectListRows(rows, include) {
|
|
48
49
|
if (include === 'envelope')
|
|
@@ -53,6 +54,12 @@ function projectListRows(rows, include) {
|
|
|
53
54
|
function projectListResult(result, include) {
|
|
54
55
|
return { ...result, escalations: projectListRows(result.escalations, include) };
|
|
55
56
|
}
|
|
57
|
+
/** Run a scoped faceted search, paged by groups when the caller asked. */
|
|
58
|
+
async function runFacetedSearch(search, groupBy) {
|
|
59
|
+
return groupBy
|
|
60
|
+
? escalationService.searchEscalationsGrouped({ ...search, groupKey: groupBy })
|
|
61
|
+
: escalationService.searchEscalationsFaceted(search);
|
|
62
|
+
}
|
|
56
63
|
/** True when the caller asked for anything the plain list path can't express. */
|
|
57
64
|
function hasFacetQuery(i) {
|
|
58
65
|
return !!(i.facets ||
|
|
@@ -62,7 +69,8 @@ function hasFacetQuery(i) {
|
|
|
62
69
|
i.orderBy?.length ||
|
|
63
70
|
i.roles?.length ||
|
|
64
71
|
i.available != null ||
|
|
65
|
-
i.jeopardy === true
|
|
72
|
+
i.jeopardy === true ||
|
|
73
|
+
!!i.groupBy);
|
|
66
74
|
}
|
|
67
75
|
/**
|
|
68
76
|
* List escalations with optional filters.
|
|
@@ -86,6 +94,9 @@ function hasFacetQuery(i) {
|
|
|
86
94
|
async function listEscalations(input, auth) {
|
|
87
95
|
try {
|
|
88
96
|
const scope = await (0, helpers_1.getEscalationReadScope)(auth.userId);
|
|
97
|
+
if (input.groupBy != null && !facet_sql_1.FACET_KEY.test(input.groupBy)) {
|
|
98
|
+
return { status: 400, error: 'groupBy must be a metadata key (letters, numbers, underscores)' };
|
|
99
|
+
}
|
|
89
100
|
if (!scope.global && scope.allRoles.length === 0 && scope.selfRoles.length === 0) {
|
|
90
101
|
return { status: 200, data: { escalations: [], total: 0 } };
|
|
91
102
|
}
|
|
@@ -93,7 +104,7 @@ async function listEscalations(input, auth) {
|
|
|
93
104
|
// language (facets/block/range/exists/metadata-sort) IN SQL — the caller's
|
|
94
105
|
// role(s) can only NARROW within their scope, never widen past it.
|
|
95
106
|
if (hasFacetQuery(input)) {
|
|
96
|
-
const result = await
|
|
107
|
+
const result = await runFacetedSearch({
|
|
97
108
|
global: scope.global,
|
|
98
109
|
visibleRoles: scope.global ? undefined : scope.allRoles,
|
|
99
110
|
selfRoles: scope.global ? undefined : scope.selfRoles,
|
|
@@ -117,7 +128,7 @@ async function listEscalations(input, auth) {
|
|
|
117
128
|
search: input.search,
|
|
118
129
|
limit: input.limit ?? 50,
|
|
119
130
|
offset: input.offset ?? 0,
|
|
120
|
-
});
|
|
131
|
+
}, input.groupBy);
|
|
121
132
|
return { status: 200, data: projectListResult(result, input.include) };
|
|
122
133
|
}
|
|
123
134
|
const result = await escalationService.listEscalations({
|
|
@@ -164,12 +175,15 @@ async function listEscalations(input, auth) {
|
|
|
164
175
|
async function listAvailableEscalations(input, auth) {
|
|
165
176
|
try {
|
|
166
177
|
const scope = await (0, helpers_1.getEscalationReadScope)(auth.userId);
|
|
178
|
+
if (input.groupBy != null && !facet_sql_1.FACET_KEY.test(input.groupBy)) {
|
|
179
|
+
return { status: 400, error: 'groupBy must be a metadata key (letters, numbers, underscores)' };
|
|
180
|
+
}
|
|
167
181
|
if (!scope.global && scope.allRoles.length === 0 && scope.selfRoles.length === 0) {
|
|
168
182
|
return { status: 200, data: { escalations: [], total: 0 } };
|
|
169
183
|
}
|
|
170
184
|
// Faceted path — same as listEscalations but pinned to the available pool.
|
|
171
185
|
if (hasFacetQuery(input)) {
|
|
172
|
-
const result = await
|
|
186
|
+
const result = await runFacetedSearch({
|
|
173
187
|
global: scope.global,
|
|
174
188
|
visibleRoles: scope.global ? undefined : scope.allRoles,
|
|
175
189
|
selfRoles: scope.global ? undefined : scope.selfRoles,
|
|
@@ -192,7 +206,7 @@ async function listAvailableEscalations(input, auth) {
|
|
|
192
206
|
search: input.search,
|
|
193
207
|
limit: input.limit ?? 50,
|
|
194
208
|
offset: input.offset ?? 0,
|
|
195
|
-
});
|
|
209
|
+
}, input.groupBy);
|
|
196
210
|
return { status: 200, data: projectListResult(result, input.include) };
|
|
197
211
|
}
|
|
198
212
|
const result = await escalationService.listAvailableEscalations({
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { LTApiAuth, LTApiResult } from '../../types/sdk';
|
|
2
|
+
/**
|
|
3
|
+
* Aggregate every related set the role's list schema declares, for one page
|
|
4
|
+
* of host rows. One statement per (set, split) pair, whatever the page size.
|
|
5
|
+
*/
|
|
6
|
+
export declare function getRelatedAggregates(input: {
|
|
7
|
+
role: string;
|
|
8
|
+
ids: string[];
|
|
9
|
+
version?: number;
|
|
10
|
+
}, auth: LTApiAuth): Promise<LTApiResult>;
|
|
11
|
+
/** One host's rows in one related set, for a row detail section. */
|
|
12
|
+
export declare function getRelatedRows(input: {
|
|
13
|
+
role: string;
|
|
14
|
+
id: string;
|
|
15
|
+
set: string;
|
|
16
|
+
version?: number;
|
|
17
|
+
limit?: number;
|
|
18
|
+
}, auth: LTApiAuth): Promise<LTApiResult>;
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.getRelatedAggregates = getRelatedAggregates;
|
|
37
|
+
exports.getRelatedRows = getRelatedRows;
|
|
38
|
+
const escalationService = __importStar(require("../../services/escalation"));
|
|
39
|
+
const roleService = __importStar(require("../../services/role"));
|
|
40
|
+
const uuid_1 = require("../../lib/uuid");
|
|
41
|
+
const list_schema_1 = require("../../shared/list-schema");
|
|
42
|
+
const segment_1 = require("../../shared/roles/segment");
|
|
43
|
+
const helpers_1 = require("./helpers");
|
|
44
|
+
const DEFAULT_STATUS = 'pending';
|
|
45
|
+
const NOT_FOUND = 'Role list schema not found';
|
|
46
|
+
/** Gate the host role, then read its declaration from the stored list schema. */
|
|
47
|
+
async function loadDeclaration(role, version, auth) {
|
|
48
|
+
if (typeof role !== 'string' || !role)
|
|
49
|
+
return { error: { status: 400, error: 'role is required' } };
|
|
50
|
+
if (version !== undefined && (!Number.isInteger(version) || version < 1)) {
|
|
51
|
+
return { error: { status: 400, error: 'version must be a positive integer' } };
|
|
52
|
+
}
|
|
53
|
+
const readScope = await (0, helpers_1.getEscalationReadScope)(auth.userId);
|
|
54
|
+
const readable = readScope.global || readScope.allRoles.includes(role) || readScope.selfRoles.includes(role);
|
|
55
|
+
if (!readable)
|
|
56
|
+
return { error: { status: 404, error: NOT_FOUND } };
|
|
57
|
+
const stored = await roleService.getRoleListSchema(role, version);
|
|
58
|
+
if (!stored)
|
|
59
|
+
return { error: { status: 404, error: NOT_FOUND } };
|
|
60
|
+
let relations;
|
|
61
|
+
try {
|
|
62
|
+
relations = (0, list_schema_1.readListSchemaRelations)(stored.list_schema);
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
return { error: { status: 422, error: `list schema for ${role}: ${err.message}` } };
|
|
66
|
+
}
|
|
67
|
+
const scope = {
|
|
68
|
+
global: readScope.global,
|
|
69
|
+
visibleRoles: readScope.global ? undefined : readScope.allRoles,
|
|
70
|
+
selfRoles: readScope.global ? undefined : readScope.selfRoles,
|
|
71
|
+
meUserId: auth.userId,
|
|
72
|
+
};
|
|
73
|
+
return { scope, readScope, relations, version: stored.version };
|
|
74
|
+
}
|
|
75
|
+
async function resolveQueryRoles(query, readScope) {
|
|
76
|
+
const details = await roleService.listRolesWithDetails();
|
|
77
|
+
const roles = query.roles ?? (0, segment_1.segmentRoles)(details, query.segment);
|
|
78
|
+
if (!roles)
|
|
79
|
+
return `segment "${query.segment}" names no Pace Board sequence`;
|
|
80
|
+
const titles = new Map(details.map((d) => [d.role, d.title]));
|
|
81
|
+
const roleLabels = {};
|
|
82
|
+
for (const r of roles)
|
|
83
|
+
roleLabels[r] = titles.get(r) || r;
|
|
84
|
+
const restricted = readScope.global ? [] : roles.filter((r) => !readScope.allRoles.includes(r));
|
|
85
|
+
return { roles, roleLabels, restricted };
|
|
86
|
+
}
|
|
87
|
+
/** The split paths the declared columns ask of one set ('' when unsplit). */
|
|
88
|
+
function splitsFor(relations, set) {
|
|
89
|
+
const splits = new Set(relations.columns.filter((c) => c.related === set).map((c) => c.splitBy ?? ''));
|
|
90
|
+
if (!splits.size)
|
|
91
|
+
splits.add('');
|
|
92
|
+
return [...splits];
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Aggregate every related set the role's list schema declares, for one page
|
|
96
|
+
* of host rows. One statement per (set, split) pair, whatever the page size.
|
|
97
|
+
*/
|
|
98
|
+
async function getRelatedAggregates(input, auth) {
|
|
99
|
+
try {
|
|
100
|
+
if (!Array.isArray(input.ids))
|
|
101
|
+
return { status: 400, error: 'ids must be an array of escalation ids' };
|
|
102
|
+
if (input.ids.length > list_schema_1.RELATED_LIMITS.MAX_HOSTS) {
|
|
103
|
+
return { status: 400, error: `ids holds at most ${list_schema_1.RELATED_LIMITS.MAX_HOSTS} rows` };
|
|
104
|
+
}
|
|
105
|
+
const loaded = await loadDeclaration(input.role, input.version, auth);
|
|
106
|
+
if ('error' in loaded)
|
|
107
|
+
return loaded.error;
|
|
108
|
+
const { scope, readScope, relations, version } = loaded;
|
|
109
|
+
const data = { version, sets: {} };
|
|
110
|
+
const names = Object.keys(relations.sets);
|
|
111
|
+
const ids = [...new Set(input.ids.filter(uuid_1.isUuid))];
|
|
112
|
+
if (!names.length || !ids.length)
|
|
113
|
+
return { status: 200, data };
|
|
114
|
+
const hosts = await escalationService.readRelatedHosts({ ids, role: input.role, scope });
|
|
115
|
+
const hostIds = hosts.map((h) => h.id);
|
|
116
|
+
for (const name of names) {
|
|
117
|
+
const decl = relations.sets[name];
|
|
118
|
+
const result = { source: decl.source, aggregates: {} };
|
|
119
|
+
if (decl.source === list_schema_1.RELATED_SOURCES.ITEMS) {
|
|
120
|
+
const roles = new Set();
|
|
121
|
+
for (const splitBy of splitsFor(relations, name)) {
|
|
122
|
+
const read = await escalationService.aggregateRelatedItems({
|
|
123
|
+
hostIds, scope, splitBy: splitBy || undefined,
|
|
124
|
+
});
|
|
125
|
+
result.aggregates[splitBy] = read.aggregates;
|
|
126
|
+
read.roles.forEach((r) => roles.add(r));
|
|
127
|
+
}
|
|
128
|
+
if (roles.size)
|
|
129
|
+
result.roles = [...roles].sort();
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
const resolved = await resolveQueryRoles(decl.query, readScope);
|
|
133
|
+
if (typeof resolved === 'string')
|
|
134
|
+
return { status: 400, error: `x-lt-related.${name}: ${resolved}` };
|
|
135
|
+
Object.assign(result, resolved);
|
|
136
|
+
const matched = [];
|
|
137
|
+
const unresolved = [];
|
|
138
|
+
for (const host of hosts) {
|
|
139
|
+
const match = (0, list_schema_1.resolveRelatedFacets)(decl.query.facets ?? {}, (0, list_schema_1.rowTemplateContext)(host), decl.query.narrow);
|
|
140
|
+
if (match)
|
|
141
|
+
matched.push({ hostId: host.id, match });
|
|
142
|
+
else
|
|
143
|
+
unresolved.push(host.id);
|
|
144
|
+
}
|
|
145
|
+
for (const splitBy of splitsFor(relations, name)) {
|
|
146
|
+
const agg = await escalationService.aggregateRelatedQuery({
|
|
147
|
+
hosts: matched, roles: resolved.roles, status: decl.query.status ?? DEFAULT_STATUS, scope,
|
|
148
|
+
splitBy: splitBy || undefined,
|
|
149
|
+
});
|
|
150
|
+
for (const id of unresolved)
|
|
151
|
+
agg[id] = { count: 0, unresolved: true };
|
|
152
|
+
result.aggregates[splitBy] = agg;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
data.sets[name] = result;
|
|
156
|
+
}
|
|
157
|
+
return { status: 200, data };
|
|
158
|
+
}
|
|
159
|
+
catch (err) {
|
|
160
|
+
return { status: 500, error: err.message };
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/** One host's rows in one related set, for a row detail section. */
|
|
164
|
+
async function getRelatedRows(input, auth) {
|
|
165
|
+
try {
|
|
166
|
+
if (!(0, uuid_1.isUuid)(input.id))
|
|
167
|
+
return { status: 400, error: 'id must be an escalation id' };
|
|
168
|
+
if (input.limit !== undefined && (!Number.isInteger(input.limit) || input.limit < 1 || input.limit > list_schema_1.RELATED_LIMITS.ROWS_MAX)) {
|
|
169
|
+
return { status: 400, error: `limit must be 1..${list_schema_1.RELATED_LIMITS.ROWS_MAX}` };
|
|
170
|
+
}
|
|
171
|
+
const loaded = await loadDeclaration(input.role, input.version, auth);
|
|
172
|
+
if ('error' in loaded)
|
|
173
|
+
return loaded.error;
|
|
174
|
+
const { scope, readScope, relations } = loaded;
|
|
175
|
+
const decl = relations.sets[input.set];
|
|
176
|
+
if (!decl)
|
|
177
|
+
return { status: 404, error: `x-lt-related declares no set "${input.set}"` };
|
|
178
|
+
const [host] = await escalationService.readRelatedHosts({ ids: [input.id], role: input.role, scope });
|
|
179
|
+
if (!host)
|
|
180
|
+
return { status: 404, error: 'Escalation not found' };
|
|
181
|
+
const limit = input.limit ?? list_schema_1.RELATED_LIMITS.ROWS_DEFAULT;
|
|
182
|
+
if (decl.source === list_schema_1.RELATED_SOURCES.ITEMS) {
|
|
183
|
+
const { rows, total } = await escalationService.listRelatedItems({ hostId: input.id, scope, limit });
|
|
184
|
+
const data = { source: decl.source, rows, total };
|
|
185
|
+
return { status: 200, data };
|
|
186
|
+
}
|
|
187
|
+
const resolved = await resolveQueryRoles(decl.query, readScope);
|
|
188
|
+
if (typeof resolved === 'string')
|
|
189
|
+
return { status: 400, error: `x-lt-related.${input.set}: ${resolved}` };
|
|
190
|
+
const match = (0, list_schema_1.resolveRelatedFacets)(decl.query.facets ?? {}, (0, list_schema_1.rowTemplateContext)(host), decl.query.narrow);
|
|
191
|
+
const { rows, total } = match
|
|
192
|
+
? await escalationService.listRelatedQueryRows({
|
|
193
|
+
hosts: [{ hostId: input.id, match }], roles: resolved.roles,
|
|
194
|
+
status: decl.query.status ?? DEFAULT_STATUS, scope, limit,
|
|
195
|
+
})
|
|
196
|
+
: { rows: [], total: 0 };
|
|
197
|
+
const data = {
|
|
198
|
+
source: decl.source, rows, total, restricted: resolved.restricted, roleLabels: resolved.roleLabels,
|
|
199
|
+
};
|
|
200
|
+
return { status: 200, data };
|
|
201
|
+
}
|
|
202
|
+
catch (err) {
|
|
203
|
+
return { status: 500, error: err.message };
|
|
204
|
+
}
|
|
205
|
+
}
|
package/build/api/roles.js
CHANGED
|
@@ -51,6 +51,7 @@ const roleService = __importStar(require("../services/role"));
|
|
|
51
51
|
const types_1 = require("../services/role/types");
|
|
52
52
|
const badge_grant_1 = require("../services/role/badge-grant");
|
|
53
53
|
const facet_sql_1 = require("../services/escalation/facet-sql");
|
|
54
|
+
const list_schema_1 = require("../shared/list-schema");
|
|
54
55
|
/**
|
|
55
56
|
* List all distinct role names in the system.
|
|
56
57
|
*
|
|
@@ -295,6 +296,9 @@ async function updateRole(input) {
|
|
|
295
296
|
const grantError = (0, badge_grant_1.badgeGrantError)(input.properties?.[types_1.ROLE_PROPERTY_KEYS.BADGE_GRANT]);
|
|
296
297
|
if (grantError)
|
|
297
298
|
return { status: 400, error: grantError };
|
|
299
|
+
const listSchemaError = input.list_schema != null ? (0, list_schema_1.listSchemaRelationsError)(input.list_schema) : null;
|
|
300
|
+
if (listSchemaError)
|
|
301
|
+
return { status: 400, error: `list_schema: ${listSchemaError}` };
|
|
298
302
|
if (input.portals != null && !isPortalList(input.portals)) {
|
|
299
303
|
return {
|
|
300
304
|
status: 400,
|
|
@@ -45,7 +45,11 @@ function renderFacts(step, ctx, row) {
|
|
|
45
45
|
if (!step.facts)
|
|
46
46
|
return undefined;
|
|
47
47
|
const tpl = { ...(0, context_1.templateContext)(ctx), item: row.metadata ?? {} };
|
|
48
|
-
return step.facts.map((fact) => ({
|
|
48
|
+
return step.facts.map((fact) => ({
|
|
49
|
+
label: fact.label,
|
|
50
|
+
value: scanCodeService.renderScanCopy(fact.value.trim(), tpl),
|
|
51
|
+
...(fact.format ? { format: fact.format } : {}),
|
|
52
|
+
}));
|
|
49
53
|
}
|
|
50
54
|
// ── The info-choice outcome — locate → present reality + labeled choices ───
|
|
51
55
|
//
|
package/build/api/settings.d.ts
CHANGED
|
@@ -8,6 +8,6 @@ import type { LTApiResult } from '../types/sdk';
|
|
|
8
8
|
* environment block (long-tail + HotMesh versions, Node env/version).
|
|
9
9
|
*
|
|
10
10
|
* @param req — the incoming HTTP request, used to derive NATS WS URL from headers when proxying
|
|
11
|
-
* @returns `{ status: 200, data: { telemetry, escalation, events, auth, ai, features, environment } }`
|
|
11
|
+
* @returns `{ status: 200, data: { telemetry, escalation, events, auth, ai, features, search, branding, display, environment } }`
|
|
12
12
|
*/
|
|
13
13
|
export declare function getSettings(req?: IncomingMessage): Promise<LTApiResult>;
|
package/build/api/settings.js
CHANGED
|
@@ -10,6 +10,7 @@ const config_1 = require("../modules/config");
|
|
|
10
10
|
const features_1 = require("../modules/features");
|
|
11
11
|
const search_1 = require("../modules/search");
|
|
12
12
|
const branding_1 = require("../modules/branding");
|
|
13
|
+
const display_1 = require("../modules/display");
|
|
13
14
|
const version_1 = require("../modules/version");
|
|
14
15
|
const sso_1 = require("../modules/sso");
|
|
15
16
|
const defaults_1 = require("../modules/defaults");
|
|
@@ -41,7 +42,7 @@ function resolveNatsWsUrl(adapter, req) {
|
|
|
41
42
|
* environment block (long-tail + HotMesh versions, Node env/version).
|
|
42
43
|
*
|
|
43
44
|
* @param req — the incoming HTTP request, used to derive NATS WS URL from headers when proxying
|
|
44
|
-
* @returns `{ status: 200, data: { telemetry, escalation, events, auth, ai, features, environment } }`
|
|
45
|
+
* @returns `{ status: 200, data: { telemetry, escalation, events, auth, ai, features, search, branding, display, environment } }`
|
|
45
46
|
*/
|
|
46
47
|
async function getSettings(req) {
|
|
47
48
|
try {
|
|
@@ -79,6 +80,7 @@ async function getSettings(req) {
|
|
|
79
80
|
features: (0, features_1.getFeatureFlags)(),
|
|
80
81
|
search: (0, search_1.getSearchConfig)(),
|
|
81
82
|
branding: (0, branding_1.getBranding)(),
|
|
83
|
+
display: (0, display_1.getDisplay)(),
|
|
82
84
|
environment: {
|
|
83
85
|
longTailVersion: version_1.LONG_TAIL_VERSION,
|
|
84
86
|
hotmeshVersion: version_1.HOTMESH_VERSION,
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deployment display settings surfaced to the dashboard via /api/settings.
|
|
3
|
+
* `timeZone` (an IANA name, e.g. "America/Chicago") renders every dashboard
|
|
4
|
+
* date in the deployment's zone; unset, dates render in the browser's zone.
|
|
5
|
+
*/
|
|
6
|
+
export interface LTDisplayConfig {
|
|
7
|
+
timeZone?: string;
|
|
8
|
+
}
|
|
9
|
+
/** True when the runtime knows the IANA zone name. */
|
|
10
|
+
export declare function isValidTimeZone(zone: string): boolean;
|
|
11
|
+
/** Apply the start config's display block; an unknown zone fails the boot. */
|
|
12
|
+
export declare function configureDisplay(patch?: LTDisplayConfig): void;
|
|
13
|
+
export declare function getDisplay(): {
|
|
14
|
+
timeZone: string | null;
|
|
15
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isValidTimeZone = isValidTimeZone;
|
|
4
|
+
exports.configureDisplay = configureDisplay;
|
|
5
|
+
exports.getDisplay = getDisplay;
|
|
6
|
+
let timeZone = null;
|
|
7
|
+
/** True when the runtime knows the IANA zone name. */
|
|
8
|
+
function isValidTimeZone(zone) {
|
|
9
|
+
try {
|
|
10
|
+
new Intl.DateTimeFormat('en-US', { timeZone: zone });
|
|
11
|
+
return true;
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
/** Apply the start config's display block; an unknown zone fails the boot. */
|
|
18
|
+
function configureDisplay(patch) {
|
|
19
|
+
const zone = patch?.timeZone;
|
|
20
|
+
if (zone !== undefined && (typeof zone !== 'string' || !isValidTimeZone(zone))) {
|
|
21
|
+
throw new Error(`display.timeZone "${zone}" is not an IANA time zone name`);
|
|
22
|
+
}
|
|
23
|
+
timeZone = zone ?? null;
|
|
24
|
+
}
|
|
25
|
+
function getDisplay() {
|
|
26
|
+
return { timeZone };
|
|
27
|
+
}
|
|
@@ -9,6 +9,7 @@ const single_1 = require("./single");
|
|
|
9
9
|
const resolve_1 = require("./resolve");
|
|
10
10
|
const facets_1 = require("./facets");
|
|
11
11
|
const analytics_1 = require("./analytics");
|
|
12
|
+
const related_1 = require("./related");
|
|
12
13
|
const router = (0, express_1.Router)();
|
|
13
14
|
// Registration order matters: literal paths before parameterized /:id routes.
|
|
14
15
|
// GET /, /available, /types, /stats
|
|
@@ -26,6 +27,8 @@ const router = (0, express_1.Router)();
|
|
|
26
27
|
(0, facets_1.registerFacetRoutes)(router);
|
|
27
28
|
// POST /aggregate-by-facets, /timeline-by-facet
|
|
28
29
|
(0, analytics_1.registerAnalyticsRoutes)(router);
|
|
30
|
+
// POST /related, /related/rows
|
|
31
|
+
(0, related_1.registerRelatedRoutes)(router);
|
|
29
32
|
// PATCH /:id/escalate, GET /by-workflow/:workflowId,
|
|
30
33
|
// GET /:id, POST /:id/claim, POST /:id/release
|
|
31
34
|
(0, single_1.registerSingleRoutes)(router);
|
|
@@ -110,6 +110,7 @@ function registerListRoutes(router) {
|
|
|
110
110
|
available: req.query.available != null ? req.query.available === 'true' : undefined,
|
|
111
111
|
jeopardy: req.query.jeopardy === '1' || req.query.jeopardy === 'true' || undefined,
|
|
112
112
|
include: req.query.include,
|
|
113
|
+
groupBy: req.query.groupBy || undefined,
|
|
113
114
|
}, req.auth);
|
|
114
115
|
res.status(result.status).json(result.data ?? { error: result.error });
|
|
115
116
|
});
|
|
@@ -138,6 +139,7 @@ function registerListRoutes(router) {
|
|
|
138
139
|
orderBy: jsonParam(req.query.orderBy),
|
|
139
140
|
jeopardy: req.query.jeopardy === '1' || req.query.jeopardy === 'true' || undefined,
|
|
140
141
|
include: req.query.include,
|
|
142
|
+
groupBy: req.query.groupBy || undefined,
|
|
141
143
|
}, req.auth);
|
|
142
144
|
res.status(result.status).json(result.data ?? { error: result.error });
|
|
143
145
|
});
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Router } from 'express';
|
|
2
|
+
/**
|
|
3
|
+
* Related sets for role list views. The role's stored list schema declares
|
|
4
|
+
* the sets; the caller names the role, the page's host rows, and the schema
|
|
5
|
+
* version it rendered. Results are scoped to the caller's read scope.
|
|
6
|
+
*/
|
|
7
|
+
export declare function registerRelatedRoutes(router: Router): void;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.registerRelatedRoutes = registerRelatedRoutes;
|
|
37
|
+
const api = __importStar(require("../../api/escalations"));
|
|
38
|
+
/**
|
|
39
|
+
* Related sets for role list views. The role's stored list schema declares
|
|
40
|
+
* the sets; the caller names the role, the page's host rows, and the schema
|
|
41
|
+
* version it rendered. Results are scoped to the caller's read scope.
|
|
42
|
+
*/
|
|
43
|
+
function registerRelatedRoutes(router) {
|
|
44
|
+
/**
|
|
45
|
+
* POST /api/escalations/related
|
|
46
|
+
* Body: { role, ids, version? }
|
|
47
|
+
*/
|
|
48
|
+
router.post('/related', async (req, res) => {
|
|
49
|
+
const result = await api.getRelatedAggregates(req.body ?? {}, req.auth);
|
|
50
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
51
|
+
});
|
|
52
|
+
/**
|
|
53
|
+
* POST /api/escalations/related/rows
|
|
54
|
+
* Body: { role, id, set, version?, limit? }
|
|
55
|
+
*/
|
|
56
|
+
router.post('/related/rows', async (req, res) => {
|
|
57
|
+
const result = await api.getRelatedRows(req.body ?? {}, req.auth);
|
|
58
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
59
|
+
});
|
|
60
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* consolidation-sim: drive the consolidation example over HTTP so the
|
|
3
|
+
* Consolidate list shows a floor in motion.
|
|
4
|
+
*
|
|
5
|
+
* Opens a tub per destination (the first tub split into a standard and an
|
|
6
|
+
* express lane), starts orders with a mix of service levels, then walks
|
|
7
|
+
* them through the stations (prep, check) and places each in its
|
|
8
|
+
* destination's bin. With KEEP=1 it stops partway, leaving orders at every
|
|
9
|
+
* station and some bins partly filled, so the list's Holds and Coming
|
|
10
|
+
* columns and each row's expansion have something to show.
|
|
11
|
+
*
|
|
12
|
+
* Usage:
|
|
13
|
+
* npm run consolidation:sim
|
|
14
|
+
* DESTINATIONS=3 ORDERS=12 EXPRESS_PCT=30 KEEP=1 npm run consolidation:sim
|
|
15
|
+
*
|
|
16
|
+
* Env vars:
|
|
17
|
+
* BASE_URL long-tail API (default http://localhost:3000)
|
|
18
|
+
* DESTINATIONS destinations, one tub each (default 2)
|
|
19
|
+
* ORDERS orders to start (default 8)
|
|
20
|
+
* EXPRESS_PCT percent of orders on the express service (default 25)
|
|
21
|
+
* STEP_MS pause between floor moves (default 600)
|
|
22
|
+
* KEEP 1 = stop partway and leave the floor mid-flight (default 0)
|
|
23
|
+
* LT_USERNAME / LT_PASSWORD the dev login (defaults: the seeded admin)
|
|
24
|
+
*/
|
|
25
|
+
export {};
|