@hotmeshio/long-tail 0.1.12 → 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 (282) hide show
  1. package/README.md +1 -1
  2. package/build/api/files.d.ts +13 -0
  3. package/build/api/files.js +44 -0
  4. package/build/api/mcp-runs.d.ts +2 -0
  5. package/build/api/mcp-runs.js +2 -0
  6. package/build/api/workflow-sets.d.ts +11 -0
  7. package/build/api/workflow-sets.js +62 -0
  8. package/build/api/yaml-workflows.d.ts +9 -0
  9. package/build/api/yaml-workflows.js +40 -11
  10. package/build/examples/seed.js +50 -0
  11. package/build/lib/db/schemas/001_schema.sql +281 -106
  12. package/build/lib/db/schemas/002_seed.sql +56 -39
  13. package/build/lib/storage/local.d.ts +15 -0
  14. package/build/lib/storage/local.js +63 -0
  15. package/build/lib/storage/mime.d.ts +4 -0
  16. package/build/lib/storage/mime.js +31 -0
  17. package/build/lib/storage/s3.d.ts +16 -0
  18. package/build/lib/storage/s3.js +70 -0
  19. package/build/lib/storage/types.d.ts +18 -0
  20. package/build/modules/utils.d.ts +73 -0
  21. package/build/modules/utils.js +84 -0
  22. package/build/routes/file-browser.d.ts +2 -0
  23. package/build/routes/file-browser.js +112 -0
  24. package/build/routes/files.js +25 -17
  25. package/build/routes/index.js +2 -0
  26. package/build/routes/mcp-runs.js +2 -0
  27. package/build/routes/workflow-sets.js +9 -0
  28. package/build/routes/yaml-workflows/deployment.js +8 -0
  29. package/build/services/insight/index.d.ts +13 -0
  30. package/build/services/insight/index.js +4 -7
  31. package/build/services/insight/prompts.d.ts +1 -1
  32. package/build/services/insight/prompts.js +1 -1
  33. package/build/services/mcp/server.js +31 -0
  34. package/build/services/mcp-runs/queries.d.ts +2 -0
  35. package/build/services/mcp-runs/queries.js +11 -1
  36. package/build/services/mcp-runs/sql.d.ts +1 -1
  37. package/build/services/mcp-runs/sql.js +2 -2
  38. package/build/services/workflow-sets/db.d.ts +1 -0
  39. package/build/services/workflow-sets/db.js +6 -0
  40. package/build/services/workflow-sets/index.d.ts +1 -1
  41. package/build/services/workflow-sets/index.js +2 -1
  42. package/build/services/workflow-sets/sql.d.ts +1 -0
  43. package/build/services/workflow-sets/sql.js +6 -1
  44. package/build/services/yaml-workflow/db.d.ts +12 -0
  45. package/build/services/yaml-workflow/db.js +18 -0
  46. package/build/services/yaml-workflow/generator.js +4 -4
  47. package/build/services/yaml-workflow/pipeline/build/index.d.ts +2 -1
  48. package/build/services/yaml-workflow/pipeline/build/index.js +3 -2
  49. package/build/services/yaml-workflow/pipeline/build/utils.d.ts +0 -2
  50. package/build/services/yaml-workflow/pipeline/build/utils.js +0 -8
  51. package/build/services/yaml-workflow/sql.d.ts +2 -1
  52. package/build/services/yaml-workflow/sql.js +10 -3
  53. package/build/system/activities/schema-exchange.d.ts +50 -0
  54. package/build/system/activities/schema-exchange.js +210 -0
  55. package/build/system/activities/sql.d.ts +1 -1
  56. package/build/system/activities/sql.js +12 -1
  57. package/build/system/index.js +1 -0
  58. package/build/system/mcp-servers/human-queue.js +31 -0
  59. package/build/system/mcp-servers/knowledge.js +35 -6
  60. package/build/system/mcp-servers/schema-exchange.d.ts +4 -0
  61. package/build/system/mcp-servers/schema-exchange.js +93 -0
  62. package/build/system/seed/server-definitions.d.ts +112 -1
  63. package/build/system/seed/server-definitions.js +37 -0
  64. package/build/system/seed/tool-manifests-data.d.ts +87 -0
  65. package/build/system/seed/tool-manifests-data.js +37 -1
  66. package/build/system/seed/tool-manifests-knowledge.d.ts +9 -1
  67. package/build/system/seed/tool-manifests-knowledge.js +6 -5
  68. package/build/system/workflows/mcp-workflow-builder/prompts.d.ts +1 -1
  69. package/build/system/workflows/mcp-workflow-builder/prompts.js +21 -20
  70. package/build/system/workflows/mcp-workflow-planner/activities/persist.d.ts +1 -1
  71. package/build/system/workflows/mcp-workflow-planner/activities/persist.js +3 -3
  72. package/build/system/workflows/mcp-workflow-planner/index.js +39 -5
  73. package/build/system/workflows/mcp-workflow-planner/prompts.d.ts +1 -1
  74. package/build/system/workflows/mcp-workflow-planner/prompts.js +3 -3
  75. package/build/tsconfig.tsbuildinfo +1 -1
  76. package/dashboard/dist/assets/{AdminDashboard-DUrSBQOl.js → AdminDashboard-Cngijp4Q.js} +2 -2
  77. package/dashboard/dist/assets/{AdminDashboard-DUrSBQOl.js.map → AdminDashboard-Cngijp4Q.js.map} +1 -1
  78. package/dashboard/dist/assets/{AvailableEscalationsPage-Dbd1qUK_.js → AvailableEscalationsPage-CpBfGV1h.js} +2 -2
  79. package/dashboard/dist/assets/{AvailableEscalationsPage-Dbd1qUK_.js.map → AvailableEscalationsPage-CpBfGV1h.js.map} +1 -1
  80. package/dashboard/dist/assets/{BotPicker-Cg5iNEkm.js → BotPicker-B8Uvw9Si.js} +2 -2
  81. package/dashboard/dist/assets/{BotPicker-Cg5iNEkm.js.map → BotPicker-B8Uvw9Si.js.map} +1 -1
  82. package/dashboard/dist/assets/{CollapsibleSection-Kd9UIyeU.js → CollapsibleSection-DiFPuWOY.js} +2 -2
  83. package/dashboard/dist/assets/{CollapsibleSection-Kd9UIyeU.js.map → CollapsibleSection-DiFPuWOY.js.map} +1 -1
  84. package/dashboard/dist/assets/{ConfirmDeleteModal-DZMgmlof.js → ConfirmDeleteModal-CpXG9uyu.js} +2 -2
  85. package/dashboard/dist/assets/{ConfirmDeleteModal-DZMgmlof.js.map → ConfirmDeleteModal-CpXG9uyu.js.map} +1 -1
  86. package/dashboard/dist/assets/{CopyableId-cPFTRm8q.js → CopyableId-DKsTR9lK.js} +2 -2
  87. package/dashboard/dist/assets/{CopyableId-cPFTRm8q.js.map → CopyableId-DKsTR9lK.js.map} +1 -1
  88. package/dashboard/dist/assets/CredentialsPage-DlS7Kf40.js +2 -0
  89. package/dashboard/dist/assets/{CredentialsPage-DJablIbs.js.map → CredentialsPage-DlS7Kf40.js.map} +1 -1
  90. package/dashboard/dist/assets/{CustomDurationPicker-NgIP6YDW.js → CustomDurationPicker-B-9eW3pm.js} +2 -2
  91. package/dashboard/dist/assets/{CustomDurationPicker-NgIP6YDW.js.map → CustomDurationPicker-B-9eW3pm.js.map} +1 -1
  92. package/dashboard/dist/assets/{DataTable-CTRhTAfT.js → DataTable-DkOokbtL.js} +2 -2
  93. package/dashboard/dist/assets/{DataTable-CTRhTAfT.js.map → DataTable-DkOokbtL.js.map} +1 -1
  94. package/dashboard/dist/assets/{ElapsedCell-HcSJ_MMs.js → ElapsedCell-DVtHqM-5.js} +2 -2
  95. package/dashboard/dist/assets/{ElapsedCell-HcSJ_MMs.js.map → ElapsedCell-DVtHqM-5.js.map} +1 -1
  96. package/dashboard/dist/assets/{EmptyState-joNbd4gg.js → EmptyState-C7KIMIbE.js} +2 -2
  97. package/dashboard/dist/assets/{EmptyState-joNbd4gg.js.map → EmptyState-C7KIMIbE.js.map} +1 -1
  98. package/dashboard/dist/assets/{EscalationsOverview-DpXDnQux.js → EscalationsOverview-BMKBlkPx.js} +2 -2
  99. package/dashboard/dist/assets/{EscalationsOverview-DpXDnQux.js.map → EscalationsOverview-BMKBlkPx.js.map} +1 -1
  100. package/dashboard/dist/assets/{EventTable-CYem3v8n.js → EventTable-BYZ5OVdQ.js} +2 -2
  101. package/dashboard/dist/assets/{EventTable-CYem3v8n.js.map → EventTable-BYZ5OVdQ.js.map} +1 -1
  102. package/dashboard/dist/assets/{FilterBar-BiO8SOzc.js → FilterBar-C5r3n6YO.js} +2 -2
  103. package/dashboard/dist/assets/{FilterBar-BiO8SOzc.js.map → FilterBar-C5r3n6YO.js.map} +1 -1
  104. package/dashboard/dist/assets/{ListToolbar-6yRDh2e9.js → ListToolbar-BGUajIsW.js} +2 -2
  105. package/dashboard/dist/assets/{ListToolbar-6yRDh2e9.js.map → ListToolbar-BGUajIsW.js.map} +1 -1
  106. package/dashboard/dist/assets/{McpOverview-CUgSxkQe.js → McpOverview-B_kJYHea.js} +2 -2
  107. package/dashboard/dist/assets/{McpOverview-CUgSxkQe.js.map → McpOverview-B_kJYHea.js.map} +1 -1
  108. package/dashboard/dist/assets/McpQueryDetailPage-Czsmovqw.js +5 -0
  109. package/dashboard/dist/assets/McpQueryDetailPage-Czsmovqw.js.map +1 -0
  110. package/dashboard/dist/assets/McpQueryPage-BgAq_bQg.js +2 -0
  111. package/dashboard/dist/assets/{McpQueryPage-lV6kfDG5.js.map → McpQueryPage-BgAq_bQg.js.map} +1 -1
  112. package/dashboard/dist/assets/McpRunDetailPage-B8c0OszR.js +2 -0
  113. package/dashboard/dist/assets/McpRunDetailPage-B8c0OszR.js.map +1 -0
  114. package/dashboard/dist/assets/McpRunsPage-BY8C6k78.js +2 -0
  115. package/dashboard/dist/assets/McpRunsPage-BY8C6k78.js.map +1 -0
  116. package/dashboard/dist/assets/{Modal-BuTvD0pz.js → Modal-E1yRnCeW.js} +2 -2
  117. package/dashboard/dist/assets/{Modal-BuTvD0pz.js.map → Modal-E1yRnCeW.js.map} +1 -1
  118. package/dashboard/dist/assets/OperatorDashboard-C8MSTzey.js +2 -0
  119. package/dashboard/dist/assets/{OperatorDashboard-C9SSV96T.js.map → OperatorDashboard-C8MSTzey.js.map} +1 -1
  120. package/dashboard/dist/assets/{PageHeader-BcTVF9ul.js → PageHeader-Cm5HBQF_.js} +2 -2
  121. package/dashboard/dist/assets/{PageHeader-BcTVF9ul.js.map → PageHeader-Cm5HBQF_.js.map} +1 -1
  122. package/dashboard/dist/assets/{PageHeaderWithStats-BI7JG5x6.js → PageHeaderWithStats-CNmWJFSN.js} +2 -2
  123. package/dashboard/dist/assets/{PageHeaderWithStats-BI7JG5x6.js.map → PageHeaderWithStats-CNmWJFSN.js.map} +1 -1
  124. package/dashboard/dist/assets/{PriorityBadge-DqVaOU65.js → PriorityBadge-HSI4RVhs.js} +2 -2
  125. package/dashboard/dist/assets/{PriorityBadge-DqVaOU65.js.map → PriorityBadge-HSI4RVhs.js.map} +1 -1
  126. package/dashboard/dist/assets/{ProcessDetailPage-hFMhf9qa.js → ProcessDetailPage-Dln8622H.js} +2 -2
  127. package/dashboard/dist/assets/{ProcessDetailPage-hFMhf9qa.js.map → ProcessDetailPage-Dln8622H.js.map} +1 -1
  128. package/dashboard/dist/assets/{ProcessesListPage-ByVoBCQ3.js → ProcessesListPage-bIsd9N_h.js} +2 -2
  129. package/dashboard/dist/assets/{ProcessesListPage-ByVoBCQ3.js.map → ProcessesListPage-bIsd9N_h.js.map} +1 -1
  130. package/dashboard/dist/assets/{RolePill-D9ZIkYiu.js → RolePill-BVUp2bF0.js} +2 -2
  131. package/dashboard/dist/assets/{RolePill-D9ZIkYiu.js.map → RolePill-BVUp2bF0.js.map} +1 -1
  132. package/dashboard/dist/assets/RolesPage-kH-Njt25.js +2 -0
  133. package/dashboard/dist/assets/{RolesPage-SMedMuqa.js.map → RolesPage-kH-Njt25.js.map} +1 -1
  134. package/dashboard/dist/assets/{RowActions-yDhwwDbU.js → RowActions-DbUJPfaW.js} +2 -2
  135. package/dashboard/dist/assets/{RowActions-yDhwwDbU.js.map → RowActions-DbUJPfaW.js.map} +1 -1
  136. package/dashboard/dist/assets/{StatCard-BrBnQFxh.js → StatCard-Bs3JbyAz.js} +2 -2
  137. package/dashboard/dist/assets/{StatCard-BrBnQFxh.js.map → StatCard-Bs3JbyAz.js.map} +1 -1
  138. package/dashboard/dist/assets/{StatusBadge-xgb-lZku.js → StatusBadge-CakDdsCw.js} +2 -2
  139. package/dashboard/dist/assets/{StatusBadge-xgb-lZku.js.map → StatusBadge-CakDdsCw.js.map} +1 -1
  140. package/dashboard/dist/assets/{StepIndicator-B9ps2SvM.js → StepIndicator-Cd_SG_yA.js} +2 -2
  141. package/dashboard/dist/assets/{StepIndicator-B9ps2SvM.js.map → StepIndicator-Cd_SG_yA.js.map} +1 -1
  142. package/dashboard/dist/assets/{StickyPagination-DTIjBKN3.js → StickyPagination-Bz0C18nC.js} +2 -2
  143. package/dashboard/dist/assets/{StickyPagination-DTIjBKN3.js.map → StickyPagination-Bz0C18nC.js.map} +1 -1
  144. package/dashboard/dist/assets/{SwimlaneTimeline-RK4Yu66z.js → SwimlaneTimeline-Cfe-xQRX.js} +2 -2
  145. package/dashboard/dist/assets/{SwimlaneTimeline-RK4Yu66z.js.map → SwimlaneTimeline-Cfe-xQRX.js.map} +1 -1
  146. package/dashboard/dist/assets/{TagInput-CdNUuqk4.js → TagInput-ClFhXG-U.js} +2 -2
  147. package/dashboard/dist/assets/{TagInput-CdNUuqk4.js.map → TagInput-ClFhXG-U.js.map} +1 -1
  148. package/dashboard/dist/assets/{TaskDetailPage-C-nzaNea.js → TaskDetailPage-SuMBdARt.js} +2 -2
  149. package/dashboard/dist/assets/{TaskDetailPage-C-nzaNea.js.map → TaskDetailPage-SuMBdARt.js.map} +1 -1
  150. package/dashboard/dist/assets/{TaskQueuePill-Lvr2-NzS.js → TaskQueuePill-lJR1JW_W.js} +2 -2
  151. package/dashboard/dist/assets/{TaskQueuePill-Lvr2-NzS.js.map → TaskQueuePill-lJR1JW_W.js.map} +1 -1
  152. package/dashboard/dist/assets/{TasksListPage-DSUmD84y.js → TasksListPage-Dkq1Vtbt.js} +2 -2
  153. package/dashboard/dist/assets/{TasksListPage-DSUmD84y.js.map → TasksListPage-Dkq1Vtbt.js.map} +1 -1
  154. package/dashboard/dist/assets/{TimeAgo-BZdLdrIh.js → TimeAgo-DgfDZ1pl.js} +2 -2
  155. package/dashboard/dist/assets/{TimeAgo-BZdLdrIh.js.map → TimeAgo-DgfDZ1pl.js.map} +1 -1
  156. package/dashboard/dist/assets/{TimestampCell-QX_0i5FK.js → TimestampCell-MpHZ1hMD.js} +2 -2
  157. package/dashboard/dist/assets/{TimestampCell-QX_0i5FK.js.map → TimestampCell-MpHZ1hMD.js.map} +1 -1
  158. package/dashboard/dist/assets/{UserName-DyZMXcBm.js → UserName-DqsosA4B.js} +2 -2
  159. package/dashboard/dist/assets/{UserName-DyZMXcBm.js.map → UserName-DqsosA4B.js.map} +1 -1
  160. package/dashboard/dist/assets/{WorkflowExecutionPage-DjVxfZaF.js → WorkflowExecutionPage-CVlg38C3.js} +2 -2
  161. package/dashboard/dist/assets/{WorkflowExecutionPage-DjVxfZaF.js.map → WorkflowExecutionPage-CVlg38C3.js.map} +1 -1
  162. package/dashboard/dist/assets/WorkflowPill-CRpZhjGR.js +2 -0
  163. package/dashboard/dist/assets/WorkflowPill-CRpZhjGR.js.map +1 -0
  164. package/dashboard/dist/assets/{WorkflowsDashboard-DZjuiFZ0.js → WorkflowsDashboard-Ugzbs8mV.js} +2 -2
  165. package/dashboard/dist/assets/{WorkflowsDashboard-DZjuiFZ0.js.map → WorkflowsDashboard-Ugzbs8mV.js.map} +1 -1
  166. package/dashboard/dist/assets/{WorkflowsOverview-CLnLRpOu.js → WorkflowsOverview-CIp_lTNl.js} +2 -2
  167. package/dashboard/dist/assets/{WorkflowsOverview-CLnLRpOu.js.map → WorkflowsOverview-CIp_lTNl.js.map} +1 -1
  168. package/dashboard/dist/assets/YamlWorkflowsPage-BICF0fRO.js +2 -0
  169. package/dashboard/dist/assets/YamlWorkflowsPage-BICF0fRO.js.map +1 -0
  170. package/dashboard/dist/assets/{bots-DIM6lBoY.js → bots-DPfUpVqI.js} +2 -2
  171. package/dashboard/dist/assets/{bots-DIM6lBoY.js.map → bots-DPfUpVqI.js.map} +1 -1
  172. package/dashboard/dist/assets/{escalation-JOTuOqjq.js → escalation-RrCDbMC3.js} +2 -2
  173. package/dashboard/dist/assets/{escalation-JOTuOqjq.js.map → escalation-RrCDbMC3.js.map} +1 -1
  174. package/dashboard/dist/assets/escalation-columns-CDGa9wsD.js +2 -0
  175. package/dashboard/dist/assets/{escalation-columns-Cyg58nkg.js.map → escalation-columns-CDGa9wsD.js.map} +1 -1
  176. package/dashboard/dist/assets/{helpers-B1BDxBZd.js → helpers-ZSKqdkdS.js} +2 -2
  177. package/dashboard/dist/assets/{helpers-B1BDxBZd.js.map → helpers-ZSKqdkdS.js.map} +1 -1
  178. package/dashboard/dist/assets/helpers-rMEcLwKs.js +2 -0
  179. package/dashboard/dist/assets/helpers-rMEcLwKs.js.map +1 -0
  180. package/dashboard/dist/assets/{index-DDYFpi4l.js → index-ABcJHHlN.js} +2 -2
  181. package/dashboard/dist/assets/{index-DDYFpi4l.js.map → index-ABcJHHlN.js.map} +1 -1
  182. package/dashboard/dist/assets/{index-D1wVX50Z.js → index-B91h_jZ0.js} +2 -2
  183. package/dashboard/dist/assets/{index-D1wVX50Z.js.map → index-B91h_jZ0.js.map} +1 -1
  184. package/dashboard/dist/assets/{index-BcR6PfpY.js → index-BbI2dzhJ.js} +2 -2
  185. package/dashboard/dist/assets/{index-BcR6PfpY.js.map → index-BbI2dzhJ.js.map} +1 -1
  186. package/dashboard/dist/assets/{index-BizfauqT.js → index-BmVCyB6C.js} +4 -4
  187. package/dashboard/dist/assets/{index-BizfauqT.js.map → index-BmVCyB6C.js.map} +1 -1
  188. package/dashboard/dist/assets/index-C1E5GTs9.js +2 -0
  189. package/dashboard/dist/assets/index-C1E5GTs9.js.map +1 -0
  190. package/dashboard/dist/assets/{index-Cf60K3x9.js → index-C90ZPzXk.js} +2 -2
  191. package/dashboard/dist/assets/{index-Cf60K3x9.js.map → index-C90ZPzXk.js.map} +1 -1
  192. package/dashboard/dist/assets/{index-BYZX9tOb.js → index-Cmgrk7PQ.js} +58 -58
  193. package/dashboard/dist/assets/index-Cmgrk7PQ.js.map +1 -0
  194. package/dashboard/dist/assets/{index-Ds0JoXS2.js → index-DNytWfSZ.js} +2 -2
  195. package/dashboard/dist/assets/{index-Ds0JoXS2.js.map → index-DNytWfSZ.js.map} +1 -1
  196. package/dashboard/dist/assets/index-DX6zxr6t.js +2 -0
  197. package/dashboard/dist/assets/{index-Cg5nfiYX.js.map → index-DX6zxr6t.js.map} +1 -1
  198. package/dashboard/dist/assets/index-DeX-ezqf.css +1 -0
  199. package/dashboard/dist/assets/index-K40Qw1tk.js +2 -0
  200. package/dashboard/dist/assets/{index-Di12t56M.js.map → index-K40Qw1tk.js.map} +1 -1
  201. package/dashboard/dist/assets/{index-BUK3qR-1.js → index-lCyNr5Xk.js} +2 -2
  202. package/dashboard/dist/assets/{index-BUK3qR-1.js.map → index-lCyNr5Xk.js.map} +1 -1
  203. package/dashboard/dist/assets/{mcp-B_xbczAt.js → mcp-CNE44TSp.js} +2 -2
  204. package/dashboard/dist/assets/{mcp-B_xbczAt.js.map → mcp-CNE44TSp.js.map} +1 -1
  205. package/dashboard/dist/assets/mcp-query-RQX0uN-5.js +2 -0
  206. package/dashboard/dist/assets/mcp-query-RQX0uN-5.js.map +1 -0
  207. package/dashboard/dist/assets/mcp-runs-0w40bdz-.js +2 -0
  208. package/dashboard/dist/assets/mcp-runs-0w40bdz-.js.map +1 -0
  209. package/dashboard/dist/assets/{namespaces-C3WtdO_9.js → namespaces-BbmdXuPp.js} +2 -2
  210. package/dashboard/dist/assets/{namespaces-C3WtdO_9.js.map → namespaces-BbmdXuPp.js.map} +1 -1
  211. package/dashboard/dist/assets/{roles-BDAsPpZG.js → roles-DoHYlhWH.js} +2 -2
  212. package/dashboard/dist/assets/{roles-BDAsPpZG.js.map → roles-DoHYlhWH.js.map} +1 -1
  213. package/dashboard/dist/assets/{settings-Ife_UwAp.js → settings-BAiJiCHS.js} +2 -2
  214. package/dashboard/dist/assets/{settings-Ife_UwAp.js.map → settings-BAiJiCHS.js.map} +1 -1
  215. package/dashboard/dist/assets/{tasks-BquNDHDI.js → tasks-CvroqHtm.js} +2 -2
  216. package/dashboard/dist/assets/{tasks-BquNDHDI.js.map → tasks-CvroqHtm.js.map} +1 -1
  217. package/dashboard/dist/assets/{useEventHooks-anv_B2Yy.js → useEventHooks-BHMbzR_y.js} +2 -2
  218. package/dashboard/dist/assets/{useEventHooks-anv_B2Yy.js.map → useEventHooks-BHMbzR_y.js.map} +1 -1
  219. package/dashboard/dist/assets/useFilterParams-CGRYFw_A.js +2 -0
  220. package/dashboard/dist/assets/useFilterParams-CGRYFw_A.js.map +1 -0
  221. package/dashboard/dist/assets/useYamlActivityEvents-D56KV14X.js +2 -0
  222. package/dashboard/dist/assets/useYamlActivityEvents-D56KV14X.js.map +1 -0
  223. package/dashboard/dist/assets/{users-CFcxB4v6.js → users-CxIMy_xw.js} +2 -2
  224. package/dashboard/dist/assets/{users-CFcxB4v6.js.map → users-CxIMy_xw.js.map} +1 -1
  225. package/dashboard/dist/assets/{vendor-icons-T4r2DSPD.js → vendor-icons-AFGxSeQS.js} +132 -82
  226. package/dashboard/dist/assets/vendor-icons-AFGxSeQS.js.map +1 -0
  227. package/dashboard/dist/assets/{workflows-CeRci9z3.js → workflows-yR9yais7.js} +2 -2
  228. package/dashboard/dist/assets/{workflows-CeRci9z3.js.map → workflows-yR9yais7.js.map} +1 -1
  229. package/dashboard/dist/assets/yaml-workflows-QVF2MZ0l.js +2 -0
  230. package/dashboard/dist/assets/yaml-workflows-QVF2MZ0l.js.map +1 -0
  231. package/dashboard/dist/index.html +3 -3
  232. package/docs/schema-exchange.md +173 -0
  233. package/docs/self-test.md +106 -0
  234. package/package.json +4 -2
  235. package/build/lib/db/schemas/003_workflow_discovery.sql +0 -39
  236. package/build/lib/db/schemas/004_query_router.sql +0 -38
  237. package/build/lib/db/schemas/004_workflow_sets.sql +0 -29
  238. package/build/lib/db/schemas/005_triage_router.sql +0 -37
  239. package/build/lib/db/schemas/005_unique_graph_topic.sql +0 -7
  240. package/build/lib/db/schemas/006_oauth.sql +0 -50
  241. package/build/lib/db/schemas/007_security.sql +0 -27
  242. package/build/lib/db/schemas/008_bot_accounts.sql +0 -30
  243. package/build/lib/db/schemas/009_audit_trail.sql +0 -7
  244. package/build/lib/db/schemas/010_credential_providers.sql +0 -4
  245. package/build/lib/db/schemas/011_system_workflow_configs.sql +0 -37
  246. package/build/lib/db/schemas/012_drop_modality.sql +0 -6
  247. package/build/lib/db/schemas/013_execute_as.sql +0 -9
  248. package/build/lib/db/schemas/014_ephemeral_credentials.sql +0 -16
  249. package/build/lib/db/schemas/015_knowledge.sql +0 -23
  250. package/build/lib/db/schemas/016_streamable_http.sql +0 -7
  251. package/dashboard/dist/assets/CredentialsPage-DJablIbs.js +0 -2
  252. package/dashboard/dist/assets/McpQueryDetailPage-BWbinTM_.js +0 -5
  253. package/dashboard/dist/assets/McpQueryDetailPage-BWbinTM_.js.map +0 -1
  254. package/dashboard/dist/assets/McpQueryPage-lV6kfDG5.js +0 -2
  255. package/dashboard/dist/assets/McpRunDetailPage-D6gaxH3_.js +0 -2
  256. package/dashboard/dist/assets/McpRunDetailPage-D6gaxH3_.js.map +0 -1
  257. package/dashboard/dist/assets/McpRunsPage-DKvTklh9.js +0 -2
  258. package/dashboard/dist/assets/McpRunsPage-DKvTklh9.js.map +0 -1
  259. package/dashboard/dist/assets/OperatorDashboard-C9SSV96T.js +0 -2
  260. package/dashboard/dist/assets/RolesPage-SMedMuqa.js +0 -2
  261. package/dashboard/dist/assets/WorkflowPill-CZqGslD6.js +0 -2
  262. package/dashboard/dist/assets/WorkflowPill-CZqGslD6.js.map +0 -1
  263. package/dashboard/dist/assets/YamlWorkflowsPage-VjdhnLmO.js +0 -2
  264. package/dashboard/dist/assets/YamlWorkflowsPage-VjdhnLmO.js.map +0 -1
  265. package/dashboard/dist/assets/escalation-columns-Cyg58nkg.js +0 -2
  266. package/dashboard/dist/assets/helpers-BCix9c_m.js +0 -2
  267. package/dashboard/dist/assets/helpers-BCix9c_m.js.map +0 -1
  268. package/dashboard/dist/assets/index-BYZX9tOb.js.map +0 -1
  269. package/dashboard/dist/assets/index-Cg5nfiYX.js +0 -2
  270. package/dashboard/dist/assets/index-DcIKW-cZ.css +0 -1
  271. package/dashboard/dist/assets/index-Di12t56M.js +0 -2
  272. package/dashboard/dist/assets/mcp-query-B8-P_QoG.js +0 -2
  273. package/dashboard/dist/assets/mcp-query-B8-P_QoG.js.map +0 -1
  274. package/dashboard/dist/assets/mcp-runs-CWeZinoF.js +0 -2
  275. package/dashboard/dist/assets/mcp-runs-CWeZinoF.js.map +0 -1
  276. package/dashboard/dist/assets/useFilterParams-BUyLHcx_.js +0 -2
  277. package/dashboard/dist/assets/useFilterParams-BUyLHcx_.js.map +0 -1
  278. package/dashboard/dist/assets/useYamlActivityEvents-DN-PTgVx.js +0 -2
  279. package/dashboard/dist/assets/useYamlActivityEvents-DN-PTgVx.js.map +0 -1
  280. package/dashboard/dist/assets/vendor-icons-T4r2DSPD.js.map +0 -1
  281. package/dashboard/dist/assets/yaml-workflows-DLwd2BOX.js +0 -2
  282. package/dashboard/dist/assets/yaml-workflows-DLwd2BOX.js.map +0 -1
