@hotmeshio/long-tail 0.1.16 → 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 (359) 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/workflows/config.js +5 -0
  5. package/build/index.d.ts +0 -1
  6. package/build/index.js +1 -4
  7. package/build/lib/db/schemas/002_seed.sql +3 -81
  8. package/build/lib/storage/mime.js +20 -0
  9. package/build/routes/file-browser.js +30 -0
  10. package/build/routes/files.js +20 -18
  11. package/build/services/config/sql.d.ts +3 -0
  12. package/build/services/config/sql.js +15 -1
  13. package/build/services/config/write.d.ts +6 -0
  14. package/build/services/config/write.js +64 -0
  15. package/build/services/cron/index.d.ts +5 -0
  16. package/build/services/cron/index.js +30 -0
  17. package/build/services/insight/index.js +3 -0
  18. package/build/services/interceptor/activities/task.d.ts +1 -0
  19. package/build/services/interceptor/activities/task.js +2 -1
  20. package/build/services/interceptor/activities/workflow.js +1 -0
  21. package/build/services/interceptor/index.js +4 -4
  22. package/build/services/interceptor/lifecycle.js +1 -1
  23. package/build/services/mcp/db.d.ts +17 -0
  24. package/build/services/mcp/db.js +50 -0
  25. package/build/services/mcp/sql.d.ts +4 -1
  26. package/build/services/mcp/sql.js +9 -2
  27. package/build/services/oauth/index.js +4 -1
  28. package/build/services/oauth/providers/google.js +7 -2
  29. package/build/services/orchestrator/index.js +5 -0
  30. package/build/services/task/crud.js +1 -0
  31. package/build/services/task/sql.d.ts +1 -1
  32. package/build/services/task/sql.js +2 -2
  33. package/build/services/task/types.d.ts +2 -0
  34. package/build/services/workers/registry.js +3 -1
  35. package/build/services/workflow-invocation.js +8 -1
  36. package/build/start/workers.d.ts +2 -1
  37. package/build/start/workers.js +66 -6
  38. package/build/system/index.d.ts +12 -10
  39. package/build/system/index.js +240 -67
  40. package/build/system/mcp-servers/playwright/schemas.d.ts +12 -12
  41. package/build/system/seed/index.d.ts +0 -7
  42. package/build/system/seed/index.js +5 -46
  43. package/build/tsconfig.tsbuildinfo +1 -1
  44. package/build/types/index.d.ts +1 -1
  45. package/build/types/startup.d.ts +59 -2
  46. package/dashboard/dist/assets/AdminDashboard-CsTOErp1.js +2 -0
  47. package/dashboard/dist/assets/{AdminDashboard-Bprul9Eb.js.map → AdminDashboard-CsTOErp1.js.map} +1 -1
  48. package/dashboard/dist/assets/AvailableEscalationsPage-BqQA3IJp.js +2 -0
  49. package/dashboard/dist/assets/{AvailableEscalationsPage-H_z5mC10.js.map → AvailableEscalationsPage-BqQA3IJp.js.map} +1 -1
  50. package/dashboard/dist/assets/BotPicker-C2xR1xay.js +2 -0
  51. package/dashboard/dist/assets/{BotPicker-DcvILNUf.js.map → BotPicker-C2xR1xay.js.map} +1 -1
  52. package/dashboard/dist/assets/CollapsibleSection-CRtHQsAv.js +2 -0
  53. package/dashboard/dist/assets/{CollapsibleSection-BWPbzgEe.js.map → CollapsibleSection-CRtHQsAv.js.map} +1 -1
  54. package/dashboard/dist/assets/ConfirmDeleteModal-dOxidrSR.js +2 -0
  55. package/dashboard/dist/assets/{ConfirmDeleteModal-Cy6KVLfC.js.map → ConfirmDeleteModal-dOxidrSR.js.map} +1 -1
  56. package/dashboard/dist/assets/CopyableId-DmLF-RqZ.js +2 -0
  57. package/dashboard/dist/assets/{CopyableId-CRED8hvk.js.map → CopyableId-DmLF-RqZ.js.map} +1 -1
  58. package/dashboard/dist/assets/CredentialsPage-C7XT1bnO.js +2 -0
  59. package/dashboard/dist/assets/CredentialsPage-C7XT1bnO.js.map +1 -0
  60. package/dashboard/dist/assets/CustomDurationPicker-BABUv1V2.js +2 -0
  61. package/dashboard/dist/assets/{CustomDurationPicker-eOk2EqQ5.js.map → CustomDurationPicker-BABUv1V2.js.map} +1 -1
  62. package/dashboard/dist/assets/DataTable-D3-wSEf0.js +2 -0
  63. package/dashboard/dist/assets/{DataTable-bd2PTBJd.js.map → DataTable-D3-wSEf0.js.map} +1 -1
  64. package/dashboard/dist/assets/DropZone-DHKmMqRA.js +2 -0
  65. package/dashboard/dist/assets/DropZone-DHKmMqRA.js.map +1 -0
  66. package/dashboard/dist/assets/ElapsedCell-DrJif03B.js +2 -0
  67. package/dashboard/dist/assets/{ElapsedCell-BGo8vyus.js.map → ElapsedCell-DrJif03B.js.map} +1 -1
  68. package/dashboard/dist/assets/EmptyState-BcsfPq9T.js +2 -0
  69. package/dashboard/dist/assets/EmptyState-BcsfPq9T.js.map +1 -0
  70. package/dashboard/dist/assets/EscalationsOverview-H6CwfeR-.js +2 -0
  71. package/dashboard/dist/assets/EscalationsOverview-H6CwfeR-.js.map +1 -0
  72. package/dashboard/dist/assets/EventTable-Dh3_9DAY.js +2 -0
  73. package/dashboard/dist/assets/{EventTable-CmFhswLW.js.map → EventTable-Dh3_9DAY.js.map} +1 -1
  74. package/dashboard/dist/assets/FilterBar-Ck4K4rzu.js +2 -0
  75. package/dashboard/dist/assets/{FilterBar-BQNzsd3A.js.map → FilterBar-Ck4K4rzu.js.map} +1 -1
  76. package/dashboard/dist/assets/ListToolbar-CyEkulVR.js +2 -0
  77. package/dashboard/dist/assets/{ListToolbar-OWOn-HiC.js.map → ListToolbar-CyEkulVR.js.map} +1 -1
  78. package/dashboard/dist/assets/McpOverview-ChLa6Gl7.js +2 -0
  79. package/dashboard/dist/assets/{McpOverview-OkEzvClD.js.map → McpOverview-ChLa6Gl7.js.map} +1 -1
  80. package/dashboard/dist/assets/McpQueryDetailPage-5Dsj6PlL.js +5 -0
  81. package/dashboard/dist/assets/McpQueryDetailPage-5Dsj6PlL.js.map +1 -0
  82. package/dashboard/dist/assets/McpQueryPage-D2DmDFPu.js +2 -0
  83. package/dashboard/dist/assets/McpQueryPage-D2DmDFPu.js.map +1 -0
  84. package/dashboard/dist/assets/McpRunDetailPage-ERVuNEEK.js +2 -0
  85. package/dashboard/dist/assets/{McpRunDetailPage-DMeiG4i_.js.map → McpRunDetailPage-ERVuNEEK.js.map} +1 -1
  86. package/dashboard/dist/assets/McpRunsPage-BKba-3Wl.js +2 -0
  87. package/dashboard/dist/assets/McpRunsPage-BKba-3Wl.js.map +1 -0
  88. package/dashboard/dist/assets/Modal-DEODGeqx.js +2 -0
  89. package/dashboard/dist/assets/{Modal-Dir9Rlnx.js.map → Modal-DEODGeqx.js.map} +1 -1
  90. package/dashboard/dist/assets/OperatorDashboard-CJm_BTPU.js +2 -0
  91. package/dashboard/dist/assets/{OperatorDashboard-OqWC6Azy.js.map → OperatorDashboard-CJm_BTPU.js.map} +1 -1
  92. package/dashboard/dist/assets/PageHeader-B-SN5GZ2.js +2 -0
  93. package/dashboard/dist/assets/PageHeader-B-SN5GZ2.js.map +1 -0
  94. package/dashboard/dist/assets/PageHeaderWithStats-BZ3AGT5s.js +2 -0
  95. package/dashboard/dist/assets/PageHeaderWithStats-BZ3AGT5s.js.map +1 -0
  96. package/dashboard/dist/assets/PriorityBadge-DfQY9St9.js +2 -0
  97. package/dashboard/dist/assets/{PriorityBadge-C7D5d_HY.js.map → PriorityBadge-DfQY9St9.js.map} +1 -1
  98. package/dashboard/dist/assets/ProcessDetailPage-vfnCDyQK.js +2 -0
  99. package/dashboard/dist/assets/{ProcessDetailPage-DZIP6grw.js.map → ProcessDetailPage-vfnCDyQK.js.map} +1 -1
  100. package/dashboard/dist/assets/ProcessesListPage-DcAN6AJK.js +2 -0
  101. package/dashboard/dist/assets/ProcessesListPage-DcAN6AJK.js.map +1 -0
  102. package/dashboard/dist/assets/RolePill-BhVC0cc3.js +2 -0
  103. package/dashboard/dist/assets/{RolePill-D6nMxMvp.js.map → RolePill-BhVC0cc3.js.map} +1 -1
  104. package/dashboard/dist/assets/RolesPage-DYSt2aAr.js +2 -0
  105. package/dashboard/dist/assets/RolesPage-DYSt2aAr.js.map +1 -0
  106. package/dashboard/dist/assets/RowActions-Dg-Fsm5O.js +2 -0
  107. package/dashboard/dist/assets/{RowActions-JqgAB0p3.js.map → RowActions-Dg-Fsm5O.js.map} +1 -1
  108. package/dashboard/dist/assets/RunAsSelector-CD7_Dmb0.js +2 -0
  109. package/dashboard/dist/assets/{RunAsSelector-KAlKtitB.js.map → RunAsSelector-CD7_Dmb0.js.map} +1 -1
  110. package/dashboard/dist/assets/StatCard-DlgF0CJC.js +2 -0
  111. package/dashboard/dist/assets/{StatCard-B-WLhOaH.js.map → StatCard-DlgF0CJC.js.map} +1 -1
  112. package/dashboard/dist/assets/StatusBadge-XQlNFwmH.js +2 -0
  113. package/dashboard/dist/assets/StatusBadge-XQlNFwmH.js.map +1 -0
  114. package/dashboard/dist/assets/StepIndicator-CuUIGxKk.js +2 -0
  115. package/dashboard/dist/assets/{StepIndicator-D9Xvdf18.js.map → StepIndicator-CuUIGxKk.js.map} +1 -1
  116. package/dashboard/dist/assets/StickyPagination-F9FZsRy9.js +2 -0
  117. package/dashboard/dist/assets/{StickyPagination-CJHMzYJj.js.map → StickyPagination-F9FZsRy9.js.map} +1 -1
  118. package/dashboard/dist/assets/SwimlaneTimeline-CUl5RdXU.js +2 -0
  119. package/dashboard/dist/assets/SwimlaneTimeline-CUl5RdXU.js.map +1 -0
  120. package/dashboard/dist/assets/TagInput-DftaRHDV.js +2 -0
  121. package/dashboard/dist/assets/{TagInput-DcPnUnSJ.js.map → TagInput-DftaRHDV.js.map} +1 -1
  122. package/dashboard/dist/assets/TaskDetailPage-BoA-cfwW.js +2 -0
  123. package/dashboard/dist/assets/TaskDetailPage-BoA-cfwW.js.map +1 -0
  124. package/dashboard/dist/assets/TaskQueuePill-Ce8KlXtR.js +2 -0
  125. package/dashboard/dist/assets/TaskQueuePill-Ce8KlXtR.js.map +1 -0
  126. package/dashboard/dist/assets/TasksListPage-g6XIbhju.js +2 -0
  127. package/dashboard/dist/assets/{TasksListPage-DeewV4Gp.js.map → TasksListPage-g6XIbhju.js.map} +1 -1
  128. package/dashboard/dist/assets/TimeAgo-BihIwEbB.js +2 -0
  129. package/dashboard/dist/assets/{TimeAgo-DJZq-e4R.js.map → TimeAgo-BihIwEbB.js.map} +1 -1
  130. package/dashboard/dist/assets/TimestampCell-GOFcvE-i.js +2 -0
  131. package/dashboard/dist/assets/{TimestampCell-Dx5uwGfS.js.map → TimestampCell-GOFcvE-i.js.map} +1 -1
  132. package/dashboard/dist/assets/UserName-CmMVt4vS.js +2 -0
  133. package/dashboard/dist/assets/{UserName-CnGk7MgL.js.map → UserName-CmMVt4vS.js.map} +1 -1
  134. package/dashboard/dist/assets/WorkflowExecutionPage-soRFz_30.js +2 -0
  135. package/dashboard/dist/assets/{WorkflowExecutionPage-CPQ0fIwf.js.map → WorkflowExecutionPage-soRFz_30.js.map} +1 -1
  136. package/dashboard/dist/assets/WorkflowPill-DUDDyBsj.js +2 -0
  137. package/dashboard/dist/assets/{WorkflowPill-BrD5d1AG.js.map → WorkflowPill-DUDDyBsj.js.map} +1 -1
  138. package/dashboard/dist/assets/WorkflowsDashboard-Be1A1zAT.js +2 -0
  139. package/dashboard/dist/assets/WorkflowsDashboard-Be1A1zAT.js.map +1 -0
  140. package/dashboard/dist/assets/WorkflowsOverview-z3Ztiz1y.js +2 -0
  141. package/dashboard/dist/assets/{WorkflowsOverview-lBp2E6rN.js.map → WorkflowsOverview-z3Ztiz1y.js.map} +1 -1
  142. package/dashboard/dist/assets/YamlWorkflowsPage-C6qzcQcJ.js +2 -0
  143. package/dashboard/dist/assets/YamlWorkflowsPage-C6qzcQcJ.js.map +1 -0
  144. package/dashboard/dist/assets/{bots-fc_O_YIq.js → bots-BZPXDh_y.js} +2 -2
  145. package/dashboard/dist/assets/{bots-fc_O_YIq.js.map → bots-BZPXDh_y.js.map} +1 -1
  146. package/dashboard/dist/assets/escalation-DBUIq1Z4.js +2 -0
  147. package/dashboard/dist/assets/{escalation-BYhLYHBz.js.map → escalation-DBUIq1Z4.js.map} +1 -1
  148. package/dashboard/dist/assets/escalation-columns-DL4zsR8Y.js +2 -0
  149. package/dashboard/dist/assets/{escalation-columns-DjJyuC1g.js.map → escalation-columns-DL4zsR8Y.js.map} +1 -1
  150. package/dashboard/dist/assets/helpers-D50KFFkI.js +2 -0
  151. package/dashboard/dist/assets/{helpers-CQG3Rh2y.js.map → helpers-D50KFFkI.js.map} +1 -1
  152. package/dashboard/dist/assets/index-B-ioA6yv.js +2 -0
  153. package/dashboard/dist/assets/index-B-ioA6yv.js.map +1 -0
  154. package/dashboard/dist/assets/index-B-jzKfuv.js +2 -0
  155. package/dashboard/dist/assets/index-B-jzKfuv.js.map +1 -0
  156. package/dashboard/dist/assets/index-BMpoMc4A.js +2 -0
  157. package/dashboard/dist/assets/{index-D51PaQZY.js.map → index-BMpoMc4A.js.map} +1 -1
  158. package/dashboard/dist/assets/index-BU04qgJt.js +15 -0
  159. package/dashboard/dist/assets/index-BU04qgJt.js.map +1 -0
  160. package/dashboard/dist/assets/index-BUjxYyxc.js +63 -0
  161. package/dashboard/dist/assets/index-BUjxYyxc.js.map +1 -0
  162. package/dashboard/dist/assets/index-BpoHVMV7.js +2 -0
  163. package/dashboard/dist/assets/index-BpoHVMV7.js.map +1 -0
  164. package/dashboard/dist/assets/index-CEnDYJOO.js +2 -0
  165. package/dashboard/dist/assets/index-CEnDYJOO.js.map +1 -0
  166. package/dashboard/dist/assets/index-CbuH92vk.js +6 -0
  167. package/dashboard/dist/assets/index-CbuH92vk.js.map +1 -0
  168. package/dashboard/dist/assets/index-D9_hZmsW.js +5 -0
  169. package/dashboard/dist/assets/{index-KYpLvJKB.js.map → index-D9_hZmsW.js.map} +1 -1
  170. package/dashboard/dist/assets/index-DrouIN-M.js +2 -0
  171. package/dashboard/dist/assets/{index-DR4qQvlW.js.map → index-DrouIN-M.js.map} +1 -1
  172. package/dashboard/dist/assets/index-DzICLMI7.js +2 -0
  173. package/dashboard/dist/assets/{index-DNtXXy1o.js.map → index-DzICLMI7.js.map} +1 -1
  174. package/dashboard/dist/assets/index-efS5gKpv.css +1 -0
  175. package/dashboard/dist/assets/index-qT78AZDq.js +2 -0
  176. package/dashboard/dist/assets/index-qT78AZDq.js.map +1 -0
  177. package/dashboard/dist/assets/mcp-D0GrHRFe.js +2 -0
  178. package/dashboard/dist/assets/{mcp-D2XfRh8v.js.map → mcp-D0GrHRFe.js.map} +1 -1
  179. package/dashboard/dist/assets/{mcp-query-CIx_mIC7.js → mcp-query-DC5woQn5.js} +2 -2
  180. package/dashboard/dist/assets/{mcp-query-CIx_mIC7.js.map → mcp-query-DC5woQn5.js.map} +1 -1
  181. package/dashboard/dist/assets/{mcp-runs-C9_J4LIH.js → mcp-runs-CsoVQoPB.js} +2 -2
  182. package/dashboard/dist/assets/{mcp-runs-C9_J4LIH.js.map → mcp-runs-CsoVQoPB.js.map} +1 -1
  183. package/dashboard/dist/assets/namespaces-unpIb4gX.js +2 -0
  184. package/dashboard/dist/assets/{namespaces-BwMljx6f.js.map → namespaces-unpIb4gX.js.map} +1 -1
  185. package/dashboard/dist/assets/{roles-Bd_sTV6I.js → roles--kBaFljg.js} +2 -2
  186. package/dashboard/dist/assets/{roles-Bd_sTV6I.js.map → roles--kBaFljg.js.map} +1 -1
  187. package/dashboard/dist/assets/settings-B96YkawY.js +2 -0
  188. package/dashboard/dist/assets/{settings-BCb8eFyA.js.map → settings-B96YkawY.js.map} +1 -1
  189. package/dashboard/dist/assets/{tasks-Bq54qGGq.js → tasks-D_1NCfOZ.js} +2 -2
  190. package/dashboard/dist/assets/{tasks-Bq54qGGq.js.map → tasks-D_1NCfOZ.js.map} +1 -1
  191. package/dashboard/dist/assets/{useEventHooks-BTbGf536.js → useEventHooks-BPjEkCpD.js} +2 -2
  192. package/dashboard/dist/assets/{useEventHooks-BTbGf536.js.map → useEventHooks-BPjEkCpD.js.map} +1 -1
  193. package/dashboard/dist/assets/{useExpandedRows-Cg9iq6Vy.js → useExpandedRows-CkcEntB-.js} +2 -2
  194. package/dashboard/dist/assets/{useExpandedRows-Cg9iq6Vy.js.map → useExpandedRows-CkcEntB-.js.map} +1 -1
  195. package/dashboard/dist/assets/{useFilterParams-CGRYFw_A.js → useFilterParams-DZCAaBC7.js} +2 -2
  196. package/dashboard/dist/assets/{useFilterParams-CGRYFw_A.js.map → useFilterParams-DZCAaBC7.js.map} +1 -1
  197. package/dashboard/dist/assets/{useYamlActivityEvents-CsYP09W5.js → useYamlActivityEvents-D3RQjfzo.js} +2 -2
  198. package/dashboard/dist/assets/{useYamlActivityEvents-CsYP09W5.js.map → useYamlActivityEvents-D3RQjfzo.js.map} +1 -1
  199. package/dashboard/dist/assets/{users-BTBhafGc.js → users-e2oatvoj.js} +2 -2
  200. package/dashboard/dist/assets/{users-BTBhafGc.js.map → users-e2oatvoj.js.map} +1 -1
  201. package/dashboard/dist/assets/{vendor-icons-CWl44VA6.js → vendor-icons-BkK55L-1.js} +103 -88
  202. package/dashboard/dist/assets/vendor-icons-BkK55L-1.js.map +1 -0
  203. package/dashboard/dist/assets/vendor-query-B2UbickB.js +18 -0
  204. package/dashboard/dist/assets/vendor-query-B2UbickB.js.map +1 -0
  205. package/dashboard/dist/assets/vendor-react-CX88sFS5.js +22 -0
  206. package/dashboard/dist/assets/vendor-react-CX88sFS5.js.map +1 -0
  207. package/dashboard/dist/assets/{workflows-BkzA4ahe.js → workflows-D6diL54s.js} +2 -2
  208. package/dashboard/dist/assets/{workflows-BkzA4ahe.js.map → workflows-D6diL54s.js.map} +1 -1
  209. package/dashboard/dist/assets/{yaml-workflows-Cs0EYp0F.js → yaml-workflows-CAKU7LUu.js} +2 -2
  210. package/dashboard/dist/assets/{yaml-workflows-Cs0EYp0F.js.map → yaml-workflows-CAKU7LUu.js.map} +1 -1
  211. package/dashboard/dist/index.html +5 -5
  212. package/docs/dashboard.md +233 -65
  213. package/package.json +3 -2
  214. package/build/examples/external-mcp-server/server.d.ts +0 -17
  215. package/build/examples/external-mcp-server/server.js +0 -116
  216. package/build/examples/index.d.ts +0 -2
  217. package/build/examples/index.js +0 -7
  218. package/build/examples/seed-data.d.ts +0 -55
  219. package/build/examples/seed-data.js +0 -161
  220. package/build/examples/seed.d.ts +0 -5
  221. package/build/examples/seed.js +0 -132
  222. package/build/examples/types/envelopes.d.ts +0 -69
  223. package/build/examples/types/envelopes.js +0 -8
  224. package/build/examples/types/index.d.ts +0 -10
  225. package/build/examples/types/index.js +0 -9
  226. package/build/examples/types/resolvers.d.ts +0 -27
  227. package/build/examples/types/resolvers.js +0 -9
  228. package/build/examples/workers.d.ts +0 -10
  229. package/build/examples/workers.js +0 -59
  230. package/build/examples/workflows/assembly-line/activities.d.ts +0 -28
  231. package/build/examples/workflows/assembly-line/activities.js +0 -53
  232. package/build/examples/workflows/assembly-line/index.d.ts +0 -17
  233. package/build/examples/workflows/assembly-line/index.js +0 -60
  234. package/build/examples/workflows/assembly-line/iterator.d.ts +0 -12
  235. package/build/examples/workflows/assembly-line/iterator.js +0 -54
  236. package/build/examples/workflows/assembly-line/reverter.d.ts +0 -18
  237. package/build/examples/workflows/assembly-line/reverter.js +0 -89
  238. package/build/examples/workflows/assembly-line/types.d.ts +0 -25
  239. package/build/examples/workflows/assembly-line/types.js +0 -8
  240. package/build/examples/workflows/assembly-line/worker.d.ts +0 -13
  241. package/build/examples/workflows/assembly-line/worker.js +0 -81
  242. package/build/examples/workflows/basic-echo/activities.d.ts +0 -20
  243. package/build/examples/workflows/basic-echo/activities.js +0 -55
  244. package/build/examples/workflows/basic-echo/index.d.ts +0 -14
  245. package/build/examples/workflows/basic-echo/index.js +0 -66
  246. package/build/examples/workflows/basic-signal/activities.d.ts +0 -17
  247. package/build/examples/workflows/basic-signal/activities.js +0 -18
  248. package/build/examples/workflows/basic-signal/index.d.ts +0 -17
  249. package/build/examples/workflows/basic-signal/index.js +0 -116
  250. package/build/examples/workflows/kitchen-sink/activities.d.ts +0 -40
  251. package/build/examples/workflows/kitchen-sink/activities.js +0 -46
  252. package/build/examples/workflows/kitchen-sink/index.d.ts +0 -22
  253. package/build/examples/workflows/kitchen-sink/index.js +0 -123
  254. package/build/examples/workflows/review-content/activities.d.ts +0 -10
  255. package/build/examples/workflows/review-content/activities.js +0 -44
  256. package/build/examples/workflows/review-content/index.d.ts +0 -10
  257. package/build/examples/workflows/review-content/index.js +0 -95
  258. package/build/examples/workflows/review-content/types.d.ts +0 -28
  259. package/build/examples/workflows/review-content/types.js +0 -2
  260. package/build/lib/db/schemas/schemas/001_schema.sql +0 -485
  261. package/build/lib/db/schemas/schemas/002_seed.sql +0 -92
  262. package/build/system/seed/server-definitions.d.ts +0 -3210
  263. package/build/system/seed/server-definitions.js +0 -232
  264. package/dashboard/dist/assets/AdminDashboard-Bprul9Eb.js +0 -2
  265. package/dashboard/dist/assets/AvailableEscalationsPage-H_z5mC10.js +0 -2
  266. package/dashboard/dist/assets/BotPicker-DcvILNUf.js +0 -2
  267. package/dashboard/dist/assets/CollapsibleSection-BWPbzgEe.js +0 -2
  268. package/dashboard/dist/assets/ConfirmDeleteModal-Cy6KVLfC.js +0 -2
  269. package/dashboard/dist/assets/CopyableId-CRED8hvk.js +0 -2
  270. package/dashboard/dist/assets/CredentialsPage-BUdvxiE3.js +0 -2
  271. package/dashboard/dist/assets/CredentialsPage-BUdvxiE3.js.map +0 -1
  272. package/dashboard/dist/assets/CustomDurationPicker-eOk2EqQ5.js +0 -2
  273. package/dashboard/dist/assets/DataTable-bd2PTBJd.js +0 -2
  274. package/dashboard/dist/assets/ElapsedCell-BGo8vyus.js +0 -2
  275. package/dashboard/dist/assets/EmptyState-BygtU-Rh.js +0 -2
  276. package/dashboard/dist/assets/EmptyState-BygtU-Rh.js.map +0 -1
  277. package/dashboard/dist/assets/EscalationsOverview-DUEcN5MP.js +0 -2
  278. package/dashboard/dist/assets/EscalationsOverview-DUEcN5MP.js.map +0 -1
  279. package/dashboard/dist/assets/EventTable-CmFhswLW.js +0 -2
  280. package/dashboard/dist/assets/FilterBar-BQNzsd3A.js +0 -2
  281. package/dashboard/dist/assets/ListToolbar-OWOn-HiC.js +0 -2
  282. package/dashboard/dist/assets/McpOverview-OkEzvClD.js +0 -2
  283. package/dashboard/dist/assets/McpQueryDetailPage-C6Ih5sC_.js +0 -5
  284. package/dashboard/dist/assets/McpQueryDetailPage-C6Ih5sC_.js.map +0 -1
  285. package/dashboard/dist/assets/McpQueryPage-BAuOf5TL.js +0 -2
  286. package/dashboard/dist/assets/McpQueryPage-BAuOf5TL.js.map +0 -1
  287. package/dashboard/dist/assets/McpRunDetailPage-DMeiG4i_.js +0 -2
  288. package/dashboard/dist/assets/McpRunsPage-CG3cNJh8.js +0 -2
  289. package/dashboard/dist/assets/McpRunsPage-CG3cNJh8.js.map +0 -1
  290. package/dashboard/dist/assets/Modal-Dir9Rlnx.js +0 -2
  291. package/dashboard/dist/assets/OperatorDashboard-OqWC6Azy.js +0 -2
  292. package/dashboard/dist/assets/PageHeader-FJIemmrC.js +0 -2
  293. package/dashboard/dist/assets/PageHeader-FJIemmrC.js.map +0 -1
  294. package/dashboard/dist/assets/PageHeaderWithStats-Br5y9qNO.js +0 -2
  295. package/dashboard/dist/assets/PageHeaderWithStats-Br5y9qNO.js.map +0 -1
  296. package/dashboard/dist/assets/PriorityBadge-C7D5d_HY.js +0 -2
  297. package/dashboard/dist/assets/ProcessDetailPage-DZIP6grw.js +0 -2
  298. package/dashboard/dist/assets/ProcessesListPage-BQoPYkeB.js +0 -2
  299. package/dashboard/dist/assets/ProcessesListPage-BQoPYkeB.js.map +0 -1
  300. package/dashboard/dist/assets/RolePill-D6nMxMvp.js +0 -2
  301. package/dashboard/dist/assets/RolesPage-CwLnJFhy.js +0 -2
  302. package/dashboard/dist/assets/RolesPage-CwLnJFhy.js.map +0 -1
  303. package/dashboard/dist/assets/RowActions-JqgAB0p3.js +0 -2
  304. package/dashboard/dist/assets/RunAsSelector-KAlKtitB.js +0 -2
  305. package/dashboard/dist/assets/StatCard-B-WLhOaH.js +0 -2
  306. package/dashboard/dist/assets/StatusBadge-DVCf2ncM.js +0 -2
  307. package/dashboard/dist/assets/StatusBadge-DVCf2ncM.js.map +0 -1
  308. package/dashboard/dist/assets/StepIndicator-D9Xvdf18.js +0 -2
  309. package/dashboard/dist/assets/StickyPagination-CJHMzYJj.js +0 -2
  310. package/dashboard/dist/assets/SwimlaneTimeline-YiXPDyEL.js +0 -2
  311. package/dashboard/dist/assets/SwimlaneTimeline-YiXPDyEL.js.map +0 -1
  312. package/dashboard/dist/assets/TagInput-DcPnUnSJ.js +0 -2
  313. package/dashboard/dist/assets/TaskDetailPage-DftmYWD7.js +0 -2
  314. package/dashboard/dist/assets/TaskDetailPage-DftmYWD7.js.map +0 -1
  315. package/dashboard/dist/assets/TaskQueuePill-BzduBqwy.js +0 -2
  316. package/dashboard/dist/assets/TaskQueuePill-BzduBqwy.js.map +0 -1
  317. package/dashboard/dist/assets/TasksListPage-DeewV4Gp.js +0 -2
  318. package/dashboard/dist/assets/TimeAgo-DJZq-e4R.js +0 -2
  319. package/dashboard/dist/assets/TimestampCell-Dx5uwGfS.js +0 -2
  320. package/dashboard/dist/assets/UserName-CnGk7MgL.js +0 -2
  321. package/dashboard/dist/assets/WorkflowExecutionPage-CPQ0fIwf.js +0 -2
  322. package/dashboard/dist/assets/WorkflowPill-BrD5d1AG.js +0 -2
  323. package/dashboard/dist/assets/WorkflowsDashboard-BzjhABZP.js +0 -2
  324. package/dashboard/dist/assets/WorkflowsDashboard-BzjhABZP.js.map +0 -1
  325. package/dashboard/dist/assets/WorkflowsOverview-lBp2E6rN.js +0 -2
  326. package/dashboard/dist/assets/YamlWorkflowsPage-C_MkAp2i.js +0 -2
  327. package/dashboard/dist/assets/YamlWorkflowsPage-C_MkAp2i.js.map +0 -1
  328. package/dashboard/dist/assets/escalation-BYhLYHBz.js +0 -2
  329. package/dashboard/dist/assets/escalation-columns-DjJyuC1g.js +0 -2
  330. package/dashboard/dist/assets/helpers-CQG3Rh2y.js +0 -2
  331. package/dashboard/dist/assets/index-2nBhR7Dg.js +0 -2
  332. package/dashboard/dist/assets/index-2nBhR7Dg.js.map +0 -1
  333. package/dashboard/dist/assets/index-4IUoh_hd.js +0 -2
  334. package/dashboard/dist/assets/index-4IUoh_hd.js.map +0 -1
  335. package/dashboard/dist/assets/index-B2CqPzLK.js +0 -2
  336. package/dashboard/dist/assets/index-B2CqPzLK.js.map +0 -1
  337. package/dashboard/dist/assets/index-B78xalb4.js +0 -2
  338. package/dashboard/dist/assets/index-B78xalb4.js.map +0 -1
  339. package/dashboard/dist/assets/index-BI8r69O_.js +0 -2
  340. package/dashboard/dist/assets/index-BI8r69O_.js.map +0 -1
  341. package/dashboard/dist/assets/index-C5TUqJu0.css +0 -1
  342. package/dashboard/dist/assets/index-CUqCBBZG.js +0 -6
  343. package/dashboard/dist/assets/index-CUqCBBZG.js.map +0 -1
  344. package/dashboard/dist/assets/index-D51PaQZY.js +0 -2
  345. package/dashboard/dist/assets/index-DNtXXy1o.js +0 -2
  346. package/dashboard/dist/assets/index-DR4qQvlW.js +0 -2
  347. package/dashboard/dist/assets/index-Dh0PCbR-.js +0 -15
  348. package/dashboard/dist/assets/index-Dh0PCbR-.js.map +0 -1
  349. package/dashboard/dist/assets/index-KYpLvJKB.js +0 -5
  350. package/dashboard/dist/assets/index-sNrqYt0Q.js +0 -281
  351. package/dashboard/dist/assets/index-sNrqYt0Q.js.map +0 -1
  352. package/dashboard/dist/assets/mcp-D2XfRh8v.js +0 -2
  353. package/dashboard/dist/assets/namespaces-BwMljx6f.js +0 -2
  354. package/dashboard/dist/assets/settings-BCb8eFyA.js +0 -2
  355. package/dashboard/dist/assets/vendor-icons-CWl44VA6.js.map +0 -1
  356. package/dashboard/dist/assets/vendor-query-DLp59M9_.js +0 -35
  357. package/dashboard/dist/assets/vendor-query-DLp59M9_.js.map +0 -1
  358. package/dashboard/dist/assets/vendor-react-Co3Y8ikm.js +0 -26
  359. 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 {
@@ -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,
package/build/index.d.ts CHANGED
@@ -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;
@@ -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);
@@ -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>;
@@ -2,8 +2,10 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.upsertWorkflowConfig = upsertWorkflowConfig;
4
4
  exports.deleteWorkflowConfig = deleteWorkflowConfig;
