@hotmeshio/long-tail 0.1.5 → 0.1.7

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 (431) hide show
  1. package/README.md +78 -8
  2. package/build/api/auth.d.ts +5 -0
  3. package/build/api/auth.js +42 -0
  4. package/build/api/bot-accounts.d.ts +50 -0
  5. package/build/api/bot-accounts.js +215 -0
  6. package/build/api/controlplane.d.ts +20 -0
  7. package/build/api/controlplane.js +110 -0
  8. package/build/api/dba.d.ts +15 -0
  9. package/build/api/dba.js +68 -0
  10. package/build/api/escalations.d.ts +70 -0
  11. package/build/api/escalations.js +656 -0
  12. package/build/api/exports.d.ts +32 -0
  13. package/build/api/exports.js +146 -0
  14. package/build/api/index.d.ts +18 -0
  15. package/build/api/index.js +54 -0
  16. package/build/api/insight.d.ts +29 -0
  17. package/build/api/insight.js +90 -0
  18. package/build/api/maintenance.d.ts +7 -0
  19. package/build/api/maintenance.js +28 -0
  20. package/build/api/mcp-runs.d.ts +16 -0
  21. package/build/api/mcp-runs.js +62 -0
  22. package/build/api/mcp.d.ts +52 -0
  23. package/build/api/mcp.js +212 -0
  24. package/build/api/namespaces.d.ts +7 -0
  25. package/build/{routes/escalations/helpers.js → api/namespaces.js} +24 -12
  26. package/build/api/roles.d.ts +25 -0
  27. package/build/api/roles.js +159 -0
  28. package/build/api/settings.d.ts +2 -0
  29. package/build/api/settings.js +35 -0
  30. package/build/api/tasks.d.ts +27 -0
  31. package/build/api/tasks.js +96 -0
  32. package/build/api/users.d.ts +44 -0
  33. package/build/api/users.js +162 -0
  34. package/build/api/workflow-sets.d.ts +26 -0
  35. package/build/api/workflow-sets.js +119 -0
  36. package/build/api/workflows.d.ts +48 -0
  37. package/build/api/workflows.js +298 -0
  38. package/build/api/yaml-workflows.d.ts +87 -0
  39. package/build/api/yaml-workflows.js +556 -0
  40. package/build/index.d.ts +4 -0
  41. package/build/index.js +6 -1
  42. package/build/lib/db/migrate.js +3 -6
  43. package/{lib → build/lib}/db/schemas/001_schema.sql +3 -0
  44. package/build/lib/db/schemas/004_workflow_sets.sql +29 -0
  45. package/build/lib/db/schemas/005_unique_graph_topic.sql +7 -0
  46. package/{lib → build/lib}/db/schemas/011_system_workflow_configs.sql +14 -0
  47. package/build/lib/db/schemas/016_streamable_http.sql +7 -0
  48. package/build/lib/events/callback.d.ts +41 -0
  49. package/build/lib/events/callback.js +98 -0
  50. package/build/modules/config.js +1 -1
  51. package/build/routes/auth.js +37 -36
  52. package/build/routes/bot-accounts.js +34 -164
  53. package/build/routes/controlplane.js +20 -60
  54. package/build/routes/dba.js +18 -28
  55. package/build/routes/docs.js +25 -7
  56. package/build/routes/escalations/bulk.js +17 -192
  57. package/build/routes/escalations/list.js +29 -75
  58. package/build/routes/escalations/resolve.js +3 -193
  59. package/build/routes/escalations/single.js +13 -122
  60. package/build/routes/exports.js +44 -95
  61. package/build/routes/index.js +2 -0
  62. package/build/routes/insight.js +61 -40
  63. package/build/routes/maintenance.js +41 -17
  64. package/build/routes/mcp-runs.js +52 -60
  65. package/build/routes/mcp.js +55 -161
  66. package/build/routes/namespaces.js +9 -20
  67. package/build/routes/roles.js +23 -97
  68. package/build/routes/settings.js +37 -25
  69. package/build/routes/tasks.js +28 -64
  70. package/build/routes/users.js +24 -113
  71. package/build/routes/workflow-sets.d.ts +2 -0
  72. package/build/routes/workflow-sets.js +98 -0
  73. package/build/routes/workflows/config.js +23 -57
  74. package/build/routes/workflows/discovery.js +11 -85
  75. package/build/routes/workflows/invocation.js +16 -84
  76. package/build/routes/yaml-workflows/cron.d.ts +2 -0
  77. package/build/routes/yaml-workflows/cron.js +68 -0
  78. package/build/routes/yaml-workflows/crud.js +38 -193
  79. package/build/routes/yaml-workflows/deployment.js +15 -140
  80. package/build/routes/yaml-workflows/index.js +4 -1
  81. package/build/routes/yaml-workflows/versions.js +20 -58
  82. package/build/sdk/index.d.ts +327 -0
  83. package/build/sdk/index.js +298 -0
  84. package/build/services/controlplane/index.d.ts +1 -2
  85. package/build/services/controlplane/index.js +3 -3
  86. package/build/services/controlplane/sql.d.ts +2 -2
  87. package/build/services/controlplane/sql.js +4 -5
  88. package/build/services/controlplane/types.d.ts +1 -0
  89. package/build/services/cron/index.d.ts +17 -0
  90. package/build/services/cron/index.js +94 -1
  91. package/build/services/export/index.js +6 -1
  92. package/build/services/hotmesh-utils.js +2 -4
  93. package/build/services/insight/index.d.ts +18 -0
  94. package/build/services/insight/index.js +60 -0
  95. package/build/services/mcp/client/connection.d.ts +9 -0
  96. package/build/services/mcp/client/connection.js +49 -1
  97. package/build/services/mcp/client/tools.js +13 -1
  98. package/build/services/mcp/db-server/schemas.d.ts +2 -2
  99. package/build/services/mcp/db.d.ts +1 -1
  100. package/build/services/mcp/db.js +10 -0
  101. package/build/services/mcp/playwright-server/schemas.d.ts +4 -4
  102. package/build/services/mcp/sql.d.ts +1 -1
  103. package/build/services/mcp/sql.js +2 -2
  104. package/build/services/mcp/types.d.ts +3 -1
  105. package/build/services/mcp-runs/sql.js +1 -1
  106. package/build/services/workflow-sets/db.d.ts +16 -0
  107. package/build/services/workflow-sets/db.js +78 -0
  108. package/build/services/workflow-sets/index.d.ts +1 -0
  109. package/build/services/workflow-sets/index.js +11 -0
  110. package/build/services/workflow-sets/sql.d.ts +6 -0
  111. package/build/services/workflow-sets/sql.js +24 -0
  112. package/build/services/yaml-workflow/db-utils.d.ts +1 -0
  113. package/build/services/yaml-workflow/db-utils.js +4 -0
  114. package/build/services/yaml-workflow/db.d.ts +8 -0
  115. package/build/services/yaml-workflow/db.js +41 -0
  116. package/build/services/yaml-workflow/invoke.d.ts +19 -0
  117. package/build/services/yaml-workflow/invoke.js +80 -0
  118. package/build/services/yaml-workflow/pipeline/build/dag.js +1 -1
  119. package/build/services/yaml-workflow/pipeline/build/wiring.d.ts +1 -1
  120. package/build/services/yaml-workflow/pipeline/build/wiring.js +102 -2
  121. package/build/services/yaml-workflow/pipeline/prompts.d.ts +1 -1
  122. package/build/services/yaml-workflow/pipeline/prompts.js +44 -1
  123. package/build/services/yaml-workflow/sql.d.ts +5 -1
  124. package/build/services/yaml-workflow/sql.js +23 -3
  125. package/build/services/yaml-workflow/types.d.ts +16 -1
  126. package/build/services/yaml-workflow/workers/callbacks.js +16 -2
  127. package/build/services/yaml-workflow/workers/register.js +36 -1
  128. package/build/start/adapters.js +4 -0
  129. package/build/system/index.js +12 -0
  130. package/build/system/mcp-servers/admin/schemas.d.ts +12 -12
  131. package/build/system/mcp-servers/db-query/schemas.d.ts +2 -2
  132. package/build/system/mcp-servers/knowledge.js +1 -1
  133. package/build/system/mcp-servers/playwright/schemas.d.ts +18 -18
  134. package/build/system/mcp-servers/playwright-cli/schemas.d.ts +34 -34
  135. package/build/system/mcp-servers/playwright-cli/tools-capture.js +5 -1
  136. package/build/system/mcp-servers/vision.js +54 -17
  137. package/build/system/seed/server-definitions.d.ts +7 -0
  138. package/build/system/seed/server-definitions.js +6 -2
  139. package/build/system/seed/tool-manifests-workflows.d.ts +7 -0
  140. package/build/system/seed/tool-manifests-workflows.js +10 -3
  141. package/build/system/workflows/mcp-workflow-builder/activities/caches.d.ts +5 -0
  142. package/build/system/workflows/mcp-workflow-builder/activities/caches.js +8 -0
  143. package/build/system/workflows/mcp-workflow-builder/activities/index.d.ts +2 -0
  144. package/build/system/workflows/mcp-workflow-builder/activities/index.js +8 -0
  145. package/build/system/workflows/mcp-workflow-builder/activities/llm.d.ts +2 -0
  146. package/build/system/workflows/mcp-workflow-builder/activities/llm.js +25 -0
  147. package/build/system/workflows/mcp-workflow-builder/activities/tool-loader.d.ts +11 -0
  148. package/build/system/workflows/mcp-workflow-builder/activities/tool-loader.js +34 -0
  149. package/build/system/workflows/mcp-workflow-builder/index.d.ts +16 -0
  150. package/build/system/workflows/mcp-workflow-builder/index.js +253 -0
  151. package/build/system/workflows/mcp-workflow-builder/prompts.d.ts +8 -0
  152. package/build/system/workflows/mcp-workflow-builder/prompts.js +316 -0
  153. package/build/system/workflows/mcp-workflow-planner/activities/analyze.d.ts +11 -0
  154. package/build/system/workflows/mcp-workflow-planner/activities/analyze.js +36 -0
  155. package/build/system/workflows/mcp-workflow-planner/activities/index.d.ts +3 -0
  156. package/build/system/workflows/mcp-workflow-planner/activities/index.js +12 -0
  157. package/build/system/workflows/mcp-workflow-planner/activities/persist.d.ts +19 -0
  158. package/build/system/workflows/mcp-workflow-planner/activities/persist.js +55 -0
  159. package/build/system/workflows/mcp-workflow-planner/activities/plan.d.ts +10 -0
  160. package/build/system/workflows/mcp-workflow-planner/activities/plan.js +43 -0
  161. package/build/system/workflows/mcp-workflow-planner/index.d.ts +7 -0
  162. package/build/system/workflows/mcp-workflow-planner/index.js +152 -0
  163. package/build/system/workflows/mcp-workflow-planner/prompts.d.ts +7 -0
  164. package/build/system/workflows/mcp-workflow-planner/prompts.js +77 -0
  165. package/build/system/workflows/shared/tool-loader.js +3 -0
  166. package/build/tsconfig.tsbuildinfo +1 -1
  167. package/build/types/index.d.ts +1 -0
  168. package/build/types/mcp.d.ts +4 -3
  169. package/build/types/sdk.d.ts +27 -0
  170. package/build/types/sdk.js +2 -0
  171. package/build/types/workflow-set.d.ts +44 -0
  172. package/build/types/workflow-set.js +5 -0
  173. package/build/types/yaml-workflow.d.ts +6 -2
  174. package/dashboard/dist/assets/AdminDashboard-DRjkRSjJ.js +2 -0
  175. package/dashboard/dist/assets/{AdminDashboard-CTyAMUJR.js.map → AdminDashboard-DRjkRSjJ.js.map} +1 -1
  176. package/dashboard/dist/assets/AvailableEscalationsPage-CnivX4Tz.js +2 -0
  177. package/dashboard/dist/assets/AvailableEscalationsPage-CnivX4Tz.js.map +1 -0
  178. package/dashboard/dist/assets/BotPicker-DwwaBhTH.js +2 -0
  179. package/dashboard/dist/assets/{BotPicker-C51nKFEu.js.map → BotPicker-DwwaBhTH.js.map} +1 -1
  180. package/dashboard/dist/assets/{CollapsibleSection-BSyfd8uL.js → CollapsibleSection-DQpaVA0M.js} +2 -2
  181. package/dashboard/dist/assets/{CollapsibleSection-BSyfd8uL.js.map → CollapsibleSection-DQpaVA0M.js.map} +1 -1
  182. package/dashboard/dist/assets/{ConfirmDeleteModal-CBdhia5T.js → ConfirmDeleteModal-B7JoDNvt.js} +2 -2
  183. package/dashboard/dist/assets/{ConfirmDeleteModal-CBdhia5T.js.map → ConfirmDeleteModal-B7JoDNvt.js.map} +1 -1
  184. package/dashboard/dist/assets/{CopyableId-dGlewBCS.js → CopyableId-AqoZayBG.js} +2 -2
  185. package/dashboard/dist/assets/{CopyableId-dGlewBCS.js.map → CopyableId-AqoZayBG.js.map} +1 -1
  186. package/dashboard/dist/assets/CredentialsPage-qGw1kQzi.js +2 -0
  187. package/dashboard/dist/assets/CredentialsPage-qGw1kQzi.js.map +1 -0
  188. package/dashboard/dist/assets/{CustomDurationPicker-BataWFj8.js → CustomDurationPicker-D1HUQcd0.js} +2 -2
  189. package/dashboard/dist/assets/{CustomDurationPicker-BataWFj8.js.map → CustomDurationPicker-D1HUQcd0.js.map} +1 -1
  190. package/dashboard/dist/assets/{DataTable-B3uf5CCo.js → DataTable-DKvSKoVG.js} +2 -2
  191. package/dashboard/dist/assets/{DataTable-B3uf5CCo.js.map → DataTable-DKvSKoVG.js.map} +1 -1
  192. package/dashboard/dist/assets/{ElapsedCell-G5oSwTpT.js → ElapsedCell-B0yrReGQ.js} +2 -2
  193. package/dashboard/dist/assets/{ElapsedCell-G5oSwTpT.js.map → ElapsedCell-B0yrReGQ.js.map} +1 -1
  194. package/dashboard/dist/assets/{EmptyState-BChBJNGS.js → EmptyState-X0fIzYID.js} +2 -2
  195. package/dashboard/dist/assets/{EmptyState-BChBJNGS.js.map → EmptyState-X0fIzYID.js.map} +1 -1
  196. package/dashboard/dist/assets/{EscalationsOverview-CxUv8xjG.js → EscalationsOverview-BQAT9W7r.js} +2 -2
  197. package/dashboard/dist/assets/{EscalationsOverview-CxUv8xjG.js.map → EscalationsOverview-BQAT9W7r.js.map} +1 -1
  198. package/dashboard/dist/assets/{EventTable-CVt8B0BZ.js → EventTable-CX1KNLhZ.js} +2 -2
  199. package/dashboard/dist/assets/{EventTable-CVt8B0BZ.js.map → EventTable-CX1KNLhZ.js.map} +1 -1
  200. package/dashboard/dist/assets/{FilterBar-CShf0oe7.js → FilterBar-DMTvuQy-.js} +2 -2
  201. package/dashboard/dist/assets/{FilterBar-CShf0oe7.js.map → FilterBar-DMTvuQy-.js.map} +1 -1
  202. package/dashboard/dist/assets/ListToolbar-DTOSxoEy.js +2 -0
  203. package/dashboard/dist/assets/ListToolbar-DTOSxoEy.js.map +1 -0
  204. package/dashboard/dist/assets/{McpOverview-CbaZRnJl.js → McpOverview-BaKTIWrG.js} +2 -2
  205. package/dashboard/dist/assets/{McpOverview-CbaZRnJl.js.map → McpOverview-BaKTIWrG.js.map} +1 -1
  206. package/dashboard/dist/assets/McpQueryDetailPage-CC08T5k8.js +5 -0
  207. package/dashboard/dist/assets/McpQueryDetailPage-CC08T5k8.js.map +1 -0
  208. package/dashboard/dist/assets/McpQueryPage-CVfF9dYg.js +2 -0
  209. package/dashboard/dist/assets/McpQueryPage-CVfF9dYg.js.map +1 -0
  210. package/dashboard/dist/assets/McpRunDetailPage-CKs1RWeV.js +2 -0
  211. package/dashboard/dist/assets/McpRunDetailPage-CKs1RWeV.js.map +1 -0
  212. package/dashboard/dist/assets/McpRunsPage-CcPD_tY1.js +2 -0
  213. package/dashboard/dist/assets/McpRunsPage-CcPD_tY1.js.map +1 -0
  214. package/dashboard/dist/assets/{Modal-CI5RBPOQ.js → Modal-_2AbWxJT.js} +2 -2
  215. package/dashboard/dist/assets/{Modal-CI5RBPOQ.js.map → Modal-_2AbWxJT.js.map} +1 -1
  216. package/dashboard/dist/assets/OperatorDashboard-BGiRaRDr.js +2 -0
  217. package/dashboard/dist/assets/OperatorDashboard-BGiRaRDr.js.map +1 -0
  218. package/dashboard/dist/assets/{PageHeader-SMD9qtOO.js → PageHeader-DVr5Qyzm.js} +2 -2
  219. package/dashboard/dist/assets/{PageHeader-SMD9qtOO.js.map → PageHeader-DVr5Qyzm.js.map} +1 -1
  220. package/dashboard/dist/assets/{PageHeaderWithStats-TikLQsTp.js → PageHeaderWithStats-D0KRASML.js} +2 -2
  221. package/dashboard/dist/assets/{PageHeaderWithStats-TikLQsTp.js.map → PageHeaderWithStats-D0KRASML.js.map} +1 -1
  222. package/dashboard/dist/assets/{PriorityBadge-CQ0EsLTA.js → PriorityBadge-Bx2559OU.js} +2 -2
  223. package/dashboard/dist/assets/{PriorityBadge-CQ0EsLTA.js.map → PriorityBadge-Bx2559OU.js.map} +1 -1
  224. package/dashboard/dist/assets/ProcessDetailPage-69I--sry.js +2 -0
  225. package/dashboard/dist/assets/ProcessDetailPage-69I--sry.js.map +1 -0
  226. package/dashboard/dist/assets/ProcessesListPage-BDpUbua2.js +2 -0
  227. package/dashboard/dist/assets/ProcessesListPage-BDpUbua2.js.map +1 -0
  228. package/dashboard/dist/assets/{RolePill-Crj4TH5p.js → RolePill-CcAqEaSt.js} +2 -2
  229. package/dashboard/dist/assets/{RolePill-Crj4TH5p.js.map → RolePill-CcAqEaSt.js.map} +1 -1
  230. package/dashboard/dist/assets/{RolesPage-C_RInUwS.js → RolesPage-Cl23Hjet.js} +2 -2
  231. package/dashboard/dist/assets/{RolesPage-C_RInUwS.js.map → RolesPage-Cl23Hjet.js.map} +1 -1
  232. package/dashboard/dist/assets/{RowActions-Cp5HyK_w.js → RowActions-B4mqIt3Z.js} +2 -2
  233. package/dashboard/dist/assets/{RowActions-Cp5HyK_w.js.map → RowActions-B4mqIt3Z.js.map} +1 -1
  234. package/dashboard/dist/assets/{StatCard-BKZLSgNV.js → StatCard-Cz_2OjAZ.js} +2 -2
  235. package/dashboard/dist/assets/{StatCard-BKZLSgNV.js.map → StatCard-Cz_2OjAZ.js.map} +1 -1
  236. package/dashboard/dist/assets/{StatusBadge-BYNGGZK5.js → StatusBadge-Wi2FJZsn.js} +2 -2
  237. package/dashboard/dist/assets/{StatusBadge-BYNGGZK5.js.map → StatusBadge-Wi2FJZsn.js.map} +1 -1
  238. package/dashboard/dist/assets/StepIndicator-PW5NRDMb.js +2 -0
  239. package/dashboard/dist/assets/StepIndicator-PW5NRDMb.js.map +1 -0
  240. package/dashboard/dist/assets/{StickyPagination-CTosgiU2.js → StickyPagination-Bl2Uzz65.js} +2 -2
  241. package/dashboard/dist/assets/{StickyPagination-CTosgiU2.js.map → StickyPagination-Bl2Uzz65.js.map} +1 -1
  242. package/dashboard/dist/assets/{SwimlaneTimeline-ylG5Ps1s.js → SwimlaneTimeline-CUPqMd0z.js} +2 -2
  243. package/dashboard/dist/assets/{SwimlaneTimeline-ylG5Ps1s.js.map → SwimlaneTimeline-CUPqMd0z.js.map} +1 -1
  244. package/dashboard/dist/assets/TagInput-BLtf86Ly.js +2 -0
  245. package/dashboard/dist/assets/TagInput-BLtf86Ly.js.map +1 -0
  246. package/dashboard/dist/assets/{TaskDetailPage-C9pDGdD2.js → TaskDetailPage-BXJFX74D.js} +2 -2
  247. package/dashboard/dist/assets/{TaskDetailPage-C9pDGdD2.js.map → TaskDetailPage-BXJFX74D.js.map} +1 -1
  248. package/dashboard/dist/assets/{TaskQueuePill-BtJbZTT0.js → TaskQueuePill-CWYj3xKe.js} +2 -2
  249. package/dashboard/dist/assets/{TaskQueuePill-BtJbZTT0.js.map → TaskQueuePill-CWYj3xKe.js.map} +1 -1
  250. package/dashboard/dist/assets/{TasksListPage-DtFLUEhg.js → TasksListPage-C3cX94Mw.js} +2 -2
  251. package/dashboard/dist/assets/{TasksListPage-DtFLUEhg.js.map → TasksListPage-C3cX94Mw.js.map} +1 -1
  252. package/dashboard/dist/assets/{TimeAgo-WuM6xImZ.js → TimeAgo-B_5yDDHV.js} +2 -2
  253. package/dashboard/dist/assets/{TimeAgo-WuM6xImZ.js.map → TimeAgo-B_5yDDHV.js.map} +1 -1
  254. package/dashboard/dist/assets/{TimestampCell-IVL_-Upy.js → TimestampCell-DRX724uU.js} +2 -2
  255. package/dashboard/dist/assets/{TimestampCell-IVL_-Upy.js.map → TimestampCell-DRX724uU.js.map} +1 -1
  256. package/dashboard/dist/assets/{UserName-DU9qeg13.js → UserName-Ca8FA469.js} +2 -2
  257. package/dashboard/dist/assets/{UserName-DU9qeg13.js.map → UserName-Ca8FA469.js.map} +1 -1
  258. package/dashboard/dist/assets/WorkflowExecutionPage-BBYWEV2P.js +2 -0
  259. package/dashboard/dist/assets/WorkflowExecutionPage-BBYWEV2P.js.map +1 -0
  260. package/dashboard/dist/assets/WorkflowPill-BXifAuLi.js +2 -0
  261. package/dashboard/dist/assets/{WorkflowPill-Diw8iWBP.js.map → WorkflowPill-BXifAuLi.js.map} +1 -1
  262. package/dashboard/dist/assets/WorkflowsDashboard-Drl3juz9.js +2 -0
  263. package/dashboard/dist/assets/WorkflowsDashboard-Drl3juz9.js.map +1 -0
  264. package/dashboard/dist/assets/{WorkflowsOverview-CPuvA4t3.js → WorkflowsOverview-03IRrDLg.js} +2 -2
  265. package/dashboard/dist/assets/{WorkflowsOverview-CPuvA4t3.js.map → WorkflowsOverview-03IRrDLg.js.map} +1 -1
  266. package/dashboard/dist/assets/YamlWorkflowsPage-DC2cLxVi.js +2 -0
  267. package/dashboard/dist/assets/YamlWorkflowsPage-DC2cLxVi.js.map +1 -0
  268. package/dashboard/dist/assets/{bots-BPiZXf2h.js → bots-DZEXcgiJ.js} +2 -2
  269. package/dashboard/dist/assets/{bots-BPiZXf2h.js.map → bots-DZEXcgiJ.js.map} +1 -1
  270. package/dashboard/dist/assets/{escalation-DTY_OKRh.js → escalation-Cw48lNaF.js} +2 -2
  271. package/dashboard/dist/assets/{escalation-DTY_OKRh.js.map → escalation-Cw48lNaF.js.map} +1 -1
  272. package/dashboard/dist/assets/{escalation-columns-C91fHSkp.js → escalation-columns-NINpo3qf.js} +2 -2
  273. package/dashboard/dist/assets/{escalation-columns-C91fHSkp.js.map → escalation-columns-NINpo3qf.js.map} +1 -1
  274. package/dashboard/dist/assets/helpers-Cuu3xKfr.js +2 -0
  275. package/dashboard/dist/assets/helpers-Cuu3xKfr.js.map +1 -0
  276. package/dashboard/dist/assets/helpers-fk_qr729.js +2 -0
  277. package/dashboard/dist/assets/helpers-fk_qr729.js.map +1 -0
  278. package/dashboard/dist/assets/index-B98ipWxE.js +2 -0
  279. package/dashboard/dist/assets/{index-CDWOfCmi.js.map → index-B98ipWxE.js.map} +1 -1
  280. package/dashboard/dist/assets/{index-D_qEAYrg.js → index-BIG3KooI.js} +2 -2
  281. package/dashboard/dist/assets/{index-D_qEAYrg.js.map → index-BIG3KooI.js.map} +1 -1
  282. package/dashboard/dist/assets/{index-DSzSoku1.js → index-BwN3KP_L.js} +91 -93
  283. package/dashboard/dist/assets/index-BwN3KP_L.js.map +1 -0
  284. package/dashboard/dist/assets/index-Bxe8h1x4.js +17 -0
  285. package/dashboard/dist/assets/index-Bxe8h1x4.js.map +1 -0
  286. package/dashboard/dist/assets/index-CNI7k7oB.js +6 -0
  287. package/dashboard/dist/assets/index-CNI7k7oB.js.map +1 -0
  288. package/dashboard/dist/assets/index-CORHB0WC.js +2 -0
  289. package/dashboard/dist/assets/index-CORHB0WC.js.map +1 -0
  290. package/dashboard/dist/assets/index-DcIKW-cZ.css +1 -0
  291. package/dashboard/dist/assets/index-Dj-z-x8M.js +2 -0
  292. package/dashboard/dist/assets/index-Dj-z-x8M.js.map +1 -0
  293. package/dashboard/dist/assets/index-DwRytW9O.js +5 -0
  294. package/dashboard/dist/assets/index-DwRytW9O.js.map +1 -0
  295. package/dashboard/dist/assets/index-aRvL-dXp.js +2 -0
  296. package/dashboard/dist/assets/index-aRvL-dXp.js.map +1 -0
  297. package/dashboard/dist/assets/index-b03HlbnH.js +2 -0
  298. package/dashboard/dist/assets/{index-BtOwLI0K.js.map → index-b03HlbnH.js.map} +1 -1
  299. package/dashboard/dist/assets/mcp-BZoFryNc.js +2 -0
  300. package/dashboard/dist/assets/mcp-BZoFryNc.js.map +1 -0
  301. package/dashboard/dist/assets/mcp-query-wiw1kwm8.js +2 -0
  302. package/dashboard/dist/assets/mcp-query-wiw1kwm8.js.map +1 -0
  303. package/dashboard/dist/assets/{mcp-runs-DmXYJD19.js → mcp-runs-BaEKnf5v.js} +2 -2
  304. package/dashboard/dist/assets/{mcp-runs-DmXYJD19.js.map → mcp-runs-BaEKnf5v.js.map} +1 -1
  305. package/dashboard/dist/assets/{namespaces-DoGa7jc7.js → namespaces-BwnZI4_A.js} +2 -2
  306. package/dashboard/dist/assets/{namespaces-DoGa7jc7.js.map → namespaces-BwnZI4_A.js.map} +1 -1
  307. package/dashboard/dist/assets/{roles-wCdQ2Z7k.js → roles-Bgn1K8zU.js} +2 -2
  308. package/dashboard/dist/assets/{roles-wCdQ2Z7k.js.map → roles-Bgn1K8zU.js.map} +1 -1
  309. package/dashboard/dist/assets/{settings-DDe_L7JT.js → settings-CizYiutL.js} +2 -2
  310. package/dashboard/dist/assets/{settings-DDe_L7JT.js.map → settings-CizYiutL.js.map} +1 -1
  311. package/dashboard/dist/assets/{tasks-3Hih8Bt7.js → tasks-Bmte_hc4.js} +2 -2
  312. package/dashboard/dist/assets/{tasks-3Hih8Bt7.js.map → tasks-Bmte_hc4.js.map} +1 -1
  313. package/dashboard/dist/assets/useEventHooks-CUCxpiI2.js +2 -0
  314. package/dashboard/dist/assets/useEventHooks-CUCxpiI2.js.map +1 -0
  315. package/dashboard/dist/assets/useExpandedRows-Cg9iq6Vy.js +2 -0
  316. package/dashboard/dist/assets/useExpandedRows-Cg9iq6Vy.js.map +1 -0
  317. package/dashboard/dist/assets/{useYamlActivityEvents-B5dHec6Y.js → useYamlActivityEvents-Cum02Ej9.js} +2 -2
  318. package/dashboard/dist/assets/useYamlActivityEvents-Cum02Ej9.js.map +1 -0
  319. package/dashboard/dist/assets/{users-BTagPmGW.js → users-NSDgTt-z.js} +2 -2
  320. package/dashboard/dist/assets/{users-BTagPmGW.js.map → users-NSDgTt-z.js.map} +1 -1
  321. package/dashboard/dist/assets/{vendor-icons-DCLlGYO9.js → vendor-icons-D1DdudfH.js} +141 -66
  322. package/dashboard/dist/assets/vendor-icons-D1DdudfH.js.map +1 -0
  323. package/dashboard/dist/assets/{workflows-B20dR3NE.js → workflows-k0XRdGXx.js} +2 -2
  324. package/dashboard/dist/assets/{workflows-B20dR3NE.js.map → workflows-k0XRdGXx.js.map} +1 -1
  325. package/dashboard/dist/assets/yaml-workflows-DAre8I78.js +2 -0
  326. package/dashboard/dist/assets/yaml-workflows-DAre8I78.js.map +1 -0
  327. package/dashboard/dist/index.html +3 -3
  328. package/docs/api/mcp-servers.md +60 -2
  329. package/docs/architecture.md +3 -3
  330. package/docs/dashboard.md +1 -1
  331. package/docs/epic-integration.md +224 -0
  332. package/docs/escalation-strategies.md +2 -3
  333. package/docs/events.md +28 -0
  334. package/docs/mcp.md +301 -31
  335. package/docs/sdk.md +177 -0
  336. package/docs/story.md +157 -0
  337. package/docs/workflow-builder.md +371 -0
  338. package/package.json +5 -4
  339. package/build/routes/escalations/helpers.d.ts +0 -5
  340. package/build/routes/resolve.d.ts +0 -9
  341. package/build/routes/resolve.js +0 -19
  342. package/build/routes/yaml-workflows/helpers.d.ts +0 -2
  343. package/build/routes/yaml-workflows/helpers.js +0 -8
  344. package/dashboard/dist/assets/AdminDashboard-CTyAMUJR.js +0 -2
  345. package/dashboard/dist/assets/AvailableEscalationsPage-BMXV3Q4l.js +0 -2
  346. package/dashboard/dist/assets/AvailableEscalationsPage-BMXV3Q4l.js.map +0 -1
  347. package/dashboard/dist/assets/BotPicker-C51nKFEu.js +0 -2
  348. package/dashboard/dist/assets/CredentialsPage-CoBNFSAu.js +0 -2
  349. package/dashboard/dist/assets/CredentialsPage-CoBNFSAu.js.map +0 -1
  350. package/dashboard/dist/assets/McpQueryDetailPage-CGoR9XK6.js +0 -5
  351. package/dashboard/dist/assets/McpQueryDetailPage-CGoR9XK6.js.map +0 -1
  352. package/dashboard/dist/assets/McpQueryPage-BjXoYQuU.js +0 -2
  353. package/dashboard/dist/assets/McpQueryPage-BjXoYQuU.js.map +0 -1
  354. package/dashboard/dist/assets/McpRunDetailPage-DLkA5Aar.js +0 -2
  355. package/dashboard/dist/assets/McpRunDetailPage-DLkA5Aar.js.map +0 -1
  356. package/dashboard/dist/assets/McpRunsPage-DCh9n11D.js +0 -2
  357. package/dashboard/dist/assets/McpRunsPage-DCh9n11D.js.map +0 -1
  358. package/dashboard/dist/assets/OperatorDashboard-Dc80suXd.js +0 -2
  359. package/dashboard/dist/assets/OperatorDashboard-Dc80suXd.js.map +0 -1
  360. package/dashboard/dist/assets/ProcessDetailPage-B2GKuGzk.js +0 -2
  361. package/dashboard/dist/assets/ProcessDetailPage-B2GKuGzk.js.map +0 -1
  362. package/dashboard/dist/assets/ProcessesListPage-CTjI3Wn6.js +0 -2
  363. package/dashboard/dist/assets/ProcessesListPage-CTjI3Wn6.js.map +0 -1
  364. package/dashboard/dist/assets/RefreshButton-BcQDObrv.js +0 -2
  365. package/dashboard/dist/assets/RefreshButton-BcQDObrv.js.map +0 -1
  366. package/dashboard/dist/assets/RunAsSelector-BhyWtofX.js +0 -2
  367. package/dashboard/dist/assets/RunAsSelector-BhyWtofX.js.map +0 -1
  368. package/dashboard/dist/assets/WorkflowExecutionPage-DOocX81f.js +0 -2
  369. package/dashboard/dist/assets/WorkflowExecutionPage-DOocX81f.js.map +0 -1
  370. package/dashboard/dist/assets/WorkflowPill-Diw8iWBP.js +0 -2
  371. package/dashboard/dist/assets/WorkflowsDashboard-DDtUIrTy.js +0 -2
  372. package/dashboard/dist/assets/WorkflowsDashboard-DDtUIrTy.js.map +0 -1
  373. package/dashboard/dist/assets/YamlWorkflowsPage-DlwwkluN.js +0 -2
  374. package/dashboard/dist/assets/YamlWorkflowsPage-DlwwkluN.js.map +0 -1
  375. package/dashboard/dist/assets/helpers-DBUZ9pnG.js +0 -2
  376. package/dashboard/dist/assets/helpers-DBUZ9pnG.js.map +0 -1
  377. package/dashboard/dist/assets/index-BOeA-gfK.js +0 -17
  378. package/dashboard/dist/assets/index-BOeA-gfK.js.map +0 -1
  379. package/dashboard/dist/assets/index-BZ6K_kmL.js +0 -3
  380. package/dashboard/dist/assets/index-BZ6K_kmL.js.map +0 -1
  381. package/dashboard/dist/assets/index-Bpm0yeoi.js +0 -2
  382. package/dashboard/dist/assets/index-Bpm0yeoi.js.map +0 -1
  383. package/dashboard/dist/assets/index-BtOwLI0K.js +0 -2
  384. package/dashboard/dist/assets/index-CBF3ZvRZ.js +0 -6
  385. package/dashboard/dist/assets/index-CBF3ZvRZ.js.map +0 -1
  386. package/dashboard/dist/assets/index-CDWOfCmi.js +0 -2
  387. package/dashboard/dist/assets/index-Ce6sL__n.js +0 -2
  388. package/dashboard/dist/assets/index-Ce6sL__n.js.map +0 -1
  389. package/dashboard/dist/assets/index-DSzSoku1.js.map +0 -1
  390. package/dashboard/dist/assets/index-gCy9XX3W.css +0 -1
  391. package/dashboard/dist/assets/mcp-BzVpaaKF.js +0 -2
  392. package/dashboard/dist/assets/mcp-BzVpaaKF.js.map +0 -1
  393. package/dashboard/dist/assets/mcp-query-wTuxTTCV.js +0 -2
  394. package/dashboard/dist/assets/mcp-query-wTuxTTCV.js.map +0 -1
  395. package/dashboard/dist/assets/useNatsEvents-DeGKHFTX.js +0 -2
  396. package/dashboard/dist/assets/useNatsEvents-DeGKHFTX.js.map +0 -1
  397. package/dashboard/dist/assets/useYamlActivityEvents-B5dHec6Y.js.map +0 -1
  398. package/dashboard/dist/assets/vendor-icons-DCLlGYO9.js.map +0 -1
  399. package/dashboard/dist/assets/yaml-workflows-CaLPMQha.js +0 -2
  400. package/dashboard/dist/assets/yaml-workflows-CaLPMQha.js.map +0 -1
  401. package/docs/img/01-login.png +0 -0
  402. package/docs/img/02-dashboard-home.png +0 -0
  403. package/docs/img/03-processes-list.png +0 -0
  404. package/docs/img/04-escalations-list.png +0 -0
  405. package/docs/img/05-mcp-servers.png +0 -0
  406. package/docs/img/06-mcp-pipelines.png +0 -0
  407. package/docs/img/07-workflows-list.png +0 -0
  408. package/docs/img/compilation/01-query-submit.png +0 -0
  409. package/docs/img/compilation/02-mcp-servers.png +0 -0
  410. package/docs/img/compilation/03-query-completed.png +0 -0
  411. package/docs/img/compilation/04-wizard-original.png +0 -0
  412. package/docs/img/compilation/05-wizard-timeline.png +0 -0
  413. package/docs/img/compilation/06-wizard-profile.png +0 -0
  414. package/docs/img/compilation/07-wizard-deploy.png +0 -0
  415. package/docs/img/compilation/08-wizard-test-modal.png +0 -0
  416. package/docs/img/compilation/09-wizard-test-compare.png +0 -0
  417. package/docs/img/compilation/10-wizard-verify.png +0 -0
  418. package/lib/db/README.md +0 -8
  419. /package/{lib → build/lib}/db/schemas/002_seed.sql +0 -0
  420. /package/{lib → build/lib}/db/schemas/003_workflow_discovery.sql +0 -0
  421. /package/{lib → build/lib}/db/schemas/004_query_router.sql +0 -0
  422. /package/{lib → build/lib}/db/schemas/005_triage_router.sql +0 -0
  423. /package/{lib → build/lib}/db/schemas/006_oauth.sql +0 -0
  424. /package/{lib → build/lib}/db/schemas/007_security.sql +0 -0
  425. /package/{lib → build/lib}/db/schemas/008_bot_accounts.sql +0 -0
  426. /package/{lib → build/lib}/db/schemas/009_audit_trail.sql +0 -0
  427. /package/{lib → build/lib}/db/schemas/010_credential_providers.sql +0 -0
  428. /package/{lib → build/lib}/db/schemas/012_drop_modality.sql +0 -0
  429. /package/{lib → build/lib}/db/schemas/013_execute_as.sql +0 -0
  430. /package/{lib → build/lib}/db/schemas/014_ephemeral_credentials.sql +0 -0
  431. /package/{lib → build/lib}/db/schemas/015_knowledge.sql +0 -0