@@ -0,0 +1,210 @@
1
+ "use strict";
2
+ /**
3
+ * Schema-driven data exchange with external service endpoints.
4
+ *
5
+ * Three pillars: endpoint + schema + identity.
6
+ * Transport (fetch, Playwright, gRPC) is an implementation detail.
7
+ * The value is schema enforcement and credential resolution —
8
+ * validating both sides of the exchange and resolving auth from
9
+ * the connection store at the last mile.
10
+ */
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.validateSchema = validateSchema;
16
+ exports.exchange = exchange;
17
+ const ajv_1 = __importDefault(require("ajv"));
18
+ const context_1 = require("../../services/iam/context");
19
+ const credentials_1 = require("../../services/iam/credentials");
20
+ const DEFAULT_TIMEOUT = parseInt(process.env.LT_SCHEMA_EXCHANGE_TIMEOUT_MS || '30000', 10);
21
+ const ajv = new ajv_1.default({ allErrors: true, strict: false });
22
+ /**
23
+ * Normalize a JSON Schema object before validation.
24
+ *
25
+ * HotMesh YAML maps serialize JSON arrays as indexed objects
26
+ * (e.g. `required: {"0":"username","1":"password"}` instead of
27
+ * `required: ["username","password"]`). This recursively converts
28
+ * any indexed-object `required` fields back to arrays so Ajv
29
+ * validates correctly.
30
+ */
31
+ function normalizeSchema(obj) {
32
+ if (obj === null || obj === undefined || typeof obj !== 'object')
33
+ return obj;
34
+ if (Array.isArray(obj))
35
+ return obj.map(normalizeSchema);
36
+ const result = {};
37
+ for (const [key, value] of Object.entries(obj)) {
38
+ if (key === 'required' && value && typeof value === 'object' && !Array.isArray(value)) {
39
+ // Convert indexed object {"0":"a","1":"b"} to array ["a","b"]
40
+ const keys = Object.keys(value);
41
+ if (keys.every(k => /^\d+$/.test(k))) {
42
+ result[key] = keys.sort((a, b) => Number(a) - Number(b)).map(k => value[k]);
43
+ continue;
44
+ }
45
+ }
46
+ result[key] = normalizeSchema(value);
47
+ }
48
+ return result;
49
+ }
50
+ /**
51
+ * Validate data against a JSON Schema.
52
+ *
53
+ * Returns a list of human-readable error strings (empty when valid).
54
+ */
55
+ function validateSchema(data, schema) {
56
+ const normalized = normalizeSchema(schema);
57
+ const validate = ajv.compile(normalized);
58
+ const valid = validate(data);
59
+ if (valid)
60
+ return { valid: true, errors: [] };
61
+ const errors = (validate.errors || []).map((e) => {
62
+ const path = e.instancePath || '(root)';
63
+ return `${path}: ${e.message}${e.params ? ` (${JSON.stringify(e.params)})` : ''}`;
64
+ });
65
+ return { valid: false, errors };
66
+ }
67
+ /**
68
+ * Exchange data with an external service endpoint under schema enforcement.
69
+ *
70
+ * 1. If request_schema provided, validate body before sending.
71
+ * On failure: return immediately (never send the request).
72
+ * 2. Make the HTTP call (transport layer — currently Node.js fetch).
73
+ * 3. Parse response body (JSON auto-detect).
74
+ * 4. If response_schema provided, validate response after receiving.
75
+ * 5. Return result with validated flag and any validation_errors.
76
+ */
77
+ async function exchange(args) {
78
+ // 1. Validate request body against schema (if provided)
79
+ if (args.request_schema && args.body !== undefined) {
80
+ const result = validateSchema(args.body, args.request_schema);
81
+ if (!result.valid) {
82
+ return {
83
+ status: 0,
84
+ data: null,
85
+ headers: {},
86
+ elapsed_ms: 0,
87
+ validated: false,
88
+ validation_errors: result.errors.map((e) => `request: ${e}`),
89
+ };
90
+ }
91
+ }
92
+ // 2. Resolve credential from connection store (if credential_provider set)
93
+ if (args.credential_provider) {
94
+ const ctx = (0, context_1.getToolContext)();
95
+ if (!ctx?.principal) {
96
+ return {
97
+ status: 0, data: null, headers: {}, elapsed_ms: 0,
98
+ validated: false,
99
+ validation_errors: ['credential: no identity context — cannot resolve credential_provider without a principal'],
100
+ };
101
+ }
102
+ const cred = await (0, credentials_1.resolveCredential)(ctx.principal, args.credential_provider, args.credential_label, ctx.initiatingPrincipal ? { fallbackPrincipal: ctx.initiatingPrincipal } : undefined);
103
+ if (!cred) {
104
+ return {
105
+ status: 0, data: null, headers: {}, elapsed_ms: 0,
106
+ validated: false,
107
+ validation_errors: [`credential: no credential found for provider "${args.credential_provider}" — register one at Settings > Connections`],
108
+ };
109
+ }
110
+ const scheme = args.auth_scheme || 'Bearer';
111
+ const headerName = args.auth_header || 'Authorization';
112
+ args.headers = { ...args.headers, [headerName]: `${scheme} ${cred.value}` };
113
+ }
114
+ // 3. Build URL with query parameters (accept endpoint or url)
115
+ let url = args.endpoint || args.url;
116
+ if (!url) {
117
+ return {
118
+ status: 0, data: null, headers: {}, elapsed_ms: 0,
119
+ validated: false, validation_errors: ['endpoint or url is required'],
120
+ };
121
+ }
122
+ if (args.query && Object.keys(args.query).length > 0) {
123
+ const params = new URLSearchParams(args.query);
124
+ url += (url.includes('?') ? '&' : '?') + params.toString();
125
+ }
126
+ // 3. Make the HTTP call
127
+ const start = performance.now();
128
+ const controller = new AbortController();
129
+ const timeout = setTimeout(() => controller.abort(), args.timeout_ms || DEFAULT_TIMEOUT);
130
+ let status;
131
+ let responseHeaders = {};
132
+ let rawBody;
133
+ try {
134
+ const fetchOpts = {
135
+ method: args.method,
136
+ headers: args.headers,
137
+ signal: controller.signal,
138
+ };
139
+ if (args.body !== undefined && args.method !== 'GET' && args.method !== 'HEAD') {
140
+ fetchOpts.body = typeof args.body === 'string' ? args.body : JSON.stringify(args.body);
141
+ if (!args.headers?.['Content-Type'] && !args.headers?.['content-type']) {
142
+ fetchOpts.headers = { ...fetchOpts.headers, 'Content-Type': 'application/json' };
143
+ }
144
+ }
145
+ const response = await fetch(url, fetchOpts);
146
+ status = response.status;
147
+ response.headers.forEach((value, key) => { responseHeaders[key] = value; });
148
+ rawBody = await response.text();
149
+ }
150
+ catch (err) {
151
+ const elapsed = performance.now() - start;
152
+ return {
153
+ status: 0,
154
+ data: null,
155
+ headers: {},
156
+ elapsed_ms: Math.round(elapsed),
157
+ validated: false,
158
+ validation_errors: [`transport: ${err.name === 'AbortError' ? 'request timed out' : err.message}`],
159
+ };
160
+ }
161
+ finally {
162
+ clearTimeout(timeout);
163
+ }
164
+ const elapsed = performance.now() - start;
165
+ // 3b. Fail fast on auth errors — don't silently return a 401 as a "result"
166
+ if (status === 401 || status === 403) {
167
+ return {
168
+ status,
169
+ data: null,
170
+ headers: responseHeaders,
171
+ elapsed_ms: Math.round(elapsed),
172
+ validated: false,
173
+ validation_errors: [
174
+ status === 401
175
+ ? 'authentication: token expired or invalid — refresh credentials and retry'
176
+ : 'authorization: insufficient permissions for this endpoint',
177
+ ],
178
+ };
179
+ }
180
+ // 4. Parse response body
181
+ let data;
182
+ const contentType = responseHeaders['content-type'] || '';
183
+ if (contentType.includes('json') || (rawBody.startsWith('{') || rawBody.startsWith('['))) {
184
+ try {
185
+ data = JSON.parse(rawBody);
186
+ }
187
+ catch {
188
+ data = rawBody;
189
+ }
190
+ }
191
+ else {
192
+ data = rawBody;
193
+ }
194
+ // 5. Validate response against schema (if provided)
195
+ let validated = true;
196
+ let validationErrors = [];
197
+ if (args.response_schema) {
198
+ const result = validateSchema(data, args.response_schema);
199
+ validated = result.valid;
200
+ validationErrors = result.errors.map((e) => `response: ${e}`);
201
+ }
202
+ return {
203
+ status,
204
+ data,
205
+ headers: responseHeaders,
206
+ elapsed_ms: Math.round(elapsed),
207
+ validated,
208
+ validation_errors: validationErrors,
209
+ };
210
+ }
@@ -1,4 +1,4 @@
1
- export declare const UPSERT_KNOWLEDGE = "\n INSERT INTO lt_knowledge (domain, key, data, tags)\n VALUES ($1, $2, $3, $4)\n ON CONFLICT (domain, key) DO UPDATE SET\n data = lt_knowledge.data || EXCLUDED.data,\n tags = ARRAY(SELECT DISTINCT unnest(lt_knowledge.tags || EXCLUDED.tags))\n RETURNING id, domain, key, (xmax = 0) AS created, updated_at";
1
+ export declare const UPSERT_KNOWLEDGE = "\n INSERT INTO lt_knowledge (domain, key, data, tags)\n VALUES ($1, $2, $3, $4)\n ON CONFLICT (domain, key) DO UPDATE SET\n data = CASE\n WHEN jsonb_typeof(lt_knowledge.data) = 'object'\n THEN lt_knowledge.data || EXCLUDED.data\n ELSE EXCLUDED.data\n END,\n tags = ARRAY(SELECT DISTINCT unnest(lt_knowledge.tags || EXCLUDED.tags))\n RETURNING id, domain, key, (xmax = 0) AS created, updated_at";
2
2
  export declare const GET_KNOWLEDGE = "\n SELECT id, domain, key, data, tags, created_at, updated_at\n FROM lt_knowledge WHERE domain = $1 AND key = $2";
