@hotmeshio/long-tail 0.4.18 → 0.4.19

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 (350) hide show
  1. package/README.md +0 -2
  2. package/build/api/auth-sso.d.ts +12 -0
  3. package/build/api/auth-sso.js +54 -0
  4. package/build/api/escalations/bulk.js +2 -2
  5. package/build/api/escalations/claim.js +3 -13
  6. package/build/api/escalations/create.js +3 -2
  7. package/build/api/escalations/helpers.d.ts +1 -0
  8. package/build/api/escalations/helpers.js +6 -4
  9. package/build/api/escalations/list.d.ts +1 -0
  10. package/build/api/escalations/list.js +1 -0
  11. package/build/api/escalations/metadata.js +4 -4
  12. package/build/api/escalations/single.js +3 -2
  13. package/build/api/settings.js +5 -0
  14. package/build/api/topics.d.ts +9 -0
  15. package/build/api/topics.js +31 -2
  16. package/build/lib/events/index.d.ts +1 -0
  17. package/build/lib/events/index.js +4 -0
  18. package/build/lib/events/publish.d.ts +12 -9
  19. package/build/lib/events/publish.js +27 -17
  20. package/build/modules/auth.d.ts +7 -0
  21. package/build/modules/auth.js +104 -2
  22. package/build/modules/sso.d.ts +6 -0
  23. package/build/modules/sso.js +20 -0
  24. package/build/routes/auth-sso.d.ts +2 -0
  25. package/build/routes/auth-sso.js +51 -0
  26. package/build/routes/bot-accounts.js +1 -1
  27. package/build/routes/controlplane.js +6 -6
  28. package/build/routes/escalations/list.js +1 -0
  29. package/build/routes/index.js +2 -0
  30. package/build/routes/mcp-endpoint.d.ts +17 -0
  31. package/build/routes/mcp-endpoint.js +70 -0
  32. package/build/routes/roles.js +5 -5
  33. package/build/routes/topics.js +2 -0
  34. package/build/routes/users.js +31 -5
  35. package/build/sdk/index.d.ts +1 -0
  36. package/build/services/agent/input-mapper.js +17 -1
  37. package/build/services/escalation/crud.js +14 -1
  38. package/build/services/escalation/queries.d.ts +1 -0
  39. package/build/services/escalation/queries.js +7 -0
  40. package/build/services/mcp/exposure.d.ts +15 -0
  41. package/build/services/mcp/exposure.js +18 -0
  42. package/build/services/mcp/external-server.d.ts +15 -0
  43. package/build/services/mcp/external-server.js +125 -0
  44. package/build/services/mcp/seed-service-account.d.ts +11 -0
  45. package/build/services/mcp/seed-service-account.js +77 -0
  46. package/build/services/role/index.d.ts +1 -1
  47. package/build/services/role/index.js +2 -2
  48. package/build/services/topics/system-topics.js +29 -25
  49. package/build/services/user/index.d.ts +1 -1
  50. package/build/services/user/index.js +2 -1
  51. package/build/services/user/rbac.d.ts +11 -0
  52. package/build/services/user/rbac.js +17 -0
  53. package/build/services/user/sso-provision.d.ts +19 -0
  54. package/build/services/user/sso-provision.js +62 -0
  55. package/build/services/workflow-invocation.js +5 -3
  56. package/build/start/config.js +6 -0
  57. package/build/start/server.js +2 -0
  58. package/build/start/workers.js +15 -0
  59. package/build/system/index.js +53 -35
  60. package/build/system/mcp-servers/admin/agent-subscriptions.d.ts +5 -0
  61. package/build/system/mcp-servers/admin/agent-subscriptions.js +78 -0
  62. package/build/system/mcp-servers/admin/agents.d.ts +5 -0
  63. package/build/system/mcp-servers/admin/agents.js +103 -0
  64. package/build/system/mcp-servers/admin/bot-accounts.d.ts +5 -0
  65. package/build/system/mcp-servers/admin/bot-accounts.js +126 -0
  66. package/build/system/mcp-servers/admin/controlplane.d.ts +5 -0
  67. package/build/system/mcp-servers/admin/controlplane.js +107 -0
  68. package/build/system/mcp-servers/admin/escalations.js +88 -0
  69. package/build/system/mcp-servers/admin/exports.d.ts +5 -0
  70. package/build/system/mcp-servers/admin/exports.js +101 -0
  71. package/build/system/mcp-servers/admin/index.d.ts +16 -8
  72. package/build/system/mcp-servers/admin/index.js +36 -21
  73. package/build/system/mcp-servers/admin/pipelines.d.ts +5 -0
  74. package/build/system/mcp-servers/admin/pipelines.js +96 -0
  75. package/build/system/mcp-servers/admin/schemas.d.ts +614 -6
  76. package/build/system/mcp-servers/admin/schemas.js +239 -1
  77. package/build/system/mcp-servers/admin/settings.d.ts +5 -0
  78. package/build/system/mcp-servers/admin/settings.js +53 -0
  79. package/build/system/mcp-servers/admin/topics.d.ts +5 -0
  80. package/build/system/mcp-servers/admin/topics.js +101 -0
  81. package/build/system/seed/tool-manifests-admin.d.ts +5077 -188
  82. package/build/system/seed/tool-manifests-admin.js +79 -30
  83. package/build/system/seed/tool-manifests-data.d.ts +20 -0
  84. package/build/system/seed/tool-manifests-data.js +24 -6
  85. package/build/system/seed/tool-manifests-escalation.d.ts +5 -0
  86. package/build/system/seed/tool-manifests-escalation.js +5 -0
  87. package/build/system/seed/tool-manifests-events.d.ts +4 -0
  88. package/build/system/seed/tool-manifests-events.js +4 -0
  89. package/build/system/seed/tool-manifests-knowledge.d.ts +6 -0
  90. package/build/system/seed/tool-manifests-knowledge.js +7 -0
  91. package/build/system/seed/tool-manifests-workflows.d.ts +8 -0
  92. package/build/system/seed/tool-manifests-workflows.js +8 -0
  93. package/build/tsconfig.tsbuildinfo +1 -1
  94. package/build/types/auth.d.ts +71 -0
  95. package/build/types/events.d.ts +17 -6
  96. package/build/types/index.d.ts +1 -1
  97. package/build/types/startup.d.ts +22 -1
  98. package/dashboard/dist/assets/{AdminDashboard-Cfo0mwL2.js → AdminDashboard-BwUGcCxQ.js} +2 -2
  99. package/dashboard/dist/assets/{AdminDashboard-Cfo0mwL2.js.map → AdminDashboard-BwUGcCxQ.js.map} +1 -1
  100. package/dashboard/dist/assets/AgentConfigPage-DgrYzLwq.js +16 -0
  101. package/dashboard/dist/assets/AgentConfigPage-DgrYzLwq.js.map +1 -0
  102. package/dashboard/dist/assets/{AgentDetailPage-3mZA7SOb.js → AgentDetailPage-XJpl7wfJ.js} +4 -4
  103. package/dashboard/dist/assets/AgentDetailPage-XJpl7wfJ.js.map +1 -0
  104. package/dashboard/dist/assets/{AgentsPage-CTVocfBb.js → AgentsPage-CGpVG6r8.js} +2 -2
  105. package/dashboard/dist/assets/{AgentsPage-CTVocfBb.js.map → AgentsPage-CGpVG6r8.js.map} +1 -1
  106. package/dashboard/dist/assets/AvailableEscalationsPage-DR1e0TQZ.js +2 -0
  107. package/dashboard/dist/assets/{AvailableEscalationsPage-CA9x9o5s.js.map → AvailableEscalationsPage-DR1e0TQZ.js.map} +1 -1
  108. package/dashboard/dist/assets/BotPicker-BKtjl6IL.js +2 -0
  109. package/dashboard/dist/assets/{BotPicker-BQp_Vs73.js.map → BotPicker-BKtjl6IL.js.map} +1 -1
  110. package/dashboard/dist/assets/{CapabilitiesPage-wpVtkGeU.js → CapabilitiesPage-kCB8fyOj.js} +2 -2
  111. package/dashboard/dist/assets/{CapabilitiesPage-wpVtkGeU.js.map → CapabilitiesPage-kCB8fyOj.js.map} +1 -1
  112. package/dashboard/dist/assets/{CollapsibleSection-2eZMMZiG.js → CollapsibleSection-C3tU61hB.js} +2 -2
  113. package/dashboard/dist/assets/{CollapsibleSection-2eZMMZiG.js.map → CollapsibleSection-C3tU61hB.js.map} +1 -1
  114. package/dashboard/dist/assets/{CredentialsPage-DJGLssm0.js → CredentialsPage-Dt4nJs_B.js} +2 -2
  115. package/dashboard/dist/assets/{CredentialsPage-DJGLssm0.js.map → CredentialsPage-Dt4nJs_B.js.map} +1 -1
  116. package/dashboard/dist/assets/CronLabel-BdE6mHyA.js +2 -0
  117. package/dashboard/dist/assets/CronLabel-BdE6mHyA.js.map +1 -0
  118. package/dashboard/dist/assets/{CustomDurationPicker-DbyqfK35.js → CustomDurationPicker-B_Yxfb-u.js} +2 -2
  119. package/dashboard/dist/assets/{CustomDurationPicker-DbyqfK35.js.map → CustomDurationPicker-B_Yxfb-u.js.map} +1 -1
  120. package/dashboard/dist/assets/{DropZone-BkfRoUcm.js → DropZone-CptiQ0wc.js} +2 -2
  121. package/dashboard/dist/assets/{DropZone-BkfRoUcm.js.map → DropZone-CptiQ0wc.js.map} +1 -1
  122. package/dashboard/dist/assets/ElapsedCell-tcGx5PFI.js +2 -0
  123. package/dashboard/dist/assets/{ElapsedCell-BPYm8RA7.js.map → ElapsedCell-tcGx5PFI.js.map} +1 -1
  124. package/dashboard/dist/assets/{EscalationsOverview-kYGHfnLf.js → EscalationsOverview-1KO5dXzk.js} +2 -2
  125. package/dashboard/dist/assets/{EscalationsOverview-kYGHfnLf.js.map → EscalationsOverview-1KO5dXzk.js.map} +1 -1
  126. package/dashboard/dist/assets/{EventTable-DSDzJMer.js → EventTable-DnpsQ6Ew.js} +2 -2
  127. package/dashboard/dist/assets/{EventTable-DSDzJMer.js.map → EventTable-DnpsQ6Ew.js.map} +1 -1
  128. package/dashboard/dist/assets/HomePage-B2Jgo1J1.js +2 -0
  129. package/dashboard/dist/assets/HomePage-B2Jgo1J1.js.map +1 -0
  130. package/dashboard/dist/assets/ListToolbar-jrVba7QN.js +2 -0
  131. package/dashboard/dist/assets/{ListToolbar-DEef1_-T.js.map → ListToolbar-jrVba7QN.js.map} +1 -1
  132. package/dashboard/dist/assets/{McpOverview-CZFW5qMb.js → McpOverview-BzyxJyc9.js} +2 -2
  133. package/dashboard/dist/assets/{McpOverview-CZFW5qMb.js.map → McpOverview-BzyxJyc9.js.map} +1 -1
  134. package/dashboard/dist/assets/{McpQueryDetailPage-q9xH-QRo.js → McpQueryDetailPage-DXNseeKl.js} +2 -2
  135. package/dashboard/dist/assets/{McpQueryDetailPage-q9xH-QRo.js.map → McpQueryDetailPage-DXNseeKl.js.map} +1 -1
  136. package/dashboard/dist/assets/{McpQueryPage-D14466yi.js → McpQueryPage-WZfTY43_.js} +2 -2
  137. package/dashboard/dist/assets/{McpQueryPage-D14466yi.js.map → McpQueryPage-WZfTY43_.js.map} +1 -1
  138. package/dashboard/dist/assets/McpRunDetailPage-DKZp-p7S.js +2 -0
  139. package/dashboard/dist/assets/McpRunDetailPage-DKZp-p7S.js.map +1 -0
  140. package/dashboard/dist/assets/McpRunsPage-SXyiwc0d.js +2 -0
  141. package/dashboard/dist/assets/{McpRunsPage-aZg057y3.js.map → McpRunsPage-SXyiwc0d.js.map} +1 -1
  142. package/dashboard/dist/assets/OperatorDashboard-Cy7ySMXj.js +2 -0
  143. package/dashboard/dist/assets/OperatorDashboard-Cy7ySMXj.js.map +1 -0
  144. package/dashboard/dist/assets/{PageHeader-CR6TpJG_.js → PageHeader-BuJpMxyu.js} +2 -2
  145. package/dashboard/dist/assets/{PageHeader-CR6TpJG_.js.map → PageHeader-BuJpMxyu.js.map} +1 -1
  146. package/dashboard/dist/assets/{PageHeaderWithStats-CRcQEAO1.js → PageHeaderWithStats-yD_PTbOl.js} +2 -2
  147. package/dashboard/dist/assets/{PageHeaderWithStats-CRcQEAO1.js.map → PageHeaderWithStats-yD_PTbOl.js.map} +1 -1
  148. package/dashboard/dist/assets/{ProcessDetailPage-DyzNjwu8.js → ProcessDetailPage-DYIfvWyc.js} +2 -2
  149. package/dashboard/dist/assets/{ProcessDetailPage-DyzNjwu8.js.map → ProcessDetailPage-DYIfvWyc.js.map} +1 -1
  150. package/dashboard/dist/assets/{ProcessesListPage-CT_3b5Wt.js → ProcessesListPage-DR1RGaMl.js} +2 -2
  151. package/dashboard/dist/assets/{ProcessesListPage-CT_3b5Wt.js.map → ProcessesListPage-DR1RGaMl.js.map} +1 -1
  152. package/dashboard/dist/assets/{RolePill-BC54Vn-U.js → RolePill-SasQKc_B.js} +2 -2
  153. package/dashboard/dist/assets/{RolePill-BC54Vn-U.js.map → RolePill-SasQKc_B.js.map} +1 -1
  154. package/dashboard/dist/assets/{RolesPage-CpRJq-sg.js → RolesPage-pMERxj15.js} +2 -2
  155. package/dashboard/dist/assets/{RolesPage-CpRJq-sg.js.map → RolesPage-pMERxj15.js.map} +1 -1
  156. package/dashboard/dist/assets/{RunAsSelector-C20rdNsC.js → RunAsSelector-B-ksMoEj.js} +2 -2
  157. package/dashboard/dist/assets/{RunAsSelector-C20rdNsC.js.map → RunAsSelector-B-ksMoEj.js.map} +1 -1
  158. package/dashboard/dist/assets/ServerName-CHspudaC.js +2 -0
  159. package/dashboard/dist/assets/{ServerName-Q6okiv4f.js.map → ServerName-CHspudaC.js.map} +1 -1
  160. package/dashboard/dist/assets/{SwimlaneTimeline-CbFaU4bq.js → SwimlaneTimeline-Cr_K5qpu.js} +2 -2
  161. package/dashboard/dist/assets/{SwimlaneTimeline-CbFaU4bq.js.map → SwimlaneTimeline-Cr_K5qpu.js.map} +1 -1
  162. package/dashboard/dist/assets/{TagInput-D6l1SPWd.js → TagInput-DvF3j8MA.js} +2 -2
  163. package/dashboard/dist/assets/{TagInput-D6l1SPWd.js.map → TagInput-DvF3j8MA.js.map} +1 -1
  164. package/dashboard/dist/assets/{TaskDetailPage-22cJsFmM.js → TaskDetailPage-BO5p7AEe.js} +2 -2
  165. package/dashboard/dist/assets/{TaskDetailPage-22cJsFmM.js.map → TaskDetailPage-BO5p7AEe.js.map} +1 -1
  166. package/dashboard/dist/assets/{TaskQueuePill-iDBVCEQQ.js → TaskQueuePill-BCQrS2oK.js} +2 -2
  167. package/dashboard/dist/assets/{TaskQueuePill-iDBVCEQQ.js.map → TaskQueuePill-BCQrS2oK.js.map} +1 -1
  168. package/dashboard/dist/assets/{TasksListPage-BDmaUIKu.js → TasksListPage-BRg-uFtF.js} +2 -2
  169. package/dashboard/dist/assets/{TasksListPage-BDmaUIKu.js.map → TasksListPage-BRg-uFtF.js.map} +1 -1
  170. package/dashboard/dist/assets/{TimeAgo-7wqEp87-.js → TimeAgo-BSzN6rAH.js} +2 -2
  171. package/dashboard/dist/assets/{TimeAgo-7wqEp87-.js.map → TimeAgo-BSzN6rAH.js.map} +1 -1
  172. package/dashboard/dist/assets/{TimestampCell-BBCf8zsN.js → TimestampCell-DL6zMNEQ.js} +2 -2
  173. package/dashboard/dist/assets/{TimestampCell-BBCf8zsN.js.map → TimestampCell-DL6zMNEQ.js.map} +1 -1
  174. package/dashboard/dist/assets/{ToolPill-HcRTggHo.js → ToolPill-1aTqYtzp.js} +2 -2
  175. package/dashboard/dist/assets/{ToolPill-HcRTggHo.js.map → ToolPill-1aTqYtzp.js.map} +1 -1
  176. package/dashboard/dist/assets/{ToolTestPanel-Dosq1cqG.js → ToolTestPanel-fLzNp79U.js} +2 -2
  177. package/dashboard/dist/assets/{ToolTestPanel-Dosq1cqG.js.map → ToolTestPanel-fLzNp79U.js.map} +1 -1
  178. package/dashboard/dist/assets/TopicDetailPage-D7gCsPKB.js +9 -0
  179. package/dashboard/dist/assets/TopicDetailPage-D7gCsPKB.js.map +1 -0
  180. package/dashboard/dist/assets/{TopicsPage-tVPdz-k0.js → TopicsPage-B3Aa8Haz.js} +2 -2
  181. package/dashboard/dist/assets/{TopicsPage-tVPdz-k0.js.map → TopicsPage-B3Aa8Haz.js.map} +1 -1
  182. package/dashboard/dist/assets/{UserName-DX7IBjFn.js → UserName-BjHIJWgh.js} +2 -2
  183. package/dashboard/dist/assets/{UserName-DX7IBjFn.js.map → UserName-BjHIJWgh.js.map} +1 -1
  184. package/dashboard/dist/assets/{WorkflowExecutionPage-BjC0j9_L.js → WorkflowExecutionPage-BQ7AYlQA.js} +2 -2
  185. package/dashboard/dist/assets/{WorkflowExecutionPage-BjC0j9_L.js.map → WorkflowExecutionPage-BQ7AYlQA.js.map} +1 -1
  186. package/dashboard/dist/assets/{WorkflowPill-54px0YiY.js → WorkflowPill-Z-zHRKOK.js} +2 -2
  187. package/dashboard/dist/assets/{WorkflowPill-54px0YiY.js.map → WorkflowPill-Z-zHRKOK.js.map} +1 -1
  188. package/dashboard/dist/assets/WorkflowsDashboard-D-G8Xudz.js +2 -0
  189. package/dashboard/dist/assets/WorkflowsDashboard-D-G8Xudz.js.map +1 -0
  190. package/dashboard/dist/assets/{WorkflowsOverview-DaJRDkNy.js → WorkflowsOverview-B4DUcVxs.js} +2 -2
  191. package/dashboard/dist/assets/{WorkflowsOverview-DaJRDkNy.js.map → WorkflowsOverview-B4DUcVxs.js.map} +1 -1
  192. package/dashboard/dist/assets/{YamlWorkflowsPage-CkpQaUmz.js → YamlWorkflowsPage-CnTNOku0.js} +2 -2
  193. package/dashboard/dist/assets/{YamlWorkflowsPage-CkpQaUmz.js.map → YamlWorkflowsPage-CnTNOku0.js.map} +1 -1
  194. package/dashboard/dist/assets/{agents-B-P5MlEx.js → agents-CkvQDr9b.js} +2 -2
  195. package/dashboard/dist/assets/{agents-B-P5MlEx.js.map → agents-CkvQDr9b.js.map} +1 -1
  196. package/dashboard/dist/assets/{bots-CZz9iVys.js → bots-CzuMCVgU.js} +2 -2
  197. package/dashboard/dist/assets/{bots-CZz9iVys.js.map → bots-CzuMCVgU.js.map} +1 -1
  198. package/dashboard/dist/assets/{capabilities-DrZ8Vw_v.js → capabilities-CbGmS0ty.js} +2 -2
  199. package/dashboard/dist/assets/{capabilities-DrZ8Vw_v.js.map → capabilities-CbGmS0ty.js.map} +1 -1
  200. package/dashboard/dist/assets/{controlplane-cj-1c-1C.js → controlplane-DGvwkuYx.js} +2 -2
  201. package/dashboard/dist/assets/{controlplane-cj-1c-1C.js.map → controlplane-DGvwkuYx.js.map} +1 -1
  202. package/dashboard/dist/assets/{escalation-BEVFyQnE.js → escalation-B7ysVToF.js} +2 -2
  203. package/dashboard/dist/assets/{escalation-BEVFyQnE.js.map → escalation-B7ysVToF.js.map} +1 -1
  204. package/dashboard/dist/assets/{escalation-columns-Beox3TXH.js → escalation-columns-CHQEJU1j.js} +2 -2
  205. package/dashboard/dist/assets/{escalation-columns-Beox3TXH.js.map → escalation-columns-CHQEJU1j.js.map} +1 -1
  206. package/dashboard/dist/assets/{helpers-B4gzNq9h.js → helpers-BFOjXa4r.js} +2 -2
  207. package/dashboard/dist/assets/{helpers-B4gzNq9h.js.map → helpers-BFOjXa4r.js.map} +1 -1
  208. package/dashboard/dist/assets/index-B9_1AZaG.js +2 -0
  209. package/dashboard/dist/assets/{index-3n5VREXN.js.map → index-B9_1AZaG.js.map} +1 -1
  210. package/dashboard/dist/assets/{index-BCQ65lNu.js → index-BFaDxPxA.js} +2 -2
  211. package/dashboard/dist/assets/{index-BCQ65lNu.js.map → index-BFaDxPxA.js.map} +1 -1
  212. package/dashboard/dist/assets/index-BduDiGcw.js +15 -0
  213. package/dashboard/dist/assets/{index-UtAfnStw.js.map → index-BduDiGcw.js.map} +1 -1
  214. package/dashboard/dist/assets/{index-Bh-PnP17.js → index-BeLphL59.js} +2 -2
  215. package/dashboard/dist/assets/{index-Bh-PnP17.js.map → index-BeLphL59.js.map} +1 -1
  216. package/dashboard/dist/assets/index-C--SEsU7.css +1 -0
  217. package/dashboard/dist/assets/{index-_DfbFHXk.js → index-CRiBkHPb.js} +2 -2
  218. package/dashboard/dist/assets/{index-_DfbFHXk.js.map → index-CRiBkHPb.js.map} +1 -1
  219. package/dashboard/dist/assets/{index-DdKbIZNE.js → index-CbrMW-gM.js} +2 -2
  220. package/dashboard/dist/assets/{index-DdKbIZNE.js.map → index-CbrMW-gM.js.map} +1 -1
  221. package/dashboard/dist/assets/{index-aJRDh4zW.js → index-CvOGgvzP.js} +2 -2
  222. package/dashboard/dist/assets/{index-aJRDh4zW.js.map → index-CvOGgvzP.js.map} +1 -1
  223. package/dashboard/dist/assets/{index-D1MywQ2z.js → index-DDlrQeTj.js} +2 -2
  224. package/dashboard/dist/assets/{index-D1MywQ2z.js.map → index-DDlrQeTj.js.map} +1 -1
  225. package/dashboard/dist/assets/{index-BYXiz05a.js → index-DQHmfTPo.js} +2 -2
  226. package/dashboard/dist/assets/{index-BYXiz05a.js.map → index-DQHmfTPo.js.map} +1 -1
  227. package/dashboard/dist/assets/{index-BpN31nuC.js → index-_BRA9uFL.js} +25 -25
  228. package/dashboard/dist/assets/index-_BRA9uFL.js.map +1 -0
  229. package/dashboard/dist/assets/index-a98qWLB-.js +2 -0
  230. package/dashboard/dist/assets/index-a98qWLB-.js.map +1 -0
  231. package/dashboard/dist/assets/index-l_8R6U4r.js +6 -0
  232. package/dashboard/dist/assets/index-l_8R6U4r.js.map +1 -0
  233. package/dashboard/dist/assets/{index-D4KGadbW.js → index-v0OQpgXS.js} +2 -2
  234. package/dashboard/dist/assets/{index-D4KGadbW.js.map → index-v0OQpgXS.js.map} +1 -1
  235. package/dashboard/dist/assets/{knowledge-DhtKWMON.js → knowledge-BlF8UMrk.js} +2 -2
  236. package/dashboard/dist/assets/{knowledge-DhtKWMON.js.map → knowledge-BlF8UMrk.js.map} +1 -1
  237. package/dashboard/dist/assets/{mcp-BXN7-wGF.js → mcp-MtXuky8q.js} +2 -2
  238. package/dashboard/dist/assets/{mcp-BXN7-wGF.js.map → mcp-MtXuky8q.js.map} +1 -1
  239. package/dashboard/dist/assets/{mcp-query-BIJP4mQJ.js → mcp-query-DQ-J1Q0K.js} +2 -2
  240. package/dashboard/dist/assets/{mcp-query-BIJP4mQJ.js.map → mcp-query-DQ-J1Q0K.js.map} +1 -1
  241. package/dashboard/dist/assets/{namespaces-ne_yDQZX.js → namespaces-DtsT_GoV.js} +2 -2
  242. package/dashboard/dist/assets/{namespaces-ne_yDQZX.js.map → namespaces-DtsT_GoV.js.map} +1 -1
  243. package/dashboard/dist/assets/{pipelines-Bcz62DoS.js → pipelines-BjlCm9VH.js} +2 -2
  244. package/dashboard/dist/assets/{pipelines-Bcz62DoS.js.map → pipelines-BjlCm9VH.js.map} +1 -1
  245. package/dashboard/dist/assets/{roles-De2CzGCy.js → roles-D-LhJ82d.js} +2 -2
  246. package/dashboard/dist/assets/{roles-De2CzGCy.js.map → roles-D-LhJ82d.js.map} +1 -1
  247. package/dashboard/dist/assets/{tasks-4yL5EfxI.js → tasks-BrP_8uEN.js} +2 -2
  248. package/dashboard/dist/assets/{tasks-4yL5EfxI.js.map → tasks-BrP_8uEN.js.map} +1 -1
  249. package/dashboard/dist/assets/topics-DUk-zX5D.js +2 -0
  250. package/dashboard/dist/assets/{topics-DDKHpRwP.js.map → topics-DUk-zX5D.js.map} +1 -1
  251. package/dashboard/dist/assets/useEventHooks-XNNzwADV.js +2 -0
  252. package/dashboard/dist/assets/useEventHooks-XNNzwADV.js.map +1 -0
  253. package/dashboard/dist/assets/{useYamlActivityEvents-Dv6GhDkh.js → useYamlActivityEvents-DANQ5jIY.js} +2 -2
  254. package/dashboard/dist/assets/{useYamlActivityEvents-Dv6GhDkh.js.map → useYamlActivityEvents-DANQ5jIY.js.map} +1 -1
  255. package/dashboard/dist/assets/{users-pSMWP58G.js → users-vj0JgOkA.js} +2 -2
  256. package/dashboard/dist/assets/{users-pSMWP58G.js.map → users-vj0JgOkA.js.map} +1 -1
  257. package/dashboard/dist/assets/{vendor-icons-CrrAvF2g.js → vendor-icons-Doy0g69_.js} +116 -111
  258. package/dashboard/dist/assets/vendor-icons-Doy0g69_.js.map +1 -0
  259. package/dashboard/dist/assets/{workflows-COYPOe2I.js → workflows-CmqgGPzI.js} +2 -2
  260. package/dashboard/dist/assets/{workflows-COYPOe2I.js.map → workflows-CmqgGPzI.js.map} +1 -1
  261. package/dashboard/dist/assets/{yaml-workflows-1dF3ig6u.js → yaml-workflows-DNFyjBXH.js} +2 -2
  262. package/dashboard/dist/assets/{yaml-workflows-1dF3ig6u.js.map → yaml-workflows-DNFyjBXH.js.map} +1 -1
  263. package/dashboard/dist/index.html +3 -3
  264. package/docs/api/http/controlplane.md +1 -1
  265. package/docs/api/http/mcp-endpoint.md +133 -0
  266. package/docs/api/http/roles.md +46 -0
  267. package/docs/api/http/service-accounts.md +15 -0
  268. package/docs/api/http/settings.md +6 -0
  269. package/docs/api/mcp/admin.md +1187 -0
  270. package/docs/api/mcp/claude-code.md +47 -0
  271. package/docs/api/mcp/docs.md +54 -0
  272. package/docs/api/mcp/events.md +80 -0
  273. package/docs/api/mcp/file-storage.md +76 -0
  274. package/docs/api/mcp/http-fetch.md +64 -0
  275. package/docs/api/mcp/human-queue.md +101 -0
  276. package/docs/api/mcp/index.md +52 -0
  277. package/docs/api/mcp/knowledge.md +125 -0
  278. package/docs/api/mcp/oauth.md +62 -0
  279. package/docs/api/mcp/schema-exchange.md +56 -0
  280. package/docs/api/mcp/translation.md +28 -0
  281. package/docs/api/mcp/vision.md +46 -0
  282. package/docs/api/sdk/settings.md +3 -1
  283. package/docs/auth.md +109 -0
  284. package/docs/dashboard.md +1 -1
  285. package/package.json +1 -1
  286. package/build/system/mcp-servers/playwright/browser-lifecycle.d.ts +0 -26
  287. package/build/system/mcp-servers/playwright/browser-lifecycle.js +0 -125
  288. package/build/system/mcp-servers/playwright/index.d.ts +0 -25
  289. package/build/system/mcp-servers/playwright/index.js +0 -42
  290. package/build/system/mcp-servers/playwright/schemas.d.ts +0 -394
  291. package/build/system/mcp-servers/playwright/schemas.js +0 -90
  292. package/build/system/mcp-servers/playwright/tools-atomic.d.ts +0 -2
  293. package/build/system/mcp-servers/playwright/tools-atomic.js +0 -9
  294. package/build/system/mcp-servers/playwright/tools-navigation.d.ts +0 -2
  295. package/build/system/mcp-servers/playwright/tools-navigation.js +0 -153
  296. package/build/system/mcp-servers/playwright/tools-page-interaction.d.ts +0 -2
  297. package/build/system/mcp-servers/playwright/tools-page-interaction.js +0 -162
  298. package/build/system/mcp-servers/playwright/tools-run-script.d.ts +0 -2
  299. package/build/system/mcp-servers/playwright/tools-run-script.js +0 -207
  300. package/build/system/mcp-servers/playwright/types.d.ts +0 -8
  301. package/build/system/mcp-servers/playwright/types.js +0 -30
  302. package/build/system/mcp-servers/playwright/vision-helper.d.ts +0 -12
  303. package/build/system/mcp-servers/playwright/vision-helper.js +0 -81
  304. package/build/system/mcp-servers/playwright-cli/helpers.d.ts +0 -11
  305. package/build/system/mcp-servers/playwright-cli/helpers.js +0 -20
  306. package/build/system/mcp-servers/playwright-cli/index.d.ts +0 -4
  307. package/build/system/mcp-servers/playwright-cli/index.js +0 -15
  308. package/build/system/mcp-servers/playwright-cli/schemas.d.ts +0 -219
  309. package/build/system/mcp-servers/playwright-cli/schemas.js +0 -75
  310. package/build/system/mcp-servers/playwright-cli/tools-auth.d.ts +0 -2
  311. package/build/system/mcp-servers/playwright-cli/tools-auth.js +0 -183
  312. package/build/system/mcp-servers/playwright-cli/tools-capture.d.ts +0 -2
  313. package/build/system/mcp-servers/playwright-cli/tools-capture.js +0 -273
  314. package/build/system/seed/tool-manifests-browser.d.ts +0 -577
  315. package/build/system/seed/tool-manifests-browser.js +0 -158
  316. package/dashboard/dist/assets/AgentConfigPage-DBtvb2x5.js +0 -16
  317. package/dashboard/dist/assets/AgentConfigPage-DBtvb2x5.js.map +0 -1
  318. package/dashboard/dist/assets/AgentDetailPage-3mZA7SOb.js.map +0 -1
  319. package/dashboard/dist/assets/AvailableEscalationsPage-CA9x9o5s.js +0 -2
  320. package/dashboard/dist/assets/BotPicker-BQp_Vs73.js +0 -2
  321. package/dashboard/dist/assets/CronLabel-DY8VdTS9.js +0 -2
  322. package/dashboard/dist/assets/CronLabel-DY8VdTS9.js.map +0 -1
  323. package/dashboard/dist/assets/ElapsedCell-BPYm8RA7.js +0 -2
  324. package/dashboard/dist/assets/EventTopicPill-CCWCs07y.js +0 -2
  325. package/dashboard/dist/assets/EventTopicPill-CCWCs07y.js.map +0 -1
  326. package/dashboard/dist/assets/HomePage-CwRebzmO.js +0 -2
  327. package/dashboard/dist/assets/HomePage-CwRebzmO.js.map +0 -1
  328. package/dashboard/dist/assets/ListToolbar-DEef1_-T.js +0 -2
  329. package/dashboard/dist/assets/McpRunDetailPage-X0sfRFTk.js +0 -2
  330. package/dashboard/dist/assets/McpRunDetailPage-X0sfRFTk.js.map +0 -1
  331. package/dashboard/dist/assets/McpRunsPage-aZg057y3.js +0 -2
  332. package/dashboard/dist/assets/OperatorDashboard-iZEHnndU.js +0 -2
  333. package/dashboard/dist/assets/OperatorDashboard-iZEHnndU.js.map +0 -1
  334. package/dashboard/dist/assets/ServerName-Q6okiv4f.js +0 -2
  335. package/dashboard/dist/assets/TopicDetailPage-DW97-YHQ.js +0 -9
  336. package/dashboard/dist/assets/TopicDetailPage-DW97-YHQ.js.map +0 -1
  337. package/dashboard/dist/assets/WorkflowsDashboard-eCH4gpAk.js +0 -2
  338. package/dashboard/dist/assets/WorkflowsDashboard-eCH4gpAk.js.map +0 -1
  339. package/dashboard/dist/assets/index-3n5VREXN.js +0 -2
  340. package/dashboard/dist/assets/index-BAXzN-QB.js +0 -6
  341. package/dashboard/dist/assets/index-BAXzN-QB.js.map +0 -1
  342. package/dashboard/dist/assets/index-BpN31nuC.js.map +0 -1
  343. package/dashboard/dist/assets/index-C37LMzJa.css +0 -1
  344. package/dashboard/dist/assets/index-C5dHozmW.js +0 -2
  345. package/dashboard/dist/assets/index-C5dHozmW.js.map +0 -1
  346. package/dashboard/dist/assets/index-UtAfnStw.js +0 -15
  347. package/dashboard/dist/assets/topics-DDKHpRwP.js +0 -2
  348. package/dashboard/dist/assets/useEventHooks-NzIyvoGY.js +0 -2
  349. package/dashboard/dist/assets/useEventHooks-NzIyvoGY.js.map +0 -1
  350. package/dashboard/dist/assets/vendor-icons-CrrAvF2g.js.map +0 -1