@@ -38,12 +38,9 @@ const fs = __importStar(require("fs"));
38
38
  const path = __importStar(require("path"));
39
39
  const index_1 = require("./index");
40
40
  const logger_1 = require("../logger");
41
- // In dev: __dirname = lib/db schemas is ./schemas
42
- // In built/published: __dirname = build/lib/db schemas is ../../../lib/db/schemas
43
- const devPath = path.join(__dirname, 'schemas');
44
- const SCHEMAS_DIR = fs.existsSync(devPath)
45
- ? devPath
46
- : path.join(__dirname, '..', '..', '..', 'services', 'db', 'schemas');
41
+ // Both dev (lib/db/) and build (build/lib/db/) have schemas/ as a sibling.
42
+ // In dev it exists naturally; in build it's copied by the build script.
43
+ const SCHEMAS_DIR = path.join(__dirname, 'schemas');
47
44
  async function migrate() {
48
45
  const pool = (0, index_1.getPool)();
49
46
  // ensure migration tracking table
@@ -258,6 +258,9 @@ CREATE TABLE IF NOT EXISTS lt_yaml_workflows (
258
258
  tags TEXT[] NOT NULL DEFAULT '{}',
259
259
  input_field_meta JSONB NOT NULL DEFAULT '[]'::JSONB,
260
260
  metadata JSONB,
261
+ cron_schedule TEXT,
262
+ cron_envelope JSONB,
263
+ execute_as TEXT,
261
264
  created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
262
265
  updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
263
266
  );
@@ -0,0 +1,29 @@
1
+ -- Workflow sets: groups of related workflows produced by plan mode.
2
+
3
+ CREATE TABLE IF NOT EXISTS lt_workflow_sets (
4
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
5
+ name TEXT UNIQUE NOT NULL,
6
+ description TEXT,
7
+ specification TEXT NOT NULL,
8
+ plan JSONB NOT NULL DEFAULT '[]'::JSONB,
9
+ namespaces TEXT[] NOT NULL DEFAULT '{}',
10
+ status TEXT NOT NULL DEFAULT 'planning'
11
+ CHECK (status IN ('planning','planned','building','deploying','completed','failed')),
12
+ source_workflow_id TEXT,
13
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
14
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
15
+ );
16
+
17
+ CREATE OR REPLACE TRIGGER trg_lt_workflow_sets_updated_at
18
+ BEFORE UPDATE ON lt_workflow_sets
19
+ FOR EACH ROW EXECUTE FUNCTION lt_set_updated_at();
20
+
21
+ -- Extend lt_yaml_workflows with set membership columns
22
+ ALTER TABLE lt_yaml_workflows ADD COLUMN IF NOT EXISTS set_id UUID
23
+ REFERENCES lt_workflow_sets(id) ON DELETE SET NULL;
24
+ ALTER TABLE lt_yaml_workflows ADD COLUMN IF NOT EXISTS set_role TEXT
25
+ CHECK (set_role IN ('leaf', 'composition', 'router'));
26
+ ALTER TABLE lt_yaml_workflows ADD COLUMN IF NOT EXISTS set_build_order INTEGER;
27
+
28
+ CREATE INDEX IF NOT EXISTS idx_lt_yaml_workflows_set_id
29
+ ON lt_yaml_workflows (set_id) WHERE set_id IS NOT NULL;
@@ -0,0 +1,7 @@
1
+ -- Enforce unique graph_topic per app_id for non-archived workflows.
2
+ -- Two active/deployed/draft workflows in the same namespace must not
3
+ -- share a subscribes topic — deploying them would cause routing collisions.
4
+
5
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_lt_yaml_workflows_app_topic_unique
6
+ ON lt_yaml_workflows (app_id, graph_topic)
7
+ WHERE status != 'archived';
@@ -10,6 +10,12 @@ VALUES
10
10
  '{}'),
