@hotmeshio/long-tail 0.1.13 → 0.1.15
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 +15 -0
- package/build/api/escalations/bulk.d.ts +78 -0
- package/build/api/escalations/bulk.js +279 -0
- package/build/api/escalations/claim.d.ts +30 -0
- package/build/api/escalations/claim.js +121 -0
- package/build/api/escalations/create.d.ts +29 -0
- package/build/api/escalations/create.js +101 -0
- package/build/api/escalations/helpers.d.ts +10 -0
- package/build/api/escalations/helpers.js +80 -0
- package/build/api/escalations/index.d.ts +6 -0
- package/build/api/escalations/index.js +26 -0
- package/build/api/escalations/list.d.ts +75 -0
- package/build/api/escalations/list.js +170 -0
- package/build/api/escalations/resolve.d.ts +18 -0
- package/build/api/escalations/resolve.js +243 -0
- package/build/api/escalations/single.d.ts +37 -0
- package/build/api/escalations/single.js +123 -0
- package/build/api/files.d.ts +16 -0
- package/build/api/files.js +61 -0
- package/build/api/knowledge.d.ts +36 -0
- package/build/api/knowledge.js +112 -0
- package/build/api/mcp/index.d.ts +2 -0
- package/build/api/mcp/index.js +16 -0
- package/build/api/{mcp.d.ts → mcp/servers.d.ts} +1 -33
- package/build/api/{mcp.js → mcp/servers.js} +4 -65
- package/build/api/mcp/tools.d.ts +33 -0
- package/build/api/mcp/tools.js +64 -0
- package/build/api/mcp-runs.d.ts +2 -0
- package/build/api/mcp-runs.js +2 -0
- package/build/api/settings.js +9 -1
- package/build/api/workflow-sets.d.ts +11 -0
- package/build/api/workflow-sets.js +62 -0
- package/build/api/workflows/config.d.ts +64 -0
- package/build/api/workflows/config.js +142 -0
- package/build/api/workflows/discovery.d.ts +29 -0
- package/build/api/workflows/discovery.js +153 -0
- package/build/api/workflows/index.d.ts +3 -0
- package/build/api/workflows/index.js +18 -0
- package/build/api/workflows/invocation.d.ts +67 -0
- package/build/api/workflows/invocation.js +188 -0
- package/build/api/yaml-workflows/cron.d.ts +39 -0
- package/build/api/yaml-workflows/cron.js +127 -0
- package/build/api/{yaml-workflows.d.ts → yaml-workflows/crud.d.ts} +22 -137
- package/build/api/{yaml-workflows.js → yaml-workflows/crud.js} +86 -358
- package/build/api/yaml-workflows/deploy.d.ts +71 -0
- package/build/api/yaml-workflows/deploy.js +223 -0
- package/build/api/yaml-workflows/helpers.d.ts +2 -0
- package/build/api/yaml-workflows/helpers.js +8 -0
- package/build/api/yaml-workflows/index.d.ts +4 -0
- package/build/api/yaml-workflows/index.js +27 -0
- package/build/api/yaml-workflows/versions.d.ts +43 -0
- package/build/api/yaml-workflows/versions.js +124 -0
- package/build/bin/ltc.d.ts +2 -0
- package/build/bin/ltc.js +220 -0
- package/build/examples/seed-data.d.ts +55 -0
- package/build/examples/seed-data.js +161 -0
- package/build/examples/seed.js +7 -164
- package/build/lib/cli/auth.d.ts +23 -0
- package/build/lib/cli/auth.js +167 -0
- package/build/lib/cli/client.d.ts +6 -0
- package/build/lib/cli/client.js +31 -0
- package/build/lib/cli/commands/escalations.d.ts +19 -0
- package/build/lib/cli/commands/escalations.js +69 -0
- package/build/lib/cli/commands/knowledge.d.ts +18 -0
- package/build/lib/cli/commands/knowledge.js +87 -0
- package/build/lib/cli/commands/mcp.d.ts +8 -0
- package/build/lib/cli/commands/mcp.js +33 -0
- package/build/lib/cli/commands/pipelines.d.ts +16 -0
- package/build/lib/cli/commands/pipelines.js +67 -0
- package/build/lib/cli/commands/status.d.ts +1 -0
- package/build/lib/cli/commands/status.js +28 -0
- package/build/lib/cli/commands/users.d.ts +7 -0
- package/build/lib/cli/commands/users.js +25 -0
- package/build/lib/cli/commands/workflows.d.ts +16 -0
- package/build/lib/cli/commands/workflows.js +104 -0
- package/build/lib/cli/compile.d.ts +2 -0
- package/build/lib/cli/compile.js +165 -0
- package/build/lib/cli/format.d.ts +23 -0
- package/build/lib/cli/format.js +94 -0
- package/build/lib/cli/init.d.ts +1 -0
- package/build/lib/cli/init.js +61 -0
- package/build/lib/cli/output.d.ts +27 -0
- package/build/lib/cli/output.js +126 -0
- package/build/lib/cli/scanner.d.ts +10 -0
- package/build/lib/cli/scanner.js +164 -0
- package/build/lib/cli/types.d.ts +16 -0
- package/build/lib/cli/types.js +2 -0
- package/build/lib/logger/index.d.ts +0 -9
- package/build/lib/logger/index.js +9 -4
- package/build/lib/storage/index.js +2 -2
- package/build/lib/storage/local.d.ts +15 -0
- package/build/lib/storage/local.js +63 -0
- package/build/lib/storage/mime.d.ts +4 -0
- package/build/lib/storage/mime.js +31 -0
- package/build/lib/storage/s3.d.ts +16 -0
- package/build/lib/storage/s3.js +70 -0
- package/build/lib/storage/types.d.ts +18 -0
- package/build/modules/utils.d.ts +73 -0
- package/build/modules/utils.js +84 -0
- package/build/routes/file-browser.d.ts +2 -0
- package/build/routes/file-browser.js +126 -0
- package/build/routes/files.js +25 -17
- package/build/routes/index.js +4 -0
- package/build/routes/knowledge.d.ts +2 -0
- package/build/routes/knowledge.js +141 -0
- package/build/routes/mcp-runs.js +2 -0
- package/build/routes/workflow-sets.js +9 -0
- package/build/routes/yaml-workflows/crud.js +9 -0
- package/build/routes/yaml-workflows/deployment.js +8 -0
- package/build/sdk/index.d.ts +17 -0
- package/build/sdk/index.js +19 -0
- package/build/services/insight/index.d.ts +13 -0
- package/build/services/insight/index.js +4 -7
- package/build/services/insight/prompts.d.ts +1 -1
- package/build/services/insight/prompts.js +1 -1
- package/build/services/mcp/client/connection-dispatch.d.ts +18 -0
- package/build/services/mcp/client/connection-dispatch.js +78 -0
- package/build/services/mcp/client/connection-lifecycle.d.ts +48 -0
- package/build/services/mcp/client/connection-lifecycle.js +296 -0
- package/build/services/mcp/client/connection-test.d.ts +10 -0
- package/build/services/mcp/client/connection-test.js +49 -0
- package/build/services/mcp/client/connection.d.ts +3 -68
- package/build/services/mcp/client/connection.js +15 -393
- package/build/services/mcp/server-lifecycle.d.ts +27 -0
- package/build/services/mcp/server-lifecycle.js +49 -0
- package/build/services/mcp/server-tools.d.ts +13 -0
- package/build/services/mcp/server-tools.js +287 -0
- package/build/services/mcp/server.d.ts +2 -26
- package/build/services/mcp/server.js +7 -315
- package/build/services/mcp-runs/queries.d.ts +2 -0
- package/build/services/mcp-runs/queries.js +11 -1
- package/build/services/mcp-runs/sql.d.ts +1 -1
- package/build/services/mcp-runs/sql.js +2 -2
- package/build/services/workflow-sets/db.d.ts +1 -0
- package/build/services/workflow-sets/db.js +6 -0
- package/build/services/workflow-sets/index.d.ts +1 -1
- package/build/services/workflow-sets/index.js +2 -1
- package/build/services/workflow-sets/sql.d.ts +1 -0
- package/build/services/workflow-sets/sql.js +6 -1
- package/build/services/yaml-workflow/builder-regenerate.d.ts +25 -0
- package/build/services/yaml-workflow/builder-regenerate.js +111 -0
- package/build/services/yaml-workflow/db-versions.d.ts +17 -0
- package/build/services/yaml-workflow/db-versions.js +76 -0
- package/build/services/yaml-workflow/db.d.ts +14 -12
- package/build/services/yaml-workflow/db.js +32 -70
- package/build/services/yaml-workflow/deployer-helpers.js +48 -17
- package/build/services/yaml-workflow/durable-compiler/index.d.ts +22 -0
- package/build/services/yaml-workflow/durable-compiler/index.js +168 -0
- package/build/services/yaml-workflow/durable-compiler/parser.d.ts +12 -0
- package/build/services/yaml-workflow/durable-compiler/parser.js +110 -0
- package/build/services/yaml-workflow/durable-compiler/prompts.d.ts +18 -0
- package/build/services/yaml-workflow/durable-compiler/prompts.js +570 -0
- package/build/services/yaml-workflow/durable-compiler/types.d.ts +51 -0
- package/build/services/yaml-workflow/durable-compiler/types.js +5 -0
- package/build/services/yaml-workflow/generator.js +4 -4
- package/build/services/yaml-workflow/pipeline/build/dag-assembly.d.ts +17 -0
- package/build/services/yaml-workflow/pipeline/build/dag-assembly.js +192 -0
- package/build/services/yaml-workflow/pipeline/build/dag.d.ts +4 -13
- package/build/services/yaml-workflow/pipeline/build/dag.js +9 -185
- package/build/services/yaml-workflow/pipeline/build/index.d.ts +2 -1
- package/build/services/yaml-workflow/pipeline/build/index.js +3 -2
- package/build/services/yaml-workflow/pipeline/build/utils.d.ts +0 -2
- package/build/services/yaml-workflow/pipeline/build/utils.js +0 -8
- package/build/services/yaml-workflow/pipeline/prompt-templates.d.ts +10 -0
- package/build/services/yaml-workflow/pipeline/prompt-templates.js +270 -0
- package/build/services/yaml-workflow/pipeline/prompts.d.ts +3 -6
- package/build/services/yaml-workflow/pipeline/prompts.js +8 -263
- package/build/services/yaml-workflow/sql.d.ts +2 -1
- package/build/services/yaml-workflow/sql.js +10 -3
- package/build/start/workers.js +6 -5
- package/build/system/activities/file-storage.d.ts +4 -0
- package/build/system/activities/file-storage.js +7 -1
- package/build/system/activities/knowledge.d.ts +23 -0
- package/build/system/activities/knowledge.js +50 -10
- package/build/system/activities/schema-exchange.d.ts +50 -0
- package/build/system/activities/schema-exchange.js +210 -0
- package/build/system/activities/sql.d.ts +4 -1
- package/build/system/activities/sql.js +37 -2
- package/build/system/index.js +1 -0
- package/build/system/mcp-servers/file-storage.js +3 -1
- package/build/system/mcp-servers/human-queue-schemas.d.ts +91 -0
- package/build/system/mcp-servers/human-queue-schemas.js +42 -0
- package/build/system/mcp-servers/human-queue.d.ts +2 -6
- package/build/system/mcp-servers/human-queue.js +9 -51
- package/build/system/mcp-servers/knowledge.js +69 -6
- package/build/system/mcp-servers/schema-exchange.d.ts +4 -0
- package/build/system/mcp-servers/schema-exchange.js +93 -0
- package/build/system/mcp-servers/workflow-compiler.js +54 -0
- package/build/system/seed/server-definitions.d.ts +112 -1
- package/build/system/seed/server-definitions.js +37 -0
- package/build/system/seed/tool-manifests-data.d.ts +87 -0
- package/build/system/seed/tool-manifests-data.js +37 -1
- package/build/system/seed/tool-manifests-knowledge.d.ts +9 -1
- package/build/system/seed/tool-manifests-knowledge.js +6 -5
- package/build/system/workflows/mcp-triage/activities-proxy.d.ts +21 -0
- package/build/system/workflows/mcp-triage/activities-proxy.js +70 -0
- package/build/system/workflows/mcp-triage/index.js +17 -75
- package/build/system/workflows/mcp-workflow-builder/prompts.d.ts +1 -1
- package/build/system/workflows/mcp-workflow-builder/prompts.js +21 -20
- package/build/system/workflows/mcp-workflow-planner/activities/persist.d.ts +2 -1
- package/build/system/workflows/mcp-workflow-planner/activities/persist.js +4 -3
- package/build/system/workflows/mcp-workflow-planner/index.js +41 -5
- package/build/system/workflows/mcp-workflow-planner/prompts.d.ts +1 -1
- package/build/system/workflows/mcp-workflow-planner/prompts.js +3 -3
- package/build/tsconfig.tsbuildinfo +1 -1
- package/dashboard/dist/assets/{AdminDashboard-DUrSBQOl.js → AdminDashboard-NLryl1_B.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-DUrSBQOl.js.map → AdminDashboard-NLryl1_B.js.map} +1 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-6vexlrk3.js +2 -0
- package/dashboard/dist/assets/AvailableEscalationsPage-6vexlrk3.js.map +1 -0
- package/dashboard/dist/assets/{BotPicker-Cg5iNEkm.js → BotPicker-DWhn0tr1.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-Cg5iNEkm.js.map → BotPicker-DWhn0tr1.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-Kd9UIyeU.js → CollapsibleSection-CgYgQiOc.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-Kd9UIyeU.js.map → CollapsibleSection-CgYgQiOc.js.map} +1 -1
- package/dashboard/dist/assets/{ConfirmDeleteModal-DZMgmlof.js → ConfirmDeleteModal-DCKAPXD3.js} +2 -2
- package/dashboard/dist/assets/{ConfirmDeleteModal-DZMgmlof.js.map → ConfirmDeleteModal-DCKAPXD3.js.map} +1 -1
- package/dashboard/dist/assets/{CopyableId-cPFTRm8q.js → CopyableId-DXkaAOYk.js} +2 -2
- package/dashboard/dist/assets/{CopyableId-cPFTRm8q.js.map → CopyableId-DXkaAOYk.js.map} +1 -1
- package/dashboard/dist/assets/CredentialsPage-B361BOfU.js +2 -0
- package/dashboard/dist/assets/{CredentialsPage-DJablIbs.js.map → CredentialsPage-B361BOfU.js.map} +1 -1
- package/dashboard/dist/assets/{CustomDurationPicker-NgIP6YDW.js → CustomDurationPicker-D2G1ldiF.js} +2 -2
- package/dashboard/dist/assets/{CustomDurationPicker-NgIP6YDW.js.map → CustomDurationPicker-D2G1ldiF.js.map} +1 -1
- package/dashboard/dist/assets/{DataTable-CTRhTAfT.js → DataTable-DXSUbA26.js} +2 -2
- package/dashboard/dist/assets/{DataTable-CTRhTAfT.js.map → DataTable-DXSUbA26.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-HcSJ_MMs.js → ElapsedCell-CQGqkXP_.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-HcSJ_MMs.js.map → ElapsedCell-CQGqkXP_.js.map} +1 -1
- package/dashboard/dist/assets/{EmptyState-joNbd4gg.js → EmptyState-Dep92Wkg.js} +2 -2
- package/dashboard/dist/assets/{EmptyState-joNbd4gg.js.map → EmptyState-Dep92Wkg.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-DpXDnQux.js → EscalationsOverview-DVEFVjs7.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-DpXDnQux.js.map → EscalationsOverview-DVEFVjs7.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-CYem3v8n.js → EventTable-BMJAPkMi.js} +2 -2
- package/dashboard/dist/assets/{EventTable-CYem3v8n.js.map → EventTable-BMJAPkMi.js.map} +1 -1
- package/dashboard/dist/assets/{FilterBar-BiO8SOzc.js → FilterBar-DbVbCzH2.js} +2 -2
- package/dashboard/dist/assets/{FilterBar-BiO8SOzc.js.map → FilterBar-DbVbCzH2.js.map} +1 -1
- package/dashboard/dist/assets/{ListToolbar-6yRDh2e9.js → ListToolbar-0XNuXj0M.js} +2 -2
- package/dashboard/dist/assets/{ListToolbar-6yRDh2e9.js.map → ListToolbar-0XNuXj0M.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-CUgSxkQe.js → McpOverview-CeYnCzBN.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-CUgSxkQe.js.map → McpOverview-CeYnCzBN.js.map} +1 -1
- package/dashboard/dist/assets/McpQueryDetailPage-t3qW3QNa.js +5 -0
- package/dashboard/dist/assets/McpQueryDetailPage-t3qW3QNa.js.map +1 -0
- package/dashboard/dist/assets/McpQueryPage-CfUcdzaj.js +2 -0
- package/dashboard/dist/assets/{McpQueryPage-lV6kfDG5.js.map → McpQueryPage-CfUcdzaj.js.map} +1 -1
- package/dashboard/dist/assets/McpRunDetailPage-CZtodW_Z.js +2 -0
- package/dashboard/dist/assets/McpRunDetailPage-CZtodW_Z.js.map +1 -0
- package/dashboard/dist/assets/McpRunsPage-Dzgq7HGt.js +2 -0
- package/dashboard/dist/assets/McpRunsPage-Dzgq7HGt.js.map +1 -0
- package/dashboard/dist/assets/{Modal-BuTvD0pz.js → Modal-yyhUeKoA.js} +2 -2
- package/dashboard/dist/assets/{Modal-BuTvD0pz.js.map → Modal-yyhUeKoA.js.map} +1 -1
- package/dashboard/dist/assets/OperatorDashboard-Ceh7OQtZ.js +2 -0
- package/dashboard/dist/assets/{OperatorDashboard-C9SSV96T.js.map → OperatorDashboard-Ceh7OQtZ.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeader-BcTVF9ul.js → PageHeader-CZ9a8cpr.js} +2 -2
- package/dashboard/dist/assets/{PageHeader-BcTVF9ul.js.map → PageHeader-CZ9a8cpr.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeaderWithStats-BI7JG5x6.js → PageHeaderWithStats-BJuNs5NM.js} +2 -2
- package/dashboard/dist/assets/{PageHeaderWithStats-BI7JG5x6.js.map → PageHeaderWithStats-BJuNs5NM.js.map} +1 -1
- package/dashboard/dist/assets/{PriorityBadge-DqVaOU65.js → PriorityBadge-BrPikMFy.js} +2 -2
- package/dashboard/dist/assets/{PriorityBadge-DqVaOU65.js.map → PriorityBadge-BrPikMFy.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessDetailPage-hFMhf9qa.js → ProcessDetailPage-2miaYd8G.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-hFMhf9qa.js.map → ProcessDetailPage-2miaYd8G.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessesListPage-ByVoBCQ3.js → ProcessesListPage-DqpRDqjk.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-ByVoBCQ3.js.map → ProcessesListPage-DqpRDqjk.js.map} +1 -1
- package/dashboard/dist/assets/{RolePill-D9ZIkYiu.js → RolePill-DxbJMfJu.js} +2 -2
- package/dashboard/dist/assets/{RolePill-D9ZIkYiu.js.map → RolePill-DxbJMfJu.js.map} +1 -1
- package/dashboard/dist/assets/{RolesPage-SMedMuqa.js → RolesPage-CYHRo21-.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-SMedMuqa.js.map → RolesPage-CYHRo21-.js.map} +1 -1
- package/dashboard/dist/assets/{RowActions-yDhwwDbU.js → RowActions-DurFwIwe.js} +2 -2
- package/dashboard/dist/assets/{RowActions-yDhwwDbU.js.map → RowActions-DurFwIwe.js.map} +1 -1
- package/dashboard/dist/assets/RunAsSelector-CNKraP6u.js +2 -0
- package/dashboard/dist/assets/RunAsSelector-CNKraP6u.js.map +1 -0
- package/dashboard/dist/assets/{StatCard-BrBnQFxh.js → StatCard-CKplpK3w.js} +2 -2
- package/dashboard/dist/assets/{StatCard-BrBnQFxh.js.map → StatCard-CKplpK3w.js.map} +1 -1
- package/dashboard/dist/assets/{StatusBadge-xgb-lZku.js → StatusBadge-Dm0V1dNN.js} +2 -2
- package/dashboard/dist/assets/{StatusBadge-xgb-lZku.js.map → StatusBadge-Dm0V1dNN.js.map} +1 -1
- package/dashboard/dist/assets/{StepIndicator-B9ps2SvM.js → StepIndicator-Dicx0WTZ.js} +2 -2
- package/dashboard/dist/assets/{StepIndicator-B9ps2SvM.js.map → StepIndicator-Dicx0WTZ.js.map} +1 -1
- package/dashboard/dist/assets/{StickyPagination-DTIjBKN3.js → StickyPagination-B2jYvU3-.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-DTIjBKN3.js.map → StickyPagination-B2jYvU3-.js.map} +1 -1
- package/dashboard/dist/assets/SwimlaneTimeline-ClwumkT1.js +2 -0
- package/dashboard/dist/assets/SwimlaneTimeline-ClwumkT1.js.map +1 -0
- package/dashboard/dist/assets/{TagInput-CdNUuqk4.js → TagInput-CypDZ6Kl.js} +2 -2
- package/dashboard/dist/assets/{TagInput-CdNUuqk4.js.map → TagInput-CypDZ6Kl.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-C-nzaNea.js → TaskDetailPage-DooDNJGT.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-C-nzaNea.js.map → TaskDetailPage-DooDNJGT.js.map} +1 -1
- package/dashboard/dist/assets/{TaskQueuePill-Lvr2-NzS.js → TaskQueuePill-C1hZ-j31.js} +2 -2
- package/dashboard/dist/assets/{TaskQueuePill-Lvr2-NzS.js.map → TaskQueuePill-C1hZ-j31.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-DSUmD84y.js → TasksListPage-D7CdkAeg.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-DSUmD84y.js.map → TasksListPage-D7CdkAeg.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-BZdLdrIh.js → TimeAgo-B5LXB2aj.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-BZdLdrIh.js.map → TimeAgo-B5LXB2aj.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-QX_0i5FK.js → TimestampCell-Crb9b0Gw.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-QX_0i5FK.js.map → TimestampCell-Crb9b0Gw.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-DyZMXcBm.js → UserName-OPg-nkRa.js} +2 -2
- package/dashboard/dist/assets/{UserName-DyZMXcBm.js.map → UserName-OPg-nkRa.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowExecutionPage-DjVxfZaF.js → WorkflowExecutionPage-CcLVrs9b.js} +2 -2
- package/dashboard/dist/assets/{WorkflowExecutionPage-DjVxfZaF.js.map → WorkflowExecutionPage-CcLVrs9b.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowPill-CCV4MMj7.js +2 -0
- package/dashboard/dist/assets/WorkflowPill-CCV4MMj7.js.map +1 -0
- package/dashboard/dist/assets/{WorkflowsDashboard-DZjuiFZ0.js → WorkflowsDashboard-DB1SncBi.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsDashboard-DZjuiFZ0.js.map → WorkflowsDashboard-DB1SncBi.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsOverview-CLnLRpOu.js → WorkflowsOverview-DvShiYJV.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-CLnLRpOu.js.map → WorkflowsOverview-DvShiYJV.js.map} +1 -1
- package/dashboard/dist/assets/YamlWorkflowsPage-DCBoMeGI.js +2 -0
- package/dashboard/dist/assets/YamlWorkflowsPage-DCBoMeGI.js.map +1 -0
- package/dashboard/dist/assets/{bots-DIM6lBoY.js → bots-Dqos20NE.js} +2 -2
- package/dashboard/dist/assets/{bots-DIM6lBoY.js.map → bots-Dqos20NE.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-JOTuOqjq.js → escalation-A0CsbvNV.js} +2 -2
- package/dashboard/dist/assets/{escalation-JOTuOqjq.js.map → escalation-A0CsbvNV.js.map} +1 -1
- package/dashboard/dist/assets/escalation-columns-BpBJN6k4.js +2 -0
- package/dashboard/dist/assets/{escalation-columns-Cyg58nkg.js.map → escalation-columns-BpBJN6k4.js.map} +1 -1
- package/dashboard/dist/assets/{helpers-B1BDxBZd.js → helpers-CmznCuAx.js} +2 -2
- package/dashboard/dist/assets/{helpers-B1BDxBZd.js.map → helpers-CmznCuAx.js.map} +1 -1
- package/dashboard/dist/assets/index-BIeYV5QK.js +2 -0
- package/dashboard/dist/assets/index-BIeYV5QK.js.map +1 -0
- package/dashboard/dist/assets/index-BYwD3kHN.js +5 -0
- package/dashboard/dist/assets/index-BYwD3kHN.js.map +1 -0
- package/dashboard/dist/assets/index-C5TUqJu0.css +1 -0
- package/dashboard/dist/assets/index-C8-UaN4N.js +2 -0
- package/dashboard/dist/assets/{index-Cg5nfiYX.js.map → index-C8-UaN4N.js.map} +1 -1
- package/dashboard/dist/assets/index-CAj5LT9H.js +15 -0
- package/dashboard/dist/assets/index-CAj5LT9H.js.map +1 -0
- package/dashboard/dist/assets/index-CjxHCVxl.js +2 -0
- package/dashboard/dist/assets/{index-Cf60K3x9.js.map → index-CjxHCVxl.js.map} +1 -1
- package/dashboard/dist/assets/index-Cr0Rqsj7.js +2 -0
- package/dashboard/dist/assets/index-Cr0Rqsj7.js.map +1 -0
- package/dashboard/dist/assets/index-DZHNte4o.js +2 -0
- package/dashboard/dist/assets/{index-Di12t56M.js.map → index-DZHNte4o.js.map} +1 -1
- package/dashboard/dist/assets/{index-Ds0JoXS2.js → index-VnYkWW8r.js} +2 -2
- package/dashboard/dist/assets/{index-Ds0JoXS2.js.map → index-VnYkWW8r.js.map} +1 -1
- package/dashboard/dist/assets/{index-BcR6PfpY.js → index-XGOmZ117.js} +2 -2
- package/dashboard/dist/assets/{index-BcR6PfpY.js.map → index-XGOmZ117.js.map} +1 -1
- package/dashboard/dist/assets/index-ZjOUzWhc.js +2 -0
- package/dashboard/dist/assets/index-ZjOUzWhc.js.map +1 -0
- package/dashboard/dist/assets/{index-BYZX9tOb.js → index-puKKZ5l8.js} +77 -77
- package/dashboard/dist/assets/index-puKKZ5l8.js.map +1 -0
- package/dashboard/dist/assets/{index-BizfauqT.js → index-t5frSddy.js} +4 -4
- package/dashboard/dist/assets/{index-BizfauqT.js.map → index-t5frSddy.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-B_xbczAt.js → mcp-DrWymhSu.js} +2 -2
- package/dashboard/dist/assets/{mcp-B_xbczAt.js.map → mcp-DrWymhSu.js.map} +1 -1
- package/dashboard/dist/assets/mcp-query-BhUxVEMS.js +2 -0
- package/dashboard/dist/assets/mcp-query-BhUxVEMS.js.map +1 -0
- package/dashboard/dist/assets/mcp-runs-DUfz4mLd.js +2 -0
- package/dashboard/dist/assets/mcp-runs-DUfz4mLd.js.map +1 -0
- package/dashboard/dist/assets/{namespaces-C3WtdO_9.js → namespaces-Cm6AY5sh.js} +2 -2
- package/dashboard/dist/assets/{namespaces-C3WtdO_9.js.map → namespaces-Cm6AY5sh.js.map} +1 -1
- package/dashboard/dist/assets/{roles-BDAsPpZG.js → roles-2v1Kc7BJ.js} +2 -2
- package/dashboard/dist/assets/{roles-BDAsPpZG.js.map → roles-2v1Kc7BJ.js.map} +1 -1
- package/dashboard/dist/assets/{settings-Ife_UwAp.js → settings-DTQNp6tH.js} +2 -2
- package/dashboard/dist/assets/{settings-Ife_UwAp.js.map → settings-DTQNp6tH.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-BquNDHDI.js → tasks-CS1rgG1s.js} +2 -2
- package/dashboard/dist/assets/{tasks-BquNDHDI.js.map → tasks-CS1rgG1s.js.map} +1 -1
- package/dashboard/dist/assets/useEventHooks-BjXX8x3a.js +2 -0
- package/dashboard/dist/assets/{useEventHooks-anv_B2Yy.js.map → useEventHooks-BjXX8x3a.js.map} +1 -1
- package/dashboard/dist/assets/useFilterParams-CGRYFw_A.js +2 -0
- package/dashboard/dist/assets/useFilterParams-CGRYFw_A.js.map +1 -0
- package/dashboard/dist/assets/useYamlActivityEvents-BeR-nVWQ.js +2 -0
- package/dashboard/dist/assets/useYamlActivityEvents-BeR-nVWQ.js.map +1 -0
- package/dashboard/dist/assets/{users-CFcxB4v6.js → users-DYsdQ7Md.js} +2 -2
- package/dashboard/dist/assets/{users-CFcxB4v6.js.map → users-DYsdQ7Md.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-T4r2DSPD.js → vendor-icons-CWl44VA6.js} +132 -82
- package/dashboard/dist/assets/vendor-icons-CWl44VA6.js.map +1 -0
- package/dashboard/dist/assets/{workflows-CeRci9z3.js → workflows-2QAXh3UD.js} +2 -2
- package/dashboard/dist/assets/{workflows-CeRci9z3.js.map → workflows-2QAXh3UD.js.map} +1 -1
- package/dashboard/dist/assets/yaml-workflows-sx8-UEE3.js +2 -0
- package/dashboard/dist/assets/yaml-workflows-sx8-UEE3.js.map +1 -0
- package/dashboard/dist/index.html +3 -3
- package/docs/api/http/file-browser.md +101 -0
- package/docs/api/http/knowledge.md +203 -0
- package/docs/api/http/settings.md +6 -4
- package/docs/api/sdk/files.md +68 -0
- package/docs/api/sdk/knowledge.md +126 -0
- package/docs/api/sdk/settings.md +3 -2
- package/docs/cli.md +171 -0
- package/docs/compilation.md +16 -0
- package/docs/compiler.md +311 -0
- package/docs/events.md +19 -0
- package/docs/schema-exchange.md +173 -0
- package/docs/self-test.md +106 -0
- package/docs/workflows.md +19 -0
- package/package.json +15 -2
- package/build/api/escalations.d.ts +0 -271
- package/build/api/escalations.js +0 -932
- package/build/api/workflows.d.ts +0 -158
- package/build/api/workflows.js +0 -414
- package/dashboard/dist/assets/AvailableEscalationsPage-Dbd1qUK_.js +0 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-Dbd1qUK_.js.map +0 -1
- package/dashboard/dist/assets/CredentialsPage-DJablIbs.js +0 -2
- package/dashboard/dist/assets/McpQueryDetailPage-BWbinTM_.js +0 -5
- package/dashboard/dist/assets/McpQueryDetailPage-BWbinTM_.js.map +0 -1
- package/dashboard/dist/assets/McpQueryPage-lV6kfDG5.js +0 -2
- package/dashboard/dist/assets/McpRunDetailPage-D6gaxH3_.js +0 -2
- package/dashboard/dist/assets/McpRunDetailPage-D6gaxH3_.js.map +0 -1
- package/dashboard/dist/assets/McpRunsPage-DKvTklh9.js +0 -2
- package/dashboard/dist/assets/McpRunsPage-DKvTklh9.js.map +0 -1
- package/dashboard/dist/assets/OperatorDashboard-C9SSV96T.js +0 -2
- package/dashboard/dist/assets/SwimlaneTimeline-RK4Yu66z.js +0 -2
- package/dashboard/dist/assets/SwimlaneTimeline-RK4Yu66z.js.map +0 -1
- package/dashboard/dist/assets/WorkflowPill-CZqGslD6.js +0 -2
- package/dashboard/dist/assets/WorkflowPill-CZqGslD6.js.map +0 -1
- package/dashboard/dist/assets/YamlWorkflowsPage-VjdhnLmO.js +0 -2
- package/dashboard/dist/assets/YamlWorkflowsPage-VjdhnLmO.js.map +0 -1
- package/dashboard/dist/assets/escalation-columns-Cyg58nkg.js +0 -2
- package/dashboard/dist/assets/helpers-BCix9c_m.js +0 -2
- package/dashboard/dist/assets/helpers-BCix9c_m.js.map +0 -1
- package/dashboard/dist/assets/index-BUK3qR-1.js +0 -2
- package/dashboard/dist/assets/index-BUK3qR-1.js.map +0 -1
- package/dashboard/dist/assets/index-BYZX9tOb.js.map +0 -1
- package/dashboard/dist/assets/index-Cf60K3x9.js +0 -2
- package/dashboard/dist/assets/index-Cg5nfiYX.js +0 -2
- package/dashboard/dist/assets/index-D1wVX50Z.js +0 -15
- package/dashboard/dist/assets/index-D1wVX50Z.js.map +0 -1
- package/dashboard/dist/assets/index-DDYFpi4l.js +0 -5
- package/dashboard/dist/assets/index-DDYFpi4l.js.map +0 -1
- package/dashboard/dist/assets/index-DcIKW-cZ.css +0 -1
- package/dashboard/dist/assets/index-Di12t56M.js +0 -2
- package/dashboard/dist/assets/mcp-query-B8-P_QoG.js +0 -2
- package/dashboard/dist/assets/mcp-query-B8-P_QoG.js.map +0 -1
- package/dashboard/dist/assets/mcp-runs-CWeZinoF.js +0 -2
- package/dashboard/dist/assets/mcp-runs-CWeZinoF.js.map +0 -1
- package/dashboard/dist/assets/useEventHooks-anv_B2Yy.js +0 -2
- package/dashboard/dist/assets/useFilterParams-BUyLHcx_.js +0 -2
- package/dashboard/dist/assets/useFilterParams-BUyLHcx_.js.map +0 -1
- package/dashboard/dist/assets/useYamlActivityEvents-DN-PTgVx.js +0 -2
- package/dashboard/dist/assets/useYamlActivityEvents-DN-PTgVx.js.map +0 -1
- package/dashboard/dist/assets/vendor-icons-T4r2DSPD.js.map +0 -1
- package/dashboard/dist/assets/yaml-workflows-DLwd2BOX.js +0 -2
- package/dashboard/dist/assets/yaml-workflows-DLwd2BOX.js.map +0 -1
package/README.md
CHANGED
|
@@ -70,6 +70,19 @@ export async function analyzeContent(content: string) {
|
|
|
70
70
|
}
|
|
71
71
|
```
|
|
72
72
|
|
|
73
|
+
## Compile Workflows
|
|
74
|
+
|
|
75
|
+
Write durable workflows in TypeScript. Compile to YAML DAGs that run without replay overhead. `ltc` is the compiler — like `tsc` for workflows.
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
export ANTHROPIC_API_KEY=sk-ant-...
|
|
79
|
+
|
|
80
|
+
npx ltc compile workflows/ # scan and compile all workflow files
|
|
81
|
+
npx ltc compile --dry-run # discover without compiling
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
The source is the spec. The compiled YAML is the optimized execution. Both live in the repo. See the [Compiler Guide](docs/compiler.md).
|
|
85
|
+
|
|
73
86
|
## Certify a Workflow
|
|
74
87
|
|
|
75
88
|
Any durable workflow can be promoted to **certified** through the dashboard or API. A certified workflow gains interceptor guarantees: failures escalate instead of throwing, escalation chains route through roles, and every error is either handled or surfaced. It cannot silently fail.
|
|
@@ -243,6 +256,8 @@ All modes share PostgreSQL and scale independently. See [Cloud Deployment](docs/
|
|
|
243
256
|
| [Dashboard](docs/dashboard.md) | Navigation, key pages, event feed |
|
|
244
257
|
| [MCP](docs/mcp.md) | Server registration, tool calls, human queue |
|
|
245
258
|
| [Compilation](docs/compilation.md) | Dynamic → deterministic pipeline wizard |
|
|
259
|
+
| [Compiler](docs/compiler.md) | `ltc compile` — durable TypeScript to YAML DAGs |
|
|
260
|
+
| [CLI](docs/cli.md) | `ltc` — terminal access to workflows, escalations, knowledge, MCP |
|
|
246
261
|
| [Escalation Strategies](docs/escalation-strategies.md) | Default, MCP triage, custom handlers |
|
|
247
262
|
| [SDK](docs/sdk.md) | Embedded usage, `createClient`, event subscriptions |
|
|
248
263
|
| [Architecture](docs/architecture.md) | Project structure, conventions, discovery |
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type { LTApiResult, LTApiAuth } from '../../types/sdk';
|
|
2
|
+
/**
|
|
3
|
+
* Release all escalation claims past their `assigned_until` deadline.
|
|
4
|
+
*
|
|
5
|
+
* Typically called on a maintenance schedule. Returns the count of
|
|
6
|
+
* released claims.
|
|
7
|
+
*
|
|
8
|
+
* @returns `{ status: 200, data: { released: number } }`
|
|
9
|
+
*/
|
|
10
|
+
export declare function releaseExpiredClaims(): Promise<LTApiResult>;
|
|
11
|
+
/**
|
|
12
|
+
* Update priority for one or more escalations.
|
|
13
|
+
*
|
|
14
|
+
* @param input.ids — array of escalation UUIDs
|
|
15
|
+
* @param input.priority — new priority (1=critical, 2=high, 3=medium, 4=low)
|
|
16
|
+
* @param auth — authenticated user context (admin or role-holder required)
|
|
17
|
+
* @returns `{ status: 200, data: { updated: number } }`
|
|
18
|
+
*/
|
|
19
|
+
export declare function updatePriority(input: {
|
|
20
|
+
ids: string[];
|
|
21
|
+
priority: number;
|
|
22
|
+
}, auth: LTApiAuth): Promise<LTApiResult>;
|
|
23
|
+
/**
|
|
24
|
+
* Claim multiple escalations at once for the authenticated user.
|
|
25
|
+
*
|
|
26
|
+
* @param input.ids — array of escalation UUIDs
|
|
27
|
+
* @param input.durationMinutes — claim duration (default: 30)
|
|
28
|
+
* @param auth — authenticated user context
|
|
29
|
+
* @returns `{ status: 200, data: { claimed, skipped } }`
|
|
30
|
+
*/
|
|
31
|
+
export declare function bulkClaim(input: {
|
|
32
|
+
ids: string[];
|
|
33
|
+
durationMinutes?: number;
|
|
34
|
+
}, auth: LTApiAuth): Promise<LTApiResult>;
|
|
35
|
+
/**
|
|
36
|
+
* Assign multiple escalations to a specific user.
|
|
37
|
+
*
|
|
38
|
+
* Non-superadmin callers must verify the target user holds each
|
|
39
|
+
* escalation's role. Publishes claim events for assigned items.
|
|
40
|
+
*
|
|
41
|
+
* @param input.ids — array of escalation UUIDs
|
|
42
|
+
* @param input.targetUserId — user to assign to
|
|
43
|
+
* @param input.durationMinutes — assignment duration (default: 30)
|
|
44
|
+
* @param auth — authenticated user context
|
|
45
|
+
* @returns `{ status: 200, data: { assigned, skipped } }`
|
|
46
|
+
*/
|
|
47
|
+
export declare function bulkAssign(input: {
|
|
48
|
+
ids: string[];
|
|
49
|
+
targetUserId: string;
|
|
50
|
+
durationMinutes?: number;
|
|
51
|
+
}, auth: LTApiAuth): Promise<LTApiResult>;
|
|
52
|
+
/**
|
|
53
|
+
* Route multiple escalations to a different role.
|
|
54
|
+
*
|
|
55
|
+
* @param input.ids — array of escalation UUIDs
|
|
56
|
+
* @param input.targetRole — destination role
|
|
57
|
+
* @param auth — authenticated user context
|
|
58
|
+
* @returns `{ status: 200, data: { updated: number } }`
|
|
59
|
+
*/
|
|
60
|
+
export declare function bulkEscalate(input: {
|
|
61
|
+
ids: string[];
|
|
62
|
+
targetRole: string;
|
|
63
|
+
}, auth: LTApiAuth): Promise<LTApiResult>;
|
|
64
|
+
/**
|
|
65
|
+
* Trigger AI triage for multiple escalations.
|
|
66
|
+
*
|
|
67
|
+
* Resolves each escalation and starts a triage workflow that uses MCP
|
|
68
|
+
* tools to analyze and potentially auto-resolve the issue.
|
|
69
|
+
*
|
|
70
|
+
* @param input.ids — array of escalation UUIDs
|
|
71
|
+
* @param input.hint — optional natural-language guidance for the triage AI
|
|
72
|
+
* @param auth — authenticated user context
|
|
73
|
+
* @returns `{ status: 200, data: { triaged, workflows } }`
|
|
74
|
+
*/
|
|
75
|
+
export declare function bulkTriage(input: {
|
|
76
|
+
ids: string[];
|
|
77
|
+
hint?: string;
|
|
78
|
+
}, auth: LTApiAuth): Promise<LTApiResult>;
|
|
@@ -0,0 +1,279 @@
|
|
|
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.releaseExpiredClaims = releaseExpiredClaims;
|
|
37
|
+
exports.updatePriority = updatePriority;
|
|
38
|
+
exports.bulkClaim = bulkClaim;
|
|
39
|
+
exports.bulkAssign = bulkAssign;
|
|
40
|
+
exports.bulkEscalate = bulkEscalate;
|
|
41
|
+
exports.bulkTriage = bulkTriage;
|
|
42
|
+
const escalationService = __importStar(require("../../services/escalation"));
|
|
43
|
+
const userService = __importStar(require("../../services/user"));
|
|
44
|
+
const taskService = __importStar(require("../../services/task"));
|
|
45
|
+
const workers_1 = require("../../workers");
|
|
46
|
+
const defaults_1 = require("../../modules/defaults");
|
|
47
|
+
const helpers_1 = require("./helpers");
|
|
48
|
+
// ── Bulk routes ────────────────────────────────────────────────────────────
|
|
49
|
+
/**
|
|
50
|
+
* Release all escalation claims past their `assigned_until` deadline.
|
|
51
|
+
*
|
|
52
|
+
* Typically called on a maintenance schedule. Returns the count of
|
|
53
|
+
* released claims.
|
|
54
|
+
*
|
|
55
|
+
* @returns `{ status: 200, data: { released: number } }`
|
|
56
|
+
*/
|
|
57
|
+
async function releaseExpiredClaims() {
|
|
58
|
+
try {
|
|
59
|
+
const released = await escalationService.releaseExpiredClaims();
|
|
60
|
+
return { status: 200, data: { released } };
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
return { status: 500, error: err.message };
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Update priority for one or more escalations.
|
|
68
|
+
*
|
|
69
|
+
* @param input.ids — array of escalation UUIDs
|
|
70
|
+
* @param input.priority — new priority (1=critical, 2=high, 3=medium, 4=low)
|
|
71
|
+
* @param auth — authenticated user context (admin or role-holder required)
|
|
72
|
+
* @returns `{ status: 200, data: { updated: number } }`
|
|
73
|
+
*/
|
|
74
|
+
async function updatePriority(input, auth) {
|
|
75
|
+
try {
|
|
76
|
+
const { ids, priority } = input;
|
|
77
|
+
if (!(0, helpers_1.validateIds)(ids)) {
|
|
78
|
+
return { status: 400, error: 'ids must be a non-empty array' };
|
|
79
|
+
}
|
|
80
|
+
if (![1, 2, 3, 4].includes(priority)) {
|
|
81
|
+
return { status: 400, error: 'priority must be 1, 2, 3, or 4' };
|
|
82
|
+
}
|
|
83
|
+
const perm = await (0, helpers_1.checkBulkPermission)(auth.userId, ids);
|
|
84
|
+
if (!perm.allowed)
|
|
85
|
+
return perm;
|
|
86
|
+
const updated = await escalationService.updateEscalationsPriority(ids, priority);
|
|
87
|
+
return { status: 200, data: { updated } };
|
|
88
|
+
}
|
|
89
|
+
catch (err) {
|
|
90
|
+
return { status: 500, error: err.message };
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Claim multiple escalations at once for the authenticated user.
|
|
95
|
+
*
|
|
96
|
+
* @param input.ids — array of escalation UUIDs
|
|
97
|
+
* @param input.durationMinutes — claim duration (default: 30)
|
|
98
|
+
* @param auth — authenticated user context
|
|
99
|
+
* @returns `{ status: 200, data: { claimed, skipped } }`
|
|
100
|
+
*/
|
|
101
|
+
async function bulkClaim(input, auth) {
|
|
102
|
+
try {
|
|
103
|
+
const { ids, durationMinutes } = input;
|
|
104
|
+
if (!(0, helpers_1.validateIds)(ids)) {
|
|
105
|
+
return { status: 400, error: 'ids must be a non-empty array' };
|
|
106
|
+
}
|
|
107
|
+
const perm = await (0, helpers_1.checkBulkPermission)(auth.userId, ids);
|
|
108
|
+
if (!perm.allowed)
|
|
109
|
+
return perm;
|
|
110
|
+
const result = await escalationService.bulkClaimEscalations(ids, auth.userId, durationMinutes ?? 30);
|
|
111
|
+
if (result.claimed > 0)
|
|
112
|
+
(0, helpers_1.publishBulkClaimEvents)(ids, auth.userId);
|
|
113
|
+
return { status: 200, data: result };
|
|
114
|
+
}
|
|
115
|
+
catch (err) {
|
|
116
|
+
return { status: 500, error: err.message };
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Assign multiple escalations to a specific user.
|
|
121
|
+
*
|
|
122
|
+
* Non-superadmin callers must verify the target user holds each
|
|
123
|
+
* escalation's role. Publishes claim events for assigned items.
|
|
124
|
+
*
|
|
125
|
+
* @param input.ids — array of escalation UUIDs
|
|
126
|
+
* @param input.targetUserId — user to assign to
|
|
127
|
+
* @param input.durationMinutes — assignment duration (default: 30)
|
|
128
|
+
* @param auth — authenticated user context
|
|
129
|
+
* @returns `{ status: 200, data: { assigned, skipped } }`
|
|
130
|
+
*/
|
|
131
|
+
async function bulkAssign(input, auth) {
|
|
132
|
+
try {
|
|
133
|
+
const { ids, targetUserId, durationMinutes } = input;
|
|
134
|
+
if (!(0, helpers_1.validateIds)(ids)) {
|
|
135
|
+
return { status: 400, error: 'ids must be a non-empty array' };
|
|
136
|
+
}
|
|
137
|
+
if (!targetUserId || typeof targetUserId !== 'string') {
|
|
138
|
+
return { status: 400, error: 'targetUserId is required' };
|
|
139
|
+
}
|
|
140
|
+
const perm = await (0, helpers_1.checkBulkPermission)(auth.userId, ids);
|
|
141
|
+
if (!perm.allowed)
|
|
142
|
+
return perm;
|
|
143
|
+
// Non-superadmin: target user must hold each escalation's role
|
|
144
|
+
const isSuperAdminUser = await userService.isSuperAdmin(auth.userId);
|
|
145
|
+
if (!isSuperAdminUser) {
|
|
146
|
+
const roles = await escalationService.getEscalationRoles(ids);
|
|
147
|
+
for (const role of roles) {
|
|
148
|
+
const targetHasRole = await userService.hasRole(targetUserId, role);
|
|
149
|
+
if (!targetHasRole) {
|
|
150
|
+
return { status: 400, error: `Target user does not hold the "${role}" role` };
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
const result = await escalationService.bulkAssignEscalations(ids, targetUserId, durationMinutes ?? 30);
|
|
155
|
+
if (result.assigned > 0)
|
|
156
|
+
(0, helpers_1.publishBulkClaimEvents)(ids, targetUserId);
|
|
157
|
+
return { status: 200, data: result };
|
|
158
|
+
}
|
|
159
|
+
catch (err) {
|
|
160
|
+
return { status: 500, error: err.message };
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Route multiple escalations to a different role.
|
|
165
|
+
*
|
|
166
|
+
* @param input.ids — array of escalation UUIDs
|
|
167
|
+
* @param input.targetRole — destination role
|
|
168
|
+
* @param auth — authenticated user context
|
|
169
|
+
* @returns `{ status: 200, data: { updated: number } }`
|
|
170
|
+
*/
|
|
171
|
+
async function bulkEscalate(input, auth) {
|
|
172
|
+
try {
|
|
173
|
+
const { ids, targetRole } = input;
|
|
174
|
+
if (!(0, helpers_1.validateIds)(ids)) {
|
|
175
|
+
return { status: 400, error: 'ids must be a non-empty array' };
|
|
176
|
+
}
|
|
177
|
+
if (!targetRole || typeof targetRole !== 'string') {
|
|
178
|
+
return { status: 400, error: 'targetRole is required' };
|
|
179
|
+
}
|
|
180
|
+
const perm = await (0, helpers_1.checkBulkPermission)(auth.userId, ids);
|
|
181
|
+
if (!perm.allowed)
|
|
182
|
+
return perm;
|
|
183
|
+
const updated = await escalationService.bulkEscalateToRole(ids, targetRole);
|
|
184
|
+
return { status: 200, data: { updated } };
|
|
185
|
+
}
|
|
186
|
+
catch (err) {
|
|
187
|
+
return { status: 500, error: err.message };
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Trigger AI triage for multiple escalations.
|
|
192
|
+
*
|
|
193
|
+
* Resolves each escalation and starts a triage workflow that uses MCP
|
|
194
|
+
* tools to analyze and potentially auto-resolve the issue.
|
|
195
|
+
*
|
|
196
|
+
* @param input.ids — array of escalation UUIDs
|
|
197
|
+
* @param input.hint — optional natural-language guidance for the triage AI
|
|
198
|
+
* @param auth — authenticated user context
|
|
199
|
+
* @returns `{ status: 200, data: { triaged, workflows } }`
|
|
200
|
+
*/
|
|
201
|
+
async function bulkTriage(input, auth) {
|
|
202
|
+
try {
|
|
203
|
+
const { ids, hint } = input;
|
|
204
|
+
if (!(0, helpers_1.validateIds)(ids)) {
|
|
205
|
+
return { status: 400, error: 'ids must be a non-empty array' };
|
|
206
|
+
}
|
|
207
|
+
const perm = await (0, helpers_1.checkBulkPermission)(auth.userId, ids);
|
|
208
|
+
if (!perm.allowed)
|
|
209
|
+
return perm;
|
|
210
|
+
const resolved = await escalationService.bulkResolveForTriage(ids, hint);
|
|
211
|
+
const client = (0, workers_1.createClient)();
|
|
212
|
+
const workflowIds = [];
|
|
213
|
+
for (const escalation of resolved) {
|
|
214
|
+
const triageWorkflowId = await startTriageWorkflow(escalation, hint, auth.userId, client);
|
|
215
|
+
workflowIds.push(triageWorkflowId);
|
|
216
|
+
}
|
|
217
|
+
return { status: 200, data: { triaged: resolved.length, workflows: workflowIds } };
|
|
218
|
+
}
|
|
219
|
+
catch (err) {
|
|
220
|
+
return { status: 500, error: err.message };
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
// ── Triage workflow launcher (shared by bulkTriage) ────────────────────────
|
|
224
|
+
async function startTriageWorkflow(escalation, hint, userId, client) {
|
|
225
|
+
let escalationPayload = {};
|
|
226
|
+
if (escalation.escalation_payload) {
|
|
227
|
+
try {
|
|
228
|
+
escalationPayload = JSON.parse(escalation.escalation_payload);
|
|
229
|
+
}
|
|
230
|
+
catch { }
|
|
231
|
+
}
|
|
232
|
+
let envelope = {};
|
|
233
|
+
if (escalation.envelope) {
|
|
234
|
+
try {
|
|
235
|
+
envelope = JSON.parse(escalation.envelope);
|
|
236
|
+
}
|
|
237
|
+
catch { }
|
|
238
|
+
}
|
|
239
|
+
const triageWorkflowId = `triage-${escalation.id}-${Date.now()}`;
|
|
240
|
+
const triageEnvelope = {
|
|
241
|
+
data: {
|
|
242
|
+
escalationId: escalation.id,
|
|
243
|
+
originId: escalation.origin_id ?? undefined,
|
|
244
|
+
originalWorkflowType: escalation.workflow_type,
|
|
245
|
+
originalTaskQueue: escalation.task_queue,
|
|
246
|
+
originalTaskId: escalation.task_id,
|
|
247
|
+
escalationPayload,
|
|
248
|
+
resolverPayload: {
|
|
249
|
+
_lt: { needsTriage: true, ...(hint ? { hint } : {}) },
|
|
250
|
+
},
|
|
251
|
+
},
|
|
252
|
+
metadata: envelope.metadata || {},
|
|
253
|
+
lt: { ...(envelope.lt || {}), userId },
|
|
254
|
+
};
|
|
255
|
+
const routing = escalation.task_id
|
|
256
|
+
? (await taskService.getTask(escalation.task_id))?.metadata
|
|
257
|
+
: null;
|
|
258
|
+
await taskService.createTask({
|
|
259
|
+
workflow_id: triageWorkflowId,
|
|
260
|
+
workflow_type: 'mcpTriage',
|
|
261
|
+
lt_type: 'mcpTriage',
|
|
262
|
+
task_queue: 'long-tail-system',
|
|
263
|
+
signal_id: `lt-triage-${triageWorkflowId}`,
|
|
264
|
+
parent_workflow_id: routing?.parentWorkflowId || triageWorkflowId,
|
|
265
|
+
origin_id: escalation.origin_id || triageWorkflowId,
|
|
266
|
+
parent_id: escalation.parent_id ?? undefined,
|
|
267
|
+
envelope: JSON.stringify(triageEnvelope),
|
|
268
|
+
metadata: routing || undefined,
|
|
269
|
+
});
|
|
270
|
+
await client.workflow.start({
|
|
271
|
+
workflowName: 'mcpTriage',
|
|
272
|
+
args: [triageEnvelope],
|
|
273
|
+
taskQueue: 'long-tail-system',
|
|
274
|
+
workflowId: triageWorkflowId,
|
|
275
|
+
expire: defaults_1.JOB_EXPIRE_SECS,
|
|
276
|
+
entity: 'mcpTriage',
|
|
277
|
+
});
|
|
278
|
+
return triageWorkflowId;
|
|
279
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { LTApiResult, LTApiAuth } from '../../types/sdk';
|
|
2
|
+
/**
|
|
3
|
+
* Claim a pending escalation for the authenticated user.
|
|
4
|
+
*
|
|
5
|
+
* Sets `assigned_to` and `assigned_until` on the escalation (soft lock).
|
|
6
|
+
* Non-superadmin users must hold the escalation's role. Publishes a
|
|
7
|
+
* `escalation.claimed` event.
|
|
8
|
+
*
|
|
9
|
+
* @param input.id — escalation UUID
|
|
10
|
+
* @param input.durationMinutes — claim duration (default: 30)
|
|
11
|
+
* @param auth — authenticated user context
|
|
12
|
+
* @returns `{ status: 200, data: { escalation, isExtension } }` or 403/404/409
|
|
13
|
+
*/
|
|
14
|
+
export declare function claimEscalation(input: {
|
|
15
|
+
id: string;
|
|
16
|
+
durationMinutes?: number;
|
|
17
|
+
}, auth: LTApiAuth): Promise<LTApiResult>;
|
|
18
|
+
/**
|
|
19
|
+
* Release a claimed escalation back to the pool.
|
|
20
|
+
*
|
|
21
|
+
* Only the user who holds the claim can release it. Publishes a
|
|
22
|
+
* `escalation.released` event.
|
|
23
|
+
*
|
|
24
|
+
* @param input.id — escalation UUID
|
|
25
|
+
* @param auth — authenticated user context
|
|
26
|
+
* @returns `{ status: 200, data: { escalation } }` or 409
|
|
27
|
+
*/
|
|
28
|
+
export declare function releaseEscalation(input: {
|
|
29
|
+
id: string;
|
|
30
|
+
}, auth: LTApiAuth): Promise<LTApiResult>;
|
|
@@ -0,0 +1,121 @@
|
|
|
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.claimEscalation = claimEscalation;
|
|
37
|
+
exports.releaseEscalation = releaseEscalation;
|
|
38
|
+
const escalationService = __importStar(require("../../services/escalation"));
|
|
39
|
+
const userService = __importStar(require("../../services/user"));
|
|
40
|
+
const publish_1 = require("../../lib/events/publish");
|
|
41
|
+
/**
|
|
42
|
+
* Claim a pending escalation for the authenticated user.
|
|
43
|
+
*
|
|
44
|
+
* Sets `assigned_to` and `assigned_until` on the escalation (soft lock).
|
|
45
|
+
* Non-superadmin users must hold the escalation's role. Publishes a
|
|
46
|
+
* `escalation.claimed` event.
|
|
47
|
+
*
|
|
48
|
+
* @param input.id — escalation UUID
|
|
49
|
+
* @param input.durationMinutes — claim duration (default: 30)
|
|
50
|
+
* @param auth — authenticated user context
|
|
51
|
+
* @returns `{ status: 200, data: { escalation, isExtension } }` or 403/404/409
|
|
52
|
+
*/
|
|
53
|
+
async function claimEscalation(input, auth) {
|
|
54
|
+
try {
|
|
55
|
+
const { id, durationMinutes } = input;
|
|
56
|
+
const escalation = await escalationService.getEscalation(id);
|
|
57
|
+
if (!escalation) {
|
|
58
|
+
return { status: 404, error: 'Escalation not found' };
|
|
59
|
+
}
|
|
60
|
+
const isSuperAdminUser = await userService.isSuperAdmin(auth.userId);
|
|
61
|
+
if (!isSuperAdminUser) {
|
|
62
|
+
const userHasRole = await userService.hasRole(auth.userId, escalation.role);
|
|
63
|
+
if (!userHasRole) {
|
|
64
|
+
return {
|
|
65
|
+
status: 403,
|
|
66
|
+
error: `You must have the "${escalation.role}" role to claim this escalation`,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
const result = await escalationService.claimEscalation(id, auth.userId, durationMinutes);
|
|
71
|
+
if (!result) {
|
|
72
|
+
return { status: 409, error: 'Escalation not available for claim' };
|
|
73
|
+
}
|
|
74
|
+
(0, publish_1.publishEscalationEvent)({
|
|
75
|
+
type: 'escalation.claimed',
|
|
76
|
+
source: 'api',
|
|
77
|
+
workflowId: escalation.workflow_id || '',
|
|
78
|
+
workflowName: escalation.workflow_type || '',
|
|
79
|
+
taskQueue: escalation.task_queue || '',
|
|
80
|
+
escalationId: id,
|
|
81
|
+
status: 'claimed',
|
|
82
|
+
data: { assigned_to: auth.userId },
|
|
83
|
+
});
|
|
84
|
+
return { status: 200, data: result };
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
return { status: 500, error: err.message };
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Release a claimed escalation back to the pool.
|
|
92
|
+
*
|
|
93
|
+
* Only the user who holds the claim can release it. Publishes a
|
|
94
|
+
* `escalation.released` event.
|
|
95
|
+
*
|
|
96
|
+
* @param input.id — escalation UUID
|
|
97
|
+
* @param auth — authenticated user context
|
|
98
|
+
* @returns `{ status: 200, data: { escalation } }` or 409
|
|
99
|
+
*/
|
|
100
|
+
async function releaseEscalation(input, auth) {
|
|
101
|
+
try {
|
|
102
|
+
const result = await escalationService.releaseEscalation(input.id, auth.userId);
|
|
103
|
+
if (!result) {
|
|
104
|
+
return { status: 409, error: 'Escalation not found or not claimed by you' };
|
|
105
|
+
}
|
|
106
|
+
(0, publish_1.publishEscalationEvent)({
|
|
107
|
+
type: 'escalation.released',
|
|
108
|
+
source: 'api',
|
|
109
|
+
workflowId: result.workflow_id || '',
|
|
110
|
+
workflowName: result.workflow_type || '',
|
|
111
|
+
taskQueue: result.task_queue || '',
|
|
112
|
+
escalationId: input.id,
|
|
113
|
+
status: 'released',
|
|
114
|
+
data: { released_by: auth.userId },
|
|
115
|
+
});
|
|
116
|
+
return { status: 200, data: { escalation: result } };
|
|
117
|
+
}
|
|
118
|
+
catch (err) {
|
|
119
|
+
return { status: 500, error: err.message };
|
|
120
|
+
}
|
|
121
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { LTApiResult, LTApiAuth } from '../../types/sdk';
|
|
2
|
+
/**
|
|
3
|
+
* Create a standalone escalation (not tied to a workflow).
|
|
4
|
+
*
|
|
5
|
+
* Useful for manual work items, support tickets, or approval requests
|
|
6
|
+
* that originate outside the durable workflow engine. The caller must
|
|
7
|
+
* hold the target role or be a superadmin.
|
|
8
|
+
*
|
|
9
|
+
* @param input.type — escalation category (e.g. `"support"`, `"approval"`)
|
|
10
|
+
* @param input.subtype — subcategory for finer routing
|
|
11
|
+
* @param input.role — role responsible for resolving this escalation
|
|
12
|
+
* @param input.description — human-readable summary
|
|
13
|
+
* @param input.priority — 1 (critical) through 4 (low), default 2
|
|
14
|
+
* @param input.envelope — serialized context for the resolver
|
|
15
|
+
* @param input.metadata — arbitrary key-value data (e.g. signal_routing)
|
|
16
|
+
* @param input.escalation_payload — serialized payload for the resolver UI
|
|
17
|
+
* @param auth — authenticated user context (must hold target role or be superadmin)
|
|
18
|
+
* @returns `{ status: 201, data: <escalation record> }`
|
|
19
|
+
*/
|
|
20
|
+
export declare function createEscalation(input: {
|
|
21
|
+
type: string;
|
|
22
|
+
subtype?: string;
|
|
23
|
+
role: string;
|
|
24
|
+
description?: string;
|
|
25
|
+
priority?: number;
|
|
26
|
+
envelope?: string;
|
|
27
|
+
metadata?: Record<string, any>;
|
|
28
|
+
escalation_payload?: string;
|
|
29
|
+
}, auth: LTApiAuth): Promise<LTApiResult>;
|
|
@@ -0,0 +1,101 @@
|
|
|
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.createEscalation = createEscalation;
|
|
37
|
+
const escalationService = __importStar(require("../../services/escalation"));
|
|
38
|
+
const userService = __importStar(require("../../services/user"));
|
|
39
|
+
const publish_1 = require("../../lib/events/publish");
|
|
40
|
+
// ── Create ────────────────────────────────────────────────────────────────
|
|
41
|
+
/**
|
|
42
|
+
* Create a standalone escalation (not tied to a workflow).
|
|
43
|
+
*
|
|
44
|
+
* Useful for manual work items, support tickets, or approval requests
|
|
45
|
+
* that originate outside the durable workflow engine. The caller must
|
|
46
|
+
* hold the target role or be a superadmin.
|
|
47
|
+
*
|
|
48
|
+
* @param input.type — escalation category (e.g. `"support"`, `"approval"`)
|
|
49
|
+
* @param input.subtype — subcategory for finer routing
|
|
50
|
+
* @param input.role — role responsible for resolving this escalation
|
|
51
|
+
* @param input.description — human-readable summary
|
|
52
|
+
* @param input.priority — 1 (critical) through 4 (low), default 2
|
|
53
|
+
* @param input.envelope — serialized context for the resolver
|
|
54
|
+
* @param input.metadata — arbitrary key-value data (e.g. signal_routing)
|
|
55
|
+
* @param input.escalation_payload — serialized payload for the resolver UI
|
|
56
|
+
* @param auth — authenticated user context (must hold target role or be superadmin)
|
|
57
|
+
* @returns `{ status: 201, data: <escalation record> }`
|
|
58
|
+
*/
|
|
59
|
+
async function createEscalation(input, auth) {
|
|
60
|
+
try {
|
|
61
|
+
const { type, role } = input;
|
|
62
|
+
if (!type || typeof type !== 'string') {
|
|
63
|
+
return { status: 400, error: 'type is required' };
|
|
64
|
+
}
|
|
65
|
+
if (!role || typeof role !== 'string') {
|
|
66
|
+
return { status: 400, error: 'role is required' };
|
|
67
|
+
}
|
|
68
|
+
// RBAC: caller must hold the target role or be superadmin
|
|
69
|
+
const isSuperAdminUser = await userService.isSuperAdmin(auth.userId);
|
|
70
|
+
if (!isSuperAdminUser) {
|
|
71
|
+
const userHasRole = await userService.hasRole(auth.userId, role);
|
|
72
|
+
if (!userHasRole) {
|
|
73
|
+
return { status: 403, error: `You must hold the "${role}" role or be a superadmin to create escalations for it` };
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
const escalation = await escalationService.createEscalation({
|
|
77
|
+
type,
|
|
78
|
+
subtype: input.subtype ?? type,
|
|
79
|
+
description: input.description,
|
|
80
|
+
priority: input.priority,
|
|
81
|
+
role,
|
|
82
|
+
envelope: input.envelope ?? '{}',
|
|
83
|
+
metadata: input.metadata,
|
|
84
|
+
escalation_payload: input.escalation_payload,
|
|
85
|
+
});
|
|
86
|
+
(0, publish_1.publishEscalationEvent)({
|
|
87
|
+
type: 'escalation.created',
|
|
88
|
+
source: 'api',
|
|
89
|
+
workflowId: '',
|
|
90
|
+
workflowName: '',
|
|
91
|
+
taskQueue: '',
|
|
92
|
+
escalationId: escalation.id,
|
|
93
|
+
status: 'pending',
|
|
94
|
+
data: { type: input.type, role },
|
|
95
|
+
});
|
|
96
|
+
return { status: 201, data: escalation };
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
return { status: 500, error: err.message };
|
|
100
|
+
}
|
|
101
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare function getVisibleRoles(userId: string): Promise<string[] | undefined>;
|
|
2
|
+
export declare function validateIds(ids: unknown): ids is string[];
|
|
3
|
+
export declare function checkBulkPermission(userId: string, ids: string[]): Promise<{
|
|
4
|
+
allowed: true;
|
|
5
|
+
} | {
|
|
6
|
+
allowed: false;
|
|
7
|
+
status: 403;
|
|
8
|
+
error: string;
|
|
9
|
+
}>;
|
|
10
|
+
export declare function publishBulkClaimEvents(ids: string[], assignedTo: string): void;
|