@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
@@ -1,15 +1,50 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
36
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
37
  };
5
38
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.requireAdmin = exports.requireAuth = exports.JwtAuthAdapter = void 0;
39
+ exports.requireBuilder = exports.requireAdmin = exports.requireAuth = exports.JwtAuthAdapter = void 0;
7
40
  exports.createAuthMiddleware = createAuthMiddleware;
8
41
  exports.setAuthAdapter = setAuthAdapter;
9
42
  exports.signToken = signToken;
10
43
  const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
11
44
  const config_1 = require("./config");
45
+ const sso_1 = require("./sso");
12
46
  const user_1 = require("../services/user");
47
+ const sso_provision_1 = require("../services/user/sso-provision");
13
48
  const bot_api_key_1 = require("../services/auth/bot-api-key");
14
49
  const principal_1 = require("../services/iam/principal");
15
50
  /**
@@ -114,7 +149,39 @@ function createAuthMiddleware(adapter) {
114
149
  * middleware delegates to the custom adapter instead.
115
150
  */
116
151
  let _authMiddleware = null;
117
- const requireAuth = (req, res, next) => {
152
+ const requireAuth = async (req, res, next) => {
153
+ // Fast path: Bearer token present — use standard JWT/adapter auth
154
+ const header = req.headers.authorization;
155
+ if (header?.startsWith('Bearer ')) {
156
+ const mw = _authMiddleware || createAuthMiddleware(new JwtAuthAdapter());
157
+ return mw(req, res, next);
158
+ }
159
+ // SSO fallback: no Bearer, but host may have authenticated via cookies/headers
160
+ const ssoConfig = (0, sso_1.getSSOConfig)();
161
+ if (ssoConfig) {
162
+ try {
163
+ const identity = await ssoConfig.resolve(req);
164
+ if (identity) {
165
+ const provisioned = await (0, sso_provision_1.ssoProvision)(identity, ssoConfig);
166
+ const highestType = provisioned.roles.some((r) => r.type === 'superadmin')
167
+ ? 'superadmin'
168
+ : provisioned.roles.some((r) => r.type === 'admin')
169
+ ? 'admin'
170
+ : 'member';
171
+ req.auth = {
172
+ userId: provisioned.userId,
173
+ role: highestType,
174
+ roles: provisioned.roles,
175
+ sso: true,
176
+ };
177
+ return next();
178
+ }
179
+ }
180
+ catch {
181
+ // SSO resolve failed — fall through to 401
182
+ }
183
+ }
184
+ // No Bearer, no SSO — delegate to standard middleware (returns 401)
118
185
  const mw = _authMiddleware || createAuthMiddleware(new JwtAuthAdapter());
119
186
  mw(req, res, next);
120
187
  };
@@ -155,6 +222,41 @@ const requireAdmin = async (req, res, next) => {
155
222
  }
156
223
  };
157
224
  exports.requireAdmin = requireAdmin;
225
+ /**
226
+ * Middleware that requires builder access. Must be placed AFTER requireAuth.
227
+ *
228
+ * Builders are superadmin, admin, or users with the 'engineer' role.
229
+ * This is the backend equivalent of the dashboard's `isBuilder` check.
230
+ */
231
+ const requireBuilder = async (req, res, next) => {
232
+ try {
233
+ if (!req.auth?.userId) {
234
+ res.status(403).json({ error: 'Forbidden' });
235
+ return;
236
+ }
237
+ // Fast path: trust the JWT role claim for admin/superadmin
238
+ if (req.auth.role === 'admin' || req.auth.role === 'superadmin') {
239
+ next();
240
+ return;
241
+ }
242
+ // Check database for superadmin role type
243
+ if (await (0, user_1.isSuperAdmin)(req.auth.userId)) {
244
+ next();
245
+ return;
246
+ }
247
+ // Check database for engineer role (builder)
248
+ const { hasRole } = await Promise.resolve().then(() => __importStar(require('../services/user/roles')));
249
+ if (await hasRole(req.auth.userId, 'engineer')) {
250
+ next();
251
+ return;
252
+ }
253
+ res.status(403).json({ error: 'Forbidden: builder access required' });
254
+ }
255
+ catch {
256
+ res.status(403).json({ error: 'Forbidden' });
257
+ }
258
+ };
259
+ exports.requireBuilder = requireBuilder;
158
260
  /**
159
261
  * Generate a JWT token. Utility for tests and token provisioning.
160
262
  */
