@hotmeshio/long-tail 0.4.17 → 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 (354) hide show
  1. package/README.md +0 -2
  2. package/build/adapters/express.js +4 -0
  3. package/build/api/auth-sso.d.ts +12 -0
  4. package/build/api/auth-sso.js +54 -0
  5. package/build/api/escalations/bulk.js +2 -2
  6. package/build/api/escalations/claim.js +3 -13
  7. package/build/api/escalations/create.js +3 -2
  8. package/build/api/escalations/helpers.d.ts +1 -0
  9. package/build/api/escalations/helpers.js +6 -4
  10. package/build/api/escalations/list.d.ts +1 -0
  11. package/build/api/escalations/list.js +1 -0
  12. package/build/api/escalations/metadata.js +4 -4
  13. package/build/api/escalations/single.js +3 -2
  14. package/build/api/settings.js +6 -1
  15. package/build/api/topics.d.ts +9 -0
  16. package/build/api/topics.js +31 -2
  17. package/build/lib/events/index.d.ts +1 -0
  18. package/build/lib/events/index.js +4 -0
  19. package/build/lib/events/nats.d.ts +5 -0
  20. package/build/lib/events/nats.js +9 -0
  21. package/build/lib/events/publish.d.ts +12 -9
  22. package/build/lib/events/publish.js +27 -17
  23. package/build/modules/auth.d.ts +7 -0
  24. package/build/modules/auth.js +104 -2
  25. package/build/modules/sso.d.ts +6 -0
  26. package/build/modules/sso.js +20 -0
  27. package/build/routes/auth-sso.d.ts +2 -0
  28. package/build/routes/auth-sso.js +51 -0
  29. package/build/routes/bot-accounts.js +1 -1
  30. package/build/routes/controlplane.js +6 -6
  31. package/build/routes/escalations/list.js +1 -0
  32. package/build/routes/index.js +2 -0
  33. package/build/routes/mcp-endpoint.d.ts +17 -0
  34. package/build/routes/mcp-endpoint.js +70 -0
  35. package/build/routes/nats-credentials.js +1 -1
  36. package/build/routes/roles.js +5 -5
  37. package/build/routes/topics.js +2 -0
  38. package/build/routes/users.js +31 -5
  39. package/build/sdk/index.d.ts +1 -0
  40. package/build/services/agent/input-mapper.js +17 -1
  41. package/build/services/escalation/crud.js +14 -1
  42. package/build/services/escalation/queries.d.ts +1 -0
  43. package/build/services/escalation/queries.js +7 -0
  44. package/build/services/mcp/exposure.d.ts +15 -0
  45. package/build/services/mcp/exposure.js +18 -0
  46. package/build/services/mcp/external-server.d.ts +15 -0
  47. package/build/services/mcp/external-server.js +125 -0
  48. package/build/services/mcp/seed-service-account.d.ts +11 -0
  49. package/build/services/mcp/seed-service-account.js +77 -0
  50. package/build/services/role/index.d.ts +1 -1
  51. package/build/services/role/index.js +2 -2
  52. package/build/services/topics/system-topics.js +29 -25
  53. package/build/services/user/index.d.ts +1 -1
  54. package/build/services/user/index.js +2 -1
  55. package/build/services/user/rbac.d.ts +11 -0
  56. package/build/services/user/rbac.js +17 -0
  57. package/build/services/user/sso-provision.d.ts +19 -0
  58. package/build/services/user/sso-provision.js +62 -0
  59. package/build/services/workflow-invocation.js +5 -3
  60. package/build/start/config.js +6 -0
  61. package/build/start/server.js +2 -0
  62. package/build/start/workers.js +15 -0
  63. package/build/system/index.js +53 -35
  64. package/build/system/mcp-servers/admin/agent-subscriptions.d.ts +5 -0
  65. package/build/system/mcp-servers/admin/agent-subscriptions.js +78 -0
  66. package/build/system/mcp-servers/admin/agents.d.ts +5 -0
  67. package/build/system/mcp-servers/admin/agents.js +103 -0
  68. package/build/system/mcp-servers/admin/bot-accounts.d.ts +5 -0
  69. package/build/system/mcp-servers/admin/bot-accounts.js +126 -0
  70. package/build/system/mcp-servers/admin/controlplane.d.ts +5 -0
  71. package/build/system/mcp-servers/admin/controlplane.js +107 -0
  72. package/build/system/mcp-servers/admin/escalations.js +88 -0
  73. package/build/system/mcp-servers/admin/exports.d.ts +5 -0
  74. package/build/system/mcp-servers/admin/exports.js +101 -0
  75. package/build/system/mcp-servers/admin/index.d.ts +16 -8
  76. package/build/system/mcp-servers/admin/index.js +36 -21
  77. package/build/system/mcp-servers/admin/pipelines.d.ts +5 -0
  78. package/build/system/mcp-servers/admin/pipelines.js +96 -0
  79. package/build/system/mcp-servers/admin/schemas.d.ts +614 -6
  80. package/build/system/mcp-servers/admin/schemas.js +239 -1
  81. package/build/system/mcp-servers/admin/settings.d.ts +5 -0
  82. package/build/system/mcp-servers/admin/settings.js +53 -0
  83. package/build/system/mcp-servers/admin/topics.d.ts +5 -0
  84. package/build/system/mcp-servers/admin/topics.js +101 -0
  85. package/build/system/seed/tool-manifests-admin.d.ts +5077 -188
  86. package/build/system/seed/tool-manifests-admin.js +79 -30
  87. package/build/system/seed/tool-manifests-data.d.ts +20 -0
  88. package/build/system/seed/tool-manifests-data.js +24 -6
  89. package/build/system/seed/tool-manifests-escalation.d.ts +5 -0
  90. package/build/system/seed/tool-manifests-escalation.js +5 -0
  91. package/build/system/seed/tool-manifests-events.d.ts +4 -0
  92. package/build/system/seed/tool-manifests-events.js +4 -0
  93. package/build/system/seed/tool-manifests-knowledge.d.ts +6 -0
  94. package/build/system/seed/tool-manifests-knowledge.js +7 -0
  95. package/build/system/seed/tool-manifests-workflows.d.ts +8 -0
  96. package/build/system/seed/tool-manifests-workflows.js +8 -0
  97. package/build/tsconfig.tsbuildinfo +1 -1
  98. package/build/types/auth.d.ts +71 -0
  99. package/build/types/events.d.ts +17 -6
  100. package/build/types/index.d.ts +1 -1
  101. package/build/types/startup.d.ts +22 -1
  102. package/dashboard/dist/assets/{AdminDashboard-Cfo0mwL2.js → AdminDashboard-BwUGcCxQ.js} +2 -2
  103. package/dashboard/dist/assets/{AdminDashboard-Cfo0mwL2.js.map → AdminDashboard-BwUGcCxQ.js.map} +1 -1
  104. package/dashboard/dist/assets/AgentConfigPage-DgrYzLwq.js +16 -0
  105. package/dashboard/dist/assets/AgentConfigPage-DgrYzLwq.js.map +1 -0
  106. package/dashboard/dist/assets/{AgentDetailPage-3mZA7SOb.js → AgentDetailPage-XJpl7wfJ.js} +4 -4
  107. package/dashboard/dist/assets/AgentDetailPage-XJpl7wfJ.js.map +1 -0
  108. package/dashboard/dist/assets/{AgentsPage-CTVocfBb.js → AgentsPage-CGpVG6r8.js} +2 -2
  109. package/dashboard/dist/assets/{AgentsPage-CTVocfBb.js.map → AgentsPage-CGpVG6r8.js.map} +1 -1
  110. package/dashboard/dist/assets/AvailableEscalationsPage-DR1e0TQZ.js +2 -0
  111. package/dashboard/dist/assets/{AvailableEscalationsPage-CA9x9o5s.js.map → AvailableEscalationsPage-DR1e0TQZ.js.map} +1 -1
  112. package/dashboard/dist/assets/BotPicker-BKtjl6IL.js +2 -0
  113. package/dashboard/dist/assets/{BotPicker-BQp_Vs73.js.map → BotPicker-BKtjl6IL.js.map} +1 -1
  114. package/dashboard/dist/assets/{CapabilitiesPage-wpVtkGeU.js → CapabilitiesPage-kCB8fyOj.js} +2 -2
  115. package/dashboard/dist/assets/{CapabilitiesPage-wpVtkGeU.js.map → CapabilitiesPage-kCB8fyOj.js.map} +1 -1
  116. package/dashboard/dist/assets/{CollapsibleSection-2eZMMZiG.js → CollapsibleSection-C3tU61hB.js} +2 -2
  117. package/dashboard/dist/assets/{CollapsibleSection-2eZMMZiG.js.map → CollapsibleSection-C3tU61hB.js.map} +1 -1
  118. package/dashboard/dist/assets/{CredentialsPage-DJGLssm0.js → CredentialsPage-Dt4nJs_B.js} +2 -2
  119. package/dashboard/dist/assets/{CredentialsPage-DJGLssm0.js.map → CredentialsPage-Dt4nJs_B.js.map} +1 -1
  120. package/dashboard/dist/assets/CronLabel-BdE6mHyA.js +2 -0
  121. package/dashboard/dist/assets/CronLabel-BdE6mHyA.js.map +1 -0
  122. package/dashboard/dist/assets/{CustomDurationPicker-DbyqfK35.js → CustomDurationPicker-B_Yxfb-u.js} +2 -2
  123. package/dashboard/dist/assets/{CustomDurationPicker-DbyqfK35.js.map → CustomDurationPicker-B_Yxfb-u.js.map} +1 -1
  124. package/dashboard/dist/assets/{DropZone-BkfRoUcm.js → DropZone-CptiQ0wc.js} +2 -2
  125. package/dashboard/dist/assets/{DropZone-BkfRoUcm.js.map → DropZone-CptiQ0wc.js.map} +1 -1
  126. package/dashboard/dist/assets/ElapsedCell-tcGx5PFI.js +2 -0
  127. package/dashboard/dist/assets/{ElapsedCell-BPYm8RA7.js.map → ElapsedCell-tcGx5PFI.js.map} +1 -1
  128. package/dashboard/dist/assets/{EscalationsOverview-kYGHfnLf.js → EscalationsOverview-1KO5dXzk.js} +2 -2
  129. package/dashboard/dist/assets/{EscalationsOverview-kYGHfnLf.js.map → EscalationsOverview-1KO5dXzk.js.map} +1 -1
  130. package/dashboard/dist/assets/{EventTable-DSDzJMer.js → EventTable-DnpsQ6Ew.js} +2 -2
  131. package/dashboard/dist/assets/{EventTable-DSDzJMer.js.map → EventTable-DnpsQ6Ew.js.map} +1 -1
  132. package/dashboard/dist/assets/HomePage-B2Jgo1J1.js +2 -0
  133. package/dashboard/dist/assets/HomePage-B2Jgo1J1.js.map +1 -0
  134. package/dashboard/dist/assets/ListToolbar-jrVba7QN.js +2 -0
  135. package/dashboard/dist/assets/{ListToolbar-DEef1_-T.js.map → ListToolbar-jrVba7QN.js.map} +1 -1
  136. package/dashboard/dist/assets/{McpOverview-CZFW5qMb.js → McpOverview-BzyxJyc9.js} +2 -2
  137. package/dashboard/dist/assets/{McpOverview-CZFW5qMb.js.map → McpOverview-BzyxJyc9.js.map} +1 -1
  138. package/dashboard/dist/assets/{McpQueryDetailPage-q9xH-QRo.js → McpQueryDetailPage-DXNseeKl.js} +2 -2
  139. package/dashboard/dist/assets/{McpQueryDetailPage-q9xH-QRo.js.map → McpQueryDetailPage-DXNseeKl.js.map} +1 -1
  140. package/dashboard/dist/assets/{McpQueryPage-D14466yi.js → McpQueryPage-WZfTY43_.js} +2 -2
  141. package/dashboard/dist/assets/{McpQueryPage-D14466yi.js.map → McpQueryPage-WZfTY43_.js.map} +1 -1
  142. package/dashboard/dist/assets/McpRunDetailPage-DKZp-p7S.js +2 -0
  143. package/dashboard/dist/assets/McpRunDetailPage-DKZp-p7S.js.map +1 -0
  144. package/dashboard/dist/assets/McpRunsPage-SXyiwc0d.js +2 -0
  145. package/dashboard/dist/assets/{McpRunsPage-aZg057y3.js.map → McpRunsPage-SXyiwc0d.js.map} +1 -1
  146. package/dashboard/dist/assets/OperatorDashboard-Cy7ySMXj.js +2 -0
  147. package/dashboard/dist/assets/OperatorDashboard-Cy7ySMXj.js.map +1 -0
  148. package/dashboard/dist/assets/{PageHeader-CR6TpJG_.js → PageHeader-BuJpMxyu.js} +2 -2
  149. package/dashboard/dist/assets/{PageHeader-CR6TpJG_.js.map → PageHeader-BuJpMxyu.js.map} +1 -1
  150. package/dashboard/dist/assets/{PageHeaderWithStats-CRcQEAO1.js → PageHeaderWithStats-yD_PTbOl.js} +2 -2
  151. package/dashboard/dist/assets/{PageHeaderWithStats-CRcQEAO1.js.map → PageHeaderWithStats-yD_PTbOl.js.map} +1 -1
  152. package/dashboard/dist/assets/{ProcessDetailPage-DyzNjwu8.js → ProcessDetailPage-DYIfvWyc.js} +2 -2
  153. package/dashboard/dist/assets/{ProcessDetailPage-DyzNjwu8.js.map → ProcessDetailPage-DYIfvWyc.js.map} +1 -1
  154. package/dashboard/dist/assets/{ProcessesListPage-CT_3b5Wt.js → ProcessesListPage-DR1RGaMl.js} +2 -2
  155. package/dashboard/dist/assets/{ProcessesListPage-CT_3b5Wt.js.map → ProcessesListPage-DR1RGaMl.js.map} +1 -1
  156. package/dashboard/dist/assets/{RolePill-BC54Vn-U.js → RolePill-SasQKc_B.js} +2 -2
  157. package/dashboard/dist/assets/{RolePill-BC54Vn-U.js.map → RolePill-SasQKc_B.js.map} +1 -1
  158. package/dashboard/dist/assets/{RolesPage-CpRJq-sg.js → RolesPage-pMERxj15.js} +2 -2
  159. package/dashboard/dist/assets/{RolesPage-CpRJq-sg.js.map → RolesPage-pMERxj15.js.map} +1 -1
  160. package/dashboard/dist/assets/{RunAsSelector-C20rdNsC.js → RunAsSelector-B-ksMoEj.js} +2 -2
  161. package/dashboard/dist/assets/{RunAsSelector-C20rdNsC.js.map → RunAsSelector-B-ksMoEj.js.map} +1 -1
  162. package/dashboard/dist/assets/ServerName-CHspudaC.js +2 -0
  163. package/dashboard/dist/assets/{ServerName-Q6okiv4f.js.map → ServerName-CHspudaC.js.map} +1 -1
  164. package/dashboard/dist/assets/{SwimlaneTimeline-CbFaU4bq.js → SwimlaneTimeline-Cr_K5qpu.js} +2 -2
  165. package/dashboard/dist/assets/{SwimlaneTimeline-CbFaU4bq.js.map → SwimlaneTimeline-Cr_K5qpu.js.map} +1 -1
  166. package/dashboard/dist/assets/{TagInput-D6l1SPWd.js → TagInput-DvF3j8MA.js} +2 -2
  167. package/dashboard/dist/assets/{TagInput-D6l1SPWd.js.map → TagInput-DvF3j8MA.js.map} +1 -1
  168. package/dashboard/dist/assets/{TaskDetailPage-22cJsFmM.js → TaskDetailPage-BO5p7AEe.js} +2 -2
  169. package/dashboard/dist/assets/{TaskDetailPage-22cJsFmM.js.map → TaskDetailPage-BO5p7AEe.js.map} +1 -1
  170. package/dashboard/dist/assets/{TaskQueuePill-iDBVCEQQ.js → TaskQueuePill-BCQrS2oK.js} +2 -2
  171. package/dashboard/dist/assets/{TaskQueuePill-iDBVCEQQ.js.map → TaskQueuePill-BCQrS2oK.js.map} +1 -1
  172. package/dashboard/dist/assets/{TasksListPage-BDmaUIKu.js → TasksListPage-BRg-uFtF.js} +2 -2
  173. package/dashboard/dist/assets/{TasksListPage-BDmaUIKu.js.map → TasksListPage-BRg-uFtF.js.map} +1 -1
  174. package/dashboard/dist/assets/{TimeAgo-7wqEp87-.js → TimeAgo-BSzN6rAH.js} +2 -2
  175. package/dashboard/dist/assets/{TimeAgo-7wqEp87-.js.map → TimeAgo-BSzN6rAH.js.map} +1 -1
  176. package/dashboard/dist/assets/{TimestampCell-BBCf8zsN.js → TimestampCell-DL6zMNEQ.js} +2 -2
  177. package/dashboard/dist/assets/{TimestampCell-BBCf8zsN.js.map → TimestampCell-DL6zMNEQ.js.map} +1 -1
  178. package/dashboard/dist/assets/{ToolPill-HcRTggHo.js → ToolPill-1aTqYtzp.js} +2 -2
  179. package/dashboard/dist/assets/{ToolPill-HcRTggHo.js.map → ToolPill-1aTqYtzp.js.map} +1 -1
  180. package/dashboard/dist/assets/{ToolTestPanel-Dosq1cqG.js → ToolTestPanel-fLzNp79U.js} +2 -2
  181. package/dashboard/dist/assets/{ToolTestPanel-Dosq1cqG.js.map → ToolTestPanel-fLzNp79U.js.map} +1 -1
  182. package/dashboard/dist/assets/TopicDetailPage-D7gCsPKB.js +9 -0
  183. package/dashboard/dist/assets/TopicDetailPage-D7gCsPKB.js.map +1 -0
  184. package/dashboard/dist/assets/{TopicsPage-tVPdz-k0.js → TopicsPage-B3Aa8Haz.js} +2 -2
  185. package/dashboard/dist/assets/{TopicsPage-tVPdz-k0.js.map → TopicsPage-B3Aa8Haz.js.map} +1 -1
  186. package/dashboard/dist/assets/{UserName-DX7IBjFn.js → UserName-BjHIJWgh.js} +2 -2
  187. package/dashboard/dist/assets/{UserName-DX7IBjFn.js.map → UserName-BjHIJWgh.js.map} +1 -1
  188. package/dashboard/dist/assets/{WorkflowExecutionPage-BjC0j9_L.js → WorkflowExecutionPage-BQ7AYlQA.js} +2 -2
  189. package/dashboard/dist/assets/{WorkflowExecutionPage-BjC0j9_L.js.map → WorkflowExecutionPage-BQ7AYlQA.js.map} +1 -1
  190. package/dashboard/dist/assets/{WorkflowPill-54px0YiY.js → WorkflowPill-Z-zHRKOK.js} +2 -2
  191. package/dashboard/dist/assets/{WorkflowPill-54px0YiY.js.map → WorkflowPill-Z-zHRKOK.js.map} +1 -1
  192. package/dashboard/dist/assets/WorkflowsDashboard-D-G8Xudz.js +2 -0
  193. package/dashboard/dist/assets/WorkflowsDashboard-D-G8Xudz.js.map +1 -0
  194. package/dashboard/dist/assets/{WorkflowsOverview-DaJRDkNy.js → WorkflowsOverview-B4DUcVxs.js} +2 -2
  195. package/dashboard/dist/assets/{WorkflowsOverview-DaJRDkNy.js.map → WorkflowsOverview-B4DUcVxs.js.map} +1 -1
  196. package/dashboard/dist/assets/{YamlWorkflowsPage-CkpQaUmz.js → YamlWorkflowsPage-CnTNOku0.js} +2 -2
  197. package/dashboard/dist/assets/{YamlWorkflowsPage-CkpQaUmz.js.map → YamlWorkflowsPage-CnTNOku0.js.map} +1 -1
  198. package/dashboard/dist/assets/{agents-B-P5MlEx.js → agents-CkvQDr9b.js} +2 -2
  199. package/dashboard/dist/assets/{agents-B-P5MlEx.js.map → agents-CkvQDr9b.js.map} +1 -1
  200. package/dashboard/dist/assets/{bots-CZz9iVys.js → bots-CzuMCVgU.js} +2 -2
  201. package/dashboard/dist/assets/{bots-CZz9iVys.js.map → bots-CzuMCVgU.js.map} +1 -1
  202. package/dashboard/dist/assets/{capabilities-DrZ8Vw_v.js → capabilities-CbGmS0ty.js} +2 -2
  203. package/dashboard/dist/assets/{capabilities-DrZ8Vw_v.js.map → capabilities-CbGmS0ty.js.map} +1 -1
  204. package/dashboard/dist/assets/{controlplane-cj-1c-1C.js → controlplane-DGvwkuYx.js} +2 -2
  205. package/dashboard/dist/assets/{controlplane-cj-1c-1C.js.map → controlplane-DGvwkuYx.js.map} +1 -1
  206. package/dashboard/dist/assets/{escalation-BEVFyQnE.js → escalation-B7ysVToF.js} +2 -2
  207. package/dashboard/dist/assets/{escalation-BEVFyQnE.js.map → escalation-B7ysVToF.js.map} +1 -1
  208. package/dashboard/dist/assets/{escalation-columns-Beox3TXH.js → escalation-columns-CHQEJU1j.js} +2 -2
  209. package/dashboard/dist/assets/{escalation-columns-Beox3TXH.js.map → escalation-columns-CHQEJU1j.js.map} +1 -1
  210. package/dashboard/dist/assets/{helpers-B4gzNq9h.js → helpers-BFOjXa4r.js} +2 -2
  211. package/dashboard/dist/assets/{helpers-B4gzNq9h.js.map → helpers-BFOjXa4r.js.map} +1 -1
  212. package/dashboard/dist/assets/index-B9_1AZaG.js +2 -0
  213. package/dashboard/dist/assets/{index-3n5VREXN.js.map → index-B9_1AZaG.js.map} +1 -1
  214. package/dashboard/dist/assets/{index-BCQ65lNu.js → index-BFaDxPxA.js} +2 -2
  215. package/dashboard/dist/assets/{index-BCQ65lNu.js.map → index-BFaDxPxA.js.map} +1 -1
  216. package/dashboard/dist/assets/index-BduDiGcw.js +15 -0
  217. package/dashboard/dist/assets/{index-UtAfnStw.js.map → index-BduDiGcw.js.map} +1 -1
  218. package/dashboard/dist/assets/{index-Bh-PnP17.js → index-BeLphL59.js} +2 -2
  219. package/dashboard/dist/assets/{index-Bh-PnP17.js.map → index-BeLphL59.js.map} +1 -1
  220. package/dashboard/dist/assets/index-C--SEsU7.css +1 -0
  221. package/dashboard/dist/assets/{index-_DfbFHXk.js → index-CRiBkHPb.js} +2 -2
  222. package/dashboard/dist/assets/{index-_DfbFHXk.js.map → index-CRiBkHPb.js.map} +1 -1
  223. package/dashboard/dist/assets/{index-DdKbIZNE.js → index-CbrMW-gM.js} +2 -2
  224. package/dashboard/dist/assets/{index-DdKbIZNE.js.map → index-CbrMW-gM.js.map} +1 -1
  225. package/dashboard/dist/assets/{index-aJRDh4zW.js → index-CvOGgvzP.js} +2 -2
  226. package/dashboard/dist/assets/{index-aJRDh4zW.js.map → index-CvOGgvzP.js.map} +1 -1
  227. package/dashboard/dist/assets/{index-D1MywQ2z.js → index-DDlrQeTj.js} +2 -2
  228. package/dashboard/dist/assets/{index-D1MywQ2z.js.map → index-DDlrQeTj.js.map} +1 -1
  229. package/dashboard/dist/assets/{index-BYXiz05a.js → index-DQHmfTPo.js} +2 -2
  230. package/dashboard/dist/assets/{index-BYXiz05a.js.map → index-DQHmfTPo.js.map} +1 -1
  231. package/dashboard/dist/assets/{index-BpN31nuC.js → index-_BRA9uFL.js} +25 -25
  232. package/dashboard/dist/assets/index-_BRA9uFL.js.map +1 -0
  233. package/dashboard/dist/assets/index-a98qWLB-.js +2 -0
  234. package/dashboard/dist/assets/index-a98qWLB-.js.map +1 -0
  235. package/dashboard/dist/assets/index-l_8R6U4r.js +6 -0
  236. package/dashboard/dist/assets/index-l_8R6U4r.js.map +1 -0
  237. package/dashboard/dist/assets/{index-D4KGadbW.js → index-v0OQpgXS.js} +2 -2
  238. package/dashboard/dist/assets/{index-D4KGadbW.js.map → index-v0OQpgXS.js.map} +1 -1
  239. package/dashboard/dist/assets/{knowledge-DhtKWMON.js → knowledge-BlF8UMrk.js} +2 -2
  240. package/dashboard/dist/assets/{knowledge-DhtKWMON.js.map → knowledge-BlF8UMrk.js.map} +1 -1
  241. package/dashboard/dist/assets/{mcp-BXN7-wGF.js → mcp-MtXuky8q.js} +2 -2
  242. package/dashboard/dist/assets/{mcp-BXN7-wGF.js.map → mcp-MtXuky8q.js.map} +1 -1
  243. package/dashboard/dist/assets/{mcp-query-BIJP4mQJ.js → mcp-query-DQ-J1Q0K.js} +2 -2
  244. package/dashboard/dist/assets/{mcp-query-BIJP4mQJ.js.map → mcp-query-DQ-J1Q0K.js.map} +1 -1
  245. package/dashboard/dist/assets/{namespaces-ne_yDQZX.js → namespaces-DtsT_GoV.js} +2 -2
  246. package/dashboard/dist/assets/{namespaces-ne_yDQZX.js.map → namespaces-DtsT_GoV.js.map} +1 -1
  247. package/dashboard/dist/assets/{pipelines-Bcz62DoS.js → pipelines-BjlCm9VH.js} +2 -2
  248. package/dashboard/dist/assets/{pipelines-Bcz62DoS.js.map → pipelines-BjlCm9VH.js.map} +1 -1
  249. package/dashboard/dist/assets/{roles-De2CzGCy.js → roles-D-LhJ82d.js} +2 -2
  250. package/dashboard/dist/assets/{roles-De2CzGCy.js.map → roles-D-LhJ82d.js.map} +1 -1
  251. package/dashboard/dist/assets/{tasks-4yL5EfxI.js → tasks-BrP_8uEN.js} +2 -2
  252. package/dashboard/dist/assets/{tasks-4yL5EfxI.js.map → tasks-BrP_8uEN.js.map} +1 -1
  253. package/dashboard/dist/assets/topics-DUk-zX5D.js +2 -0
  254. package/dashboard/dist/assets/{topics-DDKHpRwP.js.map → topics-DUk-zX5D.js.map} +1 -1
  255. package/dashboard/dist/assets/useEventHooks-XNNzwADV.js +2 -0
  256. package/dashboard/dist/assets/useEventHooks-XNNzwADV.js.map +1 -0
  257. package/dashboard/dist/assets/{useYamlActivityEvents-Dv6GhDkh.js → useYamlActivityEvents-DANQ5jIY.js} +2 -2
  258. package/dashboard/dist/assets/{useYamlActivityEvents-Dv6GhDkh.js.map → useYamlActivityEvents-DANQ5jIY.js.map} +1 -1
  259. package/dashboard/dist/assets/{users-pSMWP58G.js → users-vj0JgOkA.js} +2 -2
  260. package/dashboard/dist/assets/{users-pSMWP58G.js.map → users-vj0JgOkA.js.map} +1 -1
  261. package/dashboard/dist/assets/{vendor-icons-CrrAvF2g.js → vendor-icons-Doy0g69_.js} +116 -111
  262. package/dashboard/dist/assets/vendor-icons-Doy0g69_.js.map +1 -0
  263. package/dashboard/dist/assets/{workflows-COYPOe2I.js → workflows-CmqgGPzI.js} +2 -2
  264. package/dashboard/dist/assets/{workflows-COYPOe2I.js.map → workflows-CmqgGPzI.js.map} +1 -1
  265. package/dashboard/dist/assets/{yaml-workflows-1dF3ig6u.js → yaml-workflows-DNFyjBXH.js} +2 -2
  266. package/dashboard/dist/assets/{yaml-workflows-1dF3ig6u.js.map → yaml-workflows-DNFyjBXH.js.map} +1 -1
  267. package/dashboard/dist/index.html +3 -3
  268. package/docs/api/http/controlplane.md +1 -1
  269. package/docs/api/http/mcp-endpoint.md +133 -0
  270. package/docs/api/http/roles.md +46 -0
  271. package/docs/api/http/service-accounts.md +15 -0
  272. package/docs/api/http/settings.md +6 -0
  273. package/docs/api/mcp/admin.md +1187 -0
  274. package/docs/api/mcp/claude-code.md +47 -0
  275. package/docs/api/mcp/docs.md +54 -0
  276. package/docs/api/mcp/events.md +80 -0
  277. package/docs/api/mcp/file-storage.md +76 -0
  278. package/docs/api/mcp/http-fetch.md +64 -0
  279. package/docs/api/mcp/human-queue.md +101 -0
  280. package/docs/api/mcp/index.md +52 -0
  281. package/docs/api/mcp/knowledge.md +125 -0
  282. package/docs/api/mcp/oauth.md +62 -0
  283. package/docs/api/mcp/schema-exchange.md +56 -0
  284. package/docs/api/mcp/translation.md +28 -0
  285. package/docs/api/mcp/vision.md +46 -0
  286. package/docs/api/sdk/settings.md +3 -1
  287. package/docs/auth.md +109 -0
  288. package/docs/dashboard.md +1 -1
  289. package/package.json +1 -1
  290. package/build/system/mcp-servers/playwright/browser-lifecycle.d.ts +0 -26
  291. package/build/system/mcp-servers/playwright/browser-lifecycle.js +0 -125
  292. package/build/system/mcp-servers/playwright/index.d.ts +0 -25
  293. package/build/system/mcp-servers/playwright/index.js +0 -42
  294. package/build/system/mcp-servers/playwright/schemas.d.ts +0 -394
  295. package/build/system/mcp-servers/playwright/schemas.js +0 -90
  296. package/build/system/mcp-servers/playwright/tools-atomic.d.ts +0 -2
  297. package/build/system/mcp-servers/playwright/tools-atomic.js +0 -9
  298. package/build/system/mcp-servers/playwright/tools-navigation.d.ts +0 -2
  299. package/build/system/mcp-servers/playwright/tools-navigation.js +0 -153
  300. package/build/system/mcp-servers/playwright/tools-page-interaction.d.ts +0 -2
  301. package/build/system/mcp-servers/playwright/tools-page-interaction.js +0 -162
  302. package/build/system/mcp-servers/playwright/tools-run-script.d.ts +0 -2
  303. package/build/system/mcp-servers/playwright/tools-run-script.js +0 -207
  304. package/build/system/mcp-servers/playwright/types.d.ts +0 -8
  305. package/build/system/mcp-servers/playwright/types.js +0 -30
  306. package/build/system/mcp-servers/playwright/vision-helper.d.ts +0 -12
  307. package/build/system/mcp-servers/playwright/vision-helper.js +0 -81
  308. package/build/system/mcp-servers/playwright-cli/helpers.d.ts +0 -11
  309. package/build/system/mcp-servers/playwright-cli/helpers.js +0 -20
  310. package/build/system/mcp-servers/playwright-cli/index.d.ts +0 -4
  311. package/build/system/mcp-servers/playwright-cli/index.js +0 -15
  312. package/build/system/mcp-servers/playwright-cli/schemas.d.ts +0 -219
  313. package/build/system/mcp-servers/playwright-cli/schemas.js +0 -75
  314. package/build/system/mcp-servers/playwright-cli/tools-auth.d.ts +0 -2
  315. package/build/system/mcp-servers/playwright-cli/tools-auth.js +0 -183
  316. package/build/system/mcp-servers/playwright-cli/tools-capture.d.ts +0 -2
  317. package/build/system/mcp-servers/playwright-cli/tools-capture.js +0 -273
  318. package/build/system/seed/tool-manifests-browser.d.ts +0 -577
  319. package/build/system/seed/tool-manifests-browser.js +0 -158
  320. package/dashboard/dist/assets/AgentConfigPage-DBtvb2x5.js +0 -16
  321. package/dashboard/dist/assets/AgentConfigPage-DBtvb2x5.js.map +0 -1
  322. package/dashboard/dist/assets/AgentDetailPage-3mZA7SOb.js.map +0 -1
  323. package/dashboard/dist/assets/AvailableEscalationsPage-CA9x9o5s.js +0 -2
  324. package/dashboard/dist/assets/BotPicker-BQp_Vs73.js +0 -2
  325. package/dashboard/dist/assets/CronLabel-DY8VdTS9.js +0 -2
  326. package/dashboard/dist/assets/CronLabel-DY8VdTS9.js.map +0 -1
  327. package/dashboard/dist/assets/ElapsedCell-BPYm8RA7.js +0 -2
  328. package/dashboard/dist/assets/EventTopicPill-CCWCs07y.js +0 -2
  329. package/dashboard/dist/assets/EventTopicPill-CCWCs07y.js.map +0 -1
  330. package/dashboard/dist/assets/HomePage-CwRebzmO.js +0 -2
  331. package/dashboard/dist/assets/HomePage-CwRebzmO.js.map +0 -1
  332. package/dashboard/dist/assets/ListToolbar-DEef1_-T.js +0 -2
  333. package/dashboard/dist/assets/McpRunDetailPage-X0sfRFTk.js +0 -2
  334. package/dashboard/dist/assets/McpRunDetailPage-X0sfRFTk.js.map +0 -1
  335. package/dashboard/dist/assets/McpRunsPage-aZg057y3.js +0 -2
  336. package/dashboard/dist/assets/OperatorDashboard-iZEHnndU.js +0 -2
  337. package/dashboard/dist/assets/OperatorDashboard-iZEHnndU.js.map +0 -1
  338. package/dashboard/dist/assets/ServerName-Q6okiv4f.js +0 -2
  339. package/dashboard/dist/assets/TopicDetailPage-DW97-YHQ.js +0 -9
  340. package/dashboard/dist/assets/TopicDetailPage-DW97-YHQ.js.map +0 -1
  341. package/dashboard/dist/assets/WorkflowsDashboard-eCH4gpAk.js +0 -2
  342. package/dashboard/dist/assets/WorkflowsDashboard-eCH4gpAk.js.map +0 -1
  343. package/dashboard/dist/assets/index-3n5VREXN.js +0 -2
  344. package/dashboard/dist/assets/index-BAXzN-QB.js +0 -6
  345. package/dashboard/dist/assets/index-BAXzN-QB.js.map +0 -1
  346. package/dashboard/dist/assets/index-BpN31nuC.js.map +0 -1
  347. package/dashboard/dist/assets/index-C37LMzJa.css +0 -1
  348. package/dashboard/dist/assets/index-C5dHozmW.js +0 -2
  349. package/dashboard/dist/assets/index-C5dHozmW.js.map +0 -1
  350. package/dashboard/dist/assets/index-UtAfnStw.js +0 -15
  351. package/dashboard/dist/assets/topics-DDKHpRwP.js +0 -2
  352. package/dashboard/dist/assets/useEventHooks-NzIyvoGY.js +0 -2
  353. package/dashboard/dist/assets/useEventHooks-NzIyvoGY.js.map +0 -1
  354. package/dashboard/dist/assets/vendor-icons-CrrAvF2g.js.map +0 -1
