@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.
Files changed (384) hide show
  1. package/README.md +47 -5
  2. package/build/api/auth.d.ts +16 -0
  3. package/build/api/auth.js +53 -0
  4. package/build/api/bot-accounts.d.ts +137 -0
  5. package/build/api/bot-accounts.js +302 -0
  6. package/build/api/controlplane.d.ts +68 -0
  7. package/build/api/controlplane.js +158 -0
  8. package/build/api/dba.d.ts +42 -0
  9. package/build/api/dba.js +95 -0
  10. package/build/api/escalations.d.ts +271 -0
  11. package/build/api/escalations.js +892 -0
  12. package/build/api/exports.d.ts +90 -0
  13. package/build/api/exports.js +204 -0
  14. package/build/api/index.d.ts +18 -0
  15. package/build/api/index.js +54 -0
  16. package/build/api/insight.d.ts +86 -0
  17. package/build/api/insight.js +147 -0
  18. package/build/api/maintenance.d.ts +22 -0
  19. package/build/api/maintenance.js +43 -0
  20. package/build/api/mcp-runs.d.ts +43 -0
  21. package/build/api/mcp-runs.js +89 -0
  22. package/build/api/mcp.d.ts +160 -0
  23. package/build/api/mcp.js +320 -0
  24. package/build/api/namespaces.d.ts +20 -0
  25. package/build/{routes/escalations/helpers.js → api/namespaces.js} +35 -10
  26. package/build/api/roles.d.ts +88 -0
  27. package/build/api/roles.js +217 -0
  28. package/build/api/settings.d.ts +10 -0
  29. package/build/api/settings.js +43 -0
  30. package/build/api/tasks.d.ts +70 -0
  31. package/build/api/tasks.js +139 -0
  32. package/build/api/users.d.ts +115 -0
  33. package/build/api/users.js +228 -0
  34. package/build/api/workflow-sets.d.ts +77 -0
  35. package/build/api/workflow-sets.js +170 -0
  36. package/build/api/workflows.d.ts +158 -0
  37. package/build/api/workflows.js +407 -0
  38. package/build/api/yaml-workflows.d.ts +282 -0
  39. package/build/api/yaml-workflows.js +751 -0
  40. package/build/examples/types/envelopes.d.ts +27 -0
  41. package/build/examples/types/index.d.ts +1 -1
  42. package/build/examples/workers.js +8 -0
  43. package/build/examples/workflows/assembly-line/activities.d.ts +28 -0
  44. package/build/examples/workflows/assembly-line/activities.js +53 -0
  45. package/build/examples/workflows/assembly-line/index.d.ts +17 -0
  46. package/build/examples/workflows/assembly-line/index.js +60 -0
  47. package/build/examples/workflows/assembly-line/iterator.d.ts +12 -0
  48. package/build/examples/workflows/assembly-line/iterator.js +54 -0
  49. package/build/examples/workflows/assembly-line/reverter.d.ts +18 -0
  50. package/build/examples/workflows/assembly-line/reverter.js +89 -0
  51. package/build/examples/workflows/assembly-line/types.d.ts +25 -0
  52. package/build/examples/workflows/assembly-line/types.js +8 -0
  53. package/build/examples/workflows/assembly-line/worker.d.ts +13 -0
  54. package/build/examples/workflows/assembly-line/worker.js +81 -0
  55. package/build/index.d.ts +4 -0
  56. package/build/index.js +6 -1
  57. package/build/lib/db/schemas/004_workflow_sets.sql +29 -0
  58. package/build/lib/db/schemas/005_unique_graph_topic.sql +7 -0
  59. package/build/lib/db/schemas/011_system_workflow_configs.sql +7 -0
  60. package/build/lib/events/callback.d.ts +41 -0
  61. package/build/lib/events/callback.js +98 -0
  62. package/build/modules/config.js +1 -1
  63. package/build/routes/auth.js +37 -36
  64. package/build/routes/bot-accounts.js +34 -164
  65. package/build/routes/controlplane.js +20 -60
  66. package/build/routes/dba.js +18 -28
  67. package/build/routes/escalations/bulk.js +17 -192
  68. package/build/routes/escalations/list.js +51 -75
  69. package/build/routes/escalations/resolve.js +3 -193
  70. package/build/routes/escalations/single.js +13 -122
  71. package/build/routes/exports.js +44 -95
  72. package/build/routes/index.js +2 -0
  73. package/build/routes/insight.js +46 -88
  74. package/build/routes/maintenance.js +41 -17
  75. package/build/routes/mcp-runs.js +52 -60
  76. package/build/routes/mcp.js +49 -177
  77. package/build/routes/namespaces.js +9 -20
  78. package/build/routes/roles.js +23 -97
  79. package/build/routes/settings.js +37 -25
  80. package/build/routes/tasks.js +28 -64
  81. package/build/routes/users.js +24 -113
  82. package/build/routes/workflow-sets.d.ts +2 -0
  83. package/build/routes/workflow-sets.js +98 -0
  84. package/build/routes/workflows/config.js +23 -57
  85. package/build/routes/workflows/discovery.js +11 -85
  86. package/build/routes/workflows/invocation.js +28 -90
  87. package/build/routes/yaml-workflows/cron.js +12 -61
  88. package/build/routes/yaml-workflows/crud.js +30 -223
  89. package/build/routes/yaml-workflows/deployment.js +15 -115
  90. package/build/routes/yaml-workflows/versions.js +20 -58
  91. package/build/sdk/index.d.ts +338 -0
  92. package/build/sdk/index.js +299 -0
  93. package/build/services/controlplane/index.d.ts +1 -2
  94. package/build/services/controlplane/index.js +3 -3
  95. package/build/services/controlplane/sql.d.ts +2 -2
  96. package/build/services/controlplane/sql.js +4 -5
  97. package/build/services/controlplane/types.d.ts +1 -0
  98. package/build/services/export/index.js +6 -1
  99. package/build/services/hotmesh-utils.js +2 -4
  100. package/build/services/insight/index.d.ts +7 -0
  101. package/build/services/insight/index.js +30 -0
  102. package/build/services/mcp/client/tools.js +13 -1
  103. package/build/services/mcp-runs/sql.js +1 -1
  104. package/build/services/workflow-invocation.d.ts +15 -2
  105. package/build/services/workflow-invocation.js +11 -6
  106. package/build/services/workflow-sets/db.d.ts +16 -0
  107. package/build/services/workflow-sets/db.js +78 -0
  108. package/build/services/workflow-sets/index.d.ts +1 -0
  109. package/build/services/workflow-sets/index.js +11 -0
  110. package/build/services/workflow-sets/sql.d.ts +6 -0
  111. package/build/services/workflow-sets/sql.js +24 -0
  112. package/build/services/yaml-workflow/db-utils.d.ts +1 -0
  113. package/build/services/yaml-workflow/db-utils.js +4 -0
  114. package/build/services/yaml-workflow/db.d.ts +5 -0
  115. package/build/services/yaml-workflow/db.js +17 -0
  116. package/build/services/yaml-workflow/pipeline/build/wiring.js +14 -1
  117. package/build/services/yaml-workflow/pipeline/prompts.d.ts +1 -1
  118. package/build/services/yaml-workflow/pipeline/prompts.js +1 -1
  119. package/build/services/yaml-workflow/sql.d.ts +2 -1
  120. package/build/services/yaml-workflow/sql.js +8 -3
  121. package/build/services/yaml-workflow/types.d.ts +3 -0
  122. package/build/services/yaml-workflow/workers/callbacks.js +7 -1
  123. package/build/services/yaml-workflow/workers/register.js +7 -0
  124. package/build/start/adapters.js +4 -0
  125. package/build/system/index.js +6 -0
  126. package/build/system/mcp-servers/knowledge.js +1 -1
  127. package/build/system/seed/server-definitions.js +2 -1
  128. package/build/system/workflows/mcp-workflow-builder/activities/index.d.ts +1 -1
  129. package/build/system/workflows/mcp-workflow-builder/activities/index.js +2 -1
  130. package/build/system/workflows/mcp-workflow-builder/activities/tool-loader.d.ts +6 -0
  131. package/build/system/workflows/mcp-workflow-builder/activities/tool-loader.js +26 -0
  132. package/build/system/workflows/mcp-workflow-builder/index.js +26 -2
  133. package/build/system/workflows/mcp-workflow-builder/prompts.js +104 -35
  134. package/build/system/workflows/mcp-workflow-planner/activities/analyze.d.ts +11 -0
  135. package/build/system/workflows/mcp-workflow-planner/activities/analyze.js +36 -0
  136. package/build/system/workflows/mcp-workflow-planner/activities/index.d.ts +3 -0
  137. package/build/system/workflows/mcp-workflow-planner/activities/index.js +12 -0
  138. package/build/system/workflows/mcp-workflow-planner/activities/persist.d.ts +19 -0
  139. package/build/system/workflows/mcp-workflow-planner/activities/persist.js +55 -0
  140. package/build/system/workflows/mcp-workflow-planner/activities/plan.d.ts +10 -0
  141. package/build/system/workflows/mcp-workflow-planner/activities/plan.js +43 -0
  142. package/build/system/workflows/mcp-workflow-planner/index.d.ts +7 -0
  143. package/build/system/workflows/mcp-workflow-planner/index.js +152 -0
  144. package/build/system/workflows/mcp-workflow-planner/prompts.d.ts +7 -0
  145. package/build/system/workflows/mcp-workflow-planner/prompts.js +77 -0
  146. package/build/tsconfig.tsbuildinfo +1 -1
  147. package/build/types/index.d.ts +1 -0
  148. package/build/types/sdk.d.ts +27 -0
  149. package/build/types/sdk.js +2 -0
  150. package/build/types/workflow-set.d.ts +44 -0
  151. package/build/types/workflow-set.js +5 -0
  152. package/dashboard/dist/assets/{AdminDashboard-BXkKGkb5.js → AdminDashboard-B15jSEV2.js} +2 -2
  153. package/dashboard/dist/assets/{AdminDashboard-BXkKGkb5.js.map → AdminDashboard-B15jSEV2.js.map} +1 -1
  154. package/dashboard/dist/assets/{AvailableEscalationsPage-DcH592mc.js → AvailableEscalationsPage-0V2yvKak.js} +2 -2
  155. package/dashboard/dist/assets/{AvailableEscalationsPage-DcH592mc.js.map → AvailableEscalationsPage-0V2yvKak.js.map} +1 -1
  156. package/dashboard/dist/assets/BotPicker-B4UxHcek.js +2 -0
  157. package/dashboard/dist/assets/{BotPicker-A6LtzyuO.js.map → BotPicker-B4UxHcek.js.map} +1 -1
  158. package/dashboard/dist/assets/{CollapsibleSection-C7nL2_mv.js → CollapsibleSection-BBexNWVd.js} +2 -2
  159. package/dashboard/dist/assets/{CollapsibleSection-C7nL2_mv.js.map → CollapsibleSection-BBexNWVd.js.map} +1 -1
  160. package/dashboard/dist/assets/{ConfirmDeleteModal-CWFwJrSl.js → ConfirmDeleteModal-DlPDJSq_.js} +2 -2
  161. package/dashboard/dist/assets/{ConfirmDeleteModal-CWFwJrSl.js.map → ConfirmDeleteModal-DlPDJSq_.js.map} +1 -1
  162. package/dashboard/dist/assets/{CopyableId-DbZ5c3jh.js → CopyableId-BxHW1ahb.js} +2 -2
  163. package/dashboard/dist/assets/{CopyableId-DbZ5c3jh.js.map → CopyableId-BxHW1ahb.js.map} +1 -1
  164. package/dashboard/dist/assets/{CredentialsPage-ClWkmLPu.js → CredentialsPage-Bp_Y1Szk.js} +2 -2
  165. package/dashboard/dist/assets/{CredentialsPage-ClWkmLPu.js.map → CredentialsPage-Bp_Y1Szk.js.map} +1 -1
  166. package/dashboard/dist/assets/{CustomDurationPicker-CtH2hReF.js → CustomDurationPicker-ByBFqXSO.js} +2 -2
  167. package/dashboard/dist/assets/{CustomDurationPicker-CtH2hReF.js.map → CustomDurationPicker-ByBFqXSO.js.map} +1 -1
  168. package/dashboard/dist/assets/{DataTable-CM5ZcpPi.js → DataTable-DyIXg-tQ.js} +2 -2
  169. package/dashboard/dist/assets/{DataTable-CM5ZcpPi.js.map → DataTable-DyIXg-tQ.js.map} +1 -1
  170. package/dashboard/dist/assets/{ElapsedCell-CwqavyeC.js → ElapsedCell-BgnA0qpS.js} +2 -2
  171. package/dashboard/dist/assets/{ElapsedCell-CwqavyeC.js.map → ElapsedCell-BgnA0qpS.js.map} +1 -1
  172. package/dashboard/dist/assets/{EmptyState-BBn78pmm.js → EmptyState-DlMImvgm.js} +2 -2
  173. package/dashboard/dist/assets/{EmptyState-BBn78pmm.js.map → EmptyState-DlMImvgm.js.map} +1 -1
  174. package/dashboard/dist/assets/{EscalationsOverview-BcJ2E3X7.js → EscalationsOverview-D90kdfw1.js} +2 -2
  175. package/dashboard/dist/assets/{EscalationsOverview-BcJ2E3X7.js.map → EscalationsOverview-D90kdfw1.js.map} +1 -1
  176. package/dashboard/dist/assets/{EventTable-C1en_KZ0.js → EventTable-BNxtlgNz.js} +2 -2
  177. package/dashboard/dist/assets/{EventTable-C1en_KZ0.js.map → EventTable-BNxtlgNz.js.map} +1 -1
  178. package/dashboard/dist/assets/{FilterBar-CZTlrLQT.js → FilterBar-BTiaAhCx.js} +2 -2
  179. package/dashboard/dist/assets/{FilterBar-CZTlrLQT.js.map → FilterBar-BTiaAhCx.js.map} +1 -1
  180. package/dashboard/dist/assets/{ListToolbar-Cdbsapig.js → ListToolbar-BUcagSCn.js} +2 -2
  181. package/dashboard/dist/assets/{ListToolbar-Cdbsapig.js.map → ListToolbar-BUcagSCn.js.map} +1 -1
  182. package/dashboard/dist/assets/{McpOverview-CSpEJxKa.js → McpOverview-B-tCvz8C.js} +2 -2
  183. package/dashboard/dist/assets/{McpOverview-CSpEJxKa.js.map → McpOverview-B-tCvz8C.js.map} +1 -1
  184. package/dashboard/dist/assets/McpQueryDetailPage-DPlF1wYb.js +5 -0
  185. package/dashboard/dist/assets/McpQueryDetailPage-DPlF1wYb.js.map +1 -0
  186. package/dashboard/dist/assets/McpQueryPage-Bz7AdcfR.js +2 -0
  187. package/dashboard/dist/assets/McpQueryPage-Bz7AdcfR.js.map +1 -0
  188. package/dashboard/dist/assets/{McpRunDetailPage-9xdxgG4d.js → McpRunDetailPage-Di_qpL2V.js} +2 -2
  189. package/dashboard/dist/assets/{McpRunDetailPage-9xdxgG4d.js.map → McpRunDetailPage-Di_qpL2V.js.map} +1 -1
  190. package/dashboard/dist/assets/{McpRunsPage-wWLqHsd4.js → McpRunsPage-BBgybBEa.js} +2 -2
  191. package/dashboard/dist/assets/{McpRunsPage-wWLqHsd4.js.map → McpRunsPage-BBgybBEa.js.map} +1 -1
  192. package/dashboard/dist/assets/{Modal-kB_P7ZOr.js → Modal-CaJ0gTEa.js} +2 -2
  193. package/dashboard/dist/assets/{Modal-kB_P7ZOr.js.map → Modal-CaJ0gTEa.js.map} +1 -1
  194. package/dashboard/dist/assets/OperatorDashboard-DDfMmrmR.js +2 -0
  195. package/dashboard/dist/assets/{OperatorDashboard-jc0vrgDI.js.map → OperatorDashboard-DDfMmrmR.js.map} +1 -1
  196. package/dashboard/dist/assets/{PageHeader-NkOeBR05.js → PageHeader-C5D-G5rp.js} +2 -2
  197. package/dashboard/dist/assets/{PageHeader-NkOeBR05.js.map → PageHeader-C5D-G5rp.js.map} +1 -1
  198. package/dashboard/dist/assets/{PageHeaderWithStats-ywNhrmFK.js → PageHeaderWithStats-DCa2eZh2.js} +2 -2
  199. package/dashboard/dist/assets/{PageHeaderWithStats-ywNhrmFK.js.map → PageHeaderWithStats-DCa2eZh2.js.map} +1 -1
  200. package/dashboard/dist/assets/{PriorityBadge-B2MQbSxy.js → PriorityBadge-DTHq6OUZ.js} +2 -2
  201. package/dashboard/dist/assets/{PriorityBadge-B2MQbSxy.js.map → PriorityBadge-DTHq6OUZ.js.map} +1 -1
  202. package/dashboard/dist/assets/{ProcessDetailPage-B7z7IdqE.js → ProcessDetailPage-fC4dhrd0.js} +2 -2
  203. package/dashboard/dist/assets/{ProcessDetailPage-B7z7IdqE.js.map → ProcessDetailPage-fC4dhrd0.js.map} +1 -1
  204. package/dashboard/dist/assets/{ProcessesListPage-C-uHadO6.js → ProcessesListPage-CL2MY8uD.js} +2 -2
  205. package/dashboard/dist/assets/{ProcessesListPage-C-uHadO6.js.map → ProcessesListPage-CL2MY8uD.js.map} +1 -1
  206. package/dashboard/dist/assets/{RolePill-C1dgC-fK.js → RolePill-kgKPANly.js} +2 -2
  207. package/dashboard/dist/assets/{RolePill-C1dgC-fK.js.map → RolePill-kgKPANly.js.map} +1 -1
  208. package/dashboard/dist/assets/{RolesPage-BSxrD1vm.js → RolesPage-Be2lXTHD.js} +2 -2
  209. package/dashboard/dist/assets/{RolesPage-BSxrD1vm.js.map → RolesPage-Be2lXTHD.js.map} +1 -1
  210. package/dashboard/dist/assets/{RowActions-lYaHGI-v.js → RowActions-DIzJCwqR.js} +2 -2
  211. package/dashboard/dist/assets/{RowActions-lYaHGI-v.js.map → RowActions-DIzJCwqR.js.map} +1 -1
  212. package/dashboard/dist/assets/{StatCard-v2TiITVr.js → StatCard-CRi2Jy6t.js} +2 -2
  213. package/dashboard/dist/assets/{StatCard-v2TiITVr.js.map → StatCard-CRi2Jy6t.js.map} +1 -1
  214. package/dashboard/dist/assets/{StatusBadge-DWlxevgG.js → StatusBadge-BETI_8Mr.js} +2 -2
  215. package/dashboard/dist/assets/{StatusBadge-DWlxevgG.js.map → StatusBadge-BETI_8Mr.js.map} +1 -1
  216. package/dashboard/dist/assets/{StepIndicator-CRM4ft28.js → StepIndicator-DjpMqCjz.js} +2 -2
  217. package/dashboard/dist/assets/{StepIndicator-CRM4ft28.js.map → StepIndicator-DjpMqCjz.js.map} +1 -1
  218. package/dashboard/dist/assets/{StickyPagination-CF0EToEU.js → StickyPagination-BZbExQ9t.js} +2 -2
  219. package/dashboard/dist/assets/{StickyPagination-CF0EToEU.js.map → StickyPagination-BZbExQ9t.js.map} +1 -1
  220. package/dashboard/dist/assets/{SwimlaneTimeline-CNlj7fgg.js → SwimlaneTimeline-DZthQyhR.js} +2 -2
  221. package/dashboard/dist/assets/{SwimlaneTimeline-CNlj7fgg.js.map → SwimlaneTimeline-DZthQyhR.js.map} +1 -1
  222. package/dashboard/dist/assets/{TagInput-CH8qMGhC.js → TagInput-CukbOfYn.js} +2 -2
  223. package/dashboard/dist/assets/{TagInput-CH8qMGhC.js.map → TagInput-CukbOfYn.js.map} +1 -1
  224. package/dashboard/dist/assets/{TaskDetailPage-CdWo-6mu.js → TaskDetailPage-CIZHIKo9.js} +2 -2
  225. package/dashboard/dist/assets/{TaskDetailPage-CdWo-6mu.js.map → TaskDetailPage-CIZHIKo9.js.map} +1 -1
  226. package/dashboard/dist/assets/{TaskQueuePill-BPj4ogVG.js → TaskQueuePill-Q7DGoysj.js} +2 -2
  227. package/dashboard/dist/assets/{TaskQueuePill-BPj4ogVG.js.map → TaskQueuePill-Q7DGoysj.js.map} +1 -1
  228. package/dashboard/dist/assets/{TasksListPage-CtRkMpKU.js → TasksListPage-CsC9wjb0.js} +2 -2
  229. package/dashboard/dist/assets/{TasksListPage-CtRkMpKU.js.map → TasksListPage-CsC9wjb0.js.map} +1 -1
  230. package/dashboard/dist/assets/{TimeAgo-Di1a3X5P.js → TimeAgo-BcOOnJeH.js} +2 -2
  231. package/dashboard/dist/assets/{TimeAgo-Di1a3X5P.js.map → TimeAgo-BcOOnJeH.js.map} +1 -1
  232. package/dashboard/dist/assets/{TimestampCell-CqrXql-S.js → TimestampCell-CEMapYDQ.js} +2 -2
  233. package/dashboard/dist/assets/{TimestampCell-CqrXql-S.js.map → TimestampCell-CEMapYDQ.js.map} +1 -1
  234. package/dashboard/dist/assets/{UserName-BUFYCnRa.js → UserName-BHoN7iRL.js} +2 -2
  235. package/dashboard/dist/assets/{UserName-BUFYCnRa.js.map → UserName-BHoN7iRL.js.map} +1 -1
  236. package/dashboard/dist/assets/{WorkflowExecutionPage-25iusMml.js → WorkflowExecutionPage-DawKl1LT.js} +2 -2
  237. package/dashboard/dist/assets/{WorkflowExecutionPage-25iusMml.js.map → WorkflowExecutionPage-DawKl1LT.js.map} +1 -1
  238. package/dashboard/dist/assets/WorkflowPill-CP84Vqeg.js +2 -0
  239. package/dashboard/dist/assets/{WorkflowPill-DPKOcbf4.js.map → WorkflowPill-CP84Vqeg.js.map} +1 -1
  240. package/dashboard/dist/assets/{WorkflowsDashboard-BgxslssH.js → WorkflowsDashboard-QrvVFxtQ.js} +2 -2
  241. package/dashboard/dist/assets/{WorkflowsDashboard-BgxslssH.js.map → WorkflowsDashboard-QrvVFxtQ.js.map} +1 -1
  242. package/dashboard/dist/assets/{WorkflowsOverview-Doe5L-Re.js → WorkflowsOverview-DuhAi_OY.js} +2 -2
  243. package/dashboard/dist/assets/{WorkflowsOverview-Doe5L-Re.js.map → WorkflowsOverview-DuhAi_OY.js.map} +1 -1
  244. package/dashboard/dist/assets/YamlWorkflowsPage-Dc9xw82a.js +2 -0
  245. package/dashboard/dist/assets/YamlWorkflowsPage-Dc9xw82a.js.map +1 -0
  246. package/dashboard/dist/assets/{bots-Bi2_O1Ts.js → bots-Dny-rmmI.js} +2 -2
  247. package/dashboard/dist/assets/{bots-Bi2_O1Ts.js.map → bots-Dny-rmmI.js.map} +1 -1
  248. package/dashboard/dist/assets/{escalation-Ck1KlLkT.js → escalation-CV0sKNH5.js} +2 -2
  249. package/dashboard/dist/assets/{escalation-Ck1KlLkT.js.map → escalation-CV0sKNH5.js.map} +1 -1
  250. package/dashboard/dist/assets/{escalation-columns-ohDsj2eJ.js → escalation-columns-30CKyoWI.js} +2 -2
  251. package/dashboard/dist/assets/{escalation-columns-ohDsj2eJ.js.map → escalation-columns-30CKyoWI.js.map} +1 -1
  252. package/dashboard/dist/assets/{helpers-BoD2SgUY.js → helpers-C1-30CzH.js} +2 -2
  253. package/dashboard/dist/assets/{helpers-BoD2SgUY.js.map → helpers-C1-30CzH.js.map} +1 -1
  254. package/dashboard/dist/assets/helpers-C1jaRD-d.js +2 -0
  255. package/dashboard/dist/assets/helpers-C1jaRD-d.js.map +1 -0
  256. package/dashboard/dist/assets/{index-FuohTtaM.js → index-BUVQ6wmy.js} +3 -3
  257. package/dashboard/dist/assets/{index-FuohTtaM.js.map → index-BUVQ6wmy.js.map} +1 -1
  258. package/dashboard/dist/assets/index-CxVB7F4X.js +2 -0
  259. package/dashboard/dist/assets/{index-Dk2Q51o0.js.map → index-CxVB7F4X.js.map} +1 -1
  260. package/dashboard/dist/assets/{index-BEtLIsML.js → index-D-oCWCAS.js} +2 -2
  261. package/dashboard/dist/assets/{index-BEtLIsML.js.map → index-D-oCWCAS.js.map} +1 -1
  262. package/dashboard/dist/assets/index-D0wPM3Ck.js +2 -0
  263. package/dashboard/dist/assets/{index-BpT-6WgJ.js.map → index-D0wPM3Ck.js.map} +1 -1
  264. package/dashboard/dist/assets/{index-Bn2xHDr8.js → index-DHgnkykj.js} +3 -3
  265. package/dashboard/dist/assets/{index-Bn2xHDr8.js.map → index-DHgnkykj.js.map} +1 -1
  266. package/dashboard/dist/assets/{index-D3NyVADW.js → index-D_aJBEAG.js} +2 -2
  267. package/dashboard/dist/assets/index-D_aJBEAG.js.map +1 -0
  268. package/dashboard/dist/assets/{index-PyCTS05D.css → index-DcIKW-cZ.css} +1 -1
  269. package/dashboard/dist/assets/{index-CZrJ09p-.js → index-Dd_U4mLm.js} +2 -2
  270. package/dashboard/dist/assets/{index-CZrJ09p-.js.map → index-Dd_U4mLm.js.map} +1 -1
  271. package/dashboard/dist/assets/{index-DYyLF-Qb.js → index-DnmZbNxk.js} +8 -8
  272. package/dashboard/dist/assets/index-DnmZbNxk.js.map +1 -0
  273. package/dashboard/dist/assets/index-_RBvi7s6.js +2 -0
  274. package/dashboard/dist/assets/{index-D7zYZOnH.js.map → index-_RBvi7s6.js.map} +1 -1
  275. package/dashboard/dist/assets/index-n7td8zgX.js +17 -0
  276. package/dashboard/dist/assets/{index-DOkHXmyf.js.map → index-n7td8zgX.js.map} +1 -1
  277. package/dashboard/dist/assets/{mcp-CJtYjA7A.js → mcp-CRFr4L9W.js} +2 -2
  278. package/dashboard/dist/assets/{mcp-CJtYjA7A.js.map → mcp-CRFr4L9W.js.map} +1 -1
  279. package/dashboard/dist/assets/mcp-query-DHY2mZBQ.js +2 -0
  280. package/dashboard/dist/assets/mcp-query-DHY2mZBQ.js.map +1 -0
  281. package/dashboard/dist/assets/{mcp-runs-DUWm9Z4V.js → mcp-runs-BqPHqwAO.js} +2 -2
  282. package/dashboard/dist/assets/{mcp-runs-DUWm9Z4V.js.map → mcp-runs-BqPHqwAO.js.map} +1 -1
  283. package/dashboard/dist/assets/{namespaces-BM5P2qmL.js → namespaces-TG1aIpo_.js} +2 -2
  284. package/dashboard/dist/assets/{namespaces-BM5P2qmL.js.map → namespaces-TG1aIpo_.js.map} +1 -1
  285. package/dashboard/dist/assets/{roles-lv0shpjJ.js → roles-DhhLTvXg.js} +2 -2
  286. package/dashboard/dist/assets/{roles-lv0shpjJ.js.map → roles-DhhLTvXg.js.map} +1 -1
  287. package/dashboard/dist/assets/{settings-Wlq92mRo.js → settings-D9MBzEeB.js} +2 -2
  288. package/dashboard/dist/assets/{settings-Wlq92mRo.js.map → settings-D9MBzEeB.js.map} +1 -1
  289. package/dashboard/dist/assets/{tasks-BFGm4PuE.js → tasks-BxmcZoev.js} +2 -2
  290. package/dashboard/dist/assets/{tasks-BFGm4PuE.js.map → tasks-BxmcZoev.js.map} +1 -1
  291. package/dashboard/dist/assets/{useEventHooks-DIE6ue4x.js → useEventHooks-BylecvvI.js} +2 -2
  292. package/dashboard/dist/assets/{useEventHooks-DIE6ue4x.js.map → useEventHooks-BylecvvI.js.map} +1 -1
  293. package/dashboard/dist/assets/{useYamlActivityEvents-DCwSO73t.js → useYamlActivityEvents-ocmj11e_.js} +2 -2
  294. package/dashboard/dist/assets/{useYamlActivityEvents-DCwSO73t.js.map → useYamlActivityEvents-ocmj11e_.js.map} +1 -1
  295. package/dashboard/dist/assets/{users-tA5-K0wA.js → users-Ce5r-JAv.js} +2 -2
  296. package/dashboard/dist/assets/{users-tA5-K0wA.js.map → users-Ce5r-JAv.js.map} +1 -1
  297. package/dashboard/dist/assets/{vendor-icons-BiIug1SK.js → vendor-icons-D1DdudfH.js} +93 -73
  298. package/dashboard/dist/assets/vendor-icons-D1DdudfH.js.map +1 -0
  299. package/dashboard/dist/assets/{workflows-CfLc15Wr.js → workflows-ykIeVbRJ.js} +2 -2
  300. package/dashboard/dist/assets/{workflows-CfLc15Wr.js.map → workflows-ykIeVbRJ.js.map} +1 -1
  301. package/dashboard/dist/assets/yaml-workflows-WypmKYht.js +2 -0
  302. package/dashboard/dist/assets/yaml-workflows-WypmKYht.js.map +1 -0
  303. package/dashboard/dist/index.html +3 -3
  304. package/docs/api/sdk/auth.md +27 -0
  305. package/docs/api/sdk/bot-accounts.md +243 -0
  306. package/docs/api/sdk/controlplane.md +103 -0
  307. package/docs/api/sdk/dba.md +52 -0
  308. package/docs/api/sdk/escalations.md +374 -0
  309. package/docs/api/sdk/events.md +68 -0
  310. package/docs/api/sdk/exports.md +124 -0
  311. package/docs/api/sdk/insight.md +112 -0
  312. package/docs/api/sdk/maintenance.md +54 -0
  313. package/docs/api/sdk/mcp-runs.md +71 -0
  314. package/docs/api/sdk/mcp.md +250 -0
  315. package/docs/api/sdk/namespaces.md +43 -0
  316. package/docs/api/sdk/roles.md +183 -0
  317. package/docs/api/sdk/settings.md +24 -0
  318. package/docs/api/sdk/tasks.md +120 -0
  319. package/docs/api/sdk/users.md +196 -0
  320. package/docs/api/sdk/workflow-sets.md +135 -0
  321. package/docs/api/sdk/workflows.md +271 -0
  322. package/docs/api/sdk/yaml-workflows.md +408 -0
  323. package/docs/events.md +28 -0
  324. package/docs/sdk.md +177 -0
  325. package/docs/story.md +157 -0
  326. package/package.json +3 -2
  327. package/build/routes/escalations/helpers.d.ts +0 -5
  328. package/build/routes/resolve.d.ts +0 -9
  329. package/build/routes/resolve.js +0 -19
  330. package/build/routes/yaml-workflows/helpers.d.ts +0 -2
  331. package/build/routes/yaml-workflows/helpers.js +0 -8
  332. package/dashboard/dist/assets/BotPicker-A6LtzyuO.js +0 -2
  333. package/dashboard/dist/assets/McpQueryDetailPage-DhqEI180.js +0 -5
  334. package/dashboard/dist/assets/McpQueryDetailPage-DhqEI180.js.map +0 -1
  335. package/dashboard/dist/assets/McpQueryPage-CIiVMlqo.js +0 -2
  336. package/dashboard/dist/assets/McpQueryPage-CIiVMlqo.js.map +0 -1
  337. package/dashboard/dist/assets/OperatorDashboard-jc0vrgDI.js +0 -2
  338. package/dashboard/dist/assets/RunAsSelector-CJDnyp93.js +0 -2
  339. package/dashboard/dist/assets/RunAsSelector-CJDnyp93.js.map +0 -1
  340. package/dashboard/dist/assets/WorkflowPill-DPKOcbf4.js +0 -2
  341. package/dashboard/dist/assets/YamlWorkflowsPage-BliAckJ6.js +0 -2
  342. package/dashboard/dist/assets/YamlWorkflowsPage-BliAckJ6.js.map +0 -1
  343. package/dashboard/dist/assets/index-BpT-6WgJ.js +0 -2
  344. package/dashboard/dist/assets/index-D3NyVADW.js.map +0 -1
  345. package/dashboard/dist/assets/index-D7zYZOnH.js +0 -2
  346. package/dashboard/dist/assets/index-DOkHXmyf.js +0 -17
  347. package/dashboard/dist/assets/index-DYyLF-Qb.js.map +0 -1
  348. package/dashboard/dist/assets/index-Dk2Q51o0.js +0 -2
  349. package/dashboard/dist/assets/mcp-query-jQJQrs_7.js +0 -2
  350. package/dashboard/dist/assets/mcp-query-jQJQrs_7.js.map +0 -1
  351. package/dashboard/dist/assets/vendor-icons-BiIug1SK.js.map +0 -1
  352. package/dashboard/dist/assets/yaml-workflows-D7JXNqbM.js +0 -2
  353. package/dashboard/dist/assets/yaml-workflows-D7JXNqbM.js.map +0 -1
  354. package/docs/img/01-login.png +0 -0
  355. package/docs/img/02-dashboard-home.png +0 -0
  356. package/docs/img/03-processes-list.png +0 -0
  357. package/docs/img/04-escalations-list.png +0 -0
  358. package/docs/img/05-mcp-servers.png +0 -0
  359. package/docs/img/06-mcp-pipelines.png +0 -0
  360. package/docs/img/07-workflows-list.png +0 -0
  361. package/docs/img/compilation/01-query-submit.png +0 -0
  362. package/docs/img/compilation/02-mcp-servers.png +0 -0
  363. package/docs/img/compilation/03-query-completed.png +0 -0
  364. package/docs/img/compilation/04-wizard-original.png +0 -0
  365. package/docs/img/compilation/05-wizard-timeline.png +0 -0
  366. package/docs/img/compilation/06-wizard-profile.png +0 -0
  367. package/docs/img/compilation/07-wizard-deploy.png +0 -0
  368. package/docs/img/compilation/08-wizard-test-modal.png +0 -0
  369. package/docs/img/compilation/09-wizard-test-compare.png +0 -0
  370. package/docs/img/compilation/10-wizard-verify.png +0 -0
  371. /package/docs/api/{dba.md → http/dba.md} +0 -0
  372. /package/docs/api/{escalations.md → http/escalations.md} +0 -0
  373. /package/docs/api/{exports.md → http/exports.md} +0 -0
  374. /package/docs/api/{maintenance.md → http/maintenance.md} +0 -0
  375. /package/docs/api/{mcp-runs.md → http/mcp-runs.md} +0 -0
  376. /package/docs/api/{mcp-servers.md → http/mcp-servers.md} +0 -0
  377. /package/docs/api/{namespaces.md → http/namespaces.md} +0 -0
  378. /package/docs/api/{roles.md → http/roles.md} +0 -0
  379. /package/docs/api/{service-accounts.md → http/service-accounts.md} +0 -0
  380. /package/docs/api/{settings.md → http/settings.md} +0 -0
  381. /package/docs/api/{tasks.md → http/tasks.md} +0 -0
  382. /package/docs/api/{users.md → http/users.md} +0 -0
  383. /package/docs/api/{workflows.md → http/workflows.md} +0 -0
  384. /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
- VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, 1)
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.info(`[yaml-workflow] LLM step completed (model: ${model}, topic: ${activity.topic})`);
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
  });
@@ -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
@@ -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 (the content to store NOT "content"), data_key (optional sub-key). ' +
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)(serverSection),
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
- my_trigger:
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
- my_worker:
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: '{my_trigger.output.data.url}'
67
+ url: '{trigger_x8kf.output.data.url}'
68
68
  screenshot_path:
69
69
  '@pipe':
70
- - ['{my_trigger.output.data.slug}', '.png']
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 used for human-in-the-loop signals and iteration anchors.
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 for iteration patterns.
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 (sequential transformation array of arrays):
92
- Each row's output becomes input to the next row's function.
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
- - ['{my_trigger.output.data.slug}', '-']
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\`. Row 1 sub-pipe: \`slug + "-"\`. Row 2 sub-pipe: today's date. Row 3: concat all results.
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
- - ['{trigger.output.data.domain}', '/', '{trigger.output.data.key}', '/']
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, gt, lt
144
- - **@array**: get, length
145
- - **@object**: get, keys, values
146
- - **@conditional**: ternary, less_than, greater_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. **workflowName**: Every worker MUST have \`workflowName: '<tool_name>'\` in its input.mapsthis routes to the correct MCP tool handler
159
- 4. **_scope threading**: Every worker MUST have \`_scope: '{trigger.output.data._scope}'\` for IAM context
160
- 5. **Wire outputs forward**: Use \`{prevActivity.output.data.fieldName}\` to pass data between steps
161
- 6. **Use @pipe for transforms**: When a value needs runtime computation (date stamp, string concat, slugify), use @pipe — never hardcode computed values
162
- 7. **Simple fields stay simple**: If a field just passes a trigger value through (domain, key, url), use a plain reference like \`'{trigger.output.data.domain}'\` — NEVER wrap it in @pipe. Only use @pipe when actual transformation is needed.
163
- 8. **File extensions**: Screenshot paths MUST include .png extension. Use @pipe concat if deriving from a slug
164
- 8. **job.maps on last activity**: The final activity should have job.maps to promote output fields to the workflow result
165
- 9. **Linear transitions**: Chain activities with transitions unless iteration is needed
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": "my_trigger",
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": "my_a1",
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": "{my_trigger.output.data.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": "kebab-case-workflow-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,3 @@
1
+ export { analyzeSpecification } from './analyze';
2
+ export { generatePlan } from './plan';
3
+ export { persistPlan, persistBuiltWorkflow, updateSetStatus, deploySetNamespaces, } from './persist';
@@ -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>;