11
11
  ('mcpTriage', 'long-tail-system', 'engineer', false,
12
12
  'Dynamic MCP triage — LLM agentic loop for escalation remediation',
13
+ '{}'),
14
+ ('mcpWorkflowBuilder', 'long-tail-system', 'engineer', false,
15
+ 'Direct pipeline builder — LLM constructs DAG from tool schemas',
16
+ '{}'),
17
+ ('mcpWorkflowPlanner', 'long-tail-system', 'engineer', false,
18
+ 'Plan mode — decomposes specifications into multi-workflow sets',
13
19
  '{}')
14
20
  ON CONFLICT (workflow_type) DO NOTHING;
15
21
 
@@ -21,3 +27,11 @@ ON CONFLICT (workflow_type, role) DO NOTHING;
21
27
  INSERT INTO lt_config_roles (workflow_type, role)
22
28
  SELECT 'mcpTriage', unnest(ARRAY['reviewer', 'engineer', 'admin'])
23
29
  ON CONFLICT (workflow_type, role) DO NOTHING;
30
+
31
+ INSERT INTO lt_config_roles (workflow_type, role)
32
+ SELECT 'mcpWorkflowBuilder', unnest(ARRAY['reviewer', 'engineer', 'admin'])
33
+ ON CONFLICT (workflow_type, role) DO NOTHING;
34
+
35
+ INSERT INTO lt_config_roles (workflow_type, role)
36
+ SELECT 'mcpWorkflowPlanner', unnest(ARRAY['reviewer', 'engineer', 'admin'])
37
+ ON CONFLICT (workflow_type, role) DO NOTHING;
@@ -0,0 +1,7 @@
1
+ -- Allow 'streamable-http' as a transport type for MCP servers
2
+ ALTER TABLE lt_mcp_servers
3
+ DROP CONSTRAINT IF EXISTS lt_mcp_servers_transport_type_check;
4
+
5
+ ALTER TABLE lt_mcp_servers
6
+ ADD CONSTRAINT lt_mcp_servers_transport_type_check
7
+ CHECK (transport_type IN ('stdio', 'sse', 'streamable-http'));
@@ -0,0 +1,41 @@
1
+ import type { LTEvent, LTEventAdapter, LTEventType } from '../../types';
2
+ type EventCallback = (event: LTEvent) => void;
3
+ /**
4
+ * In-process event adapter that delivers events via registered callbacks.
5
+ *
6
+ * Plugs into the existing `eventRegistry` alongside Socket.IO / NATS.
7
+ * SDK callers subscribe with `.on()` and receive events as direct
8
+ * function calls — no network transport, no serialization overhead.
9
+ *
10
+ * Supports:
11
+ * - Exact type matching: `on('task.created', cb)`
12
+ * - Category wildcards: `on('task.*', cb)` — matches all task.* events
13
+ * - Global wildcard: `on('*', cb)` — matches every event
14
+ *
15
+ * Usage:
16
+ * ```typescript
17
+ * import { CallbackEventAdapter } from '@hotmeshio/long-tail';
18
+ * import { eventRegistry } from '@hotmeshio/long-tail';
19
+ *
20
+ * const adapter = new CallbackEventAdapter();
21
+ * eventRegistry.register(adapter);
22
+ *
23
+ * const unsub = adapter.on('escalation.claimed', (event) => {
24
+ * console.log('claimed:', event.escalationId);
25
+ * });
26
+ *
27
+ * // Later: unsub() to remove the listener
28
+ * ```
29
+ */
30
+ export declare class CallbackEventAdapter implements LTEventAdapter {
31
+ private listeners;
32
+ /**
33
+ * Subscribe to events by type, pattern, or wildcard.
34
+ * Returns an unsubscribe function.
35
+ */
36
+ on(pattern: LTEventType | '*' | (string & {}), callback: EventCallback): () => void;
37
+ connect(): Promise<void>;
38
+ publish(event: LTEvent): Promise<void>;
39
+ disconnect(): Promise<void>;
40
+ }
41
+ export {};
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CallbackEventAdapter = void 0;
4
+ const logger_1 = require("../logger");
5
+ /**
6
+ * In-process event adapter that delivers events via registered callbacks.
7
+ *
8
+ * Plugs into the existing `eventRegistry` alongside Socket.IO / NATS.
9
+ * SDK callers subscribe with `.on()` and receive events as direct
10
+ * function calls — no network transport, no serialization overhead.
11
+ *
12
+ * Supports:
13
+ * - Exact type matching: `on('task.created', cb)`
14
+ * - Category wildcards: `on('task.*', cb)` — matches all task.* events
15
+ * - Global wildcard: `on('*', cb)` — matches every event
16
+ *
17
+ * Usage:
18
+ * ```typescript
19
+ * import { CallbackEventAdapter } from '@hotmeshio/long-tail';
20
+ * import { eventRegistry } from '@hotmeshio/long-tail';
21
+ *
22
+ * const adapter = new CallbackEventAdapter();
23
+ * eventRegistry.register(adapter);
24
+ *
25
+ * const unsub = adapter.on('escalation.claimed', (event) => {
26
+ * console.log('claimed:', event.escalationId);
27
+ * });
28
+ *
29
+ * // Later: unsub() to remove the listener
30
+ * ```
31
+ */
32
+ class CallbackEventAdapter {
33
+ constructor() {
34
+ this.listeners = new Map();
35
+ }
36
+ /**
37
+ * Subscribe to events by type, pattern, or wildcard.
38
+ * Returns an unsubscribe function.
39
+ */
40
+ on(pattern, callback) {
41
+ let set = this.listeners.get(pattern);
42
+ if (!set) {
43
+ set = new Set();
44
+ this.listeners.set(pattern, set);
45
+ }
46
+ set.add(callback);
47
+ return () => {
48
+ set.delete(callback);
49
+ if (set.size === 0) {
50
+ this.listeners.delete(pattern);
51
+ }
52
+ };
53
+ }
54
+ async connect() {
55
+ logger_1.loggerRegistry.info('[lt-events:callback] adapter connected');
56
+ }
57
+ async publish(event) {
58
+ // Exact match listeners
59
+ const exact = this.listeners.get(event.type);
60
+ if (exact) {
61
+ for (const cb of exact) {
62
+ try {
63
+ cb(event);
64
+ }
65
+ catch { /* fire-and-forget */ }
66
+ }
67
+ }
68
+ // Category wildcard listeners (e.g. 'task.*' matches 'task.created')
69
+ const dotIdx = event.type.indexOf('.');
70
+ if (dotIdx > 0) {
71
+ const category = event.type.slice(0, dotIdx) + '.*';
72
+ const catListeners = this.listeners.get(category);
73
+ if (catListeners) {
74
+ for (const cb of catListeners) {
75
+ try {
76
+ cb(event);
77
+ }
78
+ catch { /* fire-and-forget */ }
79
+ }
80
+ }
81
+ }
82
+ // Global wildcard listeners
83
+ const global = this.listeners.get('*');
84
+ if (global) {
85
+ for (const cb of global) {
86
+ try {
87
+ cb(event);
88
+ }
89
+ catch { /* fire-and-forget */ }
90
+ }
91
+ }
92
+ }
93
+ async disconnect() {
94
+ this.listeners.clear();
95
+ logger_1.loggerRegistry.info('[lt-events:callback] adapter disconnected');
96
+ }
97
+ }
98
+ exports.CallbackEventAdapter = CallbackEventAdapter;
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.postgres_options = exports.config = void 0;
4
4
  exports.config = {
5
5
  POSTGRES_HOST: process.env.POSTGRES_HOST || 'localhost',
6
- POSTGRES_PORT: parseInt(process.env.POSTGRES_PORT || '5432', 10),
6
+ POSTGRES_PORT: parseInt(process.env.POSTGRES_PORT || '5415', 10),
7
7
  POSTGRES_USER: process.env.POSTGRES_USER || 'postgres',
8
8
  POSTGRES_PASSWORD: process.env.POSTGRES_PASSWORD || 'password',
9
9
  // In test environments, always use the test database to prevent accidental
@@ -1,8 +1,40 @@
1
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
+ })();
2
35
  Object.defineProperty(exports, "__esModule", { value: true });