3
3
  export declare const SEARCH_KNOWLEDGE = "\n SELECT id, domain, key, data, tags, created_at, updated_at\n FROM lt_knowledge\n WHERE domain = $1 AND data @> $2::jsonb";
4
4
  export declare const COUNT_KNOWLEDGE_SEARCH = "\n SELECT COUNT(*)::int AS total FROM lt_knowledge\n WHERE domain = $1 AND data @> $2::jsonb";
@@ -2,11 +2,22 @@
2
2
  // ─── Knowledge CRUD ─────────────────────────────────────────────────────────
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.APPEND_KNOWLEDGE = exports.LIST_DOMAINS = exports.DELETE_KNOWLEDGE = exports.COUNT_KNOWLEDGE_LIST = exports.LIST_KNOWLEDGE = exports.COUNT_KNOWLEDGE_SEARCH = exports.SEARCH_KNOWLEDGE = exports.GET_KNOWLEDGE = exports.UPSERT_KNOWLEDGE = void 0;
5
+ // Upsert knowledge entry. On conflict (domain+key), merges JSONB data at
6
+ // the top level — new keys are added, existing keys are overwritten.
7
+ //
8
+ // Guard: if the existing `data` column is not a JSON object (e.g. it was
9
+ // corrupted into an array by a prior string merge), replace it entirely
10
+ // rather than appending to the array. The CASE expression ensures the
11
+ // `||` operator always receives object || object, which produces a merge.
5
12
  exports.UPSERT_KNOWLEDGE = `
6
13
  INSERT INTO lt_knowledge (domain, key, data, tags)
7
14
  VALUES ($1, $2, $3, $4)
8
15
  ON CONFLICT (domain, key) DO UPDATE SET
9
- data = lt_knowledge.data || EXCLUDED.data,
16
+ data = CASE
17
+ WHEN jsonb_typeof(lt_knowledge.data) = 'object'
18
+ THEN lt_knowledge.data || EXCLUDED.data
19
+ ELSE EXCLUDED.data
20
+ END,
10
21
  tags = ARRAY(SELECT DISTINCT unnest(lt_knowledge.tags || EXCLUDED.tags))
11
22
  RETURNING id, domain, key, (xmax = 0) AS created, updated_at`;
