@hotmeshio/long-tail 0.19.1 → 0.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/api/workflows/config.d.ts +3 -0
- package/build/api/workflows/config.js +15 -0
- package/build/api/workflows/index.d.ts +1 -0
- package/build/api/workflows/index.js +3 -1
- package/build/api/workflows/input-lookups.d.ts +16 -0
- package/build/api/workflows/input-lookups.js +69 -0
- package/build/api/workflows/input-validation.d.ts +4 -3
- package/build/api/workflows/input-validation.js +7 -4
- package/build/api/workflows/invocable.js +1 -0
- package/build/api/workflows/invocation.js +1 -1
- package/build/lib/db/schemas/035_workflow_input_lookups.sql +9 -0
- package/build/routes/workflows/config.js +10 -0
- package/build/services/config/cache.js +1 -0
- package/build/services/config/read.js +2 -0
- package/build/services/config/sql.d.ts +2 -2
- package/build/services/config/sql.js +6 -5
- package/build/services/config/write.js +10 -1
- package/build/services/knowledge/index.d.ts +1 -0
- package/build/services/knowledge/index.js +1 -0
- package/build/services/knowledge/lookup-refs.d.ts +7 -0
- package/build/services/knowledge/lookup-refs.js +26 -0
- package/build/services/mcp/db-server/schemas.d.ts +2 -2
- package/build/shared/form-validation/field-validator.d.ts +1 -0
- package/build/shared/form-validation/field-validator.js +94 -6
- package/build/shared/form-validation/invoke-context.d.ts +4 -3
- package/build/shared/form-validation/invoke-context.js +5 -4
- package/build/shared/form-validation/x-lt-options.d.ts +3 -3
- package/build/shared/form-validation/x-lt-options.js +19 -5
- package/build/shared/form-validation/x-lt-show-if.d.ts +5 -0
- package/build/shared/form-validation/x-lt-show-if.js +10 -0
- package/build/start/workers.js +10 -0
- package/build/system/mcp-servers/admin/schemas.d.ts +64 -20
- package/build/system/mcp-servers/admin/schemas.js +19 -3
- package/build/system/mcp-servers/admin/workflow-config.js +54 -9
- package/build/system/mcp-servers/admin/workflows.js +9 -7
- package/build/system/mcp-servers/db-query/schemas.d.ts +2 -2
- package/build/system/seed/tool-manifests-admin.d.ts +517 -54
- package/build/system/seed/tool-manifests-admin.js +4 -3
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/config.d.ts +4 -0
- package/build/types/startup.d.ts +6 -0
- package/dashboard/dist/assets/{AdminDashboard-Drs-9TRM.js → AdminDashboard-DplvDBti.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-Drs-9TRM.js.map → AdminDashboard-DplvDBti.js.map} +1 -1
- package/dashboard/dist/assets/{AgentConfigPage-BDPDZ7-v.js → AgentConfigPage-D8Bf6YxO.js} +2 -2
- package/dashboard/dist/assets/{AgentConfigPage-BDPDZ7-v.js.map → AgentConfigPage-D8Bf6YxO.js.map} +1 -1
- package/dashboard/dist/assets/{AgentDetailPage-CGBulM4_.js → AgentDetailPage-BN8g0Y2G.js} +2 -2
- package/dashboard/dist/assets/{AgentDetailPage-CGBulM4_.js.map → AgentDetailPage-BN8g0Y2G.js.map} +1 -1
- package/dashboard/dist/assets/{AgentsPage-D77JeViQ.js → AgentsPage-7JJBHku8.js} +2 -2
- package/dashboard/dist/assets/{AgentsPage-D77JeViQ.js.map → AgentsPage-7JJBHku8.js.map} +1 -1
- package/dashboard/dist/assets/{AvailableEscalationsPage-CqM_MOMy.js → AvailableEscalationsPage-lz5qwSjg.js} +2 -2
- package/dashboard/dist/assets/{AvailableEscalationsPage-CqM_MOMy.js.map → AvailableEscalationsPage-lz5qwSjg.js.map} +1 -1
- package/dashboard/dist/assets/{BotPicker-CC5vI_Sv.js → BotPicker-CGCnIz8I.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-CC5vI_Sv.js.map → BotPicker-CGCnIz8I.js.map} +1 -1
- package/dashboard/dist/assets/{BulkAssignModal-BXiJnlqt.js → BulkAssignModal-NJBcoj-f.js} +2 -2
- package/dashboard/dist/assets/{BulkAssignModal-BXiJnlqt.js.map → BulkAssignModal-NJBcoj-f.js.map} +1 -1
- package/dashboard/dist/assets/{CapabilitiesPage-D9TC2iKy.js → CapabilitiesPage-F8dpNn9B.js} +2 -2
- package/dashboard/dist/assets/{CapabilitiesPage-D9TC2iKy.js.map → CapabilitiesPage-F8dpNn9B.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-D10lGw_u.js → CollapsibleSection-BZW6VpCU.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-D10lGw_u.js.map → CollapsibleSection-BZW6VpCU.js.map} +1 -1
- package/dashboard/dist/assets/{ConfirmDeleteModal-BJdLN6No.js → ConfirmDeleteModal-64adXLdq.js} +2 -2
- package/dashboard/dist/assets/{ConfirmDeleteModal-BJdLN6No.js.map → ConfirmDeleteModal-64adXLdq.js.map} +1 -1
- package/dashboard/dist/assets/{CountdownTimer-D9B-BjQ7.js → CountdownTimer-BxDub9d2.js} +2 -2
- package/dashboard/dist/assets/{CountdownTimer-D9B-BjQ7.js.map → CountdownTimer-BxDub9d2.js.map} +1 -1
- package/dashboard/dist/assets/{CredentialsPage-hniUAFBK.js → CredentialsPage-CnLzopLL.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-hniUAFBK.js.map → CredentialsPage-CnLzopLL.js.map} +1 -1
- package/dashboard/dist/assets/{CronLabel-v9DCD2FX.js → CronLabel-CAD5UYDT.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-v9DCD2FX.js.map → CronLabel-CAD5UYDT.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-_xvVTK8N.js → ElapsedCell-CwO4ufd0.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-_xvVTK8N.js.map → ElapsedCell-CwO4ufd0.js.map} +1 -1
- package/dashboard/dist/assets/{EntityTimelinePanel-1lT3jkCM.js → EntityTimelinePanel-CkF-oW-m.js} +2 -2
- package/dashboard/dist/assets/{EntityTimelinePanel-1lT3jkCM.js.map → EntityTimelinePanel-CkF-oW-m.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationListSchemaPage-BeQUTUEO.js → EscalationListSchemaPage-h9JO_q5f.js} +2 -2
- package/dashboard/dist/assets/{EscalationListSchemaPage-BeQUTUEO.js.map → EscalationListSchemaPage-h9JO_q5f.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationListView-uuZRMSLB.js → EscalationListView-AHW2xtlr.js} +2 -2
- package/dashboard/dist/assets/{EscalationListView-uuZRMSLB.js.map → EscalationListView-AHW2xtlr.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationSchemaPage-D4VlEwyS.js → EscalationSchemaPage-mJFL5_Se.js} +2 -2
- package/dashboard/dist/assets/{EscalationSchemaPage-D4VlEwyS.js.map → EscalationSchemaPage-mJFL5_Se.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-Bx6Zrzm-.js → EscalationsOverview-DlXUFqWJ.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-Bx6Zrzm-.js.map → EscalationsOverview-DlXUFqWJ.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-KEC3YWBf.js → EventTable-Ike2xchn.js} +2 -2
- package/dashboard/dist/assets/{EventTable-KEC3YWBf.js.map → EventTable-Ike2xchn.js.map} +1 -1
- package/dashboard/dist/assets/{FilterBar-xwN_b5fj.js → FilterBar-DMOR-O1c.js} +2 -2
- package/dashboard/dist/assets/{FilterBar-xwN_b5fj.js.map → FilterBar-DMOR-O1c.js.map} +1 -1
- package/dashboard/dist/assets/{GraphInvokePage-DV7Y0fe2.js → GraphInvokePage-CKtvWowP.js} +2 -2
- package/dashboard/dist/assets/{GraphInvokePage-DV7Y0fe2.js.map → GraphInvokePage-CKtvWowP.js.map} +1 -1
- package/dashboard/dist/assets/{HomePage-G785SWcW.js → HomePage-BQ3Q791Q.js} +2 -2
- package/dashboard/dist/assets/{HomePage-G785SWcW.js.map → HomePage-BQ3Q791Q.js.map} +1 -1
- package/dashboard/dist/assets/{ListToolbar-zPVYPg3W.js → ListToolbar-DdJzj472.js} +2 -2
- package/dashboard/dist/assets/{ListToolbar-zPVYPg3W.js.map → ListToolbar-DdJzj472.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-CMGUq8hx.js → McpOverview-BbtrduWn.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-CMGUq8hx.js.map → McpOverview-BbtrduWn.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryDetailPage-CdhLhaKn.js → McpQueryDetailPage-C1L4T-Wt.js} +2 -2
- package/dashboard/dist/assets/{McpQueryDetailPage-CdhLhaKn.js.map → McpQueryDetailPage-C1L4T-Wt.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryPage-CNSNMagY.js → McpQueryPage-CfJy7HZ7.js} +2 -2
- package/dashboard/dist/assets/{McpQueryPage-CNSNMagY.js.map → McpQueryPage-CfJy7HZ7.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunDetailPage-DBm8hUaW.js → McpRunDetailPage-CA9yv7he.js} +2 -2
- package/dashboard/dist/assets/{McpRunDetailPage-DBm8hUaW.js.map → McpRunDetailPage-CA9yv7he.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunsPage-B6rb5QBf.js → McpRunsPage-D7QXjW9z.js} +2 -2
- package/dashboard/dist/assets/{McpRunsPage-B6rb5QBf.js.map → McpRunsPage-D7QXjW9z.js.map} +1 -1
- package/dashboard/dist/assets/{OperationsPage-Dxk1fAMg.js → OperationsPage-aLHHAP2X.js} +2 -2
- package/dashboard/dist/assets/{OperationsPage-Dxk1fAMg.js.map → OperationsPage-aLHHAP2X.js.map} +1 -1
- package/dashboard/dist/assets/{OperatorDashboard-DBOscDnf.js → OperatorDashboard-sXNDh1Ph.js} +2 -2
- package/dashboard/dist/assets/{OperatorDashboard-DBOscDnf.js.map → OperatorDashboard-sXNDh1Ph.js.map} +1 -1
- package/dashboard/dist/assets/{PersonaDetailPage-BGRdGpeR.js → PersonaDetailPage-NeHD-Gra.js} +2 -2
- package/dashboard/dist/assets/{PersonaDetailPage-BGRdGpeR.js.map → PersonaDetailPage-NeHD-Gra.js.map} +1 -1
- package/dashboard/dist/assets/{PersonasPage-DRzOZcVa.js → PersonasPage-DavKXRWX.js} +2 -2
- package/dashboard/dist/assets/{PersonasPage-DRzOZcVa.js.map → PersonasPage-DavKXRWX.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessDetailPage-BLGjZXpM.js → ProcessDetailPage-DkdKJGe6.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-BLGjZXpM.js.map → ProcessDetailPage-DkdKJGe6.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessesListPage-5NnysKFC.js → ProcessesListPage-CjwVKe32.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-5NnysKFC.js.map → ProcessesListPage-CjwVKe32.js.map} +1 -1
- package/dashboard/dist/assets/ResolverForm-Bk-wDkN-.js +3 -0
- package/dashboard/dist/assets/ResolverForm-Bk-wDkN-.js.map +1 -0
- package/dashboard/dist/assets/{RoleDetailPage-C_LIoe1j.js → RoleDetailPage-WQt0y5l7.js} +3 -3
- package/dashboard/dist/assets/{RoleDetailPage-C_LIoe1j.js.map → RoleDetailPage-WQt0y5l7.js.map} +1 -1
- package/dashboard/dist/assets/{RolesPage-BmW1LzkU.js → RolesPage-OM9KM8Pg.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-BmW1LzkU.js.map → RolesPage-OM9KM8Pg.js.map} +1 -1
- package/dashboard/dist/assets/{RunAsSelector-BwZTJ4Yj.js → RunAsSelector-fFMt1bGe.js} +2 -2
- package/dashboard/dist/assets/{RunAsSelector-BwZTJ4Yj.js.map → RunAsSelector-fFMt1bGe.js.map} +1 -1
- package/dashboard/dist/assets/ScanCodesPage-AujH-pPQ.js +2 -0
- package/dashboard/dist/assets/{ScanCodesPage-FiYIYB-m.js.map → ScanCodesPage-AujH-pPQ.js.map} +1 -1
- package/dashboard/dist/assets/{ScanSchemeDetailPage-BiAqtD-a.js → ScanSchemeDetailPage-eKQpmsC_.js} +2 -2
- package/dashboard/dist/assets/{ScanSchemeDetailPage-BiAqtD-a.js.map → ScanSchemeDetailPage-eKQpmsC_.js.map} +1 -1
- package/dashboard/dist/assets/{ScanStationPage-8CdOtbCD.js → ScanStationPage-C1_ppDoZ.js} +2 -2
- package/dashboard/dist/assets/{ScanStationPage-8CdOtbCD.js.map → ScanStationPage-C1_ppDoZ.js.map} +1 -1
- package/dashboard/dist/assets/{StickyPagination-DRuqKhZt.js → StickyPagination-B91Pk9xh.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-DRuqKhZt.js.map → StickyPagination-B91Pk9xh.js.map} +1 -1
- package/dashboard/dist/assets/{StreamMessageDetail-JwlbRiMn.js → StreamMessageDetail-C7SPqaJt.js} +2 -2
- package/dashboard/dist/assets/{StreamMessageDetail-JwlbRiMn.js.map → StreamMessageDetail-C7SPqaJt.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-hu3c4bCJ.js → SwimlaneTimeline-BcHR8ylf.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-hu3c4bCJ.js.map → SwimlaneTimeline-BcHR8ylf.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-NqVZF3jW.js → TaskDetailPage-Bqj0I_I0.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-NqVZF3jW.js.map → TaskDetailPage-Bqj0I_I0.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-BQNaSzCn.js → TasksListPage-BB1f79lL.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-BQNaSzCn.js.map → TasksListPage-BB1f79lL.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-Cv35DOiI.js → TimeAgo-BFnODmNe.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-Cv35DOiI.js.map → TimeAgo-BFnODmNe.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-DHUXey9s.js → TimestampCell-BXgLOBsr.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-DHUXey9s.js.map → TimestampCell-BXgLOBsr.js.map} +1 -1
- package/dashboard/dist/assets/{ToolTestPanel-DvuLFWqQ.js → ToolTestPanel-Bwe3J5lj.js} +2 -2
- package/dashboard/dist/assets/{ToolTestPanel-DvuLFWqQ.js.map → ToolTestPanel-Bwe3J5lj.js.map} +1 -1
- package/dashboard/dist/assets/{TopicDetailPage-TXX3QNSo.js → TopicDetailPage-DAF07vZ9.js} +2 -2
- package/dashboard/dist/assets/{TopicDetailPage-TXX3QNSo.js.map → TopicDetailPage-DAF07vZ9.js.map} +1 -1
- package/dashboard/dist/assets/{TopicsPage-h-oyTeEJ.js → TopicsPage-C1gxBUap.js} +2 -2
- package/dashboard/dist/assets/{TopicsPage-h-oyTeEJ.js.map → TopicsPage-C1gxBUap.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-BceRCeDF.js → UserName-BzXJUE6q.js} +2 -2
- package/dashboard/dist/assets/{UserName-BceRCeDF.js.map → UserName-BzXJUE6q.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowExecutionPage-CmHGcaN9.js → WorkflowExecutionPage-SkRU5cRX.js} +2 -2
- package/dashboard/dist/assets/{WorkflowExecutionPage-CmHGcaN9.js.map → WorkflowExecutionPage-SkRU5cRX.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsDashboard-B0r2lQXk.js → WorkflowsDashboard-CZAqRk1N.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsDashboard-B0r2lQXk.js.map → WorkflowsDashboard-CZAqRk1N.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsOverview-BTMc2PJ_.js → WorkflowsOverview-BoN44VTE.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-BTMc2PJ_.js.map → WorkflowsOverview-BoN44VTE.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-DUiCVnZp.js → YamlWorkflowDetailPage-CqjhtdJf.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-DUiCVnZp.js.map → YamlWorkflowDetailPage-CqjhtdJf.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowsPage-BAuXfwi0.js → YamlWorkflowsPage-CwnJkzyb.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowsPage-BAuXfwi0.js.map → YamlWorkflowsPage-CwnJkzyb.js.map} +1 -1
- package/dashboard/dist/assets/{agents-BvmLCk4h.js → agents-gV0Ys-sY.js} +2 -2
- package/dashboard/dist/assets/{agents-BvmLCk4h.js.map → agents-gV0Ys-sY.js.map} +1 -1
- package/dashboard/dist/assets/{bots-f_tyhl4I.js → bots-B97itB3I.js} +2 -2
- package/dashboard/dist/assets/{bots-f_tyhl4I.js.map → bots-B97itB3I.js.map} +1 -1
- package/dashboard/dist/assets/{capabilities-DNo5bqLx.js → capabilities-CR9xZgGd.js} +2 -2
- package/dashboard/dist/assets/{capabilities-DNo5bqLx.js.map → capabilities-CR9xZgGd.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-Dyyj2Irb.js → controlplane-YxvP1KCa.js} +2 -2
- package/dashboard/dist/assets/{controlplane-Dyyj2Irb.js.map → controlplane-YxvP1KCa.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-columns-DIigeTOK.js → escalation-columns-uq-IV2aj.js} +2 -2
- package/dashboard/dist/assets/{escalation-columns-DIigeTOK.js.map → escalation-columns-uq-IV2aj.js.map} +1 -1
- package/dashboard/dist/assets/index-3ezfWLkE.js +6 -0
- package/dashboard/dist/assets/index-3ezfWLkE.js.map +1 -0
- package/dashboard/dist/assets/{index-CsKiRyhy.js → index-B9BBCqLI.js} +2 -2
- package/dashboard/dist/assets/{index-CsKiRyhy.js.map → index-B9BBCqLI.js.map} +1 -1
- package/dashboard/dist/assets/{index-DL83W7Gu.js → index-BQpV-DTG.js} +2 -2
- package/dashboard/dist/assets/{index-DL83W7Gu.js.map → index-BQpV-DTG.js.map} +1 -1
- package/dashboard/dist/assets/index-Bp9KBLT5.js +2 -0
- package/dashboard/dist/assets/{index-D7ESqn22.js.map → index-Bp9KBLT5.js.map} +1 -1
- package/dashboard/dist/assets/{index-DvxxrFBo.js → index-CFbo9FU9.js} +2 -2
- package/dashboard/dist/assets/{index-DvxxrFBo.js.map → index-CFbo9FU9.js.map} +1 -1
- package/dashboard/dist/assets/{index-e2X-s0EQ.js → index-CIpHj4di.js} +2 -2
- package/dashboard/dist/assets/{index-e2X-s0EQ.js.map → index-CIpHj4di.js.map} +1 -1
- package/dashboard/dist/assets/{index-BMlQYOE1.js → index-CIwlVfvV.js} +10 -10
- package/dashboard/dist/assets/index-CIwlVfvV.js.map +1 -0
- package/dashboard/dist/assets/{index-BNZknxFY.js → index-CUZ6LYye.js} +2 -2
- package/dashboard/dist/assets/{index-BNZknxFY.js.map → index-CUZ6LYye.js.map} +1 -1
- package/dashboard/dist/assets/index-Cfvkl2J0.js +13 -0
- package/dashboard/dist/assets/index-Cfvkl2J0.js.map +1 -0
- package/dashboard/dist/assets/{index-DWse7ERF.js → index-DMeaiKgf.js} +2 -2
- package/dashboard/dist/assets/{index-DWse7ERF.js.map → index-DMeaiKgf.js.map} +1 -1
- package/dashboard/dist/assets/{index-C-Xr2V3F.js → index-DwOnWeu8.js} +2 -2
- package/dashboard/dist/assets/{index-C-Xr2V3F.js.map → index-DwOnWeu8.js.map} +1 -1
- package/dashboard/dist/assets/index-SGyrXGp8.js +3 -0
- package/dashboard/dist/assets/{index-CegPUKpc.js.map → index-SGyrXGp8.js.map} +1 -1
- package/dashboard/dist/assets/{index-PcyGjmBm.js → index-ipqwPavs.js} +2 -2
- package/dashboard/dist/assets/{index-PcyGjmBm.js.map → index-ipqwPavs.js.map} +1 -1
- package/dashboard/dist/assets/invoke-context-DrVyUEfs.js +2 -0
- package/dashboard/dist/assets/invoke-context-DrVyUEfs.js.map +1 -0
- package/dashboard/dist/assets/{knowledge-Coo6CKzo.js → knowledge-XX6cW4Ob.js} +2 -2
- package/dashboard/dist/assets/{knowledge-Coo6CKzo.js.map → knowledge-XX6cW4Ob.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-Cz5eFnP_.js → mcp-CH13hNH2.js} +2 -2
- package/dashboard/dist/assets/{mcp-Cz5eFnP_.js.map → mcp-CH13hNH2.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-BtnuO4LF.js → mcp-query-Duydd3JA.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-BtnuO4LF.js.map → mcp-query-Duydd3JA.js.map} +1 -1
- package/dashboard/dist/assets/{personas-C2-LgpHQ.js → personas-mDk4lLQS.js} +2 -2
- package/dashboard/dist/assets/{personas-C2-LgpHQ.js.map → personas-mDk4lLQS.js.map} +1 -1
- package/dashboard/dist/assets/{pipelines-TuXQvUA-.js → pipelines-B5GcgCeF.js} +2 -2
- package/dashboard/dist/assets/{pipelines-TuXQvUA-.js.map → pipelines-B5GcgCeF.js.map} +1 -1
- package/dashboard/dist/assets/{resolver-payload-C1dXB3n6.js → resolver-payload-m9AGKZ3a.js} +2 -2
- package/dashboard/dist/assets/{resolver-payload-C1dXB3n6.js.map → resolver-payload-m9AGKZ3a.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-OUzpu__z.js → tasks-CItmNsRp.js} +2 -2
- package/dashboard/dist/assets/{tasks-OUzpu__z.js.map → tasks-CItmNsRp.js.map} +1 -1
- package/dashboard/dist/assets/{topics-B8bdrBaW.js → topics-CJYG7BX5.js} +2 -2
- package/dashboard/dist/assets/{topics-B8bdrBaW.js.map → topics-CJYG7BX5.js.map} +1 -1
- package/dashboard/dist/assets/{useDebouncedValue-Cp5ZOtVE.js → useDebouncedValue-BrwgXcp8.js} +2 -2
- package/dashboard/dist/assets/{useDebouncedValue-Cp5ZOtVE.js.map → useDebouncedValue-BrwgXcp8.js.map} +1 -1
- package/dashboard/dist/assets/{useNamespace-DtQe3wZ5.js → useNamespace-CHty0HAS.js} +2 -2
- package/dashboard/dist/assets/{useNamespace-DtQe3wZ5.js.map → useNamespace-CHty0HAS.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-CS22c15X.js → useYamlActivityEvents-CoTsia7t.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-CS22c15X.js.map → useYamlActivityEvents-CoTsia7t.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-HQIki3hI.js → yaml-workflows-CiWwx5rM.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-HQIki3hI.js.map → yaml-workflows-CiWwx5rM.js.map} +1 -1
- package/dashboard/dist/index.html +1 -1
- package/docs/api/http/workflows.md +28 -1
- package/docs/api/mcp/admin.md +40 -4
- package/docs/code-owned-configuration.md +1 -1
- package/docs/dashboard.md +1 -1
- package/docs/design-principles.md +6 -5
- package/docs/hitl/form.md +12 -7
- package/docs/hitl/invoke-form.md +6 -3
- package/docs/hitl/lookups.md +21 -0
- package/docs/hitl/x-lt-validation.md +50 -3
- package/docs/hitl/x-lt-widget.md +21 -0
- package/docs/hitl-guide.md +5 -2
- package/package.json +1 -1
- package/dashboard/dist/assets/ResolverForm-Dy0yirtP.js +0 -2
- package/dashboard/dist/assets/ResolverForm-Dy0yirtP.js.map +0 -1
- package/dashboard/dist/assets/ScanCodesPage-FiYIYB-m.js +0 -2
- package/dashboard/dist/assets/index-BMlQYOE1.js.map +0 -1
- package/dashboard/dist/assets/index-CegPUKpc.js +0 -3
- package/dashboard/dist/assets/index-D7ESqn22.js +0 -2
- package/dashboard/dist/assets/index-DPLssnMW.js +0 -6
- package/dashboard/dist/assets/index-DPLssnMW.js.map +0 -1
- package/dashboard/dist/assets/index-DoETPlJP.js +0 -11
- package/dashboard/dist/assets/index-DoETPlJP.js.map +0 -1
- package/dashboard/dist/assets/seed-form-json-DvPsISxD.js +0 -2
- package/dashboard/dist/assets/seed-form-json-DvPsISxD.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-
|
|
1
|
+
{"version":3,"file":"mcp-CH13hNH2.js","sources":["../../src/api/mcp.ts"],"sourcesContent":["import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { apiFetch } from './client';\nimport type { McpServerRecord, McpToolManifest } from './types';\n\ninterface McpServerListResponse {\n servers: McpServerRecord[];\n total: number;\n}\n\ninterface McpServerFilters {\n status?: string;\n search?: string;\n tags?: string;\n}\n\nexport function useMcpServers(filters: McpServerFilters = {}) {\n const params = new URLSearchParams();\n if (filters.status) params.set('status', filters.status);\n if (filters.search) params.set('search', filters.search);\n if (filters.tags) params.set('tags', filters.tags);\n const qs = params.toString();\n\n return useQuery<McpServerListResponse>({\n queryKey: ['mcpServers', filters],\n queryFn: () => apiFetch(`/mcp/servers${qs ? `?${qs}` : ''}`),\n });\n}\n\nexport function useMcpServer(id: string) {\n return useQuery<McpServerRecord>({\n queryKey: ['mcpServers', id],\n queryFn: () => apiFetch(`/mcp/servers/${id}`),\n enabled: !!id,\n });\n}\n\nexport function useCreateMcpServer() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (data: {\n name: string;\n description?: string;\n transport_type: string;\n transport_config: Record<string, unknown>;\n auto_connect?: boolean;\n metadata?: Record<string, unknown>;\n tags?: string[];\n compile_hints?: string;\n credential_providers?: string[];\n }) =>\n apiFetch('/mcp/servers', {\n method: 'POST',\n body: JSON.stringify(data),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['mcpServers'] });\n },\n });\n}\n\nexport function useUpdateMcpServer() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({\n id,\n ...data\n }: {\n id: string;\n name?: string;\n description?: string;\n transport_type?: string;\n transport_config?: Record<string, unknown>;\n auto_connect?: boolean;\n metadata?: Record<string, unknown>;\n tags?: string[];\n compile_hints?: string;\n credential_providers?: string[];\n }) =>\n apiFetch(`/mcp/servers/${id}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['mcpServers'] });\n },\n });\n}\n\nexport interface TestConnectionResult {\n success: boolean;\n tools: McpToolManifest[];\n error?: string;\n}\n\nexport function useTestConnection() {\n return useMutation<TestConnectionResult, Error, { transport_type: string; transport_config: Record<string, unknown> }>({\n mutationFn: (data) =>\n apiFetch('/mcp/servers/test-connection', {\n method: 'POST',\n body: JSON.stringify(data),\n }),\n });\n}\n\nexport function useDeleteMcpServer() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch(`/mcp/servers/${id}`, { method: 'DELETE' }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['mcpServers'] });\n },\n });\n}\n\nexport function useConnectMcpServer() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch(`/mcp/servers/${id}/connect`, { method: 'POST' }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['mcpServers'] });\n },\n });\n}\n\nexport function useDisconnectMcpServer() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch(`/mcp/servers/${id}/disconnect`, { method: 'POST' }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['mcpServers'] });\n },\n });\n}\n\nexport function useMcpTools(serverId: string) {\n return useQuery<{ tools: McpToolManifest[] }>({\n queryKey: ['mcpTools', serverId],\n queryFn: () => apiFetch(`/mcp/servers/${serverId}/tools`),\n enabled: !!serverId,\n });\n}\n\nexport interface CredentialStatus {\n required: string[];\n registered: string[];\n missing: string[];\n}\n\nexport function useCredentialStatus(serverId: string) {\n return useQuery<CredentialStatus>({\n queryKey: ['mcpCredentialStatus', serverId],\n queryFn: () => apiFetch(`/mcp/servers/${serverId}/credential-status`),\n enabled: !!serverId,\n staleTime: 30_000,\n });\n}\n\nexport function useCallMcpTool() {\n return useMutation({\n mutationFn: ({\n serverId,\n toolName,\n arguments: args,\n execute_as,\n }: {\n serverId: string;\n toolName: string;\n arguments: Record<string, unknown>;\n execute_as?: string;\n }) =>\n apiFetch(`/mcp/servers/${serverId}/tools/${toolName}/call`, {\n method: 'POST',\n body: JSON.stringify({ arguments: args, ...(execute_as ? { execute_as } : {}) }),\n }),\n });\n}\n"],"names":["useMcpServers","filters","params","qs","useQuery","apiFetch","useMcpServer","id","useCreateMcpServer","queryClient","useQueryClient","useMutation","data","useUpdateMcpServer","useTestConnection","useDeleteMcpServer","useConnectMcpServer","useDisconnectMcpServer","useCallMcpTool","serverId","toolName","args","execute_as"],"mappings":"qGAeO,SAASA,EAAcC,EAA4B,GAAI,CAC5D,MAAMC,EAAS,IAAI,gBACfD,EAAQ,QAAQC,EAAO,IAAI,SAAUD,EAAQ,MAAM,EACnDA,EAAQ,QAAQC,EAAO,IAAI,SAAUD,EAAQ,MAAM,EACnDA,EAAQ,MAAMC,EAAO,IAAI,OAAQD,EAAQ,IAAI,EACjD,MAAME,EAAKD,EAAO,SAAA,EAElB,OAAOE,EAAgC,CACrC,SAAU,CAAC,aAAcH,CAAO,EAChC,QAAS,IAAMI,EAAS,eAAeF,EAAK,IAAIA,CAAE,GAAK,EAAE,EAAE,CAAA,CAC5D,CACH,CAEO,SAASG,EAAaC,EAAY,CACvC,OAAOH,EAA0B,CAC/B,SAAU,CAAC,aAAcG,CAAE,EAC3B,QAAS,IAAMF,EAAS,gBAAgBE,CAAE,EAAE,EAC5C,QAAS,CAAC,CAACA,CAAA,CACZ,CACH,CAEO,SAASC,GAAqB,CACnC,MAAMC,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAaC,GAWXP,EAAS,eAAgB,CACvB,OAAQ,OACR,KAAM,KAAK,UAAUO,CAAI,CAAA,CAC1B,EACH,UAAW,IAAM,CACfH,EAAY,kBAAkB,CAAE,SAAU,CAAC,YAAY,EAAG,CAC5D,CAAA,CACD,CACH,CAEO,SAASI,GAAqB,CACnC,MAAMJ,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAY,CAAC,CACX,GAAAJ,EACA,GAAGK,CAAA,IAaHP,EAAS,gBAAgBE,CAAE,GAAI,CAC7B,OAAQ,MACR,KAAM,KAAK,UAAUK,CAAI,CAAA,CAC1B,EACH,UAAW,IAAM,CACfH,EAAY,kBAAkB,CAAE,SAAU,CAAC,YAAY,EAAG,CAC5D,CAAA,CACD,CACH,CAQO,SAASK,GAAoB,CAClC,OAAOH,EAAgH,CACrH,WAAaC,GACXP,EAAS,+BAAgC,CACvC,OAAQ,OACR,KAAM,KAAK,UAAUO,CAAI,CAAA,CAC1B,CAAA,CACJ,CACH,CAEO,SAASG,GAAqB,CACnC,MAAMN,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAaJ,GACXF,EAAS,gBAAgBE,CAAE,GAAI,CAAE,OAAQ,SAAU,EACrD,UAAW,IAAM,CACfE,EAAY,kBAAkB,CAAE,SAAU,CAAC,YAAY,EAAG,CAC5D,CAAA,CACD,CACH,CAEO,SAASO,GAAsB,CACpC,MAAMP,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAaJ,GACXF,EAAS,gBAAgBE,CAAE,WAAY,CAAE,OAAQ,OAAQ,EAC3D,UAAW,IAAM,CACfE,EAAY,kBAAkB,CAAE,SAAU,CAAC,YAAY,EAAG,CAC5D,CAAA,CACD,CACH,CAEO,SAASQ,GAAyB,CACvC,MAAMR,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAaJ,GACXF,EAAS,gBAAgBE,CAAE,cAAe,CAAE,OAAQ,OAAQ,EAC9D,UAAW,IAAM,CACfE,EAAY,kBAAkB,CAAE,SAAU,CAAC,YAAY,EAAG,CAC5D,CAAA,CACD,CACH,CAyBO,SAASS,GAAiB,CAC/B,OAAOP,EAAY,CACjB,WAAY,CAAC,CACX,SAAAQ,EACA,SAAAC,EACA,UAAWC,EACX,WAAAC,CAAA,IAOAjB,EAAS,gBAAgBc,CAAQ,UAAUC,CAAQ,QAAS,CAC1D,OAAQ,OACR,KAAM,KAAK,UAAU,CAAE,UAAWC,EAAM,GAAIC,EAAa,CAAE,WAAAA,CAAA,EAAe,GAAK,CAAA,CAChF,CAAA,CACJ,CACH"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{u as r,b as i,c as n}from"./vendor-query-DvWWuNIB.js";import{m as u}from"./index-
|
|
2
|
-
//# sourceMappingURL=mcp-query-
|
|
1
|
+
import{u as r,b as i,c as n}from"./vendor-query-DvWWuNIB.js";import{m as u}from"./index-CIwlVfvV.js";const s=["mcpQueryJobs"];function o(){const e=i();return n({mutationFn:t=>u("/insight/mcp-query",{method:"POST",body:JSON.stringify({...t,wait:!1,direct:!0})}),onSuccess:()=>{e.invalidateQueries({queryKey:s,refetchType:"all"}),e.invalidateQueries({queryKey:["jobs"],refetchType:"all"})}})}function a(){const e=i();return n({mutationFn:t=>u("/insight/mcp-query",{method:"POST",body:JSON.stringify({...t,wait:!1})}),onSuccess:()=>{e.invalidateQueries({queryKey:s,refetchType:"all"}),e.invalidateQueries({queryKey:["jobs"],refetchType:"all"})}})}function m(e={}){const t=new URLSearchParams;return t.set("entity",e.entity||"mcpQuery,mcpTriage,mcpWorkflowPlanner"),e.limit&&t.set("limit",String(e.limit)),e.offset!==void 0&&t.set("offset",String(e.offset)),e.search&&t.set("search",e.search),e.status&&t.set("status",e.status),t.set("sort_by","created_at"),t.set("order","desc"),r({queryKey:[...s,e],queryFn:()=>u(`/workflow-states/jobs?${t}`)})}function l(e){return r({queryKey:["mcpQueryExecution",e],queryFn:()=>u(`/workflow-states/${e}/execution`),enabled:!!e})}function p(e){return r({queryKey:["mcpQueryResult",e],queryFn:()=>u(`/workflows/${e}/result`),enabled:!!e,retry:2})}function f(e){return r({queryKey:["mcpQueryDescribe",e.prompt],queryFn:()=>u("/insight/mcp-query/describe",{method:"POST",body:JSON.stringify({prompt:e.prompt,result_title:e.resultTitle,result_summary:e.resultSummary})}),enabled:!!e.prompt,staleTime:1/0,gcTime:30*6e4})}function b(e){return r({queryKey:["yamlWorkflowForSource",e],queryFn:()=>u(`/yaml-workflows?source_workflow_id=${e}&limit=5`),enabled:!!e})}export{o as a,a as b,l as c,p as d,b as e,f,m as u};
|
|
2
|
+
//# sourceMappingURL=mcp-query-Duydd3JA.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-query-
|
|
1
|
+
{"version":3,"file":"mcp-query-Duydd3JA.js","sources":["../../src/api/mcp-query.ts"],"sourcesContent":["import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { apiFetch } from './client';\nimport type { LTJob, WorkflowExecution } from './types';\n\n// ── Types ───────────────────────────────────────────────────────────────────\n\nexport interface McpQuerySubmitResult {\n workflow_id: string;\n status: string;\n prompt: string;\n}\n\n// ── Query keys ──────────────────────────────────────────────────────────────\n\nexport const MCP_QUERY_JOBS_KEY = ['mcpQueryJobs'] as const;\n\n// ── Hooks ───────────────────────────────────────────────────────────────────\n\n/**\n * Submit a DIRECT mcpQuery (bypasses router — always dynamic MCP orchestration).\n * Used by the MCP Queries list page where the user explicitly wants a new dynamic seed run.\n */\nexport function useSubmitMcpQuery() {\n const queryClient = useQueryClient();\n return useMutation<McpQuerySubmitResult, Error, { prompt: string; tags?: string[] }>({\n mutationFn: (params) =>\n apiFetch<McpQuerySubmitResult>('/insight/mcp-query', {\n method: 'POST',\n body: JSON.stringify({ ...params, wait: false, direct: true }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: MCP_QUERY_JOBS_KEY, refetchType: 'all' });\n queryClient.invalidateQueries({ queryKey: ['jobs'], refetchType: 'all' });\n },\n });\n}\n\n/**\n * Submit via mcpQueryRouter (checks for deterministic match first).\n * Used by the Verify panel (Panel 6) to test end-to-end routing.\n */\nexport function useSubmitMcpQueryRouted() {\n const queryClient = useQueryClient();\n return useMutation<McpQuerySubmitResult, Error, { prompt: string; tags?: string[] }>({\n mutationFn: (params) =>\n apiFetch<McpQuerySubmitResult>('/insight/mcp-query', {\n method: 'POST',\n body: JSON.stringify({ ...params, wait: false }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: MCP_QUERY_JOBS_KEY, refetchType: 'all' });\n queryClient.invalidateQueries({ queryKey: ['jobs'], refetchType: 'all' });\n },\n });\n}\n\n/**\n * List mcpQuery workflow executions (system-level durable workflows).\n * Filters to entity=mcpQuery on the long-tail-system task queue.\n */\nexport function useMcpQueryJobs(filters: {\n limit?: number;\n offset?: number;\n search?: string;\n status?: string;\n entity?: string;\n} = {}) {\n const params = new URLSearchParams();\n params.set('entity', filters.entity || 'mcpQuery,mcpTriage,mcpWorkflowPlanner');\n if (filters.limit) params.set('limit', String(filters.limit));\n if (filters.offset !== undefined) params.set('offset', String(filters.offset));\n if (filters.search) params.set('search', filters.search);\n if (filters.status) params.set('status', filters.status);\n params.set('sort_by', 'created_at');\n params.set('order', 'desc');\n\n return useQuery<{ jobs: LTJob[]; total: number }>({\n queryKey: [...MCP_QUERY_JOBS_KEY, filters],\n queryFn: () => apiFetch(`/workflow-states/jobs?${params}`),\n });\n}\n\n/**\n * Get execution timeline for an mcpQuery workflow.\n */\nexport function useMcpQueryExecution(workflowId: string | undefined) {\n return useQuery<WorkflowExecution>({\n queryKey: ['mcpQueryExecution', workflowId],\n queryFn: () => apiFetch(`/workflow-states/${workflowId}/execution`),\n enabled: !!workflowId,\n });\n}\n\n/**\n * Get the result data from a completed mcpQuery workflow.\n */\nexport function useMcpQueryResult(workflowId: string | undefined) {\n return useQuery<{ workflowId: string; result: { type: string; data: Record<string, unknown> } }>({\n queryKey: ['mcpQueryResult', workflowId],\n queryFn: () => apiFetch(`/workflows/${workflowId}/result`),\n enabled: !!workflowId,\n retry: 2,\n });\n}\n\n/**\n * Generate a workflow description and tags from the original prompt + result.\n * Uses an LLM to produce a concise, catalog-style description.\n */\nexport function useDescribeMcpQuery(params: {\n prompt: string | undefined;\n resultTitle: string | undefined;\n resultSummary: string | undefined;\n}) {\n return useQuery<{ tool_name?: string; description: string; tags: string[] }>({\n queryKey: ['mcpQueryDescribe', params.prompt],\n queryFn: () =>\n apiFetch<{ tool_name?: string; description: string; tags: string[] }>('/insight/mcp-query/describe', {\n method: 'POST',\n body: JSON.stringify({\n prompt: params.prompt,\n result_title: params.resultTitle,\n result_summary: params.resultSummary,\n }),\n }),\n enabled: !!params.prompt,\n staleTime: Infinity,\n gcTime: 30 * 60_000,\n });\n}\n\n/**\n * Find a YAML workflow compiled from a specific mcpQuery execution.\n */\nexport function useYamlWorkflowForSource(sourceWorkflowId: string | undefined) {\n return useQuery<{ workflows: Array<{\n id: string; name: string; status: string; graph_topic: string;\n description?: string; tags?: string[]; app_id?: string;\n input_schema?: Record<string, unknown>;\n activity_manifest?: Array<{\n activity_id: string; title: string; type: string;\n tool_source: string; mcp_tool_name?: string;\n }>;\n original_prompt?: string;\n }> }>({\n queryKey: ['yamlWorkflowForSource', sourceWorkflowId],\n queryFn: () => apiFetch(`/yaml-workflows?source_workflow_id=${sourceWorkflowId}&limit=5`),\n enabled: !!sourceWorkflowId,\n });\n}\n"],"names":["MCP_QUERY_JOBS_KEY","useSubmitMcpQuery","queryClient","useQueryClient","useMutation","params","apiFetch","useSubmitMcpQueryRouted","useMcpQueryJobs","filters","useQuery","useMcpQueryExecution","workflowId","useMcpQueryResult","useDescribeMcpQuery","useYamlWorkflowForSource","sourceWorkflowId"],"mappings":"qGAcO,MAAMA,EAAqB,CAAC,cAAc,EAQ1C,SAASC,GAAoB,CAClC,MAAMC,EAAcC,EAAA,EACpB,OAAOC,EAA8E,CACnF,WAAaC,GACXC,EAA+B,qBAAsB,CACnD,OAAQ,OACR,KAAM,KAAK,UAAU,CAAE,GAAGD,EAAQ,KAAM,GAAO,OAAQ,EAAA,CAAM,CAAA,CAC9D,EACH,UAAW,IAAM,CACfH,EAAY,kBAAkB,CAAE,SAAUF,EAAoB,YAAa,MAAO,EAClFE,EAAY,kBAAkB,CAAE,SAAU,CAAC,MAAM,EAAG,YAAa,MAAO,CAC1E,CAAA,CACD,CACH,CAMO,SAASK,GAA0B,CACxC,MAAML,EAAcC,EAAA,EACpB,OAAOC,EAA8E,CACnF,WAAaC,GACXC,EAA+B,qBAAsB,CACnD,OAAQ,OACR,KAAM,KAAK,UAAU,CAAE,GAAGD,EAAQ,KAAM,GAAO,CAAA,CAChD,EACH,UAAW,IAAM,CACfH,EAAY,kBAAkB,CAAE,SAAUF,EAAoB,YAAa,MAAO,EAClFE,EAAY,kBAAkB,CAAE,SAAU,CAAC,MAAM,EAAG,YAAa,MAAO,CAC1E,CAAA,CACD,CACH,CAMO,SAASM,EAAgBC,EAM5B,GAAI,CACN,MAAMJ,EAAS,IAAI,gBACnB,OAAAA,EAAO,IAAI,SAAUI,EAAQ,QAAU,uCAAuC,EAC1EA,EAAQ,OAAOJ,EAAO,IAAI,QAAS,OAAOI,EAAQ,KAAK,CAAC,EACxDA,EAAQ,SAAW,QAAWJ,EAAO,IAAI,SAAU,OAAOI,EAAQ,MAAM,CAAC,EACzEA,EAAQ,QAAQJ,EAAO,IAAI,SAAUI,EAAQ,MAAM,EACnDA,EAAQ,QAAQJ,EAAO,IAAI,SAAUI,EAAQ,MAAM,EACvDJ,EAAO,IAAI,UAAW,YAAY,EAClCA,EAAO,IAAI,QAAS,MAAM,EAEnBK,EAA2C,CAChD,SAAU,CAAC,GAAGV,EAAoBS,CAAO,EACzC,QAAS,IAAMH,EAAS,yBAAyBD,CAAM,EAAE,CAAA,CAC1D,CACH,CAKO,SAASM,EAAqBC,EAAgC,CACnE,OAAOF,EAA4B,CACjC,SAAU,CAAC,oBAAqBE,CAAU,EAC1C,QAAS,IAAMN,EAAS,oBAAoBM,CAAU,YAAY,EAClE,QAAS,CAAC,CAACA,CAAA,CACZ,CACH,CAKO,SAASC,EAAkBD,EAAgC,CAChE,OAAOF,EAA0F,CAC/F,SAAU,CAAC,iBAAkBE,CAAU,EACvC,QAAS,IAAMN,EAAS,cAAcM,CAAU,SAAS,EACzD,QAAS,CAAC,CAACA,EACX,MAAO,CAAA,CACR,CACH,CAMO,SAASE,EAAoBT,EAIjC,CACD,OAAOK,EAAsE,CAC3E,SAAU,CAAC,mBAAoBL,EAAO,MAAM,EAC5C,QAAS,IACPC,EAAsE,8BAA+B,CACnG,OAAQ,OACR,KAAM,KAAK,UAAU,CACnB,OAAQD,EAAO,OACf,aAAcA,EAAO,YACrB,eAAgBA,EAAO,aAAA,CACxB,CAAA,CACF,EACH,QAAS,CAAC,CAACA,EAAO,OAClB,UAAW,IACX,OAAQ,GAAK,GAAA,CACd,CACH,CAKO,SAASU,EAAyBC,EAAsC,CAC7E,OAAON,EASD,CACJ,SAAU,CAAC,wBAAyBM,CAAgB,EACpD,QAAS,IAAMV,EAAS,sCAAsCU,CAAgB,UAAU,EACxF,QAAS,CAAC,CAACA,CAAA,CACZ,CACH"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{u as t,b as o,c as u}from"./vendor-query-DvWWuNIB.js";import{m as s}from"./index-
|
|
2
|
-
//# sourceMappingURL=personas-
|
|
1
|
+
import{u as t,b as o,c as u}from"./vendor-query-DvWWuNIB.js";import{m as s}from"./index-CIwlVfvV.js";function c(){return t({queryKey:["personas"],queryFn:()=>s("/personas")})}function d(e){return t({queryKey:["personas",e],queryFn:()=>s(`/personas/${encodeURIComponent(e)}`),enabled:!!e})}function p(){const e=o();return u({mutationFn:n=>s("/personas",{method:"POST",body:JSON.stringify(n)}),onSuccess:()=>{e.invalidateQueries({queryKey:["personas"]})}})}function l(){const e=o();return u({mutationFn:({key:n,...r})=>s(`/personas/${encodeURIComponent(n)}`,{method:"PATCH",body:JSON.stringify(r)}),onSuccess:()=>{e.invalidateQueries({queryKey:["personas"]})}})}function m(){const e=o();return u({mutationFn:n=>s(`/personas/${encodeURIComponent(n)}`,{method:"DELETE"}),onSuccess:()=>{e.invalidateQueries({queryKey:["personas"]}),e.invalidateQueries({queryKey:["users"]})}})}function q(){const e=o();return u({mutationFn:({key:n,role:r,relationship:a})=>s(`/personas/${encodeURIComponent(n)}/roles/${encodeURIComponent(r)}`,{method:"PUT",body:JSON.stringify({relationship:a})}),onSuccess:()=>{e.invalidateQueries({queryKey:["personas"]}),e.invalidateQueries({queryKey:["users"]}),e.invalidateQueries({queryKey:["roles"]})}})}function C(){const e=o();return u({mutationFn:({key:n,role:r})=>s(`/personas/${encodeURIComponent(n)}/roles/${encodeURIComponent(r)}`,{method:"DELETE"}),onSuccess:()=>{e.invalidateQueries({queryKey:["personas"]}),e.invalidateQueries({queryKey:["users"]})}})}function f(){const e=o();return u({mutationFn:({userId:n,key:r})=>s(`/users/${n}/personas`,{method:"POST",body:JSON.stringify({persona:r})}),onSuccess:()=>{e.invalidateQueries({queryKey:["personas"]}),e.invalidateQueries({queryKey:["users"]})}})}function K(){const e=o();return u({mutationFn:({userId:n,key:r})=>s(`/users/${n}/personas/${encodeURIComponent(r)}`,{method:"DELETE"}),onSuccess:()=>{e.invalidateQueries({queryKey:["personas"]}),e.invalidateQueries({queryKey:["users"]})}})}function Q(e){return t({queryKey:["users",e,"personas"],queryFn:()=>s(`/users/${e}/personas`),enabled:!!e})}export{Q as a,f as b,K as c,p as d,d as e,l as f,m as g,q as h,C as i,c as u};
|
|
2
|
+
//# sourceMappingURL=personas-mDk4lLQS.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"personas-
|
|
1
|
+
{"version":3,"file":"personas-mDk4lLQS.js","sources":["../../src/api/personas.ts"],"sourcesContent":["import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { apiFetch } from './client';\nimport type {\n LTPersonaRecord,\n LTPersonaDetail,\n LTUserPersona,\n LTComposedRoleScope,\n} from './types/personas';\n\nexport function usePersonas() {\n return useQuery<{ personas: LTPersonaRecord[] }>({\n queryKey: ['personas'],\n queryFn: () => apiFetch('/personas'),\n });\n}\n\nexport function usePersona(key: string) {\n return useQuery<LTPersonaDetail>({\n queryKey: ['personas', key],\n queryFn: () => apiFetch(`/personas/${encodeURIComponent(key)}`),\n enabled: !!key,\n });\n}\n\nexport function useCreatePersona() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (data: { key: string; title?: string; description?: string }) =>\n apiFetch('/personas', { method: 'POST', body: JSON.stringify(data) }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['personas'] });\n },\n });\n}\n\nexport function useUpdatePersona() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ key, ...data }: { key: string; title?: string | null; description?: string | null }) =>\n apiFetch(`/personas/${encodeURIComponent(key)}`, { method: 'PATCH', body: JSON.stringify(data) }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['personas'] });\n },\n });\n}\n\nexport function useDeletePersona() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (key: string) =>\n apiFetch(`/personas/${encodeURIComponent(key)}`, { method: 'DELETE' }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['personas'] });\n // Deleting a persona removes the memberships it sustained.\n queryClient.invalidateQueries({ queryKey: ['users'] });\n },\n });\n}\n\nexport function useLinkPersonaRole() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ key, role, relationship }: { key: string; role: string; relationship: string }) =>\n apiFetch(`/personas/${encodeURIComponent(key)}/roles/${encodeURIComponent(role)}`, {\n method: 'PUT',\n body: JSON.stringify({ relationship }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['personas'] });\n queryClient.invalidateQueries({ queryKey: ['users'] });\n queryClient.invalidateQueries({ queryKey: ['roles'] });\n },\n });\n}\n\nexport function useUnlinkPersonaRole() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ key, role }: { key: string; role: string }) =>\n apiFetch(`/personas/${encodeURIComponent(key)}/roles/${encodeURIComponent(role)}`, {\n method: 'DELETE',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['personas'] });\n queryClient.invalidateQueries({ queryKey: ['users'] });\n },\n });\n}\n\nexport function useAssignPersona() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ userId, key }: { userId: string; key: string }) =>\n apiFetch(`/users/${userId}/personas`, {\n method: 'POST',\n body: JSON.stringify({ persona: key }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['personas'] });\n queryClient.invalidateQueries({ queryKey: ['users'] });\n },\n });\n}\n\nexport function useUnassignPersona() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ userId, key }: { userId: string; key: string }) =>\n apiFetch(`/users/${userId}/personas/${encodeURIComponent(key)}`, { method: 'DELETE' }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['personas'] });\n queryClient.invalidateQueries({ queryKey: ['users'] });\n },\n });\n}\n\nexport function useUserPersonas(userId: string | undefined) {\n return useQuery<{ personas: LTUserPersona[]; roles: LTComposedRoleScope[] }>({\n queryKey: ['users', userId, 'personas'],\n queryFn: () => apiFetch(`/users/${userId}/personas`),\n enabled: !!userId,\n });\n}\n"],"names":["usePersonas","useQuery","apiFetch","usePersona","key","useCreatePersona","queryClient","useQueryClient","useMutation","data","useUpdatePersona","useDeletePersona","useLinkPersonaRole","role","relationship","useUnlinkPersonaRole","useAssignPersona","userId","useUnassignPersona","useUserPersonas"],"mappings":"qGASO,SAASA,GAAc,CAC5B,OAAOC,EAA0C,CAC/C,SAAU,CAAC,UAAU,EACrB,QAAS,IAAMC,EAAS,WAAW,CAAA,CACpC,CACH,CAEO,SAASC,EAAWC,EAAa,CACtC,OAAOH,EAA0B,CAC/B,SAAU,CAAC,WAAYG,CAAG,EAC1B,QAAS,IAAMF,EAAS,aAAa,mBAAmBE,CAAG,CAAC,EAAE,EAC9D,QAAS,CAAC,CAACA,CAAA,CACZ,CACH,CAEO,SAASC,GAAmB,CACjC,MAAMC,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAaC,GACXP,EAAS,YAAa,CAAE,OAAQ,OAAQ,KAAM,KAAK,UAAUO,CAAI,EAAG,EACtE,UAAW,IAAM,CACfH,EAAY,kBAAkB,CAAE,SAAU,CAAC,UAAU,EAAG,CAC1D,CAAA,CACD,CACH,CAEO,SAASI,GAAmB,CACjC,MAAMJ,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAY,CAAC,CAAE,IAAAJ,EAAK,GAAGK,CAAA,IACrBP,EAAS,aAAa,mBAAmBE,CAAG,CAAC,GAAI,CAAE,OAAQ,QAAS,KAAM,KAAK,UAAUK,CAAI,EAAG,EAClG,UAAW,IAAM,CACfH,EAAY,kBAAkB,CAAE,SAAU,CAAC,UAAU,EAAG,CAC1D,CAAA,CACD,CACH,CAEO,SAASK,GAAmB,CACjC,MAAML,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAaJ,GACXF,EAAS,aAAa,mBAAmBE,CAAG,CAAC,GAAI,CAAE,OAAQ,QAAA,CAAU,EACvE,UAAW,IAAM,CACfE,EAAY,kBAAkB,CAAE,SAAU,CAAC,UAAU,EAAG,EAExDA,EAAY,kBAAkB,CAAE,SAAU,CAAC,OAAO,EAAG,CACvD,CAAA,CACD,CACH,CAEO,SAASM,GAAqB,CACnC,MAAMN,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAY,CAAC,CAAE,IAAAJ,EAAK,KAAAS,EAAM,aAAAC,KACxBZ,EAAS,aAAa,mBAAmBE,CAAG,CAAC,UAAU,mBAAmBS,CAAI,CAAC,GAAI,CACjF,OAAQ,MACR,KAAM,KAAK,UAAU,CAAE,aAAAC,EAAc,CAAA,CACtC,EACH,UAAW,IAAM,CACfR,EAAY,kBAAkB,CAAE,SAAU,CAAC,UAAU,EAAG,EACxDA,EAAY,kBAAkB,CAAE,SAAU,CAAC,OAAO,EAAG,EACrDA,EAAY,kBAAkB,CAAE,SAAU,CAAC,OAAO,EAAG,CACvD,CAAA,CACD,CACH,CAEO,SAASS,GAAuB,CACrC,MAAMT,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAY,CAAC,CAAE,IAAAJ,EAAK,KAAAS,KAClBX,EAAS,aAAa,mBAAmBE,CAAG,CAAC,UAAU,mBAAmBS,CAAI,CAAC,GAAI,CACjF,OAAQ,QAAA,CACT,EACH,UAAW,IAAM,CACfP,EAAY,kBAAkB,CAAE,SAAU,CAAC,UAAU,EAAG,EACxDA,EAAY,kBAAkB,CAAE,SAAU,CAAC,OAAO,EAAG,CACvD,CAAA,CACD,CACH,CAEO,SAASU,GAAmB,CACjC,MAAMV,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAY,CAAC,CAAE,OAAAS,EAAQ,IAAAb,KACrBF,EAAS,UAAUe,CAAM,YAAa,CACpC,OAAQ,OACR,KAAM,KAAK,UAAU,CAAE,QAASb,EAAK,CAAA,CACtC,EACH,UAAW,IAAM,CACfE,EAAY,kBAAkB,CAAE,SAAU,CAAC,UAAU,EAAG,EACxDA,EAAY,kBAAkB,CAAE,SAAU,CAAC,OAAO,EAAG,CACvD,CAAA,CACD,CACH,CAEO,SAASY,GAAqB,CACnC,MAAMZ,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAY,CAAC,CAAE,OAAAS,EAAQ,IAAAb,CAAA,IACrBF,EAAS,UAAUe,CAAM,aAAa,mBAAmBb,CAAG,CAAC,GAAI,CAAE,OAAQ,SAAU,EACvF,UAAW,IAAM,CACfE,EAAY,kBAAkB,CAAE,SAAU,CAAC,UAAU,EAAG,EACxDA,EAAY,kBAAkB,CAAE,SAAU,CAAC,OAAO,EAAG,CACvD,CAAA,CACD,CACH,CAEO,SAASa,EAAgBF,EAA4B,CAC1D,OAAOhB,EAAsE,CAC3E,SAAU,CAAC,QAASgB,EAAQ,UAAU,EACtC,QAAS,IAAMf,EAAS,UAAUe,CAAM,WAAW,EACnD,QAAS,CAAC,CAACA,CAAA,CACZ,CACH"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{u as i,c as s}from"./vendor-query-DvWWuNIB.js";import{m as u}from"./index-
|
|
2
|
-
//# sourceMappingURL=pipelines-
|
|
1
|
+
import{u as i,c as s}from"./vendor-query-DvWWuNIB.js";import{m as u}from"./index-CIwlVfvV.js";function p(e={},n){const t=new URLSearchParams;return e.limit&&t.set("limit",String(e.limit)),e.offset!==void 0&&t.set("offset",String(e.offset)),e.entity&&t.set("entity",e.entity),e.search&&t.set("search",e.search),e.status&&t.set("status",e.status),e.sort_by&&t.set("sort_by",e.sort_by),e.order&&t.set("order",e.order),t.set("app_id",e.app_id||""),i({queryKey:["mcpRuns",e],queryFn:()=>u(`/pipelines?${t}`),enabled:(n==null?void 0:n.enabled)??!0})}function c(e=""){return i({queryKey:["mcpEntities",e],queryFn:()=>u(`/pipelines/entities?app_id=${e}`)})}function o(e,n=""){return i({queryKey:["mcpRunExecution",e,n],queryFn:()=>u(`/pipelines/${e}/execution?app_id=${n}`),enabled:!!e})}function y(){return s({mutationFn:e=>u(`/pipelines/${e.jobId}/interrupt`,{method:"POST",body:JSON.stringify({topic:e.topic,app_id:e.appId})})})}export{c as a,o as b,y as c,p as u};
|
|
2
|
+
//# sourceMappingURL=pipelines-B5GcgCeF.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipelines-
|
|
1
|
+
{"version":3,"file":"pipelines-B5GcgCeF.js","sources":["../../src/api/pipelines.ts"],"sourcesContent":["import { useQuery, useMutation } from '@tanstack/react-query';\nimport { apiFetch } from './client';\nimport type { LTJob, WorkflowExecution } from './types';\n\ninterface McpRunFilters {\n limit?: number;\n offset?: number;\n entity?: string;\n search?: string;\n status?: string;\n app_id?: string;\n sort_by?: string;\n order?: string;\n}\n\nexport function useMcpRuns(filters: McpRunFilters = {}, options?: { enabled?: boolean }) {\n const params = new URLSearchParams();\n if (filters.limit) params.set('limit', String(filters.limit));\n if (filters.offset !== undefined) params.set('offset', String(filters.offset));\n if (filters.entity) params.set('entity', filters.entity);\n if (filters.search) params.set('search', filters.search);\n if (filters.status) params.set('status', filters.status);\n if (filters.sort_by) params.set('sort_by', filters.sort_by);\n if (filters.order) params.set('order', filters.order);\n params.set('app_id', filters.app_id || '');\n\n return useQuery<{ jobs: LTJob[]; total: number }>({\n queryKey: ['mcpRuns', filters],\n queryFn: () => apiFetch(`/pipelines?${params}`),\n enabled: options?.enabled ?? true,\n });\n}\n\nexport function useMcpEntities(appId = '') {\n return useQuery<{ entities: string[] }>({\n queryKey: ['mcpEntities', appId],\n queryFn: () => apiFetch(`/pipelines/entities?app_id=${appId}`),\n });\n}\n\nexport function useMcpRunExecution(jobId: string, appId = '') {\n return useQuery<WorkflowExecution>({\n queryKey: ['mcpRunExecution', jobId, appId],\n queryFn: () => apiFetch(`/pipelines/${jobId}/execution?app_id=${appId}`),\n enabled: !!jobId,\n });\n}\n\nexport function useInterruptJob() {\n return useMutation({\n mutationFn: (input: { jobId: string; topic: string; appId: string }) =>\n apiFetch(`/pipelines/${input.jobId}/interrupt`, {\n method: 'POST',\n body: JSON.stringify({ topic: input.topic, app_id: input.appId }),\n }),\n });\n}\n"],"names":["useMcpRuns","filters","options","params","useQuery","apiFetch","useMcpEntities","appId","useMcpRunExecution","jobId","useInterruptJob","useMutation","input"],"mappings":"8FAeO,SAASA,EAAWC,EAAyB,CAAA,EAAIC,EAAiC,CACvF,MAAMC,EAAS,IAAI,gBACnB,OAAIF,EAAQ,OAAOE,EAAO,IAAI,QAAS,OAAOF,EAAQ,KAAK,CAAC,EACxDA,EAAQ,SAAW,QAAWE,EAAO,IAAI,SAAU,OAAOF,EAAQ,MAAM,CAAC,EACzEA,EAAQ,QAAQE,EAAO,IAAI,SAAUF,EAAQ,MAAM,EACnDA,EAAQ,QAAQE,EAAO,IAAI,SAAUF,EAAQ,MAAM,EACnDA,EAAQ,QAAQE,EAAO,IAAI,SAAUF,EAAQ,MAAM,EACnDA,EAAQ,SAASE,EAAO,IAAI,UAAWF,EAAQ,OAAO,EACtDA,EAAQ,OAAOE,EAAO,IAAI,QAASF,EAAQ,KAAK,EACpDE,EAAO,IAAI,SAAUF,EAAQ,QAAU,EAAE,EAElCG,EAA2C,CAChD,SAAU,CAAC,UAAWH,CAAO,EAC7B,QAAS,IAAMI,EAAS,cAAcF,CAAM,EAAE,EAC9C,SAASD,GAAA,YAAAA,EAAS,UAAW,EAAA,CAC9B,CACH,CAEO,SAASI,EAAeC,EAAQ,GAAI,CACzC,OAAOH,EAAiC,CACtC,SAAU,CAAC,cAAeG,CAAK,EAC/B,QAAS,IAAMF,EAAS,8BAA8BE,CAAK,EAAE,CAAA,CAC9D,CACH,CAEO,SAASC,EAAmBC,EAAeF,EAAQ,GAAI,CAC5D,OAAOH,EAA4B,CACjC,SAAU,CAAC,kBAAmBK,EAAOF,CAAK,EAC1C,QAAS,IAAMF,EAAS,cAAcI,CAAK,qBAAqBF,CAAK,EAAE,EACvE,QAAS,CAAC,CAACE,CAAA,CACZ,CACH,CAEO,SAASC,GAAkB,CAChC,OAAOC,EAAY,CACjB,WAAaC,GACXP,EAAS,cAAcO,EAAM,KAAK,aAAc,CAC9C,OAAQ,OACR,KAAM,KAAK,UAAU,CAAE,MAAOA,EAAM,MAAO,OAAQA,EAAM,KAAA,CAAO,CAAA,CACjE,CAAA,CACJ,CACH"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{j as u}from"./vendor-query-DvWWuNIB.js";import{d as x,e as d,v as y}from"./ResolverForm-
|
|
2
|
-
//# sourceMappingURL=resolver-payload-
|
|
1
|
+
import{j as u}from"./vendor-query-DvWWuNIB.js";import{d as x,e as d,v as y}from"./ResolverForm-Bk-wDkN-.js";import{ah as g}from"./vendor-icons-DeBdvyKJ.js";import{e as h}from"./EscalationListView-AHW2xtlr.js";const b={SCHEMA_VALIDATION:"schema_validation"};function C(t){return typeof t=="object"&&t!==null&&t.code===b.SCHEMA_VALIDATION&&Array.isArray(t.violations)}function O({errors:t,schema:e}){const i=r=>{const l=document.querySelector(`[data-field-key="${r}"]`);l&&(l.scrollIntoView({behavior:"smooth",block:"center"}),l.focus({preventScroll:!0}))};return t.length===0?u.jsx("p",{className:"text-xs text-text-tertiary italic",children:"No errors to display."}):u.jsxs("div",{className:"space-y-1",role:"alert","aria-live":"polite",children:[u.jsxs("p",{className:"text-2xs font-semibold uppercase tracking-wider text-status-error mb-4",children:[t.length," ",t.length===1?"issue":"issues"," to resolve"]}),u.jsx("div",{className:"space-y-1.5",children:t.map(({field:r,message:l})=>{var o;return u.jsxs("button",{onClick:()=>i(r),className:"w-full text-left flex items-start gap-3 px-3 py-2.5 rounded hover:bg-status-error/5 transition-colors group",children:[u.jsx(g,{className:"w-3.5 h-3.5 mt-0.5 shrink-0 text-status-error/60 group-hover:text-status-error transition-colors"}),u.jsxs("div",{children:[u.jsx("p",{className:"text-2xs font-semibold text-text-primary leading-snug",children:x(r,(o=e==null?void 0:e.properties)==null?void 0:o[r])}),u.jsx("p",{className:"text-2xs text-text-tertiary group-hover:text-text-secondary transition-colors leading-snug mt-0.5",children:l})]})]},r)})}),u.jsx("p",{className:"text-2xs text-text-quaternary mt-4 px-3",children:"Click an issue to scroll to and focus the field."})]})}const A="x-lt-require-any";function v(t){const e=t==null?void 0:t[A];return Array.isArray(e)?e.filter(i=>Array.isArray(i)).map(i=>i.filter(r=>typeof r=="string"&&r.length>0)).filter(i=>i.length>0):[]}function N(t){return t==null?!1:typeof t=="string"?t.trim().length>0:!0}const j="x-lt-require-sum";function E(t){const e=t==null?void 0:t[j];if(!Array.isArray(e))return[];const i=[];for(const r of e){if(!r||typeof r!="object"||Array.isArray(r))continue;const{fields:l,minimum:o}=r;if(!Array.isArray(l))continue;const a=l.filter(n=>typeof n=="string"&&n.length>0);a.length!==0&&(o!==void 0&&typeof o!="number"||i.push({fields:a,minimum:typeof o=="number"?o:1}))}return i}function _(t){if(typeof t=="number"&&Number.isFinite(t))return t;if(typeof t=="string"&&t.trim()!==""){const e=Number(t);if(!Number.isNaN(e))return e}return 0}function R(t,e,i){if(!t)return[];const r=t.properties??{},l=new Set(t.required??[]),o={...i??{},resolver:e,input:e},a=[];for(const[n,s]of Object.entries(r)){if(!d(s["x-lt-showIf"],o))continue;const p=y(e[n],s,l.has(n),!0,o);p&&a.push({field:n,message:p})}for(const n of v(t)){const s=n.filter(c=>r[c]&&d(r[c]["x-lt-showIf"],o));if(s.length===0||s.some(c=>N(e[c])))continue;const p=s.map(c=>r[c].title??c);a.push({field:s[0],message:`Enter a value for at least one of: ${p.join(", ")}`})}for(const n of E(t)){const s=n.fields.filter(f=>r[f]&&d(r[f]["x-lt-showIf"],o));if(s.length===0||s.reduce((f,m)=>f+_(e[m]),0)>=n.minimum)continue;const c=s.map(f=>r[f].title??f);a.push({field:s[0],message:`Combined value of ${c.join(", ")} must be at least ${n.minimum}`})}return a}function F(t,e){let i;try{i=JSON.parse(t)}catch{return{payload:null,errors:[],parseError:"Invalid JSON"}}const r=i._form_schema;if(r){const a=R(r,i,e);if(a.length>0)return{payload:null,errors:a,parseError:null}}const{_form_schema:l,...o}=i;return{payload:h(o,r),errors:[],parseError:null}}export{O as E,F as b,C as i,R as v};
|
|
2
|
+
//# sourceMappingURL=resolver-payload-m9AGKZ3a.js.map
|
package/dashboard/dist/assets/{resolver-payload-C1dXB3n6.js.map → resolver-payload-m9AGKZ3a.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver-payload-C1dXB3n6.js","sources":["../../../types/validation.ts","../../src/components/escalation/ErrorsPanel.tsx","../../../shared/form-validation/x-lt-require-any.ts","../../../shared/form-validation/x-lt-require-sum.ts","../../../shared/form-validation/validate-resolver-payload.ts","../../src/lib/resolver-payload.ts"],"sourcesContent":["/**\n * Canonical validation-error shapes — one vocabulary across every surface.\n *\n * When server-side resolver schema enforcement rejects a payload, the API\n * layer returns status 422 with `LTValidationErrorBody` as the response body.\n * The same body shape flows to every consumer:\n * - HTTP routes serialize it as the JSON response body\n * - SDK callers receive it as `result.data` (with `result.code` set)\n * - MCP resolve tools return it as the tool's JSON error content\n * - the CLI prints the violation list beneath the error line\n * - the dashboard maps `violations` into the same errors panel the\n * pre-submission pass feeds\n */\n\n/** Machine-readable error codes carried on error envelopes and bodies. */\nexport const LT_ERROR_CODES = {\n /** The resolver payload failed the role's enforced form schema. */\n SCHEMA_VALIDATION: 'schema_validation',\n} as const;\n\nexport type LTErrorCode = (typeof LT_ERROR_CODES)[keyof typeof LT_ERROR_CODES];\n\n/**\n * One field-level violation — the same `{ field, message }` pair the dashboard\n * validation panel renders. Bulk surfaces add `escalationId` so a violation is\n * attributable to the row that produced it.\n */\nexport interface LTFieldViolation {\n field: string;\n message: string;\n escalationId?: string;\n}\n\n/** The 422 response body for a schema-validation rejection. */\nexport interface LTValidationErrorBody {\n /** Human-readable summary, e.g. \"resolverPayload failed schema validation (2 violations)\". */\n error: string;\n code: typeof LT_ERROR_CODES.SCHEMA_VALIDATION;\n /** Every field-level violation, in schema property order. */\n violations: LTFieldViolation[];\n /** The role whose enforced schema rejected the payload; null for a workflow input schema. */\n role: string | null;\n /** The schema version validated against; null when the role's live (unversioned) schema applied. */\n schemaVersion: number | null;\n /** The workflow whose input_schema rejected the data (invoke surface only). */\n workflowType?: string;\n}\n\n/** Narrow an unknown response body to the canonical validation-error shape. */\nexport function isValidationErrorBody(body: unknown): body is LTValidationErrorBody {\n return (\n typeof body === 'object' && body !== null\n && (body as Record<string, unknown>).code === LT_ERROR_CODES.SCHEMA_VALIDATION\n && Array.isArray((body as Record<string, unknown>).violations)\n );\n}\n","import { AlertCircle } from 'lucide-react';\nimport { deriveFieldLabel } from '../../lib/derive-field-label';\nimport type { FieldError } from '../../lib/field-validator';\n\n/**\n * The form's issue list. Each row names the field through its schema title\n * and, on click, scrolls to and focuses the input carrying that\n * data-field-key. Shared by the escalation side panel and the invoke panel.\n */\nexport function ErrorsPanel({ errors, schema }: { errors: FieldError[]; schema?: Record<string, unknown> | null }) {\n const focusField = (field: string) => {\n const el = document.querySelector<HTMLElement>(`[data-field-key=\"${field}\"]`);\n if (!el) return;\n el.scrollIntoView({ behavior: 'smooth', block: 'center' });\n el.focus({ preventScroll: true });\n };\n\n if (errors.length === 0) {\n return <p className=\"text-xs text-text-tertiary italic\">No errors to display.</p>;\n }\n\n return (\n <div className=\"space-y-1\" role=\"alert\" aria-live=\"polite\">\n <p className=\"text-2xs font-semibold uppercase tracking-wider text-status-error mb-4\">\n {errors.length} {errors.length === 1 ? 'issue' : 'issues'} to resolve\n </p>\n <div className=\"space-y-1.5\">\n {errors.map(({ field, message }) => (\n <button\n key={field}\n onClick={() => focusField(field)}\n className=\"w-full text-left flex items-start gap-3 px-3 py-2.5 rounded hover:bg-status-error/5 transition-colors group\"\n >\n <AlertCircle className=\"w-3.5 h-3.5 mt-0.5 shrink-0 text-status-error/60 group-hover:text-status-error transition-colors\" />\n <div>\n <p className=\"text-2xs font-semibold text-text-primary leading-snug\">\n {deriveFieldLabel(field, (schema?.properties as Record<string, Record<string, unknown>> | undefined)?.[field])}\n </p>\n <p className=\"text-2xs text-text-tertiary group-hover:text-text-secondary transition-colors leading-snug mt-0.5\">\n {message}\n </p>\n </div>\n </button>\n ))}\n </div>\n <p className=\"text-2xs text-text-quaternary mt-4 px-3\">\n Click an issue to scroll to and focus the field.\n </p>\n </div>\n );\n}\n","/**\n * x-lt-require-any — \"at least one of this set\" as a root-schema token. A\n * form_schema declares groups of field names; a submission passes when every\n * group has a value in at least one member. The canonical case: a Left\n * quantity and a Right quantity where either satisfies, but blank-both fails.\n *\n * x-lt-require-any string[][] — e.g. [[\"left_quantity\", \"right_quantity\"]]\n *\n * Visibility rules compose: a member hidden by its `x-lt-showIf` (or naming\n * no schema property) can neither satisfy the group nor be demanded of the\n * submitter, and a group whose members are ALL hidden is waived. `false` and\n * `0` are answers; `''`, null, and undefined are not.\n */\n\nexport const X_LT_REQUIRE_ANY = 'x-lt-require-any';\n\n/**\n * The schema's require-any groups. Malformed declarations (non-array token,\n * non-array groups, non-string members) read as no groups — a bad token never\n * bricks submission.\n */\nexport function readRequireAnyGroups(\n schema: Record<string, unknown> | null | undefined,\n): string[][] {\n const raw = schema?.[X_LT_REQUIRE_ANY];\n if (!Array.isArray(raw)) return [];\n return raw\n .filter((group): group is unknown[] => Array.isArray(group))\n .map((group) => group.filter((m): m is string => typeof m === 'string' && m.length > 0))\n .filter((group) => group.length > 0);\n}\n\n/** Present = an actual answer: `false` and `0` count; `''`/null/undefined do not. */\nexport function hasRequireAnyValue(value: unknown): boolean {\n if (value === undefined || value === null) return false;\n if (typeof value === 'string') return value.trim().length > 0;\n return true;\n}\n","/**\n * x-lt-require-sum — \"these quantities must total at least N\" as a\n * root-schema token. Where x-lt-require-any asks that one member carry any\n * answer (so a count defaulting to `0` vacuously satisfies it), require-sum\n * reads the members as numbers and demands their sum reach a minimum. The\n * canonical case: a Left quantity and a Right quantity that both default to\n * `0`, where at least one side must be positive.\n *\n * x-lt-require-sum { fields: string[], minimum?: number }[]\n * — e.g. [{ \"fields\": [\"left_quantity\", \"right_quantity\"] }]\n *\n * `minimum` defaults to 1. Numbers contribute their value and numeric strings\n * coerce (the same reading as dynamic bounds); everything else contributes 0.\n * Visibility rules compose the same way as require-any: a member hidden by\n * its `x-lt-showIf` (or naming no schema property) contributes nothing and is\n * not demanded, and a group whose members are ALL hidden is waived.\n */\n\nexport const X_LT_REQUIRE_SUM = 'x-lt-require-sum';\n\nexport interface RequireSumGroup {\n fields: string[];\n minimum: number;\n}\n\n/**\n * The schema's require-sum groups. Malformed declarations (non-array token,\n * groups without a fields array, non-string members, non-numeric minimum)\n * read as no groups — a bad token never bricks submission.\n */\nexport function readRequireSumGroups(\n schema: Record<string, unknown> | null | undefined,\n): RequireSumGroup[] {\n const raw = schema?.[X_LT_REQUIRE_SUM];\n if (!Array.isArray(raw)) return [];\n const groups: RequireSumGroup[] = [];\n for (const entry of raw) {\n if (!entry || typeof entry !== 'object' || Array.isArray(entry)) continue;\n const { fields, minimum } = entry as Record<string, unknown>;\n if (!Array.isArray(fields)) continue;\n const members = fields.filter((m): m is string => typeof m === 'string' && m.length > 0);\n if (members.length === 0) continue;\n if (minimum !== undefined && typeof minimum !== 'number') continue;\n groups.push({ fields: members, minimum: typeof minimum === 'number' ? minimum : 1 });\n }\n return groups;\n}\n\n/** A member's numeric contribution: numbers as-is, numeric strings coerced, all else 0. */\nexport function requireSumContribution(value: unknown): number {\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n if (typeof value === 'string' && value.trim() !== '') {\n const n = Number(value);\n if (!Number.isNaN(n)) return n;\n }\n return 0;\n}\n","/**\n * The full pre-submission validation pass over a resolver form schema — the\n * same pass on both sides of the wire. The dashboard runs it on the flat form\n * values before submitting; the API layer runs it on the submitted (bound,\n * nested) payload by inverting x-lt-bind first. Because both entry points\n * funnel into one loop, a payload that passes the client panel passes the\n * server gate, and a 422's violation list is exactly what the panel shows.\n *\n * Semantics per field:\n * - x-lt-showIf-hidden fields are skipped entirely (a field the submitter\n * cannot see never blocks submission)\n * - required (schema.required membership), with checklist/empty-object rules\n * - declared-type check (string/number/integer/boolean/array/object)\n * - enum membership\n * - x-lt-require-all against the checklist items resolved from context\n * - static + dynamic bounds (minimum/x-lt-minimum, lengths, patterns)\n *\n * Root-level x-lt-require-any groups run after the per-field pass: each group\n * needs a value in at least one visible member (all-hidden groups are waived).\n * x-lt-require-sum groups follow the same visibility rules but read members\n * as numbers: the group's visible members must sum to at least its minimum.\n *\n * The showIf/`resolver.*` domain is always the FLAT form representation, so a\n * condition like `resolver.approved` reads the same on both sides.\n */\nimport { type FieldError, validateField } from './field-validator';\nimport { evaluateShowIf, type ShowIfContext } from './x-lt-show-if';\nimport { mapPayloadToForm } from './x-lt-bind';\nimport { readRequireAnyGroups, hasRequireAnyValue } from './x-lt-require-any';\nimport { readRequireSumGroups, requireSumContribution } from './x-lt-require-sum';\n\nexport type { FieldError } from './field-validator';\n\n/**\n * The escalation-surface context the pass evaluates showIf conditions and\n * dynamic constraints against. `resolver` is supplied by the pass itself\n * (the flat form values under validation) — callers provide the rest.\n */\nexport type ResolverValidationContext = Omit<ShowIfContext, 'resolver' | 'input'>;\n\n/**\n * Validate FLAT form values against the form schema. This is the dashboard's\n * entry point (the values the user edits, keyed by field name).\n */\nexport function validateResolverForm(\n schema: Record<string, unknown> | null | undefined,\n formValues: Record<string, unknown>,\n ctx?: ResolverValidationContext | null,\n): FieldError[] {\n if (!schema) return [];\n const properties = (schema.properties ?? {}) as Record<string, Record<string, unknown>>;\n const required = new Set((schema.required as string[] | undefined) ?? []);\n const liveCtx: ShowIfContext = {\n ...(ctx ?? {}),\n resolver: formValues as Record<string, unknown>,\n input: formValues as Record<string, unknown>,\n };\n\n const errors: FieldError[] = [];\n for (const [field, fieldSchema] of Object.entries(properties)) {\n if (!evaluateShowIf(fieldSchema['x-lt-showIf'], liveCtx)) continue;\n const err = validateField(\n formValues[field],\n fieldSchema,\n required.has(field),\n true,\n liveCtx as Record<string, unknown>,\n );\n if (err) errors.push({ field, message: err });\n }\n\n // Require-any groups: at least one VISIBLE member per group carries a value.\n // A member hidden by showIf (or naming no property) can neither satisfy nor\n // be demanded; an all-hidden group is waived.\n for (const group of readRequireAnyGroups(schema)) {\n const visible = group.filter(\n (k) => properties[k] && evaluateShowIf(properties[k]['x-lt-showIf'], liveCtx),\n );\n if (visible.length === 0) continue;\n if (visible.some((k) => hasRequireAnyValue(formValues[k]))) continue;\n const titles = visible.map((k) => (properties[k].title as string | undefined) ?? k);\n errors.push({\n field: visible[0],\n message: `Enter a value for at least one of: ${titles.join(', ')}`,\n });\n }\n\n // Require-sum groups: the numeric values of VISIBLE members must total at\n // least the group's minimum. A `0` is a real number here — unlike\n // require-any, defaulted-zero quantities do not satisfy the group.\n for (const group of readRequireSumGroups(schema)) {\n const visible = group.fields.filter(\n (k) => properties[k] && evaluateShowIf(properties[k]['x-lt-showIf'], liveCtx),\n );\n if (visible.length === 0) continue;\n const total = visible.reduce((sum, k) => sum + requireSumContribution(formValues[k]), 0);\n if (total >= group.minimum) continue;\n const titles = visible.map((k) => (properties[k].title as string | undefined) ?? k);\n errors.push({\n field: visible[0],\n message: `Combined value of ${titles.join(', ')} must be at least ${group.minimum}`,\n });\n }\n return errors;\n}\n\n/**\n * Validate a SUBMITTED resolver payload (the bound, nested shape the workflow\n * consumes) against the form schema. This is the API layer's entry point: the\n * payload is inverted through each field's x-lt-bind path back to the flat\n * form representation, then run through the same pass the client uses.\n */\nexport function validateResolverPayload(\n schema: Record<string, unknown> | null | undefined,\n payload: Record<string, unknown>,\n ctx?: ResolverValidationContext | null,\n): FieldError[] {\n if (!schema) return [];\n const formValues = mapPayloadToForm(payload, schema as Record<string, any>);\n return validateResolverForm(schema, formValues, ctx);\n}\n","import { mapFormToPayload } from './x-lt-bind';\nimport { validateResolverForm, type FieldError } from './field-validator';\nimport type { ShowIfContext } from './x-lt-show-if';\n\nexport interface ResolverPayloadResult {\n /** The resolver payload ready to submit — null when the JSON is unparseable or validation failed. */\n payload: Record<string, unknown> | null;\n /** Field errors against the embedded _form_schema (empty when the form is valid). */\n errors: FieldError[];\n /** Set when the edited JSON string itself is malformed. */\n parseError: string | null;\n}\n\n/**\n * Build the resolver payload from the form's edited JSON string.\n *\n * 1. Parse the JSON — a malformed string yields `parseError`.\n * 2. Validate every visible field against the embedded `_form_schema` — hidden\n * fields (x-lt-showIf falsy against the live context) are skipped, matching\n * the server's enforcement pass. Any failures yield `errors`.\n * 3. Strip the UI-only schema and map flat form fields into their nested shape\n * via x-lt-bind — the payload IS the payload.\n *\n * The single path shared by the footer's Submit button and the submit-on-claim\n * shortcut, so both produce identical payloads and identical error lists.\n */\nexport function buildResolverPayload(\n json: string,\n context?: ShowIfContext,\n): ResolverPayloadResult {\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(json) as Record<string, unknown>;\n } catch {\n return { payload: null, errors: [], parseError: 'Invalid JSON' };\n }\n\n const schema = parsed._form_schema as Record<string, unknown> | undefined;\n if (schema) {\n const errors = validateResolverForm(schema, parsed, context);\n if (errors.length > 0) return { payload: null, errors, parseError: null };\n }\n\n const { _form_schema, ...formValues } = parsed;\n return {\n payload: mapFormToPayload(formValues, schema as Record<string, any> | undefined),\n errors: [],\n parseError: null,\n };\n}\n"],"names":["LT_ERROR_CODES","isValidationErrorBody","body","ErrorsPanel","errors","schema","focusField","field","el","jsx","jsxs","message","AlertCircle","deriveFieldLabel","_a","X_LT_REQUIRE_ANY","readRequireAnyGroups","raw","group","m","hasRequireAnyValue","value","X_LT_REQUIRE_SUM","readRequireSumGroups","groups","entry","fields","minimum","members","requireSumContribution","n","validateResolverForm","formValues","ctx","properties","required","liveCtx","fieldSchema","evaluateShowIf","err","validateField","visible","k","titles","sum","buildResolverPayload","json","context","parsed","_form_schema","mapFormToPayload"],"mappings":"iNAeO,MAAMA,EAAiB,CAE5B,kBAAmB,mBACrB,EA+BO,SAASC,EAAsBC,EAA8C,CAClF,OACE,OAAOA,GAAS,UAAYA,IAAS,MACjCA,EAAiC,OAASF,EAAe,mBAC1D,MAAM,QAASE,EAAiC,UAAU,CAEjE,CC9CO,SAASC,EAAY,CAAE,OAAAC,EAAQ,OAAAC,GAA6E,CACjH,MAAMC,EAAcC,GAAkB,CACpC,MAAMC,EAAK,SAAS,cAA2B,oBAAoBD,CAAK,IAAI,EACvEC,IACLA,EAAG,eAAe,CAAE,SAAU,SAAU,MAAO,SAAU,EACzDA,EAAG,MAAM,CAAE,cAAe,EAAA,CAAM,EAClC,EAEA,OAAIJ,EAAO,SAAW,EACbK,EAAAA,IAAC,IAAA,CAAE,UAAU,oCAAoC,SAAA,wBAAqB,SAI5E,MAAA,CAAI,UAAU,YAAY,KAAK,QAAQ,YAAU,SAChD,SAAA,CAAAC,EAAAA,KAAC,IAAA,CAAE,UAAU,yEACV,SAAA,CAAAN,EAAO,OAAO,IAAEA,EAAO,SAAW,EAAI,QAAU,SAAS,aAAA,EAC5D,EACAK,EAAAA,IAAC,MAAA,CAAI,UAAU,cACZ,SAAAL,EAAO,IAAI,CAAC,CAAE,MAAAG,EAAO,QAAAI,CAAA,IAAQ,OAC5BD,OAAAA,EAAAA,KAAC,SAAA,CAEC,QAAS,IAAMJ,EAAWC,CAAK,EAC/B,UAAU,8GAEV,SAAA,CAAAE,EAAAA,IAACG,EAAA,CAAY,UAAU,kGAAA,CAAmG,SACzH,MAAA,CACC,SAAA,CAAAH,EAAAA,IAAC,IAAA,CAAE,UAAU,wDACV,SAAAI,EAAiBN,GAAQO,EAAAT,GAAA,YAAAA,EAAQ,aAAR,YAAAS,EAA6EP,EAAM,CAAA,CAC/G,EACAE,EAAAA,IAAC,IAAA,CAAE,UAAU,oGACV,SAAAE,CAAA,CACH,CAAA,CAAA,CACF,CAAA,CAAA,EAZKJ,CAAA,EAcR,EACH,EACAE,EAAAA,IAAC,IAAA,CAAE,UAAU,0CAA0C,SAAA,kDAAA,CAEvD,CAAA,EACF,CAEJ,CCpCO,MAAMM,EAAmB,mBAOzB,SAASC,EACdX,EACY,CACZ,MAAMY,EAAMZ,GAAA,YAAAA,EAASU,GACrB,OAAK,MAAM,QAAQE,CAAG,EACfA,EACJ,OAAQC,GAA8B,MAAM,QAAQA,CAAK,CAAC,EAC1D,IAAKA,GAAUA,EAAM,OAAQC,GAAmB,OAAOA,GAAM,UAAYA,EAAE,OAAS,CAAC,CAAC,EACtF,OAAQD,GAAUA,EAAM,OAAS,CAAC,EAJL,CAAA,CAKlC,CAGO,SAASE,EAAmBC,EAAyB,CAC1D,OAA2BA,GAAU,KAAa,GAC9C,OAAOA,GAAU,SAAiBA,EAAM,KAAA,EAAO,OAAS,EACrD,EACT,CCnBO,MAAMC,EAAmB,mBAYzB,SAASC,EACdlB,EACmB,CACnB,MAAMY,EAAMZ,GAAA,YAAAA,EAASiB,GACrB,GAAI,CAAC,MAAM,QAAQL,CAAG,QAAU,CAAA,EAChC,MAAMO,EAA4B,CAAA,EAClC,UAAWC,KAASR,EAAK,CACvB,GAAI,CAACQ,GAAS,OAAOA,GAAU,UAAY,MAAM,QAAQA,CAAK,EAAG,SACjE,KAAM,CAAE,OAAAC,EAAQ,QAAAC,CAAA,EAAYF,EAC5B,GAAI,CAAC,MAAM,QAAQC,CAAM,EAAG,SAC5B,MAAME,EAAUF,EAAO,OAAQP,GAAmB,OAAOA,GAAM,UAAYA,EAAE,OAAS,CAAC,EACnFS,EAAQ,SAAW,IACnBD,IAAY,QAAa,OAAOA,GAAY,UAChDH,EAAO,KAAK,CAAE,OAAQI,EAAS,QAAS,OAAOD,GAAY,SAAWA,EAAU,EAAG,EACrF,CACA,OAAOH,CACT,CAGO,SAASK,EAAuBR,EAAwB,CAC7D,GAAI,OAAOA,GAAU,UAAY,OAAO,SAASA,CAAK,EAAG,OAAOA,EAChE,GAAI,OAAOA,GAAU,UAAYA,EAAM,KAAA,IAAW,GAAI,CACpD,MAAMS,EAAI,OAAOT,CAAK,EACtB,GAAI,CAAC,OAAO,MAAMS,CAAC,EAAG,OAAOA,CAC/B,CACA,MAAO,EACT,CCZO,SAASC,EACd1B,EACA2B,EACAC,EACc,CACd,GAAI,CAAC5B,EAAQ,MAAO,CAAA,EACpB,MAAM6B,EAAc7B,EAAO,YAAc,CAAA,EACnC8B,EAAW,IAAI,IAAK9B,EAAO,UAAqC,CAAA,CAAE,EAClE+B,EAAyB,CAC7B,GAAIH,GAAO,CAAA,EACX,SAAUD,EACV,MAAOA,CAAA,EAGH5B,EAAuB,CAAA,EAC7B,SAAW,CAACG,EAAO8B,CAAW,IAAK,OAAO,QAAQH,CAAU,EAAG,CAC7D,GAAI,CAACI,EAAeD,EAAY,aAAa,EAAGD,CAAO,EAAG,SAC1D,MAAMG,EAAMC,EACVR,EAAWzB,CAAK,EAChB8B,EACAF,EAAS,IAAI5B,CAAK,EAClB,GACA6B,CAAA,EAEEG,GAAKnC,EAAO,KAAK,CAAE,MAAAG,EAAO,QAASgC,EAAK,CAC9C,CAKA,UAAWrB,KAASF,EAAqBX,CAAM,EAAG,CAChD,MAAMoC,EAAUvB,EAAM,OACnBwB,GAAMR,EAAWQ,CAAC,GAAKJ,EAAeJ,EAAWQ,CAAC,EAAE,aAAa,EAAGN,CAAO,CAAA,EAG9E,GADIK,EAAQ,SAAW,GACnBA,EAAQ,KAAMC,GAAMtB,EAAmBY,EAAWU,CAAC,CAAC,CAAC,EAAG,SAC5D,MAAMC,EAASF,EAAQ,IAAKC,GAAOR,EAAWQ,CAAC,EAAE,OAAgCA,CAAC,EAClFtC,EAAO,KAAK,CACV,MAAOqC,EAAQ,CAAC,EAChB,QAAS,sCAAsCE,EAAO,KAAK,IAAI,CAAC,EAAA,CACjE,CACH,CAKA,UAAWzB,KAASK,EAAqBlB,CAAM,EAAG,CAChD,MAAMoC,EAAUvB,EAAM,OAAO,OAC1BwB,GAAMR,EAAWQ,CAAC,GAAKJ,EAAeJ,EAAWQ,CAAC,EAAE,aAAa,EAAGN,CAAO,CAAA,EAI9E,GAFIK,EAAQ,SAAW,GACTA,EAAQ,OAAO,CAACG,EAAKF,IAAME,EAAMf,EAAuBG,EAAWU,CAAC,CAAC,EAAG,CAAC,GAC1ExB,EAAM,QAAS,SAC5B,MAAMyB,EAASF,EAAQ,IAAKC,GAAOR,EAAWQ,CAAC,EAAE,OAAgCA,CAAC,EAClFtC,EAAO,KAAK,CACV,MAAOqC,EAAQ,CAAC,EAChB,QAAS,qBAAqBE,EAAO,KAAK,IAAI,CAAC,qBAAqBzB,EAAM,OAAO,EAAA,CAClF,CACH,CACA,OAAOd,CACT,CC9EO,SAASyC,EACdC,EACAC,EACuB,CACvB,IAAIC,EACJ,GAAI,CACFA,EAAS,KAAK,MAAMF,CAAI,CAC1B,MAAQ,CACN,MAAO,CAAE,QAAS,KAAM,OAAQ,CAAA,EAAI,WAAY,cAAA,CAClD,CAEA,MAAMzC,EAAS2C,EAAO,aACtB,GAAI3C,EAAQ,CACV,MAAMD,EAAS2B,EAAqB1B,EAAQ2C,EAAQD,CAAO,EAC3D,GAAI3C,EAAO,OAAS,EAAG,MAAO,CAAE,QAAS,KAAM,OAAAA,EAAQ,WAAY,IAAA,CACrE,CAEA,KAAM,CAAE,aAAA6C,EAAc,GAAGjB,CAAA,EAAegB,EACxC,MAAO,CACL,QAASE,EAAiBlB,EAAY3B,CAAyC,EAC/E,OAAQ,CAAA,EACR,WAAY,IAAA,CAEhB"}
|
|
1
|
+
{"version":3,"file":"resolver-payload-m9AGKZ3a.js","sources":["../../../types/validation.ts","../../src/components/escalation/ErrorsPanel.tsx","../../../shared/form-validation/x-lt-require-any.ts","../../../shared/form-validation/x-lt-require-sum.ts","../../../shared/form-validation/validate-resolver-payload.ts","../../src/lib/resolver-payload.ts"],"sourcesContent":["/**\n * Canonical validation-error shapes — one vocabulary across every surface.\n *\n * When server-side resolver schema enforcement rejects a payload, the API\n * layer returns status 422 with `LTValidationErrorBody` as the response body.\n * The same body shape flows to every consumer:\n * - HTTP routes serialize it as the JSON response body\n * - SDK callers receive it as `result.data` (with `result.code` set)\n * - MCP resolve tools return it as the tool's JSON error content\n * - the CLI prints the violation list beneath the error line\n * - the dashboard maps `violations` into the same errors panel the\n * pre-submission pass feeds\n */\n\n/** Machine-readable error codes carried on error envelopes and bodies. */\nexport const LT_ERROR_CODES = {\n /** The resolver payload failed the role's enforced form schema. */\n SCHEMA_VALIDATION: 'schema_validation',\n} as const;\n\nexport type LTErrorCode = (typeof LT_ERROR_CODES)[keyof typeof LT_ERROR_CODES];\n\n/**\n * One field-level violation — the same `{ field, message }` pair the dashboard\n * validation panel renders. Bulk surfaces add `escalationId` so a violation is\n * attributable to the row that produced it.\n */\nexport interface LTFieldViolation {\n field: string;\n message: string;\n escalationId?: string;\n}\n\n/** The 422 response body for a schema-validation rejection. */\nexport interface LTValidationErrorBody {\n /** Human-readable summary, e.g. \"resolverPayload failed schema validation (2 violations)\". */\n error: string;\n code: typeof LT_ERROR_CODES.SCHEMA_VALIDATION;\n /** Every field-level violation, in schema property order. */\n violations: LTFieldViolation[];\n /** The role whose enforced schema rejected the payload; null for a workflow input schema. */\n role: string | null;\n /** The schema version validated against; null when the role's live (unversioned) schema applied. */\n schemaVersion: number | null;\n /** The workflow whose input_schema rejected the data (invoke surface only). */\n workflowType?: string;\n}\n\n/** Narrow an unknown response body to the canonical validation-error shape. */\nexport function isValidationErrorBody(body: unknown): body is LTValidationErrorBody {\n return (\n typeof body === 'object' && body !== null\n && (body as Record<string, unknown>).code === LT_ERROR_CODES.SCHEMA_VALIDATION\n && Array.isArray((body as Record<string, unknown>).violations)\n );\n}\n","import { AlertCircle } from 'lucide-react';\nimport { deriveFieldLabel } from '../../lib/derive-field-label';\nimport type { FieldError } from '../../lib/field-validator';\n\n/**\n * The form's issue list. Each row names the field through its schema title\n * and, on click, scrolls to and focuses the input carrying that\n * data-field-key. Shared by the escalation side panel and the invoke panel.\n */\nexport function ErrorsPanel({ errors, schema }: { errors: FieldError[]; schema?: Record<string, unknown> | null }) {\n const focusField = (field: string) => {\n const el = document.querySelector<HTMLElement>(`[data-field-key=\"${field}\"]`);\n if (!el) return;\n el.scrollIntoView({ behavior: 'smooth', block: 'center' });\n el.focus({ preventScroll: true });\n };\n\n if (errors.length === 0) {\n return <p className=\"text-xs text-text-tertiary italic\">No errors to display.</p>;\n }\n\n return (\n <div className=\"space-y-1\" role=\"alert\" aria-live=\"polite\">\n <p className=\"text-2xs font-semibold uppercase tracking-wider text-status-error mb-4\">\n {errors.length} {errors.length === 1 ? 'issue' : 'issues'} to resolve\n </p>\n <div className=\"space-y-1.5\">\n {errors.map(({ field, message }) => (\n <button\n key={field}\n onClick={() => focusField(field)}\n className=\"w-full text-left flex items-start gap-3 px-3 py-2.5 rounded hover:bg-status-error/5 transition-colors group\"\n >\n <AlertCircle className=\"w-3.5 h-3.5 mt-0.5 shrink-0 text-status-error/60 group-hover:text-status-error transition-colors\" />\n <div>\n <p className=\"text-2xs font-semibold text-text-primary leading-snug\">\n {deriveFieldLabel(field, (schema?.properties as Record<string, Record<string, unknown>> | undefined)?.[field])}\n </p>\n <p className=\"text-2xs text-text-tertiary group-hover:text-text-secondary transition-colors leading-snug mt-0.5\">\n {message}\n </p>\n </div>\n </button>\n ))}\n </div>\n <p className=\"text-2xs text-text-quaternary mt-4 px-3\">\n Click an issue to scroll to and focus the field.\n </p>\n </div>\n );\n}\n","/**\n * x-lt-require-any — \"at least one of this set\" as a root-schema token. A\n * form_schema declares groups of field names; a submission passes when every\n * group has a value in at least one member. The canonical case: a Left\n * quantity and a Right quantity where either satisfies, but blank-both fails.\n *\n * x-lt-require-any string[][] — e.g. [[\"left_quantity\", \"right_quantity\"]]\n *\n * Visibility rules compose: a member hidden by its `x-lt-showIf` (or naming\n * no schema property) can neither satisfy the group nor be demanded of the\n * submitter, and a group whose members are ALL hidden is waived. `false` and\n * `0` are answers; `''`, null, and undefined are not.\n */\n\nexport const X_LT_REQUIRE_ANY = 'x-lt-require-any';\n\n/**\n * The schema's require-any groups. Malformed declarations (non-array token,\n * non-array groups, non-string members) read as no groups — a bad token never\n * bricks submission.\n */\nexport function readRequireAnyGroups(\n schema: Record<string, unknown> | null | undefined,\n): string[][] {\n const raw = schema?.[X_LT_REQUIRE_ANY];\n if (!Array.isArray(raw)) return [];\n return raw\n .filter((group): group is unknown[] => Array.isArray(group))\n .map((group) => group.filter((m): m is string => typeof m === 'string' && m.length > 0))\n .filter((group) => group.length > 0);\n}\n\n/** Present = an actual answer: `false` and `0` count; `''`/null/undefined do not. */\nexport function hasRequireAnyValue(value: unknown): boolean {\n if (value === undefined || value === null) return false;\n if (typeof value === 'string') return value.trim().length > 0;\n return true;\n}\n","/**\n * x-lt-require-sum — \"these quantities must total at least N\" as a\n * root-schema token. Where x-lt-require-any asks that one member carry any\n * answer (so a count defaulting to `0` vacuously satisfies it), require-sum\n * reads the members as numbers and demands their sum reach a minimum. The\n * canonical case: a Left quantity and a Right quantity that both default to\n * `0`, where at least one side must be positive.\n *\n * x-lt-require-sum { fields: string[], minimum?: number }[]\n * — e.g. [{ \"fields\": [\"left_quantity\", \"right_quantity\"] }]\n *\n * `minimum` defaults to 1. Numbers contribute their value and numeric strings\n * coerce (the same reading as dynamic bounds); everything else contributes 0.\n * Visibility rules compose the same way as require-any: a member hidden by\n * its `x-lt-showIf` (or naming no schema property) contributes nothing and is\n * not demanded, and a group whose members are ALL hidden is waived.\n */\n\nexport const X_LT_REQUIRE_SUM = 'x-lt-require-sum';\n\nexport interface RequireSumGroup {\n fields: string[];\n minimum: number;\n}\n\n/**\n * The schema's require-sum groups. Malformed declarations (non-array token,\n * groups without a fields array, non-string members, non-numeric minimum)\n * read as no groups — a bad token never bricks submission.\n */\nexport function readRequireSumGroups(\n schema: Record<string, unknown> | null | undefined,\n): RequireSumGroup[] {\n const raw = schema?.[X_LT_REQUIRE_SUM];\n if (!Array.isArray(raw)) return [];\n const groups: RequireSumGroup[] = [];\n for (const entry of raw) {\n if (!entry || typeof entry !== 'object' || Array.isArray(entry)) continue;\n const { fields, minimum } = entry as Record<string, unknown>;\n if (!Array.isArray(fields)) continue;\n const members = fields.filter((m): m is string => typeof m === 'string' && m.length > 0);\n if (members.length === 0) continue;\n if (minimum !== undefined && typeof minimum !== 'number') continue;\n groups.push({ fields: members, minimum: typeof minimum === 'number' ? minimum : 1 });\n }\n return groups;\n}\n\n/** A member's numeric contribution: numbers as-is, numeric strings coerced, all else 0. */\nexport function requireSumContribution(value: unknown): number {\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n if (typeof value === 'string' && value.trim() !== '') {\n const n = Number(value);\n if (!Number.isNaN(n)) return n;\n }\n return 0;\n}\n","/**\n * The full pre-submission validation pass over a resolver form schema — the\n * same pass on both sides of the wire. The dashboard runs it on the flat form\n * values before submitting; the API layer runs it on the submitted (bound,\n * nested) payload by inverting x-lt-bind first. Because both entry points\n * funnel into one loop, a payload that passes the client panel passes the\n * server gate, and a 422's violation list is exactly what the panel shows.\n *\n * Semantics per field:\n * - x-lt-showIf-hidden fields are skipped entirely (a field the submitter\n * cannot see never blocks submission)\n * - required (schema.required membership), with checklist/empty-object rules\n * - declared-type check (string/number/integer/boolean/array/object)\n * - enum membership\n * - x-lt-require-all against the checklist items resolved from context\n * - static + dynamic bounds (minimum/x-lt-minimum, lengths, patterns)\n *\n * Root-level x-lt-require-any groups run after the per-field pass: each group\n * needs a value in at least one visible member (all-hidden groups are waived).\n * x-lt-require-sum groups follow the same visibility rules but read members\n * as numbers: the group's visible members must sum to at least its minimum.\n *\n * The showIf/`resolver.*` domain is always the FLAT form representation, so a\n * condition like `resolver.approved` reads the same on both sides.\n */\nimport { type FieldError, validateField } from './field-validator';\nimport { evaluateShowIf, type ShowIfContext } from './x-lt-show-if';\nimport { mapPayloadToForm } from './x-lt-bind';\nimport { readRequireAnyGroups, hasRequireAnyValue } from './x-lt-require-any';\nimport { readRequireSumGroups, requireSumContribution } from './x-lt-require-sum';\n\nexport type { FieldError } from './field-validator';\n\n/**\n * The escalation-surface context the pass evaluates showIf conditions and\n * dynamic constraints against. `resolver` is supplied by the pass itself\n * (the flat form values under validation) — callers provide the rest.\n */\nexport type ResolverValidationContext = Omit<ShowIfContext, 'resolver' | 'input'>;\n\n/**\n * Validate FLAT form values against the form schema. This is the dashboard's\n * entry point (the values the user edits, keyed by field name).\n */\nexport function validateResolverForm(\n schema: Record<string, unknown> | null | undefined,\n formValues: Record<string, unknown>,\n ctx?: ResolverValidationContext | null,\n): FieldError[] {\n if (!schema) return [];\n const properties = (schema.properties ?? {}) as Record<string, Record<string, unknown>>;\n const required = new Set((schema.required as string[] | undefined) ?? []);\n const liveCtx: ShowIfContext = {\n ...(ctx ?? {}),\n resolver: formValues as Record<string, unknown>,\n input: formValues as Record<string, unknown>,\n };\n\n const errors: FieldError[] = [];\n for (const [field, fieldSchema] of Object.entries(properties)) {\n if (!evaluateShowIf(fieldSchema['x-lt-showIf'], liveCtx)) continue;\n const err = validateField(\n formValues[field],\n fieldSchema,\n required.has(field),\n true,\n liveCtx as Record<string, unknown>,\n );\n if (err) errors.push({ field, message: err });\n }\n\n // Require-any groups: at least one VISIBLE member per group carries a value.\n // A member hidden by showIf (or naming no property) can neither satisfy nor\n // be demanded; an all-hidden group is waived.\n for (const group of readRequireAnyGroups(schema)) {\n const visible = group.filter(\n (k) => properties[k] && evaluateShowIf(properties[k]['x-lt-showIf'], liveCtx),\n );\n if (visible.length === 0) continue;\n if (visible.some((k) => hasRequireAnyValue(formValues[k]))) continue;\n const titles = visible.map((k) => (properties[k].title as string | undefined) ?? k);\n errors.push({\n field: visible[0],\n message: `Enter a value for at least one of: ${titles.join(', ')}`,\n });\n }\n\n // Require-sum groups: the numeric values of VISIBLE members must total at\n // least the group's minimum. A `0` is a real number here — unlike\n // require-any, defaulted-zero quantities do not satisfy the group.\n for (const group of readRequireSumGroups(schema)) {\n const visible = group.fields.filter(\n (k) => properties[k] && evaluateShowIf(properties[k]['x-lt-showIf'], liveCtx),\n );\n if (visible.length === 0) continue;\n const total = visible.reduce((sum, k) => sum + requireSumContribution(formValues[k]), 0);\n if (total >= group.minimum) continue;\n const titles = visible.map((k) => (properties[k].title as string | undefined) ?? k);\n errors.push({\n field: visible[0],\n message: `Combined value of ${titles.join(', ')} must be at least ${group.minimum}`,\n });\n }\n return errors;\n}\n\n/**\n * Validate a SUBMITTED resolver payload (the bound, nested shape the workflow\n * consumes) against the form schema. This is the API layer's entry point: the\n * payload is inverted through each field's x-lt-bind path back to the flat\n * form representation, then run through the same pass the client uses.\n */\nexport function validateResolverPayload(\n schema: Record<string, unknown> | null | undefined,\n payload: Record<string, unknown>,\n ctx?: ResolverValidationContext | null,\n): FieldError[] {\n if (!schema) return [];\n const formValues = mapPayloadToForm(payload, schema as Record<string, any>);\n return validateResolverForm(schema, formValues, ctx);\n}\n","import { mapFormToPayload } from './x-lt-bind';\nimport { validateResolverForm, type FieldError } from './field-validator';\nimport type { ShowIfContext } from './x-lt-show-if';\n\nexport interface ResolverPayloadResult {\n /** The resolver payload ready to submit — null when the JSON is unparseable or validation failed. */\n payload: Record<string, unknown> | null;\n /** Field errors against the embedded _form_schema (empty when the form is valid). */\n errors: FieldError[];\n /** Set when the edited JSON string itself is malformed. */\n parseError: string | null;\n}\n\n/**\n * Build the resolver payload from the form's edited JSON string.\n *\n * 1. Parse the JSON — a malformed string yields `parseError`.\n * 2. Validate every visible field against the embedded `_form_schema` — hidden\n * fields (x-lt-showIf falsy against the live context) are skipped, matching\n * the server's enforcement pass. Any failures yield `errors`.\n * 3. Strip the UI-only schema and map flat form fields into their nested shape\n * via x-lt-bind — the payload IS the payload.\n *\n * The single path shared by the footer's Submit button and the submit-on-claim\n * shortcut, so both produce identical payloads and identical error lists.\n */\nexport function buildResolverPayload(\n json: string,\n context?: ShowIfContext,\n): ResolverPayloadResult {\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(json) as Record<string, unknown>;\n } catch {\n return { payload: null, errors: [], parseError: 'Invalid JSON' };\n }\n\n const schema = parsed._form_schema as Record<string, unknown> | undefined;\n if (schema) {\n const errors = validateResolverForm(schema, parsed, context);\n if (errors.length > 0) return { payload: null, errors, parseError: null };\n }\n\n const { _form_schema, ...formValues } = parsed;\n return {\n payload: mapFormToPayload(formValues, schema as Record<string, any> | undefined),\n errors: [],\n parseError: null,\n };\n}\n"],"names":["LT_ERROR_CODES","isValidationErrorBody","body","ErrorsPanel","errors","schema","focusField","field","el","jsx","jsxs","message","AlertCircle","deriveFieldLabel","_a","X_LT_REQUIRE_ANY","readRequireAnyGroups","raw","group","m","hasRequireAnyValue","value","X_LT_REQUIRE_SUM","readRequireSumGroups","groups","entry","fields","minimum","members","requireSumContribution","n","validateResolverForm","formValues","ctx","properties","required","liveCtx","fieldSchema","evaluateShowIf","err","validateField","visible","k","titles","sum","buildResolverPayload","json","context","parsed","_form_schema","mapFormToPayload"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{u as n}from"./vendor-query-DvWWuNIB.js";import{m as a}from"./index-
|
|
2
|
-
//# sourceMappingURL=tasks-
|
|
1
|
+
import{u as n}from"./vendor-query-DvWWuNIB.js";import{m as a}from"./index-CIwlVfvV.js";function y(e){const s=new URLSearchParams;return e.status&&s.set("status",e.status),e.lt_type&&s.set("lt_type",e.lt_type),e.workflow_type&&s.set("workflow_type",e.workflow_type),e.origin_id&&s.set("origin_id",e.origin_id),e.limit&&s.set("limit",String(e.limit)),e.offset!==void 0&&s.set("offset",String(e.offset)),n({queryKey:["tasks",e],queryFn:()=>a(`/tasks?${s}`)})}function c(e){return n({queryKey:["tasks",e],queryFn:()=>a(`/tasks/${e}`),enabled:!!e})}function r(e){return n({queryKey:["tasks","children",e],queryFn:()=>a(`/tasks?parent_workflow_id=${encodeURIComponent(e)}&limit=50`),enabled:!!e})}function k(e){return n({queryKey:["tasks","byWorkflow",e],queryFn:async()=>{const s=await a(`/tasks?workflow_id=${encodeURIComponent(e)}&limit=1`);return s.tasks.length>0?s.tasks[0]:(await a(`/tasks?parent_workflow_id=${encodeURIComponent(e)}&limit=1`)).tasks[0]??null},enabled:!!e})}function p(e,s){const t=new URLSearchParams;return e!=null&&e.limit&&t.set("limit",String(e.limit)),(e==null?void 0:e.offset)!==void 0&&t.set("offset",String(e.offset)),e!=null&&e.workflow_type&&t.set("workflow_type",e.workflow_type),e!=null&&e.status&&t.set("status",e.status),e!=null&&e.search&&t.set("search",e.search),n({queryKey:["processes",e],queryFn:()=>a(`/tasks/processes?${t}`),enabled:!0})}function m(e){return n({queryKey:["processes",e],queryFn:()=>a(`/tasks/processes/${encodeURIComponent(e)}`),enabled:!!e,retry:3,retryDelay:1e3})}export{m as a,k as b,y as c,c as d,r as e,p as u};
|
|
2
|
+
//# sourceMappingURL=tasks-CItmNsRp.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tasks-
|
|
1
|
+
{"version":3,"file":"tasks-CItmNsRp.js","sources":["../../src/api/tasks.ts"],"sourcesContent":["import { useQuery } from '@tanstack/react-query';\nimport { apiFetch } from './client';\nimport type { LTTaskRecord, LTEscalationRecord } from './types';\n\ninterface TaskListResponse {\n tasks: LTTaskRecord[];\n total: number;\n}\n\ninterface TaskFilters {\n status?: string;\n lt_type?: string;\n workflow_type?: string;\n origin_id?: string;\n limit?: number;\n offset?: number;\n}\n\n// ── Process types ─────────────────────────────────────────────────\n\nexport interface ProcessSummary {\n origin_id: string;\n task_count: number;\n completed: number;\n escalated: number;\n workflow_types: string[];\n started_at: string;\n last_activity: string;\n}\n\ninterface ProcessListResponse {\n processes: ProcessSummary[];\n total: number;\n}\n\nexport interface ProcessDetail {\n origin_id: string;\n tasks: LTTaskRecord[];\n escalations: LTEscalationRecord[];\n}\n\nexport function useTasks(filters: TaskFilters) {\n const params = new URLSearchParams();\n if (filters.status) params.set('status', filters.status);\n if (filters.lt_type) params.set('lt_type', filters.lt_type);\n if (filters.workflow_type) params.set('workflow_type', filters.workflow_type);\n if (filters.origin_id) params.set('origin_id', filters.origin_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<TaskListResponse>({\n queryKey: ['tasks', filters],\n queryFn: () => apiFetch(`/tasks?${params}`),\n });\n}\n\nexport function useTask(id: string) {\n return useQuery<LTTaskRecord>({\n queryKey: ['tasks', id],\n queryFn: () => apiFetch(`/tasks/${id}`),\n enabled: !!id,\n });\n}\n\n/**\n * Find the task record for a workflow.\n * Tries workflow_id first (leaf workflows), then falls back to\n * parent_workflow_id (orchestrators whose child task carries the envelope).\n */\nexport function useChildTasks(parentWorkflowId: string) {\n return useQuery<TaskListResponse>({\n queryKey: ['tasks', 'children', parentWorkflowId],\n queryFn: () =>\n apiFetch<TaskListResponse>(\n `/tasks?parent_workflow_id=${encodeURIComponent(parentWorkflowId)}&limit=50`,\n ),\n enabled: !!parentWorkflowId,\n });\n}\n\nexport function useTaskByWorkflowId(workflowId: string) {\n return useQuery<LTTaskRecord | null>({\n queryKey: ['tasks', 'byWorkflow', workflowId],\n queryFn: async () => {\n // 1. Direct match — leaf workflows have their own task record\n const direct = await apiFetch<TaskListResponse>(\n `/tasks?workflow_id=${encodeURIComponent(workflowId)}&limit=1`,\n );\n if (direct.tasks.length > 0) return direct.tasks[0];\n\n // 2. Orchestrator fallback — child task has parent_workflow_id = this workflow\n const child = await apiFetch<TaskListResponse>(\n `/tasks?parent_workflow_id=${encodeURIComponent(workflowId)}&limit=1`,\n );\n return child.tasks[0] ?? null;\n },\n enabled: !!workflowId,\n });\n}\n\n// ── Process stats ────────────────────────────────────────────────\n\nexport interface ProcessStats {\n total: number;\n active: number;\n completed: number;\n escalated: number;\n by_workflow_type: {\n workflow_type: string;\n total: number;\n active: number;\n completed: number;\n escalated: number;\n }[];\n}\n\nexport function useProcessStats(period?: string) {\n const params = period ? `?period=${period}` : '';\n return useQuery<ProcessStats>({\n queryKey: ['processStats', period],\n queryFn: () => apiFetch(`/tasks/processes/stats${params}`),\n });\n}\n\n// ── Process hooks ─────────────────────────────────────────────────\n\nexport function useProcesses(filters?: {\n limit?: number;\n offset?: number;\n workflow_type?: string;\n status?: string;\n search?: string;\n}, options?: { enabled?: boolean }) {\n const params = new URLSearchParams();\n if (filters?.limit) params.set('limit', String(filters.limit));\n if (filters?.offset !== undefined) params.set('offset', String(filters.offset));\n if (filters?.workflow_type) params.set('workflow_type', filters.workflow_type);\n if (filters?.status) params.set('status', filters.status);\n if (filters?.search) params.set('search', filters.search);\n\n return useQuery<ProcessListResponse>({\n queryKey: ['processes', filters],\n queryFn: () => apiFetch(`/tasks/processes?${params}`),\n enabled: options?.enabled ?? true,\n });\n}\n\nexport function useProcessDetail(originId: string) {\n return useQuery<ProcessDetail>({\n queryKey: ['processes', originId],\n queryFn: () => apiFetch(`/tasks/processes/${encodeURIComponent(originId)}`),\n enabled: !!originId,\n retry: 3,\n retryDelay: 1000,\n });\n}\n"],"names":["useTasks","filters","params","useQuery","apiFetch","useTask","id","useChildTasks","parentWorkflowId","useTaskByWorkflowId","workflowId","direct","useProcesses","options","useProcessDetail","originId"],"mappings":"uFAyCO,SAASA,EAASC,EAAsB,CAC7C,MAAMC,EAAS,IAAI,gBACnB,OAAID,EAAQ,QAAQC,EAAO,IAAI,SAAUD,EAAQ,MAAM,EACnDA,EAAQ,SAASC,EAAO,IAAI,UAAWD,EAAQ,OAAO,EACtDA,EAAQ,eAAeC,EAAO,IAAI,gBAAiBD,EAAQ,aAAa,EACxEA,EAAQ,WAAWC,EAAO,IAAI,YAAaD,EAAQ,SAAS,EAC5DA,EAAQ,OAAOC,EAAO,IAAI,QAAS,OAAOD,EAAQ,KAAK,CAAC,EACxDA,EAAQ,SAAW,QAAWC,EAAO,IAAI,SAAU,OAAOD,EAAQ,MAAM,CAAC,EAEtEE,EAA2B,CAChC,SAAU,CAAC,QAASF,CAAO,EAC3B,QAAS,IAAMG,EAAS,UAAUF,CAAM,EAAE,CAAA,CAC3C,CACH,CAEO,SAASG,EAAQC,EAAY,CAClC,OAAOH,EAAuB,CAC5B,SAAU,CAAC,QAASG,CAAE,EACtB,QAAS,IAAMF,EAAS,UAAUE,CAAE,EAAE,EACtC,QAAS,CAAC,CAACA,CAAA,CACZ,CACH,CAOO,SAASC,EAAcC,EAA0B,CACtD,OAAOL,EAA2B,CAChC,SAAU,CAAC,QAAS,WAAYK,CAAgB,EAChD,QAAS,IACPJ,EACE,6BAA6B,mBAAmBI,CAAgB,CAAC,WAAA,EAErE,QAAS,CAAC,CAACA,CAAA,CACZ,CACH,CAEO,SAASC,EAAoBC,EAAoB,CACtD,OAAOP,EAA8B,CACnC,SAAU,CAAC,QAAS,aAAcO,CAAU,EAC5C,QAAS,SAAY,CAEnB,MAAMC,EAAS,MAAMP,EACnB,sBAAsB,mBAAmBM,CAAU,CAAC,UAAA,EAEtD,OAAIC,EAAO,MAAM,OAAS,EAAUA,EAAO,MAAM,CAAC,GAGpC,MAAMP,EAClB,6BAA6B,mBAAmBM,CAAU,CAAC,UAAA,GAEhD,MAAM,CAAC,GAAK,IAC3B,EACA,QAAS,CAAC,CAACA,CAAA,CACZ,CACH,CA4BO,SAASE,EAAaX,EAM1BY,EAAiC,CAClC,MAAMX,EAAS,IAAI,gBACnB,OAAID,GAAA,MAAAA,EAAS,OAAOC,EAAO,IAAI,QAAS,OAAOD,EAAQ,KAAK,CAAC,GACzDA,GAAA,YAAAA,EAAS,UAAW,QAAWC,EAAO,IAAI,SAAU,OAAOD,EAAQ,MAAM,CAAC,EAC1EA,GAAA,MAAAA,EAAS,eAAeC,EAAO,IAAI,gBAAiBD,EAAQ,aAAa,EACzEA,GAAA,MAAAA,EAAS,QAAQC,EAAO,IAAI,SAAUD,EAAQ,MAAM,EACpDA,GAAA,MAAAA,EAAS,QAAQC,EAAO,IAAI,SAAUD,EAAQ,MAAM,EAEjDE,EAA8B,CACnC,SAAU,CAAC,YAAaF,CAAO,EAC/B,QAAS,IAAMG,EAAS,oBAAoBF,CAAM,EAAE,EACpD,QAA6B,EAAA,CAC9B,CACH,CAEO,SAASY,EAAiBC,EAAkB,CACjD,OAAOZ,EAAwB,CAC7B,SAAU,CAAC,YAAaY,CAAQ,EAChC,QAAS,IAAMX,EAAS,oBAAoB,mBAAmBW,CAAQ,CAAC,EAAE,EAC1E,QAAS,CAAC,CAACA,EACX,MAAO,EACP,WAAY,GAAA,CACb,CACH"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{u as i,b as u,c as s}from"./vendor-query-DvWWuNIB.js";import{m as t}from"./index-
|
|
2
|
-
//# sourceMappingURL=topics-
|
|
1
|
+
import{u as i,b as u,c as s}from"./vendor-query-DvWWuNIB.js";import{m as t}from"./index-CIwlVfvV.js";function r(e={}){const n=new URLSearchParams;e.category&&n.set("category",e.category),e.search&&n.set("search",e.search),e.limit!=null&&n.set("limit",String(e.limit)),e.offset!=null&&n.set("offset",String(e.offset));const o=n.toString();return i({queryKey:["topics",e],queryFn:()=>t(`/topics${o?`?${o}`:""}`)})}function y(e){return i({queryKey:["topics","detail",e],queryFn:()=>t(`/topics/by-name/${encodeURIComponent(e)}`),enabled:!!e})}function m(){const e=u();return s({mutationFn:({topic:n,...o})=>t(`/topics/by-name/${encodeURIComponent(n)}`,{method:"PUT",body:JSON.stringify(o)}),onSuccess:()=>{e.invalidateQueries({queryKey:["topics"]})}})}function p(){const e=u();return s({mutationFn:n=>t(`/topics/by-name/${encodeURIComponent(n)}`,{method:"DELETE"}),onSuccess:()=>{e.invalidateQueries({queryKey:["topics"]})}})}function d(){return s({mutationFn:({topic:e,event:n})=>t(`/topics/by-name/${encodeURIComponent(e)}/publish`,{method:"POST",body:JSON.stringify(n)})})}export{y as a,m as b,p as c,d,r as u};
|
|
2
|
+
//# sourceMappingURL=topics-CJYG7BX5.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"topics-
|
|
1
|
+
{"version":3,"file":"topics-CJYG7BX5.js","sources":["../../src/api/topics.ts"],"sourcesContent":["import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { apiFetch } from './client';\n\nexport interface TopicCatalogEntry {\n topic: string;\n description?: string;\n category: string;\n payload_schema?: Record<string, any>;\n example_payload?: Record<string, any>;\n source: string;\n tags: string[];\n managed: boolean;\n subscriber_count?: number;\n last_seen_at?: string;\n created_at: string;\n updated_at: string;\n}\n\nexport interface TopicSubscriber {\n id: string;\n agent_id: string;\n agent_name: string;\n topic: string;\n reaction_type: string;\n}\n\nexport interface TopicDetail extends TopicCatalogEntry {\n subscribers: TopicSubscriber[];\n}\n\ninterface TopicListResponse {\n topics: TopicCatalogEntry[];\n total: number;\n}\n\ninterface TopicFilters {\n category?: string;\n search?: string;\n limit?: number;\n offset?: number;\n}\n\nexport function useTopics(filters: TopicFilters = {}) {\n const params = new URLSearchParams();\n if (filters.category) params.set('category', filters.category);\n if (filters.search) params.set('search', filters.search);\n if (filters.limit != null) params.set('limit', String(filters.limit));\n if (filters.offset != null) params.set('offset', String(filters.offset));\n const qs = params.toString();\n\n return useQuery<TopicListResponse>({\n queryKey: ['topics', filters],\n queryFn: () => apiFetch(`/topics${qs ? `?${qs}` : ''}`),\n });\n}\n\nexport function useTopic(topic: string | null) {\n return useQuery<TopicDetail>({\n queryKey: ['topics', 'detail', topic],\n queryFn: () => apiFetch(`/topics/by-name/${encodeURIComponent(topic!)}`),\n enabled: !!topic,\n });\n}\n\nexport function useCreateTopic() {\n const queryClient = useQueryClient();\n return useMutation<TopicCatalogEntry, Error, Partial<TopicCatalogEntry> & { topic: string; category: string }>({\n mutationFn: (body) =>\n apiFetch('/topics', {\n method: 'POST',\n body: JSON.stringify(body),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['topics'] });\n },\n });\n}\n\nexport function useUpdateTopic() {\n const queryClient = useQueryClient();\n return useMutation<TopicCatalogEntry, Error, { topic: string } & Partial<TopicCatalogEntry>>({\n mutationFn: ({ topic, ...body }) =>\n apiFetch(`/topics/by-name/${encodeURIComponent(topic)}`, {\n method: 'PUT',\n body: JSON.stringify(body),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['topics'] });\n },\n });\n}\n\nexport function useDeleteTopic() {\n const queryClient = useQueryClient();\n return useMutation<{ deleted: boolean }, Error, string>({\n mutationFn: (topic) =>\n apiFetch(`/topics/by-name/${encodeURIComponent(topic)}`, { method: 'DELETE' }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['topics'] });\n },\n });\n}\n\nexport function usePublishTopic() {\n // The request body IS the event envelope (Partial<LTEvent> + optional subject).\n // The server derives `type` from the subject/topic and mints id/timestamp.\n return useMutation<{ published: boolean; topic: string; timestamp: string }, Error, { topic: string; event: Record<string, any> }>({\n mutationFn: ({ topic, event }) =>\n apiFetch(`/topics/by-name/${encodeURIComponent(topic)}/publish`, {\n method: 'POST',\n body: JSON.stringify(event),\n }),\n });\n}\n"],"names":["useTopics","filters","params","qs","useQuery","apiFetch","useTopic","topic","useUpdateTopic","queryClient","useQueryClient","useMutation","body","useDeleteTopic","usePublishTopic","event"],"mappings":"qGA0CO,SAASA,EAAUC,EAAwB,GAAI,CACpD,MAAMC,EAAS,IAAI,gBACfD,EAAQ,UAAUC,EAAO,IAAI,WAAYD,EAAQ,QAAQ,EACzDA,EAAQ,QAAQC,EAAO,IAAI,SAAUD,EAAQ,MAAM,EACnDA,EAAQ,OAAS,MAAMC,EAAO,IAAI,QAAS,OAAOD,EAAQ,KAAK,CAAC,EAChEA,EAAQ,QAAU,MAAMC,EAAO,IAAI,SAAU,OAAOD,EAAQ,MAAM,CAAC,EACvE,MAAME,EAAKD,EAAO,SAAA,EAElB,OAAOE,EAA4B,CACjC,SAAU,CAAC,SAAUH,CAAO,EAC5B,QAAS,IAAMI,EAAS,UAAUF,EAAK,IAAIA,CAAE,GAAK,EAAE,EAAE,CAAA,CACvD,CACH,CAEO,SAASG,EAASC,EAAsB,CAC7C,OAAOH,EAAsB,CAC3B,SAAU,CAAC,SAAU,SAAUG,CAAK,EACpC,QAAS,IAAMF,EAAS,mBAAmB,mBAAmBE,CAAM,CAAC,EAAE,EACvE,QAAS,CAAC,CAACA,CAAA,CACZ,CACH,CAgBO,SAASC,GAAiB,CAC/B,MAAMC,EAAcC,EAAA,EACpB,OAAOC,EAAsF,CAC3F,WAAY,CAAC,CAAE,MAAAJ,EAAO,GAAGK,CAAA,IACvBP,EAAS,mBAAmB,mBAAmBE,CAAK,CAAC,GAAI,CACvD,OAAQ,MACR,KAAM,KAAK,UAAUK,CAAI,CAAA,CAC1B,EACH,UAAW,IAAM,CACfH,EAAY,kBAAkB,CAAE,SAAU,CAAC,QAAQ,EAAG,CACxD,CAAA,CACD,CACH,CAEO,SAASI,GAAiB,CAC/B,MAAMJ,EAAcC,EAAA,EACpB,OAAOC,EAAiD,CACtD,WAAaJ,GACXF,EAAS,mBAAmB,mBAAmBE,CAAK,CAAC,GAAI,CAAE,OAAQ,QAAA,CAAU,EAC/E,UAAW,IAAM,CACfE,EAAY,kBAAkB,CAAE,SAAU,CAAC,QAAQ,EAAG,CACxD,CAAA,CACD,CACH,CAEO,SAASK,GAAkB,CAGhC,OAAOH,EAA4H,CACjI,WAAY,CAAC,CAAE,MAAAJ,EAAO,MAAAQ,KACpBV,EAAS,mBAAmB,mBAAmBE,CAAK,CAAC,WAAY,CAC/D,OAAQ,OACR,KAAM,KAAK,UAAUQ,CAAK,CAAA,CAC3B,CAAA,CACJ,CACH"}
|
package/dashboard/dist/assets/{useDebouncedValue-Cp5ZOtVE.js → useDebouncedValue-BrwgXcp8.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{e as c}from"./index-
|
|
2
|
-
//# sourceMappingURL=useDebouncedValue-
|
|
1
|
+
import{e as c}from"./index-CIwlVfvV.js";import{a as o}from"./vendor-query-DvWWuNIB.js";function i(e,t=c){const[r,s]=o.useState(e);return o.useEffect(()=>{const u=setTimeout(()=>s(e),t);return()=>clearTimeout(u)},[e,t]),r}export{i as u};
|
|
2
|
+
//# sourceMappingURL=useDebouncedValue-BrwgXcp8.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDebouncedValue-
|
|
1
|
+
{"version":3,"file":"useDebouncedValue-BrwgXcp8.js","sources":["../../src/hooks/useDebouncedValue.ts"],"sourcesContent":["import { SEARCH_DEBOUNCE_MS } from '../lib/realtime-refresh';\nimport { useEffect, useState } from 'react';\n\n/**\n * Returns a debounced copy of `value` that only updates\n * after `delay` ms of inactivity.\n */\nexport function useDebouncedValue<T>(value: T, delay = SEARCH_DEBOUNCE_MS): T {\n const [debounced, setDebounced] = useState(value);\n useEffect(() => {\n const timer = setTimeout(() => setDebounced(value), delay);\n return () => clearTimeout(timer);\n }, [value, delay]);\n return debounced;\n}\n"],"names":["useDebouncedValue","value","delay","SEARCH_DEBOUNCE_MS","debounced","setDebounced","useState","useEffect","timer"],"mappings":"uFAOO,SAASA,EAAqBC,EAAUC,EAAQC,EAAuB,CAC5E,KAAM,CAACC,EAAWC,CAAY,EAAIC,EAAAA,SAASL,CAAK,EAChDM,OAAAA,EAAAA,UAAU,IAAM,CACd,MAAMC,EAAQ,WAAW,IAAMH,EAAaJ,CAAK,EAAGC,CAAK,EACzD,MAAO,IAAM,aAAaM,CAAK,CACjC,EAAG,CAACP,EAAOC,CAAK,CAAC,EACVE,CACT"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as f}from"./vendor-query-DvWWuNIB.js";import{u as i}from"./controlplane-
|
|
2
|
-
//# sourceMappingURL=useNamespace-
|
|
1
|
+
import{a as f}from"./vendor-query-DvWWuNIB.js";import{u as i}from"./controlplane-YxvP1KCa.js";import{f as l}from"./vendor-react-_9U4mKFr.js";function g(a="namespace"){const[m,c]=l(),{data:r,isLoading:n}=i(),o=m.get(a)||"",e=((r==null?void 0:r.apps)??[]).map(s=>s.appId).sort();f.useEffect(()=>{!o&&e.length>0&&!n&&c(s=>{const t=new URLSearchParams(s);return t.set(a,e[0]),t},{replace:!0})},[o,e.length,n]);const u=s=>{c(t=>{const p=new URLSearchParams(t);return p.set(a,s),p})};return{namespace:o||e[0]||"",available:e,isLoading:n,setNamespace:u}}export{g as u};
|
|
2
|
+
//# sourceMappingURL=useNamespace-CHty0HAS.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useNamespace-
|
|
1
|
+
{"version":3,"file":"useNamespace-CHty0HAS.js","sources":["../../src/hooks/useNamespace.ts"],"sourcesContent":["import { useEffect } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport { useControlPlaneApps } from '../api/controlplane';\n\n/**\n * Namespace-first hook. Queries available HotMesh namespaces,\n * auto-selects the first one if no URL param, and keeps the URL\n * in sync. Uses replaceState (not pushState) to avoid history spam.\n */\nexport function useNamespace(paramName = 'namespace') {\n const [params, setParams] = useSearchParams();\n const { data: apps, isLoading } = useControlPlaneApps();\n\n const selected = params.get(paramName) || '';\n const available = (apps?.apps ?? []).map((a) => a.appId).sort();\n\n useEffect(() => {\n if (!selected && available.length > 0 && !isLoading) {\n setParams((prev) => {\n const next = new URLSearchParams(prev);\n next.set(paramName, available[0]);\n return next;\n }, { replace: true });\n }\n }, [selected, available.length, isLoading]);\n\n const setNamespace = (ns: string) => {\n setParams((prev) => {\n const next = new URLSearchParams(prev);\n next.set(paramName, ns);\n return next;\n });\n };\n\n return { namespace: selected || available[0] || '', available, isLoading, setNamespace };\n}\n"],"names":["useNamespace","paramName","params","setParams","useSearchParams","apps","isLoading","useControlPlaneApps","selected","available","a","useEffect","prev","next","setNamespace","ns"],"mappings":"6IASO,SAASA,EAAaC,EAAY,YAAa,CACpD,KAAM,CAACC,EAAQC,CAAS,EAAIC,EAAA,EACtB,CAAE,KAAMC,EAAM,UAAAC,CAAA,EAAcC,EAAA,EAE5BC,EAAWN,EAAO,IAAID,CAAS,GAAK,GACpCQ,IAAaJ,GAAA,YAAAA,EAAM,OAAQ,CAAA,GAAI,IAAKK,GAAMA,EAAE,KAAK,EAAE,KAAA,EAEzDC,EAAAA,UAAU,IAAM,CACV,CAACH,GAAYC,EAAU,OAAS,GAAK,CAACH,GACxCH,EAAWS,GAAS,CAClB,MAAMC,EAAO,IAAI,gBAAgBD,CAAI,EACrC,OAAAC,EAAK,IAAIZ,EAAWQ,EAAU,CAAC,CAAC,EACzBI,CACT,EAAG,CAAE,QAAS,GAAM,CAExB,EAAG,CAACL,EAAUC,EAAU,OAAQH,CAAS,CAAC,EAE1C,MAAMQ,EAAgBC,GAAe,CACnCZ,EAAWS,GAAS,CAClB,MAAMC,EAAO,IAAI,gBAAgBD,CAAI,EACrC,OAAAC,EAAK,IAAIZ,EAAWc,CAAE,EACfF,CACT,CAAC,CACH,EAEA,MAAO,CAAE,UAAWL,GAAYC,EAAU,CAAC,GAAK,GAAI,UAAAA,EAAW,UAAAH,EAAW,aAAAQ,CAAA,CAC5E"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as r}from"./vendor-query-DvWWuNIB.js";import{k as y,N as d}from"./index-
|
|
2
|
-
//# sourceMappingURL=useYamlActivityEvents-
|
|
1
|
+
import{a as r}from"./vendor-query-DvWWuNIB.js";import{k as y,N as d}from"./index-CIwlVfvV.js";function F(o){const[n,S]=r.useState([]),[p,f]=r.useState("idle"),w=r.useCallback(i=>{var m;if(!o||i.workflowId!==o)return;const c=((m=i.type)==null?void 0:m.split("."))??[];if(c[1]!=="activity")return;const s=i.activityName,t=i.data,a=`activity.${c[c.length-1]}`;S(l=>{const u=l.find(e=>e.activityId===s);return a==="activity.started"?u?l.map(e=>e.activityId===s?{...e,status:"running"}:e):[...l,{activityId:s,title:(t==null?void 0:t.title)||s,toolName:t==null?void 0:t.toolName,toolSource:t==null?void 0:t.toolSource,stepIndex:(t==null?void 0:t.stepIndex)??l.length,totalSteps:(t==null?void 0:t.totalSteps)??0,status:"running"}]:a==="activity.completed"&&u?l.map(e=>e.activityId===s?{...e,status:"completed"}:e):a==="activity.failed"&&u?l.map(e=>e.activityId===s?{...e,status:"failed",error:t==null?void 0:t.error}:e):l})},[o]),k=r.useCallback(i=>{var s;if(!o||i.workflowId!==o)return;const c=(s=i.type)==null?void 0:s.split(".").pop();c==="completed"&&f("completed"),c==="failed"&&f("failed")},[o]);y(o?`${d}.system.activity.>`:"",w),y(o?`${d}.system.workflow.>`:"",k);const v=n.length>0&&n.every(i=>i.status==="completed"||i.status==="failed"),g=n.some(i=>i.status==="failed");return{steps:n,isComplete:v||p==="completed",isFailed:g||p==="failed"}}export{F as u};
|
|
2
|
+
//# sourceMappingURL=useYamlActivityEvents-CoTsia7t.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useYamlActivityEvents-
|
|
1
|
+
{"version":3,"file":"useYamlActivityEvents-CoTsia7t.js","sources":["../../src/hooks/useYamlActivityEvents.ts"],"sourcesContent":["import { useState, useCallback } from 'react';\nimport { useEventSubscription } from './useEventContext';\nimport { NATS_SUBJECT_PREFIX } from '../lib/nats/config';\n\nexport interface ActivityStep {\n activityId: string;\n title: string;\n toolName?: string;\n toolSource?: string;\n stepIndex: number;\n totalSteps: number;\n status: 'pending' | 'running' | 'completed' | 'failed';\n error?: string;\n}\n\n/**\n * Subscribe to activity and workflow lifecycle events for a specific graph job.\n * Returns live step progress and overall workflow status.\n *\n * Hook-only flows (no worker activities) produce no activity events, so\n * isComplete/isFailed is derived from workflow.completed/failed events instead.\n */\nexport function useYamlActivityEvents(jobId: string | null): {\n steps: ActivityStep[];\n isComplete: boolean;\n isFailed: boolean;\n} {\n const [steps, setSteps] = useState<ActivityStep[]>([]);\n const [workflowStatus, setWorkflowStatus] = useState<'idle' | 'completed' | 'failed'>('idle');\n\n const activityHandler = useCallback((event: any) => {\n if (!jobId || event.workflowId !== jobId) return;\n // event.type is the full topic: 'system.activity.{wfId}.{name}.{action}'\n const parts = (event.type as string | undefined)?.split('.') ?? [];\n if (parts[1] !== 'activity') return;\n\n const activityId = event.activityName as string;\n const data = event.data as Record<string, any> | undefined;\n // Normalise to short form for comparisons below (e.g. 'activity.started')\n const eventType = `activity.${parts[parts.length - 1]}`;\n\n setSteps((prev) => {\n const existing = prev.find((s) => s.activityId === activityId);\n\n if (eventType === 'activity.started') {\n if (existing) {\n return prev.map((s) => s.activityId === activityId ? { ...s, status: 'running' as const } : s);\n }\n return [...prev, {\n activityId,\n title: data?.title || activityId,\n toolName: data?.toolName,\n toolSource: data?.toolSource,\n stepIndex: data?.stepIndex ?? prev.length,\n totalSteps: data?.totalSteps ?? 0,\n status: 'running' as const,\n }];\n }\n\n if (eventType === 'activity.completed' && existing) {\n return prev.map((s) => s.activityId === activityId ? { ...s, status: 'completed' as const } : s);\n }\n\n if (eventType === 'activity.failed' && existing) {\n return prev.map((s) => s.activityId === activityId ? { ...s, status: 'failed' as const, error: data?.error } : s);\n }\n\n return prev;\n });\n }, [jobId]);\n\n const workflowHandler = useCallback((event: any) => {\n if (!jobId || event.workflowId !== jobId) return;\n // event.type is the full topic: 'system.workflow.{wfId}.{action}'\n const action = (event.type as string | undefined)?.split('.').pop();\n if (action === 'completed') setWorkflowStatus('completed');\n if (action === 'failed') setWorkflowStatus('failed');\n }, [jobId]);\n\n useEventSubscription(\n jobId ? `${NATS_SUBJECT_PREFIX}.system.activity.>` : '',\n activityHandler,\n );\n useEventSubscription(\n jobId ? `${NATS_SUBJECT_PREFIX}.system.workflow.>` : '',\n workflowHandler,\n );\n\n const stepsComplete = steps.length > 0 && steps.every((s) => s.status === 'completed' || s.status === 'failed');\n const stepsFailed = steps.some((s) => s.status === 'failed');\n\n const isComplete = stepsComplete || workflowStatus === 'completed';\n const isFailed = stepsFailed || workflowStatus === 'failed';\n\n return { steps, isComplete, isFailed };\n}\n"],"names":["useYamlActivityEvents","jobId","steps","setSteps","useState","workflowStatus","setWorkflowStatus","activityHandler","useCallback","event","parts","_a","activityId","data","eventType","prev","existing","s","workflowHandler","action","useEventSubscription","NATS_SUBJECT_PREFIX","stepsComplete","stepsFailed"],"mappings":"8FAsBO,SAASA,EAAsBC,EAIpC,CACA,KAAM,CAACC,EAAOC,CAAQ,EAAIC,EAAAA,SAAyB,CAAA,CAAE,EAC/C,CAACC,EAAgBC,CAAiB,EAAIF,EAAAA,SAA0C,MAAM,EAEtFG,EAAkBC,cAAaC,GAAe,OAClD,GAAI,CAACR,GAASQ,EAAM,aAAeR,EAAO,OAE1C,MAAMS,IAASC,EAAAF,EAAM,OAAN,YAAAE,EAAmC,MAAM,OAAQ,CAAA,EAChE,GAAID,EAAM,CAAC,IAAM,WAAY,OAE7B,MAAME,EAAaH,EAAM,aACnBI,EAAOJ,EAAM,KAEbK,EAAY,YAAYJ,EAAMA,EAAM,OAAS,CAAC,CAAC,GAErDP,EAAUY,GAAS,CACjB,MAAMC,EAAWD,EAAK,KAAME,GAAMA,EAAE,aAAeL,CAAU,EAE7D,OAAIE,IAAc,mBACZE,EACKD,EAAK,IAAKE,GAAMA,EAAE,aAAeL,EAAa,CAAE,GAAGK,EAAG,OAAQ,SAAA,EAAuBA,CAAC,EAExF,CAAC,GAAGF,EAAM,CACf,WAAAH,EACA,OAAOC,GAAA,YAAAA,EAAM,QAASD,EACtB,SAAUC,GAAA,YAAAA,EAAM,SAChB,WAAYA,GAAA,YAAAA,EAAM,WAClB,WAAWA,GAAA,YAAAA,EAAM,YAAaE,EAAK,OACnC,YAAYF,GAAA,YAAAA,EAAM,aAAc,EAChC,OAAQ,SAAA,CACT,EAGCC,IAAc,sBAAwBE,EACjCD,EAAK,IAAKE,GAAMA,EAAE,aAAeL,EAAa,CAAE,GAAGK,EAAG,OAAQ,WAAA,EAAyBA,CAAC,EAG7FH,IAAc,mBAAqBE,EAC9BD,EAAK,IAAKE,GAAMA,EAAE,aAAeL,EAAa,CAAE,GAAGK,EAAG,OAAQ,SAAmB,MAAOJ,GAAA,YAAAA,EAAM,KAAA,EAAUI,CAAC,EAG3GF,CACT,CAAC,CACH,EAAG,CAACd,CAAK,CAAC,EAEJiB,EAAkBV,cAAaC,GAAe,OAClD,GAAI,CAACR,GAASQ,EAAM,aAAeR,EAAO,OAE1C,MAAMkB,GAAUR,EAAAF,EAAM,OAAN,YAAAE,EAAmC,MAAM,KAAK,MAC1DQ,IAAW,aAAab,EAAkB,WAAW,EACrDa,IAAW,UAAUb,EAAkB,QAAQ,CACrD,EAAG,CAACL,CAAK,CAAC,EAEVmB,EACEnB,EAAQ,GAAGoB,CAAmB,qBAAuB,GACrDd,CAAA,EAEFa,EACEnB,EAAQ,GAAGoB,CAAmB,qBAAuB,GACrDH,CAAA,EAGF,MAAMI,EAAgBpB,EAAM,OAAS,GAAKA,EAAM,MAAOe,GAAMA,EAAE,SAAW,aAAeA,EAAE,SAAW,QAAQ,EACxGM,EAAcrB,EAAM,KAAMe,GAAMA,EAAE,SAAW,QAAQ,EAK3D,MAAO,CAAE,MAAAf,EAAO,WAHGoB,GAAiBjB,IAAmB,YAG3B,SAFXkB,GAAelB,IAAmB,QAEvB,CAC9B"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{u as l,b as a,c as s}from"./vendor-query-DvWWuNIB.js";import{m as r}from"./index-
|
|
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-CIwlVfvV.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-CiWwx5rM.js.map
|