3
36
  const express_1 = require("express");
4
- const user_1 = require("../services/user");
5
- const auth_1 = require("../modules/auth");
37
+ const api = __importStar(require("../api/auth"));
6
38
  const router = (0, express_1.Router)();
7
39
  /**
8
40
  * POST /api/auth/login
@@ -10,39 +42,8 @@ const router = (0, express_1.Router)();
10
42
  * Returns a JWT token on success.
11
43
  */
12
44
  router.post('/login', async (req, res) => {
13
- try {
14
- const { username, password } = req.body || {};
15
- if (!username || !password) {
16
- res.status(400).json({ error: 'username and password are required' });
17
- return;
18
- }
19
- const user = await (0, user_1.verifyPassword)(username, password);
20
- if (!user) {
21
- res.status(401).json({ error: 'Invalid credentials' });
22
- return;
23
- }
24
- const highestType = user.roles.some((r) => r.type === 'superadmin')
25
- ? 'superadmin'
26
- : user.roles.some((r) => r.type === 'admin')
27
- ? 'admin'
28
- : 'member';
29
- const token = (0, auth_1.signToken)({
30
- userId: user.id,
31
- role: highestType,
32
- roles: user.roles.map((r) => ({ role: r.role, type: r.type })),
33
- }, '24h');
34
- res.json({
35
- token,
36
- user: {
37
- id: user.id,
38
- external_id: user.external_id,
39
- display_name: user.display_name,
40
- roles: user.roles,
41
- },
42
- });
43
- }
44
- catch (err) {
45
- res.status(500).json({ error: err.message });
46
- }
45
+ const { username, password } = req.body || {};
46
+ const result = await api.login({ username, password });
47
+ res.status(result.status).json(result.data ?? { error: result.error });
47
48
  });
