@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
package/README.md
CHANGED
|
@@ -177,34 +177,74 @@ const lt = await start({
|
|
|
177
177
|
});
|
|
178
178
|
```
|
|
179
179
|
|
|
180
|
+
## Use as a Package (No HTTP Server)
|
|
181
|
+
|
|
182
|
+
Long Tail can run as an embedded package inside your existing application — no Express server, no socket.io, no extra ports. The same API surface is available as direct function calls.
|
|
183
|
+
|
|
184
|
+
```typescript
|
|
185
|
+
import { start, createClient } from '@hotmeshio/long-tail';
|
|
186
|
+
|
|
187
|
+
await start({
|
|
188
|
+
database: { connectionString: process.env.DATABASE_URL },
|
|
189
|
+
server: { enabled: false },
|
|
190
|
+
workers: [{ taskQueue: 'default', workflow: reviewContent.reviewContent }],
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
const lt = createClient({ auth: { userId: 'system' } });
|
|
194
|
+
|
|
195
|
+
// Same operations as the REST API — no HTTP overhead
|
|
196
|
+
const tasks = await lt.tasks.list({ status: 'completed', limit: 10 });
|
|
197
|
+
const result = await lt.escalations.claim({ id: 'esc_123', durationMinutes: 30 });
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
Subscribe to events with callbacks instead of socket.io:
|
|
201
|
+
|
|
202
|
+
```typescript
|
|
203
|
+
lt.events.on('task.completed', (event) => {
|
|
204
|
+
console.log('done:', event.workflowId);
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
lt.events.on('escalation.*', (event) => {
|
|
208
|
+
notifyTeam(event);
|
|
209
|
+
});
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
Every SDK call returns an `LTApiResult` — same status codes, same validation, same RBAC. The transport is the only thing that changes. See the [SDK guide](docs/sdk.md) for the full API reference.
|
|
213
|
+
|
|
180
214
|
## Deployment
|
|
181
215
|
|
|
182
|
-
|
|
216
|
+
Three modes from the same codebase:
|
|
183
217
|
|
|
184
218
|
```typescript
|
|
185
|
-
//
|
|
219
|
+
// 1. Standalone — dashboard + REST API + workers
|
|
186
220
|
await start({ database: { connectionString: process.env.DATABASE_URL } });
|
|
187
221
|
|
|
188
|
-
//
|
|
222
|
+
// 2. Worker-only — workflow execution, no HTTP server
|
|
189
223
|
await start({
|
|
190
224
|
database: { connectionString: process.env.DATABASE_URL },
|
|
191
225
|
server: { enabled: false },
|
|
192
226
|
workers: [{ taskQueue: 'default', workflow: reviewContent.reviewContent }],
|
|
193
227
|
});
|
|
228
|
+
|
|
229
|
+
// 3. Embedded — inside your NestJS/Next.js/Express app, SDK calls only
|
|
230
|
+
await start({ database: { connectionString: process.env.DATABASE_URL }, server: { enabled: false } });
|
|
231
|
+
const lt = createClient({ auth: { userId: 'service' } });
|
|
194
232
|
```
|
|
195
233
|
|
|
196
|
-
|
|
234
|
+
All modes share PostgreSQL and scale independently. See [Cloud Deployment](docs/cloud.md).
|
|
197
235
|
|
|
198
236
|
## Docs
|
|
199
237
|
|
|
200
238
|
| Guide | What it covers |
|
|
201
239
|
|-------|---------------|
|
|
240
|
+
| [The Long Tail Story](docs/story.md) | Why this exists, what accumulates over time, what you own |
|
|
202
241
|
| [Workflows](docs/workflows.md) | Activities, interceptor, escalation lifecycle, composition |
|
|
203
242
|
| [IAM](docs/iam.md) | Identity propagation, service accounts, credential exchange |
|
|
204
243
|
| [Dashboard](docs/dashboard.md) | Navigation, key pages, event feed |
|
|
205
244
|
| [MCP](docs/mcp.md) | Server registration, tool calls, human queue |
|
|
206
245
|
| [Compilation](docs/compilation.md) | Dynamic → deterministic pipeline wizard |
|
|
207
246
|
| [Escalation Strategies](docs/escalation-strategies.md) | Default, MCP triage, custom handlers |
|
|
247
|
+
| [SDK](docs/sdk.md) | Embedded usage, `createClient`, event subscriptions |
|
|
208
248
|
| [Architecture](docs/architecture.md) | Project structure, conventions, discovery |
|
|
209
249
|
| [Cloud](docs/cloud.md) | AWS ECS, GCP Cloud Run, Docker |
|
|
210
250
|
| [Data Model](docs/data.md) | Database schema |
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.login = login;
|
|
4
|
+
const user_1 = require("../services/user");
|
|
5
|
+
const auth_1 = require("../modules/auth");
|
|
6
|
+
async function login(input) {
|
|
7
|
+
try {
|
|
8
|
+
const { username, password } = input;
|
|
9
|
+
if (!username || !password) {
|
|
10
|
+
return { status: 400, error: 'username and password are required' };
|
|
11
|
+
}
|
|
12
|
+
const user = await (0, user_1.verifyPassword)(username, password);
|
|
13
|
+
if (!user) {
|
|
14
|
+
return { status: 401, error: 'Invalid credentials' };
|
|
15
|
+
}
|
|
16
|
+
const highestType = user.roles.some((r) => r.type === 'superadmin')
|
|
17
|
+
? 'superadmin'
|
|
18
|
+
: user.roles.some((r) => r.type === 'admin')
|
|
19
|
+
? 'admin'
|
|
20
|
+
: 'member';
|
|
21
|
+
const token = (0, auth_1.signToken)({
|
|
22
|
+
userId: user.id,
|
|
23
|
+
role: highestType,
|
|
24
|
+
roles: user.roles.map((r) => ({ role: r.role, type: r.type })),
|
|
25
|
+
}, '24h');
|
|
26
|
+
return {
|
|
27
|
+
status: 200,
|
|
28
|
+
data: {
|
|
29
|
+
token,
|
|
30
|
+
user: {
|
|
31
|
+
id: user.id,
|
|
32
|
+
external_id: user.external_id,
|
|
33
|
+
display_name: user.display_name,
|
|
34
|
+
roles: user.roles,
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
return { status: 500, error: err.message };
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { LTApiResult, LTApiAuth } from '../types/sdk';
|
|
2
|
+
export declare function listBots(input: {
|
|
3
|
+
limit?: number;
|
|
4
|
+
offset?: number;
|
|
5
|
+
}): Promise<LTApiResult>;
|
|
6
|
+
export declare function getBot(input: {
|
|
7
|
+
id: string;
|
|
8
|
+
}): Promise<LTApiResult>;
|
|
9
|
+
export declare function createBot(input: {
|
|
10
|
+
name: string;
|
|
11
|
+
description?: string;
|
|
12
|
+
display_name?: string;
|
|
13
|
+
roles?: {
|
|
14
|
+
role: string;
|
|
15
|
+
type: string;
|
|
16
|
+
}[];
|
|
17
|
+
}, auth?: LTApiAuth): Promise<LTApiResult>;
|
|
18
|
+
export declare function updateBot(input: {
|
|
19
|
+
id: string;
|
|
20
|
+
display_name?: string;
|
|
21
|
+
description?: string;
|
|
22
|
+
status?: string;
|
|
23
|
+
}): Promise<LTApiResult>;
|
|
24
|
+
export declare function deleteBot(input: {
|
|
25
|
+
id: string;
|
|
26
|
+
}): Promise<LTApiResult>;
|
|
27
|
+
export declare function getBotRoles(input: {
|
|
28
|
+
id: string;
|
|
29
|
+
}): Promise<LTApiResult>;
|
|
30
|
+
export declare function addBotRole(input: {
|
|
31
|
+
id: string;
|
|
32
|
+
role: string;
|
|
33
|
+
type: string;
|
|
34
|
+
}): Promise<LTApiResult>;
|
|
35
|
+
export declare function removeBotRole(input: {
|
|
36
|
+
id: string;
|
|
37
|
+
role: string;
|
|
38
|
+
}): Promise<LTApiResult>;
|
|
39
|
+
export declare function listBotKeys(input: {
|
|
40
|
+
id: string;
|
|
41
|
+
}): Promise<LTApiResult>;
|
|
42
|
+
export declare function createBotKey(input: {
|
|
43
|
+
id: string;
|
|
44
|
+
name: string;
|
|
45
|
+
scopes?: string[];
|
|
46
|
+
expires_at?: string;
|
|
47
|
+
}): Promise<LTApiResult>;
|
|
48
|
+
export declare function revokeBotKey(input: {
|
|
49
|
+
keyId: string;
|
|
50
|
+
}): Promise<LTApiResult>;
|
|
@@ -0,0 +1,215 @@
|
|
|
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.listBots = listBots;
|
|
37
|
+
exports.getBot = getBot;
|
|
38
|
+
exports.createBot = createBot;
|
|
39
|
+
exports.updateBot = updateBot;
|
|
40
|
+
exports.deleteBot = deleteBot;
|
|
41
|
+
exports.getBotRoles = getBotRoles;
|
|
42
|
+
exports.addBotRole = addBotRole;
|
|
43
|
+
exports.removeBotRole = removeBotRole;
|
|
44
|
+
exports.listBotKeys = listBotKeys;
|
|
45
|
+
exports.createBotKey = createBotKey;
|
|
46
|
+
exports.revokeBotKey = revokeBotKey;
|
|
47
|
+
const iam = __importStar(require("../services/iam"));
|
|
48
|
+
const user_1 = require("../services/user");
|
|
49
|
+
async function listBots(input) {
|
|
50
|
+
try {
|
|
51
|
+
const limit = input.limit ?? 50;
|
|
52
|
+
const offset = input.offset ?? 0;
|
|
53
|
+
const result = await iam.listBots(limit, offset);
|
|
54
|
+
return { status: 200, data: result };
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
return { status: 500, error: err.message };
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
async function getBot(input) {
|
|
61
|
+
try {
|
|
62
|
+
const bot = await iam.getBot(input.id);
|
|
63
|
+
if (!bot) {
|
|
64
|
+
return { status: 404, error: 'Bot not found' };
|
|
65
|
+
}
|
|
66
|
+
return { status: 200, data: bot };
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
return { status: 500, error: err.message };
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
async function createBot(input, auth) {
|
|
73
|
+
try {
|
|
74
|
+
if (!input.name) {
|
|
75
|
+
return { status: 400, error: 'name is required' };
|
|
76
|
+
}
|
|
77
|
+
if (input.roles) {
|
|
78
|
+
for (const r of input.roles) {
|
|
79
|
+
if (!r.role || !r.type || !(0, user_1.isValidRoleType)(r.type)) {
|
|
80
|
+
return {
|
|
81
|
+
status: 400,
|
|
82
|
+
error: 'Each role must have a role name and type (superadmin, admin, member)',
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
const bot = await iam.createBot({
|
|
88
|
+
name: input.name,
|
|
89
|
+
description: input.description,
|
|
90
|
+
display_name: input.display_name,
|
|
91
|
+
roles: input.roles,
|
|
92
|
+
created_by: auth?.userId,
|
|
93
|
+
});
|
|
94
|
+
return { status: 201, data: bot };
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
if (err.code === '23505') {
|
|
98
|
+
return { status: 409, error: 'Bot with this name already exists' };
|
|
99
|
+
}
|
|
100
|
+
return { status: 500, error: err.message };
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
async function updateBot(input) {
|
|
104
|
+
try {
|
|
105
|
+
const { id, ...fields } = input;
|
|
106
|
+
const bot = await iam.updateBot(id, fields);
|
|
107
|
+
if (!bot) {
|
|
108
|
+
return { status: 404, error: 'Bot not found' };
|
|
109
|
+
}
|
|
110
|
+
return { status: 200, data: bot };
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
return { status: 500, error: err.message };
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
async function deleteBot(input) {
|
|
117
|
+
try {
|
|
118
|
+
const deleted = await iam.deleteBot(input.id);
|
|
119
|
+
if (!deleted) {
|
|
120
|
+
return { status: 404, error: 'Bot not found' };
|
|
121
|
+
}
|
|
122
|
+
return { status: 200, data: { deleted: true } };
|
|
123
|
+
}
|
|
124
|
+
catch (err) {
|
|
125
|
+
return { status: 500, error: err.message };
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
async function getBotRoles(input) {
|
|
129
|
+
try {
|
|
130
|
+
const bot = await iam.getBot(input.id);
|
|
131
|
+
if (!bot) {
|
|
132
|
+
return { status: 404, error: 'Bot not found' };
|
|
133
|
+
}
|
|
134
|
+
const roles = await iam.getBotRoles(input.id);
|
|
135
|
+
return { status: 200, data: { roles } };
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
return { status: 500, error: err.message };
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
async function addBotRole(input) {
|
|
142
|
+
try {
|
|
143
|
+
if (!input.role || !input.type) {
|
|
144
|
+
return { status: 400, error: 'role and type are required' };
|
|
145
|
+
}
|
|
146
|
+
if (!(0, user_1.isValidRoleType)(input.type)) {
|
|
147
|
+
return { status: 400, error: 'type must be superadmin, admin, or member' };
|
|
148
|
+
}
|
|
149
|
+
const bot = await iam.getBot(input.id);
|
|
150
|
+
if (!bot) {
|
|
151
|
+
return { status: 404, error: 'Bot not found' };
|
|
152
|
+
}
|
|
153
|
+
const result = await iam.addBotRole(input.id, input.role, input.type);
|
|
154
|
+
return { status: 201, data: result };
|
|
155
|
+
}
|
|
156
|
+
catch (err) {
|
|
157
|
+
return { status: 500, error: err.message };
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
async function removeBotRole(input) {
|
|
161
|
+
try {
|
|
162
|
+
const removed = await iam.removeBotRole(input.id, input.role);
|
|
163
|
+
if (!removed) {
|
|
164
|
+
return { status: 404, error: 'Role not found' };
|
|
165
|
+
}
|
|
166
|
+
return { status: 200, data: { removed: true } };
|
|
167
|
+
}
|
|
168
|
+
catch (err) {
|
|
169
|
+
return { status: 500, error: err.message };
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
async function listBotKeys(input) {
|
|
173
|
+
try {
|
|
174
|
+
const bot = await iam.getBot(input.id);
|
|
175
|
+
if (!bot) {
|
|
176
|
+
return { status: 404, error: 'Bot not found' };
|
|
177
|
+
}
|
|
178
|
+
const keys = await iam.listBotKeys(input.id);
|
|
179
|
+
return { status: 200, data: { keys } };
|
|
180
|
+
}
|
|
181
|
+
catch (err) {
|
|
182
|
+
return { status: 500, error: err.message };
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
async function createBotKey(input) {
|
|
186
|
+
try {
|
|
187
|
+
if (!input.name) {
|
|
188
|
+
return { status: 400, error: 'name is required' };
|
|
189
|
+
}
|
|
190
|
+
const expiresAt = input.expires_at ? new Date(input.expires_at) : undefined;
|
|
191
|
+
const result = await iam.createBotKey(input.id, input.name, input.scopes || [], expiresAt);
|
|
192
|
+
return { status: 201, data: result };
|
|
193
|
+
}
|
|
194
|
+
catch (err) {
|
|
195
|
+
if (err.message === 'Bot not found') {
|
|
196
|
+
return { status: 404, error: err.message };
|
|
197
|
+
}
|
|
198
|
+
if (err.code === '23505') {
|
|
199
|
+
return { status: 409, error: 'API key with this name already exists for this bot' };
|
|
200
|
+
}
|
|
201
|
+
return { status: 500, error: err.message };
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
async function revokeBotKey(input) {
|
|
205
|
+
try {
|
|
206
|
+
const revoked = await iam.revokeBotKey(input.keyId);
|
|
207
|
+
if (!revoked) {
|
|
208
|
+
return { status: 404, error: 'API key not found' };
|
|
209
|
+
}
|
|
210
|
+
return { status: 200, data: { revoked: true } };
|
|
211
|
+
}
|
|
212
|
+
catch (err) {
|
|
213
|
+
return { status: 500, error: err.message };
|
|
214
|
+
}
|
|
215
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { LTApiResult } from '../types/sdk';
|
|
2
|
+
export declare function listApps(): Promise<LTApiResult>;
|
|
3
|
+
export declare function rollCall(input: {
|
|
4
|
+
appId?: string;
|
|
5
|
+
delay?: number;
|
|
6
|
+
}): Promise<LTApiResult>;
|
|
7
|
+
export declare function applyThrottle(input: {
|
|
8
|
+
appId?: string;
|
|
9
|
+
throttle: number;
|
|
10
|
+
topic?: string;
|
|
11
|
+
guid?: string;
|
|
12
|
+
}): Promise<LTApiResult>;
|
|
13
|
+
export declare function getStreamStats(input: {
|
|
14
|
+
app_id?: string;
|
|
15
|
+
duration?: string;
|
|
16
|
+
stream?: string;
|
|
17
|
+
}): Promise<LTApiResult>;
|
|
18
|
+
export declare function subscribeMesh(input: {
|
|
19
|
+
appId?: string;
|
|
20
|
+
}): Promise<LTApiResult>;
|
|
@@ -0,0 +1,110 @@
|
|
|
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.listApps = listApps;
|
|
37
|
+
exports.rollCall = rollCall;
|
|
38
|
+
exports.applyThrottle = applyThrottle;
|
|
39
|
+
exports.getStreamStats = getStreamStats;
|
|
40
|
+
exports.subscribeMesh = subscribeMesh;
|
|
41
|
+
const controlplane = __importStar(require("../services/controlplane"));
|
|
42
|
+
const events_1 = require("../lib/events");
|
|
43
|
+
async function listApps() {
|
|
44
|
+
try {
|
|
45
|
+
const apps = await controlplane.listApps();
|
|
46
|
+
return { status: 200, data: { apps } };
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
return { status: 500, error: err.message };
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
async function rollCall(input) {
|
|
53
|
+
try {
|
|
54
|
+
const appId = input.appId || 'durable';
|
|
55
|
+
const profiles = await controlplane.rollCall(appId, input.delay);
|
|
56
|
+
return { status: 200, data: { profiles } };
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
return { status: 500, error: err.message };
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
async function applyThrottle(input) {
|
|
63
|
+
try {
|
|
64
|
+
const appId = input.appId || 'durable';
|
|
65
|
+
if (typeof input.throttle !== 'number') {
|
|
66
|
+
return { status: 400, error: 'throttle (number) is required' };
|
|
67
|
+
}
|
|
68
|
+
const result = await controlplane.applyThrottle(appId, {
|
|
69
|
+
throttle: input.throttle,
|
|
70
|
+
topic: input.topic,
|
|
71
|
+
guid: input.guid,
|
|
72
|
+
});
|
|
73
|
+
// Publish a synthetic event so the dashboard event stream sees it
|
|
74
|
+
const throttleEvent = {
|
|
75
|
+
type: 'mesh.throttle',
|
|
76
|
+
source: 'controlplane',
|
|
77
|
+
workflowId: input.guid || '',
|
|
78
|
+
workflowName: '',
|
|
79
|
+
taskQueue: appId,
|
|
80
|
+
data: { throttle: input.throttle, topic: input.topic, guid: input.guid, appId },
|
|
81
|
+
timestamp: new Date().toISOString(),
|
|
82
|
+
};
|
|
83
|
+
events_1.eventRegistry.publish(throttleEvent).catch(() => { });
|
|
84
|
+
return { status: 200, data: { success: result } };
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
return { status: 500, error: err.message };
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
async function getStreamStats(input) {
|
|
91
|
+
try {
|
|
92
|
+
const schema = input.app_id || 'durable';
|
|
93
|
+
const duration = input.duration || '1h';
|
|
94
|
+
const stats = await controlplane.getStreamStats(schema, duration, input.stream);
|
|
95
|
+
return { status: 200, data: stats };
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
return { status: 500, error: err.message };
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
async function subscribeMesh(input) {
|
|
102
|
+
try {
|
|
103
|
+
const appId = input.appId || 'durable';
|
|
104
|
+
await controlplane.subscribeMesh(appId);
|
|
105
|
+
return { status: 200, data: { subscribed: true, appId } };
|
|
106
|
+
}
|
|
107
|
+
catch (err) {
|
|
108
|
+
return { status: 500, error: err.message };
|
|
109
|
+
}
|
|
110
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { LTApiResult } from '../types/sdk';
|
|
2
|
+
export declare function prune(input: {
|
|
3
|
+
expire?: string;
|
|
4
|
+
jobs?: boolean;
|
|
5
|
+
streams?: boolean;
|
|
6
|
+
engineStreams?: boolean;
|
|
7
|
+
engineStreamsExpire?: string;
|
|
8
|
+
workerStreams?: boolean;
|
|
9
|
+
workerStreamsExpire?: string;
|
|
10
|
+
attributes?: boolean;
|
|
11
|
+
entities?: string[];
|
|
12
|
+
pruneTransient?: boolean;
|
|
13
|
+
keepHmark?: boolean;
|
|
14
|
+
}): Promise<LTApiResult>;
|
|
15
|
+
export declare function deploy(): Promise<LTApiResult>;
|
package/build/api/dba.js
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
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.prune = prune;
|
|
37
|
+
exports.deploy = deploy;
|
|
38
|
+
const dbaService = __importStar(require("../services/dba"));
|
|
39
|
+
async function prune(input) {
|
|
40
|
+
try {
|
|
41
|
+
const result = await dbaService.prune({
|
|
42
|
+
expire: input.expire,
|
|
43
|
+
jobs: input.jobs,
|
|
44
|
+
streams: input.streams,
|
|
45
|
+
engineStreams: input.engineStreams,
|
|
46
|
+
engineStreamsExpire: input.engineStreamsExpire,
|
|
47
|
+
workerStreams: input.workerStreams,
|
|
48
|
+
workerStreamsExpire: input.workerStreamsExpire,
|
|
49
|
+
attributes: input.attributes,
|
|
50
|
+
entities: input.entities,
|
|
51
|
+
pruneTransient: input.pruneTransient,
|
|
52
|
+
keepHmark: input.keepHmark,
|
|
53
|
+
});
|
|
54
|
+
return { status: 200, data: result };
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
return { status: 500, error: err.message };
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
async function deploy() {
|
|
61
|
+
try {
|
|
62
|
+
await dbaService.deploy();
|
|
63
|
+
return { status: 200, data: { ok: true } };
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
return { status: 500, error: err.message };
|
|
67
|
+
}
|
|
68
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import type { LTApiResult, LTApiAuth } from '../types/sdk';
|
|
2
|
+
export declare function listEscalations(input: {
|
|
3
|
+
status?: string;
|
|
4
|
+
role?: string;
|
|
5
|
+
type?: string;
|
|
6
|
+
subtype?: string;
|
|
7
|
+
assigned_to?: string;
|
|
8
|
+
priority?: number;
|
|
9
|
+
limit?: number;
|
|
10
|
+
offset?: number;
|
|
11
|
+
sort_by?: string;
|
|
12
|
+
order?: string;
|
|
13
|
+
}, auth: LTApiAuth): Promise<LTApiResult>;
|
|
14
|
+
export declare function listAvailableEscalations(input: {
|
|
15
|
+
role?: string;
|
|
16
|
+
type?: string;
|
|
17
|
+
subtype?: string;
|
|
18
|
+
priority?: number;
|
|
19
|
+
limit?: number;
|
|
20
|
+
offset?: number;
|
|
21
|
+
sort_by?: string;
|
|
22
|
+
order?: string;
|
|
23
|
+
}, auth: LTApiAuth): Promise<LTApiResult>;
|
|
24
|
+
export declare function listDistinctTypes(): Promise<LTApiResult>;
|
|
25
|
+
export declare function getEscalationStats(input: {
|
|
26
|
+
period?: string;
|
|
27
|
+
}, auth: LTApiAuth): Promise<LTApiResult>;
|
|
28
|
+
export declare function getEscalation(input: {
|
|
29
|
+
id: string;
|
|
30
|
+
}, auth: LTApiAuth): Promise<LTApiResult>;
|
|
31
|
+
export declare function getEscalationsByWorkflowId(input: {
|
|
32
|
+
workflowId: string;
|
|
33
|
+
}): Promise<LTApiResult>;
|
|
34
|
+
export declare function escalateToRole(input: {
|
|
35
|
+
id: string;
|
|
36
|
+
targetRole: string;
|
|
37
|
+
}, auth: LTApiAuth): Promise<LTApiResult>;
|
|
38
|
+
export declare function claimEscalation(input: {
|
|
39
|
+
id: string;
|
|
40
|
+
durationMinutes?: number;
|
|
41
|
+
}, auth: LTApiAuth): Promise<LTApiResult>;
|
|
42
|
+
export declare function releaseEscalation(input: {
|
|
43
|
+
id: string;
|
|
44
|
+
}, auth: LTApiAuth): Promise<LTApiResult>;
|
|
45
|
+
export declare function releaseExpiredClaims(): Promise<LTApiResult>;
|
|
46
|
+
export declare function updatePriority(input: {
|
|
47
|
+
ids: string[];
|
|
48
|
+
priority: number;
|
|
49
|
+
}, auth: LTApiAuth): Promise<LTApiResult>;
|
|
50
|
+
export declare function bulkClaim(input: {
|
|
51
|
+
ids: string[];
|
|
52
|
+
durationMinutes?: number;
|
|
53
|
+
}, auth: LTApiAuth): Promise<LTApiResult>;
|
|
54
|
+
export declare function bulkAssign(input: {
|
|
55
|
+
ids: string[];
|
|
56
|
+
targetUserId: string;
|
|
57
|
+
durationMinutes?: number;
|
|
58
|
+
}, auth: LTApiAuth): Promise<LTApiResult>;
|
|
59
|
+
export declare function bulkEscalate(input: {
|
|
60
|
+
ids: string[];
|
|
61
|
+
targetRole: string;
|
|
62
|
+
}, auth: LTApiAuth): Promise<LTApiResult>;
|
|
63
|
+
export declare function bulkTriage(input: {
|
|
64
|
+
ids: string[];
|
|
65
|
+
hint?: string;
|
|
66
|
+
}, auth: LTApiAuth): Promise<LTApiResult>;
|
|
67
|
+
export declare function resolveEscalation(input: {
|
|
68
|
+
id: string;
|
|
69
|
+
resolverPayload: Record<string, any>;
|
|
70
|
+
}, auth: LTApiAuth): Promise<LTApiResult>;
|