@hotmeshio/long-tail 0.16.1 → 0.16.4
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/exports.d.ts +15 -0
- package/build/api/exports.js +35 -0
- package/build/bin/ltc.js +4 -0
- package/build/lib/cli/commands/workflows.d.ts +3 -0
- package/build/lib/cli/commands/workflows.js +22 -0
- package/build/routes/exports.js +11 -0
- package/build/sdk/index.d.ts +1 -0
- package/build/sdk/index.js +1 -0
- package/build/services/export/index.d.ts +19 -0
- package/build/services/export/index.js +53 -33
- package/build/shared/form-validation/field-validator.d.ts +20 -6
- package/build/shared/form-validation/field-validator.js +50 -15
- package/build/shared/form-validation/x-lt-options.js +35 -21
- package/build/system/mcp-servers/admin/exports.js +15 -0
- package/build/system/mcp-servers/admin/schemas.d.ts +7 -0
- package/build/system/mcp-servers/admin/schemas.js +5 -2
- package/build/system/seed/tool-manifests-admin.js +1 -0
- package/dashboard/dist/assets/{AdminDashboard-Dnj4asuh.js → AdminDashboard-Csq-oxmY.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-Dnj4asuh.js.map → AdminDashboard-Csq-oxmY.js.map} +1 -1
- package/dashboard/dist/assets/{AgentConfigPage-CS0CezLt.js → AgentConfigPage-Bnr5zbyJ.js} +2 -2
- package/dashboard/dist/assets/{AgentConfigPage-CS0CezLt.js.map → AgentConfigPage-Bnr5zbyJ.js.map} +1 -1
- package/dashboard/dist/assets/{AgentDetailPage-CG0HO-MG.js → AgentDetailPage-DgRu-Fhg.js} +2 -2
- package/dashboard/dist/assets/{AgentDetailPage-CG0HO-MG.js.map → AgentDetailPage-DgRu-Fhg.js.map} +1 -1
- package/dashboard/dist/assets/{AgentsPage-cLZPda64.js → AgentsPage-BuyXKkP3.js} +2 -2
- package/dashboard/dist/assets/{AgentsPage-cLZPda64.js.map → AgentsPage-BuyXKkP3.js.map} +1 -1
- package/dashboard/dist/assets/{AvailableEscalationsPage-Dv5GE_NU.js → AvailableEscalationsPage-BIzTjUMG.js} +2 -2
- package/dashboard/dist/assets/{AvailableEscalationsPage-Dv5GE_NU.js.map → AvailableEscalationsPage-BIzTjUMG.js.map} +1 -1
- package/dashboard/dist/assets/{BotPicker-BgXaJfUZ.js → BotPicker-xpPjRnkf.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-BgXaJfUZ.js.map → BotPicker-xpPjRnkf.js.map} +1 -1
- package/dashboard/dist/assets/{BulkAssignModal-BUfV9aba.js → BulkAssignModal-CQ3k-7rO.js} +2 -2
- package/dashboard/dist/assets/{BulkAssignModal-BUfV9aba.js.map → BulkAssignModal-CQ3k-7rO.js.map} +1 -1
- package/dashboard/dist/assets/{CapabilitiesPage-CaiDhtmq.js → CapabilitiesPage-DCkEJ0In.js} +2 -2
- package/dashboard/dist/assets/{CapabilitiesPage-CaiDhtmq.js.map → CapabilitiesPage-DCkEJ0In.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-C6R7Lhao.js → CollapsibleSection-10sJSNNF.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-C6R7Lhao.js.map → CollapsibleSection-10sJSNNF.js.map} +1 -1
- package/dashboard/dist/assets/{CountdownTimer-CFR2pPT9.js → CountdownTimer-BFy9Joxb.js} +2 -2
- package/dashboard/dist/assets/{CountdownTimer-CFR2pPT9.js.map → CountdownTimer-BFy9Joxb.js.map} +1 -1
- package/dashboard/dist/assets/{CredentialsPage-9d2xZhfU.js → CredentialsPage-DIR-fUoF.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-9d2xZhfU.js.map → CredentialsPage-DIR-fUoF.js.map} +1 -1
- package/dashboard/dist/assets/{CronLabel-BfIYBjTD.js → CronLabel-C66ASvgE.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-BfIYBjTD.js.map → CronLabel-C66ASvgE.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-DV-35FDF.js → ElapsedCell-RWvrCHn7.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-DV-35FDF.js.map → ElapsedCell-RWvrCHn7.js.map} +1 -1
- package/dashboard/dist/assets/{EntityTimelinePanel-mHaN_i7a.js → EntityTimelinePanel-CNaYs3nA.js} +2 -2
- package/dashboard/dist/assets/{EntityTimelinePanel-mHaN_i7a.js.map → EntityTimelinePanel-CNaYs3nA.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationListSchemaPage-Km5jnrIW.js → EscalationListSchemaPage-BsRQtDDc.js} +2 -2
- package/dashboard/dist/assets/{EscalationListSchemaPage-Km5jnrIW.js.map → EscalationListSchemaPage-BsRQtDDc.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationSchemaPage-CAJGIBv2.js → EscalationSchemaPage-BMYQmwGA.js} +2 -2
- package/dashboard/dist/assets/{EscalationSchemaPage-CAJGIBv2.js.map → EscalationSchemaPage-BMYQmwGA.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-nk9FXKmv.js → EscalationsOverview-yv4Yn6zl.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-nk9FXKmv.js.map → EscalationsOverview-yv4Yn6zl.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-DNRaYzTn.js → EventTable-ebZK7vXl.js} +2 -2
- package/dashboard/dist/assets/{EventTable-DNRaYzTn.js.map → EventTable-ebZK7vXl.js.map} +1 -1
- package/dashboard/dist/assets/{FilterBar-CmRA_E6x.js → FilterBar-D6JDMSHi.js} +2 -2
- package/dashboard/dist/assets/{FilterBar-CmRA_E6x.js.map → FilterBar-D6JDMSHi.js.map} +1 -1
- package/dashboard/dist/assets/{GraphInvokePage-HJfa82kv.js → GraphInvokePage-BFntNMop.js} +2 -2
- package/dashboard/dist/assets/{GraphInvokePage-HJfa82kv.js.map → GraphInvokePage-BFntNMop.js.map} +1 -1
- package/dashboard/dist/assets/{HomePage-B2JDwmmh.js → HomePage-B24GH9Ga.js} +2 -2
- package/dashboard/dist/assets/{HomePage-B2JDwmmh.js.map → HomePage-B24GH9Ga.js.map} +1 -1
- package/dashboard/dist/assets/{ListToolbar-CKuJ7HUH.js → ListToolbar-DlGreUpP.js} +2 -2
- package/dashboard/dist/assets/{ListToolbar-CKuJ7HUH.js.map → ListToolbar-DlGreUpP.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-CZCzbiRs.js → McpOverview-D0G2vACW.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-CZCzbiRs.js.map → McpOverview-D0G2vACW.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryDetailPage-C081BBcH.js → McpQueryDetailPage-LZO04PEB.js} +2 -2
- package/dashboard/dist/assets/{McpQueryDetailPage-C081BBcH.js.map → McpQueryDetailPage-LZO04PEB.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryPage-841V8CXb.js → McpQueryPage-BIwSDHgB.js} +2 -2
- package/dashboard/dist/assets/{McpQueryPage-841V8CXb.js.map → McpQueryPage-BIwSDHgB.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunDetailPage-DZjlgp5W.js → McpRunDetailPage-DjYWJLWh.js} +2 -2
- package/dashboard/dist/assets/{McpRunDetailPage-DZjlgp5W.js.map → McpRunDetailPage-DjYWJLWh.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunsPage-DW0VVd46.js → McpRunsPage-CTT7B-pf.js} +2 -2
- package/dashboard/dist/assets/{McpRunsPage-DW0VVd46.js.map → McpRunsPage-CTT7B-pf.js.map} +1 -1
- package/dashboard/dist/assets/{OperationsPage-DAw7z_Sh.js → OperationsPage-Dd0WxAwH.js} +2 -2
- package/dashboard/dist/assets/{OperationsPage-DAw7z_Sh.js.map → OperationsPage-Dd0WxAwH.js.map} +1 -1
- package/dashboard/dist/assets/{OperatorDashboard-BAnQNuD6.js → OperatorDashboard-BfKMaVzV.js} +2 -2
- package/dashboard/dist/assets/{OperatorDashboard-BAnQNuD6.js.map → OperatorDashboard-BfKMaVzV.js.map} +1 -1
- package/dashboard/dist/assets/{PersonaDetailPage-XENbpbSr.js → PersonaDetailPage-B48MX4lq.js} +2 -2
- package/dashboard/dist/assets/{PersonaDetailPage-XENbpbSr.js.map → PersonaDetailPage-B48MX4lq.js.map} +1 -1
- package/dashboard/dist/assets/{PersonasPage-CoWH5Fj8.js → PersonasPage-dGX6E96g.js} +2 -2
- package/dashboard/dist/assets/{PersonasPage-CoWH5Fj8.js.map → PersonasPage-dGX6E96g.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessDetailPage-BDxOt-9L.js → ProcessDetailPage-Co5oCg31.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-BDxOt-9L.js.map → ProcessDetailPage-Co5oCg31.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessesListPage-BuNOmgig.js → ProcessesListPage-CrB4VAS6.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-BuNOmgig.js.map → ProcessesListPage-CrB4VAS6.js.map} +1 -1
- package/dashboard/dist/assets/{RoleDetailPage-DAzkfZ4T.js → RoleDetailPage-C4UTNx0p.js} +2 -2
- package/dashboard/dist/assets/{RoleDetailPage-DAzkfZ4T.js.map → RoleDetailPage-C4UTNx0p.js.map} +1 -1
- package/dashboard/dist/assets/{RolesPage-C9jZL4aM.js → RolesPage-BXo5RirX.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-C9jZL4aM.js.map → RolesPage-BXo5RirX.js.map} +1 -1
- package/dashboard/dist/assets/{RunAsSelector-DswUl2-8.js → RunAsSelector-BRQiGv2-.js} +2 -2
- package/dashboard/dist/assets/{RunAsSelector-DswUl2-8.js.map → RunAsSelector-BRQiGv2-.js.map} +1 -1
- package/dashboard/dist/assets/{ScanCodesPage-D_FDxJgT.js → ScanCodesPage-BUT5wjzC.js} +2 -2
- package/dashboard/dist/assets/{ScanCodesPage-D_FDxJgT.js.map → ScanCodesPage-BUT5wjzC.js.map} +1 -1
- package/dashboard/dist/assets/{ScanSchemeDetailPage-Cbkpob5g.js → ScanSchemeDetailPage-CkzoOyjd.js} +2 -2
- package/dashboard/dist/assets/{ScanSchemeDetailPage-Cbkpob5g.js.map → ScanSchemeDetailPage-CkzoOyjd.js.map} +1 -1
- package/dashboard/dist/assets/{ScanStationPage-BI_cDWVp.js → ScanStationPage-DYamACNZ.js} +2 -2
- package/dashboard/dist/assets/{ScanStationPage-BI_cDWVp.js.map → ScanStationPage-DYamACNZ.js.map} +1 -1
- package/dashboard/dist/assets/{StickyPagination-CfTEnlh5.js → StickyPagination-B3yiAcrs.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-CfTEnlh5.js.map → StickyPagination-B3yiAcrs.js.map} +1 -1
- package/dashboard/dist/assets/{StreamMessageDetail-oa7Bx0lB.js → StreamMessageDetail-C56PtZSb.js} +2 -2
- package/dashboard/dist/assets/{StreamMessageDetail-oa7Bx0lB.js.map → StreamMessageDetail-C56PtZSb.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-CO96ep4N.js → SwimlaneTimeline-D64ep5KY.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-CO96ep4N.js.map → SwimlaneTimeline-D64ep5KY.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-BiO2eFQ0.js → TaskDetailPage-C2V7BcgB.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-BiO2eFQ0.js.map → TaskDetailPage-C2V7BcgB.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-DQ4WJfJo.js → TasksListPage-C4ctoAa0.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-DQ4WJfJo.js.map → TasksListPage-C4ctoAa0.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-ZwSSU_EG.js → TimeAgo-BpJ7In27.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-ZwSSU_EG.js.map → TimeAgo-BpJ7In27.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-BHmJ7das.js → TimestampCell-BKrIaU_R.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-BHmJ7das.js.map → TimestampCell-BKrIaU_R.js.map} +1 -1
- package/dashboard/dist/assets/{ToolTestPanel-DARNx6e0.js → ToolTestPanel-CdTXWPqn.js} +2 -2
- package/dashboard/dist/assets/{ToolTestPanel-DARNx6e0.js.map → ToolTestPanel-CdTXWPqn.js.map} +1 -1
- package/dashboard/dist/assets/{TopicDetailPage-BYcF0lO8.js → TopicDetailPage-B6tb1RG4.js} +2 -2
- package/dashboard/dist/assets/{TopicDetailPage-BYcF0lO8.js.map → TopicDetailPage-B6tb1RG4.js.map} +1 -1
- package/dashboard/dist/assets/{TopicsPage-CG-IZfpq.js → TopicsPage-DgdOKjwE.js} +2 -2
- package/dashboard/dist/assets/{TopicsPage-CG-IZfpq.js.map → TopicsPage-DgdOKjwE.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-BGn4sSx1.js → UserName-A-ET2GnX.js} +2 -2
- package/dashboard/dist/assets/{UserName-BGn4sSx1.js.map → UserName-A-ET2GnX.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowExecutionPage-Dt_lskas.js → WorkflowExecutionPage-CzhoRsis.js} +2 -2
- package/dashboard/dist/assets/{WorkflowExecutionPage-Dt_lskas.js.map → WorkflowExecutionPage-CzhoRsis.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsDashboard-Dl3carpF.js → WorkflowsDashboard-B_tCYLei.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsDashboard-Dl3carpF.js.map → WorkflowsDashboard-B_tCYLei.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsOverview-6CplKLvQ.js → WorkflowsOverview-B4Bh8MIo.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-6CplKLvQ.js.map → WorkflowsOverview-B4Bh8MIo.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-CZf6zZ4Q.js → YamlWorkflowDetailPage-zRrcxk0e.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-CZf6zZ4Q.js.map → YamlWorkflowDetailPage-zRrcxk0e.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowsPage-DRQ_3CZG.js → YamlWorkflowsPage-DMK3ojp3.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowsPage-DRQ_3CZG.js.map → YamlWorkflowsPage-DMK3ojp3.js.map} +1 -1
- package/dashboard/dist/assets/{agents-BvtecCN5.js → agents-B67yyE1z.js} +2 -2
- package/dashboard/dist/assets/{agents-BvtecCN5.js.map → agents-B67yyE1z.js.map} +1 -1
- package/dashboard/dist/assets/{bots-CSmIqXtL.js → bots-pSLFdOm-.js} +2 -2
- package/dashboard/dist/assets/{bots-CSmIqXtL.js.map → bots-pSLFdOm-.js.map} +1 -1
- package/dashboard/dist/assets/{capabilities-xMqvjbWI.js → capabilities-B2Dem6zw.js} +2 -2
- package/dashboard/dist/assets/{capabilities-xMqvjbWI.js.map → capabilities-B2Dem6zw.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-Bi-tz-Gr.js → controlplane-DGdaM9f3.js} +2 -2
- package/dashboard/dist/assets/{controlplane-Bi-tz-Gr.js.map → controlplane-DGdaM9f3.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-columns-DSalfPHI.js → escalation-columns-BM7vp-hY.js} +2 -2
- package/dashboard/dist/assets/{escalation-columns-DSalfPHI.js.map → escalation-columns-BM7vp-hY.js.map} +1 -1
- package/dashboard/dist/assets/{index-CEsGT3c9.js → index-5eRsj758.js} +2 -2
- package/dashboard/dist/assets/{index-CEsGT3c9.js.map → index-5eRsj758.js.map} +1 -1
- package/dashboard/dist/assets/{index-gHDAcM64.js → index-BD6nhSOu.js} +2 -2
- package/dashboard/dist/assets/{index-gHDAcM64.js.map → index-BD6nhSOu.js.map} +1 -1
- package/dashboard/dist/assets/{index-shnwALdy.js → index-Baf-tOnA.js} +2 -2
- package/dashboard/dist/assets/{index-shnwALdy.js.map → index-Baf-tOnA.js.map} +1 -1
- package/dashboard/dist/assets/{index-BjxQVsbg.js → index-Brf_fpE4.js} +2 -2
- package/dashboard/dist/assets/{index-BjxQVsbg.js.map → index-Brf_fpE4.js.map} +1 -1
- package/dashboard/dist/assets/{index-uqT6ovVQ.js → index-CGoXyPlO.js} +2 -2
- package/dashboard/dist/assets/{index-uqT6ovVQ.js.map → index-CGoXyPlO.js.map} +1 -1
- package/dashboard/dist/assets/{index-DATqc8Gv.js → index-CKt5YK2z.js} +2 -2
- package/dashboard/dist/assets/{index-DATqc8Gv.js.map → index-CKt5YK2z.js.map} +1 -1
- package/dashboard/dist/assets/index-CLq228E2.js +3 -0
- package/dashboard/dist/assets/{index-Bf9cfGX_.js.map → index-CLq228E2.js.map} +1 -1
- package/dashboard/dist/assets/{index-BIK4b7Ei.js → index-Cd2RdpOx.js} +2 -2
- package/dashboard/dist/assets/{index-BIK4b7Ei.js.map → index-Cd2RdpOx.js.map} +1 -1
- package/dashboard/dist/assets/{index-cX2H_U7R.js → index-Cn__VdSf.js} +2 -2
- package/dashboard/dist/assets/{index-cX2H_U7R.js.map → index-Cn__VdSf.js.map} +1 -1
- package/dashboard/dist/assets/{index-C8pPqnJb.js → index-CunrdEfT.js} +2 -2
- package/dashboard/dist/assets/{index-C8pPqnJb.js.map → index-CunrdEfT.js.map} +1 -1
- package/dashboard/dist/assets/{index-BWyPrDYG.js → index-DajlugVw.js} +2 -2
- package/dashboard/dist/assets/{index-BWyPrDYG.js.map → index-DajlugVw.js.map} +1 -1
- package/dashboard/dist/assets/{index-BYukuL1u.js → index-DbLOvfv5.js} +2 -2
- package/dashboard/dist/assets/{index-BYukuL1u.js.map → index-DbLOvfv5.js.map} +1 -1
- package/dashboard/dist/assets/{index-sbfCx2CF.js → index-zqoZDL5j.js} +3 -3
- package/dashboard/dist/assets/{index-sbfCx2CF.js.map → index-zqoZDL5j.js.map} +1 -1
- package/dashboard/dist/assets/{knowledge-DbDvUbq7.js → knowledge-BExXJ0Ib.js} +2 -2
- package/dashboard/dist/assets/{knowledge-DbDvUbq7.js.map → knowledge-BExXJ0Ib.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-I2OmwD8P.js → mcp-D2WA-SHc.js} +2 -2
- package/dashboard/dist/assets/{mcp-I2OmwD8P.js.map → mcp-D2WA-SHc.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-DwTp77HP.js → mcp-query-4Tsojk-z.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-DwTp77HP.js.map → mcp-query-4Tsojk-z.js.map} +1 -1
- package/dashboard/dist/assets/{personas-DDr8gQGC.js → personas-Dy_XSYfJ.js} +2 -2
- package/dashboard/dist/assets/{personas-DDr8gQGC.js.map → personas-Dy_XSYfJ.js.map} +1 -1
- package/dashboard/dist/assets/{pipelines-uptnM5Qj.js → pipelines-yDHgNtdx.js} +2 -2
- package/dashboard/dist/assets/{pipelines-uptnM5Qj.js.map → pipelines-yDHgNtdx.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-Em0f5Rsk.js → tasks-CGoPhQyw.js} +2 -2
- package/dashboard/dist/assets/{tasks-Em0f5Rsk.js.map → tasks-CGoPhQyw.js.map} +1 -1
- package/dashboard/dist/assets/{topics-B81zAt9U.js → topics-DA1MHDwJ.js} +2 -2
- package/dashboard/dist/assets/{topics-B81zAt9U.js.map → topics-DA1MHDwJ.js.map} +1 -1
- package/dashboard/dist/assets/{useEventHooks-B_Bqqzlo.js → useEventHooks-onx-Z6IY.js} +2 -2
- package/dashboard/dist/assets/{useEventHooks-B_Bqqzlo.js.map → useEventHooks-onx-Z6IY.js.map} +1 -1
- package/dashboard/dist/assets/{useNamespace-CZfue_oE.js → useNamespace-BkuU0SeK.js} +2 -2
- package/dashboard/dist/assets/{useNamespace-CZfue_oE.js.map → useNamespace-BkuU0SeK.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-DjQ7rsOC.js → useYamlActivityEvents-XXS3wg6-.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-DjQ7rsOC.js.map → useYamlActivityEvents-XXS3wg6-.js.map} +1 -1
- package/dashboard/dist/assets/{users-CwUL9YJT.js → users-B_9mC6D_.js} +2 -2
- package/dashboard/dist/assets/{users-CwUL9YJT.js.map → users-B_9mC6D_.js.map} +1 -1
- package/dashboard/dist/assets/{workflows-gSjgU0KB.js → workflows-5sds1Ko8.js} +2 -2
- package/dashboard/dist/assets/{workflows-gSjgU0KB.js.map → workflows-5sds1Ko8.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-a_7IO_a6.js → yaml-workflows-CjNa2u3I.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-a_7IO_a6.js.map → yaml-workflows-CjNa2u3I.js.map} +1 -1
- package/dashboard/dist/index.html +1 -1
- package/docs/api/http/workflows.md +35 -0
- package/docs/api/mcp/admin.md +14 -0
- package/docs/api/sdk/workflows.md +21 -0
- package/docs/hitl/lookups.md +12 -0
- package/docs/hitl/x-lt-validation.md +2 -1
- package/docs/hitl/x-lt-widget.md +8 -1
- package/docs/hitl-guide.md +3 -2
- package/package.json +2 -2
- package/dashboard/dist/assets/index-Bf9cfGX_.js +0 -3
package/build/api/exports.d.ts
CHANGED
|
@@ -77,6 +77,21 @@ export declare function exportWorkflowExecution(input: {
|
|
|
77
77
|
export declare function getWorkflowStatus(input: {
|
|
78
78
|
workflowId: string;
|
|
79
79
|
}): Promise<LTApiResult>;
|
|
80
|
+
/**
|
|
81
|
+
* Get a workflow's input and output envelopes — the effortless read.
|
|
82
|
+
*
|
|
83
|
+
* Two narrow lookups (no event stream, no full export): the input is
|
|
84
|
+
* available for the life of the job; the output is null with
|
|
85
|
+
* `status: 'running'` until the workflow completes, making this the natural
|
|
86
|
+
* polling body. A failed run answers `status: 'failed'` with the workflow's
|
|
87
|
+
* error message.
|
|
88
|
+
*
|
|
89
|
+
* @param input.workflowId — the workflow's unique identifier
|
|
90
|
+
* @returns `{ status: 200, data: { workflow_id, status, input, output, error? } }`
|
|
91
|
+
*/
|
|
92
|
+
export declare function getWorkflowEnvelopes(input: {
|
|
93
|
+
workflowId: string;
|
|
94
|
+
}): Promise<LTApiResult>;
|
|
80
95
|
/**
|
|
81
96
|
* Get the current state data of a workflow.
|
|
82
97
|
*
|
package/build/api/exports.js
CHANGED
|
@@ -37,6 +37,7 @@ exports.listJobs = listJobs;
|
|
|
37
37
|
exports.exportWorkflowState = exportWorkflowState;
|
|
38
38
|
exports.exportWorkflowExecution = exportWorkflowExecution;
|
|
39
39
|
exports.getWorkflowStatus = getWorkflowStatus;
|
|
40
|
+
exports.getWorkflowEnvelopes = getWorkflowEnvelopes;
|
|
40
41
|
exports.getWorkflowState = getWorkflowState;
|
|
41
42
|
const exportService = __importStar(require("../services/export"));
|
|
42
43
|
const resolve_1 = require("../services/task/resolve");
|
|
@@ -171,6 +172,40 @@ async function getWorkflowStatus(input) {
|
|
|
171
172
|
};
|
|
172
173
|
}
|
|
173
174
|
}
|
|
175
|
+
/**
|
|
176
|
+
* Get a workflow's input and output envelopes — the effortless read.
|
|
177
|
+
*
|
|
178
|
+
* Two narrow lookups (no event stream, no full export): the input is
|
|
179
|
+
* available for the life of the job; the output is null with
|
|
180
|
+
* `status: 'running'` until the workflow completes, making this the natural
|
|
181
|
+
* polling body. A failed run answers `status: 'failed'` with the workflow's
|
|
182
|
+
* error message.
|
|
183
|
+
*
|
|
184
|
+
* @param input.workflowId — the workflow's unique identifier
|
|
185
|
+
* @returns `{ status: 200, data: { workflow_id, status, input, output, error? } }`
|
|
186
|
+
*/
|
|
187
|
+
async function getWorkflowEnvelopes(input) {
|
|
188
|
+
try {
|
|
189
|
+
let resolved;
|
|
190
|
+
try {
|
|
191
|
+
resolved = await (0, resolve_1.resolveWorkflowHandle)(input.workflowId);
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
return { status: 404, error: 'Workflow not found' };
|
|
195
|
+
}
|
|
196
|
+
const result = await exportService.getWorkflowEnvelopes(input.workflowId, resolved.taskQueue, resolved.workflowName);
|
|
197
|
+
return { status: 200, data: result };
|
|
198
|
+
}
|
|
199
|
+
catch (err) {
|
|
200
|
+
const status = err.status === 404 || err.message?.includes('Not Found') ? 404 : 500;
|
|
201
|
+
return {
|
|
202
|
+
status,
|
|
203
|
+
error: status === 404
|
|
204
|
+
? 'Workflow data is no longer available (job may have expired)'
|
|
205
|
+
: err.message,
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
}
|
|
174
209
|
/**
|
|
175
210
|
* Get the current state data of a workflow.
|
|
176
211
|
*
|
package/build/bin/ltc.js
CHANGED
|
@@ -259,6 +259,10 @@ wfCmd.command('status <id>')
|
|
|
259
259
|
wfCmd.command('result <id>')
|
|
260
260
|
.option('--json', 'JSON output')
|
|
261
261
|
.action(wrap(wf.getWorkflowResult));
|
|
262
|
+
wfCmd.command('envelopes <id>')
|
|
263
|
+
.description('The workflow\'s input and output envelopes — light, never blocks')
|
|
264
|
+
.option('--json', 'JSON output')
|
|
265
|
+
.action(wrap(wf.getWorkflowEnvelopes));
|
|
262
266
|
wfCmd.command('terminate <id>')
|
|
263
267
|
.action(wrap(wf.terminateWorkflow));
|
|
264
268
|
// ── Pipelines (YAML Workflows) ──────────────────────────────────────────
|
|
@@ -13,4 +13,7 @@ export declare function getWorkflowStatus(id: string, opts: {
|
|
|
13
13
|
export declare function getWorkflowResult(id: string, opts: {
|
|
14
14
|
json?: boolean;
|
|
15
15
|
}): Promise<void>;
|
|
16
|
+
export declare function getWorkflowEnvelopes(id: string, opts: {
|
|
17
|
+
json?: boolean;
|
|
18
|
+
}): Promise<void>;
|
|
16
19
|
export declare function terminateWorkflow(id: string): Promise<void>;
|
|
@@ -40,6 +40,7 @@ exports.listWorkflows = listWorkflows;
|
|
|
40
40
|
exports.invokeWorkflow = invokeWorkflow;
|
|
41
41
|
exports.getWorkflowStatus = getWorkflowStatus;
|
|
42
42
|
exports.getWorkflowResult = getWorkflowResult;
|
|
43
|
+
exports.getWorkflowEnvelopes = getWorkflowEnvelopes;
|
|
43
44
|
exports.terminateWorkflow = terminateWorkflow;
|
|
44
45
|
const picocolors_1 = __importDefault(require("picocolors"));
|
|
45
46
|
const client_1 = require("../client");
|
|
@@ -98,6 +99,27 @@ async function getWorkflowResult(id, opts) {
|
|
|
98
99
|
console.log();
|
|
99
100
|
}
|
|
100
101
|
}
|
|
102
|
+
async function getWorkflowEnvelopes(id, opts) {
|
|
103
|
+
const data = await (0, client_1.apiFetch)(`/workflow-states/${id}/envelopes`);
|
|
104
|
+
if (opts.json) {
|
|
105
|
+
console.log(JSON.stringify(data, null, 2));
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
const status = data.status === 'completed' ? picocolors_1.default.green(data.status)
|
|
109
|
+
: data.status === 'failed' ? picocolors_1.default.red(data.status)
|
|
110
|
+
: picocolors_1.default.blue(data.status);
|
|
111
|
+
console.log(`\n ${picocolors_1.default.dim(data.workflow_id)} ${status}`);
|
|
112
|
+
console.log(`\n ${picocolors_1.default.bold('Input')}`);
|
|
113
|
+
console.log(JSON.stringify(data.input, null, 2));
|
|
114
|
+
console.log(`\n ${picocolors_1.default.bold('Output')}`);
|
|
115
|
+
if (data.error) {
|
|
116
|
+
console.log(picocolors_1.default.red(data.error));
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
console.log(data.output === null ? picocolors_1.default.dim('(not yet — still running)') : JSON.stringify(data.output, null, 2));
|
|
120
|
+
}
|
|
121
|
+
console.log();
|
|
122
|
+
}
|
|
101
123
|
async function terminateWorkflow(id) {
|
|
102
124
|
await (0, client_1.apiFetch)(`/workflows/terminate/${id}`, { method: 'POST' });
|
|
103
125
|
console.log(`\n ${picocolors_1.default.green('✓')} Terminated ${picocolors_1.default.dim(id)}\n`);
|
package/build/routes/exports.js
CHANGED
|
@@ -95,6 +95,17 @@ router.get('/:workflowId/execution', async (req, res) => {
|
|
|
95
95
|
});
|
|
96
96
|
res.status(result.status).json(result.data ?? { error: result.error });
|
|
97
97
|
});
|
|
98
|
+
/**
|
|
99
|
+
* GET /api/workflow-states/:workflowId/envelopes
|
|
100
|
+
* The workflow's input and output envelopes — two narrow lookups, no event
|
|
101
|
+
* stream. Output is null with status 'running' until the workflow completes.
|
|
102
|
+
*/
|
|
103
|
+
router.get('/:workflowId/envelopes', async (req, res) => {
|
|
104
|
+
const result = await api.getWorkflowEnvelopes({
|
|
105
|
+
workflowId: req.params.workflowId,
|
|
106
|
+
});
|
|
107
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
108
|
+
});
|
|
98
109
|
/**
|
|
99
110
|
* GET /api/workflow-states/:workflowId/status
|
|
100
111
|
* Return only the numeric status semaphore.
|
package/build/sdk/index.d.ts
CHANGED
|
@@ -247,6 +247,7 @@ export declare function createClient(options?: LTClientOptions): {
|
|
|
247
247
|
options?: Record<string, any>;
|
|
248
248
|
}, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
|
|
249
249
|
getStatus: typeof workflowsApi.getWorkflowStatus;
|
|
250
|
+
getEnvelopes: typeof exportsApi.getWorkflowEnvelopes;
|
|
250
251
|
getResult: typeof workflowsApi.getWorkflowResult;
|
|
251
252
|
terminate: typeof workflowsApi.terminateWorkflow;
|
|
252
253
|
export: typeof workflowsApi.exportWorkflow;
|
package/build/sdk/index.js
CHANGED
|
@@ -155,6 +155,7 @@ function createClient(options = {}) {
|
|
|
155
155
|
workflows: {
|
|
156
156
|
invoke: bindAuth(workflowsApi.invokeWorkflow, auth),
|
|
157
157
|
getStatus: workflowsApi.getWorkflowStatus,
|
|
158
|
+
getEnvelopes: exportsApi.getWorkflowEnvelopes,
|
|
158
159
|
getResult: workflowsApi.getWorkflowResult,
|
|
159
160
|
terminate: workflowsApi.terminateWorkflow,
|
|
160
161
|
export: workflowsApi.exportWorkflow,
|
|
@@ -24,6 +24,25 @@ export declare function getWorkflowStatus(workflowId: string, taskQueue: string,
|
|
|
24
24
|
* system/user classification, and a summary.
|
|
25
25
|
*/
|
|
26
26
|
export declare function exportWorkflowExecution(workflowId: string, taskQueue: string, workflowName: string, options?: ExecutionExportOptions): Promise<WorkflowExecution>;
|
|
27
|
+
/** The input/output envelope pair plus the derived run status. */
|
|
28
|
+
export interface WorkflowEnvelopes {
|
|
29
|
+
workflow_id: string;
|
|
30
|
+
status: 'running' | 'completed' | 'failed';
|
|
31
|
+
/** The workflow's input — the single LTEnvelope for one-arg workflows, else the args array. */
|
|
32
|
+
input: unknown;
|
|
33
|
+
/** The workflow's return envelope, or null while it is still running or when it failed. */
|
|
34
|
+
output: unknown;
|
|
35
|
+
/** The workflow's error message, present only when status is 'failed'. */
|
|
36
|
+
error?: string;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* The effortless read: what went in, what came out. Two narrow lookups —
|
|
40
|
+
* `handle.input()` (one field read, available for the life of the job) and
|
|
41
|
+
* `handle.output()` (one state read, never blocks) — no event stream, no
|
|
42
|
+
* full export. While the workflow runs, `output` is null and `status` says
|
|
43
|
+
* so, making this the natural polling body.
|
|
44
|
+
*/
|
|
45
|
+
export declare function getWorkflowEnvelopes(workflowId: string, taskQueue: string, workflowName: string): Promise<WorkflowEnvelopes>;
|
|
27
46
|
/**
|
|
28
47
|
* Return the current job state of a workflow.
|
|
29
48
|
* If the workflow is complete this is also the output.
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.exportWorkflow = exportWorkflow;
|
|
4
4
|
exports.getWorkflowStatus = getWorkflowStatus;
|
|
5
5
|
exports.exportWorkflowExecution = exportWorkflowExecution;
|
|
6
|
+
exports.getWorkflowEnvelopes = getWorkflowEnvelopes;
|
|
6
7
|
exports.getWorkflowState = getWorkflowState;
|
|
7
8
|
exports.listJobs = listJobs;
|
|
8
9
|
const db_1 = require("../../lib/db");
|
|
@@ -66,21 +67,14 @@ async function getWorkflowStatus(workflowId, taskQueue, workflowName) {
|
|
|
66
67
|
async function exportWorkflowExecution(workflowId, taskQueue, workflowName, options) {
|
|
67
68
|
try {
|
|
68
69
|
const handle = await (0, client_1.getHandle)(taskQueue, workflowName, workflowId);
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
if (!processed.parent_workflow_id) {
|
|
78
|
-
const pj = extractParentJobId(raw);
|
|
79
|
-
if (pj && pj !== workflowId) {
|
|
80
|
-
processed.parent_workflow_id = pj;
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
return processed;
|
|
70
|
+
// include_lineage populates parent_workflow_id/origin_id from the jobs
|
|
71
|
+
// table in one indexed lookup — no second export call.
|
|
72
|
+
const execution = await handle.exportExecution({
|
|
73
|
+
...options,
|
|
74
|
+
enrich_inputs: true,
|
|
75
|
+
include_lineage: true,
|
|
76
|
+
});
|
|
77
|
+
return (0, post_process_1.postProcessExecution)(execution);
|
|
84
78
|
}
|
|
85
79
|
catch (err) {
|
|
86
80
|
if (err instanceof WorkflowNotFoundError)
|
|
@@ -89,25 +83,51 @@ async function exportWorkflowExecution(workflowId, taskQueue, workflowName, opti
|
|
|
89
83
|
}
|
|
90
84
|
}
|
|
91
85
|
/**
|
|
92
|
-
*
|
|
93
|
-
*
|
|
94
|
-
*
|
|
86
|
+
* The effortless read: what went in, what came out. Two narrow lookups —
|
|
87
|
+
* `handle.input()` (one field read, available for the life of the job) and
|
|
88
|
+
* `handle.output()` (one state read, never blocks) — no event stream, no
|
|
89
|
+
* full export. While the workflow runs, `output` is null and `status` says
|
|
90
|
+
* so, making this the natural polling body.
|
|
95
91
|
*/
|
|
96
|
-
function
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
}
|
|
110
|
-
|
|
92
|
+
async function getWorkflowEnvelopes(workflowId, taskQueue, workflowName) {
|
|
93
|
+
let handle;
|
|
94
|
+
try {
|
|
95
|
+
handle = await (0, client_1.getHandle)(taskQueue, workflowName, workflowId);
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
throw new WorkflowNotFoundError(workflowId);
|
|
99
|
+
}
|
|
100
|
+
const [statusCode, args] = await Promise.all([
|
|
101
|
+
handle.status(),
|
|
102
|
+
handle.input().catch(() => undefined),
|
|
103
|
+
]).catch(() => {
|
|
104
|
+
throw new WorkflowNotFoundError(workflowId);
|
|
105
|
+
});
|
|
106
|
+
// Long-tail workflows take a single LTEnvelope argument — unwrap it;
|
|
107
|
+
// multi-arg workflows keep the args array verbatim.
|
|
108
|
+
const input = Array.isArray(args) && args.length === 1 ? args[0] : args ?? null;
|
|
109
|
+
if (statusCode > 0) {
|
|
110
|
+
return { workflow_id: workflowId, status: 'running', input, output: null };
|
|
111
|
+
}
|
|
112
|
+
try {
|
|
113
|
+
const output = await handle.output();
|
|
114
|
+
return {
|
|
115
|
+
workflow_id: workflowId,
|
|
116
|
+
status: statusCode === 0 ? 'completed' : 'failed',
|
|
117
|
+
input,
|
|
118
|
+
output: output ?? null,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
catch (err) {
|
|
122
|
+
// output() throws the workflow's own error for failed runs — that IS the outcome.
|
|
123
|
+
return {
|
|
124
|
+
workflow_id: workflowId,
|
|
125
|
+
status: 'failed',
|
|
126
|
+
input,
|
|
127
|
+
output: null,
|
|
128
|
+
error: err?.message ?? String(err),
|
|
129
|
+
};
|
|
130
|
+
}
|
|
111
131
|
}
|
|
112
132
|
/**
|
|
113
133
|
* Return the current job state of a workflow.
|
|
@@ -8,13 +8,27 @@ interface ChecklistItem {
|
|
|
8
8
|
required?: boolean;
|
|
9
9
|
}
|
|
10
10
|
/**
|
|
11
|
-
* Resolve a checklist widget's item definitions from its `x-lt-source`
|
|
12
|
-
* "domain.path"
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
11
|
+
* Resolve a checklist widget's item definitions from its `x-lt-source` —
|
|
12
|
+
* a "domain.path" or an ORDERED array of paths — against the escalation
|
|
13
|
+
* context. With an array, the first entry that resolves to a non-empty item
|
|
14
|
+
* list wins, so lookup-backed and envelope-embedded rows render the same
|
|
15
|
+
* shared schema interchangeably. Paths may embed `{{domain.path}}`
|
|
16
|
+
* interpolation segments (cascading sources); an entry that cannot resolve
|
|
17
|
+
* falls through to the next. Nothing resolvable yields an empty list.
|
|
16
18
|
*/
|
|
17
|
-
export declare function resolveChecklistItems(
|
|
19
|
+
export declare function resolveChecklistItems(source: unknown, ctx: Record<string, unknown> | undefined): ChecklistItem[];
|
|
20
|
+
export declare const X_LT_DEFAULT_CHECKED = "x-lt-default-checked";
|
|
21
|
+
/**
|
|
22
|
+
* The checklist's first-load default (`x-lt-default-checked`): every resolved
|
|
23
|
+
* item starts checked, for affirm-then-exception flows where the submitter
|
|
24
|
+
* unchecks what failed. Returns the all-checked answer map ONLY when the
|
|
25
|
+
* field carries no answer yet — a saved or drafted map (any key, even
|
|
26
|
+
* all-false) is never clobbered — and null otherwise: absent flag, existing
|
|
27
|
+
* answer, or a source that resolves to no items. Declared on the widget
|
|
28
|
+
* because the item set is runtime-sourced (envelope or lookup): a pure
|
|
29
|
+
* escalation-minting step cannot enumerate the ids to seed formDefaults.
|
|
30
|
+
*/
|
|
31
|
+
export declare function resolveChecklistDefault(fieldSchema: Record<string, unknown> | null | undefined, currentValue: unknown, ctx?: Record<string, unknown>): Record<string, boolean> | null;
|
|
18
32
|
/**
|
|
19
33
|
* The checklist completion guard (`x-lt-require-all`): every rendered item must
|
|
20
34
|
* be checked, except items whose definition carries `required: false` (the
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.X_LT_DEFAULT_CHECKED = void 0;
|
|
3
4
|
exports.resolveChecklistItems = resolveChecklistItems;
|
|
5
|
+
exports.resolveChecklistDefault = resolveChecklistDefault;
|
|
4
6
|
exports.validateRequireAll = validateRequireAll;
|
|
5
7
|
exports.validateFieldType = validateFieldType;
|
|
6
8
|
exports.validateFieldConstraints = validateFieldConstraints;
|
|
@@ -8,24 +10,57 @@ exports.validateField = validateField;
|
|
|
8
10
|
const x_lt_options_1 = require("./x-lt-options");
|
|
9
11
|
const ctx_path_1 = require("./ctx-path");
|
|
10
12
|
/**
|
|
11
|
-
* Resolve a checklist widget's item definitions from its `x-lt-source`
|
|
12
|
-
* "domain.path"
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
13
|
+
* Resolve a checklist widget's item definitions from its `x-lt-source` —
|
|
14
|
+
* a "domain.path" or an ORDERED array of paths — against the escalation
|
|
15
|
+
* context. With an array, the first entry that resolves to a non-empty item
|
|
16
|
+
* list wins, so lookup-backed and envelope-embedded rows render the same
|
|
17
|
+
* shared schema interchangeably. Paths may embed `{{domain.path}}`
|
|
18
|
+
* interpolation segments (cascading sources); an entry that cannot resolve
|
|
19
|
+
* falls through to the next. Nothing resolvable yields an empty list.
|
|
16
20
|
*/
|
|
17
|
-
function resolveChecklistItems(
|
|
18
|
-
|
|
21
|
+
function resolveChecklistItems(source, ctx) {
|
|
22
|
+
const paths = (typeof source === 'string' ? [source] : Array.isArray(source) ? source : [])
|
|
23
|
+
.filter((p) => typeof p === 'string' && p.length > 0);
|
|
24
|
+
if (paths.length === 0 || !ctx)
|
|
19
25
|
return [];
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
+
for (const sourcePath of paths) {
|
|
27
|
+
let concrete = sourcePath;
|
|
28
|
+
if ((0, ctx_path_1.hasInterpolation)(sourcePath)) {
|
|
29
|
+
const resolved = (0, ctx_path_1.interpolatePath)(sourcePath, ctx);
|
|
30
|
+
if (resolved === null)
|
|
31
|
+
continue;
|
|
32
|
+
concrete = resolved;
|
|
33
|
+
}
|
|
34
|
+
const cur = (0, ctx_path_1.resolveCtxPath)(concrete, ctx);
|
|
35
|
+
if (Array.isArray(cur) && cur.length > 0)
|
|
36
|
+
return cur;
|
|
26
37
|
}
|
|
27
|
-
|
|
28
|
-
|
|
38
|
+
return [];
|
|
39
|
+
}
|
|
40
|
+
exports.X_LT_DEFAULT_CHECKED = 'x-lt-default-checked';
|
|
41
|
+
/**
|
|
42
|
+
* The checklist's first-load default (`x-lt-default-checked`): every resolved
|
|
43
|
+
* item starts checked, for affirm-then-exception flows where the submitter
|
|
44
|
+
* unchecks what failed. Returns the all-checked answer map ONLY when the
|
|
45
|
+
* field carries no answer yet — a saved or drafted map (any key, even
|
|
46
|
+
* all-false) is never clobbered — and null otherwise: absent flag, existing
|
|
47
|
+
* answer, or a source that resolves to no items. Declared on the widget
|
|
48
|
+
* because the item set is runtime-sourced (envelope or lookup): a pure
|
|
49
|
+
* escalation-minting step cannot enumerate the ids to seed formDefaults.
|
|
50
|
+
*/
|
|
51
|
+
function resolveChecklistDefault(fieldSchema, currentValue, ctx) {
|
|
52
|
+
if (fieldSchema?.['x-lt-widget'] !== 'checklist')
|
|
53
|
+
return null;
|
|
54
|
+
if (fieldSchema[exports.X_LT_DEFAULT_CHECKED] !== true)
|
|
55
|
+
return null;
|
|
56
|
+
if (currentValue && typeof currentValue === 'object' && !Array.isArray(currentValue)
|
|
57
|
+
&& Object.keys(currentValue).length > 0) {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
const items = resolveChecklistItems(fieldSchema['x-lt-source'], ctx);
|
|
61
|
+
if (items.length === 0)
|
|
62
|
+
return null;
|
|
63
|
+
return Object.fromEntries(items.map((i) => [i.id, true]));
|
|
29
64
|
}
|
|
30
65
|
/**
|
|
31
66
|
* The checklist completion guard (`x-lt-require-all`): every rendered item must
|
|
@@ -10,10 +10,18 @@ exports.resolveFieldOptions = resolveFieldOptions;
|
|
|
10
10
|
* offer a different legal set per escalation (e.g. `[1..N]` where N rides the
|
|
11
11
|
* envelope, or a versioned knowledge lookup under the `lookup` domain).
|
|
12
12
|
*
|
|
13
|
-
* x-lt-options "domain.path" — e.g.
|
|
14
|
-
*
|
|
13
|
+
* x-lt-options "domain.path" or an ORDERED array of paths — e.g.
|
|
14
|
+
* "envelope.left_quantity_options" or
|
|
15
|
+
* ["lookup.reasons.items", "envelope.reject_reason_items"].
|
|
16
|
+
* With an array, the first entry that resolves to options
|
|
17
|
+
* wins, so lookup-backed and envelope-embedded rows render
|
|
18
|
+
* the same shared schema interchangeably (a parked row
|
|
19
|
+
* falls through to the envelope it already carries).
|
|
20
|
+
* Paths may embed {{domain.path}} interpolation segments —
|
|
15
21
|
* e.g. "lookup.geo.regions.{{resolver.country}}" — making
|
|
16
|
-
* the option list follow another answer (cascading selects)
|
|
22
|
+
* the option list follow another answer (cascading selects);
|
|
23
|
+
* an entry whose interpolation cannot resolve falls through
|
|
24
|
+
* to the next entry.
|
|
17
25
|
*
|
|
18
26
|
* Object entries separate what the submitter SEES from what the payload
|
|
19
27
|
* STORES: the select renders the label and emits the value (a DB-backed pick
|
|
@@ -62,24 +70,30 @@ function resolveFieldOptions(fieldSchema, ctx) {
|
|
|
62
70
|
if (Array.isArray(staticEnum) && staticEnum.length > 0) {
|
|
63
71
|
return staticEnum.map((v) => ({ value: v, label: String(v) }));
|
|
64
72
|
}
|
|
65
|
-
const
|
|
66
|
-
|
|
73
|
+
const token = fieldSchema[exports.X_LT_OPTIONS];
|
|
74
|
+
const paths = (typeof token === 'string' ? [token] : Array.isArray(token) ? token : [])
|
|
75
|
+
.filter((p) => typeof p === 'string' && p.length > 0);
|
|
76
|
+
if (paths.length === 0)
|
|
67
77
|
return undefined;
|
|
68
|
-
// Interpolated
|
|
69
|
-
// stays a (disabled) select and fails closed
|
|
70
|
-
// undefined-on-miss
|
|
71
|
-
|
|
72
|
-
const miss =
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
78
|
+
// Interpolated entries are a standing contract: when nothing resolves, the
|
|
79
|
+
// field stays a (disabled) select and fails closed — a cascade child never
|
|
80
|
+
// becomes free text. All-plain-path tokens keep the legacy undefined-on-miss
|
|
81
|
+
// reading (the field falls back to its typed plain input).
|
|
82
|
+
const miss = paths.some(ctx_path_1.hasInterpolation) ? [] : undefined;
|
|
83
|
+
for (const sourcePath of paths) {
|
|
84
|
+
let concrete = sourcePath;
|
|
85
|
+
if ((0, ctx_path_1.hasInterpolation)(sourcePath)) {
|
|
86
|
+
const resolved = (0, ctx_path_1.interpolatePath)(sourcePath, ctx);
|
|
87
|
+
if (resolved === null)
|
|
88
|
+
continue;
|
|
89
|
+
concrete = resolved;
|
|
90
|
+
}
|
|
91
|
+
const cur = (0, ctx_path_1.resolveCtxPath)(concrete, ctx);
|
|
92
|
+
if (!Array.isArray(cur))
|
|
93
|
+
continue;
|
|
94
|
+
const options = cur.map(toOption).filter((o) => o !== null);
|
|
95
|
+
if (options.length > 0)
|
|
96
|
+
return options;
|
|
79
97
|
}
|
|
80
|
-
|
|
81
|
-
if (!Array.isArray(cur))
|
|
82
|
-
return miss;
|
|
83
|
-
const options = cur.map(toOption).filter((o) => o !== null);
|
|
84
|
-
return options.length > 0 ? options : miss;
|
|
98
|
+
return miss;
|
|
85
99
|
}
|
|
@@ -89,6 +89,21 @@ function registerExportTools(server) {
|
|
|
89
89
|
}
|
|
90
90
|
return { content: [{ type: 'text', text: JSON.stringify((0, pick_1.pickPaths)(result.data, args.select)) }] };
|
|
91
91
|
});
|
|
92
|
+
// mirrors GET /api/workflow-states/:workflowId/envelopes
|
|
93
|
+
server.registerTool('get_workflow_envelopes', {
|
|
94
|
+
title: 'Get Workflow Envelopes',
|
|
95
|
+
description: 'The workflow\'s input and output envelopes — two narrow lookups, no event ' +
|
|
96
|
+
'stream. Output is null with status running until the workflow completes; a ' +
|
|
97
|
+
'failed run carries its error message. The token-cheap read when you only ' +
|
|
98
|
+
'need what went in and what came out.',
|
|
99
|
+
inputSchema: schemas_1.getWorkflowEnvelopesSchema,
|
|
100
|
+
}, async (args) => {
|
|
101
|
+
const result = await api.getWorkflowEnvelopes({ workflowId: args.workflow_id });
|
|
102
|
+
if (result.error) {
|
|
103
|
+
return { content: [{ type: 'text', text: JSON.stringify({ error: result.error }) }], isError: true };
|
|
104
|
+
}
|
|
105
|
+
return { content: [{ type: 'text', text: JSON.stringify(result.data) }] };
|
|
106
|
+
});
|
|
92
107
|
// mirrors GET /api/workflow-states/:workflowId/status
|
|
93
108
|
server.registerTool('get_export_status', {
|
|
94
109
|
title: 'Get Workflow Status',
|
|
@@ -1420,6 +1420,13 @@ export declare const getExportStatusSchema: z.ZodObject<{
|
|
|
1420
1420
|
}, {
|
|
1421
1421
|
workflow_id: string;
|
|
1422
1422
|
}>;
|
|
1423
|
+
export declare const getWorkflowEnvelopesSchema: z.ZodObject<{
|
|
1424
|
+
workflow_id: z.ZodString;
|
|
1425
|
+
}, "strip", z.ZodTypeAny, {
|
|
1426
|
+
workflow_id: string;
|
|
1427
|
+
}, {
|
|
1428
|
+
workflow_id: string;
|
|
1429
|
+
}>;
|
|
1423
1430
|
export declare const diagnoseJobSchema: z.ZodObject<{
|
|
1424
1431
|
workflow_id: z.ZodString;
|
|
1425
1432
|
app_id: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.assignPersonaSchema = exports.unlinkPersonaRoleSchema = exports.linkPersonaRoleSchema = exports.deletePersonaSchema = exports.updatePersonaSchema = exports.createPersonaSchema = exports.getPersonaSchema = exports.listPersonasSchema = exports.listRoleSchemaVersionsSchema = exports.getRoleSchemaSchema = exports.updateRoleSchema = exports.addEscalationChainSchema = exports.createRoleSchema = exports.listRolesSchema = exports.removeUserRoleSchema = exports.addUserRoleSchema = exports.createUserSchema = exports.listUsersSchema = exports.invokeYamlWorkflowSchema = exports.deployYamlWorkflowSchema = exports.createYamlWorkflowSchema = exports.getYamlWorkflowSchema = exports.listYamlWorkflowsSchema = exports.disconnectMcpServerSchema = exports.connectMcpServerSchema = exports.updateMcpServerSchema = exports.listMcpServersSchema = exports.getDomainContextSchema = exports.terminateWorkflowSchema = exports.getWorkflowStatusSchema = exports.invokeWorkflowSchema = exports.listDiscoveredWorkflowsSchema = exports.deleteWorkflowConfigSchema = exports.upsertWorkflowConfigSchema = exports.listWorkflowConfigsSchema = exports.bulkTriageSchema = exports.releaseExpiredClaimsSchema = exports.bulkCancelSchema = exports.cancelEscalationSchema = exports.escalateEscalationSchema = exports.resolveBySignalKeySchema = exports.resolveEscalationSchema = exports.releaseEscalationSchema = exports.claimEscalationSchema = exports.getEscalationStatsSchema = exports.getEscalationsByWorkflowSchema = exports.getEscalationSchema = exports.findEscalationsSchema = exports.getProcessDetailSchema = exports.findTasksSchema = void 0;
|
|
4
|
-
exports.
|
|
5
|
-
exports.deleteScanRuleSchema = exports.upsertScanRuleSchema = exports.upsertScanSchemeSchema = exports.listScanSchemesSchema = exports.executeScanChoiceSchema = exports.executeScanCodeSchema = exports.timelineByFacetSchema = exports.aggregateByFacetsSchema = exports.claimByFacetsSchema = exports.claimGroupsSchema = exports.searchByFacetsSchema = void 0;
|
|
4
|
+
exports.facetQuerySchema = exports.findOrphanedSignalsSchema = exports.findStalledJobsSchema = exports.diagnoseJobSchema = exports.getWorkflowEnvelopesSchema = exports.getExportStatusSchema = exports.exportWorkflowExecutionSchema = exports.exportWorkflowStateSchema = exports.listExportJobsSchema = exports.getSettingsSchema = exports.updatePrioritySchema = exports.bulkEscalateSchema = exports.bulkUnassignSchema = exports.bulkAssignSchema = exports.bulkClaimSchema = exports.resolveByMetadataSchema = exports.claimByMetadataSchema = exports.findByMetadataSchema = exports.deleteTopicSchema = exports.updateTopicSchema = exports.createTopicSchema = exports.getTopicSchema = exports.listTopicsSchema = exports.interruptJobSchema = exports.getJobExecutionSchema = exports.listPipelineJobsSchema = exports.listPipelineEntitiesSchema = exports.listStreamMessagesSchema = exports.getStreamStatsSchema = exports.applyThrottleSchema = exports.rollCallSchema = exports.listAppsSchema = exports.revokeBotKeySchema = exports.createBotApiKeySchema = exports.deleteBotSchema = exports.updateBotSchema = exports.createBotSchema = exports.getBotSchema = exports.listBotsSchema = exports.deleteAgentSubscriptionSchema = exports.createAgentSubscriptionSchema = exports.listAgentSubscriptionsSchema = exports.deleteAgentSchema = exports.updateAgentSchema = exports.createAgentSchema = exports.getAgentSchema = exports.listAgentsSchema = exports.pruneSchema = exports.getUserPersonasSchema = exports.unassignPersonaSchema = void 0;
|
|
5
|
+
exports.deleteScanRuleSchema = exports.upsertScanRuleSchema = exports.upsertScanSchemeSchema = exports.listScanSchemesSchema = exports.executeScanChoiceSchema = exports.executeScanCodeSchema = exports.timelineByFacetSchema = exports.aggregateByFacetsSchema = exports.claimByFacetsSchema = exports.claimGroupsSchema = exports.searchByFacetsSchema = exports.resolveByIdsSchema = void 0;
|
|
6
6
|
/**
|
|
7
7
|
* Zod schemas for the admin MCP server tools.
|
|
8
8
|
*
|
|
@@ -579,6 +579,9 @@ exports.exportWorkflowExecutionSchema = zod_1.z.object({
|
|
|
579
579
|
exports.getExportStatusSchema = zod_1.z.object({
|
|
580
580
|
workflow_id: zod_1.z.string().describe('Workflow ID to check export status'),
|
|
581
581
|
});
|
|
582
|
+
exports.getWorkflowEnvelopesSchema = zod_1.z.object({
|
|
583
|
+
workflow_id: zod_1.z.string().describe('Workflow ID whose input/output envelopes to fetch'),
|
|
584
|
+
});
|
|
582
585
|
// ── Diagnostics ───────────────────────────────────────────────────────────────
|
|
583
586
|
exports.diagnoseJobSchema = zod_1.z.object({
|
|
584
587
|
workflow_id: zod_1.z.string().describe('Workflow ID to diagnose'),
|
|
@@ -124,6 +124,7 @@ exports.ADMIN_TOOLS = [
|
|
|
124
124
|
{ name: 'list_export_jobs', description: 'List workflow jobs with optional filtering and pagination.', read_safe: true, inputSchema: { type: 'object', properties: { limit: { type: 'integer' }, offset: { type: 'integer' }, entity: { type: 'string' }, search: { type: 'string' }, status: { type: 'string' }, sort_by: { type: 'string' }, order: { type: 'string', enum: ['asc', 'desc'] } } } },
|
|
125
125
|
{ name: 'export_workflow_state', description: 'Export the full workflow state using HotMesh durable export. allow/block filter which sections the engine fetches; select (dot paths) projects the returned JSON.', read_safe: true, inputSchema: { type: 'object', properties: { workflow_id: { type: 'string' }, allow: { type: 'array', items: { type: 'string' } }, block: { type: 'array', items: { type: 'string' } }, values: { type: 'object' }, select: { type: 'array', items: { type: 'string' } } }, required: ['workflow_id'] } },
|
|
126
126
|
{ name: 'export_workflow_execution', description: 'Export workflow state as a structured execution event history. Histories run large — pass select (dot paths) to return only what you need.', read_safe: true, inputSchema: { type: 'object', properties: { workflow_id: { type: 'string' }, excludeSystem: { type: 'boolean' }, omitResults: { type: 'boolean' }, mode: { type: 'string' }, maxDepth: { type: 'integer' }, select: { type: 'array', items: { type: 'string' } } }, required: ['workflow_id'] } },
|
|
127
|
+
{ name: 'get_workflow_envelopes', description: 'The workflow\'s input and output envelopes — two narrow lookups, no event stream. Output is null with status running until the workflow completes; a failed run carries its error message.', read_safe: true, inputSchema: { type: 'object', properties: { workflow_id: { type: 'string' } }, required: ['workflow_id'] } },
|
|
127
128
|
{ name: 'get_export_status', description: 'Return the numeric status semaphore for a workflow.', read_safe: true, inputSchema: { type: 'object', properties: { workflow_id: { type: 'string' } }, required: ['workflow_id'] } },
|
|
128
129
|
// ── overview.ts ─────────────────────────────────────────────────────────
|
|
129
130
|
{ name: 'get_system_overview', description: 'Triage-ready system dashboard: escalation queue pressure, task throughput, hourly trends, infrastructure status, and process summary. One call for complete system state.', read_safe: true, inputSchema: { type: 'object', properties: { period: { type: 'string', enum: ['1h', '24h', '7d'], description: 'Time window (default: 24h)' } } } },
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{j as o}from"./vendor-query-RUZdMvN6.js";import{c as n}from"./tasks-
|
|
2
|
-
//# sourceMappingURL=AdminDashboard-
|
|
1
|
+
import{j as o}from"./vendor-query-RUZdMvN6.js";import{c as n}from"./tasks-CGoPhQyw.js";import{T as m}from"./index-zqoZDL5j.js";import{f as c}from"./useEventHooks-onx-Z6IY.js";import{u}from"./mcp-D2WA-SHc.js";import{P as d}from"./PageHeaderWithStats-D9tQxILm.js";import"./vendor-react-CdqEC2zv.js";import"./vendor-icons-h-jlRSb9.js";function j(){var a;c();const{data:s}=n({limit:1}),{data:e}=m({status:"pending",limit:1}),{data:t}=u(),r=((a=t==null?void 0:t.servers)==null?void 0:a.filter(i=>i.status==="connected").length)??0,l=t?`${r}/${t.total}`:"—";return o.jsx("div",{children:o.jsx(d,{title:"Admin",stats:[{label:"Tasks",value:(s==null?void 0:s.total)??"—"},{label:"Pending Escalations",value:(e==null?void 0:e.total)??"—",dotClass:"bg-status-pending"},{label:"MCP Servers",value:l},{label:"System",value:"Healthy",dotClass:"bg-status-success"}]})})}export{j as AdminDashboard};
|
|
2
|
+
//# sourceMappingURL=AdminDashboard-Csq-oxmY.js.map
|
package/dashboard/dist/assets/{AdminDashboard-Dnj4asuh.js.map → AdminDashboard-Csq-oxmY.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminDashboard-
|
|
1
|
+
{"version":3,"file":"AdminDashboard-Csq-oxmY.js","sources":["../../src/pages/admin/AdminDashboard.tsx"],"sourcesContent":["import { useTasks } from '../../api/tasks';\nimport { useEscalations } from '../../api/escalations';\nimport { useEscalationListEvents } from '../../hooks/useEventHooks';\nimport { useMcpServers } from '../../api/mcp';\nimport { PageHeaderWithStats } from '../../components/common/layout/PageHeaderWithStats';\n\nexport function AdminDashboard() {\n useEscalationListEvents();\n const { data: taskData } = useTasks({ limit: 1 });\n const { data: pendingEsc } = useEscalations({ status: 'pending', limit: 1 });\n const { data: mcpData } = useMcpServers();\n\n const connectedServers =\n mcpData?.servers?.filter((s) => s.status === 'connected').length ?? 0;\n const mcpLabel = mcpData ? `${connectedServers}/${mcpData.total}` : '—';\n\n return (\n <div>\n <PageHeaderWithStats\n title=\"Admin\"\n stats={[\n { label: 'Tasks', value: taskData?.total ?? '—' },\n { label: 'Pending Escalations', value: pendingEsc?.total ?? '—', dotClass: 'bg-status-pending' },\n { label: 'MCP Servers', value: mcpLabel },\n { label: 'System', value: 'Healthy', dotClass: 'bg-status-success' },\n ]}\n />\n </div>\n );\n}\n"],"names":["AdminDashboard","useEscalationListEvents","taskData","useTasks","pendingEsc","useEscalations","mcpData","useMcpServers","connectedServers","_a","s","mcpLabel","jsx","PageHeaderWithStats"],"mappings":"4UAMO,SAASA,GAAiB,OAC/BC,EAAA,EACA,KAAM,CAAE,KAAMC,CAAA,EAAaC,EAAS,CAAE,MAAO,EAAG,EAC1C,CAAE,KAAMC,CAAA,EAAeC,EAAe,CAAE,OAAQ,UAAW,MAAO,EAAG,EACrE,CAAE,KAAMC,CAAA,EAAYC,EAAA,EAEpBC,IACJC,EAAAH,GAAA,YAAAA,EAAS,UAAT,YAAAG,EAAkB,OAAQC,GAAMA,EAAE,SAAW,aAAa,SAAU,EAChEC,EAAWL,EAAU,GAAGE,CAAgB,IAAIF,EAAQ,KAAK,GAAK,IAEpE,aACG,MAAA,CACC,SAAAM,EAAAA,IAACC,EAAA,CACC,MAAM,QACN,MAAO,CACL,CAAE,MAAO,QAAS,OAAOX,GAAA,YAAAA,EAAU,QAAS,GAAA,EAC5C,CAAE,MAAO,sBAAuB,OAAOE,GAAA,YAAAA,EAAY,QAAS,IAAK,SAAU,mBAAA,EAC3E,CAAE,MAAO,cAAe,MAAOO,CAAA,EAC/B,CAAE,MAAO,SAAU,MAAO,UAAW,SAAU,mBAAA,CAAoB,CACrE,CAAA,EAEJ,CAEJ"}
|