48
49
  exports.default = router;
@@ -35,8 +35,7 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  const express_1 = require("express");
37
37
  const auth_1 = require("../modules/auth");
38
- const iam = __importStar(require("../services/iam"));
39
- const user_1 = require("../services/user");
38
+ const api = __importStar(require("../api/bot-accounts"));
40
39
  const router = (0, express_1.Router)();
41
40
  // All bot account routes require admin access
42
41
  router.use(auth_1.requireAdmin);
@@ -47,32 +46,19 @@ router.use(auth_1.requireAdmin);
47
46
  * Query: ?limit=50&offset=0
48
47
  */
49
48
  router.get('/', async (req, res) => {
50
- try {
51
- const limit = req.query.limit ? parseInt(req.query.limit, 10) : 50;
52
- const offset = req.query.offset ? parseInt(req.query.offset, 10) : 0;
53
- const result = await iam.listBots(limit, offset);
54
- res.json(result);
55
- }
56
- catch (err) {
57
- res.status(500).json({ error: err.message });
58
- }
49
+ const result = await api.listBots({
50
+ limit: req.query.limit ? parseInt(req.query.limit, 10) : undefined,
51
+ offset: req.query.offset ? parseInt(req.query.offset, 10) : undefined,
52
+ });
53
+ res.status(result.status).json(result.data ?? { error: result.error });
59
54
  });