package/README.md CHANGED
@@ -62,8 +62,6 @@ Dashboard at [http://localhost:3000](http://localhost:3000). The [boilerplate](h
62
62
 
63
63
  ## The pattern
64
64
 
65
- Most systems start with a durable workflow and stop there. Long Tail keeps going.
66
-
67
65
  **Step 1 — Author a durable workflow.** Your function checkpoints to Postgres. It can sleep, branch, call child workflows, wait for signals. Standard durable execution.
68
66
 
69
67
  **Step 2 — Certify it.** Promotion to certified adds interceptor guarantees: failures escalate instead of throwing, escalation chains route through RBAC-scoped roles, and every error is either handled or surfaced. It cannot silently fail.
@@ -0,0 +1,12 @@
1
+ import type { Request } from 'express';
2
+ import type { LTApiResult } from '../types/sdk';
3
+ /**
4
+ * Exchange host authentication for a Long Tail JWT.
5
+ *
6
+ * Calls `sso.resolve(req)` to extract the host identity, JIT provisions
7
+ * the user in `lt_users`, and returns a signed JWT the dashboard can
8
+ * store for subsequent API calls.
9
+ *
10
+ * No request body required — the host's cookies/headers carry the auth.
11
+ */
12
+ export declare function exchangeSSO(req: Request): Promise<LTApiResult>;
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.exchangeSSO = exchangeSSO;
4
+ const sso_1 = require("../modules/sso");
5
+ const sso_provision_1 = require("../services/user/sso-provision");
6
+ const auth_1 = require("../modules/auth");
7
+ /**
8
+ * Exchange host authentication for a Long Tail JWT.
9
+ *
10
+ * Calls `sso.resolve(req)` to extract the host identity, JIT provisions
11
+ * the user in `lt_users`, and returns a signed JWT the dashboard can
12
+ * store for subsequent API calls.
13
+ *
14
+ * No request body required — the host's cookies/headers carry the auth.
15
+ */
16
+ async function exchangeSSO(req) {
17
+ try {
18
+ const ssoConfig = (0, sso_1.getSSOConfig)();
19
+ if (!ssoConfig) {
20
+ return { status: 404, error: 'SSO not configured' };
21
+ }
22
+ const identity = await ssoConfig.resolve(req);
23
+ if (!identity) {
24
+ return { status: 401, error: 'Host authentication required' };
25
+ }
26
+ const provisioned = await (0, sso_provision_1.ssoProvision)(identity, ssoConfig);
27
+ const highestType = provisioned.roles.some((r) => r.type === 'superadmin')
28
+ ? 'superadmin'
29
+ : provisioned.roles.some((r) => r.type === 'admin')
30
+ ? 'admin'
31
+ : 'member';
32
+ const token = (0, auth_1.signToken)({
33
+ userId: provisioned.userId,
34
+ role: highestType,
35
+ roles: provisioned.roles,
36
+ sso: true,
37
+ }, '24h');
38
+ return {
39
+ status: 200,
40
+ data: {
41
+ token,
42
+ user: {
43
+ id: provisioned.userId,
44
+ external_id: identity.externalId,
45
+ display_name: identity.displayName || identity.externalId,
46
+ roles: provisioned.roles,
47
+ },
48
+ },
49
+ };
50
+ }
51
+ catch (err) {
52
+ return { status: 500, error: err.message };
53
+ }
54
+ }
@@ -141,8 +141,8 @@ async function bulkAssign(input, auth) {
141
141
  if (!perm.allowed)
142
142
  return perm;
143
143
  // Non-superadmin: target user must hold each escalation's role
144
- const isSuperAdminUser = await userService.isSuperAdmin(auth.userId);
145
- if (!isSuperAdminUser) {
144
+ const hasGlobal = await (0, helpers_1.hasGlobalEscalationAccess)(auth.userId);
145
+ if (!hasGlobal) {
146
146
  const roles = await escalationService.getEscalationRoles(ids);
147
147
  for (const role of roles) {
148
148
  const targetHasRole = await userService.hasRole(targetUserId, role);
@@ -37,7 +37,7 @@ exports.claimEscalation = claimEscalation;
37
37
  exports.releaseEscalation = releaseEscalation;
38
38
  const escalationService = __importStar(require("../../services/escalation"));
39
39
  const userService = __importStar(require("../../services/user"));
40
- const publish_1 = require("../../lib/events/publish");
40
+ const helpers_1 = require("./helpers");
41
41
  /**
42
42
  * Claim a pending escalation for the authenticated user.
43
43
  *
@@ -57,8 +57,8 @@ async function claimEscalation(input, auth) {
57
57
  if (!escalation) {
58
58
  return { status: 404, error: 'Escalation not found' };
59
59
  }
60
- const isSuperAdminUser = await userService.isSuperAdmin(auth.userId);
61
- if (!isSuperAdminUser) {
60
+ const hasGlobal = await (0, helpers_1.hasGlobalEscalationAccess)(auth.userId);
61
+ if (!hasGlobal) {
62
62
  const userHasRole = await userService.hasRole(auth.userId, escalation.role);
63
63
  if (!userHasRole) {
64
64
  return {
@@ -94,16 +94,6 @@ async function releaseEscalation(input, auth) {
94
94
  if (!result) {
95
95
  return { status: 409, error: 'Escalation not found or not claimed by you' };
96
96
  }
97
- (0, publish_1.publishEscalationEvent)({
98
- type: 'escalation.released',
99
- source: 'api',
100
- workflowId: result.workflow_id || '',
101
- workflowName: result.workflow_type || '',
102
- taskQueue: result.task_queue || '',
103
- escalationId: input.id,
104
- status: 'released',
105
- data: { released_by: auth.userId },
106
- });
107
97
  return { status: 200, data: { escalation: result } };
108
98
  }
109
99
  catch (err) {
@@ -36,6 +36,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.createEscalation = createEscalation;
37
37
  const escalationService = __importStar(require("../../services/escalation"));
38
38
  const userService = __importStar(require("../../services/user"));
39
+ const helpers_1 = require("./helpers");
39
40
  // ── Create ────────────────────────────────────────────────────────────────
40
41
  /**
41
42
  * Create a standalone escalation (not tied to a workflow).
@@ -65,8 +66,8 @@ async function createEscalation(input, auth) {
65
66
  return { status: 400, error: 'role is required' };
66
67
  }
67
68
  // RBAC: caller must hold the target role or be superadmin
68
- const isSuperAdminUser = await userService.isSuperAdmin(auth.userId);
69
- if (!isSuperAdminUser) {
69
+ const hasGlobal = await (0, helpers_1.hasGlobalEscalationAccess)(auth.userId);
70
+ if (!hasGlobal) {
70
71
  const userHasRole = await userService.hasRole(auth.userId, role);
71
72
  if (!userHasRole) {
72
73
  return { status: 403, error: `You must hold the "${role}" role or be a superadmin to create escalations for it` };
@@ -1,3 +1,4 @@
1
+ export { hasGlobalEscalationAccess } from '../../services/user';
1
2
  export declare function getVisibleRoles(userId: string): Promise<string[] | undefined>;
2
3
  export declare function validateIds(ids: unknown): ids is string[];
3
4
  export declare function checkBulkPermission(userId: string, ids: string[]): Promise<{
@@ -33,6 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.hasGlobalEscalationAccess = void 0;
36
37
  exports.getVisibleRoles = getVisibleRoles;
37
38
  exports.validateIds = validateIds;
38
39
  exports.checkBulkPermission = checkBulkPermission;
@@ -42,9 +43,11 @@ const escalationService = __importStar(require("../../services/escalation"));
42
43
  const userService = __importStar(require("../../services/user"));
43
44
  const publish_1 = require("../../lib/events/publish");
44
45
  // ── Private helpers ────────────────────────────────────────────────────────
46
+ // Re-export from service layer for use by escalation API modules
47
+ var user_1 = require("../../services/user");
48
+ Object.defineProperty(exports, "hasGlobalEscalationAccess", { enumerable: true, get: function () { return user_1.hasGlobalEscalationAccess; } });
45
49
  async function getVisibleRoles(userId) {
46
- const isSuperAdminUser = await userService.isSuperAdmin(userId);
47
- if (isSuperAdminUser)
50
+ if (await userService.hasGlobalEscalationAccess(userId))
48
51
  return undefined;
49
52
  const userRoles = await userService.getUserRoles(userId);
50
53
  return userRoles.map((r) => r.role);
@@ -53,8 +56,7 @@ function validateIds(ids) {
53
56
  return Array.isArray(ids) && ids.length > 0;
54
57
  }
55
58
  async function checkBulkPermission(userId, ids) {
56
- const isSuperAdminUser = await userService.isSuperAdmin(userId);
57
- if (isSuperAdminUser)
59
+ if (await userService.hasGlobalEscalationAccess(userId))
58
60
  return { allowed: true };
59
61
  const roles = await escalationService.getEscalationRoles(ids);
60
62
  for (const role of roles) {
@@ -24,6 +24,7 @@ export declare function listEscalations(input: {
24
24
  type?: string;
25
25
  subtype?: string;
26
26
  assigned_to?: string;
27
+ claimed?: boolean;
27
28
  priority?: number;
28
29
  limit?: number;
29
30
  offset?: number;
@@ -71,6 +71,7 @@ async function listEscalations(input, auth) {
71
71
  type: input.type,
72
72
  subtype: input.subtype,
73
73
  assigned_to: input.assigned_to,
74
+ claimed: input.claimed,
74
75
  priority: input.priority,
75
76
  limit: input.limit,
76
77
  offset: input.offset,
@@ -97,8 +97,8 @@ async function claimByMetadata(input, auth) {
97
97
  return { status: 404, error: 'No pending escalation found for this metadata' };
98
98
  }
99
99
  const candidate = candidates.escalations[0];
100
- const isSuperAdmin = await userService.isSuperAdmin(auth.userId);
101
- if (!isSuperAdmin) {
100
+ const hasGlobal = await (0, helpers_1.hasGlobalEscalationAccess)(auth.userId);
101
+ if (!hasGlobal) {
102
102
  const userHasRole = await userService.hasRole(claimUserId, candidate.role);
103
103
  if (!userHasRole) {
104
104
  return { status: 403, error: `User must have the "${candidate.role}" role to claim this escalation` };
@@ -144,8 +144,8 @@ async function resolveByMetadata(input, auth) {
144
144
  if ('error' in resolved)
145
145
  return resolved.error;
146
146
  const resolveUserId = resolved.userId;
147
- const isSuperAdmin = await userService.isSuperAdmin(auth.userId);
148
- if (!isSuperAdmin) {
147
+ const hasGlobal = await (0, helpers_1.hasGlobalEscalationAccess)(auth.userId);
148
+ if (!hasGlobal) {
149
149
  const userHasRole = await userService.hasRole(resolveUserId, escalation.role);
150
150
  if (!userHasRole) {
151
151
  return { status: 403, error: `User must have the "${escalation.role}" role` };
@@ -39,6 +39,7 @@ exports.escalateToRole = escalateToRole;
39
39
  const escalationService = __importStar(require("../../services/escalation"));
40
40
  const userService = __importStar(require("../../services/user"));
41
41
  const roleService = __importStar(require("../../services/role"));
42
+ const helpers_1 = require("./helpers");
42
43
  // ── Single-escalation routes ───────────────────────────────────────────────
43
44
  /**
44
45
  * Get a single escalation by ID.
@@ -55,8 +56,8 @@ async function getEscalation(input, auth) {
55
56
  if (!escalation) {
56
57
  return { status: 404, error: 'Escalation not found' };
57
58
  }
58
- const isSuperAdminUser = await userService.isSuperAdmin(auth.userId);
59
- if (!isSuperAdminUser) {
59
+ const hasGlobal = await (0, helpers_1.hasGlobalEscalationAccess)(auth.userId);
60
+ if (!hasGlobal) {
60
61
  const userHasRole = await userService.hasRole(auth.userId, escalation.role);
61
62
  if (!userHasRole) {
62
63
  return { status: 403, error: 'Not authorized to view this escalation' };
@@ -7,6 +7,7 @@ const nats_1 = require("../lib/events/nats");
7
7
  const socketio_1 = require("../lib/events/socketio");
8
8
  const nats_ws_proxy_1 = require("../lib/events/nats-ws-proxy");
9
9
  const config_1 = require("../modules/config");
10
+ const sso_1 = require("../modules/sso");
10
11
  const defaults_1 = require("../modules/defaults");
11
12
  const llm_1 = require("../services/llm");
12
13
  /**
@@ -60,6 +61,10 @@ async function getSettings(req) {
60
61
  transport,
61
62
  natsWsUrl: natsAdapter ? resolveNatsWsUrl(natsAdapter, req) : null,
62
63
  },
64
+ auth: {
65
+ sso: (0, sso_1.isSSOEnabled)(),
66
+ ssoLogoutUrl: (0, sso_1.getSSOConfig)()?.logoutUrl ?? null,
67
+ },
63
68
  ai: {
64
69
  enabled: (0, llm_1.hasLLMApiKey)(),
65
70
  },
@@ -20,8 +20,17 @@ export declare function updateTopic(input: {
20
20
  export declare function deleteTopic(input: {
21
21
  topic: string;
22
22
  }): Promise<LTApiResult>;
23
+ /**
24
+ * Validate that a subject is a valid variant of a topic pattern.
25
+ * Each `*` in the pattern matches exactly one literal segment in the subject.
26
+ * Each `>` in the pattern matches one or more trailing segments.
27
+ * Literal segments must match exactly.
28
+ */
29
+ export declare function isValidVariant(pattern: string, subject: string): boolean;
23
30
  export declare function publishTopic(input: {
24
31
  topic: string;
32
+ subject?: string;
33
+ eventId?: string;
25
34
  data: Record<string, any>;
26
35
  source?: string;
27
36
  }): Promise<LTApiResult>;
@@ -38,6 +38,7 @@ exports.getTopic = getTopic;
38
38
  exports.createTopic = createTopic;
39
39
  exports.updateTopic = updateTopic;
40
40
  exports.deleteTopic = deleteTopic;
41
+ exports.isValidVariant = isValidVariant;
41
42
  exports.publishTopic = publishTopic;
42
43
  const topicService = __importStar(require("../services/topics"));
43
44
  const events_1 = require("../lib/events");
@@ -104,10 +105,38 @@ async function deleteTopic(input) {
104
105
  return { status: 500, error: err.message };
105
106
  }
106
107
  }
108
+ /**
109
+ * Validate that a subject is a valid variant of a topic pattern.
110
+ * Each `*` in the pattern matches exactly one literal segment in the subject.
111
+ * Each `>` in the pattern matches one or more trailing segments.
112
+ * Literal segments must match exactly.
113
+ */
114
+ function isValidVariant(pattern, subject) {
115
+ const patternParts = pattern.split('.');
116
+ const subjectParts = subject.split('.');
117
+ let pi = 0;
118
+ let si = 0;
119
+ while (pi < patternParts.length && si < subjectParts.length) {
120
+ const pp = patternParts[pi];
121
+ if (pp === '>')
122
+ return true; // match-rest: everything from here is valid
123
+ if (pp !== '*' && pp !== subjectParts[si])
124
+ return false;
125
+ pi++;
126
+ si++;
127
+ }
128
+ return pi === patternParts.length && si === subjectParts.length;
129
+ }
107
130
  async function publishTopic(input) {
108
131
  try {
132
+ const publishSubject = input.subject || input.topic;
133
+ // Validate subject is a valid variant of the topic pattern
134
+ if (input.subject && !isValidVariant(input.topic, input.subject)) {
135
+ return { status: 400, error: `Subject "${input.subject}" does not match topic pattern "${input.topic}"` };
136
+ }
109
137
  const event = {
110
- type: input.topic,
138
+ id: input.eventId,
139
+ type: publishSubject,
111
140
  source: input.source || 'dashboard',
112
141
  workflowId: '',
113
142
  workflowName: '',
@@ -116,7 +145,7 @@ async function publishTopic(input) {
116
145
  timestamp: new Date().toISOString(),
117
146
  };
118
147
  await events_1.eventRegistry.publish(event);
119
- return { status: 200, data: { published: true, topic: input.topic, timestamp: event.timestamp } };
148
+ return { status: 200, data: { published: true, topic: publishSubject, timestamp: event.timestamp } };
120
149
  }
121
150
  catch (err) {
122
151
  return { status: 500, error: err.message };
@@ -12,6 +12,7 @@ declare class LTEventRegistry {
12
12
  connect(): Promise<void>;
13
13
  /**
14
14
  * Publish an event to all registered adapters.
15
+ * Auto-assigns an idempotent event ID if not provided.
15
16
  * Best-effort: individual adapter failures are logged, not thrown.
16
17
  */
17
18
  publish(event: LTEvent): Promise<void>;
@@ -24,11 +24,15 @@ class LTEventRegistry {
24
24
  }
25
25
  /**
26
26
  * Publish an event to all registered adapters.
27
+ * Auto-assigns an idempotent event ID if not provided.
27
28
  * Best-effort: individual adapter failures are logged, not thrown.
28
29
  */
29
30
  async publish(event) {
30
31
  if (!this.adapters.length)
31
32
  return;
33
+ if (!event.id) {
34
+ event.id = `evt-${Date.now()}-${Math.random().toString(16).slice(2, 6)}`;
35
+ }
32
36
  await Promise.allSettled(this.adapters.map((a) => a.publish(event).catch((err) => {
33
37
  logger_1.loggerRegistry.error(`[lt-events] adapter publish failed: ${err?.message}`);
34
38
  })));
@@ -15,7 +15,8 @@ export declare function publishMilestoneEvent(params: {
15
15
  data?: Record<string, any>;
16
16
  }): Promise<void>;
17
17
  /**
18
- * Publish a task lifecycle event (created, started, completed, escalated, failed).
18
+ * Publish a task lifecycle event.
19
+ * Subject: system.task.{taskId}.{action}
19
20
  */
20
21
  export declare function publishTaskEvent(params: {
21
22
  type: 'task.created' | 'task.started' | 'task.completed' | 'task.escalated' | 'task.failed';
@@ -30,7 +31,8 @@ export declare function publishTaskEvent(params: {
30
31
  data?: Record<string, any>;
31
32
  }): Promise<void>;
32
33
  /**
33
- * Publish an escalation lifecycle event (created, resolved).
34
+ * Publish an escalation lifecycle event.
35
+ * Subject: system.escalation.{escalationId}.{action}
34
36
  */
35
37
  export declare function publishEscalationEvent(params: {
36
38
  type: 'escalation.created' | 'escalation.resolved' | 'escalation.claimed' | 'escalation.released';
@@ -46,7 +48,7 @@ export declare function publishEscalationEvent(params: {
46
48
  }): Promise<void>;
47
49
  /**
48
50
  * Publish an activity lifecycle event for YAML workflow steps.
49
- * Lightweight — no payload data, just progress signals.
51
+ * Subject: system.activity.{workflowId}.{activityName}.{action}
50
52
  */
51
53
  export declare function publishActivityEvent(params: {
52
54
  type: 'activity.started' | 'activity.completed' | 'activity.failed';
@@ -57,9 +59,8 @@ export declare function publishActivityEvent(params: {
57
59
  data?: Record<string, any>;
58
60
  }): Promise<void>;
59
61
  /**
60
- * Publish a knowledge lifecycle event (stored, deleted).
61
- * Lightweight — no workflow context required since knowledge writes
62
- * happen both inside and outside workflows.
62
+ * Publish a knowledge lifecycle event.
63
+ * Subject: system.knowledge.{domain}.{action}
63
64
  */
64
65
  export declare function publishKnowledgeEvent(params: {
65
66
  type: 'knowledge.stored' | 'knowledge.deleted';
@@ -67,8 +68,8 @@ export declare function publishKnowledgeEvent(params: {
67
68
  key: string;
68
69
  }): Promise<void>;
69
70
  /**
70
- * Publish a file storage event (stored, deleted).
71
- * Includes rich metadata: path, name, extension, mime type, size.
71
+ * Publish a file storage event.
72
+ * Subject: system.file.{action}
72
73
  */
73
74
  export declare function publishFileEvent(params: {
74
75
  type: 'file.stored' | 'file.deleted';
@@ -78,6 +79,7 @@ export declare function publishFileEvent(params: {
78
79
  }): Promise<void>;
79
80
  /**
80
81
  * Publish an agent lifecycle event.
82
+ * Subject: system.agent.{agentName}.{action}
81
83
  */
82
84
  export declare function publishAgentEvent(params: {
83
85
  type: 'agent.started' | 'agent.completed' | 'agent.failed' | 'agent.status_changed';
@@ -87,7 +89,8 @@ export declare function publishAgentEvent(params: {
87
89
  data?: Record<string, any>;
88
90
  }): Promise<void>;
89
91
  /**
90
- * Publish a workflow lifecycle event (started, completed, failed).
92
+ * Publish a workflow lifecycle event.
93
+ * Subject: system.workflow.{workflowId}.{action}
91
94
  */
92
95
  export declare function publishWorkflowEvent(params: {
93
96
  type: 'workflow.started' | 'workflow.completed' | 'workflow.failed';
@@ -28,7 +28,7 @@ function publishMilestoneEvent(params) {
28
28
  if (!params.milestones?.length)
29
29
  return Promise.resolve();
30
30
  return fireAndForget({
31
- type: 'milestone',
31
+ type: `system.milestone.${params.workflowId}`,
32
32
  source: params.source,
33
33
  workflowId: params.workflowId,
34
34
  workflowName: params.workflowName,
@@ -41,11 +41,13 @@ function publishMilestoneEvent(params) {
41
41
  });
42
42
  }
43
43
  /**
44
- * Publish a task lifecycle event (created, started, completed, escalated, failed).
44
+ * Publish a task lifecycle event.
45
+ * Subject: system.task.{taskId}.{action}
45
46
  */
46
47
  function publishTaskEvent(params) {
48
+ const action = params.type.split('.')[1]; // created, started, completed, escalated, failed
47
49
  return fireAndForget({
48
- type: params.type,
50
+ type: `system.task.${params.taskId}.${action}`,
49
51
  source: params.source,
50
52
  workflowId: params.workflowId,
51
53
  workflowName: params.workflowName,
@@ -59,11 +61,13 @@ function publishTaskEvent(params) {
59
61
  });
60
62
  }
61
63
  /**
62
- * Publish an escalation lifecycle event (created, resolved).
64
+ * Publish an escalation lifecycle event.
65
+ * Subject: system.escalation.{escalationId}.{action}
63
66
  */
64
67
  function publishEscalationEvent(params) {
68
+ const action = params.type.split('.')[1];
65
69
  return fireAndForget({
66
- type: params.type,
70
+ type: `system.escalation.${params.escalationId}.${action}`,
67
71
  source: params.source,
68
72
  workflowId: params.workflowId,
69
73
  workflowName: params.workflowName,
@@ -78,11 +82,12 @@ function publishEscalationEvent(params) {
78
82
  }
79
83
  /**
80
84
  * Publish an activity lifecycle event for YAML workflow steps.
81
- * Lightweight — no payload data, just progress signals.
85
+ * Subject: system.activity.{workflowId}.{activityName}.{action}
82
86
  */
83
87
  function publishActivityEvent(params) {
88
+ const action = params.type.split('.')[1];
84
89
  return fireAndForget({
85
- type: params.type,
90
+ type: `system.activity.${params.workflowId}.${params.activityName}.${action}`,
86
91
  source: 'yaml-worker',
87
92
  workflowId: params.workflowId,
88
93
  workflowName: params.workflowName,
@@ -93,13 +98,13 @@ function publishActivityEvent(params) {
93
98
  });
94
99
  }
95
100
  /**
96
- * Publish a knowledge lifecycle event (stored, deleted).
97
- * Lightweight — no workflow context required since knowledge writes
98
- * happen both inside and outside workflows.
101
+ * Publish a knowledge lifecycle event.
102
+ * Subject: system.knowledge.{domain}.{action}
99
103
  */
100
104
  function publishKnowledgeEvent(params) {
105
+ const action = params.type.split('.')[1];
101
106
  return fireAndForget({
102
- type: params.type,
107
+ type: `system.knowledge.${params.domain}.${action}`,
103
108
  source: 'knowledge',
104
109
  workflowId: '',
105
110
  workflowName: '',
@@ -109,17 +114,18 @@ function publishKnowledgeEvent(params) {
109
114
  });
110
115
  }
111
116
  /**
112
- * Publish a file storage event (stored, deleted).
113
- * Includes rich metadata: path, name, extension, mime type, size.
117
+ * Publish a file storage event.
118
+ * Subject: system.file.{action}
114
119
  */
115
120
  function publishFileEvent(params) {
121
+ const action = params.type.split('.')[1];
116
122
  const parsed = params.path.split('/');
117
123
  const filename = parsed[parsed.length - 1] || '';
118
124
  const dotIdx = filename.lastIndexOf('.');
119
125
  const name = dotIdx > 0 ? filename.slice(0, dotIdx) : filename;
120
126
  const extension = dotIdx > 0 ? filename.slice(dotIdx + 1) : '';
121
127
  return fireAndForget({
122
- type: params.type,
128
+ type: `system.file.${action}`,
123
129
  source: 'file-storage',
124
130
  workflowId: '',
125
131
  workflowName: '',
@@ -137,10 +143,12 @@ function publishFileEvent(params) {
137
143
  }
138
144
  /**
139
145
  * Publish an agent lifecycle event.
146
+ * Subject: system.agent.{agentName}.{action}
140
147
  */
141
148
  function publishAgentEvent(params) {
149
+ const action = params.type.replace('agent.', '');
142
150
  return fireAndForget({
143
- type: params.type,
151
+ type: `system.agent.${params.agentName}.${action}`,
144
152
  source: 'agent',
145
153
  workflowId: params.agentId,
146
154
  workflowName: params.agentName,
@@ -151,11 +159,13 @@ function publishAgentEvent(params) {
151
159
  });
152
160
  }
153
161
  /**
154
- * Publish a workflow lifecycle event (started, completed, failed).
162
+ * Publish a workflow lifecycle event.
163
+ * Subject: system.workflow.{workflowId}.{action}
155
164
  */
156
165
  function publishWorkflowEvent(params) {
166
+ const action = params.type.split('.')[1];
157
167
  return fireAndForget({
158
- type: params.type,
168
+ type: `system.workflow.${params.workflowId}.${action}`,
159
169
  source: params.source,
160
170
  workflowId: params.workflowId,
161
171
  workflowName: params.workflowName,
@@ -52,6 +52,13 @@ export declare function setAuthAdapter(adapter: LTAuthAdapter): void;
52
52
  * JWT `role` claim for stateless admin checks. Returns 403 otherwise.
53
53
  */
54
54
  export declare const requireAdmin: RequestHandler;
55
+ /**
56
+ * Middleware that requires builder access. Must be placed AFTER requireAuth.
57
+ *
58
+ * Builders are superadmin, admin, or users with the 'engineer' role.
59
+ * This is the backend equivalent of the dashboard's `isBuilder` check.
60
+ */
61
+ export declare const requireBuilder: RequestHandler;
55
62
  /**
56
63
  * Generate a JWT token. Utility for tests and token provisioning.
57
64
  */