@hotmeshio/long-tail 0.1.15 → 0.1.17

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 (368) hide show
  1. package/build/api/escalations/resolve.js +1 -0
  2. package/build/api/files.d.ts +4 -0
  3. package/build/api/files.js +14 -0
  4. package/build/api/settings.js +0 -3
  5. package/build/api/workflows/config.js +5 -0
  6. package/build/api/yaml-workflows/crud.js +25 -5
  7. package/build/index.d.ts +1 -2
  8. package/build/index.js +1 -4
  9. package/build/lib/db/schemas/002_seed.sql +3 -81
  10. package/build/lib/events/socketio.d.ts +12 -0
  11. package/build/lib/events/socketio.js +24 -1
  12. package/build/lib/storage/mime.js +20 -0
  13. package/build/routes/file-browser.js +30 -0
  14. package/build/routes/files.js +20 -18
  15. package/build/routes/index.js +2 -0
  16. package/build/routes/nats-credentials.d.ts +2 -0
  17. package/build/routes/nats-credentials.js +22 -0
  18. package/build/services/config/sql.d.ts +3 -0
  19. package/build/services/config/sql.js +15 -1
  20. package/build/services/config/write.d.ts +6 -0
  21. package/build/services/config/write.js +64 -0
  22. package/build/services/cron/index.d.ts +5 -0
  23. package/build/services/cron/index.js +30 -0
  24. package/build/services/insight/index.js +3 -0
  25. package/build/services/interceptor/activities/task.d.ts +1 -0
  26. package/build/services/interceptor/activities/task.js +2 -1
  27. package/build/services/interceptor/activities/workflow.js +1 -0
  28. package/build/services/interceptor/index.js +4 -4
  29. package/build/services/interceptor/lifecycle.js +1 -1
  30. package/build/services/mcp/db.d.ts +17 -0
  31. package/build/services/mcp/db.js +50 -0
  32. package/build/services/mcp/sql.d.ts +4 -1
  33. package/build/services/mcp/sql.js +9 -2
  34. package/build/services/oauth/index.js +4 -1
  35. package/build/services/oauth/providers/google.js +7 -2
  36. package/build/services/orchestrator/index.js +5 -0
  37. package/build/services/task/crud.js +1 -0
  38. package/build/services/task/sql.d.ts +1 -1
  39. package/build/services/task/sql.js +2 -2
  40. package/build/services/task/types.d.ts +2 -0
  41. package/build/services/workers/registry.js +3 -1
  42. package/build/services/workflow-invocation.js +8 -1
  43. package/build/services/yaml-workflow/workers/register.js +4 -2
  44. package/build/start/adapters.js +4 -1
  45. package/build/start/socket-auth.d.ts +13 -0
  46. package/build/start/socket-auth.js +32 -0
  47. package/build/start/workers.d.ts +2 -1
  48. package/build/start/workers.js +66 -6
  49. package/build/system/index.d.ts +12 -10
  50. package/build/system/index.js +240 -67
  51. package/build/system/mcp-servers/playwright/schemas.d.ts +12 -12
  52. package/build/system/seed/index.d.ts +0 -7
  53. package/build/system/seed/index.js +5 -46
  54. package/build/tsconfig.tsbuildinfo +1 -1
  55. package/build/types/index.d.ts +1 -1
  56. package/build/types/startup.d.ts +59 -2
  57. package/dashboard/dist/assets/AdminDashboard-CsTOErp1.js +2 -0
  58. package/dashboard/dist/assets/{AdminDashboard-NLryl1_B.js.map → AdminDashboard-CsTOErp1.js.map} +1 -1
  59. package/dashboard/dist/assets/AvailableEscalationsPage-BqQA3IJp.js +2 -0
  60. package/dashboard/dist/assets/{AvailableEscalationsPage-6vexlrk3.js.map → AvailableEscalationsPage-BqQA3IJp.js.map} +1 -1
  61. package/dashboard/dist/assets/BotPicker-C2xR1xay.js +2 -0
  62. package/dashboard/dist/assets/{BotPicker-DWhn0tr1.js.map → BotPicker-C2xR1xay.js.map} +1 -1
  63. package/dashboard/dist/assets/CollapsibleSection-CRtHQsAv.js +2 -0
  64. package/dashboard/dist/assets/{CollapsibleSection-CgYgQiOc.js.map → CollapsibleSection-CRtHQsAv.js.map} +1 -1
  65. package/dashboard/dist/assets/ConfirmDeleteModal-dOxidrSR.js +2 -0
  66. package/dashboard/dist/assets/{ConfirmDeleteModal-DCKAPXD3.js.map → ConfirmDeleteModal-dOxidrSR.js.map} +1 -1
  67. package/dashboard/dist/assets/CopyableId-DmLF-RqZ.js +2 -0
  68. package/dashboard/dist/assets/{CopyableId-DXkaAOYk.js.map → CopyableId-DmLF-RqZ.js.map} +1 -1
  69. package/dashboard/dist/assets/CredentialsPage-C7XT1bnO.js +2 -0
  70. package/dashboard/dist/assets/CredentialsPage-C7XT1bnO.js.map +1 -0
  71. package/dashboard/dist/assets/CustomDurationPicker-BABUv1V2.js +2 -0
  72. package/dashboard/dist/assets/{CustomDurationPicker-D2G1ldiF.js.map → CustomDurationPicker-BABUv1V2.js.map} +1 -1
  73. package/dashboard/dist/assets/DataTable-D3-wSEf0.js +2 -0
  74. package/dashboard/dist/assets/{DataTable-DXSUbA26.js.map → DataTable-D3-wSEf0.js.map} +1 -1
  75. package/dashboard/dist/assets/DropZone-DHKmMqRA.js +2 -0
  76. package/dashboard/dist/assets/DropZone-DHKmMqRA.js.map +1 -0
  77. package/dashboard/dist/assets/ElapsedCell-DrJif03B.js +2 -0
  78. package/dashboard/dist/assets/{ElapsedCell-CQGqkXP_.js.map → ElapsedCell-DrJif03B.js.map} +1 -1
  79. package/dashboard/dist/assets/EmptyState-BcsfPq9T.js +2 -0
  80. package/dashboard/dist/assets/EmptyState-BcsfPq9T.js.map +1 -0
  81. package/dashboard/dist/assets/EscalationsOverview-H6CwfeR-.js +2 -0
  82. package/dashboard/dist/assets/EscalationsOverview-H6CwfeR-.js.map +1 -0
  83. package/dashboard/dist/assets/EventTable-Dh3_9DAY.js +2 -0
  84. package/dashboard/dist/assets/{EventTable-BMJAPkMi.js.map → EventTable-Dh3_9DAY.js.map} +1 -1
  85. package/dashboard/dist/assets/FilterBar-Ck4K4rzu.js +2 -0
  86. package/dashboard/dist/assets/{FilterBar-DbVbCzH2.js.map → FilterBar-Ck4K4rzu.js.map} +1 -1
  87. package/dashboard/dist/assets/ListToolbar-CyEkulVR.js +2 -0
  88. package/dashboard/dist/assets/{ListToolbar-0XNuXj0M.js.map → ListToolbar-CyEkulVR.js.map} +1 -1
  89. package/dashboard/dist/assets/McpOverview-ChLa6Gl7.js +2 -0
  90. package/dashboard/dist/assets/{McpOverview-CeYnCzBN.js.map → McpOverview-ChLa6Gl7.js.map} +1 -1
  91. package/dashboard/dist/assets/McpQueryDetailPage-5Dsj6PlL.js +5 -0
  92. package/dashboard/dist/assets/McpQueryDetailPage-5Dsj6PlL.js.map +1 -0
  93. package/dashboard/dist/assets/McpQueryPage-D2DmDFPu.js +2 -0
  94. package/dashboard/dist/assets/McpQueryPage-D2DmDFPu.js.map +1 -0
  95. package/dashboard/dist/assets/McpRunDetailPage-ERVuNEEK.js +2 -0
  96. package/dashboard/dist/assets/{McpRunDetailPage-CZtodW_Z.js.map → McpRunDetailPage-ERVuNEEK.js.map} +1 -1
  97. package/dashboard/dist/assets/McpRunsPage-BKba-3Wl.js +2 -0
  98. package/dashboard/dist/assets/McpRunsPage-BKba-3Wl.js.map +1 -0
  99. package/dashboard/dist/assets/Modal-DEODGeqx.js +2 -0
  100. package/dashboard/dist/assets/{Modal-yyhUeKoA.js.map → Modal-DEODGeqx.js.map} +1 -1
  101. package/dashboard/dist/assets/OperatorDashboard-CJm_BTPU.js +2 -0
  102. package/dashboard/dist/assets/{OperatorDashboard-Ceh7OQtZ.js.map → OperatorDashboard-CJm_BTPU.js.map} +1 -1
  103. package/dashboard/dist/assets/PageHeader-B-SN5GZ2.js +2 -0
  104. package/dashboard/dist/assets/PageHeader-B-SN5GZ2.js.map +1 -0
  105. package/dashboard/dist/assets/PageHeaderWithStats-BZ3AGT5s.js +2 -0
  106. package/dashboard/dist/assets/PageHeaderWithStats-BZ3AGT5s.js.map +1 -0
  107. package/dashboard/dist/assets/PriorityBadge-DfQY9St9.js +2 -0
  108. package/dashboard/dist/assets/{PriorityBadge-BrPikMFy.js.map → PriorityBadge-DfQY9St9.js.map} +1 -1
  109. package/dashboard/dist/assets/ProcessDetailPage-vfnCDyQK.js +2 -0
  110. package/dashboard/dist/assets/{ProcessDetailPage-2miaYd8G.js.map → ProcessDetailPage-vfnCDyQK.js.map} +1 -1
  111. package/dashboard/dist/assets/ProcessesListPage-DcAN6AJK.js +2 -0
  112. package/dashboard/dist/assets/ProcessesListPage-DcAN6AJK.js.map +1 -0
  113. package/dashboard/dist/assets/RolePill-BhVC0cc3.js +2 -0
  114. package/dashboard/dist/assets/{RolePill-DxbJMfJu.js.map → RolePill-BhVC0cc3.js.map} +1 -1
  115. package/dashboard/dist/assets/RolesPage-DYSt2aAr.js +2 -0
  116. package/dashboard/dist/assets/RolesPage-DYSt2aAr.js.map +1 -0
  117. package/dashboard/dist/assets/RowActions-Dg-Fsm5O.js +2 -0
  118. package/dashboard/dist/assets/{RowActions-DurFwIwe.js.map → RowActions-Dg-Fsm5O.js.map} +1 -1
  119. package/dashboard/dist/assets/RunAsSelector-CD7_Dmb0.js +2 -0
  120. package/dashboard/dist/assets/{RunAsSelector-CNKraP6u.js.map → RunAsSelector-CD7_Dmb0.js.map} +1 -1
  121. package/dashboard/dist/assets/StatCard-DlgF0CJC.js +2 -0
  122. package/dashboard/dist/assets/{StatCard-CKplpK3w.js.map → StatCard-DlgF0CJC.js.map} +1 -1
  123. package/dashboard/dist/assets/StatusBadge-XQlNFwmH.js +2 -0
  124. package/dashboard/dist/assets/StatusBadge-XQlNFwmH.js.map +1 -0
  125. package/dashboard/dist/assets/StepIndicator-CuUIGxKk.js +2 -0
  126. package/dashboard/dist/assets/{StepIndicator-Dicx0WTZ.js.map → StepIndicator-CuUIGxKk.js.map} +1 -1
  127. package/dashboard/dist/assets/StickyPagination-F9FZsRy9.js +2 -0
  128. package/dashboard/dist/assets/{StickyPagination-B2jYvU3-.js.map → StickyPagination-F9FZsRy9.js.map} +1 -1
  129. package/dashboard/dist/assets/SwimlaneTimeline-CUl5RdXU.js +2 -0
  130. package/dashboard/dist/assets/SwimlaneTimeline-CUl5RdXU.js.map +1 -0
  131. package/dashboard/dist/assets/TagInput-DftaRHDV.js +2 -0
  132. package/dashboard/dist/assets/{TagInput-CypDZ6Kl.js.map → TagInput-DftaRHDV.js.map} +1 -1
  133. package/dashboard/dist/assets/TaskDetailPage-BoA-cfwW.js +2 -0
  134. package/dashboard/dist/assets/TaskDetailPage-BoA-cfwW.js.map +1 -0
  135. package/dashboard/dist/assets/TaskQueuePill-Ce8KlXtR.js +2 -0
  136. package/dashboard/dist/assets/TaskQueuePill-Ce8KlXtR.js.map +1 -0
  137. package/dashboard/dist/assets/TasksListPage-g6XIbhju.js +2 -0
  138. package/dashboard/dist/assets/{TasksListPage-D7CdkAeg.js.map → TasksListPage-g6XIbhju.js.map} +1 -1
  139. package/dashboard/dist/assets/TimeAgo-BihIwEbB.js +2 -0
  140. package/dashboard/dist/assets/{TimeAgo-B5LXB2aj.js.map → TimeAgo-BihIwEbB.js.map} +1 -1
  141. package/dashboard/dist/assets/TimestampCell-GOFcvE-i.js +2 -0
  142. package/dashboard/dist/assets/{TimestampCell-Crb9b0Gw.js.map → TimestampCell-GOFcvE-i.js.map} +1 -1
  143. package/dashboard/dist/assets/UserName-CmMVt4vS.js +2 -0
  144. package/dashboard/dist/assets/{UserName-OPg-nkRa.js.map → UserName-CmMVt4vS.js.map} +1 -1
  145. package/dashboard/dist/assets/WorkflowExecutionPage-soRFz_30.js +2 -0
  146. package/dashboard/dist/assets/{WorkflowExecutionPage-CcLVrs9b.js.map → WorkflowExecutionPage-soRFz_30.js.map} +1 -1
  147. package/dashboard/dist/assets/WorkflowPill-DUDDyBsj.js +2 -0
  148. package/dashboard/dist/assets/{WorkflowPill-CCV4MMj7.js.map → WorkflowPill-DUDDyBsj.js.map} +1 -1
  149. package/dashboard/dist/assets/WorkflowsDashboard-Be1A1zAT.js +2 -0
  150. package/dashboard/dist/assets/WorkflowsDashboard-Be1A1zAT.js.map +1 -0
  151. package/dashboard/dist/assets/WorkflowsOverview-z3Ztiz1y.js +2 -0
  152. package/dashboard/dist/assets/{WorkflowsOverview-DvShiYJV.js.map → WorkflowsOverview-z3Ztiz1y.js.map} +1 -1
  153. package/dashboard/dist/assets/YamlWorkflowsPage-C6qzcQcJ.js +2 -0
  154. package/dashboard/dist/assets/YamlWorkflowsPage-C6qzcQcJ.js.map +1 -0
  155. package/dashboard/dist/assets/{bots-Dqos20NE.js → bots-BZPXDh_y.js} +2 -2
  156. package/dashboard/dist/assets/{bots-Dqos20NE.js.map → bots-BZPXDh_y.js.map} +1 -1
  157. package/dashboard/dist/assets/escalation-DBUIq1Z4.js +2 -0
  158. package/dashboard/dist/assets/{escalation-A0CsbvNV.js.map → escalation-DBUIq1Z4.js.map} +1 -1
  159. package/dashboard/dist/assets/escalation-columns-DL4zsR8Y.js +2 -0
  160. package/dashboard/dist/assets/{escalation-columns-BpBJN6k4.js.map → escalation-columns-DL4zsR8Y.js.map} +1 -1
  161. package/dashboard/dist/assets/helpers-D50KFFkI.js +2 -0
  162. package/dashboard/dist/assets/{helpers-CmznCuAx.js.map → helpers-D50KFFkI.js.map} +1 -1
  163. package/dashboard/dist/assets/index-B-ioA6yv.js +2 -0
  164. package/dashboard/dist/assets/index-B-ioA6yv.js.map +1 -0
  165. package/dashboard/dist/assets/index-B-jzKfuv.js +2 -0
  166. package/dashboard/dist/assets/index-B-jzKfuv.js.map +1 -0
  167. package/dashboard/dist/assets/index-BMpoMc4A.js +2 -0
  168. package/dashboard/dist/assets/{index-Cr0Rqsj7.js.map → index-BMpoMc4A.js.map} +1 -1
  169. package/dashboard/dist/assets/index-BU04qgJt.js +15 -0
  170. package/dashboard/dist/assets/index-BU04qgJt.js.map +1 -0
  171. package/dashboard/dist/assets/index-BUjxYyxc.js +63 -0
  172. package/dashboard/dist/assets/index-BUjxYyxc.js.map +1 -0
  173. package/dashboard/dist/assets/index-BpoHVMV7.js +2 -0
  174. package/dashboard/dist/assets/index-BpoHVMV7.js.map +1 -0
  175. package/dashboard/dist/assets/index-CEnDYJOO.js +2 -0
  176. package/dashboard/dist/assets/index-CEnDYJOO.js.map +1 -0
  177. package/dashboard/dist/assets/index-CbuH92vk.js +6 -0
  178. package/dashboard/dist/assets/index-CbuH92vk.js.map +1 -0
  179. package/dashboard/dist/assets/index-D9_hZmsW.js +5 -0
  180. package/dashboard/dist/assets/{index-BYwD3kHN.js.map → index-D9_hZmsW.js.map} +1 -1
  181. package/dashboard/dist/assets/index-DrouIN-M.js +2 -0
  182. package/dashboard/dist/assets/{index-VnYkWW8r.js.map → index-DrouIN-M.js.map} +1 -1
  183. package/dashboard/dist/assets/index-DzICLMI7.js +2 -0
  184. package/dashboard/dist/assets/{index-XGOmZ117.js.map → index-DzICLMI7.js.map} +1 -1
  185. package/dashboard/dist/assets/index-efS5gKpv.css +1 -0
  186. package/dashboard/dist/assets/index-qT78AZDq.js +2 -0
  187. package/dashboard/dist/assets/index-qT78AZDq.js.map +1 -0
  188. package/dashboard/dist/assets/mcp-D0GrHRFe.js +2 -0
  189. package/dashboard/dist/assets/{mcp-DrWymhSu.js.map → mcp-D0GrHRFe.js.map} +1 -1
  190. package/dashboard/dist/assets/{mcp-query-BhUxVEMS.js → mcp-query-DC5woQn5.js} +2 -2
  191. package/dashboard/dist/assets/{mcp-query-BhUxVEMS.js.map → mcp-query-DC5woQn5.js.map} +1 -1
  192. package/dashboard/dist/assets/{mcp-runs-DUfz4mLd.js → mcp-runs-CsoVQoPB.js} +2 -2
  193. package/dashboard/dist/assets/{mcp-runs-DUfz4mLd.js.map → mcp-runs-CsoVQoPB.js.map} +1 -1
  194. package/dashboard/dist/assets/namespaces-unpIb4gX.js +2 -0
  195. package/dashboard/dist/assets/{namespaces-Cm6AY5sh.js.map → namespaces-unpIb4gX.js.map} +1 -1
  196. package/dashboard/dist/assets/{roles-2v1Kc7BJ.js → roles--kBaFljg.js} +2 -2
  197. package/dashboard/dist/assets/{roles-2v1Kc7BJ.js.map → roles--kBaFljg.js.map} +1 -1
  198. package/dashboard/dist/assets/settings-B96YkawY.js +2 -0
  199. package/dashboard/dist/assets/{settings-DTQNp6tH.js.map → settings-B96YkawY.js.map} +1 -1
  200. package/dashboard/dist/assets/{tasks-CS1rgG1s.js → tasks-D_1NCfOZ.js} +2 -2
  201. package/dashboard/dist/assets/{tasks-CS1rgG1s.js.map → tasks-D_1NCfOZ.js.map} +1 -1
  202. package/dashboard/dist/assets/{useEventHooks-BjXX8x3a.js → useEventHooks-BPjEkCpD.js} +2 -2
  203. package/dashboard/dist/assets/{useEventHooks-BjXX8x3a.js.map → useEventHooks-BPjEkCpD.js.map} +1 -1
  204. package/dashboard/dist/assets/{useExpandedRows-Cg9iq6Vy.js → useExpandedRows-CkcEntB-.js} +2 -2
  205. package/dashboard/dist/assets/{useExpandedRows-Cg9iq6Vy.js.map → useExpandedRows-CkcEntB-.js.map} +1 -1
  206. package/dashboard/dist/assets/{useFilterParams-CGRYFw_A.js → useFilterParams-DZCAaBC7.js} +2 -2
  207. package/dashboard/dist/assets/{useFilterParams-CGRYFw_A.js.map → useFilterParams-DZCAaBC7.js.map} +1 -1
  208. package/dashboard/dist/assets/{useYamlActivityEvents-BeR-nVWQ.js → useYamlActivityEvents-D3RQjfzo.js} +2 -2
  209. package/dashboard/dist/assets/{useYamlActivityEvents-BeR-nVWQ.js.map → useYamlActivityEvents-D3RQjfzo.js.map} +1 -1
  210. package/dashboard/dist/assets/{users-DYsdQ7Md.js → users-e2oatvoj.js} +2 -2
  211. package/dashboard/dist/assets/{users-DYsdQ7Md.js.map → users-e2oatvoj.js.map} +1 -1
  212. package/dashboard/dist/assets/{vendor-icons-CWl44VA6.js → vendor-icons-BkK55L-1.js} +103 -88
  213. package/dashboard/dist/assets/vendor-icons-BkK55L-1.js.map +1 -0
  214. package/dashboard/dist/assets/vendor-query-B2UbickB.js +18 -0
  215. package/dashboard/dist/assets/vendor-query-B2UbickB.js.map +1 -0
  216. package/dashboard/dist/assets/vendor-react-CX88sFS5.js +22 -0
  217. package/dashboard/dist/assets/vendor-react-CX88sFS5.js.map +1 -0
  218. package/dashboard/dist/assets/{workflows-2QAXh3UD.js → workflows-D6diL54s.js} +2 -2
  219. package/dashboard/dist/assets/{workflows-2QAXh3UD.js.map → workflows-D6diL54s.js.map} +1 -1
  220. package/dashboard/dist/assets/{yaml-workflows-sx8-UEE3.js → yaml-workflows-CAKU7LUu.js} +2 -2
  221. package/dashboard/dist/assets/{yaml-workflows-sx8-UEE3.js.map → yaml-workflows-CAKU7LUu.js.map} +1 -1
  222. package/dashboard/dist/index.html +5 -5
  223. package/docs/dashboard.md +233 -65
  224. package/package.json +3 -2
  225. package/build/examples/external-mcp-server/server.d.ts +0 -17
  226. package/build/examples/external-mcp-server/server.js +0 -116
  227. package/build/examples/index.d.ts +0 -2
  228. package/build/examples/index.js +0 -7
  229. package/build/examples/seed-data.d.ts +0 -55
  230. package/build/examples/seed-data.js +0 -161
  231. package/build/examples/seed.d.ts +0 -5
  232. package/build/examples/seed.js +0 -132
  233. package/build/examples/types/envelopes.d.ts +0 -69
  234. package/build/examples/types/envelopes.js +0 -8
  235. package/build/examples/types/index.d.ts +0 -10
  236. package/build/examples/types/index.js +0 -9
  237. package/build/examples/types/resolvers.d.ts +0 -27
  238. package/build/examples/types/resolvers.js +0 -9
  239. package/build/examples/workers.d.ts +0 -10
  240. package/build/examples/workers.js +0 -59
  241. package/build/examples/workflows/assembly-line/activities.d.ts +0 -28
  242. package/build/examples/workflows/assembly-line/activities.js +0 -53
  243. package/build/examples/workflows/assembly-line/index.d.ts +0 -17
  244. package/build/examples/workflows/assembly-line/index.js +0 -60
  245. package/build/examples/workflows/assembly-line/iterator.d.ts +0 -12
  246. package/build/examples/workflows/assembly-line/iterator.js +0 -54
  247. package/build/examples/workflows/assembly-line/reverter.d.ts +0 -18
  248. package/build/examples/workflows/assembly-line/reverter.js +0 -89
  249. package/build/examples/workflows/assembly-line/types.d.ts +0 -25
  250. package/build/examples/workflows/assembly-line/types.js +0 -8
  251. package/build/examples/workflows/assembly-line/worker.d.ts +0 -13
  252. package/build/examples/workflows/assembly-line/worker.js +0 -81
  253. package/build/examples/workflows/basic-echo/activities.d.ts +0 -20
  254. package/build/examples/workflows/basic-echo/activities.js +0 -55
  255. package/build/examples/workflows/basic-echo/index.d.ts +0 -14
  256. package/build/examples/workflows/basic-echo/index.js +0 -66
  257. package/build/examples/workflows/basic-signal/activities.d.ts +0 -17
  258. package/build/examples/workflows/basic-signal/activities.js +0 -18
  259. package/build/examples/workflows/basic-signal/index.d.ts +0 -17
  260. package/build/examples/workflows/basic-signal/index.js +0 -116
  261. package/build/examples/workflows/kitchen-sink/activities.d.ts +0 -40
  262. package/build/examples/workflows/kitchen-sink/activities.js +0 -46
  263. package/build/examples/workflows/kitchen-sink/index.d.ts +0 -22
  264. package/build/examples/workflows/kitchen-sink/index.js +0 -123
  265. package/build/examples/workflows/review-content/activities.d.ts +0 -10
  266. package/build/examples/workflows/review-content/activities.js +0 -44
  267. package/build/examples/workflows/review-content/index.d.ts +0 -10
  268. package/build/examples/workflows/review-content/index.js +0 -95
  269. package/build/examples/workflows/review-content/types.d.ts +0 -28
  270. package/build/examples/workflows/review-content/types.js +0 -2
  271. package/build/system/seed/server-definitions.d.ts +0 -3210
  272. package/build/system/seed/server-definitions.js +0 -232
  273. package/dashboard/dist/assets/AdminDashboard-NLryl1_B.js +0 -2
  274. package/dashboard/dist/assets/AvailableEscalationsPage-6vexlrk3.js +0 -2
  275. package/dashboard/dist/assets/BotPicker-DWhn0tr1.js +0 -2
  276. package/dashboard/dist/assets/CollapsibleSection-CgYgQiOc.js +0 -2
  277. package/dashboard/dist/assets/ConfirmDeleteModal-DCKAPXD3.js +0 -2
  278. package/dashboard/dist/assets/CopyableId-DXkaAOYk.js +0 -2
  279. package/dashboard/dist/assets/CredentialsPage-B361BOfU.js +0 -2
  280. package/dashboard/dist/assets/CredentialsPage-B361BOfU.js.map +0 -1
  281. package/dashboard/dist/assets/CustomDurationPicker-D2G1ldiF.js +0 -2
  282. package/dashboard/dist/assets/DataTable-DXSUbA26.js +0 -2
  283. package/dashboard/dist/assets/ElapsedCell-CQGqkXP_.js +0 -2
  284. package/dashboard/dist/assets/EmptyState-Dep92Wkg.js +0 -2
  285. package/dashboard/dist/assets/EmptyState-Dep92Wkg.js.map +0 -1
  286. package/dashboard/dist/assets/EscalationsOverview-DVEFVjs7.js +0 -2
  287. package/dashboard/dist/assets/EscalationsOverview-DVEFVjs7.js.map +0 -1
  288. package/dashboard/dist/assets/EventTable-BMJAPkMi.js +0 -2
  289. package/dashboard/dist/assets/FilterBar-DbVbCzH2.js +0 -2
  290. package/dashboard/dist/assets/ListToolbar-0XNuXj0M.js +0 -2
  291. package/dashboard/dist/assets/McpOverview-CeYnCzBN.js +0 -2
  292. package/dashboard/dist/assets/McpQueryDetailPage-t3qW3QNa.js +0 -5
  293. package/dashboard/dist/assets/McpQueryDetailPage-t3qW3QNa.js.map +0 -1
  294. package/dashboard/dist/assets/McpQueryPage-CfUcdzaj.js +0 -2
  295. package/dashboard/dist/assets/McpQueryPage-CfUcdzaj.js.map +0 -1
  296. package/dashboard/dist/assets/McpRunDetailPage-CZtodW_Z.js +0 -2
  297. package/dashboard/dist/assets/McpRunsPage-Dzgq7HGt.js +0 -2
  298. package/dashboard/dist/assets/McpRunsPage-Dzgq7HGt.js.map +0 -1
  299. package/dashboard/dist/assets/Modal-yyhUeKoA.js +0 -2
  300. package/dashboard/dist/assets/OperatorDashboard-Ceh7OQtZ.js +0 -2
  301. package/dashboard/dist/assets/PageHeader-CZ9a8cpr.js +0 -2
  302. package/dashboard/dist/assets/PageHeader-CZ9a8cpr.js.map +0 -1
  303. package/dashboard/dist/assets/PageHeaderWithStats-BJuNs5NM.js +0 -2
  304. package/dashboard/dist/assets/PageHeaderWithStats-BJuNs5NM.js.map +0 -1
  305. package/dashboard/dist/assets/PriorityBadge-BrPikMFy.js +0 -2
  306. package/dashboard/dist/assets/ProcessDetailPage-2miaYd8G.js +0 -2
  307. package/dashboard/dist/assets/ProcessesListPage-DqpRDqjk.js +0 -2
  308. package/dashboard/dist/assets/ProcessesListPage-DqpRDqjk.js.map +0 -1
  309. package/dashboard/dist/assets/RolePill-DxbJMfJu.js +0 -2
  310. package/dashboard/dist/assets/RolesPage-CYHRo21-.js +0 -2
  311. package/dashboard/dist/assets/RolesPage-CYHRo21-.js.map +0 -1
  312. package/dashboard/dist/assets/RowActions-DurFwIwe.js +0 -2
  313. package/dashboard/dist/assets/RunAsSelector-CNKraP6u.js +0 -2
  314. package/dashboard/dist/assets/StatCard-CKplpK3w.js +0 -2
  315. package/dashboard/dist/assets/StatusBadge-Dm0V1dNN.js +0 -2
  316. package/dashboard/dist/assets/StatusBadge-Dm0V1dNN.js.map +0 -1
  317. package/dashboard/dist/assets/StepIndicator-Dicx0WTZ.js +0 -2
  318. package/dashboard/dist/assets/StickyPagination-B2jYvU3-.js +0 -2
  319. package/dashboard/dist/assets/SwimlaneTimeline-ClwumkT1.js +0 -2
  320. package/dashboard/dist/assets/SwimlaneTimeline-ClwumkT1.js.map +0 -1
  321. package/dashboard/dist/assets/TagInput-CypDZ6Kl.js +0 -2
  322. package/dashboard/dist/assets/TaskDetailPage-DooDNJGT.js +0 -2
  323. package/dashboard/dist/assets/TaskDetailPage-DooDNJGT.js.map +0 -1
  324. package/dashboard/dist/assets/TaskQueuePill-C1hZ-j31.js +0 -2
  325. package/dashboard/dist/assets/TaskQueuePill-C1hZ-j31.js.map +0 -1
  326. package/dashboard/dist/assets/TasksListPage-D7CdkAeg.js +0 -2
  327. package/dashboard/dist/assets/TimeAgo-B5LXB2aj.js +0 -2
  328. package/dashboard/dist/assets/TimestampCell-Crb9b0Gw.js +0 -2
  329. package/dashboard/dist/assets/UserName-OPg-nkRa.js +0 -2
  330. package/dashboard/dist/assets/WorkflowExecutionPage-CcLVrs9b.js +0 -2
  331. package/dashboard/dist/assets/WorkflowPill-CCV4MMj7.js +0 -2
  332. package/dashboard/dist/assets/WorkflowsDashboard-DB1SncBi.js +0 -2
  333. package/dashboard/dist/assets/WorkflowsDashboard-DB1SncBi.js.map +0 -1
  334. package/dashboard/dist/assets/WorkflowsOverview-DvShiYJV.js +0 -2
  335. package/dashboard/dist/assets/YamlWorkflowsPage-DCBoMeGI.js +0 -2
  336. package/dashboard/dist/assets/YamlWorkflowsPage-DCBoMeGI.js.map +0 -1
  337. package/dashboard/dist/assets/escalation-A0CsbvNV.js +0 -2
  338. package/dashboard/dist/assets/escalation-columns-BpBJN6k4.js +0 -2
  339. package/dashboard/dist/assets/helpers-CmznCuAx.js +0 -2
  340. package/dashboard/dist/assets/index-BIeYV5QK.js +0 -2
  341. package/dashboard/dist/assets/index-BIeYV5QK.js.map +0 -1
  342. package/dashboard/dist/assets/index-BYwD3kHN.js +0 -5
  343. package/dashboard/dist/assets/index-C5TUqJu0.css +0 -1
  344. package/dashboard/dist/assets/index-C8-UaN4N.js +0 -2
  345. package/dashboard/dist/assets/index-C8-UaN4N.js.map +0 -1
  346. package/dashboard/dist/assets/index-CAj5LT9H.js +0 -15
  347. package/dashboard/dist/assets/index-CAj5LT9H.js.map +0 -1
  348. package/dashboard/dist/assets/index-CjxHCVxl.js +0 -2
  349. package/dashboard/dist/assets/index-CjxHCVxl.js.map +0 -1
  350. package/dashboard/dist/assets/index-Cr0Rqsj7.js +0 -2
  351. package/dashboard/dist/assets/index-DZHNte4o.js +0 -2
  352. package/dashboard/dist/assets/index-DZHNte4o.js.map +0 -1
  353. package/dashboard/dist/assets/index-VnYkWW8r.js +0 -2
  354. package/dashboard/dist/assets/index-XGOmZ117.js +0 -2
  355. package/dashboard/dist/assets/index-ZjOUzWhc.js +0 -2
  356. package/dashboard/dist/assets/index-ZjOUzWhc.js.map +0 -1
  357. package/dashboard/dist/assets/index-puKKZ5l8.js +0 -281
  358. package/dashboard/dist/assets/index-puKKZ5l8.js.map +0 -1
  359. package/dashboard/dist/assets/index-t5frSddy.js +0 -6
  360. package/dashboard/dist/assets/index-t5frSddy.js.map +0 -1
  361. package/dashboard/dist/assets/mcp-DrWymhSu.js +0 -2
  362. package/dashboard/dist/assets/namespaces-Cm6AY5sh.js +0 -2
  363. package/dashboard/dist/assets/settings-DTQNp6tH.js +0 -2
  364. package/dashboard/dist/assets/vendor-icons-CWl44VA6.js.map +0 -1
  365. package/dashboard/dist/assets/vendor-query-DLp59M9_.js +0 -35
  366. package/dashboard/dist/assets/vendor-query-DLp59M9_.js.map +0 -1
  367. package/dashboard/dist/assets/vendor-react-Co3Y8ikm.js +0 -26
  368. package/dashboard/dist/assets/vendor-react-Co3Y8ikm.js.map +0 -1