60
55
  /**
61
56
  * GET /api/bot-accounts/:id
62
57
  * Get a single bot account.
63
58
  */
64
59
  router.get('/:id', async (req, res) => {
65
- try {
66
- const bot = await iam.getBot(req.params.id);
67
- if (!bot) {
68
- res.status(404).json({ error: 'Bot not found' });
69
- return;
70
- }
71
- res.json(bot);
72
- }
73
- catch (err) {
74
- res.status(500).json({ error: err.message });
75
- }
60
+ const result = await api.getBot({ id: req.params.id });
61
+ res.status(result.status).json(result.data ?? { error: result.error });
76
62
  });
77
63
  /**
78
64
  * POST /api/bot-accounts
@@ -80,38 +66,9 @@ router.get('/:id', async (req, res) => {
80
66
  * Body: { name, description?, display_name?, roles?: [{ role, type }] }
81
67
  */
82
68
  router.post('/', async (req, res) => {
83
- try {
84
- const { name, description, display_name, roles } = req.body || {};
85
- if (!name) {
86
- res.status(400).json({ error: 'name is required' });
87
- return;
88
- }
89
- if (roles) {
90
- for (const r of roles) {
91
- if (!r.role || !r.type || !(0, user_1.isValidRoleType)(r.type)) {
92
- res.status(400).json({
93
- error: 'Each role must have a role name and type (superadmin, admin, member)',
94
- });
95
- return;
96
- }
97
- }
98
- }
99
- const bot = await iam.createBot({
100
- name,
101
- description,
102
- display_name,
103
- roles,
104
- created_by: req.auth?.userId,
105
- });
106
- res.status(201).json(bot);
107
- }
108
- catch (err) {
109
- if (err.code === '23505') {
110
- res.status(409).json({ error: 'Bot with this name already exists' });
111
- return;
112
- }
113
- res.status(500).json({ error: err.message });
114
- }
69
+ const { name, description, display_name, roles } = req.body || {};
70
+ const result = await api.createBot({ name, description, display_name, roles }, req.auth ? { userId: req.auth.userId } : undefined);
71
+ res.status(result.status).json(result.data ?? { error: result.error });
115
72
  });
