@hotmeshio/long-tail 0.19.0 → 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/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/routes/workflows/config.js +2 -0
- package/build/routes/workflows/discovery.js +14 -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/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/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-DPkWtPc1.js → AdminDashboard-Drs-9TRM.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-DPkWtPc1.js.map → AdminDashboard-Drs-9TRM.js.map} +1 -1
- package/dashboard/dist/assets/{AgentConfigPage-DRfnLiQS.js → AgentConfigPage-BDPDZ7-v.js} +3 -3
- package/dashboard/dist/assets/{AgentConfigPage-DRfnLiQS.js.map → AgentConfigPage-BDPDZ7-v.js.map} +1 -1
- package/dashboard/dist/assets/{AgentDetailPage-CufRZXnT.js → AgentDetailPage-CGBulM4_.js} +3 -3
- package/dashboard/dist/assets/{AgentDetailPage-CufRZXnT.js.map → AgentDetailPage-CGBulM4_.js.map} +1 -1
- package/dashboard/dist/assets/AgentsPage-D77JeViQ.js +2 -0
- package/dashboard/dist/assets/{AgentsPage-CoCWGhUd.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-BSqOctep.js.map → AvailableEscalationsPage-CqM_MOMy.js.map} +1 -1
- package/dashboard/dist/assets/{BotPicker-DMojDLlV.js → BotPicker-CC5vI_Sv.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-DMojDLlV.js.map → BotPicker-CC5vI_Sv.js.map} +1 -1
- package/dashboard/dist/assets/BulkAssignModal-BXiJnlqt.js +2 -0
- package/dashboard/dist/assets/{BulkAssignModal-DYbM_6Or.js.map → BulkAssignModal-BXiJnlqt.js.map} +1 -1
- package/dashboard/dist/assets/{CapabilitiesPage-CDQ5JHNP.js → CapabilitiesPage-D9TC2iKy.js} +2 -2
- package/dashboard/dist/assets/{CapabilitiesPage-CDQ5JHNP.js.map → CapabilitiesPage-D9TC2iKy.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-D4VlCEbD.js → CollapsibleSection-D10lGw_u.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-D4VlCEbD.js.map → CollapsibleSection-D10lGw_u.js.map} +1 -1
- package/dashboard/dist/assets/{ConfirmDeleteModal-DnNHjJtD.js → ConfirmDeleteModal-BJdLN6No.js} +2 -2
- package/dashboard/dist/assets/{ConfirmDeleteModal-DnNHjJtD.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-CSYZw-rL.js → CredentialsPage-hniUAFBK.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-CSYZw-rL.js.map → CredentialsPage-hniUAFBK.js.map} +1 -1
- package/dashboard/dist/assets/{CronLabel-CpmqDrlJ.js → CronLabel-v9DCD2FX.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-CpmqDrlJ.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-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-_xvVTK8N.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-Cul22qBS.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-CtzpJ-j2.js → EntityTimelinePanel-1lT3jkCM.js} +2 -2
- package/dashboard/dist/assets/{EntityTimelinePanel-CtzpJ-j2.js.map → EntityTimelinePanel-1lT3jkCM.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationListSchemaPage-BZQ8Y_UH.js → EscalationListSchemaPage-BeQUTUEO.js} +3 -3
- package/dashboard/dist/assets/{EscalationListSchemaPage-BZQ8Y_UH.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-CydTtq_A.js → EscalationSchemaPage-D4VlEwyS.js} +3 -3
- package/dashboard/dist/assets/{EscalationSchemaPage-CydTtq_A.js.map → EscalationSchemaPage-D4VlEwyS.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-DSYC0nI7.js → EscalationsOverview-Bx6Zrzm-.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-DSYC0nI7.js.map → EscalationsOverview-Bx6Zrzm-.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-s48cTXIw.js → EventTable-KEC3YWBf.js} +2 -2
- package/dashboard/dist/assets/{EventTable-s48cTXIw.js.map → EventTable-KEC3YWBf.js.map} +1 -1
- package/dashboard/dist/assets/{FilterBar-B61qKmFD.js → FilterBar-xwN_b5fj.js} +2 -2
- package/dashboard/dist/assets/{FilterBar-B61qKmFD.js.map → FilterBar-xwN_b5fj.js.map} +1 -1
- package/dashboard/dist/assets/{GraphInvokePage-DxZv_KC2.js → GraphInvokePage-DV7Y0fe2.js} +2 -2
- package/dashboard/dist/assets/{GraphInvokePage-DxZv_KC2.js.map → GraphInvokePage-DV7Y0fe2.js.map} +1 -1
- package/dashboard/dist/assets/HomePage-G785SWcW.js +2 -0
- package/dashboard/dist/assets/{HomePage-zK3VP_9g.js.map → HomePage-G785SWcW.js.map} +1 -1
- package/dashboard/dist/assets/ListToolbar-zPVYPg3W.js +2 -0
- package/dashboard/dist/assets/{ListToolbar-DaxloPQc.js.map → ListToolbar-zPVYPg3W.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-Ciq8r6-p.js → McpOverview-CMGUq8hx.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-Ciq8r6-p.js.map → McpOverview-CMGUq8hx.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryDetailPage-DIC0FEEb.js → McpQueryDetailPage-CdhLhaKn.js} +3 -3
- package/dashboard/dist/assets/{McpQueryDetailPage-DIC0FEEb.js.map → McpQueryDetailPage-CdhLhaKn.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryPage-BBy0NSNg.js → McpQueryPage-CNSNMagY.js} +2 -2
- package/dashboard/dist/assets/{McpQueryPage-BBy0NSNg.js.map → McpQueryPage-CNSNMagY.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunDetailPage-BqKNmIyW.js → McpRunDetailPage-DBm8hUaW.js} +2 -2
- package/dashboard/dist/assets/{McpRunDetailPage-BqKNmIyW.js.map → McpRunDetailPage-DBm8hUaW.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunsPage-D0RlOpzR.js → McpRunsPage-B6rb5QBf.js} +2 -2
- package/dashboard/dist/assets/{McpRunsPage-D0RlOpzR.js.map → McpRunsPage-B6rb5QBf.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-Dxk1fAMg.js} +3 -3
- package/dashboard/dist/assets/{OperationsPage-BX0SFizr.js.map → OperationsPage-Dxk1fAMg.js.map} +1 -1
- package/dashboard/dist/assets/OperatorDashboard-DBOscDnf.js +2 -0
- package/dashboard/dist/assets/{OperatorDashboard-vXG0TjAQ.js.map → OperatorDashboard-DBOscDnf.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-BGRdGpeR.js} +2 -2
- package/dashboard/dist/assets/{PersonaDetailPage-w5TXcn4Q.js.map → PersonaDetailPage-BGRdGpeR.js.map} +1 -1
- package/dashboard/dist/assets/{PersonasPage-Dzcinl1L.js → PersonasPage-DRzOZcVa.js} +2 -2
- package/dashboard/dist/assets/{PersonasPage-Dzcinl1L.js.map → PersonasPage-DRzOZcVa.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-BLGjZXpM.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-BVXieFX1.js.map → ProcessDetailPage-BLGjZXpM.js.map} +1 -1
- package/dashboard/dist/assets/ProcessesListPage-5NnysKFC.js +2 -0
- package/dashboard/dist/assets/{ProcessesListPage-CKKNpk4z.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-BytSo-YE.js → RoleDetailPage-C_LIoe1j.js} +3 -3
- package/dashboard/dist/assets/{RoleDetailPage-BytSo-YE.js.map → RoleDetailPage-C_LIoe1j.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-BmW1LzkU.js +2 -0
- package/dashboard/dist/assets/{RolesPage-eayR9H4f.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-D7RPwaAl.js.map → RunAsSelector-BwZTJ4Yj.js.map} +1 -1
- package/dashboard/dist/assets/ScanCodesPage-FiYIYB-m.js +2 -0
- package/dashboard/dist/assets/{ScanCodesPage-C8-ZBXF5.js.map → ScanCodesPage-FiYIYB-m.js.map} +1 -1
- package/dashboard/dist/assets/{ScanSchemeDetailPage-tQhEgFKf.js → ScanSchemeDetailPage-BiAqtD-a.js} +2 -2
- package/dashboard/dist/assets/{ScanSchemeDetailPage-tQhEgFKf.js.map → ScanSchemeDetailPage-BiAqtD-a.js.map} +1 -1
- package/dashboard/dist/assets/ScanStationPage-8CdOtbCD.js +2 -0
- package/dashboard/dist/assets/{ScanStationPage-CuhqsBKo.js.map → ScanStationPage-8CdOtbCD.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-DRuqKhZt.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-BIVTAMnP.js.map → StickyPagination-DRuqKhZt.js.map} +1 -1
- package/dashboard/dist/assets/{StreamMessageDetail-CYSC2cO1.js → StreamMessageDetail-JwlbRiMn.js} +2 -2
- package/dashboard/dist/assets/{StreamMessageDetail-CYSC2cO1.js.map → StreamMessageDetail-JwlbRiMn.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-BMZAs_2K.js → SwimlaneTimeline-hu3c4bCJ.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-BMZAs_2K.js.map → SwimlaneTimeline-hu3c4bCJ.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-NqVZF3jW.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-CVUDUU5Q.js.map → TaskDetailPage-NqVZF3jW.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-BQNaSzCn.js +2 -0
- package/dashboard/dist/assets/{TasksListPage-DEQymbXC.js.map → TasksListPage-BQNaSzCn.js.map} +1 -1
- package/dashboard/dist/assets/TimeAgo-Cv35DOiI.js +2 -0
- package/dashboard/dist/assets/{TimeAgo-CCxP67Rb.js.map → TimeAgo-Cv35DOiI.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-CE5ZUYhV.js → TimestampCell-DHUXey9s.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-CE5ZUYhV.js.map → TimestampCell-DHUXey9s.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-DvuLFWqQ.js} +2 -2
- package/dashboard/dist/assets/{ToolTestPanel-BHuQTyBY.js.map → ToolTestPanel-DvuLFWqQ.js.map} +1 -1
- package/dashboard/dist/assets/{TopicDetailPage-SFuiludx.js → TopicDetailPage-TXX3QNSo.js} +3 -3
- package/dashboard/dist/assets/{TopicDetailPage-SFuiludx.js.map → TopicDetailPage-TXX3QNSo.js.map} +1 -1
- package/dashboard/dist/assets/{TopicsPage-DO8pUmng.js → TopicsPage-h-oyTeEJ.js} +2 -2
- package/dashboard/dist/assets/{TopicsPage-DO8pUmng.js.map → TopicsPage-h-oyTeEJ.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-CsLnT75E.js → UserName-BceRCeDF.js} +2 -2
- package/dashboard/dist/assets/{UserName-CsLnT75E.js.map → UserName-BceRCeDF.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowExecutionPage-CmHGcaN9.js +2 -0
- package/dashboard/dist/assets/{WorkflowExecutionPage-BttnEvOd.js.map → WorkflowExecutionPage-CmHGcaN9.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-B0r2lQXk.js +2 -0
- package/dashboard/dist/assets/{WorkflowsDashboard-BRboBhlK.js.map → WorkflowsDashboard-B0r2lQXk.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowsOverview-BTMc2PJ_.js +2 -0
- package/dashboard/dist/assets/{WorkflowsOverview-CDFTYeQo.js.map → WorkflowsOverview-BTMc2PJ_.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-CmnZFevp.js → YamlWorkflowDetailPage-DUiCVnZp.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-CmnZFevp.js.map → YamlWorkflowDetailPage-DUiCVnZp.js.map} +1 -1
- package/dashboard/dist/assets/YamlWorkflowsPage-BAuXfwi0.js +2 -0
- package/dashboard/dist/assets/{YamlWorkflowsPage-Qq1jfcrH.js.map → YamlWorkflowsPage-BAuXfwi0.js.map} +1 -1
- package/dashboard/dist/assets/{agents-C7vUIO7e.js → agents-BvmLCk4h.js} +2 -2
- package/dashboard/dist/assets/{agents-C7vUIO7e.js.map → agents-BvmLCk4h.js.map} +1 -1
- package/dashboard/dist/assets/{bots-BaOblnW4.js → bots-f_tyhl4I.js} +2 -2
- package/dashboard/dist/assets/{bots-BaOblnW4.js.map → bots-f_tyhl4I.js.map} +1 -1
- package/dashboard/dist/assets/capabilities-DNo5bqLx.js +2 -0
- package/dashboard/dist/assets/{capabilities-RZpmDWoy.js.map → capabilities-DNo5bqLx.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-BwGdcwXR.js → controlplane-Dyyj2Irb.js} +2 -2
- package/dashboard/dist/assets/{controlplane-BwGdcwXR.js.map → controlplane-Dyyj2Irb.js.map} +1 -1
- package/dashboard/dist/assets/escalation-columns-DIigeTOK.js +2 -0
- package/dashboard/dist/assets/{escalation-columns-B4DG_5v8.js.map → escalation-columns-DIigeTOK.js.map} +1 -1
- package/dashboard/dist/assets/index-BMlQYOE1.js +67 -0
- package/dashboard/dist/assets/index-BMlQYOE1.js.map +1 -0
- package/dashboard/dist/assets/{index-BICLHYJJ.js → index-BNZknxFY.js} +2 -2
- package/dashboard/dist/assets/{index-BICLHYJJ.js.map → index-BNZknxFY.js.map} +1 -1
- package/dashboard/dist/assets/index-Bpvfr4OW.css +1 -0
- package/dashboard/dist/assets/{index-G3NmdMjt.js → index-C-Xr2V3F.js} +2 -2
- package/dashboard/dist/assets/{index-G3NmdMjt.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-xNFTmmsv.js → index-CsKiRyhy.js} +2 -2
- package/dashboard/dist/assets/{index-xNFTmmsv.js.map → index-CsKiRyhy.js.map} +1 -1
- package/dashboard/dist/assets/index-D7ESqn22.js +2 -0
- package/dashboard/dist/assets/{index-IWufkcH9.js.map → index-D7ESqn22.js.map} +1 -1
- package/dashboard/dist/assets/{index-iegzyfMv.js → index-DL83W7Gu.js} +2 -2
- package/dashboard/dist/assets/{index-iegzyfMv.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-BuqpU6ow.js → index-DWse7ERF.js} +2 -2
- package/dashboard/dist/assets/{index-BuqpU6ow.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-D9NtDRtp.js → index-DvxxrFBo.js} +2 -2
- package/dashboard/dist/assets/{index-D9NtDRtp.js.map → index-DvxxrFBo.js.map} +1 -1
- package/dashboard/dist/assets/{index-DU9-flEo.js → index-PcyGjmBm.js} +2 -2
- package/dashboard/dist/assets/{index-DU9-flEo.js.map → index-PcyGjmBm.js.map} +1 -1
- package/dashboard/dist/assets/{index-BQPUlmmz.js → index-e2X-s0EQ.js} +2 -2
- package/dashboard/dist/assets/{index-BQPUlmmz.js.map → index-e2X-s0EQ.js.map} +1 -1
- package/dashboard/dist/assets/{knowledge-CjwCbm3E.js → knowledge-Coo6CKzo.js} +2 -2
- package/dashboard/dist/assets/{knowledge-CjwCbm3E.js.map → knowledge-Coo6CKzo.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-C-DMktCT.js → mcp-Cz5eFnP_.js} +2 -2
- package/dashboard/dist/assets/{mcp-C-DMktCT.js.map → mcp-Cz5eFnP_.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-KBeBNHb4.js → mcp-query-BtnuO4LF.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-KBeBNHb4.js.map → mcp-query-BtnuO4LF.js.map} +1 -1
- package/dashboard/dist/assets/{personas-B32sSCxm.js → personas-C2-LgpHQ.js} +2 -2
- package/dashboard/dist/assets/{personas-B32sSCxm.js.map → personas-C2-LgpHQ.js.map} +1 -1
- package/dashboard/dist/assets/{pipelines-DNLwDumm.js → pipelines-TuXQvUA-.js} +2 -2
- package/dashboard/dist/assets/{pipelines-DNLwDumm.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-DrWSrjmj.js → tasks-OUzpu__z.js} +2 -2
- package/dashboard/dist/assets/{tasks-DrWSrjmj.js.map → tasks-OUzpu__z.js.map} +1 -1
- package/dashboard/dist/assets/{topics-DgzGU-vR.js → topics-B8bdrBaW.js} +2 -2
- package/dashboard/dist/assets/{topics-DgzGU-vR.js.map → topics-B8bdrBaW.js.map} +1 -1
- package/dashboard/dist/assets/useDebouncedValue-Cp5ZOtVE.js +2 -0
- package/dashboard/dist/assets/{useDebouncedValue-DG5JOj1F.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-CdgF7Jxo.js → useNamespace-DtQe3wZ5.js} +2 -2
- package/dashboard/dist/assets/{useNamespace-CdgF7Jxo.js.map → useNamespace-DtQe3wZ5.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-BEaOtgSZ.js → useYamlActivityEvents-CS22c15X.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-BEaOtgSZ.js.map → useYamlActivityEvents-CS22c15X.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-HQIki3hI.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-YASUDPo0.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 +45 -19
- package/docs/events.md +3 -1
- package/docs/faceted-routing.md +1 -1
- package/docs/hitl/iframe.md +35 -6
- package/docs/hitl/invoke-form.md +98 -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/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/ScanCodesPage-C8-ZBXF5.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,2 +1,2 @@
|
|
|
1
|
-
import{u as l,b as a,c as s}from"./vendor-query-
|
|
2
|
-
//# sourceMappingURL=yaml-workflows-
|
|
1
|
+
import{u as l,b as a,c as s}from"./vendor-query-DvWWuNIB.js";import{m as r}from"./index-BMlQYOE1.js";function f(e={}){const o=new URLSearchParams;return e.status&&o.set("status",e.status),e.graph_topic&&o.set("graph_topic",e.graph_topic),e.app_id&&o.set("app_id",e.app_id),e.search&&o.set("search",e.search),e.set_id&&o.set("set_id",e.set_id),e.limit&&o.set("limit",String(e.limit)),e.offset!==void 0&&o.set("offset",String(e.offset)),l({queryKey:["yamlWorkflows",e],queryFn:()=>r(`/yaml-workflows?${o}`)})}function m(){return l({queryKey:["yamlWorkflowAppIds"],queryFn:()=>r("/yaml-workflows/app-ids")})}function c(e){return l({queryKey:["yamlWorkflows",e],queryFn:()=>r(`/yaml-workflows/${e}`),enabled:!!e})}function w(){const e=a();return s({mutationFn:o=>r("/yaml-workflows",{method:"POST",body:JSON.stringify(o)}),onSuccess:()=>{e.invalidateQueries({queryKey:["yamlWorkflows"],refetchType:"all"})}})}function k(){const e=a();return s({mutationFn:o=>r(`/yaml-workflows/${o}/deploy`,{method:"POST"}),onSuccess:()=>{e.invalidateQueries({queryKey:["yamlWorkflows"],refetchType:"all"})}})}function p(){const e=a();return s({mutationFn:o=>r(`/yaml-workflows/${o}/activate`,{method:"POST"}),onSuccess:()=>{e.invalidateQueries({queryKey:["yamlWorkflows"],refetchType:"all"})}})}function d(){const e=a();return s({mutationFn:({id:o,data:t,sync:n,execute_as:u})=>r(`/yaml-workflows/${o}/invoke`,{method:"POST",body:JSON.stringify({data:t,sync:n,...u?{execute_as:u}:{}})}),onSuccess:()=>{e.invalidateQueries({queryKey:["yamlWorkflows"],refetchType:"all"})}})}function h(){const e=a();return s({mutationFn:({id:o,task_queue:t,compilation_feedback:n})=>r(`/yaml-workflows/${o}/regenerate`,{method:"POST",body:JSON.stringify({task_queue:t,compilation_feedback:n})}),onSuccess:()=>{e.invalidateQueries({queryKey:["yamlWorkflows"],refetchType:"all"})}})}function q(){const e=a();return s({mutationFn:o=>r(`/yaml-workflows/${o}/archive`,{method:"POST"}),onSuccess:()=>{e.invalidateQueries({queryKey:["yamlWorkflows"],refetchType:"all"})}})}function W(){const e=a();return s({mutationFn:o=>r(`/yaml-workflows/${o}/restore`,{method:"POST"}),onSuccess:()=>{e.invalidateQueries({queryKey:["yamlWorkflows"],refetchType:"all"}),e.invalidateQueries({queryKey:["yamlWorkflow"],refetchType:"all"})}})}function S(){const e=a();return s({mutationFn:({id:o,...t})=>r(`/yaml-workflows/${o}`,{method:"PUT",body:JSON.stringify(t)}),onSuccess:()=>{e.invalidateQueries({queryKey:["yamlWorkflows"],refetchType:"all"})}})}function v(){const e=a();return s({mutationFn:o=>r(`/yaml-workflows/${o}`,{method:"DELETE"}),onSuccess:()=>{e.invalidateQueries({queryKey:["yamlWorkflows"],refetchType:"all"})}})}function T(e){return l({queryKey:["yamlWorkflows",e,"versions"],queryFn:()=>r(`/yaml-workflows/${e}/versions`),enabled:!!e})}function F(e,o){return l({queryKey:["yamlWorkflows",e,"versions",o],queryFn:()=>r(`/yaml-workflows/${e}/versions/${o}`),enabled:!!e&&o!==null})}export{m as a,S as b,c,T as d,k as e,p as f,q as g,W as h,v as i,h as j,F as k,d as l,w as m,f as u};
|
|
2
|
+
//# sourceMappingURL=yaml-workflows-HQIki3hI.js.map
|
package/dashboard/dist/assets/{yaml-workflows-YASUDPo0.js.map → yaml-workflows-HQIki3hI.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"yaml-workflows-YASUDPo0.js","sources":["../../src/api/yaml-workflows.ts"],"sourcesContent":["import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { apiFetch } from './client';\nimport type { LTYamlWorkflowRecord, LTYamlWorkflowStatus, LTYamlWorkflowVersion } from './types';\n\ninterface YamlWorkflowListResponse {\n workflows: LTYamlWorkflowRecord[];\n total: number;\n}\n\ninterface YamlWorkflowFilters {\n status?: LTYamlWorkflowStatus;\n graph_topic?: string;\n app_id?: string;\n search?: string;\n set_id?: string;\n limit?: number;\n offset?: number;\n}\n\nexport function useYamlWorkflows(filters: YamlWorkflowFilters = {}) {\n const params = new URLSearchParams();\n if (filters.status) params.set('status', filters.status);\n if (filters.graph_topic) params.set('graph_topic', filters.graph_topic);\n if (filters.app_id) params.set('app_id', filters.app_id);\n if (filters.search) params.set('search', filters.search);\n if (filters.set_id) params.set('set_id', filters.set_id);\n if (filters.limit) params.set('limit', String(filters.limit));\n if (filters.offset !== undefined) params.set('offset', String(filters.offset));\n\n return useQuery<YamlWorkflowListResponse>({\n queryKey: ['yamlWorkflows', filters],\n queryFn: () => apiFetch(`/yaml-workflows?${params}`),\n });\n}\n\nexport function useYamlWorkflowAppIds() {\n return useQuery<{ app_ids: string[] }>({\n queryKey: ['yamlWorkflowAppIds'],\n queryFn: () => apiFetch('/yaml-workflows/app-ids'),\n });\n}\n\nexport function useYamlWorkflowByTopic(graphTopic: string | undefined, appId?: string) {\n return useQuery<YamlWorkflowListResponse>({\n queryKey: ['yamlWorkflows', 'byTopic', graphTopic, appId],\n queryFn: () => {\n const params = new URLSearchParams({ graph_topic: graphTopic!, limit: '1' });\n if (appId) params.set('app_id', appId);\n return apiFetch(`/yaml-workflows?${params}`);\n },\n enabled: !!graphTopic,\n });\n}\n\nexport function useYamlWorkflow(id: string) {\n return useQuery<LTYamlWorkflowRecord>({\n queryKey: ['yamlWorkflows', id],\n queryFn: () => apiFetch(`/yaml-workflows/${id}`),\n enabled: !!id,\n });\n}\n\nexport function useCreateYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (input: {\n workflow_id: string;\n task_queue: string;\n workflow_name: string;\n name: string;\n description?: string;\n app_id?: string;\n subscribes?: string;\n tags?: string[];\n compilation_feedback?: string;\n }) =>\n apiFetch<LTYamlWorkflowRecord>('/yaml-workflows', {\n method: 'POST',\n body: JSON.stringify(input),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useDeployYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/deploy`, {\n method: 'POST',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useActivateYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/activate`, {\n method: 'POST',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useInvokeYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, data, sync, execute_as }: { id: string; data: Record<string, unknown>; sync?: boolean; execute_as?: string }) =>\n apiFetch<{ result?: unknown; job_id?: string }>(`/yaml-workflows/${id}/invoke`, {\n method: 'POST',\n body: JSON.stringify({ data, sync, ...(execute_as ? { execute_as } : {}) }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useRegenerateYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, task_queue, compilation_feedback }: { id: string; task_queue?: string; compilation_feedback?: string }) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/regenerate`, {\n method: 'POST',\n body: JSON.stringify({ task_queue, compilation_feedback }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useArchiveYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/archive`, {\n method: 'POST',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useRestoreYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/restore`, {\n method: 'POST',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflow'], refetchType: 'all' });\n },\n });\n}\n\nexport function useUpdateYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, ...updates }: { id: string; yaml_content?: string; name?: string; description?: string; input_schema?: Record<string, unknown>; output_schema?: Record<string, unknown>; tags?: string[]; app_id?: string; graph_topic?: string }) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}`, {\n method: 'PUT',\n body: JSON.stringify(updates),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useDeleteYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<{ deleted: boolean }>(`/yaml-workflows/${id}`, {\n method: 'DELETE',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\n// ── Cron scheduling ─────────────────────────────────────────────\n\nexport function useSetYamlCron() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, cron_schedule, cron_envelope, execute_as }: {\n id: string;\n cron_schedule: string;\n cron_envelope?: Record<string, unknown> | null;\n execute_as?: string | null;\n }) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/cron`, {\n method: 'PUT',\n body: JSON.stringify({ cron_schedule, cron_envelope, execute_as }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useClearYamlCron() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/cron`, {\n method: 'DELETE',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\n// ── Version history ─────────────────────────────────────────────\n\nexport function useYamlWorkflowVersions(id: string) {\n return useQuery<{ versions: LTYamlWorkflowVersion[]; total: number }>({\n queryKey: ['yamlWorkflows', id, 'versions'],\n queryFn: () => apiFetch(`/yaml-workflows/${id}/versions`),\n enabled: !!id,\n });\n}\n\nexport function useYamlWorkflowVersion(id: string, version: number | null) {\n return useQuery<LTYamlWorkflowVersion>({\n queryKey: ['yamlWorkflows', id, 'versions', version],\n queryFn: () => apiFetch(`/yaml-workflows/${id}/versions/${version}`),\n enabled: !!id && version !== null,\n });\n}\n"],"names":["useYamlWorkflows","filters","params","useQuery","apiFetch","useYamlWorkflowAppIds","useYamlWorkflow","id","useCreateYamlWorkflow","queryClient","useQueryClient","useMutation","input","useDeployYamlWorkflow","useActivateYamlWorkflow","useInvokeYamlWorkflow","data","sync","execute_as","useRegenerateYamlWorkflow","task_queue","compilation_feedback","useArchiveYamlWorkflow","useRestoreYamlWorkflow","useUpdateYamlWorkflow","updates","useDeleteYamlWorkflow","useYamlWorkflowVersions","useYamlWorkflowVersion","version"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"yaml-workflows-HQIki3hI.js","sources":["../../src/api/yaml-workflows.ts"],"sourcesContent":["import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { apiFetch } from './client';\nimport type { LTYamlWorkflowRecord, LTYamlWorkflowStatus, LTYamlWorkflowVersion } from './types';\n\ninterface YamlWorkflowListResponse {\n workflows: LTYamlWorkflowRecord[];\n total: number;\n}\n\ninterface YamlWorkflowFilters {\n status?: LTYamlWorkflowStatus;\n graph_topic?: string;\n app_id?: string;\n search?: string;\n set_id?: string;\n limit?: number;\n offset?: number;\n}\n\nexport function useYamlWorkflows(filters: YamlWorkflowFilters = {}) {\n const params = new URLSearchParams();\n if (filters.status) params.set('status', filters.status);\n if (filters.graph_topic) params.set('graph_topic', filters.graph_topic);\n if (filters.app_id) params.set('app_id', filters.app_id);\n if (filters.search) params.set('search', filters.search);\n if (filters.set_id) params.set('set_id', filters.set_id);\n if (filters.limit) params.set('limit', String(filters.limit));\n if (filters.offset !== undefined) params.set('offset', String(filters.offset));\n\n return useQuery<YamlWorkflowListResponse>({\n queryKey: ['yamlWorkflows', filters],\n queryFn: () => apiFetch(`/yaml-workflows?${params}`),\n });\n}\n\nexport function useYamlWorkflowAppIds() {\n return useQuery<{ app_ids: string[] }>({\n queryKey: ['yamlWorkflowAppIds'],\n queryFn: () => apiFetch('/yaml-workflows/app-ids'),\n });\n}\n\nexport function useYamlWorkflowByTopic(graphTopic: string | undefined, appId?: string) {\n return useQuery<YamlWorkflowListResponse>({\n queryKey: ['yamlWorkflows', 'byTopic', graphTopic, appId],\n queryFn: () => {\n const params = new URLSearchParams({ graph_topic: graphTopic!, limit: '1' });\n if (appId) params.set('app_id', appId);\n return apiFetch(`/yaml-workflows?${params}`);\n },\n enabled: !!graphTopic,\n });\n}\n\nexport function useYamlWorkflow(id: string) {\n return useQuery<LTYamlWorkflowRecord>({\n queryKey: ['yamlWorkflows', id],\n queryFn: () => apiFetch(`/yaml-workflows/${id}`),\n enabled: !!id,\n });\n}\n\nexport function useCreateYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (input: {\n workflow_id: string;\n task_queue: string;\n workflow_name: string;\n name: string;\n description?: string;\n app_id?: string;\n subscribes?: string;\n tags?: string[];\n compilation_feedback?: string;\n }) =>\n apiFetch<LTYamlWorkflowRecord>('/yaml-workflows', {\n method: 'POST',\n body: JSON.stringify(input),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useDeployYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/deploy`, {\n method: 'POST',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useActivateYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/activate`, {\n method: 'POST',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useInvokeYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, data, sync, execute_as }: { id: string; data: Record<string, unknown>; sync?: boolean; execute_as?: string }) =>\n apiFetch<{ result?: unknown; job_id?: string }>(`/yaml-workflows/${id}/invoke`, {\n method: 'POST',\n body: JSON.stringify({ data, sync, ...(execute_as ? { execute_as } : {}) }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useRegenerateYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, task_queue, compilation_feedback }: { id: string; task_queue?: string; compilation_feedback?: string }) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/regenerate`, {\n method: 'POST',\n body: JSON.stringify({ task_queue, compilation_feedback }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useArchiveYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/archive`, {\n method: 'POST',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useRestoreYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/restore`, {\n method: 'POST',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflow'], refetchType: 'all' });\n },\n });\n}\n\nexport function useUpdateYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, ...updates }: { id: string; yaml_content?: string; name?: string; description?: string; input_schema?: Record<string, unknown>; output_schema?: Record<string, unknown>; tags?: string[]; app_id?: string; graph_topic?: string }) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}`, {\n method: 'PUT',\n body: JSON.stringify(updates),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useDeleteYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<{ deleted: boolean }>(`/yaml-workflows/${id}`, {\n method: 'DELETE',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\n// ── Cron scheduling ─────────────────────────────────────────────\n\nexport function useSetYamlCron() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, cron_schedule, cron_envelope, execute_as }: {\n id: string;\n cron_schedule: string;\n cron_envelope?: Record<string, unknown> | null;\n execute_as?: string | null;\n }) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/cron`, {\n method: 'PUT',\n body: JSON.stringify({ cron_schedule, cron_envelope, execute_as }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useClearYamlCron() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/cron`, {\n method: 'DELETE',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\n// ── Version history ─────────────────────────────────────────────\n\nexport function useYamlWorkflowVersions(id: string) {\n return useQuery<{ versions: LTYamlWorkflowVersion[]; total: number }>({\n queryKey: ['yamlWorkflows', id, 'versions'],\n queryFn: () => apiFetch(`/yaml-workflows/${id}/versions`),\n enabled: !!id,\n });\n}\n\nexport function useYamlWorkflowVersion(id: string, version: number | null) {\n return useQuery<LTYamlWorkflowVersion>({\n queryKey: ['yamlWorkflows', id, 'versions', version],\n queryFn: () => apiFetch(`/yaml-workflows/${id}/versions/${version}`),\n enabled: !!id && version !== null,\n });\n}\n"],"names":["useYamlWorkflows","filters","params","useQuery","apiFetch","useYamlWorkflowAppIds","useYamlWorkflow","id","useCreateYamlWorkflow","queryClient","useQueryClient","useMutation","input","useDeployYamlWorkflow","useActivateYamlWorkflow","useInvokeYamlWorkflow","data","sync","execute_as","useRegenerateYamlWorkflow","task_queue","compilation_feedback","useArchiveYamlWorkflow","useRestoreYamlWorkflow","useUpdateYamlWorkflow","updates","useDeleteYamlWorkflow","useYamlWorkflowVersions","useYamlWorkflowVersion","version"],"mappings":"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"}
|
|
@@ -8,11 +8,11 @@
|
|
|
8
8
|
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
9
9
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
10
10
|
<link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet" />
|
|
11
|
-
<script type="module" crossorigin src="./assets/index-
|
|
12
|
-
<link rel="modulepreload" crossorigin href="./assets/vendor-query-
|
|
13
|
-
<link rel="modulepreload" crossorigin href="./assets/vendor-react-
|
|
14
|
-
<link rel="modulepreload" crossorigin href="./assets/vendor-icons-
|
|
15
|
-
<link rel="stylesheet" crossorigin href="./assets/index-
|
|
11
|
+
<script type="module" crossorigin src="./assets/index-BMlQYOE1.js"></script>
|
|
12
|
+
<link rel="modulepreload" crossorigin href="./assets/vendor-query-DvWWuNIB.js">
|
|
13
|
+
<link rel="modulepreload" crossorigin href="./assets/vendor-react-_9U4mKFr.js">
|
|
14
|
+
<link rel="modulepreload" crossorigin href="./assets/vendor-icons-DeBdvyKJ.js">
|
|
15
|
+
<link rel="stylesheet" crossorigin href="./assets/index-Bpvfr4OW.css">
|
|
16
16
|
</head>
|
|
17
17
|
<body>
|
|
18
18
|
<div id="root"></div>
|
|
@@ -139,7 +139,9 @@ PUT /api/workflows/:type/config
|
|
|
139
139
|
| `consumes` | `string[]` | `[]` | Workflow types whose completed data this workflow receives via `envelope.lt.providers` |
|
|
140
140
|
| `execute_as` | `string \| null` | `null` | Service account `external_id` to run as (overrides invoker identity) |
|
|
141
141
|
| `tool_tags` | `string[]` | `[]` | MCP tool tags for scoped tool discovery |
|
|
142
|
-
| `envelope_schema` | `object \| null` | `null` |
|
|
142
|
+
| `envelope_schema` | `object \| null` | `null` | Example envelope that pre-fills the legacy invoke form |
|
|
143
|
+
| `input_schema` | `object \| null` | `null` | x-lt-* JSON Schema for the rich invoke form; `POST /:type/invoke` validates `data` against it. See [Invoke forms](../../hitl/invoke-form.md). |
|
|
144
|
+
| `icon` | `string \| null` | `null` | Curated icon name from `WORKFLOW_ICONS`; unknown names are refused with `400` |
|
|
143
145
|
| `resolver_schema` | `object \| null` | `null` | **Deprecated** legacy fallback only. The escalation form is owned by the target role as a versioned `form_schema`. |
|
|
144
146
|
| `cron_schedule` | `string \| null` | `null` | Cron expression for scheduled execution (e.g., `"0 9 * * *"`) |
|
|
145
147
|
|
|
@@ -241,11 +243,32 @@ The workflow starts on its configured `task_queue` with a generated workflow ID
|
|
|
241
243
|
| `403` | `{ "error": "User not registered" }` | RBAC check failed — no matching user |
|
|
242
244
|
| `403` | `{ "error": "Insufficient role for invocation" }` | User lacks a required invocation role |
|
|
243
245
|
| `404` | `{ "error": "Workflow not found" }` | No config exists for this type |
|
|
246
|
+
| `422` | `{ "error": "data failed input schema validation (n violations)", "code": "schema_validation", "violations": [{ "field", "message" }], "role": null, "schemaVersion": null, "workflowType" }` | The config declares `input_schema` and `data` violates it |
|
|
244
247
|
|
|
245
248
|
**Authorization:**
|
|
246
249
|
|
|
247
250
|
When `invocation_roles` is empty, any authenticated user can invoke. When set, the user must hold at least one of the listed roles (checked against `lt_user_roles` via the user's `external_id`). Superadmins bypass this check.
|
|
248
251
|
|
|
252
|
+
### List the caller's invokable workflows
|
|
253
|
+
|
|
254
|
+
```
|
|
255
|
+
GET /api/workflows/invocable
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
Every workflow the calling user may invoke, decided by the same predicate the invoke gate runs. Superadmins and `admin`/`admin` also receive active durable workers that carry no registration row.
|
|
259
|
+
|
|
260
|
+
**Response 200:**
|
|
261
|
+
|
|
262
|
+
```json
|
|
263
|
+
{
|
|
264
|
+
"workflows": [
|
|
265
|
+
{ "workflow_type": "fleetTools", "task_queue": "long-tail-examples", "tier": "registered", "invocable": true, "invocation_roles": ["printer-fleet"], "input_schema": { "...": "..." }, "envelope_schema": { "data": {}, "metadata": { "source": "dashboard" } }, "description": "..." }
|
|
266
|
+
]
|
|
267
|
+
}
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
Each entry is the full config row plus `tier` (`durable`, `registered`, `certified`). The dashboard Invoke Tool page and its nav entry read this list.
|
|
271
|
+
|
|
249
272
|
---
|
|
250
273
|
|
|
251
274
|
## Observation
|
|
@@ -632,6 +655,7 @@ Interrupt a running workflow. The workflow is immediately terminated.
|
|
|
632
655
|
| `GET` | `/workers` | any | List active in-memory workers with registration status |
|
|
633
656
|
| `GET` | `/discovered` | any | Unified list of workers, entities, and configs |
|
|
634
657
|
| `GET` | `/cron/status` | any | List cron-configured workflows and active status |
|
|
658
|
+
| `GET` | `/invocable` | any | The caller's invokable workflows with tier |
|
|
635
659
|
| `GET` | `/config` | any | List all workflow configurations |
|
|
636
660
|
| `GET` | `/:type/config` | any | Get a single workflow configuration |
|
|
637
661
|
| `PUT` | `/:type/config` | admin | Create or replace a workflow configuration |
|
|
@@ -57,7 +57,7 @@ The domain dictionary's override lives beside its path:
|
|
|
57
57
|
|
|
58
58
|
| Surface | Declared via | Code-owned apply writes | Left alone (runtime state) |
|
|
59
59
|
|---|---|---|---|
|
|
60
|
-
| Workflow profiles | `workers[].config` | full profile incl. role lists (replace semantics) | task history, escalations |
|
|
60
|
+
| Workflow profiles | `workers[].config` | full profile incl. role lists and `input_schema` (replace semantics) | task history, escalations |
|
|
61
61
|
| Roles | `roles[]` | declared fields only (PATCH); escalation targets replace | membership, undeclared fields |
|
|
62
62
|
| Topics | `topics[]` | whole catalog entry (`managed: true`) | `last_seen_at` |
|
|
63
63
|
| MCP servers | `mcp.serverFactories[].config` | description, tags, category, compile hints, credential providers | tool manifest, connection status |
|
package/docs/dashboard.md
CHANGED
|
@@ -32,7 +32,7 @@ Each flavor exposes the same shape: configure, invoke, executions.
|
|
|
32
32
|
| Page | Route | Purpose |
|
|
33
33
|
|------|-------|---------|
|
|
34
34
|
| **Procedural → Registry** | `/workflows/registry` | All discovered workflows with tier, queue, and access columns. Configure, certify, or invoke from here. |
|
|
35
|
-
| **Procedural → Invoke** | `/workflows/durable/invoke` | Start
|
|
35
|
+
| **Procedural → Invoke Tool** | `/workflows/durable/invoke` | Start a tool the caller may invoke. Grouped list beside the form; rich x-lt-* forms when a workflow declares `inputSchema`. Builders reach it under Orchestrate, everyone else under Tools. |
|
|
36
36
|
| **Procedural → Executions** | `/workflows/executions` | All procedural runs with status, duration, and tier. Click through to task records and escalation history. |
|
|
37
37
|
| **Graph → Configure** | `/mcp/workflows` | Graph workflows available to the orchestrator — compiled deterministic YAML DAGs, grouped by namespace. |
|
|
38
38
|
| **Graph → Invoke** | `/mcp/workflows/invoke` | Start any active graph flow. Same two-panel layout as procedural invoke. |
|
|
@@ -65,6 +65,8 @@ The LLM authoring add-on. Appears when an Anthropic key is configured.
|
|
|
65
65
|
|
|
66
66
|
### Infrastructure
|
|
67
67
|
|
|
68
|
+
Builder-only and off by default. A superadmin or engineer opts in per browser with the **Infrastructure** toggle in the easter-egg Features panel (Ctrl or Cmd click the logo); the section then joins the sidebar. The pages themselves stay reachable by URL under the builder guard.
|
|
69
|
+
|
|
68
70
|
Builder-only.
|
|
69
71
|
|
|
70
72
|
| Page | Route | Purpose |
|
|
@@ -78,7 +80,7 @@ Builder-only.
|
|
|
78
80
|
The top navigation bar contains:
|
|
79
81
|
|
|
80
82
|
- **Home logo** — links to the home page (`/`), Recent Activity.
|
|
81
|
-
- **Search bar** —
|
|
83
|
+
- **Search and run bar** — one input, two verbs: find an escalation by id, workflow, or a configured facet, or run a scan rule against a typed target. Search is opt-in via `search` in `start()` config or `LT_SEARCH_BAR`; run modes ride `features.scanCodes`. See [Search and run](#search-and-run).
|
|
82
84
|
- **all** — links to `/escalations/available` with a live count of unclaimed escalations.
|
|
83
85
|
- **mine** — links to `/escalations/queue` with a live count of escalations assigned to you.
|
|
84
86
|
- **scan** (Barcode icon) — opens the scan panel for manual code entry and capture settings, shown when `features.scanCodes` stands. See [Scan Codes](#scan-codes).
|
|
@@ -117,26 +119,34 @@ workers: [
|
|
|
117
119
|
certified: true,
|
|
118
120
|
roles: ['reviewer', 'admin'],
|
|
119
121
|
envelopeSchema: { data: { field1: '', field2: 0 } },
|
|
122
|
+
inputSchema: MY_INPUT_FORM, // x-lt-* form for the Invoke Tool page; see Invoke forms
|
|
120
123
|
resolverSchema: { approved: true, notes: '' }, // deprecated legacy fallback — the escalation form is owned by the target role as a versioned form_schema
|
|
121
124
|
},
|
|
122
125
|
},
|
|
123
126
|
]
|
|
124
127
|
```
|
|
125
128
|
|
|
129
|
+
The detail page has three columns. **Identity** carries the type, an **Icon** picker with a filter over the curated `WORKFLOW_ICONS` set (the chosen glyph leads the workflow's row and heading on the Invoke Tool page in place of the tier glyph), the description, and the queue. **Invocation** edits the roles and the **Input Form**; with an input form declared, the envelope field narrows to the `metadata` stamped on every run. **Preview** renders that form live from the editor as operators will meet it, interactive so conditional sections can be walked before saving. **Unregister** sits with the header actions beside Cancel and Save. See [Invoke forms](hitl/invoke-form.md).
|
|
130
|
+
|
|
126
131
|
**API:** `GET /api/workflows/discovered` returns the unified list. `PUT /api/workflows/:type/config` creates or updates a config entry. `DELETE /api/workflows/:type/config` removes it.
|
|
127
132
|
|
|
128
|
-
### Invoke
|
|
133
|
+
### Invoke Tool
|
|
134
|
+
|
|
135
|
+
Accessible at `/workflows/durable/invoke` to anyone the server lists an invokable workflow for. The server decides the list with the same predicate the invoke gate runs (`invocationRoles` on each config; empty means every authenticated user; superadmin and admin see everything, including active durable workers with no registration). Builders keep **Invoke Tool** under Orchestrate; every other persona gets a **Tools** nav section with the same **Invoke Tool** entry that appears only when the list is non-empty, and the route sends a caller with nothing to invoke home.
|
|
129
136
|
|
|
130
|
-
|
|
137
|
+
Every invokable workflow is presented as a tool. The list of tools takes the left quarter of the row, grouped by task queue, with the prompt **Choose a tool to begin** until one is selected. Names read as titles (`fleetTools` shows as **Fleet Tools**, queues the same way) and each row leads with the workflow's icon, or its tier glyph when none is declared. The first row is preselected, `?type=<WorkflowType>` tracks the choice, and every choice is a history entry, so the page opens on a form and the back button retraces picks. The form fills the rest of the row, its heading and Submit staying put while the body scrolls:
|
|
131
138
|
|
|
132
|
-
- **
|
|
139
|
+
- **Heading and description** — the icon and title, with the identifier, tier, and queue as metadata, then the config's one-line description. Keep reference material in `x-lt-help`; it appears in the side panel on demand.
|
|
140
|
+
- **Identity summary** — who will execute: the current user, the workflow's configured `execute_as` bot ("configured default"), or, for admins and superadmins, an override chosen from the bot picker ("admin override").
|
|
133
141
|
- **Certification checkbox** — for a certified workflow, stamps `metadata.certified` on this one run.
|
|
134
|
-
- **
|
|
135
|
-
- **
|
|
142
|
+
- **The form** — a workflow that declares `inputSchema` renders the x-lt-* form: sections, two columns, conditional fields and instruction blocks, and a side panel with **Instructions** (the interpolated `x-lt-help`) and **Issues** (violations, click to focus). Every other workflow renders the envelope template form from `envelopeSchema`, with its Form and JSON views. See [Invoke forms](hitl/invoke-form.md).
|
|
143
|
+
- **Submit** — posts `{ data, metadata }` to the invoke endpoint. The page stays put, reports the started id, and subscribes to that run's `system.workflow.{id}.completed` and `.failed` events, so the outcome and the workflow's returned `data` appear beside Submit without leaving the page. One click disarms the button until the person chooses **Submit again**. While live events are off, a warning beside the button offers a reconnect, since the result could not arrive otherwise. Builders also get a **View workflow** link to its execution. A `422` from the input schema gate lands in the Issues view.
|
|
136
144
|
|
|
137
|
-
|
|
145
|
+
Below 1280px the list folds into a select and the form takes the full width.
|
|
138
146
|
|
|
139
|
-
|
|
147
|
+
Recurring (cron) execution is owned by Automations — schedule workflows from the Agents page. The graph equivalent, **Graph → Invoke** (`/mcp/workflows/invoke`), starts a compiled YAML flow.
|
|
148
|
+
|
|
149
|
+
**API:** `GET /api/workflows/invocable` backs the list and the nav. `POST /api/workflows/:type/invoke` starts a workflow (body `{ data, metadata?, execute_as? }`, returns `202` with the workflow id; `422` with the canonical validation body when `input_schema` rejects the data).
|
|
140
150
|
|
|
141
151
|
### MCP Tool Designer
|
|
142
152
|
|
|
@@ -553,15 +563,18 @@ markdown body. Each user dismisses per-browser.
|
|
|
553
563
|
Role targeting scopes display, never access: the live event reaches every
|
|
554
564
|
authenticated subscriber, so announcement bodies must never carry secrets.
|
|
555
565
|
|
|
556
|
-
###
|
|
566
|
+
### Search and run
|
|
567
|
+
|
|
568
|
+
The header bar is one input with two verbs, chosen by the type chip that
|
|
569
|
+
trails it. **Find** modes look an escalation up; **Run** modes execute a scan
|
|
570
|
+
code composed from a chosen rule plus the typed target. The bar appears when
|
|
571
|
+
either verb is enabled and offers whichever modes the deployment provides.
|
|
557
572
|
|
|
558
|
-
|
|
559
|
-
of any status. Configure it in the `start()` config —
|
|
573
|
+
**Find** is the opt-in global search. Configure it in the `start()` config —
|
|
560
574
|
`search: { enabled: true, facets: ['orderId', 'po'] }` — or by env
|
|
561
|
-
(`LT_SEARCH_BAR=true`, `LT_SEARCH_FACETS=orderId,po`; env wins). The
|
|
575
|
+
(`LT_SEARCH_BAR=true`, `LT_SEARCH_FACETS=orderId,po`; env wins). The chip
|
|
562
576
|
always offers `escalationId` and `workflowId` (long-tail-owned lookups) ahead
|
|
563
|
-
of the configured metadata facets
|
|
564
|
-
device.
|
|
577
|
+
of the configured metadata facets.
|
|
565
578
|
|
|
566
579
|
- A metadata facet lands on the escalation list filtered by that facet across
|
|
567
580
|
all statuses, newest first (the same deep link as clicking a facet value).
|
|
@@ -570,10 +583,23 @@ device.
|
|
|
570
583
|
- `workflowId` opens the workflow's single escalation, lists several to pick
|
|
571
584
|
from, or links straight to the workflow execution when none exist.
|
|
572
585
|
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
586
|
+
**Run** appears when `features.scanCodes` is on. Every enabled rule of every
|
|
587
|
+
enabled action scheme is a mode, grouped by scheme; pick one and the bar
|
|
588
|
+
shows its code head (`10:1:`) ahead of the input and names the target facet
|
|
589
|
+
in the placeholder. Type the target and press Enter: the bar composes
|
|
590
|
+
`10:1:<target>` and executes it through the same pipeline a scanner uses, so
|
|
591
|
+
the outcome navigates, confirms, or answers exactly as a physical scan would.
|
|
592
|
+
An outcome that answers in place (a fallback, a conflict, a closed row) is
|
|
593
|
+
narrated right under the bar. A whole code pasted into a Run mode executes
|
|
594
|
+
as-is; fixed-encoding rules accept digits only and say so inline. The menu
|
|
595
|
+
footer opens the scan panel for scanner settings and the barcode preview.
|
|
596
|
+
See [Scan codes](scan-codes.md).
|
|
597
|
+
|
|
598
|
+
The chip remembers the last-used mode per device. Kiosk sessions see the bar
|
|
599
|
+
too — a station can dump a PO or order id and jump straight to it, or run a
|
|
600
|
+
rule against a serial it can read but not scan; RBAC bounds what any search or
|
|
601
|
+
run can reach. See [Faceted Routing](faceted-routing.md) — a search is a
|
|
602
|
+
one-gesture facet deep link.
|
|
577
603
|
|
|
578
604
|
### Inbox
|
|
579
605
|
|
package/docs/events.md
CHANGED
|
@@ -30,6 +30,8 @@ await start({
|
|
|
30
30
|
|
|
31
31
|
The dashboard auto-detects its event transport via `GET /api/settings`. By default, Socket.IO is reported — it works in-process with no additional infrastructure.
|
|
32
32
|
|
|
33
|
+
The connection follows the session. It opens the moment a login lands, whether the person signed in with credentials or arrived through the host's SSO exchange, closes on logout, and presents the token current at each reconnect, so a refreshed token never strands the socket. The footer's event indicator turns green while connected and amber while not; clicking it while amber reloads the page.
|
|
34
|
+
|
|
33
35
|
For multi-container deployments where the API and workers run as separate processes, set `EVENT_TRANSPORT=nats` to tell the dashboard to connect via NATS WebSocket instead of Socket.IO:
|
|
34
36
|
|
|
35
37
|
```yaml
|
|
@@ -69,7 +71,7 @@ System families declare the fields they populate. Which fields exist is a functi
|
|
|
69
71
|
|
|
70
72
|
| Family | Subject | Adds |
|
|
71
73
|
|---|---|---|
|
|
72
|
-
| workflow | `system.workflow.{id}.{started\|completed\|failed}` | `workflowId`, `workflowName`, `taskQueue`, `status` |
|
|
74
|
+
| workflow | `system.workflow.{id}.{started\|completed\|failed}` | `workflowId`, `workflowName`, `taskQueue`, `status`; `completed` carries the workflow's returned `data` |
|
|
73
75
|
| task | `system.task.{taskId}.{created\|started\|completed\|escalated\|failed}` | + `taskId` |
|
|
74
76
|
| escalation | `system.escalation.{role}.{id}.{created\|resolved\|claimed\|released\|cancelled\|reassigned\|expired}` | `escalationId`, `role` (+ workflow context), `status` |
|
|
75
77
|
| activity | `system.activity.{wfId}.{activity}.{started\|completed\|failed}` | `activityName` (+ workflow context) |
|
package/docs/faceted-routing.md
CHANGED
|
@@ -125,7 +125,7 @@ A bound link variable also **scopes the Pace Board** — the same device value
|
|
|
125
125
|
narrows the board's station counts, time-in-state mix, and entity timelines,
|
|
126
126
|
not just the pins. See [Operations — Scoping the board](operations.md#scoping-the-board).
|
|
127
127
|
|
|
128
|
-
The dashboard's [global search bar](dashboard.md#
|
|
128
|
+
The dashboard's [global search bar](dashboard.md#search-and-run) is the
|
|
129
129
|
one-gesture sibling of this surface: a configured facet name plus a value
|
|
130
130
|
lands on the same all-status faceted list a deep link produces.
|
|
131
131
|
|
package/docs/hitl/iframe.md
CHANGED
|
@@ -20,21 +20,47 @@ When `x-lt-viewport` is present, the dashboard renders an iframe instead of the
|
|
|
20
20
|
|
|
21
21
|
---
|
|
22
22
|
|
|
23
|
+
## Stage URLs
|
|
24
|
+
|
|
25
|
+
`src` is the editor: it renders full-bleed once the viewer holds the claim. Two optional URLs show the embedded app at the other stages of the item's life, inside the standard page with its title and action bar:
|
|
26
|
+
|
|
27
|
+
```json
|
|
28
|
+
{
|
|
29
|
+
"x-lt-viewport": {
|
|
30
|
+
"type": "iframe",
|
|
31
|
+
"src": "https://your-app.example.com/design?workbenchId={workbenchId}",
|
|
32
|
+
"onPending": "https://your-app.example.com/preview?workbenchId={workbenchId}",
|
|
33
|
+
"onResolved": "https://your-app.example.com/summary?stl={stl_url}"
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
| Stage | When | URL | The embed |
|
|
39
|
+
|-------|------|-----|-----------|
|
|
40
|
+
| `pending` | Pending and not workable by the viewer: available, or claimed by someone else | `onPending` | Shows; the action bar carries Claim |
|
|
41
|
+
| `claimed` | Pending and workable by the viewer | `src` | Works; `lt:submit` resolves |
|
|
42
|
+
| `resolved` | Resolved | `onResolved` | Shows the outcome |
|
|
43
|
+
|
|
44
|
+
Pending and resolved embeds are read-only: the parent drops `lt:submit` and `lt:escalate` from them and never sends `lt:validate`. Every `lt:init` carries `stage`, so one app can serve all three URLs and branch on it. Leave a stage URL out to keep the default surface — the claim affordance while pending, the submitted values once resolved. A cancelled item always renders the default surface.
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
23
48
|
## URL Token Substitution
|
|
24
49
|
|
|
25
|
-
|
|
50
|
+
Every stage URL supports `{key}` tokens — single-brace, flat key lookup. The dashboard expands them at render time using values merged from four sources, in priority order:
|
|
26
51
|
|
|
27
52
|
| Priority | Source | Field |
|
|
28
53
|
|----------|--------|-------|
|
|
29
|
-
| 1 (highest) | `
|
|
30
|
-
| 2 | `
|
|
31
|
-
| 3
|
|
54
|
+
| 1 (highest) | `resolver_payload` | The submitted resolution — populated once resolved, so `onResolved` can point at the outcome |
|
|
55
|
+
| 2 | `escalation_payload` | Per-escalation context set by the workflow |
|
|
56
|
+
| 3 | `envelope` | Input envelope set by the workflow |
|
|
57
|
+
| 4 (lowest) | `metadata` | Row metadata |
|
|
32
58
|
|
|
33
59
|
Keys present in multiple sources resolve from the highest-priority one. A key with no match is left as `{key}` in the final URL.
|
|
34
60
|
|
|
35
61
|
### Example — CAD designer workbench
|
|
36
62
|
|
|
37
|
-
The `cad-designer` role embeds a WebGL editor. Each escalation carries `workbenchId` and `companyId` in its payload; the dashboard injects them into
|
|
63
|
+
The `cad-designer` role embeds a WebGL editor at `/design` while claimed and its QC view at `/qc` before the claim and after the resolve. Each escalation carries `workbenchId` and `companyId` in its payload; the dashboard injects them into every stage URL at render time:
|
|
38
64
|
|
|
39
65
|
```typescript
|
|
40
66
|
// Form schema on the role
|
|
@@ -42,6 +68,8 @@ const WORKBENCH_FORM_SCHEMA = {
|
|
|
42
68
|
'x-lt-viewport': {
|
|
43
69
|
type: 'iframe',
|
|
44
70
|
src: `${BASE_URL}/design?workbenchId={workbenchId}&companyId={companyId}`,
|
|
71
|
+
onPending: `${BASE_URL}/qc?workbenchId={workbenchId}&companyId={companyId}`,
|
|
72
|
+
onResolved: `${BASE_URL}/qc?workbenchId={workbenchId}&companyId={companyId}`,
|
|
45
73
|
},
|
|
46
74
|
properties: {
|
|
47
75
|
stl_url: {
|
|
@@ -68,7 +96,7 @@ At render time the dashboard produces:
|
|
|
68
96
|
https://editor.internal/design?workbenchId=wb-123&companyId=co-456
|
|
69
97
|
```
|
|
70
98
|
|
|
71
|
-
`{workbenchId}` and `{companyId}` are resolved from `escalation_payload`, which
|
|
99
|
+
`{workbenchId}` and `{companyId}` are resolved from `escalation_payload`, which outranks `envelope` and `metadata` — so even if the same keys appear there, the payload values win.
|
|
72
100
|
|
|
73
101
|
### Common token patterns
|
|
74
102
|
|
|
@@ -104,6 +132,7 @@ Communication happens via `window.postMessage`.
|
|
|
104
132
|
workflow_type: string | null,
|
|
105
133
|
},
|
|
106
134
|
schema: Record<string, unknown>, // The full form schema
|
|
135
|
+
stage: 'pending' | 'claimed' | 'resolved', // Which stage URL this embed serves
|
|
107
136
|
}
|
|
108
137
|
|
|
109
138
|
// Optional: parent requests the iframe to submit
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# Invoke Forms
|
|
2
|
+
|
|
3
|
+
A workflow's invoke form can be the same rich, versioned form the escalation surfaces use. Declare `inputSchema` on the worker config and the Invoke Tool page renders it with the full [x-lt-* vocabulary](../hitl-guide.md#full-vocabulary-quick-reference): two-column layout, sections, column groups, conditional display, instruction blocks, dynamic options, and a help panel. The submitted `data` is the x-lt-bind mapped payload, and the invoke API validates it against the same schema with the same shared pass, so a payload the form accepts is accepted by the API, and a rejection lists the exact violations the form shows.
|
|
4
|
+
|
|
5
|
+
Without `inputSchema`, the page renders the envelope template form from `envelopeSchema` exactly as before. Nothing changes for existing deployments until a workflow opts in.
|
|
6
|
+
|
|
7
|
+
## Declaring the form
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
const fleetToolsConfig: LTWorkerConfig = {
|
|
11
|
+
description: '**Fleet tools** — one form, four tools for one machine.',
|
|
12
|
+
invocable: true,
|
|
13
|
+
invocationRoles: ['printer-fleet', 'print-servicer'],
|
|
14
|
+
envelopeSchema: { data: {}, metadata: { source: 'dashboard' } },
|
|
15
|
+
inputSchema: FLEET_TOOLS_INPUT_SCHEMA,
|
|
16
|
+
icon: WORKFLOW_ICONS.WRENCH,
|
|
17
|
+
};
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Workflow names read as titles on the page: `fleetTools` shows as **Fleet Tools**, and queue names the same way, with the identifiers kept as metadata beside them.
|
|
21
|
+
|
|
22
|
+
| Field | Role in the invoke |
|
|
23
|
+
|---|---|
|
|
24
|
+
| `inputSchema` | The form. JSON Schema `properties` plus x-lt-* tokens. Rendered by the Invoke Tool page; enforced by the invoke API. |
|
|
25
|
+
| `envelopeSchema.metadata` | The `metadata` stamped on every run from this form. `envelopeSchema.data` is ignored when `inputSchema` is present. |
|
|
26
|
+
| `invocationRoles` | Who sees the workflow on the Invoke Tool page and who may start it. Empty means every authenticated user. |
|
|
27
|
+
| `description` | One line at the top of the form column, markdown allowed. Keep the reference material in `x-lt-help`, which appears in the side panel on demand. |
|
|
28
|
+
| `icon` | A curated icon from `WORKFLOW_ICONS` (`icon: WORKFLOW_ICONS.WRENCH`). Leads the workflow's row and heading in place of the tier glyph so operators tell tools apart at a glance. The registry offers the same set as a picker. |
|
|
29
|
+
|
|
30
|
+
The registry detail page edits the same schema under **Input Form** in its Invocation column, beside a live preview of the form, and the registration wizard offers the field for new entries. The reference is [`examples/workflows/fleet-tools/forms.ts`](../../examples/workflows/fleet-tools/forms.ts): a `serialNumber` and an `action` decision, then one section per action that appears only when that action is chosen, each carrying its own knobs and its own instruction block.
|
|
31
|
+
|
|
32
|
+
## Form values, payload, and domains
|
|
33
|
+
|
|
34
|
+
The form edits flat values keyed by property name. On submit, `x-lt-bind` maps them into the nested `data` the workflow receives:
|
|
35
|
+
|
|
36
|
+
```jsonc
|
|
37
|
+
// properties
|
|
38
|
+
"serialNumber": { "x-lt-bind": "printer.serialNumber" },
|
|
39
|
+
"action": { "x-lt-bind": "tool.action" },
|
|
40
|
+
"copies": { "x-lt-bind": "tool.details.copies", "x-lt-showIf": "input.action=reprint-label" }
|
|
41
|
+
|
|
42
|
+
// POST /api/workflows/fleetTools/invoke
|
|
43
|
+
{ "data": { "printer": { "serialNumber": "printer-07" }, "tool": { "action": "reprint-label", "details": { "copies": 2 } } },
|
|
44
|
+
"metadata": { "source": "dashboard" } }
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Conditions and help tokens read the live form under the `input` domain: `x-lt-showIf: "input.action=retire"`, `{{input.serialNumber}}`. `resolver` names the same values, so a schema written for an escalation form works unchanged. The only other domain an invoke form can read is `metadata`, the envelope metadata declared above.
|
|
48
|
+
|
|
49
|
+
Hidden conditional fields still submit their defaults, as on every x-lt-* form. Treat empty as absent in the workflow.
|
|
50
|
+
|
|
51
|
+
## Conditional instructions
|
|
52
|
+
|
|
53
|
+
An instruction is a read-only markdown field. Give it the same `x-lt-showIf` as the knobs it explains and it arrives with them:
|
|
54
|
+
|
|
55
|
+
```jsonc
|
|
56
|
+
"powerCycleFirst": {
|
|
57
|
+
"type": "string",
|
|
58
|
+
"x-lt-widget": "markdown",
|
|
59
|
+
"readOnly": true,
|
|
60
|
+
"default": "**Power cycle first.** Most stalls clear on a restart.",
|
|
61
|
+
"x-lt-section": "Report the machine offline",
|
|
62
|
+
"x-lt-showIf": ["input.action=report-offline", "!input.powerCycled"]
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
An array of conditions requires every one, so the prompt belongs to its tool and still reacts to the checkbox.
|
|
67
|
+
|
|
68
|
+
`x-lt-help` on the schema root is the longer reference for the side panel: markdown, tables, and `{{input.*}}` tokens that re-interpolate as the operator types.
|
|
69
|
+
|
|
70
|
+
## The Invoke Tool page
|
|
71
|
+
|
|
72
|
+
The page is open to anyone the server lists an invokable workflow for. Builders reach **Invoke Tool** under Orchestrate; every other persona gets a **Tools** section in the nav that appears only when there is something to invoke. Each invokable workflow is a tool; the list sits on the left, grouped by task queue, with the first workflow preselected; the form takes the rest of the row. Below 1280px the list folds into a select and the form takes the full width.
|
|
73
|
+
|
|
74
|
+
The form's side panel carries two views: **Instructions**, the interpolated `x-lt-help`, and **Issues**, the current violations, each click focusing its field. A server rejection lands in the same Issues view.
|
|
75
|
+
|
|
76
|
+
Once a run starts, the page subscribes to `system.workflow.{workflowId}.completed` and `.failed` for that id. The outcome and the workflow's returned `data` render beside Submit, so a tool's answer comes back to the person who asked for it. Submit disarms after one click until the person chooses to submit again, and a warning offers to reconnect live events when they are off.
|
|
77
|
+
|
|
78
|
+
## The server contract
|
|
79
|
+
|
|
80
|
+
`POST /api/workflows/:type/invoke` validates `data` against `input_schema` after the role check and before anything starts. A rejection is the canonical 422 body used by every schema gate:
|
|
81
|
+
|
|
82
|
+
```json
|
|
83
|
+
{
|
|
84
|
+
"error": "data failed input schema validation (2 violations)",
|
|
85
|
+
"code": "schema_validation",
|
|
86
|
+
"violations": [
|
|
87
|
+
{ "field": "serialNumber", "message": "Required" },
|
|
88
|
+
{ "field": "action", "message": "Required" }
|
|
89
|
+
],
|
|
90
|
+
"role": null,
|
|
91
|
+
"schemaVersion": null,
|
|
92
|
+
"workflowType": "fleetTools"
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
The MCP tools `invoke_workflow` and `invoke_workflow_read_safe` run the same gate and return the body as an error result. The gate reads bound paths from the nested `data`, skips fields a `x-lt-showIf` hides, and applies every validation keyword the form applies.
|
|
97
|
+
|
|
98
|
+
`GET /api/workflows/invocable` returns the caller's invokable workflows with their tier. The list and the gate share one predicate, so the page never offers a workflow the API would refuse.
|
|
@@ -21,6 +21,16 @@ Compare the resolved value's string form against a literal:
|
|
|
21
21
|
|
|
22
22
|
The expected value is the raw remainder after the operator (trimmed; no quoting). Numbers and booleans compare via their string form (`metadata.count=3`, `metadata.live=true`). An absent value compares as the empty string — so `=X` is false and `!=X` is true when the path is missing. `resolver.` conditions react live as the user edits, exactly like the truthy form — this is what drives per-designation sub-surfaces on verdict forms (different fields for send-to-design vs send-to-printing).
|
|
23
23
|
|
|
24
|
+
### Several conditions
|
|
25
|
+
|
|
26
|
+
Pass an array to require every condition. The field shows only when all hold:
|
|
27
|
+
|
|
28
|
+
```json
|
|
29
|
+
"x-lt-showIf": ["input.action=report-offline", "!input.powerCycled"]
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Each entry uses the same grammar as a single condition. A hidden field is skipped by validation exactly as with one condition.
|
|
33
|
+
|
|
24
34
|
### Domains
|
|
25
35
|
|
|
26
36
|
| Domain | Resolves against |
|
|
@@ -30,6 +40,7 @@ The expected value is the raw remainder after the operator (trimmed; no quoting)
|
|
|
30
40
|
| `envelope` | The workflow-sent input envelope |
|
|
31
41
|
| `escalation` | Top-level escalation row fields (`role`, `status`, `priority`, …) |
|
|
32
42
|
| `resolver` | The submitted resolver payload — **live**: reacts in real time as the user edits the form |
|
|
43
|
+
| `input` | The same live form values under the invoke form's name (see [invoke-form.md](invoke-form.md)) |
|
|
33
44
|
|
|
34
45
|
Conditions based on `metadata`, `payload`, `envelope`, and `escalation` are static (read from the stored row). Conditions based on `resolver` are dynamic — the field appears or disappears immediately as the user edits a sibling field, without a page reload.
|
|
35
46
|
|
package/docs/hitl-guide.md
CHANGED
|
@@ -24,6 +24,7 @@ This works because the form is data: a JSON Schema stored on the role, versioned
|
|
|
24
24
|
| Rename the resolve footer, or claim-and-submit in one gesture | Footer tokens | [x-lt-footer.md](hitl/x-lt-footer.md) |
|
|
25
25
|
| Block the resolve until embedded work drains, then auto-close when it does | `x-lt-submit-guard` | [x-lt-embed.md](hitl/x-lt-embed.md) |
|
|
26
26
|
| A fully custom UI nothing above can express | Iframe viewport | [iframe.md](hitl/iframe.md) |
|
|
27
|
+
| The same rich form for starting a workflow from the Invoke Tool page | `inputSchema` on the worker config | [invoke-form.md](hitl/invoke-form.md) |
|
|
27
28
|
|
|
28
29
|
---
|
|
29
30
|
|
|
@@ -103,6 +104,7 @@ Ordered as a learning path — each file adds one capability to the same form:
|
|
|
103
104
|
|
|
104
105
|
| Keyword | Level | Purpose |
|
|
105
106
|
|---------|-------|---------|
|
|
107
|
+
| `input.*` | domain | The live form values on the Invoke surface (alias of `resolver.*`) for `x-lt-showIf`, `x-lt-help`, and `x-lt-options` |
|
|
106
108
|
| `x-lt-widget` | field | Rich control: `file-upload`, `code-editor`, `signature`, `rich-text`, `markdown`, `checklist`, `attachment` (alias `image`) |
|
|
107
109
|
| `x-lt-source` | field | Data path for context-driven widgets: `"domain.path"` or an ordered array of paths (first to resolve wins); may embed `{{domain.path}}` interpolation segments |
|
|
108
110
|
| `x-lt-require-all` | field | Checklist completion guard — every item must be checked, except items declared `required: false` |
|
|
@@ -113,7 +115,7 @@ Ordered as a learning path — each file adds one capability to the same form:
|
|
|
113
115
|
| `accept` | field | File-type filter for `file-upload` (e.g. `".pdf,.png"`) |
|
|
114
116
|
| `x-lt-bind` | field | Path in the resolver payload (e.g. `"customer.email"`) |
|
|
115
117
|
| `x-lt-span` | field | Column span in a `two-column` layout (`2` = full width) |
|
|
116
|
-
| `x-lt-showIf` | field | Show field when a value is truthy at `domain.path`; prefix `!` to invert; `=VALUE` / `!=VALUE` compare the string form |
|
|
118
|
+
| `x-lt-showIf` | field | Show field when a value is truthy at `domain.path`; prefix `!` to invert; `=VALUE` / `!=VALUE` compare the string form; an array requires every condition |
|
|
117
119
|
| `x-lt-hide-if-empty` | field | `true` — suppress the field when its value is null, `""`, `false`, or `0` |
|
|
118
120
|
| `x-lt-section` | field | Section group label |
|
|
119
121
|
| `x-lt-options` | field | Dynamic select options — resolves a `"domain.path"` (or an ordered array of paths, first to resolve wins) to the field's option list (scalars or `{ value, label }`); static `enum` wins; `{{domain.path}}` segments make cascading selects |
|
|
@@ -128,7 +130,7 @@ Ordered as a learning path — each file adds one capability to the same form:
|
|
|
128
130
|
| `x-lt-card` | schema (list) | `facet-board`: per-entity card — `{ title, state?, fields? }`; fields accept `format: "age"` |
|
|
129
131
|
| `x-lt-help` | schema | Markdown guidance for the side panel's Help view |
|
|
130
132
|
| `x-lt-context` | schema | Plain-text fallback for the Help view when `x-lt-help` is absent |
|
|
131
|
-
| `x-lt-viewport` | schema | Replace the generated form with a custom iframe UI |
|
|
133
|
+
| `x-lt-viewport` | schema | Replace the generated form with a custom iframe UI; `src` is the editor, `onPending` / `onResolved` show the embed at the other stages |
|
|
132
134
|
| `x-lt-submit-guard` | schema | Block the resolve while an embedded escalation query returns rows; `autoResolveWhenEmpty` auto-closes the claimed parent once it drains. Enforced isomorphically for `enforce_schema` roles |
|
|
133
135
|
| `x-lt-submit-on-claim` | schema | Claiming also resolves the form's seeded defaults in one gesture |
|
|
134
136
|
| `x-lt-labels` | schema | Per-target labels for the footer controls (`claim`, `cancel`, `submit`, `release`) |
|
package/docs/iam.md
CHANGED
|
@@ -259,7 +259,7 @@ The dashboard surfaces IAM across four pages:
|
|
|
259
259
|
|
|
260
260
|
**Accounts** (`/admin/users`) — unified management for User Accounts and Service Accounts via tab toggle. Create service accounts, assign roles, generate API keys. The key generation flow displays the raw key once; it cannot be retrieved after dismissal.
|
|
261
261
|
|
|
262
|
-
**Invoke
|
|
262
|
+
**Invoke Tool** (`/workflows/start`) — all invocable workflows in a single list with visual tier distinction. Certified workflows show the green shield; durable workflows show the standard icon. Both support Start Now and Schedule (cron).
|
|
263
263
|
|
|
264
264
|
**Connections** (`/credentials`) — each user manages their OAuth provider connections. Status, credential type, and expiry are visible. Users connect or revoke providers here.
|
|
265
265
|
|