@hotmeshio/long-tail 0.1.6 → 0.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +47 -5
- package/build/api/auth.d.ts +16 -0
- package/build/api/auth.js +53 -0
- package/build/api/bot-accounts.d.ts +137 -0
- package/build/api/bot-accounts.js +302 -0
- package/build/api/controlplane.d.ts +68 -0
- package/build/api/controlplane.js +158 -0
- package/build/api/dba.d.ts +42 -0
- package/build/api/dba.js +95 -0
- package/build/api/escalations.d.ts +271 -0
- package/build/api/escalations.js +892 -0
- package/build/api/exports.d.ts +90 -0
- package/build/api/exports.js +204 -0
- package/build/api/index.d.ts +18 -0
- package/build/api/index.js +54 -0
- package/build/api/insight.d.ts +86 -0
- package/build/api/insight.js +147 -0
- package/build/api/maintenance.d.ts +22 -0
- package/build/api/maintenance.js +43 -0
- package/build/api/mcp-runs.d.ts +43 -0
- package/build/api/mcp-runs.js +89 -0
- package/build/api/mcp.d.ts +160 -0
- package/build/api/mcp.js +320 -0
- package/build/api/namespaces.d.ts +20 -0
- package/build/{routes/escalations/helpers.js → api/namespaces.js} +35 -10
- package/build/api/roles.d.ts +88 -0
- package/build/api/roles.js +217 -0
- package/build/api/settings.d.ts +10 -0
- package/build/api/settings.js +43 -0
- package/build/api/tasks.d.ts +70 -0
- package/build/api/tasks.js +139 -0
- package/build/api/users.d.ts +115 -0
- package/build/api/users.js +228 -0
- package/build/api/workflow-sets.d.ts +77 -0
- package/build/api/workflow-sets.js +170 -0
- package/build/api/workflows.d.ts +158 -0
- package/build/api/workflows.js +407 -0
- package/build/api/yaml-workflows.d.ts +282 -0
- package/build/api/yaml-workflows.js +751 -0
- package/build/examples/types/envelopes.d.ts +27 -0
- package/build/examples/types/index.d.ts +1 -1
- package/build/examples/workers.js +8 -0
- package/build/examples/workflows/assembly-line/activities.d.ts +28 -0
- package/build/examples/workflows/assembly-line/activities.js +53 -0
- package/build/examples/workflows/assembly-line/index.d.ts +17 -0
- package/build/examples/workflows/assembly-line/index.js +60 -0
- package/build/examples/workflows/assembly-line/iterator.d.ts +12 -0
- package/build/examples/workflows/assembly-line/iterator.js +54 -0
- package/build/examples/workflows/assembly-line/reverter.d.ts +18 -0
- package/build/examples/workflows/assembly-line/reverter.js +89 -0
- package/build/examples/workflows/assembly-line/types.d.ts +25 -0
- package/build/examples/workflows/assembly-line/types.js +8 -0
- package/build/examples/workflows/assembly-line/worker.d.ts +13 -0
- package/build/examples/workflows/assembly-line/worker.js +81 -0
- package/build/index.d.ts +4 -0
- package/build/index.js +6 -1
- package/build/lib/db/schemas/004_workflow_sets.sql +29 -0
- package/build/lib/db/schemas/005_unique_graph_topic.sql +7 -0
- package/build/lib/db/schemas/011_system_workflow_configs.sql +7 -0
- package/build/lib/events/callback.d.ts +41 -0
- package/build/lib/events/callback.js +98 -0
- package/build/modules/config.js +1 -1
- package/build/routes/auth.js +37 -36
- package/build/routes/bot-accounts.js +34 -164
- package/build/routes/controlplane.js +20 -60
- package/build/routes/dba.js +18 -28
- package/build/routes/escalations/bulk.js +17 -192
- package/build/routes/escalations/list.js +51 -75
- package/build/routes/escalations/resolve.js +3 -193
- package/build/routes/escalations/single.js +13 -122
- package/build/routes/exports.js +44 -95
- package/build/routes/index.js +2 -0
- package/build/routes/insight.js +46 -88
- package/build/routes/maintenance.js +41 -17
- package/build/routes/mcp-runs.js +52 -60
- package/build/routes/mcp.js +49 -177
- package/build/routes/namespaces.js +9 -20
- package/build/routes/roles.js +23 -97
- package/build/routes/settings.js +37 -25
- package/build/routes/tasks.js +28 -64
- package/build/routes/users.js +24 -113
- package/build/routes/workflow-sets.d.ts +2 -0
- package/build/routes/workflow-sets.js +98 -0
- package/build/routes/workflows/config.js +23 -57
- package/build/routes/workflows/discovery.js +11 -85
- package/build/routes/workflows/invocation.js +28 -90
- package/build/routes/yaml-workflows/cron.js +12 -61
- package/build/routes/yaml-workflows/crud.js +30 -223
- package/build/routes/yaml-workflows/deployment.js +15 -115
- package/build/routes/yaml-workflows/versions.js +20 -58
- package/build/sdk/index.d.ts +338 -0
- package/build/sdk/index.js +299 -0
- package/build/services/controlplane/index.d.ts +1 -2
- package/build/services/controlplane/index.js +3 -3
- package/build/services/controlplane/sql.d.ts +2 -2
- package/build/services/controlplane/sql.js +4 -5
- package/build/services/controlplane/types.d.ts +1 -0
- package/build/services/export/index.js +6 -1
- package/build/services/hotmesh-utils.js +2 -4
- package/build/services/insight/index.d.ts +7 -0
- package/build/services/insight/index.js +30 -0
- package/build/services/mcp/client/tools.js +13 -1
- package/build/services/mcp-runs/sql.js +1 -1
- package/build/services/workflow-invocation.d.ts +15 -2
- package/build/services/workflow-invocation.js +11 -6
- package/build/services/workflow-sets/db.d.ts +16 -0
- package/build/services/workflow-sets/db.js +78 -0
- package/build/services/workflow-sets/index.d.ts +1 -0
- package/build/services/workflow-sets/index.js +11 -0
- package/build/services/workflow-sets/sql.d.ts +6 -0
- package/build/services/workflow-sets/sql.js +24 -0
- package/build/services/yaml-workflow/db-utils.d.ts +1 -0
- package/build/services/yaml-workflow/db-utils.js +4 -0
- package/build/services/yaml-workflow/db.d.ts +5 -0
- package/build/services/yaml-workflow/db.js +17 -0
- package/build/services/yaml-workflow/pipeline/build/wiring.js +14 -1
- package/build/services/yaml-workflow/pipeline/prompts.d.ts +1 -1
- package/build/services/yaml-workflow/pipeline/prompts.js +1 -1
- package/build/services/yaml-workflow/sql.d.ts +2 -1
- package/build/services/yaml-workflow/sql.js +8 -3
- package/build/services/yaml-workflow/types.d.ts +3 -0
- package/build/services/yaml-workflow/workers/callbacks.js +7 -1
- package/build/services/yaml-workflow/workers/register.js +7 -0
- package/build/start/adapters.js +4 -0
- package/build/system/index.js +6 -0
- package/build/system/mcp-servers/knowledge.js +1 -1
- package/build/system/seed/server-definitions.js +2 -1
- package/build/system/workflows/mcp-workflow-builder/activities/index.d.ts +1 -1
- package/build/system/workflows/mcp-workflow-builder/activities/index.js +2 -1
- package/build/system/workflows/mcp-workflow-builder/activities/tool-loader.d.ts +6 -0
- package/build/system/workflows/mcp-workflow-builder/activities/tool-loader.js +26 -0
- package/build/system/workflows/mcp-workflow-builder/index.js +26 -2
- package/build/system/workflows/mcp-workflow-builder/prompts.js +104 -35
- package/build/system/workflows/mcp-workflow-planner/activities/analyze.d.ts +11 -0
- package/build/system/workflows/mcp-workflow-planner/activities/analyze.js +36 -0
- package/build/system/workflows/mcp-workflow-planner/activities/index.d.ts +3 -0
- package/build/system/workflows/mcp-workflow-planner/activities/index.js +12 -0
- package/build/system/workflows/mcp-workflow-planner/activities/persist.d.ts +19 -0
- package/build/system/workflows/mcp-workflow-planner/activities/persist.js +55 -0
- package/build/system/workflows/mcp-workflow-planner/activities/plan.d.ts +10 -0
- package/build/system/workflows/mcp-workflow-planner/activities/plan.js +43 -0
- package/build/system/workflows/mcp-workflow-planner/index.d.ts +7 -0
- package/build/system/workflows/mcp-workflow-planner/index.js +152 -0
- package/build/system/workflows/mcp-workflow-planner/prompts.d.ts +7 -0
- package/build/system/workflows/mcp-workflow-planner/prompts.js +77 -0
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/index.d.ts +1 -0
- package/build/types/sdk.d.ts +27 -0
- package/build/types/sdk.js +2 -0
- package/build/types/workflow-set.d.ts +44 -0
- package/build/types/workflow-set.js +5 -0
- package/dashboard/dist/assets/{AdminDashboard-BXkKGkb5.js → AdminDashboard-B15jSEV2.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-BXkKGkb5.js.map → AdminDashboard-B15jSEV2.js.map} +1 -1
- package/dashboard/dist/assets/{AvailableEscalationsPage-DcH592mc.js → AvailableEscalationsPage-0V2yvKak.js} +2 -2
- package/dashboard/dist/assets/{AvailableEscalationsPage-DcH592mc.js.map → AvailableEscalationsPage-0V2yvKak.js.map} +1 -1
- package/dashboard/dist/assets/BotPicker-B4UxHcek.js +2 -0
- package/dashboard/dist/assets/{BotPicker-A6LtzyuO.js.map → BotPicker-B4UxHcek.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-C7nL2_mv.js → CollapsibleSection-BBexNWVd.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-C7nL2_mv.js.map → CollapsibleSection-BBexNWVd.js.map} +1 -1
- package/dashboard/dist/assets/{ConfirmDeleteModal-CWFwJrSl.js → ConfirmDeleteModal-DlPDJSq_.js} +2 -2
- package/dashboard/dist/assets/{ConfirmDeleteModal-CWFwJrSl.js.map → ConfirmDeleteModal-DlPDJSq_.js.map} +1 -1
- package/dashboard/dist/assets/{CopyableId-DbZ5c3jh.js → CopyableId-BxHW1ahb.js} +2 -2
- package/dashboard/dist/assets/{CopyableId-DbZ5c3jh.js.map → CopyableId-BxHW1ahb.js.map} +1 -1
- package/dashboard/dist/assets/{CredentialsPage-ClWkmLPu.js → CredentialsPage-Bp_Y1Szk.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-ClWkmLPu.js.map → CredentialsPage-Bp_Y1Szk.js.map} +1 -1
- package/dashboard/dist/assets/{CustomDurationPicker-CtH2hReF.js → CustomDurationPicker-ByBFqXSO.js} +2 -2
- package/dashboard/dist/assets/{CustomDurationPicker-CtH2hReF.js.map → CustomDurationPicker-ByBFqXSO.js.map} +1 -1
- package/dashboard/dist/assets/{DataTable-CM5ZcpPi.js → DataTable-DyIXg-tQ.js} +2 -2
- package/dashboard/dist/assets/{DataTable-CM5ZcpPi.js.map → DataTable-DyIXg-tQ.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-CwqavyeC.js → ElapsedCell-BgnA0qpS.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-CwqavyeC.js.map → ElapsedCell-BgnA0qpS.js.map} +1 -1
- package/dashboard/dist/assets/{EmptyState-BBn78pmm.js → EmptyState-DlMImvgm.js} +2 -2
- package/dashboard/dist/assets/{EmptyState-BBn78pmm.js.map → EmptyState-DlMImvgm.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-BcJ2E3X7.js → EscalationsOverview-D90kdfw1.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-BcJ2E3X7.js.map → EscalationsOverview-D90kdfw1.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-C1en_KZ0.js → EventTable-BNxtlgNz.js} +2 -2
- package/dashboard/dist/assets/{EventTable-C1en_KZ0.js.map → EventTable-BNxtlgNz.js.map} +1 -1
- package/dashboard/dist/assets/{FilterBar-CZTlrLQT.js → FilterBar-BTiaAhCx.js} +2 -2
- package/dashboard/dist/assets/{FilterBar-CZTlrLQT.js.map → FilterBar-BTiaAhCx.js.map} +1 -1
- package/dashboard/dist/assets/{ListToolbar-Cdbsapig.js → ListToolbar-BUcagSCn.js} +2 -2
- package/dashboard/dist/assets/{ListToolbar-Cdbsapig.js.map → ListToolbar-BUcagSCn.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-CSpEJxKa.js → McpOverview-B-tCvz8C.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-CSpEJxKa.js.map → McpOverview-B-tCvz8C.js.map} +1 -1
- package/dashboard/dist/assets/McpQueryDetailPage-DPlF1wYb.js +5 -0
- package/dashboard/dist/assets/McpQueryDetailPage-DPlF1wYb.js.map +1 -0
- package/dashboard/dist/assets/McpQueryPage-Bz7AdcfR.js +2 -0
- package/dashboard/dist/assets/McpQueryPage-Bz7AdcfR.js.map +1 -0
- package/dashboard/dist/assets/{McpRunDetailPage-9xdxgG4d.js → McpRunDetailPage-Di_qpL2V.js} +2 -2
- package/dashboard/dist/assets/{McpRunDetailPage-9xdxgG4d.js.map → McpRunDetailPage-Di_qpL2V.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunsPage-wWLqHsd4.js → McpRunsPage-BBgybBEa.js} +2 -2
- package/dashboard/dist/assets/{McpRunsPage-wWLqHsd4.js.map → McpRunsPage-BBgybBEa.js.map} +1 -1
- package/dashboard/dist/assets/{Modal-kB_P7ZOr.js → Modal-CaJ0gTEa.js} +2 -2
- package/dashboard/dist/assets/{Modal-kB_P7ZOr.js.map → Modal-CaJ0gTEa.js.map} +1 -1
- package/dashboard/dist/assets/OperatorDashboard-DDfMmrmR.js +2 -0
- package/dashboard/dist/assets/{OperatorDashboard-jc0vrgDI.js.map → OperatorDashboard-DDfMmrmR.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeader-NkOeBR05.js → PageHeader-C5D-G5rp.js} +2 -2
- package/dashboard/dist/assets/{PageHeader-NkOeBR05.js.map → PageHeader-C5D-G5rp.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeaderWithStats-ywNhrmFK.js → PageHeaderWithStats-DCa2eZh2.js} +2 -2
- package/dashboard/dist/assets/{PageHeaderWithStats-ywNhrmFK.js.map → PageHeaderWithStats-DCa2eZh2.js.map} +1 -1
- package/dashboard/dist/assets/{PriorityBadge-B2MQbSxy.js → PriorityBadge-DTHq6OUZ.js} +2 -2
- package/dashboard/dist/assets/{PriorityBadge-B2MQbSxy.js.map → PriorityBadge-DTHq6OUZ.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessDetailPage-B7z7IdqE.js → ProcessDetailPage-fC4dhrd0.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-B7z7IdqE.js.map → ProcessDetailPage-fC4dhrd0.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessesListPage-C-uHadO6.js → ProcessesListPage-CL2MY8uD.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-C-uHadO6.js.map → ProcessesListPage-CL2MY8uD.js.map} +1 -1
- package/dashboard/dist/assets/{RolePill-C1dgC-fK.js → RolePill-kgKPANly.js} +2 -2
- package/dashboard/dist/assets/{RolePill-C1dgC-fK.js.map → RolePill-kgKPANly.js.map} +1 -1
- package/dashboard/dist/assets/{RolesPage-BSxrD1vm.js → RolesPage-Be2lXTHD.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-BSxrD1vm.js.map → RolesPage-Be2lXTHD.js.map} +1 -1
- package/dashboard/dist/assets/{RowActions-lYaHGI-v.js → RowActions-DIzJCwqR.js} +2 -2
- package/dashboard/dist/assets/{RowActions-lYaHGI-v.js.map → RowActions-DIzJCwqR.js.map} +1 -1
- package/dashboard/dist/assets/{StatCard-v2TiITVr.js → StatCard-CRi2Jy6t.js} +2 -2
- package/dashboard/dist/assets/{StatCard-v2TiITVr.js.map → StatCard-CRi2Jy6t.js.map} +1 -1
- package/dashboard/dist/assets/{StatusBadge-DWlxevgG.js → StatusBadge-BETI_8Mr.js} +2 -2
- package/dashboard/dist/assets/{StatusBadge-DWlxevgG.js.map → StatusBadge-BETI_8Mr.js.map} +1 -1
- package/dashboard/dist/assets/{StepIndicator-CRM4ft28.js → StepIndicator-DjpMqCjz.js} +2 -2
- package/dashboard/dist/assets/{StepIndicator-CRM4ft28.js.map → StepIndicator-DjpMqCjz.js.map} +1 -1
- package/dashboard/dist/assets/{StickyPagination-CF0EToEU.js → StickyPagination-BZbExQ9t.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-CF0EToEU.js.map → StickyPagination-BZbExQ9t.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-CNlj7fgg.js → SwimlaneTimeline-DZthQyhR.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-CNlj7fgg.js.map → SwimlaneTimeline-DZthQyhR.js.map} +1 -1
- package/dashboard/dist/assets/{TagInput-CH8qMGhC.js → TagInput-CukbOfYn.js} +2 -2
- package/dashboard/dist/assets/{TagInput-CH8qMGhC.js.map → TagInput-CukbOfYn.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-CdWo-6mu.js → TaskDetailPage-CIZHIKo9.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-CdWo-6mu.js.map → TaskDetailPage-CIZHIKo9.js.map} +1 -1
- package/dashboard/dist/assets/{TaskQueuePill-BPj4ogVG.js → TaskQueuePill-Q7DGoysj.js} +2 -2
- package/dashboard/dist/assets/{TaskQueuePill-BPj4ogVG.js.map → TaskQueuePill-Q7DGoysj.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-CtRkMpKU.js → TasksListPage-CsC9wjb0.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-CtRkMpKU.js.map → TasksListPage-CsC9wjb0.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-Di1a3X5P.js → TimeAgo-BcOOnJeH.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-Di1a3X5P.js.map → TimeAgo-BcOOnJeH.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-CqrXql-S.js → TimestampCell-CEMapYDQ.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-CqrXql-S.js.map → TimestampCell-CEMapYDQ.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-BUFYCnRa.js → UserName-BHoN7iRL.js} +2 -2
- package/dashboard/dist/assets/{UserName-BUFYCnRa.js.map → UserName-BHoN7iRL.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowExecutionPage-25iusMml.js → WorkflowExecutionPage-DawKl1LT.js} +2 -2
- package/dashboard/dist/assets/{WorkflowExecutionPage-25iusMml.js.map → WorkflowExecutionPage-DawKl1LT.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowPill-CP84Vqeg.js +2 -0
- package/dashboard/dist/assets/{WorkflowPill-DPKOcbf4.js.map → WorkflowPill-CP84Vqeg.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsDashboard-BgxslssH.js → WorkflowsDashboard-QrvVFxtQ.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsDashboard-BgxslssH.js.map → WorkflowsDashboard-QrvVFxtQ.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsOverview-Doe5L-Re.js → WorkflowsOverview-DuhAi_OY.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-Doe5L-Re.js.map → WorkflowsOverview-DuhAi_OY.js.map} +1 -1
- package/dashboard/dist/assets/YamlWorkflowsPage-Dc9xw82a.js +2 -0
- package/dashboard/dist/assets/YamlWorkflowsPage-Dc9xw82a.js.map +1 -0
- package/dashboard/dist/assets/{bots-Bi2_O1Ts.js → bots-Dny-rmmI.js} +2 -2
- package/dashboard/dist/assets/{bots-Bi2_O1Ts.js.map → bots-Dny-rmmI.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-Ck1KlLkT.js → escalation-CV0sKNH5.js} +2 -2
- package/dashboard/dist/assets/{escalation-Ck1KlLkT.js.map → escalation-CV0sKNH5.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-columns-ohDsj2eJ.js → escalation-columns-30CKyoWI.js} +2 -2
- package/dashboard/dist/assets/{escalation-columns-ohDsj2eJ.js.map → escalation-columns-30CKyoWI.js.map} +1 -1
- package/dashboard/dist/assets/{helpers-BoD2SgUY.js → helpers-C1-30CzH.js} +2 -2
- package/dashboard/dist/assets/{helpers-BoD2SgUY.js.map → helpers-C1-30CzH.js.map} +1 -1
- package/dashboard/dist/assets/helpers-C1jaRD-d.js +2 -0
- package/dashboard/dist/assets/helpers-C1jaRD-d.js.map +1 -0
- package/dashboard/dist/assets/{index-FuohTtaM.js → index-BUVQ6wmy.js} +3 -3
- package/dashboard/dist/assets/{index-FuohTtaM.js.map → index-BUVQ6wmy.js.map} +1 -1
- package/dashboard/dist/assets/index-CxVB7F4X.js +2 -0
- package/dashboard/dist/assets/{index-Dk2Q51o0.js.map → index-CxVB7F4X.js.map} +1 -1
- package/dashboard/dist/assets/{index-BEtLIsML.js → index-D-oCWCAS.js} +2 -2
- package/dashboard/dist/assets/{index-BEtLIsML.js.map → index-D-oCWCAS.js.map} +1 -1
- package/dashboard/dist/assets/index-D0wPM3Ck.js +2 -0
- package/dashboard/dist/assets/{index-BpT-6WgJ.js.map → index-D0wPM3Ck.js.map} +1 -1
- package/dashboard/dist/assets/{index-Bn2xHDr8.js → index-DHgnkykj.js} +3 -3
- package/dashboard/dist/assets/{index-Bn2xHDr8.js.map → index-DHgnkykj.js.map} +1 -1
- package/dashboard/dist/assets/{index-D3NyVADW.js → index-D_aJBEAG.js} +2 -2
- package/dashboard/dist/assets/index-D_aJBEAG.js.map +1 -0
- package/dashboard/dist/assets/{index-PyCTS05D.css → index-DcIKW-cZ.css} +1 -1
- package/dashboard/dist/assets/{index-CZrJ09p-.js → index-Dd_U4mLm.js} +2 -2
- package/dashboard/dist/assets/{index-CZrJ09p-.js.map → index-Dd_U4mLm.js.map} +1 -1
- package/dashboard/dist/assets/{index-DYyLF-Qb.js → index-DnmZbNxk.js} +8 -8
- package/dashboard/dist/assets/index-DnmZbNxk.js.map +1 -0
- package/dashboard/dist/assets/index-_RBvi7s6.js +2 -0
- package/dashboard/dist/assets/{index-D7zYZOnH.js.map → index-_RBvi7s6.js.map} +1 -1
- package/dashboard/dist/assets/index-n7td8zgX.js +17 -0
- package/dashboard/dist/assets/{index-DOkHXmyf.js.map → index-n7td8zgX.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-CJtYjA7A.js → mcp-CRFr4L9W.js} +2 -2
- package/dashboard/dist/assets/{mcp-CJtYjA7A.js.map → mcp-CRFr4L9W.js.map} +1 -1
- package/dashboard/dist/assets/mcp-query-DHY2mZBQ.js +2 -0
- package/dashboard/dist/assets/mcp-query-DHY2mZBQ.js.map +1 -0
- package/dashboard/dist/assets/{mcp-runs-DUWm9Z4V.js → mcp-runs-BqPHqwAO.js} +2 -2
- package/dashboard/dist/assets/{mcp-runs-DUWm9Z4V.js.map → mcp-runs-BqPHqwAO.js.map} +1 -1
- package/dashboard/dist/assets/{namespaces-BM5P2qmL.js → namespaces-TG1aIpo_.js} +2 -2
- package/dashboard/dist/assets/{namespaces-BM5P2qmL.js.map → namespaces-TG1aIpo_.js.map} +1 -1
- package/dashboard/dist/assets/{roles-lv0shpjJ.js → roles-DhhLTvXg.js} +2 -2
- package/dashboard/dist/assets/{roles-lv0shpjJ.js.map → roles-DhhLTvXg.js.map} +1 -1
- package/dashboard/dist/assets/{settings-Wlq92mRo.js → settings-D9MBzEeB.js} +2 -2
- package/dashboard/dist/assets/{settings-Wlq92mRo.js.map → settings-D9MBzEeB.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-BFGm4PuE.js → tasks-BxmcZoev.js} +2 -2
- package/dashboard/dist/assets/{tasks-BFGm4PuE.js.map → tasks-BxmcZoev.js.map} +1 -1
- package/dashboard/dist/assets/{useEventHooks-DIE6ue4x.js → useEventHooks-BylecvvI.js} +2 -2
- package/dashboard/dist/assets/{useEventHooks-DIE6ue4x.js.map → useEventHooks-BylecvvI.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-DCwSO73t.js → useYamlActivityEvents-ocmj11e_.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-DCwSO73t.js.map → useYamlActivityEvents-ocmj11e_.js.map} +1 -1
- package/dashboard/dist/assets/{users-tA5-K0wA.js → users-Ce5r-JAv.js} +2 -2
- package/dashboard/dist/assets/{users-tA5-K0wA.js.map → users-Ce5r-JAv.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-BiIug1SK.js → vendor-icons-D1DdudfH.js} +93 -73
- package/dashboard/dist/assets/vendor-icons-D1DdudfH.js.map +1 -0
- package/dashboard/dist/assets/{workflows-CfLc15Wr.js → workflows-ykIeVbRJ.js} +2 -2
- package/dashboard/dist/assets/{workflows-CfLc15Wr.js.map → workflows-ykIeVbRJ.js.map} +1 -1
- package/dashboard/dist/assets/yaml-workflows-WypmKYht.js +2 -0
- package/dashboard/dist/assets/yaml-workflows-WypmKYht.js.map +1 -0
- package/dashboard/dist/index.html +3 -3
- package/docs/api/sdk/auth.md +27 -0
- package/docs/api/sdk/bot-accounts.md +243 -0
- package/docs/api/sdk/controlplane.md +103 -0
- package/docs/api/sdk/dba.md +52 -0
- package/docs/api/sdk/escalations.md +374 -0
- package/docs/api/sdk/events.md +68 -0
- package/docs/api/sdk/exports.md +124 -0
- package/docs/api/sdk/insight.md +112 -0
- package/docs/api/sdk/maintenance.md +54 -0
- package/docs/api/sdk/mcp-runs.md +71 -0
- package/docs/api/sdk/mcp.md +250 -0
- package/docs/api/sdk/namespaces.md +43 -0
- package/docs/api/sdk/roles.md +183 -0
- package/docs/api/sdk/settings.md +24 -0
- package/docs/api/sdk/tasks.md +120 -0
- package/docs/api/sdk/users.md +196 -0
- package/docs/api/sdk/workflow-sets.md +135 -0
- package/docs/api/sdk/workflows.md +271 -0
- package/docs/api/sdk/yaml-workflows.md +408 -0
- package/docs/events.md +28 -0
- package/docs/sdk.md +177 -0
- package/docs/story.md +157 -0
- package/package.json +3 -2
- package/build/routes/escalations/helpers.d.ts +0 -5
- package/build/routes/resolve.d.ts +0 -9
- package/build/routes/resolve.js +0 -19
- package/build/routes/yaml-workflows/helpers.d.ts +0 -2
- package/build/routes/yaml-workflows/helpers.js +0 -8
- package/dashboard/dist/assets/BotPicker-A6LtzyuO.js +0 -2
- package/dashboard/dist/assets/McpQueryDetailPage-DhqEI180.js +0 -5
- package/dashboard/dist/assets/McpQueryDetailPage-DhqEI180.js.map +0 -1
- package/dashboard/dist/assets/McpQueryPage-CIiVMlqo.js +0 -2
- package/dashboard/dist/assets/McpQueryPage-CIiVMlqo.js.map +0 -1
- package/dashboard/dist/assets/OperatorDashboard-jc0vrgDI.js +0 -2
- package/dashboard/dist/assets/RunAsSelector-CJDnyp93.js +0 -2
- package/dashboard/dist/assets/RunAsSelector-CJDnyp93.js.map +0 -1
- package/dashboard/dist/assets/WorkflowPill-DPKOcbf4.js +0 -2
- package/dashboard/dist/assets/YamlWorkflowsPage-BliAckJ6.js +0 -2
- package/dashboard/dist/assets/YamlWorkflowsPage-BliAckJ6.js.map +0 -1
- package/dashboard/dist/assets/index-BpT-6WgJ.js +0 -2
- package/dashboard/dist/assets/index-D3NyVADW.js.map +0 -1
- package/dashboard/dist/assets/index-D7zYZOnH.js +0 -2
- package/dashboard/dist/assets/index-DOkHXmyf.js +0 -17
- package/dashboard/dist/assets/index-DYyLF-Qb.js.map +0 -1
- package/dashboard/dist/assets/index-Dk2Q51o0.js +0 -2
- package/dashboard/dist/assets/mcp-query-jQJQrs_7.js +0 -2
- package/dashboard/dist/assets/mcp-query-jQJQrs_7.js.map +0 -1
- package/dashboard/dist/assets/vendor-icons-BiIug1SK.js.map +0 -1
- package/dashboard/dist/assets/yaml-workflows-D7JXNqbM.js +0 -2
- package/dashboard/dist/assets/yaml-workflows-D7JXNqbM.js.map +0 -1
- package/docs/img/01-login.png +0 -0
- package/docs/img/02-dashboard-home.png +0 -0
- package/docs/img/03-processes-list.png +0 -0
- package/docs/img/04-escalations-list.png +0 -0
- package/docs/img/05-mcp-servers.png +0 -0
- package/docs/img/06-mcp-pipelines.png +0 -0
- package/docs/img/07-workflows-list.png +0 -0
- package/docs/img/compilation/01-query-submit.png +0 -0
- package/docs/img/compilation/02-mcp-servers.png +0 -0
- package/docs/img/compilation/03-query-completed.png +0 -0
- package/docs/img/compilation/04-wizard-original.png +0 -0
- package/docs/img/compilation/05-wizard-timeline.png +0 -0
- package/docs/img/compilation/06-wizard-profile.png +0 -0
- package/docs/img/compilation/07-wizard-deploy.png +0 -0
- package/docs/img/compilation/08-wizard-test-modal.png +0 -0
- package/docs/img/compilation/09-wizard-test-compare.png +0 -0
- package/docs/img/compilation/10-wizard-verify.png +0 -0
- /package/docs/api/{dba.md → http/dba.md} +0 -0
- /package/docs/api/{escalations.md → http/escalations.md} +0 -0
- /package/docs/api/{exports.md → http/exports.md} +0 -0
- /package/docs/api/{maintenance.md → http/maintenance.md} +0 -0
- /package/docs/api/{mcp-runs.md → http/mcp-runs.md} +0 -0
- /package/docs/api/{mcp-servers.md → http/mcp-servers.md} +0 -0
- /package/docs/api/{namespaces.md → http/namespaces.md} +0 -0
- /package/docs/api/{roles.md → http/roles.md} +0 -0
- /package/docs/api/{service-accounts.md → http/service-accounts.md} +0 -0
- /package/docs/api/{settings.md → http/settings.md} +0 -0
- /package/docs/api/{tasks.md → http/tasks.md} +0 -0
- /package/docs/api/{users.md → http/users.md} +0 -0
- /package/docs/api/{workflows.md → http/workflows.md} +0 -0
- /package/docs/api/{yaml-workflows.md → http/yaml-workflows.md} +0 -0
|
@@ -1,15 +1,20 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
// ─── YAML workflow CRUD ─────────────────────────────────────────────────────
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.FIND_BY_TAGS_ALL = exports.FIND_BY_TAGS_ANY = exports.GET_CRON_SCHEDULED_WORKFLOWS = exports.CLEAR_CRON_SCHEDULE = exports.UPDATE_CRON_SCHEDULE = exports.UPDATE_STATUS_SUFFIX = exports.UPDATE_STATUS_BASE = exports.GET_VERSION_SNAPSHOT = exports.DISCOVER_WORKFLOWS = exports.LIST_VERSIONS = exports.COUNT_VERSIONS = exports.CREATE_VERSION_SNAPSHOT = exports.MARK_APP_ID_CONTENT_DEPLOYED = exports.MARK_CONTENT_DEPLOYED = exports.GET_DISTINCT_APP_IDS = exports.LIST_BY_APP_ID = exports.GET_ACTIVE_YAML_WORKFLOWS = exports.DELETE_YAML_WORKFLOW = exports.UPDATE_YAML_WORKFLOW_VERSION = exports.GET_YAML_WORKFLOW_BY_NAME = exports.GET_YAML_WORKFLOW = exports.CREATE_YAML_WORKFLOW = void 0;
|
|
4
|
+
exports.FIND_BY_TAGS_ALL = exports.FIND_BY_TAGS_ANY = exports.GET_CRON_SCHEDULED_WORKFLOWS = exports.CLEAR_CRON_SCHEDULE = exports.UPDATE_CRON_SCHEDULE = exports.UPDATE_STATUS_SUFFIX = exports.UPDATE_STATUS_BASE = exports.GET_VERSION_SNAPSHOT = exports.DISCOVER_WORKFLOWS = exports.LIST_VERSIONS = exports.COUNT_VERSIONS = exports.CREATE_VERSION_SNAPSHOT = exports.MARK_APP_ID_CONTENT_DEPLOYED = exports.MARK_CONTENT_DEPLOYED = exports.GET_DISTINCT_APP_IDS = exports.LIST_BY_APP_ID = exports.GET_ACTIVE_YAML_WORKFLOWS = exports.DELETE_YAML_WORKFLOW = exports.UPDATE_YAML_WORKFLOW_VERSION = exports.GET_YAML_WORKFLOW_BY_NAME = exports.GET_YAML_WORKFLOW = exports.CHECK_TOPIC_UNIQUE = exports.CREATE_YAML_WORKFLOW = void 0;
|
|
5
5
|
exports.CREATE_YAML_WORKFLOW = `
|
|
6
6
|
INSERT INTO lt_yaml_workflows
|
|
7
7
|
(name, description, app_id, app_version, source_workflow_id,
|
|
8
8
|
source_workflow_type, yaml_content, graph_topic,
|
|
9
9
|
input_schema, output_schema, activity_manifest, input_field_meta,
|
|
10
|
-
original_prompt, category, tags, metadata, content_version
|
|
11
|
-
|
|
10
|
+
original_prompt, category, tags, metadata, content_version,
|
|
11
|
+
set_id, set_role, set_build_order)
|
|
12
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, 1, $17, $18, $19)
|
|
12
13
|
RETURNING *`;
|
|
14
|
+
exports.CHECK_TOPIC_UNIQUE = `
|
|
15
|
+
SELECT id, name FROM lt_yaml_workflows
|
|
16
|
+
WHERE app_id = $1 AND graph_topic = $2 AND status != 'archived'
|
|
17
|
+
LIMIT 1`;
|
|
13
18
|
exports.GET_YAML_WORKFLOW = `
|
|
14
19
|
SELECT * FROM lt_yaml_workflows WHERE id = $1`;
|
|
15
20
|
exports.GET_YAML_WORKFLOW_BY_NAME = `
|
|
@@ -24,6 +24,9 @@ export interface CreateYamlWorkflowInput {
|
|
|
24
24
|
category?: string;
|
|
25
25
|
tags?: string[];
|
|
26
26
|
metadata?: Record<string, unknown>;
|
|
27
|
+
set_id?: string;
|
|
28
|
+
set_role?: 'leaf' | 'composition' | 'router';
|
|
29
|
+
set_build_order?: number;
|
|
27
30
|
}
|
|
28
31
|
/** Mutable state accumulated while building the YAML DAG. */
|
|
29
32
|
export interface DagBuilder {
|
|
@@ -47,6 +47,8 @@ function compactForLlm(input) {
|
|
|
47
47
|
*/
|
|
48
48
|
function buildLlmCallback(activity) {
|
|
49
49
|
return async (data) => {
|
|
50
|
+
const wfName = data.data?.workflowName || activity.workflow_name || activity.activity_id;
|
|
51
|
+
logger_1.loggerRegistry.debug(`[yaml-workflow:worker] entering llm wf=${wfName} argKeys=[${Object.keys(data.data || {}).join(',')}]`);
|
|
50
52
|
const rawInput = (data.data || {});
|
|
51
53
|
const input = compactForLlm(rawInput);
|
|
52
54
|
const template = activity.prompt_template || '';
|
|
@@ -98,7 +100,7 @@ function buildLlmCallback(activity) {
|
|
|
98
100
|
catch {
|
|
99
101
|
result = { response: content };
|
|
100
102
|
}
|
|
101
|
-
logger_1.loggerRegistry.
|
|
103
|
+
logger_1.loggerRegistry.debug(`[yaml-workflow:worker] leaving llm wf=${wfName} resultType=${typeof result}`);
|
|
102
104
|
return {
|
|
103
105
|
metadata: { ...data.metadata },
|
|
104
106
|
data: result,
|
|
@@ -154,9 +156,12 @@ function buildTransformCallback(activity) {
|
|
|
154
156
|
if (!spec)
|
|
155
157
|
throw new Error(`Transform activity ${activity.activity_id} missing transform_spec`);
|
|
156
158
|
return async (data) => {
|
|
159
|
+
const wfName = data.data?.workflowName || activity.workflow_name || activity.activity_id;
|
|
160
|
+
logger_1.loggerRegistry.debug(`[yaml-workflow:worker] entering transform wf=${wfName} source=${spec.sourceField} target=${spec.targetField} argKeys=[${Object.keys(data.data || {}).join(',')}]`);
|
|
157
161
|
const input = (data.data || {});
|
|
158
162
|
const sourceData = input[spec.sourceField];
|
|
159
163
|
if (!Array.isArray(sourceData)) {
|
|
164
|
+
logger_1.loggerRegistry.debug(`[yaml-workflow:worker] leaving transform wf=${wfName} passthrough (source not array)`);
|
|
160
165
|
// Pass through non-array data unchanged
|
|
161
166
|
return {
|
|
162
167
|
metadata: { ...data.metadata },
|
|
@@ -194,6 +199,7 @@ function buildTransformCallback(activity) {
|
|
|
194
199
|
});
|
|
195
200
|
// Return reshaped data alongside any other input fields (session handles, etc.)
|
|
196
201
|
const result = { ...input, [spec.targetField]: reshaped };
|
|
202
|
+
logger_1.loggerRegistry.debug(`[yaml-workflow:worker] leaving transform wf=${wfName} reshapedCount=${reshaped.length} resultKeys=[${Object.keys(result).join(',')}]`);
|
|
197
203
|
return {
|
|
198
204
|
metadata: { ...data.metadata },
|
|
199
205
|
data: result,
|
|
@@ -125,12 +125,15 @@ async function registerWorkersForWorkflow(workflow) {
|
|
|
125
125
|
connection: (0, db_1.getConnection)(),
|
|
126
126
|
retry: defaultRetry,
|
|
127
127
|
callback: wrap(async (data) => {
|
|
128
|
+
const wfName = data.data?.workflowName || activity.workflow_name || toolName;
|
|
129
|
+
logger_1.loggerRegistry.debug(`[yaml-workflow:worker] entering db/${toolName} wf=${wfName} argKeys=[${Object.keys(data.data || {}).join(',')}]`);
|
|
128
130
|
const args = (data.data || {});
|
|
129
131
|
let mergedArgs = toolArgs ? { ...toolArgs, ...args } : args;
|
|
130
132
|
delete mergedArgs._scope;
|
|
131
133
|
delete mergedArgs.workflowName;
|
|
132
134
|
mergedArgs = await (0, ephemeral_1.exchangeTokensInArgs)(mergedArgs);
|
|
133
135
|
const result = await mcpClient.callServerTool(dbServerId, toolName, mergedArgs);
|
|
136
|
+
logger_1.loggerRegistry.debug(`[yaml-workflow:worker] leaving db/${toolName} wf=${wfName} resultKeys=[${Object.keys(result || {}).join(',')}]`);
|
|
134
137
|
return { metadata: { ...data.metadata }, data: result };
|
|
135
138
|
}),
|
|
136
139
|
});
|
|
@@ -158,6 +161,8 @@ async function registerWorkersForWorkflow(workflow) {
|
|
|
158
161
|
connection: (0, db_1.getConnection)(),
|
|
159
162
|
retry: defaultRetry,
|
|
160
163
|
callback: wrap(async (data) => {
|
|
164
|
+
const wfName = data.data?.workflowName || activity.workflow_name || toolName;
|
|
165
|
+
logger_1.loggerRegistry.debug(`[yaml-workflow:worker] entering mcp/${toolName} wf=${wfName} server=${serverId} argKeys=[${Object.keys(data.data || {}).join(',')}]`);
|
|
161
166
|
const args = (data.data || {});
|
|
162
167
|
// Start from stored defaults, then strip any wired keys that
|
|
163
168
|
// didn't arrive (upstream failure) so stale defaults don't leak.
|
|
@@ -173,6 +178,7 @@ async function registerWorkersForWorkflow(workflow) {
|
|
|
173
178
|
mergedArgs[key] = value;
|
|
174
179
|
}
|
|
175
180
|
}
|
|
181
|
+
logger_1.loggerRegistry.debug(`[yaml-workflow:worker] merged mcp/${toolName} wf=${wfName} mergedKeys=[${Object.keys(mergedArgs).join(',')}]`);
|
|
176
182
|
// For escalate_and_wait: inject YAML signal routing so the MCP tool
|
|
177
183
|
// stores engine:'yaml' + hookTopic + jobId in the escalation metadata
|
|
178
184
|
if (yamlHookTopic) {
|
|
@@ -195,6 +201,7 @@ async function registerWorkersForWorkflow(workflow) {
|
|
|
195
201
|
if (result == null) {
|
|
196
202
|
logger_1.loggerRegistry.warn(`[yaml-workflow:worker] ${toolName} returned null/undefined`);
|
|
197
203
|
}
|
|
204
|
+
logger_1.loggerRegistry.debug(`[yaml-workflow:worker] leaving mcp/${toolName} wf=${wfName} resultKeys=[${Object.keys(result || {}).join(',')}]`);
|
|
198
205
|
return { metadata: { ...data.metadata }, data: result };
|
|
199
206
|
}),
|
|
200
207
|
});
|
package/build/start/adapters.js
CHANGED
|
@@ -8,6 +8,7 @@ const honeycomb_1 = require("../lib/telemetry/honeycomb");
|
|
|
8
8
|
const events_1 = require("../lib/events");
|
|
9
9
|
const nats_1 = require("../lib/events/nats");
|
|
10
10
|
const socketio_1 = require("../lib/events/socketio");
|
|
11
|
+
const callback_1 = require("../lib/events/callback");
|
|
11
12
|
const maintenance_1 = require("../services/maintenance");
|
|
12
13
|
const maintenance_2 = require("../modules/maintenance");
|
|
13
14
|
const mcp_1 = require("../services/mcp");
|
|
@@ -47,6 +48,9 @@ function registerAdapters(startConfig) {
|
|
|
47
48
|
}
|
|
48
49
|
events_1.eventRegistry.register(new socketio_1.SocketIOEventAdapter());
|
|
49
50
|
}
|
|
51
|
+
// Always register the callback adapter for SDK event subscriptions.
|
|
52
|
+
// Zero-cost when no listeners are registered.
|
|
53
|
+
events_1.eventRegistry.register(new callback_1.CallbackEventAdapter());
|
|
50
54
|
// Maintenance
|
|
51
55
|
if (startConfig.maintenance === false) {
|
|
52
56
|
// Disabled
|
package/build/system/index.js
CHANGED
|
@@ -83,6 +83,12 @@ function getSystemWorkers() {
|
|
|
83
83
|
workers.push({ taskQueue: 'long-tail-system', workflow: mcpWorkflowBuilder });
|
|
84
84
|
}
|
|
85
85
|
catch { /* not available */ }
|
|
86
|
+
// ── Workflow planner (multi-workflow plan mode) ──
|
|
87
|
+
try {
|
|
88
|
+
const { mcpWorkflowPlanner } = require('./workflows/mcp-workflow-planner');
|
|
89
|
+
workers.push({ taskQueue: 'long-tail-system', workflow: mcpWorkflowPlanner });
|
|
90
|
+
}
|
|
91
|
+
catch { /* not available */ }
|
|
86
92
|
}
|
|
87
93
|
return workers;
|
|
88
94
|
}
|
|
@@ -41,7 +41,7 @@ const knowledge = __importStar(require("../activities/knowledge"));
|
|
|
41
41
|
const storeSchema = zod_1.z.object({
|
|
42
42
|
domain: zod_1.z.string().describe('Knowledge domain (namespace)'),
|
|
43
43
|
key: zod_1.z.string().describe('Unique key within domain'),
|
|
44
|
-
data: zod_1.z.record(zod_1.z.any()).describe('JSONB payload to store'),
|
|
44
|
+
data: zod_1.z.record(zod_1.z.any()).describe('JSONB object payload to store (must be an object, not a string — wrap text as { "description": "..." })'),
|
|
45
45
|
tags: zod_1.z.array(zod_1.z.string()).optional().describe('Categorization tags'),
|
|
46
46
|
});
|
|
47
47
|
const getSchema = zod_1.z.object({
|
|
@@ -183,7 +183,8 @@ exports.SEED_MCP_SERVERS = [
|
|
|
183
183
|
tool_manifest: tool_manifests_knowledge_1.KNOWLEDGE_TOOLS,
|
|
184
184
|
metadata: { builtin: true, category: 'knowledge' },
|
|
185
185
|
tags: ['knowledge', 'memory', 'state', 'storage'],
|
|
186
|
-
compile_hints: 'store_knowledge arguments: domain (string), key (string), data (
|
|
186
|
+
compile_hints: 'store_knowledge arguments: domain (string), key (string), data (object — MUST be a JSON object, never a string), tags (optional string[]). ' +
|
|
187
|
+
'The data field is a JSONB object. When storing text content, wrap it: { "description": "the text" }. NEVER pass a bare string as data. ' +
|
|
187
188
|
'store_knowledge upserts by domain+key — it merges data if the entry exists. ' +
|
|
188
189
|
'Use a consistent domain name across related workflows to build shared context. ' +
|
|
189
190
|
'search_knowledge uses JSONB containment (@>) — the query object must be a subset of the stored data. ' +
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { loadBuilderTools } from './tool-loader';
|
|
1
|
+
export { loadBuilderTools, loadReferenceSection } from './tool-loader';
|
|
2
2
|
export { callBuilderLLM } from './llm';
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.callBuilderLLM = exports.loadBuilderTools = void 0;
|
|
3
|
+
exports.callBuilderLLM = exports.loadReferenceSection = exports.loadBuilderTools = void 0;
|
|
4
4
|
var tool_loader_1 = require("./tool-loader");
|
|
5
5
|
Object.defineProperty(exports, "loadBuilderTools", { enumerable: true, get: function () { return tool_loader_1.loadBuilderTools; } });
|
|
6
|
+
Object.defineProperty(exports, "loadReferenceSection", { enumerable: true, get: function () { return tool_loader_1.loadReferenceSection; } });
|
|
6
7
|
var llm_1 = require("./llm");
|
|
7
8
|
Object.defineProperty(exports, "callBuilderLLM", { enumerable: true, get: function () { return llm_1.callBuilderLLM; } });
|
|
@@ -3,3 +3,9 @@ export declare function loadBuilderTools(tags?: string[]): Promise<{
|
|
|
3
3
|
inventory: string;
|
|
4
4
|
strategy: string;
|
|
5
5
|
}>;
|
|
6
|
+
/**
|
|
7
|
+
* Load a specific section from the activity-types reference file.
|
|
8
|
+
* Returns the markdown for the requested activity type (await, signal, interrupt).
|
|
9
|
+
* Returns empty string if the section or file is not found.
|
|
10
|
+
*/
|
|
11
|
+
export declare function loadReferenceSection(section: 'await' | 'signal' | 'interrupt'): Promise<string>;
|
|
@@ -1,8 +1,34 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.loadBuilderTools = loadBuilderTools;
|
|
4
|
+
exports.loadReferenceSection = loadReferenceSection;
|
|
5
|
+
const promises_1 = require("fs/promises");
|
|
6
|
+
const path_1 = require("path");
|
|
4
7
|
const tool_loader_1 = require("../../shared/tool-loader");
|
|
5
8
|
const caches_1 = require("./caches");
|
|
6
9
|
async function loadBuilderTools(tags) {
|
|
7
10
|
return (0, tool_loader_1.loadToolsFromServers)(tags, { toolServerMap: caches_1.toolServerMap, toolDefCache: caches_1.toolDefCache }, { logPrefix: 'workflowBuilder' });
|
|
8
11
|
}
|
|
12
|
+
/**
|
|
13
|
+
* Load a specific section from the activity-types reference file.
|
|
14
|
+
* Returns the markdown for the requested activity type (await, signal, interrupt).
|
|
15
|
+
* Returns empty string if the section or file is not found.
|
|
16
|
+
*/
|
|
17
|
+
async function loadReferenceSection(section) {
|
|
18
|
+
try {
|
|
19
|
+
const refPath = (0, path_1.join)(__dirname, '..', 'reference', 'activity-types.md');
|
|
20
|
+
const content = await (0, promises_1.readFile)(refPath, 'utf-8');
|
|
21
|
+
// Extract the section between ## <name> and the next ## or end of file
|
|
22
|
+
const sectionHeader = `## ${section}`;
|
|
23
|
+
const startIdx = content.indexOf(sectionHeader);
|
|
24
|
+
if (startIdx === -1)
|
|
25
|
+
return '';
|
|
26
|
+
const afterHeader = content.indexOf('\n', startIdx);
|
|
27
|
+
const nextSection = content.indexOf('\n## ', afterHeader + 1);
|
|
28
|
+
const endIdx = nextSection === -1 ? content.length : nextSection;
|
|
29
|
+
return content.slice(startIdx, endIdx).trim();
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return '';
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -37,7 +37,7 @@ exports.mcpWorkflowBuilder = mcpWorkflowBuilder;
|
|
|
37
37
|
const hotmesh_1 = require("@hotmeshio/hotmesh");
|
|
38
38
|
const activities = __importStar(require("./activities"));
|
|
39
39
|
const prompts_1 = require("./prompts");
|
|
40
|
-
const { loadBuilderTools, callBuilderLLM, } = hotmesh_1.Durable.workflow.proxyActivities({
|
|
40
|
+
const { loadBuilderTools, loadReferenceSection, callBuilderLLM, } = hotmesh_1.Durable.workflow.proxyActivities({
|
|
41
41
|
activities,
|
|
42
42
|
retry: {
|
|
43
43
|
maximumAttempts: 3,
|
|
@@ -94,6 +94,7 @@ async function mcpWorkflowBuilder(envelope) {
|
|
|
94
94
|
const priorYaml = envelope.data?.prior_yaml;
|
|
95
95
|
const answers = envelope.data?.answers;
|
|
96
96
|
const priorQuestions = envelope.data?.prior_questions;
|
|
97
|
+
const compositionContext = envelope.data?.composition_context;
|
|
97
98
|
if (!prompt) {
|
|
98
99
|
return {
|
|
99
100
|
type: 'return',
|
|
@@ -111,10 +112,33 @@ async function mcpWorkflowBuilder(envelope) {
|
|
|
111
112
|
raw.strategy ? `${raw.strategy}\n` : '',
|
|
112
113
|
`## Available MCP Servers & Tools\n\n${raw.inventory}`,
|
|
113
114
|
].filter(Boolean).join('\n');
|
|
115
|
+
// 3. Load composition references if this workflow is part of a plan
|
|
116
|
+
const compositionSections = [];
|
|
117
|
+
if (compositionContext) {
|
|
118
|
+
if (compositionContext.requires_await) {
|
|
119
|
+
const awaitRef = await loadReferenceSection('await');
|
|
120
|
+
if (awaitRef)
|
|
121
|
+
compositionSections.push(awaitRef);
|
|
122
|
+
}
|
|
123
|
+
if (compositionContext.requires_signal) {
|
|
124
|
+
const signalRef = await loadReferenceSection('signal');
|
|
125
|
+
if (signalRef)
|
|
126
|
+
compositionSections.push(signalRef);
|
|
127
|
+
}
|
|
128
|
+
if (compositionContext.sibling_schemas?.length) {
|
|
129
|
+
const siblings = compositionContext.sibling_schemas
|
|
130
|
+
.map(s => `- **${s.name}** (topic: \`${s.graph_topic}\`)\n Input: \`${JSON.stringify(s.input_schema)}\`\n Output: \`${JSON.stringify(s.output_schema)}\``)
|
|
131
|
+
.join('\n');
|
|
132
|
+
compositionSections.push(`## Sibling Workflows in This Plan\n\nThis workflow is part of a multi-workflow set. The following sibling workflows exist in the same namespace and can be invoked using \`type: await\` activities:\n\n${siblings}`);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
const fullInventory = compositionSections.length
|
|
136
|
+
? `${serverSection}\n\n${compositionSections.join('\n\n')}`
|
|
137
|
+
: serverSection;
|
|
114
138
|
const messages = [
|
|
115
139
|
{
|
|
116
140
|
role: 'system',
|
|
117
|
-
content: (0, prompts_1.BUILDER_SYSTEM_PROMPT)(
|
|
141
|
+
content: (0, prompts_1.BUILDER_SYSTEM_PROMPT)(fullInventory),
|
|
118
142
|
},
|
|
119
143
|
];
|
|
120
144
|
// If refining a prior attempt, inject context
|
|
@@ -45,7 +45,7 @@ app:
|
|
|
45
45
|
### trigger
|
|
46
46
|
Entry point. Receives user input. Always the first activity.
|
|
47
47
|
\`\`\`yaml
|
|
48
|
-
|
|
48
|
+
trigger_x8kf:
|
|
49
49
|
title: Trigger
|
|
50
50
|
type: trigger
|
|
51
51
|
output:
|
|
@@ -54,9 +54,9 @@ my_trigger:
|
|
|
54
54
|
\`\`\`
|
|
55
55
|
|
|
56
56
|
### worker
|
|
57
|
-
Executes an MCP tool. Receives data via input.maps, produces output.
|
|
57
|
+
Executes an MCP tool. Receives data via input.maps, produces output. Same suffix as the trigger.
|
|
58
58
|
\`\`\`yaml
|
|
59
|
-
|
|
59
|
+
capture_x8kf:
|
|
60
60
|
title: Capture Page
|
|
61
61
|
type: worker
|
|
62
62
|
topic: <same as subscribes>
|
|
@@ -64,10 +64,10 @@ my_worker:
|
|
|
64
64
|
schema:
|
|
65
65
|
type: object
|
|
66
66
|
maps:
|
|
67
|
-
url: '{
|
|
67
|
+
url: '{trigger_x8kf.output.data.url}'
|
|
68
68
|
screenshot_path:
|
|
69
69
|
'@pipe':
|
|
70
|
-
- ['{
|
|
70
|
+
- ['{trigger_x8kf.output.data.slug}', '.png']
|
|
71
71
|
- ['{@string.concat}']
|
|
72
72
|
workflowName: capture_page
|
|
73
73
|
output:
|
|
@@ -76,10 +76,14 @@ my_worker:
|
|
|
76
76
|
\`\`\`
|
|
77
77
|
|
|
78
78
|
### hook
|
|
79
|
-
Durable pause point
|
|
79
|
+
Durable pause point with three modes:
|
|
80
|
+
- **Web hook**: Pauses until an external signal arrives. Define \`hook: { type: object, properties: {...} }\` for the expected signal schema. Receives signal data via \`{$self.hook.data.*}\`. Requires a matching entry in the graph-level \`hooks:\` section.
|
|
81
|
+
- **Sleep**: Pauses for a duration. \`sleep: 5\` pauses 5 seconds. Supports @pipe expressions for dynamic delays.
|
|
82
|
+
- **Cycle pivot**: When \`cycle: true\`, becomes an iteration anchor that a cycle activity can loop back to.
|
|
83
|
+
- **Passthrough**: No hook/sleep config — acts as a data-mapping convergence point, executes immediately.
|
|
80
84
|
|
|
81
85
|
### cycle
|
|
82
|
-
Loop back to a hook ancestor
|
|
86
|
+
Loop back to a hook ancestor marked \`cycle: true\`. Each iteration runs in isolated state, but \`job.maps\` accumulates across iterations.
|
|
83
87
|
|
|
84
88
|
## Data Mapping Rules
|
|
85
89
|
|
|
@@ -88,14 +92,56 @@ Loop back to a hook ancestor for iteration patterns.
|
|
|
88
92
|
field_name: '{sourceActivity.output.data.fieldName}'
|
|
89
93
|
\`\`\`
|
|
90
94
|
|
|
91
|
-
### @pipe
|
|
92
|
-
|
|
95
|
+
### @pipe — Reverse Polish Notation (operands THEN operator)
|
|
96
|
+
|
|
97
|
+
@pipe uses **stack-machine / RPN evaluation**: each row is evaluated top-to-bottom. A row is either OPERANDS (data for the next function) or an OPERATOR (a function that consumes the row above it). The rule is simple and absolute:
|
|
98
|
+
|
|
99
|
+
> **ALL operands for a function must appear on the single row ABOVE the function row.**
|
|
100
|
+
|
|
101
|
+
A function row contains ONLY the function reference: \`['{@string.substring}']\`. It receives its arguments from the row immediately above it. The first element on the operands row is typically a dynamic reference that resolves at runtime; the remaining elements are literal values.
|
|
102
|
+
|
|
103
|
+
#### Simple pipe (no extra args):
|
|
93
104
|
\`\`\`yaml
|
|
94
105
|
field_name:
|
|
95
106
|
'@pipe':
|
|
96
|
-
- ['{source.output.data.value}', '-suffix']
|
|
97
|
-
- ['{@string.concat}']
|
|
98
|
-
- ['{@string.toLowerCase}']
|
|
107
|
+
- ['{source.output.data.value}', '-suffix'] # operands: value, suffix
|
|
108
|
+
- ['{@string.concat}'] # operator: concat(value, suffix) → "hello-suffix"
|
|
109
|
+
- ['{@string.toLowerCase}'] # operator: toLowerCase("hello-suffix")
|
|
110
|
+
\`\`\`
|
|
111
|
+
When a function takes only one argument (the result of the prior row), it needs no separate operands row — it just consumes what's above.
|
|
112
|
+
|
|
113
|
+
#### Multi-arg function (THIS IS THE PATTERN LLMs GET WRONG):
|
|
114
|
+
\`\`\`yaml
|
|
115
|
+
date_substring:
|
|
116
|
+
'@pipe':
|
|
117
|
+
- ['{@date.now}'] # operator: date.now() → 1713528000000
|
|
118
|
+
- ['{@date.toISOString}', 0, 10] # operands: [isoString, 0, 10] for substring
|
|
119
|
+
- ['{@string.substring}'] # operator: substring(isoString, 0, 10) → "2026-04-19"
|
|
120
|
+
\`\`\`
|
|
121
|
+
Row 2 is the OPERANDS row for substring. It contains THREE values:
|
|
122
|
+
1. \`{@date.toISOString}\` — resolves dynamically (converts epoch → "2026-04-19T12:00:00.000Z")
|
|
123
|
+
2. \`0\` — start index (literal)
|
|
124
|
+
3. \`10\` — end index (literal)
|
|
125
|
+
|
|
126
|
+
Row 3 is the OPERATOR row: \`substring\` consumes all three values from row 2.
|
|
127
|
+
|
|
128
|
+
**COMMON MISTAKE** (NEVER DO THIS):
|
|
129
|
+
\`\`\`yaml
|
|
130
|
+
# WRONG — puts args on the operator row instead of the operands row above it
|
|
131
|
+
- ['{@date.toISOString}']
|
|
132
|
+
- ['{@string.substring}', 0, 10] # ← BROKEN: 0, 10 must be on the row ABOVE
|
|
133
|
+
\`\`\`
|
|
134
|
+
\`\`\`yaml
|
|
135
|
+
# ALSO WRONG — splits operands across two rows
|
|
136
|
+
- ['{@date.toISOString}']
|
|
137
|
+
- [0, 10] # ← BROKEN: operands separated from the dynamic value
|
|
138
|
+
- ['{@string.substring}']
|
|
139
|
+
\`\`\`
|
|
140
|
+
The ONLY correct form: all operands together on ONE row, operator alone on the NEXT row.
|
|
141
|
+
|
|
142
|
+
**PREFERRED for dates**: Use \`{@date.yyyymmdd}\` which returns "YYYY-MM-DD" directly — no pipe needed:
|
|
143
|
+
\`\`\`yaml
|
|
144
|
+
today: '{@date.yyyymmdd}'
|
|
99
145
|
\`\`\`
|
|
100
146
|
|
|
101
147
|
### Nested @pipe (fan-out/fan-in):
|
|
@@ -104,7 +150,7 @@ Sub-pipes must be ROW-LEVEL entries in the parent pipe array — each is a separ
|
|
|
104
150
|
dated_key:
|
|
105
151
|
'@pipe':
|
|
106
152
|
- '@pipe':
|
|
107
|
-
- ['{
|
|
153
|
+
- ['{trigger_x8kf.output.data.slug}', '-']
|
|
108
154
|
- ['{@string.concat}']
|
|
109
155
|
- '@pipe':
|
|
110
156
|
- ['{@date.now}']
|
|
@@ -112,7 +158,7 @@ dated_key:
|
|
|
112
158
|
- ['{@string.substring}']
|
|
113
159
|
- ['{@string.concat}']
|
|
114
160
|
\`\`\`
|
|
115
|
-
This produces \`my-slug-2026-04-19\`.
|
|
161
|
+
This produces \`my-slug-2026-04-19\`. Sub-pipe 1: \`slug + "-"\`. Sub-pipe 2: today as YYYY-MM-DD (RPN: operands then operator). Final row: concat all sub-pipe results.
|
|
116
162
|
|
|
117
163
|
CRITICAL RULES for nested @pipe:
|
|
118
164
|
1. Never put a nested \`@pipe\` object INSIDE an array row. Each sub-pipe must be its own row in the parent.
|
|
@@ -122,7 +168,7 @@ CRITICAL RULES for nested @pipe:
|
|
|
122
168
|
path:
|
|
123
169
|
'@pipe':
|
|
124
170
|
- '@pipe':
|
|
125
|
-
- ['{
|
|
171
|
+
- ['{trigger_x8kf.output.data.domain}', '/', '{trigger_x8kf.output.data.key}', '/']
|
|
126
172
|
- ['{@string.concat}']
|
|
127
173
|
- '@pipe':
|
|
128
174
|
- ['{@date.now}']
|
|
@@ -137,14 +183,16 @@ This resolves: sub-pipe1 → "research/google/", sub-pipe2 → "2026-04-19", sub
|
|
|
137
183
|
IMPORTANT: A bare array like \`['.png']\` as a row after sub-pipes will CRASH — HotMesh interprets it as a function call. Always wrap static values in \`'@pipe': - [value]\`.
|
|
138
184
|
|
|
139
185
|
### Available @pipe operators (every JS method is exposed):
|
|
140
|
-
- **@string**: charAt, concat, includes, indexOf, replace, slice, split, startsWith, substring, toLowerCase, toUpperCase, trim
|
|
141
|
-
- **@date**: now, toISOString, toDateString, getFullYear, getMonth, getDate, getHours, getMinutes, getSeconds, fromISOString, parse (full JS Date API)
|
|
142
|
-
- **@math**: add, subtract, multiply, divide
|
|
143
|
-
- **@number**: gte, lte,
|
|
144
|
-
- **@array**: get, length
|
|
145
|
-
- **@object**: get, keys, values
|
|
146
|
-
- **@conditional**: ternary, less_than,
|
|
186
|
+
- **@string**: charAt, concat, endsWith, includes, indexOf, lastIndexOf, padEnd, padStart, repeat, replace, search, slice, split, startsWith, substring, toLowerCase, toUpperCase, trim, trimEnd, trimStart
|
|
187
|
+
- **@date**: now, toISOString, toDateString, yyyymmdd (returns "YYYY-MM-DD" directly — preferred for date strings), getFullYear, getMonth, getDate, getDay, getHours, getMinutes, getSeconds, getTime, fromISOString, parse, UTC, toLocaleDateString, setFullYear, setMonth, setDate (full JS Date API)
|
|
188
|
+
- **@math**: add, subtract, multiply, divide, abs, ceil, floor, round, trunc, pow, sqrt, max, min, random
|
|
189
|
+
- **@number**: gt, gte, lt, lte, isFinite, isInteger, isEven, isOdd, isNaN, parseFloat, parseInt, toFixed, toExponential, toPrecision
|
|
190
|
+
- **@array**: get, length, concat, indexOf, join, lastIndexOf, pop, push, reverse, shift, slice, sort, splice, unshift
|
|
191
|
+
- **@object**: get, set, create, keys, values, entries, fromEntries, assign, hasOwnProperty, freeze
|
|
192
|
+
- **@conditional**: ternary, equality, strict_equality, inequality, strict_inequality, greater_than, less_than, greater_than_or_equal, less_than_or_equal, nullish
|
|
147
193
|
- **@json**: parse, stringify
|
|
194
|
+
- **@logical**: and, or
|
|
195
|
+
- **@bitwise**: and, or, xor, leftShift, rightShift
|
|
148
196
|
|
|
149
197
|
### Three mapping directions per activity:
|
|
150
198
|
- **input.maps**: Wire data INTO this activity from trigger or upstream activities
|
|
@@ -155,22 +203,41 @@ IMPORTANT: A bare array like \`['.png']\` as a row after sub-pipes will CRASH
|
|
|
155
203
|
|
|
156
204
|
1. **Trigger first**: Every workflow starts with a trigger activity
|
|
157
205
|
2. **Worker per tool**: Each MCP tool call is a worker activity
|
|
158
|
-
3. **
|
|
159
|
-
4. **
|
|
160
|
-
5. **
|
|
161
|
-
6. **
|
|
162
|
-
7. **
|
|
163
|
-
8. **
|
|
164
|
-
|
|
165
|
-
|
|
206
|
+
3. **Collision-proof activity IDs**: Multiple workflows share the same app namespace. Activity IDs MUST be globally unique within the app. Use a descriptive name with a shared 4-char random suffix appended to every activity in the flow: \`trigger_x8kf\`, \`capture_x8kf\`, \`analyze_x8kf\`, \`store_x8kf\`. The suffix is the same for all activities in one workflow but unique across workflows. NEVER use bare names like \`trigger\`, \`capture\`, \`analyze\` — they WILL collide with other workflows in the same app.
|
|
207
|
+
4. **workflowName**: Every worker MUST have \`workflowName: '<tool_name>'\` in its input.maps — this routes to the correct MCP tool handler
|
|
208
|
+
5. **_scope threading**: Every worker MUST have \`_scope: '{trigger_x8kf.output.data._scope}'\` (using YOUR trigger's ID) for IAM context
|
|
209
|
+
6. **Wire outputs forward**: Use \`{prevActivity.output.data.fieldName}\` to pass data between steps
|
|
210
|
+
7. **Use @pipe for transforms**: When a value needs runtime computation (date stamp, string concat, slugify), use @pipe — never hardcode computed values
|
|
211
|
+
8. **Simple fields stay simple**: If a field just passes a trigger value through (domain, key, url), use a plain reference like \`'{trigger_x8kf.output.data.domain}'\` — NEVER wrap it in @pipe. Only use @pipe when actual transformation is needed.
|
|
212
|
+
9. **File extensions**: Screenshot paths MUST include .png extension. Use @pipe concat if deriving from a slug
|
|
213
|
+
10. **job.maps on last activity**: The final activity should have job.maps to promote output fields to the workflow result
|
|
214
|
+
11. **Linear transitions**: Chain activities with transitions unless branching or iteration is needed
|
|
215
|
+
12. **Conditional transitions**: For branching, use multi-target transitions with conditions:
|
|
216
|
+
\`\`\`yaml
|
|
217
|
+
transitions:
|
|
218
|
+
check_x8kf:
|
|
219
|
+
- to: handle_error_x8kf
|
|
220
|
+
conditions:
|
|
221
|
+
code: 500
|
|
222
|
+
- to: proceed_x8kf
|
|
223
|
+
\`\`\`
|
|
224
|
+
Conditions can match on \`code\` (HTTP status) or \`match\` (field comparisons). The first matching condition wins; the last entry (no conditions) is the default.
|
|
225
|
+
13. **Trigger stats for idempotency**: Use \`stats.id\` and \`stats.key\` on the trigger when the workflow needs custom job IDs or indexed lookups:
|
|
226
|
+
\`\`\`yaml
|
|
227
|
+
trigger_x8kf:
|
|
228
|
+
type: trigger
|
|
229
|
+
stats:
|
|
230
|
+
id: '{$self.input.data.workflowId}'
|
|
231
|
+
key: '{$self.input.data.entityId}'
|
|
232
|
+
\`\`\`
|
|
166
233
|
|
|
167
234
|
## Activity Manifest
|
|
168
235
|
|
|
169
|
-
Along with the YAML, produce an activity_manifest array describing each activity:
|
|
236
|
+
Along with the YAML, produce an activity_manifest array describing each activity. Note how all activity IDs share the same random suffix (\`_x8kf\`) for collision-proofing while remaining human-readable:
|
|
170
237
|
\`\`\`json
|
|
171
238
|
[
|
|
172
239
|
{
|
|
173
|
-
"activity_id": "
|
|
240
|
+
"activity_id": "trigger_x8kf",
|
|
174
241
|
"title": "Trigger",
|
|
175
242
|
"type": "trigger",
|
|
176
243
|
"tool_source": "trigger",
|
|
@@ -179,7 +246,7 @@ Along with the YAML, produce an activity_manifest array describing each activity
|
|
|
179
246
|
"output_fields": ["url", "slug"]
|
|
180
247
|
},
|
|
181
248
|
{
|
|
182
|
-
"activity_id": "
|
|
249
|
+
"activity_id": "capture_x8kf",
|
|
183
250
|
"title": "Capture Page",
|
|
184
251
|
"type": "worker",
|
|
185
252
|
"tool_source": "mcp",
|
|
@@ -188,7 +255,7 @@ Along with the YAML, produce an activity_manifest array describing each activity
|
|
|
188
255
|
"mcp_server_id": "long-tail-playwright-cli",
|
|
189
256
|
"mcp_tool_name": "capture_page",
|
|
190
257
|
"tool_arguments": {},
|
|
191
|
-
"input_mappings": { "url": "{
|
|
258
|
+
"input_mappings": { "url": "{trigger_x8kf.output.data.url}" },
|
|
192
259
|
"output_fields": ["page_id", "path", "url", "title"]
|
|
193
260
|
}
|
|
194
261
|
]
|
|
@@ -222,9 +289,11 @@ When the user provides answers to your questions, build the workflow immediately
|
|
|
222
289
|
|
|
223
290
|
## Output Format
|
|
224
291
|
|
|
292
|
+
CRITICAL: The "name" field MUST match the "subscribes" topic in the YAML exactly. Use lowercase with dots as separators (e.g. "screenshot.analyze.store", "capture.page", "daily.report"). Dashes and underscores are also allowed but dots are preferred. The name and subscribes topic MUST be identical.
|
|
293
|
+
|
|
225
294
|
Return a JSON object (no markdown fences):
|
|
226
295
|
{
|
|
227
|
-
"name": "
|
|
296
|
+
"name": "screenshot.analyze.store",
|
|
228
297
|
"description": "What this workflow does",
|
|
229
298
|
"yaml": "<the complete YAML string>",
|
|
230
299
|
"input_schema": { <JSON Schema for trigger inputs> },
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Analyze a specification to determine whether it requires plan mode.
|
|
3
|
+
* Returns structural signals extracted from the input.
|
|
4
|
+
*/
|
|
5
|
+
export interface SpecAnalysis {
|
|
6
|
+
requires_plan: boolean;
|
|
7
|
+
signal_count: number;
|
|
8
|
+
char_count: number;
|
|
9
|
+
signals_found: string[];
|
|
10
|
+
}
|
|
11
|
+
export declare function analyzeSpecification(specification: string): Promise<SpecAnalysis>;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Analyze a specification to determine whether it requires plan mode.
|
|
4
|
+
* Returns structural signals extracted from the input.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.analyzeSpecification = analyzeSpecification;
|
|
8
|
+
const PLAN_SIGNALS = [
|
|
9
|
+
/\bworkflow[s]?\b/gi,
|
|
10
|
+
/\bstep\s+\d/gi,
|
|
11
|
+
/\bphase\s+\d/gi,
|
|
12
|
+
/\bfirst\b.*\bthen\b/gi,
|
|
13
|
+
/\bcompos/gi,
|
|
14
|
+
/\borchestrat/gi,
|
|
15
|
+
/\bpipeline/gi,
|
|
16
|
+
/\bsub-?process/gi,
|
|
17
|
+
/\bplan\b/gi,
|
|
18
|
+
];
|
|
19
|
+
const MIN_PLAN_LENGTH = 500;
|
|
20
|
+
async function analyzeSpecification(specification) {
|
|
21
|
+
const charCount = specification.length;
|
|
22
|
+
const signalsFound = [];
|
|
23
|
+
for (const pattern of PLAN_SIGNALS) {
|
|
24
|
+
const matches = specification.match(pattern);
|
|
25
|
+
if (matches?.length) {
|
|
26
|
+
signalsFound.push(matches[0]);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const requiresPlan = charCount >= MIN_PLAN_LENGTH && signalsFound.length >= 2;
|
|
30
|
+
return {
|
|
31
|
+
requires_plan: requiresPlan,
|
|
32
|
+
signal_count: signalsFound.length,
|
|
33
|
+
char_count: charCount,
|
|
34
|
+
signals_found: signalsFound,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.deploySetNamespaces = exports.updateSetStatus = exports.persistBuiltWorkflow = exports.persistPlan = exports.generatePlan = exports.analyzeSpecification = void 0;
|
|
4
|
+
var analyze_1 = require("./analyze");
|
|
5
|
+
Object.defineProperty(exports, "analyzeSpecification", { enumerable: true, get: function () { return analyze_1.analyzeSpecification; } });
|
|
6
|
+
var plan_1 = require("./plan");
|
|
7
|
+
Object.defineProperty(exports, "generatePlan", { enumerable: true, get: function () { return plan_1.generatePlan; } });
|
|
8
|
+
var persist_1 = require("./persist");
|
|
9
|
+
Object.defineProperty(exports, "persistPlan", { enumerable: true, get: function () { return persist_1.persistPlan; } });
|
|
10
|
+
Object.defineProperty(exports, "persistBuiltWorkflow", { enumerable: true, get: function () { return persist_1.persistBuiltWorkflow; } });
|
|
11
|
+
Object.defineProperty(exports, "updateSetStatus", { enumerable: true, get: function () { return persist_1.updateSetStatus; } });
|
|
12
|
+
Object.defineProperty(exports, "deploySetNamespaces", { enumerable: true, get: function () { return persist_1.deploySetNamespaces; } });
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persistence activities for the workflow planner.
|
|
3
|
+
* These are side-effect functions that update the database.
|
|
4
|
+
*/
|
|
5
|
+
import type { PlanItem, LTWorkflowSetStatus } from '../../../../types/workflow-set';
|
|
6
|
+
export declare function persistPlan(setId: string, planItems: PlanItem[]): Promise<void>;
|
|
7
|
+
export interface BuiltWorkflowData {
|
|
8
|
+
name: string;
|
|
9
|
+
description: string;
|
|
10
|
+
yaml_content: string;
|
|
11
|
+
input_schema: Record<string, unknown>;
|
|
12
|
+
output_schema: Record<string, unknown>;
|
|
13
|
+
activity_manifest: unknown[];
|
|
14
|
+
tags: string[];
|
|
15
|
+
graph_topic: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function persistBuiltWorkflow(setId: string, planItem: PlanItem, builderOutput: BuiltWorkflowData): Promise<string>;
|
|
18
|
+
export declare function updateSetStatus(setId: string, status: LTWorkflowSetStatus): Promise<void>;
|
|
19
|
+
export declare function deploySetNamespaces(namespaces: string[]): Promise<void>;
|