@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
|
@@ -0,0 +1,656 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.listEscalations = listEscalations;
|
|
37
|
+
exports.listAvailableEscalations = listAvailableEscalations;
|
|
38
|
+
exports.listDistinctTypes = listDistinctTypes;
|
|
39
|
+
exports.getEscalationStats = getEscalationStats;
|
|
40
|
+
exports.getEscalation = getEscalation;
|
|
41
|
+
exports.getEscalationsByWorkflowId = getEscalationsByWorkflowId;
|
|
42
|
+
exports.escalateToRole = escalateToRole;
|
|
43
|
+
exports.claimEscalation = claimEscalation;
|
|
44
|
+
exports.releaseEscalation = releaseEscalation;
|
|
45
|
+
exports.releaseExpiredClaims = releaseExpiredClaims;
|
|
46
|
+
exports.updatePriority = updatePriority;
|
|
47
|
+
exports.bulkClaim = bulkClaim;
|
|
48
|
+
exports.bulkAssign = bulkAssign;
|
|
49
|
+
exports.bulkEscalate = bulkEscalate;
|
|
50
|
+
exports.bulkTriage = bulkTriage;
|
|
51
|
+
exports.resolveEscalation = resolveEscalation;
|
|
52
|
+
const escalationService = __importStar(require("../services/escalation"));
|
|
53
|
+
const userService = __importStar(require("../services/user"));
|
|
54
|
+
const roleService = __importStar(require("../services/role"));
|
|
55
|
+
const taskService = __importStar(require("../services/task"));
|
|
56
|
+
const publish_1 = require("../lib/events/publish");
|
|
57
|
+
const escalation_strategy_1 = require("../services/escalation-strategy");
|
|
58
|
+
const ephemeral_1 = require("../services/iam/ephemeral");
|
|
59
|
+
const deployer_1 = require("../services/yaml-workflow/deployer");
|
|
60
|
+
const workers_1 = require("../workers");
|
|
61
|
+
const defaults_1 = require("../modules/defaults");
|
|
62
|
+
// ── Private helpers ────────────────────────────────────────────────────────
|
|
63
|
+
async function getVisibleRoles(userId) {
|
|
64
|
+
const isSuperAdminUser = await userService.isSuperAdmin(userId);
|
|
65
|
+
if (isSuperAdminUser)
|
|
66
|
+
return undefined;
|
|
67
|
+
const userRoles = await userService.getUserRoles(userId);
|
|
68
|
+
return userRoles.map((r) => r.role);
|
|
69
|
+
}
|
|
70
|
+
function validateIds(ids) {
|
|
71
|
+
return Array.isArray(ids) && ids.length > 0;
|
|
72
|
+
}
|
|
73
|
+
async function checkBulkPermission(userId, ids) {
|
|
74
|
+
const isSuperAdminUser = await userService.isSuperAdmin(userId);
|
|
75
|
+
if (isSuperAdminUser)
|
|
76
|
+
return { allowed: true };
|
|
77
|
+
const roles = await escalationService.getEscalationRoles(ids);
|
|
78
|
+
for (const role of roles) {
|
|
79
|
+
const canManage = await userService.isGroupAdmin(userId, role);
|
|
80
|
+
if (!canManage) {
|
|
81
|
+
return { allowed: false, status: 403, error: `Insufficient permissions for role "${role}"` };
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return { allowed: true };
|
|
85
|
+
}
|
|
86
|
+
function publishBulkClaimEvents(ids, assignedTo) {
|
|
87
|
+
for (const id of ids) {
|
|
88
|
+
(0, publish_1.publishEscalationEvent)({
|
|
89
|
+
type: 'escalation.claimed',
|
|
90
|
+
source: 'api',
|
|
91
|
+
workflowId: '',
|
|
92
|
+
workflowName: '',
|
|
93
|
+
taskQueue: '',
|
|
94
|
+
escalationId: id,
|
|
95
|
+
status: 'claimed',
|
|
96
|
+
data: { assigned_to: assignedTo, bulk: true },
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// ── List routes ────────────────────────────────────────────────────────────
|
|
101
|
+
async function listEscalations(input, auth) {
|
|
102
|
+
try {
|
|
103
|
+
const visibleRoles = await getVisibleRoles(auth.userId);
|
|
104
|
+
if (visibleRoles && visibleRoles.length === 0) {
|
|
105
|
+
return { status: 200, data: { escalations: [], total: 0 } };
|
|
106
|
+
}
|
|
107
|
+
const result = await escalationService.listEscalations({
|
|
108
|
+
status: input.status,
|
|
109
|
+
role: input.role,
|
|
110
|
+
type: input.type,
|
|
111
|
+
subtype: input.subtype,
|
|
112
|
+
assigned_to: input.assigned_to,
|
|
113
|
+
priority: input.priority,
|
|
114
|
+
limit: input.limit,
|
|
115
|
+
offset: input.offset,
|
|
116
|
+
sort_by: input.sort_by,
|
|
117
|
+
order: input.order,
|
|
118
|
+
visibleRoles,
|
|
119
|
+
});
|
|
120
|
+
return { status: 200, data: result };
|
|
121
|
+
}
|
|
122
|
+
catch (err) {
|
|
123
|
+
return { status: 500, error: err.message };
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
async function listAvailableEscalations(input, auth) {
|
|
127
|
+
try {
|
|
128
|
+
const visibleRoles = await getVisibleRoles(auth.userId);
|
|
129
|
+
if (visibleRoles && visibleRoles.length === 0) {
|
|
130
|
+
return { status: 200, data: { escalations: [], total: 0 } };
|
|
131
|
+
}
|
|
132
|
+
const result = await escalationService.listAvailableEscalations({
|
|
133
|
+
role: input.role,
|
|
134
|
+
type: input.type,
|
|
135
|
+
subtype: input.subtype,
|
|
136
|
+
priority: input.priority,
|
|
137
|
+
limit: input.limit,
|
|
138
|
+
offset: input.offset,
|
|
139
|
+
sort_by: input.sort_by,
|
|
140
|
+
order: input.order,
|
|
141
|
+
visibleRoles,
|
|
142
|
+
});
|
|
143
|
+
return { status: 200, data: result };
|
|
144
|
+
}
|
|
145
|
+
catch (err) {
|
|
146
|
+
return { status: 500, error: err.message };
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
async function listDistinctTypes() {
|
|
150
|
+
try {
|
|
151
|
+
const types = await escalationService.listDistinctTypes();
|
|
152
|
+
return { status: 200, data: { types } };
|
|
153
|
+
}
|
|
154
|
+
catch (err) {
|
|
155
|
+
return { status: 500, error: err.message };
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
async function getEscalationStats(input, auth) {
|
|
159
|
+
try {
|
|
160
|
+
const visibleRoles = await getVisibleRoles(auth.userId);
|
|
161
|
+
if (visibleRoles && visibleRoles.length === 0) {
|
|
162
|
+
return {
|
|
163
|
+
status: 200,
|
|
164
|
+
data: {
|
|
165
|
+
pending: 0,
|
|
166
|
+
claimed: 0,
|
|
167
|
+
created: 0,
|
|
168
|
+
resolved: 0,
|
|
169
|
+
by_role: [],
|
|
170
|
+
by_type: [],
|
|
171
|
+
},
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
const stats = await escalationService.getEscalationStats(visibleRoles, input.period);
|
|
175
|
+
return { status: 200, data: stats };
|
|
176
|
+
}
|
|
177
|
+
catch (err) {
|
|
178
|
+
return { status: 500, error: err.message };
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// ── Single-escalation routes ───────────────────────────────────────────────
|
|
182
|
+
async function getEscalation(input, auth) {
|
|
183
|
+
try {
|
|
184
|
+
const escalation = await escalationService.getEscalation(input.id);
|
|
185
|
+
if (!escalation) {
|
|
186
|
+
return { status: 404, error: 'Escalation not found' };
|
|
187
|
+
}
|
|
188
|
+
const isSuperAdminUser = await userService.isSuperAdmin(auth.userId);
|
|
189
|
+
if (!isSuperAdminUser) {
|
|
190
|
+
const userHasRole = await userService.hasRole(auth.userId, escalation.role);
|
|
191
|
+
if (!userHasRole) {
|
|
192
|
+
return { status: 403, error: 'Not authorized to view this escalation' };
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return { status: 200, data: escalation };
|
|
196
|
+
}
|
|
197
|
+
catch (err) {
|
|
198
|
+
return { status: 500, error: err.message };
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
async function getEscalationsByWorkflowId(input) {
|
|
202
|
+
try {
|
|
203
|
+
const escalations = await escalationService.getEscalationsByWorkflowId(input.workflowId);
|
|
204
|
+
return { status: 200, data: { escalations } };
|
|
205
|
+
}
|
|
206
|
+
catch (err) {
|
|
207
|
+
return { status: 500, error: err.message };
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
async function escalateToRole(input, auth) {
|
|
211
|
+
try {
|
|
212
|
+
const { id, targetRole } = input;
|
|
213
|
+
if (!targetRole || typeof targetRole !== 'string') {
|
|
214
|
+
return { status: 400, error: 'targetRole is required' };
|
|
215
|
+
}
|
|
216
|
+
const escalation = await escalationService.getEscalation(id);
|
|
217
|
+
if (!escalation) {
|
|
218
|
+
return { status: 404, error: 'Escalation not found' };
|
|
219
|
+
}
|
|
220
|
+
if (escalation.status !== 'pending') {
|
|
221
|
+
return { status: 409, error: 'Escalation is not pending' };
|
|
222
|
+
}
|
|
223
|
+
const canEscalate = await roleService.canEscalateTo(auth.userId, escalation.role, targetRole);
|
|
224
|
+
if (!canEscalate) {
|
|
225
|
+
return { status: 403, error: 'Not authorized to escalate to this role' };
|
|
226
|
+
}
|
|
227
|
+
const updated = await escalationService.escalateToRole(id, targetRole);
|
|
228
|
+
if (!updated) {
|
|
229
|
+
return { status: 409, error: 'Escalation could not be updated' };
|
|
230
|
+
}
|
|
231
|
+
return { status: 200, data: updated };
|
|
232
|
+
}
|
|
233
|
+
catch (err) {
|
|
234
|
+
return { status: 500, error: err.message };
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
async function claimEscalation(input, auth) {
|
|
238
|
+
try {
|
|
239
|
+
const { id, durationMinutes } = input;
|
|
240
|
+
const escalation = await escalationService.getEscalation(id);
|
|
241
|
+
if (!escalation) {
|
|
242
|
+
return { status: 404, error: 'Escalation not found' };
|
|
243
|
+
}
|
|
244
|
+
const isSuperAdminUser = await userService.isSuperAdmin(auth.userId);
|
|
245
|
+
if (!isSuperAdminUser) {
|
|
246
|
+
const userHasRole = await userService.hasRole(auth.userId, escalation.role);
|
|
247
|
+
if (!userHasRole) {
|
|
248
|
+
return {
|
|
249
|
+
status: 403,
|
|
250
|
+
error: `You must have the "${escalation.role}" role to claim this escalation`,
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
const result = await escalationService.claimEscalation(id, auth.userId, durationMinutes);
|
|
255
|
+
if (!result) {
|
|
256
|
+
return { status: 409, error: 'Escalation not available for claim' };
|
|
257
|
+
}
|
|
258
|
+
(0, publish_1.publishEscalationEvent)({
|
|
259
|
+
type: 'escalation.claimed',
|
|
260
|
+
source: 'api',
|
|
261
|
+
workflowId: escalation.workflow_id || '',
|
|
262
|
+
workflowName: escalation.workflow_type || '',
|
|
263
|
+
taskQueue: escalation.task_queue || '',
|
|
264
|
+
escalationId: id,
|
|
265
|
+
status: 'claimed',
|
|
266
|
+
data: { assigned_to: auth.userId },
|
|
267
|
+
});
|
|
268
|
+
return { status: 200, data: result };
|
|
269
|
+
}
|
|
270
|
+
catch (err) {
|
|
271
|
+
return { status: 500, error: err.message };
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
async function releaseEscalation(input, auth) {
|
|
275
|
+
try {
|
|
276
|
+
const result = await escalationService.releaseEscalation(input.id, auth.userId);
|
|
277
|
+
if (!result) {
|
|
278
|
+
return { status: 409, error: 'Escalation not found or not claimed by you' };
|
|
279
|
+
}
|
|
280
|
+
(0, publish_1.publishEscalationEvent)({
|
|
281
|
+
type: 'escalation.released',
|
|
282
|
+
source: 'api',
|
|
283
|
+
workflowId: result.workflow_id || '',
|
|
284
|
+
workflowName: result.workflow_type || '',
|
|
285
|
+
taskQueue: result.task_queue || '',
|
|
286
|
+
escalationId: input.id,
|
|
287
|
+
status: 'released',
|
|
288
|
+
data: { released_by: auth.userId },
|
|
289
|
+
});
|
|
290
|
+
return { status: 200, data: { escalation: result } };
|
|
291
|
+
}
|
|
292
|
+
catch (err) {
|
|
293
|
+
return { status: 500, error: err.message };
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
// ── Bulk routes ────────────────────────────────────────────────────────────
|
|
297
|
+
async function releaseExpiredClaims() {
|
|
298
|
+
try {
|
|
299
|
+
const released = await escalationService.releaseExpiredClaims();
|
|
300
|
+
return { status: 200, data: { released } };
|
|
301
|
+
}
|
|
302
|
+
catch (err) {
|
|
303
|
+
return { status: 500, error: err.message };
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
async function updatePriority(input, auth) {
|
|
307
|
+
try {
|
|
308
|
+
const { ids, priority } = input;
|
|
309
|
+
if (!validateIds(ids)) {
|
|
310
|
+
return { status: 400, error: 'ids must be a non-empty array' };
|
|
311
|
+
}
|
|
312
|
+
if (![1, 2, 3, 4].includes(priority)) {
|
|
313
|
+
return { status: 400, error: 'priority must be 1, 2, 3, or 4' };
|
|
314
|
+
}
|
|
315
|
+
const perm = await checkBulkPermission(auth.userId, ids);
|
|
316
|
+
if (!perm.allowed)
|
|
317
|
+
return perm;
|
|
318
|
+
const updated = await escalationService.updateEscalationsPriority(ids, priority);
|
|
319
|
+
return { status: 200, data: { updated } };
|
|
320
|
+
}
|
|
321
|
+
catch (err) {
|
|
322
|
+
return { status: 500, error: err.message };
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
async function bulkClaim(input, auth) {
|
|
326
|
+
try {
|
|
327
|
+
const { ids, durationMinutes } = input;
|
|
328
|
+
if (!validateIds(ids)) {
|
|
329
|
+
return { status: 400, error: 'ids must be a non-empty array' };
|
|
330
|
+
}
|
|
331
|
+
const perm = await checkBulkPermission(auth.userId, ids);
|
|
332
|
+
if (!perm.allowed)
|
|
333
|
+
return perm;
|
|
334
|
+
const result = await escalationService.bulkClaimEscalations(ids, auth.userId, durationMinutes ?? 30);
|
|
335
|
+
if (result.claimed > 0)
|
|
336
|
+
publishBulkClaimEvents(ids, auth.userId);
|
|
337
|
+
return { status: 200, data: result };
|
|
338
|
+
}
|
|
339
|
+
catch (err) {
|
|
340
|
+
return { status: 500, error: err.message };
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
async function bulkAssign(input, auth) {
|
|
344
|
+
try {
|
|
345
|
+
const { ids, targetUserId, durationMinutes } = input;
|
|
346
|
+
if (!validateIds(ids)) {
|
|
347
|
+
return { status: 400, error: 'ids must be a non-empty array' };
|
|
348
|
+
}
|
|
349
|
+
if (!targetUserId || typeof targetUserId !== 'string') {
|
|
350
|
+
return { status: 400, error: 'targetUserId is required' };
|
|
351
|
+
}
|
|
352
|
+
const perm = await checkBulkPermission(auth.userId, ids);
|
|
353
|
+
if (!perm.allowed)
|
|
354
|
+
return perm;
|
|
355
|
+
// Non-superadmin: target user must hold each escalation's role
|
|
356
|
+
const isSuperAdminUser = await userService.isSuperAdmin(auth.userId);
|
|
357
|
+
if (!isSuperAdminUser) {
|
|
358
|
+
const roles = await escalationService.getEscalationRoles(ids);
|
|
359
|
+
for (const role of roles) {
|
|
360
|
+
const targetHasRole = await userService.hasRole(targetUserId, role);
|
|
361
|
+
if (!targetHasRole) {
|
|
362
|
+
return { status: 400, error: `Target user does not hold the "${role}" role` };
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
const result = await escalationService.bulkAssignEscalations(ids, targetUserId, durationMinutes ?? 30);
|
|
367
|
+
if (result.assigned > 0)
|
|
368
|
+
publishBulkClaimEvents(ids, targetUserId);
|
|
369
|
+
return { status: 200, data: result };
|
|
370
|
+
}
|
|
371
|
+
catch (err) {
|
|
372
|
+
return { status: 500, error: err.message };
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
async function bulkEscalate(input, auth) {
|
|
376
|
+
try {
|
|
377
|
+
const { ids, targetRole } = input;
|
|
378
|
+
if (!validateIds(ids)) {
|
|
379
|
+
return { status: 400, error: 'ids must be a non-empty array' };
|
|
380
|
+
}
|
|
381
|
+
if (!targetRole || typeof targetRole !== 'string') {
|
|
382
|
+
return { status: 400, error: 'targetRole is required' };
|
|
383
|
+
}
|
|
384
|
+
const perm = await checkBulkPermission(auth.userId, ids);
|
|
385
|
+
if (!perm.allowed)
|
|
386
|
+
return perm;
|
|
387
|
+
const updated = await escalationService.bulkEscalateToRole(ids, targetRole);
|
|
388
|
+
return { status: 200, data: { updated } };
|
|
389
|
+
}
|
|
390
|
+
catch (err) {
|
|
391
|
+
return { status: 500, error: err.message };
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
async function bulkTriage(input, auth) {
|
|
395
|
+
try {
|
|
396
|
+
const { ids, hint } = input;
|
|
397
|
+
if (!validateIds(ids)) {
|
|
398
|
+
return { status: 400, error: 'ids must be a non-empty array' };
|
|
399
|
+
}
|
|
400
|
+
const perm = await checkBulkPermission(auth.userId, ids);
|
|
401
|
+
if (!perm.allowed)
|
|
402
|
+
return perm;
|
|
403
|
+
const resolved = await escalationService.bulkResolveForTriage(ids, hint);
|
|
404
|
+
const client = (0, workers_1.createClient)();
|
|
405
|
+
const workflowIds = [];
|
|
406
|
+
for (const escalation of resolved) {
|
|
407
|
+
const triageWorkflowId = await startTriageWorkflow(escalation, hint, auth.userId, client);
|
|
408
|
+
workflowIds.push(triageWorkflowId);
|
|
409
|
+
}
|
|
410
|
+
return { status: 200, data: { triaged: resolved.length, workflows: workflowIds } };
|
|
411
|
+
}
|
|
412
|
+
catch (err) {
|
|
413
|
+
return { status: 500, error: err.message };
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
// ── Resolve route ──────────────────────────────────────────────────────────
|
|
417
|
+
async function resolveEscalation(input, auth) {
|
|
418
|
+
try {
|
|
419
|
+
const { id, resolverPayload } = input;
|
|
420
|
+
if (!resolverPayload) {
|
|
421
|
+
return { status: 400, error: 'resolverPayload is required' };
|
|
422
|
+
}
|
|
423
|
+
// 1. Read escalation (verify pending)
|
|
424
|
+
const escalation = await escalationService.getEscalation(id);
|
|
425
|
+
if (!escalation) {
|
|
426
|
+
return { status: 404, error: 'Escalation not found' };
|
|
427
|
+
}
|
|
428
|
+
if (escalation.status !== 'pending') {
|
|
429
|
+
return { status: 409, error: 'Escalation not available for resolution' };
|
|
430
|
+
}
|
|
431
|
+
// 2. waitFor signal escalation -- signal the paused workflow directly
|
|
432
|
+
const signalRouting = escalation.metadata?.signal_routing;
|
|
433
|
+
if (signalRouting?.signalId) {
|
|
434
|
+
// Replace password fields with ephemeral tokens so plaintext never enters the signal store
|
|
435
|
+
let signalPayload = resolverPayload;
|
|
436
|
+
const formSchema = escalation.metadata?.form_schema;
|
|
437
|
+
if (formSchema?.properties) {
|
|
438
|
+
signalPayload = { ...resolverPayload };
|
|
439
|
+
for (const [key, def] of Object.entries(formSchema.properties)) {
|
|
440
|
+
if (def?.format === 'password' && typeof signalPayload[key] === 'string') {
|
|
441
|
+
const uuid = await (0, ephemeral_1.storeEphemeral)(signalPayload[key], {
|
|
442
|
+
ttlSeconds: 900,
|
|
443
|
+
label: key,
|
|
444
|
+
});
|
|
445
|
+
signalPayload[key] = (0, ephemeral_1.formatEphemeralToken)(uuid, key);
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
if (signalRouting.engine === 'yaml' && signalRouting.hookTopic && signalRouting.appId) {
|
|
450
|
+
const engine = await (0, deployer_1.getEngine)(signalRouting.appId);
|
|
451
|
+
await engine.signal(signalRouting.hookTopic, {
|
|
452
|
+
...signalPayload,
|
|
453
|
+
escalationId: escalation.id,
|
|
454
|
+
job_id: signalRouting.jobId,
|
|
455
|
+
});
|
|
456
|
+
}
|
|
457
|
+
else if (signalRouting.workflowId) {
|
|
458
|
+
const client = (0, workers_1.createClient)();
|
|
459
|
+
const handle = await client.workflow.getHandle(signalRouting.taskQueue, signalRouting.workflowType, signalRouting.workflowId);
|
|
460
|
+
await handle.signal(signalRouting.signalId, signalPayload);
|
|
461
|
+
}
|
|
462
|
+
await escalationService.resolveEscalation(escalation.id, resolverPayload);
|
|
463
|
+
(0, publish_1.publishEscalationEvent)({
|
|
464
|
+
type: 'escalation.resolved',
|
|
465
|
+
source: 'api',
|
|
466
|
+
workflowId: escalation.workflow_id || signalRouting.workflowId,
|
|
467
|
+
workflowName: escalation.workflow_type || signalRouting.workflowType,
|
|
468
|
+
taskQueue: escalation.task_queue || signalRouting.taskQueue || signalRouting.appId,
|
|
469
|
+
taskId: escalation.task_id,
|
|
470
|
+
escalationId: escalation.id,
|
|
471
|
+
originId: escalation.origin_id ?? undefined,
|
|
472
|
+
status: 'resolved',
|
|
473
|
+
});
|
|
474
|
+
return {
|
|
475
|
+
status: 200,
|
|
476
|
+
data: {
|
|
477
|
+
signaled: true,
|
|
478
|
+
escalationId: escalation.id,
|
|
479
|
+
workflowId: signalRouting.workflowId || signalRouting.appId,
|
|
480
|
+
},
|
|
481
|
+
};
|
|
482
|
+
}
|
|
483
|
+
// 3. Reconstruct the original envelope from the escalation or task
|
|
484
|
+
let envelope = {};
|
|
485
|
+
if (escalation.envelope) {
|
|
486
|
+
try {
|
|
487
|
+
envelope = JSON.parse(escalation.envelope);
|
|
488
|
+
}
|
|
489
|
+
catch { /* use empty */ }
|
|
490
|
+
}
|
|
491
|
+
else if (escalation.task_id) {
|
|
492
|
+
const task = await taskService.getTask(escalation.task_id);
|
|
493
|
+
if (task?.envelope) {
|
|
494
|
+
try {
|
|
495
|
+
envelope = JSON.parse(task.envelope);
|
|
496
|
+
}
|
|
497
|
+
catch { /* use empty */ }
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
// 4. Check escalation strategy for triage routing
|
|
501
|
+
const strategy = escalation_strategy_1.escalationStrategyRegistry.current;
|
|
502
|
+
if (strategy) {
|
|
503
|
+
const directive = await strategy.onResolution({
|
|
504
|
+
escalation,
|
|
505
|
+
resolverPayload,
|
|
506
|
+
envelope,
|
|
507
|
+
});
|
|
508
|
+
if (directive.action === 'triage') {
|
|
509
|
+
const originalTask = escalation.task_id
|
|
510
|
+
? await taskService.getTask(escalation.task_id)
|
|
511
|
+
: null;
|
|
512
|
+
const routing = originalTask?.metadata;
|
|
513
|
+
const triageWorkflowId = `triage-${escalation.id}-${Date.now()}`;
|
|
514
|
+
const client = (0, workers_1.createClient)();
|
|
515
|
+
await taskService.createTask({
|
|
516
|
+
workflow_id: triageWorkflowId,
|
|
517
|
+
workflow_type: 'mcpTriageRouter',
|
|
518
|
+
lt_type: 'mcpTriage',
|
|
519
|
+
task_queue: 'long-tail-system',
|
|
520
|
+
signal_id: `lt-triage-${triageWorkflowId}`,
|
|
521
|
+
parent_workflow_id: triageWorkflowId,
|
|
522
|
+
origin_id: escalation.origin_id || triageWorkflowId,
|
|
523
|
+
parent_id: escalation.parent_id ?? undefined,
|
|
524
|
+
envelope: JSON.stringify(directive.triageEnvelope),
|
|
525
|
+
});
|
|
526
|
+
await client.workflow.start({
|
|
527
|
+
workflowName: 'mcpTriageRouter',
|
|
528
|
+
args: [directive.triageEnvelope],
|
|
529
|
+
taskQueue: 'long-tail-system',
|
|
530
|
+
workflowId: triageWorkflowId,
|
|
531
|
+
expire: defaults_1.JOB_EXPIRE_SECS,
|
|
532
|
+
entity: 'mcpTriageRouter',
|
|
533
|
+
});
|
|
534
|
+
await escalationService.resolveEscalation(escalation.id, {
|
|
535
|
+
...resolverPayload,
|
|
536
|
+
_lt: { ...resolverPayload._lt, triaged: true, triageWorkflowId },
|
|
537
|
+
});
|
|
538
|
+
(0, publish_1.publishEscalationEvent)({
|
|
539
|
+
type: 'escalation.resolved',
|
|
540
|
+
source: 'api',
|
|
541
|
+
workflowId: escalation.workflow_id,
|
|
542
|
+
workflowName: escalation.workflow_type,
|
|
543
|
+
taskQueue: escalation.task_queue,
|
|
544
|
+
taskId: escalation.task_id,
|
|
545
|
+
escalationId: escalation.id,
|
|
546
|
+
originId: escalation.origin_id ?? undefined,
|
|
547
|
+
status: 'resolved',
|
|
548
|
+
});
|
|
549
|
+
return {
|
|
550
|
+
status: 200,
|
|
551
|
+
data: {
|
|
552
|
+
started: true,
|
|
553
|
+
escalationId: escalation.id,
|
|
554
|
+
workflowId: triageWorkflowId,
|
|
555
|
+
triage: true,
|
|
556
|
+
},
|
|
557
|
+
};
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
// 5. If no workflow_type, this is a notification-only escalation -- acknowledge and close
|
|
561
|
+
if (!escalation.workflow_type || !escalation.task_queue) {
|
|
562
|
+
await escalationService.resolveEscalation(escalation.id, resolverPayload);
|
|
563
|
+
return { status: 200, data: { acknowledged: true, escalationId: escalation.id } };
|
|
564
|
+
}
|
|
565
|
+
// 6. Standard re-run: inject resolver data and start original workflow
|
|
566
|
+
envelope.resolver = resolverPayload;
|
|
567
|
+
envelope.lt = {
|
|
568
|
+
...envelope.lt,
|
|
569
|
+
escalationId: escalation.id,
|
|
570
|
+
};
|
|
571
|
+
const newWorkflowId = `rerun-${escalation.id}-${Date.now()}`;
|
|
572
|
+
const client = (0, workers_1.createClient)();
|
|
573
|
+
await client.workflow.start({
|
|
574
|
+
workflowName: escalation.workflow_type,
|
|
575
|
+
args: [envelope],
|
|
576
|
+
taskQueue: escalation.task_queue,
|
|
577
|
+
workflowId: newWorkflowId,
|
|
578
|
+
expire: 180,
|
|
579
|
+
});
|
|
580
|
+
(0, publish_1.publishEscalationEvent)({
|
|
581
|
+
type: 'escalation.resolved',
|
|
582
|
+
source: 'api',
|
|
583
|
+
workflowId: escalation.workflow_id,
|
|
584
|
+
workflowName: escalation.workflow_type,
|
|
585
|
+
taskQueue: escalation.task_queue,
|
|
586
|
+
taskId: escalation.task_id,
|
|
587
|
+
escalationId: escalation.id,
|
|
588
|
+
originId: escalation.origin_id ?? undefined,
|
|
589
|
+
status: 'resolved',
|
|
590
|
+
});
|
|
591
|
+
return {
|
|
592
|
+
status: 200,
|
|
593
|
+
data: { started: true, escalationId: escalation.id, workflowId: newWorkflowId },
|
|
594
|
+
};
|
|
595
|
+
}
|
|
596
|
+
catch (err) {
|
|
597
|
+
return { status: 500, error: err.message };
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
// ── Triage workflow launcher (shared by bulkTriage) ────────────────────────
|
|
601
|
+
async function startTriageWorkflow(escalation, hint, userId, client) {
|
|
602
|
+
let escalationPayload = {};
|
|
603
|
+
if (escalation.escalation_payload) {
|
|
604
|
+
try {
|
|
605
|
+
escalationPayload = JSON.parse(escalation.escalation_payload);
|
|
606
|
+
}
|
|
607
|
+
catch { }
|
|
608
|
+
}
|
|
609
|
+
let envelope = {};
|
|
610
|
+
if (escalation.envelope) {
|
|
611
|
+
try {
|
|
612
|
+
envelope = JSON.parse(escalation.envelope);
|
|
613
|
+
}
|
|
614
|
+
catch { }
|
|
615
|
+
}
|
|
616
|
+
const triageWorkflowId = `triage-${escalation.id}-${Date.now()}`;
|
|
617
|
+
const triageEnvelope = {
|
|
618
|
+
data: {
|
|
619
|
+
escalationId: escalation.id,
|
|
620
|
+
originId: escalation.origin_id ?? undefined,
|
|
621
|
+
originalWorkflowType: escalation.workflow_type,
|
|
622
|
+
originalTaskQueue: escalation.task_queue,
|
|
623
|
+
originalTaskId: escalation.task_id,
|
|
624
|
+
escalationPayload,
|
|
625
|
+
resolverPayload: {
|
|
626
|
+
_lt: { needsTriage: true, ...(hint ? { hint } : {}) },
|
|
627
|
+
},
|
|
628
|
+
},
|
|
629
|
+
metadata: envelope.metadata || {},
|
|
630
|
+
lt: { ...(envelope.lt || {}), userId },
|
|
631
|
+
};
|
|
632
|
+
const routing = escalation.task_id
|
|
633
|
+
? (await taskService.getTask(escalation.task_id))?.metadata
|
|
634
|
+
: null;
|
|
635
|
+
await taskService.createTask({
|
|
636
|
+
workflow_id: triageWorkflowId,
|
|
637
|
+
workflow_type: 'mcpTriage',
|
|
638
|
+
lt_type: 'mcpTriage',
|
|
639
|
+
task_queue: 'long-tail-system',
|
|
640
|
+
signal_id: `lt-triage-${triageWorkflowId}`,
|
|
641
|
+
parent_workflow_id: routing?.parentWorkflowId || triageWorkflowId,
|
|
642
|
+
origin_id: escalation.origin_id || triageWorkflowId,
|
|
643
|
+
parent_id: escalation.parent_id ?? undefined,
|
|
644
|
+
envelope: JSON.stringify(triageEnvelope),
|
|
645
|
+
metadata: routing || undefined,
|
|
646
|
+
});
|
|
647
|
+
await client.workflow.start({
|
|
648
|
+
workflowName: 'mcpTriage',
|
|
649
|
+
args: [triageEnvelope],
|
|
650
|
+
taskQueue: 'long-tail-system',
|
|
651
|
+
workflowId: triageWorkflowId,
|
|
652
|
+
expire: defaults_1.JOB_EXPIRE_SECS,
|
|
653
|
+
entity: 'mcpTriage',
|
|
654
|
+
});
|
|
655
|
+
return triageWorkflowId;
|
|
656
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { LTApiResult } from '../types/sdk';
|
|
2
|
+
import type { LTExportField } from '../types';
|
|
3
|
+
import type { ExportMode } from '@hotmeshio/hotmesh/build/types/exporter';
|
|
4
|
+
export declare function listJobs(input: {
|
|
5
|
+
limit?: number;
|
|
6
|
+
offset?: number;
|
|
7
|
+
entity?: string;
|
|
8
|
+
search?: string;
|
|
9
|
+
status?: string;
|
|
10
|
+
sort_by?: string;
|
|
11
|
+
order?: string;
|
|
12
|
+
registered?: string;
|
|
13
|
+
}): Promise<LTApiResult>;
|
|
14
|
+
export declare function exportWorkflowState(input: {
|
|
15
|
+
workflowId: string;
|
|
16
|
+
allow?: LTExportField[];
|
|
17
|
+
block?: LTExportField[];
|
|
18
|
+
values?: boolean;
|
|
19
|
+
}): Promise<LTApiResult>;
|
|
20
|
+
export declare function exportWorkflowExecution(input: {
|
|
21
|
+
workflowId: string;
|
|
22
|
+
excludeSystem?: boolean;
|
|
23
|
+
omitResults?: boolean;
|
|
24
|
+
mode?: ExportMode;
|
|
25
|
+
maxDepth?: number;
|
|
26
|
+
}): Promise<LTApiResult>;
|
|
27
|
+
export declare function getWorkflowStatus(input: {
|
|
28
|
+
workflowId: string;
|
|
29
|
+
}): Promise<LTApiResult>;
|
|
30
|
+
export declare function getWorkflowState(input: {
|
|
31
|
+
workflowId: string;
|
|
32
|
+
}): Promise<LTApiResult>;
|