@hotmeshio/long-tail 0.20.0 → 0.21.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/README.md +4 -4
- package/build/api/escalations/accumulate.d.ts +96 -0
- package/build/api/escalations/accumulate.js +516 -0
- package/build/api/escalations/index.d.ts +1 -0
- package/build/api/escalations/index.js +10 -1
- package/build/api/roles.d.ts +4 -5
- package/build/api/roles.js +53 -4
- package/build/api/scan-codes/execute.js +2 -0
- package/build/api/scan-codes/verbs.d.ts +15 -0
- package/build/api/scan-codes/verbs.js +65 -0
- package/build/index.js +60 -0
- package/build/lib/db/schemas/036_role_portals.sql +12 -0
- package/build/routes/escalations/accumulate.d.ts +7 -0
- package/build/routes/escalations/accumulate.js +150 -0
- package/build/routes/escalations/index.js +5 -0
- package/build/sdk/index.d.ts +25 -0
- package/build/sdk/index.js +8 -0
- package/build/services/escalation/accumulate.d.ts +81 -0
- package/build/services/escalation/accumulate.js +154 -0
- package/build/services/escalation/index.d.ts +1 -0
- package/build/services/escalation/index.js +1 -0
- package/build/services/mcp/playwright-server/schemas.d.ts +2 -2
- package/build/services/orchestrator/condition.d.ts +40 -3
- package/build/services/orchestrator/condition.js +42 -2
- package/build/services/role/index.js +1 -0
- package/build/services/role/seed.js +6 -1
- package/build/services/role/sql.d.ts +6 -3
- package/build/services/role/sql.js +7 -2
- package/build/services/role/types.d.ts +38 -10
- package/build/services/role/types.js +10 -1
- package/build/services/scan-code/validate.js +16 -0
- package/build/shared/form-validation/display-only-widgets.d.ts +16 -0
- package/build/shared/form-validation/display-only-widgets.js +25 -0
- package/build/shared/form-validation/index.d.ts +2 -0
- package/build/shared/form-validation/index.js +2 -0
- package/build/shared/form-validation/x-lt-bind.d.ts +2 -14
- package/build/shared/form-validation/x-lt-bind.js +12 -8
- package/build/shared/form-validation/x-lt-invoke.d.ts +38 -0
- package/build/shared/form-validation/x-lt-invoke.js +103 -0
- package/build/system/mcp-servers/admin/escalations.js +39 -0
- package/build/system/mcp-servers/admin/schemas.d.ts +192 -13
- package/build/system/mcp-servers/admin/schemas.js +39 -3
- package/build/system/mcp-servers/admin/users.js +1 -0
- package/build/system/mcp-servers/docs.js +4 -0
- package/build/system/mcp-servers/human-queue-schemas.d.ts +85 -0
- package/build/system/mcp-servers/human-queue-schemas.js +19 -1
- package/build/system/mcp-servers/human-queue.d.ts +2 -0
- package/build/system/mcp-servers/human-queue.js +77 -0
- package/build/system/seed/tool-manifests-admin.d.ts +922 -103
- package/build/system/seed/tool-manifests-admin.js +4 -1
- package/build/system/seed/tool-manifests-escalation.d.ts +174 -0
- package/build/system/seed/tool-manifests-escalation.js +56 -0
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/escalation.d.ts +52 -0
- package/build/types/escalation.js +29 -1
- package/build/types/index.d.ts +2 -2
- package/build/types/index.js +3 -1
- package/build/types/scan-code.d.ts +24 -0
- package/build/types/scan-code.js +9 -0
- package/build/types/startup.d.ts +20 -0
- package/dashboard/dist/assets/{AdminDashboard-DplvDBti.js → AdminDashboard-uarpHB88.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-DplvDBti.js.map → AdminDashboard-uarpHB88.js.map} +1 -1
- package/dashboard/dist/assets/{AgentConfigPage-D8Bf6YxO.js → AgentConfigPage-BcUaDD5E.js} +6 -6
- package/dashboard/dist/assets/{AgentConfigPage-D8Bf6YxO.js.map → AgentConfigPage-BcUaDD5E.js.map} +1 -1
- package/dashboard/dist/assets/{AgentDetailPage-BN8g0Y2G.js → AgentDetailPage-BaZBhK6i.js} +3 -3
- package/dashboard/dist/assets/{AgentDetailPage-BN8g0Y2G.js.map → AgentDetailPage-BaZBhK6i.js.map} +1 -1
- package/dashboard/dist/assets/AgentsPage-CuVFSDc4.js +2 -0
- package/dashboard/dist/assets/{AgentsPage-7JJBHku8.js.map → AgentsPage-CuVFSDc4.js.map} +1 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-iO5NyyIK.js +2 -0
- package/dashboard/dist/assets/AvailableEscalationsPage-iO5NyyIK.js.map +1 -0
- package/dashboard/dist/assets/{BotPicker-CGCnIz8I.js → BotPicker-CClMby6B.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-CGCnIz8I.js.map → BotPicker-CClMby6B.js.map} +1 -1
- package/dashboard/dist/assets/BulkAssignModal-BL8FRgkN.js +2 -0
- package/dashboard/dist/assets/{BulkAssignModal-NJBcoj-f.js.map → BulkAssignModal-BL8FRgkN.js.map} +1 -1
- package/dashboard/dist/assets/CapabilitiesPage-D53ogPor.js +2 -0
- package/dashboard/dist/assets/{CapabilitiesPage-F8dpNn9B.js.map → CapabilitiesPage-D53ogPor.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-BZW6VpCU.js → CollapsibleSection-ow8jpbtD.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-BZW6VpCU.js.map → CollapsibleSection-ow8jpbtD.js.map} +1 -1
- package/dashboard/dist/assets/{ConfirmDeleteModal-64adXLdq.js → ConfirmDeleteModal-CeEDt9iJ.js} +2 -2
- package/dashboard/dist/assets/{ConfirmDeleteModal-64adXLdq.js.map → ConfirmDeleteModal-CeEDt9iJ.js.map} +1 -1
- package/dashboard/dist/assets/{CountdownTimer-BxDub9d2.js → CountdownTimer-CSqyZMCG.js} +2 -2
- package/dashboard/dist/assets/{CountdownTimer-BxDub9d2.js.map → CountdownTimer-CSqyZMCG.js.map} +1 -1
- package/dashboard/dist/assets/{CredentialsPage-CnLzopLL.js → CredentialsPage-Dx7SxA23.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-CnLzopLL.js.map → CredentialsPage-Dx7SxA23.js.map} +1 -1
- package/dashboard/dist/assets/{CronLabel-CAD5UYDT.js → CronLabel-LYPxpvNN.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-CAD5UYDT.js.map → CronLabel-LYPxpvNN.js.map} +1 -1
- package/dashboard/dist/assets/DataTable-spX1dFyb.js +2 -0
- package/dashboard/dist/assets/DataTable-spX1dFyb.js.map +1 -0
- package/dashboard/dist/assets/{DropZone-XlcY8hEH.js → DropZone-f1o-GLM8.js} +2 -2
- package/dashboard/dist/assets/{DropZone-XlcY8hEH.js.map → DropZone-f1o-GLM8.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-CwO4ufd0.js → ElapsedCell-BZJTSm9N.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-CwO4ufd0.js.map → ElapsedCell-BZJTSm9N.js.map} +1 -1
- package/dashboard/dist/assets/EntityTimelinePanel-0wIIW2en.js +2 -0
- package/dashboard/dist/assets/{EntityTimelinePanel-CkF-oW-m.js.map → EntityTimelinePanel-0wIIW2en.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationListSchemaPage-h9JO_q5f.js → EscalationListSchemaPage-CoYvtMzj.js} +3 -3
- package/dashboard/dist/assets/{EscalationListSchemaPage-h9JO_q5f.js.map → EscalationListSchemaPage-CoYvtMzj.js.map} +1 -1
- package/dashboard/dist/assets/EscalationListView-DWFHPufv.js +2 -0
- package/dashboard/dist/assets/EscalationListView-DWFHPufv.js.map +1 -0
- package/dashboard/dist/assets/{EscalationSchemaPage-mJFL5_Se.js → EscalationSchemaPage-C9Xu_A25.js} +3 -3
- package/dashboard/dist/assets/{EscalationSchemaPage-mJFL5_Se.js.map → EscalationSchemaPage-C9Xu_A25.js.map} +1 -1
- package/dashboard/dist/assets/EscalationTimeline-D8W2LNNk.js +2 -0
- package/dashboard/dist/assets/EscalationTimeline-D8W2LNNk.js.map +1 -0
- package/dashboard/dist/assets/EscalationTitleSelect-DLK8NWMp.js +2 -0
- package/dashboard/dist/assets/EscalationTitleSelect-DLK8NWMp.js.map +1 -0
- package/dashboard/dist/assets/{EscalationsOverview-DlXUFqWJ.js → EscalationsOverview-CW57FaP9.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-DlXUFqWJ.js.map → EscalationsOverview-CW57FaP9.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-Ike2xchn.js → EventTable-D1ctWhKf.js} +2 -2
- package/dashboard/dist/assets/{EventTable-Ike2xchn.js.map → EventTable-D1ctWhKf.js.map} +1 -1
- package/dashboard/dist/assets/{FilterBar-DMOR-O1c.js → FilterBar-C-iur-Nj.js} +2 -2
- package/dashboard/dist/assets/{FilterBar-DMOR-O1c.js.map → FilterBar-C-iur-Nj.js.map} +1 -1
- package/dashboard/dist/assets/GraphInvokePage-CcA_44M4.js +2 -0
- package/dashboard/dist/assets/{GraphInvokePage-CKtvWowP.js.map → GraphInvokePage-CcA_44M4.js.map} +1 -1
- package/dashboard/dist/assets/HomePage-Dc085ghJ.js +2 -0
- package/dashboard/dist/assets/{HomePage-BQ3Q791Q.js.map → HomePage-Dc085ghJ.js.map} +1 -1
- package/dashboard/dist/assets/ListToolbar-h_ziBt4O.js +2 -0
- package/dashboard/dist/assets/{ListToolbar-DdJzj472.js.map → ListToolbar-h_ziBt4O.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-BbtrduWn.js → McpOverview-qXXhbNWV.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-BbtrduWn.js.map → McpOverview-qXXhbNWV.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryDetailPage-C1L4T-Wt.js → McpQueryDetailPage-SEzSbZrd.js} +2 -2
- package/dashboard/dist/assets/{McpQueryDetailPage-C1L4T-Wt.js.map → McpQueryDetailPage-SEzSbZrd.js.map} +1 -1
- package/dashboard/dist/assets/McpQueryPage-Cy0V0kv9.js +2 -0
- package/dashboard/dist/assets/{McpQueryPage-CfJy7HZ7.js.map → McpQueryPage-Cy0V0kv9.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunDetailPage-CA9yv7he.js → McpRunDetailPage-DjJO5vSb.js} +2 -2
- package/dashboard/dist/assets/{McpRunDetailPage-CA9yv7he.js.map → McpRunDetailPage-DjJO5vSb.js.map} +1 -1
- package/dashboard/dist/assets/McpRunsPage-BfjiJ8mM.js +2 -0
- package/dashboard/dist/assets/{McpRunsPage-D7QXjW9z.js.map → McpRunsPage-BfjiJ8mM.js.map} +1 -1
- package/dashboard/dist/assets/{NamespacePill-Bb3revqD.js → NamespacePill-DADRJOUl.js} +2 -2
- package/dashboard/dist/assets/{NamespacePill-Bb3revqD.js.map → NamespacePill-DADRJOUl.js.map} +1 -1
- package/dashboard/dist/assets/OperationsPage-dJcER0T_.js +3 -0
- package/dashboard/dist/assets/OperationsPage-dJcER0T_.js.map +1 -0
- package/dashboard/dist/assets/OperatorDashboard-zCkW4eqk.js +2 -0
- package/dashboard/dist/assets/{OperatorDashboard-sXNDh1Ph.js.map → OperatorDashboard-zCkW4eqk.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeader-Di5Sz3an.js → PageHeader-Csq434-v.js} +2 -2
- package/dashboard/dist/assets/{PageHeader-Di5Sz3an.js.map → PageHeader-Csq434-v.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeaderWithStats-DutKJ-h2.js → PageHeaderWithStats-CSnk1p5A.js} +2 -2
- package/dashboard/dist/assets/{PageHeaderWithStats-DutKJ-h2.js.map → PageHeaderWithStats-CSnk1p5A.js.map} +1 -1
- package/dashboard/dist/assets/{PersonaDetailPage-NeHD-Gra.js → PersonaDetailPage-Cx6L3Jvu.js} +2 -2
- package/dashboard/dist/assets/{PersonaDetailPage-NeHD-Gra.js.map → PersonaDetailPage-Cx6L3Jvu.js.map} +1 -1
- package/dashboard/dist/assets/{PersonasPage-DavKXRWX.js → PersonasPage-DOgGUlJl.js} +2 -2
- package/dashboard/dist/assets/{PersonasPage-DavKXRWX.js.map → PersonasPage-DOgGUlJl.js.map} +1 -1
- package/dashboard/dist/assets/PortalPage-BKuL1BeJ.js +2 -0
- package/dashboard/dist/assets/PortalPage-BKuL1BeJ.js.map +1 -0
- package/dashboard/dist/assets/{ProcessDetailPage-DkdKJGe6.js → ProcessDetailPage-BFcFSDUv.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-DkdKJGe6.js.map → ProcessDetailPage-BFcFSDUv.js.map} +1 -1
- package/dashboard/dist/assets/ProcessesListPage-BaHV2cXp.js +2 -0
- package/dashboard/dist/assets/{ProcessesListPage-CjwVKe32.js.map → ProcessesListPage-BaHV2cXp.js.map} +1 -1
- package/dashboard/dist/assets/ResolverForm-Bgc0Zrya.js +7 -0
- package/dashboard/dist/assets/ResolverForm-Bgc0Zrya.js.map +1 -0
- package/dashboard/dist/assets/RoleDetailPage-BPY6i3CU.js +8 -0
- package/dashboard/dist/assets/RoleDetailPage-BPY6i3CU.js.map +1 -0
- package/dashboard/dist/assets/{RolePill-DhnVPK4q.js → RolePill-BafrASDX.js} +2 -2
- package/dashboard/dist/assets/{RolePill-DhnVPK4q.js.map → RolePill-BafrASDX.js.map} +1 -1
- package/dashboard/dist/assets/{RolesPage-OM9KM8Pg.js → RolesPage-DSqqKPbv.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-OM9KM8Pg.js.map → RolesPage-DSqqKPbv.js.map} +1 -1
- package/dashboard/dist/assets/RunAsSelector-B29iWwel.js +2 -0
- package/dashboard/dist/assets/{RunAsSelector-fFMt1bGe.js.map → RunAsSelector-B29iWwel.js.map} +1 -1
- package/dashboard/dist/assets/{ScanCodesPage-AujH-pPQ.js → ScanCodesPage-S8aAJfnC.js} +2 -2
- package/dashboard/dist/assets/{ScanCodesPage-AujH-pPQ.js.map → ScanCodesPage-S8aAJfnC.js.map} +1 -1
- package/dashboard/dist/assets/{ScanSchemeDetailPage-eKQpmsC_.js → ScanSchemeDetailPage-CUBRAtmJ.js} +2 -2
- package/dashboard/dist/assets/{ScanSchemeDetailPage-eKQpmsC_.js.map → ScanSchemeDetailPage-CUBRAtmJ.js.map} +1 -1
- package/dashboard/dist/assets/ScanStationPage-R9t1-CeQ.js +2 -0
- package/dashboard/dist/assets/{ScanStationPage-C1_ppDoZ.js.map → ScanStationPage-R9t1-CeQ.js.map} +1 -1
- package/dashboard/dist/assets/{ScopeBadge-CXUg0FHo.js → ScopeBadge-b6MIBiYD.js} +2 -2
- package/dashboard/dist/assets/{ScopeBadge-CXUg0FHo.js.map → ScopeBadge-b6MIBiYD.js.map} +1 -1
- package/dashboard/dist/assets/{StickyPagination-B91Pk9xh.js → StickyPagination-CkW_A507.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-B91Pk9xh.js.map → StickyPagination-CkW_A507.js.map} +1 -1
- package/dashboard/dist/assets/{StreamMessageDetail-C7SPqaJt.js → StreamMessageDetail-yzWX0wac.js} +2 -2
- package/dashboard/dist/assets/{StreamMessageDetail-C7SPqaJt.js.map → StreamMessageDetail-yzWX0wac.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-BcHR8ylf.js → SwimlaneTimeline-Cf4DXFxj.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-BcHR8ylf.js.map → SwimlaneTimeline-Cf4DXFxj.js.map} +1 -1
- package/dashboard/dist/assets/{TagInput-BZ8vb2oW.js → TagInput-ZrIIrEUP.js} +2 -2
- package/dashboard/dist/assets/{TagInput-BZ8vb2oW.js.map → TagInput-ZrIIrEUP.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-Bqj0I_I0.js → TaskDetailPage-DCDcEps9.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-Bqj0I_I0.js.map → TaskDetailPage-DCDcEps9.js.map} +1 -1
- package/dashboard/dist/assets/{TaskQueuePill-Bxir8WRl.js → TaskQueuePill-DkQ1uc6y.js} +2 -2
- package/dashboard/dist/assets/{TaskQueuePill-Bxir8WRl.js.map → TaskQueuePill-DkQ1uc6y.js.map} +1 -1
- package/dashboard/dist/assets/TasksListPage-BBATgpf7.js +2 -0
- package/dashboard/dist/assets/{TasksListPage-BB1f79lL.js.map → TasksListPage-BBATgpf7.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-BFnODmNe.js → TimeAgo-CSNVEjch.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-BFnODmNe.js.map → TimeAgo-CSNVEjch.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-BXgLOBsr.js → TimestampCell-Du1nBrPn.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-BXgLOBsr.js.map → TimestampCell-Du1nBrPn.js.map} +1 -1
- package/dashboard/dist/assets/{ToolPill-FkgTXIhq.js → ToolPill-Baxm02L6.js} +2 -2
- package/dashboard/dist/assets/{ToolPill-FkgTXIhq.js.map → ToolPill-Baxm02L6.js.map} +1 -1
- package/dashboard/dist/assets/ToolTestPanel-CF-h_5Rg.js +2 -0
- package/dashboard/dist/assets/{ToolTestPanel-Bwe3J5lj.js.map → ToolTestPanel-CF-h_5Rg.js.map} +1 -1
- package/dashboard/dist/assets/{TopicDetailPage-DAF07vZ9.js → TopicDetailPage-Dr1UmWcp.js} +3 -3
- package/dashboard/dist/assets/{TopicDetailPage-DAF07vZ9.js.map → TopicDetailPage-Dr1UmWcp.js.map} +1 -1
- package/dashboard/dist/assets/TopicsPage-CUUo-Ylf.js +2 -0
- package/dashboard/dist/assets/{TopicsPage-C1gxBUap.js.map → TopicsPage-CUUo-Ylf.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-BzXJUE6q.js → UserName-kBh1dc39.js} +2 -2
- package/dashboard/dist/assets/{UserName-BzXJUE6q.js.map → UserName-kBh1dc39.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowExecutionPage-SkRU5cRX.js → WorkflowExecutionPage-CCRSbnDx.js} +2 -2
- package/dashboard/dist/assets/{WorkflowExecutionPage-SkRU5cRX.js.map → WorkflowExecutionPage-CCRSbnDx.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowPill--AYMW7u_.js → WorkflowPill-ZepbO_ny.js} +2 -2
- package/dashboard/dist/assets/{WorkflowPill--AYMW7u_.js.map → WorkflowPill-ZepbO_ny.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowsDashboard-BNQVvyek.js +2 -0
- package/dashboard/dist/assets/{WorkflowsDashboard-CZAqRk1N.js.map → WorkflowsDashboard-BNQVvyek.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsOverview-BoN44VTE.js → WorkflowsOverview-DswubNJN.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-BoN44VTE.js.map → WorkflowsOverview-DswubNJN.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-CqjhtdJf.js → YamlWorkflowDetailPage-Cw9Dlmup.js} +11 -11
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-CqjhtdJf.js.map → YamlWorkflowDetailPage-Cw9Dlmup.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowsPage-CwnJkzyb.js → YamlWorkflowsPage-DB8xnIXy.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowsPage-CwnJkzyb.js.map → YamlWorkflowsPage-DB8xnIXy.js.map} +1 -1
- package/dashboard/dist/assets/{agents-gV0Ys-sY.js → agents-BwEnf6N9.js} +2 -2
- package/dashboard/dist/assets/{agents-gV0Ys-sY.js.map → agents-BwEnf6N9.js.map} +1 -1
- package/dashboard/dist/assets/{bots-B97itB3I.js → bots-CCmJTT2u.js} +2 -2
- package/dashboard/dist/assets/{bots-B97itB3I.js.map → bots-CCmJTT2u.js.map} +1 -1
- package/dashboard/dist/assets/{capabilities-CR9xZgGd.js → capabilities-BZHgp_nh.js} +2 -2
- package/dashboard/dist/assets/{capabilities-CR9xZgGd.js.map → capabilities-BZHgp_nh.js.map} +1 -1
- package/dashboard/dist/assets/{constants-BHkpVaqx.js → constants-CeBBTzf5.js} +2 -2
- package/dashboard/dist/assets/{constants-BHkpVaqx.js.map → constants-CeBBTzf5.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-YxvP1KCa.js → controlplane-CyfwUlFA.js} +2 -2
- package/dashboard/dist/assets/{controlplane-YxvP1KCa.js.map → controlplane-CyfwUlFA.js.map} +1 -1
- package/dashboard/dist/assets/escalation-columns-BJPTNmLW.js +2 -0
- package/dashboard/dist/assets/escalation-columns-BJPTNmLW.js.map +1 -0
- package/dashboard/dist/assets/index-3gbd5neL.js +67 -0
- package/dashboard/dist/assets/index-3gbd5neL.js.map +1 -0
- package/dashboard/dist/assets/index-BAAVTyZ-.js +2 -0
- package/dashboard/dist/assets/{index-BQpV-DTG.js.map → index-BAAVTyZ-.js.map} +1 -1
- package/dashboard/dist/assets/{index-B9BBCqLI.js → index-BC6Jenlo.js} +2 -2
- package/dashboard/dist/assets/{index-B9BBCqLI.js.map → index-BC6Jenlo.js.map} +1 -1
- package/dashboard/dist/assets/index-C7KHqOTQ.js +2 -0
- package/dashboard/dist/assets/{index-Bp9KBLT5.js.map → index-C7KHqOTQ.js.map} +1 -1
- package/dashboard/dist/assets/index-CDrqqbSR.js +3 -0
- package/dashboard/dist/assets/index-CDrqqbSR.js.map +1 -0
- package/dashboard/dist/assets/index-CVwzCZ43.js +2 -0
- package/dashboard/dist/assets/{index-CFbo9FU9.js.map → index-CVwzCZ43.js.map} +1 -1
- package/dashboard/dist/assets/index-CaGF6TCC.js +2 -0
- package/dashboard/dist/assets/index-CaGF6TCC.js.map +1 -0
- package/dashboard/dist/assets/index-ClVbfe4z.js +13 -0
- package/dashboard/dist/assets/{index-Cfvkl2J0.js.map → index-ClVbfe4z.js.map} +1 -1
- package/dashboard/dist/assets/{index-DMeaiKgf.js → index-CuVkSmj5.js} +2 -2
- package/dashboard/dist/assets/{index-DMeaiKgf.js.map → index-CuVkSmj5.js.map} +1 -1
- package/dashboard/dist/assets/{index-ipqwPavs.js → index-DAuX_PlL.js} +2 -2
- package/dashboard/dist/assets/{index-ipqwPavs.js.map → index-DAuX_PlL.js.map} +1 -1
- package/dashboard/dist/assets/{index-CIpHj4di.js → index-DBWS5QL8.js} +2 -2
- package/dashboard/dist/assets/{index-CIpHj4di.js.map → index-DBWS5QL8.js.map} +1 -1
- package/dashboard/dist/assets/index-DIWCI6HC.js +2 -0
- package/dashboard/dist/assets/{index-CUZ6LYye.js.map → index-DIWCI6HC.js.map} +1 -1
- package/dashboard/dist/assets/{index-DwOnWeu8.js → index-DZ8X_Gp4.js} +2 -2
- package/dashboard/dist/assets/{index-DwOnWeu8.js.map → index-DZ8X_Gp4.js.map} +1 -1
- package/dashboard/dist/assets/index-Dh8MJl3L.css +1 -0
- package/dashboard/dist/assets/{knowledge-XX6cW4Ob.js → knowledge-CqyLhUMg.js} +2 -2
- package/dashboard/dist/assets/{knowledge-XX6cW4Ob.js.map → knowledge-CqyLhUMg.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-CH13hNH2.js → mcp-Cvu6bFYH.js} +2 -2
- package/dashboard/dist/assets/{mcp-CH13hNH2.js.map → mcp-Cvu6bFYH.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-Duydd3JA.js → mcp-query-qC6A3e9l.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-Duydd3JA.js.map → mcp-query-qC6A3e9l.js.map} +1 -1
- package/dashboard/dist/assets/metadata-display-COo3mMCr.js +2 -0
- package/dashboard/dist/assets/metadata-display-COo3mMCr.js.map +1 -0
- package/dashboard/dist/assets/{personas-mDk4lLQS.js → personas-BKN_lJuV.js} +2 -2
- package/dashboard/dist/assets/{personas-mDk4lLQS.js.map → personas-BKN_lJuV.js.map} +1 -1
- package/dashboard/dist/assets/{pipelines-B5GcgCeF.js → pipelines-BldIfv85.js} +2 -2
- package/dashboard/dist/assets/{pipelines-B5GcgCeF.js.map → pipelines-BldIfv85.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-CItmNsRp.js → tasks-B-Uay8uL.js} +2 -2
- package/dashboard/dist/assets/{tasks-CItmNsRp.js.map → tasks-B-Uay8uL.js.map} +1 -1
- package/dashboard/dist/assets/{topics-CJYG7BX5.js → topics-438EQogt.js} +2 -2
- package/dashboard/dist/assets/{topics-CJYG7BX5.js.map → topics-438EQogt.js.map} +1 -1
- package/dashboard/dist/assets/useContainerWidth-DSLp1gEm.js +2 -0
- package/dashboard/dist/assets/useContainerWidth-DSLp1gEm.js.map +1 -0
- package/dashboard/dist/assets/{useDebouncedValue-BrwgXcp8.js → useDebouncedValue-Cw8hYZ8y.js} +2 -2
- package/dashboard/dist/assets/{useDebouncedValue-BrwgXcp8.js.map → useDebouncedValue-Cw8hYZ8y.js.map} +1 -1
- package/dashboard/dist/assets/{useNamespace-CHty0HAS.js → useNamespace-D1218GQ8.js} +2 -2
- package/dashboard/dist/assets/{useNamespace-CHty0HAS.js.map → useNamespace-D1218GQ8.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-CoTsia7t.js → useYamlActivityEvents-BAQf_y_U.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-CoTsia7t.js.map → useYamlActivityEvents-BAQf_y_U.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-DeBdvyKJ.js → vendor-icons-B7OcUM6b.js} +2 -2
- package/dashboard/dist/assets/{vendor-icons-DeBdvyKJ.js.map → vendor-icons-B7OcUM6b.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-CiWwx5rM.js → yaml-workflows-CN01gEB0.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-CiWwx5rM.js.map → yaml-workflows-CN01gEB0.js.map} +1 -1
- package/dashboard/dist/index.html +3 -3
- package/docs/accumulator.md +113 -0
- package/docs/api/http/escalations.md +89 -0
- package/docs/api/http/roles.md +1 -0
- package/docs/api/sdk/escalations.md +91 -0
- package/docs/api/sdk/roles.md +2 -0
- package/docs/architecture.md +1 -1
- package/docs/code-owned-configuration.md +2 -1
- package/docs/dashboard.md +10 -4
- package/docs/hitl/design.md +1 -1
- package/docs/hitl/escalation.md +37 -1
- package/docs/hitl/invoke-form.md +4 -0
- package/docs/hitl/pinned-views.md +4 -0
- package/docs/hitl/portal.md +97 -0
- package/docs/hitl/resolution.md +41 -0
- package/docs/hitl/x-lt-embed.md +1 -1
- package/docs/hitl/x-lt-invoke.md +95 -0
- package/docs/hitl/x-lt-list-schema.md +3 -1
- package/docs/hitl/x-lt-widget.md +1 -0
- package/docs/hitl-guide.md +8 -1
- package/docs/scan-codes.md +15 -2
- package/docs/sdk.md +1 -1
- package/docs/workflows.md +2 -2
- package/package.json +4 -2
- package/dashboard/dist/assets/AgentsPage-7JJBHku8.js +0 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-lz5qwSjg.js +0 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-lz5qwSjg.js.map +0 -1
- package/dashboard/dist/assets/BulkAssignModal-NJBcoj-f.js +0 -2
- package/dashboard/dist/assets/CapabilitiesPage-F8dpNn9B.js +0 -2
- package/dashboard/dist/assets/DataTable-7C7riavf.js +0 -2
- package/dashboard/dist/assets/DataTable-7C7riavf.js.map +0 -1
- package/dashboard/dist/assets/EntityTimelinePanel-CkF-oW-m.js +0 -2
- package/dashboard/dist/assets/EscalationListView-AHW2xtlr.js +0 -2
- package/dashboard/dist/assets/EscalationListView-AHW2xtlr.js.map +0 -1
- package/dashboard/dist/assets/GraphInvokePage-CKtvWowP.js +0 -2
- package/dashboard/dist/assets/HomePage-BQ3Q791Q.js +0 -2
- package/dashboard/dist/assets/ListToolbar-DdJzj472.js +0 -2
- package/dashboard/dist/assets/McpQueryPage-CfJy7HZ7.js +0 -2
- package/dashboard/dist/assets/McpRunsPage-D7QXjW9z.js +0 -2
- package/dashboard/dist/assets/OperationsPage-aLHHAP2X.js +0 -3
- package/dashboard/dist/assets/OperationsPage-aLHHAP2X.js.map +0 -1
- package/dashboard/dist/assets/OperatorDashboard-sXNDh1Ph.js +0 -2
- package/dashboard/dist/assets/ProcessesListPage-CjwVKe32.js +0 -2
- package/dashboard/dist/assets/ResolverForm-Bk-wDkN-.js +0 -3
- package/dashboard/dist/assets/ResolverForm-Bk-wDkN-.js.map +0 -1
- package/dashboard/dist/assets/RoleDetailPage-WQt0y5l7.js +0 -8
- package/dashboard/dist/assets/RoleDetailPage-WQt0y5l7.js.map +0 -1
- package/dashboard/dist/assets/RunAsSelector-fFMt1bGe.js +0 -2
- package/dashboard/dist/assets/ScanStationPage-C1_ppDoZ.js +0 -2
- package/dashboard/dist/assets/TasksListPage-BB1f79lL.js +0 -2
- package/dashboard/dist/assets/ToolTestPanel-Bwe3J5lj.js +0 -2
- package/dashboard/dist/assets/TopicsPage-C1gxBUap.js +0 -2
- package/dashboard/dist/assets/WorkflowsDashboard-CZAqRk1N.js +0 -2
- package/dashboard/dist/assets/escalation-columns-uq-IV2aj.js +0 -2
- package/dashboard/dist/assets/escalation-columns-uq-IV2aj.js.map +0 -1
- package/dashboard/dist/assets/index-3ezfWLkE.js +0 -6
- package/dashboard/dist/assets/index-3ezfWLkE.js.map +0 -1
- package/dashboard/dist/assets/index-BQpV-DTG.js +0 -2
- package/dashboard/dist/assets/index-Bp9KBLT5.js +0 -2
- package/dashboard/dist/assets/index-Bpvfr4OW.css +0 -1
- package/dashboard/dist/assets/index-CFbo9FU9.js +0 -2
- package/dashboard/dist/assets/index-CIwlVfvV.js +0 -67
- package/dashboard/dist/assets/index-CIwlVfvV.js.map +0 -1
- package/dashboard/dist/assets/index-CUZ6LYye.js +0 -2
- package/dashboard/dist/assets/index-Cfvkl2J0.js +0 -13
- package/dashboard/dist/assets/index-SGyrXGp8.js +0 -3
- package/dashboard/dist/assets/index-SGyrXGp8.js.map +0 -1
- package/dashboard/dist/assets/invoke-context-DrVyUEfs.js +0 -2
- package/dashboard/dist/assets/invoke-context-DrVyUEfs.js.map +0 -1
- package/dashboard/dist/assets/metadata-display--TzK0REC.js +0 -2
- package/dashboard/dist/assets/metadata-display--TzK0REC.js.map +0 -1
- package/dashboard/dist/assets/resolver-payload-m9AGKZ3a.js +0 -2
- package/dashboard/dist/assets/resolver-payload-m9AGKZ3a.js.map +0 -1
- package/docs/compilation.md +0 -152
- package/docs/compiler.md +0 -311
- package/docs/contributing.md +0 -56
- package/docs/design-principles.md +0 -245
- package/docs/schema-exchange.md +0 -173
- package/docs/self-test.md +0 -106
- package/docs/story.md +0 -184
|
@@ -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.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.timelineByFacet = exports.aggregateByFacets = exports.claimByFacets = exports.claimGroups = exports.searchByFacets = exports.bulkCancel = exports.cancelSingleEscalation = exports.resolveByMetadata = exports.claimByMetadata = exports.findByMetadata = exports.itemsView = 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");
|
|
@@ -37,6 +37,15 @@ var resolve_batch_1 = require("./resolve-batch");
|
|
|
37
37
|
Object.defineProperty(exports, "resolveBatchItem", { enumerable: true, get: function () { return resolve_batch_1.resolveBatchItem; } });
|
|
38
38
|
Object.defineProperty(exports, "resolveBatchItemBySignalKey", { enumerable: true, get: function () { return resolve_batch_1.resolveBatchItemBySignalKey; } });
|
|
39
39
|
Object.defineProperty(exports, "resolveBatchItemByMetadata", { enumerable: true, get: function () { return resolve_batch_1.resolveBatchItemByMetadata; } });
|
|
40
|
+
var accumulate_1 = require("./accumulate");
|
|
41
|
+
Object.defineProperty(exports, "accumulateItem", { enumerable: true, get: function () { return accumulate_1.accumulateItem; } });
|
|
42
|
+
Object.defineProperty(exports, "accumulateItemBySignalKey", { enumerable: true, get: function () { return accumulate_1.accumulateItemBySignalKey; } });
|
|
43
|
+
Object.defineProperty(exports, "accumulateItemByMetadata", { enumerable: true, get: function () { return accumulate_1.accumulateItemByMetadata; } });
|
|
44
|
+
Object.defineProperty(exports, "removeItem", { enumerable: true, get: function () { return accumulate_1.removeItem; } });
|
|
45
|
+
Object.defineProperty(exports, "removeItemBySignalKey", { enumerable: true, get: function () { return accumulate_1.removeItemBySignalKey; } });
|
|
46
|
+
Object.defineProperty(exports, "removeItemByMetadata", { enumerable: true, get: function () { return accumulate_1.removeItemByMetadata; } });
|
|
47
|
+
Object.defineProperty(exports, "getEscalationItems", { enumerable: true, get: function () { return accumulate_1.getEscalationItems; } });
|
|
48
|
+
Object.defineProperty(exports, "itemsView", { enumerable: true, get: function () { return accumulate_1.itemsView; } });
|
|
40
49
|
var metadata_1 = require("./metadata");
|
|
41
50
|
Object.defineProperty(exports, "findByMetadata", { enumerable: true, get: function () { return metadata_1.findByMetadata; } });
|
|
42
51
|
Object.defineProperty(exports, "claimByMetadata", { enumerable: true, get: function () { return metadata_1.claimByMetadata; } });
|
package/build/api/roles.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type RolePin, type RolePortal } from '../services/role/types';
|
|
1
2
|
import type { LTApiResult } from '../types/sdk';
|
|
2
3
|
/**
|
|
3
4
|
* List all distinct role names in the system.
|
|
@@ -89,11 +90,9 @@ export declare function updateRole(input: {
|
|
|
89
90
|
/** The escalation LIST schema — rich formatting for this role's list page. */
|
|
90
91
|
list_schema?: Record<string, any> | null;
|
|
91
92
|
/** Pinned-view seeds for the role's members: [{ label, url, badge? }] or null to clear. */
|
|
92
|
-
default_pins?:
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
badge?: boolean;
|
|
96
|
-
}[] | null;
|
|
93
|
+
default_pins?: RolePin[] | null;
|
|
94
|
+
/** The role's named portals, each rows of pin cells; null to clear. */
|
|
95
|
+
portals?: RolePortal[] | null;
|
|
97
96
|
properties?: Record<string, any> | null;
|
|
98
97
|
ops_visible?: boolean;
|
|
99
98
|
/** Make this role's sequence the home Pace Board's default segment (single-holder: setting it clears the previous holder). */
|
package/build/api/roles.js
CHANGED
|
@@ -48,6 +48,7 @@ exports.getRoleListSchema = getRoleListSchema;
|
|
|
48
48
|
exports.listRoleListSchemaVersions = listRoleListSchemaVersions;
|
|
49
49
|
exports.deleteRole = deleteRole;
|
|
50
50
|
const roleService = __importStar(require("../services/role"));
|
|
51
|
+
const types_1 = require("../services/role/types");
|
|
51
52
|
const facet_sql_1 = require("../services/escalation/facet-sql");
|
|
52
53
|
/**
|
|
53
54
|
* List all distinct role names in the system.
|
|
@@ -201,6 +202,50 @@ async function replaceEscalationTargets(input) {
|
|
|
201
202
|
return { status: 500, error: err.message };
|
|
202
203
|
}
|
|
203
204
|
}
|
|
205
|
+
/** A pinned view: a non-blank label over a dashboard-relative url, optionally badged. */
|
|
206
|
+
function isRolePin(p) {
|
|
207
|
+
if (!p || typeof p !== 'object')
|
|
208
|
+
return false;
|
|
209
|
+
const pin = p;
|
|
210
|
+
return typeof pin.label === 'string' && pin.label.trim() !== ''
|
|
211
|
+
&& typeof pin.url === 'string' && pin.url.startsWith('/')
|
|
212
|
+
&& (pin.badge === undefined || typeof pin.badge === 'boolean');
|
|
213
|
+
}
|
|
214
|
+
/** Rows of pin cells within the portal bounds; every row carries at least one pin. */
|
|
215
|
+
function isPortalRows(value) {
|
|
216
|
+
return Array.isArray(value)
|
|
217
|
+
&& value.length >= 1 && value.length <= types_1.PORTAL_LIMITS.MAX_ROWS
|
|
218
|
+
&& value.every((row) => Array.isArray(row)
|
|
219
|
+
&& row.length >= 1 && row.length <= types_1.PORTAL_LIMITS.MAX_COLS
|
|
220
|
+
&& row.every(isRolePin));
|
|
221
|
+
}
|
|
222
|
+
/** A count tile: a pin plus an optional blurb. */
|
|
223
|
+
function isPortalCount(value) {
|
|
224
|
+
if (!value || typeof value !== 'object')
|
|
225
|
+
return false;
|
|
226
|
+
const blurb = value.blurb;
|
|
227
|
+
return isRolePin(value) && (blurb === undefined || typeof blurb === 'string');
|
|
228
|
+
}
|
|
229
|
+
/** A named portal: slug key, non-blank label, a valid matrix, optional bounded counts. */
|
|
230
|
+
function isRolePortal(value) {
|
|
231
|
+
if (!value || typeof value !== 'object')
|
|
232
|
+
return false;
|
|
233
|
+
const portal = value;
|
|
234
|
+
const countsOk = portal.counts === undefined
|
|
235
|
+
|| (Array.isArray(portal.counts) && portal.counts.length <= types_1.PORTAL_LIMITS.MAX_COUNTS && portal.counts.every(isPortalCount));
|
|
236
|
+
return typeof portal.key === 'string' && types_1.PORTAL_KEY.test(portal.key)
|
|
237
|
+
&& typeof portal.label === 'string' && portal.label.trim() !== ''
|
|
238
|
+
&& isPortalRows(portal.rows)
|
|
239
|
+
&& countsOk;
|
|
240
|
+
}
|
|
241
|
+
/** The role's portals: bounded in number, every key unique. */
|
|
242
|
+
function isPortalList(value) {
|
|
243
|
+
if (!Array.isArray(value) || value.length < 1 || value.length > types_1.PORTAL_LIMITS.MAX_PORTALS)
|
|
244
|
+
return false;
|
|
245
|
+
if (!value.every(isRolePortal))
|
|
246
|
+
return false;
|
|
247
|
+
return new Set(value.map((p) => p.key)).size === value.length;
|
|
248
|
+
}
|
|
204
249
|
/**
|
|
205
250
|
* Update role metadata. Fields omitted from input are left unchanged.
|
|
206
251
|
* form_schema, metadata_schema, and parent_role can be set to null to clear them.
|
|
@@ -241,14 +286,17 @@ async function updateRole(input) {
|
|
|
241
286
|
return { status: 400, error: 'parent_role must reference a different role' };
|
|
242
287
|
}
|
|
243
288
|
if (input.default_pins != null) {
|
|
244
|
-
const pinsValid = Array.isArray(input.default_pins) && input.default_pins.every(
|
|
245
|
-
&& typeof p.label === 'string' && p.label.trim() !== ''
|
|
246
|
-
&& typeof p.url === 'string' && p.url.startsWith('/')
|
|
247
|
-
&& (p.badge === undefined || typeof p.badge === 'boolean'));
|
|
289
|
+
const pinsValid = Array.isArray(input.default_pins) && input.default_pins.every(isRolePin);
|
|
248
290
|
if (!pinsValid) {
|
|
249
291
|
return { status: 400, error: 'default_pins must be [{ label, url, badge? }] with dashboard-relative urls' };
|
|
250
292
|
}
|
|
251
293
|
}
|
|
294
|
+
if (input.portals != null && !isPortalList(input.portals)) {
|
|
295
|
+
return {
|
|
296
|
+
status: 400,
|
|
297
|
+
error: `portals must be 1..${types_1.PORTAL_LIMITS.MAX_PORTALS} of { key (slug, unique), label, rows, counts? }, rows being 1..${types_1.PORTAL_LIMITS.MAX_ROWS} rows of 1..${types_1.PORTAL_LIMITS.MAX_COLS} pins [{ label, url, badge? }] with dashboard-relative urls, counts up to ${types_1.PORTAL_LIMITS.MAX_COUNTS} of { label, url, blurb? }`,
|
|
298
|
+
};
|
|
299
|
+
}
|
|
252
300
|
if (input.upstream_roles != null) {
|
|
253
301
|
if (!Array.isArray(input.upstream_roles) || input.upstream_roles.some((u) => typeof u !== 'string' || !u.trim())) {
|
|
254
302
|
return { status: 400, error: 'upstream_roles must be an array of role names' };
|
|
@@ -269,6 +317,7 @@ async function updateRole(input) {
|
|
|
269
317
|
metadata_schema: input.metadata_schema,
|
|
270
318
|
list_schema: input.list_schema,
|
|
271
319
|
default_pins: input.default_pins,
|
|
320
|
+
portals: input.portals,
|
|
272
321
|
properties: input.properties,
|
|
273
322
|
ops_visible: input.ops_visible,
|
|
274
323
|
ops_home_default: input.ops_home_default,
|
|
@@ -171,6 +171,8 @@ async function executeStep(step, index, ctx) {
|
|
|
171
171
|
return (0, verbs_1.releaseStep)(step, ctx);
|
|
172
172
|
case types_1.SCAN_VERBS.CANCEL:
|
|
173
173
|
return (0, verbs_1.cancelStep)(step, ctx);
|
|
174
|
+
case types_1.SCAN_VERBS.ACCUMULATE:
|
|
175
|
+
return (0, verbs_1.accumulateStep)(step, ctx);
|
|
174
176
|
default:
|
|
175
177
|
throw new Error(`unknown scan verb "${step.verb}"`);
|
|
176
178
|
}
|
|
@@ -13,3 +13,18 @@ export declare function releaseStep(step: ScanStep, ctx: StepContext): Promise<L
|
|
|
13
13
|
*/
|
|
14
14
|
export declare function dispatchChoiceVerb(step: ScanStep, ctx: StepContext, row: Record<string, any>): Promise<LTApiResult<ScanExecuteResponse>>;
|
|
15
15
|
export declare function cancelStep(step: ScanStep, ctx: StepContext): Promise<LTApiResult<ScanExecuteResponse> | null>;
|
|
16
|
+
/**
|
|
17
|
+
* Adds the scanned item to an accumulator. Two modes, one atomic write:
|
|
18
|
+
*
|
|
19
|
+
* - Item-locate (`params.accumulate.containerFacet`): the scan locates the
|
|
20
|
+
* item's own pending row through the scheme facet, reads the container
|
|
21
|
+
* facet value it carries, and adds the target to the container that shares
|
|
22
|
+
* it, writing the item row as the reciprocal in the same statement. An
|
|
23
|
+
* item with no row, or no container facet, falls through.
|
|
24
|
+
* - Container-locate (no `containerFacet`): the scan locates the container
|
|
25
|
+
* by the scheme facet and adds `params.itemKey` (template).
|
|
26
|
+
*
|
|
27
|
+
* The write is the SDK's guarded statement; the locate only picks ids. A
|
|
28
|
+
* container already holding the item answers conflict, never a second add.
|
|
29
|
+
*/
|
|
30
|
+
export declare function accumulateStep(step: ScanStep, ctx: StepContext): Promise<LTApiResult<ScanExecuteResponse> | null>;
|
|
@@ -39,14 +39,17 @@ exports.escalateStep = escalateStep;
|
|
|
39
39
|
exports.releaseStep = releaseStep;
|
|
40
40
|
exports.dispatchChoiceVerb = dispatchChoiceVerb;
|
|
41
41
|
exports.cancelStep = cancelStep;
|
|
42
|
+
exports.accumulateStep = accumulateStep;
|
|
42
43
|
const scanCodeService = __importStar(require("../../services/scan-code"));
|
|
43
44
|
const escalationService = __importStar(require("../../services/escalation"));
|
|
44
45
|
const metadata_1 = require("../escalations/metadata");
|
|
46
|
+
const accumulate_1 = require("../escalations/accumulate");
|
|
45
47
|
const create_1 = require("../escalations/create");
|
|
46
48
|
const claim_1 = require("../escalations/claim");
|
|
47
49
|
const helpers_1 = require("../escalations/helpers");
|
|
48
50
|
const types_1 = require("../../types");
|
|
49
51
|
const context_1 = require("./context");
|
|
52
|
+
const locate_1 = require("./locate");
|
|
50
53
|
// ── Mutating verbs — each a single atomic operation under the ACTOR's RBAC ──
|
|
51
54
|
// ctx.auth is the effective actor: the badged person when a grant rode the
|
|
52
55
|
// request, otherwise the authenticated principal. Attribution and write
|
|
@@ -203,3 +206,65 @@ async function cancelStep(step, ctx) {
|
|
|
203
206
|
return (0, context_1.conflict)('Escalation is not cancellable (already terminal)');
|
|
204
207
|
return (0, context_1.executed)(cancelled, step);
|
|
205
208
|
}
|
|
209
|
+
/**
|
|
210
|
+
* Adds the scanned item to an accumulator. Two modes, one atomic write:
|
|
211
|
+
*
|
|
212
|
+
* - Item-locate (`params.accumulate.containerFacet`): the scan locates the
|
|
213
|
+
* item's own pending row through the scheme facet, reads the container
|
|
214
|
+
* facet value it carries, and adds the target to the container that shares
|
|
215
|
+
* it, writing the item row as the reciprocal in the same statement. An
|
|
216
|
+
* item with no row, or no container facet, falls through.
|
|
217
|
+
* - Container-locate (no `containerFacet`): the scan locates the container
|
|
218
|
+
* by the scheme facet and adds `params.itemKey` (template).
|
|
219
|
+
*
|
|
220
|
+
* The write is the SDK's guarded statement; the locate only picks ids. A
|
|
221
|
+
* container already holding the item answers conflict, never a second add.
|
|
222
|
+
*/
|
|
223
|
+
async function accumulateStep(step, ctx) {
|
|
224
|
+
const tpl = (0, context_1.templateContext)(ctx);
|
|
225
|
+
const payload = step.params?.resolverPayload
|
|
226
|
+
? scanCodeService.interpolateScanTemplate(step.params.resolverPayload, tpl)
|
|
227
|
+
: undefined;
|
|
228
|
+
const metadata = { ...(0, context_1.interpolatedMetadata)(step, ctx), ...(0, context_1.provenance)(ctx) };
|
|
229
|
+
const options = step.params?.accumulate;
|
|
230
|
+
let request;
|
|
231
|
+
if (options?.containerFacet) {
|
|
232
|
+
const located = await (0, locate_1.locateForStep)(step, ctx, 1);
|
|
233
|
+
const item = located?.escalations[0];
|
|
234
|
+
if (!item)
|
|
235
|
+
return null;
|
|
236
|
+
const containerValue = item.metadata?.[options.containerFacet];
|
|
237
|
+
if (containerValue === undefined || containerValue === null || containerValue === '')
|
|
238
|
+
return null;
|
|
239
|
+
request = {
|
|
240
|
+
key: options.containerFacet,
|
|
241
|
+
value: String(containerValue),
|
|
242
|
+
itemKey: ctx.parsed.target,
|
|
243
|
+
payload,
|
|
244
|
+
metadata,
|
|
245
|
+
restrictRoles: options.containerRoles,
|
|
246
|
+
...(options.reciprocal === false ? {} : { reciprocal: { id: item.id } }),
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
request = {
|
|
251
|
+
key: ctx.scheme.target_facet,
|
|
252
|
+
value: ctx.parsed.target,
|
|
253
|
+
itemKey: scanCodeService.interpolateScanTemplate(step.params.itemKey, tpl),
|
|
254
|
+
payload,
|
|
255
|
+
metadata,
|
|
256
|
+
restrictRoles: step.query?.roles,
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
const result = await (0, accumulate_1.accumulateItemByMetadata)(request, ctx.auth);
|
|
260
|
+
if (result.status === 404)
|
|
261
|
+
return null;
|
|
262
|
+
if (result.status === 403)
|
|
263
|
+
return (0, context_1.forbidden)(result.error);
|
|
264
|
+
if (result.status === 409)
|
|
265
|
+
return (0, context_1.conflict)(result.error);
|
|
266
|
+
if (result.status !== 200)
|
|
267
|
+
return result;
|
|
268
|
+
const escalation = result.data.escalationId ? { id: result.data.escalationId, ...result.data } : undefined;
|
|
269
|
+
return (0, context_1.executed)(escalation, step);
|
|
270
|
+
}
|
package/build/index.js
CHANGED
|
@@ -168,6 +168,66 @@ async function main() {
|
|
|
168
168
|
},
|
|
169
169
|
},
|
|
170
170
|
examples: true,
|
|
171
|
+
// Code-owned declaration for the reviewer queue the examples route to: a
|
|
172
|
+
// portal that leads with the queue's counts and lays its lists beneath.
|
|
173
|
+
// `reset` keeps the declaration applied on every boot.
|
|
174
|
+
roles: [
|
|
175
|
+
{
|
|
176
|
+
role: 'reviewer',
|
|
177
|
+
title: 'Reviewer',
|
|
178
|
+
reset: true,
|
|
179
|
+
portals: [
|
|
180
|
+
{
|
|
181
|
+
key: 'review-desk',
|
|
182
|
+
label: 'Review desk',
|
|
183
|
+
counts: [
|
|
184
|
+
{ label: 'Waiting', url: '/escalations/available?role=reviewer', blurb: 'Unclaimed items in the queue' },
|
|
185
|
+
{ label: 'In progress', url: '/escalations/available?role=reviewer&status=claimed', blurb: 'Claimed and being worked' },
|
|
186
|
+
{ label: 'Resolved', url: '/escalations/available?role=reviewer&status=resolved', blurb: 'Closed out by a reviewer' },
|
|
187
|
+
{ label: 'Expired', url: '/escalations/available?role=reviewer&status=expired', blurb: 'Timed out before anyone acted' },
|
|
188
|
+
{ label: 'Cancelled', url: '/escalations/available?role=reviewer&status=cancelled', blurb: 'Withdrawn by the workflow' },
|
|
189
|
+
],
|
|
190
|
+
rows: [
|
|
191
|
+
[
|
|
192
|
+
{ label: 'Waiting', url: '/escalations/available?role=reviewer&view=table&layout=compact', badge: true },
|
|
193
|
+
{ label: 'In progress', url: '/escalations/available?role=reviewer&status=claimed&view=table&layout=compact', badge: true },
|
|
194
|
+
],
|
|
195
|
+
],
|
|
196
|
+
},
|
|
197
|
+
],
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
// The rollup-bin example's container queue: the list shows each
|
|
201
|
+
// bin's fill level from the accumulator facets.
|
|
202
|
+
role: 'bin',
|
|
203
|
+
title: 'Bin',
|
|
204
|
+
description: 'Open containers filling with scanned bags. Ships at max or when the window closes.',
|
|
205
|
+
reset: true,
|
|
206
|
+
list_schema: {
|
|
207
|
+
'x-lt-layout': 'facet-table',
|
|
208
|
+
'x-lt-columns': [
|
|
209
|
+
{ label: 'Bin', value: '{{metadata.binKey}}' },
|
|
210
|
+
{ label: 'Held', value: '{{metadata.accumulate_count}}' },
|
|
211
|
+
{ label: 'Max', value: '{{metadata.accumulate_max}}', priority: 2 },
|
|
212
|
+
{ label: 'Open since', value: '{{escalation.created_at}}', format: 'age', priority: 2 },
|
|
213
|
+
],
|
|
214
|
+
},
|
|
215
|
+
},
|
|
216
|
+
{
|
|
217
|
+
role: 'bag',
|
|
218
|
+
title: 'Bag',
|
|
219
|
+
description: 'Bags waiting to be scanned into a bin.',
|
|
220
|
+
reset: true,
|
|
221
|
+
list_schema: {
|
|
222
|
+
'x-lt-layout': 'facet-table',
|
|
223
|
+
'x-lt-columns': [
|
|
224
|
+
{ label: 'Order', value: '{{metadata.orderId}}' },
|
|
225
|
+
{ label: 'Bin', value: '{{metadata.binKey}}', priority: 2 },
|
|
226
|
+
{ label: 'Waiting', value: '{{escalation.created_at}}', format: 'age', priority: 2 },
|
|
227
|
+
],
|
|
228
|
+
},
|
|
229
|
+
},
|
|
230
|
+
],
|
|
171
231
|
features: {
|
|
172
232
|
// The examples ship the full scan demo (schemes 10/11); surface it.
|
|
173
233
|
scanCodes: true,
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
-- Migration 036: Role portals
|
|
2
|
+
--
|
|
3
|
+
-- portals is a role-owned list of named portal views. Each portal is a matrix
|
|
4
|
+
-- of pins: rows of cells, each cell a pinned view ({ label, url, badge? }).
|
|
5
|
+
-- The dashboard renders a portal as one page of live list panels at
|
|
6
|
+
-- /portal/:role/:portal, the visual form of the role's pinned views: one
|
|
7
|
+
-- portal for urgent items by facility, another for the team's focus of the
|
|
8
|
+
-- day, each cell named for a person and scoped to their facets. Unversioned
|
|
9
|
+
-- config, like default_pins; null means the role declares no portal.
|
|
10
|
+
|
|
11
|
+
ALTER TABLE lt_roles
|
|
12
|
+
ADD COLUMN IF NOT EXISTS portals JSONB;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Router } from 'express';
|
|
2
|
+
/**
|
|
3
|
+
* Open-accumulator routes. The literal single-segment paths are registered
|
|
4
|
+
* before the parameterized routes so /:id never shadows them; the /:id/*
|
|
5
|
+
* forms run as the effective work actor (badge continuity at a station).
|
|
6
|
+
*/
|
|
7
|
+
export declare function registerAccumulateRoutes(router: Router): void;
|
|
@@ -0,0 +1,150 @@
|
|
|
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.registerAccumulateRoutes = registerAccumulateRoutes;
|
|
37
|
+
const api = __importStar(require("../../api/escalations"));
|
|
38
|
+
const acting_1 = require("./acting");
|
|
39
|
+
/**
|
|
40
|
+
* Open-accumulator routes. The literal single-segment paths are registered
|
|
41
|
+
* before the parameterized routes so /:id never shadows them; the /:id/*
|
|
42
|
+
* forms run as the effective work actor (badge continuity at a station).
|
|
43
|
+
*/
|
|
44
|
+
function registerAccumulateRoutes(router) {
|
|
45
|
+
/**
|
|
46
|
+
* POST /api/escalations/accumulate-by-signal-key
|
|
47
|
+
* Add one item to an accumulator escalation by its signal_key.
|
|
48
|
+
* Body: { signalKey, itemKey, payload?, metadata?, reciprocal? }
|
|
49
|
+
*/
|
|
50
|
+
router.post('/accumulate-by-signal-key', async (req, res) => {
|
|
51
|
+
const result = await api.accumulateItemBySignalKey({
|
|
52
|
+
signalKey: req.body?.signalKey,
|
|
53
|
+
itemKey: req.body?.itemKey,
|
|
54
|
+
payload: req.body?.payload,
|
|
55
|
+
metadata: req.body?.metadata,
|
|
56
|
+
reciprocal: req.body?.reciprocal,
|
|
57
|
+
}, req.auth);
|
|
58
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
59
|
+
});
|
|
60
|
+
/**
|
|
61
|
+
* POST /api/escalations/accumulate-by-metadata
|
|
62
|
+
* Add one item to the highest priority pending accumulator whose metadata
|
|
63
|
+
* contains the key/value.
|
|
64
|
+
* Body: { key, value, itemKey, payload?, metadata?, restrictRoles?, reciprocal? }
|
|
65
|
+
*/
|
|
66
|
+
router.post('/accumulate-by-metadata', async (req, res) => {
|
|
67
|
+
const result = await api.accumulateItemByMetadata({
|
|
68
|
+
key: req.body?.key,
|
|
69
|
+
value: req.body?.value,
|
|
70
|
+
itemKey: req.body?.itemKey,
|
|
71
|
+
payload: req.body?.payload,
|
|
72
|
+
metadata: req.body?.metadata,
|
|
73
|
+
restrictRoles: req.body?.restrictRoles,
|
|
74
|
+
reciprocal: req.body?.reciprocal,
|
|
75
|
+
}, req.auth);
|
|
76
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
77
|
+
});
|
|
78
|
+
/**
|
|
79
|
+
* POST /api/escalations/remove-item-by-signal-key
|
|
80
|
+
* Body: { signalKey, itemKey, reciprocal? }
|
|
81
|
+
*/
|
|
82
|
+
router.post('/remove-item-by-signal-key', async (req, res) => {
|
|
83
|
+
const result = await api.removeItemBySignalKey({
|
|
84
|
+
signalKey: req.body?.signalKey,
|
|
85
|
+
itemKey: req.body?.itemKey,
|
|
86
|
+
reciprocal: req.body?.reciprocal,
|
|
87
|
+
}, req.auth);
|
|
88
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
89
|
+
});
|
|
90
|
+
/**
|
|
91
|
+
* POST /api/escalations/remove-item-by-metadata
|
|
92
|
+
* Body: { key, value, itemKey, restrictRoles?, reciprocal? }
|
|
93
|
+
*/
|
|
94
|
+
router.post('/remove-item-by-metadata', async (req, res) => {
|
|
95
|
+
const result = await api.removeItemByMetadata({
|
|
96
|
+
key: req.body?.key,
|
|
97
|
+
value: req.body?.value,
|
|
98
|
+
itemKey: req.body?.itemKey,
|
|
99
|
+
restrictRoles: req.body?.restrictRoles,
|
|
100
|
+
reciprocal: req.body?.reciprocal,
|
|
101
|
+
}, req.auth);
|
|
102
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
103
|
+
});
|
|
104
|
+
/**
|
|
105
|
+
* POST /api/escalations/:id/accumulate
|
|
106
|
+
* Add one item. Interim adds answer { outcome: 'accepted', count, remaining };
|
|
107
|
+
* the add that reaches max answers { outcome: 'completed', signaled } and the
|
|
108
|
+
* waiting workflow resumes with the collection. Claim-agnostic unless
|
|
109
|
+
* assertClaim: true.
|
|
110
|
+
* Body: { itemKey, payload?, metadata?, assertClaim?, reciprocal? }
|
|
111
|
+
*/
|
|
112
|
+
router.post('/:id/accumulate', async (req, res) => {
|
|
113
|
+
const auth = await (0, acting_1.effectiveWorkAuth)(req, res);
|
|
114
|
+
if (!auth)
|
|
115
|
+
return;
|
|
116
|
+
const result = await api.accumulateItem({
|
|
117
|
+
id: req.params.id,
|
|
118
|
+
itemKey: req.body?.itemKey,
|
|
119
|
+
payload: req.body?.payload,
|
|
120
|
+
metadata: req.body?.metadata,
|
|
121
|
+
assertClaim: req.body?.assertClaim,
|
|
122
|
+
reciprocal: req.body?.reciprocal,
|
|
123
|
+
}, auth);
|
|
124
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
125
|
+
});
|
|
126
|
+
/**
|
|
127
|
+
* POST /api/escalations/:id/remove-item
|
|
128
|
+
* Remove one held item; the row stays pending and the waiter never wakes.
|
|
129
|
+
* Body: { itemKey, reciprocal? }
|
|
130
|
+
*/
|
|
131
|
+
router.post('/:id/remove-item', async (req, res) => {
|
|
132
|
+
const auth = await (0, acting_1.effectiveWorkAuth)(req, res);
|
|
133
|
+
if (!auth)
|
|
134
|
+
return;
|
|
135
|
+
const result = await api.removeItem({
|
|
136
|
+
id: req.params.id,
|
|
137
|
+
itemKey: req.body?.itemKey,
|
|
138
|
+
reciprocal: req.body?.reciprocal,
|
|
139
|
+
}, auth);
|
|
140
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
141
|
+
});
|
|
142
|
+
/**
|
|
143
|
+
* GET /api/escalations/:id/items
|
|
144
|
+
* The held items of an accumulator or batch row in arrival order.
|
|
145
|
+
*/
|
|
146
|
+
router.get('/:id/items', async (req, res) => {
|
|
147
|
+
const result = await api.getEscalationItems({ id: req.params.id }, req.auth);
|
|
148
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
149
|
+
});
|
|
150
|
+
}
|
|
@@ -4,6 +4,7 @@ const express_1 = require("express");
|
|
|
4
4
|
const list_1 = require("./list");
|
|
5
5
|
const bulk_1 = require("./bulk");
|
|
6
6
|
const metadata_1 = require("./metadata");
|
|
7
|
+
const accumulate_1 = require("./accumulate");
|
|
7
8
|
const single_1 = require("./single");
|
|
8
9
|
const resolve_1 = require("./resolve");
|
|
9
10
|
const facets_1 = require("./facets");
|
|
@@ -17,6 +18,10 @@ const router = (0, express_1.Router)();
|
|
|
17
18
|
(0, bulk_1.registerBulkRoutes)(router);
|
|
18
19
|
// GET /by-metadata, POST /claim-by-metadata, POST /resolve-by-metadata
|
|
19
20
|
(0, metadata_1.registerMetadataRoutes)(router);
|
|
21
|
+
// POST /accumulate-by-signal-key, /accumulate-by-metadata,
|
|
22
|
+
// /remove-item-by-signal-key, /remove-item-by-metadata,
|
|
23
|
+
// POST /:id/accumulate, POST /:id/remove-item, GET /:id/items
|
|
24
|
+
(0, accumulate_1.registerAccumulateRoutes)(router);
|
|
20
25
|
// POST /search-by-facets, /claim-groups, /claim-by-facets
|
|
21
26
|
(0, facets_1.registerFacetRoutes)(router);
|
|
22
27
|
// POST /aggregate-by-facets, /timeline-by-facet
|
package/build/sdk/index.d.ts
CHANGED
|
@@ -244,6 +244,31 @@ export declare function createClient(options?: LTClientOptions): {
|
|
|
244
244
|
metadata?: Record<string, any>;
|
|
245
245
|
restrictRoles?: string[];
|
|
246
246
|
}, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
|
|
247
|
+
accumulate: (input: {
|
|
248
|
+
id: string;
|
|
249
|
+
} & import("../api/escalations/accumulate").AccumulateItemInput, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
|
|
250
|
+
accumulateBySignalKey: (input: {
|
|
251
|
+
signalKey: string;
|
|
252
|
+
} & Omit<import("../api/escalations/accumulate").AccumulateItemInput, "assertClaim">, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
|
|
253
|
+
accumulateByMetadata: (input: {
|
|
254
|
+
key: string;
|
|
255
|
+
value: string;
|
|
256
|
+
restrictRoles?: string[];
|
|
257
|
+
} & Omit<import("../api/escalations/accumulate").AccumulateItemInput, "assertClaim">, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
|
|
258
|
+
removeItem: (input: {
|
|
259
|
+
id: string;
|
|
260
|
+
} & import("../api/escalations/accumulate").RemoveItemInput, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
|
|
261
|
+
removeItemBySignalKey: (input: {
|
|
262
|
+
signalKey: string;
|
|
263
|
+
} & import("../api/escalations/accumulate").RemoveItemInput, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
|
|
264
|
+
removeItemByMetadata: (input: {
|
|
265
|
+
key: string;
|
|
266
|
+
value: string;
|
|
267
|
+
restrictRoles?: string[];
|
|
268
|
+
} & import("../api/escalations/accumulate").RemoveItemInput, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
|
|
269
|
+
getItems: (input: {
|
|
270
|
+
id: string;
|
|
271
|
+
}, auth?: LTApiAuth) => Promise<LTApiResult<import("../api/escalations/accumulate").EscalationItemsView>>;
|
|
247
272
|
searchByFacets: (input: import("..").FacetQuery, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
|
|
248
273
|
claimGroups: (input: {
|
|
249
274
|
query: import("..").FacetQuery;
|
package/build/sdk/index.js
CHANGED
|
@@ -146,6 +146,14 @@ function createClient(options = {}) {
|
|
|
146
146
|
resolveBatchItem: bindAuth(escalationsApi.resolveBatchItem, auth),
|
|
147
147
|
resolveBatchItemBySignalKey: bindAuth(escalationsApi.resolveBatchItemBySignalKey, auth),
|
|
148
148
|
resolveBatchItemByMetadata: bindAuth(escalationsApi.resolveBatchItemByMetadata, auth),
|
|
149
|
+
// Open accumulation: add and remove held items, read the ordered collection.
|
|
150
|
+
accumulate: bindAuth(escalationsApi.accumulateItem, auth),
|
|
151
|
+
accumulateBySignalKey: bindAuth(escalationsApi.accumulateItemBySignalKey, auth),
|
|
152
|
+
accumulateByMetadata: bindAuth(escalationsApi.accumulateItemByMetadata, auth),
|
|
153
|
+
removeItem: bindAuth(escalationsApi.removeItem, auth),
|
|
154
|
+
removeItemBySignalKey: bindAuth(escalationsApi.removeItemBySignalKey, auth),
|
|
155
|
+
removeItemByMetadata: bindAuth(escalationsApi.removeItemByMetadata, auth),
|
|
156
|
+
getItems: bindAuth(escalationsApi.getEscalationItems, auth),
|
|
149
157
|
// Faceted-routing surface (pond search + batch claim), RBAC-scoped to the caller's role.
|
|
150
158
|
searchByFacets: bindAuth(escalationsApi.searchByFacets, auth),
|
|
151
159
|
claimGroups: bindAuth(escalationsApi.claimGroups, auth),
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import type { AccumulateItemOutcome, LTEscalationRecord, RemoveAccumulatedItemOutcome } from '../../types';
|
|
2
|
+
/** Names the second row of a reciprocal add or removal. Exactly one selector. */
|
|
3
|
+
export interface AccumulateReciprocal {
|
|
4
|
+
id?: string;
|
|
5
|
+
signalKey?: string;
|
|
6
|
+
key?: string;
|
|
7
|
+
value?: unknown;
|
|
8
|
+
roles?: string[];
|
|
9
|
+
/** Stored as the reciprocal entry's payload. */
|
|
10
|
+
payload?: Record<string, any>;
|
|
11
|
+
}
|
|
12
|
+
export interface AccumulateItemInput {
|
|
13
|
+
itemKey: string;
|
|
14
|
+
payload?: Record<string, any>;
|
|
15
|
+
/** Merge patch for the container's GIN-indexed metadata, same statement. */
|
|
16
|
+
metadata?: Record<string, any>;
|
|
17
|
+
/** Recorded on both entries as `actor`. */
|
|
18
|
+
actor?: string;
|
|
19
|
+
/** Claim-lock assertion on the container row (by-id form only). */
|
|
20
|
+
assertClaim?: string;
|
|
21
|
+
resolvedBy?: {
|
|
22
|
+
id: string;
|
|
23
|
+
email?: string;
|
|
24
|
+
};
|
|
25
|
+
reciprocal?: AccumulateReciprocal;
|
|
26
|
+
}
|
|
27
|
+
export interface AccumulateSideOutcome {
|
|
28
|
+
outcome: 'completed' | 'accepted';
|
|
29
|
+
count: number;
|
|
30
|
+
/** `max - count`, or null when the accumulator is unbounded. */
|
|
31
|
+
remaining: number | null;
|
|
32
|
+
escalation: LTEscalationRecord;
|
|
33
|
+
}
|
|
34
|
+
export interface AccumulateItemServiceOutcome {
|
|
35
|
+
outcome: AccumulateItemOutcome;
|
|
36
|
+
/** Items held after the add; -1 on every failure outcome. */
|
|
37
|
+
count: number;
|
|
38
|
+
remaining: number | null;
|
|
39
|
+
/** The post-add container row on `completed`/`accepted`; null on failure. */
|
|
40
|
+
escalation: LTEscalationRecord | null;
|
|
41
|
+
reciprocal?: AccumulateSideOutcome;
|
|
42
|
+
}
|
|
43
|
+
export interface RemoveItemInput {
|
|
44
|
+
itemKey: string;
|
|
45
|
+
actor?: string;
|
|
46
|
+
reciprocal?: Omit<AccumulateReciprocal, 'payload'>;
|
|
47
|
+
}
|
|
48
|
+
export interface RemoveItemServiceOutcome {
|
|
49
|
+
outcome: RemoveAccumulatedItemOutcome;
|
|
50
|
+
count: number;
|
|
51
|
+
escalation: LTEscalationRecord | null;
|
|
52
|
+
reciprocal?: {
|
|
53
|
+
count: number;
|
|
54
|
+
escalation: LTEscalationRecord;
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Adds one item to an accumulator escalation in a single atomic SDK
|
|
59
|
+
* statement (guarded append + facet recompute + resolve-and-wake at max,
|
|
60
|
+
* with the reciprocal row written in the same statement or not at all).
|
|
61
|
+
* Interim adds publish `escalation.updated` with the count; a completing
|
|
62
|
+
* add publishes the standard `escalation.resolved`. Both rows publish.
|
|
63
|
+
* Failure outcomes publish nothing because no row changed.
|
|
64
|
+
*/
|
|
65
|
+
export declare function accumulateItem(id: string, input: AccumulateItemInput): Promise<AccumulateItemServiceOutcome>;
|
|
66
|
+
/** Add selecting the container by its `signal_key`, the deterministic home signal id. */
|
|
67
|
+
export declare function accumulateItemBySignalKey(signalKey: string, input: Omit<AccumulateItemInput, 'assertClaim'>): Promise<AccumulateItemServiceOutcome>;
|
|
68
|
+
/** Add selecting the container by metadata facet, scoped by `roles`. */
|
|
69
|
+
export declare function accumulateItemByMetadata(key: string, value: unknown, input: Omit<AccumulateItemInput, 'assertClaim'> & {
|
|
70
|
+
roles?: string[];
|
|
71
|
+
}): Promise<AccumulateItemServiceOutcome>;
|
|
72
|
+
/**
|
|
73
|
+
* Removes one held item from a pending accumulator escalation (and the
|
|
74
|
+
* container's id from the reciprocal row) in one guarded statement. The
|
|
75
|
+
* waiter never wakes; both rows publish `escalation.updated`.
|
|
76
|
+
*/
|
|
77
|
+
export declare function removeAccumulatedItem(id: string, input: RemoveItemInput): Promise<RemoveItemServiceOutcome>;
|
|
78
|
+
export declare function removeAccumulatedItemBySignalKey(signalKey: string, input: RemoveItemInput): Promise<RemoveItemServiceOutcome>;
|
|
79
|
+
export declare function removeAccumulatedItemByMetadata(key: string, value: unknown, input: RemoveItemInput & {
|
|
80
|
+
roles?: string[];
|
|
81
|
+
}): Promise<RemoveItemServiceOutcome>;
|