@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
@@ -7,7 +7,7 @@
7
7
  * Falls back to mechanical heuristics when no plan is available.
8
8
  */
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.sanitizeName = exports.capToolArguments = void 0;
10
+ exports.sanitizeToolName = exports.capToolArguments = void 0;
11
11
  exports.build = build;
12
12
  const input_analyzer_1 = require("../../input-analyzer");
13
13
  const utils_1 = require("./utils");
@@ -17,7 +17,8 @@ const dag_1 = require("./dag");
17
17
  // Re-export public utilities used by other modules
18
18
  var utils_2 = require("./utils");
19
19
  Object.defineProperty(exports, "capToolArguments", { enumerable: true, get: function () { return utils_2.capToolArguments; } });
20
- Object.defineProperty(exports, "sanitizeName", { enumerable: true, get: function () { return utils_2.sanitizeName; } });
20
+ var utils_3 = require("../../../../modules/utils");
21
+ Object.defineProperty(exports, "sanitizeToolName", { enumerable: true, get: function () { return utils_3.sanitizeToolName; } });
21
22
  /**
22
23
  * Build pipeline stage: construct the HotMesh YAML DAG.
23
24
  *
@@ -8,8 +8,6 @@
8
8
  export declare function keysRelated(a: string, b: string): boolean;
9
9
  /** Cap `limit` in tool arguments to avoid sending huge payloads to downstream LLM steps. */
10
10
  export declare function capToolArguments(args: Record<string, unknown>): Record<string, unknown>;
11
- /** Sanitize a name for use in HotMesh app IDs and topics. */
12
- export declare function sanitizeName(name: string): string;
13
11
  /** Convert a snake_case/camelCase field name to a readable label. */
14
12
  export declare function humanize(name: string): string;
15
13
  /**
@@ -5,7 +5,6 @@
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.keysRelated = keysRelated;
7
7
  exports.capToolArguments = capToolArguments;
8
- exports.sanitizeName = sanitizeName;
9
8
  exports.humanize = humanize;
10
9
  exports.inferSchema = inferSchema;
11
10
  exports.buildInputMappings = buildInputMappings;
@@ -35,13 +34,6 @@ function capToolArguments(args) {
35
34
  }
36
35
  return capped;
37
36
  }
38
- /** Sanitize a name for use in HotMesh app IDs and topics. */
39
- function sanitizeName(name) {
40
- return name
41
- .toLowerCase()
42
- .replace(/[^a-z0-9]+/g, '-')
43
- .replace(/^-|-$/g, '');
44
- }
45
37
  /** Convert a snake_case/camelCase field name to a readable label. */