@@ -0,0 +1,56 @@
1
+ # Schema Exchange
2
+
3
+ Schema-driven data exchange with external service endpoints. Validates requests and responses against JSON Schema.
4
+
5
+ | Property | Value |
6
+ |----------|-------|
7
+ | Server ID | `long-tail-schema-exchange` |
8
+ | Category | Data |
9
+ | AI required | No |
10
+ | Credential providers | — |
11
+
12
+ ## Compile Hints
13
+
14
+ Validates requests before sending and responses after receiving. Embed request_schema and response_schema as STATIC values. Exchange output: { status, data, headers, elapsed_ms, validated }. API response is in .data field. For auth, prefer credential_provider over manual token wiring.
15
+
16
+ ## Tools
17
+
18
+ ### exchange
19
+
20
+ Exchange data with an external service endpoint under schema enforcement. Validates request body against request_schema before sending and response body against response_schema after receiving.
21
+
22
+ | | |
23
+ |---|---|
24
+ | Read-safe | No |
25
+
26
+ **Parameters:**
27
+
28
+ | Field | Type | Required | Description |
29
+ |-------|------|----------|-------------|
30
+ | endpoint | string | Yes | Service endpoint URL |
31
+ | method | string | Yes | HTTP method: GET, POST, PUT, DELETE, PATCH |
32
+ | headers | object | No | Request headers |
33
+ | query | object | No | Query parameters |
34
+ | body | any | No | Request body (validated against request_schema if provided) |
35
+ | request_schema | object | No | JSON Schema for request body validation |
36
+ | response_schema | object | No | JSON Schema for response body validation |
37
+ | timeout_ms | number | No | Request timeout in milliseconds |
38
+ | credential_provider | string | No | Credential provider name — resolves auth from the connection store automatically |
39
+ | credential_label | string | No | Credential label for multi-credential accounts |
40
+ | auth_scheme | string | No | Auth scheme (default: Bearer) |
41
+ | auth_header | string | No | Header name for credential (default: Authorization) |
42
+
43
+ ### validate_schema
44
+
45
+ Validate any value against a JSON Schema without making a network call. Useful for pre-validation, testing, and transform verification.
46
+
47
+ | | |
48
+ |---|---|
49
+ | Read-safe | Yes |
50
+
51
+ **Parameters:**
52
+
53
+ | Field | Type | Required | Description |
54
+ |-------|------|----------|-------------|
55
+ | data | any | Yes | The value to validate |
56
+ | schema | object | Yes | JSON Schema to validate against |
@@ -0,0 +1,28 @@
1
+ # Translation
2
+
3
+ Text translation using LLM. Translates content between languages with automatic source language detection.
4
+
5
+ | Property | Value |
6
+ |----------|-------|
7
+ | Server ID | `long-tail-translation` |
8
+ | Category | Analysis |
9
+ | AI required | Yes |
10
+ | Credential providers | anthropic |
11
+
12
+ ## Tools
13
+
14
+ ### translate_content
15
+
16
+ Translate content to target language.
17
+
18
+ | | |
19
+ |---|---|
20
+ | Read-safe | Yes |
21
+
22
+ **Parameters:**
23
+
24
+ | Field | Type | Required | Description |
25
+ |-------|------|----------|-------------|
26
+ | content | string | Yes | The content to translate. |
27
+ | target_language | string | Yes | Target language for the translation. |
28
+ | source_language | string | No | Source language. Auto-detected if omitted. |
@@ -0,0 +1,46 @@
1
+ # Vision
2
+
3
+ Image analysis and description using LLM vision. Analyzes images to extract structured data, text content, and descriptions.
4
+
5
+ | Property | Value |
6
+ |----------|-------|
7
+ | Server ID | `long-tail-vision` |
8
+ | Category | Analysis |
9
+ | AI required | Yes |
10
+ | Credential providers | anthropic |
11
+
12
+ ## Compile Hints
13
+
14
+ Vision tools process one image at a time. The argument name is `image` (NOT `image_path`). It accepts a storage path, data URI, or https:// URL. Vision tools do NOT use browser sessions. Do NOT wire page_id or _handle to vision tools. analyze_image output fields: description (string), text_content (string), objects (array).
15
+
16
+ ## Tools
17
+
18
+ ### analyze_image
19
+
20
+ Analyze an image and extract structured data.
21
+
22
+ | | |
23
+ |---|---|
24
+ | Read-safe | Yes |
25
+
26
+ **Parameters:**
27
+
28
+ | Field | Type | Required | Description |
29
+ |-------|------|----------|-------------|
30
+ | image | string | Yes | Image source: storage path, data URI, or https:// URL. |
31
+ | prompt | string | No | Optional prompt to guide the analysis. |
32
+
33
+ ### describe_image
34
+
35
+ Generate a detailed description of an image.
36
+
37
+ | | |
38
+ |---|---|
39
+ | Read-safe | Yes |
40
+
41
+ **Parameters:**
42
+
43
+ | Field | Type | Required | Description |
44
+ |-------|------|----------|-------------|
45
+ | image | string | Yes | Image source: storage path, data URI, or https:// URL. |
46
+ | context | string | No | Optional context to guide the description. |
@@ -12,7 +12,7 @@ const result = await lt.settings.get();
12
12
 
