@hotmeshio/long-tail 0.1.6 → 0.1.8
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 +47 -5
- package/build/api/auth.d.ts +16 -0
- package/build/api/auth.js +53 -0
- package/build/api/bot-accounts.d.ts +137 -0
- package/build/api/bot-accounts.js +302 -0
- package/build/api/controlplane.d.ts +68 -0
- package/build/api/controlplane.js +158 -0
- package/build/api/dba.d.ts +42 -0
- package/build/api/dba.js +95 -0
- package/build/api/escalations.d.ts +271 -0
- package/build/api/escalations.js +892 -0
- package/build/api/exports.d.ts +90 -0
- package/build/api/exports.js +204 -0
- package/build/api/index.d.ts +18 -0
- package/build/api/index.js +54 -0
- package/build/api/insight.d.ts +86 -0
- package/build/api/insight.js +147 -0
- package/build/api/maintenance.d.ts +22 -0
- package/build/api/maintenance.js +43 -0
- package/build/api/mcp-runs.d.ts +43 -0
- package/build/api/mcp-runs.js +89 -0
- package/build/api/mcp.d.ts +160 -0
- package/build/api/mcp.js +320 -0
- package/build/api/namespaces.d.ts +20 -0
- package/build/{routes/escalations/helpers.js → api/namespaces.js} +35 -10
- package/build/api/roles.d.ts +88 -0
- package/build/api/roles.js +217 -0
- package/build/api/settings.d.ts +10 -0
- package/build/api/settings.js +43 -0
- package/build/api/tasks.d.ts +70 -0
- package/build/api/tasks.js +139 -0
- package/build/api/users.d.ts +115 -0
- package/build/api/users.js +228 -0
- package/build/api/workflow-sets.d.ts +77 -0
- package/build/api/workflow-sets.js +170 -0
- package/build/api/workflows.d.ts +158 -0
- package/build/api/workflows.js +407 -0
- package/build/api/yaml-workflows.d.ts +282 -0
- package/build/api/yaml-workflows.js +751 -0
- package/build/examples/types/envelopes.d.ts +27 -0
- package/build/examples/types/index.d.ts +1 -1
- package/build/examples/workers.js +8 -0
- package/build/examples/workflows/assembly-line/activities.d.ts +28 -0
- package/build/examples/workflows/assembly-line/activities.js +53 -0
- package/build/examples/workflows/assembly-line/index.d.ts +17 -0
- package/build/examples/workflows/assembly-line/index.js +60 -0
- package/build/examples/workflows/assembly-line/iterator.d.ts +12 -0
- package/build/examples/workflows/assembly-line/iterator.js +54 -0
- package/build/examples/workflows/assembly-line/reverter.d.ts +18 -0
- package/build/examples/workflows/assembly-line/reverter.js +89 -0
- package/build/examples/workflows/assembly-line/types.d.ts +25 -0
- package/build/examples/workflows/assembly-line/types.js +8 -0
- package/build/examples/workflows/assembly-line/worker.d.ts +13 -0
- package/build/examples/workflows/assembly-line/worker.js +81 -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 +51 -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 +28 -90
- 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 +338 -0
- package/build/sdk/index.js +299 -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-invocation.d.ts +15 -2
- package/build/services/workflow-invocation.js +11 -6
- 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-B15jSEV2.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-BXkKGkb5.js.map → AdminDashboard-B15jSEV2.js.map} +1 -1
- package/dashboard/dist/assets/{AvailableEscalationsPage-DcH592mc.js → AvailableEscalationsPage-0V2yvKak.js} +2 -2
- package/dashboard/dist/assets/{AvailableEscalationsPage-DcH592mc.js.map → AvailableEscalationsPage-0V2yvKak.js.map} +1 -1
- package/dashboard/dist/assets/BotPicker-B4UxHcek.js +2 -0
- package/dashboard/dist/assets/{BotPicker-A6LtzyuO.js.map → BotPicker-B4UxHcek.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-C7nL2_mv.js → CollapsibleSection-BBexNWVd.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-C7nL2_mv.js.map → CollapsibleSection-BBexNWVd.js.map} +1 -1
- package/dashboard/dist/assets/{ConfirmDeleteModal-CWFwJrSl.js → ConfirmDeleteModal-DlPDJSq_.js} +2 -2
- package/dashboard/dist/assets/{ConfirmDeleteModal-CWFwJrSl.js.map → ConfirmDeleteModal-DlPDJSq_.js.map} +1 -1
- package/dashboard/dist/assets/{CopyableId-DbZ5c3jh.js → CopyableId-BxHW1ahb.js} +2 -2
- package/dashboard/dist/assets/{CopyableId-DbZ5c3jh.js.map → CopyableId-BxHW1ahb.js.map} +1 -1
- package/dashboard/dist/assets/{CredentialsPage-ClWkmLPu.js → CredentialsPage-Bp_Y1Szk.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-ClWkmLPu.js.map → CredentialsPage-Bp_Y1Szk.js.map} +1 -1
- package/dashboard/dist/assets/{CustomDurationPicker-CtH2hReF.js → CustomDurationPicker-ByBFqXSO.js} +2 -2
- package/dashboard/dist/assets/{CustomDurationPicker-CtH2hReF.js.map → CustomDurationPicker-ByBFqXSO.js.map} +1 -1
- package/dashboard/dist/assets/{DataTable-CM5ZcpPi.js → DataTable-DyIXg-tQ.js} +2 -2
- package/dashboard/dist/assets/{DataTable-CM5ZcpPi.js.map → DataTable-DyIXg-tQ.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-CwqavyeC.js → ElapsedCell-BgnA0qpS.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-CwqavyeC.js.map → ElapsedCell-BgnA0qpS.js.map} +1 -1
- package/dashboard/dist/assets/{EmptyState-BBn78pmm.js → EmptyState-DlMImvgm.js} +2 -2
- package/dashboard/dist/assets/{EmptyState-BBn78pmm.js.map → EmptyState-DlMImvgm.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-BcJ2E3X7.js → EscalationsOverview-D90kdfw1.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-BcJ2E3X7.js.map → EscalationsOverview-D90kdfw1.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-C1en_KZ0.js → EventTable-BNxtlgNz.js} +2 -2
- package/dashboard/dist/assets/{EventTable-C1en_KZ0.js.map → EventTable-BNxtlgNz.js.map} +1 -1
- package/dashboard/dist/assets/{FilterBar-CZTlrLQT.js → FilterBar-BTiaAhCx.js} +2 -2
- package/dashboard/dist/assets/{FilterBar-CZTlrLQT.js.map → FilterBar-BTiaAhCx.js.map} +1 -1
- package/dashboard/dist/assets/{ListToolbar-Cdbsapig.js → ListToolbar-BUcagSCn.js} +2 -2
- package/dashboard/dist/assets/{ListToolbar-Cdbsapig.js.map → ListToolbar-BUcagSCn.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-CSpEJxKa.js → McpOverview-B-tCvz8C.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-CSpEJxKa.js.map → McpOverview-B-tCvz8C.js.map} +1 -1
- package/dashboard/dist/assets/McpQueryDetailPage-DPlF1wYb.js +5 -0
- package/dashboard/dist/assets/McpQueryDetailPage-DPlF1wYb.js.map +1 -0
- package/dashboard/dist/assets/McpQueryPage-Bz7AdcfR.js +2 -0
- package/dashboard/dist/assets/McpQueryPage-Bz7AdcfR.js.map +1 -0
- package/dashboard/dist/assets/{McpRunDetailPage-9xdxgG4d.js → McpRunDetailPage-Di_qpL2V.js} +2 -2
- package/dashboard/dist/assets/{McpRunDetailPage-9xdxgG4d.js.map → McpRunDetailPage-Di_qpL2V.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunsPage-wWLqHsd4.js → McpRunsPage-BBgybBEa.js} +2 -2
- package/dashboard/dist/assets/{McpRunsPage-wWLqHsd4.js.map → McpRunsPage-BBgybBEa.js.map} +1 -1
- package/dashboard/dist/assets/{Modal-kB_P7ZOr.js → Modal-CaJ0gTEa.js} +2 -2
- package/dashboard/dist/assets/{Modal-kB_P7ZOr.js.map → Modal-CaJ0gTEa.js.map} +1 -1
- package/dashboard/dist/assets/OperatorDashboard-DDfMmrmR.js +2 -0
- package/dashboard/dist/assets/{OperatorDashboard-jc0vrgDI.js.map → OperatorDashboard-DDfMmrmR.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeader-NkOeBR05.js → PageHeader-C5D-G5rp.js} +2 -2
- package/dashboard/dist/assets/{PageHeader-NkOeBR05.js.map → PageHeader-C5D-G5rp.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeaderWithStats-ywNhrmFK.js → PageHeaderWithStats-DCa2eZh2.js} +2 -2
- package/dashboard/dist/assets/{PageHeaderWithStats-ywNhrmFK.js.map → PageHeaderWithStats-DCa2eZh2.js.map} +1 -1
- package/dashboard/dist/assets/{PriorityBadge-B2MQbSxy.js → PriorityBadge-DTHq6OUZ.js} +2 -2
- package/dashboard/dist/assets/{PriorityBadge-B2MQbSxy.js.map → PriorityBadge-DTHq6OUZ.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessDetailPage-B7z7IdqE.js → ProcessDetailPage-fC4dhrd0.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-B7z7IdqE.js.map → ProcessDetailPage-fC4dhrd0.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessesListPage-C-uHadO6.js → ProcessesListPage-CL2MY8uD.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-C-uHadO6.js.map → ProcessesListPage-CL2MY8uD.js.map} +1 -1
- package/dashboard/dist/assets/{RolePill-C1dgC-fK.js → RolePill-kgKPANly.js} +2 -2
- package/dashboard/dist/assets/{RolePill-C1dgC-fK.js.map → RolePill-kgKPANly.js.map} +1 -1
- package/dashboard/dist/assets/{RolesPage-BSxrD1vm.js → RolesPage-Be2lXTHD.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-BSxrD1vm.js.map → RolesPage-Be2lXTHD.js.map} +1 -1
- package/dashboard/dist/assets/{RowActions-lYaHGI-v.js → RowActions-DIzJCwqR.js} +2 -2
- package/dashboard/dist/assets/{RowActions-lYaHGI-v.js.map → RowActions-DIzJCwqR.js.map} +1 -1
- package/dashboard/dist/assets/{StatCard-v2TiITVr.js → StatCard-CRi2Jy6t.js} +2 -2
- package/dashboard/dist/assets/{StatCard-v2TiITVr.js.map → StatCard-CRi2Jy6t.js.map} +1 -1
- package/dashboard/dist/assets/{StatusBadge-DWlxevgG.js → StatusBadge-BETI_8Mr.js} +2 -2
- package/dashboard/dist/assets/{StatusBadge-DWlxevgG.js.map → StatusBadge-BETI_8Mr.js.map} +1 -1
- package/dashboard/dist/assets/{StepIndicator-CRM4ft28.js → StepIndicator-DjpMqCjz.js} +2 -2
- package/dashboard/dist/assets/{StepIndicator-CRM4ft28.js.map → StepIndicator-DjpMqCjz.js.map} +1 -1
- package/dashboard/dist/assets/{StickyPagination-CF0EToEU.js → StickyPagination-BZbExQ9t.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-CF0EToEU.js.map → StickyPagination-BZbExQ9t.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-CNlj7fgg.js → SwimlaneTimeline-DZthQyhR.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-CNlj7fgg.js.map → SwimlaneTimeline-DZthQyhR.js.map} +1 -1
- package/dashboard/dist/assets/{TagInput-CH8qMGhC.js → TagInput-CukbOfYn.js} +2 -2
- package/dashboard/dist/assets/{TagInput-CH8qMGhC.js.map → TagInput-CukbOfYn.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-CdWo-6mu.js → TaskDetailPage-CIZHIKo9.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-CdWo-6mu.js.map → TaskDetailPage-CIZHIKo9.js.map} +1 -1
- package/dashboard/dist/assets/{TaskQueuePill-BPj4ogVG.js → TaskQueuePill-Q7DGoysj.js} +2 -2
- package/dashboard/dist/assets/{TaskQueuePill-BPj4ogVG.js.map → TaskQueuePill-Q7DGoysj.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-CtRkMpKU.js → TasksListPage-CsC9wjb0.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-CtRkMpKU.js.map → TasksListPage-CsC9wjb0.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-Di1a3X5P.js → TimeAgo-BcOOnJeH.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-Di1a3X5P.js.map → TimeAgo-BcOOnJeH.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-CqrXql-S.js → TimestampCell-CEMapYDQ.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-CqrXql-S.js.map → TimestampCell-CEMapYDQ.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-BUFYCnRa.js → UserName-BHoN7iRL.js} +2 -2
- package/dashboard/dist/assets/{UserName-BUFYCnRa.js.map → UserName-BHoN7iRL.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowExecutionPage-25iusMml.js → WorkflowExecutionPage-DawKl1LT.js} +2 -2
- package/dashboard/dist/assets/{WorkflowExecutionPage-25iusMml.js.map → WorkflowExecutionPage-DawKl1LT.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowPill-CP84Vqeg.js +2 -0
- package/dashboard/dist/assets/{WorkflowPill-DPKOcbf4.js.map → WorkflowPill-CP84Vqeg.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsDashboard-BgxslssH.js → WorkflowsDashboard-QrvVFxtQ.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsDashboard-BgxslssH.js.map → WorkflowsDashboard-QrvVFxtQ.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsOverview-Doe5L-Re.js → WorkflowsOverview-DuhAi_OY.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-Doe5L-Re.js.map → WorkflowsOverview-DuhAi_OY.js.map} +1 -1
- package/dashboard/dist/assets/YamlWorkflowsPage-Dc9xw82a.js +2 -0
- package/dashboard/dist/assets/YamlWorkflowsPage-Dc9xw82a.js.map +1 -0
- package/dashboard/dist/assets/{bots-Bi2_O1Ts.js → bots-Dny-rmmI.js} +2 -2
- package/dashboard/dist/assets/{bots-Bi2_O1Ts.js.map → bots-Dny-rmmI.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-Ck1KlLkT.js → escalation-CV0sKNH5.js} +2 -2
- package/dashboard/dist/assets/{escalation-Ck1KlLkT.js.map → escalation-CV0sKNH5.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-columns-ohDsj2eJ.js → escalation-columns-30CKyoWI.js} +2 -2
- package/dashboard/dist/assets/{escalation-columns-ohDsj2eJ.js.map → escalation-columns-30CKyoWI.js.map} +1 -1
- package/dashboard/dist/assets/{helpers-BoD2SgUY.js → helpers-C1-30CzH.js} +2 -2
- package/dashboard/dist/assets/{helpers-BoD2SgUY.js.map → helpers-C1-30CzH.js.map} +1 -1
- package/dashboard/dist/assets/helpers-C1jaRD-d.js +2 -0
- package/dashboard/dist/assets/helpers-C1jaRD-d.js.map +1 -0
- package/dashboard/dist/assets/{index-FuohTtaM.js → index-BUVQ6wmy.js} +3 -3
- package/dashboard/dist/assets/{index-FuohTtaM.js.map → index-BUVQ6wmy.js.map} +1 -1
- package/dashboard/dist/assets/index-CxVB7F4X.js +2 -0
- package/dashboard/dist/assets/{index-Dk2Q51o0.js.map → index-CxVB7F4X.js.map} +1 -1
- package/dashboard/dist/assets/{index-BEtLIsML.js → index-D-oCWCAS.js} +2 -2
- package/dashboard/dist/assets/{index-BEtLIsML.js.map → index-D-oCWCAS.js.map} +1 -1
- package/dashboard/dist/assets/index-D0wPM3Ck.js +2 -0
- package/dashboard/dist/assets/{index-BpT-6WgJ.js.map → index-D0wPM3Ck.js.map} +1 -1
- package/dashboard/dist/assets/{index-Bn2xHDr8.js → index-DHgnkykj.js} +3 -3
- package/dashboard/dist/assets/{index-Bn2xHDr8.js.map → index-DHgnkykj.js.map} +1 -1
- package/dashboard/dist/assets/{index-D3NyVADW.js → index-D_aJBEAG.js} +2 -2
- package/dashboard/dist/assets/index-D_aJBEAG.js.map +1 -0
- package/dashboard/dist/assets/{index-PyCTS05D.css → index-DcIKW-cZ.css} +1 -1
- package/dashboard/dist/assets/{index-CZrJ09p-.js → index-Dd_U4mLm.js} +2 -2
- package/dashboard/dist/assets/{index-CZrJ09p-.js.map → index-Dd_U4mLm.js.map} +1 -1
- package/dashboard/dist/assets/{index-DYyLF-Qb.js → index-DnmZbNxk.js} +8 -8
- package/dashboard/dist/assets/index-DnmZbNxk.js.map +1 -0
- package/dashboard/dist/assets/index-_RBvi7s6.js +2 -0
- package/dashboard/dist/assets/{index-D7zYZOnH.js.map → index-_RBvi7s6.js.map} +1 -1
- package/dashboard/dist/assets/index-n7td8zgX.js +17 -0
- package/dashboard/dist/assets/{index-DOkHXmyf.js.map → index-n7td8zgX.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-CJtYjA7A.js → mcp-CRFr4L9W.js} +2 -2
- package/dashboard/dist/assets/{mcp-CJtYjA7A.js.map → mcp-CRFr4L9W.js.map} +1 -1
- package/dashboard/dist/assets/mcp-query-DHY2mZBQ.js +2 -0
- package/dashboard/dist/assets/mcp-query-DHY2mZBQ.js.map +1 -0
- package/dashboard/dist/assets/{mcp-runs-DUWm9Z4V.js → mcp-runs-BqPHqwAO.js} +2 -2
- package/dashboard/dist/assets/{mcp-runs-DUWm9Z4V.js.map → mcp-runs-BqPHqwAO.js.map} +1 -1
- package/dashboard/dist/assets/{namespaces-BM5P2qmL.js → namespaces-TG1aIpo_.js} +2 -2
- package/dashboard/dist/assets/{namespaces-BM5P2qmL.js.map → namespaces-TG1aIpo_.js.map} +1 -1
- package/dashboard/dist/assets/{roles-lv0shpjJ.js → roles-DhhLTvXg.js} +2 -2
- package/dashboard/dist/assets/{roles-lv0shpjJ.js.map → roles-DhhLTvXg.js.map} +1 -1
- package/dashboard/dist/assets/{settings-Wlq92mRo.js → settings-D9MBzEeB.js} +2 -2
- package/dashboard/dist/assets/{settings-Wlq92mRo.js.map → settings-D9MBzEeB.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-BFGm4PuE.js → tasks-BxmcZoev.js} +2 -2
- package/dashboard/dist/assets/{tasks-BFGm4PuE.js.map → tasks-BxmcZoev.js.map} +1 -1
- package/dashboard/dist/assets/{useEventHooks-DIE6ue4x.js → useEventHooks-BylecvvI.js} +2 -2
- package/dashboard/dist/assets/{useEventHooks-DIE6ue4x.js.map → useEventHooks-BylecvvI.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-DCwSO73t.js → useYamlActivityEvents-ocmj11e_.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-DCwSO73t.js.map → useYamlActivityEvents-ocmj11e_.js.map} +1 -1
- package/dashboard/dist/assets/{users-tA5-K0wA.js → users-Ce5r-JAv.js} +2 -2
- package/dashboard/dist/assets/{users-tA5-K0wA.js.map → users-Ce5r-JAv.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-ykIeVbRJ.js} +2 -2
- package/dashboard/dist/assets/{workflows-CfLc15Wr.js.map → workflows-ykIeVbRJ.js.map} +1 -1
- package/dashboard/dist/assets/yaml-workflows-WypmKYht.js +2 -0
- package/dashboard/dist/assets/yaml-workflows-WypmKYht.js.map +1 -0
- package/dashboard/dist/index.html +3 -3
- package/docs/api/sdk/auth.md +27 -0
- package/docs/api/sdk/bot-accounts.md +243 -0
- package/docs/api/sdk/controlplane.md +103 -0
- package/docs/api/sdk/dba.md +52 -0
- package/docs/api/sdk/escalations.md +374 -0
- package/docs/api/sdk/events.md +68 -0
- package/docs/api/sdk/exports.md +124 -0
- package/docs/api/sdk/insight.md +112 -0
- package/docs/api/sdk/maintenance.md +54 -0
- package/docs/api/sdk/mcp-runs.md +71 -0
- package/docs/api/sdk/mcp.md +250 -0
- package/docs/api/sdk/namespaces.md +43 -0
- package/docs/api/sdk/roles.md +183 -0
- package/docs/api/sdk/settings.md +24 -0
- package/docs/api/sdk/tasks.md +120 -0
- package/docs/api/sdk/users.md +196 -0
- package/docs/api/sdk/workflow-sets.md +135 -0
- package/docs/api/sdk/workflows.md +271 -0
- package/docs/api/sdk/yaml-workflows.md +408 -0
- package/docs/events.md +28 -0
- package/docs/sdk.md +177 -0
- package/docs/story.md +157 -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-DYyLF-Qb.js.map +0 -1
- 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/docs/api/{dba.md → http/dba.md} +0 -0
- /package/docs/api/{escalations.md → http/escalations.md} +0 -0
- /package/docs/api/{exports.md → http/exports.md} +0 -0
- /package/docs/api/{maintenance.md → http/maintenance.md} +0 -0
- /package/docs/api/{mcp-runs.md → http/mcp-runs.md} +0 -0
- /package/docs/api/{mcp-servers.md → http/mcp-servers.md} +0 -0
- /package/docs/api/{namespaces.md → http/namespaces.md} +0 -0
- /package/docs/api/{roles.md → http/roles.md} +0 -0
- /package/docs/api/{service-accounts.md → http/service-accounts.md} +0 -0
- /package/docs/api/{settings.md → http/settings.md} +0 -0
- /package/docs/api/{tasks.md → http/tasks.md} +0 -0
- /package/docs/api/{users.md → http/users.md} +0 -0
- /package/docs/api/{workflows.md → http/workflows.md} +0 -0
- /package/docs/api/{yaml-workflows.md → http/yaml-workflows.md} +0 -0
package/README.md
CHANGED
|
@@ -177,41 +177,83 @@ 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 |
|
|
211
251
|
|
|
212
252
|
**Adapters:** [Auth](docs/auth.md) · [Events](docs/events.md) · [Telemetry](docs/telemetry.md) · [Logging](docs/logging.md) · [Maintenance](docs/maintenance.md) · [OAuth](docs/oauth-and-delegation.md)
|
|
213
253
|
|
|
214
|
-
**API:** [Workflows](docs/api/workflows.md) · [Tasks](docs/api/tasks.md) · [Escalations](docs/api/escalations.md) · [YAML Workflows](docs/api/yaml-workflows.md) · [Users](docs/api/users.md) · [Roles](docs/api/roles.md) · [Service Accounts](docs/api/service-accounts.md) · [MCP Servers](docs/api/mcp-servers.md) · [MCP Runs](docs/api/mcp-runs.md) · [Exports](docs/api/exports.md)
|
|
254
|
+
**HTTP API:** [Workflows](docs/api/http/workflows.md) · [Tasks](docs/api/http/tasks.md) · [Escalations](docs/api/http/escalations.md) · [YAML Workflows](docs/api/http/yaml-workflows.md) · [Users](docs/api/http/users.md) · [Roles](docs/api/http/roles.md) · [Service Accounts](docs/api/http/service-accounts.md) · [MCP Servers](docs/api/http/mcp-servers.md) · [MCP Runs](docs/api/http/mcp-runs.md) · [Exports](docs/api/http/exports.md)
|
|
255
|
+
|
|
256
|
+
**SDK:** [Overview](docs/sdk.md) · [Workflows](docs/api/sdk/workflows.md) · [Tasks](docs/api/sdk/tasks.md) · [Escalations](docs/api/sdk/escalations.md) · [YAML Workflows](docs/api/sdk/yaml-workflows.md) · [MCP](docs/api/sdk/mcp.md) · [Events](docs/api/sdk/events.md)
|
|
215
257
|
|
|
216
258
|
## Contributing
|
|
217
259
|
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { LTApiResult } from '../types/sdk';
|
|
2
|
+
/**
|
|
3
|
+
* Authenticate a user by username and password.
|
|
4
|
+
*
|
|
5
|
+
* Verifies credentials against the user store and returns a signed JWT
|
|
6
|
+
* with the user's roles and highest privilege level. The token is valid
|
|
7
|
+
* for 24 hours.
|
|
8
|
+
*
|
|
9
|
+
* @param input.username — login identifier (external_id)
|
|
10
|
+
* @param input.password — plaintext password
|
|
11
|
+
* @returns `{ status: 200, data: { token, user: { id, external_id, display_name, roles } } }`
|
|
12
|
+
*/
|
|
13
|
+
export declare function login(input: {
|
|
14
|
+
username: string;
|
|
15
|
+
password: string;
|
|
16
|
+
}): Promise<LTApiResult>;
|
|
@@ -0,0 +1,53 @@
|
|
|
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
|
+
/**
|
|
7
|
+
* Authenticate a user by username and password.
|
|
8
|
+
*
|
|
9
|
+
* Verifies credentials against the user store and returns a signed JWT
|
|
10
|
+
* with the user's roles and highest privilege level. The token is valid
|
|
11
|
+
* for 24 hours.
|
|
12
|
+
*
|
|
13
|
+
* @param input.username — login identifier (external_id)
|
|
14
|
+
* @param input.password — plaintext password
|
|
15
|
+
* @returns `{ status: 200, data: { token, user: { id, external_id, display_name, roles } } }`
|
|
16
|
+
*/
|
|
17
|
+
async function login(input) {
|
|
18
|
+
try {
|
|
19
|
+
const { username, password } = input;
|
|
20
|
+
if (!username || !password) {
|
|
21
|
+
return { status: 400, error: 'username and password are required' };
|
|
22
|
+
}
|
|
23
|
+
const user = await (0, user_1.verifyPassword)(username, password);
|
|
24
|
+
if (!user) {
|
|
25
|
+
return { status: 401, error: 'Invalid credentials' };
|
|
26
|
+
}
|
|
27
|
+
const highestType = user.roles.some((r) => r.type === 'superadmin')
|
|
28
|
+
? 'superadmin'
|
|
29
|
+
: user.roles.some((r) => r.type === 'admin')
|
|
30
|
+
? 'admin'
|
|
31
|
+
: 'member';
|
|
32
|
+
const token = (0, auth_1.signToken)({
|
|
33
|
+
userId: user.id,
|
|
34
|
+
role: highestType,
|
|
35
|
+
roles: user.roles.map((r) => ({ role: r.role, type: r.type })),
|
|
36
|
+
}, '24h');
|
|
37
|
+
return {
|
|
38
|
+
status: 200,
|
|
39
|
+
data: {
|
|
40
|
+
token,
|
|
41
|
+
user: {
|
|
42
|
+
id: user.id,
|
|
43
|
+
external_id: user.external_id,
|
|
44
|
+
display_name: user.display_name,
|
|
45
|
+
roles: user.roles,
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
return { status: 500, error: err.message };
|
|
52
|
+
}
|
|
53
|
+
}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import type { LTApiResult, LTApiAuth } from '../types/sdk';
|
|
2
|
+
/**
|
|
3
|
+
* List all bot accounts with pagination.
|
|
4
|
+
*
|
|
5
|
+
* @param input.limit — maximum number of bots to return (default 50)
|
|
6
|
+
* @param input.offset — number of bots to skip for pagination (default 0)
|
|
7
|
+
* @returns `{ status: 200, data: Bot[] }` paginated list of bots
|
|
8
|
+
*/
|
|
9
|
+
export declare function listBots(input: {
|
|
10
|
+
limit?: number;
|
|
11
|
+
offset?: number;
|
|
12
|
+
}): Promise<LTApiResult>;
|
|
13
|
+
/**
|
|
14
|
+
* Retrieve a single bot account by ID.
|
|
15
|
+
*
|
|
16
|
+
* @param input.id — unique identifier of the bot
|
|
17
|
+
* @returns `{ status: 200, data: Bot }` the bot record, or 404 if not found
|
|
18
|
+
*/
|
|
19
|
+
export declare function getBot(input: {
|
|
20
|
+
id: string;
|
|
21
|
+
}): Promise<LTApiResult>;
|
|
22
|
+
/**
|
|
23
|
+
* Create a new bot account with optional roles.
|
|
24
|
+
*
|
|
25
|
+
* Validates that each provided role has a valid type (superadmin, admin, member).
|
|
26
|
+
* Returns 409 if a bot with the same name already exists.
|
|
27
|
+
*
|
|
28
|
+
* @param input.name — unique bot name (required)
|
|
29
|
+
* @param input.description — optional text description of the bot
|
|
30
|
+
* @param input.display_name — optional human-friendly display name
|
|
31
|
+
* @param input.roles — optional list of roles to assign at creation, each with a role name and type
|
|
32
|
+
* @param auth — authenticated user context; userId is recorded as the bot creator
|
|
33
|
+
* @returns `{ status: 201, data: Bot }` the newly created bot record
|
|
34
|
+
*/
|
|
35
|
+
export declare function createBot(input: {
|
|
36
|
+
name: string;
|
|
37
|
+
description?: string;
|
|
38
|
+
display_name?: string;
|
|
39
|
+
roles?: {
|
|
40
|
+
role: string;
|
|
41
|
+
type: string;
|
|
42
|
+
}[];
|
|
43
|
+
}, auth?: LTApiAuth): Promise<LTApiResult>;
|
|
44
|
+
/**
|
|
45
|
+
* Update mutable fields on an existing bot account.
|
|
46
|
+
*
|
|
47
|
+
* @param input.id — unique identifier of the bot to update
|
|
48
|
+
* @param input.display_name — new display name
|
|
49
|
+
* @param input.description — new description
|
|
50
|
+
* @param input.status — new status value
|
|
51
|
+
* @returns `{ status: 200, data: Bot }` the updated bot record, or 404 if not found
|
|
52
|
+
*/
|
|
53
|
+
export declare function updateBot(input: {
|
|
54
|
+
id: string;
|
|
55
|
+
display_name?: string;
|
|
56
|
+
description?: string;
|
|
57
|
+
status?: string;
|
|
58
|
+
}): Promise<LTApiResult>;
|
|
59
|
+
/**
|
|
60
|
+
* Delete a bot account by ID.
|
|
61
|
+
*
|
|
62
|
+
* @param input.id — unique identifier of the bot to delete
|
|
63
|
+
* @returns `{ status: 200, data: { deleted: true } }` on success, or 404 if not found
|
|
64
|
+
*/
|
|
65
|
+
export declare function deleteBot(input: {
|
|
66
|
+
id: string;
|
|
67
|
+
}): Promise<LTApiResult>;
|
|
68
|
+
/**
|
|
69
|
+
* List all roles assigned to a bot account.
|
|
70
|
+
*
|
|
71
|
+
* @param input.id — unique identifier of the bot
|
|
72
|
+
* @returns `{ status: 200, data: { roles: Role[] } }` the bot's roles, or 404 if bot not found
|
|
73
|
+
*/
|
|
74
|
+
export declare function getBotRoles(input: {
|
|
75
|
+
id: string;
|
|
76
|
+
}): Promise<LTApiResult>;
|
|
77
|
+
/**
|
|
78
|
+
* Assign a role to a bot account.
|
|
79
|
+
*
|
|
80
|
+
* Validates that the role type is one of superadmin, admin, or member.
|
|
81
|
+
*
|
|
82
|
+
* @param input.id — unique identifier of the bot
|
|
83
|
+
* @param input.role — role name to assign
|
|
84
|
+
* @param input.type — role type (superadmin, admin, or member)
|
|
85
|
+
* @returns `{ status: 201, data: Role }` the newly assigned role, or 404 if bot not found
|
|
86
|
+
*/
|
|
87
|
+
export declare function addBotRole(input: {
|
|
88
|
+
id: string;
|
|
89
|
+
role: string;
|
|
90
|
+
type: string;
|
|
91
|
+
}): Promise<LTApiResult>;
|
|
92
|
+
/**
|
|
93
|
+
* Remove a role from a bot account.
|
|
94
|
+
*
|
|
95
|
+
* @param input.id — unique identifier of the bot
|
|
96
|
+
* @param input.role — role name to remove
|
|
97
|
+
* @returns `{ status: 200, data: { removed: true } }` on success, or 404 if role not found
|
|
98
|
+
*/
|
|
99
|
+
export declare function removeBotRole(input: {
|
|
100
|
+
id: string;
|
|
101
|
+
role: string;
|
|
102
|
+
}): Promise<LTApiResult>;
|
|
103
|
+
/**
|
|
104
|
+
* List all API keys for a bot account.
|
|
105
|
+
*
|
|
106
|
+
* @param input.id — unique identifier of the bot
|
|
107
|
+
* @returns `{ status: 200, data: { keys: ApiKey[] } }` the bot's API keys, or 404 if bot not found
|
|
108
|
+
*/
|
|
109
|
+
export declare function listBotKeys(input: {
|
|
110
|
+
id: string;
|
|
111
|
+
}): Promise<LTApiResult>;
|
|
112
|
+
/**
|
|
113
|
+
* Create a new API key for a bot account.
|
|
114
|
+
*
|
|
115
|
+
* Returns 409 if an API key with the same name already exists for this bot.
|
|
116
|
+
*
|
|
117
|
+
* @param input.id — unique identifier of the bot
|
|
118
|
+
* @param input.name — human-readable name for the API key (required)
|
|
119
|
+
* @param input.scopes — optional list of permission scopes to restrict the key
|
|
120
|
+
* @param input.expires_at — optional ISO 8601 expiration timestamp
|
|
121
|
+
* @returns `{ status: 201, data: ApiKey }` the newly created API key (includes the secret)
|
|
122
|
+
*/
|
|
123
|
+
export declare function createBotKey(input: {
|
|
124
|
+
id: string;
|
|
125
|
+
name: string;
|
|
126
|
+
scopes?: string[];
|
|
127
|
+
expires_at?: string;
|
|
128
|
+
}): Promise<LTApiResult>;
|
|
129
|
+
/**
|
|
130
|
+
* Revoke an existing bot API key.
|
|
131
|
+
*
|
|
132
|
+
* @param input.keyId — unique identifier of the API key to revoke
|
|
133
|
+
* @returns `{ status: 200, data: { revoked: true } }` on success, or 404 if key not found
|
|
134
|
+
*/
|
|
135
|
+
export declare function revokeBotKey(input: {
|
|
136
|
+
keyId: string;
|
|
137
|
+
}): Promise<LTApiResult>;
|
|
@@ -0,0 +1,302 @@
|
|
|
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
|
+
/**
|
|
50
|
+
* List all bot accounts with pagination.
|
|
51
|
+
*
|
|
52
|
+
* @param input.limit — maximum number of bots to return (default 50)
|
|
53
|
+
* @param input.offset — number of bots to skip for pagination (default 0)
|
|
54
|
+
* @returns `{ status: 200, data: Bot[] }` paginated list of bots
|
|
55
|
+
*/
|
|
56
|
+
async function listBots(input) {
|
|
57
|
+
try {
|
|
58
|
+
const limit = input.limit ?? 50;
|
|
59
|
+
const offset = input.offset ?? 0;
|
|
60
|
+
const result = await iam.listBots(limit, offset);
|
|
61
|
+
return { status: 200, data: result };
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
return { status: 500, error: err.message };
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Retrieve a single bot account by ID.
|
|
69
|
+
*
|
|
70
|
+
* @param input.id — unique identifier of the bot
|
|
71
|
+
* @returns `{ status: 200, data: Bot }` the bot record, or 404 if not found
|
|
72
|
+
*/
|
|
73
|
+
async function getBot(input) {
|
|
74
|
+
try {
|
|
75
|
+
const bot = await iam.getBot(input.id);
|
|
76
|
+
if (!bot) {
|
|
77
|
+
return { status: 404, error: 'Bot not found' };
|
|
78
|
+
}
|
|
79
|
+
return { status: 200, data: bot };
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
return { status: 500, error: err.message };
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Create a new bot account with optional roles.
|
|
87
|
+
*
|
|
88
|
+
* Validates that each provided role has a valid type (superadmin, admin, member).
|
|
89
|
+
* Returns 409 if a bot with the same name already exists.
|
|
90
|
+
*
|
|
91
|
+
* @param input.name — unique bot name (required)
|
|
92
|
+
* @param input.description — optional text description of the bot
|
|
93
|
+
* @param input.display_name — optional human-friendly display name
|
|
94
|
+
* @param input.roles — optional list of roles to assign at creation, each with a role name and type
|
|
95
|
+
* @param auth — authenticated user context; userId is recorded as the bot creator
|
|
96
|
+
* @returns `{ status: 201, data: Bot }` the newly created bot record
|
|
97
|
+
*/
|
|
98
|
+
async function createBot(input, auth) {
|
|
99
|
+
try {
|
|
100
|
+
if (!input.name) {
|
|
101
|
+
return { status: 400, error: 'name is required' };
|
|
102
|
+
}
|
|
103
|
+
if (input.roles) {
|
|
104
|
+
for (const r of input.roles) {
|
|
105
|
+
if (!r.role || !r.type || !(0, user_1.isValidRoleType)(r.type)) {
|
|
106
|
+
return {
|
|
107
|
+
status: 400,
|
|
108
|
+
error: 'Each role must have a role name and type (superadmin, admin, member)',
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
const bot = await iam.createBot({
|
|
114
|
+
name: input.name,
|
|
115
|
+
description: input.description,
|
|
116
|
+
display_name: input.display_name,
|
|
117
|
+
roles: input.roles,
|
|
118
|
+
created_by: auth?.userId,
|
|
119
|
+
});
|
|
120
|
+
return { status: 201, data: bot };
|
|
121
|
+
}
|
|
122
|
+
catch (err) {
|
|
123
|
+
if (err.code === '23505') {
|
|
124
|
+
return { status: 409, error: 'Bot with this name already exists' };
|
|
125
|
+
}
|
|
126
|
+
return { status: 500, error: err.message };
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Update mutable fields on an existing bot account.
|
|
131
|
+
*
|
|
132
|
+
* @param input.id — unique identifier of the bot to update
|
|
133
|
+
* @param input.display_name — new display name
|
|
134
|
+
* @param input.description — new description
|
|
135
|
+
* @param input.status — new status value
|
|
136
|
+
* @returns `{ status: 200, data: Bot }` the updated bot record, or 404 if not found
|
|
137
|
+
*/
|
|
138
|
+
async function updateBot(input) {
|
|
139
|
+
try {
|
|
140
|
+
const { id, ...fields } = input;
|
|
141
|
+
const bot = await iam.updateBot(id, fields);
|
|
142
|
+
if (!bot) {
|
|
143
|
+
return { status: 404, error: 'Bot not found' };
|
|
144
|
+
}
|
|
145
|
+
return { status: 200, data: bot };
|
|
146
|
+
}
|
|
147
|
+
catch (err) {
|
|
148
|
+
return { status: 500, error: err.message };
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Delete a bot account by ID.
|
|
153
|
+
*
|
|
154
|
+
* @param input.id — unique identifier of the bot to delete
|
|
155
|
+
* @returns `{ status: 200, data: { deleted: true } }` on success, or 404 if not found
|
|
156
|
+
*/
|
|
157
|
+
async function deleteBot(input) {
|
|
158
|
+
try {
|
|
159
|
+
const deleted = await iam.deleteBot(input.id);
|
|
160
|
+
if (!deleted) {
|
|
161
|
+
return { status: 404, error: 'Bot not found' };
|
|
162
|
+
}
|
|
163
|
+
return { status: 200, data: { deleted: true } };
|
|
164
|
+
}
|
|
165
|
+
catch (err) {
|
|
166
|
+
return { status: 500, error: err.message };
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* List all roles assigned to a bot account.
|
|
171
|
+
*
|
|
172
|
+
* @param input.id — unique identifier of the bot
|
|
173
|
+
* @returns `{ status: 200, data: { roles: Role[] } }` the bot's roles, or 404 if bot not found
|
|
174
|
+
*/
|
|
175
|
+
async function getBotRoles(input) {
|
|
176
|
+
try {
|
|
177
|
+
const bot = await iam.getBot(input.id);
|
|
178
|
+
if (!bot) {
|
|
179
|
+
return { status: 404, error: 'Bot not found' };
|
|
180
|
+
}
|
|
181
|
+
const roles = await iam.getBotRoles(input.id);
|
|
182
|
+
return { status: 200, data: { roles } };
|
|
183
|
+
}
|
|
184
|
+
catch (err) {
|
|
185
|
+
return { status: 500, error: err.message };
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Assign a role to a bot account.
|
|
190
|
+
*
|
|
191
|
+
* Validates that the role type is one of superadmin, admin, or member.
|
|
192
|
+
*
|
|
193
|
+
* @param input.id — unique identifier of the bot
|
|
194
|
+
* @param input.role — role name to assign
|
|
195
|
+
* @param input.type — role type (superadmin, admin, or member)
|
|
196
|
+
* @returns `{ status: 201, data: Role }` the newly assigned role, or 404 if bot not found
|
|
197
|
+
*/
|
|
198
|
+
async function addBotRole(input) {
|
|
199
|
+
try {
|
|
200
|
+
if (!input.role || !input.type) {
|
|
201
|
+
return { status: 400, error: 'role and type are required' };
|
|
202
|
+
}
|
|
203
|
+
if (!(0, user_1.isValidRoleType)(input.type)) {
|
|
204
|
+
return { status: 400, error: 'type must be superadmin, admin, or member' };
|
|
205
|
+
}
|
|
206
|
+
const bot = await iam.getBot(input.id);
|
|
207
|
+
if (!bot) {
|
|
208
|
+
return { status: 404, error: 'Bot not found' };
|
|
209
|
+
}
|
|
210
|
+
const result = await iam.addBotRole(input.id, input.role, input.type);
|
|
211
|
+
return { status: 201, data: result };
|
|
212
|
+
}
|
|
213
|
+
catch (err) {
|
|
214
|
+
return { status: 500, error: err.message };
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Remove a role from a bot account.
|
|
219
|
+
*
|
|
220
|
+
* @param input.id — unique identifier of the bot
|
|
221
|
+
* @param input.role — role name to remove
|
|
222
|
+
* @returns `{ status: 200, data: { removed: true } }` on success, or 404 if role not found
|
|
223
|
+
*/
|
|
224
|
+
async function removeBotRole(input) {
|
|
225
|
+
try {
|
|
226
|
+
const removed = await iam.removeBotRole(input.id, input.role);
|
|
227
|
+
if (!removed) {
|
|
228
|
+
return { status: 404, error: 'Role not found' };
|
|
229
|
+
}
|
|
230
|
+
return { status: 200, data: { removed: true } };
|
|
231
|
+
}
|
|
232
|
+
catch (err) {
|
|
233
|
+
return { status: 500, error: err.message };
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* List all API keys for a bot account.
|
|
238
|
+
*
|
|
239
|
+
* @param input.id — unique identifier of the bot
|
|
240
|
+
* @returns `{ status: 200, data: { keys: ApiKey[] } }` the bot's API keys, or 404 if bot not found
|
|
241
|
+
*/
|
|
242
|
+
async function listBotKeys(input) {
|
|
243
|
+
try {
|
|
244
|
+
const bot = await iam.getBot(input.id);
|
|
245
|
+
if (!bot) {
|
|
246
|
+
return { status: 404, error: 'Bot not found' };
|
|
247
|
+
}
|
|
248
|
+
const keys = await iam.listBotKeys(input.id);
|
|
249
|
+
return { status: 200, data: { keys } };
|
|
250
|
+
}
|
|
251
|
+
catch (err) {
|
|
252
|
+
return { status: 500, error: err.message };
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Create a new API key for a bot account.
|
|
257
|
+
*
|
|
258
|
+
* Returns 409 if an API key with the same name already exists for this bot.
|
|
259
|
+
*
|
|
260
|
+
* @param input.id — unique identifier of the bot
|
|
261
|
+
* @param input.name — human-readable name for the API key (required)
|
|
262
|
+
* @param input.scopes — optional list of permission scopes to restrict the key
|
|
263
|
+
* @param input.expires_at — optional ISO 8601 expiration timestamp
|
|
264
|
+
* @returns `{ status: 201, data: ApiKey }` the newly created API key (includes the secret)
|
|
265
|
+
*/
|
|
266
|
+
async function createBotKey(input) {
|
|
267
|
+
try {
|
|
268
|
+
if (!input.name) {
|
|
269
|
+
return { status: 400, error: 'name is required' };
|
|
270
|
+
}
|
|
271
|
+
const expiresAt = input.expires_at ? new Date(input.expires_at) : undefined;
|
|
272
|
+
const result = await iam.createBotKey(input.id, input.name, input.scopes || [], expiresAt);
|
|
273
|
+
return { status: 201, data: result };
|
|
274
|
+
}
|
|
275
|
+
catch (err) {
|
|
276
|
+
if (err.message === 'Bot not found') {
|
|
277
|
+
return { status: 404, error: err.message };
|
|
278
|
+
}
|
|
279
|
+
if (err.code === '23505') {
|
|
280
|
+
return { status: 409, error: 'API key with this name already exists for this bot' };
|
|
281
|
+
}
|
|
282
|
+
return { status: 500, error: err.message };
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Revoke an existing bot API key.
|
|
287
|
+
*
|
|
288
|
+
* @param input.keyId — unique identifier of the API key to revoke
|
|
289
|
+
* @returns `{ status: 200, data: { revoked: true } }` on success, or 404 if key not found
|
|
290
|
+
*/
|
|
291
|
+
async function revokeBotKey(input) {
|
|
292
|
+
try {
|
|
293
|
+
const revoked = await iam.revokeBotKey(input.keyId);
|
|
294
|
+
if (!revoked) {
|
|
295
|
+
return { status: 404, error: 'API key not found' };
|
|
296
|
+
}
|
|
297
|
+
return { status: 200, data: { revoked: true } };
|
|
298
|
+
}
|
|
299
|
+
catch (err) {
|
|
300
|
+
return { status: 500, error: err.message };
|
|
301
|
+
}
|
|
302
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { LTApiResult } from '../types/sdk';
|
|
2
|
+
/**
|
|
3
|
+
* List all registered application namespaces.
|
|
4
|
+
*
|
|
5
|
+
* @returns `{ status: 200, data: { apps } }` array of known app identifiers
|
|
6
|
+
*/
|
|
7
|
+
export declare function listApps(): Promise<LTApiResult>;
|
|
8
|
+
/**
|
|
9
|
+
* Query active worker profiles for an application.
|
|
10
|
+
*
|
|
11
|
+
* Sends a roll-call request to the mesh and collects responses from
|
|
12
|
+
* all running workers within the optional delay window.
|
|
13
|
+
*
|
|
14
|
+
* @param input.appId — application namespace to query (defaults to 'durable')
|
|
15
|
+
* @param input.delay — milliseconds to wait for worker responses before returning
|
|
16
|
+
* @returns `{ status: 200, data: { profiles } }` array of worker profile objects
|
|
17
|
+
*/
|
|
18
|
+
export declare function rollCall(input: {
|
|
19
|
+
appId?: string;
|
|
20
|
+
delay?: number;
|
|
21
|
+
}): Promise<LTApiResult>;
|
|
22
|
+
/**
|
|
23
|
+
* Apply a throttle rate to workflow execution.
|
|
24
|
+
*
|
|
25
|
+
* Sets the throttle value for a specific topic or workflow within an app
|
|
26
|
+
* namespace. Also publishes a synthetic `mesh.throttle` event so the
|
|
27
|
+
* dashboard event stream reflects the change.
|
|
28
|
+
*
|
|
29
|
+
* @param input.appId — application namespace (defaults to 'durable')
|
|
30
|
+
* @param input.throttle — throttle value to apply (required, must be a number)
|
|
31
|
+
* @param input.topic — optional topic to scope the throttle to
|
|
32
|
+
* @param input.guid — optional workflow GUID to scope the throttle to
|
|
33
|
+
* @returns `{ status: 200, data: { success } }` boolean indicating the throttle was applied
|
|
34
|
+
*/
|
|
35
|
+
export declare function applyThrottle(input: {
|
|
36
|
+
appId?: string;
|
|
37
|
+
throttle: number;
|
|
38
|
+
topic?: string;
|
|
39
|
+
guid?: string;
|
|
40
|
+
}): Promise<LTApiResult>;
|
|
41
|
+
/**
|
|
42
|
+
* Retrieve stream statistics for an application.
|
|
43
|
+
*
|
|
44
|
+
* Returns throughput and backlog metrics for Redis streams backing the
|
|
45
|
+
* given app namespace over the specified time window.
|
|
46
|
+
*
|
|
47
|
+
* @param input.app_id — application namespace (defaults to 'durable')
|
|
48
|
+
* @param input.duration — time window for stats aggregation, e.g. '1h', '30m' (defaults to '1h')
|
|
49
|
+
* @param input.stream — optional specific stream name to filter results
|
|
50
|
+
* @returns `{ status: 200, data: { ... } }` stream statistics object
|
|
51
|
+
*/
|
|
52
|
+
export declare function getStreamStats(input: {
|
|
53
|
+
app_id?: string;
|
|
54
|
+
duration?: string;
|
|
55
|
+
stream?: string;
|
|
56
|
+
}): Promise<LTApiResult>;
|
|
57
|
+
/**
|
|
58
|
+
* Subscribe to mesh events for an application.
|
|
59
|
+
*
|
|
60
|
+
* Establishes a subscription to the event stream of the given app
|
|
61
|
+
* namespace so that mesh events are captured and forwarded.
|
|
62
|
+
*
|
|
63
|
+
* @param input.appId — application namespace to subscribe to (defaults to 'durable')
|
|
64
|
+
* @returns `{ status: 200, data: { subscribed, appId } }` confirmation with the subscribed app ID
|
|
65
|
+
*/
|
|
66
|
+
export declare function subscribeMesh(input: {
|
|
67
|
+
appId?: string;
|
|
68
|
+
}): Promise<LTApiResult>;
|