116
73
  /**
117
74
  * PUT /api/bot-accounts/:id
@@ -119,34 +76,16 @@ router.post('/', async (req, res) => {
119
76
  * Body: { display_name?, description?, status? }
120
77
  */
121
78
  router.put('/:id', async (req, res) => {
122
- try {
123
- const bot = await iam.updateBot(req.params.id, req.body || {});
124
- if (!bot) {
125
- res.status(404).json({ error: 'Bot not found' });
126
- return;
127
- }
128
- res.json(bot);
129
- }
130
- catch (err) {
131
- res.status(500).json({ error: err.message });
132
- }
79
+ const result = await api.updateBot({ id: req.params.id, ...(req.body || {}) });
80
+ res.status(result.status).json(result.data ?? { error: result.error });
133
81
  });
134
82
  /**
135
83
  * DELETE /api/bot-accounts/:id
136
84
  * Delete a bot account.
137
85
  */
138
86
  router.delete('/:id', async (req, res) => {
139
- try {
140
- const deleted = await iam.deleteBot(req.params.id);
141
- if (!deleted) {
142
- res.status(404).json({ error: 'Bot not found' });
143
- return;
144
- }
145
- res.json({ deleted: true });
146
- }
147
- catch (err) {
148
- res.status(500).json({ error: err.message });
149
- }
87
+ const result = await api.deleteBot({ id: req.params.id });
88
+ res.status(result.status).json(result.data ?? { error: result.error });
150
89
  });
