@hotmeshio/long-tail 0.19.0 → 0.20.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/build/api/workflows/config.d.ts +8 -1
- package/build/api/workflows/config.js +24 -1
- package/build/api/workflows/index.d.ts +4 -0
- package/build/api/workflows/index.js +9 -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 +14 -0
- package/build/api/workflows/input-validation.js +41 -0
- package/build/api/workflows/invocable.d.ts +19 -0
- package/build/api/workflows/invocable.js +107 -0
- package/build/api/workflows/invocation.js +6 -0
- package/build/lib/db/schemas/034_workflow_input_schema.sql +13 -0
- package/build/lib/db/schemas/035_workflow_input_lookups.sql +9 -0
- package/build/routes/workflows/config.js +12 -0
- package/build/routes/workflows/discovery.js +14 -0
- package/build/services/config/cache.js +3 -0
- package/build/services/config/read.js +6 -0
- package/build/services/config/sql.d.ts +2 -2
- package/build/services/config/sql.js +8 -5
- package/build/services/config/write.js +20 -1
- 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/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/workflow-invocation.js +4 -9
- 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 +1 -0
- package/build/shared/form-validation/index.js +1 -0
- package/build/shared/form-validation/invoke-context.d.ts +8 -0
- package/build/shared/form-validation/invoke-context.js +12 -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-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 +6 -0
- package/build/shared/form-validation/x-lt-show-if.js +13 -0
- package/build/start/workers.js +12 -0
- package/build/system/mcp-servers/admin/schemas.d.ts +64 -20
- package/build/system/mcp-servers/admin/schemas.js +19 -3
- package/build/system/mcp-servers/admin/workflow-config.js +54 -9
- package/build/system/mcp-servers/admin/workflows.js +18 -3
- package/build/system/mcp-servers/db-query/schemas.d.ts +2 -2
- package/build/system/seed/tool-manifests-admin.d.ts +517 -54
- package/build/system/seed/tool-manifests-admin.js +4 -3
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/config.d.ts +10 -0
- package/build/types/index.d.ts +2 -0
- package/build/types/index.js +4 -1
- package/build/types/startup.d.ts +16 -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-DPkWtPc1.js → AdminDashboard-DplvDBti.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-DPkWtPc1.js.map → AdminDashboard-DplvDBti.js.map} +1 -1
- package/dashboard/dist/assets/{AgentConfigPage-DRfnLiQS.js → AgentConfigPage-D8Bf6YxO.js} +3 -3
- package/dashboard/dist/assets/{AgentConfigPage-DRfnLiQS.js.map → AgentConfigPage-D8Bf6YxO.js.map} +1 -1
- package/dashboard/dist/assets/{AgentDetailPage-CufRZXnT.js → AgentDetailPage-BN8g0Y2G.js} +3 -3
- package/dashboard/dist/assets/{AgentDetailPage-CufRZXnT.js.map → AgentDetailPage-BN8g0Y2G.js.map} +1 -1
- package/dashboard/dist/assets/AgentsPage-7JJBHku8.js +2 -0
- package/dashboard/dist/assets/{AgentsPage-CoCWGhUd.js.map → AgentsPage-7JJBHku8.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-lz5qwSjg.js +2 -0
- package/dashboard/dist/assets/{AvailableEscalationsPage-BSqOctep.js.map → AvailableEscalationsPage-lz5qwSjg.js.map} +1 -1
- package/dashboard/dist/assets/{BotPicker-DMojDLlV.js → BotPicker-CGCnIz8I.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-DMojDLlV.js.map → BotPicker-CGCnIz8I.js.map} +1 -1
- package/dashboard/dist/assets/BulkAssignModal-NJBcoj-f.js +2 -0
- package/dashboard/dist/assets/{BulkAssignModal-DYbM_6Or.js.map → BulkAssignModal-NJBcoj-f.js.map} +1 -1
- package/dashboard/dist/assets/{CapabilitiesPage-CDQ5JHNP.js → CapabilitiesPage-F8dpNn9B.js} +2 -2
- package/dashboard/dist/assets/{CapabilitiesPage-CDQ5JHNP.js.map → CapabilitiesPage-F8dpNn9B.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-D4VlCEbD.js → CollapsibleSection-BZW6VpCU.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-D4VlCEbD.js.map → CollapsibleSection-BZW6VpCU.js.map} +1 -1
- package/dashboard/dist/assets/{ConfirmDeleteModal-DnNHjJtD.js → ConfirmDeleteModal-64adXLdq.js} +2 -2
- package/dashboard/dist/assets/{ConfirmDeleteModal-DnNHjJtD.js.map → ConfirmDeleteModal-64adXLdq.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-BxDub9d2.js +2 -0
- package/dashboard/dist/assets/CountdownTimer-BxDub9d2.js.map +1 -0
- package/dashboard/dist/assets/{CredentialsPage-CSYZw-rL.js → CredentialsPage-CnLzopLL.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-CSYZw-rL.js.map → CredentialsPage-CnLzopLL.js.map} +1 -1
- package/dashboard/dist/assets/{CronLabel-CpmqDrlJ.js → CronLabel-CAD5UYDT.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-CpmqDrlJ.js.map → CronLabel-CAD5UYDT.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-BbXlQnYB.js → DropZone-XlcY8hEH.js} +2 -2
- package/dashboard/dist/assets/{DropZone-BbXlQnYB.js.map → DropZone-XlcY8hEH.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-Cul22qBS.js → ElapsedCell-CwO4ufd0.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-Cul22qBS.js.map → ElapsedCell-CwO4ufd0.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-CtzpJ-j2.js → EntityTimelinePanel-CkF-oW-m.js} +2 -2
- package/dashboard/dist/assets/{EntityTimelinePanel-CtzpJ-j2.js.map → EntityTimelinePanel-CkF-oW-m.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationListSchemaPage-BZQ8Y_UH.js → EscalationListSchemaPage-h9JO_q5f.js} +3 -3
- package/dashboard/dist/assets/{EscalationListSchemaPage-BZQ8Y_UH.js.map → EscalationListSchemaPage-h9JO_q5f.js.map} +1 -1
- package/dashboard/dist/assets/EscalationListView-AHW2xtlr.js +2 -0
- package/dashboard/dist/assets/EscalationListView-AHW2xtlr.js.map +1 -0
- package/dashboard/dist/assets/{EscalationSchemaPage-CydTtq_A.js → EscalationSchemaPage-mJFL5_Se.js} +3 -3
- package/dashboard/dist/assets/{EscalationSchemaPage-CydTtq_A.js.map → EscalationSchemaPage-mJFL5_Se.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-DSYC0nI7.js → EscalationsOverview-DlXUFqWJ.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-DSYC0nI7.js.map → EscalationsOverview-DlXUFqWJ.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-s48cTXIw.js → EventTable-Ike2xchn.js} +2 -2
- package/dashboard/dist/assets/{EventTable-s48cTXIw.js.map → EventTable-Ike2xchn.js.map} +1 -1
- package/dashboard/dist/assets/{FilterBar-B61qKmFD.js → FilterBar-DMOR-O1c.js} +2 -2
- package/dashboard/dist/assets/{FilterBar-B61qKmFD.js.map → FilterBar-DMOR-O1c.js.map} +1 -1
- package/dashboard/dist/assets/{GraphInvokePage-DxZv_KC2.js → GraphInvokePage-CKtvWowP.js} +2 -2
- package/dashboard/dist/assets/{GraphInvokePage-DxZv_KC2.js.map → GraphInvokePage-CKtvWowP.js.map} +1 -1
- package/dashboard/dist/assets/HomePage-BQ3Q791Q.js +2 -0
- package/dashboard/dist/assets/{HomePage-zK3VP_9g.js.map → HomePage-BQ3Q791Q.js.map} +1 -1
- package/dashboard/dist/assets/ListToolbar-DdJzj472.js +2 -0
- package/dashboard/dist/assets/{ListToolbar-DaxloPQc.js.map → ListToolbar-DdJzj472.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-Ciq8r6-p.js → McpOverview-BbtrduWn.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-Ciq8r6-p.js.map → McpOverview-BbtrduWn.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryDetailPage-DIC0FEEb.js → McpQueryDetailPage-C1L4T-Wt.js} +3 -3
- package/dashboard/dist/assets/{McpQueryDetailPage-DIC0FEEb.js.map → McpQueryDetailPage-C1L4T-Wt.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryPage-BBy0NSNg.js → McpQueryPage-CfJy7HZ7.js} +2 -2
- package/dashboard/dist/assets/{McpQueryPage-BBy0NSNg.js.map → McpQueryPage-CfJy7HZ7.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunDetailPage-BqKNmIyW.js → McpRunDetailPage-CA9yv7he.js} +2 -2
- package/dashboard/dist/assets/{McpRunDetailPage-BqKNmIyW.js.map → McpRunDetailPage-CA9yv7he.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunsPage-D0RlOpzR.js → McpRunsPage-D7QXjW9z.js} +2 -2
- package/dashboard/dist/assets/{McpRunsPage-D0RlOpzR.js.map → McpRunsPage-D7QXjW9z.js.map} +1 -1
- package/dashboard/dist/assets/{NamespacePill-Dbtm9R2T.js → NamespacePill-Bb3revqD.js} +2 -2
- package/dashboard/dist/assets/{NamespacePill-Dbtm9R2T.js.map → NamespacePill-Bb3revqD.js.map} +1 -1
- package/dashboard/dist/assets/{OperationsPage-BX0SFizr.js → OperationsPage-aLHHAP2X.js} +3 -3
- package/dashboard/dist/assets/{OperationsPage-BX0SFizr.js.map → OperationsPage-aLHHAP2X.js.map} +1 -1
- package/dashboard/dist/assets/OperatorDashboard-sXNDh1Ph.js +2 -0
- package/dashboard/dist/assets/{OperatorDashboard-vXG0TjAQ.js.map → OperatorDashboard-sXNDh1Ph.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeader-xB92ELs3.js → PageHeader-Di5Sz3an.js} +2 -2
- package/dashboard/dist/assets/{PageHeader-xB92ELs3.js.map → PageHeader-Di5Sz3an.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeaderWithStats-DVo_qqn1.js → PageHeaderWithStats-DutKJ-h2.js} +2 -2
- package/dashboard/dist/assets/{PageHeaderWithStats-DVo_qqn1.js.map → PageHeaderWithStats-DutKJ-h2.js.map} +1 -1
- package/dashboard/dist/assets/{PersonaDetailPage-w5TXcn4Q.js → PersonaDetailPage-NeHD-Gra.js} +2 -2
- package/dashboard/dist/assets/{PersonaDetailPage-w5TXcn4Q.js.map → PersonaDetailPage-NeHD-Gra.js.map} +1 -1
- package/dashboard/dist/assets/{PersonasPage-Dzcinl1L.js → PersonasPage-DavKXRWX.js} +2 -2
- package/dashboard/dist/assets/{PersonasPage-Dzcinl1L.js.map → PersonasPage-DavKXRWX.js.map} +1 -1
- 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-BVXieFX1.js → ProcessDetailPage-DkdKJGe6.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-BVXieFX1.js.map → ProcessDetailPage-DkdKJGe6.js.map} +1 -1
- package/dashboard/dist/assets/ProcessesListPage-CjwVKe32.js +2 -0
- package/dashboard/dist/assets/{ProcessesListPage-CKKNpk4z.js.map → ProcessesListPage-CjwVKe32.js.map} +1 -1
- package/dashboard/dist/assets/ResolverForm-Bk-wDkN-.js +3 -0
- package/dashboard/dist/assets/ResolverForm-Bk-wDkN-.js.map +1 -0
- package/dashboard/dist/assets/{RoleDetailPage-BytSo-YE.js → RoleDetailPage-WQt0y5l7.js} +3 -3
- package/dashboard/dist/assets/{RoleDetailPage-BytSo-YE.js.map → RoleDetailPage-WQt0y5l7.js.map} +1 -1
- package/dashboard/dist/assets/{RolePill-CYpL3a2d.js → RolePill-DhnVPK4q.js} +2 -2
- package/dashboard/dist/assets/{RolePill-CYpL3a2d.js.map → RolePill-DhnVPK4q.js.map} +1 -1
- package/dashboard/dist/assets/RolesPage-OM9KM8Pg.js +2 -0
- package/dashboard/dist/assets/{RolesPage-eayR9H4f.js.map → RolesPage-OM9KM8Pg.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-fFMt1bGe.js +2 -0
- package/dashboard/dist/assets/{RunAsSelector-D7RPwaAl.js.map → RunAsSelector-fFMt1bGe.js.map} +1 -1
- package/dashboard/dist/assets/{ScanCodesPage-C8-ZBXF5.js → ScanCodesPage-AujH-pPQ.js} +2 -2
- package/dashboard/dist/assets/{ScanCodesPage-C8-ZBXF5.js.map → ScanCodesPage-AujH-pPQ.js.map} +1 -1
- package/dashboard/dist/assets/{ScanSchemeDetailPage-tQhEgFKf.js → ScanSchemeDetailPage-eKQpmsC_.js} +2 -2
- package/dashboard/dist/assets/{ScanSchemeDetailPage-tQhEgFKf.js.map → ScanSchemeDetailPage-eKQpmsC_.js.map} +1 -1
- package/dashboard/dist/assets/ScanStationPage-C1_ppDoZ.js +2 -0
- package/dashboard/dist/assets/{ScanStationPage-CuhqsBKo.js.map → ScanStationPage-C1_ppDoZ.js.map} +1 -1
- package/dashboard/dist/assets/{ScopeBadge-BmNzZlSj.js → ScopeBadge-CXUg0FHo.js} +2 -2
- package/dashboard/dist/assets/{ScopeBadge-BmNzZlSj.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-BIVTAMnP.js → StickyPagination-B91Pk9xh.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-BIVTAMnP.js.map → StickyPagination-B91Pk9xh.js.map} +1 -1
- package/dashboard/dist/assets/{StreamMessageDetail-CYSC2cO1.js → StreamMessageDetail-C7SPqaJt.js} +2 -2
- package/dashboard/dist/assets/{StreamMessageDetail-CYSC2cO1.js.map → StreamMessageDetail-C7SPqaJt.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-BMZAs_2K.js → SwimlaneTimeline-BcHR8ylf.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-BMZAs_2K.js.map → SwimlaneTimeline-BcHR8ylf.js.map} +1 -1
- package/dashboard/dist/assets/{TagInput-D1uszNd2.js → TagInput-BZ8vb2oW.js} +2 -2
- package/dashboard/dist/assets/{TagInput-D1uszNd2.js.map → TagInput-BZ8vb2oW.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-CVUDUU5Q.js → TaskDetailPage-Bqj0I_I0.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-CVUDUU5Q.js.map → TaskDetailPage-Bqj0I_I0.js.map} +1 -1
- package/dashboard/dist/assets/{TaskQueuePill-C2H8oRfn.js → TaskQueuePill-Bxir8WRl.js} +2 -2
- package/dashboard/dist/assets/{TaskQueuePill-C2H8oRfn.js.map → TaskQueuePill-Bxir8WRl.js.map} +1 -1
- package/dashboard/dist/assets/TasksListPage-BB1f79lL.js +2 -0
- package/dashboard/dist/assets/{TasksListPage-DEQymbXC.js.map → TasksListPage-BB1f79lL.js.map} +1 -1
- package/dashboard/dist/assets/TimeAgo-BFnODmNe.js +2 -0
- package/dashboard/dist/assets/{TimeAgo-CCxP67Rb.js.map → TimeAgo-BFnODmNe.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-CE5ZUYhV.js → TimestampCell-BXgLOBsr.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-CE5ZUYhV.js.map → TimestampCell-BXgLOBsr.js.map} +1 -1
- package/dashboard/dist/assets/{ToolPill-D-h8AoB8.js → ToolPill-FkgTXIhq.js} +2 -2
- package/dashboard/dist/assets/{ToolPill-D-h8AoB8.js.map → ToolPill-FkgTXIhq.js.map} +1 -1
- package/dashboard/dist/assets/{ToolTestPanel-BHuQTyBY.js → ToolTestPanel-Bwe3J5lj.js} +2 -2
- package/dashboard/dist/assets/{ToolTestPanel-BHuQTyBY.js.map → ToolTestPanel-Bwe3J5lj.js.map} +1 -1
- package/dashboard/dist/assets/{TopicDetailPage-SFuiludx.js → TopicDetailPage-DAF07vZ9.js} +3 -3
- package/dashboard/dist/assets/{TopicDetailPage-SFuiludx.js.map → TopicDetailPage-DAF07vZ9.js.map} +1 -1
- package/dashboard/dist/assets/{TopicsPage-DO8pUmng.js → TopicsPage-C1gxBUap.js} +2 -2
- package/dashboard/dist/assets/{TopicsPage-DO8pUmng.js.map → TopicsPage-C1gxBUap.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-CsLnT75E.js → UserName-BzXJUE6q.js} +2 -2
- package/dashboard/dist/assets/{UserName-CsLnT75E.js.map → UserName-BzXJUE6q.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowExecutionPage-SkRU5cRX.js +2 -0
- package/dashboard/dist/assets/{WorkflowExecutionPage-BttnEvOd.js.map → WorkflowExecutionPage-SkRU5cRX.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowPill-CZvBbkn4.js → WorkflowPill--AYMW7u_.js} +2 -2
- package/dashboard/dist/assets/WorkflowPill--AYMW7u_.js.map +1 -0
- package/dashboard/dist/assets/WorkflowsDashboard-CZAqRk1N.js +2 -0
- package/dashboard/dist/assets/{WorkflowsDashboard-BRboBhlK.js.map → WorkflowsDashboard-CZAqRk1N.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowsOverview-BoN44VTE.js +2 -0
- package/dashboard/dist/assets/{WorkflowsOverview-CDFTYeQo.js.map → WorkflowsOverview-BoN44VTE.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-CmnZFevp.js → YamlWorkflowDetailPage-CqjhtdJf.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-CmnZFevp.js.map → YamlWorkflowDetailPage-CqjhtdJf.js.map} +1 -1
- package/dashboard/dist/assets/YamlWorkflowsPage-CwnJkzyb.js +2 -0
- package/dashboard/dist/assets/{YamlWorkflowsPage-Qq1jfcrH.js.map → YamlWorkflowsPage-CwnJkzyb.js.map} +1 -1
- package/dashboard/dist/assets/{agents-C7vUIO7e.js → agents-gV0Ys-sY.js} +2 -2
- package/dashboard/dist/assets/{agents-C7vUIO7e.js.map → agents-gV0Ys-sY.js.map} +1 -1
- package/dashboard/dist/assets/{bots-BaOblnW4.js → bots-B97itB3I.js} +2 -2
- package/dashboard/dist/assets/{bots-BaOblnW4.js.map → bots-B97itB3I.js.map} +1 -1
- package/dashboard/dist/assets/capabilities-CR9xZgGd.js +2 -0
- package/dashboard/dist/assets/{capabilities-RZpmDWoy.js.map → capabilities-CR9xZgGd.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-BwGdcwXR.js → controlplane-YxvP1KCa.js} +2 -2
- package/dashboard/dist/assets/{controlplane-BwGdcwXR.js.map → controlplane-YxvP1KCa.js.map} +1 -1
- package/dashboard/dist/assets/escalation-columns-uq-IV2aj.js +2 -0
- package/dashboard/dist/assets/{escalation-columns-B4DG_5v8.js.map → escalation-columns-uq-IV2aj.js.map} +1 -1
- package/dashboard/dist/assets/index-3ezfWLkE.js +6 -0
- package/dashboard/dist/assets/index-3ezfWLkE.js.map +1 -0
- package/dashboard/dist/assets/{index-xNFTmmsv.js → index-B9BBCqLI.js} +2 -2
- package/dashboard/dist/assets/{index-xNFTmmsv.js.map → index-B9BBCqLI.js.map} +1 -1
- package/dashboard/dist/assets/{index-iegzyfMv.js → index-BQpV-DTG.js} +2 -2
- package/dashboard/dist/assets/{index-iegzyfMv.js.map → index-BQpV-DTG.js.map} +1 -1
- package/dashboard/dist/assets/index-Bp9KBLT5.js +2 -0
- package/dashboard/dist/assets/{index-IWufkcH9.js.map → index-Bp9KBLT5.js.map} +1 -1
- package/dashboard/dist/assets/index-Bpvfr4OW.css +1 -0
- package/dashboard/dist/assets/{index-D9NtDRtp.js → index-CFbo9FU9.js} +2 -2
- package/dashboard/dist/assets/{index-D9NtDRtp.js.map → index-CFbo9FU9.js.map} +1 -1
- package/dashboard/dist/assets/{index-BQPUlmmz.js → index-CIpHj4di.js} +2 -2
- package/dashboard/dist/assets/{index-BQPUlmmz.js.map → index-CIpHj4di.js.map} +1 -1
- package/dashboard/dist/assets/index-CIwlVfvV.js +67 -0
- package/dashboard/dist/assets/index-CIwlVfvV.js.map +1 -0
- package/dashboard/dist/assets/{index-BICLHYJJ.js → index-CUZ6LYye.js} +2 -2
- package/dashboard/dist/assets/{index-BICLHYJJ.js.map → index-CUZ6LYye.js.map} +1 -1
- package/dashboard/dist/assets/index-Cfvkl2J0.js +13 -0
- package/dashboard/dist/assets/index-Cfvkl2J0.js.map +1 -0
- package/dashboard/dist/assets/{index-BuqpU6ow.js → index-DMeaiKgf.js} +2 -2
- package/dashboard/dist/assets/{index-BuqpU6ow.js.map → index-DMeaiKgf.js.map} +1 -1
- package/dashboard/dist/assets/{index-G3NmdMjt.js → index-DwOnWeu8.js} +2 -2
- package/dashboard/dist/assets/{index-G3NmdMjt.js.map → index-DwOnWeu8.js.map} +1 -1
- package/dashboard/dist/assets/index-SGyrXGp8.js +3 -0
- package/dashboard/dist/assets/index-SGyrXGp8.js.map +1 -0
- package/dashboard/dist/assets/{index-DU9-flEo.js → index-ipqwPavs.js} +2 -2
- package/dashboard/dist/assets/{index-DU9-flEo.js.map → index-ipqwPavs.js.map} +1 -1
- package/dashboard/dist/assets/invoke-context-DrVyUEfs.js +2 -0
- package/dashboard/dist/assets/invoke-context-DrVyUEfs.js.map +1 -0
- package/dashboard/dist/assets/{knowledge-CjwCbm3E.js → knowledge-XX6cW4Ob.js} +2 -2
- package/dashboard/dist/assets/{knowledge-CjwCbm3E.js.map → knowledge-XX6cW4Ob.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-C-DMktCT.js → mcp-CH13hNH2.js} +2 -2
- package/dashboard/dist/assets/{mcp-C-DMktCT.js.map → mcp-CH13hNH2.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-KBeBNHb4.js → mcp-query-Duydd3JA.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-KBeBNHb4.js.map → mcp-query-Duydd3JA.js.map} +1 -1
- package/dashboard/dist/assets/{personas-B32sSCxm.js → personas-mDk4lLQS.js} +2 -2
- package/dashboard/dist/assets/{personas-B32sSCxm.js.map → personas-mDk4lLQS.js.map} +1 -1
- package/dashboard/dist/assets/{pipelines-DNLwDumm.js → pipelines-B5GcgCeF.js} +2 -2
- package/dashboard/dist/assets/{pipelines-DNLwDumm.js.map → pipelines-B5GcgCeF.js.map} +1 -1
- package/dashboard/dist/assets/resolver-payload-m9AGKZ3a.js +2 -0
- package/dashboard/dist/assets/resolver-payload-m9AGKZ3a.js.map +1 -0
- package/dashboard/dist/assets/{tasks-DrWSrjmj.js → tasks-CItmNsRp.js} +2 -2
- package/dashboard/dist/assets/{tasks-DrWSrjmj.js.map → tasks-CItmNsRp.js.map} +1 -1
- package/dashboard/dist/assets/{topics-DgzGU-vR.js → topics-CJYG7BX5.js} +2 -2
- package/dashboard/dist/assets/{topics-DgzGU-vR.js.map → topics-CJYG7BX5.js.map} +1 -1
- package/dashboard/dist/assets/useDebouncedValue-BrwgXcp8.js +2 -0
- package/dashboard/dist/assets/{useDebouncedValue-DG5JOj1F.js.map → useDebouncedValue-BrwgXcp8.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-CdgF7Jxo.js → useNamespace-CHty0HAS.js} +2 -2
- package/dashboard/dist/assets/{useNamespace-CdgF7Jxo.js.map → useNamespace-CHty0HAS.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-BEaOtgSZ.js → useYamlActivityEvents-CoTsia7t.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-BEaOtgSZ.js.map → useYamlActivityEvents-CoTsia7t.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-BCWsItQ7.js → vendor-icons-DeBdvyKJ.js} +364 -144
- 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-YASUDPo0.js → yaml-workflows-CiWwx5rM.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-YASUDPo0.js.map → yaml-workflows-CiWwx5rM.js.map} +1 -1
- package/dashboard/dist/index.html +5 -5
- package/docs/api/http/workflows.md +52 -1
- package/docs/api/mcp/admin.md +40 -4
- package/docs/code-owned-configuration.md +1 -1
- package/docs/dashboard.md +45 -19
- package/docs/design-principles.md +6 -5
- package/docs/events.md +3 -1
- package/docs/faceted-routing.md +1 -1
- package/docs/hitl/form.md +12 -7
- package/docs/hitl/iframe.md +35 -6
- package/docs/hitl/invoke-form.md +101 -0
- package/docs/hitl/lookups.md +21 -0
- package/docs/hitl/x-lt-show-if.md +11 -0
- package/docs/hitl/x-lt-validation.md +50 -3
- package/docs/hitl/x-lt-widget.md +21 -0
- package/docs/hitl-guide.md +9 -4
- package/docs/iam.md +1 -1
- package/docs/scan-codes.md +13 -4
- package/docs/workflows.md +1 -1
- package/package.json +1 -1
- package/dashboard/dist/assets/AgentsPage-CoCWGhUd.js +0 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-BSqOctep.js +0 -2
- package/dashboard/dist/assets/BulkAssignModal-DYbM_6Or.js +0 -2
- package/dashboard/dist/assets/CountdownTimer-DPHMBmgz.js +0 -2
- package/dashboard/dist/assets/CountdownTimer-DPHMBmgz.js.map +0 -1
- package/dashboard/dist/assets/HomePage-zK3VP_9g.js +0 -2
- package/dashboard/dist/assets/ListToolbar-DaxloPQc.js +0 -2
- package/dashboard/dist/assets/OperatorDashboard-vXG0TjAQ.js +0 -2
- package/dashboard/dist/assets/ProcessesListPage-CKKNpk4z.js +0 -2
- package/dashboard/dist/assets/RolesPage-eayR9H4f.js +0 -2
- package/dashboard/dist/assets/RunAsSelector-D7RPwaAl.js +0 -2
- package/dashboard/dist/assets/ScanStationPage-CuhqsBKo.js +0 -2
- package/dashboard/dist/assets/TasksListPage-DEQymbXC.js +0 -2
- package/dashboard/dist/assets/TimeAgo-CCxP67Rb.js +0 -2
- package/dashboard/dist/assets/WorkflowExecutionPage-BttnEvOd.js +0 -2
- package/dashboard/dist/assets/WorkflowPill-CZvBbkn4.js.map +0 -1
- package/dashboard/dist/assets/WorkflowsDashboard-BRboBhlK.js +0 -2
- package/dashboard/dist/assets/WorkflowsOverview-CDFTYeQo.js +0 -2
- package/dashboard/dist/assets/YamlWorkflowsPage-Qq1jfcrH.js +0 -2
- package/dashboard/dist/assets/capabilities-RZpmDWoy.js +0 -2
- package/dashboard/dist/assets/escalation-columns-B4DG_5v8.js +0 -2
- package/dashboard/dist/assets/index-8LIpvj2e.js +0 -3
- package/dashboard/dist/assets/index-8LIpvj2e.js.map +0 -1
- package/dashboard/dist/assets/index-BaC3sbJH.js +0 -67
- package/dashboard/dist/assets/index-BaC3sbJH.js.map +0 -1
- package/dashboard/dist/assets/index-CD6jtND1.css +0 -1
- package/dashboard/dist/assets/index-CsIw-ZLk.js +0 -6
- package/dashboard/dist/assets/index-CsIw-ZLk.js.map +0 -1
- package/dashboard/dist/assets/index-CtJkvX9e.js +0 -5
- package/dashboard/dist/assets/index-CtJkvX9e.js.map +0 -1
- package/dashboard/dist/assets/index-IWufkcH9.js +0 -2
- package/dashboard/dist/assets/useDebouncedValue-DG5JOj1F.js +0 -2
- package/dashboard/dist/assets/vendor-icons-BCWsItQ7.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-CX_oarls.js +0 -2
- package/dashboard/dist/assets/workflows-CX_oarls.js.map +0 -1
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type EscalationLookupRef } from '../../types/escalation';
|
|
1
2
|
import type { LTApiResult } from '../../types/sdk';
|
|
2
3
|
/**
|
|
3
4
|
* List all registered workflow configurations.
|
|
@@ -35,7 +36,10 @@ export declare function getWorkflowConfig(input: {
|
|
|
35
36
|
* @param input.invocation_roles — roles that can invoke this workflow
|
|
36
37
|
* @param input.consumes — workflow types whose data this workflow consumes
|
|
37
38
|
* @param input.tool_tags — MCP tool tags for discovery
|
|
38
|
-
* @param input.envelope_schema — JSON
|
|
39
|
+
* @param input.envelope_schema — JSON template that pre-fills the invoke form
|
|
40
|
+
* @param input.input_schema — x-lt-* JSON Schema for the rich invoke form; invoke validates data against it
|
|
41
|
+
* @param input.icon — curated icon name (WORKFLOW_ICONS); anything else is refused
|
|
42
|
+
* @param input.input_lookups: versioned knowledge refs the invoke form reads as `lookup.<as ?? key>`; malformed refs are refused
|
|
39
43
|
* @param input.resolver_schema — JSON Schema for resolver payload validation
|
|
40
44
|
* @param input.cron_schedule — cron expression for scheduled execution
|
|
41
45
|
* @returns `{ status: 200, data: <saved config> }`
|
|
@@ -53,6 +57,9 @@ export declare function upsertWorkflowConfig(input: {
|
|
|
53
57
|
consumes?: string[];
|
|
54
58
|
tool_tags?: string[];
|
|
55
59
|
envelope_schema?: any;
|
|
60
|
+
input_schema?: any;
|
|
61
|
+
icon?: string | null;
|
|
62
|
+
input_lookups?: EscalationLookupRef[] | null;
|
|
56
63
|
resolver_schema?: any;
|
|
57
64
|
cron_schedule?: string | null;
|
|
58
65
|
read_safe?: boolean;
|
|
@@ -38,6 +38,9 @@ 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");
|
|
42
|
+
const escalation_1 = require("../../types/escalation");
|
|
43
|
+
const lookup_refs_1 = require("../../services/knowledge/lookup-refs");
|
|
41
44
|
const cron_1 = require("../../services/cron");
|
|
42
45
|
const ltconfig_1 = require("../../modules/ltconfig");
|
|
43
46
|
/**
|
|
@@ -93,13 +96,30 @@ async function getWorkflowConfig(input) {
|
|
|
93
96
|
* @param input.invocation_roles — roles that can invoke this workflow
|
|
94
97
|
* @param input.consumes — workflow types whose data this workflow consumes
|
|
95
98
|
* @param input.tool_tags — MCP tool tags for discovery
|
|
96
|
-
* @param input.envelope_schema — JSON
|
|
99
|
+
* @param input.envelope_schema — JSON template that pre-fills the invoke form
|
|
100
|
+
* @param input.input_schema — x-lt-* JSON Schema for the rich invoke form; invoke validates data against it
|
|
101
|
+
* @param input.icon — curated icon name (WORKFLOW_ICONS); anything else is refused
|
|
102
|
+
* @param input.input_lookups: versioned knowledge refs the invoke form reads as `lookup.<as ?? key>`; malformed refs are refused
|
|
97
103
|
* @param input.resolver_schema — JSON Schema for resolver payload validation
|
|
98
104
|
* @param input.cron_schedule — cron expression for scheduled execution
|
|
99
105
|
* @returns `{ status: 200, data: <saved config> }`
|
|
100
106
|
*/
|
|
101
107
|
async function upsertWorkflowConfig(input) {
|
|
102
108
|
try {
|
|
109
|
+
if (input.icon && !(0, workflow_icons_1.isWorkflowIcon)(input.icon)) {
|
|
110
|
+
return { status: 400, error: `Unknown workflow icon "${input.icon}"; choose one of WORKFLOW_ICONS` };
|
|
111
|
+
}
|
|
112
|
+
if (input.input_lookups != null) {
|
|
113
|
+
try {
|
|
114
|
+
(0, escalation_1.assertLookupRefs)(input.input_lookups);
|
|
115
|
+
}
|
|
116
|
+
catch (err) {
|
|
117
|
+
return { status: 400, error: err.message };
|
|
118
|
+
}
|
|
119
|
+
const missing = await (0, lookup_refs_1.describeMissingLookupRefs)(input.input_lookups);
|
|
120
|
+
if (missing.length)
|
|
121
|
+
return { status: 400, error: missing.join('; ') };
|
|
122
|
+
}
|
|
103
123
|
// Validate cron expression before persisting
|
|
104
124
|
if (input.cron_schedule) {
|
|
105
125
|
const { validateCronSchedule } = await Promise.resolve().then(() => __importStar(require('../../services/cron')));
|
|
@@ -118,6 +138,9 @@ async function upsertWorkflowConfig(input) {
|
|
|
118
138
|
consumes: input.consumes ?? [],
|
|
119
139
|
tool_tags: input.tool_tags ?? [],
|
|
120
140
|
envelope_schema: input.envelope_schema ?? null,
|
|
141
|
+
input_schema: input.input_schema ?? null,
|
|
142
|
+
icon: input.icon ?? null,
|
|
143
|
+
input_lookups: input.input_lookups ?? null,
|
|
121
144
|
resolver_schema: input.resolver_schema ?? null,
|
|
122
145
|
cron_schedule: input.cron_schedule ?? null,
|
|
123
146
|
read_safe: input.read_safe ?? false,
|
|
@@ -1,3 +1,7 @@
|
|
|
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';
|
|
6
|
+
export { getWorkflowInputLookups } from './input-lookups';
|
|
3
7
|
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.getWorkflowInputLookups = 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,14 @@ 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; } });
|
|
20
|
+
var input_lookups_1 = require("./input-lookups");
|
|
21
|
+
Object.defineProperty(exports, "getWorkflowInputLookups", { enumerable: true, get: function () { return input_lookups_1.getWorkflowInputLookups; } });
|
|
14
22
|
var config_1 = require("./config");
|
|
15
23
|
Object.defineProperty(exports, "listWorkflowConfigs", { enumerable: true, get: function () { return config_1.listWorkflowConfigs; } });
|
|
16
24
|
Object.defineProperty(exports, "getWorkflowConfig", { enumerable: true, get: function () { return config_1.getWorkflowConfig; } });
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { LTApiResult, LTApiAuth } from '../../types/sdk';
|
|
2
|
+
/**
|
|
3
|
+
* Resolve the versioned knowledge lookups pinned on a workflow config.
|
|
4
|
+
*
|
|
5
|
+
* The refs on `input_lookups` ARE the grant: any caller who may invoke the
|
|
6
|
+
* workflow may read exactly the pinned editions it names. A ref whose
|
|
7
|
+
* snapshot does not exist answers with `missing: true`; the batch never
|
|
8
|
+
* fails.
|
|
9
|
+
*
|
|
10
|
+
* @param input.type: workflow type name
|
|
11
|
+
* @param auth: authenticated caller; must pass the invoke predicate
|
|
12
|
+
* @returns `{ status: 200, data: { lookups: [{ domain, key, version, as?, data, missing? }] } }`
|
|
13
|
+
*/
|
|
14
|
+
export declare function getWorkflowInputLookups(input: {
|
|
15
|
+
type: string;
|
|
16
|
+
}, auth: LTApiAuth): Promise<LTApiResult>;
|
|
@@ -0,0 +1,69 @@
|
|
|
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.getWorkflowInputLookups = getWorkflowInputLookups;
|
|
37
|
+
const configService = __importStar(require("../../services/config"));
|
|
38
|
+
const userService = __importStar(require("../../services/user"));
|
|
39
|
+
const invocation_access_1 = require("../../services/invocation-access");
|
|
40
|
+
const knowledge_1 = require("../../services/knowledge");
|
|
41
|
+
/**
|
|
42
|
+
* Resolve the versioned knowledge lookups pinned on a workflow config.
|
|
43
|
+
*
|
|
44
|
+
* The refs on `input_lookups` ARE the grant: any caller who may invoke the
|
|
45
|
+
* workflow may read exactly the pinned editions it names. A ref whose
|
|
46
|
+
* snapshot does not exist answers with `missing: true`; the batch never
|
|
47
|
+
* fails.
|
|
48
|
+
*
|
|
49
|
+
* @param input.type: workflow type name
|
|
50
|
+
* @param auth: authenticated caller; must pass the invoke predicate
|
|
51
|
+
* @returns `{ status: 200, data: { lookups: [{ domain, key, version, as?, data, missing? }] } }`
|
|
52
|
+
*/
|
|
53
|
+
async function getWorkflowInputLookups(input, auth) {
|
|
54
|
+
try {
|
|
55
|
+
const config = await configService.getWorkflowConfig(input.type);
|
|
56
|
+
if (!config) {
|
|
57
|
+
return { status: 404, error: 'Workflow config not found' };
|
|
58
|
+
}
|
|
59
|
+
const user = auth.userId ? await userService.getUser(auth.userId) : null;
|
|
60
|
+
if (!(0, invocation_access_1.canInvokeWorkflow)(config, user?.roles ?? [], auth.role)) {
|
|
61
|
+
return { status: 403, error: 'Not authorized to invoke this workflow' };
|
|
62
|
+
}
|
|
63
|
+
const lookups = await (0, knowledge_1.resolveLookupRefs)(config.input_lookups ?? []);
|
|
64
|
+
return { status: 200, data: { lookups } };
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
return { status: 500, error: err.message };
|
|
68
|
+
}
|
|
69
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
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. Pinned input_lookups resolve into
|
|
9
|
+
* the `lookup` domain first. No schema, no gate; a data value that is not
|
|
10
|
+
* an object is left to the service's own 400.
|
|
11
|
+
*/
|
|
12
|
+
export declare function checkInvokeInput(config: Pick<LTWorkflowConfig, 'workflow_type' | 'input_schema' | 'input_lookups'> | null | undefined, data: unknown, metadata: Record<string, unknown> | null | undefined): Promise<LTValidationErrorBody | null>;
|
|
13
|
+
/** The canonical 422 result; the route serializes `data` as the body. */
|
|
14
|
+
export declare function inputValidationFailure(body: LTValidationErrorBody): LTApiResult;
|
|
@@ -0,0 +1,41 @@
|
|
|
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 lookup_cache_1 = require("../../services/knowledge/lookup-cache");
|
|
8
|
+
const validation_1 = require("../../types/validation");
|
|
9
|
+
function isPlainObject(value) {
|
|
10
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* The invoke input gate. A workflow that declares input_schema has its
|
|
14
|
+
* submitted data validated by the same shared pass the dashboard form runs,
|
|
15
|
+
* so a payload the form accepts is accepted here and a rejection lists the
|
|
16
|
+
* exact violations the form would show. Pinned input_lookups resolve into
|
|
17
|
+
* the `lookup` domain first. No schema, no gate; a data value that is not
|
|
18
|
+
* an object is left to the service's own 400.
|
|
19
|
+
*/
|
|
20
|
+
async function checkInvokeInput(config, data, metadata) {
|
|
21
|
+
const schema = config?.input_schema;
|
|
22
|
+
if (!schema || !isPlainObject(data))
|
|
23
|
+
return null;
|
|
24
|
+
const lookup = await (0, lookup_cache_1.resolveLookupContext)(config?.input_lookups);
|
|
25
|
+
const violations = (0, validate_resolver_payload_1.validateResolverPayload)(schema, data, (0, invoke_context_1.buildInvokeFormContext)(metadata, lookup));
|
|
26
|
+
if (violations.length === 0)
|
|
27
|
+
return null;
|
|
28
|
+
const n = violations.length;
|
|
29
|
+
return {
|
|
30
|
+
error: `data failed input schema validation (${n} violation${n === 1 ? '' : 's'})`,
|
|
31
|
+
code: validation_1.LT_ERROR_CODES.SCHEMA_VALIDATION,
|
|
32
|
+
violations,
|
|
33
|
+
role: null,
|
|
34
|
+
schemaVersion: null,
|
|
35
|
+
workflowType: config.workflow_type,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/** The canonical 422 result; the route serializes `data` as the body. */
|
|
39
|
+
function inputValidationFailure(body) {
|
|
40
|
+
return { status: 422, error: body.error, code: body.code, data: body };
|
|
41
|
+
}
|
|
@@ -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,107 @@
|
|
|
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
|
+
input_lookups: null,
|
|
69
|
+
resolver_schema: null,
|
|
70
|
+
cron_schedule: null,
|
|
71
|
+
execute_as: null,
|
|
72
|
+
read_safe: false,
|
|
73
|
+
tier: exports.WORKFLOW_TIERS.DURABLE,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* The workflows the caller may invoke, decided by the same predicate the
|
|
78
|
+
* invoke gate runs. Callers with global access also see active durable
|
|
79
|
+
* workers that carry no registration row, as the invoke gate admits them.
|
|
80
|
+
*
|
|
81
|
+
* @returns `{ status: 200, data: { workflows: InvocableWorkflowEntry[] } }`
|
|
82
|
+
*/
|
|
83
|
+
async function listInvocableWorkflows(auth) {
|
|
84
|
+
try {
|
|
85
|
+
const [configs, user] = await Promise.all([
|
|
86
|
+
configService.listWorkflowConfigs(),
|
|
87
|
+
auth.userId ? userService.getUser(auth.userId) : Promise.resolve(null),
|
|
88
|
+
]);
|
|
89
|
+
const roles = user?.roles ?? [];
|
|
90
|
+
const workflows = configs
|
|
91
|
+
.filter((c) => (0, invocation_access_1.canInvokeWorkflow)(c, roles, auth.role))
|
|
92
|
+
.map((c) => ({ ...c, tier: tierOf(c) }));
|
|
93
|
+
if ((0, invocation_access_1.hasGlobalInvocationAccess)(roles, auth.role)) {
|
|
94
|
+
const registered = new Set(configs.map((c) => c.workflow_type));
|
|
95
|
+
for (const [name, { taskQueue }] of (0, registry_1.getRegisteredWorkers)()) {
|
|
96
|
+
if (registered.has(name) || registry_1.SYSTEM_WORKFLOWS.has(name))
|
|
97
|
+
continue;
|
|
98
|
+
workflows.push(durableEntry(name, taskQueue));
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
workflows.sort((a, b) => a.workflow_type.localeCompare(b.workflow_type));
|
|
102
|
+
return { status: 200, data: { workflows } };
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
return { status: 500, error: err.message };
|
|
106
|
+
}
|
|
107
|
+
}
|
|
@@ -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 = await (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,9 @@
|
|
|
1
|
+
-- Migration 035: workflow input lookups
|
|
2
|
+
--
|
|
3
|
+
-- One opt-in column on the workflow registration:
|
|
4
|
+
-- input_lookups: versioned knowledge refs ({ domain, key, version, as? }[])
|
|
5
|
+
-- the invoke form reads under the `lookup.<as ?? key>`
|
|
6
|
+
-- context domain. NULL renders the form with no lookups.
|
|
7
|
+
|
|
8
|
+
ALTER TABLE lt_config_workflows
|
|
9
|
+
ADD COLUMN IF NOT EXISTS input_lookups JSONB;
|
|
@@ -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.
|
|
@@ -73,6 +82,9 @@ router.put('/:type/config', auth_1.requireAdmin, async (req, res) => {
|
|
|
73
82
|
consumes: req.body.consumes,
|
|
74
83
|
tool_tags: req.body.tool_tags,
|
|
75
84
|
envelope_schema: req.body.envelope_schema,
|
|
85
|
+
input_schema: req.body.input_schema,
|
|
86
|
+
icon: req.body.icon,
|
|
87
|
+
input_lookups: req.body.input_lookups,
|
|
76
88
|
resolver_schema: req.body.resolver_schema,
|
|
77
89
|
cron_schedule: req.body.cron_schedule,
|
|
78
90
|
});
|
|
@@ -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
|
|
@@ -16,6 +16,9 @@ async function loadAllConfigs() {
|
|
|
16
16
|
consumes: c.consumes,
|
|
17
17
|
toolTags: c.tool_tags || [],
|
|
18
18
|
envelopeSchema: c.envelope_schema ?? null,
|
|
19
|
+
inputSchema: c.input_schema ?? null,
|
|
20
|
+
icon: c.icon ?? null,
|
|
21
|
+
inputLookups: c.input_lookups ?? null,
|
|
19
22
|
resolverSchema: c.resolver_schema ?? null,
|
|
20
23
|
cronSchedule: c.cron_schedule ?? null,
|
|
21
24
|
executeAs: c.execute_as ?? null,
|
|
@@ -26,6 +26,9 @@ async function getWorkflowConfig(workflowType) {
|
|
|
26
26
|
consumes: wf.consumes || [],
|
|
27
27
|
tool_tags: wf.tool_tags || [],
|
|
28
28
|
envelope_schema: wf.envelope_schema ?? null,
|
|
29
|
+
input_schema: wf.input_schema ?? null,
|
|
30
|
+
icon: wf.icon ?? null,
|
|
31
|
+
input_lookups: wf.input_lookups ?? null,
|
|
29
32
|
resolver_schema: wf.resolver_schema ?? null,
|
|
30
33
|
cron_schedule: wf.cron_schedule ?? null,
|
|
31
34
|
execute_as: wf.execute_as ?? null,
|
|
@@ -64,6 +67,9 @@ async function listWorkflowConfigs() {
|
|
|
64
67
|
consumes: wf.consumes || [],
|
|
65
68
|
tool_tags: wf.tool_tags || [],
|
|
66
69
|
envelope_schema: wf.envelope_schema ?? null,
|
|
70
|
+
input_schema: wf.input_schema ?? null,
|
|
71
|
+
icon: wf.icon ?? null,
|
|
72
|
+
input_lookups: wf.input_lookups ?? null,
|
|
67
73
|
resolver_schema: wf.resolver_schema ?? null,
|
|
68
74
|
cron_schedule: wf.cron_schedule ?? null,
|
|
69
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)\nVALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13)\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";
|
|
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)\nVALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13)\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)
|
|
27
|
-
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13)
|
|
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,
|
|
@@ -37,7 +37,10 @@ ON CONFLICT (workflow_type) DO UPDATE SET
|
|
|
37
37
|
tool_tags = EXCLUDED.tool_tags,
|
|
38
38
|
execute_as = EXCLUDED.execute_as,
|
|
39
39
|
certified = EXCLUDED.certified,
|
|
40
|
-
read_safe = EXCLUDED.read_safe
|
|
40
|
+
read_safe = EXCLUDED.read_safe,
|
|
41
|
+
input_schema = EXCLUDED.input_schema,
|
|
42
|
+
icon = EXCLUDED.icon,
|
|
43
|
+
input_lookups = EXCLUDED.input_lookups`;
|
|
41
44
|
exports.DELETE_CONFIG_ROLES = `\
|
|
42
45
|
DELETE FROM lt_config_roles WHERE workflow_type = $1`;
|
|
43
46
|
exports.INSERT_CONFIG_ROLE = `\
|
|
@@ -53,8 +56,8 @@ DELETE FROM lt_config_workflows WHERE workflow_type = $1`;
|
|
|
53
56
|
// ------------------------------------------------------------------ //
|
|
54
57
|
exports.SEED_WORKFLOW_CONFIG = `\
|
|
55
58
|
INSERT INTO lt_config_workflows
|
|
56
|
-
(workflow_type, invocable, task_queue, default_role, description, consumes, envelope_schema, resolver_schema, cron_schedule, tool_tags, execute_as, certified, read_safe)
|
|
57
|
-
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13)
|
|
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)
|
|
58
61
|
ON CONFLICT (workflow_type) DO NOTHING`;
|
|
59
62
|
exports.SEED_CONFIG_ROLE = `\
|
|
60
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));
|
|
@@ -53,6 +57,9 @@ async function replaceWorkflowConfig(config, certified) {
|
|
|
53
57
|
config.execute_as ?? null,
|
|
54
58
|
certified,
|
|
55
59
|
config.read_safe ?? false,
|
|
60
|
+
config.input_schema ?? null,
|
|
61
|
+
config.icon ?? null,
|
|
62
|
+
toJsonb(config.input_lookups),
|
|
56
63
|
]);
|
|
57
64
|
// Replace roles
|
|
58
65
|
await client.query(sql_1.DELETE_CONFIG_ROLES, [config.workflow_type]);
|
|
@@ -114,6 +121,9 @@ async function seedWorkflowConfig(config) {
|
|
|
114
121
|
config.execute_as ?? null,
|
|
115
122
|
resolveCertified(config),
|
|
116
123
|
config.read_safe ?? false,
|
|
124
|
+
config.input_schema ?? null,
|
|
125
|
+
config.icon ?? null,
|
|
126
|
+
toJsonb(config.input_lookups),
|
|
117
127
|
]);
|
|
118
128
|
const inserted = (rowCount ?? 0) > 0;
|
|
119
129
|
if (inserted) {
|
|
@@ -144,6 +154,12 @@ async function seedWorkflowConfig(config) {
|
|
|
144
154
|
drifts.push('envelope_schema');
|
|
145
155
|
if (JSON.stringify(config.resolver_schema) !== JSON.stringify(existing.resolver_schema))
|
|
146
156
|
drifts.push('resolver_schema');
|
|
157
|
+
if (JSON.stringify(config.input_schema ?? null) !== JSON.stringify(existing.input_schema ?? null))
|
|
158
|
+
drifts.push('input_schema');
|
|
159
|
+
if ((config.icon ?? null) !== (existing.icon ?? null))
|
|
160
|
+
drifts.push('icon');
|
|
161
|
+
if (JSON.stringify(config.input_lookups ?? null) !== JSON.stringify(existing.input_lookups ?? null))
|
|
162
|
+
drifts.push('input_lookups');
|
|
147
163
|
if (drifts.length) {
|
|
148
164
|
logger_1.loggerRegistry.warn(`[long-tail] config drift: ${config.workflow_type} — ${drifts.join(', ')} differ between code and DB`);
|
|
149
165
|
}
|
|
@@ -181,7 +197,10 @@ async function applyWorkflowConfig(config) {
|
|
|
181
197
|
sortedEqual(existing.roles ?? [], config.roles ?? []) &&
|
|
182
198
|
sortedEqual(existing.invocation_roles ?? [], config.invocation_roles ?? []) &&
|
|
183
199
|
(0, node_util_1.isDeepStrictEqual)(existing.envelope_schema ?? null, config.envelope_schema ?? null) &&
|
|
184
|
-
(0, node_util_1.isDeepStrictEqual)(existing.resolver_schema ?? null, config.resolver_schema ?? null)
|
|
200
|
+
(0, node_util_1.isDeepStrictEqual)(existing.resolver_schema ?? null, config.resolver_schema ?? null) &&
|
|
201
|
+
(0, node_util_1.isDeepStrictEqual)(existing.input_schema ?? null, config.input_schema ?? null) &&
|
|
202
|
+
(existing.icon ?? null) === (config.icon ?? null) &&
|
|
203
|
+
(0, node_util_1.isDeepStrictEqual)(existing.input_lookups ?? null, config.input_lookups ?? null);
|
|
185
204
|
if (unchanged)
|
|
186
205
|
return 'unchanged';
|
|
187
206
|
}
|