@hotmeshio/long-tail 0.20.0 → 0.21.1
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 +104 -0
- package/build/api/escalations/accumulate.js +541 -0
- package/build/api/escalations/index.d.ts +1 -0
- package/build/api/escalations/index.js +11 -1
- package/build/api/roles.d.ts +4 -5
- package/build/api/roles.js +53 -4
- package/build/api/scan-codes/context.d.ts +14 -1
- package/build/api/scan-codes/context.js +30 -2
- package/build/api/scan-codes/execute.js +2 -0
- package/build/api/scan-codes/identity.js +1 -0
- package/build/api/scan-codes/verbs.d.ts +21 -0
- package/build/api/scan-codes/verbs.js +122 -3
- package/build/index.d.ts +2 -1
- package/build/index.js +63 -2
- 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 +158 -0
- package/build/routes/escalations/index.js +5 -0
- package/build/sdk/index.d.ts +28 -0
- package/build/sdk/index.js +9 -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/index.d.ts +1 -1
- package/build/services/scan-code/index.js +3 -1
- package/build/services/scan-code/parse.d.ts +17 -3
- package/build/services/scan-code/parse.js +37 -4
- package/build/services/scan-code/validate.js +35 -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 +44 -0
- package/build/system/mcp-servers/admin/schemas.d.ts +195 -13
- package/build/system/mcp-servers/admin/schemas.js +40 -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 +1108 -100
- 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 +4 -4
- package/build/types/index.js +4 -1
- package/build/types/scan-code.d.ts +55 -1
- package/build/types/scan-code.js +29 -2
- package/build/types/startup.d.ts +20 -0
- package/dashboard/dist/assets/{AdminDashboard-DplvDBti.js → AdminDashboard-Covdam48.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-DplvDBti.js.map → AdminDashboard-Covdam48.js.map} +1 -1
- package/dashboard/dist/assets/{AgentConfigPage-D8Bf6YxO.js → AgentConfigPage-CE1k6J5r.js} +6 -6
- package/dashboard/dist/assets/{AgentConfigPage-D8Bf6YxO.js.map → AgentConfigPage-CE1k6J5r.js.map} +1 -1
- package/dashboard/dist/assets/{AgentDetailPage-BN8g0Y2G.js → AgentDetailPage-CWJZIZP1.js} +3 -3
- package/dashboard/dist/assets/{AgentDetailPage-BN8g0Y2G.js.map → AgentDetailPage-CWJZIZP1.js.map} +1 -1
- package/dashboard/dist/assets/AgentsPage---Dg5ufF.js +2 -0
- package/dashboard/dist/assets/{AgentsPage-7JJBHku8.js.map → AgentsPage---Dg5ufF.js.map} +1 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-CpbC8oTN.js +2 -0
- package/dashboard/dist/assets/AvailableEscalationsPage-CpbC8oTN.js.map +1 -0
- package/dashboard/dist/assets/{BotPicker-CGCnIz8I.js → BotPicker-D3drO3-T.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-CGCnIz8I.js.map → BotPicker-D3drO3-T.js.map} +1 -1
- package/dashboard/dist/assets/BulkAssignModal-BOAWsViq.js +2 -0
- package/dashboard/dist/assets/{BulkAssignModal-NJBcoj-f.js.map → BulkAssignModal-BOAWsViq.js.map} +1 -1
- package/dashboard/dist/assets/CapabilitiesPage-RGgD3YZO.js +2 -0
- package/dashboard/dist/assets/{CapabilitiesPage-F8dpNn9B.js.map → CapabilitiesPage-RGgD3YZO.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-BZW6VpCU.js → CollapsibleSection-DNkZn87n.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-BZW6VpCU.js.map → CollapsibleSection-DNkZn87n.js.map} +1 -1
- package/dashboard/dist/assets/{ConfirmDeleteModal-64adXLdq.js → ConfirmDeleteModal-BqzOwhPr.js} +2 -2
- package/dashboard/dist/assets/{ConfirmDeleteModal-64adXLdq.js.map → ConfirmDeleteModal-BqzOwhPr.js.map} +1 -1
- package/dashboard/dist/assets/{CountdownTimer-BxDub9d2.js → CountdownTimer-BaexQMK6.js} +2 -2
- package/dashboard/dist/assets/{CountdownTimer-BxDub9d2.js.map → CountdownTimer-BaexQMK6.js.map} +1 -1
- package/dashboard/dist/assets/{CredentialsPage-CnLzopLL.js → CredentialsPage-D7abp0aS.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-CnLzopLL.js.map → CredentialsPage-D7abp0aS.js.map} +1 -1
- package/dashboard/dist/assets/{CronLabel-CAD5UYDT.js → CronLabel-DZiWmTwJ.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-CAD5UYDT.js.map → CronLabel-DZiWmTwJ.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-BdGO_w4v.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-CwO4ufd0.js.map → ElapsedCell-BdGO_w4v.js.map} +1 -1
- package/dashboard/dist/assets/EntityTimelinePanel-DIDcF5Yu.js +2 -0
- package/dashboard/dist/assets/{EntityTimelinePanel-CkF-oW-m.js.map → EntityTimelinePanel-DIDcF5Yu.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationListSchemaPage-h9JO_q5f.js → EscalationListSchemaPage-C28rn9XC.js} +3 -3
- package/dashboard/dist/assets/{EscalationListSchemaPage-h9JO_q5f.js.map → EscalationListSchemaPage-C28rn9XC.js.map} +1 -1
- package/dashboard/dist/assets/EscalationListView-CkBnkpDJ.js +2 -0
- package/dashboard/dist/assets/EscalationListView-CkBnkpDJ.js.map +1 -0
- package/dashboard/dist/assets/{EscalationSchemaPage-mJFL5_Se.js → EscalationSchemaPage-W5r0A1kj.js} +3 -3
- package/dashboard/dist/assets/{EscalationSchemaPage-mJFL5_Se.js.map → EscalationSchemaPage-W5r0A1kj.js.map} +1 -1
- package/dashboard/dist/assets/EscalationTimeline-DKyTz6sM.js +2 -0
- package/dashboard/dist/assets/EscalationTimeline-DKyTz6sM.js.map +1 -0
- package/dashboard/dist/assets/EscalationTitleSelect-CzKfavri.js +2 -0
- package/dashboard/dist/assets/EscalationTitleSelect-CzKfavri.js.map +1 -0
- package/dashboard/dist/assets/{EscalationsOverview-DlXUFqWJ.js → EscalationsOverview-Tdu3Yx2c.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-DlXUFqWJ.js.map → EscalationsOverview-Tdu3Yx2c.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-Ike2xchn.js → EventTable-DiIxOJwO.js} +2 -2
- package/dashboard/dist/assets/{EventTable-Ike2xchn.js.map → EventTable-DiIxOJwO.js.map} +1 -1
- package/dashboard/dist/assets/{FilterBar-DMOR-O1c.js → FilterBar-CvMBCVIo.js} +2 -2
- package/dashboard/dist/assets/{FilterBar-DMOR-O1c.js.map → FilterBar-CvMBCVIo.js.map} +1 -1
- package/dashboard/dist/assets/GraphInvokePage-DO-yyhi6.js +2 -0
- package/dashboard/dist/assets/{GraphInvokePage-CKtvWowP.js.map → GraphInvokePage-DO-yyhi6.js.map} +1 -1
- package/dashboard/dist/assets/HomePage-DSS3eHR2.js +2 -0
- package/dashboard/dist/assets/{HomePage-BQ3Q791Q.js.map → HomePage-DSS3eHR2.js.map} +1 -1
- package/dashboard/dist/assets/ListToolbar-C3-Tqqub.js +2 -0
- package/dashboard/dist/assets/{ListToolbar-DdJzj472.js.map → ListToolbar-C3-Tqqub.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-BbtrduWn.js → McpOverview-DEJmsdVi.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-BbtrduWn.js.map → McpOverview-DEJmsdVi.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryDetailPage-C1L4T-Wt.js → McpQueryDetailPage-DYJr16l7.js} +2 -2
- package/dashboard/dist/assets/{McpQueryDetailPage-C1L4T-Wt.js.map → McpQueryDetailPage-DYJr16l7.js.map} +1 -1
- package/dashboard/dist/assets/McpQueryPage-BBcG_UuU.js +2 -0
- package/dashboard/dist/assets/{McpQueryPage-CfJy7HZ7.js.map → McpQueryPage-BBcG_UuU.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunDetailPage-CA9yv7he.js → McpRunDetailPage-C6xw0kBg.js} +2 -2
- package/dashboard/dist/assets/{McpRunDetailPage-CA9yv7he.js.map → McpRunDetailPage-C6xw0kBg.js.map} +1 -1
- package/dashboard/dist/assets/McpRunsPage-CRQqrF4Q.js +2 -0
- package/dashboard/dist/assets/{McpRunsPage-D7QXjW9z.js.map → McpRunsPage-CRQqrF4Q.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-Dlfwzf-0.js +3 -0
- package/dashboard/dist/assets/OperationsPage-Dlfwzf-0.js.map +1 -0
- package/dashboard/dist/assets/OperatorDashboard-DoiDGZ9R.js +2 -0
- package/dashboard/dist/assets/{OperatorDashboard-sXNDh1Ph.js.map → OperatorDashboard-DoiDGZ9R.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-BzbA4Prr.js} +2 -2
- package/dashboard/dist/assets/{PersonaDetailPage-NeHD-Gra.js.map → PersonaDetailPage-BzbA4Prr.js.map} +1 -1
- package/dashboard/dist/assets/{PersonasPage-DavKXRWX.js → PersonasPage-B36yn4hU.js} +2 -2
- package/dashboard/dist/assets/{PersonasPage-DavKXRWX.js.map → PersonasPage-B36yn4hU.js.map} +1 -1
- package/dashboard/dist/assets/PortalPage-BkD4YfDf.js +2 -0
- package/dashboard/dist/assets/PortalPage-BkD4YfDf.js.map +1 -0
- package/dashboard/dist/assets/{ProcessDetailPage-DkdKJGe6.js → ProcessDetailPage-BT0eiBWY.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-DkdKJGe6.js.map → ProcessDetailPage-BT0eiBWY.js.map} +1 -1
- package/dashboard/dist/assets/ProcessesListPage-BEqeeNae.js +2 -0
- package/dashboard/dist/assets/{ProcessesListPage-CjwVKe32.js.map → ProcessesListPage-BEqeeNae.js.map} +1 -1
- package/dashboard/dist/assets/ResolverForm-BwgjIX97.js +7 -0
- package/dashboard/dist/assets/ResolverForm-BwgjIX97.js.map +1 -0
- package/dashboard/dist/assets/RoleDetailPage-BFuLNJXa.js +8 -0
- package/dashboard/dist/assets/RoleDetailPage-BFuLNJXa.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-80quJU5-.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-OM9KM8Pg.js.map → RolesPage-80quJU5-.js.map} +1 -1
- package/dashboard/dist/assets/RunAsSelector-BoePhWVD.js +2 -0
- package/dashboard/dist/assets/{RunAsSelector-fFMt1bGe.js.map → RunAsSelector-BoePhWVD.js.map} +1 -1
- package/dashboard/dist/assets/{ScanCodesPage-AujH-pPQ.js → ScanCodesPage-Cu1bKEix.js} +2 -2
- package/dashboard/dist/assets/{ScanCodesPage-AujH-pPQ.js.map → ScanCodesPage-Cu1bKEix.js.map} +1 -1
- package/dashboard/dist/assets/ScanSchemeDetailPage-D9AbS6UY.js +2 -0
- package/dashboard/dist/assets/ScanSchemeDetailPage-D9AbS6UY.js.map +1 -0
- package/dashboard/dist/assets/ScanStationPage-gcZGefvT.js +2 -0
- package/dashboard/dist/assets/{ScanStationPage-C1_ppDoZ.js.map → ScanStationPage-gcZGefvT.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-9ITrei_d.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-B91Pk9xh.js.map → StickyPagination-9ITrei_d.js.map} +1 -1
- package/dashboard/dist/assets/{StreamMessageDetail-C7SPqaJt.js → StreamMessageDetail-BkYvEHFY.js} +2 -2
- package/dashboard/dist/assets/{StreamMessageDetail-C7SPqaJt.js.map → StreamMessageDetail-BkYvEHFY.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-BcHR8ylf.js → SwimlaneTimeline-B1rotFix.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-BcHR8ylf.js.map → SwimlaneTimeline-B1rotFix.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-zhn_U_eC.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-Bqj0I_I0.js.map → TaskDetailPage-zhn_U_eC.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-CNbNeagx.js +2 -0
- package/dashboard/dist/assets/{TasksListPage-BB1f79lL.js.map → TasksListPage-CNbNeagx.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-BFnODmNe.js → TimeAgo-0YVMBwls.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-BFnODmNe.js.map → TimeAgo-0YVMBwls.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-BXgLOBsr.js → TimestampCell-DB7r3np8.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-BXgLOBsr.js.map → TimestampCell-DB7r3np8.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-BLfA02wv.js +2 -0
- package/dashboard/dist/assets/{ToolTestPanel-Bwe3J5lj.js.map → ToolTestPanel-BLfA02wv.js.map} +1 -1
- package/dashboard/dist/assets/{TopicDetailPage-DAF07vZ9.js → TopicDetailPage-eAqPKShq.js} +3 -3
- package/dashboard/dist/assets/{TopicDetailPage-DAF07vZ9.js.map → TopicDetailPage-eAqPKShq.js.map} +1 -1
- package/dashboard/dist/assets/TopicsPage-BNNWD-zl.js +2 -0
- package/dashboard/dist/assets/{TopicsPage-C1gxBUap.js.map → TopicsPage-BNNWD-zl.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-BzXJUE6q.js → UserName-Pw46tO_k.js} +2 -2
- package/dashboard/dist/assets/{UserName-BzXJUE6q.js.map → UserName-Pw46tO_k.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowExecutionPage-SkRU5cRX.js → WorkflowExecutionPage-DvA51lT3.js} +2 -2
- package/dashboard/dist/assets/{WorkflowExecutionPage-SkRU5cRX.js.map → WorkflowExecutionPage-DvA51lT3.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-DFDTwnhn.js +2 -0
- package/dashboard/dist/assets/{WorkflowsDashboard-CZAqRk1N.js.map → WorkflowsDashboard-DFDTwnhn.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsOverview-BoN44VTE.js → WorkflowsOverview-5i2Tcy-p.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-BoN44VTE.js.map → WorkflowsOverview-5i2Tcy-p.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-CqjhtdJf.js → YamlWorkflowDetailPage-p4VEYZS0.js} +11 -11
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-CqjhtdJf.js.map → YamlWorkflowDetailPage-p4VEYZS0.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowsPage-CwnJkzyb.js → YamlWorkflowsPage-Cq-hMVxl.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowsPage-CwnJkzyb.js.map → YamlWorkflowsPage-Cq-hMVxl.js.map} +1 -1
- package/dashboard/dist/assets/{agents-gV0Ys-sY.js → agents-EyBPJMYa.js} +2 -2
- package/dashboard/dist/assets/{agents-gV0Ys-sY.js.map → agents-EyBPJMYa.js.map} +1 -1
- package/dashboard/dist/assets/{bots-B97itB3I.js → bots-DX6jjqtF.js} +2 -2
- package/dashboard/dist/assets/{bots-B97itB3I.js.map → bots-DX6jjqtF.js.map} +1 -1
- package/dashboard/dist/assets/{capabilities-CR9xZgGd.js → capabilities-ZdLv9xBQ.js} +2 -2
- package/dashboard/dist/assets/{capabilities-CR9xZgGd.js.map → capabilities-ZdLv9xBQ.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-CpvZaJuw.js} +2 -2
- package/dashboard/dist/assets/{controlplane-YxvP1KCa.js.map → controlplane-CpvZaJuw.js.map} +1 -1
- package/dashboard/dist/assets/escalation-columns-Mvsze5eV.js +2 -0
- package/dashboard/dist/assets/escalation-columns-Mvsze5eV.js.map +1 -0
- package/dashboard/dist/assets/index-B_GT23TE.js +3 -0
- package/dashboard/dist/assets/index-B_GT23TE.js.map +1 -0
- package/dashboard/dist/assets/index-BbCjGO3M.js +2 -0
- package/dashboard/dist/assets/{index-CFbo9FU9.js.map → index-BbCjGO3M.js.map} +1 -1
- package/dashboard/dist/assets/{index-DMeaiKgf.js → index-Bhb89oHH.js} +2 -2
- package/dashboard/dist/assets/{index-DMeaiKgf.js.map → index-Bhb89oHH.js.map} +1 -1
- package/dashboard/dist/assets/index-CgUcYveM.js +67 -0
- package/dashboard/dist/assets/index-CgUcYveM.js.map +1 -0
- package/dashboard/dist/assets/index-Cn8uJsd7.js +2 -0
- package/dashboard/dist/assets/{index-BQpV-DTG.js.map → index-Cn8uJsd7.js.map} +1 -1
- package/dashboard/dist/assets/index-D-Xs4rAW.js +2 -0
- package/dashboard/dist/assets/{index-Bp9KBLT5.js.map → index-D-Xs4rAW.js.map} +1 -1
- package/dashboard/dist/assets/{index-DwOnWeu8.js → index-DGmzBY9D.js} +2 -2
- package/dashboard/dist/assets/{index-DwOnWeu8.js.map → index-DGmzBY9D.js.map} +1 -1
- package/dashboard/dist/assets/{index-CIpHj4di.js → index-DZhtP2Ok.js} +2 -2
- package/dashboard/dist/assets/{index-CIpHj4di.js.map → index-DZhtP2Ok.js.map} +1 -1
- package/dashboard/dist/assets/index-Dh8MJl3L.css +1 -0
- package/dashboard/dist/assets/index-DkrBFFSO.js +13 -0
- package/dashboard/dist/assets/{index-Cfvkl2J0.js.map → index-DkrBFFSO.js.map} +1 -1
- package/dashboard/dist/assets/{index-B9BBCqLI.js → index-Eo-l3Lqo.js} +2 -2
- package/dashboard/dist/assets/{index-B9BBCqLI.js.map → index-Eo-l3Lqo.js.map} +1 -1
- package/dashboard/dist/assets/index-PfSRKerc.js +2 -0
- package/dashboard/dist/assets/{index-CUZ6LYye.js.map → index-PfSRKerc.js.map} +1 -1
- package/dashboard/dist/assets/{index-ipqwPavs.js → index-oFKUFGQL.js} +2 -2
- package/dashboard/dist/assets/{index-ipqwPavs.js.map → index-oFKUFGQL.js.map} +1 -1
- package/dashboard/dist/assets/index-z5Hpeidu.js +2 -0
- package/dashboard/dist/assets/index-z5Hpeidu.js.map +1 -0
- package/dashboard/dist/assets/{knowledge-XX6cW4Ob.js → knowledge-CgloEkaf.js} +2 -2
- package/dashboard/dist/assets/{knowledge-XX6cW4Ob.js.map → knowledge-CgloEkaf.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-CH13hNH2.js → mcp-Bix7QYO7.js} +2 -2
- package/dashboard/dist/assets/{mcp-CH13hNH2.js.map → mcp-Bix7QYO7.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-Duydd3JA.js → mcp-query-o-sGX2ST.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-Duydd3JA.js.map → mcp-query-o-sGX2ST.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-30azkJ_s.js} +2 -2
- package/dashboard/dist/assets/{personas-mDk4lLQS.js.map → personas-30azkJ_s.js.map} +1 -1
- package/dashboard/dist/assets/{pipelines-B5GcgCeF.js → pipelines-Bfk2GFK7.js} +2 -2
- package/dashboard/dist/assets/{pipelines-B5GcgCeF.js.map → pipelines-Bfk2GFK7.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-CItmNsRp.js → tasks-CpdopewW.js} +2 -2
- package/dashboard/dist/assets/{tasks-CItmNsRp.js.map → tasks-CpdopewW.js.map} +1 -1
- package/dashboard/dist/assets/{topics-CJYG7BX5.js → topics--bvCV9Yp.js} +2 -2
- package/dashboard/dist/assets/{topics-CJYG7BX5.js.map → topics--bvCV9Yp.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-Da0lPmj3.js} +2 -2
- package/dashboard/dist/assets/{useDebouncedValue-BrwgXcp8.js.map → useDebouncedValue-Da0lPmj3.js.map} +1 -1
- package/dashboard/dist/assets/{useNamespace-CHty0HAS.js → useNamespace-DD_Esl6n.js} +2 -2
- package/dashboard/dist/assets/{useNamespace-CHty0HAS.js.map → useNamespace-DD_Esl6n.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-CoTsia7t.js → useYamlActivityEvents-AeAhZJJk.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-CoTsia7t.js.map → useYamlActivityEvents-AeAhZJJk.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-BHAOOGvn.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-CiWwx5rM.js.map → yaml-workflows-BHAOOGvn.js.map} +1 -1
- package/dashboard/dist/index.html +3 -3
- package/docs/accumulator.md +113 -0
- package/docs/api/http/escalations.md +90 -0
- package/docs/api/http/roles.md +1 -0
- package/docs/api/sdk/escalations.md +92 -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 +33 -9
- 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/ScanSchemeDetailPage-eKQpmsC_.js +0 -2
- package/dashboard/dist/assets/ScanSchemeDetailPage-eKQpmsC_.js.map +0 -1
- 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
|
@@ -0,0 +1,158 @@
|
|
|
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
|
+
* GET /api/escalations/items-by-signal-key?signalKey=…
|
|
106
|
+
* The held items of an accumulator or batch row by its signal_key.
|
|
107
|
+
*/
|
|
108
|
+
router.get('/items-by-signal-key', async (req, res) => {
|
|
109
|
+
const result = await api.getEscalationItemsBySignalKey({ signalKey: String(req.query.signalKey ?? '') }, req.auth);
|
|
110
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
111
|
+
});
|
|
112
|
+
/**
|
|
113
|
+
* POST /api/escalations/:id/accumulate
|
|
114
|
+
* Add one item. Interim adds answer { outcome: 'accepted', count, remaining };
|
|
115
|
+
* the add that reaches max answers { outcome: 'completed', signaled } and the
|
|
116
|
+
* waiting workflow resumes with the collection. Claim-agnostic unless
|
|
117
|
+
* assertClaim: true.
|
|
118
|
+
* Body: { itemKey, payload?, metadata?, assertClaim?, reciprocal? }
|
|
119
|
+
*/
|
|
120
|
+
router.post('/:id/accumulate', async (req, res) => {
|
|
121
|
+
const auth = await (0, acting_1.effectiveWorkAuth)(req, res);
|
|
122
|
+
if (!auth)
|
|
123
|
+
return;
|
|
124
|
+
const result = await api.accumulateItem({
|
|
125
|
+
id: req.params.id,
|
|
126
|
+
itemKey: req.body?.itemKey,
|
|
127
|
+
payload: req.body?.payload,
|
|
128
|
+
metadata: req.body?.metadata,
|
|
129
|
+
assertClaim: req.body?.assertClaim,
|
|
130
|
+
reciprocal: req.body?.reciprocal,
|
|
131
|
+
}, auth);
|
|
132
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
133
|
+
});
|
|
134
|
+
/**
|
|
135
|
+
* POST /api/escalations/:id/remove-item
|
|
136
|
+
* Remove one held item; the row stays pending and the waiter never wakes.
|
|
137
|
+
* Body: { itemKey, reciprocal? }
|
|
138
|
+
*/
|
|
139
|
+
router.post('/:id/remove-item', async (req, res) => {
|
|
140
|
+
const auth = await (0, acting_1.effectiveWorkAuth)(req, res);
|
|
141
|
+
if (!auth)
|
|
142
|
+
return;
|
|
143
|
+
const result = await api.removeItem({
|
|
144
|
+
id: req.params.id,
|
|
145
|
+
itemKey: req.body?.itemKey,
|
|
146
|
+
reciprocal: req.body?.reciprocal,
|
|
147
|
+
}, auth);
|
|
148
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
149
|
+
});
|
|
150
|
+
/**
|
|
151
|
+
* GET /api/escalations/:id/items
|
|
152
|
+
* The held items of an accumulator or batch row in arrival order.
|
|
153
|
+
*/
|
|
154
|
+
router.get('/:id/items', async (req, res) => {
|
|
155
|
+
const result = await api.getEscalationItems({ id: req.params.id }, req.auth);
|
|
156
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
157
|
+
});
|
|
158
|
+
}
|
|
@@ -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,34 @@ 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>>;
|
|
272
|
+
getItemsBySignalKey: (input: {
|
|
273
|
+
signalKey: string;
|
|
274
|
+
}, auth?: LTApiAuth) => Promise<LTApiResult<import("../api/escalations/accumulate").EscalationItemsView>>;
|
|
247
275
|
searchByFacets: (input: import("..").FacetQuery, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
|
|
248
276
|
claimGroups: (input: {
|
|
249
277
|
query: import("..").FacetQuery;
|
package/build/sdk/index.js
CHANGED
|
@@ -146,6 +146,15 @@ 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),
|
|
157
|
+
getItemsBySignalKey: bindAuth(escalationsApi.getEscalationItemsBySignalKey, auth),
|
|
149
158
|
// Faceted-routing surface (pond search + batch claim), RBAC-scoped to the caller's role.
|
|
150
159
|
searchByFacets: bindAuth(escalationsApi.searchByFacets, auth),
|
|
151
160
|
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>;
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.accumulateItem = accumulateItem;
|
|
4
|
+
exports.accumulateItemBySignalKey = accumulateItemBySignalKey;
|
|
5
|
+
exports.accumulateItemByMetadata = accumulateItemByMetadata;
|
|
6
|
+
exports.removeAccumulatedItem = removeAccumulatedItem;
|
|
7
|
+
exports.removeAccumulatedItemBySignalKey = removeAccumulatedItemBySignalKey;
|
|
8
|
+
exports.removeAccumulatedItemByMetadata = removeAccumulatedItemByMetadata;
|
|
9
|
+
const escalation_wire_1 = require("../../lib/events/escalation-wire");
|
|
10
|
+
const uuid_1 = require("../../lib/uuid");
|
|
11
|
+
const client_1 = require("./client");
|
|
12
|
+
const crud_1 = require("./crud");
|
|
13
|
+
const map_1 = require("./map");
|
|
14
|
+
const NOT_FOUND = { outcome: 'not-found', count: -1, remaining: null, escalation: null };
|
|
15
|
+
const RECIPROCAL_NOT_FOUND = { ...NOT_FOUND, outcome: 'reciprocal-not-found' };
|
|
16
|
+
function reciprocalIdValid(reciprocal) {
|
|
17
|
+
return !reciprocal?.id || (0, uuid_1.isUuid)(reciprocal.id);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Adds one item to an accumulator escalation in a single atomic SDK
|
|
21
|
+
* statement (guarded append + facet recompute + resolve-and-wake at max,
|
|
22
|
+
* with the reciprocal row written in the same statement or not at all).
|
|
23
|
+
* Interim adds publish `escalation.updated` with the count; a completing
|
|
24
|
+
* add publishes the standard `escalation.resolved`. Both rows publish.
|
|
25
|
+
* Failure outcomes publish nothing because no row changed.
|
|
26
|
+
*/
|
|
27
|
+
async function accumulateItem(id, input) {
|
|
28
|
+
if (!(0, uuid_1.isUuid)(id))
|
|
29
|
+
return NOT_FOUND;
|
|
30
|
+
if (!reciprocalIdValid(input.reciprocal))
|
|
31
|
+
return RECIPROCAL_NOT_FOUND;
|
|
32
|
+
const client = await (0, client_1.escalations)();
|
|
33
|
+
const result = await client.accumulateItem({ id, ...input });
|
|
34
|
+
return settleAccumulateOutcome(result, input);
|
|
35
|
+
}
|
|
36
|
+
/** Add selecting the container by its `signal_key`, the deterministic home signal id. */
|
|
37
|
+
async function accumulateItemBySignalKey(signalKey, input) {
|
|
38
|
+
if (!reciprocalIdValid(input.reciprocal))
|
|
39
|
+
return RECIPROCAL_NOT_FOUND;
|
|
40
|
+
const client = await (0, client_1.escalations)();
|
|
41
|
+
const result = await client.accumulateItem({ signalKey, ...input });
|
|
42
|
+
return settleAccumulateOutcome(result, input);
|
|
43
|
+
}
|
|
44
|
+
/** Add selecting the container by metadata facet, scoped by `roles`. */
|
|
45
|
+
async function accumulateItemByMetadata(key, value, input) {
|
|
46
|
+
if (!reciprocalIdValid(input.reciprocal))
|
|
47
|
+
return RECIPROCAL_NOT_FOUND;
|
|
48
|
+
const client = await (0, client_1.escalations)();
|
|
49
|
+
const result = await client.accumulateItemByMetadata({ key, value, ...input });
|
|
50
|
+
return settleAccumulateOutcome(result, input);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Removes one held item from a pending accumulator escalation (and the
|
|
54
|
+
* container's id from the reciprocal row) in one guarded statement. The
|
|
55
|
+
* waiter never wakes; both rows publish `escalation.updated`.
|
|
56
|
+
*/
|
|
57
|
+
async function removeAccumulatedItem(id, input) {
|
|
58
|
+
if (!(0, uuid_1.isUuid)(id))
|
|
59
|
+
return { outcome: 'not-found', count: -1, escalation: null };
|
|
60
|
+
if (!reciprocalIdValid(input.reciprocal))
|
|
61
|
+
return { outcome: 'reciprocal-not-found', count: -1, escalation: null };
|
|
62
|
+
const client = await (0, client_1.escalations)();
|
|
63
|
+
const result = await client.removeAccumulatedItem({ id, ...input });
|
|
64
|
+
return settleRemoveOutcome(result, input);
|
|
65
|
+
}
|
|
66
|
+
async function removeAccumulatedItemBySignalKey(signalKey, input) {
|
|
67
|
+
if (!reciprocalIdValid(input.reciprocal))
|
|
68
|
+
return { outcome: 'reciprocal-not-found', count: -1, escalation: null };
|
|
69
|
+
const client = await (0, client_1.escalations)();
|
|
70
|
+
const result = await client.removeAccumulatedItem({ signalKey, ...input });
|
|
71
|
+
return settleRemoveOutcome(result, input);
|
|
72
|
+
}
|
|
73
|
+
async function removeAccumulatedItemByMetadata(key, value, input) {
|
|
74
|
+
if (!reciprocalIdValid(input.reciprocal))
|
|
75
|
+
return { outcome: 'reciprocal-not-found', count: -1, escalation: null };
|
|
76
|
+
const client = await (0, client_1.escalations)();
|
|
77
|
+
const result = await client.removeAccumulatedItemByMetadata({ key, value, ...input });
|
|
78
|
+
return settleRemoveOutcome(result, input);
|
|
79
|
+
}
|
|
80
|
+
function publishSide(escalation, completed, data) {
|
|
81
|
+
(0, crud_1.publishEscalationChange)({
|
|
82
|
+
type: completed ? 'escalation.resolved' : 'escalation.updated',
|
|
83
|
+
source: 'service',
|
|
84
|
+
workflowId: escalation.workflow_id || '',
|
|
85
|
+
workflowName: escalation.workflow_type || '',
|
|
86
|
+
taskQueue: escalation.task_queue || '',
|
|
87
|
+
escalationId: escalation.id,
|
|
88
|
+
role: escalation.role,
|
|
89
|
+
status: completed ? 'resolved' : 'pending',
|
|
90
|
+
data: (0, escalation_wire_1.escalationEventData)(escalation, data),
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
function settleAccumulateOutcome(result, input) {
|
|
94
|
+
if (!result.ok) {
|
|
95
|
+
return { outcome: result.outcome, count: -1, remaining: null, escalation: null };
|
|
96
|
+
}
|
|
97
|
+
const escalation = (0, map_1.toEscalationRecord)(result.entry);
|
|
98
|
+
const reciprocal = result.reciprocal
|
|
99
|
+
? {
|
|
100
|
+
outcome: result.reciprocal.outcome,
|
|
101
|
+
count: result.reciprocal.count,
|
|
102
|
+
remaining: result.reciprocal.remaining,
|
|
103
|
+
escalation: (0, map_1.toEscalationRecord)(result.reciprocal.entry),
|
|
104
|
+
}
|
|
105
|
+
: undefined;
|
|
106
|
+
publishSide(escalation, result.outcome === 'completed', {
|
|
107
|
+
item_key: input.itemKey,
|
|
108
|
+
count: result.count,
|
|
109
|
+
remaining: result.remaining,
|
|
110
|
+
actor: input.actor ?? null,
|
|
111
|
+
reciprocal_id: reciprocal?.escalation.id ?? null,
|
|
112
|
+
});
|
|
113
|
+
if (reciprocal) {
|
|
114
|
+
publishSide(reciprocal.escalation, reciprocal.outcome === 'completed', {
|
|
115
|
+
item_key: escalation.id,
|
|
116
|
+
count: reciprocal.count,
|
|
117
|
+
remaining: reciprocal.remaining,
|
|
118
|
+
actor: input.actor ?? null,
|
|
119
|
+
reciprocal_id: escalation.id,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
return {
|
|
123
|
+
outcome: result.outcome,
|
|
124
|
+
count: result.count,
|
|
125
|
+
remaining: result.remaining,
|
|
126
|
+
escalation,
|
|
127
|
+
...(reciprocal ? { reciprocal } : {}),
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
function settleRemoveOutcome(result, input) {
|
|
131
|
+
if (!result.ok)
|
|
132
|
+
return { outcome: result.outcome, count: -1, escalation: null };
|
|
133
|
+
const escalation = (0, map_1.toEscalationRecord)(result.entry);
|
|
134
|
+
const reciprocal = result.reciprocal
|
|
135
|
+
? { count: result.reciprocal.count, escalation: (0, map_1.toEscalationRecord)(result.reciprocal.entry) }
|
|
136
|
+
: undefined;
|
|
137
|
+
publishSide(escalation, false, {
|
|
138
|
+
item_key: input.itemKey,
|
|
139
|
+
count: result.count,
|
|
140
|
+
removed: true,
|
|
141
|
+
actor: input.actor ?? null,
|
|
142
|
+
reciprocal_id: reciprocal?.escalation.id ?? null,
|
|
143
|
+
});
|
|
144
|
+
if (reciprocal) {
|
|
145
|
+
publishSide(reciprocal.escalation, false, {
|
|
146
|
+
item_key: escalation.id,
|
|
147
|
+
count: reciprocal.count,
|
|
148
|
+
removed: true,
|
|
149
|
+
actor: input.actor ?? null,
|
|
150
|
+
reciprocal_id: escalation.id,
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
return { outcome: 'removed', count: result.count, escalation, ...(reciprocal ? { reciprocal } : {}) };
|
|
154
|
+
}
|
|
@@ -18,6 +18,7 @@ exports.AnalyticsInputError = exports.resetAnalyticsCaches = exports.resolveEnti
|
|
|
18
18
|
__exportStar(require("./types"), exports);
|
|
19
19
|
__exportStar(require("./crud"), exports);
|
|
20
20
|
__exportStar(require("./batch"), exports);
|
|
21
|
+
__exportStar(require("./accumulate"), exports);
|
|
21
22
|
__exportStar(require("./bulk"), exports);
|
|
22
23
|
__exportStar(require("./queries"), exports);
|
|
23
24
|
__exportStar(require("./resolver-validation"), exports);
|
|
@@ -54,12 +54,12 @@ export declare const waitForSchema: z.ZodObject<{
|
|
|
54
54
|
timeout: z.ZodOptional<z.ZodNumber>;
|
|
55
55
|
}, "strip", z.ZodTypeAny, {
|
|
56
56
|
selector: string;
|
|
57
|
-
page_id?: string | undefined;
|
|
58
57
|
timeout?: number | undefined;
|
|
58
|
+
page_id?: string | undefined;
|
|
59
59
|
}, {
|
|
60
60
|
selector: string;
|
|
61
|
-
page_id?: string | undefined;
|
|
62
61
|
timeout?: number | undefined;
|
|
62
|
+
page_id?: string | undefined;
|
|
63
63
|
}>;
|
|
64
64
|
export declare const evaluateSchema: z.ZodObject<{
|
|
65
65
|
page_id: z.ZodOptional<z.ZodString>;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Types } from '@hotmeshio/hotmesh';
|
|
2
|
-
import { type EscalationLookupRef } from '../../types/escalation';
|
|
2
|
+
import { type AccumulateConfig, type AccumulatorResult, type EscalationLookupRef } from '../../types/escalation';
|
|
3
3
|
/**
|
|
4
4
|
* HotMesh's escalation config plus long-tail sugar. `schemaVersion` pins the
|
|
5
5
|
* role form version (lt_role_schemas) the resolve UI renders; `lookups` pins
|
|
@@ -116,8 +116,32 @@ export type ConditionEscalationConfig = Types.ConditionQueueConfig & {
|
|
|
116
116
|
* ```
|
|
117
117
|
*
|
|
118
118
|
* `timeout`/cancel semantics are unchanged (`false`/`null`); partially filled
|
|
119
|
-
* items persist on the terminal row for audit.
|
|
120
|
-
*
|
|
119
|
+
* items persist on the terminal row for audit. Add `partialOnTimeout: true`
|
|
120
|
+
* (hotmesh 0.29.0+) and the timer instead resumes with the items filled so
|
|
121
|
+
* far plus `$trigger: 'timeout'`. A plain resolve on a batch row remains an
|
|
122
|
+
* admin override that resolves the whole row with its payload.
|
|
123
|
+
*
|
|
124
|
+
* **Open accumulation — items arrive over time (hotmesh 0.29.0+).** Declare
|
|
125
|
+
* `accumulate` and the escalation holds items added via `accumulateItem`
|
|
126
|
+
* (HTTP: POST /:id/accumulate, /accumulate-by-signal-key,
|
|
127
|
+
* /accumulate-by-metadata) until `max` items are held, the `timeout` fires,
|
|
128
|
+
* or someone resolves the row. Every path except cancel delivers the ordered
|
|
129
|
+
* collection with the trigger that ended the wait, so a timeout is a
|
|
130
|
+
* delivery window, never a failure. Progress rides `metadata.accumulate_count`
|
|
131
|
+
* / `accumulate_max` / `accumulate_keys` as queryable facets; entries live in
|
|
132
|
+
* `envelope.accumulate_items`. Use {@link conditionalAccumulator} for the
|
|
133
|
+
* typed form:
|
|
134
|
+
*
|
|
135
|
+
* ```typescript
|
|
136
|
+
* const bin = await conditionalAccumulator<BagV1>(signalId, {
|
|
137
|
+
* role: 'bin',
|
|
138
|
+
* metadata: { binKey },
|
|
139
|
+
* accumulate: { max: 12 },
|
|
140
|
+
* timeout: '4h',
|
|
141
|
+
* });
|
|
142
|
+
* if (bin === null) { /* cancelled */ }
|
|
143
|
+
* else bin.$trigger; // 'count' | 'timeout' | 'resolve'
|
|
144
|
+
* ```
|
|
121
145
|
*
|
|
122
146
|
* **Resolution provenance — the reserved `$resolution` key.** When the resolve
|
|
123
147
|
* carries the resolver's identity (the API layer supplies it for interactive
|
|
@@ -155,3 +179,16 @@ export type ConditionEscalationConfig = Types.ConditionQueueConfig & {
|
|
|
155
179
|
export declare function conditional<T = Record<string, any>>(signalId: string, escalation?: ConditionEscalationConfig): Promise<T | false | null>;
|
|
156
180
|
/** @deprecated Alias of {@link conditional}. */
|
|
157
181
|
export declare const conditionLT: typeof conditional;
|
|
182
|
+
/** {@link ConditionEscalationConfig} with the accumulator declaration required. */
|
|
183
|
+
export type ConditionAccumulatorConfig = ConditionEscalationConfig & {
|
|
184
|
+
accumulate: AccumulateConfig;
|
|
185
|
+
};
|
|
186
|
+
/**
|
|
187
|
+
* {@link conditional} for an open accumulator: the same wait, typed for the
|
|
188
|
+
* contract an accumulator row keeps. It resolves with the ordered
|
|
189
|
+
* `$accumulated` collection and its `$trigger` on every terminal path
|
|
190
|
+
* (`count`, `timeout`, `resolve`), so `false` is not in the return type;
|
|
191
|
+
* cancellation still yields `null`. `P` types each item's payload, `R` the
|
|
192
|
+
* manual resolver payload merged in on `resolve`.
|
|
193
|
+
*/
|
|
194
|
+
export declare function conditionalAccumulator<P = Record<string, any>, R extends Record<string, any> = Record<string, any>>(signalId: string, escalation: ConditionAccumulatorConfig): Promise<AccumulatorResult<P, R> | null>;
|
|
@@ -35,6 +35,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.conditionLT = void 0;
|
|
37
37
|
exports.conditional = conditional;
|
|
38
|
+
exports.conditionalAccumulator = conditionalAccumulator;
|
|
38
39
|
const hotmesh_1 = require("@hotmeshio/hotmesh");
|
|
39
40
|
const escalation_1 = require("../../types/escalation");
|
|
40
41
|
const interceptorActivities = __importStar(require("../interceptor/activities"));
|
|
@@ -162,8 +163,32 @@ function toEngineConfig(escalation) {
|
|
|
162
163
|
* ```
|
|
163
164
|
*
|
|
164
165
|
* `timeout`/cancel semantics are unchanged (`false`/`null`); partially filled
|
|
165
|
-
* items persist on the terminal row for audit.
|
|
166
|
-
*
|
|
166
|
+
* items persist on the terminal row for audit. Add `partialOnTimeout: true`
|
|
167
|
+
* (hotmesh 0.29.0+) and the timer instead resumes with the items filled so
|
|
168
|
+
* far plus `$trigger: 'timeout'`. A plain resolve on a batch row remains an
|
|
169
|
+
* admin override that resolves the whole row with its payload.
|
|
170
|
+
*
|
|
171
|
+
* **Open accumulation — items arrive over time (hotmesh 0.29.0+).** Declare
|
|
172
|
+
* `accumulate` and the escalation holds items added via `accumulateItem`
|
|
173
|
+
* (HTTP: POST /:id/accumulate, /accumulate-by-signal-key,
|
|
174
|
+
* /accumulate-by-metadata) until `max` items are held, the `timeout` fires,
|
|
175
|
+
* or someone resolves the row. Every path except cancel delivers the ordered
|
|
176
|
+
* collection with the trigger that ended the wait, so a timeout is a
|
|
177
|
+
* delivery window, never a failure. Progress rides `metadata.accumulate_count`
|
|
178
|
+
* / `accumulate_max` / `accumulate_keys` as queryable facets; entries live in
|
|
179
|
+
* `envelope.accumulate_items`. Use {@link conditionalAccumulator} for the
|
|
180
|
+
* typed form:
|
|
181
|
+
*
|
|
182
|
+
* ```typescript
|
|
183
|
+
* const bin = await conditionalAccumulator<BagV1>(signalId, {
|
|
184
|
+
* role: 'bin',
|
|
185
|
+
* metadata: { binKey },
|
|
186
|
+
* accumulate: { max: 12 },
|
|
187
|
+
* timeout: '4h',
|
|
188
|
+
* });
|
|
189
|
+
* if (bin === null) { /* cancelled */ }
|
|
190
|
+
* else bin.$trigger; // 'count' | 'timeout' | 'resolve'
|
|
191
|
+
* ```
|
|
167
192
|
*
|
|
168
193
|
* **Resolution provenance — the reserved `$resolution` key.** When the resolve
|
|
169
194
|
* carries the resolver's identity (the API layer supplies it for interactive
|
|
@@ -231,3 +256,18 @@ async function conditional(signalId, escalation) {
|
|
|
231
256
|
}
|
|
232
257
|
/** @deprecated Alias of {@link conditional}. */
|
|
233
258
|
exports.conditionLT = conditional;
|
|
259
|
+
/**
|
|
260
|
+
* {@link conditional} for an open accumulator: the same wait, typed for the
|
|
261
|
+
* contract an accumulator row keeps. It resolves with the ordered
|
|
262
|
+
* `$accumulated` collection and its `$trigger` on every terminal path
|
|
263
|
+
* (`count`, `timeout`, `resolve`), so `false` is not in the return type;
|
|
264
|
+
* cancellation still yields `null`. `P` types each item's payload, `R` the
|
|
265
|
+
* manual resolver payload merged in on `resolve`.
|
|
266
|
+
*/
|
|
267
|
+
async function conditionalAccumulator(signalId, escalation) {
|
|
268
|
+
const result = await conditional(signalId, escalation);
|
|
269
|
+
if (result === false) {
|
|
270
|
+
throw new Error(`Accumulator wait ${signalId} resumed with false; expected a delivered collection`);
|
|
271
|
+
}
|
|
272
|
+
return result;
|
|
273
|
+
}
|
|
@@ -153,6 +153,7 @@ async function updateRoleMetadata(role, input) {
|
|
|
153
153
|
provided('ops_home_default'), input.ops_home_default ?? null,
|
|
154
154
|
provided('entity_facet'), input.entity_facet ?? null,
|
|
155
155
|
provided('entity_state_source'), input.entity_state_source ?? null,
|
|
156
|
+
provided('portals'), input.portals != null ? JSON.stringify(input.portals) : null,
|
|
156
157
|
]);
|
|
157
158
|
if (!rows[0])
|
|
158
159
|
return null;
|
|
@@ -14,10 +14,12 @@ exports.STARTUP_CHANGE_SUMMARY = 'startup apply (code)';
|
|
|
14
14
|
const METADATA_FIELDS = [
|
|
15
15
|
'title', 'description', 'form_schema', 'metadata_schema', 'list_schema',
|
|
16
16
|
'properties', 'ops_visible', 'ops_home_default', 'parent_role',
|
|
17
|
-
'upstream_roles', 'default_pins', 'enforce_schema', 'sla_minutes',
|
|
17
|
+
'upstream_roles', 'default_pins', 'portals', 'enforce_schema', 'sla_minutes',
|
|
18
18
|
'target_per_hour', 'worker_count', 'priority_threshold_minutes',
|
|
19
19
|
'priority_facet', 'entity_facet', 'entity_state_source',
|
|
20
20
|
];
|
|
21
|
+
// Arrays whose order is meaning (portals and their rows), compared as declared.
|
|
22
|
+
const ORDERED_ARRAY_FIELDS = new Set(['portals']);
|
|
21
23
|
/**
|
|
22
24
|
* Compare one declared field against the stored row. jsonb round-trips lose
|
|
23
25
|
* key order, so structured values must be compared as parsed values — never
|
|
@@ -25,6 +27,9 @@ const METADATA_FIELDS = [
|
|
|
25
27
|
*/
|
|
26
28
|
function fieldDiffers(field, declared, row) {
|
|
27
29
|
const stored = row[field];
|
|
30
|
+
if (Array.isArray(declared) && ORDERED_ARRAY_FIELDS.has(field)) {
|
|
31
|
+
return !(0, node_util_1.isDeepStrictEqual)(declared, stored ?? null);
|
|
32
|
+
}
|
|
28
33
|
if (Array.isArray(declared)) {
|
|
29
34
|
const a = [...declared].sort();
|
|
30
35
|
const b = Array.isArray(stored) ? [...stored].sort() : [];
|