@hotmeshio/long-tail 0.18.1 → 0.19.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/build/api/escalations/index.d.ts +1 -1
- package/build/api/escalations/index.js +2 -1
- package/build/api/escalations/list.d.ts +11 -0
- package/build/api/escalations/list.js +31 -2
- package/build/api/users.d.ts +11 -0
- package/build/api/users.js +19 -0
- package/build/api/workflows/config.d.ts +5 -1
- package/build/api/workflows/config.js +9 -1
- package/build/api/workflows/index.d.ts +3 -0
- package/build/api/workflows/index.js +7 -1
- package/build/api/workflows/input-validation.d.ts +13 -0
- package/build/api/workflows/input-validation.js +38 -0
- package/build/api/workflows/invocable.d.ts +19 -0
- package/build/api/workflows/invocable.js +106 -0
- package/build/api/workflows/invocation.js +6 -0
- package/build/lib/db/schemas/034_workflow_input_schema.sql +13 -0
- package/build/lib/uuid.d.ts +11 -0
- package/build/lib/uuid.js +20 -0
- package/build/routes/escalations/list.js +10 -1
- package/build/routes/users.js +9 -0
- package/build/routes/workflows/config.js +2 -0
- package/build/routes/workflows/discovery.js +14 -0
- package/build/scripts/ortho-populate.d.ts +3 -1
- package/build/scripts/ortho-populate.js +15 -5
- package/build/sdk/index.d.ts +1 -0
- package/build/services/config/cache.js +2 -0
- package/build/services/config/read.js +4 -0
- package/build/services/config/sql.d.ts +2 -2
- package/build/services/config/sql.js +7 -5
- package/build/services/config/write.js +11 -1
- package/build/services/escalation/batch.js +3 -0
- package/build/services/escalation/bulk.js +8 -0
- package/build/services/escalation/crud.js +26 -0
- package/build/services/escalation/queries.d.ts +14 -1
- package/build/services/escalation/queries.js +49 -7
- package/build/services/escalation/sql.d.ts +4 -2
- package/build/services/escalation/sql.js +4 -0
- package/build/services/interceptor/index.js +7 -0
- package/build/services/invocation-access.d.ts +18 -0
- package/build/services/invocation-access.js +32 -0
- package/build/services/role/types.d.ts +1 -1
- package/build/services/role/types.js +1 -1
- package/build/services/user/auth.js +2 -2
- package/build/services/user/crud.d.ts +13 -0
- package/build/services/user/crud.js +26 -3
- package/build/services/user/index.d.ts +1 -1
- package/build/services/user/index.js +2 -1
- package/build/services/user/sql.d.ts +11 -5
- package/build/services/user/sql.js +18 -6
- package/build/services/workflow-invocation.js +4 -9
- package/build/shared/form-validation/index.d.ts +1 -0
- package/build/shared/form-validation/index.js +1 -0
- package/build/shared/form-validation/invoke-context.d.ts +7 -0
- package/build/shared/form-validation/invoke-context.js +11 -0
- package/build/shared/form-validation/validate-resolver-payload.d.ts +1 -1
- package/build/shared/form-validation/validate-resolver-payload.js +1 -0
- package/build/shared/form-validation/x-lt-help.d.ts +2 -2
- package/build/shared/form-validation/x-lt-help.js +2 -2
- package/build/shared/form-validation/x-lt-show-if.d.ts +1 -0
- package/build/shared/form-validation/x-lt-show-if.js +3 -0
- package/build/start/workers.js +2 -0
- package/build/system/mcp-servers/admin/workflows.js +15 -2
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/config.d.ts +6 -0
- package/build/types/index.d.ts +2 -0
- package/build/types/index.js +4 -1
- package/build/types/startup.d.ts +10 -0
- package/build/types/validation.d.ts +4 -2
- package/build/types/workflow-icons.d.ts +86 -0
- package/build/types/workflow-icons.js +92 -0
- package/dashboard/dist/assets/{AdminDashboard-DDY8bceq.js → AdminDashboard-Drs-9TRM.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-DDY8bceq.js.map → AdminDashboard-Drs-9TRM.js.map} +1 -1
- package/dashboard/dist/assets/{AgentConfigPage-D47sHnup.js → AgentConfigPage-BDPDZ7-v.js} +3 -3
- package/dashboard/dist/assets/{AgentConfigPage-D47sHnup.js.map → AgentConfigPage-BDPDZ7-v.js.map} +1 -1
- package/dashboard/dist/assets/{AgentDetailPage-DwrfByA2.js → AgentDetailPage-CGBulM4_.js} +3 -3
- package/dashboard/dist/assets/{AgentDetailPage-DwrfByA2.js.map → AgentDetailPage-CGBulM4_.js.map} +1 -1
- package/dashboard/dist/assets/AgentsPage-D77JeViQ.js +2 -0
- package/dashboard/dist/assets/{AgentsPage-CLSjlyXy.js.map → AgentsPage-D77JeViQ.js.map} +1 -1
- package/dashboard/dist/assets/{AutoGrowTextarea-DgEQeRQw.js → AutoGrowTextarea-7X3T9La8.js} +2 -2
- package/dashboard/dist/assets/{AutoGrowTextarea-DgEQeRQw.js.map → AutoGrowTextarea-7X3T9La8.js.map} +1 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-CqM_MOMy.js +2 -0
- package/dashboard/dist/assets/AvailableEscalationsPage-CqM_MOMy.js.map +1 -0
- package/dashboard/dist/assets/{BotPicker-CbL7gQFq.js → BotPicker-CC5vI_Sv.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-CbL7gQFq.js.map → BotPicker-CC5vI_Sv.js.map} +1 -1
- package/dashboard/dist/assets/BulkAssignModal-BXiJnlqt.js +2 -0
- package/dashboard/dist/assets/BulkAssignModal-BXiJnlqt.js.map +1 -0
- package/dashboard/dist/assets/{CapabilitiesPage-Q9Pe0y_p.js → CapabilitiesPage-D9TC2iKy.js} +2 -2
- package/dashboard/dist/assets/{CapabilitiesPage-Q9Pe0y_p.js.map → CapabilitiesPage-D9TC2iKy.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-BZOtaWPR.js → CollapsibleSection-D10lGw_u.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-BZOtaWPR.js.map → CollapsibleSection-D10lGw_u.js.map} +1 -1
- package/dashboard/dist/assets/{ConfirmDeleteModal-6CidwpPx.js → ConfirmDeleteModal-BJdLN6No.js} +2 -2
- package/dashboard/dist/assets/{ConfirmDeleteModal-6CidwpPx.js.map → ConfirmDeleteModal-BJdLN6No.js.map} +1 -1
- package/dashboard/dist/assets/{CopyableId-4Lqlc5cU.js → CopyableId-Bn02zYxt.js} +2 -2
- package/dashboard/dist/assets/{CopyableId-4Lqlc5cU.js.map → CopyableId-Bn02zYxt.js.map} +1 -1
- package/dashboard/dist/assets/CountdownTimer-D9B-BjQ7.js +2 -0
- package/dashboard/dist/assets/CountdownTimer-D9B-BjQ7.js.map +1 -0
- package/dashboard/dist/assets/{CredentialsPage-dxjrUEyO.js → CredentialsPage-hniUAFBK.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-dxjrUEyO.js.map → CredentialsPage-hniUAFBK.js.map} +1 -1
- package/dashboard/dist/assets/{CronLabel-D8oo8eaA.js → CronLabel-v9DCD2FX.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-D8oo8eaA.js.map → CronLabel-v9DCD2FX.js.map} +1 -1
- package/dashboard/dist/assets/{DataTable-DFPMeqyQ.js → DataTable-7C7riavf.js} +2 -2
- package/dashboard/dist/assets/{DataTable-DFPMeqyQ.js.map → DataTable-7C7riavf.js.map} +1 -1
- package/dashboard/dist/assets/{DropZone-CWCh5ItZ.js → DropZone-XlcY8hEH.js} +2 -2
- package/dashboard/dist/assets/{DropZone-CWCh5ItZ.js.map → DropZone-XlcY8hEH.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-FHHQ69G3.js → ElapsedCell-_xvVTK8N.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-FHHQ69G3.js.map → ElapsedCell-_xvVTK8N.js.map} +1 -1
- package/dashboard/dist/assets/{EmptyState-lpUFYfun.js → EmptyState-DgC_6njU.js} +2 -2
- package/dashboard/dist/assets/{EmptyState-lpUFYfun.js.map → EmptyState-DgC_6njU.js.map} +1 -1
- package/dashboard/dist/assets/EntityTimelinePanel-1lT3jkCM.js +2 -0
- package/dashboard/dist/assets/EntityTimelinePanel-1lT3jkCM.js.map +1 -0
- package/dashboard/dist/assets/{EscalationListSchemaPage-D5L5lDNb.js → EscalationListSchemaPage-BeQUTUEO.js} +3 -3
- package/dashboard/dist/assets/{EscalationListSchemaPage-D5L5lDNb.js.map → EscalationListSchemaPage-BeQUTUEO.js.map} +1 -1
- package/dashboard/dist/assets/EscalationListView-uuZRMSLB.js +2 -0
- package/dashboard/dist/assets/EscalationListView-uuZRMSLB.js.map +1 -0
- package/dashboard/dist/assets/{EscalationSchemaPage-bYbfEpSB.js → EscalationSchemaPage-D4VlEwyS.js} +3 -3
- package/dashboard/dist/assets/{EscalationSchemaPage-bYbfEpSB.js.map → EscalationSchemaPage-D4VlEwyS.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-DjtIjL1b.js → EscalationsOverview-Bx6Zrzm-.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-DjtIjL1b.js.map → EscalationsOverview-Bx6Zrzm-.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-CihVTREC.js → EventTable-KEC3YWBf.js} +2 -2
- package/dashboard/dist/assets/{EventTable-CihVTREC.js.map → EventTable-KEC3YWBf.js.map} +1 -1
- package/dashboard/dist/assets/{FilterBar-Fin1IqHc.js → FilterBar-xwN_b5fj.js} +2 -2
- package/dashboard/dist/assets/{FilterBar-Fin1IqHc.js.map → FilterBar-xwN_b5fj.js.map} +1 -1
- package/dashboard/dist/assets/{GraphInvokePage-D77ILPd3.js → GraphInvokePage-DV7Y0fe2.js} +2 -2
- package/dashboard/dist/assets/{GraphInvokePage-D77ILPd3.js.map → GraphInvokePage-DV7Y0fe2.js.map} +1 -1
- package/dashboard/dist/assets/HomePage-G785SWcW.js +2 -0
- package/dashboard/dist/assets/HomePage-G785SWcW.js.map +1 -0
- package/dashboard/dist/assets/ListToolbar-zPVYPg3W.js +2 -0
- package/dashboard/dist/assets/{ListToolbar-DyHaJBTk.js.map → ListToolbar-zPVYPg3W.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-qz7Ivf0G.js → McpOverview-CMGUq8hx.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-qz7Ivf0G.js.map → McpOverview-CMGUq8hx.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryDetailPage-D6MB4CZM.js → McpQueryDetailPage-CdhLhaKn.js} +3 -3
- package/dashboard/dist/assets/{McpQueryDetailPage-D6MB4CZM.js.map → McpQueryDetailPage-CdhLhaKn.js.map} +1 -1
- package/dashboard/dist/assets/McpQueryPage-CNSNMagY.js +2 -0
- package/dashboard/dist/assets/{McpQueryPage-BqqRF5cQ.js.map → McpQueryPage-CNSNMagY.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunDetailPage-DxLEhzhn.js → McpRunDetailPage-DBm8hUaW.js} +2 -2
- package/dashboard/dist/assets/{McpRunDetailPage-DxLEhzhn.js.map → McpRunDetailPage-DBm8hUaW.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunsPage-BOsS4Hdf.js → McpRunsPage-B6rb5QBf.js} +2 -2
- package/dashboard/dist/assets/{McpRunsPage-BOsS4Hdf.js.map → McpRunsPage-B6rb5QBf.js.map} +1 -1
- package/dashboard/dist/assets/NamespacePill-Bb3revqD.js +2 -0
- package/dashboard/dist/assets/{NamespacePill-CJikgGzE.js.map → NamespacePill-Bb3revqD.js.map} +1 -1
- package/dashboard/dist/assets/OperationsPage-Dxk1fAMg.js +3 -0
- package/dashboard/dist/assets/OperationsPage-Dxk1fAMg.js.map +1 -0
- package/dashboard/dist/assets/OperatorDashboard-DBOscDnf.js +2 -0
- package/dashboard/dist/assets/{OperatorDashboard-C5rlijvh.js.map → OperatorDashboard-DBOscDnf.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeader-DZmymFBS.js → PageHeader-Di5Sz3an.js} +2 -2
- package/dashboard/dist/assets/{PageHeader-DZmymFBS.js.map → PageHeader-Di5Sz3an.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeaderWithStats-DuAm6YK2.js → PageHeaderWithStats-DutKJ-h2.js} +2 -2
- package/dashboard/dist/assets/{PageHeaderWithStats-DuAm6YK2.js.map → PageHeaderWithStats-DutKJ-h2.js.map} +1 -1
- package/dashboard/dist/assets/{PersonaDetailPage-JBdVvT5g.js → PersonaDetailPage-BGRdGpeR.js} +2 -2
- package/dashboard/dist/assets/{PersonaDetailPage-JBdVvT5g.js.map → PersonaDetailPage-BGRdGpeR.js.map} +1 -1
- package/dashboard/dist/assets/PersonasPage-DRzOZcVa.js +2 -0
- package/dashboard/dist/assets/PersonasPage-DRzOZcVa.js.map +1 -0
- package/dashboard/dist/assets/{PriorityBadge-BETdj4M-.js → PriorityBadge-r33mpDju.js} +2 -2
- package/dashboard/dist/assets/{PriorityBadge-BETdj4M-.js.map → PriorityBadge-r33mpDju.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessDetailPage-CHnzOzQn.js → ProcessDetailPage-BLGjZXpM.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-CHnzOzQn.js.map → ProcessDetailPage-BLGjZXpM.js.map} +1 -1
- package/dashboard/dist/assets/ProcessesListPage-5NnysKFC.js +2 -0
- package/dashboard/dist/assets/{ProcessesListPage-DuXTS5-v.js.map → ProcessesListPage-5NnysKFC.js.map} +1 -1
- package/dashboard/dist/assets/ResolverForm-Dy0yirtP.js +2 -0
- package/dashboard/dist/assets/ResolverForm-Dy0yirtP.js.map +1 -0
- package/dashboard/dist/assets/RoleDetailPage-C_LIoe1j.js +8 -0
- package/dashboard/dist/assets/RoleDetailPage-C_LIoe1j.js.map +1 -0
- package/dashboard/dist/assets/{RolePill-C9LSs1aK.js → RolePill-DhnVPK4q.js} +2 -2
- package/dashboard/dist/assets/{RolePill-C9LSs1aK.js.map → RolePill-DhnVPK4q.js.map} +1 -1
- package/dashboard/dist/assets/RolesPage-BmW1LzkU.js +2 -0
- package/dashboard/dist/assets/{RolesPage-h77-JOLd.js.map → RolesPage-BmW1LzkU.js.map} +1 -1
- package/dashboard/dist/assets/{RowActions-eYrzgQSj.js → RowActions-Bdd7z4eB.js} +2 -2
- package/dashboard/dist/assets/{RowActions-eYrzgQSj.js.map → RowActions-Bdd7z4eB.js.map} +1 -1
- package/dashboard/dist/assets/RunAsSelector-BwZTJ4Yj.js +2 -0
- package/dashboard/dist/assets/{RunAsSelector-DoLFJ0mZ.js.map → RunAsSelector-BwZTJ4Yj.js.map} +1 -1
- package/dashboard/dist/assets/ScanCodesPage-FiYIYB-m.js +2 -0
- package/dashboard/dist/assets/{ScanCodesPage-b5NZM_-f.js.map → ScanCodesPage-FiYIYB-m.js.map} +1 -1
- package/dashboard/dist/assets/{ScanSchemeDetailPage-t7X6ekaW.js → ScanSchemeDetailPage-BiAqtD-a.js} +2 -2
- package/dashboard/dist/assets/{ScanSchemeDetailPage-t7X6ekaW.js.map → ScanSchemeDetailPage-BiAqtD-a.js.map} +1 -1
- package/dashboard/dist/assets/ScanStationPage-8CdOtbCD.js +2 -0
- package/dashboard/dist/assets/{ScanStationPage-r02hkTAG.js.map → ScanStationPage-8CdOtbCD.js.map} +1 -1
- package/dashboard/dist/assets/{ScopeBadge-CjyC7iyO.js → ScopeBadge-CXUg0FHo.js} +2 -2
- package/dashboard/dist/assets/{ScopeBadge-CjyC7iyO.js.map → ScopeBadge-CXUg0FHo.js.map} +1 -1
- package/dashboard/dist/assets/{SegmentedTabs-DXNzY05q.js → SegmentedTabs-BpJh4Hwn.js} +2 -2
- package/dashboard/dist/assets/{SegmentedTabs-DXNzY05q.js.map → SegmentedTabs-BpJh4Hwn.js.map} +1 -1
- package/dashboard/dist/assets/{StatCard-BXQ8dD9Y.js → StatCard-nWY4sndl.js} +2 -2
- package/dashboard/dist/assets/{StatCard-BXQ8dD9Y.js.map → StatCard-nWY4sndl.js.map} +1 -1
- package/dashboard/dist/assets/{StatusBadge-BDeUwPtb.js → StatusBadge-DHVwxre2.js} +2 -2
- package/dashboard/dist/assets/{StatusBadge-BDeUwPtb.js.map → StatusBadge-DHVwxre2.js.map} +1 -1
- package/dashboard/dist/assets/{StickyPagination-BGHQbp0_.js → StickyPagination-DRuqKhZt.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-BGHQbp0_.js.map → StickyPagination-DRuqKhZt.js.map} +1 -1
- package/dashboard/dist/assets/{StreamMessageDetail-C-wfdbLJ.js → StreamMessageDetail-JwlbRiMn.js} +2 -2
- package/dashboard/dist/assets/{StreamMessageDetail-C-wfdbLJ.js.map → StreamMessageDetail-JwlbRiMn.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-Dnoz-me3.js → SwimlaneTimeline-hu3c4bCJ.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-Dnoz-me3.js.map → SwimlaneTimeline-hu3c4bCJ.js.map} +1 -1
- package/dashboard/dist/assets/{TagInput-D-vLSMQC.js → TagInput-BZ8vb2oW.js} +2 -2
- package/dashboard/dist/assets/{TagInput-D-vLSMQC.js.map → TagInput-BZ8vb2oW.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-c9IiAhVJ.js → TaskDetailPage-NqVZF3jW.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-c9IiAhVJ.js.map → TaskDetailPage-NqVZF3jW.js.map} +1 -1
- package/dashboard/dist/assets/{TaskQueuePill-sFRMrQ5D.js → TaskQueuePill-Bxir8WRl.js} +2 -2
- package/dashboard/dist/assets/{TaskQueuePill-sFRMrQ5D.js.map → TaskQueuePill-Bxir8WRl.js.map} +1 -1
- package/dashboard/dist/assets/TasksListPage-BQNaSzCn.js +2 -0
- package/dashboard/dist/assets/{TasksListPage-Dor8LSc5.js.map → TasksListPage-BQNaSzCn.js.map} +1 -1
- package/dashboard/dist/assets/TimeAgo-Cv35DOiI.js +2 -0
- package/dashboard/dist/assets/{TimeAgo-Dd8vmRnM.js.map → TimeAgo-Cv35DOiI.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-qJfC6-iT.js → TimestampCell-DHUXey9s.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-qJfC6-iT.js.map → TimestampCell-DHUXey9s.js.map} +1 -1
- package/dashboard/dist/assets/{ToolPill-OQ3mC11d.js → ToolPill-FkgTXIhq.js} +2 -2
- package/dashboard/dist/assets/{ToolPill-OQ3mC11d.js.map → ToolPill-FkgTXIhq.js.map} +1 -1
- package/dashboard/dist/assets/ToolTestPanel-DvuLFWqQ.js +2 -0
- package/dashboard/dist/assets/{ToolTestPanel-CEGY5jss.js.map → ToolTestPanel-DvuLFWqQ.js.map} +1 -1
- package/dashboard/dist/assets/{TopicDetailPage-SI80ZTVv.js → TopicDetailPage-TXX3QNSo.js} +3 -3
- package/dashboard/dist/assets/{TopicDetailPage-SI80ZTVv.js.map → TopicDetailPage-TXX3QNSo.js.map} +1 -1
- package/dashboard/dist/assets/{TopicsPage-DiVB8tNr.js → TopicsPage-h-oyTeEJ.js} +2 -2
- package/dashboard/dist/assets/{TopicsPage-DiVB8tNr.js.map → TopicsPage-h-oyTeEJ.js.map} +1 -1
- package/dashboard/dist/assets/UserName-BceRCeDF.js +2 -0
- package/dashboard/dist/assets/UserName-BceRCeDF.js.map +1 -0
- package/dashboard/dist/assets/WorkflowExecutionPage-CmHGcaN9.js +2 -0
- package/dashboard/dist/assets/{WorkflowExecutionPage-e-Q57yiJ.js.map → WorkflowExecutionPage-CmHGcaN9.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowPill-Dh3hIW1l.js → WorkflowPill--AYMW7u_.js} +2 -2
- package/dashboard/dist/assets/WorkflowPill--AYMW7u_.js.map +1 -0
- package/dashboard/dist/assets/WorkflowsDashboard-B0r2lQXk.js +2 -0
- package/dashboard/dist/assets/{WorkflowsDashboard-DLKzN80h.js.map → WorkflowsDashboard-B0r2lQXk.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowsOverview-BTMc2PJ_.js +2 -0
- package/dashboard/dist/assets/{WorkflowsOverview-J-ITQiO5.js.map → WorkflowsOverview-BTMc2PJ_.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-B_-ahhf1.js → YamlWorkflowDetailPage-DUiCVnZp.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-B_-ahhf1.js.map → YamlWorkflowDetailPage-DUiCVnZp.js.map} +1 -1
- package/dashboard/dist/assets/YamlWorkflowsPage-BAuXfwi0.js +2 -0
- package/dashboard/dist/assets/{YamlWorkflowsPage-DQNeERXU.js.map → YamlWorkflowsPage-BAuXfwi0.js.map} +1 -1
- package/dashboard/dist/assets/{agents-BsJ-MizQ.js → agents-BvmLCk4h.js} +2 -2
- package/dashboard/dist/assets/{agents-BsJ-MizQ.js.map → agents-BvmLCk4h.js.map} +1 -1
- package/dashboard/dist/assets/{bots-q1UYqaIh.js → bots-f_tyhl4I.js} +2 -2
- package/dashboard/dist/assets/{bots-q1UYqaIh.js.map → bots-f_tyhl4I.js.map} +1 -1
- package/dashboard/dist/assets/capabilities-DNo5bqLx.js +2 -0
- package/dashboard/dist/assets/{capabilities-BvjPXUcJ.js.map → capabilities-DNo5bqLx.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-BwlNpoJ_.js → controlplane-Dyyj2Irb.js} +2 -2
- package/dashboard/dist/assets/{controlplane-BwlNpoJ_.js.map → controlplane-Dyyj2Irb.js.map} +1 -1
- package/dashboard/dist/assets/escalation-columns-DIigeTOK.js +2 -0
- package/dashboard/dist/assets/escalation-columns-DIigeTOK.js.map +1 -0
- package/dashboard/dist/assets/index-BMlQYOE1.js +67 -0
- package/dashboard/dist/assets/index-BMlQYOE1.js.map +1 -0
- package/dashboard/dist/assets/index-BNZknxFY.js +2 -0
- package/dashboard/dist/assets/{index-cvmt1plS.js.map → index-BNZknxFY.js.map} +1 -1
- package/dashboard/dist/assets/index-Bpvfr4OW.css +1 -0
- package/dashboard/dist/assets/{index-CldVY0UQ.js → index-C-Xr2V3F.js} +2 -2
- package/dashboard/dist/assets/{index-CldVY0UQ.js.map → index-C-Xr2V3F.js.map} +1 -1
- package/dashboard/dist/assets/index-CegPUKpc.js +3 -0
- package/dashboard/dist/assets/index-CegPUKpc.js.map +1 -0
- package/dashboard/dist/assets/{index-O9uuK2yO.js → index-CsKiRyhy.js} +2 -2
- package/dashboard/dist/assets/{index-O9uuK2yO.js.map → index-CsKiRyhy.js.map} +1 -1
- package/dashboard/dist/assets/index-D7ESqn22.js +2 -0
- package/dashboard/dist/assets/{index-BhzsR_gZ.js.map → index-D7ESqn22.js.map} +1 -1
- package/dashboard/dist/assets/{index-Hbbox1A4.js → index-DL83W7Gu.js} +2 -2
- package/dashboard/dist/assets/{index-Hbbox1A4.js.map → index-DL83W7Gu.js.map} +1 -1
- package/dashboard/dist/assets/index-DPLssnMW.js +6 -0
- package/dashboard/dist/assets/index-DPLssnMW.js.map +1 -0
- package/dashboard/dist/assets/{index-DsKqDMs4.js → index-DWse7ERF.js} +2 -2
- package/dashboard/dist/assets/{index-DsKqDMs4.js.map → index-DWse7ERF.js.map} +1 -1
- package/dashboard/dist/assets/index-DoETPlJP.js +11 -0
- package/dashboard/dist/assets/index-DoETPlJP.js.map +1 -0
- package/dashboard/dist/assets/{index-8Gmtvd8e.js → index-DvxxrFBo.js} +2 -2
- package/dashboard/dist/assets/{index-8Gmtvd8e.js.map → index-DvxxrFBo.js.map} +1 -1
- package/dashboard/dist/assets/{index-DDHoDZRg.js → index-PcyGjmBm.js} +2 -2
- package/dashboard/dist/assets/{index-DDHoDZRg.js.map → index-PcyGjmBm.js.map} +1 -1
- package/dashboard/dist/assets/{index-BvGIyZUt.js → index-e2X-s0EQ.js} +2 -2
- package/dashboard/dist/assets/{index-BvGIyZUt.js.map → index-e2X-s0EQ.js.map} +1 -1
- package/dashboard/dist/assets/{knowledge-DM0tNphj.js → knowledge-Coo6CKzo.js} +2 -2
- package/dashboard/dist/assets/{knowledge-DM0tNphj.js.map → knowledge-Coo6CKzo.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-CQ_TD2P9.js → mcp-Cz5eFnP_.js} +2 -2
- package/dashboard/dist/assets/{mcp-CQ_TD2P9.js.map → mcp-Cz5eFnP_.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-BP7KSGhc.js → mcp-query-BtnuO4LF.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-BP7KSGhc.js.map → mcp-query-BtnuO4LF.js.map} +1 -1
- package/dashboard/dist/assets/{personas-DclHdHKK.js → personas-C2-LgpHQ.js} +2 -2
- package/dashboard/dist/assets/{personas-DclHdHKK.js.map → personas-C2-LgpHQ.js.map} +1 -1
- package/dashboard/dist/assets/{pipelines-LwuKJfj-.js → pipelines-TuXQvUA-.js} +2 -2
- package/dashboard/dist/assets/{pipelines-LwuKJfj-.js.map → pipelines-TuXQvUA-.js.map} +1 -1
- package/dashboard/dist/assets/resolver-payload-C1dXB3n6.js +2 -0
- package/dashboard/dist/assets/resolver-payload-C1dXB3n6.js.map +1 -0
- package/dashboard/dist/assets/seed-form-json-DvPsISxD.js +2 -0
- package/dashboard/dist/assets/seed-form-json-DvPsISxD.js.map +1 -0
- package/dashboard/dist/assets/{tasks-CDs-Li2v.js → tasks-OUzpu__z.js} +2 -2
- package/dashboard/dist/assets/{tasks-CDs-Li2v.js.map → tasks-OUzpu__z.js.map} +1 -1
- package/dashboard/dist/assets/{topics-BeOSelBX.js → topics-B8bdrBaW.js} +2 -2
- package/dashboard/dist/assets/{topics-BeOSelBX.js.map → topics-B8bdrBaW.js.map} +1 -1
- package/dashboard/dist/assets/useDebouncedValue-Cp5ZOtVE.js +2 -0
- package/dashboard/dist/assets/{useDebouncedValue-DhhAKjDC.js.map → useDebouncedValue-Cp5ZOtVE.js.map} +1 -1
- package/dashboard/dist/assets/{useFilterParams-crmlBw_l.js → useFilterParams-DBRw1Hcv.js} +2 -2
- package/dashboard/dist/assets/{useFilterParams-crmlBw_l.js.map → useFilterParams-DBRw1Hcv.js.map} +1 -1
- package/dashboard/dist/assets/{useNamespace-C-E2gNEK.js → useNamespace-DtQe3wZ5.js} +2 -2
- package/dashboard/dist/assets/{useNamespace-C-E2gNEK.js.map → useNamespace-DtQe3wZ5.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-CmLzX3YU.js → useYamlActivityEvents-CS22c15X.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-CmLzX3YU.js.map → useYamlActivityEvents-CS22c15X.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-R9b9gQ04.js → vendor-icons-DeBdvyKJ.js} +368 -143
- package/dashboard/dist/assets/vendor-icons-DeBdvyKJ.js.map +1 -0
- package/dashboard/dist/assets/vendor-query-DvWWuNIB.js +18 -0
- package/dashboard/dist/assets/vendor-query-DvWWuNIB.js.map +1 -0
- package/dashboard/dist/assets/{vendor-react-CdqEC2zv.js → vendor-react-_9U4mKFr.js} +2 -2
- package/dashboard/dist/assets/{vendor-react-CdqEC2zv.js.map → vendor-react-_9U4mKFr.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-BgAsc6-I.js → yaml-workflows-HQIki3hI.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-BgAsc6-I.js.map → yaml-workflows-HQIki3hI.js.map} +1 -1
- package/dashboard/dist/index.html +5 -5
- package/docs/api/http/workflows.md +25 -1
- package/docs/code-owned-configuration.md +1 -1
- package/docs/dashboard.md +179 -80
- package/docs/events.md +3 -1
- package/docs/faceted-routing.md +5 -1
- package/docs/hitl/iframe.md +35 -6
- package/docs/hitl/invoke-form.md +98 -0
- package/docs/hitl/x-lt-list-schema.md +3 -0
- package/docs/hitl/x-lt-show-if.md +11 -0
- package/docs/hitl-guide.md +4 -2
- package/docs/iam.md +1 -1
- package/docs/operations.md +61 -60
- package/docs/scan-codes.md +30 -3
- package/docs/workflows.md +1 -1
- package/package.json +1 -1
- package/dashboard/dist/assets/AgentsPage-CLSjlyXy.js +0 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-D2ukvuQh.js +0 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-D2ukvuQh.js.map +0 -1
- package/dashboard/dist/assets/BulkAssignModal-CMSgvHIs.js +0 -2
- package/dashboard/dist/assets/BulkAssignModal-CMSgvHIs.js.map +0 -1
- package/dashboard/dist/assets/CountdownTimer-B5lM7PfE.js +0 -2
- package/dashboard/dist/assets/CountdownTimer-B5lM7PfE.js.map +0 -1
- package/dashboard/dist/assets/EntityTimelinePanel-B5NuHnPF.js +0 -2
- package/dashboard/dist/assets/EntityTimelinePanel-B5NuHnPF.js.map +0 -1
- package/dashboard/dist/assets/HomePage-8XsQFqKL.js +0 -2
- package/dashboard/dist/assets/HomePage-8XsQFqKL.js.map +0 -1
- package/dashboard/dist/assets/ListToolbar-DyHaJBTk.js +0 -2
- package/dashboard/dist/assets/McpQueryPage-BqqRF5cQ.js +0 -2
- package/dashboard/dist/assets/NamespacePill-CJikgGzE.js +0 -2
- package/dashboard/dist/assets/OperationsPage-Cj1mJLMC.js +0 -3
- package/dashboard/dist/assets/OperationsPage-Cj1mJLMC.js.map +0 -1
- package/dashboard/dist/assets/OperatorDashboard-C5rlijvh.js +0 -2
- package/dashboard/dist/assets/PersonasPage-Xp_Gt6El.js +0 -2
- package/dashboard/dist/assets/PersonasPage-Xp_Gt6El.js.map +0 -1
- package/dashboard/dist/assets/ProcessesListPage-DuXTS5-v.js +0 -2
- package/dashboard/dist/assets/RoleDetailPage-C9GGHNf4.js +0 -8
- package/dashboard/dist/assets/RoleDetailPage-C9GGHNf4.js.map +0 -1
- package/dashboard/dist/assets/RolesPage-h77-JOLd.js +0 -2
- package/dashboard/dist/assets/RunAsSelector-DoLFJ0mZ.js +0 -2
- package/dashboard/dist/assets/ScanCodesPage-b5NZM_-f.js +0 -2
- package/dashboard/dist/assets/ScanStationPage-r02hkTAG.js +0 -2
- package/dashboard/dist/assets/TasksListPage-Dor8LSc5.js +0 -2
- package/dashboard/dist/assets/TimeAgo-Dd8vmRnM.js +0 -2
- package/dashboard/dist/assets/ToolTestPanel-CEGY5jss.js +0 -2
- package/dashboard/dist/assets/UserName-Dmm456xT.js +0 -2
- package/dashboard/dist/assets/UserName-Dmm456xT.js.map +0 -1
- package/dashboard/dist/assets/WorkflowExecutionPage-e-Q57yiJ.js +0 -2
- package/dashboard/dist/assets/WorkflowPill-Dh3hIW1l.js.map +0 -1
- package/dashboard/dist/assets/WorkflowsDashboard-DLKzN80h.js +0 -2
- package/dashboard/dist/assets/WorkflowsOverview-J-ITQiO5.js +0 -2
- package/dashboard/dist/assets/YamlWorkflowsPage-DQNeERXU.js +0 -2
- package/dashboard/dist/assets/capabilities-BvjPXUcJ.js +0 -2
- package/dashboard/dist/assets/escalation-columns-Bo3PfIZj.js +0 -2
- package/dashboard/dist/assets/escalation-columns-Bo3PfIZj.js.map +0 -1
- package/dashboard/dist/assets/index-B8JfGtQB.js +0 -3
- package/dashboard/dist/assets/index-B8JfGtQB.js.map +0 -1
- package/dashboard/dist/assets/index-Bb9ZZUyB.js +0 -5
- package/dashboard/dist/assets/index-Bb9ZZUyB.js.map +0 -1
- package/dashboard/dist/assets/index-BhzsR_gZ.js +0 -2
- package/dashboard/dist/assets/index-D88VWEVp.js +0 -67
- package/dashboard/dist/assets/index-D88VWEVp.js.map +0 -1
- package/dashboard/dist/assets/index-DBvkaa-B.js +0 -6
- package/dashboard/dist/assets/index-DBvkaa-B.js.map +0 -1
- package/dashboard/dist/assets/index-cvmt1plS.js +0 -2
- package/dashboard/dist/assets/index-qU_dXqP4.css +0 -1
- package/dashboard/dist/assets/useDebouncedValue-DhhAKjDC.js +0 -2
- package/dashboard/dist/assets/vendor-icons-R9b9gQ04.js.map +0 -1
- package/dashboard/dist/assets/vendor-query-RUZdMvN6.js +0 -18
- package/dashboard/dist/assets/vendor-query-RUZdMvN6.js.map +0 -1
- package/dashboard/dist/assets/workflows-CYv1CTU0.js +0 -2
- package/dashboard/dist/assets/workflows-CYv1CTU0.js.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { createEscalation } from './create';
|
|
2
|
-
export { listEscalations, listAvailableEscalations, listDistinctTypes, listFacetKeys, getEscalationStats, getStationMetrics } from './list';
|
|
2
|
+
export { listEscalations, listAvailableEscalations, listDistinctTypes, listFacetKeys, listFacetValues, getEscalationStats, getStationMetrics } from './list';
|
|
3
3
|
export { getEscalation, getEscalationsByWorkflowId, escalateToRole } from './single';
|
|
4
4
|
export { getEscalationLookups } from './lookups';
|
|
5
5
|
export { claimEscalation, releaseEscalation } from './claim';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.timelineByFacet = exports.aggregateByFacets = exports.claimByFacets = exports.claimGroups = exports.searchByFacets = exports.bulkCancel = exports.cancelSingleEscalation = exports.resolveByMetadata = exports.claimByMetadata = exports.findByMetadata = exports.resolveBatchItemByMetadata = exports.resolveBatchItemBySignalKey = exports.resolveBatchItem = exports.resolveAllOrNone = exports.resolveByIds = exports.resolveBySignalKey = exports.resolveEscalation = exports.bulkTriage = exports.bulkEscalate = exports.bulkUnassign = exports.bulkAssign = exports.bulkClaim = exports.updatePriority = exports.releaseExpiredClaims = exports.releaseEscalation = exports.claimEscalation = exports.getEscalationLookups = exports.escalateToRole = exports.getEscalationsByWorkflowId = exports.getEscalation = exports.getStationMetrics = exports.getEscalationStats = exports.listFacetKeys = exports.listDistinctTypes = exports.listAvailableEscalations = exports.listEscalations = exports.createEscalation = void 0;
|
|
3
|
+
exports.timelineByFacet = exports.aggregateByFacets = exports.claimByFacets = exports.claimGroups = exports.searchByFacets = exports.bulkCancel = exports.cancelSingleEscalation = exports.resolveByMetadata = exports.claimByMetadata = exports.findByMetadata = exports.resolveBatchItemByMetadata = exports.resolveBatchItemBySignalKey = exports.resolveBatchItem = exports.resolveAllOrNone = exports.resolveByIds = exports.resolveBySignalKey = exports.resolveEscalation = exports.bulkTriage = exports.bulkEscalate = exports.bulkUnassign = exports.bulkAssign = exports.bulkClaim = exports.updatePriority = exports.releaseExpiredClaims = exports.releaseEscalation = exports.claimEscalation = exports.getEscalationLookups = exports.escalateToRole = exports.getEscalationsByWorkflowId = exports.getEscalation = exports.getStationMetrics = exports.getEscalationStats = exports.listFacetValues = exports.listFacetKeys = exports.listDistinctTypes = exports.listAvailableEscalations = exports.listEscalations = exports.createEscalation = void 0;
|
|
4
4
|
var create_1 = require("./create");
|
|
5
5
|
Object.defineProperty(exports, "createEscalation", { enumerable: true, get: function () { return create_1.createEscalation; } });
|
|
6
6
|
var list_1 = require("./list");
|
|
@@ -8,6 +8,7 @@ Object.defineProperty(exports, "listEscalations", { enumerable: true, get: funct
|
|
|
8
8
|
Object.defineProperty(exports, "listAvailableEscalations", { enumerable: true, get: function () { return list_1.listAvailableEscalations; } });
|
|
9
9
|
Object.defineProperty(exports, "listDistinctTypes", { enumerable: true, get: function () { return list_1.listDistinctTypes; } });
|
|
10
10
|
Object.defineProperty(exports, "listFacetKeys", { enumerable: true, get: function () { return list_1.listFacetKeys; } });
|
|
11
|
+
Object.defineProperty(exports, "listFacetValues", { enumerable: true, get: function () { return list_1.listFacetValues; } });
|
|
11
12
|
Object.defineProperty(exports, "getEscalationStats", { enumerable: true, get: function () { return list_1.getEscalationStats; } });
|
|
12
13
|
Object.defineProperty(exports, "getStationMetrics", { enumerable: true, get: function () { return list_1.getStationMetrics; } });
|
|
13
14
|
var single_1 = require("./single");
|
|
@@ -90,6 +90,16 @@ export declare function listAvailableEscalations(input: {
|
|
|
90
90
|
* @returns `{ status: 200, data: { keys: string[] } }`
|
|
91
91
|
*/
|
|
92
92
|
export declare function listFacetKeys(_input: unknown, auth: LTApiAuth): Promise<LTApiResult>;
|
|
93
|
+
/**
|
|
94
|
+
* Distinct VALUES for one metadata facet key, role-scoped — powers the facet
|
|
95
|
+
* value picker (e.g. facility → north|south). A missing/malformed key returns
|
|
96
|
+
* an empty list, never an error.
|
|
97
|
+
*
|
|
98
|
+
* @returns `{ status: 200, data: { values: string[] } }`
|
|
99
|
+
*/
|
|
100
|
+
export declare function listFacetValues(input: {
|
|
101
|
+
key?: string;
|
|
102
|
+
}, auth: LTApiAuth): Promise<LTApiResult>;
|
|
93
103
|
/**
|
|
94
104
|
* List all distinct escalation type values.
|
|
95
105
|
*
|
|
@@ -108,4 +118,5 @@ export declare function getEscalationStats(input: {
|
|
|
108
118
|
}, auth: LTApiAuth): Promise<LTApiResult>;
|
|
109
119
|
export declare function getStationMetrics(input: {
|
|
110
120
|
period?: string;
|
|
121
|
+
facets?: Record<string, unknown>;
|
|
111
122
|
}, auth: LTApiAuth): Promise<LTApiResult>;
|
|
@@ -36,6 +36,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
36
36
|
exports.listEscalations = listEscalations;
|
|
37
37
|
exports.listAvailableEscalations = listAvailableEscalations;
|
|
38
38
|
exports.listFacetKeys = listFacetKeys;
|
|
39
|
+
exports.listFacetValues = listFacetValues;
|
|
39
40
|
exports.listDistinctTypes = listDistinctTypes;
|
|
40
41
|
exports.getEscalationStats = getEscalationStats;
|
|
41
42
|
exports.getStationMetrics = getStationMetrics;
|
|
@@ -239,6 +240,34 @@ async function listFacetKeys(_input, auth) {
|
|
|
239
240
|
return { status: 500, error: err.message };
|
|
240
241
|
}
|
|
241
242
|
}
|
|
243
|
+
/**
|
|
244
|
+
* Distinct VALUES for one metadata facet key, role-scoped — powers the facet
|
|
245
|
+
* value picker (e.g. facility → north|south). A missing/malformed key returns
|
|
246
|
+
* an empty list, never an error.
|
|
247
|
+
*
|
|
248
|
+
* @returns `{ status: 200, data: { values: string[] } }`
|
|
249
|
+
*/
|
|
250
|
+
async function listFacetValues(input, auth) {
|
|
251
|
+
try {
|
|
252
|
+
const key = input?.key;
|
|
253
|
+
if (!key)
|
|
254
|
+
return { status: 200, data: { values: [] } };
|
|
255
|
+
const scope = await (0, helpers_1.getEscalationReadScope)(auth.userId);
|
|
256
|
+
if (!scope.global && scope.allRoles.length === 0 && scope.selfRoles.length === 0) {
|
|
257
|
+
return { status: 200, data: { values: [] } };
|
|
258
|
+
}
|
|
259
|
+
const values = await escalationService.listFacetValues(key, {
|
|
260
|
+
global: scope.global,
|
|
261
|
+
visibleRoles: scope.global ? undefined : scope.allRoles,
|
|
262
|
+
selfRoles: scope.global ? undefined : scope.selfRoles,
|
|
263
|
+
meUserId: auth.userId,
|
|
264
|
+
});
|
|
265
|
+
return { status: 200, data: { values } };
|
|
266
|
+
}
|
|
267
|
+
catch (err) {
|
|
268
|
+
return { status: 500, error: err.message };
|
|
269
|
+
}
|
|
270
|
+
}
|
|
242
271
|
/**
|
|
243
272
|
* List all distinct escalation type values.
|
|
244
273
|
*
|
|
@@ -297,7 +326,7 @@ async function getStationMetrics(input, auth) {
|
|
|
297
326
|
// elsewhere) — without the selfRoles union, a self-scoped operator would
|
|
298
327
|
// see an empty board on their own lanes.
|
|
299
328
|
if ((0, features_1.getFeatureFlags)().publicPaceBoard) {
|
|
300
|
-
const stations = await escalationService.getStationMetrics(undefined, input.period);
|
|
329
|
+
const stations = await escalationService.getStationMetrics(undefined, input.period, input.facets);
|
|
301
330
|
return { status: 200, data: { stations } };
|
|
302
331
|
}
|
|
303
332
|
const scope = await (0, helpers_1.getEscalationReadScope)(auth.userId);
|
|
@@ -305,7 +334,7 @@ async function getStationMetrics(input, auth) {
|
|
|
305
334
|
if (!scope.global && memberRoles.length === 0) {
|
|
306
335
|
return { status: 200, data: { stations: [] } };
|
|
307
336
|
}
|
|
308
|
-
const stations = await escalationService.getStationMetrics(scope.global ? undefined : memberRoles, input.period);
|
|
337
|
+
const stations = await escalationService.getStationMetrics(scope.global ? undefined : memberRoles, input.period, input.facets);
|
|
309
338
|
return { status: 200, data: { stations } };
|
|
310
339
|
}
|
|
311
340
|
catch (err) {
|
package/build/api/users.d.ts
CHANGED
|
@@ -19,6 +19,17 @@ export declare function listUsers(input: {
|
|
|
19
19
|
limit?: number;
|
|
20
20
|
offset?: number;
|
|
21
21
|
}): Promise<LTApiResult>;
|
|
22
|
+
/**
|
|
23
|
+
* Resolve many user ids to display fields (id, display_name, external_id, email)
|
|
24
|
+
* in one call. Thin projection only — no secrets, scopes, or metadata. Non-UUID
|
|
25
|
+
* ids are dropped, ids deduped, and the batch capped by the service.
|
|
26
|
+
*
|
|
27
|
+
* @param input.ids — the user ids to resolve
|
|
28
|
+
* @returns `{ status: 200, data: { users: [{ id, display_name, external_id, email }] } }`
|
|
29
|
+
*/
|
|
30
|
+
export declare function getUserNames(input: {
|
|
31
|
+
ids?: string[];
|
|
32
|
+
}): Promise<LTApiResult>;
|
|
22
33
|
/**
|
|
23
34
|
* Retrieve a single user by ID.
|
|
24
35
|
*
|
package/build/api/users.js
CHANGED
|
@@ -34,6 +34,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.listUsers = listUsers;
|
|
37
|
+
exports.getUserNames = getUserNames;
|
|
37
38
|
exports.getUser = getUser;
|
|
38
39
|
exports.createUser = createUser;
|
|
39
40
|
exports.updateUser = updateUser;
|
|
@@ -64,6 +65,24 @@ async function listUsers(input) {
|
|
|
64
65
|
return { status: 500, error: err.message };
|
|
65
66
|
}
|
|
66
67
|
}
|
|
68
|
+
/**
|
|
69
|
+
* Resolve many user ids to display fields (id, display_name, external_id, email)
|
|
70
|
+
* in one call. Thin projection only — no secrets, scopes, or metadata. Non-UUID
|
|
71
|
+
* ids are dropped, ids deduped, and the batch capped by the service.
|
|
72
|
+
*
|
|
73
|
+
* @param input.ids — the user ids to resolve
|
|
74
|
+
* @returns `{ status: 200, data: { users: [{ id, display_name, external_id, email }] } }`
|
|
75
|
+
*/
|
|
76
|
+
async function getUserNames(input) {
|
|
77
|
+
try {
|
|
78
|
+
const ids = Array.isArray(input.ids) ? input.ids : [];
|
|
79
|
+
const users = await userService.getUserNames(ids);
|
|
80
|
+
return { status: 200, data: { users } };
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
return { status: 500, error: err.message };
|
|
84
|
+
}
|
|
85
|
+
}
|
|
67
86
|
/**
|
|
68
87
|
* Retrieve a single user by ID.
|
|
69
88
|
*
|
|
@@ -35,7 +35,9 @@ export declare function getWorkflowConfig(input: {
|
|
|
35
35
|
* @param input.invocation_roles — roles that can invoke this workflow
|
|
36
36
|
* @param input.consumes — workflow types whose data this workflow consumes
|
|
37
37
|
* @param input.tool_tags — MCP tool tags for discovery
|
|
38
|
-
* @param input.envelope_schema — JSON
|
|
38
|
+
* @param input.envelope_schema — JSON template that pre-fills the invoke form
|
|
39
|
+
* @param input.input_schema — x-lt-* JSON Schema for the rich invoke form; invoke validates data against it
|
|
40
|
+
* @param input.icon — curated icon name (WORKFLOW_ICONS); anything else is refused
|
|
39
41
|
* @param input.resolver_schema — JSON Schema for resolver payload validation
|
|
40
42
|
* @param input.cron_schedule — cron expression for scheduled execution
|
|
41
43
|
* @returns `{ status: 200, data: <saved config> }`
|
|
@@ -53,6 +55,8 @@ export declare function upsertWorkflowConfig(input: {
|
|
|
53
55
|
consumes?: string[];
|
|
54
56
|
tool_tags?: string[];
|
|
55
57
|
envelope_schema?: any;
|
|
58
|
+
input_schema?: any;
|
|
59
|
+
icon?: string | null;
|
|
56
60
|
resolver_schema?: any;
|
|
57
61
|
cron_schedule?: string | null;
|
|
58
62
|
read_safe?: boolean;
|
|
@@ -38,6 +38,7 @@ exports.getWorkflowConfig = getWorkflowConfig;
|
|
|
38
38
|
exports.upsertWorkflowConfig = upsertWorkflowConfig;
|
|
39
39
|
exports.deleteWorkflowConfig = deleteWorkflowConfig;
|
|
40
40
|
const configService = __importStar(require("../../services/config"));
|
|
41
|
+
const workflow_icons_1 = require("../../types/workflow-icons");
|
|
41
42
|
const cron_1 = require("../../services/cron");
|
|
42
43
|
const ltconfig_1 = require("../../modules/ltconfig");
|
|
43
44
|
/**
|
|
@@ -93,13 +94,18 @@ async function getWorkflowConfig(input) {
|
|
|
93
94
|
* @param input.invocation_roles — roles that can invoke this workflow
|
|
94
95
|
* @param input.consumes — workflow types whose data this workflow consumes
|
|
95
96
|
* @param input.tool_tags — MCP tool tags for discovery
|
|
96
|
-
* @param input.envelope_schema — JSON
|
|
97
|
+
* @param input.envelope_schema — JSON template that pre-fills the invoke form
|
|
98
|
+
* @param input.input_schema — x-lt-* JSON Schema for the rich invoke form; invoke validates data against it
|
|
99
|
+
* @param input.icon — curated icon name (WORKFLOW_ICONS); anything else is refused
|
|
97
100
|
* @param input.resolver_schema — JSON Schema for resolver payload validation
|
|
98
101
|
* @param input.cron_schedule — cron expression for scheduled execution
|
|
99
102
|
* @returns `{ status: 200, data: <saved config> }`
|
|
100
103
|
*/
|
|
101
104
|
async function upsertWorkflowConfig(input) {
|
|
102
105
|
try {
|
|
106
|
+
if (input.icon && !(0, workflow_icons_1.isWorkflowIcon)(input.icon)) {
|
|
107
|
+
return { status: 400, error: `Unknown workflow icon "${input.icon}"; choose one of WORKFLOW_ICONS` };
|
|
108
|
+
}
|
|
103
109
|
// Validate cron expression before persisting
|
|
104
110
|
if (input.cron_schedule) {
|
|
105
111
|
const { validateCronSchedule } = await Promise.resolve().then(() => __importStar(require('../../services/cron')));
|
|
@@ -118,6 +124,8 @@ async function upsertWorkflowConfig(input) {
|
|
|
118
124
|
consumes: input.consumes ?? [],
|
|
119
125
|
tool_tags: input.tool_tags ?? [],
|
|
120
126
|
envelope_schema: input.envelope_schema ?? null,
|
|
127
|
+
input_schema: input.input_schema ?? null,
|
|
128
|
+
icon: input.icon ?? null,
|
|
121
129
|
resolver_schema: input.resolver_schema ?? null,
|
|
122
130
|
cron_schedule: input.cron_schedule ?? null,
|
|
123
131
|
read_safe: input.read_safe ?? false,
|
|
@@ -1,3 +1,6 @@
|
|
|
1
1
|
export { invokeWorkflow, getWorkflowStatus, getWorkflowResult, terminateWorkflow, exportWorkflow, } from './invocation';
|
|
2
2
|
export { listWorkers, listDiscoveredWorkflows, getCronStatus, } from './discovery';
|
|
3
|
+
export { listInvocableWorkflows, WORKFLOW_TIERS } from './invocable';
|
|
4
|
+
export type { InvocableWorkflowEntry, WorkflowTier } from './invocable';
|
|
5
|
+
export { checkInvokeInput, inputValidationFailure } from './input-validation';
|
|
3
6
|
export { listWorkflowConfigs, getWorkflowConfig, upsertWorkflowConfig, deleteWorkflowConfig, } from './config';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.deleteWorkflowConfig = exports.upsertWorkflowConfig = exports.getWorkflowConfig = exports.listWorkflowConfigs = exports.getCronStatus = exports.listDiscoveredWorkflows = exports.listWorkers = exports.exportWorkflow = exports.terminateWorkflow = exports.getWorkflowResult = exports.getWorkflowStatus = exports.invokeWorkflow = void 0;
|
|
3
|
+
exports.deleteWorkflowConfig = exports.upsertWorkflowConfig = exports.getWorkflowConfig = exports.listWorkflowConfigs = exports.inputValidationFailure = exports.checkInvokeInput = exports.WORKFLOW_TIERS = exports.listInvocableWorkflows = exports.getCronStatus = exports.listDiscoveredWorkflows = exports.listWorkers = exports.exportWorkflow = exports.terminateWorkflow = exports.getWorkflowResult = exports.getWorkflowStatus = exports.invokeWorkflow = void 0;
|
|
4
4
|
var invocation_1 = require("./invocation");
|
|
5
5
|
Object.defineProperty(exports, "invokeWorkflow", { enumerable: true, get: function () { return invocation_1.invokeWorkflow; } });
|
|
6
6
|
Object.defineProperty(exports, "getWorkflowStatus", { enumerable: true, get: function () { return invocation_1.getWorkflowStatus; } });
|
|
@@ -11,6 +11,12 @@ var discovery_1 = require("./discovery");
|
|
|
11
11
|
Object.defineProperty(exports, "listWorkers", { enumerable: true, get: function () { return discovery_1.listWorkers; } });
|
|
12
12
|
Object.defineProperty(exports, "listDiscoveredWorkflows", { enumerable: true, get: function () { return discovery_1.listDiscoveredWorkflows; } });
|
|
13
13
|
Object.defineProperty(exports, "getCronStatus", { enumerable: true, get: function () { return discovery_1.getCronStatus; } });
|
|
14
|
+
var invocable_1 = require("./invocable");
|
|
15
|
+
Object.defineProperty(exports, "listInvocableWorkflows", { enumerable: true, get: function () { return invocable_1.listInvocableWorkflows; } });
|
|
16
|
+
Object.defineProperty(exports, "WORKFLOW_TIERS", { enumerable: true, get: function () { return invocable_1.WORKFLOW_TIERS; } });
|
|
17
|
+
var input_validation_1 = require("./input-validation");
|
|
18
|
+
Object.defineProperty(exports, "checkInvokeInput", { enumerable: true, get: function () { return input_validation_1.checkInvokeInput; } });
|
|
19
|
+
Object.defineProperty(exports, "inputValidationFailure", { enumerable: true, get: function () { return input_validation_1.inputValidationFailure; } });
|
|
14
20
|
var config_1 = require("./config");
|
|
15
21
|
Object.defineProperty(exports, "listWorkflowConfigs", { enumerable: true, get: function () { return config_1.listWorkflowConfigs; } });
|
|
16
22
|
Object.defineProperty(exports, "getWorkflowConfig", { enumerable: true, get: function () { return config_1.getWorkflowConfig; } });
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type LTValidationErrorBody } from '../../types/validation';
|
|
2
|
+
import type { LTWorkflowConfig } from '../../types/config';
|
|
3
|
+
import type { LTApiResult } from '../../types/sdk';
|
|
4
|
+
/**
|
|
5
|
+
* The invoke input gate. A workflow that declares input_schema has its
|
|
6
|
+
* submitted data validated by the same shared pass the dashboard form runs,
|
|
7
|
+
* so a payload the form accepts is accepted here and a rejection lists the
|
|
8
|
+
* exact violations the form would show. No schema, no gate; a data value
|
|
9
|
+
* that is not an object is left to the service's own 400.
|
|
10
|
+
*/
|
|
11
|
+
export declare function checkInvokeInput(config: Pick<LTWorkflowConfig, 'workflow_type' | 'input_schema'> | null | undefined, data: unknown, metadata: Record<string, unknown> | null | undefined): LTValidationErrorBody | null;
|
|
12
|
+
/** The canonical 422 result; the route serializes `data` as the body. */
|
|
13
|
+
export declare function inputValidationFailure(body: LTValidationErrorBody): LTApiResult;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.checkInvokeInput = checkInvokeInput;
|
|
4
|
+
exports.inputValidationFailure = inputValidationFailure;
|
|
5
|
+
const validate_resolver_payload_1 = require("../../shared/form-validation/validate-resolver-payload");
|
|
6
|
+
const invoke_context_1 = require("../../shared/form-validation/invoke-context");
|
|
7
|
+
const validation_1 = require("../../types/validation");
|
|
8
|
+
function isPlainObject(value) {
|
|
9
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* The invoke input gate. A workflow that declares input_schema has its
|
|
13
|
+
* submitted data validated by the same shared pass the dashboard form runs,
|
|
14
|
+
* so a payload the form accepts is accepted here and a rejection lists the
|
|
15
|
+
* exact violations the form would show. No schema, no gate; a data value
|
|
16
|
+
* that is not an object is left to the service's own 400.
|
|
17
|
+
*/
|
|
18
|
+
function checkInvokeInput(config, data, metadata) {
|
|
19
|
+
const schema = config?.input_schema;
|
|
20
|
+
if (!schema || !isPlainObject(data))
|
|
21
|
+
return null;
|
|
22
|
+
const violations = (0, validate_resolver_payload_1.validateResolverPayload)(schema, data, (0, invoke_context_1.buildInvokeFormContext)(metadata));
|
|
23
|
+
if (violations.length === 0)
|
|
24
|
+
return null;
|
|
25
|
+
const n = violations.length;
|
|
26
|
+
return {
|
|
27
|
+
error: `data failed input schema validation (${n} violation${n === 1 ? '' : 's'})`,
|
|
28
|
+
code: validation_1.LT_ERROR_CODES.SCHEMA_VALIDATION,
|
|
29
|
+
violations,
|
|
30
|
+
role: null,
|
|
31
|
+
schemaVersion: null,
|
|
32
|
+
workflowType: config.workflow_type,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/** The canonical 422 result; the route serializes `data` as the body. */
|
|
36
|
+
function inputValidationFailure(body) {
|
|
37
|
+
return { status: 422, error: body.error, code: body.code, data: body };
|
|
38
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { LTWorkflowConfig } from '../../types/config';
|
|
2
|
+
import type { LTApiResult, LTApiAuth } from '../../types/sdk';
|
|
3
|
+
export declare const WORKFLOW_TIERS: {
|
|
4
|
+
readonly DURABLE: "durable";
|
|
5
|
+
readonly REGISTERED: "registered";
|
|
6
|
+
readonly CERTIFIED: "certified";
|
|
7
|
+
};
|
|
8
|
+
export type WorkflowTier = (typeof WORKFLOW_TIERS)[keyof typeof WORKFLOW_TIERS];
|
|
9
|
+
export type InvocableWorkflowEntry = LTWorkflowConfig & {
|
|
10
|
+
tier: WorkflowTier;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* The workflows the caller may invoke, decided by the same predicate the
|
|
14
|
+
* invoke gate runs. Callers with global access also see active durable
|
|
15
|
+
* workers that carry no registration row, as the invoke gate admits them.
|
|
16
|
+
*
|
|
17
|
+
* @returns `{ status: 200, data: { workflows: InvocableWorkflowEntry[] } }`
|
|
18
|
+
*/
|
|
19
|
+
export declare function listInvocableWorkflows(auth: LTApiAuth): Promise<LTApiResult>;
|
|
@@ -0,0 +1,106 @@
|
|
|
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.WORKFLOW_TIERS = void 0;
|
|
37
|
+
exports.listInvocableWorkflows = listInvocableWorkflows;
|
|
38
|
+
const configService = __importStar(require("../../services/config"));
|
|
39
|
+
const userService = __importStar(require("../../services/user"));
|
|
40
|
+
const invocation_access_1 = require("../../services/invocation-access");
|
|
41
|
+
const registry_1 = require("../../services/workers/registry");
|
|
42
|
+
exports.WORKFLOW_TIERS = {
|
|
43
|
+
DURABLE: 'durable',
|
|
44
|
+
REGISTERED: 'registered',
|
|
45
|
+
CERTIFIED: 'certified',
|
|
46
|
+
};
|
|
47
|
+
function tierOf(config) {
|
|
48
|
+
if (!config)
|
|
49
|
+
return exports.WORKFLOW_TIERS.DURABLE;
|
|
50
|
+
return config.certified ? exports.WORKFLOW_TIERS.CERTIFIED : exports.WORKFLOW_TIERS.REGISTERED;
|
|
51
|
+
}
|
|
52
|
+
/** An active worker with no registration row, shaped like a config so one list type serves the page. */
|
|
53
|
+
function durableEntry(workflowType, taskQueue) {
|
|
54
|
+
return {
|
|
55
|
+
workflow_type: workflowType,
|
|
56
|
+
invocable: true,
|
|
57
|
+
certified: false,
|
|
58
|
+
task_queue: taskQueue,
|
|
59
|
+
default_role: 'reviewer',
|
|
60
|
+
description: null,
|
|
61
|
+
roles: [],
|
|
62
|
+
invocation_roles: [],
|
|
63
|
+
consumes: [],
|
|
64
|
+
tool_tags: [],
|
|
65
|
+
envelope_schema: null,
|
|
66
|
+
input_schema: null,
|
|
67
|
+
icon: null,
|
|
68
|
+
resolver_schema: null,
|
|
69
|
+
cron_schedule: null,
|
|
70
|
+
execute_as: null,
|
|
71
|
+
read_safe: false,
|
|
72
|
+
tier: exports.WORKFLOW_TIERS.DURABLE,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* The workflows the caller may invoke, decided by the same predicate the
|
|
77
|
+
* invoke gate runs. Callers with global access also see active durable
|
|
78
|
+
* workers that carry no registration row, as the invoke gate admits them.
|
|
79
|
+
*
|
|
80
|
+
* @returns `{ status: 200, data: { workflows: InvocableWorkflowEntry[] } }`
|
|
81
|
+
*/
|
|
82
|
+
async function listInvocableWorkflows(auth) {
|
|
83
|
+
try {
|
|
84
|
+
const [configs, user] = await Promise.all([
|
|
85
|
+
configService.listWorkflowConfigs(),
|
|
86
|
+
auth.userId ? userService.getUser(auth.userId) : Promise.resolve(null),
|
|
87
|
+
]);
|
|
88
|
+
const roles = user?.roles ?? [];
|
|
89
|
+
const workflows = configs
|
|
90
|
+
.filter((c) => (0, invocation_access_1.canInvokeWorkflow)(c, roles, auth.role))
|
|
91
|
+
.map((c) => ({ ...c, tier: tierOf(c) }));
|
|
92
|
+
if ((0, invocation_access_1.hasGlobalInvocationAccess)(roles, auth.role)) {
|
|
93
|
+
const registered = new Set(configs.map((c) => c.workflow_type));
|
|
94
|
+
for (const [name, { taskQueue }] of (0, registry_1.getRegisteredWorkers)()) {
|
|
95
|
+
if (registered.has(name) || registry_1.SYSTEM_WORKFLOWS.has(name))
|
|
96
|
+
continue;
|
|
97
|
+
workflows.push(durableEntry(name, taskQueue));
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
workflows.sort((a, b) => a.workflow_type.localeCompare(b.workflow_type));
|
|
101
|
+
return { status: 200, data: { workflows } };
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
return { status: 500, error: err.message };
|
|
105
|
+
}
|
|
106
|
+
}
|
|
@@ -43,6 +43,8 @@ const exportService = __importStar(require("../../services/export"));
|
|
|
43
43
|
const task_1 = require("../../services/task");
|
|
44
44
|
const workflow_invocation_1 = require("../../services/workflow-invocation");
|
|
45
45
|
const crud_1 = require("../../services/escalation/crud");
|
|
46
|
+
const configService = __importStar(require("../../services/config"));
|
|
47
|
+
const input_validation_1 = require("./input-validation");
|
|
46
48
|
function isResolveError(err) {
|
|
47
49
|
return err?.message?.includes('Cannot resolve workflow');
|
|
48
50
|
}
|
|
@@ -60,6 +62,10 @@ function isResolveError(err) {
|
|
|
60
62
|
async function invokeWorkflow(input, auth) {
|
|
61
63
|
try {
|
|
62
64
|
await (0, workflow_invocation_1.checkInvocationRoles)(input.type, auth.userId, auth.role);
|
|
65
|
+
const config = await configService.getWorkflowConfig(input.type);
|
|
66
|
+
const violation = (0, input_validation_1.checkInvokeInput)(config, input.data, input.metadata);
|
|
67
|
+
if (violation)
|
|
68
|
+
return (0, input_validation_1.inputValidationFailure)(violation);
|
|
63
69
|
const result = await (0, workflow_invocation_1.invokeWorkflow)({
|
|
64
70
|
workflowType: input.type,
|
|
65
71
|
data: input.data || {},
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
-- Migration 034: workflow input form and icon
|
|
2
|
+
--
|
|
3
|
+
-- Two opt-in columns on the workflow registration:
|
|
4
|
+
-- input_schema — an x-lt-* JSON Schema the dashboard renders as the invoke
|
|
5
|
+
-- form and the invoke API validates submitted data against.
|
|
6
|
+
-- NULL keeps the legacy envelope_schema template form.
|
|
7
|
+
-- icon — a curated icon name (WORKFLOW_ICONS) shown in place of the
|
|
8
|
+
-- tier glyph on the Invoke page and registry. NULL keeps the
|
|
9
|
+
-- tier glyph.
|
|
10
|
+
|
|
11
|
+
ALTER TABLE lt_config_workflows
|
|
12
|
+
ADD COLUMN IF NOT EXISTS input_schema JSONB,
|
|
13
|
+
ADD COLUMN IF NOT EXISTS icon TEXT;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UUID shape guard for open input reaching uuid-typed columns. Postgres
|
|
3
|
+
* throws `invalid input syntax for type uuid` on a bad cast, so every
|
|
4
|
+
* caller-supplied id must pass this gate BEFORE it reaches SQL — a
|
|
5
|
+
* non-UUID string is definitionally not-found, never a 500.
|
|
6
|
+
*/
|
|
7
|
+
export declare const UUID_RE: RegExp;
|
|
8
|
+
export declare function isUuid(value: unknown): value is string;
|
|
9
|
+
/** The UUID members of a caller-supplied id list; non-UUIDs are dropped —
|
|
10
|
+
* they can match nothing, exactly like a well-formed id that does not exist. */
|
|
11
|
+
export declare function onlyUuids(ids: string[]): string[];
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* UUID shape guard for open input reaching uuid-typed columns. Postgres
|
|
4
|
+
* throws `invalid input syntax for type uuid` on a bad cast, so every
|
|
5
|
+
* caller-supplied id must pass this gate BEFORE it reaches SQL — a
|
|
6
|
+
* non-UUID string is definitionally not-found, never a 500.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.UUID_RE = void 0;
|
|
10
|
+
exports.isUuid = isUuid;
|
|
11
|
+
exports.onlyUuids = onlyUuids;
|
|
12
|
+
exports.UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
13
|
+
function isUuid(value) {
|
|
14
|
+
return typeof value === 'string' && exports.UUID_RE.test(value);
|
|
15
|
+
}
|
|
16
|
+
/** The UUID members of a caller-supplied id list; non-UUIDs are dropped —
|
|
17
|
+
* they can match nothing, exactly like a well-formed id that does not exist. */
|
|
18
|
+
function onlyUuids(ids) {
|
|
19
|
+
return ids.filter((id) => isUuid(id));
|
|
20
|
+
}
|
|
@@ -158,6 +158,15 @@ function registerListRoutes(router) {
|
|
|
158
158
|
const result = await api.listFacetKeys(undefined, req.auth);
|
|
159
159
|
res.status(result.status).json(result.data ?? { error: result.error });
|
|
160
160
|
});
|
|
161
|
+
/**
|
|
162
|
+
* GET /api/escalations/facet-values?key=<facet>
|
|
163
|
+
* Distinct VALUES for one metadata facet key, visible to the caller
|
|
164
|
+
* (role-scoped). Powers the facet value picker (e.g. facility → north|south).
|
|
165
|
+
*/
|
|
166
|
+
router.get('/facet-values', async (req, res) => {
|
|
167
|
+
const result = await api.listFacetValues({ key: req.query.key }, req.auth);
|
|
168
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
169
|
+
});
|
|
161
170
|
/**
|
|
162
171
|
* GET /api/escalations/station-metrics
|
|
163
172
|
* Per-role P99/P50/avg/max wait + work times, resolved count, and in-arrears
|
|
@@ -165,7 +174,7 @@ function registerListRoutes(router) {
|
|
|
165
174
|
* RBAC: superadmin sees all; others scoped to their roles.
|
|
166
175
|
*/
|
|
167
176
|
router.get('/station-metrics', async (req, res) => {
|
|
168
|
-
const result = await api.getStationMetrics({ period: req.query.period || undefined }, req.auth);
|
|
177
|
+
const result = await api.getStationMetrics({ period: req.query.period || undefined, facets: jsonParam(req.query.facets) }, req.auth);
|
|
169
178
|
res.status(result.status).json(result.data ?? { error: result.error });
|
|
170
179
|
});
|
|
171
180
|
/**
|
package/build/routes/users.js
CHANGED
|
@@ -55,6 +55,15 @@ router.get('/', async (req, res) => {
|
|
|
55
55
|
});
|
|
56
56
|
res.status(result.status).json(result.data ?? { error: result.error });
|
|
57
57
|
});
|
|
58
|
+
/**
|
|
59
|
+
* POST /api/users/names
|
|
60
|
+
* Batch-resolve user ids to display fields. Body: { ids: string[] }.
|
|
61
|
+
* Any authenticated user — display names carry no secrets.
|
|
62
|
+
*/
|
|
63
|
+
router.post('/names', async (req, res) => {
|
|
64
|
+
const result = await api.getUserNames({ ids: req.body?.ids });
|
|
65
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
66
|
+
});
|
|
58
67
|
/**
|
|
59
68
|
* GET /api/users/system-property-keys
|
|
60
69
|
* The property keys the platform resolves identities against (enabled
|
|
@@ -73,6 +73,8 @@ router.put('/:type/config', auth_1.requireAdmin, async (req, res) => {
|
|
|
73
73
|
consumes: req.body.consumes,
|
|
74
74
|
tool_tags: req.body.tool_tags,
|
|
75
75
|
envelope_schema: req.body.envelope_schema,
|
|
76
|
+
input_schema: req.body.input_schema,
|
|
77
|
+
icon: req.body.icon,
|
|
76
78
|
resolver_schema: req.body.resolver_schema,
|
|
77
79
|
cron_schedule: req.body.cron_schedule,
|
|
78
80
|
});
|
|
@@ -60,6 +60,20 @@ router.get('/discovered', async (req, res) => {
|
|
|
60
60
|
});
|
|
61
61
|
res.status(result.status).json(result.data ?? { error: result.error });
|
|
62
62
|
});
|
|
63
|
+
// ── Invocable for the caller ────────────────────────────────────────────────
|
|
64
|
+
/**
|
|
65
|
+
* GET /api/workflows/invocable
|
|
66
|
+
* The workflows the calling user may invoke, decided by the invoke gate's
|
|
67
|
+
* own predicate. Drives the dashboard Invoke page and its nav entry.
|
|
68
|
+
*/
|
|
69
|
+
router.get('/invocable', async (req, res) => {
|
|
70
|
+
const result = await api.listInvocableWorkflows({
|
|
71
|
+
userId: req.auth?.userId ?? '',
|
|
72
|
+
role: req.auth?.role,
|
|
73
|
+
scopes: req.auth?.scopes,
|
|
74
|
+
});
|
|
75
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
76
|
+
});
|
|
63
77
|
// ── Cron status ─────────────────────────────────────────────────────────────
|
|
64
78
|
/**
|
|
65
79
|
* GET /api/workflows/cron/status
|
|
@@ -100,7 +100,7 @@ declare function holdFor(esc: {
|
|
|
100
100
|
declare function api(method: string, path: string, body?: unknown): Promise<any>;
|
|
101
101
|
declare function login(): Promise<void>;
|
|
102
102
|
declare function ensureSideQuestRoles(): Promise<void>;
|
|
103
|
-
declare function createSideEscalation(role: string, workflowId: string, orderId: string, runId: string, description: string, authorizedAt: string): Promise<boolean>;
|
|
103
|
+
declare function createSideEscalation(role: string, workflowId: string, orderId: string, runId: string, description: string, authorizedAt: string, facility?: string): Promise<boolean>;
|
|
104
104
|
declare function claimBatch(batchTag: string): Promise<number>;
|
|
105
105
|
declare function resolveBatch(batchTag: string, runId: string): Promise<number>;
|
|
106
106
|
interface PlannedOrder {
|
|
@@ -108,7 +108,9 @@ interface PlannedOrder {
|
|
|
108
108
|
wfId: string;
|
|
109
109
|
orderId: string;
|
|
110
110
|
shoes: boolean;
|
|
111
|
+
facility: string;
|
|
111
112
|
}
|
|
113
|
+
declare const FACILITIES: readonly ["north", "south"];
|
|
112
114
|
declare function runOrders(batchTag: string, runId: string, plan: PlannedOrder[], target: {
|
|
113
115
|
value: number;
|
|
114
116
|
}): Promise<string[]>;
|