@hotmeshio/long-tail 0.1.13 → 0.1.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -0
- package/build/api/escalations/bulk.d.ts +78 -0
- package/build/api/escalations/bulk.js +279 -0
- package/build/api/escalations/claim.d.ts +30 -0
- package/build/api/escalations/claim.js +121 -0
- package/build/api/escalations/create.d.ts +29 -0
- package/build/api/escalations/create.js +101 -0
- package/build/api/escalations/helpers.d.ts +10 -0
- package/build/api/escalations/helpers.js +80 -0
- package/build/api/escalations/index.d.ts +6 -0
- package/build/api/escalations/index.js +26 -0
- package/build/api/escalations/list.d.ts +75 -0
- package/build/api/escalations/list.js +170 -0
- package/build/api/escalations/resolve.d.ts +18 -0
- package/build/api/escalations/resolve.js +243 -0
- package/build/api/escalations/single.d.ts +37 -0
- package/build/api/escalations/single.js +123 -0
- package/build/api/files.d.ts +16 -0
- package/build/api/files.js +61 -0
- package/build/api/knowledge.d.ts +36 -0
- package/build/api/knowledge.js +112 -0
- package/build/api/mcp/index.d.ts +2 -0
- package/build/api/mcp/index.js +16 -0
- package/build/api/{mcp.d.ts → mcp/servers.d.ts} +1 -33
- package/build/api/{mcp.js → mcp/servers.js} +4 -65
- package/build/api/mcp/tools.d.ts +33 -0
- package/build/api/mcp/tools.js +64 -0
- package/build/api/mcp-runs.d.ts +2 -0
- package/build/api/mcp-runs.js +2 -0
- package/build/api/settings.js +9 -1
- package/build/api/workflow-sets.d.ts +11 -0
- package/build/api/workflow-sets.js +62 -0
- package/build/api/workflows/config.d.ts +64 -0
- package/build/api/workflows/config.js +142 -0
- package/build/api/workflows/discovery.d.ts +29 -0
- package/build/api/workflows/discovery.js +153 -0
- package/build/api/workflows/index.d.ts +3 -0
- package/build/api/workflows/index.js +18 -0
- package/build/api/workflows/invocation.d.ts +67 -0
- package/build/api/workflows/invocation.js +188 -0
- package/build/api/yaml-workflows/cron.d.ts +39 -0
- package/build/api/yaml-workflows/cron.js +127 -0
- package/build/api/{yaml-workflows.d.ts → yaml-workflows/crud.d.ts} +22 -137
- package/build/api/{yaml-workflows.js → yaml-workflows/crud.js} +86 -358
- package/build/api/yaml-workflows/deploy.d.ts +71 -0
- package/build/api/yaml-workflows/deploy.js +223 -0
- package/build/api/yaml-workflows/helpers.d.ts +2 -0
- package/build/api/yaml-workflows/helpers.js +8 -0
- package/build/api/yaml-workflows/index.d.ts +4 -0
- package/build/api/yaml-workflows/index.js +27 -0
- package/build/api/yaml-workflows/versions.d.ts +43 -0
- package/build/api/yaml-workflows/versions.js +124 -0
- package/build/bin/ltc.d.ts +2 -0
- package/build/bin/ltc.js +220 -0
- package/build/examples/seed-data.d.ts +55 -0
- package/build/examples/seed-data.js +161 -0
- package/build/examples/seed.js +7 -164
- package/build/lib/cli/auth.d.ts +23 -0
- package/build/lib/cli/auth.js +167 -0
- package/build/lib/cli/client.d.ts +6 -0
- package/build/lib/cli/client.js +31 -0
- package/build/lib/cli/commands/escalations.d.ts +19 -0
- package/build/lib/cli/commands/escalations.js +69 -0
- package/build/lib/cli/commands/knowledge.d.ts +18 -0
- package/build/lib/cli/commands/knowledge.js +87 -0
- package/build/lib/cli/commands/mcp.d.ts +8 -0
- package/build/lib/cli/commands/mcp.js +33 -0
- package/build/lib/cli/commands/pipelines.d.ts +16 -0
- package/build/lib/cli/commands/pipelines.js +67 -0
- package/build/lib/cli/commands/status.d.ts +1 -0
- package/build/lib/cli/commands/status.js +28 -0
- package/build/lib/cli/commands/users.d.ts +7 -0
- package/build/lib/cli/commands/users.js +25 -0
- package/build/lib/cli/commands/workflows.d.ts +16 -0
- package/build/lib/cli/commands/workflows.js +104 -0
- package/build/lib/cli/compile.d.ts +2 -0
- package/build/lib/cli/compile.js +165 -0
- package/build/lib/cli/format.d.ts +23 -0
- package/build/lib/cli/format.js +94 -0
- package/build/lib/cli/init.d.ts +1 -0
- package/build/lib/cli/init.js +61 -0
- package/build/lib/cli/output.d.ts +27 -0
- package/build/lib/cli/output.js +126 -0
- package/build/lib/cli/scanner.d.ts +10 -0
- package/build/lib/cli/scanner.js +164 -0
- package/build/lib/cli/types.d.ts +16 -0
- package/build/lib/cli/types.js +2 -0
- package/build/lib/logger/index.d.ts +0 -9
- package/build/lib/logger/index.js +9 -4
- package/build/lib/storage/index.js +2 -2
- package/build/lib/storage/local.d.ts +15 -0
- package/build/lib/storage/local.js +63 -0
- package/build/lib/storage/mime.d.ts +4 -0
- package/build/lib/storage/mime.js +31 -0
- package/build/lib/storage/s3.d.ts +16 -0
- package/build/lib/storage/s3.js +70 -0
- package/build/lib/storage/types.d.ts +18 -0
- package/build/modules/utils.d.ts +73 -0
- package/build/modules/utils.js +84 -0
- package/build/routes/file-browser.d.ts +2 -0
- package/build/routes/file-browser.js +126 -0
- package/build/routes/files.js +25 -17
- package/build/routes/index.js +4 -0
- package/build/routes/knowledge.d.ts +2 -0
- package/build/routes/knowledge.js +141 -0
- package/build/routes/mcp-runs.js +2 -0
- package/build/routes/workflow-sets.js +9 -0
- package/build/routes/yaml-workflows/crud.js +9 -0
- package/build/routes/yaml-workflows/deployment.js +8 -0
- package/build/sdk/index.d.ts +17 -0
- package/build/sdk/index.js +19 -0
- package/build/services/insight/index.d.ts +13 -0
- package/build/services/insight/index.js +4 -7
- package/build/services/insight/prompts.d.ts +1 -1
- package/build/services/insight/prompts.js +1 -1
- package/build/services/mcp/client/connection-dispatch.d.ts +18 -0
- package/build/services/mcp/client/connection-dispatch.js +78 -0
- package/build/services/mcp/client/connection-lifecycle.d.ts +48 -0
- package/build/services/mcp/client/connection-lifecycle.js +296 -0
- package/build/services/mcp/client/connection-test.d.ts +10 -0
- package/build/services/mcp/client/connection-test.js +49 -0
- package/build/services/mcp/client/connection.d.ts +3 -68
- package/build/services/mcp/client/connection.js +15 -393
- package/build/services/mcp/server-lifecycle.d.ts +27 -0
- package/build/services/mcp/server-lifecycle.js +49 -0
- package/build/services/mcp/server-tools.d.ts +13 -0
- package/build/services/mcp/server-tools.js +287 -0
- package/build/services/mcp/server.d.ts +2 -26
- package/build/services/mcp/server.js +7 -315
- package/build/services/mcp-runs/queries.d.ts +2 -0
- package/build/services/mcp-runs/queries.js +11 -1
- package/build/services/mcp-runs/sql.d.ts +1 -1
- package/build/services/mcp-runs/sql.js +2 -2
- package/build/services/workflow-sets/db.d.ts +1 -0
- package/build/services/workflow-sets/db.js +6 -0
- package/build/services/workflow-sets/index.d.ts +1 -1
- package/build/services/workflow-sets/index.js +2 -1
- package/build/services/workflow-sets/sql.d.ts +1 -0
- package/build/services/workflow-sets/sql.js +6 -1
- package/build/services/yaml-workflow/builder-regenerate.d.ts +25 -0
- package/build/services/yaml-workflow/builder-regenerate.js +111 -0
- package/build/services/yaml-workflow/db-versions.d.ts +17 -0
- package/build/services/yaml-workflow/db-versions.js +76 -0
- package/build/services/yaml-workflow/db.d.ts +14 -12
- package/build/services/yaml-workflow/db.js +32 -70
- package/build/services/yaml-workflow/deployer-helpers.js +48 -17
- package/build/services/yaml-workflow/durable-compiler/index.d.ts +22 -0
- package/build/services/yaml-workflow/durable-compiler/index.js +168 -0
- package/build/services/yaml-workflow/durable-compiler/parser.d.ts +12 -0
- package/build/services/yaml-workflow/durable-compiler/parser.js +110 -0
- package/build/services/yaml-workflow/durable-compiler/prompts.d.ts +18 -0
- package/build/services/yaml-workflow/durable-compiler/prompts.js +570 -0
- package/build/services/yaml-workflow/durable-compiler/types.d.ts +51 -0
- package/build/services/yaml-workflow/durable-compiler/types.js +5 -0
- package/build/services/yaml-workflow/generator.js +4 -4
- package/build/services/yaml-workflow/pipeline/build/dag-assembly.d.ts +17 -0
- package/build/services/yaml-workflow/pipeline/build/dag-assembly.js +192 -0
- package/build/services/yaml-workflow/pipeline/build/dag.d.ts +4 -13
- package/build/services/yaml-workflow/pipeline/build/dag.js +9 -185
- package/build/services/yaml-workflow/pipeline/build/index.d.ts +2 -1
- package/build/services/yaml-workflow/pipeline/build/index.js +3 -2
- package/build/services/yaml-workflow/pipeline/build/utils.d.ts +0 -2
- package/build/services/yaml-workflow/pipeline/build/utils.js +0 -8
- package/build/services/yaml-workflow/pipeline/prompt-templates.d.ts +10 -0
- package/build/services/yaml-workflow/pipeline/prompt-templates.js +270 -0
- package/build/services/yaml-workflow/pipeline/prompts.d.ts +3 -6
- package/build/services/yaml-workflow/pipeline/prompts.js +8 -263
- package/build/services/yaml-workflow/sql.d.ts +2 -1
- package/build/services/yaml-workflow/sql.js +10 -3
- package/build/start/workers.js +6 -5
- package/build/system/activities/file-storage.d.ts +4 -0
- package/build/system/activities/file-storage.js +7 -1
- package/build/system/activities/knowledge.d.ts +23 -0
- package/build/system/activities/knowledge.js +50 -10
- package/build/system/activities/schema-exchange.d.ts +50 -0
- package/build/system/activities/schema-exchange.js +210 -0
- package/build/system/activities/sql.d.ts +4 -1
- package/build/system/activities/sql.js +37 -2
- package/build/system/index.js +1 -0
- package/build/system/mcp-servers/file-storage.js +3 -1
- package/build/system/mcp-servers/human-queue-schemas.d.ts +91 -0
- package/build/system/mcp-servers/human-queue-schemas.js +42 -0
- package/build/system/mcp-servers/human-queue.d.ts +2 -6
- package/build/system/mcp-servers/human-queue.js +9 -51
- package/build/system/mcp-servers/knowledge.js +69 -6
- package/build/system/mcp-servers/schema-exchange.d.ts +4 -0
- package/build/system/mcp-servers/schema-exchange.js +93 -0
- package/build/system/mcp-servers/workflow-compiler.js +54 -0
- package/build/system/seed/server-definitions.d.ts +112 -1
- package/build/system/seed/server-definitions.js +37 -0
- package/build/system/seed/tool-manifests-data.d.ts +87 -0
- package/build/system/seed/tool-manifests-data.js +37 -1
- package/build/system/seed/tool-manifests-knowledge.d.ts +9 -1
- package/build/system/seed/tool-manifests-knowledge.js +6 -5
- package/build/system/workflows/mcp-triage/activities-proxy.d.ts +21 -0
- package/build/system/workflows/mcp-triage/activities-proxy.js +70 -0
- package/build/system/workflows/mcp-triage/index.js +17 -75
- package/build/system/workflows/mcp-workflow-builder/prompts.d.ts +1 -1
- package/build/system/workflows/mcp-workflow-builder/prompts.js +21 -20
- package/build/system/workflows/mcp-workflow-planner/activities/persist.d.ts +2 -1
- package/build/system/workflows/mcp-workflow-planner/activities/persist.js +4 -3
- package/build/system/workflows/mcp-workflow-planner/index.js +41 -5
- package/build/system/workflows/mcp-workflow-planner/prompts.d.ts +1 -1
- package/build/system/workflows/mcp-workflow-planner/prompts.js +3 -3
- package/build/tsconfig.tsbuildinfo +1 -1
- package/dashboard/dist/assets/{AdminDashboard-DUrSBQOl.js → AdminDashboard-NLryl1_B.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-DUrSBQOl.js.map → AdminDashboard-NLryl1_B.js.map} +1 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-6vexlrk3.js +2 -0
- package/dashboard/dist/assets/AvailableEscalationsPage-6vexlrk3.js.map +1 -0
- package/dashboard/dist/assets/{BotPicker-Cg5iNEkm.js → BotPicker-DWhn0tr1.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-Cg5iNEkm.js.map → BotPicker-DWhn0tr1.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-Kd9UIyeU.js → CollapsibleSection-CgYgQiOc.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-Kd9UIyeU.js.map → CollapsibleSection-CgYgQiOc.js.map} +1 -1
- package/dashboard/dist/assets/{ConfirmDeleteModal-DZMgmlof.js → ConfirmDeleteModal-DCKAPXD3.js} +2 -2
- package/dashboard/dist/assets/{ConfirmDeleteModal-DZMgmlof.js.map → ConfirmDeleteModal-DCKAPXD3.js.map} +1 -1
- package/dashboard/dist/assets/{CopyableId-cPFTRm8q.js → CopyableId-DXkaAOYk.js} +2 -2
- package/dashboard/dist/assets/{CopyableId-cPFTRm8q.js.map → CopyableId-DXkaAOYk.js.map} +1 -1
- package/dashboard/dist/assets/CredentialsPage-B361BOfU.js +2 -0
- package/dashboard/dist/assets/{CredentialsPage-DJablIbs.js.map → CredentialsPage-B361BOfU.js.map} +1 -1
- package/dashboard/dist/assets/{CustomDurationPicker-NgIP6YDW.js → CustomDurationPicker-D2G1ldiF.js} +2 -2
- package/dashboard/dist/assets/{CustomDurationPicker-NgIP6YDW.js.map → CustomDurationPicker-D2G1ldiF.js.map} +1 -1
- package/dashboard/dist/assets/{DataTable-CTRhTAfT.js → DataTable-DXSUbA26.js} +2 -2
- package/dashboard/dist/assets/{DataTable-CTRhTAfT.js.map → DataTable-DXSUbA26.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-HcSJ_MMs.js → ElapsedCell-CQGqkXP_.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-HcSJ_MMs.js.map → ElapsedCell-CQGqkXP_.js.map} +1 -1
- package/dashboard/dist/assets/{EmptyState-joNbd4gg.js → EmptyState-Dep92Wkg.js} +2 -2
- package/dashboard/dist/assets/{EmptyState-joNbd4gg.js.map → EmptyState-Dep92Wkg.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-DpXDnQux.js → EscalationsOverview-DVEFVjs7.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-DpXDnQux.js.map → EscalationsOverview-DVEFVjs7.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-CYem3v8n.js → EventTable-BMJAPkMi.js} +2 -2
- package/dashboard/dist/assets/{EventTable-CYem3v8n.js.map → EventTable-BMJAPkMi.js.map} +1 -1
- package/dashboard/dist/assets/{FilterBar-BiO8SOzc.js → FilterBar-DbVbCzH2.js} +2 -2
- package/dashboard/dist/assets/{FilterBar-BiO8SOzc.js.map → FilterBar-DbVbCzH2.js.map} +1 -1
- package/dashboard/dist/assets/{ListToolbar-6yRDh2e9.js → ListToolbar-0XNuXj0M.js} +2 -2
- package/dashboard/dist/assets/{ListToolbar-6yRDh2e9.js.map → ListToolbar-0XNuXj0M.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-CUgSxkQe.js → McpOverview-CeYnCzBN.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-CUgSxkQe.js.map → McpOverview-CeYnCzBN.js.map} +1 -1
- package/dashboard/dist/assets/McpQueryDetailPage-t3qW3QNa.js +5 -0
- package/dashboard/dist/assets/McpQueryDetailPage-t3qW3QNa.js.map +1 -0
- package/dashboard/dist/assets/McpQueryPage-CfUcdzaj.js +2 -0
- package/dashboard/dist/assets/{McpQueryPage-lV6kfDG5.js.map → McpQueryPage-CfUcdzaj.js.map} +1 -1
- package/dashboard/dist/assets/McpRunDetailPage-CZtodW_Z.js +2 -0
- package/dashboard/dist/assets/McpRunDetailPage-CZtodW_Z.js.map +1 -0
- package/dashboard/dist/assets/McpRunsPage-Dzgq7HGt.js +2 -0
- package/dashboard/dist/assets/McpRunsPage-Dzgq7HGt.js.map +1 -0
- package/dashboard/dist/assets/{Modal-BuTvD0pz.js → Modal-yyhUeKoA.js} +2 -2
- package/dashboard/dist/assets/{Modal-BuTvD0pz.js.map → Modal-yyhUeKoA.js.map} +1 -1
- package/dashboard/dist/assets/OperatorDashboard-Ceh7OQtZ.js +2 -0
- package/dashboard/dist/assets/{OperatorDashboard-C9SSV96T.js.map → OperatorDashboard-Ceh7OQtZ.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeader-BcTVF9ul.js → PageHeader-CZ9a8cpr.js} +2 -2
- package/dashboard/dist/assets/{PageHeader-BcTVF9ul.js.map → PageHeader-CZ9a8cpr.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeaderWithStats-BI7JG5x6.js → PageHeaderWithStats-BJuNs5NM.js} +2 -2
- package/dashboard/dist/assets/{PageHeaderWithStats-BI7JG5x6.js.map → PageHeaderWithStats-BJuNs5NM.js.map} +1 -1
- package/dashboard/dist/assets/{PriorityBadge-DqVaOU65.js → PriorityBadge-BrPikMFy.js} +2 -2
- package/dashboard/dist/assets/{PriorityBadge-DqVaOU65.js.map → PriorityBadge-BrPikMFy.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessDetailPage-hFMhf9qa.js → ProcessDetailPage-2miaYd8G.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-hFMhf9qa.js.map → ProcessDetailPage-2miaYd8G.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessesListPage-ByVoBCQ3.js → ProcessesListPage-DqpRDqjk.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-ByVoBCQ3.js.map → ProcessesListPage-DqpRDqjk.js.map} +1 -1
- package/dashboard/dist/assets/{RolePill-D9ZIkYiu.js → RolePill-DxbJMfJu.js} +2 -2
- package/dashboard/dist/assets/{RolePill-D9ZIkYiu.js.map → RolePill-DxbJMfJu.js.map} +1 -1
- package/dashboard/dist/assets/{RolesPage-SMedMuqa.js → RolesPage-CYHRo21-.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-SMedMuqa.js.map → RolesPage-CYHRo21-.js.map} +1 -1
- package/dashboard/dist/assets/{RowActions-yDhwwDbU.js → RowActions-DurFwIwe.js} +2 -2
- package/dashboard/dist/assets/{RowActions-yDhwwDbU.js.map → RowActions-DurFwIwe.js.map} +1 -1
- package/dashboard/dist/assets/RunAsSelector-CNKraP6u.js +2 -0
- package/dashboard/dist/assets/RunAsSelector-CNKraP6u.js.map +1 -0
- package/dashboard/dist/assets/{StatCard-BrBnQFxh.js → StatCard-CKplpK3w.js} +2 -2
- package/dashboard/dist/assets/{StatCard-BrBnQFxh.js.map → StatCard-CKplpK3w.js.map} +1 -1
- package/dashboard/dist/assets/{StatusBadge-xgb-lZku.js → StatusBadge-Dm0V1dNN.js} +2 -2
- package/dashboard/dist/assets/{StatusBadge-xgb-lZku.js.map → StatusBadge-Dm0V1dNN.js.map} +1 -1
- package/dashboard/dist/assets/{StepIndicator-B9ps2SvM.js → StepIndicator-Dicx0WTZ.js} +2 -2
- package/dashboard/dist/assets/{StepIndicator-B9ps2SvM.js.map → StepIndicator-Dicx0WTZ.js.map} +1 -1
- package/dashboard/dist/assets/{StickyPagination-DTIjBKN3.js → StickyPagination-B2jYvU3-.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-DTIjBKN3.js.map → StickyPagination-B2jYvU3-.js.map} +1 -1
- package/dashboard/dist/assets/SwimlaneTimeline-ClwumkT1.js +2 -0
- package/dashboard/dist/assets/SwimlaneTimeline-ClwumkT1.js.map +1 -0
- package/dashboard/dist/assets/{TagInput-CdNUuqk4.js → TagInput-CypDZ6Kl.js} +2 -2
- package/dashboard/dist/assets/{TagInput-CdNUuqk4.js.map → TagInput-CypDZ6Kl.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-C-nzaNea.js → TaskDetailPage-DooDNJGT.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-C-nzaNea.js.map → TaskDetailPage-DooDNJGT.js.map} +1 -1
- package/dashboard/dist/assets/{TaskQueuePill-Lvr2-NzS.js → TaskQueuePill-C1hZ-j31.js} +2 -2
- package/dashboard/dist/assets/{TaskQueuePill-Lvr2-NzS.js.map → TaskQueuePill-C1hZ-j31.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-DSUmD84y.js → TasksListPage-D7CdkAeg.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-DSUmD84y.js.map → TasksListPage-D7CdkAeg.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-BZdLdrIh.js → TimeAgo-B5LXB2aj.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-BZdLdrIh.js.map → TimeAgo-B5LXB2aj.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-QX_0i5FK.js → TimestampCell-Crb9b0Gw.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-QX_0i5FK.js.map → TimestampCell-Crb9b0Gw.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-DyZMXcBm.js → UserName-OPg-nkRa.js} +2 -2
- package/dashboard/dist/assets/{UserName-DyZMXcBm.js.map → UserName-OPg-nkRa.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowExecutionPage-DjVxfZaF.js → WorkflowExecutionPage-CcLVrs9b.js} +2 -2
- package/dashboard/dist/assets/{WorkflowExecutionPage-DjVxfZaF.js.map → WorkflowExecutionPage-CcLVrs9b.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowPill-CCV4MMj7.js +2 -0
- package/dashboard/dist/assets/WorkflowPill-CCV4MMj7.js.map +1 -0
- package/dashboard/dist/assets/{WorkflowsDashboard-DZjuiFZ0.js → WorkflowsDashboard-DB1SncBi.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsDashboard-DZjuiFZ0.js.map → WorkflowsDashboard-DB1SncBi.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsOverview-CLnLRpOu.js → WorkflowsOverview-DvShiYJV.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-CLnLRpOu.js.map → WorkflowsOverview-DvShiYJV.js.map} +1 -1
- package/dashboard/dist/assets/YamlWorkflowsPage-DCBoMeGI.js +2 -0
- package/dashboard/dist/assets/YamlWorkflowsPage-DCBoMeGI.js.map +1 -0
- package/dashboard/dist/assets/{bots-DIM6lBoY.js → bots-Dqos20NE.js} +2 -2
- package/dashboard/dist/assets/{bots-DIM6lBoY.js.map → bots-Dqos20NE.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-JOTuOqjq.js → escalation-A0CsbvNV.js} +2 -2
- package/dashboard/dist/assets/{escalation-JOTuOqjq.js.map → escalation-A0CsbvNV.js.map} +1 -1
- package/dashboard/dist/assets/escalation-columns-BpBJN6k4.js +2 -0
- package/dashboard/dist/assets/{escalation-columns-Cyg58nkg.js.map → escalation-columns-BpBJN6k4.js.map} +1 -1
- package/dashboard/dist/assets/{helpers-B1BDxBZd.js → helpers-CmznCuAx.js} +2 -2
- package/dashboard/dist/assets/{helpers-B1BDxBZd.js.map → helpers-CmznCuAx.js.map} +1 -1
- package/dashboard/dist/assets/index-BIeYV5QK.js +2 -0
- package/dashboard/dist/assets/index-BIeYV5QK.js.map +1 -0
- package/dashboard/dist/assets/index-BYwD3kHN.js +5 -0
- package/dashboard/dist/assets/index-BYwD3kHN.js.map +1 -0
- package/dashboard/dist/assets/index-C5TUqJu0.css +1 -0
- package/dashboard/dist/assets/index-C8-UaN4N.js +2 -0
- package/dashboard/dist/assets/{index-Cg5nfiYX.js.map → index-C8-UaN4N.js.map} +1 -1
- package/dashboard/dist/assets/index-CAj5LT9H.js +15 -0
- package/dashboard/dist/assets/index-CAj5LT9H.js.map +1 -0
- package/dashboard/dist/assets/index-CjxHCVxl.js +2 -0
- package/dashboard/dist/assets/{index-Cf60K3x9.js.map → index-CjxHCVxl.js.map} +1 -1
- package/dashboard/dist/assets/index-Cr0Rqsj7.js +2 -0
- package/dashboard/dist/assets/index-Cr0Rqsj7.js.map +1 -0
- package/dashboard/dist/assets/index-DZHNte4o.js +2 -0
- package/dashboard/dist/assets/{index-Di12t56M.js.map → index-DZHNte4o.js.map} +1 -1
- package/dashboard/dist/assets/{index-Ds0JoXS2.js → index-VnYkWW8r.js} +2 -2
- package/dashboard/dist/assets/{index-Ds0JoXS2.js.map → index-VnYkWW8r.js.map} +1 -1
- package/dashboard/dist/assets/{index-BcR6PfpY.js → index-XGOmZ117.js} +2 -2
- package/dashboard/dist/assets/{index-BcR6PfpY.js.map → index-XGOmZ117.js.map} +1 -1
- package/dashboard/dist/assets/index-ZjOUzWhc.js +2 -0
- package/dashboard/dist/assets/index-ZjOUzWhc.js.map +1 -0
- package/dashboard/dist/assets/{index-BYZX9tOb.js → index-puKKZ5l8.js} +77 -77
- package/dashboard/dist/assets/index-puKKZ5l8.js.map +1 -0
- package/dashboard/dist/assets/{index-BizfauqT.js → index-t5frSddy.js} +4 -4
- package/dashboard/dist/assets/{index-BizfauqT.js.map → index-t5frSddy.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-B_xbczAt.js → mcp-DrWymhSu.js} +2 -2
- package/dashboard/dist/assets/{mcp-B_xbczAt.js.map → mcp-DrWymhSu.js.map} +1 -1
- package/dashboard/dist/assets/mcp-query-BhUxVEMS.js +2 -0
- package/dashboard/dist/assets/mcp-query-BhUxVEMS.js.map +1 -0
- package/dashboard/dist/assets/mcp-runs-DUfz4mLd.js +2 -0
- package/dashboard/dist/assets/mcp-runs-DUfz4mLd.js.map +1 -0
- package/dashboard/dist/assets/{namespaces-C3WtdO_9.js → namespaces-Cm6AY5sh.js} +2 -2
- package/dashboard/dist/assets/{namespaces-C3WtdO_9.js.map → namespaces-Cm6AY5sh.js.map} +1 -1
- package/dashboard/dist/assets/{roles-BDAsPpZG.js → roles-2v1Kc7BJ.js} +2 -2
- package/dashboard/dist/assets/{roles-BDAsPpZG.js.map → roles-2v1Kc7BJ.js.map} +1 -1
- package/dashboard/dist/assets/{settings-Ife_UwAp.js → settings-DTQNp6tH.js} +2 -2
- package/dashboard/dist/assets/{settings-Ife_UwAp.js.map → settings-DTQNp6tH.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-BquNDHDI.js → tasks-CS1rgG1s.js} +2 -2
- package/dashboard/dist/assets/{tasks-BquNDHDI.js.map → tasks-CS1rgG1s.js.map} +1 -1
- package/dashboard/dist/assets/useEventHooks-BjXX8x3a.js +2 -0
- package/dashboard/dist/assets/{useEventHooks-anv_B2Yy.js.map → useEventHooks-BjXX8x3a.js.map} +1 -1
- package/dashboard/dist/assets/useFilterParams-CGRYFw_A.js +2 -0
- package/dashboard/dist/assets/useFilterParams-CGRYFw_A.js.map +1 -0
- package/dashboard/dist/assets/useYamlActivityEvents-BeR-nVWQ.js +2 -0
- package/dashboard/dist/assets/useYamlActivityEvents-BeR-nVWQ.js.map +1 -0
- package/dashboard/dist/assets/{users-CFcxB4v6.js → users-DYsdQ7Md.js} +2 -2
- package/dashboard/dist/assets/{users-CFcxB4v6.js.map → users-DYsdQ7Md.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-T4r2DSPD.js → vendor-icons-CWl44VA6.js} +132 -82
- package/dashboard/dist/assets/vendor-icons-CWl44VA6.js.map +1 -0
- package/dashboard/dist/assets/{workflows-CeRci9z3.js → workflows-2QAXh3UD.js} +2 -2
- package/dashboard/dist/assets/{workflows-CeRci9z3.js.map → workflows-2QAXh3UD.js.map} +1 -1
- package/dashboard/dist/assets/yaml-workflows-sx8-UEE3.js +2 -0
- package/dashboard/dist/assets/yaml-workflows-sx8-UEE3.js.map +1 -0
- package/dashboard/dist/index.html +3 -3
- package/docs/api/http/file-browser.md +101 -0
- package/docs/api/http/knowledge.md +203 -0
- package/docs/api/http/settings.md +6 -4
- package/docs/api/sdk/files.md +68 -0
- package/docs/api/sdk/knowledge.md +126 -0
- package/docs/api/sdk/settings.md +3 -2
- package/docs/cli.md +171 -0
- package/docs/compilation.md +16 -0
- package/docs/compiler.md +311 -0
- package/docs/events.md +19 -0
- package/docs/schema-exchange.md +173 -0
- package/docs/self-test.md +106 -0
- package/docs/workflows.md +19 -0
- package/package.json +15 -2
- package/build/api/escalations.d.ts +0 -271
- package/build/api/escalations.js +0 -932
- package/build/api/workflows.d.ts +0 -158
- package/build/api/workflows.js +0 -414
- package/dashboard/dist/assets/AvailableEscalationsPage-Dbd1qUK_.js +0 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-Dbd1qUK_.js.map +0 -1
- package/dashboard/dist/assets/CredentialsPage-DJablIbs.js +0 -2
- package/dashboard/dist/assets/McpQueryDetailPage-BWbinTM_.js +0 -5
- package/dashboard/dist/assets/McpQueryDetailPage-BWbinTM_.js.map +0 -1
- package/dashboard/dist/assets/McpQueryPage-lV6kfDG5.js +0 -2
- package/dashboard/dist/assets/McpRunDetailPage-D6gaxH3_.js +0 -2
- package/dashboard/dist/assets/McpRunDetailPage-D6gaxH3_.js.map +0 -1
- package/dashboard/dist/assets/McpRunsPage-DKvTklh9.js +0 -2
- package/dashboard/dist/assets/McpRunsPage-DKvTklh9.js.map +0 -1
- package/dashboard/dist/assets/OperatorDashboard-C9SSV96T.js +0 -2
- package/dashboard/dist/assets/SwimlaneTimeline-RK4Yu66z.js +0 -2
- package/dashboard/dist/assets/SwimlaneTimeline-RK4Yu66z.js.map +0 -1
- package/dashboard/dist/assets/WorkflowPill-CZqGslD6.js +0 -2
- package/dashboard/dist/assets/WorkflowPill-CZqGslD6.js.map +0 -1
- package/dashboard/dist/assets/YamlWorkflowsPage-VjdhnLmO.js +0 -2
- package/dashboard/dist/assets/YamlWorkflowsPage-VjdhnLmO.js.map +0 -1
- package/dashboard/dist/assets/escalation-columns-Cyg58nkg.js +0 -2
- package/dashboard/dist/assets/helpers-BCix9c_m.js +0 -2
- package/dashboard/dist/assets/helpers-BCix9c_m.js.map +0 -1
- package/dashboard/dist/assets/index-BUK3qR-1.js +0 -2
- package/dashboard/dist/assets/index-BUK3qR-1.js.map +0 -1
- package/dashboard/dist/assets/index-BYZX9tOb.js.map +0 -1
- package/dashboard/dist/assets/index-Cf60K3x9.js +0 -2
- package/dashboard/dist/assets/index-Cg5nfiYX.js +0 -2
- package/dashboard/dist/assets/index-D1wVX50Z.js +0 -15
- package/dashboard/dist/assets/index-D1wVX50Z.js.map +0 -1
- package/dashboard/dist/assets/index-DDYFpi4l.js +0 -5
- package/dashboard/dist/assets/index-DDYFpi4l.js.map +0 -1
- package/dashboard/dist/assets/index-DcIKW-cZ.css +0 -1
- package/dashboard/dist/assets/index-Di12t56M.js +0 -2
- package/dashboard/dist/assets/mcp-query-B8-P_QoG.js +0 -2
- package/dashboard/dist/assets/mcp-query-B8-P_QoG.js.map +0 -1
- package/dashboard/dist/assets/mcp-runs-CWeZinoF.js +0 -2
- package/dashboard/dist/assets/mcp-runs-CWeZinoF.js.map +0 -1
- package/dashboard/dist/assets/useEventHooks-anv_B2Yy.js +0 -2
- package/dashboard/dist/assets/useFilterParams-BUyLHcx_.js +0 -2
- package/dashboard/dist/assets/useFilterParams-BUyLHcx_.js.map +0 -1
- package/dashboard/dist/assets/useYamlActivityEvents-DN-PTgVx.js +0 -2
- package/dashboard/dist/assets/useYamlActivityEvents-DN-PTgVx.js.map +0 -1
- package/dashboard/dist/assets/vendor-icons-T4r2DSPD.js.map +0 -1
- package/dashboard/dist/assets/yaml-workflows-DLwd2BOX.js +0 -2
- package/dashboard/dist/assets/yaml-workflows-DLwd2BOX.js.map +0 -1
|
@@ -32,10 +32,15 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
32
32
|
return result;
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
35
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
39
|
exports.LocalStorageBackend = void 0;
|
|
37
40
|
const fs = __importStar(require("fs"));
|
|
38
41
|
const path = __importStar(require("path"));
|
|
42
|
+
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
|
|
43
|
+
const mime_1 = require("./mime");
|
|
39
44
|
const BASE_DIR = process.env.LT_FILE_STORAGE_DIR || './data/files';
|
|
40
45
|
function resolveAndValidate(filePath) {
|
|
41
46
|
const relative = filePath.replace(/^\/+/, '');
|
|
@@ -125,5 +130,63 @@ class LocalStorageBackend {
|
|
|
125
130
|
}
|
|
126
131
|
return fs.createReadStream(resolved);
|
|
127
132
|
}
|
|
133
|
+
async listWithPrefixes(prefix, pageSize, continuationToken) {
|
|
134
|
+
ensureBaseDir();
|
|
135
|
+
const dir = prefix ? resolveAndValidate(prefix) : path.resolve(BASE_DIR);
|
|
136
|
+
if (!fs.existsSync(dir)) {
|
|
137
|
+
return { files: [], directories: [] };
|
|
138
|
+
}
|
|
139
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
140
|
+
const limit = pageSize || 100;
|
|
141
|
+
const offset = continuationToken ? parseInt(continuationToken, 10) : 0;
|
|
142
|
+
const allDirs = [];
|
|
143
|
+
const allFiles = [];
|
|
144
|
+
for (const entry of entries) {
|
|
145
|
+
const relativePath = path.relative(path.resolve(BASE_DIR), path.join(dir, entry.name));
|
|
146
|
+
if (entry.isDirectory()) {
|
|
147
|
+
allDirs.push(relativePath + '/');
|
|
148
|
+
}
|
|
149
|
+
else if (entry.isFile()) {
|
|
150
|
+
const stat = fs.statSync(path.join(dir, entry.name));
|
|
151
|
+
allFiles.push({
|
|
152
|
+
path: relativePath,
|
|
153
|
+
size: stat.size,
|
|
154
|
+
modified_at: stat.mtime.toISOString(),
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// Directories first, then files — paginate the combined list
|
|
159
|
+
const combined = [...allDirs.map((d) => ({ type: 'dir', value: d })),
|
|
160
|
+
...allFiles.map((f) => ({ type: 'file', value: f }))];
|
|
161
|
+
const page = combined.slice(offset, offset + limit);
|
|
162
|
+
const hasMore = offset + limit < combined.length;
|
|
163
|
+
const directories = page.filter((e) => e.type === 'dir').map((e) => e.value);
|
|
164
|
+
const files = page.filter((e) => e.type === 'file').map((e) => e.value);
|
|
165
|
+
return {
|
|
166
|
+
files,
|
|
167
|
+
directories,
|
|
168
|
+
nextToken: hasMore ? String(offset + limit) : undefined,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
async getMetadata(key) {
|
|
172
|
+
const resolved = resolveAndValidate(key);
|
|
173
|
+
if (!fs.existsSync(resolved)) {
|
|
174
|
+
throw new Error(`File not found: ${key}`);
|
|
175
|
+
}
|
|
176
|
+
const stat = fs.statSync(resolved);
|
|
177
|
+
return {
|
|
178
|
+
size: stat.size,
|
|
179
|
+
modified_at: stat.mtime.toISOString(),
|
|
180
|
+
content_type: (0, mime_1.mimeFromPath)(key),
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
async getSignedUrl(key, expiresInSeconds) {
|
|
184
|
+
const secret = process.env.JWT_SECRET;
|
|
185
|
+
if (!secret) {
|
|
186
|
+
throw new Error('JWT_SECRET not configured — cannot generate signed URLs');
|
|
187
|
+
}
|
|
188
|
+
const token = jsonwebtoken_1.default.sign({ filePath: key.replace(/^\/+/, ''), purpose: 'file-download' }, secret, { expiresIn: expiresInSeconds });
|
|
189
|
+
return `/api/files/${key.replace(/^\/+/, '')}?token=${token}`;
|
|
190
|
+
}
|
|
128
191
|
}
|
|
129
192
|
exports.LocalStorageBackend = LocalStorageBackend;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MIME_TYPES = void 0;
|
|
4
|
+
exports.mimeFromPath = mimeFromPath;
|
|
5
|
+
/** Shared MIME type map used by file serving routes and storage backends. */
|
|
6
|
+
exports.MIME_TYPES = {
|
|
7
|
+
'.png': 'image/png',
|
|
8
|
+
'.jpg': 'image/jpeg',
|
|
9
|
+
'.jpeg': 'image/jpeg',
|
|
10
|
+
'.gif': 'image/gif',
|
|
11
|
+
'.svg': 'image/svg+xml',
|
|
12
|
+
'.webp': 'image/webp',
|
|
13
|
+
'.pdf': 'application/pdf',
|
|
14
|
+
'.json': 'application/json',
|
|
15
|
+
'.txt': 'text/plain',
|
|
16
|
+
'.html': 'text/html',
|
|
17
|
+
'.css': 'text/css',
|
|
18
|
+
'.js': 'application/javascript',
|
|
19
|
+
'.csv': 'text/csv',
|
|
20
|
+
'.xml': 'application/xml',
|
|
21
|
+
'.yaml': 'text/yaml',
|
|
22
|
+
'.yml': 'text/yaml',
|
|
23
|
+
'.md': 'text/markdown',
|
|
24
|
+
'.zip': 'application/zip',
|
|
25
|
+
'.gz': 'application/gzip',
|
|
26
|
+
};
|
|
27
|
+
/** Resolve MIME type from file extension. */
|
|
28
|
+
function mimeFromPath(filePath) {
|
|
29
|
+
const ext = filePath.includes('.') ? '.' + filePath.split('.').pop().toLowerCase() : '';
|
|
30
|
+
return exports.MIME_TYPES[ext] || 'application/octet-stream';
|
|
31
|
+
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { StorageBackend } from './types';
|
|
2
2
|
export declare class S3StorageBackend implements StorageBackend {
|
|
3
3
|
private client;
|
|
4
|
+
private signingClient;
|
|
4
5
|
private bucket;
|
|
5
6
|
private bucketReady;
|
|
6
7
|
constructor();
|
|
@@ -28,4 +29,19 @@ export declare class S3StorageBackend implements StorageBackend {
|
|
|
28
29
|
size: number;
|
|
29
30
|
}>;
|
|
30
31
|
createReadStream(key: string): Promise<NodeJS.ReadableStream>;
|
|
32
|
+
listWithPrefixes(prefix?: string, pageSize?: number, continuationToken?: string): Promise<{
|
|
33
|
+
files: Array<{
|
|
34
|
+
path: string;
|
|
35
|
+
size: number;
|
|
36
|
+
modified_at: string;
|
|
37
|
+
}>;
|
|
38
|
+
directories: string[];
|
|
39
|
+
nextToken?: string;
|
|
40
|
+
}>;
|
|
41
|
+
getMetadata(key: string): Promise<{
|
|
42
|
+
size: number;
|
|
43
|
+
modified_at: string;
|
|
44
|
+
content_type: string;
|
|
45
|
+
}>;
|
|
46
|
+
getSignedUrl(key: string, expiresInSeconds: number): Promise<string>;
|
|
31
47
|
}
|
package/build/lib/storage/s3.js
CHANGED
|
@@ -38,10 +38,14 @@ const fs = __importStar(require("fs"));
|
|
|
38
38
|
const os = __importStar(require("os"));
|
|
39
39
|
const path = __importStar(require("path"));
|
|
40
40
|
const client_s3_1 = require("@aws-sdk/client-s3");
|
|
41
|
+
const s3_request_presigner_1 = require("@aws-sdk/s3-request-presigner");
|
|
42
|
+
const mime_1 = require("./mime");
|
|
41
43
|
const STAGING_DIR = path.join(os.tmpdir(), 'lt-staging');
|
|
42
44
|
class S3StorageBackend {
|
|
43
45
|
constructor() {
|
|
46
|
+
this.signingClient = null;
|
|
44
47
|
const endpoint = process.env.LT_S3_ENDPOINT;
|
|
48
|
+
const publicEndpoint = process.env.LT_S3_PUBLIC_ENDPOINT;
|
|
45
49
|
const region = process.env.LT_S3_REGION || 'us-east-1';
|
|
46
50
|
const forcePathStyle = process.env.LT_S3_FORCE_PATH_STYLE === 'true';
|
|
47
51
|
this.bucket = process.env.LT_S3_BUCKET || 'long-tail-files';
|
|
@@ -63,6 +67,12 @@ class S3StorageBackend {
|
|
|
63
67
|
};
|
|
64
68
|
}
|
|
65
69
|
this.client = new client_s3_1.S3Client(clientConfig);
|
|
70
|
+
// Signed URLs need the public-facing endpoint so browsers can reach them.
|
|
71
|
+
// In Docker, LT_S3_ENDPOINT is the internal hostname (e.g. http://minio:9000)
|
|
72
|
+
// while LT_S3_PUBLIC_ENDPOINT is the host-accessible URL (e.g. http://localhost:9000).
|
|
73
|
+
if (publicEndpoint && publicEndpoint !== endpoint) {
|
|
74
|
+
this.signingClient = new client_s3_1.S3Client({ ...clientConfig, endpoint: publicEndpoint });
|
|
75
|
+
}
|
|
66
76
|
this.bucketReady = this.ensureBucket();
|
|
67
77
|
}
|
|
68
78
|
async ensureBucket() {
|
|
@@ -168,6 +178,66 @@ class S3StorageBackend {
|
|
|
168
178
|
}));
|
|
169
179
|
return resp.Body;
|
|
170
180
|
}
|
|
181
|
+
async listWithPrefixes(prefix, pageSize, continuationToken) {
|
|
182
|
+
await this.bucketReady;
|
|
183
|
+
const normalizedPrefix = prefix ? normalizeKey(prefix) : undefined;
|
|
184
|
+
const listPrefix = normalizedPrefix
|
|
185
|
+
? (normalizedPrefix.endsWith('/') ? normalizedPrefix : normalizedPrefix + '/')
|
|
186
|
+
: undefined;
|
|
187
|
+
const resp = await this.client.send(new client_s3_1.ListObjectsV2Command({
|
|
188
|
+
Bucket: this.bucket,
|
|
189
|
+
Prefix: listPrefix,
|
|
190
|
+
Delimiter: '/',
|
|
191
|
+
MaxKeys: pageSize || 100,
|
|
192
|
+
ContinuationToken: continuationToken || undefined,
|
|
193
|
+
}));
|
|
194
|
+
const files = [];
|
|
195
|
+
for (const obj of resp.Contents || []) {
|
|
196
|
+
if (!obj.Key)
|
|
197
|
+
continue;
|
|
198
|
+
// Skip the prefix itself if it appears as a "file"
|
|
199
|
+
if (obj.Key === listPrefix)
|
|
200
|
+
continue;
|
|
201
|
+
files.push({
|
|
202
|
+
path: obj.Key,
|
|
203
|
+
size: obj.Size || 0,
|
|
204
|
+
modified_at: obj.LastModified?.toISOString() || new Date().toISOString(),
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
const directories = [];
|
|
208
|
+
for (const cp of resp.CommonPrefixes || []) {
|
|
209
|
+
if (cp.Prefix) {
|
|
210
|
+
directories.push(cp.Prefix);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
return {
|
|
214
|
+
files,
|
|
215
|
+
directories,
|
|
216
|
+
nextToken: resp.NextContinuationToken || undefined,
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
async getMetadata(key) {
|
|
220
|
+
await this.bucketReady;
|
|
221
|
+
const resp = await this.client.send(new client_s3_1.HeadObjectCommand({
|
|
222
|
+
Bucket: this.bucket,
|
|
223
|
+
Key: normalizeKey(key),
|
|
224
|
+
}));
|
|
225
|
+
return {
|
|
226
|
+
size: resp.ContentLength || 0,
|
|
227
|
+
modified_at: resp.LastModified?.toISOString() || new Date().toISOString(),
|
|
228
|
+
content_type: resp.ContentType || (0, mime_1.mimeFromPath)(key),
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
async getSignedUrl(key, expiresInSeconds) {
|
|
232
|
+
await this.bucketReady;
|
|
233
|
+
const command = new client_s3_1.GetObjectCommand({
|
|
234
|
+
Bucket: this.bucket,
|
|
235
|
+
Key: normalizeKey(key),
|
|
236
|
+
});
|
|
237
|
+
// Use the public-facing client so the signed URL hostname is reachable from browsers
|
|
238
|
+
const client = this.signingClient || this.client;
|
|
239
|
+
return (0, s3_request_presigner_1.getSignedUrl)(client, command, { expiresIn: expiresInSeconds });
|
|
240
|
+
}
|
|
171
241
|
}
|
|
172
242
|
exports.S3StorageBackend = S3StorageBackend;
|
|
173
243
|
/** Strip leading slashes to create a valid S3 key; reject traversal. */
|
|
@@ -38,4 +38,22 @@ export interface StorageBackend {
|
|
|
38
38
|
}>;
|
|
39
39
|
/** Create a readable stream for HTTP serving. */
|
|
40
40
|
createReadStream(key: string): Promise<NodeJS.ReadableStream>;
|
|
41
|
+
/** List files and directory prefixes under a path (for directory browsing). */
|
|
42
|
+
listWithPrefixes(prefix?: string, pageSize?: number, continuationToken?: string): Promise<{
|
|
43
|
+
files: Array<{
|
|
44
|
+
path: string;
|
|
45
|
+
size: number;
|
|
46
|
+
modified_at: string;
|
|
47
|
+
}>;
|
|
48
|
+
directories: string[];
|
|
49
|
+
nextToken?: string;
|
|
50
|
+
}>;
|
|
51
|
+
/** Get file metadata without reading content. */
|
|
52
|
+
getMetadata(key: string): Promise<{
|
|
53
|
+
size: number;
|
|
54
|
+
modified_at: string;
|
|
55
|
+
content_type: string;
|
|
56
|
+
}>;
|
|
57
|
+
/** Generate a time-limited signed URL for unauthenticated file access. */
|
|
58
|
+
getSignedUrl(key: string, expiresInSeconds: number): Promise<string>;
|
|
41
59
|
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sanitize a value for use as an MCP tool name or HotMesh graph topic
|
|
3
|
+
* (the `subscribes` field in a YAML DAG).
|
|
4
|
+
*
|
|
5
|
+
* ## Why snake_case
|
|
6
|
+
*
|
|
7
|
+
* MCP tool names become the `subscribes` topic in a HotMesh YAML DAG.
|
|
8
|
+
* That topic is how the system routes incoming messages to the correct
|
|
9
|
+
* workflow. The same value also appears in `worker` activity `topic`
|
|
10
|
+
* fields and in the `mcp_<server>_<tool>` activity type encoding.
|
|
11
|
+
*
|
|
12
|
+
* Because the activity type uses underscores to delimit server from tool
|
|
13
|
+
* (`mcp_longtail_take_screenshot`), both the server name (letters only)
|
|
14
|
+
* and the tool name (snake_case) must avoid dashes, dots, or other
|
|
15
|
+
* separators that would create ambiguity when parsing activity types.
|
|
16
|
+
*
|
|
17
|
+
* ## Risks if violated
|
|
18
|
+
*
|
|
19
|
+
* - Dashes in tool names cause `parseMcpActivityType()` to mis-split
|
|
20
|
+
* the server/tool boundary in activity type strings.
|
|
21
|
+
* - Dots or special chars can produce invalid HotMesh topic subscriptions
|
|
22
|
+
* that silently fail to route.
|
|
23
|
+
* - Mixed conventions across entry points (builder, planner, discovery)
|
|
24
|
+
* cause topic collisions or deployment failures when merging workflows
|
|
25
|
+
* into a single app namespace.
|
|
26
|
+
*
|
|
27
|
+
* ## Contract
|
|
28
|
+
*
|
|
29
|
+
* Input: any string (LLM output, user input, URL slug, etc.)
|
|
30
|
+
* Output: lowercase letters, digits, and underscores only.
|
|
31
|
+
* Runs of non-alphanumeric chars become a single underscore.
|
|
32
|
+
* No leading or trailing underscores.
|
|
33
|
+
*
|
|
34
|
+
* This is the ONE canonical backend implementation. The dashboard has an
|
|
35
|
+
* identical copy at `dashboard/src/lib/sanitize.ts`. No other file in
|
|
36
|
+
* the platform may inline this logic.
|
|
37
|
+
*/
|
|
38
|
+
export declare function sanitizeToolName(value: string): string;
|
|
39
|
+
/**
|
|
40
|
+
* Sanitize a value for use as an MCP server name (the HotMesh `app.id`
|
|
41
|
+
* and Postgres schema name that isolates one server's workflows from another).
|
|
42
|
+
*
|
|
43
|
+
* ## Why lowercase alphanumeric, leading letter
|
|
44
|
+
*
|
|
45
|
+
* The server name becomes:
|
|
46
|
+
* 1. A Postgres schema name — must start with a letter; letters and digits
|
|
47
|
+
* are safe without quoting.
|
|
48
|
+
* 2. The first segment in the `mcp_<server>_<tool>` activity type encoding.
|
|
49
|
+
* Because underscores delimit server from tool, the server name itself
|
|
50
|
+
* must never contain underscores (or dashes, dots, etc.).
|
|
51
|
+
*
|
|
52
|
+
* ## Risks if violated
|
|
53
|
+
*
|
|
54
|
+
* - Underscores or dashes in the server name make `parseMcpActivityType()`
|
|
55
|
+
* split incorrectly — it uses the first `_` after `mcp_` as the boundary.
|
|
56
|
+
* - A leading digit produces an invalid Postgres schema name that requires
|
|
57
|
+
* quoting and breaks HotMesh's unquoted SQL paths.
|
|
58
|
+
* - Special characters can cause silent deployment failures or schema
|
|
59
|
+
* creation errors.
|
|
60
|
+
*
|
|
61
|
+
* ## Contract
|
|
62
|
+
*
|
|
63
|
+
* Input: any string (LLM suggestion, user input, etc.)
|
|
64
|
+
* Output: lowercase letters and digits only, guaranteed to start with a letter.
|
|
65
|
+
* All non-alphanumeric chars are stripped (not replaced).
|
|
66
|
+
* Leading digits are stripped so the result starts with a letter.
|
|
67
|
+
* Default: 'longtail' if the result is empty after sanitization.
|
|
68
|
+
*
|
|
69
|
+
* This is the ONE canonical backend implementation. The dashboard has an
|
|
70
|
+
* identical copy at `dashboard/src/lib/sanitize.ts`. No other file in
|
|
71
|
+
* the platform may inline this logic.
|
|
72
|
+
*/
|
|
73
|
+
export declare function sanitizeServerName(value: string): string;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.sanitizeToolName = sanitizeToolName;
|
|
4
|
+
exports.sanitizeServerName = sanitizeServerName;
|
|
5
|
+
/**
|
|
6
|
+
* Sanitize a value for use as an MCP tool name or HotMesh graph topic
|
|
7
|
+
* (the `subscribes` field in a YAML DAG).
|
|
8
|
+
*
|
|
9
|
+
* ## Why snake_case
|
|
10
|
+
*
|
|
11
|
+
* MCP tool names become the `subscribes` topic in a HotMesh YAML DAG.
|
|
12
|
+
* That topic is how the system routes incoming messages to the correct
|
|
13
|
+
* workflow. The same value also appears in `worker` activity `topic`
|
|
14
|
+
* fields and in the `mcp_<server>_<tool>` activity type encoding.
|
|
15
|
+
*
|
|
16
|
+
* Because the activity type uses underscores to delimit server from tool
|
|
17
|
+
* (`mcp_longtail_take_screenshot`), both the server name (letters only)
|
|
18
|
+
* and the tool name (snake_case) must avoid dashes, dots, or other
|
|
19
|
+
* separators that would create ambiguity when parsing activity types.
|
|
20
|
+
*
|
|
21
|
+
* ## Risks if violated
|
|
22
|
+
*
|
|
23
|
+
* - Dashes in tool names cause `parseMcpActivityType()` to mis-split
|
|
24
|
+
* the server/tool boundary in activity type strings.
|
|
25
|
+
* - Dots or special chars can produce invalid HotMesh topic subscriptions
|
|
26
|
+
* that silently fail to route.
|
|
27
|
+
* - Mixed conventions across entry points (builder, planner, discovery)
|
|
28
|
+
* cause topic collisions or deployment failures when merging workflows
|
|
29
|
+
* into a single app namespace.
|
|
30
|
+
*
|
|
31
|
+
* ## Contract
|
|
32
|
+
*
|
|
33
|
+
* Input: any string (LLM output, user input, URL slug, etc.)
|
|
34
|
+
* Output: lowercase letters, digits, and underscores only.
|
|
35
|
+
* Runs of non-alphanumeric chars become a single underscore.
|
|
36
|
+
* No leading or trailing underscores.
|
|
37
|
+
*
|
|
38
|
+
* This is the ONE canonical backend implementation. The dashboard has an
|
|
39
|
+
* identical copy at `dashboard/src/lib/sanitize.ts`. No other file in
|
|
40
|
+
* the platform may inline this logic.
|
|
41
|
+
*/
|
|
42
|
+
function sanitizeToolName(value) {
|
|
43
|
+
return value
|
|
44
|
+
.toLowerCase()
|
|
45
|
+
.replace(/[^a-z0-9]+/g, '_')
|
|
46
|
+
.replace(/^_|_$/g, '');
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Sanitize a value for use as an MCP server name (the HotMesh `app.id`
|
|
50
|
+
* and Postgres schema name that isolates one server's workflows from another).
|
|
51
|
+
*
|
|
52
|
+
* ## Why lowercase alphanumeric, leading letter
|
|
53
|
+
*
|
|
54
|
+
* The server name becomes:
|
|
55
|
+
* 1. A Postgres schema name — must start with a letter; letters and digits
|
|
56
|
+
* are safe without quoting.
|
|
57
|
+
* 2. The first segment in the `mcp_<server>_<tool>` activity type encoding.
|
|
58
|
+
* Because underscores delimit server from tool, the server name itself
|
|
59
|
+
* must never contain underscores (or dashes, dots, etc.).
|
|
60
|
+
*
|
|
61
|
+
* ## Risks if violated
|
|
62
|
+
*
|
|
63
|
+
* - Underscores or dashes in the server name make `parseMcpActivityType()`
|
|
64
|
+
* split incorrectly — it uses the first `_` after `mcp_` as the boundary.
|
|
65
|
+
* - A leading digit produces an invalid Postgres schema name that requires
|
|
66
|
+
* quoting and breaks HotMesh's unquoted SQL paths.
|
|
67
|
+
* - Special characters can cause silent deployment failures or schema
|
|
68
|
+
* creation errors.
|
|
69
|
+
*
|
|
70
|
+
* ## Contract
|
|
71
|
+
*
|
|
72
|
+
* Input: any string (LLM suggestion, user input, etc.)
|
|
73
|
+
* Output: lowercase letters and digits only, guaranteed to start with a letter.
|
|
74
|
+
* All non-alphanumeric chars are stripped (not replaced).
|
|
75
|
+
* Leading digits are stripped so the result starts with a letter.
|
|
76
|
+
* Default: 'longtail' if the result is empty after sanitization.
|
|
77
|
+
*
|
|
78
|
+
* This is the ONE canonical backend implementation. The dashboard has an
|
|
79
|
+
* identical copy at `dashboard/src/lib/sanitize.ts`. No other file in
|
|
80
|
+
* the platform may inline this logic.
|
|
81
|
+
*/
|
|
82
|
+
function sanitizeServerName(value) {
|
|
83
|
+
return value.toLowerCase().replace(/[^a-z0-9]/g, '').replace(/^[0-9]+/, '');
|
|
84
|
+
}
|
|
@@ -0,0 +1,126 @@
|
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
const express_1 = require("express");
|
|
40
|
+
const path_1 = __importDefault(require("path"));
|
|
41
|
+
const api = __importStar(require("../api/files"));
|
|
42
|
+
const storage_1 = require("../lib/storage");
|
|
43
|
+
const mime_1 = require("../lib/storage/mime");
|
|
44
|
+
const router = (0, express_1.Router)();
|
|
45
|
+
/**
|
|
46
|
+
* GET /api/file-browser/browse
|
|
47
|
+
* List files and directories at a given prefix.
|
|
48
|
+
* Query: ?prefix=screenshots/&pageSize=100&continuationToken=...
|
|
49
|
+
*/
|
|
50
|
+
router.get('/browse', async (req, res) => {
|
|
51
|
+
const result = await api.browseFiles({
|
|
52
|
+
prefix: req.query.prefix,
|
|
53
|
+
pageSize: req.query.pageSize ? parseInt(req.query.pageSize, 10) : undefined,
|
|
54
|
+
continuationToken: req.query.continuationToken,
|
|
55
|
+
});
|
|
56
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
57
|
+
});
|
|
58
|
+
/**
|
|
59
|
+
* GET /api/file-browser/metadata/*
|
|
60
|
+
* Get metadata for a single file.
|
|
61
|
+
*/
|
|
62
|
+
router.get('/metadata/{*filePath}', async (req, res) => {
|
|
63
|
+
const raw = req.params.filePath;
|
|
64
|
+
const filePath = Array.isArray(raw) ? raw.join('/') : raw;
|
|
65
|
+
if (!filePath) {
|
|
66
|
+
res.status(400).json({ error: 'File path required' });
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
const result = await api.getFileMetadata({ filePath });
|
|
70
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
71
|
+
});
|
|
72
|
+
/**
|
|
73
|
+
* POST /api/file-browser/signed-url
|
|
74
|
+
* Generate a time-limited signed URL for sharing.
|
|
75
|
+
* Body: { path, expiresIn } — expiresIn in seconds (3600, 21600, 86400, 604800, 2592000)
|
|
76
|
+
*/
|
|
77
|
+
router.post('/signed-url', async (req, res) => {
|
|
78
|
+
const { path: filePath, expiresIn } = req.body;
|
|
79
|
+
if (!filePath || !expiresIn) {
|
|
80
|
+
res.status(400).json({ error: 'path and expiresIn are required' });
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const result = await api.generateSignedUrl({
|
|
84
|
+
filePath,
|
|
85
|
+
expiresIn: typeof expiresIn === 'number' ? expiresIn : parseInt(expiresIn, 10),
|
|
86
|
+
});
|
|
87
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
88
|
+
});
|
|
89
|
+
/**
|
|
90
|
+
* DELETE /api/file-browser/delete/*
|
|
91
|
+
* Permanently delete a file.
|
|
92
|
+
*/
|
|
93
|
+
router.delete('/delete/{*filePath}', async (req, res) => {
|
|
94
|
+
const raw = req.params.filePath;
|
|
95
|
+
const filePath = Array.isArray(raw) ? raw.join('/') : raw;
|
|
96
|
+
if (!filePath) {
|
|
97
|
+
res.status(400).json({ error: 'File path required' });
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
const result = await api.deleteFile({ filePath });
|
|
101
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
102
|
+
});
|
|
103
|
+
/**
|
|
104
|
+
* GET /api/file-browser/download/*
|
|
105
|
+
* Download a file with Content-Disposition: attachment.
|
|
106
|
+
*/
|
|
107
|
+
router.get('/download/{*filePath}', async (req, res) => {
|
|
108
|
+
const raw = req.params.filePath;
|
|
109
|
+
const filePath = Array.isArray(raw) ? raw.join('/') : raw;
|
|
110
|
+
if (!filePath) {
|
|
111
|
+
res.status(400).json({ error: 'File path required' });
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
try {
|
|
115
|
+
const stream = await (0, storage_1.getStorageBackend)().createReadStream(filePath);
|
|
116
|
+
const fileName = path_1.default.basename(filePath);
|
|
117
|
+
const contentType = (0, mime_1.mimeFromPath)(filePath);
|
|
118
|
+
res.setHeader('Content-Type', contentType);
|
|
119
|
+
res.setHeader('Content-Disposition', `attachment; filename="${fileName}"`);
|
|
120
|
+
stream.pipe(res);
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
res.status(404).json({ error: 'File not found' });
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
exports.default = router;
|
package/build/routes/files.js
CHANGED
|
@@ -4,26 +4,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
const express_1 = require("express");
|
|
7
|
-
const
|
|
7
|
+
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
|
|
8
8
|
const storage_1 = require("../lib/storage");
|
|
9
|
+
const mime_1 = require("../lib/storage/mime");
|
|
9
10
|
const router = (0, express_1.Router)();
|
|
10
|
-
const MIME_TYPES = {
|
|
11
|
-
'.png': 'image/png',
|
|
12
|
-
'.jpg': 'image/jpeg',
|
|
13
|
-
'.jpeg': 'image/jpeg',
|
|
14
|
-
'.gif': 'image/gif',
|
|
15
|
-
'.svg': 'image/svg+xml',
|
|
16
|
-
'.webp': 'image/webp',
|
|
17
|
-
'.pdf': 'application/pdf',
|
|
18
|
-
'.json': 'application/json',
|
|
19
|
-
'.txt': 'text/plain',
|
|
20
|
-
'.html': 'text/html',
|
|
21
|
-
'.csv': 'text/csv',
|
|
22
|
-
'.xml': 'application/xml',
|
|
23
|
-
};
|
|
24
11
|
/**
|
|
25
12
|
* GET /api/files/*
|
|
26
13
|
* Serve files from managed file storage.
|
|
14
|
+
* Supports optional signed token (?token=<jwt>) for authenticated access
|
|
15
|
+
* to locally-generated signed URLs.
|
|
27
16
|
*/
|
|
28
17
|
router.get('/{*filePath}', async (req, res) => {
|
|
29
18
|
const raw = req.params.filePath;
|
|
@@ -32,10 +21,29 @@ router.get('/{*filePath}', async (req, res) => {
|
|
|
32
21
|
res.status(400).json({ error: 'File path required' });
|
|
33
22
|
return;
|
|
34
23
|
}
|
|
24
|
+
// Validate signed token if provided
|
|
25
|
+
const token = req.query.token;
|
|
26
|
+
if (token) {
|
|
27
|
+
const secret = process.env.JWT_SECRET;
|
|
28
|
+
if (!secret) {
|
|
29
|
+
res.status(500).json({ error: 'Server not configured for signed URLs' });
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
const decoded = jsonwebtoken_1.default.verify(token, secret);
|
|
34
|
+
if (decoded.purpose !== 'file-download' || decoded.filePath !== filePath.replace(/^\/+/, '')) {
|
|
35
|
+
res.status(403).json({ error: 'Token does not match requested file' });
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
res.status(403).json({ error: 'Invalid or expired token' });
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
35
44
|
try {
|
|
36
45
|
const stream = await (0, storage_1.getStorageBackend)().createReadStream(filePath);
|
|
37
|
-
const
|
|
38
|
-
const contentType = MIME_TYPES[ext] || 'application/octet-stream';
|
|
46
|
+
const contentType = (0, mime_1.mimeFromPath)(filePath);
|
|
39
47
|
res.setHeader('Content-Type', contentType);
|
|
40
48
|
res.setHeader('Cache-Control', 'public, max-age=300');
|
|
41
49
|
stream.pipe(res);
|
package/build/routes/index.js
CHANGED
|
@@ -23,10 +23,12 @@ const settings_1 = __importDefault(require("./settings"));
|
|
|
23
23
|
const mcp_runs_1 = __importDefault(require("./mcp-runs"));
|
|
24
24
|
const namespaces_1 = __importDefault(require("./namespaces"));
|
|
25
25
|
const files_1 = __importDefault(require("./files"));
|
|
26
|
+
const file_browser_1 = __importDefault(require("./file-browser"));
|
|
26
27
|
const controlplane_1 = __importDefault(require("./controlplane"));
|
|
27
28
|
const bot_accounts_1 = __importDefault(require("./bot-accounts"));
|
|
28
29
|
const docs_1 = __importDefault(require("./docs"));
|
|
29
30
|
const workflow_sets_1 = __importDefault(require("./workflow-sets"));
|
|
31
|
+
const knowledge_1 = __importDefault(require("./knowledge"));
|
|
30
32
|
const router = (0, express_1.Router)();
|
|
31
33
|
// Public routes (no auth required — they handle their own auth)
|
|
32
34
|
router.use('/auth', auth_2.default);
|
|
@@ -49,8 +51,10 @@ router.use('/insight', insight_1.default);
|
|
|
49
51
|
router.use('/yaml-workflows', yaml_workflows_1.default);
|
|
50
52
|
router.use('/mcp-runs', mcp_runs_1.default);
|
|
51
53
|
router.use('/namespaces', namespaces_1.default);
|
|
54
|
+
router.use('/file-browser', file_browser_1.default);
|
|
52
55
|
router.use('/controlplane', controlplane_1.default);
|
|
53
56
|
router.use('/bot-accounts', bot_accounts_1.default);
|
|
54
57
|
router.use('/docs', docs_1.default);
|
|
55
58
|
router.use('/workflow-sets', workflow_sets_1.default);
|
|
59
|
+
router.use('/knowledge', knowledge_1.default);
|
|
56
60
|
exports.default = router;
|