@@ -0,0 +1,6 @@
1
+ import type { LTSSOConfig } from '../types/auth';
2
+ export declare function setSSOConfig(config: LTSSOConfig): void;
3
+ export declare function getSSOConfig(): LTSSOConfig | null;
4
+ export declare function isSSOEnabled(): boolean;
5
+ /** Reset SSO config. Used by tests. */
6
+ export declare function clearSSOConfig(): void;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setSSOConfig = setSSOConfig;
4
+ exports.getSSOConfig = getSSOConfig;
5
+ exports.isSSOEnabled = isSSOEnabled;
6
+ exports.clearSSOConfig = clearSSOConfig;
7
+ let _ssoConfig = null;
8
+ function setSSOConfig(config) {
9
+ _ssoConfig = config;
10
+ }
11
+ function getSSOConfig() {
12
+ return _ssoConfig;
13
+ }
14
+ function isSSOEnabled() {
15
+ return _ssoConfig !== null;
16
+ }
17
+ /** Reset SSO config. Used by tests. */
18
+ function clearSSOConfig() {
19
+ _ssoConfig = null;
20
+ }
@@ -0,0 +1,2 @@
1
+ declare const router: import("express-serve-static-core").Router;
2
+ export default router;
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const express_1 = require("express");
37
+ const api = __importStar(require("../api/auth-sso"));
38
+ const router = (0, express_1.Router)();
39
+ /**
40
+ * POST /api/auth/sso
41
+ * Exchange host authentication for a Long Tail JWT.
42
+ *
43
+ * No Bearer token required — the host's cookies/headers carry the auth.
44
+ * The dashboard calls this on mount when SSO is enabled, replacing the
45
+ * login form with a transparent token exchange.
46
+ */
47
+ router.post('/sso', async (req, res) => {
48
+ const result = await api.exchangeSSO(req);
49
+ res.status(result.status).json(result.data ?? { error: result.error });
50
+ });
51
+ exports.default = router;
@@ -38,7 +38,7 @@ const auth_1 = require("../modules/auth");
38
38
  const api = __importStar(require("../api/bot-accounts"));
39
39
  const router = (0, express_1.Router)();
40
40
  // All bot account routes require admin access
41
- router.use(auth_1.requireAdmin);
41
+ router.use(auth_1.requireBuilder);
42
42
  // ── Bot CRUD ─────────────────────────────────────────────────────────────────
43
43
  /**
44
44
  * GET /api/bot-accounts
@@ -42,7 +42,7 @@ const router = (0, express_1.Router)();
42
42
  * List available HotMesh application IDs.
43
43
  * Admin-only.
44
44
  */
