@hotmeshio/long-tail 0.1.13 → 0.1.14

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 (260) hide show
  1. package/build/api/files.d.ts +13 -0
  2. package/build/api/files.js +44 -0
  3. package/build/api/mcp-runs.d.ts +2 -0
  4. package/build/api/mcp-runs.js +2 -0
  5. package/build/api/workflow-sets.d.ts +11 -0
  6. package/build/api/workflow-sets.js +62 -0
  7. package/build/api/yaml-workflows.d.ts +9 -0
  8. package/build/api/yaml-workflows.js +40 -11
  9. package/build/lib/storage/local.d.ts +15 -0
  10. package/build/lib/storage/local.js +63 -0
  11. package/build/lib/storage/mime.d.ts +4 -0
  12. package/build/lib/storage/mime.js +31 -0
  13. package/build/lib/storage/s3.d.ts +16 -0
  14. package/build/lib/storage/s3.js +70 -0
  15. package/build/lib/storage/types.d.ts +18 -0
  16. package/build/modules/utils.d.ts +73 -0
  17. package/build/modules/utils.js +84 -0
  18. package/build/routes/file-browser.d.ts +2 -0
  19. package/build/routes/file-browser.js +112 -0
  20. package/build/routes/files.js +25 -17
  21. package/build/routes/index.js +2 -0
  22. package/build/routes/mcp-runs.js +2 -0
  23. package/build/routes/workflow-sets.js +9 -0
  24. package/build/routes/yaml-workflows/deployment.js +8 -0
  25. package/build/services/insight/index.d.ts +13 -0
  26. package/build/services/insight/index.js +4 -7
  27. package/build/services/insight/prompts.d.ts +1 -1
  28. package/build/services/insight/prompts.js +1 -1
  29. package/build/services/mcp-runs/queries.d.ts +2 -0
  30. package/build/services/mcp-runs/queries.js +11 -1
  31. package/build/services/mcp-runs/sql.d.ts +1 -1
  32. package/build/services/mcp-runs/sql.js +2 -2
  33. package/build/services/workflow-sets/db.d.ts +1 -0
  34. package/build/services/workflow-sets/db.js +6 -0
  35. package/build/services/workflow-sets/index.d.ts +1 -1
  36. package/build/services/workflow-sets/index.js +2 -1
  37. package/build/services/workflow-sets/sql.d.ts +1 -0
  38. package/build/services/workflow-sets/sql.js +6 -1
  39. package/build/services/yaml-workflow/db.d.ts +12 -0
  40. package/build/services/yaml-workflow/db.js +18 -0
  41. package/build/services/yaml-workflow/generator.js +4 -4
  42. package/build/services/yaml-workflow/pipeline/build/index.d.ts +2 -1
  43. package/build/services/yaml-workflow/pipeline/build/index.js +3 -2
  44. package/build/services/yaml-workflow/pipeline/build/utils.d.ts +0 -2
  45. package/build/services/yaml-workflow/pipeline/build/utils.js +0 -8
  46. package/build/services/yaml-workflow/sql.d.ts +2 -1
  47. package/build/services/yaml-workflow/sql.js +10 -3
  48. package/build/system/activities/schema-exchange.d.ts +50 -0
  49. package/build/system/activities/schema-exchange.js +210 -0
  50. package/build/system/activities/sql.d.ts +1 -1
  51. package/build/system/activities/sql.js +12 -1
  52. package/build/system/index.js +1 -0
  53. package/build/system/mcp-servers/knowledge.js +35 -6
  54. package/build/system/mcp-servers/schema-exchange.d.ts +4 -0
  55. package/build/system/mcp-servers/schema-exchange.js +93 -0
  56. package/build/system/seed/server-definitions.d.ts +112 -1
  57. package/build/system/seed/server-definitions.js +37 -0
  58. package/build/system/seed/tool-manifests-data.d.ts +87 -0
  59. package/build/system/seed/tool-manifests-data.js +37 -1
  60. package/build/system/seed/tool-manifests-knowledge.d.ts +9 -1
  61. package/build/system/seed/tool-manifests-knowledge.js +6 -5
  62. package/build/system/workflows/mcp-workflow-builder/prompts.d.ts +1 -1
  63. package/build/system/workflows/mcp-workflow-builder/prompts.js +21 -20
  64. package/build/system/workflows/mcp-workflow-planner/activities/persist.d.ts +1 -1
  65. package/build/system/workflows/mcp-workflow-planner/activities/persist.js +3 -3
  66. package/build/system/workflows/mcp-workflow-planner/index.js +39 -5
  67. package/build/system/workflows/mcp-workflow-planner/prompts.d.ts +1 -1
  68. package/build/system/workflows/mcp-workflow-planner/prompts.js +3 -3
  69. package/build/tsconfig.tsbuildinfo +1 -1
  70. package/dashboard/dist/assets/{AdminDashboard-DUrSBQOl.js → AdminDashboard-Cngijp4Q.js} +2 -2
  71. package/dashboard/dist/assets/{AdminDashboard-DUrSBQOl.js.map → AdminDashboard-Cngijp4Q.js.map} +1 -1
  72. package/dashboard/dist/assets/{AvailableEscalationsPage-Dbd1qUK_.js → AvailableEscalationsPage-CpBfGV1h.js} +2 -2
  73. package/dashboard/dist/assets/{AvailableEscalationsPage-Dbd1qUK_.js.map → AvailableEscalationsPage-CpBfGV1h.js.map} +1 -1
  74. package/dashboard/dist/assets/{BotPicker-Cg5iNEkm.js → BotPicker-B8Uvw9Si.js} +2 -2
  75. package/dashboard/dist/assets/{BotPicker-Cg5iNEkm.js.map → BotPicker-B8Uvw9Si.js.map} +1 -1
  76. package/dashboard/dist/assets/{CollapsibleSection-Kd9UIyeU.js → CollapsibleSection-DiFPuWOY.js} +2 -2
  77. package/dashboard/dist/assets/{CollapsibleSection-Kd9UIyeU.js.map → CollapsibleSection-DiFPuWOY.js.map} +1 -1
  78. package/dashboard/dist/assets/{ConfirmDeleteModal-DZMgmlof.js → ConfirmDeleteModal-CpXG9uyu.js} +2 -2
  79. package/dashboard/dist/assets/{ConfirmDeleteModal-DZMgmlof.js.map → ConfirmDeleteModal-CpXG9uyu.js.map} +1 -1
  80. package/dashboard/dist/assets/{CopyableId-cPFTRm8q.js → CopyableId-DKsTR9lK.js} +2 -2
  81. package/dashboard/dist/assets/{CopyableId-cPFTRm8q.js.map → CopyableId-DKsTR9lK.js.map} +1 -1
  82. package/dashboard/dist/assets/CredentialsPage-DlS7Kf40.js +2 -0
  83. package/dashboard/dist/assets/{CredentialsPage-DJablIbs.js.map → CredentialsPage-DlS7Kf40.js.map} +1 -1
  84. package/dashboard/dist/assets/{CustomDurationPicker-NgIP6YDW.js → CustomDurationPicker-B-9eW3pm.js} +2 -2
  85. package/dashboard/dist/assets/{CustomDurationPicker-NgIP6YDW.js.map → CustomDurationPicker-B-9eW3pm.js.map} +1 -1
  86. package/dashboard/dist/assets/{DataTable-CTRhTAfT.js → DataTable-DkOokbtL.js} +2 -2
  87. package/dashboard/dist/assets/{DataTable-CTRhTAfT.js.map → DataTable-DkOokbtL.js.map} +1 -1
  88. package/dashboard/dist/assets/{ElapsedCell-HcSJ_MMs.js → ElapsedCell-DVtHqM-5.js} +2 -2
  89. package/dashboard/dist/assets/{ElapsedCell-HcSJ_MMs.js.map → ElapsedCell-DVtHqM-5.js.map} +1 -1
  90. package/dashboard/dist/assets/{EmptyState-joNbd4gg.js → EmptyState-C7KIMIbE.js} +2 -2
  91. package/dashboard/dist/assets/{EmptyState-joNbd4gg.js.map → EmptyState-C7KIMIbE.js.map} +1 -1
  92. package/dashboard/dist/assets/{EscalationsOverview-DpXDnQux.js → EscalationsOverview-BMKBlkPx.js} +2 -2
  93. package/dashboard/dist/assets/{EscalationsOverview-DpXDnQux.js.map → EscalationsOverview-BMKBlkPx.js.map} +1 -1
  94. package/dashboard/dist/assets/{EventTable-CYem3v8n.js → EventTable-BYZ5OVdQ.js} +2 -2
  95. package/dashboard/dist/assets/{EventTable-CYem3v8n.js.map → EventTable-BYZ5OVdQ.js.map} +1 -1
  96. package/dashboard/dist/assets/{FilterBar-BiO8SOzc.js → FilterBar-C5r3n6YO.js} +2 -2
  97. package/dashboard/dist/assets/{FilterBar-BiO8SOzc.js.map → FilterBar-C5r3n6YO.js.map} +1 -1
  98. package/dashboard/dist/assets/{ListToolbar-6yRDh2e9.js → ListToolbar-BGUajIsW.js} +2 -2
  99. package/dashboard/dist/assets/{ListToolbar-6yRDh2e9.js.map → ListToolbar-BGUajIsW.js.map} +1 -1
  100. package/dashboard/dist/assets/{McpOverview-CUgSxkQe.js → McpOverview-B_kJYHea.js} +2 -2
  101. package/dashboard/dist/assets/{McpOverview-CUgSxkQe.js.map → McpOverview-B_kJYHea.js.map} +1 -1
  102. package/dashboard/dist/assets/McpQueryDetailPage-Czsmovqw.js +5 -0
  103. package/dashboard/dist/assets/McpQueryDetailPage-Czsmovqw.js.map +1 -0
  104. package/dashboard/dist/assets/McpQueryPage-BgAq_bQg.js +2 -0
  105. package/dashboard/dist/assets/{McpQueryPage-lV6kfDG5.js.map → McpQueryPage-BgAq_bQg.js.map} +1 -1
  106. package/dashboard/dist/assets/McpRunDetailPage-B8c0OszR.js +2 -0
  107. package/dashboard/dist/assets/McpRunDetailPage-B8c0OszR.js.map +1 -0
  108. package/dashboard/dist/assets/McpRunsPage-BY8C6k78.js +2 -0
  109. package/dashboard/dist/assets/McpRunsPage-BY8C6k78.js.map +1 -0
  110. package/dashboard/dist/assets/{Modal-BuTvD0pz.js → Modal-E1yRnCeW.js} +2 -2
  111. package/dashboard/dist/assets/{Modal-BuTvD0pz.js.map → Modal-E1yRnCeW.js.map} +1 -1
  112. package/dashboard/dist/assets/OperatorDashboard-C8MSTzey.js +2 -0
  113. package/dashboard/dist/assets/{OperatorDashboard-C9SSV96T.js.map → OperatorDashboard-C8MSTzey.js.map} +1 -1
  114. package/dashboard/dist/assets/{PageHeader-BcTVF9ul.js → PageHeader-Cm5HBQF_.js} +2 -2
  115. package/dashboard/dist/assets/{PageHeader-BcTVF9ul.js.map → PageHeader-Cm5HBQF_.js.map} +1 -1
  116. package/dashboard/dist/assets/{PageHeaderWithStats-BI7JG5x6.js → PageHeaderWithStats-CNmWJFSN.js} +2 -2
  117. package/dashboard/dist/assets/{PageHeaderWithStats-BI7JG5x6.js.map → PageHeaderWithStats-CNmWJFSN.js.map} +1 -1
  118. package/dashboard/dist/assets/{PriorityBadge-DqVaOU65.js → PriorityBadge-HSI4RVhs.js} +2 -2
  119. package/dashboard/dist/assets/{PriorityBadge-DqVaOU65.js.map → PriorityBadge-HSI4RVhs.js.map} +1 -1
  120. package/dashboard/dist/assets/{ProcessDetailPage-hFMhf9qa.js → ProcessDetailPage-Dln8622H.js} +2 -2
  121. package/dashboard/dist/assets/{ProcessDetailPage-hFMhf9qa.js.map → ProcessDetailPage-Dln8622H.js.map} +1 -1
  122. package/dashboard/dist/assets/{ProcessesListPage-ByVoBCQ3.js → ProcessesListPage-bIsd9N_h.js} +2 -2
  123. package/dashboard/dist/assets/{ProcessesListPage-ByVoBCQ3.js.map → ProcessesListPage-bIsd9N_h.js.map} +1 -1
  124. package/dashboard/dist/assets/{RolePill-D9ZIkYiu.js → RolePill-BVUp2bF0.js} +2 -2
  125. package/dashboard/dist/assets/{RolePill-D9ZIkYiu.js.map → RolePill-BVUp2bF0.js.map} +1 -1
  126. package/dashboard/dist/assets/RolesPage-kH-Njt25.js +2 -0
  127. package/dashboard/dist/assets/{RolesPage-SMedMuqa.js.map → RolesPage-kH-Njt25.js.map} +1 -1
  128. package/dashboard/dist/assets/{RowActions-yDhwwDbU.js → RowActions-DbUJPfaW.js} +2 -2
  129. package/dashboard/dist/assets/{RowActions-yDhwwDbU.js.map → RowActions-DbUJPfaW.js.map} +1 -1
  130. package/dashboard/dist/assets/{StatCard-BrBnQFxh.js → StatCard-Bs3JbyAz.js} +2 -2
  131. package/dashboard/dist/assets/{StatCard-BrBnQFxh.js.map → StatCard-Bs3JbyAz.js.map} +1 -1
  132. package/dashboard/dist/assets/{StatusBadge-xgb-lZku.js → StatusBadge-CakDdsCw.js} +2 -2
  133. package/dashboard/dist/assets/{StatusBadge-xgb-lZku.js.map → StatusBadge-CakDdsCw.js.map} +1 -1
  134. package/dashboard/dist/assets/{StepIndicator-B9ps2SvM.js → StepIndicator-Cd_SG_yA.js} +2 -2
  135. package/dashboard/dist/assets/{StepIndicator-B9ps2SvM.js.map → StepIndicator-Cd_SG_yA.js.map} +1 -1
  136. package/dashboard/dist/assets/{StickyPagination-DTIjBKN3.js → StickyPagination-Bz0C18nC.js} +2 -2
  137. package/dashboard/dist/assets/{StickyPagination-DTIjBKN3.js.map → StickyPagination-Bz0C18nC.js.map} +1 -1
  138. package/dashboard/dist/assets/{SwimlaneTimeline-RK4Yu66z.js → SwimlaneTimeline-Cfe-xQRX.js} +2 -2
  139. package/dashboard/dist/assets/{SwimlaneTimeline-RK4Yu66z.js.map → SwimlaneTimeline-Cfe-xQRX.js.map} +1 -1
  140. package/dashboard/dist/assets/{TagInput-CdNUuqk4.js → TagInput-ClFhXG-U.js} +2 -2
  141. package/dashboard/dist/assets/{TagInput-CdNUuqk4.js.map → TagInput-ClFhXG-U.js.map} +1 -1
  142. package/dashboard/dist/assets/{TaskDetailPage-C-nzaNea.js → TaskDetailPage-SuMBdARt.js} +2 -2
  143. package/dashboard/dist/assets/{TaskDetailPage-C-nzaNea.js.map → TaskDetailPage-SuMBdARt.js.map} +1 -1
  144. package/dashboard/dist/assets/{TaskQueuePill-Lvr2-NzS.js → TaskQueuePill-lJR1JW_W.js} +2 -2
  145. package/dashboard/dist/assets/{TaskQueuePill-Lvr2-NzS.js.map → TaskQueuePill-lJR1JW_W.js.map} +1 -1
  146. package/dashboard/dist/assets/{TasksListPage-DSUmD84y.js → TasksListPage-Dkq1Vtbt.js} +2 -2
  147. package/dashboard/dist/assets/{TasksListPage-DSUmD84y.js.map → TasksListPage-Dkq1Vtbt.js.map} +1 -1
  148. package/dashboard/dist/assets/{TimeAgo-BZdLdrIh.js → TimeAgo-DgfDZ1pl.js} +2 -2
  149. package/dashboard/dist/assets/{TimeAgo-BZdLdrIh.js.map → TimeAgo-DgfDZ1pl.js.map} +1 -1
  150. package/dashboard/dist/assets/{TimestampCell-QX_0i5FK.js → TimestampCell-MpHZ1hMD.js} +2 -2
  151. package/dashboard/dist/assets/{TimestampCell-QX_0i5FK.js.map → TimestampCell-MpHZ1hMD.js.map} +1 -1
  152. package/dashboard/dist/assets/{UserName-DyZMXcBm.js → UserName-DqsosA4B.js} +2 -2
  153. package/dashboard/dist/assets/{UserName-DyZMXcBm.js.map → UserName-DqsosA4B.js.map} +1 -1
  154. package/dashboard/dist/assets/{WorkflowExecutionPage-DjVxfZaF.js → WorkflowExecutionPage-CVlg38C3.js} +2 -2
  155. package/dashboard/dist/assets/{WorkflowExecutionPage-DjVxfZaF.js.map → WorkflowExecutionPage-CVlg38C3.js.map} +1 -1
  156. package/dashboard/dist/assets/WorkflowPill-CRpZhjGR.js +2 -0
  157. package/dashboard/dist/assets/WorkflowPill-CRpZhjGR.js.map +1 -0
  158. package/dashboard/dist/assets/{WorkflowsDashboard-DZjuiFZ0.js → WorkflowsDashboard-Ugzbs8mV.js} +2 -2
  159. package/dashboard/dist/assets/{WorkflowsDashboard-DZjuiFZ0.js.map → WorkflowsDashboard-Ugzbs8mV.js.map} +1 -1
  160. package/dashboard/dist/assets/{WorkflowsOverview-CLnLRpOu.js → WorkflowsOverview-CIp_lTNl.js} +2 -2
  161. package/dashboard/dist/assets/{WorkflowsOverview-CLnLRpOu.js.map → WorkflowsOverview-CIp_lTNl.js.map} +1 -1
  162. package/dashboard/dist/assets/YamlWorkflowsPage-BICF0fRO.js +2 -0
  163. package/dashboard/dist/assets/YamlWorkflowsPage-BICF0fRO.js.map +1 -0
  164. package/dashboard/dist/assets/{bots-DIM6lBoY.js → bots-DPfUpVqI.js} +2 -2
  165. package/dashboard/dist/assets/{bots-DIM6lBoY.js.map → bots-DPfUpVqI.js.map} +1 -1
  166. package/dashboard/dist/assets/{escalation-JOTuOqjq.js → escalation-RrCDbMC3.js} +2 -2
  167. package/dashboard/dist/assets/{escalation-JOTuOqjq.js.map → escalation-RrCDbMC3.js.map} +1 -1
  168. package/dashboard/dist/assets/escalation-columns-CDGa9wsD.js +2 -0
  169. package/dashboard/dist/assets/{escalation-columns-Cyg58nkg.js.map → escalation-columns-CDGa9wsD.js.map} +1 -1
  170. package/dashboard/dist/assets/{helpers-B1BDxBZd.js → helpers-ZSKqdkdS.js} +2 -2
  171. package/dashboard/dist/assets/{helpers-B1BDxBZd.js.map → helpers-ZSKqdkdS.js.map} +1 -1
  172. package/dashboard/dist/assets/helpers-rMEcLwKs.js +2 -0
  173. package/dashboard/dist/assets/helpers-rMEcLwKs.js.map +1 -0
  174. package/dashboard/dist/assets/{index-DDYFpi4l.js → index-ABcJHHlN.js} +2 -2
  175. package/dashboard/dist/assets/{index-DDYFpi4l.js.map → index-ABcJHHlN.js.map} +1 -1
  176. package/dashboard/dist/assets/{index-D1wVX50Z.js → index-B91h_jZ0.js} +2 -2
  177. package/dashboard/dist/assets/{index-D1wVX50Z.js.map → index-B91h_jZ0.js.map} +1 -1
  178. package/dashboard/dist/assets/{index-BcR6PfpY.js → index-BbI2dzhJ.js} +2 -2
  179. package/dashboard/dist/assets/{index-BcR6PfpY.js.map → index-BbI2dzhJ.js.map} +1 -1
  180. package/dashboard/dist/assets/{index-BizfauqT.js → index-BmVCyB6C.js} +4 -4
  181. package/dashboard/dist/assets/{index-BizfauqT.js.map → index-BmVCyB6C.js.map} +1 -1
  182. package/dashboard/dist/assets/index-C1E5GTs9.js +2 -0
  183. package/dashboard/dist/assets/index-C1E5GTs9.js.map +1 -0
  184. package/dashboard/dist/assets/{index-Cf60K3x9.js → index-C90ZPzXk.js} +2 -2
  185. package/dashboard/dist/assets/{index-Cf60K3x9.js.map → index-C90ZPzXk.js.map} +1 -1
  186. package/dashboard/dist/assets/{index-BYZX9tOb.js → index-Cmgrk7PQ.js} +58 -58
  187. package/dashboard/dist/assets/index-Cmgrk7PQ.js.map +1 -0
  188. package/dashboard/dist/assets/{index-Ds0JoXS2.js → index-DNytWfSZ.js} +2 -2
  189. package/dashboard/dist/assets/{index-Ds0JoXS2.js.map → index-DNytWfSZ.js.map} +1 -1
  190. package/dashboard/dist/assets/index-DX6zxr6t.js +2 -0
  191. package/dashboard/dist/assets/{index-Cg5nfiYX.js.map → index-DX6zxr6t.js.map} +1 -1
  192. package/dashboard/dist/assets/index-DeX-ezqf.css +1 -0
  193. package/dashboard/dist/assets/index-K40Qw1tk.js +2 -0
  194. package/dashboard/dist/assets/{index-Di12t56M.js.map → index-K40Qw1tk.js.map} +1 -1
  195. package/dashboard/dist/assets/{index-BUK3qR-1.js → index-lCyNr5Xk.js} +2 -2
  196. package/dashboard/dist/assets/{index-BUK3qR-1.js.map → index-lCyNr5Xk.js.map} +1 -1
  197. package/dashboard/dist/assets/{mcp-B_xbczAt.js → mcp-CNE44TSp.js} +2 -2
  198. package/dashboard/dist/assets/{mcp-B_xbczAt.js.map → mcp-CNE44TSp.js.map} +1 -1
  199. package/dashboard/dist/assets/mcp-query-RQX0uN-5.js +2 -0
  200. package/dashboard/dist/assets/mcp-query-RQX0uN-5.js.map +1 -0
  201. package/dashboard/dist/assets/mcp-runs-0w40bdz-.js +2 -0
  202. package/dashboard/dist/assets/mcp-runs-0w40bdz-.js.map +1 -0
  203. package/dashboard/dist/assets/{namespaces-C3WtdO_9.js → namespaces-BbmdXuPp.js} +2 -2
  204. package/dashboard/dist/assets/{namespaces-C3WtdO_9.js.map → namespaces-BbmdXuPp.js.map} +1 -1
  205. package/dashboard/dist/assets/{roles-BDAsPpZG.js → roles-DoHYlhWH.js} +2 -2
  206. package/dashboard/dist/assets/{roles-BDAsPpZG.js.map → roles-DoHYlhWH.js.map} +1 -1
  207. package/dashboard/dist/assets/{settings-Ife_UwAp.js → settings-BAiJiCHS.js} +2 -2
  208. package/dashboard/dist/assets/{settings-Ife_UwAp.js.map → settings-BAiJiCHS.js.map} +1 -1
  209. package/dashboard/dist/assets/{tasks-BquNDHDI.js → tasks-CvroqHtm.js} +2 -2
  210. package/dashboard/dist/assets/{tasks-BquNDHDI.js.map → tasks-CvroqHtm.js.map} +1 -1
  211. package/dashboard/dist/assets/{useEventHooks-anv_B2Yy.js → useEventHooks-BHMbzR_y.js} +2 -2
  212. package/dashboard/dist/assets/{useEventHooks-anv_B2Yy.js.map → useEventHooks-BHMbzR_y.js.map} +1 -1
  213. package/dashboard/dist/assets/useFilterParams-CGRYFw_A.js +2 -0
  214. package/dashboard/dist/assets/useFilterParams-CGRYFw_A.js.map +1 -0
  215. package/dashboard/dist/assets/useYamlActivityEvents-D56KV14X.js +2 -0
  216. package/dashboard/dist/assets/useYamlActivityEvents-D56KV14X.js.map +1 -0
  217. package/dashboard/dist/assets/{users-CFcxB4v6.js → users-CxIMy_xw.js} +2 -2
  218. package/dashboard/dist/assets/{users-CFcxB4v6.js.map → users-CxIMy_xw.js.map} +1 -1
  219. package/dashboard/dist/assets/{vendor-icons-T4r2DSPD.js → vendor-icons-AFGxSeQS.js} +132 -82
  220. package/dashboard/dist/assets/vendor-icons-AFGxSeQS.js.map +1 -0
  221. package/dashboard/dist/assets/{workflows-CeRci9z3.js → workflows-yR9yais7.js} +2 -2
  222. package/dashboard/dist/assets/{workflows-CeRci9z3.js.map → workflows-yR9yais7.js.map} +1 -1
  223. package/dashboard/dist/assets/yaml-workflows-QVF2MZ0l.js +2 -0
  224. package/dashboard/dist/assets/yaml-workflows-QVF2MZ0l.js.map +1 -0
  225. package/dashboard/dist/index.html +3 -3
  226. package/docs/schema-exchange.md +173 -0
  227. package/docs/self-test.md +106 -0
  228. package/package.json +3 -1
  229. package/dashboard/dist/assets/CredentialsPage-DJablIbs.js +0 -2
  230. package/dashboard/dist/assets/McpQueryDetailPage-BWbinTM_.js +0 -5
  231. package/dashboard/dist/assets/McpQueryDetailPage-BWbinTM_.js.map +0 -1
  232. package/dashboard/dist/assets/McpQueryPage-lV6kfDG5.js +0 -2
  233. package/dashboard/dist/assets/McpRunDetailPage-D6gaxH3_.js +0 -2
  234. package/dashboard/dist/assets/McpRunDetailPage-D6gaxH3_.js.map +0 -1
  235. package/dashboard/dist/assets/McpRunsPage-DKvTklh9.js +0 -2
  236. package/dashboard/dist/assets/McpRunsPage-DKvTklh9.js.map +0 -1
  237. package/dashboard/dist/assets/OperatorDashboard-C9SSV96T.js +0 -2
  238. package/dashboard/dist/assets/RolesPage-SMedMuqa.js +0 -2
  239. package/dashboard/dist/assets/WorkflowPill-CZqGslD6.js +0 -2
  240. package/dashboard/dist/assets/WorkflowPill-CZqGslD6.js.map +0 -1
  241. package/dashboard/dist/assets/YamlWorkflowsPage-VjdhnLmO.js +0 -2
  242. package/dashboard/dist/assets/YamlWorkflowsPage-VjdhnLmO.js.map +0 -1
  243. package/dashboard/dist/assets/escalation-columns-Cyg58nkg.js +0 -2
  244. package/dashboard/dist/assets/helpers-BCix9c_m.js +0 -2
  245. package/dashboard/dist/assets/helpers-BCix9c_m.js.map +0 -1
  246. package/dashboard/dist/assets/index-BYZX9tOb.js.map +0 -1
  247. package/dashboard/dist/assets/index-Cg5nfiYX.js +0 -2
  248. package/dashboard/dist/assets/index-DcIKW-cZ.css +0 -1
  249. package/dashboard/dist/assets/index-Di12t56M.js +0 -2
  250. package/dashboard/dist/assets/mcp-query-B8-P_QoG.js +0 -2
  251. package/dashboard/dist/assets/mcp-query-B8-P_QoG.js.map +0 -1
  252. package/dashboard/dist/assets/mcp-runs-CWeZinoF.js +0 -2
  253. package/dashboard/dist/assets/mcp-runs-CWeZinoF.js.map +0 -1
  254. package/dashboard/dist/assets/useFilterParams-BUyLHcx_.js +0 -2
  255. package/dashboard/dist/assets/useFilterParams-BUyLHcx_.js.map +0 -1
  256. package/dashboard/dist/assets/useYamlActivityEvents-DN-PTgVx.js +0 -2
  257. package/dashboard/dist/assets/useYamlActivityEvents-DN-PTgVx.js.map +0 -1
  258. package/dashboard/dist/assets/vendor-icons-T4r2DSPD.js.map +0 -1
  259. package/dashboard/dist/assets/yaml-workflows-DLwd2BOX.js +0 -2
  260. package/dashboard/dist/assets/yaml-workflows-DLwd2BOX.js.map +0 -1
