@hotmeshio/long-tail 0.19.1 → 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/api/workflows/config.d.ts +3 -0
- package/build/api/workflows/config.js +15 -0
- package/build/api/workflows/index.d.ts +1 -0
- package/build/api/workflows/index.js +3 -1
- package/build/api/workflows/input-lookups.d.ts +16 -0
- package/build/api/workflows/input-lookups.js +69 -0
- package/build/api/workflows/input-validation.d.ts +4 -3
- package/build/api/workflows/input-validation.js +7 -4
- package/build/api/workflows/invocable.js +1 -0
- package/build/api/workflows/invocation.js +1 -1
- package/build/index.js +60 -0
- package/build/lib/db/schemas/035_workflow_input_lookups.sql +9 -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/routes/workflows/config.js +10 -0
- package/build/sdk/index.d.ts +25 -0
- package/build/sdk/index.js +8 -0
- package/build/services/config/cache.js +1 -0
- package/build/services/config/read.js +2 -0
- package/build/services/config/sql.d.ts +2 -2
- package/build/services/config/sql.js +6 -5
- package/build/services/config/write.js +10 -1
- 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/knowledge/index.d.ts +1 -0
- package/build/services/knowledge/index.js +1 -0
- package/build/services/knowledge/lookup-refs.d.ts +7 -0
- package/build/services/knowledge/lookup-refs.js +26 -0
- package/build/services/mcp/db-server/schemas.d.ts +2 -2
- 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/field-validator.d.ts +1 -0
- package/build/shared/form-validation/field-validator.js +94 -6
- package/build/shared/form-validation/index.d.ts +2 -0
- package/build/shared/form-validation/index.js +2 -0
- package/build/shared/form-validation/invoke-context.d.ts +4 -3
- package/build/shared/form-validation/invoke-context.js +5 -4
- 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/shared/form-validation/x-lt-options.d.ts +3 -3
- package/build/shared/form-validation/x-lt-options.js +19 -5
- package/build/shared/form-validation/x-lt-show-if.d.ts +5 -0
- package/build/shared/form-validation/x-lt-show-if.js +10 -0
- package/build/start/workers.js +10 -0
- package/build/system/mcp-servers/admin/escalations.js +39 -0
- package/build/system/mcp-servers/admin/schemas.d.ts +256 -33
- package/build/system/mcp-servers/admin/schemas.js +55 -3
- package/build/system/mcp-servers/admin/users.js +1 -0
- package/build/system/mcp-servers/admin/workflow-config.js +54 -9
- package/build/system/mcp-servers/admin/workflows.js +9 -7
- package/build/system/mcp-servers/db-query/schemas.d.ts +2 -2
- 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 +1509 -227
- package/build/system/seed/tool-manifests-admin.js +8 -4
- 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/config.d.ts +4 -0
- 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 +26 -0
- package/dashboard/dist/assets/{AdminDashboard-Drs-9TRM.js → AdminDashboard-uarpHB88.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-Drs-9TRM.js.map → AdminDashboard-uarpHB88.js.map} +1 -1
- package/dashboard/dist/assets/{AgentConfigPage-BDPDZ7-v.js → AgentConfigPage-BcUaDD5E.js} +6 -6
- package/dashboard/dist/assets/{AgentConfigPage-BDPDZ7-v.js.map → AgentConfigPage-BcUaDD5E.js.map} +1 -1
- package/dashboard/dist/assets/{AgentDetailPage-CGBulM4_.js → AgentDetailPage-BaZBhK6i.js} +3 -3
- package/dashboard/dist/assets/{AgentDetailPage-CGBulM4_.js.map → AgentDetailPage-BaZBhK6i.js.map} +1 -1
- package/dashboard/dist/assets/AgentsPage-CuVFSDc4.js +2 -0
- package/dashboard/dist/assets/{AgentsPage-D77JeViQ.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-CC5vI_Sv.js → BotPicker-CClMby6B.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-CC5vI_Sv.js.map → BotPicker-CClMby6B.js.map} +1 -1
- package/dashboard/dist/assets/BulkAssignModal-BL8FRgkN.js +2 -0
- package/dashboard/dist/assets/{BulkAssignModal-BXiJnlqt.js.map → BulkAssignModal-BL8FRgkN.js.map} +1 -1
- package/dashboard/dist/assets/CapabilitiesPage-D53ogPor.js +2 -0
- package/dashboard/dist/assets/{CapabilitiesPage-D9TC2iKy.js.map → CapabilitiesPage-D53ogPor.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-D10lGw_u.js → CollapsibleSection-ow8jpbtD.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-D10lGw_u.js.map → CollapsibleSection-ow8jpbtD.js.map} +1 -1
- package/dashboard/dist/assets/{ConfirmDeleteModal-BJdLN6No.js → ConfirmDeleteModal-CeEDt9iJ.js} +2 -2
- package/dashboard/dist/assets/{ConfirmDeleteModal-BJdLN6No.js.map → ConfirmDeleteModal-CeEDt9iJ.js.map} +1 -1
- package/dashboard/dist/assets/{CountdownTimer-D9B-BjQ7.js → CountdownTimer-CSqyZMCG.js} +2 -2
- package/dashboard/dist/assets/{CountdownTimer-D9B-BjQ7.js.map → CountdownTimer-CSqyZMCG.js.map} +1 -1
- package/dashboard/dist/assets/{CredentialsPage-hniUAFBK.js → CredentialsPage-Dx7SxA23.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-hniUAFBK.js.map → CredentialsPage-Dx7SxA23.js.map} +1 -1
- package/dashboard/dist/assets/{CronLabel-v9DCD2FX.js → CronLabel-LYPxpvNN.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-v9DCD2FX.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-_xvVTK8N.js → ElapsedCell-BZJTSm9N.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-_xvVTK8N.js.map → ElapsedCell-BZJTSm9N.js.map} +1 -1
- package/dashboard/dist/assets/EntityTimelinePanel-0wIIW2en.js +2 -0
- package/dashboard/dist/assets/{EntityTimelinePanel-1lT3jkCM.js.map → EntityTimelinePanel-0wIIW2en.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationListSchemaPage-BeQUTUEO.js → EscalationListSchemaPage-CoYvtMzj.js} +3 -3
- package/dashboard/dist/assets/{EscalationListSchemaPage-BeQUTUEO.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-D4VlEwyS.js → EscalationSchemaPage-C9Xu_A25.js} +3 -3
- package/dashboard/dist/assets/{EscalationSchemaPage-D4VlEwyS.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-Bx6Zrzm-.js → EscalationsOverview-CW57FaP9.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-Bx6Zrzm-.js.map → EscalationsOverview-CW57FaP9.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-KEC3YWBf.js → EventTable-D1ctWhKf.js} +2 -2
- package/dashboard/dist/assets/{EventTable-KEC3YWBf.js.map → EventTable-D1ctWhKf.js.map} +1 -1
- package/dashboard/dist/assets/{FilterBar-xwN_b5fj.js → FilterBar-C-iur-Nj.js} +2 -2
- package/dashboard/dist/assets/{FilterBar-xwN_b5fj.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-DV7Y0fe2.js.map → GraphInvokePage-CcA_44M4.js.map} +1 -1
- package/dashboard/dist/assets/HomePage-Dc085ghJ.js +2 -0
- package/dashboard/dist/assets/{HomePage-G785SWcW.js.map → HomePage-Dc085ghJ.js.map} +1 -1
- package/dashboard/dist/assets/ListToolbar-h_ziBt4O.js +2 -0
- package/dashboard/dist/assets/{ListToolbar-zPVYPg3W.js.map → ListToolbar-h_ziBt4O.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-CMGUq8hx.js → McpOverview-qXXhbNWV.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-CMGUq8hx.js.map → McpOverview-qXXhbNWV.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryDetailPage-CdhLhaKn.js → McpQueryDetailPage-SEzSbZrd.js} +2 -2
- package/dashboard/dist/assets/{McpQueryDetailPage-CdhLhaKn.js.map → McpQueryDetailPage-SEzSbZrd.js.map} +1 -1
- package/dashboard/dist/assets/McpQueryPage-Cy0V0kv9.js +2 -0
- package/dashboard/dist/assets/{McpQueryPage-CNSNMagY.js.map → McpQueryPage-Cy0V0kv9.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunDetailPage-DBm8hUaW.js → McpRunDetailPage-DjJO5vSb.js} +2 -2
- package/dashboard/dist/assets/{McpRunDetailPage-DBm8hUaW.js.map → McpRunDetailPage-DjJO5vSb.js.map} +1 -1
- package/dashboard/dist/assets/McpRunsPage-BfjiJ8mM.js +2 -0
- package/dashboard/dist/assets/{McpRunsPage-B6rb5QBf.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-DBOscDnf.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-BGRdGpeR.js → PersonaDetailPage-Cx6L3Jvu.js} +2 -2
- package/dashboard/dist/assets/{PersonaDetailPage-BGRdGpeR.js.map → PersonaDetailPage-Cx6L3Jvu.js.map} +1 -1
- package/dashboard/dist/assets/{PersonasPage-DRzOZcVa.js → PersonasPage-DOgGUlJl.js} +2 -2
- package/dashboard/dist/assets/{PersonasPage-DRzOZcVa.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-BLGjZXpM.js → ProcessDetailPage-BFcFSDUv.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-BLGjZXpM.js.map → ProcessDetailPage-BFcFSDUv.js.map} +1 -1
- package/dashboard/dist/assets/ProcessesListPage-BaHV2cXp.js +2 -0
- package/dashboard/dist/assets/{ProcessesListPage-5NnysKFC.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-BmW1LzkU.js → RolesPage-DSqqKPbv.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-BmW1LzkU.js.map → RolesPage-DSqqKPbv.js.map} +1 -1
- package/dashboard/dist/assets/RunAsSelector-B29iWwel.js +2 -0
- package/dashboard/dist/assets/{RunAsSelector-BwZTJ4Yj.js.map → RunAsSelector-B29iWwel.js.map} +1 -1
- package/dashboard/dist/assets/ScanCodesPage-S8aAJfnC.js +2 -0
- package/dashboard/dist/assets/{ScanCodesPage-FiYIYB-m.js.map → ScanCodesPage-S8aAJfnC.js.map} +1 -1
- package/dashboard/dist/assets/{ScanSchemeDetailPage-BiAqtD-a.js → ScanSchemeDetailPage-CUBRAtmJ.js} +2 -2
- package/dashboard/dist/assets/{ScanSchemeDetailPage-BiAqtD-a.js.map → ScanSchemeDetailPage-CUBRAtmJ.js.map} +1 -1
- package/dashboard/dist/assets/ScanStationPage-R9t1-CeQ.js +2 -0
- package/dashboard/dist/assets/{ScanStationPage-8CdOtbCD.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-DRuqKhZt.js → StickyPagination-CkW_A507.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-DRuqKhZt.js.map → StickyPagination-CkW_A507.js.map} +1 -1
- package/dashboard/dist/assets/{StreamMessageDetail-JwlbRiMn.js → StreamMessageDetail-yzWX0wac.js} +2 -2
- package/dashboard/dist/assets/{StreamMessageDetail-JwlbRiMn.js.map → StreamMessageDetail-yzWX0wac.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-hu3c4bCJ.js → SwimlaneTimeline-Cf4DXFxj.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-hu3c4bCJ.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-NqVZF3jW.js → TaskDetailPage-DCDcEps9.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-NqVZF3jW.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-BQNaSzCn.js.map → TasksListPage-BBATgpf7.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-Cv35DOiI.js → TimeAgo-CSNVEjch.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-Cv35DOiI.js.map → TimeAgo-CSNVEjch.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-DHUXey9s.js → TimestampCell-Du1nBrPn.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-DHUXey9s.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-DvuLFWqQ.js.map → ToolTestPanel-CF-h_5Rg.js.map} +1 -1
- package/dashboard/dist/assets/{TopicDetailPage-TXX3QNSo.js → TopicDetailPage-Dr1UmWcp.js} +3 -3
- package/dashboard/dist/assets/{TopicDetailPage-TXX3QNSo.js.map → TopicDetailPage-Dr1UmWcp.js.map} +1 -1
- package/dashboard/dist/assets/TopicsPage-CUUo-Ylf.js +2 -0
- package/dashboard/dist/assets/{TopicsPage-h-oyTeEJ.js.map → TopicsPage-CUUo-Ylf.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-BceRCeDF.js → UserName-kBh1dc39.js} +2 -2
- package/dashboard/dist/assets/{UserName-BceRCeDF.js.map → UserName-kBh1dc39.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowExecutionPage-CmHGcaN9.js → WorkflowExecutionPage-CCRSbnDx.js} +2 -2
- package/dashboard/dist/assets/{WorkflowExecutionPage-CmHGcaN9.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-B0r2lQXk.js.map → WorkflowsDashboard-BNQVvyek.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsOverview-BTMc2PJ_.js → WorkflowsOverview-DswubNJN.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-BTMc2PJ_.js.map → WorkflowsOverview-DswubNJN.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-DUiCVnZp.js → YamlWorkflowDetailPage-Cw9Dlmup.js} +11 -11
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-DUiCVnZp.js.map → YamlWorkflowDetailPage-Cw9Dlmup.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowsPage-BAuXfwi0.js → YamlWorkflowsPage-DB8xnIXy.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowsPage-BAuXfwi0.js.map → YamlWorkflowsPage-DB8xnIXy.js.map} +1 -1
- package/dashboard/dist/assets/{agents-BvmLCk4h.js → agents-BwEnf6N9.js} +2 -2
- package/dashboard/dist/assets/{agents-BvmLCk4h.js.map → agents-BwEnf6N9.js.map} +1 -1
- package/dashboard/dist/assets/{bots-f_tyhl4I.js → bots-CCmJTT2u.js} +2 -2
- package/dashboard/dist/assets/{bots-f_tyhl4I.js.map → bots-CCmJTT2u.js.map} +1 -1
- package/dashboard/dist/assets/{capabilities-DNo5bqLx.js → capabilities-BZHgp_nh.js} +2 -2
- package/dashboard/dist/assets/{capabilities-DNo5bqLx.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-Dyyj2Irb.js → controlplane-CyfwUlFA.js} +2 -2
- package/dashboard/dist/assets/{controlplane-Dyyj2Irb.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-DL83W7Gu.js.map → index-BAAVTyZ-.js.map} +1 -1
- package/dashboard/dist/assets/{index-CsKiRyhy.js → index-BC6Jenlo.js} +2 -2
- package/dashboard/dist/assets/{index-CsKiRyhy.js.map → index-BC6Jenlo.js.map} +1 -1
- package/dashboard/dist/assets/index-C7KHqOTQ.js +2 -0
- package/dashboard/dist/assets/{index-D7ESqn22.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-DvxxrFBo.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-ClVbfe4z.js.map +1 -0
- package/dashboard/dist/assets/{index-DWse7ERF.js → index-CuVkSmj5.js} +2 -2
- package/dashboard/dist/assets/{index-DWse7ERF.js.map → index-CuVkSmj5.js.map} +1 -1
- package/dashboard/dist/assets/{index-PcyGjmBm.js → index-DAuX_PlL.js} +2 -2
- package/dashboard/dist/assets/{index-PcyGjmBm.js.map → index-DAuX_PlL.js.map} +1 -1
- package/dashboard/dist/assets/{index-e2X-s0EQ.js → index-DBWS5QL8.js} +2 -2
- package/dashboard/dist/assets/{index-e2X-s0EQ.js.map → index-DBWS5QL8.js.map} +1 -1
- package/dashboard/dist/assets/index-DIWCI6HC.js +2 -0
- package/dashboard/dist/assets/{index-BNZknxFY.js.map → index-DIWCI6HC.js.map} +1 -1
- package/dashboard/dist/assets/{index-C-Xr2V3F.js → index-DZ8X_Gp4.js} +2 -2
- package/dashboard/dist/assets/{index-C-Xr2V3F.js.map → index-DZ8X_Gp4.js.map} +1 -1
- package/dashboard/dist/assets/index-Dh8MJl3L.css +1 -0
- package/dashboard/dist/assets/{knowledge-Coo6CKzo.js → knowledge-CqyLhUMg.js} +2 -2
- package/dashboard/dist/assets/{knowledge-Coo6CKzo.js.map → knowledge-CqyLhUMg.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-Cz5eFnP_.js → mcp-Cvu6bFYH.js} +2 -2
- package/dashboard/dist/assets/{mcp-Cz5eFnP_.js.map → mcp-Cvu6bFYH.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-BtnuO4LF.js → mcp-query-qC6A3e9l.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-BtnuO4LF.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-C2-LgpHQ.js → personas-BKN_lJuV.js} +2 -2
- package/dashboard/dist/assets/{personas-C2-LgpHQ.js.map → personas-BKN_lJuV.js.map} +1 -1
- package/dashboard/dist/assets/{pipelines-TuXQvUA-.js → pipelines-BldIfv85.js} +2 -2
- package/dashboard/dist/assets/{pipelines-TuXQvUA-.js.map → pipelines-BldIfv85.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-OUzpu__z.js → tasks-B-Uay8uL.js} +2 -2
- package/dashboard/dist/assets/{tasks-OUzpu__z.js.map → tasks-B-Uay8uL.js.map} +1 -1
- package/dashboard/dist/assets/{topics-B8bdrBaW.js → topics-438EQogt.js} +2 -2
- package/dashboard/dist/assets/{topics-B8bdrBaW.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-Cp5ZOtVE.js → useDebouncedValue-Cw8hYZ8y.js} +2 -2
- package/dashboard/dist/assets/{useDebouncedValue-Cp5ZOtVE.js.map → useDebouncedValue-Cw8hYZ8y.js.map} +1 -1
- package/dashboard/dist/assets/{useNamespace-DtQe3wZ5.js → useNamespace-D1218GQ8.js} +2 -2
- package/dashboard/dist/assets/{useNamespace-DtQe3wZ5.js.map → useNamespace-D1218GQ8.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-CS22c15X.js → useYamlActivityEvents-BAQf_y_U.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-CS22c15X.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-HQIki3hI.js → yaml-workflows-CN01gEB0.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-HQIki3hI.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/http/workflows.md +28 -1
- package/docs/api/mcp/admin.md +40 -4
- 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 +3 -2
- package/docs/dashboard.md +11 -5
- package/docs/hitl/design.md +1 -1
- package/docs/hitl/escalation.md +37 -1
- package/docs/hitl/form.md +12 -7
- package/docs/hitl/invoke-form.md +10 -3
- package/docs/hitl/lookups.md +21 -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-validation.md +50 -3
- package/docs/hitl/x-lt-widget.md +22 -0
- package/docs/hitl-guide.md +12 -2
- 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-D77JeViQ.js +0 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-CqM_MOMy.js +0 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-CqM_MOMy.js.map +0 -1
- package/dashboard/dist/assets/BulkAssignModal-BXiJnlqt.js +0 -2
- package/dashboard/dist/assets/CapabilitiesPage-D9TC2iKy.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-1lT3jkCM.js +0 -2
- package/dashboard/dist/assets/EscalationListView-uuZRMSLB.js +0 -2
- package/dashboard/dist/assets/EscalationListView-uuZRMSLB.js.map +0 -1
- package/dashboard/dist/assets/GraphInvokePage-DV7Y0fe2.js +0 -2
- package/dashboard/dist/assets/HomePage-G785SWcW.js +0 -2
- package/dashboard/dist/assets/ListToolbar-zPVYPg3W.js +0 -2
- package/dashboard/dist/assets/McpQueryPage-CNSNMagY.js +0 -2
- package/dashboard/dist/assets/McpRunsPage-B6rb5QBf.js +0 -2
- package/dashboard/dist/assets/OperationsPage-Dxk1fAMg.js +0 -3
- package/dashboard/dist/assets/OperationsPage-Dxk1fAMg.js.map +0 -1
- package/dashboard/dist/assets/OperatorDashboard-DBOscDnf.js +0 -2
- package/dashboard/dist/assets/ProcessesListPage-5NnysKFC.js +0 -2
- package/dashboard/dist/assets/ResolverForm-Dy0yirtP.js +0 -2
- package/dashboard/dist/assets/ResolverForm-Dy0yirtP.js.map +0 -1
- package/dashboard/dist/assets/RoleDetailPage-C_LIoe1j.js +0 -8
- package/dashboard/dist/assets/RoleDetailPage-C_LIoe1j.js.map +0 -1
- package/dashboard/dist/assets/RunAsSelector-BwZTJ4Yj.js +0 -2
- package/dashboard/dist/assets/ScanCodesPage-FiYIYB-m.js +0 -2
- package/dashboard/dist/assets/ScanStationPage-8CdOtbCD.js +0 -2
- package/dashboard/dist/assets/TasksListPage-BQNaSzCn.js +0 -2
- package/dashboard/dist/assets/ToolTestPanel-DvuLFWqQ.js +0 -2
- package/dashboard/dist/assets/TopicsPage-h-oyTeEJ.js +0 -2
- package/dashboard/dist/assets/WorkflowsDashboard-B0r2lQXk.js +0 -2
- package/dashboard/dist/assets/escalation-columns-DIigeTOK.js +0 -2
- package/dashboard/dist/assets/escalation-columns-DIigeTOK.js.map +0 -1
- package/dashboard/dist/assets/index-BMlQYOE1.js +0 -67
- package/dashboard/dist/assets/index-BMlQYOE1.js.map +0 -1
- package/dashboard/dist/assets/index-BNZknxFY.js +0 -2
- package/dashboard/dist/assets/index-Bpvfr4OW.css +0 -1
- package/dashboard/dist/assets/index-CegPUKpc.js +0 -3
- package/dashboard/dist/assets/index-CegPUKpc.js.map +0 -1
- package/dashboard/dist/assets/index-D7ESqn22.js +0 -2
- package/dashboard/dist/assets/index-DL83W7Gu.js +0 -2
- package/dashboard/dist/assets/index-DPLssnMW.js +0 -6
- package/dashboard/dist/assets/index-DPLssnMW.js.map +0 -1
- package/dashboard/dist/assets/index-DoETPlJP.js +0 -11
- package/dashboard/dist/assets/index-DoETPlJP.js.map +0 -1
- package/dashboard/dist/assets/index-DvxxrFBo.js +0 -2
- 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-C1dXB3n6.js +0 -2
- package/dashboard/dist/assets/resolver-payload-C1dXB3n6.js.map +0 -1
- package/dashboard/dist/assets/seed-form-json-DvPsISxD.js +0 -2
- package/dashboard/dist/assets/seed-form-json-DvPsISxD.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 -244
- package/docs/schema-exchange.md +0 -173
- package/docs/self-test.md +0 -106
- package/docs/story.md +0 -184
|
@@ -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
|
|
@@ -54,6 +54,15 @@ router.get('/:type/config', async (req, res) => {
|
|
|
54
54
|
const result = await api.getWorkflowConfig({ type: req.params.type });
|
|
55
55
|
res.status(result.status).json(result.data ?? { error: result.error });
|
|
56
56
|
});
|
|
57
|
+
/**
|
|
58
|
+
* GET /api/workflows/:type/input-lookups
|
|
59
|
+
* Resolve the versioned knowledge lookups pinned on a workflow config.
|
|
60
|
+
* Open to any caller the invoke gate admits for that workflow.
|
|
61
|
+
*/
|
|
62
|
+
router.get('/:type/input-lookups', async (req, res) => {
|
|
63
|
+
const result = await api.getWorkflowInputLookups({ type: req.params.type }, { userId: req.auth?.userId ?? '', role: req.auth?.role, scopes: req.auth?.scopes });
|
|
64
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
65
|
+
});
|
|
57
66
|
/**
|
|
58
67
|
* PUT /api/workflows/:type/config
|
|
59
68
|
* Create or replace a workflow configuration.
|
|
@@ -75,6 +84,7 @@ router.put('/:type/config', auth_1.requireAdmin, async (req, res) => {
|
|
|
75
84
|
envelope_schema: req.body.envelope_schema,
|
|
76
85
|
input_schema: req.body.input_schema,
|
|
77
86
|
icon: req.body.icon,
|
|
87
|
+
input_lookups: req.body.input_lookups,
|
|
78
88
|
resolver_schema: req.body.resolver_schema,
|
|
79
89
|
cron_schedule: req.body.cron_schedule,
|
|
80
90
|
});
|
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),
|
|
@@ -18,6 +18,7 @@ async function loadAllConfigs() {
|
|
|
18
18
|
envelopeSchema: c.envelope_schema ?? null,
|
|
19
19
|
inputSchema: c.input_schema ?? null,
|
|
20
20
|
icon: c.icon ?? null,
|
|
21
|
+
inputLookups: c.input_lookups ?? null,
|
|
21
22
|
resolverSchema: c.resolver_schema ?? null,
|
|
22
23
|
cronSchedule: c.cron_schedule ?? null,
|
|
23
24
|
executeAs: c.execute_as ?? null,
|
|
@@ -28,6 +28,7 @@ async function getWorkflowConfig(workflowType) {
|
|
|
28
28
|
envelope_schema: wf.envelope_schema ?? null,
|
|
29
29
|
input_schema: wf.input_schema ?? null,
|
|
30
30
|
icon: wf.icon ?? null,
|
|
31
|
+
input_lookups: wf.input_lookups ?? null,
|
|
31
32
|
resolver_schema: wf.resolver_schema ?? null,
|
|
32
33
|
cron_schedule: wf.cron_schedule ?? null,
|
|
33
34
|
execute_as: wf.execute_as ?? null,
|
|
@@ -68,6 +69,7 @@ async function listWorkflowConfigs() {
|
|
|
68
69
|
envelope_schema: wf.envelope_schema ?? null,
|
|
69
70
|
input_schema: wf.input_schema ?? null,
|
|
70
71
|
icon: wf.icon ?? null,
|
|
72
|
+
input_lookups: wf.input_lookups ?? null,
|
|
71
73
|
resolver_schema: wf.resolver_schema ?? null,
|
|
72
74
|
cron_schedule: wf.cron_schedule ?? null,
|
|
73
75
|
execute_as: wf.execute_as ?? null,
|
|
@@ -5,13 +5,13 @@ export declare const LIST_ALL_WORKFLOWS = "SELECT * FROM lt_config_workflows ORD
|
|
|
5
5
|
export declare const LIST_ALL_ROLES = "SELECT * FROM lt_config_roles ORDER BY workflow_type, role";
|
|
6
6
|
export declare const LIST_ALL_INVOCATION_ROLES = "SELECT * FROM lt_config_invocation_roles ORDER BY workflow_type, role";
|
|
7
7
|
export declare const ENSURE_ROLE_EXISTS = "INSERT INTO lt_roles (role) VALUES ($1) ON CONFLICT DO NOTHING";
|
|
8
|
-
export declare const UPSERT_WORKFLOW = "INSERT INTO lt_config_workflows\n (workflow_type, invocable, task_queue, default_role, description, consumes, envelope_schema, resolver_schema, cron_schedule, tool_tags, execute_as, certified, read_safe, input_schema, icon)\nVALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15)\nON CONFLICT (workflow_type) DO UPDATE SET\n invocable = EXCLUDED.invocable,\n task_queue = EXCLUDED.task_queue,\n default_role = EXCLUDED.default_role,\n description = EXCLUDED.description,\n consumes = EXCLUDED.consumes,\n envelope_schema = EXCLUDED.envelope_schema,\n resolver_schema = EXCLUDED.resolver_schema,\n cron_schedule = EXCLUDED.cron_schedule,\n tool_tags = EXCLUDED.tool_tags,\n execute_as = EXCLUDED.execute_as,\n certified = EXCLUDED.certified,\n read_safe = EXCLUDED.read_safe,\n input_schema = EXCLUDED.input_schema,\n icon = EXCLUDED.icon";
|
|
8
|
+
export declare const UPSERT_WORKFLOW = "INSERT INTO lt_config_workflows\n (workflow_type, invocable, task_queue, default_role, description, consumes, envelope_schema, resolver_schema, cron_schedule, tool_tags, execute_as, certified, read_safe, input_schema, icon, input_lookups)\nVALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16)\nON CONFLICT (workflow_type) DO UPDATE SET\n invocable = EXCLUDED.invocable,\n task_queue = EXCLUDED.task_queue,\n default_role = EXCLUDED.default_role,\n description = EXCLUDED.description,\n consumes = EXCLUDED.consumes,\n envelope_schema = EXCLUDED.envelope_schema,\n resolver_schema = EXCLUDED.resolver_schema,\n cron_schedule = EXCLUDED.cron_schedule,\n tool_tags = EXCLUDED.tool_tags,\n execute_as = EXCLUDED.execute_as,\n certified = EXCLUDED.certified,\n read_safe = EXCLUDED.read_safe,\n input_schema = EXCLUDED.input_schema,\n icon = EXCLUDED.icon,\n input_lookups = EXCLUDED.input_lookups";
|
|
9
9
|
export declare const DELETE_CONFIG_ROLES = "DELETE FROM lt_config_roles WHERE workflow_type = $1";
|
|
10
10
|
export declare const INSERT_CONFIG_ROLE = "INSERT INTO lt_config_roles (workflow_type, role) VALUES ($1, $2)";
|
|
11
11
|
export declare const DELETE_INVOCATION_ROLES = "DELETE FROM lt_config_invocation_roles WHERE workflow_type = $1";
|
|
12
12
|
export declare const INSERT_INVOCATION_ROLE = "INSERT INTO lt_config_invocation_roles (workflow_type, role) VALUES ($1, $2)";
|
|
13
13
|
export declare const DELETE_WORKFLOW = "DELETE FROM lt_config_workflows WHERE workflow_type = $1";
|
|
14
|
-
export declare const SEED_WORKFLOW_CONFIG = "INSERT INTO lt_config_workflows\n (workflow_type, invocable, task_queue, default_role, description, consumes, envelope_schema, resolver_schema, cron_schedule, tool_tags, execute_as, certified, read_safe, input_schema, icon)\nVALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15)\nON CONFLICT (workflow_type) DO NOTHING";
|
|
14
|
+
export declare const SEED_WORKFLOW_CONFIG = "INSERT INTO lt_config_workflows\n (workflow_type, invocable, task_queue, default_role, description, consumes, envelope_schema, resolver_schema, cron_schedule, tool_tags, execute_as, certified, read_safe, input_schema, icon, input_lookups)\nVALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16)\nON CONFLICT (workflow_type) DO NOTHING";
|
|
15
15
|
export declare const SEED_CONFIG_ROLE = "INSERT INTO lt_config_roles (workflow_type, role) VALUES ($1, $2)\nON CONFLICT (workflow_type, role) DO NOTHING";
|
|
16
16
|
export declare const SEED_INVOCATION_ROLE = "INSERT INTO lt_config_invocation_roles (workflow_type, role) VALUES ($1, $2)\nON CONFLICT (workflow_type, role) DO NOTHING";
|
|
17
17
|
export declare const GET_PROVIDER_DATA = "SELECT workflow_type, data, completed_at\n FROM lt_tasks\n WHERE origin_id = $1\n AND workflow_type = ANY($2)\n AND status = 'completed'\n ORDER BY completed_at DESC";
|
|
@@ -23,8 +23,8 @@ exports.ENSURE_ROLE_EXISTS = `\
|
|
|
23
23
|
INSERT INTO lt_roles (role) VALUES ($1) ON CONFLICT DO NOTHING`;
|
|
24
24
|
exports.UPSERT_WORKFLOW = `\
|
|
25
25
|
INSERT INTO lt_config_workflows
|
|
26
|
-
(workflow_type, invocable, task_queue, default_role, description, consumes, envelope_schema, resolver_schema, cron_schedule, tool_tags, execute_as, certified, read_safe, input_schema, icon)
|
|
27
|
-
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15)
|
|
26
|
+
(workflow_type, invocable, task_queue, default_role, description, consumes, envelope_schema, resolver_schema, cron_schedule, tool_tags, execute_as, certified, read_safe, input_schema, icon, input_lookups)
|
|
27
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16)
|
|
28
28
|
ON CONFLICT (workflow_type) DO UPDATE SET
|
|
29
29
|
invocable = EXCLUDED.invocable,
|
|
30
30
|
task_queue = EXCLUDED.task_queue,
|
|
@@ -39,7 +39,8 @@ ON CONFLICT (workflow_type) DO UPDATE SET
|
|
|
39
39
|
certified = EXCLUDED.certified,
|
|
40
40
|
read_safe = EXCLUDED.read_safe,
|
|
41
41
|
input_schema = EXCLUDED.input_schema,
|
|
42
|
-
icon = EXCLUDED.icon
|
|
42
|
+
icon = EXCLUDED.icon,
|
|
43
|
+
input_lookups = EXCLUDED.input_lookups`;
|
|
43
44
|
exports.DELETE_CONFIG_ROLES = `\
|
|
44
45
|
DELETE FROM lt_config_roles WHERE workflow_type = $1`;
|
|
45
46
|
exports.INSERT_CONFIG_ROLE = `\
|
|
@@ -55,8 +56,8 @@ DELETE FROM lt_config_workflows WHERE workflow_type = $1`;
|
|
|
55
56
|
// ------------------------------------------------------------------ //
|
|
56
57
|
exports.SEED_WORKFLOW_CONFIG = `\
|
|
57
58
|
INSERT INTO lt_config_workflows
|
|
58
|
-
(workflow_type, invocable, task_queue, default_role, description, consumes, envelope_schema, resolver_schema, cron_schedule, tool_tags, execute_as, certified, read_safe, input_schema, icon)
|
|
59
|
-
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15)
|
|
59
|
+
(workflow_type, invocable, task_queue, default_role, description, consumes, envelope_schema, resolver_schema, cron_schedule, tool_tags, execute_as, certified, read_safe, input_schema, icon, input_lookups)
|
|
60
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16)
|
|
60
61
|
ON CONFLICT (workflow_type) DO NOTHING`;
|
|
61
62
|
exports.SEED_CONFIG_ROLE = `\
|
|
62
63
|
INSERT INTO lt_config_roles (workflow_type, role) VALUES ($1, $2)
|
|
@@ -14,6 +14,10 @@ const sql_1 = require("./sql");
|
|
|
14
14
|
* seed blocks without `certified`): derived from roles/consumes presence —
|
|
15
15
|
* the rule that governed the tier before the flag existed.
|
|
16
16
|
*/
|
|
17
|
+
/** pg binds JS arrays as Postgres arrays; jsonb columns take the JSON text. */
|
|
18
|
+
function toJsonb(value) {
|
|
19
|
+
return value == null ? null : JSON.stringify(value);
|
|
20
|
+
}
|
|
17
21
|
function resolveCertified(config) {
|
|
18
22
|
return (config.certified ??
|
|
19
23
|
((config.roles?.length ?? 0) > 0 || (config.consumes?.length ?? 0) > 0));
|
|
@@ -55,6 +59,7 @@ async function replaceWorkflowConfig(config, certified) {
|
|
|
55
59
|
config.read_safe ?? false,
|
|
56
60
|
config.input_schema ?? null,
|
|
57
61
|
config.icon ?? null,
|
|
62
|
+
toJsonb(config.input_lookups),
|
|
58
63
|
]);
|
|
59
64
|
// Replace roles
|
|
60
65
|
await client.query(sql_1.DELETE_CONFIG_ROLES, [config.workflow_type]);
|
|
@@ -118,6 +123,7 @@ async function seedWorkflowConfig(config) {
|
|
|
118
123
|
config.read_safe ?? false,
|
|
119
124
|
config.input_schema ?? null,
|
|
120
125
|
config.icon ?? null,
|
|
126
|
+
toJsonb(config.input_lookups),
|
|
121
127
|
]);
|
|
122
128
|
const inserted = (rowCount ?? 0) > 0;
|
|
123
129
|
if (inserted) {
|
|
@@ -152,6 +158,8 @@ async function seedWorkflowConfig(config) {
|
|
|
152
158
|
drifts.push('input_schema');
|
|
153
159
|
if ((config.icon ?? null) !== (existing.icon ?? null))
|
|
154
160
|
drifts.push('icon');
|
|
161
|
+
if (JSON.stringify(config.input_lookups ?? null) !== JSON.stringify(existing.input_lookups ?? null))
|
|
162
|
+
drifts.push('input_lookups');
|
|
155
163
|
if (drifts.length) {
|
|
156
164
|
logger_1.loggerRegistry.warn(`[long-tail] config drift: ${config.workflow_type} — ${drifts.join(', ')} differ between code and DB`);
|
|
157
165
|
}
|
|
@@ -191,7 +199,8 @@ async function applyWorkflowConfig(config) {
|
|
|
191
199
|
(0, node_util_1.isDeepStrictEqual)(existing.envelope_schema ?? null, config.envelope_schema ?? null) &&
|
|
192
200
|
(0, node_util_1.isDeepStrictEqual)(existing.resolver_schema ?? null, config.resolver_schema ?? null) &&
|
|
193
201
|
(0, node_util_1.isDeepStrictEqual)(existing.input_schema ?? null, config.input_schema ?? null) &&
|
|
194
|
-
(existing.icon ?? null) === (config.icon ?? null)
|
|
202
|
+
(existing.icon ?? null) === (config.icon ?? null) &&
|
|
203
|
+
(0, node_util_1.isDeepStrictEqual)(existing.input_lookups ?? null, config.input_lookups ?? null);
|
|
195
204
|
if (unchanged)
|
|
196
205
|
return 'unchanged';
|
|
197
206
|
}
|
|
@@ -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);
|
|
@@ -24,6 +24,7 @@ exports.listKnowledgeVersions = listKnowledgeVersions;
|
|
|
24
24
|
const db_1 = require("../../lib/db");
|
|
25
25
|
const sql_1 = require("./sql");
|
|
26
26
|
__exportStar(require("./lookup-cache"), exports);
|
|
27
|
+
__exportStar(require("./lookup-refs"), exports);
|
|
27
28
|
/** The immutable snapshot at (domain, key, version), uncached full shape. */
|
|
28
29
|
async function getKnowledgeVersion(domain, key, version) {
|
|
29
30
|
const pool = (0, db_1.getPool)();
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { EscalationLookupRef } from '../../types/escalation';
|
|
2
|
+
/**
|
|
3
|
+
* One message per ref whose pinned edition does not exist, naming what does.
|
|
4
|
+
* Shape is the caller's job (assertLookupRefs); this answers the second
|
|
5
|
+
* question a saver has: is there an edition behind the pin.
|
|
6
|
+
*/
|
|
7
|
+
export declare function describeMissingLookupRefs(refs: EscalationLookupRef[]): Promise<string[]>;
|