@hotmeshio/long-tail 0.16.2 → 0.16.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/api/exports.d.ts +15 -0
- package/build/api/exports.js +35 -0
- package/build/bin/ltc.js +4 -0
- package/build/lib/cli/commands/workflows.d.ts +3 -0
- package/build/lib/cli/commands/workflows.js +22 -0
- package/build/routes/exports.js +11 -0
- package/build/sdk/index.d.ts +1 -0
- package/build/sdk/index.js +1 -0
- package/build/services/export/index.d.ts +19 -0
- package/build/services/export/index.js +53 -33
- package/build/shared/form-validation/field-validator.d.ts +8 -6
- package/build/shared/form-validation/field-validator.js +23 -15
- package/build/shared/form-validation/x-lt-options.js +35 -21
- package/build/system/mcp-servers/admin/exports.js +15 -0
- package/build/system/mcp-servers/admin/schemas.d.ts +7 -0
- package/build/system/mcp-servers/admin/schemas.js +5 -2
- package/build/system/seed/tool-manifests-admin.js +1 -0
- package/dashboard/dist/assets/{AdminDashboard-BrOvvDHF.js → AdminDashboard-Csq-oxmY.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-BrOvvDHF.js.map → AdminDashboard-Csq-oxmY.js.map} +1 -1
- package/dashboard/dist/assets/{AgentConfigPage-CtVq8J0L.js → AgentConfigPage-Bnr5zbyJ.js} +2 -2
- package/dashboard/dist/assets/{AgentConfigPage-CtVq8J0L.js.map → AgentConfigPage-Bnr5zbyJ.js.map} +1 -1
- package/dashboard/dist/assets/{AgentDetailPage-DTfTQDug.js → AgentDetailPage-DgRu-Fhg.js} +2 -2
- package/dashboard/dist/assets/{AgentDetailPage-DTfTQDug.js.map → AgentDetailPage-DgRu-Fhg.js.map} +1 -1
- package/dashboard/dist/assets/{AgentsPage-vCTc3Qvj.js → AgentsPage-BuyXKkP3.js} +2 -2
- package/dashboard/dist/assets/{AgentsPage-vCTc3Qvj.js.map → AgentsPage-BuyXKkP3.js.map} +1 -1
- package/dashboard/dist/assets/{AvailableEscalationsPage-DJODShd7.js → AvailableEscalationsPage-BIzTjUMG.js} +2 -2
- package/dashboard/dist/assets/{AvailableEscalationsPage-DJODShd7.js.map → AvailableEscalationsPage-BIzTjUMG.js.map} +1 -1
- package/dashboard/dist/assets/{BotPicker-GU44inXA.js → BotPicker-xpPjRnkf.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-GU44inXA.js.map → BotPicker-xpPjRnkf.js.map} +1 -1
- package/dashboard/dist/assets/{BulkAssignModal-ChqzG6FY.js → BulkAssignModal-CQ3k-7rO.js} +2 -2
- package/dashboard/dist/assets/{BulkAssignModal-ChqzG6FY.js.map → BulkAssignModal-CQ3k-7rO.js.map} +1 -1
- package/dashboard/dist/assets/{CapabilitiesPage-Y2hycdPY.js → CapabilitiesPage-DCkEJ0In.js} +2 -2
- package/dashboard/dist/assets/{CapabilitiesPage-Y2hycdPY.js.map → CapabilitiesPage-DCkEJ0In.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-CmCwt_Rs.js → CollapsibleSection-10sJSNNF.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-CmCwt_Rs.js.map → CollapsibleSection-10sJSNNF.js.map} +1 -1
- package/dashboard/dist/assets/{CountdownTimer-Bx2XXJOd.js → CountdownTimer-BFy9Joxb.js} +2 -2
- package/dashboard/dist/assets/{CountdownTimer-Bx2XXJOd.js.map → CountdownTimer-BFy9Joxb.js.map} +1 -1
- package/dashboard/dist/assets/{CredentialsPage-CoX_PNBe.js → CredentialsPage-DIR-fUoF.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-CoX_PNBe.js.map → CredentialsPage-DIR-fUoF.js.map} +1 -1
- package/dashboard/dist/assets/{CronLabel-CVYKRipP.js → CronLabel-C66ASvgE.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-CVYKRipP.js.map → CronLabel-C66ASvgE.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-jRURiCRW.js → ElapsedCell-RWvrCHn7.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-jRURiCRW.js.map → ElapsedCell-RWvrCHn7.js.map} +1 -1
- package/dashboard/dist/assets/{EntityTimelinePanel-G6nzvgpl.js → EntityTimelinePanel-CNaYs3nA.js} +2 -2
- package/dashboard/dist/assets/{EntityTimelinePanel-G6nzvgpl.js.map → EntityTimelinePanel-CNaYs3nA.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationListSchemaPage-D-rVTQ1m.js → EscalationListSchemaPage-BsRQtDDc.js} +2 -2
- package/dashboard/dist/assets/{EscalationListSchemaPage-D-rVTQ1m.js.map → EscalationListSchemaPage-BsRQtDDc.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationSchemaPage-CV0R_xY9.js → EscalationSchemaPage-BMYQmwGA.js} +2 -2
- package/dashboard/dist/assets/{EscalationSchemaPage-CV0R_xY9.js.map → EscalationSchemaPage-BMYQmwGA.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-DMdx15CQ.js → EscalationsOverview-yv4Yn6zl.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-DMdx15CQ.js.map → EscalationsOverview-yv4Yn6zl.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-CIvsdt-q.js → EventTable-ebZK7vXl.js} +2 -2
- package/dashboard/dist/assets/{EventTable-CIvsdt-q.js.map → EventTable-ebZK7vXl.js.map} +1 -1
- package/dashboard/dist/assets/{FilterBar-DWYGkVRH.js → FilterBar-D6JDMSHi.js} +2 -2
- package/dashboard/dist/assets/{FilterBar-DWYGkVRH.js.map → FilterBar-D6JDMSHi.js.map} +1 -1
- package/dashboard/dist/assets/{GraphInvokePage-BGHlXh4r.js → GraphInvokePage-BFntNMop.js} +2 -2
- package/dashboard/dist/assets/{GraphInvokePage-BGHlXh4r.js.map → GraphInvokePage-BFntNMop.js.map} +1 -1
- package/dashboard/dist/assets/{HomePage-BHOnp8SK.js → HomePage-B24GH9Ga.js} +2 -2
- package/dashboard/dist/assets/{HomePage-BHOnp8SK.js.map → HomePage-B24GH9Ga.js.map} +1 -1
- package/dashboard/dist/assets/{ListToolbar-iOgn_db5.js → ListToolbar-DlGreUpP.js} +2 -2
- package/dashboard/dist/assets/{ListToolbar-iOgn_db5.js.map → ListToolbar-DlGreUpP.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-Be9sMKCA.js → McpOverview-D0G2vACW.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-Be9sMKCA.js.map → McpOverview-D0G2vACW.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryDetailPage-BIgpmGJN.js → McpQueryDetailPage-LZO04PEB.js} +2 -2
- package/dashboard/dist/assets/{McpQueryDetailPage-BIgpmGJN.js.map → McpQueryDetailPage-LZO04PEB.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryPage-Okcxw_Um.js → McpQueryPage-BIwSDHgB.js} +2 -2
- package/dashboard/dist/assets/{McpQueryPage-Okcxw_Um.js.map → McpQueryPage-BIwSDHgB.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunDetailPage-DT8kOfih.js → McpRunDetailPage-DjYWJLWh.js} +2 -2
- package/dashboard/dist/assets/{McpRunDetailPage-DT8kOfih.js.map → McpRunDetailPage-DjYWJLWh.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunsPage-BXhoP77D.js → McpRunsPage-CTT7B-pf.js} +2 -2
- package/dashboard/dist/assets/{McpRunsPage-BXhoP77D.js.map → McpRunsPage-CTT7B-pf.js.map} +1 -1
- package/dashboard/dist/assets/{OperationsPage-rVhC8JPv.js → OperationsPage-Dd0WxAwH.js} +2 -2
- package/dashboard/dist/assets/{OperationsPage-rVhC8JPv.js.map → OperationsPage-Dd0WxAwH.js.map} +1 -1
- package/dashboard/dist/assets/{OperatorDashboard-CIt061hu.js → OperatorDashboard-BfKMaVzV.js} +2 -2
- package/dashboard/dist/assets/{OperatorDashboard-CIt061hu.js.map → OperatorDashboard-BfKMaVzV.js.map} +1 -1
- package/dashboard/dist/assets/{PersonaDetailPage-r46uNF4E.js → PersonaDetailPage-B48MX4lq.js} +2 -2
- package/dashboard/dist/assets/{PersonaDetailPage-r46uNF4E.js.map → PersonaDetailPage-B48MX4lq.js.map} +1 -1
- package/dashboard/dist/assets/{PersonasPage-CayYv9-j.js → PersonasPage-dGX6E96g.js} +2 -2
- package/dashboard/dist/assets/{PersonasPage-CayYv9-j.js.map → PersonasPage-dGX6E96g.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessDetailPage-dn7lkM4c.js → ProcessDetailPage-Co5oCg31.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-dn7lkM4c.js.map → ProcessDetailPage-Co5oCg31.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessesListPage-DOp5J6Be.js → ProcessesListPage-CrB4VAS6.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-DOp5J6Be.js.map → ProcessesListPage-CrB4VAS6.js.map} +1 -1
- package/dashboard/dist/assets/{RoleDetailPage-DOlNoiAK.js → RoleDetailPage-C4UTNx0p.js} +2 -2
- package/dashboard/dist/assets/{RoleDetailPage-DOlNoiAK.js.map → RoleDetailPage-C4UTNx0p.js.map} +1 -1
- package/dashboard/dist/assets/{RolesPage-DPppT6Zl.js → RolesPage-BXo5RirX.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-DPppT6Zl.js.map → RolesPage-BXo5RirX.js.map} +1 -1
- package/dashboard/dist/assets/{RunAsSelector-BgntKfSA.js → RunAsSelector-BRQiGv2-.js} +2 -2
- package/dashboard/dist/assets/{RunAsSelector-BgntKfSA.js.map → RunAsSelector-BRQiGv2-.js.map} +1 -1
- package/dashboard/dist/assets/{ScanCodesPage-DPm1lG79.js → ScanCodesPage-BUT5wjzC.js} +2 -2
- package/dashboard/dist/assets/{ScanCodesPage-DPm1lG79.js.map → ScanCodesPage-BUT5wjzC.js.map} +1 -1
- package/dashboard/dist/assets/{ScanSchemeDetailPage-CuoG89q1.js → ScanSchemeDetailPage-CkzoOyjd.js} +2 -2
- package/dashboard/dist/assets/{ScanSchemeDetailPage-CuoG89q1.js.map → ScanSchemeDetailPage-CkzoOyjd.js.map} +1 -1
- package/dashboard/dist/assets/{ScanStationPage-2SLXqqs0.js → ScanStationPage-DYamACNZ.js} +2 -2
- package/dashboard/dist/assets/{ScanStationPage-2SLXqqs0.js.map → ScanStationPage-DYamACNZ.js.map} +1 -1
- package/dashboard/dist/assets/{StickyPagination-Bc_Mzu_R.js → StickyPagination-B3yiAcrs.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-Bc_Mzu_R.js.map → StickyPagination-B3yiAcrs.js.map} +1 -1
- package/dashboard/dist/assets/{StreamMessageDetail-S1cnLGkf.js → StreamMessageDetail-C56PtZSb.js} +2 -2
- package/dashboard/dist/assets/{StreamMessageDetail-S1cnLGkf.js.map → StreamMessageDetail-C56PtZSb.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-BUu2sPmY.js → SwimlaneTimeline-D64ep5KY.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-BUu2sPmY.js.map → SwimlaneTimeline-D64ep5KY.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-BMfNNtbN.js → TaskDetailPage-C2V7BcgB.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-BMfNNtbN.js.map → TaskDetailPage-C2V7BcgB.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-BmNnopOU.js → TasksListPage-C4ctoAa0.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-BmNnopOU.js.map → TasksListPage-C4ctoAa0.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-Dip7gQQx.js → TimeAgo-BpJ7In27.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-Dip7gQQx.js.map → TimeAgo-BpJ7In27.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-DRAYnIrx.js → TimestampCell-BKrIaU_R.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-DRAYnIrx.js.map → TimestampCell-BKrIaU_R.js.map} +1 -1
- package/dashboard/dist/assets/{ToolTestPanel-CQVYC3Ba.js → ToolTestPanel-CdTXWPqn.js} +2 -2
- package/dashboard/dist/assets/{ToolTestPanel-CQVYC3Ba.js.map → ToolTestPanel-CdTXWPqn.js.map} +1 -1
- package/dashboard/dist/assets/{TopicDetailPage-Bmtwuksg.js → TopicDetailPage-B6tb1RG4.js} +2 -2
- package/dashboard/dist/assets/{TopicDetailPage-Bmtwuksg.js.map → TopicDetailPage-B6tb1RG4.js.map} +1 -1
- package/dashboard/dist/assets/{TopicsPage-DIgF7-mJ.js → TopicsPage-DgdOKjwE.js} +2 -2
- package/dashboard/dist/assets/{TopicsPage-DIgF7-mJ.js.map → TopicsPage-DgdOKjwE.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-DNKFz7X9.js → UserName-A-ET2GnX.js} +2 -2
- package/dashboard/dist/assets/{UserName-DNKFz7X9.js.map → UserName-A-ET2GnX.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowExecutionPage-DraIBNpl.js → WorkflowExecutionPage-CzhoRsis.js} +2 -2
- package/dashboard/dist/assets/{WorkflowExecutionPage-DraIBNpl.js.map → WorkflowExecutionPage-CzhoRsis.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsDashboard-BH7kmFjM.js → WorkflowsDashboard-B_tCYLei.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsDashboard-BH7kmFjM.js.map → WorkflowsDashboard-B_tCYLei.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsOverview-C98pCjQX.js → WorkflowsOverview-B4Bh8MIo.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-C98pCjQX.js.map → WorkflowsOverview-B4Bh8MIo.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-BWQjXenZ.js → YamlWorkflowDetailPage-zRrcxk0e.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-BWQjXenZ.js.map → YamlWorkflowDetailPage-zRrcxk0e.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowsPage-BGTI_sdP.js → YamlWorkflowsPage-DMK3ojp3.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowsPage-BGTI_sdP.js.map → YamlWorkflowsPage-DMK3ojp3.js.map} +1 -1
- package/dashboard/dist/assets/{agents-DfMrlw54.js → agents-B67yyE1z.js} +2 -2
- package/dashboard/dist/assets/{agents-DfMrlw54.js.map → agents-B67yyE1z.js.map} +1 -1
- package/dashboard/dist/assets/{bots-B9zS0z7D.js → bots-pSLFdOm-.js} +2 -2
- package/dashboard/dist/assets/{bots-B9zS0z7D.js.map → bots-pSLFdOm-.js.map} +1 -1
- package/dashboard/dist/assets/{capabilities-DkLM1xgH.js → capabilities-B2Dem6zw.js} +2 -2
- package/dashboard/dist/assets/{capabilities-DkLM1xgH.js.map → capabilities-B2Dem6zw.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-SJK1yvbm.js → controlplane-DGdaM9f3.js} +2 -2
- package/dashboard/dist/assets/{controlplane-SJK1yvbm.js.map → controlplane-DGdaM9f3.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-columns-BvAylNM1.js → escalation-columns-BM7vp-hY.js} +2 -2
- package/dashboard/dist/assets/{escalation-columns-BvAylNM1.js.map → escalation-columns-BM7vp-hY.js.map} +1 -1
- package/dashboard/dist/assets/{index-DamcWcqG.js → index-5eRsj758.js} +2 -2
- package/dashboard/dist/assets/{index-DamcWcqG.js.map → index-5eRsj758.js.map} +1 -1
- package/dashboard/dist/assets/{index-CLxuBb17.js → index-BD6nhSOu.js} +2 -2
- package/dashboard/dist/assets/{index-CLxuBb17.js.map → index-BD6nhSOu.js.map} +1 -1
- package/dashboard/dist/assets/{index-DvmyIGeZ.js → index-Baf-tOnA.js} +2 -2
- package/dashboard/dist/assets/{index-DvmyIGeZ.js.map → index-Baf-tOnA.js.map} +1 -1
- package/dashboard/dist/assets/{index-ClVNU3G3.js → index-Brf_fpE4.js} +2 -2
- package/dashboard/dist/assets/{index-ClVNU3G3.js.map → index-Brf_fpE4.js.map} +1 -1
- package/dashboard/dist/assets/{index-CXe2d5kg.js → index-CGoXyPlO.js} +2 -2
- package/dashboard/dist/assets/{index-CXe2d5kg.js.map → index-CGoXyPlO.js.map} +1 -1
- package/dashboard/dist/assets/{index-DazfFRUx.js → index-CKt5YK2z.js} +2 -2
- package/dashboard/dist/assets/{index-DazfFRUx.js.map → index-CKt5YK2z.js.map} +1 -1
- package/dashboard/dist/assets/index-CLq228E2.js +3 -0
- package/dashboard/dist/assets/index-CLq228E2.js.map +1 -0
- package/dashboard/dist/assets/{index-DKXOIcO3.js → index-Cd2RdpOx.js} +2 -2
- package/dashboard/dist/assets/{index-DKXOIcO3.js.map → index-Cd2RdpOx.js.map} +1 -1
- package/dashboard/dist/assets/{index-Cw-V0VhS.js → index-Cn__VdSf.js} +2 -2
- package/dashboard/dist/assets/{index-Cw-V0VhS.js.map → index-Cn__VdSf.js.map} +1 -1
- package/dashboard/dist/assets/{index-DSfY8oDp.js → index-CunrdEfT.js} +2 -2
- package/dashboard/dist/assets/{index-DSfY8oDp.js.map → index-CunrdEfT.js.map} +1 -1
- package/dashboard/dist/assets/{index-D2IRxjSf.js → index-DajlugVw.js} +2 -2
- package/dashboard/dist/assets/{index-D2IRxjSf.js.map → index-DajlugVw.js.map} +1 -1
- package/dashboard/dist/assets/{index-PjiXOVdw.js → index-DbLOvfv5.js} +2 -2
- package/dashboard/dist/assets/{index-PjiXOVdw.js.map → index-DbLOvfv5.js.map} +1 -1
- package/dashboard/dist/assets/{index-zrTQcPjB.js → index-zqoZDL5j.js} +3 -3
- package/dashboard/dist/assets/{index-zrTQcPjB.js.map → index-zqoZDL5j.js.map} +1 -1
- package/dashboard/dist/assets/{knowledge-BNp6MH-4.js → knowledge-BExXJ0Ib.js} +2 -2
- package/dashboard/dist/assets/{knowledge-BNp6MH-4.js.map → knowledge-BExXJ0Ib.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-Bb1k5rv-.js → mcp-D2WA-SHc.js} +2 -2
- package/dashboard/dist/assets/{mcp-Bb1k5rv-.js.map → mcp-D2WA-SHc.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-QVakMQnS.js → mcp-query-4Tsojk-z.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-QVakMQnS.js.map → mcp-query-4Tsojk-z.js.map} +1 -1
- package/dashboard/dist/assets/{personas-DV2JUjVj.js → personas-Dy_XSYfJ.js} +2 -2
- package/dashboard/dist/assets/{personas-DV2JUjVj.js.map → personas-Dy_XSYfJ.js.map} +1 -1
- package/dashboard/dist/assets/{pipelines-BkVB7Q0p.js → pipelines-yDHgNtdx.js} +2 -2
- package/dashboard/dist/assets/{pipelines-BkVB7Q0p.js.map → pipelines-yDHgNtdx.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-DvYWcASM.js → tasks-CGoPhQyw.js} +2 -2
- package/dashboard/dist/assets/{tasks-DvYWcASM.js.map → tasks-CGoPhQyw.js.map} +1 -1
- package/dashboard/dist/assets/{topics-B9zXFuVG.js → topics-DA1MHDwJ.js} +2 -2
- package/dashboard/dist/assets/{topics-B9zXFuVG.js.map → topics-DA1MHDwJ.js.map} +1 -1
- package/dashboard/dist/assets/{useEventHooks-JDpifqGZ.js → useEventHooks-onx-Z6IY.js} +2 -2
- package/dashboard/dist/assets/{useEventHooks-JDpifqGZ.js.map → useEventHooks-onx-Z6IY.js.map} +1 -1
- package/dashboard/dist/assets/{useNamespace-Bqr-LdWx.js → useNamespace-BkuU0SeK.js} +2 -2
- package/dashboard/dist/assets/{useNamespace-Bqr-LdWx.js.map → useNamespace-BkuU0SeK.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-n3naCEbw.js → useYamlActivityEvents-XXS3wg6-.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-n3naCEbw.js.map → useYamlActivityEvents-XXS3wg6-.js.map} +1 -1
- package/dashboard/dist/assets/{users-BNXLRVTS.js → users-B_9mC6D_.js} +2 -2
- package/dashboard/dist/assets/{users-BNXLRVTS.js.map → users-B_9mC6D_.js.map} +1 -1
- package/dashboard/dist/assets/{workflows-D8uMBPvQ.js → workflows-5sds1Ko8.js} +2 -2
- package/dashboard/dist/assets/{workflows-D8uMBPvQ.js.map → workflows-5sds1Ko8.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-DVDOQM3Y.js → yaml-workflows-CjNa2u3I.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-DVDOQM3Y.js.map → yaml-workflows-CjNa2u3I.js.map} +1 -1
- package/dashboard/dist/index.html +1 -1
- package/docs/api/http/workflows.md +35 -0
- package/docs/api/mcp/admin.md +14 -0
- package/docs/api/sdk/workflows.md +21 -0
- package/docs/hitl/lookups.md +10 -0
- package/docs/hitl/x-lt-validation.md +2 -1
- package/docs/hitl/x-lt-widget.md +1 -1
- package/docs/hitl-guide.md +2 -2
- package/package.json +2 -2
- package/dashboard/dist/assets/index-DTZxHZJO.js +0 -3
- package/dashboard/dist/assets/index-DTZxHZJO.js.map +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{u as a,b as s,c as l}from"./vendor-query-RUZdMvN6.js";import{g as u}from"./index-
|
|
2
|
-
//# sourceMappingURL=knowledge-
|
|
1
|
+
import{u as a,b as s,c as l}from"./vendor-query-RUZdMvN6.js";import{g as u}from"./index-zqoZDL5j.js";function g(){return a({queryKey:["knowledge","domains"],queryFn:()=>u("/knowledge/domains")})}function f(n,e){var t;const r=new URLSearchParams;r.set("domain",n),(t=e==null?void 0:e.tags)!=null&&t.length&&r.set("tags",e.tags.join(",")),e!=null&&e.search&&r.set("search",e.search),(e==null?void 0:e.limit)!=null&&r.set("limit",String(e.limit)),(e==null?void 0:e.offset)!=null&&r.set("offset",String(e.offset));const i=r.toString();return a({queryKey:["knowledge",n,e==null?void 0:e.tags,e==null?void 0:e.search,e==null?void 0:e.limit,e==null?void 0:e.offset],queryFn:()=>u(`/knowledge/entries?${i}`),enabled:!!n})}function y(n,e){const r=new URLSearchParams;n&&r.set("domain",n),e&&r.set("key",e);const i=r.toString();return a({queryKey:["knowledge",n,e],queryFn:()=>u(`/knowledge/entry?${i}`),enabled:!!n&&!!e})}function o(n,e,r){const i=new URLSearchParams;return n&&i.set("domain",n),e&&i.set("key",e),a({queryKey:["knowledge",n,e,"versions"],queryFn:()=>u(`/knowledge/entry/versions?${i}`),enabled:!!n&&!!e&&r})}function w(n,e,r){const i=new URLSearchParams;return n&&i.set("domain",n),e&&i.set("key",e),r!=null&&i.set("version",String(r)),a({queryKey:["knowledge",n,e,"version",r],queryFn:()=>u(`/knowledge/entry?${i}`),enabled:!!n&&!!e&&r!=null,staleTime:1/0})}function m(){const n=s();return l({mutationFn:e=>u("/knowledge/entry",{method:"POST",body:JSON.stringify(e)}),onSuccess:()=>{n.invalidateQueries({queryKey:["knowledge"]})}})}function q(){const n=s();return l({mutationFn:e=>u("/knowledge/field",{method:"PUT",body:JSON.stringify(e)}),onSuccess:()=>{n.invalidateQueries({queryKey:["knowledge"]})}})}function S(){const n=s();return l({mutationFn:({domain:e,key:r,path:i})=>{const t=new URLSearchParams({domain:e,key:r,path:i});return u(`/knowledge/field?${t}`,{method:"DELETE"})},onSuccess:()=>{n.invalidateQueries({queryKey:["knowledge"]})}})}function h(){const n=s();return l({mutationFn:({domain:e,key:r})=>{const i=new URLSearchParams({domain:e,key:r});return u(`/knowledge/entry?${i}`,{method:"DELETE"})},onSuccess:()=>{n.invalidateQueries({queryKey:["knowledge"]})}})}export{h as a,m as b,q as c,S as d,o as e,w as f,g,f as h,y as u};
|
|
2
|
+
//# sourceMappingURL=knowledge-BExXJ0Ib.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"knowledge-
|
|
1
|
+
{"version":3,"file":"knowledge-BExXJ0Ib.js","sources":["../../src/api/knowledge.ts"],"sourcesContent":["import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { apiFetch } from './client';\n\nexport interface KnowledgeDomain {\n domain: string;\n count: number;\n latest: string;\n}\n\nexport interface KnowledgeEntry {\n id: string;\n domain: string;\n key: string;\n data: Record<string, unknown>;\n tags: string[];\n current_version: number;\n created_at: string;\n updated_at: string;\n}\n\nexport interface KnowledgeVersionMeta {\n version: number;\n change_summary: string | null;\n created_at: string;\n is_current: boolean;\n}\n\nexport interface KnowledgeSnapshot {\n domain: string;\n key: string;\n version: number;\n data: Record<string, unknown>;\n tags: string[];\n created_at: string;\n}\n\nexport interface ListDomainsResponse {\n domains: KnowledgeDomain[];\n}\n\nexport interface ListEntriesResponse {\n entries: KnowledgeEntry[];\n total: number;\n}\n\nexport function useListDomains() {\n return useQuery<ListDomainsResponse>({\n queryKey: ['knowledge', 'domains'],\n queryFn: () => apiFetch('/knowledge/domains'),\n });\n}\n\nexport function useListKnowledge(\n domain: string,\n opts?: { tags?: string[]; search?: string; limit?: number; offset?: number },\n) {\n const params = new URLSearchParams();\n params.set('domain', domain);\n if (opts?.tags?.length) params.set('tags', opts.tags.join(','));\n if (opts?.search) params.set('search', opts.search);\n if (opts?.limit != null) params.set('limit', String(opts.limit));\n if (opts?.offset != null) params.set('offset', String(opts.offset));\n const qs = params.toString();\n\n return useQuery<ListEntriesResponse>({\n queryKey: ['knowledge', domain, opts?.tags, opts?.search, opts?.limit, opts?.offset],\n queryFn: () => apiFetch(`/knowledge/entries?${qs}`),\n enabled: !!domain,\n });\n}\n\nexport function useGetKnowledge(domain: string, key: string | null) {\n const params = new URLSearchParams();\n if (domain) params.set('domain', domain);\n if (key) params.set('key', key);\n const qs = params.toString();\n\n return useQuery<KnowledgeEntry & { found?: boolean }>({\n queryKey: ['knowledge', domain, key],\n queryFn: () => apiFetch(`/knowledge/entry?${qs}`),\n enabled: !!domain && !!key,\n });\n}\n\n/** The entry's edition lineage — every data-changing save mints one. */\nexport function useKnowledgeVersions(domain: string, key: string | null, enabled: boolean) {\n const params = new URLSearchParams();\n if (domain) params.set('domain', domain);\n if (key) params.set('key', key);\n return useQuery<{ domain: string; key: string; versions: KnowledgeVersionMeta[] }>({\n queryKey: ['knowledge', domain, key, 'versions'],\n queryFn: () => apiFetch(`/knowledge/entry/versions?${params}`),\n enabled: !!domain && !!key && enabled,\n });\n}\n\n/** One immutable edition — never goes stale. */\nexport function useGetKnowledgeVersion(domain: string, key: string | null, version: number | null) {\n const params = new URLSearchParams();\n if (domain) params.set('domain', domain);\n if (key) params.set('key', key);\n if (version != null) params.set('version', String(version));\n return useQuery<KnowledgeSnapshot>({\n queryKey: ['knowledge', domain, key, 'version', version],\n queryFn: () => apiFetch(`/knowledge/entry?${params}`),\n enabled: !!domain && !!key && version != null,\n staleTime: Infinity,\n });\n}\n\nexport function useStoreKnowledge() {\n const queryClient = useQueryClient();\n return useMutation<\n { id: string; domain: string; key: string; created: boolean; updated_at: string },\n Error,\n { domain: string; key: string; data: Record<string, unknown>; tags?: string[]; replace?: boolean }\n >({\n mutationFn: (body) =>\n apiFetch('/knowledge/entry', {\n method: 'POST',\n body: JSON.stringify(body),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['knowledge'] });\n },\n });\n}\n\nexport function useSetKnowledgeField() {\n const queryClient = useQueryClient();\n return useMutation<\n { id: string; domain: string; key: string; created: boolean; updated_at: string },\n Error,\n { domain: string; key: string; path: string; value: unknown; tags?: string[] }\n >({\n mutationFn: (body) =>\n apiFetch('/knowledge/field', {\n method: 'PUT',\n body: JSON.stringify(body),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['knowledge'] });\n },\n });\n}\n\nexport function useRemoveKnowledgeField() {\n const queryClient = useQueryClient();\n return useMutation<\n { removed: boolean },\n Error,\n { domain: string; key: string; path: string }\n >({\n mutationFn: ({ domain, key, path }) => {\n const params = new URLSearchParams({ domain, key, path });\n return apiFetch(`/knowledge/field?${params}`, { method: 'DELETE' });\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['knowledge'] });\n },\n });\n}\n\nexport function useDeleteKnowledge() {\n const queryClient = useQueryClient();\n return useMutation<\n { deleted: boolean; domain: string; key: string },\n Error,\n { domain: string; key: string }\n >({\n mutationFn: ({ domain, key }) => {\n const params = new URLSearchParams({ domain, key });\n return apiFetch(`/knowledge/entry?${params}`, { method: 'DELETE' });\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['knowledge'] });\n },\n });\n}\n"],"names":["useListDomains","useQuery","apiFetch","useListKnowledge","domain","opts","params","_a","qs","useGetKnowledge","key","useKnowledgeVersions","enabled","useGetKnowledgeVersion","version","useStoreKnowledge","queryClient","useQueryClient","useMutation","body","useSetKnowledgeField","useRemoveKnowledgeField","path","useDeleteKnowledge"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{u as o,b as u,c as n}from"./vendor-query-RUZdMvN6.js";import{g as s}from"./index-
|
|
2
|
-
//# sourceMappingURL=mcp-
|
|
1
|
+
import{u as o,b as u,c as n}from"./vendor-query-RUZdMvN6.js";import{g as s}from"./index-zqoZDL5j.js";function m(e={}){const r=new URLSearchParams;e.status&&r.set("status",e.status),e.search&&r.set("search",e.search),e.tags&&r.set("tags",e.tags);const t=r.toString();return o({queryKey:["mcpServers",e],queryFn:()=>s(`/mcp/servers${t?`?${t}`:""}`)})}function y(e){return o({queryKey:["mcpServers",e],queryFn:()=>s(`/mcp/servers/${e}`),enabled:!!e})}function p(){const e=u();return n({mutationFn:r=>s("/mcp/servers",{method:"POST",body:JSON.stringify(r)}),onSuccess:()=>{e.invalidateQueries({queryKey:["mcpServers"]})}})}function S(){const e=u();return n({mutationFn:({id:r,...t})=>s(`/mcp/servers/${r}`,{method:"PUT",body:JSON.stringify(t)}),onSuccess:()=>{e.invalidateQueries({queryKey:["mcpServers"]})}})}function v(){return n({mutationFn:e=>s("/mcp/servers/test-connection",{method:"POST",body:JSON.stringify(e)})})}function d(){const e=u();return n({mutationFn:r=>s(`/mcp/servers/${r}`,{method:"DELETE"}),onSuccess:()=>{e.invalidateQueries({queryKey:["mcpServers"]})}})}function q(){const e=u();return n({mutationFn:r=>s(`/mcp/servers/${r}/connect`,{method:"POST"}),onSuccess:()=>{e.invalidateQueries({queryKey:["mcpServers"]})}})}function f(){const e=u();return n({mutationFn:r=>s(`/mcp/servers/${r}/disconnect`,{method:"POST"}),onSuccess:()=>{e.invalidateQueries({queryKey:["mcpServers"]})}})}function h(){return n({mutationFn:({serverId:e,toolName:r,arguments:t,execute_as:c})=>s(`/mcp/servers/${e}/tools/${r}/call`,{method:"POST",body:JSON.stringify({arguments:t,...c?{execute_as:c}:{}})})})}export{q as a,f as b,d as c,v as d,y as e,p as f,S as g,h,m as u};
|
|
2
|
+
//# sourceMappingURL=mcp-D2WA-SHc.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-
|
|
1
|
+
{"version":3,"file":"mcp-D2WA-SHc.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-RUZdMvN6.js";import{g as u}from"./index-
|
|
2
|
-
//# sourceMappingURL=mcp-query-
|
|
1
|
+
import{u as r,b as i,c as n}from"./vendor-query-RUZdMvN6.js";import{g as u}from"./index-zqoZDL5j.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-4Tsojk-z.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-query-
|
|
1
|
+
{"version":3,"file":"mcp-query-4Tsojk-z.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-RUZdMvN6.js";import{g as s}from"./index-
|
|
2
|
-
//# sourceMappingURL=personas-
|
|
1
|
+
import{u as t,b as o,c as u}from"./vendor-query-RUZdMvN6.js";import{g as s}from"./index-zqoZDL5j.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-Dy_XSYfJ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"personas-
|
|
1
|
+
{"version":3,"file":"personas-Dy_XSYfJ.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":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{u as i,c as s}from"./vendor-query-RUZdMvN6.js";import{g as u}from"./index-
|
|
2
|
-
//# sourceMappingURL=pipelines-
|
|
1
|
+
import{u as i,c as s}from"./vendor-query-RUZdMvN6.js";import{g as u}from"./index-zqoZDL5j.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-yDHgNtdx.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipelines-
|
|
1
|
+
{"version":3,"file":"pipelines-yDHgNtdx.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{u as n}from"./vendor-query-RUZdMvN6.js";import{g as a}from"./index-
|
|
2
|
-
//# sourceMappingURL=tasks-
|
|
1
|
+
import{u as n}from"./vendor-query-RUZdMvN6.js";import{g as a}from"./index-zqoZDL5j.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-CGoPhQyw.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tasks-
|
|
1
|
+
{"version":3,"file":"tasks-CGoPhQyw.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-RUZdMvN6.js";import{g as t}from"./index-
|
|
2
|
-
//# sourceMappingURL=topics-
|
|
1
|
+
import{u as i,b as u,c as s}from"./vendor-query-RUZdMvN6.js";import{g as t}from"./index-zqoZDL5j.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-DA1MHDwJ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"topics-
|
|
1
|
+
{"version":3,"file":"topics-DA1MHDwJ.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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as w,b as d}from"./vendor-query-RUZdMvN6.js";import{e as r,N as i,ag as l,ah as h,ai as k}from"./index-
|
|
2
|
-
//# sourceMappingURL=useEventHooks-
|
|
1
|
+
import{a as w,b as d}from"./vendor-query-RUZdMvN6.js";import{e as r,N as i,ag as l,ah as h,ai as k}from"./index-zqoZDL5j.js";function p(s){const t=[],e=s.type.split(".");switch(e[0]==="system"?e[1]:e[0]){case"task":t.push(["tasks"]),t.push(["jobs"]),t.push(["processes"]),s.workflowId&&(t.push(["workflowExecution",s.workflowId]),t.push(["workflowState",s.workflowId]),t.push(["mcpQueryExecution",s.workflowId])),s.originId&&t.push(["processes",s.originId]);break;case"escalation":t.push(["escalations"]),t.push(["escalationStats"]),t.push(["stationMetrics"]),s.workflowId&&t.push(["workflowExecution",s.workflowId]);break;case"workflow":t.push(["jobs"]),t.push(["tasks"]),t.push(["processes"]),s.workflowId&&(t.push(["workflowExecution",s.workflowId]),t.push(["workflowState",s.workflowId]),t.push(["mcpQueryExecution",s.workflowId]),t.push(["mcpQueryResult",s.workflowId]),t.push(["builderResult",s.workflowId]));break;case"activity":s.workflowId&&t.push(["mcpRunExecution",s.workflowId]),t.push(["mcpRuns"]);break;case"milestone":s.workflowId&&(t.push(["workflowExecution",s.workflowId]),t.push(["mcpQueryExecution",s.workflowId])),t.push(["tasks"]);break;case"knowledge":t.push(["knowledge"]);break;case"file":t.push(["files"]);break;case"agent":t.push(["agents"]);break;default:t.push(["jobs"]),t.push(["tasks"]);break}return t}function u(s=500){const t=d(),e=w.useRef(new Set),a=w.useRef(null);return w.useCallback(o=>{for(const n of o)e.current.add(JSON.stringify(n));a.current||(a.current=setTimeout(()=>{a.current=null;const n=[...e.current];e.current.clear();for(const c of n)t.invalidateQueries({queryKey:JSON.parse(c)})},s))},[t,s])}function y(s){return s?[`${i}.system.workflow.>`,`${i}.system.activity.>`,`${i}.system.milestone.>`,`${i}.system.task.>`,`${i}.system.escalation.>`]:[]}function b(){const s=u(300);r(`${i}.system.task.>`,()=>{s([["jobs"]])}),r(`${i}.system.workflow.>`,()=>{s([["jobs"]])})}function g(s){const t=u(400);k(y(s),e=>{var f;if(!s||!(e.workflowId===s||((f=e.workflowId)==null?void 0:f.includes(s))))return;const o=e.type.split("."),n=o[0]==="system"?o[1]:o[0],c=p(e);n==="escalation"&&c.push(["escalations","by-workflow",s]),t(c)})}function S(s){const t=u(400);k(y(s),e=>{var f;if(!s||!(e.workflowId===s||((f=e.workflowId)==null?void 0:f.includes(s))))return;const o=e.type.split("."),n=o[0]==="system"?o[1]:o[0],c=p(e);n==="escalation"&&c.push(["escalations","by-workflow",s]),t(c)})}function R(s){const t=u(400);k(y(s),e=>{var n;if(!s||!(e.workflowId===s||((n=e.workflowId)==null?void 0:n.includes(s))))return;const o=p(e);o.push(["workflowSets"]),o.push(["yamlWorkflows"]),t(o)})}function $(s){const t=u(300),e=w.useCallback(a=>{s&&(a.originId!==s&&a.workflowId!==s||t([["processes",s]]))},[s,t]);r(`${i}.system.task.>`,e),r(`${i}.system.workflow.>`,e),r(`${i}.system.escalation.>`,e)}function I(){const s=u(300);r(l({}),()=>{s([["escalationStats"]])})}function x(){const s=u(1500);r(l({}),()=>{s([["stationMetrics"]])})}function j(){const s=u(1500);r(l({}),()=>{s([["escAggregate"],["escTimeline"]])})}function D(s){const t=u(300),e=(s==null?void 0:s.role)??null,a=((s==null?void 0:s.verbs)??[]).join(","),o=w.useMemo(()=>{const n=a?a.split(","):null;return n?h({role:e,verbs:n}):[l({role:e})]},[e,a]);k(o,()=>{t([["escalations"]])})}function P(s){const t=u(300);r(s?l({id:s}):l({id:"__none__"}),e=>{!s||e.escalationId!==s||t([["escalations",s],["escalations"],["escalationStats"]])})}function Q(){const s=u(300);r(`${i}.system.agent.>`,()=>{s([["agents"]])})}function v(){const s=u(300);r(`${i}.system.task.>`,()=>{s([["processes"]])}),r(`${i}.system.workflow.>`,()=>{s([["processes"]])})}export{$ as a,b,S as c,R as d,I as e,D as f,P as g,g as h,j as i,x as j,Q as k,v as u};
|
|
2
|
+
//# sourceMappingURL=useEventHooks-onx-Z6IY.js.map
|
package/dashboard/dist/assets/{useEventHooks-JDpifqGZ.js.map → useEventHooks-onx-Z6IY.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useEventHooks-JDpifqGZ.js","sources":["../../src/lib/events/invalidation.ts","../../src/hooks/useEventHooks.ts"],"sourcesContent":["import type { NatsLTEvent } from '../nats/types';\n\n/**\n * Map an event to the React Query keys that should be invalidated.\n *\n * Returns an array of query key prefixes. React Query's `invalidateQueries`\n * will match all queries whose key starts with any returned prefix.\n *\n * This is pure logic with no React or transport dependency — easily testable.\n * Works identically regardless of event transport (Socket.IO, NATS, etc.).\n */\nexport function getInvalidationKeys(event: NatsLTEvent): string[][] {\n const keys: string[][] = [];\n const parts = event.type.split('.');\n const category = parts[0] === 'system' ? parts[1] : parts[0];\n\n switch (category) {\n case 'task':\n keys.push(['tasks']);\n keys.push(['jobs']);\n keys.push(['processes']);\n if (event.workflowId) {\n keys.push(['workflowExecution', event.workflowId]);\n keys.push(['workflowState', event.workflowId]);\n keys.push(['mcpQueryExecution', event.workflowId]);\n }\n if (event.originId) {\n keys.push(['processes', event.originId]);\n }\n break;\n\n case 'escalation':\n keys.push(['escalations']);\n keys.push(['escalationStats']);\n keys.push(['stationMetrics']);\n if (event.workflowId) {\n keys.push(['workflowExecution', event.workflowId]);\n }\n break;\n\n case 'workflow':\n keys.push(['jobs']);\n keys.push(['tasks']);\n keys.push(['processes']);\n if (event.workflowId) {\n keys.push(['workflowExecution', event.workflowId]);\n keys.push(['workflowState', event.workflowId]);\n keys.push(['mcpQueryExecution', event.workflowId]);\n keys.push(['mcpQueryResult', event.workflowId]);\n keys.push(['builderResult', event.workflowId]);\n }\n break;\n\n case 'activity':\n if (event.workflowId) {\n keys.push(['mcpRunExecution', event.workflowId]);\n }\n keys.push(['mcpRuns']);\n break;\n\n case 'milestone':\n if (event.workflowId) {\n keys.push(['workflowExecution', event.workflowId]);\n keys.push(['mcpQueryExecution', event.workflowId]);\n }\n keys.push(['tasks']);\n break;\n\n case 'knowledge':\n keys.push(['knowledge']);\n break;\n\n case 'file':\n keys.push(['files']);\n break;\n\n case 'agent':\n keys.push(['agents']);\n break;\n\n default:\n keys.push(['jobs']);\n keys.push(['tasks']);\n break;\n }\n\n return keys;\n}\n","import { useRef, useCallback, useMemo } from 'react';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { useEventSubscription, useEventSubscriptions } from './useEventContext';\nimport { getInvalidationKeys } from '../lib/events/invalidation';\nimport { NATS_SUBJECT_PREFIX } from '../lib/nats/config';\nimport { escalationPattern, escalationPatterns, type EscalationVerb } from '../lib/events/subjects';\n\n/**\n * Throttled query invalidation. Collects query keys over a window and fires\n * a single batch invalidation per window — at most one refetch per delayMs,\n * and under a constant event stream at least one per delayMs too.\n *\n * The FIRST event opens the window; later events accumulate keys without\n * touching the timer. Resetting the timer per event (a trailing debounce)\n * would starve forever under sustained load — the flush would wait for a\n * quiet gap that high-throughput surfaces never produce.\n */\nfunction useDebouncedInvalidation(delayMs = 500) {\n const qc = useQueryClient();\n const pendingKeys = useRef<Set<string>>(new Set());\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n return useCallback((keys: string[][]) => {\n for (const key of keys) {\n pendingKeys.current.add(JSON.stringify(key));\n }\n\n if (timer.current) return; // window open — the pending flush carries these\n timer.current = setTimeout(() => {\n timer.current = null;\n const batch = [...pendingKeys.current];\n pendingKeys.current.clear();\n for (const raw of batch) {\n qc.invalidateQueries({ queryKey: JSON.parse(raw) });\n }\n }, delayMs);\n }, [qc, delayMs]);\n}\n\n/**\n * The subject slice a workflow-detail surface needs. Workflow, activity, and\n * milestone subjects embed the workflowId, so those levels pin exactly; task\n * and escalation subjects embed their own ids, so those two families arrive\n * family-wide and the handler's workflowId check filters them. Detail pages\n * for related/derived jobs (`rerun-<id>`, `triage-<id>`) match by inclusion,\n * so the workflow family also stays wide.\n */\nfunction workflowDetailPatterns(workflowId: string | undefined): string[] {\n if (!workflowId) return [];\n return [\n `${NATS_SUBJECT_PREFIX}.system.workflow.>`,\n `${NATS_SUBJECT_PREFIX}.system.activity.>`,\n `${NATS_SUBJECT_PREFIX}.system.milestone.>`,\n `${NATS_SUBJECT_PREFIX}.system.task.>`,\n `${NATS_SUBJECT_PREFIX}.system.escalation.>`,\n ];\n}\n\n/**\n * Invalidate workflow list queries (WorkflowsDashboard) on task/workflow events.\n */\nexport function useWorkflowListEvents(): void {\n const invalidate = useDebouncedInvalidation(300);\n\n useEventSubscription(`${NATS_SUBJECT_PREFIX}.system.task.>`, () => {\n invalidate([['jobs']]);\n });\n\n useEventSubscription(`${NATS_SUBJECT_PREFIX}.system.workflow.>`, () => {\n invalidate([['jobs']]);\n });\n}\n\n/**\n * Invalidate queries for a specific workflow execution page (durable workflows).\n *\n * Uses the centralized `getInvalidationKeys` mapping plus escalation-specific\n * keys for the detail view. Events are debounced to prevent flurries of re-renders.\n */\nexport function useWorkflowDetailEvents(workflowId: string | undefined): void {\n const invalidate = useDebouncedInvalidation(400);\n\n useEventSubscriptions(workflowDetailPatterns(workflowId), (event) => {\n if (!workflowId) return;\n\n const isRelated = event.workflowId === workflowId\n || event.workflowId?.includes(workflowId);\n if (!isRelated) return;\n\n const parts = event.type.split('.');\n const category = parts[0] === 'system' ? parts[1] : parts[0];\n const keys = getInvalidationKeys(event);\n\n if (category === 'escalation') {\n keys.push(['escalations', 'by-workflow', workflowId]);\n }\n\n invalidate(keys);\n });\n}\n\n/**\n * Invalidate queries for mcpQuery/builder detail pages.\n *\n * Covers: mcpQueryExecution, mcpQueryResult, builderResult, workflowExecution,\n * workflowState, and escalation keys. Replaces polling on these pages.\n */\nexport function useMcpQueryDetailEvents(workflowId: string | undefined): void {\n const invalidate = useDebouncedInvalidation(400);\n\n useEventSubscriptions(workflowDetailPatterns(workflowId), (event) => {\n if (!workflowId) return;\n\n const isRelated = event.workflowId === workflowId\n || event.workflowId?.includes(workflowId);\n if (!isRelated) return;\n\n const parts = event.type.split('.');\n const category = parts[0] === 'system' ? parts[1] : parts[0];\n const keys = getInvalidationKeys(event);\n\n if (category === 'escalation') {\n keys.push(['escalations', 'by-workflow', workflowId]);\n }\n\n invalidate(keys);\n });\n}\n\n/**\n * Invalidate workflow set and YAML workflow queries when plan-related events fire.\n * Covers the planner workflow and all child builder workflows.\n */\nexport function usePlanDetailEvents(plannerWorkflowId: string | undefined): void {\n const invalidate = useDebouncedInvalidation(400);\n\n useEventSubscriptions(workflowDetailPatterns(plannerWorkflowId), (event) => {\n if (!plannerWorkflowId) return;\n\n const isRelated = event.workflowId === plannerWorkflowId\n || event.workflowId?.includes(plannerWorkflowId);\n if (!isRelated) return;\n\n const keys = getInvalidationKeys(event);\n keys.push(['workflowSets']);\n keys.push(['yamlWorkflows']);\n invalidate(keys);\n });\n}\n\n/**\n * Invalidate process detail queries on task/workflow events for a specific origin.\n */\nexport function useProcessDetailEvents(originId: string | undefined): void {\n const invalidate = useDebouncedInvalidation(300);\n\n const handler = useCallback((event: any) => {\n if (!originId) return;\n if (event.originId !== originId && event.workflowId !== originId) return;\n invalidate([['processes', originId]]);\n }, [originId, invalidate]);\n\n useEventSubscription(`${NATS_SUBJECT_PREFIX}.system.task.>`, handler);\n useEventSubscription(`${NATS_SUBJECT_PREFIX}.system.workflow.>`, handler);\n useEventSubscription(`${NATS_SUBJECT_PREFIX}.system.escalation.>`, handler);\n}\n\n/**\n * Invalidate escalation stats (EscalationsOverview) on escalation events.\n * Stats aggregate every role and verb, so the family-wide pattern is the\n * honest scope here.\n */\nexport function useEscalationStatsEvents(): void {\n const invalidate = useDebouncedInvalidation(300);\n\n useEventSubscription(escalationPattern({}), () => {\n invalidate([['escalationStats']]);\n });\n}\n\n/**\n * Invalidate station metrics (Operations page + station detail) on escalation\n * events. Push-driven only: escalation lifecycle moments are the sole things\n * that move the numbers, so the event is the complete refresh signal. The\n * board is a summary surface, so the debounce is generous — a high-throughput\n * burst collapses into at most one refetch every 1.5s.\n */\nexport function useStationMetricsEvents(): void {\n const invalidate = useDebouncedInvalidation(1500);\n\n useEventSubscription(escalationPattern({}), () => {\n invalidate([['stationMetrics']]);\n });\n}\n\n/**\n * Invalidate the analytics aggregates/timelines (mix bars, dwell sections,\n * entity timelines) on escalation events. Same summary-surface rationale and\n * generous debounce as the station metrics: lifecycle moments are the only\n * things that move an interval, so the event is the complete refresh signal.\n */\nexport function useEscalationAnalyticsEvents(): void {\n const invalidate = useDebouncedInvalidation(1500);\n\n useEventSubscription(escalationPattern({}), () => {\n invalidate([['escAggregate'], ['escTimeline']]);\n });\n}\n\n/**\n * Invalidate escalation list queries on escalation events.\n *\n * List pages pass the slice they render: `role` narrows to one queue's\n * subject token, `verbs` to the lifecycle moments that change the list.\n * Omitted, the subscription spans the escalation family — for summary\n * surfaces that genuinely aggregate everything.\n */\nexport function useEscalationListEvents(scope?: {\n role?: string | null;\n verbs?: EscalationVerb[];\n}): void {\n const invalidate = useDebouncedInvalidation(300);\n const role = scope?.role ?? null;\n const verbsKey = (scope?.verbs ?? []).join(',');\n\n const patterns = useMemo(() => {\n const verbs = verbsKey ? (verbsKey.split(',') as EscalationVerb[]) : null;\n return verbs\n ? escalationPatterns({ role, verbs })\n : [escalationPattern({ role })];\n }, [role, verbsKey]);\n\n useEventSubscriptions(patterns, () => {\n invalidate([['escalations']]);\n });\n}\n\n/**\n * Invalidate a single escalation detail on that item's own events. The id is\n * the subject's fourth token, so the broker delivers exactly this item's\n * lifecycle — across role hops (`system.escalation.*.{id}.>`).\n */\nexport function useEscalationDetailEvents(escalationId: string | undefined): void {\n const invalidate = useDebouncedInvalidation(300);\n\n useEventSubscription(\n escalationId\n ? escalationPattern({ id: escalationId })\n : escalationPattern({ id: '__none__' }),\n (event) => {\n if (!escalationId || event.escalationId !== escalationId) return;\n invalidate([['escalations', escalationId], ['escalations'], ['escalationStats']]);\n },\n );\n}\n\n/**\n * Invalidate agent queries on agent lifecycle events.\n */\nexport function useAgentEvents(): void {\n const invalidate = useDebouncedInvalidation(300);\n\n useEventSubscription(`${NATS_SUBJECT_PREFIX}.system.agent.>`, () => {\n invalidate([['agents']]);\n });\n}\n\n/**\n * Invalidate knowledge queries on knowledge events.\n */\nexport function useKnowledgeEvents(): void {\n const invalidate = useDebouncedInvalidation(300);\n\n useEventSubscription(`${NATS_SUBJECT_PREFIX}.system.knowledge.>`, () => {\n invalidate([['knowledge']]);\n });\n}\n\n/**\n * Invalidate process list (ProcessesListPage) on task/workflow events.\n */\nexport function useProcessListEvents(): void {\n const invalidate = useDebouncedInvalidation(300);\n\n useEventSubscription(`${NATS_SUBJECT_PREFIX}.system.task.>`, () => {\n invalidate([['processes']]);\n });\n\n useEventSubscription(`${NATS_SUBJECT_PREFIX}.system.workflow.>`, () => {\n invalidate([['processes']]);\n });\n}\n"],"names":["getInvalidationKeys","event","keys","parts","useDebouncedInvalidation","delayMs","qc","useQueryClient","pendingKeys","useRef","timer","useCallback","key","batch","raw","workflowDetailPatterns","workflowId","NATS_SUBJECT_PREFIX","useWorkflowListEvents","invalidate","useEventSubscription","useWorkflowDetailEvents","useEventSubscriptions","_a","category","useMcpQueryDetailEvents","usePlanDetailEvents","plannerWorkflowId","useProcessDetailEvents","originId","handler","useEscalationStatsEvents","escalationPattern","useStationMetricsEvents","useEscalationAnalyticsEvents","useEscalationListEvents","scope","role","verbsKey","patterns","useMemo","verbs","escalationPatterns","useEscalationDetailEvents","escalationId","useAgentEvents","useProcessListEvents"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useEventHooks-onx-Z6IY.js","sources":["../../src/lib/events/invalidation.ts","../../src/hooks/useEventHooks.ts"],"sourcesContent":["import type { NatsLTEvent } from '../nats/types';\n\n/**\n * Map an event to the React Query keys that should be invalidated.\n *\n * Returns an array of query key prefixes. React Query's `invalidateQueries`\n * will match all queries whose key starts with any returned prefix.\n *\n * This is pure logic with no React or transport dependency — easily testable.\n * Works identically regardless of event transport (Socket.IO, NATS, etc.).\n */\nexport function getInvalidationKeys(event: NatsLTEvent): string[][] {\n const keys: string[][] = [];\n const parts = event.type.split('.');\n const category = parts[0] === 'system' ? parts[1] : parts[0];\n\n switch (category) {\n case 'task':\n keys.push(['tasks']);\n keys.push(['jobs']);\n keys.push(['processes']);\n if (event.workflowId) {\n keys.push(['workflowExecution', event.workflowId]);\n keys.push(['workflowState', event.workflowId]);\n keys.push(['mcpQueryExecution', event.workflowId]);\n }\n if (event.originId) {\n keys.push(['processes', event.originId]);\n }\n break;\n\n case 'escalation':\n keys.push(['escalations']);\n keys.push(['escalationStats']);\n keys.push(['stationMetrics']);\n if (event.workflowId) {\n keys.push(['workflowExecution', event.workflowId]);\n }\n break;\n\n case 'workflow':\n keys.push(['jobs']);\n keys.push(['tasks']);\n keys.push(['processes']);\n if (event.workflowId) {\n keys.push(['workflowExecution', event.workflowId]);\n keys.push(['workflowState', event.workflowId]);\n keys.push(['mcpQueryExecution', event.workflowId]);\n keys.push(['mcpQueryResult', event.workflowId]);\n keys.push(['builderResult', event.workflowId]);\n }\n break;\n\n case 'activity':\n if (event.workflowId) {\n keys.push(['mcpRunExecution', event.workflowId]);\n }\n keys.push(['mcpRuns']);\n break;\n\n case 'milestone':\n if (event.workflowId) {\n keys.push(['workflowExecution', event.workflowId]);\n keys.push(['mcpQueryExecution', event.workflowId]);\n }\n keys.push(['tasks']);\n break;\n\n case 'knowledge':\n keys.push(['knowledge']);\n break;\n\n case 'file':\n keys.push(['files']);\n break;\n\n case 'agent':\n keys.push(['agents']);\n break;\n\n default:\n keys.push(['jobs']);\n keys.push(['tasks']);\n break;\n }\n\n return keys;\n}\n","import { useRef, useCallback, useMemo } from 'react';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { useEventSubscription, useEventSubscriptions } from './useEventContext';\nimport { getInvalidationKeys } from '../lib/events/invalidation';\nimport { NATS_SUBJECT_PREFIX } from '../lib/nats/config';\nimport { escalationPattern, escalationPatterns, type EscalationVerb } from '../lib/events/subjects';\n\n/**\n * Throttled query invalidation. Collects query keys over a window and fires\n * a single batch invalidation per window — at most one refetch per delayMs,\n * and under a constant event stream at least one per delayMs too.\n *\n * The FIRST event opens the window; later events accumulate keys without\n * touching the timer. Resetting the timer per event (a trailing debounce)\n * would starve forever under sustained load — the flush would wait for a\n * quiet gap that high-throughput surfaces never produce.\n */\nfunction useDebouncedInvalidation(delayMs = 500) {\n const qc = useQueryClient();\n const pendingKeys = useRef<Set<string>>(new Set());\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n return useCallback((keys: string[][]) => {\n for (const key of keys) {\n pendingKeys.current.add(JSON.stringify(key));\n }\n\n if (timer.current) return; // window open — the pending flush carries these\n timer.current = setTimeout(() => {\n timer.current = null;\n const batch = [...pendingKeys.current];\n pendingKeys.current.clear();\n for (const raw of batch) {\n qc.invalidateQueries({ queryKey: JSON.parse(raw) });\n }\n }, delayMs);\n }, [qc, delayMs]);\n}\n\n/**\n * The subject slice a workflow-detail surface needs. Workflow, activity, and\n * milestone subjects embed the workflowId, so those levels pin exactly; task\n * and escalation subjects embed their own ids, so those two families arrive\n * family-wide and the handler's workflowId check filters them. Detail pages\n * for related/derived jobs (`rerun-<id>`, `triage-<id>`) match by inclusion,\n * so the workflow family also stays wide.\n */\nfunction workflowDetailPatterns(workflowId: string | undefined): string[] {\n if (!workflowId) return [];\n return [\n `${NATS_SUBJECT_PREFIX}.system.workflow.>`,\n `${NATS_SUBJECT_PREFIX}.system.activity.>`,\n `${NATS_SUBJECT_PREFIX}.system.milestone.>`,\n `${NATS_SUBJECT_PREFIX}.system.task.>`,\n `${NATS_SUBJECT_PREFIX}.system.escalation.>`,\n ];\n}\n\n/**\n * Invalidate workflow list queries (WorkflowsDashboard) on task/workflow events.\n */\nexport function useWorkflowListEvents(): void {\n const invalidate = useDebouncedInvalidation(300);\n\n useEventSubscription(`${NATS_SUBJECT_PREFIX}.system.task.>`, () => {\n invalidate([['jobs']]);\n });\n\n useEventSubscription(`${NATS_SUBJECT_PREFIX}.system.workflow.>`, () => {\n invalidate([['jobs']]);\n });\n}\n\n/**\n * Invalidate queries for a specific workflow execution page (durable workflows).\n *\n * Uses the centralized `getInvalidationKeys` mapping plus escalation-specific\n * keys for the detail view. Events are debounced to prevent flurries of re-renders.\n */\nexport function useWorkflowDetailEvents(workflowId: string | undefined): void {\n const invalidate = useDebouncedInvalidation(400);\n\n useEventSubscriptions(workflowDetailPatterns(workflowId), (event) => {\n if (!workflowId) return;\n\n const isRelated = event.workflowId === workflowId\n || event.workflowId?.includes(workflowId);\n if (!isRelated) return;\n\n const parts = event.type.split('.');\n const category = parts[0] === 'system' ? parts[1] : parts[0];\n const keys = getInvalidationKeys(event);\n\n if (category === 'escalation') {\n keys.push(['escalations', 'by-workflow', workflowId]);\n }\n\n invalidate(keys);\n });\n}\n\n/**\n * Invalidate queries for mcpQuery/builder detail pages.\n *\n * Covers: mcpQueryExecution, mcpQueryResult, builderResult, workflowExecution,\n * workflowState, and escalation keys. Replaces polling on these pages.\n */\nexport function useMcpQueryDetailEvents(workflowId: string | undefined): void {\n const invalidate = useDebouncedInvalidation(400);\n\n useEventSubscriptions(workflowDetailPatterns(workflowId), (event) => {\n if (!workflowId) return;\n\n const isRelated = event.workflowId === workflowId\n || event.workflowId?.includes(workflowId);\n if (!isRelated) return;\n\n const parts = event.type.split('.');\n const category = parts[0] === 'system' ? parts[1] : parts[0];\n const keys = getInvalidationKeys(event);\n\n if (category === 'escalation') {\n keys.push(['escalations', 'by-workflow', workflowId]);\n }\n\n invalidate(keys);\n });\n}\n\n/**\n * Invalidate workflow set and YAML workflow queries when plan-related events fire.\n * Covers the planner workflow and all child builder workflows.\n */\nexport function usePlanDetailEvents(plannerWorkflowId: string | undefined): void {\n const invalidate = useDebouncedInvalidation(400);\n\n useEventSubscriptions(workflowDetailPatterns(plannerWorkflowId), (event) => {\n if (!plannerWorkflowId) return;\n\n const isRelated = event.workflowId === plannerWorkflowId\n || event.workflowId?.includes(plannerWorkflowId);\n if (!isRelated) return;\n\n const keys = getInvalidationKeys(event);\n keys.push(['workflowSets']);\n keys.push(['yamlWorkflows']);\n invalidate(keys);\n });\n}\n\n/**\n * Invalidate process detail queries on task/workflow events for a specific origin.\n */\nexport function useProcessDetailEvents(originId: string | undefined): void {\n const invalidate = useDebouncedInvalidation(300);\n\n const handler = useCallback((event: any) => {\n if (!originId) return;\n if (event.originId !== originId && event.workflowId !== originId) return;\n invalidate([['processes', originId]]);\n }, [originId, invalidate]);\n\n useEventSubscription(`${NATS_SUBJECT_PREFIX}.system.task.>`, handler);\n useEventSubscription(`${NATS_SUBJECT_PREFIX}.system.workflow.>`, handler);\n useEventSubscription(`${NATS_SUBJECT_PREFIX}.system.escalation.>`, handler);\n}\n\n/**\n * Invalidate escalation stats (EscalationsOverview) on escalation events.\n * Stats aggregate every role and verb, so the family-wide pattern is the\n * honest scope here.\n */\nexport function useEscalationStatsEvents(): void {\n const invalidate = useDebouncedInvalidation(300);\n\n useEventSubscription(escalationPattern({}), () => {\n invalidate([['escalationStats']]);\n });\n}\n\n/**\n * Invalidate station metrics (Operations page + station detail) on escalation\n * events. Push-driven only: escalation lifecycle moments are the sole things\n * that move the numbers, so the event is the complete refresh signal. The\n * board is a summary surface, so the debounce is generous — a high-throughput\n * burst collapses into at most one refetch every 1.5s.\n */\nexport function useStationMetricsEvents(): void {\n const invalidate = useDebouncedInvalidation(1500);\n\n useEventSubscription(escalationPattern({}), () => {\n invalidate([['stationMetrics']]);\n });\n}\n\n/**\n * Invalidate the analytics aggregates/timelines (mix bars, dwell sections,\n * entity timelines) on escalation events. Same summary-surface rationale and\n * generous debounce as the station metrics: lifecycle moments are the only\n * things that move an interval, so the event is the complete refresh signal.\n */\nexport function useEscalationAnalyticsEvents(): void {\n const invalidate = useDebouncedInvalidation(1500);\n\n useEventSubscription(escalationPattern({}), () => {\n invalidate([['escAggregate'], ['escTimeline']]);\n });\n}\n\n/**\n * Invalidate escalation list queries on escalation events.\n *\n * List pages pass the slice they render: `role` narrows to one queue's\n * subject token, `verbs` to the lifecycle moments that change the list.\n * Omitted, the subscription spans the escalation family — for summary\n * surfaces that genuinely aggregate everything.\n */\nexport function useEscalationListEvents(scope?: {\n role?: string | null;\n verbs?: EscalationVerb[];\n}): void {\n const invalidate = useDebouncedInvalidation(300);\n const role = scope?.role ?? null;\n const verbsKey = (scope?.verbs ?? []).join(',');\n\n const patterns = useMemo(() => {\n const verbs = verbsKey ? (verbsKey.split(',') as EscalationVerb[]) : null;\n return verbs\n ? escalationPatterns({ role, verbs })\n : [escalationPattern({ role })];\n }, [role, verbsKey]);\n\n useEventSubscriptions(patterns, () => {\n invalidate([['escalations']]);\n });\n}\n\n/**\n * Invalidate a single escalation detail on that item's own events. The id is\n * the subject's fourth token, so the broker delivers exactly this item's\n * lifecycle — across role hops (`system.escalation.*.{id}.>`).\n */\nexport function useEscalationDetailEvents(escalationId: string | undefined): void {\n const invalidate = useDebouncedInvalidation(300);\n\n useEventSubscription(\n escalationId\n ? escalationPattern({ id: escalationId })\n : escalationPattern({ id: '__none__' }),\n (event) => {\n if (!escalationId || event.escalationId !== escalationId) return;\n invalidate([['escalations', escalationId], ['escalations'], ['escalationStats']]);\n },\n );\n}\n\n/**\n * Invalidate agent queries on agent lifecycle events.\n */\nexport function useAgentEvents(): void {\n const invalidate = useDebouncedInvalidation(300);\n\n useEventSubscription(`${NATS_SUBJECT_PREFIX}.system.agent.>`, () => {\n invalidate([['agents']]);\n });\n}\n\n/**\n * Invalidate knowledge queries on knowledge events.\n */\nexport function useKnowledgeEvents(): void {\n const invalidate = useDebouncedInvalidation(300);\n\n useEventSubscription(`${NATS_SUBJECT_PREFIX}.system.knowledge.>`, () => {\n invalidate([['knowledge']]);\n });\n}\n\n/**\n * Invalidate process list (ProcessesListPage) on task/workflow events.\n */\nexport function useProcessListEvents(): void {\n const invalidate = useDebouncedInvalidation(300);\n\n useEventSubscription(`${NATS_SUBJECT_PREFIX}.system.task.>`, () => {\n invalidate([['processes']]);\n });\n\n useEventSubscription(`${NATS_SUBJECT_PREFIX}.system.workflow.>`, () => {\n invalidate([['processes']]);\n });\n}\n"],"names":["getInvalidationKeys","event","keys","parts","useDebouncedInvalidation","delayMs","qc","useQueryClient","pendingKeys","useRef","timer","useCallback","key","batch","raw","workflowDetailPatterns","workflowId","NATS_SUBJECT_PREFIX","useWorkflowListEvents","invalidate","useEventSubscription","useWorkflowDetailEvents","useEventSubscriptions","_a","category","useMcpQueryDetailEvents","usePlanDetailEvents","plannerWorkflowId","useProcessDetailEvents","originId","handler","useEscalationStatsEvents","escalationPattern","useStationMetricsEvents","useEscalationAnalyticsEvents","useEscalationListEvents","scope","role","verbsKey","patterns","useMemo","verbs","escalationPatterns","useEscalationDetailEvents","escalationId","useAgentEvents","useProcessListEvents"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as f}from"./vendor-query-RUZdMvN6.js";import{u as i}from"./controlplane-
|
|
2
|
-
//# sourceMappingURL=useNamespace-
|
|
1
|
+
import{a as f}from"./vendor-query-RUZdMvN6.js";import{u as i}from"./controlplane-DGdaM9f3.js";import{f as l}from"./vendor-react-CdqEC2zv.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-BkuU0SeK.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useNamespace-
|
|
1
|
+
{"version":3,"file":"useNamespace-BkuU0SeK.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-RUZdMvN6.js";import{e as y,N as d}from"./index-
|
|
2
|
-
//# sourceMappingURL=useYamlActivityEvents-
|
|
1
|
+
import{a as r}from"./vendor-query-RUZdMvN6.js";import{e as y,N as d}from"./index-zqoZDL5j.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-XXS3wg6-.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useYamlActivityEvents-
|
|
1
|
+
{"version":3,"file":"useYamlActivityEvents-XXS3wg6-.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 o,b as t,c as n}from"./vendor-query-RUZdMvN6.js";import{g as u}from"./index-
|
|
2
|
-
//# sourceMappingURL=users-
|
|
1
|
+
import{u as o,b as t,c as n}from"./vendor-query-RUZdMvN6.js";import{g as u}from"./index-zqoZDL5j.js";function d(e={}){const s=new URLSearchParams;return e.role&&s.set("role",e.role),e.roleType&&s.set("roleType",e.roleType),e.status&&s.set("status",e.status),e.search&&s.set("search",e.search),e.limit&&s.set("limit",String(e.limit)),e.offset!==void 0&&s.set("offset",String(e.offset)),o({queryKey:["users",e],queryFn:()=>u(`/users?${s}`)})}function l(e){return o({queryKey:["users",e],queryFn:()=>u(`/users/${e}`),enabled:!!e})}function q(){const e=t();return n({mutationFn:s=>u("/users",{method:"POST",body:JSON.stringify(s)}),onSuccess:()=>{e.invalidateQueries({queryKey:["users"]})}})}function f(){const e=t();return n({mutationFn:({id:s,...r})=>u(`/users/${s}`,{method:"PUT",body:JSON.stringify(r)}),onSuccess:()=>{e.invalidateQueries({queryKey:["users"]})}})}function S(){const e=t();return n({mutationFn:s=>u(`/users/${s}`,{method:"DELETE"}),onSuccess:()=>{e.invalidateQueries({queryKey:["users"]})}})}function U(){const e=t();return n({mutationFn:({userId:s,role:r,type:i,read_scope:a,write_scope:y})=>u(`/users/${s}/roles`,{method:"POST",body:JSON.stringify({role:r,type:i,read_scope:a,write_scope:y})}),onSuccess:()=>{e.invalidateQueries({queryKey:["users"]})}})}function h(){const e=t();return n({mutationFn:({userId:s,role:r})=>u(`/users/${s}/roles/${encodeURIComponent(r)}`,{method:"DELETE"}),onSuccess:()=>{e.invalidateQueries({queryKey:["users"]})}})}export{d as a,q as b,f as c,U as d,h as e,S as f,l as u};
|
|
2
|
+
//# sourceMappingURL=users-B_9mC6D_.js.map
|