46
38
  function humanize(name) {
47
39
  return name
@@ -6,7 +6,8 @@ export declare const UPDATE_YAML_WORKFLOW_VERSION = "\n UPDATE lt_yaml_workflow
6
6
  export declare const DELETE_YAML_WORKFLOW = "\n DELETE FROM lt_yaml_workflows WHERE id = $1";
7
7
  export declare const GET_ACTIVE_YAML_WORKFLOWS = "\n SELECT * FROM lt_yaml_workflows\n WHERE status = 'active'\n ORDER BY name";
8
8
  export declare const LIST_BY_APP_ID = "\n SELECT * FROM lt_yaml_workflows\n WHERE app_id = $1 AND status != 'archived'\n ORDER BY name";
9
- export declare const GET_DISTINCT_APP_IDS = "\n SELECT DISTINCT app_id FROM lt_yaml_workflows\n WHERE status != 'archived'\n ORDER BY app_id";
9
+ export declare const GET_MAX_APP_VERSION = "\n SELECT COALESCE(MAX(CAST(app_version AS INTEGER)), 0) AS max_version\n FROM lt_yaml_workflows\n WHERE app_id = $1 AND status != 'archived'";
10
+ export declare const GET_DISTINCT_APP_IDS = "\n SELECT DISTINCT app_id FROM (\n SELECT app_id FROM lt_yaml_workflows WHERE status != 'archived'\n UNION\n SELECT app_id FROM hmsh_applications WHERE active = true\n ) all_apps\n ORDER BY app_id";
10
11
  export declare const MARK_CONTENT_DEPLOYED = "\n UPDATE lt_yaml_workflows\n SET deployed_content_version = content_version\n WHERE id = $1";
11
12
  export declare const MARK_APP_ID_CONTENT_DEPLOYED = "\n UPDATE lt_yaml_workflows\n SET deployed_content_version = content_version\n WHERE app_id = $1 AND status != 'archived'";
12
13
  export declare const CREATE_VERSION_SNAPSHOT = "\n INSERT INTO lt_yaml_workflow_versions\n (workflow_id, version, yaml_content, activity_manifest, input_schema, output_schema, input_field_meta, change_summary)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8)\n ON CONFLICT (workflow_id, version) DO NOTHING\n RETURNING *";
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  // ─── YAML workflow CRUD ─────────────────────────────────────────────────────
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.FIND_BY_TAGS_ALL = exports.FIND_BY_TAGS_ANY = exports.GET_CRON_SCHEDULED_WORKFLOWS = exports.CLEAR_CRON_SCHEDULE = exports.UPDATE_CRON_SCHEDULE = exports.UPDATE_STATUS_SUFFIX = exports.UPDATE_STATUS_BASE = exports.GET_VERSION_SNAPSHOT = exports.DISCOVER_WORKFLOWS = exports.LIST_VERSIONS = exports.COUNT_VERSIONS = exports.CREATE_VERSION_SNAPSHOT = exports.MARK_APP_ID_CONTENT_DEPLOYED = exports.MARK_CONTENT_DEPLOYED = exports.GET_DISTINCT_APP_IDS = exports.LIST_BY_APP_ID = exports.GET_ACTIVE_YAML_WORKFLOWS = exports.DELETE_YAML_WORKFLOW = exports.UPDATE_YAML_WORKFLOW_VERSION = exports.GET_YAML_WORKFLOW_BY_NAME = exports.GET_YAML_WORKFLOW = exports.CHECK_TOPIC_UNIQUE = exports.CREATE_YAML_WORKFLOW = void 0;
4
+ exports.FIND_BY_TAGS_ALL = exports.FIND_BY_TAGS_ANY = exports.GET_CRON_SCHEDULED_WORKFLOWS = exports.CLEAR_CRON_SCHEDULE = exports.UPDATE_CRON_SCHEDULE = exports.UPDATE_STATUS_SUFFIX = exports.UPDATE_STATUS_BASE = exports.GET_VERSION_SNAPSHOT = exports.DISCOVER_WORKFLOWS = exports.LIST_VERSIONS = exports.COUNT_VERSIONS = exports.CREATE_VERSION_SNAPSHOT = exports.MARK_APP_ID_CONTENT_DEPLOYED = exports.MARK_CONTENT_DEPLOYED = exports.GET_DISTINCT_APP_IDS = exports.GET_MAX_APP_VERSION = exports.LIST_BY_APP_ID = exports.GET_ACTIVE_YAML_WORKFLOWS = exports.DELETE_YAML_WORKFLOW = exports.UPDATE_YAML_WORKFLOW_VERSION = exports.GET_YAML_WORKFLOW_BY_NAME = exports.GET_YAML_WORKFLOW = exports.CHECK_TOPIC_UNIQUE = exports.CREATE_YAML_WORKFLOW = void 0;
5
5
  exports.CREATE_YAML_WORKFLOW = `
6
6
  INSERT INTO lt_yaml_workflows
7
7
  (name, description, app_id, app_version, source_workflow_id,
@@ -32,9 +32,16 @@ exports.LIST_BY_APP_ID = `
32
32
  SELECT * FROM lt_yaml_workflows
33
33
  WHERE app_id = $1 AND status != 'archived'
34
34
  ORDER BY name`;
35
+ exports.GET_MAX_APP_VERSION = `
36
+ SELECT COALESCE(MAX(CAST(app_version AS INTEGER)), 0) AS max_version
37
+ FROM lt_yaml_workflows
38
+ WHERE app_id = $1 AND status != 'archived'`;
35
39
  exports.GET_DISTINCT_APP_IDS = `
36
- SELECT DISTINCT app_id FROM lt_yaml_workflows
37
- WHERE status != 'archived'
40
+ SELECT DISTINCT app_id FROM (
41
+ SELECT app_id FROM lt_yaml_workflows WHERE status != 'archived'
42
+ UNION
43
+ SELECT app_id FROM hmsh_applications WHERE active = true
44
+ ) all_apps
38
45
  ORDER BY app_id`;
39
46
  exports.MARK_CONTENT_DEPLOYED = `
40
47
  UPDATE lt_yaml_workflows
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Schema-driven data exchange with external service endpoints.
3
+ *
4
+ * Three pillars: endpoint + schema + identity.
5
+ * Transport (fetch, Playwright, gRPC) is an implementation detail.
6
+ * The value is schema enforcement and credential resolution —
7
+ * validating both sides of the exchange and resolving auth from
8
+ * the connection store at the last mile.
9
+ */
10
+ /**
11
+ * Validate data against a JSON Schema.
12
+ *
13
+ * Returns a list of human-readable error strings (empty when valid).
14
+ */
15
+ export declare function validateSchema(data: unknown, schema: Record<string, unknown>): {
16
+ valid: boolean;
17
+ errors: string[];
18
+ };
19
+ /**
20
+ * Exchange data with an external service endpoint under schema enforcement.
21
+ *
22
+ * 1. If request_schema provided, validate body before sending.
23
+ * On failure: return immediately (never send the request).
24
+ * 2. Make the HTTP call (transport layer — currently Node.js fetch).
25
+ * 3. Parse response body (JSON auto-detect).
26
+ * 4. If response_schema provided, validate response after receiving.
27
+ * 5. Return result with validated flag and any validation_errors.
28
+ */
29
+ export declare function exchange(args: {
30
+ endpoint?: string;
31
+ url?: string;
32
+ method: string;
33
+ headers?: Record<string, string>;
34
+ query?: Record<string, string>;
35
+ body?: unknown;
36
+ request_schema?: Record<string, unknown>;
37
+ response_schema?: Record<string, unknown>;
38
+ timeout_ms?: number;
39
+ credential_provider?: string;
40
+ credential_label?: string;
41
+ auth_scheme?: string;
42
+ auth_header?: string;
43
+ }): Promise<{
44
+ status: number;
45
+ data: unknown;
46
+ headers: Record<string, string>;
47
+ elapsed_ms: number;
48
+ validated: boolean;
49
+ validation_errors: string[];
50
+ }>;
@@ -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
  };
@@ -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
+ }