@hotmeshio/long-tail 0.1.12 → 0.1.14
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/README.md +1 -1
- package/build/api/files.d.ts +13 -0
- package/build/api/files.js +44 -0
- package/build/api/mcp-runs.d.ts +2 -0
- package/build/api/mcp-runs.js +2 -0
- package/build/api/workflow-sets.d.ts +11 -0
- package/build/api/workflow-sets.js +62 -0
- package/build/api/yaml-workflows.d.ts +9 -0
- package/build/api/yaml-workflows.js +40 -11
- package/build/examples/seed.js +50 -0
- package/build/lib/db/schemas/001_schema.sql +281 -106
- package/build/lib/db/schemas/002_seed.sql +56 -39
- package/build/lib/storage/local.d.ts +15 -0
- package/build/lib/storage/local.js +63 -0
- package/build/lib/storage/mime.d.ts +4 -0
- package/build/lib/storage/mime.js +31 -0
- package/build/lib/storage/s3.d.ts +16 -0
- package/build/lib/storage/s3.js +70 -0
- package/build/lib/storage/types.d.ts +18 -0
- package/build/modules/utils.d.ts +73 -0
- package/build/modules/utils.js +84 -0
- package/build/routes/file-browser.d.ts +2 -0
- package/build/routes/file-browser.js +112 -0
- package/build/routes/files.js +25 -17
- package/build/routes/index.js +2 -0
- package/build/routes/mcp-runs.js +2 -0
- package/build/routes/workflow-sets.js +9 -0
- package/build/routes/yaml-workflows/deployment.js +8 -0
- package/build/services/insight/index.d.ts +13 -0
- package/build/services/insight/index.js +4 -7
- package/build/services/insight/prompts.d.ts +1 -1
- package/build/services/insight/prompts.js +1 -1
- package/build/services/mcp/server.js +31 -0
- package/build/services/mcp-runs/queries.d.ts +2 -0
- package/build/services/mcp-runs/queries.js +11 -1
- package/build/services/mcp-runs/sql.d.ts +1 -1
- package/build/services/mcp-runs/sql.js +2 -2
- package/build/services/workflow-sets/db.d.ts +1 -0
- package/build/services/workflow-sets/db.js +6 -0
- package/build/services/workflow-sets/index.d.ts +1 -1
- package/build/services/workflow-sets/index.js +2 -1
- package/build/services/workflow-sets/sql.d.ts +1 -0
- package/build/services/workflow-sets/sql.js +6 -1
- package/build/services/yaml-workflow/db.d.ts +12 -0
- package/build/services/yaml-workflow/db.js +18 -0
- package/build/services/yaml-workflow/generator.js +4 -4
- package/build/services/yaml-workflow/pipeline/build/index.d.ts +2 -1
- package/build/services/yaml-workflow/pipeline/build/index.js +3 -2
- package/build/services/yaml-workflow/pipeline/build/utils.d.ts +0 -2
- package/build/services/yaml-workflow/pipeline/build/utils.js +0 -8
- package/build/services/yaml-workflow/sql.d.ts +2 -1
- package/build/services/yaml-workflow/sql.js +10 -3
- package/build/system/activities/schema-exchange.d.ts +50 -0
- package/build/system/activities/schema-exchange.js +210 -0
- package/build/system/activities/sql.d.ts +1 -1
- package/build/system/activities/sql.js +12 -1
- package/build/system/index.js +1 -0
- package/build/system/mcp-servers/human-queue.js +31 -0
- package/build/system/mcp-servers/knowledge.js +35 -6
- package/build/system/mcp-servers/schema-exchange.d.ts +4 -0
- package/build/system/mcp-servers/schema-exchange.js +93 -0
- package/build/system/seed/server-definitions.d.ts +112 -1
- package/build/system/seed/server-definitions.js +37 -0
- package/build/system/seed/tool-manifests-data.d.ts +87 -0
- package/build/system/seed/tool-manifests-data.js +37 -1
- package/build/system/seed/tool-manifests-knowledge.d.ts +9 -1
- package/build/system/seed/tool-manifests-knowledge.js +6 -5
- package/build/system/workflows/mcp-workflow-builder/prompts.d.ts +1 -1
- package/build/system/workflows/mcp-workflow-builder/prompts.js +21 -20
- package/build/system/workflows/mcp-workflow-planner/activities/persist.d.ts +1 -1
- package/build/system/workflows/mcp-workflow-planner/activities/persist.js +3 -3
- package/build/system/workflows/mcp-workflow-planner/index.js +39 -5
- package/build/system/workflows/mcp-workflow-planner/prompts.d.ts +1 -1
- package/build/system/workflows/mcp-workflow-planner/prompts.js +3 -3
- package/build/tsconfig.tsbuildinfo +1 -1
- package/dashboard/dist/assets/{AdminDashboard-DUrSBQOl.js → AdminDashboard-Cngijp4Q.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-DUrSBQOl.js.map → AdminDashboard-Cngijp4Q.js.map} +1 -1
- package/dashboard/dist/assets/{AvailableEscalationsPage-Dbd1qUK_.js → AvailableEscalationsPage-CpBfGV1h.js} +2 -2
- package/dashboard/dist/assets/{AvailableEscalationsPage-Dbd1qUK_.js.map → AvailableEscalationsPage-CpBfGV1h.js.map} +1 -1
- package/dashboard/dist/assets/{BotPicker-Cg5iNEkm.js → BotPicker-B8Uvw9Si.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-Cg5iNEkm.js.map → BotPicker-B8Uvw9Si.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-Kd9UIyeU.js → CollapsibleSection-DiFPuWOY.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-Kd9UIyeU.js.map → CollapsibleSection-DiFPuWOY.js.map} +1 -1
- package/dashboard/dist/assets/{ConfirmDeleteModal-DZMgmlof.js → ConfirmDeleteModal-CpXG9uyu.js} +2 -2
- package/dashboard/dist/assets/{ConfirmDeleteModal-DZMgmlof.js.map → ConfirmDeleteModal-CpXG9uyu.js.map} +1 -1
- package/dashboard/dist/assets/{CopyableId-cPFTRm8q.js → CopyableId-DKsTR9lK.js} +2 -2
- package/dashboard/dist/assets/{CopyableId-cPFTRm8q.js.map → CopyableId-DKsTR9lK.js.map} +1 -1
- package/dashboard/dist/assets/CredentialsPage-DlS7Kf40.js +2 -0
- package/dashboard/dist/assets/{CredentialsPage-DJablIbs.js.map → CredentialsPage-DlS7Kf40.js.map} +1 -1
- package/dashboard/dist/assets/{CustomDurationPicker-NgIP6YDW.js → CustomDurationPicker-B-9eW3pm.js} +2 -2
- package/dashboard/dist/assets/{CustomDurationPicker-NgIP6YDW.js.map → CustomDurationPicker-B-9eW3pm.js.map} +1 -1
- package/dashboard/dist/assets/{DataTable-CTRhTAfT.js → DataTable-DkOokbtL.js} +2 -2
- package/dashboard/dist/assets/{DataTable-CTRhTAfT.js.map → DataTable-DkOokbtL.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-HcSJ_MMs.js → ElapsedCell-DVtHqM-5.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-HcSJ_MMs.js.map → ElapsedCell-DVtHqM-5.js.map} +1 -1
- package/dashboard/dist/assets/{EmptyState-joNbd4gg.js → EmptyState-C7KIMIbE.js} +2 -2
- package/dashboard/dist/assets/{EmptyState-joNbd4gg.js.map → EmptyState-C7KIMIbE.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-DpXDnQux.js → EscalationsOverview-BMKBlkPx.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-DpXDnQux.js.map → EscalationsOverview-BMKBlkPx.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-CYem3v8n.js → EventTable-BYZ5OVdQ.js} +2 -2
- package/dashboard/dist/assets/{EventTable-CYem3v8n.js.map → EventTable-BYZ5OVdQ.js.map} +1 -1
- package/dashboard/dist/assets/{FilterBar-BiO8SOzc.js → FilterBar-C5r3n6YO.js} +2 -2
- package/dashboard/dist/assets/{FilterBar-BiO8SOzc.js.map → FilterBar-C5r3n6YO.js.map} +1 -1
- package/dashboard/dist/assets/{ListToolbar-6yRDh2e9.js → ListToolbar-BGUajIsW.js} +2 -2
- package/dashboard/dist/assets/{ListToolbar-6yRDh2e9.js.map → ListToolbar-BGUajIsW.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-CUgSxkQe.js → McpOverview-B_kJYHea.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-CUgSxkQe.js.map → McpOverview-B_kJYHea.js.map} +1 -1
- package/dashboard/dist/assets/McpQueryDetailPage-Czsmovqw.js +5 -0
- package/dashboard/dist/assets/McpQueryDetailPage-Czsmovqw.js.map +1 -0
- package/dashboard/dist/assets/McpQueryPage-BgAq_bQg.js +2 -0
- package/dashboard/dist/assets/{McpQueryPage-lV6kfDG5.js.map → McpQueryPage-BgAq_bQg.js.map} +1 -1
- package/dashboard/dist/assets/McpRunDetailPage-B8c0OszR.js +2 -0
- package/dashboard/dist/assets/McpRunDetailPage-B8c0OszR.js.map +1 -0
- package/dashboard/dist/assets/McpRunsPage-BY8C6k78.js +2 -0
- package/dashboard/dist/assets/McpRunsPage-BY8C6k78.js.map +1 -0
- package/dashboard/dist/assets/{Modal-BuTvD0pz.js → Modal-E1yRnCeW.js} +2 -2
- package/dashboard/dist/assets/{Modal-BuTvD0pz.js.map → Modal-E1yRnCeW.js.map} +1 -1
- package/dashboard/dist/assets/OperatorDashboard-C8MSTzey.js +2 -0
- package/dashboard/dist/assets/{OperatorDashboard-C9SSV96T.js.map → OperatorDashboard-C8MSTzey.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeader-BcTVF9ul.js → PageHeader-Cm5HBQF_.js} +2 -2
- package/dashboard/dist/assets/{PageHeader-BcTVF9ul.js.map → PageHeader-Cm5HBQF_.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeaderWithStats-BI7JG5x6.js → PageHeaderWithStats-CNmWJFSN.js} +2 -2
- package/dashboard/dist/assets/{PageHeaderWithStats-BI7JG5x6.js.map → PageHeaderWithStats-CNmWJFSN.js.map} +1 -1
- package/dashboard/dist/assets/{PriorityBadge-DqVaOU65.js → PriorityBadge-HSI4RVhs.js} +2 -2
- package/dashboard/dist/assets/{PriorityBadge-DqVaOU65.js.map → PriorityBadge-HSI4RVhs.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessDetailPage-hFMhf9qa.js → ProcessDetailPage-Dln8622H.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-hFMhf9qa.js.map → ProcessDetailPage-Dln8622H.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessesListPage-ByVoBCQ3.js → ProcessesListPage-bIsd9N_h.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-ByVoBCQ3.js.map → ProcessesListPage-bIsd9N_h.js.map} +1 -1
- package/dashboard/dist/assets/{RolePill-D9ZIkYiu.js → RolePill-BVUp2bF0.js} +2 -2
- package/dashboard/dist/assets/{RolePill-D9ZIkYiu.js.map → RolePill-BVUp2bF0.js.map} +1 -1
- package/dashboard/dist/assets/RolesPage-kH-Njt25.js +2 -0
- package/dashboard/dist/assets/{RolesPage-SMedMuqa.js.map → RolesPage-kH-Njt25.js.map} +1 -1
- package/dashboard/dist/assets/{RowActions-yDhwwDbU.js → RowActions-DbUJPfaW.js} +2 -2
- package/dashboard/dist/assets/{RowActions-yDhwwDbU.js.map → RowActions-DbUJPfaW.js.map} +1 -1
- package/dashboard/dist/assets/{StatCard-BrBnQFxh.js → StatCard-Bs3JbyAz.js} +2 -2
- package/dashboard/dist/assets/{StatCard-BrBnQFxh.js.map → StatCard-Bs3JbyAz.js.map} +1 -1
- package/dashboard/dist/assets/{StatusBadge-xgb-lZku.js → StatusBadge-CakDdsCw.js} +2 -2
- package/dashboard/dist/assets/{StatusBadge-xgb-lZku.js.map → StatusBadge-CakDdsCw.js.map} +1 -1
- package/dashboard/dist/assets/{StepIndicator-B9ps2SvM.js → StepIndicator-Cd_SG_yA.js} +2 -2
- package/dashboard/dist/assets/{StepIndicator-B9ps2SvM.js.map → StepIndicator-Cd_SG_yA.js.map} +1 -1
- package/dashboard/dist/assets/{StickyPagination-DTIjBKN3.js → StickyPagination-Bz0C18nC.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-DTIjBKN3.js.map → StickyPagination-Bz0C18nC.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-RK4Yu66z.js → SwimlaneTimeline-Cfe-xQRX.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-RK4Yu66z.js.map → SwimlaneTimeline-Cfe-xQRX.js.map} +1 -1
- package/dashboard/dist/assets/{TagInput-CdNUuqk4.js → TagInput-ClFhXG-U.js} +2 -2
- package/dashboard/dist/assets/{TagInput-CdNUuqk4.js.map → TagInput-ClFhXG-U.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-C-nzaNea.js → TaskDetailPage-SuMBdARt.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-C-nzaNea.js.map → TaskDetailPage-SuMBdARt.js.map} +1 -1
- package/dashboard/dist/assets/{TaskQueuePill-Lvr2-NzS.js → TaskQueuePill-lJR1JW_W.js} +2 -2
- package/dashboard/dist/assets/{TaskQueuePill-Lvr2-NzS.js.map → TaskQueuePill-lJR1JW_W.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-DSUmD84y.js → TasksListPage-Dkq1Vtbt.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-DSUmD84y.js.map → TasksListPage-Dkq1Vtbt.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-BZdLdrIh.js → TimeAgo-DgfDZ1pl.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-BZdLdrIh.js.map → TimeAgo-DgfDZ1pl.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-QX_0i5FK.js → TimestampCell-MpHZ1hMD.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-QX_0i5FK.js.map → TimestampCell-MpHZ1hMD.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-DyZMXcBm.js → UserName-DqsosA4B.js} +2 -2
- package/dashboard/dist/assets/{UserName-DyZMXcBm.js.map → UserName-DqsosA4B.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowExecutionPage-DjVxfZaF.js → WorkflowExecutionPage-CVlg38C3.js} +2 -2
- package/dashboard/dist/assets/{WorkflowExecutionPage-DjVxfZaF.js.map → WorkflowExecutionPage-CVlg38C3.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowPill-CRpZhjGR.js +2 -0
- package/dashboard/dist/assets/WorkflowPill-CRpZhjGR.js.map +1 -0
- package/dashboard/dist/assets/{WorkflowsDashboard-DZjuiFZ0.js → WorkflowsDashboard-Ugzbs8mV.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsDashboard-DZjuiFZ0.js.map → WorkflowsDashboard-Ugzbs8mV.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsOverview-CLnLRpOu.js → WorkflowsOverview-CIp_lTNl.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-CLnLRpOu.js.map → WorkflowsOverview-CIp_lTNl.js.map} +1 -1
- package/dashboard/dist/assets/YamlWorkflowsPage-BICF0fRO.js +2 -0
- package/dashboard/dist/assets/YamlWorkflowsPage-BICF0fRO.js.map +1 -0
- package/dashboard/dist/assets/{bots-DIM6lBoY.js → bots-DPfUpVqI.js} +2 -2
- package/dashboard/dist/assets/{bots-DIM6lBoY.js.map → bots-DPfUpVqI.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-JOTuOqjq.js → escalation-RrCDbMC3.js} +2 -2
- package/dashboard/dist/assets/{escalation-JOTuOqjq.js.map → escalation-RrCDbMC3.js.map} +1 -1
- package/dashboard/dist/assets/escalation-columns-CDGa9wsD.js +2 -0
- package/dashboard/dist/assets/{escalation-columns-Cyg58nkg.js.map → escalation-columns-CDGa9wsD.js.map} +1 -1
- package/dashboard/dist/assets/{helpers-B1BDxBZd.js → helpers-ZSKqdkdS.js} +2 -2
- package/dashboard/dist/assets/{helpers-B1BDxBZd.js.map → helpers-ZSKqdkdS.js.map} +1 -1
- package/dashboard/dist/assets/helpers-rMEcLwKs.js +2 -0
- package/dashboard/dist/assets/helpers-rMEcLwKs.js.map +1 -0
- package/dashboard/dist/assets/{index-DDYFpi4l.js → index-ABcJHHlN.js} +2 -2
- package/dashboard/dist/assets/{index-DDYFpi4l.js.map → index-ABcJHHlN.js.map} +1 -1
- package/dashboard/dist/assets/{index-D1wVX50Z.js → index-B91h_jZ0.js} +2 -2
- package/dashboard/dist/assets/{index-D1wVX50Z.js.map → index-B91h_jZ0.js.map} +1 -1
- package/dashboard/dist/assets/{index-BcR6PfpY.js → index-BbI2dzhJ.js} +2 -2
- package/dashboard/dist/assets/{index-BcR6PfpY.js.map → index-BbI2dzhJ.js.map} +1 -1
- package/dashboard/dist/assets/{index-BizfauqT.js → index-BmVCyB6C.js} +4 -4
- package/dashboard/dist/assets/{index-BizfauqT.js.map → index-BmVCyB6C.js.map} +1 -1
- package/dashboard/dist/assets/index-C1E5GTs9.js +2 -0
- package/dashboard/dist/assets/index-C1E5GTs9.js.map +1 -0
- package/dashboard/dist/assets/{index-Cf60K3x9.js → index-C90ZPzXk.js} +2 -2
- package/dashboard/dist/assets/{index-Cf60K3x9.js.map → index-C90ZPzXk.js.map} +1 -1
- package/dashboard/dist/assets/{index-BYZX9tOb.js → index-Cmgrk7PQ.js} +58 -58
- package/dashboard/dist/assets/index-Cmgrk7PQ.js.map +1 -0
- package/dashboard/dist/assets/{index-Ds0JoXS2.js → index-DNytWfSZ.js} +2 -2
- package/dashboard/dist/assets/{index-Ds0JoXS2.js.map → index-DNytWfSZ.js.map} +1 -1
- package/dashboard/dist/assets/index-DX6zxr6t.js +2 -0
- package/dashboard/dist/assets/{index-Cg5nfiYX.js.map → index-DX6zxr6t.js.map} +1 -1
- package/dashboard/dist/assets/index-DeX-ezqf.css +1 -0
- package/dashboard/dist/assets/index-K40Qw1tk.js +2 -0
- package/dashboard/dist/assets/{index-Di12t56M.js.map → index-K40Qw1tk.js.map} +1 -1
- package/dashboard/dist/assets/{index-BUK3qR-1.js → index-lCyNr5Xk.js} +2 -2
- package/dashboard/dist/assets/{index-BUK3qR-1.js.map → index-lCyNr5Xk.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-B_xbczAt.js → mcp-CNE44TSp.js} +2 -2
- package/dashboard/dist/assets/{mcp-B_xbczAt.js.map → mcp-CNE44TSp.js.map} +1 -1
- package/dashboard/dist/assets/mcp-query-RQX0uN-5.js +2 -0
- package/dashboard/dist/assets/mcp-query-RQX0uN-5.js.map +1 -0
- package/dashboard/dist/assets/mcp-runs-0w40bdz-.js +2 -0
- package/dashboard/dist/assets/mcp-runs-0w40bdz-.js.map +1 -0
- package/dashboard/dist/assets/{namespaces-C3WtdO_9.js → namespaces-BbmdXuPp.js} +2 -2
- package/dashboard/dist/assets/{namespaces-C3WtdO_9.js.map → namespaces-BbmdXuPp.js.map} +1 -1
- package/dashboard/dist/assets/{roles-BDAsPpZG.js → roles-DoHYlhWH.js} +2 -2
- package/dashboard/dist/assets/{roles-BDAsPpZG.js.map → roles-DoHYlhWH.js.map} +1 -1
- package/dashboard/dist/assets/{settings-Ife_UwAp.js → settings-BAiJiCHS.js} +2 -2
- package/dashboard/dist/assets/{settings-Ife_UwAp.js.map → settings-BAiJiCHS.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-BquNDHDI.js → tasks-CvroqHtm.js} +2 -2
- package/dashboard/dist/assets/{tasks-BquNDHDI.js.map → tasks-CvroqHtm.js.map} +1 -1
- package/dashboard/dist/assets/{useEventHooks-anv_B2Yy.js → useEventHooks-BHMbzR_y.js} +2 -2
- package/dashboard/dist/assets/{useEventHooks-anv_B2Yy.js.map → useEventHooks-BHMbzR_y.js.map} +1 -1
- package/dashboard/dist/assets/useFilterParams-CGRYFw_A.js +2 -0
- package/dashboard/dist/assets/useFilterParams-CGRYFw_A.js.map +1 -0
- package/dashboard/dist/assets/useYamlActivityEvents-D56KV14X.js +2 -0
- package/dashboard/dist/assets/useYamlActivityEvents-D56KV14X.js.map +1 -0
- package/dashboard/dist/assets/{users-CFcxB4v6.js → users-CxIMy_xw.js} +2 -2
- package/dashboard/dist/assets/{users-CFcxB4v6.js.map → users-CxIMy_xw.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-T4r2DSPD.js → vendor-icons-AFGxSeQS.js} +132 -82
- package/dashboard/dist/assets/vendor-icons-AFGxSeQS.js.map +1 -0
- package/dashboard/dist/assets/{workflows-CeRci9z3.js → workflows-yR9yais7.js} +2 -2
- package/dashboard/dist/assets/{workflows-CeRci9z3.js.map → workflows-yR9yais7.js.map} +1 -1
- package/dashboard/dist/assets/yaml-workflows-QVF2MZ0l.js +2 -0
- package/dashboard/dist/assets/yaml-workflows-QVF2MZ0l.js.map +1 -0
- package/dashboard/dist/index.html +3 -3
- package/docs/schema-exchange.md +173 -0
- package/docs/self-test.md +106 -0
- package/package.json +4 -2
- package/build/lib/db/schemas/003_workflow_discovery.sql +0 -39
- package/build/lib/db/schemas/004_query_router.sql +0 -38
- package/build/lib/db/schemas/004_workflow_sets.sql +0 -29
- package/build/lib/db/schemas/005_triage_router.sql +0 -37
- package/build/lib/db/schemas/005_unique_graph_topic.sql +0 -7
- package/build/lib/db/schemas/006_oauth.sql +0 -50
- package/build/lib/db/schemas/007_security.sql +0 -27
- package/build/lib/db/schemas/008_bot_accounts.sql +0 -30
- package/build/lib/db/schemas/009_audit_trail.sql +0 -7
- package/build/lib/db/schemas/010_credential_providers.sql +0 -4
- package/build/lib/db/schemas/011_system_workflow_configs.sql +0 -37
- package/build/lib/db/schemas/012_drop_modality.sql +0 -6
- package/build/lib/db/schemas/013_execute_as.sql +0 -9
- package/build/lib/db/schemas/014_ephemeral_credentials.sql +0 -16
- package/build/lib/db/schemas/015_knowledge.sql +0 -23
- package/build/lib/db/schemas/016_streamable_http.sql +0 -7
- package/dashboard/dist/assets/CredentialsPage-DJablIbs.js +0 -2
- package/dashboard/dist/assets/McpQueryDetailPage-BWbinTM_.js +0 -5
- package/dashboard/dist/assets/McpQueryDetailPage-BWbinTM_.js.map +0 -1
- package/dashboard/dist/assets/McpQueryPage-lV6kfDG5.js +0 -2
- package/dashboard/dist/assets/McpRunDetailPage-D6gaxH3_.js +0 -2
- package/dashboard/dist/assets/McpRunDetailPage-D6gaxH3_.js.map +0 -1
- package/dashboard/dist/assets/McpRunsPage-DKvTklh9.js +0 -2
- package/dashboard/dist/assets/McpRunsPage-DKvTklh9.js.map +0 -1
- package/dashboard/dist/assets/OperatorDashboard-C9SSV96T.js +0 -2
- package/dashboard/dist/assets/RolesPage-SMedMuqa.js +0 -2
- package/dashboard/dist/assets/WorkflowPill-CZqGslD6.js +0 -2
- package/dashboard/dist/assets/WorkflowPill-CZqGslD6.js.map +0 -1
- package/dashboard/dist/assets/YamlWorkflowsPage-VjdhnLmO.js +0 -2
- package/dashboard/dist/assets/YamlWorkflowsPage-VjdhnLmO.js.map +0 -1
- package/dashboard/dist/assets/escalation-columns-Cyg58nkg.js +0 -2
- package/dashboard/dist/assets/helpers-BCix9c_m.js +0 -2
- package/dashboard/dist/assets/helpers-BCix9c_m.js.map +0 -1
- package/dashboard/dist/assets/index-BYZX9tOb.js.map +0 -1
- package/dashboard/dist/assets/index-Cg5nfiYX.js +0 -2
- package/dashboard/dist/assets/index-DcIKW-cZ.css +0 -1
- package/dashboard/dist/assets/index-Di12t56M.js +0 -2
- package/dashboard/dist/assets/mcp-query-B8-P_QoG.js +0 -2
- package/dashboard/dist/assets/mcp-query-B8-P_QoG.js.map +0 -1
- package/dashboard/dist/assets/mcp-runs-CWeZinoF.js +0 -2
- package/dashboard/dist/assets/mcp-runs-CWeZinoF.js.map +0 -1
- package/dashboard/dist/assets/useFilterParams-BUyLHcx_.js +0 -2
- package/dashboard/dist/assets/useFilterParams-BUyLHcx_.js.map +0 -1
- package/dashboard/dist/assets/useYamlActivityEvents-DN-PTgVx.js +0 -2
- package/dashboard/dist/assets/useYamlActivityEvents-DN-PTgVx.js.map +0 -1
- package/dashboard/dist/assets/vendor-icons-T4r2DSPD.js.map +0 -1
- package/dashboard/dist/assets/yaml-workflows-DLwd2BOX.js +0 -2
- package/dashboard/dist/assets/yaml-workflows-DLwd2BOX.js.map +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{u as e}from"./vendor-query-DLp59M9_.js";import{b as s}from"./index-
|
|
2
|
-
//# sourceMappingURL=namespaces-
|
|
1
|
+
import{u as e}from"./vendor-query-DLp59M9_.js";import{b as s}from"./index-Cmgrk7PQ.js";function u(){return e({queryKey:["namespaces"],queryFn:()=>s("/namespaces")})}export{u};
|
|
2
|
+
//# sourceMappingURL=namespaces-BbmdXuPp.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"namespaces-
|
|
1
|
+
{"version":3,"file":"namespaces-BbmdXuPp.js","sources":["../../src/api/namespaces.ts"],"sourcesContent":["import { useQuery } from '@tanstack/react-query';\nimport { apiFetch } from './client';\n\nexport interface LTNamespace {\n id: string;\n name: string;\n description: string | null;\n schema_name: string;\n is_default: boolean;\n metadata: Record<string, unknown> | null;\n created_at: string;\n updated_at: string;\n}\n\nexport function useNamespaces() {\n return useQuery<{ namespaces: LTNamespace[] }>({\n queryKey: ['namespaces'],\n queryFn: () => apiFetch('/namespaces'),\n });\n}\n"],"names":["useNamespaces","useQuery","apiFetch"],"mappings":"uFAcO,SAASA,GAAgB,CAC9B,OAAOC,EAAwC,CAC7C,SAAU,CAAC,YAAY,EACvB,QAAS,IAAMC,EAAS,aAAa,CAAA,CACtC,CACH"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{u as t,b as o,c as r}from"./vendor-query-DLp59M9_.js";import{b as n}from"./index-
|
|
2
|
-
//# sourceMappingURL=roles-
|
|
1
|
+
import{u as t,b as o,c as r}from"./vendor-query-DLp59M9_.js";import{b as n}from"./index-Cmgrk7PQ.js";function i(){return t({queryKey:["roles"],queryFn:()=>n("/roles")})}function l(){return t({queryKey:["roles","escalation-chains"],queryFn:()=>n("/roles/escalation-chains")})}function c(e){return t({queryKey:["roles",e,"escalation-targets"],queryFn:()=>n(`/roles/${encodeURIComponent(e)}/escalation-targets`),enabled:!!e})}function y(){const e=o();return r({mutationFn:s=>n("/roles/escalation-chains",{method:"POST",body:JSON.stringify(s)}),onSuccess:()=>{e.invalidateQueries({queryKey:["roles"]})}})}function d(){const e=o();return r({mutationFn:s=>n("/roles/escalation-chains",{method:"DELETE",body:JSON.stringify(s)}),onSuccess:()=>{e.invalidateQueries({queryKey:["roles"]})}})}function q(){return t({queryKey:["roles","details"],queryFn:()=>n("/roles/details")})}function m(){const e=o();return r({mutationFn:s=>n("/roles",{method:"POST",body:JSON.stringify({role:s})}),onSuccess:()=>{e.invalidateQueries({queryKey:["roles"]})}})}function f(){const e=o();return r({mutationFn:s=>n(`/roles/${encodeURIComponent(s)}`,{method:"DELETE"}),onSuccess:()=>{e.invalidateQueries({queryKey:["roles"]})}})}export{c as a,m as b,l as c,y as d,d as e,q as f,f as g,i as u};
|
|
2
|
+
//# sourceMappingURL=roles-DoHYlhWH.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"roles-
|
|
1
|
+
{"version":3,"file":"roles-DoHYlhWH.js","sources":["../../src/api/roles.ts"],"sourcesContent":["import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { apiFetch } from './client';\n\nexport interface EscalationChain {\n source_role: string;\n target_role: string;\n}\n\nexport interface RoleDetail {\n role: string;\n user_count: number;\n chain_count: number;\n workflow_count: number;\n}\n\nexport function useRoles() {\n return useQuery<{ roles: string[] }>({\n queryKey: ['roles'],\n queryFn: () => apiFetch('/roles'),\n });\n}\n\nexport function useEscalationChains() {\n return useQuery<{ chains: EscalationChain[] }>({\n queryKey: ['roles', 'escalation-chains'],\n queryFn: () => apiFetch('/roles/escalation-chains'),\n });\n}\n\nexport function useEscalationTargets(role: string) {\n return useQuery<{ targets: string[] }>({\n queryKey: ['roles', role, 'escalation-targets'],\n queryFn: () => apiFetch(`/roles/${encodeURIComponent(role)}/escalation-targets`),\n enabled: !!role,\n });\n}\n\nexport function useUpdateEscalationTargets() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ role, targets }: { role: string; targets: string[] }) =>\n apiFetch(`/roles/${encodeURIComponent(role)}/escalation-targets`, {\n method: 'PUT',\n body: JSON.stringify({ targets }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['roles'] });\n },\n });\n}\n\nexport function useAddEscalationChain() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (chain: EscalationChain) =>\n apiFetch('/roles/escalation-chains', {\n method: 'POST',\n body: JSON.stringify(chain),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['roles'] });\n },\n });\n}\n\nexport function useRemoveEscalationChain() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (chain: EscalationChain) =>\n apiFetch('/roles/escalation-chains', {\n method: 'DELETE',\n body: JSON.stringify(chain),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['roles'] });\n },\n });\n}\n\nexport function useRoleDetails() {\n return useQuery<{ roles: RoleDetail[] }>({\n queryKey: ['roles', 'details'],\n queryFn: () => apiFetch('/roles/details'),\n });\n}\n\nexport function useCreateRole() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (role: string) =>\n apiFetch('/roles', {\n method: 'POST',\n body: JSON.stringify({ role }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['roles'] });\n },\n });\n}\n\nexport function useDeleteRole() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (role: string) =>\n apiFetch(`/roles/${encodeURIComponent(role)}`, {\n method: 'DELETE',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['roles'] });\n },\n });\n}\n"],"names":["useRoles","useQuery","apiFetch","useEscalationChains","useEscalationTargets","role","useAddEscalationChain","queryClient","useQueryClient","useMutation","chain","useRemoveEscalationChain","useRoleDetails","useCreateRole","useDeleteRole"],"mappings":"qGAeO,SAASA,GAAW,CACzB,OAAOC,EAA8B,CACnC,SAAU,CAAC,OAAO,EAClB,QAAS,IAAMC,EAAS,QAAQ,CAAA,CACjC,CACH,CAEO,SAASC,GAAsB,CACpC,OAAOF,EAAwC,CAC7C,SAAU,CAAC,QAAS,mBAAmB,EACvC,QAAS,IAAMC,EAAS,0BAA0B,CAAA,CACnD,CACH,CAEO,SAASE,EAAqBC,EAAc,CACjD,OAAOJ,EAAgC,CACrC,SAAU,CAAC,QAASI,EAAM,oBAAoB,EAC9C,QAAS,IAAMH,EAAS,UAAU,mBAAmBG,CAAI,CAAC,qBAAqB,EAC/E,QAAS,CAAC,CAACA,CAAA,CACZ,CACH,CAgBO,SAASC,GAAwB,CACtC,MAAMC,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAaC,GACXR,EAAS,2BAA4B,CACnC,OAAQ,OACR,KAAM,KAAK,UAAUQ,CAAK,CAAA,CAC3B,EACH,UAAW,IAAM,CACfH,EAAY,kBAAkB,CAAE,SAAU,CAAC,OAAO,EAAG,CACvD,CAAA,CACD,CACH,CAEO,SAASI,GAA2B,CACzC,MAAMJ,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAaC,GACXR,EAAS,2BAA4B,CACnC,OAAQ,SACR,KAAM,KAAK,UAAUQ,CAAK,CAAA,CAC3B,EACH,UAAW,IAAM,CACfH,EAAY,kBAAkB,CAAE,SAAU,CAAC,OAAO,EAAG,CACvD,CAAA,CACD,CACH,CAEO,SAASK,GAAiB,CAC/B,OAAOX,EAAkC,CACvC,SAAU,CAAC,QAAS,SAAS,EAC7B,QAAS,IAAMC,EAAS,gBAAgB,CAAA,CACzC,CACH,CAEO,SAASW,GAAgB,CAC9B,MAAMN,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAaJ,GACXH,EAAS,SAAU,CACjB,OAAQ,OACR,KAAM,KAAK,UAAU,CAAE,KAAAG,EAAM,CAAA,CAC9B,EACH,UAAW,IAAM,CACfE,EAAY,kBAAkB,CAAE,SAAU,CAAC,OAAO,EAAG,CACvD,CAAA,CACD,CACH,CAEO,SAASO,GAAgB,CAC9B,MAAMP,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAaJ,GACXH,EAAS,UAAU,mBAAmBG,CAAI,CAAC,GAAI,CAC7C,OAAQ,QAAA,CACT,EACH,UAAW,IAAM,CACfE,EAAY,kBAAkB,CAAE,SAAU,CAAC,OAAO,EAAG,CACvD,CAAA,CACD,CACH"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{u as t}from"./vendor-query-DLp59M9_.js";import{b as e}from"./index-
|
|
2
|
-
//# sourceMappingURL=settings-
|
|
1
|
+
import{u as t}from"./vendor-query-DLp59M9_.js";import{b as e}from"./index-Cmgrk7PQ.js";function n(){return e("/settings")}function s(){return t({queryKey:["settings"],queryFn:n,staleTime:1/0})}export{s as u};
|
|
2
|
+
//# sourceMappingURL=settings-BAiJiCHS.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings-
|
|
1
|
+
{"version":3,"file":"settings-BAiJiCHS.js","sources":["../../src/api/settings.ts"],"sourcesContent":["import { useQuery } from '@tanstack/react-query';\nimport { apiFetch } from './client';\n\ninterface AppSettings {\n telemetry: {\n traceUrl: string | null;\n };\n escalation?: {\n claimDurations?: number[];\n };\n}\n\nfunction fetchSettings(): Promise<AppSettings> {\n return apiFetch<AppSettings>('/settings');\n}\n\nexport function useSettings() {\n return useQuery({\n queryKey: ['settings'],\n queryFn: fetchSettings,\n staleTime: Infinity,\n });\n}\n"],"names":["fetchSettings","apiFetch","useSettings","useQuery"],"mappings":"uFAYA,SAASA,GAAsC,CAC7C,OAAOC,EAAsB,WAAW,CAC1C,CAEO,SAASC,GAAc,CAC5B,OAAOC,EAAS,CACd,SAAU,CAAC,UAAU,EACrB,QAASH,EACT,UAAW,GAAA,CACZ,CACH"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{u as a}from"./vendor-query-DLp59M9_.js";import{b as t}from"./index-
|
|
2
|
-
//# sourceMappingURL=tasks-
|
|
1
|
+
import{u as a}from"./vendor-query-DLp59M9_.js";import{b as t}from"./index-Cmgrk7PQ.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)),a({queryKey:["tasks",e],queryFn:()=>t(`/tasks?${s}`)})}function c(e){return a({queryKey:["tasks",e],queryFn:()=>t(`/tasks/${e}`),enabled:!!e})}function k(e){return a({queryKey:["tasks","children",e],queryFn:()=>t(`/tasks?parent_workflow_id=${encodeURIComponent(e)}&limit=50`),enabled:!!e})}function r(e){return a({queryKey:["tasks","byWorkflow",e],queryFn:async()=>{const s=await t(`/tasks?workflow_id=${encodeURIComponent(e)}&limit=1`);return s.tasks.length>0?s.tasks[0]:(await t(`/tasks?parent_workflow_id=${encodeURIComponent(e)}&limit=1`)).tasks[0]??null},enabled:!!e})}function p(e){const s=new URLSearchParams;return e!=null&&e.limit&&s.set("limit",String(e.limit)),(e==null?void 0:e.offset)!==void 0&&s.set("offset",String(e.offset)),e!=null&&e.workflow_type&&s.set("workflow_type",e.workflow_type),e!=null&&e.status&&s.set("status",e.status),e!=null&&e.search&&s.set("search",e.search),a({queryKey:["processes",e],queryFn:()=>t(`/tasks/processes?${s}`)})}function m(e){return a({queryKey:["processes",e],queryFn:()=>t(`/tasks/processes/${encodeURIComponent(e)}`),enabled:!!e,retry:3,retryDelay:1e3})}export{m as a,r as b,y as c,c as d,k as e,p as u};
|
|
2
|
+
//# sourceMappingURL=tasks-CvroqHtm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tasks-
|
|
1
|
+
{"version":3,"file":"tasks-CvroqHtm.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}) {\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 });\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","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,EAM1B,CACD,MAAMC,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,CAAA,CACrD,CACH,CAEO,SAASW,EAAiBC,EAAkB,CACjD,OAAOX,EAAwB,CAC7B,SAAU,CAAC,YAAaW,CAAQ,EAChC,QAAS,IAAMV,EAAS,oBAAoB,mBAAmBU,CAAQ,CAAC,EAAE,EAC1E,QAAS,CAAC,CAACA,EACX,MAAO,EACP,WAAY,GAAA,CACb,CACH"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as l,b as w}from"./vendor-query-DLp59M9_.js";import{u as a,N as e}from"./index-
|
|
2
|
-
//# sourceMappingURL=useEventHooks-
|
|
1
|
+
import{a as l,b as w}from"./vendor-query-DLp59M9_.js";import{u as a,N as e}from"./index-Cmgrk7PQ.js";function f(s){const o=[];switch(s.type.split(".")[0]){case"task":o.push(["tasks"]),o.push(["jobs"]),o.push(["processes"]),s.workflowId&&(o.push(["workflowExecution",s.workflowId]),o.push(["workflowState",s.workflowId]),o.push(["mcpQueryExecution",s.workflowId])),s.originId&&o.push(["processes",s.originId]);break;case"escalation":o.push(["escalations"]),o.push(["escalationStats"]),s.workflowId&&o.push(["workflowExecution",s.workflowId]);break;case"workflow":o.push(["jobs"]),o.push(["tasks"]),o.push(["processes"]),s.workflowId&&(o.push(["workflowExecution",s.workflowId]),o.push(["workflowState",s.workflowId]),o.push(["mcpQueryExecution",s.workflowId]),o.push(["mcpQueryResult",s.workflowId]),o.push(["builderResult",s.workflowId]));break;case"activity":s.workflowId&&o.push(["mcpRunExecution",s.workflowId]),o.push(["mcpRuns"]);break;case"milestone":s.workflowId&&(o.push(["workflowExecution",s.workflowId]),o.push(["mcpQueryExecution",s.workflowId])),o.push(["tasks"]);break;default:o.push(["jobs"]),o.push(["tasks"]);break}return o}function c(s=500){const o=w(),t=l.useRef(new Set),i=l.useRef(null);return l.useCallback(u=>{for(const r of u)t.current.add(JSON.stringify(r));i.current&&clearTimeout(i.current),i.current=setTimeout(()=>{for(const r of t.current)o.invalidateQueries({queryKey:JSON.parse(r)});t.current.clear(),i.current=null},s)},[o,s])}function d(){const s=c(300);a(`${e}.task.>`,()=>{s([["jobs"]])}),a(`${e}.workflow.>`,()=>{s([["jobs"]])})}function h(s){const o=c(400);a(`${e}.>`,t=>{var n;if(!s||!(t.workflowId===s||((n=t.workflowId)==null?void 0:n.includes(s))))return;const u=t.type.split(".")[0],r=f(t);u==="escalation"&&r.push(["escalations","by-workflow",s]),o(r)})}function y(s){const o=c(400);a(`${e}.>`,t=>{var n;if(!s||!(t.workflowId===s||((n=t.workflowId)==null?void 0:n.includes(s))))return;const u=t.type.split(".")[0],r=f(t);u==="escalation"&&r.push(["escalations","by-workflow",s]),o(r)})}function E(s){const o=c(300),t=l.useCallback(i=>{s&&(i.originId!==s&&i.workflowId!==s||o([["processes",s]]))},[s,o]);a(`${e}.task.>`,t),a(`${e}.workflow.>`,t),a(`${e}.escalation.>`,t)}function b(){const s=c(300);a(`${e}.escalation.>`,()=>{s([["escalationStats"]])})}function I(){const s=c(300);a(`${e}.escalation.>`,()=>{s([["escalations"]])})}function m(s){const o=c(300);a(`${e}.escalation.>`,t=>{s&&t.escalationId===s&&o([["escalations",s],["escalations"],["escalationStats"]])})}function S(){const s=c(300);a(`${e}.task.>`,()=>{s([["processes"]])}),a(`${e}.workflow.>`,()=>{s([["processes"]])})}export{E as a,d as b,y as c,b as d,I as e,m as f,h as g,S as u};
|
|
2
|
+
//# sourceMappingURL=useEventHooks-BHMbzR_y.js.map
|
package/dashboard/dist/assets/{useEventHooks-anv_B2Yy.js.map → useEventHooks-BHMbzR_y.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useEventHooks-anv_B2Yy.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 category = event.type.split('.')[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 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 default:\n keys.push(['jobs']);\n keys.push(['tasks']);\n break;\n }\n\n return keys;\n}\n","import { useRef, useCallback } from 'react';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { useEventSubscription } from './useEventContext';\nimport { getInvalidationKeys } from '../lib/events/invalidation';\nimport { NATS_SUBJECT_PREFIX } from '../lib/nats/config';\n\n/**\n * Debounced query invalidation. Collects query keys over a window\n * and fires a single batch invalidation, preventing rapid re-renders\n * when multiple events arrive in quick succession.\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) clearTimeout(timer.current);\n timer.current = setTimeout(() => {\n for (const raw of pendingKeys.current) {\n qc.invalidateQueries({ queryKey: JSON.parse(raw) });\n }\n pendingKeys.current.clear();\n timer.current = null;\n }, delayMs);\n }, [qc, delayMs]);\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}.task.>`, () => {\n invalidate([['jobs']]);\n });\n\n useEventSubscription(`${NATS_SUBJECT_PREFIX}.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 useEventSubscription(`${NATS_SUBJECT_PREFIX}.>`, (event) => {\n if (!workflowId) return;\n\n const isRelated = event.workflowId === workflowId\n || event.workflowId?.includes(workflowId);\n if (!isRelated) return;\n\n const category = event.type.split('.')[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 useEventSubscription(`${NATS_SUBJECT_PREFIX}.>`, (event) => {\n if (!workflowId) return;\n\n const isRelated = event.workflowId === workflowId\n || event.workflowId?.includes(workflowId);\n if (!isRelated) return;\n\n const category = event.type.split('.')[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 useEventSubscription(`${NATS_SUBJECT_PREFIX}.>`, (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}.task.>`, handler);\n useEventSubscription(`${NATS_SUBJECT_PREFIX}.workflow.>`, handler);\n useEventSubscription(`${NATS_SUBJECT_PREFIX}.escalation.>`, handler);\n}\n\n/**\n * Invalidate escalation stats (EscalationsOverview) on escalation events.\n */\nexport function useEscalationStatsEvents(): void {\n const invalidate = useDebouncedInvalidation(300);\n\n useEventSubscription(`${NATS_SUBJECT_PREFIX}.escalation.>`, () => {\n invalidate([['escalationStats']]);\n });\n}\n\n/**\n * Invalidate escalation list queries on escalation events.\n */\nexport function useEscalationListEvents(): void {\n const invalidate = useDebouncedInvalidation(300);\n\n useEventSubscription(`${NATS_SUBJECT_PREFIX}.escalation.>`, () => {\n invalidate([['escalations']]);\n });\n}\n\n/**\n * Invalidate a single escalation detail on escalation events for that ID.\n */\nexport function useEscalationDetailEvents(escalationId: string | undefined): void {\n const invalidate = useDebouncedInvalidation(300);\n\n useEventSubscription(`${NATS_SUBJECT_PREFIX}.escalation.>`, (event) => {\n if (!escalationId) return;\n if (event.escalationId === escalationId) {\n invalidate([['escalations', escalationId], ['escalations'], ['escalationStats']]);\n }\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}.task.>`, () => {\n invalidate([['processes']]);\n });\n\n useEventSubscription(`${NATS_SUBJECT_PREFIX}.workflow.>`, () => {\n invalidate([['processes']]);\n });\n}\n"],"names":["getInvalidationKeys","event","keys","useDebouncedInvalidation","delayMs","qc","useQueryClient","pendingKeys","useRef","timer","useCallback","key","raw","useWorkflowListEvents","invalidate","useEventSubscription","NATS_SUBJECT_PREFIX","useWorkflowDetailEvents","workflowId","_a","category","useMcpQueryDetailEvents","useProcessDetailEvents","originId","handler","useEscalationStatsEvents","useEscalationListEvents","useEscalationDetailEvents","escalationId","useProcessListEvents"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useEventHooks-BHMbzR_y.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 category = event.type.split('.')[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 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 default:\n keys.push(['jobs']);\n keys.push(['tasks']);\n break;\n }\n\n return keys;\n}\n","import { useRef, useCallback } from 'react';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { useEventSubscription } from './useEventContext';\nimport { getInvalidationKeys } from '../lib/events/invalidation';\nimport { NATS_SUBJECT_PREFIX } from '../lib/nats/config';\n\n/**\n * Debounced query invalidation. Collects query keys over a window\n * and fires a single batch invalidation, preventing rapid re-renders\n * when multiple events arrive in quick succession.\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) clearTimeout(timer.current);\n timer.current = setTimeout(() => {\n for (const raw of pendingKeys.current) {\n qc.invalidateQueries({ queryKey: JSON.parse(raw) });\n }\n pendingKeys.current.clear();\n timer.current = null;\n }, delayMs);\n }, [qc, delayMs]);\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}.task.>`, () => {\n invalidate([['jobs']]);\n });\n\n useEventSubscription(`${NATS_SUBJECT_PREFIX}.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 useEventSubscription(`${NATS_SUBJECT_PREFIX}.>`, (event) => {\n if (!workflowId) return;\n\n const isRelated = event.workflowId === workflowId\n || event.workflowId?.includes(workflowId);\n if (!isRelated) return;\n\n const category = event.type.split('.')[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 useEventSubscription(`${NATS_SUBJECT_PREFIX}.>`, (event) => {\n if (!workflowId) return;\n\n const isRelated = event.workflowId === workflowId\n || event.workflowId?.includes(workflowId);\n if (!isRelated) return;\n\n const category = event.type.split('.')[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 useEventSubscription(`${NATS_SUBJECT_PREFIX}.>`, (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}.task.>`, handler);\n useEventSubscription(`${NATS_SUBJECT_PREFIX}.workflow.>`, handler);\n useEventSubscription(`${NATS_SUBJECT_PREFIX}.escalation.>`, handler);\n}\n\n/**\n * Invalidate escalation stats (EscalationsOverview) on escalation events.\n */\nexport function useEscalationStatsEvents(): void {\n const invalidate = useDebouncedInvalidation(300);\n\n useEventSubscription(`${NATS_SUBJECT_PREFIX}.escalation.>`, () => {\n invalidate([['escalationStats']]);\n });\n}\n\n/**\n * Invalidate escalation list queries on escalation events.\n */\nexport function useEscalationListEvents(): void {\n const invalidate = useDebouncedInvalidation(300);\n\n useEventSubscription(`${NATS_SUBJECT_PREFIX}.escalation.>`, () => {\n invalidate([['escalations']]);\n });\n}\n\n/**\n * Invalidate a single escalation detail on escalation events for that ID.\n */\nexport function useEscalationDetailEvents(escalationId: string | undefined): void {\n const invalidate = useDebouncedInvalidation(300);\n\n useEventSubscription(`${NATS_SUBJECT_PREFIX}.escalation.>`, (event) => {\n if (!escalationId) return;\n if (event.escalationId === escalationId) {\n invalidate([['escalations', escalationId], ['escalations'], ['escalationStats']]);\n }\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}.task.>`, () => {\n invalidate([['processes']]);\n });\n\n useEventSubscription(`${NATS_SUBJECT_PREFIX}.workflow.>`, () => {\n invalidate([['processes']]);\n });\n}\n"],"names":["getInvalidationKeys","event","keys","useDebouncedInvalidation","delayMs","qc","useQueryClient","pendingKeys","useRef","timer","useCallback","key","raw","useWorkflowListEvents","invalidate","useEventSubscription","NATS_SUBJECT_PREFIX","useWorkflowDetailEvents","workflowId","_a","category","useMcpQueryDetailEvents","useProcessDetailEvents","originId","handler","useEscalationStatsEvents","useEscalationListEvents","useEscalationDetailEvents","escalationId","useProcessListEvents"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as t}from"./vendor-query-DLp59M9_.js";import{f as F}from"./vendor-react-Co3Y8ikm.js";function N(z){var h,C;const m=t.useRef(z),f=((h=m.current)==null?void 0:h.filters)??{},p=t.useMemo(()=>Object.keys(f),[]),i=((C=m.current)==null?void 0:C.pageSize)??25,[a,b]=F(),d=t.useRef(b);t.useEffect(()=>{d.current=b});const R=t.useMemo(()=>{const e={};for(const s of p)e[s]=a.get(s)??f[s];return e},[a,p,f]),l=Number(a.get("page"))||1,o=Number(a.get("pageSize"))||i,S=t.useMemo(()=>(l-1)*o,[l,o]),r=t.useCallback((e,s=!1)=>{d.current(g=>{const n=new URLSearchParams(g);for(const[M,u]of Object.entries(e))u===null||u===""||u===void 0?n.delete(M):n.set(M,u);return n},{replace:s})},[]),_=t.useCallback((e,s)=>{r({[e]:s||null,page:null})},[r]),x=t.useCallback(e=>{const s={page:null};for(const[g,n]of Object.entries(e))s[g]=n||null;r(s)},[r]),k=t.useCallback(e=>{r({page:e<=1?null:String(e)},!0)},[r]),P=t.useCallback(e=>{r({pageSize:e===i?null:String(e),page:null},!0)},[r,i]),y=t.useCallback(e=>Math.max(1,Math.ceil(e/o)),[o]),j=t.useMemo(()=>({page:l,pageSize:o,offset:S,setPage:k,setPageSize:P,totalPages:y}),[l,o,S,k,P,y]),c=t.useMemo(()=>({sort_by:a.get("sort_by")??"",order:a.get("order")||"desc"}),[a]),v=t.useCallback(e=>{const s=c.sort_by===e;r({sort_by:e||null,order:s&&c.order==="desc"?"asc":"desc",page:null})},[c.sort_by,c.order,r]);return{filters:R,setFilter:_,setFilters:x,pagination:j,sort:c,setSort:v}}export{N as u};
|
|
2
|
+
//# sourceMappingURL=useFilterParams-CGRYFw_A.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFilterParams-CGRYFw_A.js","sources":["../../src/hooks/useFilterParams.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef } from 'react';\nimport { useSearchParams } from 'react-router-dom';\n\ninterface PaginationState {\n page: number;\n pageSize: number;\n offset: number;\n setPage: (page: number) => void;\n setPageSize: (size: number) => void;\n totalPages: (total: number) => number;\n}\n\nexport interface SortState {\n sort_by: string;\n order: 'asc' | 'desc';\n}\n\ninterface UseFilterParamsResult<F extends Record<string, string>> {\n /** Current filter values, read from URL search params. */\n filters: F;\n /** Set a single filter. Resets page to 1. */\n setFilter: (key: keyof F, value: string) => void;\n /** Set multiple filters at once. Resets page to 1. */\n setFilters: (updates: Partial<F>) => void;\n /** Pagination state — same interface as usePagination. */\n pagination: PaginationState;\n /** Current sort state (from URL params). */\n sort: SortState;\n /** Toggle sort: if same column, flip direction; if different, default DESC. */\n setSort: (column: string) => void;\n}\n\n/**\n * Unified hook that syncs filter values and pagination with URL search params.\n *\n * - Deep-linking: landing on `?role=reviewer&page=3` pre-fills filters and pagination\n * - Clean URLs: default values (page 1, pageSize 25, empty strings) are omitted\n * - Replace mode: filter changes don't pollute browser history\n * - Auto-reset: changing any filter resets page to 1\n */\nexport function useFilterParams<F extends Record<string, string> = Record<string, string>>(\n options?: { filters?: F; pageSize?: number },\n): UseFilterParamsResult<F> {\n // Freeze config on first render to prevent re-render loops from inline objects\n const configRef = useRef(options);\n const filterDefaults = (configRef.current?.filters ?? {}) as F;\n const filterKeys = useMemo(() => Object.keys(filterDefaults), []);\n const defaultPageSize = configRef.current?.pageSize ?? 25;\n\n const [searchParams, setSearchParams] = useSearchParams();\n\n // Keep a stable ref to setSearchParams so downstream callbacks never change identity\n const setSearchParamsRef = useRef(setSearchParams);\n useEffect(() => { setSearchParamsRef.current = setSearchParams; });\n\n // ── Read current values from URL ──────────────────────────────────────────\n\n const filters = useMemo(() => {\n const result = {} as Record<string, string>;\n for (const key of filterKeys) {\n result[key] = searchParams.get(key) ?? filterDefaults[key];\n }\n return result as F;\n }, [searchParams, filterKeys, filterDefaults]);\n\n const page = Number(searchParams.get('page')) || 1;\n const pageSize = Number(searchParams.get('pageSize')) || defaultPageSize;\n const offset = useMemo(() => (page - 1) * pageSize, [page, pageSize]);\n\n // ── Batch-update helper ───────────────────────────────────────────────────\n\n const updateParams = useCallback(\n (updates: Record<string, string | null>, replace = false) => {\n setSearchParamsRef.current(\n (prev) => {\n const next = new URLSearchParams(prev);\n for (const [k, v] of Object.entries(updates)) {\n if (v === null || v === '' || v === undefined) {\n next.delete(k);\n } else {\n next.set(k, v);\n }\n }\n return next;\n },\n { replace },\n );\n },\n [],\n );\n\n // ── Filter setters (auto-reset page) ──────────────────────────────────────\n\n const setFilter = useCallback(\n (key: keyof F, value: string) => {\n updateParams({ [key as string]: value || null, page: null });\n },\n [updateParams],\n );\n\n const setFilters = useCallback(\n (updates: Partial<F>) => {\n const mapped: Record<string, string | null> = { page: null };\n for (const [k, v] of Object.entries(updates)) {\n mapped[k] = (v as string) || null;\n }\n updateParams(mapped);\n },\n [updateParams],\n );\n\n // ── Pagination ────────────────────────────────────────────────────────────\n\n const setPage = useCallback(\n (p: number) => {\n updateParams({ page: p <= 1 ? null : String(p) }, true);\n },\n [updateParams],\n );\n\n const setPageSize = useCallback(\n (size: number) => {\n updateParams({\n pageSize: size === defaultPageSize ? null : String(size),\n page: null,\n }, true);\n },\n [updateParams, defaultPageSize],\n );\n\n const totalPages = useCallback(\n (total: number) => Math.max(1, Math.ceil(total / pageSize)),\n [pageSize],\n );\n\n const pagination: PaginationState = useMemo(\n () => ({ page, pageSize, offset, setPage, setPageSize, totalPages }),\n [page, pageSize, offset, setPage, setPageSize, totalPages],\n );\n\n // ── Sort ─────────────────────────────────────────────────────────────────\n\n const sort: SortState = useMemo(\n () => ({\n sort_by: searchParams.get('sort_by') ?? '',\n order: (searchParams.get('order') as 'asc' | 'desc') || 'desc',\n }),\n [searchParams],\n );\n\n const setSort = useCallback(\n (column: string) => {\n const isSame = sort.sort_by === column;\n updateParams({\n sort_by: column || null,\n order: isSame ? (sort.order === 'desc' ? 'asc' : 'desc') : 'desc',\n page: null,\n });\n },\n [sort.sort_by, sort.order, updateParams],\n );\n\n return { filters, setFilter, setFilters, pagination, sort, setSort };\n}\n"],"names":["useFilterParams","options","configRef","useRef","filterDefaults","_a","filterKeys","useMemo","defaultPageSize","_b","searchParams","setSearchParams","useSearchParams","setSearchParamsRef","useEffect","filters","result","key","page","pageSize","offset","updateParams","useCallback","updates","replace","prev","next","k","v","setFilter","value","setFilters","mapped","setPage","p","setPageSize","size","totalPages","total","pagination","sort","setSort","column","isSame"],"mappings":"8FAwCO,SAASA,EACdC,EAC0B,SAE1B,MAAMC,EAAYC,EAAAA,OAAOF,CAAO,EAC1BG,IAAkBC,EAAAH,EAAU,UAAV,YAAAG,EAAmB,UAAW,CAAA,EAChDC,EAAaC,EAAAA,QAAQ,IAAM,OAAO,KAAKH,CAAc,EAAG,EAAE,EAC1DI,IAAkBC,EAAAP,EAAU,UAAV,YAAAO,EAAmB,WAAY,GAEjD,CAACC,EAAcC,CAAe,EAAIC,EAAA,EAGlCC,EAAqBV,EAAAA,OAAOQ,CAAe,EACjDG,EAAAA,UAAU,IAAM,CAAED,EAAmB,QAAUF,CAAiB,CAAC,EAIjE,MAAMI,EAAUR,EAAAA,QAAQ,IAAM,CAC5B,MAAMS,EAAS,CAAA,EACf,UAAWC,KAAOX,EAChBU,EAAOC,CAAG,EAAIP,EAAa,IAAIO,CAAG,GAAKb,EAAea,CAAG,EAE3D,OAAOD,CACT,EAAG,CAACN,EAAcJ,EAAYF,CAAc,CAAC,EAEvCc,EAAO,OAAOR,EAAa,IAAI,MAAM,CAAC,GAAK,EAC3CS,EAAW,OAAOT,EAAa,IAAI,UAAU,CAAC,GAAKF,EACnDY,EAASb,UAAQ,KAAOW,EAAO,GAAKC,EAAU,CAACD,EAAMC,CAAQ,CAAC,EAI9DE,EAAeC,EAAAA,YACnB,CAACC,EAAwCC,EAAU,KAAU,CAC3DX,EAAmB,QAChBY,GAAS,CACR,MAAMC,EAAO,IAAI,gBAAgBD,CAAI,EACrC,SAAW,CAACE,EAAGC,CAAC,IAAK,OAAO,QAAQL,CAAO,EACrCK,IAAM,MAAQA,IAAM,IAAMA,IAAM,OAClCF,EAAK,OAAOC,CAAC,EAEbD,EAAK,IAAIC,EAAGC,CAAC,EAGjB,OAAOF,CACT,EACA,CAAE,QAAAF,CAAA,CAAQ,CAEd,EACA,CAAA,CAAC,EAKGK,EAAYP,EAAAA,YAChB,CAACL,EAAca,IAAkB,CAC/BT,EAAa,CAAE,CAACJ,CAAa,EAAGa,GAAS,KAAM,KAAM,KAAM,CAC7D,EACA,CAACT,CAAY,CAAA,EAGTU,EAAaT,EAAAA,YAChBC,GAAwB,CACvB,MAAMS,EAAwC,CAAE,KAAM,IAAA,EACtD,SAAW,CAACL,EAAGC,CAAC,IAAK,OAAO,QAAQL,CAAO,EACzCS,EAAOL,CAAC,EAAKC,GAAgB,KAE/BP,EAAaW,CAAM,CACrB,EACA,CAACX,CAAY,CAAA,EAKTY,EAAUX,EAAAA,YACbY,GAAc,CACbb,EAAa,CAAE,KAAMa,GAAK,EAAI,KAAO,OAAOA,CAAC,CAAA,EAAK,EAAI,CACxD,EACA,CAACb,CAAY,CAAA,EAGTc,EAAcb,EAAAA,YACjBc,GAAiB,CAChBf,EAAa,CACX,SAAUe,IAAS5B,EAAkB,KAAO,OAAO4B,CAAI,EACvD,KAAM,IAAA,EACL,EAAI,CACT,EACA,CAACf,EAAcb,CAAe,CAAA,EAG1B6B,EAAaf,EAAAA,YAChBgB,GAAkB,KAAK,IAAI,EAAG,KAAK,KAAKA,EAAQnB,CAAQ,CAAC,EAC1D,CAACA,CAAQ,CAAA,EAGLoB,EAA8BhC,EAAAA,QAClC,KAAO,CAAE,KAAAW,EAAM,SAAAC,EAAU,OAAAC,EAAQ,QAAAa,EAAS,YAAAE,EAAa,WAAAE,IACvD,CAACnB,EAAMC,EAAUC,EAAQa,EAASE,EAAaE,CAAU,CAAA,EAKrDG,EAAkBjC,EAAAA,QACtB,KAAO,CACL,QAASG,EAAa,IAAI,SAAS,GAAK,GACxC,MAAQA,EAAa,IAAI,OAAO,GAAwB,MAAA,GAE1D,CAACA,CAAY,CAAA,EAGT+B,EAAUnB,EAAAA,YACboB,GAAmB,CAClB,MAAMC,EAASH,EAAK,UAAYE,EAChCrB,EAAa,CACX,QAASqB,GAAU,KACnB,MAAOC,GAAUH,EAAK,QAAU,OAAS,MAAkB,OAC3D,KAAM,IAAA,CACP,CACH,EACA,CAACA,EAAK,QAASA,EAAK,MAAOnB,CAAY,CAAA,EAGzC,MAAO,CAAE,QAAAN,EAAS,UAAAc,EAAW,WAAAE,EAAY,WAAAQ,EAAY,KAAAC,EAAM,QAAAC,CAAA,CAC7D"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{u as p,b as d,c as w,a as S}from"./vendor-query-DLp59M9_.js";import{b as c,u as g,N as v}from"./index-Cmgrk7PQ.js";const l=["workflowSets"];function C(t={}){const s=new URLSearchParams;return t.status&&s.set("status",t.status),t.search&&s.set("search",t.search),t.limit&&s.set("limit",String(t.limit)),t.offset!==void 0&&s.set("offset",String(t.offset)),p({queryKey:[...l,t],queryFn:()=>c(`/workflow-sets?${s}`)})}function E(t){return p({queryKey:[...l,t],queryFn:()=>c(`/workflow-sets/${t}`),enabled:!!t,refetchInterval:s=>{var u;const r=(u=s.state.data)==null?void 0:u.status;return!r||r==="completed"||r==="failed"?!1:3e3}})}function I(){const t=d();return w({mutationFn:s=>c("/workflow-sets",{method:"POST",body:JSON.stringify(s)}),onSuccess:()=>{t.invalidateQueries({queryKey:l,refetchType:"all"})}})}function K(){const t=d();return w({mutationFn:({id:s,...r})=>c(`/workflow-sets/${s}/add`,{method:"POST",body:JSON.stringify(r)}),onSuccess:()=>{t.invalidateQueries({queryKey:l,refetchType:"all"}),t.invalidateQueries({queryKey:["yamlWorkflows"],refetchType:"all"})}})}function N(t){const[s,r]=S.useState([]),u=S.useCallback(i=>{var m;if(!t||i.workflowId!==t||((m=i.type)==null?void 0:m.split(".")[0])!=="activity")return;const a=i.activityName,e=i.data,y=i.type;r(n=>{const f=n.find(o=>o.activityId===a);return y==="activity.started"?f?n.map(o=>o.activityId===a?{...o,status:"running"}:o):[...n,{activityId:a,title:(e==null?void 0:e.title)||a,toolName:e==null?void 0:e.toolName,toolSource:e==null?void 0:e.toolSource,stepIndex:(e==null?void 0:e.stepIndex)??n.length,totalSteps:(e==null?void 0:e.totalSteps)??0,status:"running"}]:y==="activity.completed"&&f?n.map(o=>o.activityId===a?{...o,status:"completed"}:o):y==="activity.failed"&&f?n.map(o=>o.activityId===a?{...o,status:"failed",error:e==null?void 0:e.error}:o):n})},[t]);g(t?`${v}.activity.>`:"",u);const h=s.length>0&&s.every(i=>i.status==="completed"||i.status==="failed"),k=s.some(i=>i.status==="failed");return{steps:s,isComplete:h,isFailed:k}}export{E as a,K as b,I as c,C as d,N as u};
|
|
2
|
+
//# sourceMappingURL=useYamlActivityEvents-D56KV14X.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useYamlActivityEvents-D56KV14X.js","sources":["../../src/api/workflow-sets.ts","../../src/hooks/useYamlActivityEvents.ts"],"sourcesContent":["import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { apiFetch } from './client';\nimport type { WorkflowSetRecord, PlanItem } from './types';\n\n// ── Query keys ──────────────────────────────────────────────────────────────\n\nexport const WORKFLOW_SETS_KEY = ['workflowSets'] as const;\n\n// ── Hooks ───────────────────────────────────────────────────────────────────\n\n/** List workflow sets with optional filters. */\nexport function useWorkflowSets(filters: {\n status?: string;\n search?: string;\n limit?: number;\n offset?: number;\n} = {}) {\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.limit) params.set('limit', String(filters.limit));\n if (filters.offset !== undefined) params.set('offset', String(filters.offset));\n\n return useQuery<{ sets: WorkflowSetRecord[]; total: number }>({\n queryKey: [...WORKFLOW_SETS_KEY, filters],\n queryFn: () => apiFetch(`/workflow-sets?${params}`),\n });\n}\n\n/** Get a single workflow set by ID. Polls while status is non-terminal. */\nexport function useWorkflowSet(id: string | undefined) {\n return useQuery<WorkflowSetRecord>({\n queryKey: [...WORKFLOW_SETS_KEY, id],\n queryFn: () => apiFetch(`/workflow-sets/${id}`),\n enabled: !!id,\n refetchInterval: (query) => {\n const status = query.state.data?.status;\n if (!status || status === 'completed' || status === 'failed') return false;\n return 3000;\n },\n });\n}\n\n/** Create a new workflow set from a specification. */\nexport function useCreateWorkflowSet() {\n const queryClient = useQueryClient();\n return useMutation<WorkflowSetRecord & { planner_workflow_id: string }, Error, {\n name: string;\n description?: string;\n specification: string;\n }>({\n mutationFn: (params) =>\n apiFetch('/workflow-sets', {\n method: 'POST',\n body: JSON.stringify(params),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: WORKFLOW_SETS_KEY, refetchType: 'all' });\n },\n });\n}\n\n/** Update a workflow set's plan (engineer adjustments). */\nexport function useUpdateWorkflowSetPlan() {\n const queryClient = useQueryClient();\n return useMutation<WorkflowSetRecord, Error, {\n id: string;\n plan: PlanItem[];\n namespaces?: string[];\n }>({\n mutationFn: ({ id, ...body }) =>\n apiFetch(`/workflow-sets/${id}/plan`, {\n method: 'PUT',\n body: JSON.stringify(body),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: WORKFLOW_SETS_KEY, refetchType: 'all' });\n },\n });\n}\n\n/** Add additional workflows to an existing set. */\nexport function useAddToWorkflowSet() {\n const queryClient = useQueryClient();\n return useMutation<WorkflowSetRecord & { planner_workflow_id: string }, Error, {\n id: string;\n specification: string;\n }>({\n mutationFn: ({ id, ...body }) =>\n apiFetch(`/workflow-sets/${id}/add`, {\n method: 'POST',\n body: JSON.stringify(body),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: WORKFLOW_SETS_KEY, refetchType: 'all' });\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\n/** Trigger build phase for a workflow set. */\nexport function useBuildWorkflowSet() {\n const queryClient = useQueryClient();\n return useMutation<{ status: string; id: string }, Error, string>({\n mutationFn: (id) =>\n apiFetch(`/workflow-sets/${id}/build`, { method: 'POST' }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: WORKFLOW_SETS_KEY, refetchType: 'all' });\n },\n });\n}\n\n/** Deploy all namespaces in a workflow set. */\nexport function useDeployWorkflowSet() {\n const queryClient = useQueryClient();\n return useMutation<{ status: string; id: string }, Error, string>({\n mutationFn: (id) =>\n apiFetch(`/workflow-sets/${id}/deploy`, { method: 'POST' }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: WORKFLOW_SETS_KEY, refetchType: 'all' });\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n","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 events for a specific YAML workflow job.\n * Returns live step progress as events arrive.\n */\nexport function useYamlActivityEvents(jobId: string | null): {\n steps: ActivityStep[];\n isComplete: boolean;\n isFailed: boolean;\n} {\n const [steps, setSteps] = useState<ActivityStep[]>([]);\n\n const handler = useCallback((event: any) => {\n if (!jobId || event.workflowId !== jobId) return;\n const category = event.type?.split('.')[0];\n if (category !== 'activity') return;\n\n const activityId = event.activityName as string;\n const data = event.data as Record<string, any> | undefined;\n const eventType = event.type as string;\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 useEventSubscription(\n jobId ? `${NATS_SUBJECT_PREFIX}.activity.>` : '',\n handler,\n );\n\n const isComplete = steps.length > 0 && steps.every((s) => s.status === 'completed' || s.status === 'failed');\n const isFailed = steps.some((s) => s.status === 'failed');\n\n return { steps, isComplete, isFailed };\n}\n"],"names":["WORKFLOW_SETS_KEY","useWorkflowSets","filters","params","useQuery","apiFetch","useWorkflowSet","id","query","status","_a","useCreateWorkflowSet","queryClient","useQueryClient","useMutation","useAddToWorkflowSet","body","useYamlActivityEvents","jobId","steps","setSteps","useState","handler","useCallback","event","activityId","data","eventType","prev","existing","s","useEventSubscription","NATS_SUBJECT_PREFIX","isComplete","isFailed"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{u as o,b as t,c as n}from"./vendor-query-DLp59M9_.js";import{b as u}from"./index-
|
|
2
|
-
//# sourceMappingURL=users-
|
|
1
|
+
import{u as o,b as t,c as n}from"./vendor-query-DLp59M9_.js";import{b as u}from"./index-Cmgrk7PQ.js";function c(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.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 m(e){return o({queryKey:["users",e],queryFn:()=>u(`/users/${e}`),enabled:!!e})}function d(){const e=t();return n({mutationFn:s=>u("/users",{method:"POST",body:JSON.stringify(s)}),onSuccess:()=>{e.invalidateQueries({queryKey:["users"]})}})}function l(){const e=t();return n({mutationFn:({id:s,...r})=>u(`/users/${s}`,{method:"PUT",body:JSON.stringify(r)}),onSuccess:()=>{e.invalidateQueries({queryKey:["users"]})}})}function f(){const e=t();return n({mutationFn:s=>u(`/users/${s}`,{method:"DELETE"}),onSuccess:()=>{e.invalidateQueries({queryKey:["users"]})}})}function q(){const e=t();return n({mutationFn:({userId:s,role:r,type:i})=>u(`/users/${s}/roles`,{method:"POST",body:JSON.stringify({role:r,type:i})}),onSuccess:()=>{e.invalidateQueries({queryKey:["users"]})}})}function S(){const e=t();return n({mutationFn:({userId:s,role:r})=>u(`/users/${s}/roles/${encodeURIComponent(r)}`,{method:"DELETE"}),onSuccess:()=>{e.invalidateQueries({queryKey:["users"]})}})}export{m as a,d as b,l as c,q as d,S as e,f,c as u};
|
|
2
|
+
//# sourceMappingURL=users-CxIMy_xw.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"users-
|
|
1
|
+
{"version":3,"file":"users-CxIMy_xw.js","sources":["../../src/api/users.ts"],"sourcesContent":["import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { apiFetch } from './client';\nimport type { LTUserRecord, LTRoleType } from './types';\n\ninterface UserListResponse {\n users: LTUserRecord[];\n total: number;\n}\n\ninterface UserFilters {\n role?: string;\n roleType?: string;\n status?: string;\n limit?: number;\n offset?: number;\n}\n\nexport function useUsers(filters: UserFilters = {}) {\n const params = new URLSearchParams();\n if (filters.role) params.set('role', filters.role);\n if (filters.roleType) params.set('roleType', filters.roleType);\n if (filters.status) params.set('status', filters.status);\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<UserListResponse>({\n queryKey: ['users', filters],\n queryFn: () => apiFetch(`/users?${params}`),\n });\n}\n\nexport function useUser(id: string) {\n return useQuery<LTUserRecord>({\n queryKey: ['users', id],\n queryFn: () => apiFetch(`/users/${id}`),\n enabled: !!id,\n });\n}\n\nexport function useCreateUser() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (data: {\n external_id: string;\n email?: string;\n display_name?: string;\n password?: string;\n roles?: { role: string; type: LTRoleType }[];\n }) =>\n apiFetch('/users', {\n method: 'POST',\n body: JSON.stringify(data),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['users'] });\n },\n });\n}\n\nexport function useUpdateUser() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({\n id,\n ...data\n }: {\n id: string;\n email?: string;\n display_name?: string;\n status?: string;\n }) =>\n apiFetch(`/users/${id}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['users'] });\n },\n });\n}\n\nexport function useDeleteUser() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch(`/users/${id}`, { method: 'DELETE' }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['users'] });\n },\n });\n}\n\nexport function useAddUserRole() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({\n userId,\n role,\n type,\n }: {\n userId: string;\n role: string;\n type: LTRoleType;\n }) =>\n apiFetch(`/users/${userId}/roles`, {\n method: 'POST',\n body: JSON.stringify({ role, type }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['users'] });\n },\n });\n}\n\nexport function useRemoveUserRole() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ userId, role }: { userId: string; role: string }) =>\n apiFetch(`/users/${userId}/roles/${encodeURIComponent(role)}`, {\n method: 'DELETE',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['users'] });\n },\n });\n}\n"],"names":["useUsers","filters","params","useQuery","apiFetch","useUser","id","useCreateUser","queryClient","useQueryClient","useMutation","data","useUpdateUser","useDeleteUser","useAddUserRole","userId","role","type","useRemoveUserRole"],"mappings":"qGAiBO,SAASA,EAASC,EAAuB,GAAI,CAClD,MAAMC,EAAS,IAAI,gBACnB,OAAID,EAAQ,MAAMC,EAAO,IAAI,OAAQD,EAAQ,IAAI,EAC7CA,EAAQ,UAAUC,EAAO,IAAI,WAAYD,EAAQ,QAAQ,EACzDA,EAAQ,QAAQC,EAAO,IAAI,SAAUD,EAAQ,MAAM,EACnDA,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,CAEO,SAASC,GAAgB,CAC9B,MAAMC,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAaC,GAOXP,EAAS,SAAU,CACjB,OAAQ,OACR,KAAM,KAAK,UAAUO,CAAI,CAAA,CAC1B,EACH,UAAW,IAAM,CACfH,EAAY,kBAAkB,CAAE,SAAU,CAAC,OAAO,EAAG,CACvD,CAAA,CACD,CACH,CAEO,SAASI,GAAgB,CAC9B,MAAMJ,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAY,CAAC,CACX,GAAAJ,EACA,GAAGK,CAAA,IAOHP,EAAS,UAAUE,CAAE,GAAI,CACvB,OAAQ,MACR,KAAM,KAAK,UAAUK,CAAI,CAAA,CAC1B,EACH,UAAW,IAAM,CACfH,EAAY,kBAAkB,CAAE,SAAU,CAAC,OAAO,EAAG,CACvD,CAAA,CACD,CACH,CAEO,SAASK,GAAgB,CAC9B,MAAML,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAaJ,GACXF,EAAS,UAAUE,CAAE,GAAI,CAAE,OAAQ,SAAU,EAC/C,UAAW,IAAM,CACfE,EAAY,kBAAkB,CAAE,SAAU,CAAC,OAAO,EAAG,CACvD,CAAA,CACD,CACH,CAEO,SAASM,GAAiB,CAC/B,MAAMN,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAY,CAAC,CACX,OAAAK,EACA,KAAAC,EACA,KAAAC,CAAA,IAMAb,EAAS,UAAUW,CAAM,SAAU,CACjC,OAAQ,OACR,KAAM,KAAK,UAAU,CAAE,KAAAC,EAAM,KAAAC,EAAM,CAAA,CACpC,EACH,UAAW,IAAM,CACfT,EAAY,kBAAkB,CAAE,SAAU,CAAC,OAAO,EAAG,CACvD,CAAA,CACD,CACH,CAEO,SAASU,GAAoB,CAClC,MAAMV,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAY,CAAC,CAAE,OAAAK,EAAQ,KAAAC,CAAA,IACrBZ,EAAS,UAAUW,CAAM,UAAU,mBAAmBC,CAAI,CAAC,GAAI,CAC7D,OAAQ,QAAA,CACT,EACH,UAAW,IAAM,CACfR,EAAY,kBAAkB,CAAE,SAAU,CAAC,OAAO,EAAG,CACvD,CAAA,CACD,CACH"}
|