@@ -159,6 +159,7 @@ async function resolveViaTriage(escalation, resolverPayload, triageEnvelope) {
159
159
  workflowId: triageWorkflowId,
160
160
  expire: defaults_1.JOB_EXPIRE_SECS,
161
161
  entity: 'mcpTriageRouter',
162
+ signalIn: false,
162
163
  });
163
164
  await escalationService.resolveEscalation(escalation.id, {
164
165
  ...resolverPayload,
@@ -10,6 +10,10 @@ export declare function getFileMetadata(input: {
10
10
  export declare function deleteFile(input: {
11
11
  filePath: string;
12
12
  }): Promise<LTApiResult>;
13
+ export declare function uploadFile(input: {
14
+ path: string;
15
+ buffer: Buffer;
16
+ }): Promise<LTApiResult>;
13
17
  export declare function generateSignedUrl(input: {
14
18
  filePath: string;
15
19
  expiresIn: number;
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.browseFiles = browseFiles;
4
4
  exports.getFileMetadata = getFileMetadata;
5
5
  exports.deleteFile = deleteFile;
6
+ exports.uploadFile = uploadFile;
6
7
  exports.generateSignedUrl = generateSignedUrl;
7
8
  const storage_1 = require("../lib/storage");
8
9
  const mime_1 = require("../lib/storage/mime");
@@ -43,6 +44,19 @@ async function deleteFile(input) {
43
44
  return { status: 500, error: err.message };
44
45
  }
45
46
  }
47
+ async function uploadFile(input) {
48
+ try {
49
+ const result = await (0, storage_1.getStorageBackend)().write(input.path, input.buffer);
50
+ const contentType = (0, mime_1.mimeFromPath)(input.path);
51
+ return {
52
+ status: 200,
53
+ data: { path: input.path, size: result.size, content_type: contentType },
54
+ };
55
+ }
56
+ catch (err) {
57
+ return { status: 500, error: err.message };
58
+ }
59
+ }
46
60
  async function generateSignedUrl(input) {
47
61
  if (!ALLOWED_EXPIRY.includes(input.expiresIn)) {
48
62
  return {
@@ -38,9 +38,6 @@ async function getSettings() {
38
38
  natsWsUrl: hasNats
39
39
  ? (process.env.VITE_NATS_WS_URL || process.env.NATS_WS_URL || null)
40
40
  : null,
41
- natsToken: hasNats
42
- ? (process.env.NATS_TOKEN || null)
43
- : null,
44
41
  },
45
42
  },
46
43
  };
@@ -95,6 +95,11 @@ async function getWorkflowConfig(input) {
95
95
  */
96
96
  async function upsertWorkflowConfig(input) {
97
97
  try {
98
+ // Validate cron expression before persisting
99
+ if (input.cron_schedule) {
100
+ const { validateCronSchedule } = await Promise.resolve().then(() => __importStar(require('../../services/cron')));
101
+ validateCronSchedule(input.cron_schedule);
102
+ }
98
103
  const config = await configService.upsertWorkflowConfig({
99
104
  workflow_type: input.type,
100
105
  invocable: input.invocable ?? false,
@@ -49,6 +49,23 @@ const builder_regenerate_1 = require("../../services/yaml-workflow/builder-regen
49
49
  const task_1 = require("../../services/task");
50
50
  const utils_1 = require("../../modules/utils");
51
51
  const helpers_1 = require("./helpers");
52
+ /**
53
+ * Strip the qualified `{slug}__` prefix from mcp_tool_name entries.
54
+ * The builder LLM sometimes echoes the qualified name (e.g.
55
+ * "long_tail_playwright_cli__capture_page") instead of the short
56
+ * tool name ("capture_page"). MCP servers register tools by short
57
+ * name, so the qualified form fails at runtime.
58
+ */
59
+ function normalizeManifestToolNames(manifest) {
60
+ if (!manifest)
61
+ return manifest;
62
+ for (const entry of manifest) {
63
+ if (entry.mcp_tool_name?.includes('__')) {
64
+ entry.mcp_tool_name = entry.mcp_tool_name.slice(entry.mcp_tool_name.indexOf('__') + 2);
65
+ }
66
+ }
67
+ return manifest;
68
+ }
52
69
  /**
53
70
  * List YAML workflows with optional filtering and pagination.
54
71
  *
@@ -157,7 +174,7 @@ async function createYamlWorkflow(input) {
157
174
  graph_topic: result.graphTopic,
158
175
  input_schema: result.inputSchema,
159
176
  output_schema: result.outputSchema,
160
- activity_manifest: result.activityManifest,
177
+ activity_manifest: normalizeManifestToolNames(result.activityManifest),
161
178
  tags: mergedTags,
162
179
  source_workflow_id: workflow_id,
163
180
  source_workflow_type: workflow_name,
@@ -242,7 +259,7 @@ async function createYamlWorkflowDirect(input) {
242
259
  graph_topic: graphTopic,
243
260
  input_schema: input_schema || {},
244
261
  output_schema: {},
245
- activity_manifest: activity_manifest || [],
262
+ activity_manifest: normalizeManifestToolNames(activity_manifest) || [],
246
263
  tags: tags || [],
247
264
  original_prompt: description,
248
265
  category: 'builder',
@@ -300,6 +317,9 @@ async function getYamlWorkflow(input) {
300
317
  async function updateYamlWorkflow(input) {
301
318
  try {
302
319
  const { id, ...fields } = input;
320
+ if (fields.activity_manifest) {
321
+ normalizeManifestToolNames(fields.activity_manifest);
322
+ }
303
323
  const wf = await yamlDb.updateYamlWorkflow(id, fields);
304
324
  if (!wf) {
305
325
  return { status: 404, error: 'YAML workflow not found' };
@@ -352,7 +372,7 @@ async function regenerateYamlWorkflow(input) {
352
372
  yaml_content: result.yaml,
353
373
  input_schema: result.inputSchema,
354
374
  output_schema: result.outputSchema,
355
- activity_manifest: result.activityManifest,
375
+ activity_manifest: normalizeManifestToolNames(result.activityManifest),
356
376
  tags: result.tags,
357
377
  });
358
378
  return { status: 200, data: updated };
@@ -383,7 +403,7 @@ async function regenerateYamlWorkflow(input) {
383
403
  yaml_content: result.yaml,
384
404
  input_schema: result.inputSchema,
385
405
  output_schema: result.outputSchema,
386
- activity_manifest: result.activityManifest,
406
+ activity_manifest: normalizeManifestToolNames(result.activityManifest),
387
407
  tags: result.tags,
388
408
  metadata: { input_field_meta: result.inputFieldMeta },
389
409
  });
@@ -464,7 +484,7 @@ async function createYamlWorkflowFromDurable(input) {
464
484
  graph_topic: result.graphTopic,
465
485
  input_schema: result.inputSchema,
466
486
  output_schema: result.outputSchema,
467
- activity_manifest: result.activityManifest,
487
+ activity_manifest: normalizeManifestToolNames(result.activityManifest),
468
488
  tags: mergedTags,
469
489
  source_workflow_type: 'durable',
470
490
  original_prompt: description,
package/build/index.d.ts CHANGED
@@ -14,7 +14,7 @@ export { ltConfig } from './modules/ltconfig';
14
14
  export { eventRegistry } from './lib/events';
15
15
  export { NatsEventAdapter } from './lib/events/nats';
16
16
  export { InMemoryEventAdapter } from './lib/events/memory';
17
- export { SocketIOEventAdapter } from './lib/events/socketio';
17
+ export { SocketIOEventAdapter, type SocketIOAuthenticator } from './lib/events/socketio';
18
18
  export { publishMilestoneEvent, publishTaskEvent, publishEscalationEvent, publishWorkflowEvent } from './lib/events/publish';
19
19
  export { telemetryRegistry } from './lib/telemetry';
20
20
  export { HoneycombTelemetryAdapter } from './lib/telemetry/honeycomb';
@@ -37,7 +37,6 @@ export { getActivityIdentity } from './services/iam/activity';
37
37
  export { getToolContext } from './services/iam/context';
38
38
  export { registerMcpTool } from './services/mcp/register-tool';
39
39
  export { getSystemWorkers, builtinMcpServerFactories } from './system';
40
- export { seedSystemMcpServers } from './system/seed';
41
40
  export { CallbackEventAdapter } from './lib/events/callback';
42
41
  export { createClient } from './sdk';
43
42
  export type { LTClient, LTClientOptions } from './sdk';
package/build/index.js CHANGED
@@ -36,8 +36,7 @@ var __importStar = (this && this.__importStar) || (function () {
36
36
  };
37
37
  })();
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.createClient = exports.CallbackEventAdapter = exports.seedSystemMcpServers = exports.builtinMcpServerFactories = exports.getSystemWorkers = exports.registerMcpTool = exports.getToolContext = exports.getActivityIdentity = exports.seedExamples = exports.exampleWorkers = exports.McpEscalationStrategy = exports.DefaultEscalationStrategy = exports.escalationStrategyRegistry = exports.McpVisionServer = exports.McpTranslationServer = exports.McpServer = exports.McpClient = exports.McpService = exports.BuiltInMcpAdapter = exports.mcpRegistry = exports.defaultMaintenanceConfig = exports.maintenanceRegistry = exports.PinoLoggerAdapter = exports.loggerRegistry = exports.HoneycombTelemetryAdapter = exports.telemetryRegistry = exports.publishWorkflowEvent = exports.publishEscalationEvent = exports.publishTaskEvent = exports.publishMilestoneEvent = exports.SocketIOEventAdapter = exports.InMemoryEventAdapter = exports.NatsEventAdapter = exports.eventRegistry = exports.ltConfig = exports.UserService = exports.ConfigService = exports.EscalationService = exports.TaskService = exports.signToken = exports.requireAdmin = exports.requireAuth = exports.createAuthMiddleware = exports.JwtAuthAdapter = exports.conditionLT = exports.executeLT = exports.createLTActivityInterceptor = exports.createLTInterceptor = exports.registerLT = exports.start = void 0;
40
- exports.api = void 0;
39
+ exports.api = exports.createClient = exports.CallbackEventAdapter = exports.builtinMcpServerFactories = exports.getSystemWorkers = exports.registerMcpTool = exports.getToolContext = exports.getActivityIdentity = exports.seedExamples = exports.exampleWorkers = exports.McpEscalationStrategy = exports.DefaultEscalationStrategy = exports.escalationStrategyRegistry = exports.McpVisionServer = exports.McpTranslationServer = exports.McpServer = exports.McpClient = exports.McpService = exports.BuiltInMcpAdapter = exports.mcpRegistry = exports.defaultMaintenanceConfig = exports.maintenanceRegistry = exports.PinoLoggerAdapter = exports.loggerRegistry = exports.HoneycombTelemetryAdapter = exports.telemetryRegistry = exports.publishWorkflowEvent = exports.publishEscalationEvent = exports.publishTaskEvent = exports.publishMilestoneEvent = exports.SocketIOEventAdapter = exports.InMemoryEventAdapter = exports.NatsEventAdapter = exports.eventRegistry = exports.ltConfig = exports.UserService = exports.ConfigService = exports.EscalationService = exports.TaskService = exports.signToken = exports.requireAdmin = exports.requireAuth = exports.createAuthMiddleware = exports.JwtAuthAdapter = exports.conditionLT = exports.executeLT = exports.createLTActivityInterceptor = exports.createLTInterceptor = exports.registerLT = exports.start = void 0;
41
40
  const config_1 = require("./modules/config");
42
41
  const logger_1 = require("./lib/logger");
43
42
  const start_1 = require("./start");
@@ -118,8 +117,6 @@ Object.defineProperty(exports, "registerMcpTool", { enumerable: true, get: funct
118
117
  var system_1 = require("./system");
119
118
  Object.defineProperty(exports, "getSystemWorkers", { enumerable: true, get: function () { return system_1.getSystemWorkers; } });
120
119
  Object.defineProperty(exports, "builtinMcpServerFactories", { enumerable: true, get: function () { return system_1.builtinMcpServerFactories; } });
121
- var seed_1 = require("./system/seed");
122
- Object.defineProperty(exports, "seedSystemMcpServers", { enumerable: true, get: function () { return seed_1.seedSystemMcpServers; } });
123
120
  var callback_1 = require("./lib/events/callback");
124
121
  Object.defineProperty(exports, "CallbackEventAdapter", { enumerable: true, get: function () { return callback_1.CallbackEventAdapter; } });
125
122
  var sdk_1 = require("./sdk");
@@ -1,18 +1,6 @@
1
- -- System seed data: built-in MCP server, system workflow configs, escalation chains.
2
- -- Example workflow configs are seeded at runtime when examples: true.
3
-
4
- -- ─── Built-in MCP server ───────────────────────────────────────────────────
5
-
6
- INSERT INTO lt_mcp_servers (name, description, transport_type, transport_config, auto_connect, status)
7
- VALUES (
8
- 'long-tail-db-query',
9
- 'Built-in read-only query server for tasks, escalations, processes, and system health',
10
- 'stdio',
11
- '{"builtin": true}'::jsonb,
12
- false,
13
- 'connected'
14
- )
15
- ON CONFLICT (name) DO NOTHING;
1
+ -- System seed data: escalation chains.
2
+ -- Workflow configs and MCP server definitions are seeded at startup
3
+ -- via inline config on worker and factory declarations.
16
4
 
17
5
  -- ─── Escalation chains ─────────────────────────────────────────────────────
18
6
 
@@ -24,69 +12,3 @@ INSERT INTO lt_config_role_escalations (source_role, target_role) VALUES
24
12
  ('admin', 'engineer'),
25
13
  ('admin', 'superadmin')
26
14
  ON CONFLICT DO NOTHING;
27
-
28
- -- ─── System workflow configs ────────────────────────────────────────────────
29
-
30
- INSERT INTO lt_config_workflows
31
- (workflow_type, task_queue, default_role, invocable, description, tool_tags)
32
- VALUES
33
- ('mcpQuery', 'long-tail-system', 'engineer', false,
34
- 'Dynamic MCP tool orchestration — LLM agentic loop with raw MCP tools',
35
- '{}'),
36
- ('mcpTriage', 'long-tail-system', 'engineer', false,
37
- 'Dynamic MCP triage — LLM agentic loop for escalation remediation',
38
- '{}'),
39
- ('mcpWorkflowBuilder', 'long-tail-system', 'engineer', false,
40
- 'Direct pipeline builder — LLM constructs DAG from tool schemas',
41
- '{}'),
42
- ('mcpWorkflowPlanner', 'long-tail-system', 'engineer', false,
43
- 'Plan mode — decomposes specifications into multi-workflow sets',
44
- '{}')
45
- ON CONFLICT (workflow_type) DO NOTHING;
46
-
47
- -- Query router (orchestrator entry point)
48
- INSERT INTO lt_config_workflows
49
- (workflow_type, task_queue, default_role, invocable, description, tool_tags, envelope_schema)
50
- VALUES
51
- ('mcpQueryRouter', 'long-tail-system', 'engineer', true,
52
- 'Do anything with tools — browser automation, file operations, HTTP requests, database queries, document processing, and more',
53
- '{}',
54
- '{"data": {"prompt": "Describe what you want to accomplish using available tools..."}, "metadata": {"source": "dashboard"}}'::jsonb)
55
- ON CONFLICT (workflow_type) DO NOTHING;
56
-
57
- -- Deterministic execution (compiled YAML workflows)
58
- INSERT INTO lt_config_workflows
59
- (workflow_type, task_queue, default_role, invocable, description, tool_tags)
60
- VALUES
61
- ('mcpDeterministic', 'long-tail-system', 'engineer', false,
62
- 'Deterministic execution — invokes matched compiled YAML workflows with extracted inputs',
63
- '{}')
64
- ON CONFLICT (workflow_type) DO NOTHING;
65
-
66
- -- Triage router
67
- INSERT INTO lt_config_workflows
68
- (workflow_type, task_queue, default_role, invocable, description, tool_tags)
69
- VALUES
70
- ('mcpTriageRouter', 'long-tail-system', 'engineer', false,
71
- 'Triage router — discovers compiled workflows for remediation, routes to deterministic or dynamic triage',
72
- '{}')
73
- ON CONFLICT (workflow_type) DO NOTHING;
74
-
75
- -- Triage deterministic
76
- INSERT INTO lt_config_workflows
77
- (workflow_type, task_queue, default_role, invocable, description, tool_tags)
78
- VALUES
79
- ('mcpTriageDeterministic', 'long-tail-system', 'engineer', false,
80
- 'Deterministic triage — invokes matched compiled workflows for escalation remediation',
81
- '{}')
82
- ON CONFLICT (workflow_type) DO NOTHING;
83
-
84
- -- ─── Assign roles to all system workflows ──────────────────────────────────
85
-
86
- INSERT INTO lt_config_roles (workflow_type, role)
87
- SELECT wt, unnest(ARRAY['reviewer', 'engineer', 'admin'])
88
- FROM unnest(ARRAY[
89
- 'mcpQuery', 'mcpTriage', 'mcpWorkflowBuilder', 'mcpWorkflowPlanner',
90
- 'mcpQueryRouter', 'mcpDeterministic', 'mcpTriageRouter', 'mcpTriageDeterministic'
91
- ]) AS wt
92
- ON CONFLICT (workflow_type, role) DO NOTHING;
@@ -1,5 +1,10 @@
1
1
  import type { Server as HttpServer } from 'http';
2
2
  import type { LTEvent, LTEventAdapter } from '../../types';
3
+ /**
4
+ * Callback to verify a Socket.IO handshake token.
5
+ * Return `true` to allow the connection, `false` to reject.
6
+ */
7
+ export type SocketIOAuthenticator = (token: string) => boolean | Promise<boolean>;
3
8
  /**
4
9
  * Socket.IO event adapter for browser clients.
5
10
  *
@@ -10,6 +15,9 @@ import type { LTEvent, LTEventAdapter } from '../../types';
10
15
  * `connect()` is called. The startup flow handles this automatically
11
16
  * when Socket.IO is the active event transport.
12
17
  *
18
+ * When an `authenticate` callback is provided, Socket.IO middleware
19
+ * rejects handshakes that do not include a valid `auth.token`.
20
+ *
13
21
  * Usage:
14
22
  * ```typescript
15
23
  * import { eventRegistry } from '@hotmeshio/long-tail';
@@ -25,6 +33,10 @@ import type { LTEvent, LTEventAdapter } from '../../types';
25
33
  export declare class SocketIOEventAdapter implements LTEventAdapter {
26
34
  private io;
27
35
  private httpServer;
36
+ private authenticate;
37
+ constructor(options?: {
38
+ authenticate?: SocketIOAuthenticator;
39
+ });
28
40
  /** Attach to an HTTP server. Must be called before connect(). */
29
41
  attachServer(server: HttpServer): void;
30
42
  connect(): Promise<void>;
@@ -13,6 +13,9 @@ const logger_1 = require("../logger");
13
13
  * `connect()` is called. The startup flow handles this automatically
14
14
  * when Socket.IO is the active event transport.
15
15
  *
16
+ * When an `authenticate` callback is provided, Socket.IO middleware
17
+ * rejects handshakes that do not include a valid `auth.token`.
18
+ *
16
19
  * Usage:
17
20
  * ```typescript
18
21
  * import { eventRegistry } from '@hotmeshio/long-tail';
@@ -26,9 +29,10 @@ const logger_1 = require("../logger");
26
29
  * ```
27
30
  */
28
31
  class SocketIOEventAdapter {
29
- constructor() {
32
+ constructor(options) {
30
33
  this.io = null;
31
34
  this.httpServer = null;
35
+ this.authenticate = options?.authenticate ?? null;
32
36
  }
33
37
  /** Attach to an HTTP server. Must be called before connect(). */
34
38
  attachServer(server) {
@@ -45,6 +49,25 @@ class SocketIOEventAdapter {
45
49
  transports: ['polling', 'websocket'],
46
50
  allowEIO3: true,
47
51
  });
52
+ if (this.authenticate) {
53
+ const verify = this.authenticate;
54
+ this.io.use(async (socket, next) => {
55
+ const token = socket.handshake.auth?.token;
56
+ if (!token) {
57
+ return next(new Error('Authentication required'));
58
+ }
59
+ try {
60
+ const valid = await verify(token);
61
+ if (!valid) {
62
+ return next(new Error('Authentication failed'));
63
+ }
64
+ next();
65
+ }
66
+ catch {
67
+ next(new Error('Authentication failed'));
68
+ }
69
+ });
70
+ }
48
71
  this.io.on('connection', (socket) => {
49
72
  logger_1.loggerRegistry.info(`[lt-events:socketio] client connected (${socket.id})`);
50
73
  socket.on('disconnect', () => {
@@ -21,6 +21,26 @@ exports.MIME_TYPES = {
21
21
  '.yaml': 'text/yaml',
22
22
  '.yml': 'text/yaml',
23
23
  '.md': 'text/markdown',
24
+ '.ts': 'text/typescript',
25
+ '.tsx': 'text/typescript',
26
+ '.jsx': 'application/javascript',
27
+ '.sh': 'text/x-shellscript',
28
+ '.py': 'text/x-python',
29
+ '.rb': 'text/x-ruby',
30
+ '.go': 'text/x-go',
31
+ '.rs': 'text/x-rust',
32
+ '.java': 'text/x-java',
33
+ '.c': 'text/x-c',
34
+ '.cpp': 'text/x-c++',
35
+ '.h': 'text/x-c',
36
+ '.sql': 'text/x-sql',
37
+ '.toml': 'text/toml',
38
+ '.env': 'text/plain',
39
+ '.log': 'text/plain',
40
+ '.ini': 'text/plain',
41
+ '.cfg': 'text/plain',
42
+ '.conf': 'text/plain',
43
+ '.scss': 'text/css',
24
44
  '.zip': 'application/zip',
25
45
  '.gz': 'application/gzip',
26
46
  };
@@ -123,4 +123,34 @@ router.get('/download/{*filePath}', async (req, res) => {
123
123
  res.status(404).json({ error: 'File not found' });
124
124
  }
125
125
  });
126
+ /**
127
+ * POST /api/file-browser/upload
128
+ * Upload a file to storage.
129
+ * Query: ?path=images/photo.png (target path including filename)
130
+ * Body: raw file bytes (Content-Type should match the file type)
131
+ */
132
+ router.post('/upload', async (req, res) => {
133
+ const targetPath = req.query.path;
134
+ if (!targetPath) {
135
+ res.status(400).json({ error: 'path query parameter required (e.g., ?path=images/photo.png)' });
136
+ return;
137
+ }
138
+ // Collect raw body chunks
139
+ const chunks = [];
140
+ req.on('data', (chunk) => chunks.push(chunk));
141
+ req.on('end', async () => {
142
+ try {
143
+ const buffer = Buffer.concat(chunks);
144
+ if (buffer.length === 0) {
145
+ res.status(400).json({ error: 'Empty file body' });
146
+ return;
147
+ }
148
+ const result = await api.uploadFile({ path: targetPath, buffer });
149
+ res.status(result.status).json(result.data ?? { error: result.error });
150
+ }
151
+ catch (err) {
152
+ res.status(500).json({ error: err.message });
153
+ }
154
+ });
155
+ });
126
156
  exports.default = router;
@@ -11,8 +11,8 @@ const router = (0, express_1.Router)();
11
11
  /**
12
12
  * GET /api/files/*
13
13
  * Serve files from managed file storage.
14
- * Supports optional signed token (?token=<jwt>) for authenticated access
15
- * to locally-generated signed URLs.
14
+ * Requires a signed token (?token=<jwt>) for authenticated access.
15
+ * Use POST /api/file-browser/signed-url to generate a token.
16
16
  */
17
17
  router.get('/{*filePath}', async (req, res) => {
18
18
  const raw = req.params.filePath;
@@ -21,26 +21,28 @@ router.get('/{*filePath}', async (req, res) => {
21
21
  res.status(400).json({ error: 'File path required' });
22
22
  return;
23
23
  }
24
- // Validate signed token if provided
24
+ // Require signed token no unauthenticated file access
25
25
  const token = req.query.token;
26
- if (token) {
27
- const secret = process.env.JWT_SECRET;
28
- if (!secret) {
29
- res.status(500).json({ error: 'Server not configured for signed URLs' });
30
- return;
31
- }
32
- try {
33
- const decoded = jsonwebtoken_1.default.verify(token, secret);
34
- if (decoded.purpose !== 'file-download' || decoded.filePath !== filePath.replace(/^\/+/, '')) {
35
- res.status(403).json({ error: 'Token does not match requested file' });
36
- return;
37
- }
38
- }
39
- catch {
40
- res.status(403).json({ error: 'Invalid or expired token' });
26
+ if (!token) {
27
+ res.status(401).json({ error: 'Signed token required. Use /api/file-browser/signed-url to generate one.' });
28
+ return;
29
+ }
30
+ const secret = process.env.JWT_SECRET;
31
+ if (!secret) {
32
+ res.status(500).json({ error: 'Server not configured for signed URLs' });
33
+ return;
34
+ }
35
+ try {
36
+ const decoded = jsonwebtoken_1.default.verify(token, secret);
37
+ if (decoded.purpose !== 'file-download' || decoded.filePath !== filePath.replace(/^\/+/, '')) {
38
+ res.status(403).json({ error: 'Token does not match requested file' });
41
39
  return;
42
40
  }
43
41
  }
42
+ catch {
43
+ res.status(403).json({ error: 'Invalid or expired token' });
44
+ return;
45
+ }
44
46
  try {
45
47
  const stream = await (0, storage_1.getStorageBackend)().createReadStream(filePath);
46
48
  const contentType = (0, mime_1.mimeFromPath)(filePath);
@@ -29,6 +29,7 @@ const bot_accounts_1 = __importDefault(require("./bot-accounts"));
29
29
  const docs_1 = __importDefault(require("./docs"));
30
30
  const workflow_sets_1 = __importDefault(require("./workflow-sets"));
31
31
  const knowledge_1 = __importDefault(require("./knowledge"));
32
+ const nats_credentials_1 = __importDefault(require("./nats-credentials"));
32
33
  const router = (0, express_1.Router)();
33
34
  // Public routes (no auth required — they handle their own auth)
34
35
  router.use('/auth', auth_2.default);
@@ -38,6 +39,7 @@ router.use('/files', files_1.default);
38
39
  router.use('/settings', settings_1.default);
39
40
  // Apply auth to all API routes
40
41
  router.use(auth_1.requireAuth);
42
+ router.use('/nats-credentials', nats_credentials_1.default);
41
43
  router.use('/tasks', tasks_1.default);
42
44
  router.use('/escalations', escalations_1.default);
43
45
  router.use('/workflows', workflows_1.default);
@@ -0,0 +1,2 @@
1
+ declare const router: import("express-serve-static-core").Router;
2
+ export default router;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const express_1 = require("express");
4
+ const events_1 = require("../lib/events");
5
+ const nats_1 = require("../lib/events/nats");
6
+ const router = (0, express_1.Router)();
7
+ /**
8
+ * GET /api/nats-credentials
9
+ * Returns NATS WebSocket URL and auth token.
10
+ * Mounted behind requireAuth — only authenticated users receive the token.
11
+ */
12
+ router.get('/', async (_req, res) => {
13
+ const hasNats = !!events_1.eventRegistry.getAdapter(nats_1.NatsEventAdapter);
14
+ if (!hasNats) {
15
+ return res.json({ natsWsUrl: null, natsToken: null });
16
+ }
17
+ res.json({
18
+ natsWsUrl: process.env.VITE_NATS_WS_URL || process.env.NATS_WS_URL || null,
19
+ natsToken: process.env.NATS_TOKEN || null,
20
+ });
21
+ });
22
+ exports.default = router;
@@ -11,4 +11,7 @@ export declare const INSERT_CONFIG_ROLE = "INSERT INTO lt_config_roles (workflow
11
11
  export declare const DELETE_INVOCATION_ROLES = "DELETE FROM lt_config_invocation_roles WHERE workflow_type = $1";
12
12
  export declare const INSERT_INVOCATION_ROLE = "INSERT INTO lt_config_invocation_roles (workflow_type, role) VALUES ($1, $2)";
13
13
  export declare const DELETE_WORKFLOW = "DELETE FROM lt_config_workflows WHERE workflow_type = $1";
14
+ export declare const SEED_WORKFLOW_CONFIG = "INSERT INTO lt_config_workflows\n (workflow_type, invocable, task_queue, default_role, description, consumes, envelope_schema, resolver_schema, cron_schedule, tool_tags, execute_as)\nVALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)\nON CONFLICT (workflow_type) DO NOTHING";
15
+ export declare const SEED_CONFIG_ROLE = "INSERT INTO lt_config_roles (workflow_type, role) VALUES ($1, $2)\nON CONFLICT (workflow_type, role) DO NOTHING";
16
+ export declare const SEED_INVOCATION_ROLE = "INSERT INTO lt_config_invocation_roles (workflow_type, role) VALUES ($1, $2)\nON CONFLICT (workflow_type, role) DO NOTHING";
14
17
  export declare const GET_PROVIDER_DATA = "SELECT workflow_type, data, completed_at\n FROM lt_tasks\n WHERE origin_id = $1\n AND workflow_type = ANY($2)\n AND status = 'completed'\n ORDER BY completed_at DESC";
@@ -3,7 +3,7 @@
3
3
  // Read queries //
4
4
  // ------------------------------------------------------------------ //
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.GET_PROVIDER_DATA = exports.DELETE_WORKFLOW = exports.INSERT_INVOCATION_ROLE = exports.DELETE_INVOCATION_ROLES = exports.INSERT_CONFIG_ROLE = exports.DELETE_CONFIG_ROLES = exports.UPSERT_WORKFLOW = exports.ENSURE_ROLE_EXISTS = exports.LIST_ALL_INVOCATION_ROLES = exports.LIST_ALL_ROLES = exports.LIST_ALL_WORKFLOWS = exports.GET_WORKFLOW_INVOCATION_ROLES = exports.GET_WORKFLOW_ROLES = exports.GET_WORKFLOW = void 0;
6
+ exports.GET_PROVIDER_DATA = exports.SEED_INVOCATION_ROLE = exports.SEED_CONFIG_ROLE = exports.SEED_WORKFLOW_CONFIG = exports.DELETE_WORKFLOW = exports.INSERT_INVOCATION_ROLE = exports.DELETE_INVOCATION_ROLES = exports.INSERT_CONFIG_ROLE = exports.DELETE_CONFIG_ROLES = exports.UPSERT_WORKFLOW = exports.ENSURE_ROLE_EXISTS = exports.LIST_ALL_INVOCATION_ROLES = exports.LIST_ALL_ROLES = exports.LIST_ALL_WORKFLOWS = exports.GET_WORKFLOW_INVOCATION_ROLES = exports.GET_WORKFLOW_ROLES = exports.GET_WORKFLOW = void 0;
7
7
  exports.GET_WORKFLOW = `\
8
8
  SELECT * FROM lt_config_workflows WHERE workflow_type = $1`;
9
9
  exports.GET_WORKFLOW_ROLES = `\
@@ -47,6 +47,20 @@ INSERT INTO lt_config_invocation_roles (workflow_type, role) VALUES ($1, $2)`;
47
47
  exports.DELETE_WORKFLOW = `\
48
48
  DELETE FROM lt_config_workflows WHERE workflow_type = $1`;
49
49
  // ------------------------------------------------------------------ //
50
+ // Seed (insert-if-absent — used at startup, DB is source of truth) //
51
+ // ------------------------------------------------------------------ //
52
+ exports.SEED_WORKFLOW_CONFIG = `\
53
+ INSERT INTO lt_config_workflows
54
+ (workflow_type, invocable, task_queue, default_role, description, consumes, envelope_schema, resolver_schema, cron_schedule, tool_tags, execute_as)
55
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)
56
+ ON CONFLICT (workflow_type) DO NOTHING`;
57
+ exports.SEED_CONFIG_ROLE = `\
58
+ INSERT INTO lt_config_roles (workflow_type, role) VALUES ($1, $2)
59
+ ON CONFLICT (workflow_type, role) DO NOTHING`;
60
+ exports.SEED_INVOCATION_ROLE = `\
61
+ INSERT INTO lt_config_invocation_roles (workflow_type, role) VALUES ($1, $2)
62
+ ON CONFLICT (workflow_type, role) DO NOTHING`;
63
+ // ------------------------------------------------------------------ //
50
64
  // Provider queries //
51
65
  // ------------------------------------------------------------------ //
52
66
  exports.GET_PROVIDER_DATA = `\
@@ -3,3 +3,9 @@ export declare function upsertWorkflowConfig(config: LTWorkflowConfig & {
3
3
  lifecycle?: any;
4
4
  }): Promise<LTWorkflowConfig>;
5
5
  export declare function deleteWorkflowConfig(workflowType: string): Promise<boolean>;
6
+ /**
7
+ * Seed a workflow config at startup (insert-if-absent).
8
+ * DB is the source of truth — if the row already exists, log drift warnings
9
+ * but do not overwrite. Returns true if inserted, false if already existed.
10
+ */
11
+ export declare function seedWorkflowConfig(config: LTWorkflowConfig): Promise<boolean>;