@hotmeshio/long-tail 0.1.6 → 0.1.7
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 +44 -4
- package/build/api/auth.d.ts +5 -0
- package/build/api/auth.js +42 -0
- package/build/api/bot-accounts.d.ts +50 -0
- package/build/api/bot-accounts.js +215 -0
- package/build/api/controlplane.d.ts +20 -0
- package/build/api/controlplane.js +110 -0
- package/build/api/dba.d.ts +15 -0
- package/build/api/dba.js +68 -0
- package/build/api/escalations.d.ts +70 -0
- package/build/api/escalations.js +656 -0
- package/build/api/exports.d.ts +32 -0
- package/build/api/exports.js +146 -0
- package/build/api/index.d.ts +18 -0
- package/build/api/index.js +54 -0
- package/build/api/insight.d.ts +29 -0
- package/build/api/insight.js +90 -0
- package/build/api/maintenance.d.ts +7 -0
- package/build/api/maintenance.js +28 -0
- package/build/api/mcp-runs.d.ts +16 -0
- package/build/api/mcp-runs.js +62 -0
- package/build/api/mcp.d.ts +52 -0
- package/build/api/mcp.js +212 -0
- package/build/api/namespaces.d.ts +7 -0
- package/build/{routes/escalations/helpers.js → api/namespaces.js} +24 -12
- package/build/api/roles.d.ts +25 -0
- package/build/api/roles.js +159 -0
- package/build/api/settings.d.ts +2 -0
- package/build/api/settings.js +35 -0
- package/build/api/tasks.d.ts +27 -0
- package/build/api/tasks.js +96 -0
- package/build/api/users.d.ts +44 -0
- package/build/api/users.js +162 -0
- package/build/api/workflow-sets.d.ts +26 -0
- package/build/api/workflow-sets.js +119 -0
- package/build/api/workflows.d.ts +48 -0
- package/build/api/workflows.js +298 -0
- package/build/api/yaml-workflows.d.ts +87 -0
- package/build/api/yaml-workflows.js +556 -0
- package/build/index.d.ts +4 -0
- package/build/index.js +6 -1
- package/build/lib/db/schemas/004_workflow_sets.sql +29 -0
- package/build/lib/db/schemas/005_unique_graph_topic.sql +7 -0
- package/build/lib/db/schemas/011_system_workflow_configs.sql +7 -0
- package/build/lib/events/callback.d.ts +41 -0
- package/build/lib/events/callback.js +98 -0
- package/build/modules/config.js +1 -1
- package/build/routes/auth.js +37 -36
- package/build/routes/bot-accounts.js +34 -164
- package/build/routes/controlplane.js +20 -60
- package/build/routes/dba.js +18 -28
- package/build/routes/escalations/bulk.js +17 -192
- package/build/routes/escalations/list.js +29 -75
- package/build/routes/escalations/resolve.js +3 -193
- package/build/routes/escalations/single.js +13 -122
- package/build/routes/exports.js +44 -95
- package/build/routes/index.js +2 -0
- package/build/routes/insight.js +46 -88
- package/build/routes/maintenance.js +41 -17
- package/build/routes/mcp-runs.js +52 -60
- package/build/routes/mcp.js +49 -177
- package/build/routes/namespaces.js +9 -20
- package/build/routes/roles.js +23 -97
- package/build/routes/settings.js +37 -25
- package/build/routes/tasks.js +28 -64
- package/build/routes/users.js +24 -113
- package/build/routes/workflow-sets.d.ts +2 -0
- package/build/routes/workflow-sets.js +98 -0
- package/build/routes/workflows/config.js +23 -57
- package/build/routes/workflows/discovery.js +11 -85
- package/build/routes/workflows/invocation.js +16 -84
- package/build/routes/yaml-workflows/cron.js +12 -61
- package/build/routes/yaml-workflows/crud.js +30 -223
- package/build/routes/yaml-workflows/deployment.js +15 -115
- package/build/routes/yaml-workflows/versions.js +20 -58
- package/build/sdk/index.d.ts +327 -0
- package/build/sdk/index.js +298 -0
- package/build/services/controlplane/index.d.ts +1 -2
- package/build/services/controlplane/index.js +3 -3
- package/build/services/controlplane/sql.d.ts +2 -2
- package/build/services/controlplane/sql.js +4 -5
- package/build/services/controlplane/types.d.ts +1 -0
- package/build/services/export/index.js +6 -1
- package/build/services/hotmesh-utils.js +2 -4
- package/build/services/insight/index.d.ts +7 -0
- package/build/services/insight/index.js +30 -0
- package/build/services/mcp/client/tools.js +13 -1
- package/build/services/mcp-runs/sql.js +1 -1
- package/build/services/workflow-sets/db.d.ts +16 -0
- package/build/services/workflow-sets/db.js +78 -0
- package/build/services/workflow-sets/index.d.ts +1 -0
- package/build/services/workflow-sets/index.js +11 -0
- package/build/services/workflow-sets/sql.d.ts +6 -0
- package/build/services/workflow-sets/sql.js +24 -0
- package/build/services/yaml-workflow/db-utils.d.ts +1 -0
- package/build/services/yaml-workflow/db-utils.js +4 -0
- package/build/services/yaml-workflow/db.d.ts +5 -0
- package/build/services/yaml-workflow/db.js +17 -0
- package/build/services/yaml-workflow/pipeline/build/wiring.js +14 -1
- package/build/services/yaml-workflow/pipeline/prompts.d.ts +1 -1
- package/build/services/yaml-workflow/pipeline/prompts.js +1 -1
- package/build/services/yaml-workflow/sql.d.ts +2 -1
- package/build/services/yaml-workflow/sql.js +8 -3
- package/build/services/yaml-workflow/types.d.ts +3 -0
- package/build/services/yaml-workflow/workers/callbacks.js +7 -1
- package/build/services/yaml-workflow/workers/register.js +7 -0
- package/build/start/adapters.js +4 -0
- package/build/system/index.js +6 -0
- package/build/system/mcp-servers/knowledge.js +1 -1
- package/build/system/seed/server-definitions.js +2 -1
- package/build/system/workflows/mcp-workflow-builder/activities/index.d.ts +1 -1
- package/build/system/workflows/mcp-workflow-builder/activities/index.js +2 -1
- package/build/system/workflows/mcp-workflow-builder/activities/tool-loader.d.ts +6 -0
- package/build/system/workflows/mcp-workflow-builder/activities/tool-loader.js +26 -0
- package/build/system/workflows/mcp-workflow-builder/index.js +26 -2
- package/build/system/workflows/mcp-workflow-builder/prompts.js +104 -35
- package/build/system/workflows/mcp-workflow-planner/activities/analyze.d.ts +11 -0
- package/build/system/workflows/mcp-workflow-planner/activities/analyze.js +36 -0
- package/build/system/workflows/mcp-workflow-planner/activities/index.d.ts +3 -0
- package/build/system/workflows/mcp-workflow-planner/activities/index.js +12 -0
- package/build/system/workflows/mcp-workflow-planner/activities/persist.d.ts +19 -0
- package/build/system/workflows/mcp-workflow-planner/activities/persist.js +55 -0
- package/build/system/workflows/mcp-workflow-planner/activities/plan.d.ts +10 -0
- package/build/system/workflows/mcp-workflow-planner/activities/plan.js +43 -0
- package/build/system/workflows/mcp-workflow-planner/index.d.ts +7 -0
- package/build/system/workflows/mcp-workflow-planner/index.js +152 -0
- package/build/system/workflows/mcp-workflow-planner/prompts.d.ts +7 -0
- package/build/system/workflows/mcp-workflow-planner/prompts.js +77 -0
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/index.d.ts +1 -0
- package/build/types/sdk.d.ts +27 -0
- package/build/types/sdk.js +2 -0
- package/build/types/workflow-set.d.ts +44 -0
- package/build/types/workflow-set.js +5 -0
- package/dashboard/dist/assets/{AdminDashboard-BXkKGkb5.js → AdminDashboard-DRjkRSjJ.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-BXkKGkb5.js.map → AdminDashboard-DRjkRSjJ.js.map} +1 -1
- package/dashboard/dist/assets/{AvailableEscalationsPage-DcH592mc.js → AvailableEscalationsPage-CnivX4Tz.js} +2 -2
- package/dashboard/dist/assets/{AvailableEscalationsPage-DcH592mc.js.map → AvailableEscalationsPage-CnivX4Tz.js.map} +1 -1
- package/dashboard/dist/assets/BotPicker-DwwaBhTH.js +2 -0
- package/dashboard/dist/assets/{BotPicker-A6LtzyuO.js.map → BotPicker-DwwaBhTH.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-C7nL2_mv.js → CollapsibleSection-DQpaVA0M.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-C7nL2_mv.js.map → CollapsibleSection-DQpaVA0M.js.map} +1 -1
- package/dashboard/dist/assets/{ConfirmDeleteModal-CWFwJrSl.js → ConfirmDeleteModal-B7JoDNvt.js} +2 -2
- package/dashboard/dist/assets/{ConfirmDeleteModal-CWFwJrSl.js.map → ConfirmDeleteModal-B7JoDNvt.js.map} +1 -1
- package/dashboard/dist/assets/{CopyableId-DbZ5c3jh.js → CopyableId-AqoZayBG.js} +2 -2
- package/dashboard/dist/assets/{CopyableId-DbZ5c3jh.js.map → CopyableId-AqoZayBG.js.map} +1 -1
- package/dashboard/dist/assets/{CredentialsPage-ClWkmLPu.js → CredentialsPage-qGw1kQzi.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-ClWkmLPu.js.map → CredentialsPage-qGw1kQzi.js.map} +1 -1
- package/dashboard/dist/assets/{CustomDurationPicker-CtH2hReF.js → CustomDurationPicker-D1HUQcd0.js} +2 -2
- package/dashboard/dist/assets/{CustomDurationPicker-CtH2hReF.js.map → CustomDurationPicker-D1HUQcd0.js.map} +1 -1
- package/dashboard/dist/assets/{DataTable-CM5ZcpPi.js → DataTable-DKvSKoVG.js} +2 -2
- package/dashboard/dist/assets/{DataTable-CM5ZcpPi.js.map → DataTable-DKvSKoVG.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-CwqavyeC.js → ElapsedCell-B0yrReGQ.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-CwqavyeC.js.map → ElapsedCell-B0yrReGQ.js.map} +1 -1
- package/dashboard/dist/assets/{EmptyState-BBn78pmm.js → EmptyState-X0fIzYID.js} +2 -2
- package/dashboard/dist/assets/{EmptyState-BBn78pmm.js.map → EmptyState-X0fIzYID.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-BcJ2E3X7.js → EscalationsOverview-BQAT9W7r.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-BcJ2E3X7.js.map → EscalationsOverview-BQAT9W7r.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-C1en_KZ0.js → EventTable-CX1KNLhZ.js} +2 -2
- package/dashboard/dist/assets/{EventTable-C1en_KZ0.js.map → EventTable-CX1KNLhZ.js.map} +1 -1
- package/dashboard/dist/assets/{FilterBar-CZTlrLQT.js → FilterBar-DMTvuQy-.js} +2 -2
- package/dashboard/dist/assets/{FilterBar-CZTlrLQT.js.map → FilterBar-DMTvuQy-.js.map} +1 -1
- package/dashboard/dist/assets/{ListToolbar-Cdbsapig.js → ListToolbar-DTOSxoEy.js} +2 -2
- package/dashboard/dist/assets/{ListToolbar-Cdbsapig.js.map → ListToolbar-DTOSxoEy.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-CSpEJxKa.js → McpOverview-BaKTIWrG.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-CSpEJxKa.js.map → McpOverview-BaKTIWrG.js.map} +1 -1
- package/dashboard/dist/assets/McpQueryDetailPage-CC08T5k8.js +5 -0
- package/dashboard/dist/assets/McpQueryDetailPage-CC08T5k8.js.map +1 -0
- package/dashboard/dist/assets/McpQueryPage-CVfF9dYg.js +2 -0
- package/dashboard/dist/assets/McpQueryPage-CVfF9dYg.js.map +1 -0
- package/dashboard/dist/assets/{McpRunDetailPage-9xdxgG4d.js → McpRunDetailPage-CKs1RWeV.js} +2 -2
- package/dashboard/dist/assets/{McpRunDetailPage-9xdxgG4d.js.map → McpRunDetailPage-CKs1RWeV.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunsPage-wWLqHsd4.js → McpRunsPage-CcPD_tY1.js} +2 -2
- package/dashboard/dist/assets/{McpRunsPage-wWLqHsd4.js.map → McpRunsPage-CcPD_tY1.js.map} +1 -1
- package/dashboard/dist/assets/{Modal-kB_P7ZOr.js → Modal-_2AbWxJT.js} +2 -2
- package/dashboard/dist/assets/{Modal-kB_P7ZOr.js.map → Modal-_2AbWxJT.js.map} +1 -1
- package/dashboard/dist/assets/OperatorDashboard-BGiRaRDr.js +2 -0
- package/dashboard/dist/assets/{OperatorDashboard-jc0vrgDI.js.map → OperatorDashboard-BGiRaRDr.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeader-NkOeBR05.js → PageHeader-DVr5Qyzm.js} +2 -2
- package/dashboard/dist/assets/{PageHeader-NkOeBR05.js.map → PageHeader-DVr5Qyzm.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeaderWithStats-ywNhrmFK.js → PageHeaderWithStats-D0KRASML.js} +2 -2
- package/dashboard/dist/assets/{PageHeaderWithStats-ywNhrmFK.js.map → PageHeaderWithStats-D0KRASML.js.map} +1 -1
- package/dashboard/dist/assets/{PriorityBadge-B2MQbSxy.js → PriorityBadge-Bx2559OU.js} +2 -2
- package/dashboard/dist/assets/{PriorityBadge-B2MQbSxy.js.map → PriorityBadge-Bx2559OU.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessDetailPage-B7z7IdqE.js → ProcessDetailPage-69I--sry.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-B7z7IdqE.js.map → ProcessDetailPage-69I--sry.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessesListPage-C-uHadO6.js → ProcessesListPage-BDpUbua2.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-C-uHadO6.js.map → ProcessesListPage-BDpUbua2.js.map} +1 -1
- package/dashboard/dist/assets/{RolePill-C1dgC-fK.js → RolePill-CcAqEaSt.js} +2 -2
- package/dashboard/dist/assets/{RolePill-C1dgC-fK.js.map → RolePill-CcAqEaSt.js.map} +1 -1
- package/dashboard/dist/assets/{RolesPage-BSxrD1vm.js → RolesPage-Cl23Hjet.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-BSxrD1vm.js.map → RolesPage-Cl23Hjet.js.map} +1 -1
- package/dashboard/dist/assets/{RowActions-lYaHGI-v.js → RowActions-B4mqIt3Z.js} +2 -2
- package/dashboard/dist/assets/{RowActions-lYaHGI-v.js.map → RowActions-B4mqIt3Z.js.map} +1 -1
- package/dashboard/dist/assets/{StatCard-v2TiITVr.js → StatCard-Cz_2OjAZ.js} +2 -2
- package/dashboard/dist/assets/{StatCard-v2TiITVr.js.map → StatCard-Cz_2OjAZ.js.map} +1 -1
- package/dashboard/dist/assets/{StatusBadge-DWlxevgG.js → StatusBadge-Wi2FJZsn.js} +2 -2
- package/dashboard/dist/assets/{StatusBadge-DWlxevgG.js.map → StatusBadge-Wi2FJZsn.js.map} +1 -1
- package/dashboard/dist/assets/{StepIndicator-CRM4ft28.js → StepIndicator-PW5NRDMb.js} +2 -2
- package/dashboard/dist/assets/{StepIndicator-CRM4ft28.js.map → StepIndicator-PW5NRDMb.js.map} +1 -1
- package/dashboard/dist/assets/{StickyPagination-CF0EToEU.js → StickyPagination-Bl2Uzz65.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-CF0EToEU.js.map → StickyPagination-Bl2Uzz65.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-CNlj7fgg.js → SwimlaneTimeline-CUPqMd0z.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-CNlj7fgg.js.map → SwimlaneTimeline-CUPqMd0z.js.map} +1 -1
- package/dashboard/dist/assets/{TagInput-CH8qMGhC.js → TagInput-BLtf86Ly.js} +2 -2
- package/dashboard/dist/assets/{TagInput-CH8qMGhC.js.map → TagInput-BLtf86Ly.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-CdWo-6mu.js → TaskDetailPage-BXJFX74D.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-CdWo-6mu.js.map → TaskDetailPage-BXJFX74D.js.map} +1 -1
- package/dashboard/dist/assets/{TaskQueuePill-BPj4ogVG.js → TaskQueuePill-CWYj3xKe.js} +2 -2
- package/dashboard/dist/assets/{TaskQueuePill-BPj4ogVG.js.map → TaskQueuePill-CWYj3xKe.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-CtRkMpKU.js → TasksListPage-C3cX94Mw.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-CtRkMpKU.js.map → TasksListPage-C3cX94Mw.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-Di1a3X5P.js → TimeAgo-B_5yDDHV.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-Di1a3X5P.js.map → TimeAgo-B_5yDDHV.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-CqrXql-S.js → TimestampCell-DRX724uU.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-CqrXql-S.js.map → TimestampCell-DRX724uU.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-BUFYCnRa.js → UserName-Ca8FA469.js} +2 -2
- package/dashboard/dist/assets/{UserName-BUFYCnRa.js.map → UserName-Ca8FA469.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowExecutionPage-25iusMml.js → WorkflowExecutionPage-BBYWEV2P.js} +2 -2
- package/dashboard/dist/assets/{WorkflowExecutionPage-25iusMml.js.map → WorkflowExecutionPage-BBYWEV2P.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowPill-BXifAuLi.js +2 -0
- package/dashboard/dist/assets/{WorkflowPill-DPKOcbf4.js.map → WorkflowPill-BXifAuLi.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsDashboard-BgxslssH.js → WorkflowsDashboard-Drl3juz9.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsDashboard-BgxslssH.js.map → WorkflowsDashboard-Drl3juz9.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsOverview-Doe5L-Re.js → WorkflowsOverview-03IRrDLg.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-Doe5L-Re.js.map → WorkflowsOverview-03IRrDLg.js.map} +1 -1
- package/dashboard/dist/assets/YamlWorkflowsPage-DC2cLxVi.js +2 -0
- package/dashboard/dist/assets/YamlWorkflowsPage-DC2cLxVi.js.map +1 -0
- package/dashboard/dist/assets/{bots-Bi2_O1Ts.js → bots-DZEXcgiJ.js} +2 -2
- package/dashboard/dist/assets/{bots-Bi2_O1Ts.js.map → bots-DZEXcgiJ.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-Ck1KlLkT.js → escalation-Cw48lNaF.js} +2 -2
- package/dashboard/dist/assets/{escalation-Ck1KlLkT.js.map → escalation-Cw48lNaF.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-columns-ohDsj2eJ.js → escalation-columns-NINpo3qf.js} +2 -2
- package/dashboard/dist/assets/{escalation-columns-ohDsj2eJ.js.map → escalation-columns-NINpo3qf.js.map} +1 -1
- package/dashboard/dist/assets/helpers-Cuu3xKfr.js +2 -0
- package/dashboard/dist/assets/helpers-Cuu3xKfr.js.map +1 -0
- package/dashboard/dist/assets/{helpers-BoD2SgUY.js → helpers-fk_qr729.js} +2 -2
- package/dashboard/dist/assets/{helpers-BoD2SgUY.js.map → helpers-fk_qr729.js.map} +1 -1
- package/dashboard/dist/assets/index-B98ipWxE.js +2 -0
- package/dashboard/dist/assets/{index-D7zYZOnH.js.map → index-B98ipWxE.js.map} +1 -1
- package/dashboard/dist/assets/{index-BEtLIsML.js → index-BIG3KooI.js} +2 -2
- package/dashboard/dist/assets/{index-BEtLIsML.js.map → index-BIG3KooI.js.map} +1 -1
- package/dashboard/dist/assets/{index-DYyLF-Qb.js → index-BwN3KP_L.js} +5 -5
- package/dashboard/dist/assets/{index-DYyLF-Qb.js.map → index-BwN3KP_L.js.map} +1 -1
- package/dashboard/dist/assets/index-Bxe8h1x4.js +17 -0
- package/dashboard/dist/assets/{index-DOkHXmyf.js.map → index-Bxe8h1x4.js.map} +1 -1
- package/dashboard/dist/assets/{index-FuohTtaM.js → index-CNI7k7oB.js} +3 -3
- package/dashboard/dist/assets/{index-FuohTtaM.js.map → index-CNI7k7oB.js.map} +1 -1
- package/dashboard/dist/assets/{index-CZrJ09p-.js → index-CORHB0WC.js} +2 -2
- package/dashboard/dist/assets/{index-CZrJ09p-.js.map → index-CORHB0WC.js.map} +1 -1
- package/dashboard/dist/assets/{index-PyCTS05D.css → index-DcIKW-cZ.css} +1 -1
- package/dashboard/dist/assets/{index-D3NyVADW.js → index-Dj-z-x8M.js} +2 -2
- package/dashboard/dist/assets/index-Dj-z-x8M.js.map +1 -0
- package/dashboard/dist/assets/{index-Bn2xHDr8.js → index-DwRytW9O.js} +3 -3
- package/dashboard/dist/assets/{index-Bn2xHDr8.js.map → index-DwRytW9O.js.map} +1 -1
- package/dashboard/dist/assets/index-aRvL-dXp.js +2 -0
- package/dashboard/dist/assets/{index-Dk2Q51o0.js.map → index-aRvL-dXp.js.map} +1 -1
- package/dashboard/dist/assets/index-b03HlbnH.js +2 -0
- package/dashboard/dist/assets/{index-BpT-6WgJ.js.map → index-b03HlbnH.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-CJtYjA7A.js → mcp-BZoFryNc.js} +2 -2
- package/dashboard/dist/assets/{mcp-CJtYjA7A.js.map → mcp-BZoFryNc.js.map} +1 -1
- package/dashboard/dist/assets/mcp-query-wiw1kwm8.js +2 -0
- package/dashboard/dist/assets/mcp-query-wiw1kwm8.js.map +1 -0
- package/dashboard/dist/assets/{mcp-runs-DUWm9Z4V.js → mcp-runs-BaEKnf5v.js} +2 -2
- package/dashboard/dist/assets/{mcp-runs-DUWm9Z4V.js.map → mcp-runs-BaEKnf5v.js.map} +1 -1
- package/dashboard/dist/assets/{namespaces-BM5P2qmL.js → namespaces-BwnZI4_A.js} +2 -2
- package/dashboard/dist/assets/{namespaces-BM5P2qmL.js.map → namespaces-BwnZI4_A.js.map} +1 -1
- package/dashboard/dist/assets/{roles-lv0shpjJ.js → roles-Bgn1K8zU.js} +2 -2
- package/dashboard/dist/assets/{roles-lv0shpjJ.js.map → roles-Bgn1K8zU.js.map} +1 -1
- package/dashboard/dist/assets/{settings-Wlq92mRo.js → settings-CizYiutL.js} +2 -2
- package/dashboard/dist/assets/{settings-Wlq92mRo.js.map → settings-CizYiutL.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-BFGm4PuE.js → tasks-Bmte_hc4.js} +2 -2
- package/dashboard/dist/assets/{tasks-BFGm4PuE.js.map → tasks-Bmte_hc4.js.map} +1 -1
- package/dashboard/dist/assets/{useEventHooks-DIE6ue4x.js → useEventHooks-CUCxpiI2.js} +2 -2
- package/dashboard/dist/assets/{useEventHooks-DIE6ue4x.js.map → useEventHooks-CUCxpiI2.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-DCwSO73t.js → useYamlActivityEvents-Cum02Ej9.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-DCwSO73t.js.map → useYamlActivityEvents-Cum02Ej9.js.map} +1 -1
- package/dashboard/dist/assets/{users-tA5-K0wA.js → users-NSDgTt-z.js} +2 -2
- package/dashboard/dist/assets/{users-tA5-K0wA.js.map → users-NSDgTt-z.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-BiIug1SK.js → vendor-icons-D1DdudfH.js} +93 -73
- package/dashboard/dist/assets/vendor-icons-D1DdudfH.js.map +1 -0
- package/dashboard/dist/assets/{workflows-CfLc15Wr.js → workflows-k0XRdGXx.js} +2 -2
- package/dashboard/dist/assets/{workflows-CfLc15Wr.js.map → workflows-k0XRdGXx.js.map} +1 -1
- package/dashboard/dist/assets/yaml-workflows-DAre8I78.js +2 -0
- package/dashboard/dist/assets/yaml-workflows-DAre8I78.js.map +1 -0
- package/dashboard/dist/index.html +3 -3
- package/docs/epic-integration.md +224 -0
- package/docs/events.md +28 -0
- package/docs/sdk.md +177 -0
- package/docs/story.md +157 -0
- package/docs/workflow-builder.md +371 -0
- package/package.json +3 -2
- package/build/routes/escalations/helpers.d.ts +0 -5
- package/build/routes/resolve.d.ts +0 -9
- package/build/routes/resolve.js +0 -19
- package/build/routes/yaml-workflows/helpers.d.ts +0 -2
- package/build/routes/yaml-workflows/helpers.js +0 -8
- package/dashboard/dist/assets/BotPicker-A6LtzyuO.js +0 -2
- package/dashboard/dist/assets/McpQueryDetailPage-DhqEI180.js +0 -5
- package/dashboard/dist/assets/McpQueryDetailPage-DhqEI180.js.map +0 -1
- package/dashboard/dist/assets/McpQueryPage-CIiVMlqo.js +0 -2
- package/dashboard/dist/assets/McpQueryPage-CIiVMlqo.js.map +0 -1
- package/dashboard/dist/assets/OperatorDashboard-jc0vrgDI.js +0 -2
- package/dashboard/dist/assets/RunAsSelector-CJDnyp93.js +0 -2
- package/dashboard/dist/assets/RunAsSelector-CJDnyp93.js.map +0 -1
- package/dashboard/dist/assets/WorkflowPill-DPKOcbf4.js +0 -2
- package/dashboard/dist/assets/YamlWorkflowsPage-BliAckJ6.js +0 -2
- package/dashboard/dist/assets/YamlWorkflowsPage-BliAckJ6.js.map +0 -1
- package/dashboard/dist/assets/index-BpT-6WgJ.js +0 -2
- package/dashboard/dist/assets/index-D3NyVADW.js.map +0 -1
- package/dashboard/dist/assets/index-D7zYZOnH.js +0 -2
- package/dashboard/dist/assets/index-DOkHXmyf.js +0 -17
- package/dashboard/dist/assets/index-Dk2Q51o0.js +0 -2
- package/dashboard/dist/assets/mcp-query-jQJQrs_7.js +0 -2
- package/dashboard/dist/assets/mcp-query-jQJQrs_7.js.map +0 -1
- package/dashboard/dist/assets/vendor-icons-BiIug1SK.js.map +0 -1
- package/dashboard/dist/assets/yaml-workflows-D7JXNqbM.js +0 -2
- package/dashboard/dist/assets/yaml-workflows-D7JXNqbM.js.map +0 -1
- package/docs/img/01-login.png +0 -0
- package/docs/img/02-dashboard-home.png +0 -0
- package/docs/img/03-processes-list.png +0 -0
- package/docs/img/04-escalations-list.png +0 -0
- package/docs/img/05-mcp-servers.png +0 -0
- package/docs/img/06-mcp-pipelines.png +0 -0
- package/docs/img/07-workflows-list.png +0 -0
- package/docs/img/compilation/01-query-submit.png +0 -0
- package/docs/img/compilation/02-mcp-servers.png +0 -0
- package/docs/img/compilation/03-query-completed.png +0 -0
- package/docs/img/compilation/04-wizard-original.png +0 -0
- package/docs/img/compilation/05-wizard-timeline.png +0 -0
- package/docs/img/compilation/06-wizard-profile.png +0 -0
- package/docs/img/compilation/07-wizard-deploy.png +0 -0
- package/docs/img/compilation/08-wizard-test-modal.png +0 -0
- package/docs/img/compilation/09-wizard-test-compare.png +0 -0
- package/docs/img/compilation/10-wizard-verify.png +0 -0
|
@@ -34,14 +34,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.registerResolveRoutes = registerResolveRoutes;
|
|
37
|
-
const
|
|
38
|
-
const taskService = __importStar(require("../../services/task"));
|
|
39
|
-
const escalation_strategy_1 = require("../../services/escalation-strategy");
|
|
40
|
-
const publish_1 = require("../../lib/events/publish");
|
|
41
|
-
const ephemeral_1 = require("../../services/iam/ephemeral");
|
|
42
|
-
const deployer_1 = require("../../services/yaml-workflow/deployer");
|
|
43
|
-
const workers_1 = require("../../workers");
|
|
44
|
-
const defaults_1 = require("../../modules/defaults");
|
|
37
|
+
const api = __importStar(require("../../api/escalations"));
|
|
45
38
|
function registerResolveRoutes(router) {
|
|
46
39
|
/**
|
|
47
40
|
* POST /api/escalations/:id/resolve
|
|
@@ -51,190 +44,7 @@ function registerResolveRoutes(router) {
|
|
|
51
44
|
* Body: { resolverPayload: Record<string, any> }
|
|
52
45
|
*/
|
|
53
46
|
router.post('/:id/resolve', async (req, res) => {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
if (!resolverPayload) {
|
|
57
|
-
res.status(400).json({ error: 'resolverPayload is required' });
|
|
58
|
-
return;
|
|
59
|
-
}
|
|
60
|
-
// 1. Read escalation (verify pending)
|
|
61
|
-
const escalation = await escalationService.getEscalation(req.params.id);
|
|
62
|
-
if (!escalation) {
|
|
63
|
-
res.status(404).json({ error: 'Escalation not found' });
|
|
64
|
-
return;
|
|
65
|
-
}
|
|
66
|
-
if (escalation.status !== 'pending') {
|
|
67
|
-
res.status(409).json({ error: 'Escalation not available for resolution' });
|
|
68
|
-
return;
|
|
69
|
-
}
|
|
70
|
-
// 2. waitFor signal escalation -- signal the paused workflow directly
|
|
71
|
-
const signalRouting = escalation.metadata?.signal_routing;
|
|
72
|
-
if (signalRouting?.signalId) {
|
|
73
|
-
// Replace password fields with ephemeral tokens so plaintext never enters the signal store
|
|
74
|
-
let signalPayload = resolverPayload;
|
|
75
|
-
const formSchema = escalation.metadata?.form_schema;
|
|
76
|
-
if (formSchema?.properties) {
|
|
77
|
-
signalPayload = { ...resolverPayload };
|
|
78
|
-
for (const [key, def] of Object.entries(formSchema.properties)) {
|
|
79
|
-
if (def?.format === 'password' && typeof signalPayload[key] === 'string') {
|
|
80
|
-
const uuid = await (0, ephemeral_1.storeEphemeral)(signalPayload[key], {
|
|
81
|
-
ttlSeconds: 900,
|
|
82
|
-
label: key,
|
|
83
|
-
});
|
|
84
|
-
signalPayload[key] = (0, ephemeral_1.formatEphemeralToken)(uuid, key);
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
if (signalRouting.engine === 'yaml' && signalRouting.hookTopic && signalRouting.appId) {
|
|
89
|
-
// YAML workflow: signal the HotMesh engine directly via hook topic.
|
|
90
|
-
// Include job_id for hook match condition ({$job.metadata.jid} === {$self.hook.data.job_id}).
|
|
91
|
-
const engine = await (0, deployer_1.getEngine)(signalRouting.appId);
|
|
92
|
-
await engine.signal(signalRouting.hookTopic, {
|
|
93
|
-
...signalPayload,
|
|
94
|
-
escalationId: escalation.id,
|
|
95
|
-
job_id: signalRouting.jobId,
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
else if (signalRouting.workflowId) {
|
|
99
|
-
// Durable workflow: signal via workflow handle
|
|
100
|
-
const client = (0, workers_1.createClient)();
|
|
101
|
-
const handle = await client.workflow.getHandle(signalRouting.taskQueue, signalRouting.workflowType, signalRouting.workflowId);
|
|
102
|
-
await handle.signal(signalRouting.signalId, signalPayload);
|
|
103
|
-
}
|
|
104
|
-
await escalationService.resolveEscalation(escalation.id, resolverPayload);
|
|
105
|
-
(0, publish_1.publishEscalationEvent)({
|
|
106
|
-
type: 'escalation.resolved',
|
|
107
|
-
source: 'api',
|
|
108
|
-
workflowId: escalation.workflow_id || signalRouting.workflowId,
|
|
109
|
-
workflowName: escalation.workflow_type || signalRouting.workflowType,
|
|
110
|
-
taskQueue: escalation.task_queue || signalRouting.taskQueue || signalRouting.appId,
|
|
111
|
-
taskId: escalation.task_id,
|
|
112
|
-
escalationId: escalation.id,
|
|
113
|
-
originId: escalation.origin_id ?? undefined,
|
|
114
|
-
status: 'resolved',
|
|
115
|
-
});
|
|
116
|
-
res.json({ signaled: true, escalationId: escalation.id, workflowId: signalRouting.workflowId || signalRouting.appId });
|
|
117
|
-
return;
|
|
118
|
-
}
|
|
119
|
-
// 3. Reconstruct the original envelope from the escalation or task
|
|
120
|
-
let envelope = {};
|
|
121
|
-
if (escalation.envelope) {
|
|
122
|
-
try {
|
|
123
|
-
envelope = JSON.parse(escalation.envelope);
|
|
124
|
-
}
|
|
125
|
-
catch { /* use empty */ }
|
|
126
|
-
}
|
|
127
|
-
else if (escalation.task_id) {
|
|
128
|
-
const task = await taskService.getTask(escalation.task_id);
|
|
129
|
-
if (task?.envelope) {
|
|
130
|
-
try {
|
|
131
|
-
envelope = JSON.parse(task.envelope);
|
|
132
|
-
}
|
|
133
|
-
catch { /* use empty */ }
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
// 4. Check escalation strategy for triage routing
|
|
137
|
-
const strategy = escalation_strategy_1.escalationStrategyRegistry.current;
|
|
138
|
-
if (strategy) {
|
|
139
|
-
const directive = await strategy.onResolution({
|
|
140
|
-
escalation,
|
|
141
|
-
resolverPayload,
|
|
142
|
-
envelope,
|
|
143
|
-
});
|
|
144
|
-
if (directive.action === 'triage') {
|
|
145
|
-
// Route to MCP triage orchestrator instead of standard re-run
|
|
146
|
-
const originalTask = escalation.task_id
|
|
147
|
-
? await taskService.getTask(escalation.task_id)
|
|
148
|
-
: null;
|
|
149
|
-
const routing = originalTask?.metadata;
|
|
150
|
-
const triageWorkflowId = `triage-${escalation.id}-${Date.now()}`;
|
|
151
|
-
const client = (0, workers_1.createClient)();
|
|
152
|
-
// Triage lives on a separate axis -- do NOT copy the original
|
|
153
|
-
// task's parent routing (signalId, parentWorkflowId) into the
|
|
154
|
-
// triage task. Otherwise the container interceptor would signal
|
|
155
|
-
// the original parent when triage completes, prematurely closing
|
|
156
|
-
// the original workflow. Triage exits the vortex by creating a
|
|
157
|
-
// targeted escalation on the original task instead.
|
|
158
|
-
await taskService.createTask({
|
|
159
|
-
workflow_id: triageWorkflowId,
|
|
160
|
-
workflow_type: 'mcpTriageRouter',
|
|
161
|
-
lt_type: 'mcpTriage',
|
|
162
|
-
task_queue: 'long-tail-system',
|
|
163
|
-
signal_id: `lt-triage-${triageWorkflowId}`,
|
|
164
|
-
parent_workflow_id: triageWorkflowId,
|
|
165
|
-
origin_id: escalation.origin_id || triageWorkflowId,
|
|
166
|
-
parent_id: escalation.parent_id ?? undefined,
|
|
167
|
-
envelope: JSON.stringify(directive.triageEnvelope),
|
|
168
|
-
});
|
|
169
|
-
await client.workflow.start({
|
|
170
|
-
workflowName: 'mcpTriageRouter',
|
|
171
|
-
args: [directive.triageEnvelope],
|
|
172
|
-
taskQueue: 'long-tail-system',
|
|
173
|
-
workflowId: triageWorkflowId,
|
|
174
|
-
expire: defaults_1.JOB_EXPIRE_SECS,
|
|
175
|
-
entity: 'mcpTriageRouter',
|
|
176
|
-
});
|
|
177
|
-
// Mark escalation as resolved (triage is handling it)
|
|
178
|
-
await escalationService.resolveEscalation(escalation.id, {
|
|
179
|
-
...resolverPayload,
|
|
180
|
-
_lt: { ...resolverPayload._lt, triaged: true, triageWorkflowId },
|
|
181
|
-
});
|
|
182
|
-
(0, publish_1.publishEscalationEvent)({
|
|
183
|
-
type: 'escalation.resolved',
|
|
184
|
-
source: 'api',
|
|
185
|
-
workflowId: escalation.workflow_id,
|
|
186
|
-
workflowName: escalation.workflow_type,
|
|
187
|
-
taskQueue: escalation.task_queue,
|
|
188
|
-
taskId: escalation.task_id,
|
|
189
|
-
escalationId: escalation.id,
|
|
190
|
-
originId: escalation.origin_id ?? undefined,
|
|
191
|
-
status: 'resolved',
|
|
192
|
-
});
|
|
193
|
-
res.json({
|
|
194
|
-
started: true,
|
|
195
|
-
escalationId: escalation.id,
|
|
196
|
-
workflowId: triageWorkflowId,
|
|
197
|
-
triage: true,
|
|
198
|
-
});
|
|
199
|
-
return;
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
// 5. If no workflow_type, this is a notification-only escalation -- acknowledge and close
|
|
203
|
-
if (!escalation.workflow_type || !escalation.task_queue) {
|
|
204
|
-
await escalationService.resolveEscalation(escalation.id, resolverPayload);
|
|
205
|
-
res.json({ acknowledged: true, escalationId: escalation.id });
|
|
206
|
-
return;
|
|
207
|
-
}
|
|
208
|
-
// 6. Standard re-run: inject resolver data and start original workflow
|
|
209
|
-
envelope.resolver = resolverPayload;
|
|
210
|
-
envelope.lt = {
|
|
211
|
-
...envelope.lt,
|
|
212
|
-
escalationId: escalation.id,
|
|
213
|
-
};
|
|
214
|
-
const newWorkflowId = `rerun-${escalation.id}-${Date.now()}`;
|
|
215
|
-
const client = (0, workers_1.createClient)();
|
|
216
|
-
await client.workflow.start({
|
|
217
|
-
workflowName: escalation.workflow_type,
|
|
218
|
-
args: [envelope],
|
|
219
|
-
taskQueue: escalation.task_queue,
|
|
220
|
-
workflowId: newWorkflowId,
|
|
221
|
-
expire: 180,
|
|
222
|
-
});
|
|
223
|
-
(0, publish_1.publishEscalationEvent)({
|
|
224
|
-
type: 'escalation.resolved',
|
|
225
|
-
source: 'api',
|
|
226
|
-
workflowId: escalation.workflow_id,
|
|
227
|
-
workflowName: escalation.workflow_type,
|
|
228
|
-
taskQueue: escalation.task_queue,
|
|
229
|
-
taskId: escalation.task_id,
|
|
230
|
-
escalationId: escalation.id,
|
|
231
|
-
originId: escalation.origin_id ?? undefined,
|
|
232
|
-
status: 'resolved',
|
|
233
|
-
});
|
|
234
|
-
res.json({ started: true, escalationId: escalation.id, workflowId: newWorkflowId });
|
|
235
|
-
}
|
|
236
|
-
catch (err) {
|
|
237
|
-
res.status(500).json({ error: err.message });
|
|
238
|
-
}
|
|
47
|
+
const result = await api.resolveEscalation({ id: req.params.id, resolverPayload: req.body?.resolverPayload }, req.auth);
|
|
48
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
239
49
|
});
|
|
240
50
|
}
|
|
@@ -34,10 +34,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.registerSingleRoutes = registerSingleRoutes;
|
|
37
|
-
const
|
|
38
|
-
const userService = __importStar(require("../../services/user"));
|
|
39
|
-
const roleService = __importStar(require("../../services/role"));
|
|
40
|
-
const publish_1 = require("../../lib/events/publish");
|
|
37
|
+
const api = __importStar(require("../../api/escalations"));
|
|
41
38
|
function registerSingleRoutes(router) {
|
|
42
39
|
/**
|
|
43
40
|
* PATCH /api/escalations/:id/escalate
|
|
@@ -45,51 +42,18 @@ function registerSingleRoutes(router) {
|
|
|
45
42
|
* Body: { targetRole: string }
|
|
46
43
|
*/
|
|
47
44
|
router.patch('/:id/escalate', async (req, res) => {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
const { targetRole } = req.body || {};
|
|
51
|
-
if (!targetRole || typeof targetRole !== 'string') {
|
|
52
|
-
res.status(400).json({ error: 'targetRole is required' });
|
|
53
|
-
return;
|
|
54
|
-
}
|
|
55
|
-
const escalation = await escalationService.getEscalation(req.params.id);
|
|
56
|
-
if (!escalation) {
|
|
57
|
-
res.status(404).json({ error: 'Escalation not found' });
|
|
58
|
-
return;
|
|
59
|
-
}
|
|
60
|
-
if (escalation.status !== 'pending') {
|
|
61
|
-
res.status(409).json({ error: 'Escalation is not pending' });
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
64
|
-
// Authorization: user must be able to escalate from current role to target role
|
|
65
|
-
const canEscalate = await roleService.canEscalateTo(userId, escalation.role, targetRole);
|
|
66
|
-
if (!canEscalate) {
|
|
67
|
-
res.status(403).json({ error: 'Not authorized to escalate to this role' });
|
|
68
|
-
return;
|
|
69
|
-
}
|
|
70
|
-
const updated = await escalationService.escalateToRole(req.params.id, targetRole);
|
|
71
|
-
if (!updated) {
|
|
72
|
-
res.status(409).json({ error: 'Escalation could not be updated' });
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
|
-
res.json(updated);
|
|
76
|
-
}
|
|
77
|
-
catch (err) {
|
|
78
|
-
res.status(500).json({ error: err.message });
|
|
79
|
-
}
|
|
45
|
+
const result = await api.escalateToRole({ id: req.params.id, targetRole: req.body?.targetRole }, req.auth);
|
|
46
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
80
47
|
});
|
|
81
48
|
/**
|
|
82
49
|
* GET /api/escalations/by-workflow/:workflowId
|
|
83
50
|
* List escalations linked to a specific workflow.
|
|
84
51
|
*/
|
|
85
52
|
router.get('/by-workflow/:workflowId', async (req, res) => {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
}
|
|
90
|
-
catch (err) {
|
|
91
|
-
res.status(500).json({ error: err.message });
|
|
92
|
-
}
|
|
53
|
+
const result = await api.getEscalationsByWorkflowId({
|
|
54
|
+
workflowId: req.params.workflowId,
|
|
55
|
+
});
|
|
56
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
93
57
|
});
|
|
94
58
|
// -- Parameterized routes (must come after literal paths) --
|
|
95
59
|
/**
|
|
@@ -98,26 +62,8 @@ function registerSingleRoutes(router) {
|
|
|
98
62
|
* RBAC: superadmin sees all; others must hold the escalation's role.
|
|
99
63
|
*/
|
|
100
64
|
router.get('/:id', async (req, res) => {
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
if (!escalation) {
|
|
104
|
-
res.status(404).json({ error: 'Escalation not found' });
|
|
105
|
-
return;
|
|
106
|
-
}
|
|
107
|
-
const userId = req.auth.userId;
|
|
108
|
-
const isSuperAdminUser = await userService.isSuperAdmin(userId);
|
|
109
|
-
if (!isSuperAdminUser) {
|
|
110
|
-
const userHasRole = await userService.hasRole(userId, escalation.role);
|
|
111
|
-
if (!userHasRole) {
|
|
112
|
-
res.status(403).json({ error: 'Not authorized to view this escalation' });
|
|
113
|
-
return;
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
res.json(escalation);
|
|
117
|
-
}
|
|
118
|
-
catch (err) {
|
|
119
|
-
res.status(500).json({ error: err.message });
|
|
120
|
-
}
|
|
65
|
+
const result = await api.getEscalation({ id: req.params.id }, req.auth);
|
|
66
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
121
67
|
});
|
|
122
68
|
/**
|
|
123
69
|
* POST /api/escalations/:id/claim
|
|
@@ -125,43 +71,8 @@ function registerSingleRoutes(router) {
|
|
|
125
71
|
* Body: { durationMinutes?: number }
|
|
126
72
|
*/
|
|
127
73
|
router.post('/:id/claim', async (req, res) => {
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
const { durationMinutes } = req.body || {};
|
|
131
|
-
// Role check: user must hold the escalation's role or be superadmin
|
|
132
|
-
const escalation = await escalationService.getEscalation(req.params.id);
|
|
133
|
-
if (!escalation) {
|
|
134
|
-
res.status(404).json({ error: 'Escalation not found' });
|
|
135
|
-
return;
|
|
136
|
-
}
|
|
137
|
-
const isSuperAdminUser = await userService.isSuperAdmin(userId);
|
|
138
|
-
if (!isSuperAdminUser) {
|
|
139
|
-
const userHasRole = await userService.hasRole(userId, escalation.role);
|
|
140
|
-
if (!userHasRole) {
|
|
141
|
-
res.status(403).json({ error: `You must have the "${escalation.role}" role to claim this escalation` });
|
|
142
|
-
return;
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
const result = await escalationService.claimEscalation(req.params.id, userId, durationMinutes);
|
|
146
|
-
if (!result) {
|
|
147
|
-
res.status(409).json({ error: 'Escalation not available for claim' });
|
|
148
|
-
return;
|
|
149
|
-
}
|
|
150
|
-
res.json(result);
|
|
151
|
-
(0, publish_1.publishEscalationEvent)({
|
|
152
|
-
type: 'escalation.claimed',
|
|
153
|
-
source: 'api',
|
|
154
|
-
workflowId: escalation.workflow_id || '',
|
|
155
|
-
workflowName: escalation.workflow_type || '',
|
|
156
|
-
taskQueue: escalation.task_queue || '',
|
|
157
|
-
escalationId: req.params.id,
|
|
158
|
-
status: 'claimed',
|
|
159
|
-
data: { assigned_to: userId },
|
|
160
|
-
});
|
|
161
|
-
}
|
|
162
|
-
catch (err) {
|
|
163
|
-
res.status(500).json({ error: err.message });
|
|
164
|
-
}
|
|
74
|
+
const result = await api.claimEscalation({ id: req.params.id, durationMinutes: req.body?.durationMinutes }, req.auth);
|
|
75
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
165
76
|
});
|
|
166
77
|
/**
|
|
167
78
|
* POST /api/escalations/:id/release
|
|
@@ -169,27 +80,7 @@ function registerSingleRoutes(router) {
|
|
|
169
80
|
* Only the assigned user may release their own claim.
|
|
170
81
|
*/
|
|
171
82
|
router.post('/:id/release', async (req, res) => {
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
const result = await escalationService.releaseEscalation(req.params.id, userId);
|
|
175
|
-
if (!result) {
|
|
176
|
-
res.status(409).json({ error: 'Escalation not found or not claimed by you' });
|
|
177
|
-
return;
|
|
178
|
-
}
|
|
179
|
-
res.json({ escalation: result });
|
|
180
|
-
(0, publish_1.publishEscalationEvent)({
|
|
181
|
-
type: 'escalation.released',
|
|
182
|
-
source: 'api',
|
|
183
|
-
workflowId: result.workflow_id || '',
|
|
184
|
-
workflowName: result.workflow_type || '',
|
|
185
|
-
taskQueue: result.task_queue || '',
|
|
186
|
-
escalationId: req.params.id,
|
|
187
|
-
status: 'released',
|
|
188
|
-
data: { released_by: userId },
|
|
189
|
-
});
|
|
190
|
-
}
|
|
191
|
-
catch (err) {
|
|
192
|
-
res.status(500).json({ error: err.message });
|
|
193
|
-
}
|
|
83
|
+
const result = await api.releaseEscalation({ id: req.params.id }, req.auth);
|
|
84
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
194
85
|
});
|
|
195
86
|
}
|
package/build/routes/exports.js
CHANGED
|
@@ -34,130 +34,79 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
const express_1 = require("express");
|
|
37
|
-
const
|
|
38
|
-
const resolve_1 = require("./resolve");
|
|
37
|
+
const api = __importStar(require("../api/exports"));
|
|
39
38
|
const router = (0, express_1.Router)();
|
|
40
39
|
/**
|
|
41
40
|
* GET /api/workflow-states/jobs
|
|
42
41
|
* List workflow jobs with optional filtering and pagination.
|
|
43
42
|
*/
|
|
44
43
|
router.get('/jobs', async (req, res) => {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
res.json(result);
|
|
57
|
-
}
|
|
58
|
-
catch (err) {
|
|
59
|
-
res.status(500).json({ error: err.message });
|
|
60
|
-
}
|
|
44
|
+
const result = await api.listJobs({
|
|
45
|
+
limit: parseInt(req.query.limit) || undefined,
|
|
46
|
+
offset: parseInt(req.query.offset) || undefined,
|
|
47
|
+
entity: req.query.entity || undefined,
|
|
48
|
+
search: req.query.search || undefined,
|
|
49
|
+
status: req.query.status || undefined,
|
|
50
|
+
sort_by: req.query.sort_by || undefined,
|
|
51
|
+
order: req.query.order || undefined,
|
|
52
|
+
registered: req.query.registered || undefined,
|
|
53
|
+
});
|
|
54
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
61
55
|
});
|
|
62
56
|
/**
|
|
63
57
|
* GET /api/workflow-states/:workflowId
|
|
64
58
|
* Export the full workflow state using HotMesh's durable export.
|
|
65
59
|
*/
|
|
66
60
|
router.get('/:workflowId', async (req, res) => {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
}
|
|
81
|
-
catch (err) {
|
|
82
|
-
const msg = err.message ?? '';
|
|
83
|
-
if (msg.includes('not found') || msg.includes('undefined')) {
|
|
84
|
-
res.status(404).json({
|
|
85
|
-
error: 'Workflow data is no longer available (job may have expired)',
|
|
86
|
-
});
|
|
87
|
-
return;
|
|
88
|
-
}
|
|
89
|
-
res.status(500).json({ error: msg });
|
|
90
|
-
}
|
|
61
|
+
const allow = req.query.allow
|
|
62
|
+
? req.query.allow.split(',')
|
|
63
|
+
: undefined;
|
|
64
|
+
const block = req.query.block
|
|
65
|
+
? req.query.block.split(',')
|
|
66
|
+
: undefined;
|
|
67
|
+
const values = req.query.values === 'false' ? false : undefined;
|
|
68
|
+
const result = await api.exportWorkflowState({
|
|
69
|
+
workflowId: req.params.workflowId,
|
|
70
|
+
allow,
|
|
71
|
+
block,
|
|
72
|
+
values,
|
|
73
|
+
});
|
|
74
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
91
75
|
});
|
|
92
76
|
/**
|
|
93
77
|
* GET /api/workflow-states/:workflowId/execution
|
|
94
78
|
* Export workflow state as a structured execution event history.
|
|
95
79
|
*/
|
|
96
80
|
router.get('/:workflowId/execution', async (req, res) => {
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
: undefined,
|
|
108
|
-
enrich_inputs: true,
|
|
109
|
-
});
|
|
110
|
-
res.json(execution);
|
|
111
|
-
}
|
|
112
|
-
catch (err) {
|
|
113
|
-
const status = err.status === 404 || err.message?.includes('Not Found') ? 404 : 500;
|
|
114
|
-
res.status(status).json({
|
|
115
|
-
error: status === 404
|
|
116
|
-
? 'Workflow data is no longer available (job may have expired)'
|
|
117
|
-
: err.message,
|
|
118
|
-
});
|
|
119
|
-
}
|
|
81
|
+
const result = await api.exportWorkflowExecution({
|
|
82
|
+
workflowId: req.params.workflowId,
|
|
83
|
+
excludeSystem: req.query.excludeSystem === 'true',
|
|
84
|
+
omitResults: req.query.omitResults === 'true',
|
|
85
|
+
mode: req.query.mode || undefined,
|
|
86
|
+
maxDepth: req.query.maxDepth
|
|
87
|
+
? parseInt(req.query.maxDepth, 10)
|
|
88
|
+
: undefined,
|
|
89
|
+
});
|
|
90
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
120
91
|
});
|
|
121
92
|
/**
|
|
122
93
|
* GET /api/workflow-states/:workflowId/status
|
|
123
94
|
* Return only the numeric status semaphore.
|
|
124
95
|
*/
|
|
125
96
|
router.get('/:workflowId/status', async (req, res) => {
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
const result = await exportService.getWorkflowStatus(req.params.workflowId, resolved.taskQueue, resolved.workflowName);
|
|
131
|
-
res.json(result);
|
|
132
|
-
}
|
|
133
|
-
catch (err) {
|
|
134
|
-
const status = err.status === 404 || err.message?.includes('Not Found') ? 404 : 500;
|
|
135
|
-
res.status(status).json({
|
|
136
|
-
error: status === 404
|
|
137
|
-
? 'Workflow data is no longer available (job may have expired)'
|
|
138
|
-
: err.message,
|
|
139
|
-
});
|
|
140
|
-
}
|
|
97
|
+
const result = await api.getWorkflowStatus({
|
|
98
|
+
workflowId: req.params.workflowId,
|
|
99
|
+
});
|
|
100
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
141
101
|
});
|
|
142
102
|
/**
|
|
143
103
|
* GET /api/workflow-states/:workflowId/state
|
|
144
104
|
* Return the current job state of the workflow.
|
|
145
105
|
*/
|
|
146
106
|
router.get('/:workflowId/state', async (req, res) => {
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
const result = await exportService.getWorkflowState(req.params.workflowId, resolved.taskQueue, resolved.workflowName);
|
|
152
|
-
res.json(result);
|
|
153
|
-
}
|
|
154
|
-
catch (err) {
|
|
155
|
-
const status = err.status === 404 || err.message?.includes('Not Found') ? 404 : 500;
|
|
156
|
-
res.status(status).json({
|
|
157
|
-
error: status === 404
|
|
158
|
-
? 'Workflow data is no longer available (job may have expired)'
|
|
159
|
-
: err.message,
|
|
160
|
-
});
|
|
161
|
-
}
|
|
107
|
+
const result = await api.getWorkflowState({
|
|
108
|
+
workflowId: req.params.workflowId,
|
|
109
|
+
});
|
|
110
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
162
111
|
});
|
|
163
112
|
exports.default = router;
|
package/build/routes/index.js
CHANGED
|
@@ -26,6 +26,7 @@ const files_1 = __importDefault(require("./files"));
|
|
|
26
26
|
const controlplane_1 = __importDefault(require("./controlplane"));
|
|
27
27
|
const bot_accounts_1 = __importDefault(require("./bot-accounts"));
|
|
28
28
|
const docs_1 = __importDefault(require("./docs"));
|
|
29
|
+
const workflow_sets_1 = __importDefault(require("./workflow-sets"));
|
|
29
30
|
const router = (0, express_1.Router)();
|
|
30
31
|
// Public routes (no auth required — they handle their own auth)
|
|
31
32
|
router.use('/auth', auth_2.default);
|
|
@@ -51,4 +52,5 @@ router.use('/namespaces', namespaces_1.default);
|
|
|
51
52
|
router.use('/controlplane', controlplane_1.default);
|
|
52
53
|
router.use('/bot-accounts', bot_accounts_1.default);
|
|
53
54
|
router.use('/docs', docs_1.default);
|
|
55
|
+
router.use('/workflow-sets', workflow_sets_1.default);
|
|
54
56
|
exports.default = router;
|