5
+ exports.seedWorkflowConfig = seedWorkflowConfig;
5
6
  const db_1 = require("../../lib/db");
6
7
  const read_1 = require("./read");
8
+ const logger_1 = require("../../lib/logger");
7
9
  const sql_1 = require("./sql");
8
10
  async function upsertWorkflowConfig(config) {
9
11
  const pool = (0, db_1.getPool)();
@@ -59,3 +61,65 @@ async function deleteWorkflowConfig(workflowType) {
59
61
  const { rowCount } = await pool.query(sql_1.DELETE_WORKFLOW, [workflowType]);
60
62
  return (rowCount ?? 0) > 0;
61
63
  }
64
+ /**
65
+ * Seed a workflow config at startup (insert-if-absent).
66
+ * DB is the source of truth — if the row already exists, log drift warnings
67
+ * but do not overwrite. Returns true if inserted, false if already existed.
68
+ */
69
+ async function seedWorkflowConfig(config) {
70
+ const pool = (0, db_1.getPool)();
71
+ // Ensure referenced roles exist
72
+ const allRoles = new Set([
73
+ config.default_role,
74
+ ...config.roles,
75
+ ...config.invocation_roles,
76
+ ]);
77
+ for (const role of allRoles) {
78
+ await pool.query(sql_1.ENSURE_ROLE_EXISTS, [role]);
79
+ }
80
+ // Insert-if-absent
81
+ const { rowCount } = await pool.query(sql_1.SEED_WORKFLOW_CONFIG, [
82
+ config.workflow_type,
83
+ config.invocable,
84
+ config.task_queue,
85
+ config.default_role,
86
+ config.description,
87
+ config.consumes,
88
+ config.envelope_schema ?? null,
89
+ config.resolver_schema ?? null,
90
+ config.cron_schedule ?? null,
91
+ config.tool_tags || [],
92
+ config.execute_as ?? null,
93
+ ]);
94
+ const inserted = (rowCount ?? 0) > 0;
95
+ if (inserted) {
96
+ // Seed roles (also insert-if-absent)
97
+ for (const role of config.roles) {
98
+ await pool.query(sql_1.SEED_CONFIG_ROLE, [config.workflow_type, role]);
99
+ }
100
+ for (const role of config.invocation_roles) {
101
+ await pool.query(sql_1.SEED_INVOCATION_ROLE, [config.workflow_type, role]);
102
+ }
103
+ }
104
+ else {
105
+ // Drift detection — compare key fields
106
+ const existing = await (0, read_1.getWorkflowConfig)(config.workflow_type);
107
+ if (existing) {
108
+ const drifts = [];
109
+ if (config.description && existing.description !== config.description)
110
+ drifts.push('description');
111
+ if (config.invocable !== existing.invocable)
112
+ drifts.push('invocable');
113
+ if (config.default_role !== existing.default_role)
114
+ drifts.push('default_role');
115
+ if (JSON.stringify(config.envelope_schema) !== JSON.stringify(existing.envelope_schema))
116
+ drifts.push('envelope_schema');
117
+ if (JSON.stringify(config.resolver_schema) !== JSON.stringify(existing.resolver_schema))
118
+ drifts.push('resolver_schema');
119
+ if (drifts.length) {
120
+ logger_1.loggerRegistry.warn(`[long-tail] config drift: ${config.workflow_type} — ${drifts.join(', ')} differ between code and DB`);
121
+ }
122
+ }
123
+ }
124
+ return inserted;
125
+ }
@@ -1,5 +1,10 @@
1
1
  import type { LTWorkflowConfig } from '../../types';
2
2
  import type { LTYamlWorkflowRecord } from '../../types/yaml-workflow';
3
+ /**
4
+ * Validate a cron expression and enforce a minimum interval.
5
+ * Throws if the expression is invalid or fires more often than once per minute.
6
+ */
7
+ export declare function validateCronSchedule(expr: string): void;
3
8
  /**
4
9
  * Singleton registry for workflow cron schedules.
5
10
  *
@@ -34,12 +34,34 @@ var __importStar = (this && this.__importStar) || (function () {
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.cronRegistry = void 0;
37
+ exports.validateCronSchedule = validateCronSchedule;
37
38
  const hotmesh_1 = require("@hotmeshio/hotmesh");
39
+ const cron_parser_1 = require("cron-parser");
38
40
  const db_1 = require("../../lib/db");
39
41
  const defaults_1 = require("../../modules/defaults");
40
42
  const logger_1 = require("../../lib/logger");
41
43
  const configService = __importStar(require("../config"));
42
44
  const principal_1 = require("../iam/principal");
45
+ const MIN_CRON_INTERVAL_MS = 60_000; // 1 minute minimum
46
+ /**
47
+ * Validate a cron expression and enforce a minimum interval.
48
+ * Throws if the expression is invalid or fires more often than once per minute.
49
+ */
50
+ function validateCronSchedule(expr) {
51
+ let interval;
52
+ try {
53
+ interval = (0, cron_parser_1.parseExpression)(expr, { utc: true });
54
+ }
55
+ catch {
56
+ throw new Error(`Invalid cron expression: "${expr}"`);
57
+ }
58
+ const first = interval.next().toDate().getTime();
59
+ const second = interval.next().toDate().getTime();
60
+ const gap = second - first;
61
+ if (gap < MIN_CRON_INTERVAL_MS) {
62
+ throw new Error(`Cron interval too frequent: "${expr}" fires every ${Math.round(gap / 1000)}s (minimum is 60s)`);
63
+ }
64
+ }
43
65
  const CRON_TOPIC_PREFIX = 'lt.cron';
44
66
  const CRON_ID_PREFIX = 'lt-cron';
45
67
  const YAML_CRON_TOPIC_PREFIX = 'lt.cron.yaml';
@@ -86,6 +108,7 @@ class LTCronRegistry {
86
108
  async startCron(config) {
87
109
  if (!config.cron_schedule || !config.task_queue)
88
110
  return;
111
+ validateCronSchedule(config.cron_schedule);
89
112
  const connection = (0, db_1.getConnection)();
90
113
  const topic = `${CRON_TOPIC_PREFIX}.${config.workflow_type}`;
91
114
  const cronId = `${CRON_ID_PREFIX}-${config.workflow_type}`;
@@ -96,6 +119,11 @@ class LTCronRegistry {
96
119
  if (!defaultEnvelope.metadata)
97
120
  defaultEnvelope.metadata = {};
98
121
  defaultEnvelope.metadata.source = 'cron';
122
+ // Auto-certify if the workflow config has roles or consumes
123
+ const isCertified = (config.roles?.length ?? 0) > 0 || (config.consumes?.length ?? 0) > 0;
124
+ if (isCertified) {
125
+ defaultEnvelope.metadata.certified = true;
126
+ }
99
127
  // Resolve executing principal: per-config execute_as, or system bot fallback
100
128
  if (!defaultEnvelope.lt)
101
129
  defaultEnvelope.lt = {};
@@ -129,6 +157,7 @@ class LTCronRegistry {
129
157
  workflowId,
130
158
  expire: defaults_1.JOB_EXPIRE_SECS,
131
159
  entity: workflowType,
160
+ signalIn: false,
132
161
  });
133
162
  }
134
163
  catch (err) {
@@ -195,6 +224,7 @@ class LTCronRegistry {
195
224
  async startYamlCron(wf) {
196
225
  if (!wf.cron_schedule)
197
226
  return;
227
+ validateCronSchedule(wf.cron_schedule);
198
228
  const connection = (0, db_1.getConnection)();
199
229
  const topic = `${YAML_CRON_TOPIC_PREFIX}.${wf.id}`;
200
230
  const cronId = `${YAML_CRON_ID_PREFIX}-${wf.id}`;
@@ -34,6 +34,7 @@ async function startMcpQuery(input) {
34
34
  workflowId,
35
35
  expire: defaults_1.JOB_EXPIRE_SECS,
36
36
  entity,
37
+ signalIn: false,
37
38
  });
38
39
  if (wait === false) {
39
40
  return { workflow_id: workflowId, status: 'started', prompt };
@@ -63,6 +64,7 @@ async function startWorkflowBuilder(input) {
63
64
  workflowId,
64
65
  expire: defaults_1.JOB_EXPIRE_SECS,
65
66
  entity: 'mcpWorkflowBuilder',
67
+ signalIn: false,
66
68
  });
67
69
  if (wait === false) {
68
70
  return { workflow_id: workflowId, status: 'started', prompt };
@@ -92,6 +94,7 @@ async function startWorkflowPlanner(input) {
92
94
  workflowId,
93
95
  expire: defaults_1.JOB_EXPIRE_SECS,
94
96
  entity: 'mcpWorkflowPlanner',
97
+ signalIn: false,
95
98
  });
96
99
  if (wait === false) {
97
100
  return { workflow_id: workflowId, status: 'started', prompt: specification.slice(0, 200) };
@@ -18,6 +18,7 @@ export declare function ltCreateTask(input: {
18
18
  initiatedBy?: string;
19
19
  principalType?: string;
20
20
  executingAs?: string;
21
+ status?: string;
21
22
  }): Promise<string>;
22
23
  /**
23
24
  * Mark a task as in_progress.
@@ -79,6 +79,7 @@ async function ltCreateTask(input) {
79
79
  initiated_by: initiatedByUuid,
80
80
  principal_type: input.principalType,
81
81
  executing_as: input.executingAs,
82
+ status: input.status,
82
83
  });
83
84
  (0, publish_1.publishTaskEvent)({
84
85
  type: 'task.created',
@@ -88,7 +89,7 @@ async function ltCreateTask(input) {
88
89
  taskQueue: input.taskQueue || 'unknown',
89
90
  taskId: task.id,
90
91
  originId: input.originId,
91
- status: 'pending',
92
+ status: input.status || 'pending',
92
93
  });
93
94
  return task.id;
94
95
  }
@@ -35,6 +35,7 @@ async function ltStartWorkflow(input) {
35
35
  taskQueue: input.taskQueue,
36
36
  workflowId: input.workflowId,
37
37
  expire: input.expire ?? defaults_1.JOB_EXPIRE_SECS,
38
+ signalIn: false,
38
39
  });
39
40
  logger_1.loggerRegistry.info(`[ltStartWorkflow] started ${input.workflowName} (${input.workflowId})`);
40
41
  }
@@ -99,10 +99,10 @@ function createLTInterceptor(options) {
99
99
  retry: { maximumAttempts: 3 },
100
100
  });
101
101
  const envelope = (0, state_1.extractEnvelope)(ctx);
102
- // 2. Fast path: envelope.metadata.certified === false skips the DB
103
- // lookup entirely. Use this for configured (non-certified) workflows
104
- // that manage their own escalation lifecycle via conditionLT.
105
- if (envelope?.metadata?.certified === false) {
102
+ // 2. Fast path: certification is opt-in. Only workflows with
103
+ // metadata.certified === true pay for the config lookup,
104
+ // task creation, and escalation wiring.
105
+ if (envelope?.metadata?.certified !== true) {
106
106
  const toolCtx = (0, envelope_1.buildToolContextFromEnvelope)(envelope, wf.workflowId, wf.workflowTrace, wf.workflowSpan);
107
107
  return toolCtx ? (0, context_2.runWithToolContext)(toolCtx, next) : next();
108
108
  }
@@ -120,8 +120,8 @@ async function ensureTaskWithRouting(activities, wf, envelope, existingTask, tas
120
120
  spanId: wf.workflowSpan,
121
121
  initiatedBy: envelope?.lt?.initiatedBy ?? envelope?.lt?.userId,
122
122
  executingAs: envelope?.lt?.initiatedBy ? envelope?.lt?.userId : undefined,
123
+ status: 'in_progress',
123
124
  });
124
- await activities.ltStartTask(taskId);
125
125
  }
126
126
  else if (existingTask?.status === 'pending') {
127
127
  await activities.ltStartTask(taskId);
@@ -24,3 +24,20 @@ export declare function getAutoConnectServers(): Promise<LTMcpServerRecord[]>;
24
24
  * @param match - 'any' (OR — server has at least one tag) or 'all' (AND — server has all tags)
25
25
  */
26
26
  export declare function findServersByTags(tags: string[], match?: 'any' | 'all'): Promise<LTMcpServerRecord[]>;
27
+ /**
28
+ * Seed an MCP server at startup (insert-if-absent).
29
+ * DB is the source of truth — if the row already exists, log drift warnings
30
+ * but do not overwrite. Returns true if inserted, false if already existed.
31
+ */
32
+ export declare function seedMcpServer(input: {
33
+ name: string;
34
+ description?: string;
35
+ tags?: string[];
36
+ compileHints?: string;
37
+ credentialProviders?: string[];
38
+ toolManifest?: any[];
39
+ }): Promise<boolean>;
40
+ /**
41
+ * Remove builtin MCP servers that are no longer declared in factory config.
42
+ */
43
+ export declare function cleanStaleBuiltinServers(activeNames: string[]): Promise<void>;