12
23
  exports.GET_KNOWLEDGE = `
@@ -110,4 +110,5 @@ exports.builtinMcpServerFactories = {
110
110
  'long-tail-claude-code': () => Promise.resolve().then(() => __importStar(require('./mcp-servers/claude-code'))).then((m) => m.createClaudeCodeServer()),
111
111
  'long-tail-admin': () => Promise.resolve().then(() => __importStar(require('./mcp-servers/admin'))).then((m) => m.createAdminServer()),
112
112
  'long-tail-knowledge': () => Promise.resolve().then(() => __importStar(require('./mcp-servers/knowledge'))).then((m) => m.createKnowledgeServer()),
113
+ 'long-tail-schema-exchange': () => Promise.resolve().then(() => __importStar(require('./mcp-servers/schema-exchange'))).then((m) => m.createSchemaExchangeServer()),
113
114
  };
@@ -64,6 +64,10 @@ const claimAndResolveSchema = zod_1.z.object({
64
64
  resolver_id: zod_1.z.string().describe('Identifier for who/what is resolving'),
65
65
  payload: zod_1.z.record(zod_1.z.any()).describe('Resolution payload data'),
66
66
  });
67
+ const resolveEscalationSchema = zod_1.z.object({
68
+ escalation_id: zod_1.z.string().describe('The escalation ID to resolve'),
69
+ payload: zod_1.z.record(zod_1.z.any()).describe('Resolution payload data'),
70
+ });
67
71
  const escalateAndWaitSchema = zod_1.z.object({
68
72
  role: zod_1.z.string().describe('Target role for the escalation (e.g., "reviewer")'),
69
73
  message: zod_1.z.string().describe('Description of what input is needed from the human'),
@@ -218,6 +222,33 @@ async function createHumanQueueServer(options) {
218
222
  }],
219
223
  };
220
224
  });
225
+ // ── resolve_escalation ──────────────────────────────────────────────
226
+ server.registerTool('resolve_escalation', {
227
+ title: 'Resolve Escalation',
228
+ description: 'Resolve an already-claimed escalation with a payload. Use when the claim happened externally (e.g. via API).',
229
+ inputSchema: resolveEscalationSchema,
230
+ }, async (args) => {
231
+ const resolved = await escalationService.resolveEscalation(args.escalation_id, args.payload);
232
+ if (!resolved) {
233
+ return {
234
+ content: [{
235
+ type: 'text',
236
+ text: JSON.stringify({ error: 'Failed to resolve escalation' }),
237
+ }],
238
+ isError: true,
239
+ };
240
+ }
241
+ return {
242
+ content: [{
243
+ type: 'text',
244
+ text: JSON.stringify({
245
+ escalation_id: resolved.id,
246
+ status: resolved.status,
247
+ resolved_at: resolved.resolved_at,
248
+ }),
249
+ }],
250
+ };
251
+ });
221
252
  // ── escalate_and_wait ──────────────────────────────────────────────
222
253
  server.registerTool('escalate_and_wait', {
223
254
  title: 'Escalate and Wait',
@@ -39,10 +39,11 @@ const zod_1 = require("zod");
39
39
  const logger_1 = require("../../lib/logger");
40
40
  const knowledge = __importStar(require("../activities/knowledge"));
41
41
  const storeSchema = zod_1.z.object({
42
- domain: zod_1.z.string().describe('Knowledge domain (namespace)'),
43
- key: zod_1.z.string().describe('Unique key within domain'),
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
- tags: zod_1.z.array(zod_1.z.string()).optional().describe('Categorization tags'),
42
+ domain: zod_1.z.string().describe('Top level of a 3-level hierarchy (domain > key > field). Groups related entries by namespace (e.g. "screenshots", "config", "analysis").'),
43
+ key: zod_1.z.string().describe('Second level. Unique identifier within a domain (e.g. "homepage", "user_profile"). Multiple fields accumulate under the same domain+key.'),
44
+ field: zod_1.z.string().optional().describe('Third level (leaf). Names a specific field within the domain+key entry (e.g. "url", "analysis", "score"). When provided, data is stored as { [field]: data } and merged into the existing entry. Calls with the same domain+key+field overwrite that field; different fields accumulate additively. Omit to pass data as a full object.'),
45
+ data: zod_1.z.any().describe('The value to store. When field is provided, this can be any type (string, number, boolean, object, array). When field is omitted, this must be a JSON object whose keys become the fields.'),
46
+ tags: zod_1.z.array(zod_1.z.string()).optional().describe('Categorization tags (unioned on upsert)'),
46
47
  });
47
48
  const getSchema = zod_1.z.object({
48
49
  domain: zod_1.z.string().describe('Knowledge domain'),
@@ -73,10 +74,38 @@ const appendSchema = zod_1.z.object({
73
74
  function registerTools(server) {
74
75
  server.registerTool('store_knowledge', {
75
76
  title: 'Store Knowledge',
76
- description: 'Store or update a knowledge entry. Upserts by domain+key: merges data and unions tags if the entry already exists.',
77
+ description: 'Store a value in a 3-level additive hierarchy: domain > key > field. ' +
78
+ 'Upserts by domain+key — fields accumulate across calls. ' +
79
+ 'If all three (domain+key+field) match, that field is overwritten. ' +
80
+ 'When field is provided, data can be any type (string, number, etc.). ' +
81
+ 'When field is omitted, data must be an object whose keys become the fields.',
77
82
  inputSchema: storeSchema,
78
83
  }, async (args) => {
79
- const result = await knowledge.storeKnowledge(args);
84
+ // When field is provided, wrap the data value as { [field]: data }
85
+ // so it merges into the JSONB column at the field level.
86
+ // When field is omitted, data must be a plain object — reject strings,
87
+ // arrays, and primitives that would corrupt the JSONB merge
88
+ // (Postgres `object || string` produces an array, not a merge).
89
+ let dataObj;
90
+ if (args.field != null) {
91
+ dataObj = { [args.field]: args.data };
92
+ }
93
+ else {
94
+ if (args.data == null || typeof args.data !== 'object' || Array.isArray(args.data)) {
95
+ return {
96
+ content: [{
97
+ type: 'text',
98
+ text: JSON.stringify({
99
+ error: 'When field is omitted, data must be a JSON object. Use the field parameter to store strings and other primitives.',
100
+ }),
101
+ }],
102
+ };
103
+ }
104
+ dataObj = args.data;
105
+ }
106
+ const result = await knowledge.storeKnowledge({
107
+ domain: args.domain, key: args.key, data: dataObj, tags: args.tags,
108
+ });
80
109
  return { content: [{ type: 'text', text: JSON.stringify(result) }] };
81
110
  });
82
111
  server.registerTool('get_knowledge', {
@@ -0,0 +1,4 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function createSchemaExchangeServer(options?: {
3
+ name?: string;
4
+ }): Promise<McpServer>;
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.createSchemaExchangeServer = createSchemaExchangeServer;
37
+ const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
38
+ const zod_1 = require("zod");
39
+ const logger_1 = require("../../lib/logger");
40
+ const schemaExchange = __importStar(require("../activities/schema-exchange"));
41
+ const exchangeSchema = zod_1.z.object({
42
+ endpoint: zod_1.z.string().optional().describe('Service endpoint URL. Supports template variables resolved by the caller (e.g. /Patient/{id}).'),
43
+ url: zod_1.z.string().optional().describe('Alias for endpoint (either endpoint or url is required).'),
44
+ method: zod_1.z.string().describe('HTTP method: GET, POST, PUT, DELETE, PATCH.'),
45
+ headers: zod_1.z.record(zod_1.z.string()).optional().describe('Request headers (e.g. Authorization, Accept, Content-Type).'),
46
+ query: zod_1.z.record(zod_1.z.string()).optional().describe('Query parameters appended to the URL.'),
47
+ body: zod_1.z.any().optional().describe('Request body. Validated against request_schema before sending (if provided).'),
48
+ request_schema: zod_1.z.record(zod_1.z.any()).optional().describe('JSON Schema for the request body. When provided, the body is validated before the request is sent. Validation failure returns immediately — the request is never made.'),
49
+ response_schema: zod_1.z.record(zod_1.z.any()).optional().describe('JSON Schema for the expected response body. When provided, the response is validated after receiving. The validated flag and validation_errors in the output indicate whether the response matched.'),
50
+ timeout_ms: zod_1.z.number().optional().describe('Request timeout in milliseconds (default: 30000).'),
51
+ credential_provider: zod_1.z.string().optional().describe('Credential provider name (e.g. "stripe", "epic", "google"). When set, resolves authentication from the connection store using the calling principal\'s identity. No manual token input needed.'),
52
+ credential_label: zod_1.z.string().optional().describe('Credential label for multi-credential accounts (default: "default").'),
53
+ auth_scheme: zod_1.z.string().optional().describe('Authentication scheme (default: "Bearer"). Used with credential_provider to build the auth header value.'),
54
+ auth_header: zod_1.z.string().optional().describe('Header name for the credential (default: "Authorization"). Some APIs use X-API-Key instead.'),
55
+ });
56
+ const validateSchema = zod_1.z.object({
57
+ data: zod_1.z.any().describe('The value to validate against the schema.'),
58
+ schema: zod_1.z.record(zod_1.z.any()).describe('JSON Schema to validate against.'),
59
+ });
60
+ async function createSchemaExchangeServer(options) {
61
+ const name = options?.name || 'long-tail-schema-exchange';
62
+ const instance = new mcp_js_1.McpServer({ name, version: '1.0.0' });
63
+ instance.registerTool('exchange', {
64
+ title: 'Schema Exchange',
65
+ description: 'Exchange data with an external service endpoint under schema enforcement. ' +
66
+ 'Validates the request body against request_schema before sending and the response ' +
67
+ 'body against response_schema after receiving. Transport is an implementation detail — ' +
68
+ 'the principle is endpoint + schema + validated data exchange. ' +
69
+ 'Use response_schema to detect API drift: schedule on cron and the validated flag ' +
70
+ 'tells you immediately when the API shape changes.',
71
+ inputSchema: exchangeSchema,
72
+ }, async (args) => {
73
+ try {
74
+ const result = await schemaExchange.exchange(args);
75
+ return { content: [{ type: 'text', text: JSON.stringify(result) }] };
76
+ }
77
+ catch (err) {
78
+ return { content: [{ type: 'text', text: JSON.stringify({ error: err.message }) }], isError: true };
79
+ }
80
+ });
81
+ instance.registerTool('validate_schema', {
82
+ title: 'Validate Schema',
83
+ description: 'Validate any value against a JSON Schema without making a network call. ' +
84
+ 'Useful for pre-validating data before storage, checking API response shapes in tests, ' +
85
+ 'or verifying that transforms produce correct output.',
86
+ inputSchema: validateSchema,
87
+ }, async (args) => {
88
+ const result = schemaExchange.validateSchema(args.data, args.schema);
89
+ return { content: [{ type: 'text', text: JSON.stringify(result) }] };
90
+ });
91
+ logger_1.loggerRegistry.info(`[lt-mcp:schema-exchange] ${name} ready (2 tools registered)`);
92
+ return instance;
93
+ }
@@ -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
  ];