151
90
  // ── Bot roles ────────────────────────────────────────────────────────────────
152
91
  /**
@@ -154,18 +93,8 @@ router.delete('/:id', async (req, res) => {
154
93
  * List roles for a bot.
155
94
  */
156
95
  router.get('/:id/roles', async (req, res) => {
157
- try {
158
- const bot = await iam.getBot(req.params.id);
159
- if (!bot) {
160
- res.status(404).json({ error: 'Bot not found' });
161
- return;
162
- }
163
- const roles = await iam.getBotRoles(req.params.id);
164
- res.json({ roles });
165
- }
166
- catch (err) {
167
- res.status(500).json({ error: err.message });
168
- }
96
+ const result = await api.getBotRoles({ id: req.params.id });
97
+ res.status(result.status).json(result.data ?? { error: result.error });
169
98
  });
170
99
  /**
171
100
  * POST /api/bot-accounts/:id/roles
@@ -173,44 +102,17 @@ router.get('/:id/roles', async (req, res) => {
173
102
  * Body: { role, type }
174
103
  */
175
104
  router.post('/:id/roles', async (req, res) => {
176
- try {
177
- const { role, type } = req.body || {};
178
- if (!role || !type) {
179
- res.status(400).json({ error: 'role and type are required' });
180
- return;
181
- }
182
- if (!(0, user_1.isValidRoleType)(type)) {
183
- res.status(400).json({ error: 'type must be superadmin, admin, or member' });
184
- return;
185
- }
186
- const bot = await iam.getBot(req.params.id);
187
- if (!bot) {
188
- res.status(404).json({ error: 'Bot not found' });
189
- return;
190
- }
191
- const result = await iam.addBotRole(req.params.id, role, type);
192
- res.status(201).json(result);
193
- }
194
- catch (err) {
195
- res.status(500).json({ error: err.message });
196
- }
105
+ const { role, type } = req.body || {};
106
+ const result = await api.addBotRole({ id: req.params.id, role, type });
107
+ res.status(result.status).json(result.data ?? { error: result.error });
197
108
  });
198
109
  /**
199
110
  * DELETE /api/bot-accounts/:id/roles/:role
200
111
  * Remove a role from a bot.
201
112
  */
202
113
  router.delete('/:id/roles/:role', async (req, res) => {
203
- try {
204
- const removed = await iam.removeBotRole(req.params.id, req.params.role);
205
- if (!removed) {
206
- res.status(404).json({ error: 'Role not found' });
207
- return;
208
- }
209
- res.json({ removed: true });
210
- }
211
- catch (err) {
212
- res.status(500).json({ error: err.message });
213
- }
114
+ const result = await api.removeBotRole({ id: req.params.id, role: req.params.role });
115
+ res.status(result.status).json(result.data ?? { error: result.error });
214
116
  });
215
117
  // ── API keys ─────────────────────────────────────────────────────────────────
216
118
  /**
@@ -218,18 +120,8 @@ router.delete('/:id/roles/:role', async (req, res) => {
218
120
  * List API keys for a bot (without secret values).
219
121
  */
220
122
  router.get('/:id/api-keys', async (req, res) => {
221
- try {
222
- const bot = await iam.getBot(req.params.id);
223
- if (!bot) {
224
- res.status(404).json({ error: 'Bot not found' });
225
- return;
226
- }
227
- const keys = await iam.listBotKeys(req.params.id);
228
- res.json({ keys });
229
- }
230
- catch (err) {
231
- res.status(500).json({ error: err.message });
232
- }
123
+ const result = await api.listBotKeys({ id: req.params.id });
124
+ res.status(result.status).json(result.data ?? { error: result.error });
233
125
  });
234
126
  /**
235
127
  * POST /api/bot-accounts/:id/api-keys
@@ -238,43 +130,21 @@ router.get('/:id/api-keys', async (req, res) => {
238
130
  * Returns the raw key ONCE — it cannot be retrieved again.
239
131
  */
240
132
  router.post('/:id/api-keys', async (req, res) => {
241
- try {
242
- const { name, scopes, expires_at } = req.body || {};
243
- if (!name) {
244
- res.status(400).json({ error: 'name is required' });
245
- return;
246
- }
247
- const expiresAt = expires_at ? new Date(expires_at) : undefined;
248
- const result = await iam.createBotKey(req.params.id, name, scopes || [], expiresAt);
249
- res.status(201).json(result);
250
- }
251
- catch (err) {
252
- if (err.message === 'Bot not found') {
253
- res.status(404).json({ error: err.message });
254
- return;
255
- }
256
- if (err.code === '23505') {
257
- res.status(409).json({ error: 'API key with this name already exists for this bot' });
258
- return;
259
- }
260
- res.status(500).json({ error: err.message });
261
- }
133
+ const { name, scopes, expires_at } = req.body || {};
134
+ const result = await api.createBotKey({
135
+ id: req.params.id,
136
+ name,
137
+ scopes,
138
+ expires_at,
139
+ });
140
+ res.status(result.status).json(result.data ?? { error: result.error });
262
141
  });
263
142
  /**
264
143
  * DELETE /api/bot-accounts/:id/api-keys/:keyId
265
144
  * Revoke (delete) a bot API key.
266
145
  */
267
146
  router.delete('/:id/api-keys/:keyId', async (req, res) => {
268
- try {
269
- const revoked = await iam.revokeBotKey(req.params.keyId);
270
- if (!revoked) {
271
- res.status(404).json({ error: 'API key not found' });
272
- return;
273
- }
274
- res.json({ revoked: true });
275
- }
276
- catch (err) {
277
- res.status(500).json({ error: err.message });
278
- }
147
+ const result = await api.revokeBotKey({ keyId: req.params.keyId });
148
+ res.status(result.status).json(result.data ?? { error: result.error });
279
149
  });
280
150
  exports.default = router;