@hotmeshio/long-tail 0.1.5 → 0.1.6
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 +34 -4
- package/build/lib/db/migrate.js +3 -6
- package/{lib → build/lib}/db/schemas/001_schema.sql +3 -0
- package/{lib → build/lib}/db/schemas/011_system_workflow_configs.sql +7 -0
- package/build/lib/db/schemas/016_streamable_http.sql +7 -0
- package/build/routes/docs.js +25 -7
- package/build/routes/insight.js +63 -0
- package/build/routes/mcp.js +23 -1
- package/build/routes/yaml-workflows/cron.d.ts +2 -0
- package/build/routes/yaml-workflows/cron.js +117 -0
- package/build/routes/yaml-workflows/crud.js +38 -0
- package/build/routes/yaml-workflows/deployment.js +9 -34
- package/build/routes/yaml-workflows/index.js +4 -1
- package/build/services/cron/index.d.ts +17 -0
- package/build/services/cron/index.js +94 -1
- package/build/services/insight/index.d.ts +11 -0
- package/build/services/insight/index.js +30 -0
- package/build/services/mcp/client/connection.d.ts +9 -0
- package/build/services/mcp/client/connection.js +49 -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/yaml-workflow/db.d.ts +3 -0
- package/build/services/yaml-workflow/db.js +24 -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 +89 -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 +3 -0
- package/build/services/yaml-workflow/sql.js +16 -1
- package/build/services/yaml-workflow/types.d.ts +13 -1
- package/build/services/yaml-workflow/workers/callbacks.js +9 -1
- package/build/services/yaml-workflow/workers/register.js +29 -1
- package/build/system/index.js +6 -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/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 +5 -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 +7 -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 +5 -0
- package/build/system/workflows/mcp-workflow-builder/activities/tool-loader.js +8 -0
- package/build/system/workflows/mcp-workflow-builder/index.d.ts +16 -0
- package/build/system/workflows/mcp-workflow-builder/index.js +229 -0
- package/build/system/workflows/mcp-workflow-builder/prompts.d.ts +8 -0
- package/build/system/workflows/mcp-workflow-builder/prompts.js +247 -0
- package/build/system/workflows/shared/tool-loader.js +3 -0
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/mcp.d.ts +4 -3
- package/build/types/yaml-workflow.d.ts +6 -2
- package/dashboard/dist/assets/AdminDashboard-BXkKGkb5.js +2 -0
- package/dashboard/dist/assets/{AdminDashboard-CTyAMUJR.js.map → AdminDashboard-BXkKGkb5.js.map} +1 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-DcH592mc.js +2 -0
- package/dashboard/dist/assets/AvailableEscalationsPage-DcH592mc.js.map +1 -0
- package/dashboard/dist/assets/BotPicker-A6LtzyuO.js +2 -0
- package/dashboard/dist/assets/{BotPicker-C51nKFEu.js.map → BotPicker-A6LtzyuO.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-BSyfd8uL.js → CollapsibleSection-C7nL2_mv.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-BSyfd8uL.js.map → CollapsibleSection-C7nL2_mv.js.map} +1 -1
- package/dashboard/dist/assets/{ConfirmDeleteModal-CBdhia5T.js → ConfirmDeleteModal-CWFwJrSl.js} +2 -2
- package/dashboard/dist/assets/{ConfirmDeleteModal-CBdhia5T.js.map → ConfirmDeleteModal-CWFwJrSl.js.map} +1 -1
- package/dashboard/dist/assets/{CopyableId-dGlewBCS.js → CopyableId-DbZ5c3jh.js} +2 -2
- package/dashboard/dist/assets/{CopyableId-dGlewBCS.js.map → CopyableId-DbZ5c3jh.js.map} +1 -1
- package/dashboard/dist/assets/CredentialsPage-ClWkmLPu.js +2 -0
- package/dashboard/dist/assets/CredentialsPage-ClWkmLPu.js.map +1 -0
- package/dashboard/dist/assets/{CustomDurationPicker-BataWFj8.js → CustomDurationPicker-CtH2hReF.js} +2 -2
- package/dashboard/dist/assets/{CustomDurationPicker-BataWFj8.js.map → CustomDurationPicker-CtH2hReF.js.map} +1 -1
- package/dashboard/dist/assets/{DataTable-B3uf5CCo.js → DataTable-CM5ZcpPi.js} +2 -2
- package/dashboard/dist/assets/{DataTable-B3uf5CCo.js.map → DataTable-CM5ZcpPi.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-G5oSwTpT.js → ElapsedCell-CwqavyeC.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-G5oSwTpT.js.map → ElapsedCell-CwqavyeC.js.map} +1 -1
- package/dashboard/dist/assets/{EmptyState-BChBJNGS.js → EmptyState-BBn78pmm.js} +2 -2
- package/dashboard/dist/assets/{EmptyState-BChBJNGS.js.map → EmptyState-BBn78pmm.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-CxUv8xjG.js → EscalationsOverview-BcJ2E3X7.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-CxUv8xjG.js.map → EscalationsOverview-BcJ2E3X7.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-CVt8B0BZ.js → EventTable-C1en_KZ0.js} +2 -2
- package/dashboard/dist/assets/{EventTable-CVt8B0BZ.js.map → EventTable-C1en_KZ0.js.map} +1 -1
- package/dashboard/dist/assets/{FilterBar-CShf0oe7.js → FilterBar-CZTlrLQT.js} +2 -2
- package/dashboard/dist/assets/{FilterBar-CShf0oe7.js.map → FilterBar-CZTlrLQT.js.map} +1 -1
- package/dashboard/dist/assets/ListToolbar-Cdbsapig.js +2 -0
- package/dashboard/dist/assets/ListToolbar-Cdbsapig.js.map +1 -0
- package/dashboard/dist/assets/{McpOverview-CbaZRnJl.js → McpOverview-CSpEJxKa.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-CbaZRnJl.js.map → McpOverview-CSpEJxKa.js.map} +1 -1
- package/dashboard/dist/assets/McpQueryDetailPage-DhqEI180.js +5 -0
- package/dashboard/dist/assets/McpQueryDetailPage-DhqEI180.js.map +1 -0
- package/dashboard/dist/assets/McpQueryPage-CIiVMlqo.js +2 -0
- package/dashboard/dist/assets/McpQueryPage-CIiVMlqo.js.map +1 -0
- package/dashboard/dist/assets/McpRunDetailPage-9xdxgG4d.js +2 -0
- package/dashboard/dist/assets/McpRunDetailPage-9xdxgG4d.js.map +1 -0
- package/dashboard/dist/assets/McpRunsPage-wWLqHsd4.js +2 -0
- package/dashboard/dist/assets/McpRunsPage-wWLqHsd4.js.map +1 -0
- package/dashboard/dist/assets/{Modal-CI5RBPOQ.js → Modal-kB_P7ZOr.js} +2 -2
- package/dashboard/dist/assets/{Modal-CI5RBPOQ.js.map → Modal-kB_P7ZOr.js.map} +1 -1
- package/dashboard/dist/assets/OperatorDashboard-jc0vrgDI.js +2 -0
- package/dashboard/dist/assets/OperatorDashboard-jc0vrgDI.js.map +1 -0
- package/dashboard/dist/assets/{PageHeader-SMD9qtOO.js → PageHeader-NkOeBR05.js} +2 -2
- package/dashboard/dist/assets/{PageHeader-SMD9qtOO.js.map → PageHeader-NkOeBR05.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeaderWithStats-TikLQsTp.js → PageHeaderWithStats-ywNhrmFK.js} +2 -2
- package/dashboard/dist/assets/{PageHeaderWithStats-TikLQsTp.js.map → PageHeaderWithStats-ywNhrmFK.js.map} +1 -1
- package/dashboard/dist/assets/{PriorityBadge-CQ0EsLTA.js → PriorityBadge-B2MQbSxy.js} +2 -2
- package/dashboard/dist/assets/{PriorityBadge-CQ0EsLTA.js.map → PriorityBadge-B2MQbSxy.js.map} +1 -1
- package/dashboard/dist/assets/ProcessDetailPage-B7z7IdqE.js +2 -0
- package/dashboard/dist/assets/ProcessDetailPage-B7z7IdqE.js.map +1 -0
- package/dashboard/dist/assets/ProcessesListPage-C-uHadO6.js +2 -0
- package/dashboard/dist/assets/ProcessesListPage-C-uHadO6.js.map +1 -0
- package/dashboard/dist/assets/{RolePill-Crj4TH5p.js → RolePill-C1dgC-fK.js} +2 -2
- package/dashboard/dist/assets/{RolePill-Crj4TH5p.js.map → RolePill-C1dgC-fK.js.map} +1 -1
- package/dashboard/dist/assets/{RolesPage-C_RInUwS.js → RolesPage-BSxrD1vm.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-C_RInUwS.js.map → RolesPage-BSxrD1vm.js.map} +1 -1
- package/dashboard/dist/assets/{RowActions-Cp5HyK_w.js → RowActions-lYaHGI-v.js} +2 -2
- package/dashboard/dist/assets/{RowActions-Cp5HyK_w.js.map → RowActions-lYaHGI-v.js.map} +1 -1
- package/dashboard/dist/assets/RunAsSelector-CJDnyp93.js +2 -0
- package/dashboard/dist/assets/RunAsSelector-CJDnyp93.js.map +1 -0
- package/dashboard/dist/assets/{StatCard-BKZLSgNV.js → StatCard-v2TiITVr.js} +2 -2
- package/dashboard/dist/assets/{StatCard-BKZLSgNV.js.map → StatCard-v2TiITVr.js.map} +1 -1
- package/dashboard/dist/assets/{StatusBadge-BYNGGZK5.js → StatusBadge-DWlxevgG.js} +2 -2
- package/dashboard/dist/assets/{StatusBadge-BYNGGZK5.js.map → StatusBadge-DWlxevgG.js.map} +1 -1
- package/dashboard/dist/assets/StepIndicator-CRM4ft28.js +2 -0
- package/dashboard/dist/assets/StepIndicator-CRM4ft28.js.map +1 -0
- package/dashboard/dist/assets/{StickyPagination-CTosgiU2.js → StickyPagination-CF0EToEU.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-CTosgiU2.js.map → StickyPagination-CF0EToEU.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-ylG5Ps1s.js → SwimlaneTimeline-CNlj7fgg.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-ylG5Ps1s.js.map → SwimlaneTimeline-CNlj7fgg.js.map} +1 -1
- package/dashboard/dist/assets/TagInput-CH8qMGhC.js +2 -0
- package/dashboard/dist/assets/TagInput-CH8qMGhC.js.map +1 -0
- package/dashboard/dist/assets/{TaskDetailPage-C9pDGdD2.js → TaskDetailPage-CdWo-6mu.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-C9pDGdD2.js.map → TaskDetailPage-CdWo-6mu.js.map} +1 -1
- package/dashboard/dist/assets/{TaskQueuePill-BtJbZTT0.js → TaskQueuePill-BPj4ogVG.js} +2 -2
- package/dashboard/dist/assets/{TaskQueuePill-BtJbZTT0.js.map → TaskQueuePill-BPj4ogVG.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-DtFLUEhg.js → TasksListPage-CtRkMpKU.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-DtFLUEhg.js.map → TasksListPage-CtRkMpKU.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-WuM6xImZ.js → TimeAgo-Di1a3X5P.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-WuM6xImZ.js.map → TimeAgo-Di1a3X5P.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-IVL_-Upy.js → TimestampCell-CqrXql-S.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-IVL_-Upy.js.map → TimestampCell-CqrXql-S.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-DU9qeg13.js → UserName-BUFYCnRa.js} +2 -2
- package/dashboard/dist/assets/{UserName-DU9qeg13.js.map → UserName-BUFYCnRa.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowExecutionPage-25iusMml.js +2 -0
- package/dashboard/dist/assets/WorkflowExecutionPage-25iusMml.js.map +1 -0
- package/dashboard/dist/assets/{WorkflowPill-Diw8iWBP.js → WorkflowPill-DPKOcbf4.js} +2 -2
- package/dashboard/dist/assets/{WorkflowPill-Diw8iWBP.js.map → WorkflowPill-DPKOcbf4.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowsDashboard-BgxslssH.js +2 -0
- package/dashboard/dist/assets/WorkflowsDashboard-BgxslssH.js.map +1 -0
- package/dashboard/dist/assets/{WorkflowsOverview-CPuvA4t3.js → WorkflowsOverview-Doe5L-Re.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-CPuvA4t3.js.map → WorkflowsOverview-Doe5L-Re.js.map} +1 -1
- package/dashboard/dist/assets/YamlWorkflowsPage-BliAckJ6.js +2 -0
- package/dashboard/dist/assets/YamlWorkflowsPage-BliAckJ6.js.map +1 -0
- package/dashboard/dist/assets/{bots-BPiZXf2h.js → bots-Bi2_O1Ts.js} +2 -2
- package/dashboard/dist/assets/{bots-BPiZXf2h.js.map → bots-Bi2_O1Ts.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-DTY_OKRh.js → escalation-Ck1KlLkT.js} +2 -2
- package/dashboard/dist/assets/{escalation-DTY_OKRh.js.map → escalation-Ck1KlLkT.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-columns-C91fHSkp.js → escalation-columns-ohDsj2eJ.js} +2 -2
- package/dashboard/dist/assets/{escalation-columns-C91fHSkp.js.map → escalation-columns-ohDsj2eJ.js.map} +1 -1
- package/dashboard/dist/assets/helpers-BoD2SgUY.js +2 -0
- package/dashboard/dist/assets/helpers-BoD2SgUY.js.map +1 -0
- package/dashboard/dist/assets/{index-D_qEAYrg.js → index-BEtLIsML.js} +2 -2
- package/dashboard/dist/assets/{index-D_qEAYrg.js.map → index-BEtLIsML.js.map} +1 -1
- package/dashboard/dist/assets/index-Bn2xHDr8.js +5 -0
- package/dashboard/dist/assets/index-Bn2xHDr8.js.map +1 -0
- package/dashboard/dist/assets/index-BpT-6WgJ.js +2 -0
- package/dashboard/dist/assets/{index-BtOwLI0K.js.map → index-BpT-6WgJ.js.map} +1 -1
- package/dashboard/dist/assets/index-CZrJ09p-.js +2 -0
- package/dashboard/dist/assets/index-CZrJ09p-.js.map +1 -0
- package/dashboard/dist/assets/index-D3NyVADW.js +2 -0
- package/dashboard/dist/assets/index-D3NyVADW.js.map +1 -0
- package/dashboard/dist/assets/index-D7zYZOnH.js +2 -0
- package/dashboard/dist/assets/{index-CDWOfCmi.js.map → index-D7zYZOnH.js.map} +1 -1
- package/dashboard/dist/assets/index-DOkHXmyf.js +17 -0
- package/dashboard/dist/assets/index-DOkHXmyf.js.map +1 -0
- package/dashboard/dist/assets/{index-DSzSoku1.js → index-DYyLF-Qb.js} +91 -93
- package/dashboard/dist/assets/index-DYyLF-Qb.js.map +1 -0
- package/dashboard/dist/assets/index-Dk2Q51o0.js +2 -0
- package/dashboard/dist/assets/index-Dk2Q51o0.js.map +1 -0
- package/dashboard/dist/assets/index-FuohTtaM.js +6 -0
- package/dashboard/dist/assets/index-FuohTtaM.js.map +1 -0
- package/dashboard/dist/assets/index-PyCTS05D.css +1 -0
- package/dashboard/dist/assets/mcp-CJtYjA7A.js +2 -0
- package/dashboard/dist/assets/mcp-CJtYjA7A.js.map +1 -0
- package/dashboard/dist/assets/mcp-query-jQJQrs_7.js +2 -0
- package/dashboard/dist/assets/mcp-query-jQJQrs_7.js.map +1 -0
- package/dashboard/dist/assets/{mcp-runs-DmXYJD19.js → mcp-runs-DUWm9Z4V.js} +2 -2
- package/dashboard/dist/assets/{mcp-runs-DmXYJD19.js.map → mcp-runs-DUWm9Z4V.js.map} +1 -1
- package/dashboard/dist/assets/{namespaces-DoGa7jc7.js → namespaces-BM5P2qmL.js} +2 -2
- package/dashboard/dist/assets/{namespaces-DoGa7jc7.js.map → namespaces-BM5P2qmL.js.map} +1 -1
- package/dashboard/dist/assets/{roles-wCdQ2Z7k.js → roles-lv0shpjJ.js} +2 -2
- package/dashboard/dist/assets/{roles-wCdQ2Z7k.js.map → roles-lv0shpjJ.js.map} +1 -1
- package/dashboard/dist/assets/{settings-DDe_L7JT.js → settings-Wlq92mRo.js} +2 -2
- package/dashboard/dist/assets/{settings-DDe_L7JT.js.map → settings-Wlq92mRo.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-3Hih8Bt7.js → tasks-BFGm4PuE.js} +2 -2
- package/dashboard/dist/assets/{tasks-3Hih8Bt7.js.map → tasks-BFGm4PuE.js.map} +1 -1
- package/dashboard/dist/assets/useEventHooks-DIE6ue4x.js +2 -0
- package/dashboard/dist/assets/useEventHooks-DIE6ue4x.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-DCwSO73t.js} +2 -2
- package/dashboard/dist/assets/useYamlActivityEvents-DCwSO73t.js.map +1 -0
- package/dashboard/dist/assets/{users-BTagPmGW.js → users-tA5-K0wA.js} +2 -2
- package/dashboard/dist/assets/{users-BTagPmGW.js.map → users-tA5-K0wA.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-DCLlGYO9.js → vendor-icons-BiIug1SK.js} +121 -66
- package/dashboard/dist/assets/vendor-icons-BiIug1SK.js.map +1 -0
- package/dashboard/dist/assets/{workflows-B20dR3NE.js → workflows-CfLc15Wr.js} +2 -2
- package/dashboard/dist/assets/{workflows-B20dR3NE.js.map → workflows-CfLc15Wr.js.map} +1 -1
- package/dashboard/dist/assets/yaml-workflows-D7JXNqbM.js +2 -0
- package/dashboard/dist/assets/{yaml-workflows-CaLPMQha.js.map → yaml-workflows-D7JXNqbM.js.map} +1 -1
- 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/escalation-strategies.md +2 -3
- package/docs/mcp.md +301 -31
- package/package.json +4 -4
- 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/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/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
|
@@ -42,6 +42,8 @@ const configService = __importStar(require("../config"));
|
|
|
42
42
|
const principal_1 = require("../iam/principal");
|
|
43
43
|
const CRON_TOPIC_PREFIX = 'lt.cron';
|
|
44
44
|
const CRON_ID_PREFIX = 'lt-cron';
|
|
45
|
+
const YAML_CRON_TOPIC_PREFIX = 'lt.cron.yaml';
|
|
46
|
+
const YAML_CRON_ID_PREFIX = 'lt-cron-yaml';
|
|
45
47
|
/**
|
|
46
48
|
* Singleton registry for workflow cron schedules.
|
|
47
49
|
*
|
|
@@ -71,6 +73,8 @@ class LTCronRegistry {
|
|
|
71
73
|
for (const config of cronConfigs) {
|
|
72
74
|
await this.startCron(config);
|
|
73
75
|
}
|
|
76
|
+
// Connect YAML workflow crons
|
|
77
|
+
await this.connectYamlCrons();
|
|
74
78
|
this.connected = true;
|
|
75
79
|
if (cronConfigs.length > 0) {
|
|
76
80
|
logger_1.loggerRegistry.info(`[lt-cron] started ${cronConfigs.length} cron(s): ${cronConfigs.map((c) => c.workflow_type).join(', ')}`);
|
|
@@ -171,12 +175,101 @@ class LTCronRegistry {
|
|
|
171
175
|
logger_1.loggerRegistry.info(`[lt-cron] restarted ${config.workflow_type} (${config.cron_schedule})`);
|
|
172
176
|
}
|
|
173
177
|
}
|
|
178
|
+
// ── YAML workflow crons ────────────────────────────────────────────────────
|
|
179
|
+
/**
|
|
180
|
+
* Load all YAML workflows with a cron_schedule and start Virtual.cron for each.
|
|
181
|
+
*/
|
|
182
|
+
async connectYamlCrons() {
|
|
183
|
+
const { getCronScheduledWorkflows } = await Promise.resolve().then(() => __importStar(require('../yaml-workflow/db')));
|
|
184
|
+
const yamlWfs = await getCronScheduledWorkflows();
|
|
185
|
+
for (const wf of yamlWfs) {
|
|
186
|
+
await this.startYamlCron(wf);
|
|
187
|
+
}
|
|
188
|
+
if (yamlWfs.length > 0) {
|
|
189
|
+
logger_1.loggerRegistry.info(`[lt-cron] started ${yamlWfs.length} YAML cron(s): ${yamlWfs.map((w) => w.graph_topic).join(', ')}`);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Start a single Virtual.cron for a YAML workflow.
|
|
194
|
+
*/
|
|
195
|
+
async startYamlCron(wf) {
|
|
196
|
+
if (!wf.cron_schedule)
|
|
197
|
+
return;
|
|
198
|
+
const connection = (0, db_1.getConnection)();
|
|
199
|
+
const topic = `${YAML_CRON_TOPIC_PREFIX}.${wf.id}`;
|
|
200
|
+
const cronId = `${YAML_CRON_ID_PREFIX}-${wf.id}`;
|
|
201
|
+
const cronEnvelope = wf.cron_envelope || {};
|
|
202
|
+
const wfId = wf.id;
|
|
203
|
+
const graphTopic = wf.graph_topic;
|
|
204
|
+
const appId = wf.app_id;
|
|
205
|
+
let cronCallCount = 0;
|
|
206
|
+
await hotmesh_1.Virtual.cron({
|
|
207
|
+
topic,
|
|
208
|
+
connection,
|
|
209
|
+
callback: async () => {
|
|
210
|
+
try {
|
|
211
|
+
cronCallCount++;
|
|
212
|
+
logger_1.loggerRegistry.info(`[lt-cron] tick #${cronCallCount} at ${new Date().toISOString()} — pub(${appId}/${graphTopic})`);
|
|
213
|
+
const { getEngine } = await Promise.resolve().then(() => __importStar(require('../yaml-workflow/deployer')));
|
|
214
|
+
const engine = await getEngine(appId);
|
|
215
|
+
await engine.pub(graphTopic, cronEnvelope, undefined, { entity: graphTopic });
|
|
216
|
+
logger_1.loggerRegistry.info(`[lt-cron] tick #${cronCallCount} published successfully`);
|
|
217
|
+
}
|
|
218
|
+
catch (err) {
|
|
219
|
+
logger_1.loggerRegistry.error(`[lt-cron] tick #${cronCallCount} failed: ${err?.message}`);
|
|
220
|
+
}
|
|
221
|
+
},
|
|
222
|
+
args: [],
|
|
223
|
+
options: {
|
|
224
|
+
id: cronId,
|
|
225
|
+
interval: wf.cron_schedule,
|
|
226
|
+
},
|
|
227
|
+
});
|
|
228
|
+
this.activeCrons.set(`yaml:${wf.id}`, cronId);
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Stop a single YAML workflow cron.
|
|
232
|
+
*/
|
|
233
|
+
async stopYamlCron(yamlWfId) {
|
|
234
|
+
const key = `yaml:${yamlWfId}`;
|
|
235
|
+
const cronId = this.activeCrons.get(key);
|
|
236
|
+
if (!cronId)
|
|
237
|
+
return;
|
|
238
|
+
const connection = (0, db_1.getConnection)();
|
|
239
|
+
const topic = `${YAML_CRON_TOPIC_PREFIX}.${yamlWfId}`;
|
|
240
|
+
try {
|
|
241
|
+
await hotmesh_1.Virtual.interrupt({
|
|
242
|
+
topic,
|
|
243
|
+
connection,
|
|
244
|
+
options: { id: cronId },
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
catch (err) {
|
|
248
|
+
logger_1.loggerRegistry.warn(`[lt-cron] interrupt failed for YAML workflow ${yamlWfId}: ${err?.message}`);
|
|
249
|
+
}
|
|
250
|
+
this.activeCrons.delete(key);
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Restart a YAML workflow cron after config change.
|
|
254
|
+
*/
|
|
255
|
+
async restartYamlCron(wf) {
|
|
256
|
+
await this.stopYamlCron(wf.id);
|
|
257
|
+
if (wf.cron_schedule && wf.status === 'active') {
|
|
258
|
+
await this.startYamlCron(wf);
|
|
259
|
+
logger_1.loggerRegistry.info(`[lt-cron] restarted YAML cron ${wf.graph_topic} (${wf.cron_schedule})`);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
174
262
|
/**
|
|
175
263
|
* Stop all active crons. Call during graceful shutdown.
|
|
176
264
|
*/
|
|
177
265
|
async disconnect() {
|
|
178
266
|
for (const workflowType of [...this.activeCrons.keys()]) {
|
|
179
|
-
|
|
267
|
+
if (workflowType.startsWith('yaml:')) {
|
|
268
|
+
await this.stopYamlCron(workflowType.replace('yaml:', ''));
|
|
269
|
+
}
|
|
270
|
+
else {
|
|
271
|
+
await this.stopCron(workflowType);
|
|
272
|
+
}
|
|
180
273
|
}
|
|
181
274
|
this.connected = false;
|
|
182
275
|
}
|
|
@@ -28,4 +28,15 @@ export interface DescribeResult {
|
|
|
28
28
|
tags: string[];
|
|
29
29
|
}
|
|
30
30
|
export declare function startMcpQuery(input: McpQueryInput): Promise<McpQueryResult>;
|
|
31
|
+
export interface WorkflowBuilderInput {
|
|
32
|
+
prompt: string;
|
|
33
|
+
tags?: string[];
|
|
34
|
+
wait?: boolean;
|
|
35
|
+
feedback?: string;
|
|
36
|
+
prior_yaml?: string;
|
|
37
|
+
answers?: string;
|
|
38
|
+
prior_questions?: string[];
|
|
39
|
+
userId?: string;
|
|
40
|
+
}
|
|
41
|
+
export declare function startWorkflowBuilder(input: WorkflowBuilderInput): Promise<McpQueryResult>;
|
|
31
42
|
export declare function describeWorkflow(input: DescribeInput): Promise<DescribeResult>;
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
exports.startMcpQuery = startMcpQuery;
|
|
8
|
+
exports.startWorkflowBuilder = startWorkflowBuilder;
|
|
8
9
|
exports.describeWorkflow = describeWorkflow;
|
|
9
10
|
const hotmesh_1 = require("@hotmeshio/hotmesh");
|
|
10
11
|
const db_1 = require("../../lib/db");
|
|
@@ -44,6 +45,35 @@ async function startMcpQuery(input) {
|
|
|
44
45
|
duration_ms: Date.now() - startTime,
|
|
45
46
|
};
|
|
46
47
|
}
|
|
48
|
+
async function startWorkflowBuilder(input) {
|
|
49
|
+
const { prompt, tags, wait = true, feedback, prior_yaml, answers, prior_questions, userId } = input;
|
|
50
|
+
const startTime = Date.now();
|
|
51
|
+
const client = new hotmesh_1.Durable.Client({ connection: (0, db_1.getConnection)() });
|
|
52
|
+
const workflowId = `wf-builder-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
53
|
+
const handle = await client.workflow.start({
|
|
54
|
+
args: [{
|
|
55
|
+
data: { prompt, tags, feedback, prior_yaml, answers, prior_questions },
|
|
56
|
+
metadata: { source: 'dashboard' },
|
|
57
|
+
lt: { userId },
|
|
58
|
+
}],
|
|
59
|
+
taskQueue: 'long-tail-system',
|
|
60
|
+
workflowName: 'mcpWorkflowBuilder',
|
|
61
|
+
workflowId,
|
|
62
|
+
expire: defaults_1.JOB_EXPIRE_SECS,
|
|
63
|
+
entity: 'mcpWorkflowBuilder',
|
|
64
|
+
});
|
|
65
|
+
if (wait === false) {
|
|
66
|
+
return { workflow_id: workflowId, status: 'started', prompt };
|
|
67
|
+
}
|
|
68
|
+
const result = await handle.result({ state: true });
|
|
69
|
+
const data = result?.data || result;
|
|
70
|
+
return {
|
|
71
|
+
...data,
|
|
72
|
+
prompt,
|
|
73
|
+
workflow_id: workflowId,
|
|
74
|
+
duration_ms: Date.now() - startTime,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
47
77
|
// ── Workflow description generation ──────────────────────────────────────────
|
|
48
78
|
async function describeWorkflow(input) {
|
|
49
79
|
const { prompt, result_title, result_summary } = input;
|
|
@@ -40,6 +40,15 @@ export declare function listServerTools(serverId: string): Promise<LTMcpToolMani
|
|
|
40
40
|
* Check if a server is connected.
|
|
41
41
|
*/
|
|
42
42
|
export declare function isConnected(serverId: string): boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Test connectivity to an MCP server without persisting.
|
|
45
|
+
* Creates a temporary client, connects, lists tools, then disconnects.
|
|
46
|
+
*/
|
|
47
|
+
export declare function testConnection(transportType: 'stdio' | 'sse' | 'streamable-http', transportConfig: Record<string, any>): Promise<{
|
|
48
|
+
success: boolean;
|
|
49
|
+
tools: LTMcpToolManifest[];
|
|
50
|
+
error?: string;
|
|
51
|
+
}>;
|
|
43
52
|
/**
|
|
44
53
|
* Clear all state. Used in tests.
|
|
45
54
|
*/
|
|
@@ -41,10 +41,12 @@ exports.connectAutoServers = connectAutoServers;
|
|
|
41
41
|
exports.disconnectAll = disconnectAll;
|
|
42
42
|
exports.listServerTools = listServerTools;
|
|
43
43
|
exports.isConnected = isConnected;
|
|
44
|
+
exports.testConnection = testConnection;
|
|
44
45
|
exports.clear = clear;
|
|
45
46
|
const index_js_1 = require("@modelcontextprotocol/sdk/client/index.js");
|
|
46
47
|
const stdio_js_1 = require("@modelcontextprotocol/sdk/client/stdio.js");
|
|
47
48
|
const sse_js_1 = require("@modelcontextprotocol/sdk/client/sse.js");
|
|
49
|
+
const streamableHttp_js_1 = require("@modelcontextprotocol/sdk/client/streamableHttp.js");
|
|
48
50
|
const inMemory_js_1 = require("@modelcontextprotocol/sdk/inMemory.js");
|
|
49
51
|
const logger_1 = require("../../../lib/logger");
|
|
50
52
|
const mcpDbService = __importStar(require("../db"));
|
|
@@ -106,13 +108,17 @@ async function connectToServer(server) {
|
|
|
106
108
|
}
|
|
107
109
|
const client = new index_js_1.Client({ name: 'long-tail', version: '1.0.0' });
|
|
108
110
|
let transport;
|
|
109
|
-
|
|
111
|
+
const ttype = server.transport_type;
|
|
112
|
+
if (ttype === 'stdio') {
|
|
110
113
|
transport = new stdio_js_1.StdioClientTransport({
|
|
111
114
|
command: server.transport_config.command,
|
|
112
115
|
args: server.transport_config.args || [],
|
|
113
116
|
env: server.transport_config.env,
|
|
114
117
|
});
|
|
115
118
|
}
|
|
119
|
+
else if (ttype === 'streamable-http') {
|
|
120
|
+
transport = new streamableHttp_js_1.StreamableHTTPClientTransport(new URL(server.transport_config.url));
|
|
121
|
+
}
|
|
116
122
|
else {
|
|
117
123
|
transport = new sse_js_1.SSEClientTransport(new URL(server.transport_config.url));
|
|
118
124
|
}
|
|
@@ -272,6 +278,48 @@ async function listServerTools(serverId) {
|
|
|
272
278
|
function isConnected(serverId) {
|
|
273
279
|
return clients.has(serverId);
|
|
274
280
|
}
|
|
281
|
+
/**
|
|
282
|
+
* Test connectivity to an MCP server without persisting.
|
|
283
|
+
* Creates a temporary client, connects, lists tools, then disconnects.
|
|
284
|
+
*/
|
|
285
|
+
async function testConnection(transportType, transportConfig) {
|
|
286
|
+
const client = new index_js_1.Client({ name: 'long-tail-test', version: '1.0.0' });
|
|
287
|
+
const timeout = setTimeout(() => { throw new Error('Connection timed out (10s)'); }, 10_000);
|
|
288
|
+
try {
|
|
289
|
+
let transport;
|
|
290
|
+
if (transportType === 'stdio') {
|
|
291
|
+
transport = new stdio_js_1.StdioClientTransport({
|
|
292
|
+
command: transportConfig.command,
|
|
293
|
+
args: transportConfig.args || [],
|
|
294
|
+
env: transportConfig.env,
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
else if (transportType === 'streamable-http') {
|
|
298
|
+
transport = new streamableHttp_js_1.StreamableHTTPClientTransport(new URL(transportConfig.url));
|
|
299
|
+
}
|
|
300
|
+
else {
|
|
301
|
+
transport = new sse_js_1.SSEClientTransport(new URL(transportConfig.url));
|
|
302
|
+
}
|
|
303
|
+
await client.connect(transport);
|
|
304
|
+
const { tools } = await client.listTools();
|
|
305
|
+
const manifest = tools.map((t) => ({
|
|
306
|
+
name: t.name,
|
|
307
|
+
description: t.description || '',
|
|
308
|
+
inputSchema: t.inputSchema || {},
|
|
309
|
+
}));
|
|
310
|
+
return { success: true, tools: manifest };
|
|
311
|
+
}
|
|
312
|
+
catch (err) {
|
|
313
|
+
return { success: false, tools: [], error: err.message };
|
|
314
|
+
}
|
|
315
|
+
finally {
|
|
316
|
+
clearTimeout(timeout);
|
|
317
|
+
try {
|
|
318
|
+
await client.close();
|
|
319
|
+
}
|
|
320
|
+
catch { /* ignore close errors */ }
|
|
321
|
+
}
|
|
322
|
+
}
|
|
275
323
|
/**
|
|
276
324
|
* Clear all state. Used in tests.
|
|
277
325
|
*/
|
|
@@ -14,8 +14,8 @@ export declare const findTasksSchema: z.ZodObject<{
|
|
|
14
14
|
}, {
|
|
15
15
|
status?: "pending" | "in_progress" | "completed" | "needs_intervention" | "failed" | undefined;
|
|
16
16
|
workflow_type?: string | undefined;
|
|
17
|
-
limit?: number | undefined;
|
|
18
17
|
workflow_id?: string | undefined;
|
|
18
|
+
limit?: number | undefined;
|
|
19
19
|
origin_id?: string | undefined;
|
|
20
20
|
}>;
|
|
21
21
|
export declare const findEscalationsSchema: z.ZodObject<{
|
|
@@ -34,8 +34,8 @@ export declare const findEscalationsSchema: z.ZodObject<{
|
|
|
34
34
|
role?: string | undefined;
|
|
35
35
|
status?: "pending" | "resolved" | undefined;
|
|
36
36
|
type?: string | undefined;
|
|
37
|
-
priority?: number | undefined;
|
|
38
37
|
limit?: number | undefined;
|
|
38
|
+
priority?: number | undefined;
|
|
39
39
|
}>;
|
|
40
40
|
export declare const getProcessSummarySchema: z.ZodObject<{
|
|
41
41
|
workflow_type: z.ZodOptional<z.ZodString>;
|
|
@@ -3,7 +3,7 @@ import type { CreateMcpServerInput } from './types';
|
|
|
3
3
|
export declare function createMcpServer(input: CreateMcpServerInput): Promise<LTMcpServerRecord>;
|
|
4
4
|
export declare function getMcpServer(id: string): Promise<LTMcpServerRecord | null>;
|
|
5
5
|
export declare function getMcpServerByName(name: string): Promise<LTMcpServerRecord | null>;
|
|
6
|
-
export declare function updateMcpServer(id: string, updates: Partial<Pick<CreateMcpServerInput, 'name' | 'description' | 'transport_type' | 'transport_config' | 'auto_connect' | 'metadata' | 'tags'>>): Promise<LTMcpServerRecord | null>;
|
|
6
|
+
export declare function updateMcpServer(id: string, updates: Partial<Pick<CreateMcpServerInput, 'name' | 'description' | 'transport_type' | 'transport_config' | 'auto_connect' | 'metadata' | 'tags' | 'compile_hints' | 'credential_providers'>>): Promise<LTMcpServerRecord | null>;
|
|
7
7
|
export declare function deleteMcpServer(id: string): Promise<boolean>;
|
|
8
8
|
export declare function updateMcpServerStatus(id: string, status: LTMcpServerStatus, toolManifest?: LTMcpToolManifest[]): Promise<void>;
|
|
9
9
|
export declare function listMcpServers(filters: {
|
package/build/services/mcp/db.js
CHANGED
|
@@ -21,6 +21,8 @@ async function createMcpServer(input) {
|
|
|
21
21
|
input.auto_connect ?? false,
|
|
22
22
|
input.metadata ? JSON.stringify(input.metadata) : null,
|
|
23
23
|
input.tags || [],
|
|
24
|
+
input.compile_hints || null,
|
|
25
|
+
input.credential_providers || [],
|
|
24
26
|
]);
|
|
25
27
|
return rows[0];
|
|
26
28
|
}
|
|
@@ -67,6 +69,14 @@ async function updateMcpServer(id, updates) {
|
|
|
67
69
|
sets.push(`tags = $${idx++}`);
|
|
68
70
|
values.push(updates.tags);
|
|
69
71
|
}
|
|
72
|
+
if (updates.compile_hints !== undefined) {
|
|
73
|
+
sets.push(`compile_hints = $${idx++}`);
|
|
74
|
+
values.push(updates.compile_hints || null);
|
|
75
|
+
}
|
|
76
|
+
if (updates.credential_providers !== undefined) {
|
|
77
|
+
sets.push(`credential_providers = $${idx++}`);
|
|
78
|
+
values.push(updates.credential_providers);
|
|
79
|
+
}
|
|
70
80
|
if (sets.length === 0)
|
|
71
81
|
return getMcpServer(id);
|
|
72
82
|
values.push(id);
|
|
@@ -17,13 +17,13 @@ export declare const screenshotSchema: z.ZodObject<{
|
|
|
17
17
|
}, "strip", z.ZodTypeAny, {
|
|
18
18
|
path: string;
|
|
19
19
|
page_id?: string | undefined;
|
|
20
|
-
full_page?: boolean | undefined;
|
|
21
20
|
selector?: string | undefined;
|
|
21
|
+
full_page?: boolean | undefined;
|
|
22
22
|
}, {
|
|
23
23
|
path: string;
|
|
24
24
|
page_id?: string | undefined;
|
|
25
|
-
full_page?: boolean | undefined;
|
|
26
25
|
selector?: string | undefined;
|
|
26
|
+
full_page?: boolean | undefined;
|
|
27
27
|
}>;
|
|
28
28
|
export declare const clickSchema: z.ZodObject<{
|
|
29
29
|
page_id: z.ZodOptional<z.ZodString>;
|
|
@@ -54,12 +54,12 @@ export declare const waitForSchema: z.ZodObject<{
|
|
|
54
54
|
timeout: z.ZodOptional<z.ZodNumber>;
|
|
55
55
|
}, "strip", z.ZodTypeAny, {
|
|
56
56
|
selector: string;
|
|
57
|
-
timeout?: number | undefined;
|
|
58
57
|
page_id?: string | undefined;
|
|
58
|
+
timeout?: number | undefined;
|
|
59
59
|
}, {
|
|
60
60
|
selector: string;
|
|
61
|
-
timeout?: number | undefined;
|
|
62
61
|
page_id?: string | undefined;
|
|
62
|
+
timeout?: number | undefined;
|
|
63
63
|
}>;
|
|
64
64
|
export declare const evaluateSchema: z.ZodObject<{
|
|
65
65
|
page_id: z.ZodOptional<z.ZodString>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare const CREATE_MCP_SERVER = "\n INSERT INTO lt_mcp_servers\n (name, description, transport_type, transport_config, auto_connect, metadata, tags)\n VALUES ($1, $2, $3, $4, $5, $6, $7)\n RETURNING *";
|
|
1
|
+
export declare const CREATE_MCP_SERVER = "\n INSERT INTO lt_mcp_servers\n (name, description, transport_type, transport_config, auto_connect, metadata, tags, compile_hints, credential_providers)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)\n RETURNING *";
|
|
2
2
|
export declare const GET_MCP_SERVER = "\n SELECT * FROM lt_mcp_servers WHERE id = $1";
|
|
3
3
|
export declare const GET_MCP_SERVER_BY_NAME = "\n SELECT * FROM lt_mcp_servers WHERE name = $1";
|
|
4
4
|
export declare const DELETE_MCP_SERVER = "\n DELETE FROM lt_mcp_servers WHERE id = $1";
|
|
@@ -4,8 +4,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
4
4
|
exports.SEED_MCP_SERVER = exports.DELETE_STALE_BUILTIN_SERVERS = exports.HEALTH_DURABLE_WORKFLOWS = exports.HEALTH_WORKFLOW_CONFIGS = exports.HEALTH_COMPILED_WORKFLOWS = exports.HEALTH_MCP_SERVER_LIST = exports.HEALTH_MCP_SERVERS = exports.HEALTH_RECENT_ACTIVITY = exports.HEALTH_ACTIVE_WORKFLOW_TYPES = exports.HEALTH_ESCALATION_COUNTS = exports.HEALTH_TASK_COUNTS = exports.GET_AUTO_CONNECT_SERVERS = exports.UPDATE_STATUS = exports.UPDATE_STATUS_CONNECTED = exports.DELETE_MCP_SERVER = exports.GET_MCP_SERVER_BY_NAME = exports.GET_MCP_SERVER = exports.CREATE_MCP_SERVER = void 0;
|
|
5
5
|
exports.CREATE_MCP_SERVER = `
|
|
6
6
|
INSERT INTO lt_mcp_servers
|
|
7
|
-
(name, description, transport_type, transport_config, auto_connect, metadata, tags)
|
|
8
|
-
VALUES ($1, $2, $3, $4, $5, $6, $7)
|
|
7
|
+
(name, description, transport_type, transport_config, auto_connect, metadata, tags, compile_hints, credential_providers)
|
|
8
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)
|
|
9
9
|
RETURNING *`;
|
|
10
10
|
exports.GET_MCP_SERVER = `
|
|
11
11
|
SELECT * FROM lt_mcp_servers WHERE id = $1`;
|
|
@@ -2,11 +2,13 @@
|
|
|
2
2
|
export interface CreateMcpServerInput {
|
|
3
3
|
name: string;
|
|
4
4
|
description?: string;
|
|
5
|
-
transport_type: 'stdio' | 'sse';
|
|
5
|
+
transport_type: 'stdio' | 'sse' | 'streamable-http';
|
|
6
6
|
transport_config: Record<string, any>;
|
|
7
7
|
auto_connect?: boolean;
|
|
8
8
|
metadata?: Record<string, any>;
|
|
9
9
|
tags?: string[];
|
|
10
|
+
compile_hints?: string;
|
|
11
|
+
credential_providers?: string[];
|
|
10
12
|
}
|
|
11
13
|
export interface BuiltInMcpAdapterOptions {
|
|
12
14
|
server?: {
|
|
@@ -25,3 +25,6 @@ export declare function getVersionHistory(workflowId: string, limit?: number, of
|
|
|
25
25
|
export declare function getVersionSnapshot(workflowId: string, version: number): Promise<LTYamlWorkflowVersionRecord | null>;
|
|
26
26
|
export declare function markContentDeployed(workflowId: string): Promise<void>;
|
|
27
27
|
export declare function markAppIdContentDeployed(appId: string): Promise<void>;
|
|
28
|
+
export declare function updateCronSchedule(id: string, cronSchedule: string, cronEnvelope: Record<string, unknown> | null, executeAs: string | null): Promise<LTYamlWorkflowRecord | null>;
|
|
29
|
+
export declare function clearCronSchedule(id: string): Promise<LTYamlWorkflowRecord | null>;
|
|
30
|
+
export declare function getCronScheduledWorkflows(): Promise<LTYamlWorkflowRecord[]>;
|
|
@@ -16,6 +16,9 @@ exports.getVersionHistory = getVersionHistory;
|
|
|
16
16
|
exports.getVersionSnapshot = getVersionSnapshot;
|
|
17
17
|
exports.markContentDeployed = markContentDeployed;
|
|
18
18
|
exports.markAppIdContentDeployed = markAppIdContentDeployed;
|
|
19
|
+
exports.updateCronSchedule = updateCronSchedule;
|
|
20
|
+
exports.clearCronSchedule = clearCronSchedule;
|
|
21
|
+
exports.getCronScheduledWorkflows = getCronScheduledWorkflows;
|
|
19
22
|
const db_1 = require("../../lib/db");
|
|
20
23
|
const defaults_1 = require("../../modules/defaults");
|
|
21
24
|
const sql_1 = require("./sql");
|
|
@@ -194,3 +197,24 @@ async function markAppIdContentDeployed(appId) {
|
|
|
194
197
|
const pool = (0, db_1.getPool)();
|
|
195
198
|
await pool.query(sql_1.MARK_APP_ID_CONTENT_DEPLOYED, [appId]);
|
|
196
199
|
}
|
|
200
|
+
// -- Cron scheduling ---------------------------------------------------------
|
|
201
|
+
async function updateCronSchedule(id, cronSchedule, cronEnvelope, executeAs) {
|
|
202
|
+
const pool = (0, db_1.getPool)();
|
|
203
|
+
const { rows } = await pool.query(sql_1.UPDATE_CRON_SCHEDULE, [
|
|
204
|
+
id,
|
|
205
|
+
cronSchedule,
|
|
206
|
+
cronEnvelope ? JSON.stringify(cronEnvelope) : null,
|
|
207
|
+
executeAs,
|
|
208
|
+
]);
|
|
209
|
+
return rows[0] || null;
|
|
210
|
+
}
|
|
211
|
+
async function clearCronSchedule(id) {
|
|
212
|
+
const pool = (0, db_1.getPool)();
|
|
213
|
+
const { rows } = await pool.query(sql_1.CLEAR_CRON_SCHEDULE, [id]);
|
|
214
|
+
return rows[0] || null;
|
|
215
|
+
}
|
|
216
|
+
async function getCronScheduledWorkflows() {
|
|
217
|
+
const pool = (0, db_1.getPool)();
|
|
218
|
+
const { rows } = await pool.query(sql_1.GET_CRON_SCHEDULED_WORKFLOWS);
|
|
219
|
+
return rows;
|
|
220
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { LTYamlWorkflowRecord } from '../../types/yaml-workflow';
|
|
2
|
+
interface InvokeOptions {
|
|
3
|
+
data?: Record<string, unknown>;
|
|
4
|
+
sync?: boolean;
|
|
5
|
+
timeout?: number;
|
|
6
|
+
execute_as?: string;
|
|
7
|
+
userId?: string;
|
|
8
|
+
/** Source identifier for metadata injection (e.g., 'cron') */
|
|
9
|
+
source?: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Invoke a YAML workflow with scope injection.
|
|
13
|
+
* Shared by HTTP route and cron callback.
|
|
14
|
+
*/
|
|
15
|
+
export declare function invokeYamlWorkflow(wf: LTYamlWorkflowRecord, options?: InvokeOptions): Promise<{
|
|
16
|
+
job_id: string;
|
|
17
|
+
result?: unknown;
|
|
18
|
+
}>;
|
|
19
|
+
export {};
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.invokeYamlWorkflow = invokeYamlWorkflow;
|
|
37
|
+
const yamlDeployer = __importStar(require("./deployer"));
|
|
38
|
+
const principal_1 = require("../iam/principal");
|
|
39
|
+
/**
|
|
40
|
+
* Invoke a YAML workflow with scope injection.
|
|
41
|
+
* Shared by HTTP route and cron callback.
|
|
42
|
+
*/
|
|
43
|
+
async function invokeYamlWorkflow(wf, options = {}) {
|
|
44
|
+
const data = { ...(options.data || {}) };
|
|
45
|
+
// Inject _scope so compiled workflow activities have identity context
|
|
46
|
+
if (!data._scope) {
|
|
47
|
+
const executeAs = options.execute_as;
|
|
48
|
+
const userId = options.userId;
|
|
49
|
+
if (executeAs) {
|
|
50
|
+
const [botPrincipal, invokerPrincipal] = await Promise.all([
|
|
51
|
+
(0, principal_1.resolvePrincipal)(executeAs),
|
|
52
|
+
userId ? (0, principal_1.resolvePrincipal)(userId) : Promise.resolve(null),
|
|
53
|
+
]);
|
|
54
|
+
if (botPrincipal) {
|
|
55
|
+
data._scope = {
|
|
56
|
+
principal: botPrincipal,
|
|
57
|
+
scopes: ['mcp:tool:call'],
|
|
58
|
+
...(invokerPrincipal ? { initiatedBy: userId, initiatingPrincipal: invokerPrincipal } : {}),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
else if (userId) {
|
|
63
|
+
const principal = await (0, principal_1.resolvePrincipal)(userId);
|
|
64
|
+
if (principal) {
|
|
65
|
+
data._scope = { principal, scopes: ['mcp:tool:call'] };
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (options.source) {
|
|
70
|
+
if (!data._metadata)
|
|
71
|
+
data._metadata = {};
|
|
72
|
+
data._metadata.source = options.source;
|
|
73
|
+
}
|
|
74
|
+
if (options.sync) {
|
|
75
|
+
const { job_id, result } = await yamlDeployer.invokeYamlWorkflowSync(wf.app_id, wf.graph_topic, data, options.timeout, wf.graph_topic);
|
|
76
|
+
return { job_id, result };
|
|
77
|
+
}
|
|
78
|
+
const jobId = await yamlDeployer.invokeYamlWorkflow(wf.app_id, wf.graph_topic, data, wf.graph_topic);
|
|
79
|
+
return { job_id: jobId };
|
|
80
|
+
}
|
|
@@ -78,7 +78,7 @@ function appendNormalStep(dag, idx, step, prefix, graphTopic, plan, steps, trigg
|
|
|
78
78
|
if (plan) {
|
|
79
79
|
dag.prevActivityId = (0, transform_1.insertTransformActivities)(idx, plan, steps, prefix, graphTopic, dag.triggerId, triggerInputKeys, dag.stepIndexToActivityId, collapsedToCoreIndex, dag.activities, dag.transitions, dag.manifest, dag.prevActivityId);
|
|
80
80
|
}
|
|
81
|
-
// Wire input mappings from upstream steps
|
|
81
|
+
// Wire input mappings from upstream steps (may include @pipe objects for derivations)
|
|
82
82
|
const inputMappings = (0, wiring_1.wireStepInputs)(idx, step, plan, dag.stepIndexToActivityId, dag.triggerId, triggerInputKeys, steps, prefix, dag.prevActivityId, dag.prevResult, collapsedToCoreIndex);
|
|
83
83
|
// Build the activity definition
|
|
84
84
|
const resultSchema = step.result ? (0, utils_1.inferSchema)(step.result) : { type: 'object' };
|
|
@@ -6,4 +6,4 @@ import type { ExtractedStep, EnhancedCompilationPlan } from '../../types';
|
|
|
6
6
|
* Build input mappings for a step using the compilation plan's data flow edges.
|
|
7
7
|
* Falls back to mechanical backward-scan when no plan is available.
|
|
8
8
|
*/
|
|
9
|
-
export declare function wireStepInputs(stepIdx: number, step: ExtractedStep, plan: EnhancedCompilationPlan | null, stepIndexToActivityId: Map<number, string>, triggerId: string, triggerInputKeys: Set<string>, steps: ExtractedStep[], prefix: string, prevActivityId: string, prevResult: unknown, collapsedToCoreIndex?: Map<number, number>): Record<string,
|
|
9
|
+
export declare function wireStepInputs(stepIdx: number, step: ExtractedStep, plan: EnhancedCompilationPlan | null, stepIndexToActivityId: Map<number, string>, triggerId: string, triggerInputKeys: Set<string>, steps: ExtractedStep[], prefix: string, prevActivityId: string, prevResult: unknown, collapsedToCoreIndex?: Map<number, number>): Record<string, unknown>;
|