@hotmeshio/long-tail 0.1.14 → 0.1.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -0
- package/build/api/escalations/bulk.d.ts +78 -0
- package/build/api/escalations/bulk.js +279 -0
- package/build/api/escalations/claim.d.ts +30 -0
- package/build/api/escalations/claim.js +121 -0
- package/build/api/escalations/create.d.ts +29 -0
- package/build/api/escalations/create.js +101 -0
- package/build/api/escalations/helpers.d.ts +10 -0
- package/build/api/escalations/helpers.js +80 -0
- package/build/api/escalations/index.d.ts +6 -0
- package/build/api/escalations/index.js +26 -0
- package/build/api/escalations/list.d.ts +75 -0
- package/build/api/escalations/list.js +170 -0
- package/build/api/escalations/resolve.d.ts +18 -0
- package/build/api/escalations/resolve.js +243 -0
- package/build/api/escalations/single.d.ts +37 -0
- package/build/api/escalations/single.js +123 -0
- package/build/api/files.d.ts +3 -0
- package/build/api/files.js +18 -1
- package/build/api/knowledge.d.ts +36 -0
- package/build/api/knowledge.js +112 -0
- package/build/api/mcp/index.d.ts +2 -0
- package/build/api/mcp/index.js +16 -0
- package/build/api/{mcp.d.ts → mcp/servers.d.ts} +1 -33
- package/build/api/{mcp.js → mcp/servers.js} +4 -65
- package/build/api/mcp/tools.d.ts +33 -0
- package/build/api/mcp/tools.js +64 -0
- package/build/api/settings.js +9 -1
- package/build/api/workflows/config.d.ts +64 -0
- package/build/api/workflows/config.js +142 -0
- package/build/api/workflows/discovery.d.ts +29 -0
- package/build/api/workflows/discovery.js +153 -0
- package/build/api/workflows/index.d.ts +3 -0
- package/build/api/workflows/index.js +18 -0
- package/build/api/workflows/invocation.d.ts +67 -0
- package/build/api/workflows/invocation.js +188 -0
- package/build/api/yaml-workflows/cron.d.ts +39 -0
- package/build/api/yaml-workflows/cron.js +127 -0
- package/build/api/{yaml-workflows.d.ts → yaml-workflows/crud.d.ts} +22 -146
- package/build/api/{yaml-workflows.js → yaml-workflows/crud.js} +77 -378
- package/build/api/yaml-workflows/deploy.d.ts +71 -0
- package/build/api/yaml-workflows/deploy.js +223 -0
- package/build/api/yaml-workflows/helpers.d.ts +2 -0
- package/build/api/yaml-workflows/helpers.js +8 -0
- package/build/api/yaml-workflows/index.d.ts +4 -0
- package/build/api/yaml-workflows/index.js +27 -0
- package/build/api/yaml-workflows/versions.d.ts +43 -0
- package/build/api/yaml-workflows/versions.js +124 -0
- package/build/bin/ltc.d.ts +2 -0
- package/build/bin/ltc.js +220 -0
- package/build/examples/seed-data.d.ts +55 -0
- package/build/examples/seed-data.js +161 -0
- package/build/examples/seed.js +7 -164
- package/build/lib/cli/auth.d.ts +23 -0
- package/build/lib/cli/auth.js +167 -0
- package/build/lib/cli/client.d.ts +6 -0
- package/build/lib/cli/client.js +31 -0
- package/build/lib/cli/commands/escalations.d.ts +19 -0
- package/build/lib/cli/commands/escalations.js +69 -0
- package/build/lib/cli/commands/knowledge.d.ts +18 -0
- package/build/lib/cli/commands/knowledge.js +87 -0
- package/build/lib/cli/commands/mcp.d.ts +8 -0
- package/build/lib/cli/commands/mcp.js +33 -0
- package/build/lib/cli/commands/pipelines.d.ts +16 -0
- package/build/lib/cli/commands/pipelines.js +67 -0
- package/build/lib/cli/commands/status.d.ts +1 -0
- package/build/lib/cli/commands/status.js +28 -0
- package/build/lib/cli/commands/users.d.ts +7 -0
- package/build/lib/cli/commands/users.js +25 -0
- package/build/lib/cli/commands/workflows.d.ts +16 -0
- package/build/lib/cli/commands/workflows.js +104 -0
- package/build/lib/cli/compile.d.ts +2 -0
- package/build/lib/cli/compile.js +165 -0
- package/build/lib/cli/format.d.ts +23 -0
- package/build/lib/cli/format.js +94 -0
- package/build/lib/cli/init.d.ts +1 -0
- package/build/lib/cli/init.js +61 -0
- package/build/lib/cli/output.d.ts +27 -0
- package/build/lib/cli/output.js +126 -0
- package/build/lib/cli/scanner.d.ts +10 -0
- package/build/lib/cli/scanner.js +164 -0
- package/build/lib/cli/types.d.ts +16 -0
- package/build/lib/cli/types.js +2 -0
- package/build/lib/logger/index.d.ts +0 -9
- package/build/lib/logger/index.js +9 -4
- package/build/lib/storage/index.js +2 -2
- package/build/routes/file-browser.js +14 -0
- package/build/routes/index.js +2 -0
- package/build/routes/knowledge.d.ts +2 -0
- package/build/routes/knowledge.js +141 -0
- package/build/routes/yaml-workflows/crud.js +9 -0
- package/build/sdk/index.d.ts +17 -0
- package/build/sdk/index.js +19 -0
- package/build/services/mcp/client/connection-dispatch.d.ts +18 -0
- package/build/services/mcp/client/connection-dispatch.js +78 -0
- package/build/services/mcp/client/connection-lifecycle.d.ts +48 -0
- package/build/services/mcp/client/connection-lifecycle.js +296 -0
- package/build/services/mcp/client/connection-test.d.ts +10 -0
- package/build/services/mcp/client/connection-test.js +49 -0
- package/build/services/mcp/client/connection.d.ts +3 -68
- package/build/services/mcp/client/connection.js +15 -393
- package/build/services/mcp/server-lifecycle.d.ts +27 -0
- package/build/services/mcp/server-lifecycle.js +49 -0
- package/build/services/mcp/server-tools.d.ts +13 -0
- package/build/services/mcp/server-tools.js +287 -0
- package/build/services/mcp/server.d.ts +2 -26
- package/build/services/mcp/server.js +7 -315
- package/build/services/yaml-workflow/builder-regenerate.d.ts +25 -0
- package/build/services/yaml-workflow/builder-regenerate.js +111 -0
- package/build/services/yaml-workflow/db-versions.d.ts +17 -0
- package/build/services/yaml-workflow/db-versions.js +76 -0
- package/build/services/yaml-workflow/db.d.ts +3 -13
- package/build/services/yaml-workflow/db.js +15 -71
- package/build/services/yaml-workflow/deployer-helpers.js +48 -17
- package/build/services/yaml-workflow/durable-compiler/index.d.ts +22 -0
- package/build/services/yaml-workflow/durable-compiler/index.js +168 -0
- package/build/services/yaml-workflow/durable-compiler/parser.d.ts +12 -0
- package/build/services/yaml-workflow/durable-compiler/parser.js +110 -0
- package/build/services/yaml-workflow/durable-compiler/prompts.d.ts +18 -0
- package/build/services/yaml-workflow/durable-compiler/prompts.js +570 -0
- package/build/services/yaml-workflow/durable-compiler/types.d.ts +51 -0
- package/build/services/yaml-workflow/durable-compiler/types.js +5 -0
- package/build/services/yaml-workflow/pipeline/build/dag-assembly.d.ts +17 -0
- package/build/services/yaml-workflow/pipeline/build/dag-assembly.js +192 -0
- package/build/services/yaml-workflow/pipeline/build/dag.d.ts +4 -13
- package/build/services/yaml-workflow/pipeline/build/dag.js +9 -185
- package/build/services/yaml-workflow/pipeline/prompt-templates.d.ts +10 -0
- package/build/services/yaml-workflow/pipeline/prompt-templates.js +270 -0
- package/build/services/yaml-workflow/pipeline/prompts.d.ts +3 -6
- package/build/services/yaml-workflow/pipeline/prompts.js +8 -263
- package/build/start/workers.js +6 -5
- package/build/system/activities/file-storage.d.ts +4 -0
- package/build/system/activities/file-storage.js +7 -1
- package/build/system/activities/knowledge.d.ts +23 -0
- package/build/system/activities/knowledge.js +50 -10
- package/build/system/activities/sql.d.ts +3 -0
- package/build/system/activities/sql.js +25 -1
- package/build/system/mcp-servers/file-storage.js +3 -1
- package/build/system/mcp-servers/human-queue-schemas.d.ts +91 -0
- package/build/system/mcp-servers/human-queue-schemas.js +42 -0
- package/build/system/mcp-servers/human-queue.d.ts +2 -6
- package/build/system/mcp-servers/human-queue.js +9 -51
- package/build/system/mcp-servers/knowledge.js +43 -9
- package/build/system/mcp-servers/workflow-compiler.js +54 -0
- package/build/system/workflows/mcp-triage/activities-proxy.d.ts +21 -0
- package/build/system/workflows/mcp-triage/activities-proxy.js +70 -0
- package/build/system/workflows/mcp-triage/index.js +17 -75
- package/build/system/workflows/mcp-workflow-planner/activities/persist.d.ts +1 -0
- package/build/system/workflows/mcp-workflow-planner/activities/persist.js +1 -0
- package/build/system/workflows/mcp-workflow-planner/index.js +2 -0
- package/build/tsconfig.tsbuildinfo +1 -1
- package/dashboard/dist/assets/{AdminDashboard-Cngijp4Q.js → AdminDashboard-NLryl1_B.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-Cngijp4Q.js.map → AdminDashboard-NLryl1_B.js.map} +1 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-6vexlrk3.js +2 -0
- package/dashboard/dist/assets/AvailableEscalationsPage-6vexlrk3.js.map +1 -0
- package/dashboard/dist/assets/{BotPicker-B8Uvw9Si.js → BotPicker-DWhn0tr1.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-B8Uvw9Si.js.map → BotPicker-DWhn0tr1.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-DiFPuWOY.js → CollapsibleSection-CgYgQiOc.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-DiFPuWOY.js.map → CollapsibleSection-CgYgQiOc.js.map} +1 -1
- package/dashboard/dist/assets/{ConfirmDeleteModal-CpXG9uyu.js → ConfirmDeleteModal-DCKAPXD3.js} +2 -2
- package/dashboard/dist/assets/{ConfirmDeleteModal-CpXG9uyu.js.map → ConfirmDeleteModal-DCKAPXD3.js.map} +1 -1
- package/dashboard/dist/assets/{CopyableId-DKsTR9lK.js → CopyableId-DXkaAOYk.js} +2 -2
- package/dashboard/dist/assets/{CopyableId-DKsTR9lK.js.map → CopyableId-DXkaAOYk.js.map} +1 -1
- package/dashboard/dist/assets/{CredentialsPage-DlS7Kf40.js → CredentialsPage-B361BOfU.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-DlS7Kf40.js.map → CredentialsPage-B361BOfU.js.map} +1 -1
- package/dashboard/dist/assets/{CustomDurationPicker-B-9eW3pm.js → CustomDurationPicker-D2G1ldiF.js} +2 -2
- package/dashboard/dist/assets/{CustomDurationPicker-B-9eW3pm.js.map → CustomDurationPicker-D2G1ldiF.js.map} +1 -1
- package/dashboard/dist/assets/{DataTable-DkOokbtL.js → DataTable-DXSUbA26.js} +2 -2
- package/dashboard/dist/assets/{DataTable-DkOokbtL.js.map → DataTable-DXSUbA26.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-DVtHqM-5.js → ElapsedCell-CQGqkXP_.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-DVtHqM-5.js.map → ElapsedCell-CQGqkXP_.js.map} +1 -1
- package/dashboard/dist/assets/{EmptyState-C7KIMIbE.js → EmptyState-Dep92Wkg.js} +2 -2
- package/dashboard/dist/assets/{EmptyState-C7KIMIbE.js.map → EmptyState-Dep92Wkg.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-BMKBlkPx.js → EscalationsOverview-DVEFVjs7.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-BMKBlkPx.js.map → EscalationsOverview-DVEFVjs7.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-BYZ5OVdQ.js → EventTable-BMJAPkMi.js} +2 -2
- package/dashboard/dist/assets/{EventTable-BYZ5OVdQ.js.map → EventTable-BMJAPkMi.js.map} +1 -1
- package/dashboard/dist/assets/{FilterBar-C5r3n6YO.js → FilterBar-DbVbCzH2.js} +2 -2
- package/dashboard/dist/assets/{FilterBar-C5r3n6YO.js.map → FilterBar-DbVbCzH2.js.map} +1 -1
- package/dashboard/dist/assets/{ListToolbar-BGUajIsW.js → ListToolbar-0XNuXj0M.js} +2 -2
- package/dashboard/dist/assets/{ListToolbar-BGUajIsW.js.map → ListToolbar-0XNuXj0M.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-B_kJYHea.js → McpOverview-CeYnCzBN.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-B_kJYHea.js.map → McpOverview-CeYnCzBN.js.map} +1 -1
- package/dashboard/dist/assets/McpQueryDetailPage-t3qW3QNa.js +5 -0
- package/dashboard/dist/assets/McpQueryDetailPage-t3qW3QNa.js.map +1 -0
- package/dashboard/dist/assets/{McpQueryPage-BgAq_bQg.js → McpQueryPage-CfUcdzaj.js} +2 -2
- package/dashboard/dist/assets/{McpQueryPage-BgAq_bQg.js.map → McpQueryPage-CfUcdzaj.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunDetailPage-B8c0OszR.js → McpRunDetailPage-CZtodW_Z.js} +2 -2
- package/dashboard/dist/assets/{McpRunDetailPage-B8c0OszR.js.map → McpRunDetailPage-CZtodW_Z.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunsPage-BY8C6k78.js → McpRunsPage-Dzgq7HGt.js} +2 -2
- package/dashboard/dist/assets/{McpRunsPage-BY8C6k78.js.map → McpRunsPage-Dzgq7HGt.js.map} +1 -1
- package/dashboard/dist/assets/{Modal-E1yRnCeW.js → Modal-yyhUeKoA.js} +2 -2
- package/dashboard/dist/assets/{Modal-E1yRnCeW.js.map → Modal-yyhUeKoA.js.map} +1 -1
- package/dashboard/dist/assets/{OperatorDashboard-C8MSTzey.js → OperatorDashboard-Ceh7OQtZ.js} +2 -2
- package/dashboard/dist/assets/{OperatorDashboard-C8MSTzey.js.map → OperatorDashboard-Ceh7OQtZ.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeader-Cm5HBQF_.js → PageHeader-CZ9a8cpr.js} +2 -2
- package/dashboard/dist/assets/{PageHeader-Cm5HBQF_.js.map → PageHeader-CZ9a8cpr.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeaderWithStats-CNmWJFSN.js → PageHeaderWithStats-BJuNs5NM.js} +2 -2
- package/dashboard/dist/assets/{PageHeaderWithStats-CNmWJFSN.js.map → PageHeaderWithStats-BJuNs5NM.js.map} +1 -1
- package/dashboard/dist/assets/{PriorityBadge-HSI4RVhs.js → PriorityBadge-BrPikMFy.js} +2 -2
- package/dashboard/dist/assets/{PriorityBadge-HSI4RVhs.js.map → PriorityBadge-BrPikMFy.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessDetailPage-Dln8622H.js → ProcessDetailPage-2miaYd8G.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-Dln8622H.js.map → ProcessDetailPage-2miaYd8G.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessesListPage-bIsd9N_h.js → ProcessesListPage-DqpRDqjk.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-bIsd9N_h.js.map → ProcessesListPage-DqpRDqjk.js.map} +1 -1
- package/dashboard/dist/assets/{RolePill-BVUp2bF0.js → RolePill-DxbJMfJu.js} +2 -2
- package/dashboard/dist/assets/{RolePill-BVUp2bF0.js.map → RolePill-DxbJMfJu.js.map} +1 -1
- package/dashboard/dist/assets/RolesPage-CYHRo21-.js +2 -0
- package/dashboard/dist/assets/{RolesPage-kH-Njt25.js.map → RolesPage-CYHRo21-.js.map} +1 -1
- package/dashboard/dist/assets/{RowActions-DbUJPfaW.js → RowActions-DurFwIwe.js} +2 -2
- package/dashboard/dist/assets/{RowActions-DbUJPfaW.js.map → RowActions-DurFwIwe.js.map} +1 -1
- package/dashboard/dist/assets/RunAsSelector-CNKraP6u.js +2 -0
- package/dashboard/dist/assets/RunAsSelector-CNKraP6u.js.map +1 -0
- package/dashboard/dist/assets/{StatCard-Bs3JbyAz.js → StatCard-CKplpK3w.js} +2 -2
- package/dashboard/dist/assets/{StatCard-Bs3JbyAz.js.map → StatCard-CKplpK3w.js.map} +1 -1
- package/dashboard/dist/assets/{StatusBadge-CakDdsCw.js → StatusBadge-Dm0V1dNN.js} +2 -2
- package/dashboard/dist/assets/{StatusBadge-CakDdsCw.js.map → StatusBadge-Dm0V1dNN.js.map} +1 -1
- package/dashboard/dist/assets/{StepIndicator-Cd_SG_yA.js → StepIndicator-Dicx0WTZ.js} +2 -2
- package/dashboard/dist/assets/{StepIndicator-Cd_SG_yA.js.map → StepIndicator-Dicx0WTZ.js.map} +1 -1
- package/dashboard/dist/assets/{StickyPagination-Bz0C18nC.js → StickyPagination-B2jYvU3-.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-Bz0C18nC.js.map → StickyPagination-B2jYvU3-.js.map} +1 -1
- package/dashboard/dist/assets/SwimlaneTimeline-ClwumkT1.js +2 -0
- package/dashboard/dist/assets/SwimlaneTimeline-ClwumkT1.js.map +1 -0
- package/dashboard/dist/assets/{TagInput-ClFhXG-U.js → TagInput-CypDZ6Kl.js} +2 -2
- package/dashboard/dist/assets/{TagInput-ClFhXG-U.js.map → TagInput-CypDZ6Kl.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-SuMBdARt.js → TaskDetailPage-DooDNJGT.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-SuMBdARt.js.map → TaskDetailPage-DooDNJGT.js.map} +1 -1
- package/dashboard/dist/assets/{TaskQueuePill-lJR1JW_W.js → TaskQueuePill-C1hZ-j31.js} +2 -2
- package/dashboard/dist/assets/{TaskQueuePill-lJR1JW_W.js.map → TaskQueuePill-C1hZ-j31.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-Dkq1Vtbt.js → TasksListPage-D7CdkAeg.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-Dkq1Vtbt.js.map → TasksListPage-D7CdkAeg.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-DgfDZ1pl.js → TimeAgo-B5LXB2aj.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-DgfDZ1pl.js.map → TimeAgo-B5LXB2aj.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-MpHZ1hMD.js → TimestampCell-Crb9b0Gw.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-MpHZ1hMD.js.map → TimestampCell-Crb9b0Gw.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-DqsosA4B.js → UserName-OPg-nkRa.js} +2 -2
- package/dashboard/dist/assets/{UserName-DqsosA4B.js.map → UserName-OPg-nkRa.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowExecutionPage-CVlg38C3.js → WorkflowExecutionPage-CcLVrs9b.js} +2 -2
- package/dashboard/dist/assets/{WorkflowExecutionPage-CVlg38C3.js.map → WorkflowExecutionPage-CcLVrs9b.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowPill-CRpZhjGR.js → WorkflowPill-CCV4MMj7.js} +2 -2
- package/dashboard/dist/assets/{WorkflowPill-CRpZhjGR.js.map → WorkflowPill-CCV4MMj7.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsDashboard-Ugzbs8mV.js → WorkflowsDashboard-DB1SncBi.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsDashboard-Ugzbs8mV.js.map → WorkflowsDashboard-DB1SncBi.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsOverview-CIp_lTNl.js → WorkflowsOverview-DvShiYJV.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-CIp_lTNl.js.map → WorkflowsOverview-DvShiYJV.js.map} +1 -1
- package/dashboard/dist/assets/YamlWorkflowsPage-DCBoMeGI.js +2 -0
- package/dashboard/dist/assets/YamlWorkflowsPage-DCBoMeGI.js.map +1 -0
- package/dashboard/dist/assets/{bots-DPfUpVqI.js → bots-Dqos20NE.js} +2 -2
- package/dashboard/dist/assets/{bots-DPfUpVqI.js.map → bots-Dqos20NE.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-RrCDbMC3.js → escalation-A0CsbvNV.js} +2 -2
- package/dashboard/dist/assets/{escalation-RrCDbMC3.js.map → escalation-A0CsbvNV.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-columns-CDGa9wsD.js → escalation-columns-BpBJN6k4.js} +2 -2
- package/dashboard/dist/assets/{escalation-columns-CDGa9wsD.js.map → escalation-columns-BpBJN6k4.js.map} +1 -1
- package/dashboard/dist/assets/{helpers-ZSKqdkdS.js → helpers-CmznCuAx.js} +2 -2
- package/dashboard/dist/assets/{helpers-ZSKqdkdS.js.map → helpers-CmznCuAx.js.map} +1 -1
- package/dashboard/dist/assets/index-BIeYV5QK.js +2 -0
- package/dashboard/dist/assets/index-BIeYV5QK.js.map +1 -0
- package/dashboard/dist/assets/index-BYwD3kHN.js +5 -0
- package/dashboard/dist/assets/index-BYwD3kHN.js.map +1 -0
- package/dashboard/dist/assets/index-C5TUqJu0.css +1 -0
- package/dashboard/dist/assets/{index-DX6zxr6t.js → index-C8-UaN4N.js} +2 -2
- package/dashboard/dist/assets/{index-DX6zxr6t.js.map → index-C8-UaN4N.js.map} +1 -1
- package/dashboard/dist/assets/index-CAj5LT9H.js +15 -0
- package/dashboard/dist/assets/index-CAj5LT9H.js.map +1 -0
- package/dashboard/dist/assets/index-CjxHCVxl.js +2 -0
- package/dashboard/dist/assets/{index-C90ZPzXk.js.map → index-CjxHCVxl.js.map} +1 -1
- package/dashboard/dist/assets/index-Cr0Rqsj7.js +2 -0
- package/dashboard/dist/assets/index-Cr0Rqsj7.js.map +1 -0
- package/dashboard/dist/assets/index-DZHNte4o.js +2 -0
- package/dashboard/dist/assets/{index-K40Qw1tk.js.map → index-DZHNte4o.js.map} +1 -1
- package/dashboard/dist/assets/{index-DNytWfSZ.js → index-VnYkWW8r.js} +2 -2
- package/dashboard/dist/assets/{index-DNytWfSZ.js.map → index-VnYkWW8r.js.map} +1 -1
- package/dashboard/dist/assets/{index-BbI2dzhJ.js → index-XGOmZ117.js} +2 -2
- package/dashboard/dist/assets/{index-BbI2dzhJ.js.map → index-XGOmZ117.js.map} +1 -1
- package/dashboard/dist/assets/index-ZjOUzWhc.js +2 -0
- package/dashboard/dist/assets/index-ZjOUzWhc.js.map +1 -0
- package/dashboard/dist/assets/{index-Cmgrk7PQ.js → index-puKKZ5l8.js} +71 -71
- package/dashboard/dist/assets/index-puKKZ5l8.js.map +1 -0
- package/dashboard/dist/assets/{index-BmVCyB6C.js → index-t5frSddy.js} +2 -2
- package/dashboard/dist/assets/{index-BmVCyB6C.js.map → index-t5frSddy.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-CNE44TSp.js → mcp-DrWymhSu.js} +2 -2
- package/dashboard/dist/assets/{mcp-CNE44TSp.js.map → mcp-DrWymhSu.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-RQX0uN-5.js → mcp-query-BhUxVEMS.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-RQX0uN-5.js.map → mcp-query-BhUxVEMS.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-runs-0w40bdz-.js → mcp-runs-DUfz4mLd.js} +2 -2
- package/dashboard/dist/assets/{mcp-runs-0w40bdz-.js.map → mcp-runs-DUfz4mLd.js.map} +1 -1
- package/dashboard/dist/assets/{namespaces-BbmdXuPp.js → namespaces-Cm6AY5sh.js} +2 -2
- package/dashboard/dist/assets/{namespaces-BbmdXuPp.js.map → namespaces-Cm6AY5sh.js.map} +1 -1
- package/dashboard/dist/assets/{roles-DoHYlhWH.js → roles-2v1Kc7BJ.js} +2 -2
- package/dashboard/dist/assets/{roles-DoHYlhWH.js.map → roles-2v1Kc7BJ.js.map} +1 -1
- package/dashboard/dist/assets/{settings-BAiJiCHS.js → settings-DTQNp6tH.js} +2 -2
- package/dashboard/dist/assets/{settings-BAiJiCHS.js.map → settings-DTQNp6tH.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-CvroqHtm.js → tasks-CS1rgG1s.js} +2 -2
- package/dashboard/dist/assets/{tasks-CvroqHtm.js.map → tasks-CS1rgG1s.js.map} +1 -1
- package/dashboard/dist/assets/useEventHooks-BjXX8x3a.js +2 -0
- package/dashboard/dist/assets/{useEventHooks-BHMbzR_y.js.map → useEventHooks-BjXX8x3a.js.map} +1 -1
- package/dashboard/dist/assets/useYamlActivityEvents-BeR-nVWQ.js +2 -0
- package/dashboard/dist/assets/{useYamlActivityEvents-D56KV14X.js.map → useYamlActivityEvents-BeR-nVWQ.js.map} +1 -1
- package/dashboard/dist/assets/{users-CxIMy_xw.js → users-DYsdQ7Md.js} +2 -2
- package/dashboard/dist/assets/{users-CxIMy_xw.js.map → users-DYsdQ7Md.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-AFGxSeQS.js → vendor-icons-CWl44VA6.js} +77 -77
- package/dashboard/dist/assets/vendor-icons-CWl44VA6.js.map +1 -0
- package/dashboard/dist/assets/{workflows-yR9yais7.js → workflows-2QAXh3UD.js} +2 -2
- package/dashboard/dist/assets/{workflows-yR9yais7.js.map → workflows-2QAXh3UD.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-QVF2MZ0l.js → yaml-workflows-sx8-UEE3.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-QVF2MZ0l.js.map → yaml-workflows-sx8-UEE3.js.map} +1 -1
- package/dashboard/dist/index.html +3 -3
- package/docs/api/http/file-browser.md +101 -0
- package/docs/api/http/knowledge.md +203 -0
- package/docs/api/http/settings.md +6 -4
- package/docs/api/sdk/files.md +68 -0
- package/docs/api/sdk/knowledge.md +126 -0
- package/docs/api/sdk/settings.md +3 -2
- package/docs/cli.md +171 -0
- package/docs/compilation.md +16 -0
- package/docs/compiler.md +311 -0
- package/docs/events.md +19 -0
- package/docs/workflows.md +19 -0
- package/package.json +13 -2
- package/build/api/escalations.d.ts +0 -271
- package/build/api/escalations.js +0 -932
- package/build/api/workflows.d.ts +0 -158
- package/build/api/workflows.js +0 -414
- package/dashboard/dist/assets/AvailableEscalationsPage-CpBfGV1h.js +0 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-CpBfGV1h.js.map +0 -1
- package/dashboard/dist/assets/McpQueryDetailPage-Czsmovqw.js +0 -5
- package/dashboard/dist/assets/McpQueryDetailPage-Czsmovqw.js.map +0 -1
- package/dashboard/dist/assets/RolesPage-kH-Njt25.js +0 -2
- package/dashboard/dist/assets/SwimlaneTimeline-Cfe-xQRX.js +0 -2
- package/dashboard/dist/assets/SwimlaneTimeline-Cfe-xQRX.js.map +0 -1
- package/dashboard/dist/assets/YamlWorkflowsPage-BICF0fRO.js +0 -2
- package/dashboard/dist/assets/YamlWorkflowsPage-BICF0fRO.js.map +0 -1
- package/dashboard/dist/assets/helpers-rMEcLwKs.js +0 -2
- package/dashboard/dist/assets/helpers-rMEcLwKs.js.map +0 -1
- package/dashboard/dist/assets/index-ABcJHHlN.js +0 -5
- package/dashboard/dist/assets/index-ABcJHHlN.js.map +0 -1
- package/dashboard/dist/assets/index-B91h_jZ0.js +0 -15
- package/dashboard/dist/assets/index-B91h_jZ0.js.map +0 -1
- package/dashboard/dist/assets/index-C1E5GTs9.js +0 -2
- package/dashboard/dist/assets/index-C1E5GTs9.js.map +0 -1
- package/dashboard/dist/assets/index-C90ZPzXk.js +0 -2
- package/dashboard/dist/assets/index-Cmgrk7PQ.js.map +0 -1
- package/dashboard/dist/assets/index-DeX-ezqf.css +0 -1
- package/dashboard/dist/assets/index-K40Qw1tk.js +0 -2
- package/dashboard/dist/assets/index-lCyNr5Xk.js +0 -2
- package/dashboard/dist/assets/index-lCyNr5Xk.js.map +0 -1
- package/dashboard/dist/assets/useEventHooks-BHMbzR_y.js +0 -2
- package/dashboard/dist/assets/useYamlActivityEvents-D56KV14X.js +0 -2
- package/dashboard/dist/assets/vendor-icons-AFGxSeQS.js.map +0 -1
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Regenerate a Plan Build workflow from its original prompt + compilation feedback.
|
|
4
|
+
*
|
|
5
|
+
* Reuses the builder's LLM call and prompt structure without spawning a full
|
|
6
|
+
* durable workflow. This is the fast path for "Recompile Pipeline" on Plan Build
|
|
7
|
+
* workflows that don't have an execution trace.
|
|
8
|
+
*/
|
|
9
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
12
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
13
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
14
|
+
}
|
|
15
|
+
Object.defineProperty(o, k2, desc);
|
|
16
|
+
}) : (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
o[k2] = m[k];
|
|
19
|
+
}));
|
|
20
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
21
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
22
|
+
}) : function(o, v) {
|
|
23
|
+
o["default"] = v;
|
|
24
|
+
});
|
|
25
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
26
|
+
var ownKeys = function(o) {
|
|
27
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
28
|
+
var ar = [];
|
|
29
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
30
|
+
return ar;
|
|
31
|
+
};
|
|
32
|
+
return ownKeys(o);
|
|
33
|
+
};
|
|
34
|
+
return function (mod) {
|
|
35
|
+
if (mod && mod.__esModule) return mod;
|
|
36
|
+
var result = {};
|
|
37
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
38
|
+
__setModuleDefault(result, mod);
|
|
39
|
+
return result;
|
|
40
|
+
};
|
|
41
|
+
})();
|
|
42
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
+
exports.rebuildFromPrompt = rebuildFromPrompt;
|
|
44
|
+
const llm_1 = require("../llm");
|
|
45
|
+
const defaults_1 = require("../../modules/defaults");
|
|
46
|
+
const logger_1 = require("../../lib/logger");
|
|
47
|
+
const BUILDER_MAX_TOKENS = 8192;
|
|
48
|
+
/**
|
|
49
|
+
* Rebuild a YAML workflow from a prompt with optional feedback on the prior attempt.
|
|
50
|
+
*/
|
|
51
|
+
async function rebuildFromPrompt(options) {
|
|
52
|
+
// Load the builder's system prompt and tool inventory
|
|
53
|
+
const { loadBuilderTools } = await Promise.resolve().then(() => __importStar(require('../../system/workflows/mcp-workflow-builder/activities')));
|
|
54
|
+
const { BUILDER_SYSTEM_PROMPT, REFINE_PROMPT } = await Promise.resolve().then(() => __importStar(require('../../system/workflows/mcp-workflow-builder/prompts')));
|
|
55
|
+
const raw = await loadBuilderTools();
|
|
56
|
+
const serverSection = [
|
|
57
|
+
raw.strategy ? `${raw.strategy}\n` : '',
|
|
58
|
+
`## Available MCP Servers & Tools\n\n${raw.inventory}`,
|
|
59
|
+
].filter(Boolean).join('\n');
|
|
60
|
+
const messages = [
|
|
61
|
+
{ role: 'system', content: BUILDER_SYSTEM_PROMPT(serverSection) },
|
|
62
|
+
];
|
|
63
|
+
if (options.feedback && options.priorYaml) {
|
|
64
|
+
messages.push({ role: 'user', content: `Build a workflow for: ${options.prompt}` });
|
|
65
|
+
messages.push({
|
|
66
|
+
role: 'assistant',
|
|
67
|
+
content: `Here is the prior YAML that needs fixing:\n\`\`\`yaml\n${options.priorYaml.slice(0, 3000)}\n\`\`\``,
|
|
68
|
+
});
|
|
69
|
+
messages.push({
|
|
70
|
+
role: 'user',
|
|
71
|
+
content: `${REFINE_PROMPT}\n\nExecution feedback:\n${options.feedback}`,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
messages.push({ role: 'user', content: `Build a workflow for: ${options.prompt}` });
|
|
76
|
+
}
|
|
77
|
+
// Call LLM with retry
|
|
78
|
+
for (let attempt = 0; attempt < 3; attempt++) {
|
|
79
|
+
const t0 = Date.now();
|
|
80
|
+
const response = await (0, llm_1.callLLM)({
|
|
81
|
+
model: defaults_1.LLM_MODEL_PRIMARY,
|
|
82
|
+
messages,
|
|
83
|
+
temperature: 0,
|
|
84
|
+
max_tokens: BUILDER_MAX_TOKENS,
|
|
85
|
+
});
|
|
86
|
+
logger_1.loggerRegistry.info(`[builder-regenerate] attempt=${attempt + 1} ${Date.now() - t0}ms | in=${response.usage?.prompt_tokens} out=${response.usage?.completion_tokens}`);
|
|
87
|
+
const content = response.content || '';
|
|
88
|
+
const cleaned = content.replace(/^```(?:json)?\s*/m, '').replace(/\s*```\s*$/m, '');
|
|
89
|
+
try {
|
|
90
|
+
const parsed = JSON.parse(cleaned);
|
|
91
|
+
if (!parsed.yaml)
|
|
92
|
+
throw new Error('Missing yaml in response');
|
|
93
|
+
return {
|
|
94
|
+
yaml: parsed.yaml,
|
|
95
|
+
inputSchema: parsed.input_schema || {},
|
|
96
|
+
outputSchema: parsed.output_schema || {},
|
|
97
|
+
activityManifest: parsed.activity_manifest || [],
|
|
98
|
+
tags: parsed.tags || [],
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
logger_1.loggerRegistry.warn(`[builder-regenerate] parse failed (attempt ${attempt + 1}): ${err.message}`);
|
|
103
|
+
messages.push({ role: 'assistant', content });
|
|
104
|
+
messages.push({
|
|
105
|
+
role: 'user',
|
|
106
|
+
content: `Your response was not valid JSON. Return ONLY a JSON object with "yaml", "input_schema", "output_schema", "activity_manifest", and "tags" fields.`,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
throw new Error('Failed to regenerate YAML after 3 attempts');
|
|
111
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Version history and cron scheduling DB operations for yaml-workflows.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from db.ts to keep each file under 300 lines.
|
|
5
|
+
*/
|
|
6
|
+
import type { LTYamlWorkflowRecord, LTYamlWorkflowVersionRecord, ActivityManifestEntry } from '../../types/yaml-workflow';
|
|
7
|
+
export declare function createVersionSnapshot(workflowId: string, version: number, yamlContent: string, activityManifest: ActivityManifestEntry[] | unknown, inputSchema: Record<string, unknown> | unknown, outputSchema: Record<string, unknown> | unknown, inputFieldMeta?: unknown, changeSummary?: string): Promise<LTYamlWorkflowVersionRecord>;
|
|
8
|
+
export declare function getVersionHistory(workflowId: string, limit?: number, offset?: number): Promise<{
|
|
9
|
+
versions: LTYamlWorkflowVersionRecord[];
|
|
10
|
+
total: number;
|
|
11
|
+
}>;
|
|
12
|
+
export declare function getVersionSnapshot(workflowId: string, version: number): Promise<LTYamlWorkflowVersionRecord | null>;
|
|
13
|
+
export declare function markContentDeployed(workflowId: string): Promise<void>;
|
|
14
|
+
export declare function markAppIdContentDeployed(appId: string): Promise<void>;
|
|
15
|
+
export declare function updateCronSchedule(id: string, cronSchedule: string, cronEnvelope: Record<string, unknown> | null, executeAs: string | null): Promise<LTYamlWorkflowRecord | null>;
|
|
16
|
+
export declare function clearCronSchedule(id: string): Promise<LTYamlWorkflowRecord | null>;
|
|
17
|
+
export declare function getCronScheduledWorkflows(): Promise<LTYamlWorkflowRecord[]>;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Version history and cron scheduling DB operations for yaml-workflows.
|
|
4
|
+
*
|
|
5
|
+
* Extracted from db.ts to keep each file under 300 lines.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.createVersionSnapshot = createVersionSnapshot;
|
|
9
|
+
exports.getVersionHistory = getVersionHistory;
|
|
10
|
+
exports.getVersionSnapshot = getVersionSnapshot;
|
|
11
|
+
exports.markContentDeployed = markContentDeployed;
|
|
12
|
+
exports.markAppIdContentDeployed = markAppIdContentDeployed;
|
|
13
|
+
exports.updateCronSchedule = updateCronSchedule;
|
|
14
|
+
exports.clearCronSchedule = clearCronSchedule;
|
|
15
|
+
exports.getCronScheduledWorkflows = getCronScheduledWorkflows;
|
|
16
|
+
const db_1 = require("../../lib/db");
|
|
17
|
+
const defaults_1 = require("../../modules/defaults");
|
|
18
|
+
const sql_1 = require("./sql");
|
|
19
|
+
// -- Version history ---------------------------------------------------------
|
|
20
|
+
async function createVersionSnapshot(workflowId, version, yamlContent, activityManifest, inputSchema, outputSchema, inputFieldMeta, changeSummary) {
|
|
21
|
+
const pool = (0, db_1.getPool)();
|
|
22
|
+
const { rows } = await pool.query(sql_1.CREATE_VERSION_SNAPSHOT, [
|
|
23
|
+
workflowId, version, yamlContent,
|
|
24
|
+
JSON.stringify(activityManifest),
|
|
25
|
+
JSON.stringify(inputSchema),
|
|
26
|
+
JSON.stringify(outputSchema),
|
|
27
|
+
JSON.stringify(inputFieldMeta || []),
|
|
28
|
+
changeSummary || null,
|
|
29
|
+
]);
|
|
30
|
+
return rows[0];
|
|
31
|
+
}
|
|
32
|
+
async function getVersionHistory(workflowId, limit = defaults_1.YAML_VERSION_LIMIT, offset = 0) {
|
|
33
|
+
const pool = (0, db_1.getPool)();
|
|
34
|
+
const [countResult, dataResult] = await Promise.all([
|
|
35
|
+
pool.query(sql_1.COUNT_VERSIONS, [workflowId]),
|
|
36
|
+
pool.query(sql_1.LIST_VERSIONS, [workflowId, limit, offset]),
|
|
37
|
+
]);
|
|
38
|
+
return {
|
|
39
|
+
versions: dataResult.rows,
|
|
40
|
+
total: parseInt(countResult.rows[0].count, 10),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
async function getVersionSnapshot(workflowId, version) {
|
|
44
|
+
const pool = (0, db_1.getPool)();
|
|
45
|
+
const { rows } = await pool.query(sql_1.GET_VERSION_SNAPSHOT, [workflowId, version]);
|
|
46
|
+
return rows[0] || null;
|
|
47
|
+
}
|
|
48
|
+
async function markContentDeployed(workflowId) {
|
|
49
|
+
const pool = (0, db_1.getPool)();
|
|
50
|
+
await pool.query(sql_1.MARK_CONTENT_DEPLOYED, [workflowId]);
|
|
51
|
+
}
|
|
52
|
+
async function markAppIdContentDeployed(appId) {
|
|
53
|
+
const pool = (0, db_1.getPool)();
|
|
54
|
+
await pool.query(sql_1.MARK_APP_ID_CONTENT_DEPLOYED, [appId]);
|
|
55
|
+
}
|
|
56
|
+
// -- Cron scheduling ---------------------------------------------------------
|
|
57
|
+
async function updateCronSchedule(id, cronSchedule, cronEnvelope, executeAs) {
|
|
58
|
+
const pool = (0, db_1.getPool)();
|
|
59
|
+
const { rows } = await pool.query(sql_1.UPDATE_CRON_SCHEDULE, [
|
|
60
|
+
id,
|
|
61
|
+
cronSchedule,
|
|
62
|
+
cronEnvelope ? JSON.stringify(cronEnvelope) : null,
|
|
63
|
+
executeAs,
|
|
64
|
+
]);
|
|
65
|
+
return rows[0] || null;
|
|
66
|
+
}
|
|
67
|
+
async function clearCronSchedule(id) {
|
|
68
|
+
const pool = (0, db_1.getPool)();
|
|
69
|
+
const { rows } = await pool.query(sql_1.CLEAR_CRON_SCHEDULE, [id]);
|
|
70
|
+
return rows[0] || null;
|
|
71
|
+
}
|
|
72
|
+
async function getCronScheduledWorkflows() {
|
|
73
|
+
const pool = (0, db_1.getPool)();
|
|
74
|
+
const { rows } = await pool.query(sql_1.GET_CRON_SCHEDULED_WORKFLOWS);
|
|
75
|
+
return rows;
|
|
76
|
+
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import type { LTYamlWorkflowRecord
|
|
1
|
+
import type { LTYamlWorkflowRecord } from '../../types/yaml-workflow';
|
|
2
2
|
import type { CreateYamlWorkflowInput } from './types';
|
|
3
3
|
export { parseVersionFromYaml, updateYamlWorkflowStatus, listYamlWorkflows, findYamlWorkflowsByTags, } from './db-utils';
|
|
4
|
+
export { createVersionSnapshot, getVersionHistory, getVersionSnapshot, markContentDeployed, markAppIdContentDeployed, updateCronSchedule, clearCronSchedule, getCronScheduledWorkflows, } from './db-versions';
|
|
4
5
|
/**
|
|
5
6
|
* Check whether a graph_topic is already in use by a non-archived workflow
|
|
6
7
|
* in the same namespace. Returns the conflicting workflow name, or null.
|
|
@@ -30,18 +31,7 @@ export declare function listYamlWorkflowsByAppId(appId: string): Promise<LTYamlW
|
|
|
30
31
|
*
|
|
31
32
|
* A new namespace with no workflows returns '1'.
|
|
32
33
|
* An existing namespace with one active tool at v1 returns '2' when a
|
|
33
|
-
* second tool is added
|
|
34
|
+
* second tool is added -- even though that second tool is "version 1" of itself.
|
|
34
35
|
*/
|
|
35
36
|
export declare function getNextAppVersion(appId: string): Promise<string>;
|
|
36
37
|
export declare function getDistinctAppIds(): Promise<string[]>;
|
|
37
|
-
export declare function createVersionSnapshot(workflowId: string, version: number, yamlContent: string, activityManifest: ActivityManifestEntry[] | unknown, inputSchema: Record<string, unknown> | unknown, outputSchema: Record<string, unknown> | unknown, inputFieldMeta?: unknown, changeSummary?: string): Promise<LTYamlWorkflowVersionRecord>;
|
|
38
|
-
export declare function getVersionHistory(workflowId: string, limit?: number, offset?: number): Promise<{
|
|
39
|
-
versions: LTYamlWorkflowVersionRecord[];
|
|
40
|
-
total: number;
|
|
41
|
-
}>;
|
|
42
|
-
export declare function getVersionSnapshot(workflowId: string, version: number): Promise<LTYamlWorkflowVersionRecord | null>;
|
|
43
|
-
export declare function markContentDeployed(workflowId: string): Promise<void>;
|
|
44
|
-
export declare function markAppIdContentDeployed(appId: string): Promise<void>;
|
|
45
|
-
export declare function updateCronSchedule(id: string, cronSchedule: string, cronEnvelope: Record<string, unknown> | null, executeAs: string | null): Promise<LTYamlWorkflowRecord | null>;
|
|
46
|
-
export declare function clearCronSchedule(id: string): Promise<LTYamlWorkflowRecord | null>;
|
|
47
|
-
export declare function getCronScheduledWorkflows(): Promise<LTYamlWorkflowRecord[]>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.findYamlWorkflowsByTags = exports.listYamlWorkflows = exports.updateYamlWorkflowStatus = exports.parseVersionFromYaml = void 0;
|
|
3
|
+
exports.getCronScheduledWorkflows = exports.clearCronSchedule = exports.updateCronSchedule = exports.markAppIdContentDeployed = exports.markContentDeployed = exports.getVersionSnapshot = exports.getVersionHistory = exports.createVersionSnapshot = exports.findYamlWorkflowsByTags = exports.listYamlWorkflows = exports.updateYamlWorkflowStatus = exports.parseVersionFromYaml = void 0;
|
|
4
4
|
exports.checkTopicConflict = checkTopicConflict;
|
|
5
5
|
exports.createYamlWorkflow = createYamlWorkflow;
|
|
6
6
|
exports.getYamlWorkflow = getYamlWorkflow;
|
|
@@ -13,24 +13,26 @@ exports.getActiveYamlWorkflows = getActiveYamlWorkflows;
|
|
|
13
13
|
exports.listYamlWorkflowsByAppId = listYamlWorkflowsByAppId;
|
|
14
14
|
exports.getNextAppVersion = getNextAppVersion;
|
|
15
15
|
exports.getDistinctAppIds = getDistinctAppIds;
|
|
16
|
-
exports.createVersionSnapshot = createVersionSnapshot;
|
|
17
|
-
exports.getVersionHistory = getVersionHistory;
|
|
18
|
-
exports.getVersionSnapshot = getVersionSnapshot;
|
|
19
|
-
exports.markContentDeployed = markContentDeployed;
|
|
20
|
-
exports.markAppIdContentDeployed = markAppIdContentDeployed;
|
|
21
|
-
exports.updateCronSchedule = updateCronSchedule;
|
|
22
|
-
exports.clearCronSchedule = clearCronSchedule;
|
|
23
|
-
exports.getCronScheduledWorkflows = getCronScheduledWorkflows;
|
|
24
16
|
const db_1 = require("../../lib/db");
|
|
25
|
-
const defaults_1 = require("../../modules/defaults");
|
|
26
17
|
const sql_1 = require("./sql");
|
|
27
18
|
const db_utils_1 = require("./db-utils");
|
|
19
|
+
const db_versions_1 = require("./db-versions");
|
|
28
20
|
// Re-export functions from db-utils
|
|
29
21
|
var db_utils_2 = require("./db-utils");
|
|
30
22
|
Object.defineProperty(exports, "parseVersionFromYaml", { enumerable: true, get: function () { return db_utils_2.parseVersionFromYaml; } });
|
|
31
23
|
Object.defineProperty(exports, "updateYamlWorkflowStatus", { enumerable: true, get: function () { return db_utils_2.updateYamlWorkflowStatus; } });
|
|
32
24
|
Object.defineProperty(exports, "listYamlWorkflows", { enumerable: true, get: function () { return db_utils_2.listYamlWorkflows; } });
|
|
33
25
|
Object.defineProperty(exports, "findYamlWorkflowsByTags", { enumerable: true, get: function () { return db_utils_2.findYamlWorkflowsByTags; } });
|
|
26
|
+
// Re-export version history and cron scheduling from db-versions
|
|
27
|
+
var db_versions_2 = require("./db-versions");
|
|
28
|
+
Object.defineProperty(exports, "createVersionSnapshot", { enumerable: true, get: function () { return db_versions_2.createVersionSnapshot; } });
|
|
29
|
+
Object.defineProperty(exports, "getVersionHistory", { enumerable: true, get: function () { return db_versions_2.getVersionHistory; } });
|
|
30
|
+
Object.defineProperty(exports, "getVersionSnapshot", { enumerable: true, get: function () { return db_versions_2.getVersionSnapshot; } });
|
|
31
|
+
Object.defineProperty(exports, "markContentDeployed", { enumerable: true, get: function () { return db_versions_2.markContentDeployed; } });
|
|
32
|
+
Object.defineProperty(exports, "markAppIdContentDeployed", { enumerable: true, get: function () { return db_versions_2.markAppIdContentDeployed; } });
|
|
33
|
+
Object.defineProperty(exports, "updateCronSchedule", { enumerable: true, get: function () { return db_versions_2.updateCronSchedule; } });
|
|
34
|
+
Object.defineProperty(exports, "clearCronSchedule", { enumerable: true, get: function () { return db_versions_2.clearCronSchedule; } });
|
|
35
|
+
Object.defineProperty(exports, "getCronScheduledWorkflows", { enumerable: true, get: function () { return db_versions_2.getCronScheduledWorkflows; } });
|
|
34
36
|
/**
|
|
35
37
|
* Check whether a graph_topic is already in use by a non-archived workflow
|
|
36
38
|
* in the same namespace. Returns the conflicting workflow name, or null.
|
|
@@ -68,7 +70,7 @@ async function createYamlWorkflow(input) {
|
|
|
68
70
|
input.set_build_order ?? null,
|
|
69
71
|
]);
|
|
70
72
|
const record = rows[0];
|
|
71
|
-
await createVersionSnapshot(record.id, 1, record.yaml_content, input.activity_manifest || [], input.input_schema || {}, input.output_schema || {}, input.input_field_meta || [], 'Initial version');
|
|
73
|
+
await (0, db_versions_1.createVersionSnapshot)(record.id, 1, record.yaml_content, input.activity_manifest || [], input.input_schema || {}, input.output_schema || {}, input.input_field_meta || [], 'Initial version');
|
|
72
74
|
return record;
|
|
73
75
|
}
|
|
74
76
|
async function getYamlWorkflow(id) {
|
|
@@ -145,7 +147,7 @@ async function updateYamlWorkflow(id, updates) {
|
|
|
145
147
|
const { rows } = await pool.query(`UPDATE lt_yaml_workflows SET ${sets.join(', ')} WHERE id = $${idx} RETURNING *`, values);
|
|
146
148
|
const record = rows[0] || null;
|
|
147
149
|
if (record && yamlChanging) {
|
|
148
|
-
await createVersionSnapshot(record.id, record.content_version, record.yaml_content, record.activity_manifest, record.input_schema, record.output_schema, record.input_field_meta);
|
|
150
|
+
await (0, db_versions_1.createVersionSnapshot)(record.id, record.content_version, record.yaml_content, record.activity_manifest, record.input_schema, record.output_schema, record.input_field_meta);
|
|
149
151
|
}
|
|
150
152
|
return record;
|
|
151
153
|
}
|
|
@@ -182,7 +184,7 @@ async function listYamlWorkflowsByAppId(appId) {
|
|
|
182
184
|
*
|
|
183
185
|
* A new namespace with no workflows returns '1'.
|
|
184
186
|
* An existing namespace with one active tool at v1 returns '2' when a
|
|
185
|
-
* second tool is added
|
|
187
|
+
* second tool is added -- even though that second tool is "version 1" of itself.
|
|
186
188
|
*/
|
|
187
189
|
async function getNextAppVersion(appId) {
|
|
188
190
|
const pool = (0, db_1.getPool)();
|
|
@@ -195,61 +197,3 @@ async function getDistinctAppIds() {
|
|
|
195
197
|
const { rows } = await pool.query(sql_1.GET_DISTINCT_APP_IDS);
|
|
196
198
|
return rows.map((r) => r.app_id);
|
|
197
199
|
}
|
|
198
|
-
// -- Version history ---------------------------------------------------------
|
|
199
|
-
async function createVersionSnapshot(workflowId, version, yamlContent, activityManifest, inputSchema, outputSchema, inputFieldMeta, changeSummary) {
|
|
200
|
-
const pool = (0, db_1.getPool)();
|
|
201
|
-
const { rows } = await pool.query(sql_1.CREATE_VERSION_SNAPSHOT, [
|
|
202
|
-
workflowId, version, yamlContent,
|
|
203
|
-
JSON.stringify(activityManifest),
|
|
204
|
-
JSON.stringify(inputSchema),
|
|
205
|
-
JSON.stringify(outputSchema),
|
|
206
|
-
JSON.stringify(inputFieldMeta || []),
|
|
207
|
-
changeSummary || null,
|
|
208
|
-
]);
|
|
209
|
-
return rows[0];
|
|
210
|
-
}
|
|
211
|
-
async function getVersionHistory(workflowId, limit = defaults_1.YAML_VERSION_LIMIT, offset = 0) {
|
|
212
|
-
const pool = (0, db_1.getPool)();
|
|
213
|
-
const [countResult, dataResult] = await Promise.all([
|
|
214
|
-
pool.query(sql_1.COUNT_VERSIONS, [workflowId]),
|
|
215
|
-
pool.query(sql_1.LIST_VERSIONS, [workflowId, limit, offset]),
|
|
216
|
-
]);
|
|
217
|
-
return {
|
|
218
|
-
versions: dataResult.rows,
|
|
219
|
-
total: parseInt(countResult.rows[0].count, 10),
|
|
220
|
-
};
|
|
221
|
-
}
|
|
222
|
-
async function getVersionSnapshot(workflowId, version) {
|
|
223
|
-
const pool = (0, db_1.getPool)();
|
|
224
|
-
const { rows } = await pool.query(sql_1.GET_VERSION_SNAPSHOT, [workflowId, version]);
|
|
225
|
-
return rows[0] || null;
|
|
226
|
-
}
|
|
227
|
-
async function markContentDeployed(workflowId) {
|
|
228
|
-
const pool = (0, db_1.getPool)();
|
|
229
|
-
await pool.query(sql_1.MARK_CONTENT_DEPLOYED, [workflowId]);
|
|
230
|
-
}
|
|
231
|
-
async function markAppIdContentDeployed(appId) {
|
|
232
|
-
const pool = (0, db_1.getPool)();
|
|
233
|
-
await pool.query(sql_1.MARK_APP_ID_CONTENT_DEPLOYED, [appId]);
|
|
234
|
-
}
|
|
235
|
-
// -- Cron scheduling ---------------------------------------------------------
|
|
236
|
-
async function updateCronSchedule(id, cronSchedule, cronEnvelope, executeAs) {
|
|
237
|
-
const pool = (0, db_1.getPool)();
|
|
238
|
-
const { rows } = await pool.query(sql_1.UPDATE_CRON_SCHEDULE, [
|
|
239
|
-
id,
|
|
240
|
-
cronSchedule,
|
|
241
|
-
cronEnvelope ? JSON.stringify(cronEnvelope) : null,
|
|
242
|
-
executeAs,
|
|
243
|
-
]);
|
|
244
|
-
return rows[0] || null;
|
|
245
|
-
}
|
|
246
|
-
async function clearCronSchedule(id) {
|
|
247
|
-
const pool = (0, db_1.getPool)();
|
|
248
|
-
const { rows } = await pool.query(sql_1.CLEAR_CRON_SCHEDULE, [id]);
|
|
249
|
-
return rows[0] || null;
|
|
250
|
-
}
|
|
251
|
-
async function getCronScheduledWorkflows() {
|
|
252
|
-
const pool = (0, db_1.getPool)();
|
|
253
|
-
const { rows } = await pool.query(sql_1.GET_CRON_SCHEDULED_WORKFLOWS);
|
|
254
|
-
return rows;
|
|
255
|
-
}
|
|
@@ -56,27 +56,28 @@ async function buildMergedYaml(appId, version) {
|
|
|
56
56
|
allGraphs.push(...parsed.app.graphs);
|
|
57
57
|
}
|
|
58
58
|
}
|
|
59
|
-
//
|
|
60
|
-
const activityIds = new
|
|
61
|
-
const duplicates = [];
|
|
59
|
+
// Resolve duplicate activity IDs across graphs by rewriting suffixes
|
|
60
|
+
const activityIds = new Set();
|
|
62
61
|
for (const graph of allGraphs) {
|
|
63
62
|
const g = graph;
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
63
|
+
if (!g.activities)
|
|
64
|
+
continue;
|
|
65
|
+
// Check if any activity IDs collide with previously seen IDs
|
|
66
|
+
const ids = Object.keys(g.activities);
|
|
67
|
+
const hasCollision = ids.some((id) => activityIds.has(id));
|
|
68
|
+
if (hasCollision) {
|
|
69
|
+
// Rewrite all activity IDs in this graph with a unique suffix
|
|
70
|
+
const newSuffix = Math.random().toString(36).slice(2, 6);
|
|
71
|
+
const oldSuffix = extractSuffix(ids[0]);
|
|
72
|
+
if (oldSuffix) {
|
|
73
|
+
rewriteGraphSuffix(g, oldSuffix, newSuffix);
|
|
74
|
+
logger_1.loggerRegistry.info(`[yaml-workflow] rewrote activity suffix ${oldSuffix}→${newSuffix} in "${g.subscribes}" to resolve collision`);
|
|
73
75
|
}
|
|
74
76
|
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
throw new Error(msg);
|
|
77
|
+
// Register all (possibly rewritten) activity IDs
|
|
78
|
+
for (const id of Object.keys(g.activities)) {
|
|
79
|
+
activityIds.add(id);
|
|
80
|
+
}
|
|
80
81
|
}
|
|
81
82
|
const merged = {
|
|
82
83
|
app: {
|
|
@@ -87,6 +88,36 @@ async function buildMergedYaml(appId, version) {
|
|
|
87
88
|
};
|
|
88
89
|
return yaml.dump(merged, { lineWidth: defaults_1.YAML_LINE_WIDTH, noRefs: true, sortKeys: false });
|
|
89
90
|
}
|
|
91
|
+
/** Extract the 4-char suffix from an activity ID like "trigger_x8kf" */
|
|
92
|
+
function extractSuffix(activityId) {
|
|
93
|
+
const match = activityId.match(/_([a-z0-9]{4})$/);
|
|
94
|
+
return match ? match[1] : null;
|
|
95
|
+
}
|
|
96
|
+
/** Rewrite all activity ID suffixes in a graph definition */
|
|
97
|
+
function rewriteGraphSuffix(graph, oldSuffix, newSuffix) {
|
|
98
|
+
const suffixPattern = new RegExp(`_${oldSuffix}\\b`, 'g');
|
|
99
|
+
const replace = (obj) => {
|
|
100
|
+
if (typeof obj === 'string')
|
|
101
|
+
return obj.replace(suffixPattern, `_${newSuffix}`);
|
|
102
|
+
if (Array.isArray(obj))
|
|
103
|
+
return obj.map(replace);
|
|
104
|
+
if (obj && typeof obj === 'object') {
|
|
105
|
+
const result = {};
|
|
106
|
+
for (const [k, v] of Object.entries(obj)) {
|
|
107
|
+
const newKey = k.replace(suffixPattern, `_${newSuffix}`);
|
|
108
|
+
result[newKey] = replace(v);
|
|
109
|
+
}
|
|
110
|
+
return result;
|
|
111
|
+
}
|
|
112
|
+
return obj;
|
|
113
|
+
};
|
|
114
|
+
if (graph.activities)
|
|
115
|
+
graph.activities = replace(graph.activities);
|
|
116
|
+
if (graph.transitions)
|
|
117
|
+
graph.transitions = replace(graph.transitions);
|
|
118
|
+
if (graph.hooks)
|
|
119
|
+
graph.hooks = replace(graph.hooks);
|
|
120
|
+
}
|
|
90
121
|
/**
|
|
91
122
|
* Re-run the compilation pipeline for the most recently compiled workflow
|
|
92
123
|
* in the app, feeding the deployment error as context so the LLM can
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Durable-to-YAML compiler — converts procedural TypeScript workflows to YAML DAGs.
|
|
3
|
+
*
|
|
4
|
+
* This is "Path 3" for YAML DAG creation: static compilation from durable source
|
|
5
|
+
* code without executing the workflow. The LLM translates the procedural orchestration
|
|
6
|
+
* into an equivalent HotMesh YAML DAG that runs without replay overhead.
|
|
7
|
+
*
|
|
8
|
+
* Pipeline:
|
|
9
|
+
* 1. Read source (file or inline string)
|
|
10
|
+
* 2. Optionally resolve and read the activities module
|
|
11
|
+
* 3. Extract metadata (activity names, primitives, control flow)
|
|
12
|
+
* 4. Build LLM messages (system prompt + source + metadata)
|
|
13
|
+
* 5. Call LLM (temperature 0, retry on parse failure)
|
|
14
|
+
* 6. Fix known @pipe anti-patterns
|
|
15
|
+
* 7. Return result compatible with existing YAML workflow CRUD
|
|
16
|
+
*/
|
|
17
|
+
import type { CompileDurableOptions, CompileDurableResult } from './types';
|
|
18
|
+
export type { CompileDurableOptions, CompileDurableResult } from './types';
|
|
19
|
+
/**
|
|
20
|
+
* Compile a durable TypeScript workflow into a HotMesh YAML DAG.
|
|
21
|
+
*/
|
|
22
|
+
export declare function compileDurableToYaml(options: CompileDurableOptions): Promise<CompileDurableResult>;
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Durable-to-YAML compiler — converts procedural TypeScript workflows to YAML DAGs.
|
|
4
|
+
*
|
|
5
|
+
* This is "Path 3" for YAML DAG creation: static compilation from durable source
|
|
6
|
+
* code without executing the workflow. The LLM translates the procedural orchestration
|
|
7
|
+
* into an equivalent HotMesh YAML DAG that runs without replay overhead.
|
|
8
|
+
*
|
|
9
|
+
* Pipeline:
|
|
10
|
+
* 1. Read source (file or inline string)
|
|
11
|
+
* 2. Optionally resolve and read the activities module
|
|
12
|
+
* 3. Extract metadata (activity names, primitives, control flow)
|
|
13
|
+
* 4. Build LLM messages (system prompt + source + metadata)
|
|
14
|
+
* 5. Call LLM (temperature 0, retry on parse failure)
|
|
15
|
+
* 6. Fix known @pipe anti-patterns
|
|
16
|
+
* 7. Return result compatible with existing YAML workflow CRUD
|
|
17
|
+
*/
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.compileDurableToYaml = compileDurableToYaml;
|
|
20
|
+
const promises_1 = require("fs/promises");
|
|
21
|
+
const path_1 = require("path");
|
|
22
|
+
const llm_1 = require("../../llm");
|
|
23
|
+
const defaults_1 = require("../../../modules/defaults");
|
|
24
|
+
const logger_1 = require("../../../lib/logger");
|
|
25
|
+
const utils_1 = require("../../../modules/utils");
|
|
26
|
+
const parser_1 = require("./parser");
|
|
27
|
+
const prompts_1 = require("./prompts");
|
|
28
|
+
const MAX_COMPILE_ATTEMPTS = 3;
|
|
29
|
+
const COMPILER_MAX_TOKENS = 8192;
|
|
30
|
+
/**
|
|
31
|
+
* Compile a durable TypeScript workflow into a HotMesh YAML DAG.
|
|
32
|
+
*/
|
|
33
|
+
async function compileDurableToYaml(options) {
|
|
34
|
+
const appId = options.appId || 'longtail';
|
|
35
|
+
const graphTopic = options.subscribes || (0, utils_1.sanitizeToolName)(options.name);
|
|
36
|
+
// 1. Read source
|
|
37
|
+
const source = options.isFilePath
|
|
38
|
+
? await (0, promises_1.readFile)(options.source, 'utf-8')
|
|
39
|
+
: options.source;
|
|
40
|
+
// 2. Extract metadata
|
|
41
|
+
const metadata = (0, parser_1.extractDurableMetadata)(source, options.workflowName);
|
|
42
|
+
// 3. Optionally resolve and read activities module
|
|
43
|
+
let activitiesSource;
|
|
44
|
+
if (options.isFilePath && metadata.activityImports.length > 0) {
|
|
45
|
+
activitiesSource = await resolveActivitiesSource(options.source, metadata.activityImports);
|
|
46
|
+
}
|
|
47
|
+
// 4. Load activity types reference
|
|
48
|
+
const activityTypesRef = await loadActivityTypesReference();
|
|
49
|
+
// 5. Build LLM messages
|
|
50
|
+
const messages = [
|
|
51
|
+
{
|
|
52
|
+
role: 'system',
|
|
53
|
+
content: (0, prompts_1.DURABLE_COMPILER_SYSTEM_PROMPT)(activityTypesRef, metadata),
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
role: 'user',
|
|
57
|
+
content: (0, prompts_1.buildUserMessage)(source, metadata, activitiesSource),
|
|
58
|
+
},
|
|
59
|
+
];
|
|
60
|
+
// 6. Call LLM with retry on parse failure
|
|
61
|
+
let parsed = null;
|
|
62
|
+
let lastError = '';
|
|
63
|
+
for (let attempt = 1; attempt <= MAX_COMPILE_ATTEMPTS; attempt++) {
|
|
64
|
+
const t0 = Date.now();
|
|
65
|
+
const response = await (0, llm_1.callLLM)({
|
|
66
|
+
model: defaults_1.LLM_MODEL_PRIMARY,
|
|
67
|
+
messages,
|
|
68
|
+
temperature: 0,
|
|
69
|
+
max_tokens: COMPILER_MAX_TOKENS,
|
|
70
|
+
});
|
|
71
|
+
logger_1.loggerRegistry.info(`[durable-compiler] attempt=${attempt} ${Date.now() - t0}ms | in=${response.usage?.prompt_tokens} out=${response.usage?.completion_tokens}`);
|
|
72
|
+
const content = response.content || '';
|
|
73
|
+
try {
|
|
74
|
+
parsed = parseJsonResponse(content);
|
|
75
|
+
break;
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
lastError = err.message;
|
|
79
|
+
logger_1.loggerRegistry.warn(`[durable-compiler] JSON parse failed (attempt ${attempt}): ${lastError}`);
|
|
80
|
+
// Feed error back for retry
|
|
81
|
+
messages.push({ role: 'assistant', content });
|
|
82
|
+
messages.push({
|
|
83
|
+
role: 'user',
|
|
84
|
+
content: `Your response was not valid JSON. Error: ${lastError}\n\nPlease return ONLY the JSON object with no markdown fences or surrounding text.`,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (!parsed) {
|
|
89
|
+
throw new Error(`[durable-compiler] Failed to get valid JSON after ${MAX_COMPILE_ATTEMPTS} attempts. Last error: ${lastError}`);
|
|
90
|
+
}
|
|
91
|
+
// 7. Fix known @pipe anti-patterns
|
|
92
|
+
let yaml = fixPipePatterns(parsed.yaml || '');
|
|
93
|
+
// 7b. Rewrite app.id to match the target appId
|
|
94
|
+
yaml = yaml.replace(/^(\s*id:\s*)(.+)$/m, `$1${appId}`);
|
|
95
|
+
// 8. Extract the actual subscribes topic from the YAML (LLM may choose its own)
|
|
96
|
+
const subscribesMatch = yaml.match(/subscribes:\s*(.+)/);
|
|
97
|
+
const actualTopic = subscribesMatch
|
|
98
|
+
? subscribesMatch[1].trim().replace(/^['"]|['"]$/g, '')
|
|
99
|
+
: graphTopic;
|
|
100
|
+
// 9. Build result
|
|
101
|
+
return {
|
|
102
|
+
yaml,
|
|
103
|
+
inputSchema: parsed.input_schema || {},
|
|
104
|
+
outputSchema: parsed.output_schema || {},
|
|
105
|
+
activityManifest: parsed.activity_manifest || [],
|
|
106
|
+
graphTopic: actualTopic,
|
|
107
|
+
appId,
|
|
108
|
+
tags: parsed.tags || ['durable'],
|
|
109
|
+
inputFieldMeta: [],
|
|
110
|
+
category: 'durable',
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Parse a JSON response from the LLM, stripping markdown fences if present.
|
|
115
|
+
*/
|
|
116
|
+
function parseJsonResponse(content) {
|
|
117
|
+
let cleaned = content.trim();
|
|
118
|
+
// Strip markdown code fences
|
|
119
|
+
if (cleaned.startsWith('```')) {
|
|
120
|
+
cleaned = cleaned.replace(/^```(?:json)?\s*\n?/, '').replace(/\n?\s*```$/, '');
|
|
121
|
+
}
|
|
122
|
+
return JSON.parse(cleaned);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Fix known @pipe anti-patterns that LLMs consistently produce.
|
|
126
|
+
* Same fixes as the workflow-builder.
|
|
127
|
+
*/
|
|
128
|
+
function fixPipePatterns(yaml) {
|
|
129
|
+
// Fix: ['{@date.toISOString}'] then [0, 10] then ['{@string.substring}']
|
|
130
|
+
yaml = yaml.replace(/(\['\{@date\.toISOString\}'\])\s*\n(\s*)- \[0, 10\]\s*\n(\s*)- \['\{@string\.substring\}'\]/g, "['{@date.toISOString}', 0, 10]\n$2- ['{@string.substring}']");
|
|
131
|
+
return yaml;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Load the full activity-types.md reference file.
|
|
135
|
+
*/
|
|
136
|
+
async function loadActivityTypesReference() {
|
|
137
|
+
try {
|
|
138
|
+
const refPath = (0, path_1.join)(__dirname, '..', '..', '..', 'system', 'workflows', 'mcp-workflow-builder', 'reference', 'activity-types.md');
|
|
139
|
+
return await (0, promises_1.readFile)(refPath, 'utf-8');
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
// Fallback: return minimal reference if file not found
|
|
143
|
+
return '(Activity types reference not available — use trigger, worker, hook, await, cycle, signal, interrupt types as documented in HotMesh.)';
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Resolve and read activities source from import paths.
|
|
148
|
+
* Returns combined source of all activity modules found.
|
|
149
|
+
*/
|
|
150
|
+
async function resolveActivitiesSource(workflowFilePath, importPaths) {
|
|
151
|
+
const dir = (0, path_1.dirname)(workflowFilePath);
|
|
152
|
+
const sources = [];
|
|
153
|
+
for (const importPath of importPaths) {
|
|
154
|
+
// Try common extensions
|
|
155
|
+
const basePath = (0, path_1.resolve)(dir, importPath);
|
|
156
|
+
for (const ext of ['.ts', '/index.ts', '.js', '/index.js']) {
|
|
157
|
+
try {
|
|
158
|
+
const content = await (0, promises_1.readFile)(basePath + ext, 'utf-8');
|
|
159
|
+
sources.push(`// ${importPath}\n${content}`);
|
|
160
|
+
break;
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
// Try next extension
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return sources.length > 0 ? sources.join('\n\n') : undefined;
|
|
168
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight regex-based metadata extractor for durable workflow source.
|
|
3
|
+
*
|
|
4
|
+
* Extracts structural hints (activity names, primitives, control flow)
|
|
5
|
+
* that ground the LLM during compilation. This is NOT a full AST parser —
|
|
6
|
+
* it gives the LLM better context without requiring ts-morph or the TS compiler API.
|
|
7
|
+
*/
|
|
8
|
+
import type { DurableSourceMetadata } from './types';
|
|
9
|
+
/**
|
|
10
|
+
* Extract structural metadata from durable workflow TypeScript source.
|
|
11
|
+
*/
|
|
12
|
+
export declare function extractDurableMetadata(source: string, workflowFunctionName: string): DurableSourceMetadata;
|