@@ -2931,10 +2931,13 @@ export declare const SEED_MCP_SERVERS: ({
2931
2931
  type: string;
2932
2932
  description: string;
2933
2933
  };
2934
- data: {
2934
+ field: {
2935
2935
  type: string;
2936
2936
  description: string;
2937
2937
  };
2938
+ data: {
2939
+ description: string;
2940
+ };
2938
2941
  tags: {
2939
2942
  type: string;
2940
2943
  items: {
@@ -2964,6 +2967,7 @@ export declare const SEED_MCP_SERVERS: ({
2964
2967
  type: string;
2965
2968
  description: string;
2966
2969
  };
2970
+ field?: undefined;
2967
2971
  data?: undefined;
2968
2972
  tags?: undefined;
2969
2973
  query?: undefined;
@@ -3000,6 +3004,7 @@ export declare const SEED_MCP_SERVERS: ({
3000
3004
  description: string;
3001
3005
  };
3002
3006
  key?: undefined;
3007
+ field?: undefined;
3003
3008
  data?: undefined;
3004
3009
  offset?: undefined;
3005
3010
  path?: undefined;
@@ -3033,6 +3038,7 @@ export declare const SEED_MCP_SERVERS: ({
3033
3038
  description: string;
3034
3039
  };
3035
3040
  key?: undefined;
3041
+ field?: undefined;
3036
3042
  data?: undefined;
3037
3043
  query?: undefined;
3038
3044
  path?: undefined;
@@ -3048,6 +3054,7 @@ export declare const SEED_MCP_SERVERS: ({
3048
3054
  properties: {
3049
3055
  domain?: undefined;
3050
3056
  key?: undefined;
3057
+ field?: undefined;
3051
3058
  data?: undefined;
3052
3059
  tags?: undefined;
3053
3060
  query?: undefined;
@@ -3079,6 +3086,7 @@ export declare const SEED_MCP_SERVERS: ({
3079
3086
  value: {
3080
3087
  description: string;
3081
3088
  };
3089
+ field?: undefined;
3082
3090
  data?: undefined;
3083
3091
  tags?: undefined;
3084
3092
  query?: undefined;
@@ -3096,4 +3104,107 @@ export declare const SEED_MCP_SERVERS: ({
3096
3104
  tags: string[];
3097
3105
  compile_hints: string;
3098
3106
  credential_providers: never[];
3107
+ } | {
3108
+ name: string;
3109
+ description: string;
3110
+ transport_type: string;
3111
+ transport_config: {
3112
+ builtin: boolean;
3113
+ process: string;
3114
+ };
3115
+ tool_manifest: ({
3116
+ name: string;
3117
+ description: string;
3118
+ inputSchema: {
3119
+ type: string;
3120
+ properties: {
3121
+ endpoint: {
3122
+ type: string;
3123
+ description: string;
3124
+ };
3125
+ method: {
3126
+ type: string;
3127
+ description: string;
3128
+ };
3129
+ headers: {
3130
+ type: string;
3131
+ description: string;
3132
+ };
3133
+ query: {
3134
+ type: string;
3135
+ description: string;
3136
+ };
3137
+ body: {
3138
+ description: string;
3139
+ };
3140
+ request_schema: {
3141
+ type: string;
3142
+ description: string;
3143
+ };
3144
+ response_schema: {
3145
+ type: string;
3146
+ description: string;
3147
+ };
3148
+ timeout_ms: {
3149
+ type: string;
3150
+ description: string;
3151
+ };
3152
+ credential_provider: {
3153
+ type: string;
3154
+ description: string;
3155
+ };
3156
+ credential_label: {
3157
+ type: string;
3158
+ description: string;
3159
+ };
3160
+ auth_scheme: {
3161
+ type: string;
3162
+ description: string;
3163
+ };
3164
+ auth_header: {
3165
+ type: string;
3166
+ description: string;
3167
+ };
3168
+ data?: undefined;
3169
+ schema?: undefined;
3170
+ };
3171
+ required: string[];
3172
+ };
3173
+ } | {
3174
+ name: string;
3175
+ description: string;
3176
+ inputSchema: {
3177
+ type: string;
3178
+ properties: {
3179
+ data: {
3180
+ description: string;
3181
+ };
3182
+ schema: {
3183
+ type: string;
3184
+ description: string;
3185
+ };
3186
+ endpoint?: undefined;
3187
+ method?: undefined;
3188
+ headers?: undefined;
3189
+ query?: undefined;
3190
+ body?: undefined;
3191
+ request_schema?: undefined;
3192
+ response_schema?: undefined;
3193
+ timeout_ms?: undefined;
3194
+ credential_provider?: undefined;
3195
+ credential_label?: undefined;
3196
+ auth_scheme?: undefined;
3197
+ auth_header?: undefined;
3198
+ };
3199
+ required: string[];
3200
+ };
3201
+ })[];
3202
+ metadata: {
3203
+ builtin: boolean;
3204
+ category: string;
3205
+ level?: undefined;
3206
+ };
3207
+ tags: string[];
3208
+ compile_hints: string;
3209
+ credential_providers: never[];
3099
3210
  })[];
@@ -192,4 +192,41 @@ exports.SEED_MCP_SERVERS = [
192
192
  'list_domains returns all domains with counts, useful for discovering what knowledge exists.',
193
193
  credential_providers: [],
194
194
  },
195
+ {
196
+ name: 'long-tail-schema-exchange',
197
+ description: 'Schema-driven data exchange with external service endpoints. Validates requests and responses ' +
198
+ 'against JSON Schema. Transport is an implementation detail — the principle is endpoint + schema + ' +
199
+ 'validated exchange. Use this as the building block for wrapping any external API.',
200
+ transport_type: 'stdio',
201
+ transport_config: { builtin: true, process: 'in-memory' },
202
+ tool_manifest: tool_manifests_data_1.SCHEMA_EXCHANGE_TOOLS,
203
+ metadata: { builtin: true, category: 'data' },
204
+ tags: ['api', 'schema', 'exchange', 'validation', 'fetch'],
205
+ compile_hints: 'Schema-driven data exchange for external API endpoints. Validates requests before sending and responses after receiving against JSON Schema. ' +
206
+ 'When building a workflow that calls an external API endpoint, use exchange as the worker activity. ' +
207
+ 'Embed request_schema and response_schema as STATIC values in input.maps (not dynamic inputs — schemas are fixed per endpoint). ' +
208
+ 'Build the endpoint URL using @pipe concat for template variables. Use "url" for the endpoint field name. ' +
209
+ 'CRITICAL — Authorization headers: when the trigger provides a token and you need to build "Bearer {token}", use this EXACT YAML structure for the headers field in input.maps:\n' +
210
+ ' headers:\n' +
211
+ ' Authorization:\n' +
212
+ ' \'@pipe\':\n' +
213
+ ' - [\'Bearer \', \'{trigger_XXXX.output.data.token}\']\n' +
214
+ ' - [\'{@string.concat}\']\n' +
215
+ 'NEVER nest @pipe inside @pipe for headers. NEVER use @object.fromEntries for headers. The headers field is a plain object — each header name is a key, and its value can be a static string or a single @pipe expression. ' +
216
+ 'The trigger input_schema should reflect the endpoint\'s dynamic parameters (IDs, search terms, pagination) plus base_url and credentials. ' +
217
+ 'CRITICAL — exchange output structure: the exchange tool returns { status, data, headers, elapsed_ms, validated, validation_errors }. ' +
218
+ 'The actual API response body is inside the "data" field. So to reference a response field like "token", ' +
219
+ 'use {activity.output.data.data.token} (NOT {activity.output.data.token}). ' +
220
+ 'The double .data is because HotMesh wraps activity output in .output.data, and the exchange tool puts the API response in its own .data field. ' +
221
+ 'For job.maps on the last activity: job.maps.token: \'{exchange_xxxx.output.data.data.token}\'. ' +
222
+ 'Also surface validated and status: job.maps.validated: \'{exchange_xxxx.output.data.validated}\', job.maps.status: \'{exchange_xxxx.output.data.status}\'. ' +
223
+ 'response_schema enables self-testing: schedule the compiled tool on cron against a dev/staging server — if validation fails, the API schema changed. ' +
224
+ 'request_schema prevents malformed requests from ever leaving the system. ' +
225
+ 'Both schemas are optional — use response_schema alone for read endpoints, both for write endpoints, neither for exploratory calls. ' +
226
+ 'For authentication, prefer credential_provider over manually wiring tokens in headers. ' +
227
+ 'Set credential_provider to the provider name registered in the connection store (e.g. "stripe", "epic", "google"). ' +
228
+ 'The tool resolves the credential from the calling principal\'s stored connections at the last mile — no token input needed, auto-refreshes expired tokens. ' +
229
+ 'Use auth_scheme for non-Bearer schemes (e.g. "Basic", "Token") and auth_header for APIs that use X-API-Key instead of Authorization.',
230
+ credential_providers: [],
231
+ },
195
232
  ];
@@ -284,6 +284,93 @@ export declare const HTTP_FETCH_TOOLS: ({
284
284
  required: string[];
285
285
  };
286
286
  })[];
287
+ export declare const SCHEMA_EXCHANGE_TOOLS: ({
288
+ name: string;
289
+ description: string;
290
+ inputSchema: {
291
+ type: string;
292
+ properties: {
293
+ endpoint: {
294
+ type: string;
295
+ description: string;
296
+ };
297
+ method: {
298
+ type: string;
299
+ description: string;
300
+ };
301
+ headers: {
302
+ type: string;
303
+ description: string;
304
+ };
305
+ query: {
306
+ type: string;
307
+ description: string;
308
+ };
309
+ body: {
310
+ description: string;
311
+ };
312
+ request_schema: {
313
+ type: string;
314
+ description: string;
315
+ };
316
+ response_schema: {
317
+ type: string;
318
+ description: string;
319
+ };
320
+ timeout_ms: {
321
+ type: string;
322
+ description: string;
323
+ };
324
+ credential_provider: {
325
+ type: string;
326
+ description: string;
327
+ };
328
+ credential_label: {
329
+ type: string;
330
+ description: string;
331
+ };
332
+ auth_scheme: {
333
+ type: string;
334
+ description: string;
335
+ };
336
+ auth_header: {
337
+ type: string;
338
+ description: string;
339
+ };
340
+ data?: undefined;
341
+ schema?: undefined;
342
+ };
343
+ required: string[];
344
+ };
345
+ } | {
346
+ name: string;
347
+ description: string;
348
+ inputSchema: {
349
+ type: string;
350
+ properties: {
351
+ data: {
352
+ description: string;
353
+ };
354
+ schema: {
355
+ type: string;
356
+ description: string;
357
+ };
358
+ endpoint?: undefined;
359
+ method?: undefined;
360
+ headers?: undefined;
361
+ query?: undefined;
362
+ body?: undefined;
363
+ request_schema?: undefined;
364
+ response_schema?: undefined;
365
+ timeout_ms?: undefined;
366
+ credential_provider?: undefined;
367
+ credential_label?: undefined;
368
+ auth_scheme?: undefined;
369
+ auth_header?: undefined;
370
+ };
371
+ required: string[];
372
+ };
373
+ })[];
287
374
  export declare const DOCS_TOOLS: ({
288
375
  name: string;
289
376
  description: string;
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  // ── Data, storage, HTTP, and OAuth tool manifests ───────────────────────────
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.OAUTH_TOOLS = exports.DOCS_TOOLS = exports.HTTP_FETCH_TOOLS = exports.FILE_STORAGE_TOOLS = exports.DB_QUERY_TOOLS = exports.VISION_ANALYSIS_TOOLS = exports.TRANSLATION_TOOLS = void 0;
4
+ exports.OAUTH_TOOLS = exports.DOCS_TOOLS = exports.SCHEMA_EXCHANGE_TOOLS = exports.HTTP_FETCH_TOOLS = exports.FILE_STORAGE_TOOLS = exports.DB_QUERY_TOOLS = exports.VISION_ANALYSIS_TOOLS = exports.TRANSLATION_TOOLS = void 0;
5
5
  exports.TRANSLATION_TOOLS = [
6
6
  {
7
7
  name: 'translate_content',
@@ -141,6 +141,42 @@ exports.HTTP_FETCH_TOOLS = [
141
141
  },
142
142
  },
143
143
  ];
144
+ exports.SCHEMA_EXCHANGE_TOOLS = [
145
+ {
146
+ name: 'exchange',
147
+ description: 'Exchange data with an external service endpoint under schema enforcement. Validates request body against request_schema before sending and response body against response_schema after receiving. Transport is hidden — the principle is endpoint + schema + validated exchange.',
148
+ inputSchema: {
149
+ type: 'object',
150
+ properties: {
151
+ endpoint: { type: 'string', description: 'Service endpoint URL' },
152
+ method: { type: 'string', description: 'HTTP method: GET, POST, PUT, DELETE, PATCH' },
153
+ headers: { type: 'object', description: 'Request headers' },
154
+ query: { type: 'object', description: 'Query parameters' },
155
+ body: { description: 'Request body (validated against request_schema if provided)' },
156
+ request_schema: { type: 'object', description: 'JSON Schema for request body validation' },
157
+ response_schema: { type: 'object', description: 'JSON Schema for response body validation' },
158
+ timeout_ms: { type: 'number', description: 'Request timeout in milliseconds' },
159
+ credential_provider: { type: 'string', description: 'Credential provider name — resolves auth from the connection store automatically' },
160
+ credential_label: { type: 'string', description: 'Credential label for multi-credential accounts' },
161
+ auth_scheme: { type: 'string', description: 'Auth scheme (default: Bearer)' },
162
+ auth_header: { type: 'string', description: 'Header name for credential (default: Authorization)' },
163
+ },
164
+ required: ['endpoint', 'method'],
165
+ },
166
+ },
167
+ {
168
+ name: 'validate_schema',
169
+ description: 'Validate any value against a JSON Schema without making a network call. Useful for pre-validation, testing, and transform verification.',
170
+ inputSchema: {
171
+ type: 'object',
172
+ properties: {
173
+ data: { description: 'The value to validate' },
174
+ schema: { type: 'object', description: 'JSON Schema to validate against' },
175
+ },
176
+ required: ['data', 'schema'],
177
+ },
178
+ },
179
+ ];
144
180
  exports.DOCS_TOOLS = [
145
181
  {
146
182
  name: 'list_docs',
@@ -12,10 +12,13 @@ export declare const KNOWLEDGE_TOOLS: ({
12
12
  type: string;
13
13
  description: string;
14
14
  };
15
- data: {
15
+ field: {
16
16
  type: string;
17
17
  description: string;
18
18
  };
19
+ data: {
20
+ description: string;
21
+ };
19
22
  tags: {
20
23
  type: string;
21
24
  items: {
@@ -45,6 +48,7 @@ export declare const KNOWLEDGE_TOOLS: ({
45
48
  type: string;
46
49
  description: string;
47
50
  };
51
+ field?: undefined;
48
52
  data?: undefined;
49
53
  tags?: undefined;
50
54
  query?: undefined;
@@ -81,6 +85,7 @@ export declare const KNOWLEDGE_TOOLS: ({
81
85
  description: string;
82
86
  };
83
87
  key?: undefined;
88
+ field?: undefined;
84
89
  data?: undefined;
85
90
  offset?: undefined;
86
91
  path?: undefined;
@@ -114,6 +119,7 @@ export declare const KNOWLEDGE_TOOLS: ({
114
119
  description: string;
115
120
  };
116
121
  key?: undefined;
122
+ field?: undefined;
117
123
  data?: undefined;
118
124
  query?: undefined;
119
125
  path?: undefined;
@@ -129,6 +135,7 @@ export declare const KNOWLEDGE_TOOLS: ({
129
135
  properties: {
130
136
  domain?: undefined;
131
137
  key?: undefined;
138
+ field?: undefined;
132
139
  data?: undefined;
133
140
  tags?: undefined;
134
141
  query?: undefined;
@@ -160,6 +167,7 @@ export declare const KNOWLEDGE_TOOLS: ({
160
167
  value: {
161
168
  description: string;
162
169
  };
170
+ field?: undefined;
163
171
  data?: undefined;
164
172
  tags?: undefined;
165
173
  query?: undefined;
@@ -5,14 +5,15 @@ exports.KNOWLEDGE_TOOLS = void 0;
5
5
  exports.KNOWLEDGE_TOOLS = [
6
6
  {
7
7
  name: 'store_knowledge',
8
- description: 'Store or update a knowledge entry. Upserts by domain+key: merges data and unions tags if the entry already exists.',
8
+ description: 'Store a value in a 3-level additive hierarchy: domain > key > field. Upserts by domain+key fields accumulate across calls. Same domain+key+field overwrites that field. When field is provided, data can be any type. When omitted, data must be an object.',
9
9
  inputSchema: {
10
10
  type: 'object',
11
11
  properties: {
12
- domain: { type: 'string', description: 'Knowledge domain (namespace)' },
13
- key: { type: 'string', description: 'Unique key within domain' },
14
- data: { type: 'object', description: 'JSONB payload to store' },
15
- tags: { type: 'array', items: { type: 'string' }, description: 'Categorization tags' },
12
+ domain: { type: 'string', description: 'Top level — groups entries by namespace (e.g. "screenshots", "config")' },
13
+ key: { type: 'string', description: 'Second level — unique identifier within domain (e.g. "homepage")' },
14
+ field: { type: 'string', description: 'Third level (leaf) — names a specific field. Different fields accumulate; same field overwrites.' },
15
+ data: { description: 'The value to store. Any type when field is provided; must be an object when field is omitted.' },
16
+ tags: { type: 'array', items: { type: 'string' }, description: 'Categorization tags (unioned on upsert)' },
16
17
  },
17
18
  required: ['domain', 'key', 'data'],
18
19
  },
@@ -4,5 +4,5 @@
4
4
  * The system prompt teaches the LLM how to construct HotMesh YAML DAGs
5
5
  * directly from tool schemas — no execution trace needed.
6
6
  */
7
- export declare function BUILDER_SYSTEM_PROMPT(toolInventory: string): string;
7
+ export declare function BUILDER_SYSTEM_PROMPT(toolInventory: string, activitySuffix?: string): string;
8
8
  export declare const REFINE_PROMPT = "The workflow was tested and produced errors or incorrect results. Review the execution trace below and fix the YAML.\n\nCommon issues:\n- Missing .png extension on screenshot paths\n- Field name mismatch between output and input (e.g., producer outputs \"path\" but consumer expects \"image\")\n- Missing _scope or workflowName in input.maps\n- Wrong activity ID references in mappings\n- Missing job.maps on the final activity\n\nReturn the same JSON format as before with corrected yaml, activity_manifest, etc.";
@@ -8,7 +8,8 @@
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.REFINE_PROMPT = void 0;
10
10
  exports.BUILDER_SYSTEM_PROMPT = BUILDER_SYSTEM_PROMPT;
11
- function BUILDER_SYSTEM_PROMPT(toolInventory) {
11
+ function BUILDER_SYSTEM_PROMPT(toolInventory, activitySuffix) {
12
+ const suffix = activitySuffix || Math.random().toString(36).slice(2, 6);
12
13
  return `You are a HotMesh workflow builder. Given a natural language description and a set of available MCP tools, you construct a deterministic YAML DAG workflow.
13
14
 
14
15
  You do NOT execute tools. You reason about their input/output schemas and build the YAML declaratively.
@@ -45,7 +46,7 @@ app:
45
46
  ### trigger
46
47
  Entry point. Receives user input. Always the first activity.
47
48
  \`\`\`yaml
48
- trigger_x8kf:
49
+ trigger_${suffix}:
49
50
  title: Trigger
50
51
  type: trigger
51
52
  output:
@@ -56,7 +57,7 @@ trigger_x8kf:
56
57
  ### worker
57
58
  Executes an MCP tool. Receives data via input.maps, produces output. Same suffix as the trigger.
58
59
  \`\`\`yaml
59
- capture_x8kf:
60
+ capture_${suffix}:
60
61
  title: Capture Page
61
62
  type: worker
62
63
  topic: <same as subscribes>
@@ -64,10 +65,10 @@ capture_x8kf:
64
65
  schema:
65
66
  type: object
66
67
  maps:
67
- url: '{trigger_x8kf.output.data.url}'
68
+ url: '{trigger_${suffix}.output.data.url}'
68
69
  screenshot_path:
69
70
  '@pipe':
70
- - ['{trigger_x8kf.output.data.slug}', '.png']
71
+ - ['{trigger_${suffix}.output.data.slug}', '.png']
71
72
  - ['{@string.concat}']
72
73
  workflowName: capture_page
73
74
  output:
@@ -150,7 +151,7 @@ Sub-pipes must be ROW-LEVEL entries in the parent pipe array — each is a separ
150
151
  dated_key:
151
152
  '@pipe':
152
153
  - '@pipe':
153
- - ['{trigger_x8kf.output.data.slug}', '-']
154
+ - ['{trigger_${suffix}.output.data.slug}', '-']
154
155
  - ['{@string.concat}']
155
156
  - '@pipe':
156
157
  - ['{@date.now}']
@@ -168,7 +169,7 @@ CRITICAL RULES for nested @pipe:
168
169
  path:
169
170
  '@pipe':
170
171
  - '@pipe':
171
- - ['{trigger_x8kf.output.data.domain}', '/', '{trigger_x8kf.output.data.key}', '/']
172
+ - ['{trigger_${suffix}.output.data.domain}', '/', '{trigger_${suffix}.output.data.key}', '/']
172
173
  - ['{@string.concat}']
173
174
  - '@pipe':
174
175
  - ['{@date.now}']
@@ -203,29 +204,29 @@ IMPORTANT: A bare array like \`['.png']\` as a row after sub-pipes will CRASH
203
204
 
204
205
  1. **Trigger first**: Every workflow starts with a trigger activity
205
206
  2. **Worker per tool**: Each MCP tool call is a worker activity
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
+ 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_${suffix}\`, \`capture_${suffix}\`, \`analyze_${suffix}\`, \`store_${suffix}\`. 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
208
  4. **workflowName**: Every worker MUST have \`workflowName: '<tool_name>'\` in its input.maps — this routes to the correct MCP tool handler
208
209
  5. **mcp_server_id**: In the activity_manifest, use the exact hyphenated server name from the inventory (e.g., "long-tail-vision"), NOT the underscored tool prefix (e.g., "long_tail_vision")
209
- 6. **_scope threading**: Every worker MUST have \`_scope: '{trigger_x8kf.output.data._scope}'\` (using YOUR trigger's ID) for IAM context
210
+ 6. **_scope threading**: Every worker MUST have \`_scope: '{trigger_${suffix}.output.data._scope}'\` (using YOUR trigger's ID) for IAM context
210
211
  7. **Wire outputs forward**: Use \`{prevActivity.output.data.fieldName}\` to pass data between steps
211
212
  8. **Use @pipe for transforms**: When a value needs runtime computation (date stamp, string concat, slugify), use @pipe — never hardcode computed values
212
- 9. **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.
213
+ 9. **Simple fields stay simple**: If a field just passes a trigger value through (domain, key, url), use a plain reference like \`'{trigger_${suffix}.output.data.domain}'\` — NEVER wrap it in @pipe. Only use @pipe when actual transformation is needed.
213
214
  10. **File extensions**: Screenshot paths MUST include .png extension. Use @pipe concat if deriving from a slug
214
215
  11. **job.maps on last activity**: The final activity should have job.maps to promote output fields to the workflow result
215
216
  12. **Linear transitions**: Chain activities with transitions unless branching or iteration is needed
216
217
  13. **Conditional transitions**: For branching, use multi-target transitions with conditions:
217
218
  \`\`\`yaml
218
219
  transitions:
219
- check_x8kf:
220
- - to: handle_error_x8kf
220
+ check_${suffix}:
221
+ - to: handle_error_${suffix}
221
222
  conditions:
222
223
  code: 500
223
- - to: proceed_x8kf
224
+ - to: proceed_${suffix}
224
225
  \`\`\`
225
226
  Conditions can match on \`code\` (HTTP status) or \`match\` (field comparisons). The first matching condition wins; the last entry (no conditions) is the default.
226
227
  14. **Trigger stats for idempotency**: Use \`stats.id\` and \`stats.key\` on the trigger when the workflow needs custom job IDs or indexed lookups:
227
228
  \`\`\`yaml
228
- trigger_x8kf:
229
+ trigger_${suffix}:
229
230
  type: trigger
230
231
  stats:
231
232
  id: '{$self.input.data.workflowId}'
@@ -234,11 +235,11 @@ trigger_x8kf:
234
235
 
235
236
  ## Activity Manifest
236
237
 
237
- 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:
238
+ Along with the YAML, produce an activity_manifest array describing each activity. Note how all activity IDs share the same random suffix (\`_${suffix}\`) for collision-proofing while remaining human-readable:
238
239
  \`\`\`json
239
240
  [
240
241
  {
241
- "activity_id": "trigger_x8kf",
242
+ "activity_id": "trigger_${suffix}",
242
243
  "title": "Trigger",
243
244
  "type": "trigger",
244
245
  "tool_source": "trigger",
@@ -247,7 +248,7 @@ Along with the YAML, produce an activity_manifest array describing each activity
247
248
  "output_fields": ["url", "slug"]
248
249
  },
249
250
  {
250
- "activity_id": "capture_x8kf",
251
+ "activity_id": "capture_${suffix}",
251
252
  "title": "Capture Page",
252
253
  "type": "worker",
253
254
  "tool_source": "mcp",
@@ -256,7 +257,7 @@ Along with the YAML, produce an activity_manifest array describing each activity
256
257
  "mcp_server_id": "long-tail-playwright-cli",
257
258
  "mcp_tool_name": "capture_page",
258
259
  "tool_arguments": {},
259
- "input_mappings": { "url": "{trigger_x8kf.output.data.url}" },
260
+ "input_mappings": { "url": "{trigger_${suffix}.output.data.url}" },
260
261
  "output_fields": ["page_id", "path", "url", "title"]
261
262
  }
262
263
  ]
@@ -290,11 +291,11 @@ When the user provides answers to your questions, build the workflow immediately
290
291
 
291
292
  ## Output Format
292
293
 
293
- 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.
294
+ CRITICAL: The "name" field MUST match the "subscribes" topic in the YAML exactly. Use snake_case (e.g. "screenshot_analyze_store", "capture_page", "daily_report"). Only lowercase letters, digits, and underscores. The name and subscribes topic MUST be identical.
294
295
 
295
296
  Return a JSON object (no markdown fences):
296
297
  {
297
- "name": "screenshot.analyze.store",
298
+ "name": "screenshot_analyze_store",
298
299
  "description": "What this workflow does",
299
300
  "yaml": "<the complete YAML string>",
300
301
  "input_schema": { <JSON Schema for trigger inputs> },
@@ -3,7 +3,7 @@
3
3
  * These are side-effect functions that update the database.
4
4
  */
5
5
  import type { PlanItem, LTWorkflowSetStatus } from '../../../../types/workflow-set';
6
- export declare function persistPlan(setId: string, planItems: PlanItem[]): Promise<void>;
6
+ export declare function persistPlan(setId: string, planItems: PlanItem[], namespaces?: string[]): Promise<void>;
7
7
  export interface BuiltWorkflowData {
8
8
  name: string;
9
9
  description: string;
@@ -12,9 +12,9 @@ const workflow_sets_1 = require("../../../../services/workflow-sets");
12
12
  const db_1 = require("../../../../services/yaml-workflow/db");
13
13
  const deployer_1 = require("../../../../services/yaml-workflow/deployer");
14
14
  const workers_1 = require("../../../../services/yaml-workflow/workers");
15
- async function persistPlan(setId, planItems) {
16
- const namespaces = [...new Set(planItems.map(w => w.namespace))];
17
- await (0, workflow_sets_1.updateWorkflowSetPlan)(setId, planItems, namespaces);
15
+ async function persistPlan(setId, planItems, namespaces) {
16
+ const ns = namespaces || [...new Set(planItems.map(w => w.namespace))];
17
+ await (0, workflow_sets_1.updateWorkflowSetPlan)(setId, planItems, ns);
18
18
  }
19
19
  async function persistBuiltWorkflow(setId, planItem, builderOutput) {
20
20
  const input = {
@@ -51,14 +51,48 @@ const { generatePlan, persistPlan, persistBuiltWorkflow, updateSetStatus, deploy
51
51
  * and deploys the resulting set.
52
52
  */
53
53
  async function mcpWorkflowPlanner(envelope) {
54
- const { specification, setId } = envelope.data;
54
+ const { specification, setId, existingPlan, existingSchemas, } = envelope.data;
55
+ const isAddition = !!existingPlan?.length;
55
56
  // 1. Generate plan from specification
56
- const planResult = await generatePlan(specification);
57
- // 2. Persist the plan to the workflow set
58
- await persistPlan(setId, planResult.workflows);
57
+ // When adding to an existing set, tell the planner what already exists
58
+ let planSpec = specification;
59
+ if (isAddition) {
60
+ const existingNames = existingPlan.map(p => `- ${p.name} [${p.namespace}]: ${p.description}`).join('\n');
61
+ const namespaces = [...new Set(existingPlan.map(p => p.namespace))];
62
+ planSpec = `${specification}\n\n## Existing workflows in this set (do NOT recreate these):\n${existingNames}\n\n## Namespace constraint\nNew workflows MUST use namespace "${namespaces[0]}". This set already uses this namespace and all tools must be co-located.`;
63
+ }
64
+ const planResult = await generatePlan(planSpec);
65
+ // 2. Offset build_order for additions so new items sort after existing ones
66
+ const buildOrderOffset = isAddition
67
+ ? Math.max(...existingPlan.map((_, i) => i), 0) + 1
68
+ : 0;
69
+ if (isAddition) {
70
+ for (const item of planResult.workflows) {
71
+ item.build_order += buildOrderOffset;
72
+ }
73
+ }
74
+ // 2b. Persist plan — append to existing plan for additions
75
+ if (isAddition) {
76
+ // Fetch current plan from the set and merge
77
+ const { getWorkflowSet } = await Promise.resolve().then(() => __importStar(require('../../../services/workflow-sets')));
78
+ const currentSet = await getWorkflowSet(setId);
79
+ const mergedPlan = [...(currentSet?.plan || []), ...planResult.workflows];
80
+ const mergedNamespaces = [...new Set([
81
+ ...(currentSet?.namespaces || []),
82
+ ...planResult.workflows.map(w => w.namespace),
83
+ ])];
84
+ await persistPlan(setId, mergedPlan, mergedNamespaces);
85
+ }
86
+ else {
87
+ await persistPlan(setId, planResult.workflows);
88
+ }
59
89
  // 3. Build each workflow in dependency order (leaf-first)
60
90
  await updateSetStatus(setId, 'building');
61
- const builtWorkflows = [];
91
+ // Seed sibling schemas with existing workflows when adding to a set
92
+ const builtWorkflows = (existingSchemas || []).map(s => ({
93
+ ...s,
94
+ id: '',
95
+ }));
62
96
  for (const planItem of planResult.workflows) {
63
97
  // Build context for the builder: sibling schemas for composition wiring
64
98
  const siblingSchemas = builtWorkflows.map(w => ({