45
- router.get('/apps', auth_1.requireAdmin, async (_req, res) => {
45
+ router.get('/apps', auth_1.requireBuilder, async (_req, res) => {
46
46
  const result = await api.listApps();
47
47
  res.status(result.status).json(result.data ?? { error: result.error });
48
48
  });
@@ -51,7 +51,7 @@ router.get('/apps', auth_1.requireAdmin, async (_req, res) => {
51
51
  * Execute a roll call — discovers all engines and workers.
52
52
  * Admin-only.
53
53
  */
54
- router.get('/rollcall', auth_1.requireAdmin, async (req, res) => {
54
+ router.get('/rollcall', auth_1.requireBuilder, async (req, res) => {
55
55
  const result = await api.rollCall({
56
56
  appId: req.query.app_id || 'durable',
57
57
  delay: req.query.delay ? parseInt(req.query.delay, 10) : undefined,
@@ -66,7 +66,7 @@ router.get('/rollcall', auth_1.requireAdmin, async (req, res) => {
66
66
  * Body: { appId: string, throttle: number, topic?: string, guid?: string }
67
67
  * throttle: ms delay (-1 = pause, 0 = resume, >0 = delay per msg)
68
68
  */
69
- router.post('/throttle', auth_1.requireAdmin, async (req, res) => {
69
+ router.post('/throttle', auth_1.requireBuilder, async (req, res) => {
70
70
  const { appId = 'durable', throttle, topic, guid, scope } = req.body;
71
71
  const result = await api.applyThrottle({ appId, throttle, topic, guid, scope });
72
72
  res.status(result.status).json(result.data ?? { error: result.error });
@@ -79,7 +79,7 @@ router.post('/throttle', auth_1.requireAdmin, async (req, res) => {
79
79
  * duration: 15m | 30m | 1h | 1d | 7d (default: 1h)
80
80
  * stream: optional stream_name filter (specific task queue topic)
81
81
  */
82
- router.get('/streams', auth_1.requireAdmin, async (req, res) => {
82
+ router.get('/streams', auth_1.requireBuilder, async (req, res) => {
83
83
  const result = await api.getStreamStats({
84
84
  app_id: req.query.app_id || 'durable',
85
85
  duration: req.query.duration || '1h',
@@ -97,7 +97,7 @@ router.get('/streams', auth_1.requireAdmin, async (req, res) => {
97
97
  * are separate tables with different schemas.
98
98
  * Admin-only.
99
99
  */
100
- router.get('/stream-messages', auth_1.requireAdmin, async (req, res) => {
100
+ router.get('/stream-messages', auth_1.requireBuilder, async (req, res) => {
101
101
  const result = await api.listStreamMessages({
102
102
  namespace: req.query.namespace,
103
103
  source: req.query.source,
@@ -124,7 +124,7 @@ router.get('/stream-messages', auth_1.requireAdmin, async (req, res) => {
124
124
  *
125
125
  * Body: { appId: string }
126
126
  */
127
- router.post('/subscribe', auth_1.requireAdmin, async (req, res) => {
127
+ router.post('/subscribe', auth_1.requireBuilder, async (req, res) => {
128
128
  const { appId = 'durable' } = req.body;
129
129
  const result = await api.subscribeMesh({ appId });
130
130
  res.status(result.status).json(result.data ?? { error: result.error });
@@ -70,6 +70,7 @@ function registerListRoutes(router) {
70
70
  type: req.query.type,
71
71
  subtype: req.query.subtype,
72
72
  assigned_to: req.query.assigned_to,
73
+ claimed: req.query.claimed === 'true',
73
74
  priority: req.query.priority ? parseInt(req.query.priority, 10) : undefined,
74
75
  limit: req.query.limit ? parseInt(req.query.limit, 10) : undefined,
75
76
  offset: req.query.offset ? parseInt(req.query.offset, 10) : undefined,
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const express_1 = require("express");
7
7
  const auth_1 = require("../modules/auth");
8
8
  const auth_2 = __importDefault(require("./auth"));
9
+ const auth_sso_1 = __importDefault(require("./auth-sso"));
9
10
  const oauth_1 = __importDefault(require("./oauth"));
10
11
  const delegation_1 = __importDefault(require("./delegation"));
11
12
  const tasks_1 = __importDefault(require("./tasks"));
@@ -36,6 +37,7 @@ const nats_credentials_1 = __importDefault(require("./nats-credentials"));
36
37
  const router = (0, express_1.Router)();
37
38
  // Public routes (no auth required — they handle their own auth)
38
39
  router.use('/auth', auth_2.default);
40
+ router.use('/auth', auth_sso_1.default);
39
41
  router.use('/auth/oauth', oauth_1.default);
40
42
  router.use('/delegation', delegation_1.default);
41
43
  router.use('/files', files_1.default);
@@ -0,0 +1,17 @@
1
+ /**
2
+ * MCP Streamable HTTP endpoint.
3
+ *
4
+ * Exposes long-tail's built-in MCP tools to external clients
5
+ * (Claude Desktop, Cursor, other agents) via the standard MCP
6
+ * streamable-http transport protocol.
7
+ *
8
+ * Stateless mode — each POST creates a fresh server+transport pair.
9
+ * Auth via Bearer token (JWT or bot API key) in the Authorization header.
10
+ *
11
+ * Mount at /mcp:
12
+ * POST /mcp → JSON-RPC messages (initialize, tools/list, tools/call)
13
+ * GET /mcp → 405 (no SSE in stateless mode)
14
+ * DELETE /mcp → 405 (no sessions in stateless mode)
15
+ */
16
+ declare const router: import("express-serve-static-core").Router;
17
+ export default router;
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ /**
3
+ * MCP Streamable HTTP endpoint.
4
+ *
5
+ * Exposes long-tail's built-in MCP tools to external clients
6
+ * (Claude Desktop, Cursor, other agents) via the standard MCP
7
+ * streamable-http transport protocol.
8
+ *
9
+ * Stateless mode — each POST creates a fresh server+transport pair.
10
+ * Auth via Bearer token (JWT or bot API key) in the Authorization header.
11
+ *
12
+ * Mount at /mcp:
13
+ * POST /mcp → JSON-RPC messages (initialize, tools/list, tools/call)
14
+ * GET /mcp → 405 (no SSE in stateless mode)
15
+ * DELETE /mcp → 405 (no sessions in stateless mode)
16
+ */
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ const express_1 = require("express");
19
+ const streamableHttp_js_1 = require("@modelcontextprotocol/sdk/server/streamableHttp.js");
20
+ const auth_1 = require("../modules/auth");
21
+ const logger_1 = require("../lib/logger");
22
+ const external_server_1 = require("../services/mcp/external-server");
23
+ const exposure_1 = require("../services/mcp/exposure");
24
+ const router = (0, express_1.Router)();
25
+ // All MCP endpoint requests require authentication
26
+ router.use(auth_1.requireAuth);
27
+ // POST /mcp — JSON-RPC messages
28
+ router.post('/', async (req, res) => {
29
+ try {
30
+ const exposure = (0, exposure_1.getExposureConfig)();
31
+ const callerScopes = req.auth?.scopes;
32
+ const server = await (0, external_server_1.createUnifiedMcpServer)(exposure, callerScopes);
33
+ const transport = new streamableHttp_js_1.StreamableHTTPServerTransport({
34
+ sessionIdGenerator: undefined, // stateless
35
+ });
36
+ res.on('close', () => {
37
+ transport.close().catch(() => { });
38
+ server.close().catch(() => { });
39
+ });
40
+ await server.connect(transport);
41
+ await transport.handleRequest(req, res, req.body);
42
+ }
43
+ catch (err) {
44
+ logger_1.loggerRegistry.error(`[lt-mcp:endpoint] error: ${err.message}`);
45
+ if (!res.headersSent) {
46
+ res.status(500).json({
47
+ jsonrpc: '2.0',
48
+ error: { code: -32603, message: 'Internal server error' },
49
+ id: null,
50
+ });
51
+ }
52
+ }
53
+ });
54
+ // GET /mcp — SSE stream (not supported in stateless mode)
55
+ router.get('/', (_req, res) => {
56
+ res.status(405).json({
57
+ jsonrpc: '2.0',
58
+ error: { code: -32000, message: 'Method not allowed. Use POST for stateless requests.' },
59
+ id: null,
60
+ });
61
+ });
62
+ // DELETE /mcp — session close (not supported in stateless mode)
63
+ router.delete('/', (_req, res) => {
64
+ res.status(405).json({
65
+ jsonrpc: '2.0',
66
+ error: { code: -32000, message: 'Method not allowed. Stateless mode has no sessions.' },
67
+ id: null,
68
+ });
69
+ });
70
+ exports.default = router;
@@ -58,7 +58,7 @@ router.get('/details', async (_req, res) => {
58
58
  * Create a standalone role. Requires admin.
59
59
  * Body: { role: string }
60
60
  */
61
- router.post('/', auth_1.requireAdmin, async (req, res) => {
61
+ router.post('/', auth_1.requireBuilder, async (req, res) => {
62
62
  const { role } = req.body || {};
63
63
  const result = await api.createRole({ role });
64
64
  res.status(result.status).json(result.data ?? { error: result.error });
@@ -76,7 +76,7 @@ router.get('/escalation-chains', async (_req, res) => {
76
76
  * Add a single escalation chain entry. Requires admin.
77
77
  * Body: { source_role: string, target_role: string }
78
78
  */
79
- router.post('/escalation-chains', auth_1.requireAdmin, async (req, res) => {
79
+ router.post('/escalation-chains', auth_1.requireBuilder, async (req, res) => {
80
80
  const { source_role, target_role } = req.body || {};
81
81
  const result = await api.addEscalationChain({ source_role, target_role });
82
82
  res.status(result.status).json(result.data ?? { error: result.error });
@@ -86,7 +86,7 @@ router.post('/escalation-chains', auth_1.requireAdmin, async (req, res) => {
86
86
  * Remove a single escalation chain entry. Requires admin.
87
87
  * Body: { source_role: string, target_role: string }
88
88
  */
89
- router.delete('/escalation-chains', auth_1.requireAdmin, async (req, res) => {
89
+ router.delete('/escalation-chains', auth_1.requireBuilder, async (req, res) => {
90
90
  const { source_role, target_role } = req.body || {};
91
91
  const result = await api.removeEscalationChain({ source_role, target_role });
92
92
  res.status(result.status).json(result.data ?? { error: result.error });
@@ -105,7 +105,7 @@ router.get('/:role/escalation-targets', async (req, res) => {
105
105
  * Replace escalation targets for a role. Requires admin.
106
106
  * Body: { targets: string[] }
107
107
  */
108
- router.put('/:role/escalation-targets', auth_1.requireAdmin, async (req, res) => {
108
+ router.put('/:role/escalation-targets', auth_1.requireBuilder, async (req, res) => {
109
109
  const { targets } = req.body || {};
110
110
  const result = await api.replaceEscalationTargets({ role: req.params.role, targets });
111
111
  res.status(result.status).json(result.data ?? { error: result.error });
@@ -114,7 +114,7 @@ router.put('/:role/escalation-targets', auth_1.requireAdmin, async (req, res) =>
114
114
  * DELETE /api/roles/:role
115
115
  * Delete a role if it has no references. Requires admin.
116
116
  */
117
- router.delete('/:role', auth_1.requireAdmin, async (req, res) => {
117
+ router.delete('/:role', auth_1.requireBuilder, async (req, res) => {
118
118
  const result = await api.deleteRole({ role: req.params.role });
119
119
  res.status(result.status).json(result.data ?? { error: result.error });
120
120
  });
@@ -94,6 +94,8 @@ router.delete('/by-name/:topic', async (req, res) => {
94
94
  router.post('/by-name/:topic/publish', async (req, res) => {
95
95
  const result = await api.publishTopic({
96
96
  topic: decodeURIComponent(req.params.topic),
97
+ subject: req.body.subject || undefined,
98
+ eventId: req.body.eventId || undefined,
97
99
  data: req.body.data ?? {},
98
100
  source: req.body.source ?? 'dashboard',
99
101
  });
@@ -66,24 +66,24 @@ router.get('/:id', async (req, res) => {
66
66
  * Create a new user.
67
67
  * Body: { external_id, email?, display_name?, roles?: [{ role, type }], metadata? }
68
68
  */
69
- router.post('/', auth_1.requireAdmin, async (req, res) => {
69
+ router.post('/', auth_1.requireBuilder, async (req, res) => {
70
70
  const result = await api.createUser(req.body || {});
71
71
  res.status(result.status).json(result.data ?? { error: result.error });
72
72
  });
73
73
  /**
74
74
  * PUT /api/users/:id
75
- * Update a user.
75
+ * Update a user. Builder only.
76
76
  * Body: { email?, display_name?, status?, metadata? }
77
77
  */
78
- router.put('/:id', auth_1.requireAdmin, async (req, res) => {
78
+ router.put('/:id', auth_1.requireBuilder, async (req, res) => {
79
79
  const result = await api.updateUser({ id: req.params.id, ...(req.body || {}) });
80
80
  res.status(result.status).json(result.data ?? { error: result.error });
81
81
  });
82
82
  /**
83
83
  * DELETE /api/users/:id
84
- * Delete a user.
84
+ * Delete a user. Builder only.
85
85
  */
86
- router.delete('/:id', auth_1.requireAdmin, async (req, res) => {
86
+ router.delete('/:id', auth_1.requireBuilder, async (req, res) => {
87
87
  const result = await api.deleteUser({ id: req.params.id });
88
88
  res.status(result.status).json(result.data ?? { error: result.error });
89
89
  });
@@ -100,9 +100,35 @@ router.get('/:id/roles', async (req, res) => {
100
100
  * POST /api/users/:id/roles
101
101
  * Add a role to a user.
102
102
  * Body: { role, type } — type must be superadmin, admin, or member
103
+ *
104
+ * Scoping rules:
105
+ * - superadmin: can assign any role/type
106
+ * - engineer: can assign up to admin type, but never superadmin type
107
+ * - role/admin (non-builder): can only assign member/admin for roles they hold
103
108
  */
104
109
  router.post('/:id/roles', auth_1.requireAdmin, async (req, res) => {
105
110
  const { role, type } = req.body || {};
111
+ const userId = req.auth.userId;
112
+ // Superadmin bypasses all scoping
113
+ const { isSuperAdmin } = await Promise.resolve().then(() => __importStar(require('../services/user/rbac')));
114
+ if (!(await isSuperAdmin(userId))) {
115
+ // Non-superadmin can never assign superadmin type
116
+ if (type === 'superadmin') {
117
+ res.status(403).json({ error: 'Only superadmin can assign superadmin role type' });
118
+ return;
119
+ }
120
+ // Check if caller has the engineer role (builder) — can assign any non-superadmin role
121
+ const { hasRole: checkRole } = await Promise.resolve().then(() => __importStar(require('../services/user/roles')));
122
+ const isEngineer = await checkRole(userId, 'engineer');
123
+ if (!isEngineer) {
124
+ // Non-builder admin: can only assign roles they themselves hold
125
+ const callerHasRole = await checkRole(userId, role);
126
+ if (!callerHasRole) {
127
+ res.status(403).json({ error: `You can only assign roles you hold. You do not have the '${role}' role.` });
128
+ return;
129
+ }
130
+ }
131
+ }
106
132
  const result = await api.addUserRole({ id: req.params.id, role, type });
107
133
  res.status(result.status).json(result.data ?? { error: result.error });
108
134
  });
@@ -89,6 +89,7 @@ export declare function createClient(options?: LTClientOptions): {
89
89
  type?: string;
90
90
  subtype?: string;
91
91
  assigned_to?: string;
92
+ claimed?: boolean;
92
93
  priority?: number;
93
94
  limit?: number;
94
95
  offset?: number;
@@ -40,7 +40,23 @@ function applyInputMapping(mapping, event) {
40
40
  if (typeof value === 'string') {
41
41
  result[key] = resolveTemplate(value, event);
42
42
  }
43
- else if (value && typeof value === 'object' && !Array.isArray(value)) {
43
+ else if (Array.isArray(value)) {
44
+ result[key] = value.map((item) => {
45
+ if (typeof item === 'string') {
46
+ const resolved = resolveTemplate(item, event);
47
+ // Coerce scalars to strings when the template was a string in an array context.
48
+ // Objects/arrays pass through (e.g., "{event.data}" resolves to the full object).
49
+ if (resolved !== null && resolved !== undefined && typeof resolved !== 'object') {
50
+ return String(resolved);
51
+ }
52
+ return resolved;
53
+ }
54
+ if (item && typeof item === 'object')
55
+ return applyInputMapping(item, event);
56
+ return item;
57
+ });
58
+ }
59
+ else if (value && typeof value === 'object') {
44
60
  result[key] = applyInputMapping(value, event);
45
61
  }
46
62
  else {
@@ -135,7 +135,20 @@ async function getEscalationRoles(ids) {
135
135
  async function releaseEscalation(id, userId) {
136
136
  const pool = (0, db_1.getPool)();
137
137
  const { rows } = await pool.query(sql_1.RELEASE_ESCALATION, [id, userId]);
138
- return rows[0] || null;
138
+ const released = rows[0];
139
+ if (released) {
140
+ (0, publish_1.publishEscalationEvent)({
141
+ type: 'escalation.released',
142
+ source: 'service',
143
+ workflowId: released.workflow_id || '',
144
+ workflowName: released.workflow_type || '',
145
+ taskQueue: released.task_queue || '',
146
+ escalationId: released.id,
147
+ status: 'released',
148
+ data: { released_by: userId },
149
+ });
150
+ }
151
+ return released || null;
139
152
  }
140
153
  async function releaseExpiredClaims() {
141
154
  const pool = (0, db_1.getPool)();
@@ -8,6 +8,7 @@ export declare function listEscalations(filters: {
8
8
  type?: string;
9
9
  subtype?: string;
10
10
  assigned_to?: string;
11
+ claimed?: boolean;
11
12
  priority?: number;
12
13
  limit?: number;
13
14
  offset?: number;
@@ -96,6 +96,13 @@ async function listEscalations(filters) {
96
96
  if (filters.assigned_to) {
97
97
  conditions.push(`assigned_to = $${idx++}`);
98
98
  values.push(filters.assigned_to);
99
+ // Only return active claims — expired claims are back in the available pool
100
+ conditions.push('assigned_until > NOW()');
101
+ }
102
+ if (filters.claimed) {
103
+ // All actively claimed escalations (by anyone)
104
+ conditions.push('assigned_to IS NOT NULL');
105
+ conditions.push('assigned_until > NOW()');
99
106
  }
100
107
  if (filters.priority) {
101
108
  conditions.push(`priority = $${idx++}`);
@@ -0,0 +1,15 @@
1
+ /**
2
+ * MCP exposure configuration — controls which tools are visible
3
+ * when long-tail acts as an MCP server for external clients.
4
+ *
5
+ * Set once at startup from startConfig.mcp.exposure.
6
+ * Read by the /mcp endpoint handler on each request.
7
+ */
8
+ export interface ExposureConfig {
9
+ readOnly?: boolean;
10
+ hideAiWhenUnavailable?: boolean;
11
+ allowServers?: string[];
12
+ denyServers?: string[];
13
+ }
14
+ export declare function setExposureConfig(config?: ExposureConfig): void;
15
+ export declare function getExposureConfig(): ExposureConfig | undefined;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ /**
3
+ * MCP exposure configuration — controls which tools are visible
4
+ * when long-tail acts as an MCP server for external clients.
5
+ *
6
+ * Set once at startup from startConfig.mcp.exposure.
7
+ * Read by the /mcp endpoint handler on each request.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.setExposureConfig = setExposureConfig;
11
+ exports.getExposureConfig = getExposureConfig;
12
+ let _exposure;
13
+ function setExposureConfig(config) {
14
+ _exposure = config;
15
+ }
16
+ function getExposureConfig() {
17
+ return _exposure;
18
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Unified MCP server for external clients.
3
+ *
4
+ * Aggregates tools from all shipped built-in servers into a single
5
+ * McpServer instance that can be connected to a StreamableHTTPServerTransport.
6
+ * Created per-request in stateless mode (pure in-memory, no IO).
7
+ */
8
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
9
+ import type { ExposureConfig } from './exposure';
10
+ /**
11
+ * Create a unified McpServer with tools from all qualifying shipped servers.
12
+ * Called per-request in stateless mode. Server instances are cached; only
13
+ * the McpServer wrapper and tool registrations are fresh (pure in-memory).
14
+ */
15
+ export declare function createUnifiedMcpServer(exposure?: ExposureConfig, callerScopes?: string[]): Promise<McpServer>;