@hotmeshio/long-tail 0.1.5 → 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 +78 -8
- 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/migrate.js +3 -6
- package/{lib → build/lib}/db/schemas/001_schema.sql +3 -0
- package/build/lib/db/schemas/004_workflow_sets.sql +29 -0
- package/build/lib/db/schemas/005_unique_graph_topic.sql +7 -0
- package/{lib → build/lib}/db/schemas/011_system_workflow_configs.sql +14 -0
- package/build/lib/db/schemas/016_streamable_http.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/docs.js +25 -7
- 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 +61 -40
- package/build/routes/maintenance.js +41 -17
- package/build/routes/mcp-runs.js +52 -60
- package/build/routes/mcp.js +55 -161
- 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.d.ts +2 -0
- package/build/routes/yaml-workflows/cron.js +68 -0
- package/build/routes/yaml-workflows/crud.js +38 -193
- package/build/routes/yaml-workflows/deployment.js +15 -140
- package/build/routes/yaml-workflows/index.js +4 -1
- 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/cron/index.d.ts +17 -0
- package/build/services/cron/index.js +94 -1
- package/build/services/export/index.js +6 -1
- package/build/services/hotmesh-utils.js +2 -4
- package/build/services/insight/index.d.ts +18 -0
- package/build/services/insight/index.js +60 -0
- package/build/services/mcp/client/connection.d.ts +9 -0
- package/build/services/mcp/client/connection.js +49 -1
- package/build/services/mcp/client/tools.js +13 -1
- package/build/services/mcp/db-server/schemas.d.ts +2 -2
- package/build/services/mcp/db.d.ts +1 -1
- package/build/services/mcp/db.js +10 -0
- package/build/services/mcp/playwright-server/schemas.d.ts +4 -4
- package/build/services/mcp/sql.d.ts +1 -1
- package/build/services/mcp/sql.js +2 -2
- package/build/services/mcp/types.d.ts +3 -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 +8 -0
- package/build/services/yaml-workflow/db.js +41 -0
- package/build/services/yaml-workflow/invoke.d.ts +19 -0
- package/build/services/yaml-workflow/invoke.js +80 -0
- package/build/services/yaml-workflow/pipeline/build/dag.js +1 -1
- package/build/services/yaml-workflow/pipeline/build/wiring.d.ts +1 -1
- package/build/services/yaml-workflow/pipeline/build/wiring.js +102 -2
- package/build/services/yaml-workflow/pipeline/prompts.d.ts +1 -1
- package/build/services/yaml-workflow/pipeline/prompts.js +44 -1
- package/build/services/yaml-workflow/sql.d.ts +5 -1
- package/build/services/yaml-workflow/sql.js +23 -3
- package/build/services/yaml-workflow/types.d.ts +16 -1
- package/build/services/yaml-workflow/workers/callbacks.js +16 -2
- package/build/services/yaml-workflow/workers/register.js +36 -1
- package/build/start/adapters.js +4 -0
- package/build/system/index.js +12 -0
- package/build/system/mcp-servers/admin/schemas.d.ts +12 -12
- package/build/system/mcp-servers/db-query/schemas.d.ts +2 -2
- package/build/system/mcp-servers/knowledge.js +1 -1
- package/build/system/mcp-servers/playwright/schemas.d.ts +18 -18
- package/build/system/mcp-servers/playwright-cli/schemas.d.ts +34 -34
- package/build/system/mcp-servers/playwright-cli/tools-capture.js +5 -1
- package/build/system/mcp-servers/vision.js +54 -17
- package/build/system/seed/server-definitions.d.ts +7 -0
- package/build/system/seed/server-definitions.js +6 -2
- package/build/system/seed/tool-manifests-workflows.d.ts +7 -0
- package/build/system/seed/tool-manifests-workflows.js +10 -3
- package/build/system/workflows/mcp-workflow-builder/activities/caches.d.ts +5 -0
- package/build/system/workflows/mcp-workflow-builder/activities/caches.js +8 -0
- package/build/system/workflows/mcp-workflow-builder/activities/index.d.ts +2 -0
- package/build/system/workflows/mcp-workflow-builder/activities/index.js +8 -0
- package/build/system/workflows/mcp-workflow-builder/activities/llm.d.ts +2 -0
- package/build/system/workflows/mcp-workflow-builder/activities/llm.js +25 -0
- package/build/system/workflows/mcp-workflow-builder/activities/tool-loader.d.ts +11 -0
- package/build/system/workflows/mcp-workflow-builder/activities/tool-loader.js +34 -0
- package/build/system/workflows/mcp-workflow-builder/index.d.ts +16 -0
- package/build/system/workflows/mcp-workflow-builder/index.js +253 -0
- package/build/system/workflows/mcp-workflow-builder/prompts.d.ts +8 -0
- package/build/system/workflows/mcp-workflow-builder/prompts.js +316 -0
- 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/system/workflows/shared/tool-loader.js +3 -0
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/index.d.ts +1 -0
- package/build/types/mcp.d.ts +4 -3
- 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/build/types/yaml-workflow.d.ts +6 -2
- package/dashboard/dist/assets/AdminDashboard-DRjkRSjJ.js +2 -0
- package/dashboard/dist/assets/{AdminDashboard-CTyAMUJR.js.map → AdminDashboard-DRjkRSjJ.js.map} +1 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-CnivX4Tz.js +2 -0
- package/dashboard/dist/assets/AvailableEscalationsPage-CnivX4Tz.js.map +1 -0
- package/dashboard/dist/assets/BotPicker-DwwaBhTH.js +2 -0
- package/dashboard/dist/assets/{BotPicker-C51nKFEu.js.map → BotPicker-DwwaBhTH.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-BSyfd8uL.js → CollapsibleSection-DQpaVA0M.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-BSyfd8uL.js.map → CollapsibleSection-DQpaVA0M.js.map} +1 -1
- package/dashboard/dist/assets/{ConfirmDeleteModal-CBdhia5T.js → ConfirmDeleteModal-B7JoDNvt.js} +2 -2
- package/dashboard/dist/assets/{ConfirmDeleteModal-CBdhia5T.js.map → ConfirmDeleteModal-B7JoDNvt.js.map} +1 -1
- package/dashboard/dist/assets/{CopyableId-dGlewBCS.js → CopyableId-AqoZayBG.js} +2 -2
- package/dashboard/dist/assets/{CopyableId-dGlewBCS.js.map → CopyableId-AqoZayBG.js.map} +1 -1
- package/dashboard/dist/assets/CredentialsPage-qGw1kQzi.js +2 -0
- package/dashboard/dist/assets/CredentialsPage-qGw1kQzi.js.map +1 -0
- package/dashboard/dist/assets/{CustomDurationPicker-BataWFj8.js → CustomDurationPicker-D1HUQcd0.js} +2 -2
- package/dashboard/dist/assets/{CustomDurationPicker-BataWFj8.js.map → CustomDurationPicker-D1HUQcd0.js.map} +1 -1
- package/dashboard/dist/assets/{DataTable-B3uf5CCo.js → DataTable-DKvSKoVG.js} +2 -2
- package/dashboard/dist/assets/{DataTable-B3uf5CCo.js.map → DataTable-DKvSKoVG.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-G5oSwTpT.js → ElapsedCell-B0yrReGQ.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-G5oSwTpT.js.map → ElapsedCell-B0yrReGQ.js.map} +1 -1
- package/dashboard/dist/assets/{EmptyState-BChBJNGS.js → EmptyState-X0fIzYID.js} +2 -2
- package/dashboard/dist/assets/{EmptyState-BChBJNGS.js.map → EmptyState-X0fIzYID.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-CxUv8xjG.js → EscalationsOverview-BQAT9W7r.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-CxUv8xjG.js.map → EscalationsOverview-BQAT9W7r.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-CVt8B0BZ.js → EventTable-CX1KNLhZ.js} +2 -2
- package/dashboard/dist/assets/{EventTable-CVt8B0BZ.js.map → EventTable-CX1KNLhZ.js.map} +1 -1
- package/dashboard/dist/assets/{FilterBar-CShf0oe7.js → FilterBar-DMTvuQy-.js} +2 -2
- package/dashboard/dist/assets/{FilterBar-CShf0oe7.js.map → FilterBar-DMTvuQy-.js.map} +1 -1
- package/dashboard/dist/assets/ListToolbar-DTOSxoEy.js +2 -0
- package/dashboard/dist/assets/ListToolbar-DTOSxoEy.js.map +1 -0
- package/dashboard/dist/assets/{McpOverview-CbaZRnJl.js → McpOverview-BaKTIWrG.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-CbaZRnJl.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-CKs1RWeV.js +2 -0
- package/dashboard/dist/assets/McpRunDetailPage-CKs1RWeV.js.map +1 -0
- package/dashboard/dist/assets/McpRunsPage-CcPD_tY1.js +2 -0
- package/dashboard/dist/assets/McpRunsPage-CcPD_tY1.js.map +1 -0
- package/dashboard/dist/assets/{Modal-CI5RBPOQ.js → Modal-_2AbWxJT.js} +2 -2
- package/dashboard/dist/assets/{Modal-CI5RBPOQ.js.map → Modal-_2AbWxJT.js.map} +1 -1
- package/dashboard/dist/assets/OperatorDashboard-BGiRaRDr.js +2 -0
- package/dashboard/dist/assets/OperatorDashboard-BGiRaRDr.js.map +1 -0
- package/dashboard/dist/assets/{PageHeader-SMD9qtOO.js → PageHeader-DVr5Qyzm.js} +2 -2
- package/dashboard/dist/assets/{PageHeader-SMD9qtOO.js.map → PageHeader-DVr5Qyzm.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeaderWithStats-TikLQsTp.js → PageHeaderWithStats-D0KRASML.js} +2 -2
- package/dashboard/dist/assets/{PageHeaderWithStats-TikLQsTp.js.map → PageHeaderWithStats-D0KRASML.js.map} +1 -1
- package/dashboard/dist/assets/{PriorityBadge-CQ0EsLTA.js → PriorityBadge-Bx2559OU.js} +2 -2
- package/dashboard/dist/assets/{PriorityBadge-CQ0EsLTA.js.map → PriorityBadge-Bx2559OU.js.map} +1 -1
- package/dashboard/dist/assets/ProcessDetailPage-69I--sry.js +2 -0
- package/dashboard/dist/assets/ProcessDetailPage-69I--sry.js.map +1 -0
- package/dashboard/dist/assets/ProcessesListPage-BDpUbua2.js +2 -0
- package/dashboard/dist/assets/ProcessesListPage-BDpUbua2.js.map +1 -0
- package/dashboard/dist/assets/{RolePill-Crj4TH5p.js → RolePill-CcAqEaSt.js} +2 -2
- package/dashboard/dist/assets/{RolePill-Crj4TH5p.js.map → RolePill-CcAqEaSt.js.map} +1 -1
- package/dashboard/dist/assets/{RolesPage-C_RInUwS.js → RolesPage-Cl23Hjet.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-C_RInUwS.js.map → RolesPage-Cl23Hjet.js.map} +1 -1
- package/dashboard/dist/assets/{RowActions-Cp5HyK_w.js → RowActions-B4mqIt3Z.js} +2 -2
- package/dashboard/dist/assets/{RowActions-Cp5HyK_w.js.map → RowActions-B4mqIt3Z.js.map} +1 -1
- package/dashboard/dist/assets/{StatCard-BKZLSgNV.js → StatCard-Cz_2OjAZ.js} +2 -2
- package/dashboard/dist/assets/{StatCard-BKZLSgNV.js.map → StatCard-Cz_2OjAZ.js.map} +1 -1
- package/dashboard/dist/assets/{StatusBadge-BYNGGZK5.js → StatusBadge-Wi2FJZsn.js} +2 -2
- package/dashboard/dist/assets/{StatusBadge-BYNGGZK5.js.map → StatusBadge-Wi2FJZsn.js.map} +1 -1
- package/dashboard/dist/assets/StepIndicator-PW5NRDMb.js +2 -0
- package/dashboard/dist/assets/StepIndicator-PW5NRDMb.js.map +1 -0
- package/dashboard/dist/assets/{StickyPagination-CTosgiU2.js → StickyPagination-Bl2Uzz65.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-CTosgiU2.js.map → StickyPagination-Bl2Uzz65.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-ylG5Ps1s.js → SwimlaneTimeline-CUPqMd0z.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-ylG5Ps1s.js.map → SwimlaneTimeline-CUPqMd0z.js.map} +1 -1
- package/dashboard/dist/assets/TagInput-BLtf86Ly.js +2 -0
- package/dashboard/dist/assets/TagInput-BLtf86Ly.js.map +1 -0
- package/dashboard/dist/assets/{TaskDetailPage-C9pDGdD2.js → TaskDetailPage-BXJFX74D.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-C9pDGdD2.js.map → TaskDetailPage-BXJFX74D.js.map} +1 -1
- package/dashboard/dist/assets/{TaskQueuePill-BtJbZTT0.js → TaskQueuePill-CWYj3xKe.js} +2 -2
- package/dashboard/dist/assets/{TaskQueuePill-BtJbZTT0.js.map → TaskQueuePill-CWYj3xKe.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-DtFLUEhg.js → TasksListPage-C3cX94Mw.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-DtFLUEhg.js.map → TasksListPage-C3cX94Mw.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-WuM6xImZ.js → TimeAgo-B_5yDDHV.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-WuM6xImZ.js.map → TimeAgo-B_5yDDHV.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-IVL_-Upy.js → TimestampCell-DRX724uU.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-IVL_-Upy.js.map → TimestampCell-DRX724uU.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-DU9qeg13.js → UserName-Ca8FA469.js} +2 -2
- package/dashboard/dist/assets/{UserName-DU9qeg13.js.map → UserName-Ca8FA469.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowExecutionPage-BBYWEV2P.js +2 -0
- package/dashboard/dist/assets/WorkflowExecutionPage-BBYWEV2P.js.map +1 -0
- package/dashboard/dist/assets/WorkflowPill-BXifAuLi.js +2 -0
- package/dashboard/dist/assets/{WorkflowPill-Diw8iWBP.js.map → WorkflowPill-BXifAuLi.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowsDashboard-Drl3juz9.js +2 -0
- package/dashboard/dist/assets/WorkflowsDashboard-Drl3juz9.js.map +1 -0
- package/dashboard/dist/assets/{WorkflowsOverview-CPuvA4t3.js → WorkflowsOverview-03IRrDLg.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-CPuvA4t3.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-BPiZXf2h.js → bots-DZEXcgiJ.js} +2 -2
- package/dashboard/dist/assets/{bots-BPiZXf2h.js.map → bots-DZEXcgiJ.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-DTY_OKRh.js → escalation-Cw48lNaF.js} +2 -2
- package/dashboard/dist/assets/{escalation-DTY_OKRh.js.map → escalation-Cw48lNaF.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-columns-C91fHSkp.js → escalation-columns-NINpo3qf.js} +2 -2
- package/dashboard/dist/assets/{escalation-columns-C91fHSkp.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-fk_qr729.js +2 -0
- package/dashboard/dist/assets/helpers-fk_qr729.js.map +1 -0
- package/dashboard/dist/assets/index-B98ipWxE.js +2 -0
- package/dashboard/dist/assets/{index-CDWOfCmi.js.map → index-B98ipWxE.js.map} +1 -1
- package/dashboard/dist/assets/{index-D_qEAYrg.js → index-BIG3KooI.js} +2 -2
- package/dashboard/dist/assets/{index-D_qEAYrg.js.map → index-BIG3KooI.js.map} +1 -1
- package/dashboard/dist/assets/{index-DSzSoku1.js → index-BwN3KP_L.js} +91 -93
- package/dashboard/dist/assets/index-BwN3KP_L.js.map +1 -0
- package/dashboard/dist/assets/index-Bxe8h1x4.js +17 -0
- package/dashboard/dist/assets/index-Bxe8h1x4.js.map +1 -0
- package/dashboard/dist/assets/index-CNI7k7oB.js +6 -0
- package/dashboard/dist/assets/index-CNI7k7oB.js.map +1 -0
- package/dashboard/dist/assets/index-CORHB0WC.js +2 -0
- package/dashboard/dist/assets/index-CORHB0WC.js.map +1 -0
- package/dashboard/dist/assets/index-DcIKW-cZ.css +1 -0
- package/dashboard/dist/assets/index-Dj-z-x8M.js +2 -0
- package/dashboard/dist/assets/index-Dj-z-x8M.js.map +1 -0
- package/dashboard/dist/assets/index-DwRytW9O.js +5 -0
- package/dashboard/dist/assets/index-DwRytW9O.js.map +1 -0
- package/dashboard/dist/assets/index-aRvL-dXp.js +2 -0
- package/dashboard/dist/assets/index-aRvL-dXp.js.map +1 -0
- package/dashboard/dist/assets/index-b03HlbnH.js +2 -0
- package/dashboard/dist/assets/{index-BtOwLI0K.js.map → index-b03HlbnH.js.map} +1 -1
- package/dashboard/dist/assets/mcp-BZoFryNc.js +2 -0
- package/dashboard/dist/assets/mcp-BZoFryNc.js.map +1 -0
- 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-DmXYJD19.js → mcp-runs-BaEKnf5v.js} +2 -2
- package/dashboard/dist/assets/{mcp-runs-DmXYJD19.js.map → mcp-runs-BaEKnf5v.js.map} +1 -1
- package/dashboard/dist/assets/{namespaces-DoGa7jc7.js → namespaces-BwnZI4_A.js} +2 -2
- package/dashboard/dist/assets/{namespaces-DoGa7jc7.js.map → namespaces-BwnZI4_A.js.map} +1 -1
- package/dashboard/dist/assets/{roles-wCdQ2Z7k.js → roles-Bgn1K8zU.js} +2 -2
- package/dashboard/dist/assets/{roles-wCdQ2Z7k.js.map → roles-Bgn1K8zU.js.map} +1 -1
- package/dashboard/dist/assets/{settings-DDe_L7JT.js → settings-CizYiutL.js} +2 -2
- package/dashboard/dist/assets/{settings-DDe_L7JT.js.map → settings-CizYiutL.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-3Hih8Bt7.js → tasks-Bmte_hc4.js} +2 -2
- package/dashboard/dist/assets/{tasks-3Hih8Bt7.js.map → tasks-Bmte_hc4.js.map} +1 -1
- package/dashboard/dist/assets/useEventHooks-CUCxpiI2.js +2 -0
- package/dashboard/dist/assets/useEventHooks-CUCxpiI2.js.map +1 -0
- package/dashboard/dist/assets/useExpandedRows-Cg9iq6Vy.js +2 -0
- package/dashboard/dist/assets/useExpandedRows-Cg9iq6Vy.js.map +1 -0
- package/dashboard/dist/assets/{useYamlActivityEvents-B5dHec6Y.js → useYamlActivityEvents-Cum02Ej9.js} +2 -2
- package/dashboard/dist/assets/useYamlActivityEvents-Cum02Ej9.js.map +1 -0
- package/dashboard/dist/assets/{users-BTagPmGW.js → users-NSDgTt-z.js} +2 -2
- package/dashboard/dist/assets/{users-BTagPmGW.js.map → users-NSDgTt-z.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-DCLlGYO9.js → vendor-icons-D1DdudfH.js} +141 -66
- package/dashboard/dist/assets/vendor-icons-D1DdudfH.js.map +1 -0
- package/dashboard/dist/assets/{workflows-B20dR3NE.js → workflows-k0XRdGXx.js} +2 -2
- package/dashboard/dist/assets/{workflows-B20dR3NE.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/api/mcp-servers.md +60 -2
- package/docs/architecture.md +3 -3
- package/docs/dashboard.md +1 -1
- package/docs/epic-integration.md +224 -0
- package/docs/escalation-strategies.md +2 -3
- package/docs/events.md +28 -0
- package/docs/mcp.md +301 -31
- package/docs/sdk.md +177 -0
- package/docs/story.md +157 -0
- package/docs/workflow-builder.md +371 -0
- package/package.json +5 -4
- 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/AdminDashboard-CTyAMUJR.js +0 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-BMXV3Q4l.js +0 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-BMXV3Q4l.js.map +0 -1
- package/dashboard/dist/assets/BotPicker-C51nKFEu.js +0 -2
- package/dashboard/dist/assets/CredentialsPage-CoBNFSAu.js +0 -2
- package/dashboard/dist/assets/CredentialsPage-CoBNFSAu.js.map +0 -1
- package/dashboard/dist/assets/McpQueryDetailPage-CGoR9XK6.js +0 -5
- package/dashboard/dist/assets/McpQueryDetailPage-CGoR9XK6.js.map +0 -1
- package/dashboard/dist/assets/McpQueryPage-BjXoYQuU.js +0 -2
- package/dashboard/dist/assets/McpQueryPage-BjXoYQuU.js.map +0 -1
- package/dashboard/dist/assets/McpRunDetailPage-DLkA5Aar.js +0 -2
- package/dashboard/dist/assets/McpRunDetailPage-DLkA5Aar.js.map +0 -1
- package/dashboard/dist/assets/McpRunsPage-DCh9n11D.js +0 -2
- package/dashboard/dist/assets/McpRunsPage-DCh9n11D.js.map +0 -1
- package/dashboard/dist/assets/OperatorDashboard-Dc80suXd.js +0 -2
- package/dashboard/dist/assets/OperatorDashboard-Dc80suXd.js.map +0 -1
- package/dashboard/dist/assets/ProcessDetailPage-B2GKuGzk.js +0 -2
- package/dashboard/dist/assets/ProcessDetailPage-B2GKuGzk.js.map +0 -1
- package/dashboard/dist/assets/ProcessesListPage-CTjI3Wn6.js +0 -2
- package/dashboard/dist/assets/ProcessesListPage-CTjI3Wn6.js.map +0 -1
- package/dashboard/dist/assets/RefreshButton-BcQDObrv.js +0 -2
- package/dashboard/dist/assets/RefreshButton-BcQDObrv.js.map +0 -1
- package/dashboard/dist/assets/RunAsSelector-BhyWtofX.js +0 -2
- package/dashboard/dist/assets/RunAsSelector-BhyWtofX.js.map +0 -1
- package/dashboard/dist/assets/WorkflowExecutionPage-DOocX81f.js +0 -2
- package/dashboard/dist/assets/WorkflowExecutionPage-DOocX81f.js.map +0 -1
- package/dashboard/dist/assets/WorkflowPill-Diw8iWBP.js +0 -2
- package/dashboard/dist/assets/WorkflowsDashboard-DDtUIrTy.js +0 -2
- package/dashboard/dist/assets/WorkflowsDashboard-DDtUIrTy.js.map +0 -1
- package/dashboard/dist/assets/YamlWorkflowsPage-DlwwkluN.js +0 -2
- package/dashboard/dist/assets/YamlWorkflowsPage-DlwwkluN.js.map +0 -1
- package/dashboard/dist/assets/helpers-DBUZ9pnG.js +0 -2
- package/dashboard/dist/assets/helpers-DBUZ9pnG.js.map +0 -1
- package/dashboard/dist/assets/index-BOeA-gfK.js +0 -17
- package/dashboard/dist/assets/index-BOeA-gfK.js.map +0 -1
- package/dashboard/dist/assets/index-BZ6K_kmL.js +0 -3
- package/dashboard/dist/assets/index-BZ6K_kmL.js.map +0 -1
- package/dashboard/dist/assets/index-Bpm0yeoi.js +0 -2
- package/dashboard/dist/assets/index-Bpm0yeoi.js.map +0 -1
- package/dashboard/dist/assets/index-BtOwLI0K.js +0 -2
- package/dashboard/dist/assets/index-CBF3ZvRZ.js +0 -6
- package/dashboard/dist/assets/index-CBF3ZvRZ.js.map +0 -1
- package/dashboard/dist/assets/index-CDWOfCmi.js +0 -2
- package/dashboard/dist/assets/index-Ce6sL__n.js +0 -2
- package/dashboard/dist/assets/index-Ce6sL__n.js.map +0 -1
- package/dashboard/dist/assets/index-DSzSoku1.js.map +0 -1
- package/dashboard/dist/assets/index-gCy9XX3W.css +0 -1
- package/dashboard/dist/assets/mcp-BzVpaaKF.js +0 -2
- package/dashboard/dist/assets/mcp-BzVpaaKF.js.map +0 -1
- package/dashboard/dist/assets/mcp-query-wTuxTTCV.js +0 -2
- package/dashboard/dist/assets/mcp-query-wTuxTTCV.js.map +0 -1
- package/dashboard/dist/assets/useNatsEvents-DeGKHFTX.js +0 -2
- package/dashboard/dist/assets/useNatsEvents-DeGKHFTX.js.map +0 -1
- package/dashboard/dist/assets/useYamlActivityEvents-B5dHec6Y.js.map +0 -1
- package/dashboard/dist/assets/vendor-icons-DCLlGYO9.js.map +0 -1
- package/dashboard/dist/assets/yaml-workflows-CaLPMQha.js +0 -2
- package/dashboard/dist/assets/yaml-workflows-CaLPMQha.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/lib/db/README.md +0 -8
- /package/{lib → build/lib}/db/schemas/002_seed.sql +0 -0
- /package/{lib → build/lib}/db/schemas/003_workflow_discovery.sql +0 -0
- /package/{lib → build/lib}/db/schemas/004_query_router.sql +0 -0
- /package/{lib → build/lib}/db/schemas/005_triage_router.sql +0 -0
- /package/{lib → build/lib}/db/schemas/006_oauth.sql +0 -0
- /package/{lib → build/lib}/db/schemas/007_security.sql +0 -0
- /package/{lib → build/lib}/db/schemas/008_bot_accounts.sql +0 -0
- /package/{lib → build/lib}/db/schemas/009_audit_trail.sql +0 -0
- /package/{lib → build/lib}/db/schemas/010_credential_providers.sql +0 -0
- /package/{lib → build/lib}/db/schemas/012_drop_modality.sql +0 -0
- /package/{lib → build/lib}/db/schemas/013_execute_as.sql +0 -0
- /package/{lib → build/lib}/db/schemas/014_ephemeral_credentials.sql +0 -0
- /package/{lib → build/lib}/db/schemas/015_knowledge.sql +0 -0
package/build/lib/db/migrate.js
CHANGED
|
@@ -38,12 +38,9 @@ const fs = __importStar(require("fs"));
|
|
|
38
38
|
const path = __importStar(require("path"));
|
|
39
39
|
const index_1 = require("./index");
|
|
40
40
|
const logger_1 = require("../logger");
|
|
41
|
-
//
|
|
42
|
-
// In
|
|
43
|
-
const
|
|
44
|
-
const SCHEMAS_DIR = fs.existsSync(devPath)
|
|
45
|
-
? devPath
|
|
46
|
-
: path.join(__dirname, '..', '..', '..', 'services', 'db', 'schemas');
|
|
41
|
+
// Both dev (lib/db/) and build (build/lib/db/) have schemas/ as a sibling.
|
|
42
|
+
// In dev it exists naturally; in build it's copied by the build script.
|
|
43
|
+
const SCHEMAS_DIR = path.join(__dirname, 'schemas');
|
|
47
44
|
async function migrate() {
|
|
48
45
|
const pool = (0, index_1.getPool)();
|
|
49
46
|
// ensure migration tracking table
|
|
@@ -258,6 +258,9 @@ CREATE TABLE IF NOT EXISTS lt_yaml_workflows (
|
|
|
258
258
|
tags TEXT[] NOT NULL DEFAULT '{}',
|
|
259
259
|
input_field_meta JSONB NOT NULL DEFAULT '[]'::JSONB,
|
|
260
260
|
metadata JSONB,
|
|
261
|
+
cron_schedule TEXT,
|
|
262
|
+
cron_envelope JSONB,
|
|
263
|
+
execute_as TEXT,
|
|
261
264
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
262
265
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
263
266
|
);
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
-- Workflow sets: groups of related workflows produced by plan mode.
|
|
2
|
+
|
|
3
|
+
CREATE TABLE IF NOT EXISTS lt_workflow_sets (
|
|
4
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
5
|
+
name TEXT UNIQUE NOT NULL,
|
|
6
|
+
description TEXT,
|
|
7
|
+
specification TEXT NOT NULL,
|
|
8
|
+
plan JSONB NOT NULL DEFAULT '[]'::JSONB,
|
|
9
|
+
namespaces TEXT[] NOT NULL DEFAULT '{}',
|
|
10
|
+
status TEXT NOT NULL DEFAULT 'planning'
|
|
11
|
+
CHECK (status IN ('planning','planned','building','deploying','completed','failed')),
|
|
12
|
+
source_workflow_id TEXT,
|
|
13
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
14
|
+
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
15
|
+
);
|
|
16
|
+
|
|
17
|
+
CREATE OR REPLACE TRIGGER trg_lt_workflow_sets_updated_at
|
|
18
|
+
BEFORE UPDATE ON lt_workflow_sets
|
|
19
|
+
FOR EACH ROW EXECUTE FUNCTION lt_set_updated_at();
|
|
20
|
+
|
|
21
|
+
-- Extend lt_yaml_workflows with set membership columns
|
|
22
|
+
ALTER TABLE lt_yaml_workflows ADD COLUMN IF NOT EXISTS set_id UUID
|
|
23
|
+
REFERENCES lt_workflow_sets(id) ON DELETE SET NULL;
|
|
24
|
+
ALTER TABLE lt_yaml_workflows ADD COLUMN IF NOT EXISTS set_role TEXT
|
|
25
|
+
CHECK (set_role IN ('leaf', 'composition', 'router'));
|
|
26
|
+
ALTER TABLE lt_yaml_workflows ADD COLUMN IF NOT EXISTS set_build_order INTEGER;
|
|
27
|
+
|
|
28
|
+
CREATE INDEX IF NOT EXISTS idx_lt_yaml_workflows_set_id
|
|
29
|
+
ON lt_yaml_workflows (set_id) WHERE set_id IS NOT NULL;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
-- Enforce unique graph_topic per app_id for non-archived workflows.
|
|
2
|
+
-- Two active/deployed/draft workflows in the same namespace must not
|
|
3
|
+
-- share a subscribes topic — deploying them would cause routing collisions.
|
|
4
|
+
|
|
5
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_lt_yaml_workflows_app_topic_unique
|
|
6
|
+
ON lt_yaml_workflows (app_id, graph_topic)
|
|
7
|
+
WHERE status != 'archived';
|
|
@@ -10,6 +10,12 @@ VALUES
|
|
|
10
10
|
'{}'),
|
|
11
11
|
('mcpTriage', 'long-tail-system', 'engineer', false,
|
|
12
12
|
'Dynamic MCP triage — LLM agentic loop for escalation remediation',
|
|
13
|
+
'{}'),
|
|
14
|
+
('mcpWorkflowBuilder', 'long-tail-system', 'engineer', false,
|
|
15
|
+
'Direct pipeline builder — LLM constructs DAG from tool schemas',
|
|
16
|
+
'{}'),
|
|
17
|
+
('mcpWorkflowPlanner', 'long-tail-system', 'engineer', false,
|
|
18
|
+
'Plan mode — decomposes specifications into multi-workflow sets',
|
|
13
19
|
'{}')
|
|
14
20
|
ON CONFLICT (workflow_type) DO NOTHING;
|
|
15
21
|
|
|
@@ -21,3 +27,11 @@ ON CONFLICT (workflow_type, role) DO NOTHING;
|
|
|
21
27
|
INSERT INTO lt_config_roles (workflow_type, role)
|
|
22
28
|
SELECT 'mcpTriage', unnest(ARRAY['reviewer', 'engineer', 'admin'])
|
|
23
29
|
ON CONFLICT (workflow_type, role) DO NOTHING;
|
|
30
|
+
|
|
31
|
+
INSERT INTO lt_config_roles (workflow_type, role)
|
|
32
|
+
SELECT 'mcpWorkflowBuilder', unnest(ARRAY['reviewer', 'engineer', 'admin'])
|
|
33
|
+
ON CONFLICT (workflow_type, role) DO NOTHING;
|
|
34
|
+
|
|
35
|
+
INSERT INTO lt_config_roles (workflow_type, role)
|
|
36
|
+
SELECT 'mcpWorkflowPlanner', unnest(ARRAY['reviewer', 'engineer', 'admin'])
|
|
37
|
+
ON CONFLICT (workflow_type, role) DO NOTHING;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
-- Allow 'streamable-http' as a transport type for MCP servers
|
|
2
|
+
ALTER TABLE lt_mcp_servers
|
|
3
|
+
DROP CONSTRAINT IF EXISTS lt_mcp_servers_transport_type_check;
|
|
4
|
+
|
|
5
|
+
ALTER TABLE lt_mcp_servers
|
|
6
|
+
ADD CONSTRAINT lt_mcp_servers_transport_type_check
|
|
7
|
+
CHECK (transport_type IN ('stdio', 'sse', 'streamable-http'));
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { LTEvent, LTEventAdapter, LTEventType } from '../../types';
|
|
2
|
+
type EventCallback = (event: LTEvent) => void;
|
|
3
|
+
/**
|
|
4
|
+
* In-process event adapter that delivers events via registered callbacks.
|
|
5
|
+
*
|
|
6
|
+
* Plugs into the existing `eventRegistry` alongside Socket.IO / NATS.
|
|
7
|
+
* SDK callers subscribe with `.on()` and receive events as direct
|
|
8
|
+
* function calls — no network transport, no serialization overhead.
|
|
9
|
+
*
|
|
10
|
+
* Supports:
|
|
11
|
+
* - Exact type matching: `on('task.created', cb)`
|
|
12
|
+
* - Category wildcards: `on('task.*', cb)` — matches all task.* events
|
|
13
|
+
* - Global wildcard: `on('*', cb)` — matches every event
|
|
14
|
+
*
|
|
15
|
+
* Usage:
|
|
16
|
+
* ```typescript
|
|
17
|
+
* import { CallbackEventAdapter } from '@hotmeshio/long-tail';
|
|
18
|
+
* import { eventRegistry } from '@hotmeshio/long-tail';
|
|
19
|
+
*
|
|
20
|
+
* const adapter = new CallbackEventAdapter();
|
|
21
|
+
* eventRegistry.register(adapter);
|
|
22
|
+
*
|
|
23
|
+
* const unsub = adapter.on('escalation.claimed', (event) => {
|
|
24
|
+
* console.log('claimed:', event.escalationId);
|
|
25
|
+
* });
|
|
26
|
+
*
|
|
27
|
+
* // Later: unsub() to remove the listener
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export declare class CallbackEventAdapter implements LTEventAdapter {
|
|
31
|
+
private listeners;
|
|
32
|
+
/**
|
|
33
|
+
* Subscribe to events by type, pattern, or wildcard.
|
|
34
|
+
* Returns an unsubscribe function.
|
|
35
|
+
*/
|
|
36
|
+
on(pattern: LTEventType | '*' | (string & {}), callback: EventCallback): () => void;
|
|
37
|
+
connect(): Promise<void>;
|
|
38
|
+
publish(event: LTEvent): Promise<void>;
|
|
39
|
+
disconnect(): Promise<void>;
|
|
40
|
+
}
|
|
41
|
+
export {};
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CallbackEventAdapter = void 0;
|
|
4
|
+
const logger_1 = require("../logger");
|
|
5
|
+
/**
|
|
6
|
+
* In-process event adapter that delivers events via registered callbacks.
|
|
7
|
+
*
|
|
8
|
+
* Plugs into the existing `eventRegistry` alongside Socket.IO / NATS.
|
|
9
|
+
* SDK callers subscribe with `.on()` and receive events as direct
|
|
10
|
+
* function calls — no network transport, no serialization overhead.
|
|
11
|
+
*
|
|
12
|
+
* Supports:
|
|
13
|
+
* - Exact type matching: `on('task.created', cb)`
|
|
14
|
+
* - Category wildcards: `on('task.*', cb)` — matches all task.* events
|
|
15
|
+
* - Global wildcard: `on('*', cb)` — matches every event
|
|
16
|
+
*
|
|
17
|
+
* Usage:
|
|
18
|
+
* ```typescript
|
|
19
|
+
* import { CallbackEventAdapter } from '@hotmeshio/long-tail';
|
|
20
|
+
* import { eventRegistry } from '@hotmeshio/long-tail';
|
|
21
|
+
*
|
|
22
|
+
* const adapter = new CallbackEventAdapter();
|
|
23
|
+
* eventRegistry.register(adapter);
|
|
24
|
+
*
|
|
25
|
+
* const unsub = adapter.on('escalation.claimed', (event) => {
|
|
26
|
+
* console.log('claimed:', event.escalationId);
|
|
27
|
+
* });
|
|
28
|
+
*
|
|
29
|
+
* // Later: unsub() to remove the listener
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
class CallbackEventAdapter {
|
|
33
|
+
constructor() {
|
|
34
|
+
this.listeners = new Map();
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Subscribe to events by type, pattern, or wildcard.
|
|
38
|
+
* Returns an unsubscribe function.
|
|
39
|
+
*/
|
|
40
|
+
on(pattern, callback) {
|
|
41
|
+
let set = this.listeners.get(pattern);
|
|
42
|
+
if (!set) {
|
|
43
|
+
set = new Set();
|
|
44
|
+
this.listeners.set(pattern, set);
|
|
45
|
+
}
|
|
46
|
+
set.add(callback);
|
|
47
|
+
return () => {
|
|
48
|
+
set.delete(callback);
|
|
49
|
+
if (set.size === 0) {
|
|
50
|
+
this.listeners.delete(pattern);
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
async connect() {
|
|
55
|
+
logger_1.loggerRegistry.info('[lt-events:callback] adapter connected');
|
|
56
|
+
}
|
|
57
|
+
async publish(event) {
|
|
58
|
+
// Exact match listeners
|
|
59
|
+
const exact = this.listeners.get(event.type);
|
|
60
|
+
if (exact) {
|
|
61
|
+
for (const cb of exact) {
|
|
62
|
+
try {
|
|
63
|
+
cb(event);
|
|
64
|
+
}
|
|
65
|
+
catch { /* fire-and-forget */ }
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// Category wildcard listeners (e.g. 'task.*' matches 'task.created')
|
|
69
|
+
const dotIdx = event.type.indexOf('.');
|
|
70
|
+
if (dotIdx > 0) {
|
|
71
|
+
const category = event.type.slice(0, dotIdx) + '.*';
|
|
72
|
+
const catListeners = this.listeners.get(category);
|
|
73
|
+
if (catListeners) {
|
|
74
|
+
for (const cb of catListeners) {
|
|
75
|
+
try {
|
|
76
|
+
cb(event);
|
|
77
|
+
}
|
|
78
|
+
catch { /* fire-and-forget */ }
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// Global wildcard listeners
|
|
83
|
+
const global = this.listeners.get('*');
|
|
84
|
+
if (global) {
|
|
85
|
+
for (const cb of global) {
|
|
86
|
+
try {
|
|
87
|
+
cb(event);
|
|
88
|
+
}
|
|
89
|
+
catch { /* fire-and-forget */ }
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
async disconnect() {
|
|
94
|
+
this.listeners.clear();
|
|
95
|
+
logger_1.loggerRegistry.info('[lt-events:callback] adapter disconnected');
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
exports.CallbackEventAdapter = CallbackEventAdapter;
|
package/build/modules/config.js
CHANGED
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.postgres_options = exports.config = void 0;
|
|
4
4
|
exports.config = {
|
|
5
5
|
POSTGRES_HOST: process.env.POSTGRES_HOST || 'localhost',
|
|
6
|
-
POSTGRES_PORT: parseInt(process.env.POSTGRES_PORT || '
|
|
6
|
+
POSTGRES_PORT: parseInt(process.env.POSTGRES_PORT || '5415', 10),
|
|
7
7
|
POSTGRES_USER: process.env.POSTGRES_USER || 'postgres',
|
|
8
8
|
POSTGRES_PASSWORD: process.env.POSTGRES_PASSWORD || 'password',
|
|
9
9
|
// In test environments, always use the test database to prevent accidental
|
package/build/routes/auth.js
CHANGED
|
@@ -1,8 +1,40 @@
|
|
|
1
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
|
+
})();
|
|
2
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
36
|
const express_1 = require("express");
|
|
4
|
-
const
|
|
5
|
-
const auth_1 = require("../modules/auth");
|
|
37
|
+
const api = __importStar(require("../api/auth"));
|
|
6
38
|
const router = (0, express_1.Router)();
|
|
7
39
|
/**
|
|
8
40
|
* POST /api/auth/login
|
|
@@ -10,39 +42,8 @@ const router = (0, express_1.Router)();
|
|
|
10
42
|
* Returns a JWT token on success.
|
|
11
43
|
*/
|
|
12
44
|
router.post('/login', async (req, res) => {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
res.status(400).json({ error: 'username and password are required' });
|
|
17
|
-
return;
|
|
18
|
-
}
|
|
19
|
-
const user = await (0, user_1.verifyPassword)(username, password);
|
|
20
|
-
if (!user) {
|
|
21
|
-
res.status(401).json({ error: 'Invalid credentials' });
|
|
22
|
-
return;
|
|
23
|
-
}
|
|
24
|
-
const highestType = user.roles.some((r) => r.type === 'superadmin')
|
|
25
|
-
? 'superadmin'
|
|
26
|
-
: user.roles.some((r) => r.type === 'admin')
|
|
27
|
-
? 'admin'
|
|
28
|
-
: 'member';
|
|
29
|
-
const token = (0, auth_1.signToken)({
|
|
30
|
-
userId: user.id,
|
|
31
|
-
role: highestType,
|
|
32
|
-
roles: user.roles.map((r) => ({ role: r.role, type: r.type })),
|
|
33
|
-
}, '24h');
|
|
34
|
-
res.json({
|
|
35
|
-
token,
|
|
36
|
-
user: {
|
|
37
|
-
id: user.id,
|
|
38
|
-
external_id: user.external_id,
|
|
39
|
-
display_name: user.display_name,
|
|
40
|
-
roles: user.roles,
|
|
41
|
-
},
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
catch (err) {
|
|
45
|
-
res.status(500).json({ error: err.message });
|
|
46
|
-
}
|
|
45
|
+
const { username, password } = req.body || {};
|
|
46
|
+
const result = await api.login({ username, password });
|
|
47
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
47
48
|
});
|
|
48
49
|
exports.default = router;
|
|
@@ -35,8 +35,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
const express_1 = require("express");
|
|
37
37
|
const auth_1 = require("../modules/auth");
|
|
38
|
-
const
|
|
39
|
-
const user_1 = require("../services/user");
|
|
38
|
+
const api = __importStar(require("../api/bot-accounts"));
|
|
40
39
|
const router = (0, express_1.Router)();
|
|
41
40
|
// All bot account routes require admin access
|
|
42
41
|
router.use(auth_1.requireAdmin);
|
|
@@ -47,32 +46,19 @@ router.use(auth_1.requireAdmin);
|
|
|
47
46
|
* Query: ?limit=50&offset=0
|
|
48
47
|
*/
|
|
49
48
|
router.get('/', async (req, res) => {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
}
|
|
56
|
-
catch (err) {
|
|
57
|
-
res.status(500).json({ error: err.message });
|
|
58
|
-
}
|
|
49
|
+
const result = await api.listBots({
|
|
50
|
+
limit: req.query.limit ? parseInt(req.query.limit, 10) : undefined,
|
|
51
|
+
offset: req.query.offset ? parseInt(req.query.offset, 10) : undefined,
|
|
52
|
+
});
|
|
53
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
59
54
|
});
|
|
60
55
|
/**
|
|
61
56
|
* GET /api/bot-accounts/:id
|
|
62
57
|
* Get a single bot account.
|
|
63
58
|
*/
|
|
64
59
|
router.get('/:id', async (req, res) => {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
if (!bot) {
|
|
68
|
-
res.status(404).json({ error: 'Bot not found' });
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
res.json(bot);
|
|
72
|
-
}
|
|
73
|
-
catch (err) {
|
|
74
|
-
res.status(500).json({ error: err.message });
|
|
75
|
-
}
|
|
60
|
+
const result = await api.getBot({ id: req.params.id });
|
|
61
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
76
62
|
});
|
|
77
63
|
/**
|
|
78
64
|
* POST /api/bot-accounts
|
|
@@ -80,38 +66,9 @@ router.get('/:id', async (req, res) => {
|
|
|
80
66
|
* Body: { name, description?, display_name?, roles?: [{ role, type }] }
|
|
81
67
|
*/
|
|
82
68
|
router.post('/', async (req, res) => {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
res.status(400).json({ error: 'name is required' });
|
|
87
|
-
return;
|
|
88
|
-
}
|
|
89
|
-
if (roles) {
|
|
90
|
-
for (const r of roles) {
|
|
91
|
-
if (!r.role || !r.type || !(0, user_1.isValidRoleType)(r.type)) {
|
|
92
|
-
res.status(400).json({
|
|
93
|
-
error: 'Each role must have a role name and type (superadmin, admin, member)',
|
|
94
|
-
});
|
|
95
|
-
return;
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
const bot = await iam.createBot({
|
|
100
|
-
name,
|
|
101
|
-
description,
|
|
102
|
-
display_name,
|
|
103
|
-
roles,
|
|
104
|
-
created_by: req.auth?.userId,
|
|
105
|
-
});
|
|
106
|
-
res.status(201).json(bot);
|
|
107
|
-
}
|
|
108
|
-
catch (err) {
|
|
109
|
-
if (err.code === '23505') {
|
|
110
|
-
res.status(409).json({ error: 'Bot with this name already exists' });
|
|
111
|
-
return;
|
|
112
|
-
}
|
|
113
|
-
res.status(500).json({ error: err.message });
|
|
114
|
-
}
|
|
69
|
+
const { name, description, display_name, roles } = req.body || {};
|
|
70
|
+
const result = await api.createBot({ name, description, display_name, roles }, req.auth ? { userId: req.auth.userId } : undefined);
|
|
71
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
115
72
|
});
|
|
116
73
|
/**
|
|
117
74
|
* PUT /api/bot-accounts/:id
|
|
@@ -119,34 +76,16 @@ router.post('/', async (req, res) => {
|
|
|
119
76
|
* Body: { display_name?, description?, status? }
|
|
120
77
|
*/
|
|
121
78
|
router.put('/:id', async (req, res) => {
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
if (!bot) {
|
|
125
|
-
res.status(404).json({ error: 'Bot not found' });
|
|
126
|
-
return;
|
|
127
|
-
}
|
|
128
|
-
res.json(bot);
|
|
129
|
-
}
|
|
130
|
-
catch (err) {
|
|
131
|
-
res.status(500).json({ error: err.message });
|
|
132
|
-
}
|
|
79
|
+
const result = await api.updateBot({ id: req.params.id, ...(req.body || {}) });
|
|
80
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
133
81
|
});
|
|
134
82
|
/**
|
|
135
83
|
* DELETE /api/bot-accounts/:id
|
|
136
84
|
* Delete a bot account.
|
|
137
85
|
*/
|
|
138
86
|
router.delete('/:id', async (req, res) => {
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
if (!deleted) {
|
|
142
|
-
res.status(404).json({ error: 'Bot not found' });
|
|
143
|
-
return;
|
|
144
|
-
}
|
|
145
|
-
res.json({ deleted: true });
|
|
146
|
-
}
|
|
147
|
-
catch (err) {
|
|
148
|
-
res.status(500).json({ error: err.message });
|
|
149
|
-
}
|
|
87
|
+
const result = await api.deleteBot({ id: req.params.id });
|
|
88
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
150
89
|
});
|
|
151
90
|
// ── Bot roles ────────────────────────────────────────────────────────────────
|
|
152
91
|
/**
|
|
@@ -154,18 +93,8 @@ router.delete('/:id', async (req, res) => {
|
|
|
154
93
|
* List roles for a bot.
|
|
155
94
|
*/
|
|
156
95
|
router.get('/:id/roles', async (req, res) => {
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
if (!bot) {
|
|
160
|
-
res.status(404).json({ error: 'Bot not found' });
|
|
161
|
-
return;
|
|
162
|
-
}
|
|
163
|
-
const roles = await iam.getBotRoles(req.params.id);
|
|
164
|
-
res.json({ roles });
|
|
165
|
-
}
|
|
166
|
-
catch (err) {
|
|
167
|
-
res.status(500).json({ error: err.message });
|
|
168
|
-
}
|
|
96
|
+
const result = await api.getBotRoles({ id: req.params.id });
|
|
97
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
169
98
|
});
|
|
170
99
|
/**
|
|
171
100
|
* POST /api/bot-accounts/:id/roles
|
|
@@ -173,44 +102,17 @@ router.get('/:id/roles', async (req, res) => {
|
|
|
173
102
|
* Body: { role, type }
|
|
174
103
|
*/
|
|
175
104
|
router.post('/:id/roles', async (req, res) => {
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
res.status(400).json({ error: 'role and type are required' });
|
|
180
|
-
return;
|
|
181
|
-
}
|
|
182
|
-
if (!(0, user_1.isValidRoleType)(type)) {
|
|
183
|
-
res.status(400).json({ error: 'type must be superadmin, admin, or member' });
|
|
184
|
-
return;
|
|
185
|
-
}
|
|
186
|
-
const bot = await iam.getBot(req.params.id);
|
|
187
|
-
if (!bot) {
|
|
188
|
-
res.status(404).json({ error: 'Bot not found' });
|
|
189
|
-
return;
|
|
190
|
-
}
|
|
191
|
-
const result = await iam.addBotRole(req.params.id, role, type);
|
|
192
|
-
res.status(201).json(result);
|
|
193
|
-
}
|
|
194
|
-
catch (err) {
|
|
195
|
-
res.status(500).json({ error: err.message });
|
|
196
|
-
}
|
|
105
|
+
const { role, type } = req.body || {};
|
|
106
|
+
const result = await api.addBotRole({ id: req.params.id, role, type });
|
|
107
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
197
108
|
});
|
|
198
109
|
/**
|
|
199
110
|
* DELETE /api/bot-accounts/:id/roles/:role
|
|
200
111
|
* Remove a role from a bot.
|
|
201
112
|
*/
|
|
202
113
|
router.delete('/:id/roles/:role', async (req, res) => {
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
if (!removed) {
|
|
206
|
-
res.status(404).json({ error: 'Role not found' });
|
|
207
|
-
return;
|
|
208
|
-
}
|
|
209
|
-
res.json({ removed: true });
|
|
210
|
-
}
|
|
211
|
-
catch (err) {
|
|
212
|
-
res.status(500).json({ error: err.message });
|
|
213
|
-
}
|
|
114
|
+
const result = await api.removeBotRole({ id: req.params.id, role: req.params.role });
|
|
115
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
214
116
|
});
|
|
215
117
|
// ── API keys ─────────────────────────────────────────────────────────────────
|
|
216
118
|
/**
|
|
@@ -218,18 +120,8 @@ router.delete('/:id/roles/:role', async (req, res) => {
|
|
|
218
120
|
* List API keys for a bot (without secret values).
|
|
219
121
|
*/
|
|
220
122
|
router.get('/:id/api-keys', async (req, res) => {
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
if (!bot) {
|
|
224
|
-
res.status(404).json({ error: 'Bot not found' });
|
|
225
|
-
return;
|
|
226
|
-
}
|
|
227
|
-
const keys = await iam.listBotKeys(req.params.id);
|
|
228
|
-
res.json({ keys });
|
|
229
|
-
}
|
|
230
|
-
catch (err) {
|
|
231
|
-
res.status(500).json({ error: err.message });
|
|
232
|
-
}
|
|
123
|
+
const result = await api.listBotKeys({ id: req.params.id });
|
|
124
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
233
125
|
});
|
|
234
126
|
/**
|
|
235
127
|
* POST /api/bot-accounts/:id/api-keys
|
|
@@ -238,43 +130,21 @@ router.get('/:id/api-keys', async (req, res) => {
|
|
|
238
130
|
* Returns the raw key ONCE — it cannot be retrieved again.
|
|
239
131
|
*/
|
|
240
132
|
router.post('/:id/api-keys', async (req, res) => {
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
res.status(201).json(result);
|
|
250
|
-
}
|
|
251
|
-
catch (err) {
|
|
252
|
-
if (err.message === 'Bot not found') {
|
|
253
|
-
res.status(404).json({ error: err.message });
|
|
254
|
-
return;
|
|
255
|
-
}
|
|
256
|
-
if (err.code === '23505') {
|
|
257
|
-
res.status(409).json({ error: 'API key with this name already exists for this bot' });
|
|
258
|
-
return;
|
|
259
|
-
}
|
|
260
|
-
res.status(500).json({ error: err.message });
|
|
261
|
-
}
|
|
133
|
+
const { name, scopes, expires_at } = req.body || {};
|
|
134
|
+
const result = await api.createBotKey({
|
|
135
|
+
id: req.params.id,
|
|
136
|
+
name,
|
|
137
|
+
scopes,
|
|
138
|
+
expires_at,
|
|
139
|
+
});
|
|
140
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
262
141
|
});
|
|
263
142
|
/**
|
|
264
143
|
* DELETE /api/bot-accounts/:id/api-keys/:keyId
|
|
265
144
|
* Revoke (delete) a bot API key.
|
|
266
145
|
*/
|
|
267
146
|
router.delete('/:id/api-keys/:keyId', async (req, res) => {
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
if (!revoked) {
|
|
271
|
-
res.status(404).json({ error: 'API key not found' });
|
|
272
|
-
return;
|
|
273
|
-
}
|
|
274
|
-
res.json({ revoked: true });
|
|
275
|
-
}
|
|
276
|
-
catch (err) {
|
|
277
|
-
res.status(500).json({ error: err.message });
|
|
278
|
-
}
|
|
147
|
+
const result = await api.revokeBotKey({ keyId: req.params.keyId });
|
|
148
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
279
149
|
});
|
|
280
150
|
exports.default = router;
|