13
13
  **Parameters:** None
14
14
 
15
- **Returns:** `LTApiResult<{ telemetry, escalation, events, ai }>`
15
+ **Returns:** `LTApiResult<{ telemetry, escalation, events, auth, ai }>`
16
16
 
17
17
  | Field | Type | Description |
18
18
  |-------|------|-------------|
@@ -21,6 +21,8 @@ const result = await lt.settings.get();
21
21
  | `events.transport` | `'socketio' \| 'nats' \| 'none'` | Dashboard event transport (default: `socketio`; `nats` when `EVENT_TRANSPORT=nats`) |
22
22
  | `events.natsWsUrl` | `string \| null` | NATS WebSocket URL (present when NATS adapter registered) |
23
23
  | `events.natsToken` | `string \| null` | NATS auth token (present when NATS adapter registered) |
24
+ | `auth.sso` | `boolean` | Whether SSO is configured for embedded deployments |
25
+ | `auth.ssoLogoutUrl` | `string \| null` | Host logout URL (redirected to on dashboard sign out) |
24
26
  | `ai.enabled` | `boolean` | Whether an LLM API key is configured |
25
27
 
26
28
  **Auth:** Not required
package/docs/auth.md CHANGED
@@ -136,6 +136,115 @@ await start({
136
136
 
137
137
  This adapter grants admin access to every request. Restrict its use to local environments.
138
138
 
139
+ ## SSO for Embedded Deployments
140
+
141
+ When Long Tail is mounted inside a host application (NestJS, Express, Rails, etc.) at a subpath, users authenticate with the host — not with Long Tail. The host's middleware validates cookies, headers, or session tokens before requests reach Long Tail's routes. SSO integration tells Long Tail how to extract that identity and transparently provision matching users.
142
+
143
+ ### How It Works
144
+
145
+ 1. User authenticates with the host application (via OIDC, SAML, cookies, etc.)
146
+ 2. Host middleware validates identity and attaches user context to the request
147
+ 3. Dashboard loads, detects SSO is enabled via `/api/settings`
148
+ 4. Dashboard calls `POST /api/auth/sso` — host cookies are sent automatically
149
+ 5. Long Tail calls `sso.resolve(req)`, extracts the host identity, and JIT provisions a user in `lt_users`
150
+ 6. Long Tail returns its own JWT — the dashboard stores it for subsequent API calls
151
+ 7. All downstream RBAC, escalation claims, and audit trails use the provisioned `lt_users.id`
152
+
153
+ ### Configuration
154
+
155
+ The host provides a single `resolve` function. Long Tail handles provisioning, role mapping, JWT issuance, and dashboard awareness.
156
+
157
+ ```typescript
158
+ import { start } from '@hotmeshio/long-tail';
159
+
160
+ await start({
161
+ database: { connectionString: process.env.DATABASE_URL },
162
+ server: { enabled: false }, // host owns the HTTP server
163
+
164
+ auth: {
165
+ secret: process.env.JWT_SECRET,
166
+ sso: {
167
+ // Extract identity from the host's already-validated request.
168
+ // req.user is set by the host's auth middleware before Long Tail sees it.
169
+ resolve: (req) => {
170
+ const user = (req as any).user;
171
+ if (!user) return null;
172
+ return {
173
+ externalId: user.id, // stable identifier → lt_users.external_id
174
+ displayName: user.displayName,
175
+ email: user.email,
176
+ roles: ['operator', 'reviewer'],
177
+ };
178
+ },
179
+
180
+ // Optional: map host role names to LT role names.
181
+ // Unmapped roles are ignored. Omit to pass roles through as-is.
182
+ roleMap: {
183
+ admin: 'superadmin',
184
+ operator: 'station-operator',
185
+ },
186
+
187
+ // Optional: default role type for provisioned users (default: 'member')
188
+ defaultRoleType: 'member',
189
+
190
+ // Optional: redirect here when user logs out of LT dashboard
191
+ logoutUrl: '/auth/logout',
192
+ },
193
+ },
194
+ });
195
+ ```
196
+
197
+ ### SSOIdentity
198
+
199
+ The `resolve` function returns an `SSOIdentity` or `null`:
200
+
201
+ ```typescript
202
+ interface SSOIdentity {
203
+ externalId: string; // mapped to lt_users.external_id
204
+ displayName?: string; // lt_users.display_name
205
+ email?: string; // lt_users.email
206
+ roles?: string[]; // mapped to lt_user_roles via roleMap
207
+ metadata?: Record<string, any>; // lt_users.metadata (JSONB)
208
+ }
209
+ ```
210
+
211
+ ### JIT Provisioning
212
+
213
+ On first contact, Long Tail creates a `lt_users` record with the resolved identity. On subsequent contacts, it syncs any new roles. The internal `lt_users.id` (UUID) is used for all RBAC, escalation claims, and audit trails — the host's external ID is stored in `lt_users.external_id` as a stable lookup key.
214
+
215
+ ### Token Exchange
216
+
217
+ `POST /api/auth/sso` is a public endpoint (no Bearer required). It calls `sso.resolve(req)`, provisions the user, and returns an LT JWT. The dashboard calls this automatically when `auth.sso` is `true` in settings.
218
+
219
+ ```
220
+ POST /api/auth/sso
221
+
222
+ Response 200:
223
+ {
224
+ "token": "<jwt>",
225
+ "user": {
226
+ "id": "lt-uuid",
227
+ "external_id": "host-user-id",
228
+ "display_name": "Jane Doe",
229
+ "roles": [{ "role": "operator", "type": "member" }]
230
+ }
231
+ }
232
+ ```
233
+
234
+ ### requireAuth Fallback
235
+
236
+ When SSO is configured and a request arrives without a Bearer token, `requireAuth` calls `sso.resolve(req)` as a fallback. This allows direct API calls from the host backend (which forward cookies but not Bearer tokens) to authenticate without an explicit exchange. The dashboard always uses Bearer after the initial exchange.
237
+
238
+ ### Role Mapping
239
+
240
+ Roles are resolved once during the token exchange (not per-request) and baked into the JWT — the same pattern as the built-in login. When the host system changes a user's roles, the new roles take effect on the next token refresh.
241
+
242
+ If `roleMap` is provided, only mapped roles are assigned. If omitted, host role names are passed through directly as LT role names. Roles named `superadmin` or `admin` are assigned the corresponding role type; all others default to `member`.
243
+
244
+ ### Standalone Deployments
245
+
246
+ When `auth.sso` is not configured, nothing changes. The login page, OAuth providers, service accounts, and JWT auth all work exactly as before. SSO is purely additive.
247
+
139
248
  ## Service Account Authentication
140
249
 
141
250
  Service accounts are named identities that authenticate with API keys instead of passwords or OAuth. They share the same RBAC system as human users — same roles, same delegation tokens, same credential storage.
package/docs/dashboard.md CHANGED
@@ -6,7 +6,7 @@ The Long Tail dashboard is a React single-page application for managing durable
6
6
 
7
7
  The sidebar organizes pages into five groups.
8
8
 
9
- ### Durable Workflows
9
+ ### Workflows
10
10
 
11
11
  | Page | Route | Purpose |
12
12
  |------|-------|---------|
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hotmeshio/long-tail",
3
- "version": "0.4.17",
3
+ "version": "0.4.19",
4
4
  "description": "Long Tail Workflows — Durable AI workflows with human-in-the-loop escalation. Powered by PostgreSQL.",
5
5
  "main": "./build/index.js",
6
6
  "types": "./build/index.d.ts",
@@ -1,26 +0,0 @@
1
- import { type Browser, type Page } from 'playwright';
2
- import type { PlaywrightHandle } from './types';
3
- export declare const pages: Map<string, Page>;
4
- /** Allocate a unique page ID (shared across both playwright servers). */
5
- export declare function allocatePageId(): string;
6
- export declare function ensureBrowser(): Promise<Browser>;
7
- /**
8
- * Resolve a page from either a local `page_id`, a `_handle`, or "most recent".
9
- * Handles cross-container reconnection via CDP when needed.
10
- */
11
- export declare function resolvePage(args: {
12
- page_id?: string;
13
- _handle?: PlaywrightHandle;
14
- }): Promise<{
15
- page: Page;
16
- pageId: string;
17
- }>;
18
- /**
19
- * Build a _handle for a page. Includes CDP endpoint when available
20
- * (for cross-container access in distributed deployments).
21
- */
22
- export declare function buildHandle(pageId: string): PlaywrightHandle;
23
- /**
24
- * Shut down the shared browser and release all pages.
25
- */
26
- export declare function stopPlaywrightServer(): Promise<void>;
@@ -1,125 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.pages = void 0;
4
- exports.allocatePageId = allocatePageId;
5
- exports.ensureBrowser = ensureBrowser;
6
- exports.resolvePage = resolvePage;
7
- exports.buildHandle = buildHandle;
8
- exports.stopPlaywrightServer = stopPlaywrightServer;
9
- const playwright_1 = require("playwright");
10
- const logger_1 = require("../../../lib/logger");
11
- const types_1 = require("./types");
12
- // ── Browser lifecycle ────────────────────────────────────────────────────────
13
- // Shared browser instance across tool calls within a single server lifetime.
14
- // Lazy-launched on first use, cleaned up via stopPlaywrightServer().
15
- let browser = null;
16
- exports.pages = new Map();
17
- let pageCounter = 0;
18
- /** Remote browsers connected via CDP — cached to avoid reconnecting per call. */
19
- const remoteBrowsers = new Map();
20
- /** Allocate a unique page ID (shared across both playwright servers). */
21
- function allocatePageId() {
22
- return `page_${++pageCounter}`;
23
- }
24
- async function ensureBrowser() {
25
- if (!browser || !browser.isConnected()) {
26
- browser = await playwright_1.chromium.launch({ headless: true });
27
- logger_1.loggerRegistry.info('[lt-mcp:playwright] browser launched');
28
- }
29
- return browser;
30
- }
31
- /**
32
- * Resolve a page from either a local `page_id`, a `_handle`, or "most recent".
33
- * Handles cross-container reconnection via CDP when needed.
34
- */
35
- async function resolvePage(args) {
36
- // 1. Try local pages Map (fast path — same container)
37
- const localId = args._handle?.page_id || args.page_id;
38
- if (localId) {
39
- const local = exports.pages.get(localId);
40
- if (local)
41
- return { page: local, pageId: localId };
42
- }
43
- // 2. Try CDP reconnection via handle (cross-container)
44
- if (args._handle?.cdp_endpoint) {
45
- const cdp = args._handle.cdp_endpoint;
46
- let remoteBrowser = remoteBrowsers.get(cdp);
47
- if (!remoteBrowser || !remoteBrowser.isConnected()) {
48
- try {
49
- remoteBrowser = await playwright_1.chromium.connectOverCDP(cdp);
50
- remoteBrowsers.set(cdp, remoteBrowser);
51
- logger_1.loggerRegistry.info(`[lt-mcp:playwright] connected to remote browser: ${cdp}`);
52
- }
53
- catch (err) {
54
- throw Object.assign(new Error(`Cannot reach browser at ${cdp}`), { code: types_1.SESSION_UNREACHABLE, cdp_endpoint: cdp });
55
- }
56
- }
57
- // Find the page — for now, use the first page in the default context
58
- const contexts = remoteBrowser.contexts();
59
- const ctx = contexts[0] || await remoteBrowser.newContext();
60
- const remotePages = ctx.pages();
61
- if (remotePages.length > 0) {
62
- const page = remotePages[remotePages.length - 1];
63
- const id = args._handle.page_id || `remote_${++pageCounter}`;
64
- exports.pages.set(id, page);
65
- return { page, pageId: id };
66
- }
67
- throw Object.assign(new Error(`No pages found on remote browser at ${cdp}`), { code: types_1.SESSION_NOT_FOUND, cdp_endpoint: cdp });
68
- }
69
- // 3. If a specific page_id was requested but not found, throw structured error
70
- if (localId) {
71
- throw Object.assign(new Error(`Page ${localId} not found`), { code: types_1.SESSION_NOT_FOUND, page_id: localId });
72
- }
73
- // 4. Fall back to most recent local page
74
- const entries = Array.from(exports.pages.entries());
75
- if (entries.length === 0) {
76
- throw Object.assign(new Error('No pages open. Navigate to a URL first, or pass a _handle.'), { code: types_1.SESSION_NOT_FOUND });
77
- }
78
- return { page: entries[entries.length - 1][1], pageId: entries[entries.length - 1][0] };
79
- }
80
- /**
81
- * Build a _handle for a page. Includes CDP endpoint when available
82
- * (for cross-container access in distributed deployments).
83
- */
84
- function buildHandle(pageId) {
85
- const handle = {
86
- type: 'playwright_page',
87
- page_id: pageId,
88
- };
89
- // Include CDP endpoint if browser exposes one (e.g., launchServer or remote)
90
- if (browser && typeof browser.wsEndpoint === 'function') {
91
- try {
92
- handle.cdp_endpoint = browser.wsEndpoint();
93
- }
94
- catch {
95
- // Not available — single-process mode, local pages Map suffices
96
- }
97
- }
98
- return handle;
99
- }
100
- /**
101
- * Shut down the shared browser and release all pages.
102
- */
103
- async function stopPlaywrightServer() {
104
- for (const [id, page] of exports.pages) {
105
- try {
106
- await page.close();
107
- }
108
- catch { /* ignore */ }
109
- exports.pages.delete(id);
110
- }
111
- // Close remote browsers
112
- for (const [endpoint, rb] of remoteBrowsers) {
113
- try {
114
- await rb.close();
115
- }
116
- catch { /* ignore */ }
117
- remoteBrowsers.delete(endpoint);
118
- }
119
- if (browser) {
120
- await browser.close();
121
- browser = null;
122
- }
123
- pageCounter = 0;
124
- logger_1.loggerRegistry.info('[lt-mcp:playwright] browser closed');
125
- }
@@ -1,25 +0,0 @@
1
- import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
- export { pages, allocatePageId, ensureBrowser, buildHandle, stopPlaywrightServer } from './browser-lifecycle';
3
- export type { PlaywrightHandle } from './types';
4
- /**
5
- * Create a Playwright Browser MCP server.
6
- *
7
- * Provides 9 tools for browser automation:
8
- * navigate, screenshot, click, fill, wait_for, evaluate, run_script, list_pages, close_page
9
- *
10
- * All page-scoped tools participate in the _handle convention:
11
- * - navigate returns a _handle in its result
12
- * - All other tools accept _handle to locate the page across activities
13
- * - Fast path: local pages Map (same container)
14
- * - Slow path: CDP reconnection (different container)
15
- *
16
- * `run_script` is the preferred tool for YAML workflows — it executes a
17
- * multi-step browser script in a single activity, avoiding cross-activity
18
- * session issues entirely.
19
- *
20
- * Returns a fresh McpServer instance each time. The browser is shared
21
- * and lazy-launched on first tool call.
22
- */
23
- export declare function createPlaywrightServer(options?: {
24
- name?: string;
25
- }): Promise<McpServer>;
@@ -1,42 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.stopPlaywrightServer = exports.buildHandle = exports.ensureBrowser = exports.allocatePageId = exports.pages = void 0;
4
- exports.createPlaywrightServer = createPlaywrightServer;
5
- const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
6
- const logger_1 = require("../../../lib/logger");
7
- const tools_atomic_1 = require("./tools-atomic");
8
- const tools_run_script_1 = require("./tools-run-script");
9
- // Re-export public API consumed by playwright-cli.ts and system/index.ts
10
- var browser_lifecycle_1 = require("./browser-lifecycle");
11
- Object.defineProperty(exports, "pages", { enumerable: true, get: function () { return browser_lifecycle_1.pages; } });
12
- Object.defineProperty(exports, "allocatePageId", { enumerable: true, get: function () { return browser_lifecycle_1.allocatePageId; } });
13
- Object.defineProperty(exports, "ensureBrowser", { enumerable: true, get: function () { return browser_lifecycle_1.ensureBrowser; } });
14
- Object.defineProperty(exports, "buildHandle", { enumerable: true, get: function () { return browser_lifecycle_1.buildHandle; } });
15
- Object.defineProperty(exports, "stopPlaywrightServer", { enumerable: true, get: function () { return browser_lifecycle_1.stopPlaywrightServer; } });
16
- /**
17
- * Create a Playwright Browser MCP server.
18
- *
19
- * Provides 9 tools for browser automation:
20
- * navigate, screenshot, click, fill, wait_for, evaluate, run_script, list_pages, close_page
21
- *
22
- * All page-scoped tools participate in the _handle convention:
23
- * - navigate returns a _handle in its result
24
- * - All other tools accept _handle to locate the page across activities
25
- * - Fast path: local pages Map (same container)
26
- * - Slow path: CDP reconnection (different container)
27
- *
28
- * `run_script` is the preferred tool for YAML workflows — it executes a
29
- * multi-step browser script in a single activity, avoiding cross-activity
30
- * session issues entirely.
31
- *
32
- * Returns a fresh McpServer instance each time. The browser is shared
33
- * and lazy-launched on first tool call.
34
- */
35
- async function createPlaywrightServer(options) {
36
- const name = options?.name || 'long-tail-playwright';
37
- const instance = new mcp_js_1.McpServer({ name, version: '1.0.0' });
38
- (0, tools_atomic_1.registerAtomicTools)(instance);
39
- (0, tools_run_script_1.registerRunScript)(instance);
40
- logger_1.loggerRegistry.info(`[lt-mcp:playwright] ${name} ready (9 tools registered)`);
41
- return instance;
42
- }