@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
@@ -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>;
@@ -9,7 +9,10 @@ exports.updateMcpServerStatus = updateMcpServerStatus;
9
9
  exports.listMcpServers = listMcpServers;
10
10
  exports.getAutoConnectServers = getAutoConnectServers;
11
11
  exports.findServersByTags = findServersByTags;
12
+ exports.seedMcpServer = seedMcpServer;
13
+ exports.cleanStaleBuiltinServers = cleanStaleBuiltinServers;
12
14
  const db_1 = require("../../lib/db");
15
+ const logger_1 = require("../../lib/logger");
13
16
  const sql_1 = require("./sql");
14
17
  async function createMcpServer(input) {
15
18
  const pool = (0, db_1.getPool)();
@@ -149,3 +152,50 @@ async function findServersByTags(tags, match = 'any') {
149
152
  const { rows } = await pool.query(`SELECT * FROM lt_mcp_servers WHERE tags ${operator} $1::text[] ORDER BY name`, [tags]);
150
153
  return rows;
151
154
  }
155
+ /**
156
+ * Seed an MCP server at startup (insert-if-absent).
157
+ * DB is the source of truth — if the row already exists, log drift warnings
158
+ * but do not overwrite. Returns true if inserted, false if already existed.
159
+ */
160
+ async function seedMcpServer(input) {
161
+ const pool = (0, db_1.getPool)();
162
+ const { rowCount } = await pool.query(sql_1.SEED_MCP_SERVER, [
163
+ input.name,
164
+ input.description || null,
165
+ 'stdio',
166
+ JSON.stringify({ builtin: true, process: 'in-memory' }),
167
+ JSON.stringify(input.toolManifest || []),
168
+ JSON.stringify({ builtin: true }),
169
+ input.tags || [],
170
+ input.compileHints || null,
171
+ input.credentialProviders || [],
172
+ ]);
173
+ const inserted = (rowCount ?? 0) > 0;
174
+ if (!inserted) {
175
+ // Drift detection
176
+ const existing = await getMcpServerByName(input.name);
177
+ if (existing) {
178
+ const drifts = [];
179
+ if (input.description && existing.description !== input.description)
180
+ drifts.push('description');
181
+ if (input.compileHints && existing.compile_hints !== input.compileHints)
182
+ drifts.push('compile_hints');
183
+ if (JSON.stringify(input.tags || []) !== JSON.stringify(existing.tags || []))
184
+ drifts.push('tags');
185
+ if (drifts.length) {
186
+ logger_1.loggerRegistry.warn(`[long-tail] MCP server drift: ${input.name} — ${drifts.join(', ')} differ between code and DB`);
187
+ }
188
+ }
189
+ }
190
+ return inserted;
191
+ }
192
+ /**
193
+ * Remove builtin MCP servers that are no longer declared in factory config.
194
+ */
195
+ async function cleanStaleBuiltinServers(activeNames) {
196
+ const pool = (0, db_1.getPool)();
197
+ const { rows } = await pool.query(sql_1.DELETE_STALE_BUILTIN_SERVERS, [activeNames]);
198
+ for (const row of rows) {
199
+ logger_1.loggerRegistry.info(`[long-tail] removed stale builtin MCP server: ${row.name}`);
200
+ }
201
+ }
@@ -15,4 +15,7 @@ export declare const HEALTH_COMPILED_WORKFLOWS = "\n SELECT\n COUNT(*)::int
15
15
  export declare const HEALTH_WORKFLOW_CONFIGS = "\n SELECT workflow_type, task_queue, description\n FROM lt_config_workflows ORDER BY workflow_type";
16
16
  export declare const HEALTH_DURABLE_WORKFLOWS = "\n SELECT\n COALESCE(entity, '_internal') AS entity,\n COUNT(*)::int AS total,\n COUNT(*) FILTER (WHERE status = 0)::int AS active,\n COUNT(*) FILTER (WHERE status = 1)::int AS completed\n FROM durable.jobs\n WHERE entity IS NOT NULL AND entity != ''\n GROUP BY entity\n ORDER BY entity";
17
17
  export declare const DELETE_STALE_BUILTIN_SERVERS = "\n DELETE FROM lt_mcp_servers\n WHERE (metadata->>'builtin')::boolean = true\n AND name != ALL($1)\n RETURNING name";
18
- export declare const SEED_MCP_SERVER = "\n INSERT INTO lt_mcp_servers\n (name, description, transport_type, transport_config, auto_connect, status, tool_manifest, metadata, tags, compile_hints, credential_providers, last_connected_at)\n VALUES ($1, $2, $3, $4, true, 'connected', $5, $6, $7, $8, $9, NOW())\n ON CONFLICT (name) DO UPDATE SET\n tool_manifest = EXCLUDED.tool_manifest,\n metadata = EXCLUDED.metadata,\n description = EXCLUDED.description,\n tags = EXCLUDED.tags,\n compile_hints = EXCLUDED.compile_hints,\n credential_providers = EXCLUDED.credential_providers,\n status = 'connected',\n last_connected_at = NOW()";
18
+ /** Upsert used by dashboard/API writes (overwrites intentionally). */
19
+ export declare const UPSERT_MCP_SERVER = "\n INSERT INTO lt_mcp_servers\n (name, description, transport_type, transport_config, auto_connect, status, tool_manifest, metadata, tags, compile_hints, credential_providers, last_connected_at)\n VALUES ($1, $2, $3, $4, true, 'connected', $5, $6, $7, $8, $9, NOW())\n ON CONFLICT (name) DO UPDATE SET\n tool_manifest = EXCLUDED.tool_manifest,\n metadata = EXCLUDED.metadata,\n description = EXCLUDED.description,\n tags = EXCLUDED.tags,\n compile_hints = EXCLUDED.compile_hints,\n credential_providers = EXCLUDED.credential_providers,\n status = 'connected',\n last_connected_at = NOW()";
20
+ /** Seed — insert-if-absent. DB is source of truth after first boot. */
21
+ export declare const SEED_MCP_SERVER = "\n INSERT INTO lt_mcp_servers\n (name, description, transport_type, transport_config, auto_connect, status, tool_manifest, metadata, tags, compile_hints, credential_providers, last_connected_at)\n VALUES ($1, $2, $3, $4, true, 'connected', $5, $6, $7, $8, $9, NOW())\n ON CONFLICT (name) DO NOTHING";
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  // ─── MCP server CRUD ────────────────────────────────────────────────────────
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.SEED_MCP_SERVER = exports.DELETE_STALE_BUILTIN_SERVERS = exports.HEALTH_DURABLE_WORKFLOWS = exports.HEALTH_WORKFLOW_CONFIGS = exports.HEALTH_COMPILED_WORKFLOWS = exports.HEALTH_MCP_SERVER_LIST = exports.HEALTH_MCP_SERVERS = exports.HEALTH_RECENT_ACTIVITY = exports.HEALTH_ACTIVE_WORKFLOW_TYPES = exports.HEALTH_ESCALATION_COUNTS = exports.HEALTH_TASK_COUNTS = exports.GET_AUTO_CONNECT_SERVERS = exports.UPDATE_STATUS = exports.UPDATE_STATUS_CONNECTED = exports.DELETE_MCP_SERVER = exports.GET_MCP_SERVER_BY_NAME = exports.GET_MCP_SERVER = exports.CREATE_MCP_SERVER = void 0;
4
+ exports.SEED_MCP_SERVER = exports.UPSERT_MCP_SERVER = exports.DELETE_STALE_BUILTIN_SERVERS = exports.HEALTH_DURABLE_WORKFLOWS = exports.HEALTH_WORKFLOW_CONFIGS = exports.HEALTH_COMPILED_WORKFLOWS = exports.HEALTH_MCP_SERVER_LIST = exports.HEALTH_MCP_SERVERS = exports.HEALTH_RECENT_ACTIVITY = exports.HEALTH_ACTIVE_WORKFLOW_TYPES = exports.HEALTH_ESCALATION_COUNTS = exports.HEALTH_TASK_COUNTS = exports.GET_AUTO_CONNECT_SERVERS = exports.UPDATE_STATUS = exports.UPDATE_STATUS_CONNECTED = exports.DELETE_MCP_SERVER = exports.GET_MCP_SERVER_BY_NAME = exports.GET_MCP_SERVER = exports.CREATE_MCP_SERVER = void 0;
5
5
  exports.CREATE_MCP_SERVER = `
6
6
  INSERT INTO lt_mcp_servers
7
7
  (name, description, transport_type, transport_config, auto_connect, metadata, tags, compile_hints, credential_providers)
@@ -77,7 +77,8 @@ exports.DELETE_STALE_BUILTIN_SERVERS = `
77
77
  WHERE (metadata->>'builtin')::boolean = true
78
78
  AND name != ALL($1)
79
79
  RETURNING name`;
80
- exports.SEED_MCP_SERVER = `
80
+ /** Upsert — used by dashboard/API writes (overwrites intentionally). */
81
+ exports.UPSERT_MCP_SERVER = `
81
82
  INSERT INTO lt_mcp_servers
82
83
  (name, description, transport_type, transport_config, auto_connect, status, tool_manifest, metadata, tags, compile_hints, credential_providers, last_connected_at)
83
84
  VALUES ($1, $2, $3, $4, true, 'connected', $5, $6, $7, $8, $9, NOW())
@@ -90,3 +91,9 @@ exports.SEED_MCP_SERVER = `
90
91
  credential_providers = EXCLUDED.credential_providers,
91
92
  status = 'connected',
92
93
  last_connected_at = NOW()`;
94
+ /** Seed — insert-if-absent. DB is source of truth after first boot. */
95
+ exports.SEED_MCP_SERVER = `
96
+ INSERT INTO lt_mcp_servers
97
+ (name, description, transport_type, transport_config, auto_connect, status, tool_manifest, metadata, tags, compile_hints, credential_providers, last_connected_at)
98
+ VALUES ($1, $2, $3, $4, true, 'connected', $5, $6, $7, $8, $9, NOW())
99
+ ON CONFLICT (name) DO NOTHING`;
@@ -57,11 +57,14 @@ function initializeOAuth(config) {
57
57
  }
58
58
  }
59
59
  // Auto-detect providers from environment variables
60
+ const port = process.env.PORT || '3000';
61
+ const baseUrl = process.env.BASE_URL || `http://localhost:${port}`;
60
62
  for (const { provider, idVar, secretVar } of ENV_PROVIDERS) {
61
63
  const clientId = process.env[idVar];
62
64
  const clientSecret = process.env[secretVar];
63
65
  if (clientId && clientSecret && !(0, providers_1.getProvider)(provider)) {
64
- (0, providers_1.registerProvider)({ provider, clientId, clientSecret, scopes: [] });
66
+ const redirectUri = `${baseUrl}/api/auth/oauth/${provider}/callback`;
67
+ (0, providers_1.registerProvider)({ provider, clientId, clientSecret, scopes: [], redirectUri });
65
68
  }
66
69
  }
67
70
  // Register built-in credential providers (API key paste flow, no real OAuth)
@@ -48,8 +48,13 @@ function createGoogleHandler(cfg) {
48
48
  config: cfg,
49
49
  async createAuthorizationURL(state, codeVerifier) {
50
50
  const google = await getClient();
51
- const scopes = cfg.scopes.length > 0 ? cfg.scopes : ['openid', 'email', 'profile'];
52
- return google.createAuthorizationURL(state, codeVerifier, scopes);
51
+ const scopes = cfg.scopes.length > 0
52
+ ? cfg.scopes
53
+ : ['openid', 'email', 'profile', 'https://www.googleapis.com/auth/gmail.readonly'];
54
+ const url = google.createAuthorizationURL(state, codeVerifier, scopes);
55
+ url.searchParams.set('access_type', 'offline');
56
+ url.searchParams.set('prompt', 'consent');
57
+ return url;
53
58
  },
54
59
  async validateAuthorizationCode(code, codeVerifier) {
55
60
  const google = await getClient();
@@ -131,6 +131,10 @@ async function executeLT(options) {
131
131
  if (envelope) {
132
132
  const userId = envelope.lt?.userId || orchCtx?.userId;
133
133
  envelope.lt = { ...envelope.lt, taskId, originId, parentId, userId };
134
+ // Propagate certified flag from parent to child
135
+ if (envelope0?.metadata?.certified === true && envelope.metadata) {
136
+ envelope.metadata.certified = true;
137
+ }
134
138
  }
135
139
  // 5. Start child workflow (fire-and-forget — only the start is awaited)
136
140
  await hotmesh_1.Durable.workflow.startChild({
@@ -140,6 +144,7 @@ async function executeLT(options) {
140
144
  workflowId: childWorkflowId,
141
145
  expire: expire || defaults_1.JOB_EXPIRE_SECS,
142
146
  entity: workflowName,
147
+ signalIn: false,
143
148
  });
144
149
  // 6. Wait for the child's interceptor to signal back with the result
145
150
  const result = await hotmesh_1.Durable.workflow.condition(signalId);
@@ -28,6 +28,7 @@ async function createTask(input) {
28
28
  input.initiated_by || null,
29
29
  input.principal_type || null,
30
30
  input.executing_as || null,
31
+ input.status || null,
31
32
  ]);
32
33
  return rows[0];
33
34
  }
@@ -1,4 +1,4 @@
1
- export declare const CREATE_TASK = "\n INSERT INTO lt_tasks\n (workflow_id, workflow_type, lt_type, task_queue, signal_id,\n parent_workflow_id, origin_id, parent_id, envelope, metadata, priority,\n trace_id, span_id, initiated_by, principal_type, executing_as)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16)\n RETURNING *";
1
+ export declare const CREATE_TASK = "\n INSERT INTO lt_tasks\n (workflow_id, workflow_type, lt_type, task_queue, signal_id,\n parent_workflow_id, origin_id, parent_id, envelope, metadata, priority,\n trace_id, span_id, initiated_by, principal_type, executing_as, status)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, COALESCE($17, 'pending'))\n RETURNING *";
2
2
  export declare const APPEND_MILESTONES = "\n UPDATE lt_tasks\n SET milestones = milestones || $1::jsonb\n WHERE id = $2\n RETURNING *";
3
3
  export declare const GET_TASK = "SELECT * FROM lt_tasks WHERE id = $1";
4
4
  export declare const GET_TASK_BY_SIGNAL_ID = "SELECT * FROM lt_tasks WHERE signal_id = $1";
@@ -11,8 +11,8 @@ exports.CREATE_TASK = `
11
11
  INSERT INTO lt_tasks
12
12
  (workflow_id, workflow_type, lt_type, task_queue, signal_id,
13
13
  parent_workflow_id, origin_id, parent_id, envelope, metadata, priority,
14
- trace_id, span_id, initiated_by, principal_type, executing_as)
15
- VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16)
14
+ trace_id, span_id, initiated_by, principal_type, executing_as, status)
15
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, COALESCE($17, 'pending'))
16
16
  RETURNING *`;
17
17
  exports.APPEND_MILESTONES = `
18
18
  UPDATE lt_tasks
@@ -23,6 +23,8 @@ export interface CreateTaskInput {
23
23
  principal_type?: string;
24
24
  /** Executing principal (bot external_id) when proxy invocation is used. */
25
25
  executing_as?: string;
26
+ /** Initial status. Default: 'pending'. */
27
+ status?: string;
26
28
  }
27
29
  export interface UpdateTaskInput {
28
30
  status?: LTTaskStatus;
@@ -17,10 +17,12 @@ function getRegisteredWorkers() {
17
17
  /** System workflows excluded from the overview by default. */
18
18
  exports.SYSTEM_WORKFLOWS = new Set([
19
19
  'mcpQuery',
20
- 'mcpDeterministic',
21
20
  'mcpQueryRouter',
21
+ 'mcpDeterministic',
22
22
  'mcpTriage',
23
23
  'mcpTriageRouter',
24
24
  'mcpTriageDeterministic',
25
+ 'mcpWorkflowBuilder',
26
+ 'mcpWorkflowPlanner',
25
27
  'insightQuery',
26
28
  ]);
@@ -91,7 +91,13 @@ async function invokeWorkflow(input) {
91
91
  }
92
92
  // 4. Resolve principals and build envelope
93
93
  const wfConfig = await configService.getWorkflowConfig(workflowType);
94
- const envelope = await buildEnvelope(data, metadata ?? {}, auth.userId, executeAsOverride, wfConfig?.execute_as ?? undefined);
94
+ const isCertified = !!(wfConfig &&
95
+ ((wfConfig.roles?.length ?? 0) > 0 || (wfConfig.consumes?.length ?? 0) > 0));
96
+ const resolvedMetadata = { ...(metadata ?? {}) };
97
+ if (isCertified && resolvedMetadata.certified !== false) {
98
+ resolvedMetadata.certified = true;
99
+ }
100
+ const envelope = await buildEnvelope(data, resolvedMetadata, auth.userId, executeAsOverride, wfConfig?.execute_as ?? undefined);
95
101
  // 5. Start workflow — caller options pass through to Durable client
96
102
  const client = (0, workers_1.createClient)();
97
103
  const callerOpts = input.options ?? {};
@@ -104,6 +110,7 @@ async function invokeWorkflow(input) {
104
110
  workflowId,
105
111
  expire: callerOpts.expire ?? defaults_1.JOB_EXPIRE_SECS,
106
112
  entity: callerOpts.entity ?? workflowType,
113
+ signalIn: false,
107
114
  });
108
115
  return { workflowId };
109
116
  }
@@ -138,7 +138,8 @@ async function registerWorkersForWorkflow(workflow) {
138
138
  else if (toolSource === 'db') {
139
139
  if (!activity.mcp_tool_name)
140
140
  continue;
141
- const toolName = activity.mcp_tool_name;
141
+ const rawToolName = activity.mcp_tool_name;
142
+ const toolName = rawToolName.includes('__') ? rawToolName.slice(rawToolName.indexOf('__') + 2) : rawToolName;
142
143
  const dbServerId = activity.mcp_server_id || 'long-tail-db';
143
144
  const toolArgs = activity.tool_arguments;
144
145
  workerConfigs.push({
@@ -163,7 +164,8 @@ async function registerWorkersForWorkflow(workflow) {
163
164
  else {
164
165
  if (!activity.mcp_tool_name)
165
166
  continue;
166
- const toolName = activity.mcp_tool_name;
167
+ const rawToolName = activity.mcp_tool_name;
168
+ const toolName = rawToolName.includes('__') ? rawToolName.slice(rawToolName.indexOf('__') + 2) : rawToolName;
167
169
  const serverId = activity.mcp_server_id;
168
170
  if (!serverId)
169
171
  continue;
@@ -16,6 +16,7 @@ const adapter_1 = require("../services/mcp/adapter");
16
16
  const escalation_strategy_1 = require("../services/escalation-strategy");
17
17
  const default_1 = require("../services/escalation-strategy/default");
18
18
  const mcp_2 = require("../services/escalation-strategy/mcp");
19
+ const socket_auth_1 = require("./socket-auth");
19
20
  /**
20
21
  * Register all adapters (logging, telemetry, events, maintenance,
21
22
  * escalation strategy, MCP) based on the startup config.
@@ -46,7 +47,9 @@ function registerAdapters(startConfig) {
46
47
  if (startConfig.events?.nats) {
47
48
  events_1.eventRegistry.register(new nats_1.NatsEventAdapter(startConfig.events.nats));
48
49
  }
49
- events_1.eventRegistry.register(new socketio_1.SocketIOEventAdapter());
50
+ events_1.eventRegistry.register(new socketio_1.SocketIOEventAdapter({
51
+ authenticate: (0, socket_auth_1.createSocketIOAuthenticator)(startConfig),
52
+ }));
50
53
  }
51
54
  // Always register the callback adapter for SDK event subscriptions.
52
55
  // Zero-cost when no listeners are registered.
@@ -0,0 +1,13 @@
1
+ import type { SocketIOAuthenticator } from '../lib/events/socketio';
2
+ import type { LTStartConfig } from '../types/startup';
3
+ /**
4
+ * Build a Socket.IO handshake authenticator from the startup config.
5
+ *
6
+ * Uses the same JWT secret as `requireAuth` — either the explicit
7
+ * secret from startConfig.auth.secret or the JWT_SECRET env var.
8
+ *
9
+ * Returns `undefined` when no secret is configured (e.g. tests or
10
+ * deployments that intentionally skip auth), which leaves Socket.IO
11
+ * open as before.
12
+ */
13
+ export declare function createSocketIOAuthenticator(startConfig: LTStartConfig): SocketIOAuthenticator | undefined;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createSocketIOAuthenticator = createSocketIOAuthenticator;
7
+ const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
8
+ const config_1 = require("../modules/config");
9
+ /**
10
+ * Build a Socket.IO handshake authenticator from the startup config.
11
+ *
12
+ * Uses the same JWT secret as `requireAuth` — either the explicit
13
+ * secret from startConfig.auth.secret or the JWT_SECRET env var.
14
+ *
15
+ * Returns `undefined` when no secret is configured (e.g. tests or
16
+ * deployments that intentionally skip auth), which leaves Socket.IO
17
+ * open as before.
18
+ */
19
+ function createSocketIOAuthenticator(startConfig) {
20
+ const secret = startConfig.auth?.secret ?? config_1.config.JWT_SECRET;
21
+ if (!secret)
22
+ return undefined;
23
+ return (token) => {
24
+ try {
25
+ const payload = jsonwebtoken_1.default.verify(token, secret);
26
+ return !!(payload && typeof payload === 'object' && payload.userId);
27
+ }
28
+ catch {
29
+ return false;
30
+ }
31
+ };
32
+ }
@@ -1,4 +1,4 @@
1
- import type { LTStartConfig } from '../types/startup';
1
+ import type { LTStartConfig, LTWorkerConfig } from '../types/startup';
2
2
  type WorkerEntry = {
3
3
  taskQueue: string;
4
4
  workflow: (...args: any[]) => any;
@@ -6,6 +6,7 @@ type WorkerEntry = {
6
6
  readonly?: boolean;
7
7
  retry?: Record<string, unknown>;
8
8
  };
9
+ config?: LTWorkerConfig;
9
10
  };
10
11
  /**
11
12
  * Build the connection descriptor used by HotMesh / Durable.