@hotmeshio/long-tail 0.1.21 → 0.2.0

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 (269) hide show
  1. package/build/api/agent-subscriptions.d.ts +15 -0
  2. package/build/api/agent-subscriptions.js +82 -0
  3. package/build/api/agents.d.ts +21 -0
  4. package/build/api/agents.js +100 -0
  5. package/build/api/capabilities.d.ts +2 -0
  6. package/build/api/capabilities.js +76 -0
  7. package/build/index.d.ts +2 -2
  8. package/build/index.js +5 -2
  9. package/build/lib/db/schemas/003_agents.sql +46 -0
  10. package/build/lib/db/schemas/004_agent_subscriptions.sql +38 -0
  11. package/build/lib/db/schemas/005_server_category.sql +6 -0
  12. package/build/lib/db/schemas/006_agent_sub_unique.sql +9 -0
  13. package/build/lib/events/callback.d.ts +4 -18
  14. package/build/lib/events/callback.js +8 -45
  15. package/build/lib/events/matching.d.ts +13 -0
  16. package/build/lib/events/matching.js +31 -0
  17. package/build/lib/events/publish.d.ts +20 -0
  18. package/build/lib/events/publish.js +33 -0
  19. package/build/routes/agents.d.ts +2 -0
  20. package/build/routes/agents.js +130 -0
  21. package/build/routes/capabilities.d.ts +2 -0
  22. package/build/routes/capabilities.js +47 -0
  23. package/build/routes/index.js +4 -0
  24. package/build/sdk/index.d.ts +13 -0
  25. package/build/sdk/index.js +14 -0
  26. package/build/services/agent/index.d.ts +32 -0
  27. package/build/services/agent/index.js +195 -0
  28. package/build/services/agent/input-mapper.d.ts +18 -0
  29. package/build/services/agent/input-mapper.js +51 -0
  30. package/build/services/agent/sql.d.ts +10 -0
  31. package/build/services/agent/sql.js +70 -0
  32. package/build/services/agent/subscription-sql.d.ts +7 -0
  33. package/build/services/agent/subscription-sql.js +49 -0
  34. package/build/services/agent/subscriptions.d.ts +30 -0
  35. package/build/services/agent/subscriptions.js +82 -0
  36. package/build/services/agent/trigger-registry.d.ts +45 -0
  37. package/build/services/agent/trigger-registry.js +232 -0
  38. package/build/services/cron/index.d.ts +17 -1
  39. package/build/services/cron/index.js +152 -4
  40. package/build/services/insight/index.js +11 -6
  41. package/build/services/mcp/db.d.ts +1 -0
  42. package/build/services/mcp/db.js +1 -0
  43. package/build/services/mcp/sql.d.ts +1 -1
  44. package/build/services/mcp/sql.js +2 -2
  45. package/build/start/workers.js +67 -0
  46. package/build/system/activities/knowledge.js +9 -2
  47. package/build/system/index.d.ts +2 -1
  48. package/build/system/index.js +93 -1
  49. package/build/system/mcp-servers/events.d.ts +5 -0
  50. package/build/system/mcp-servers/events.js +104 -0
  51. package/build/system/mcp-servers/playwright/schemas.d.ts +6 -6
  52. package/build/system/seed/tool-manifests-events.d.ts +37 -0
  53. package/build/system/seed/tool-manifests-events.js +30 -0
  54. package/build/tsconfig.tsbuildinfo +1 -1
  55. package/build/types/agent.d.ts +72 -0
  56. package/build/types/agent.js +6 -0
  57. package/build/types/events.d.ts +7 -1
  58. package/build/types/index.d.ts +2 -1
  59. package/build/types/mcp.d.ts +2 -0
  60. package/build/types/startup.d.ts +37 -0
  61. package/dashboard/dist/assets/{AdminDashboard-CsTOErp1.js → AdminDashboard-DThDjhN5.js} +2 -2
  62. package/dashboard/dist/assets/{AdminDashboard-CsTOErp1.js.map → AdminDashboard-DThDjhN5.js.map} +1 -1
  63. package/dashboard/dist/assets/AgentConfigPage-NgxblxBW.js +13 -0
  64. package/dashboard/dist/assets/AgentConfigPage-NgxblxBW.js.map +1 -0
  65. package/dashboard/dist/assets/AgentDetailPage-DMS46nYY.js +4 -0
  66. package/dashboard/dist/assets/AgentDetailPage-DMS46nYY.js.map +1 -0
  67. package/dashboard/dist/assets/AgentsPage-pKfjHe4u.js +2 -0
  68. package/dashboard/dist/assets/AgentsPage-pKfjHe4u.js.map +1 -0
  69. package/dashboard/dist/assets/{AvailableEscalationsPage-BqQA3IJp.js → AvailableEscalationsPage-BFzHVnPh.js} +2 -2
  70. package/dashboard/dist/assets/{AvailableEscalationsPage-BqQA3IJp.js.map → AvailableEscalationsPage-BFzHVnPh.js.map} +1 -1
  71. package/dashboard/dist/assets/BotPicker-Zxf7Npew.js +2 -0
  72. package/dashboard/dist/assets/BotPicker-Zxf7Npew.js.map +1 -0
  73. package/dashboard/dist/assets/CapabilitiesPage-6zOJ12cB.js +2 -0
  74. package/dashboard/dist/assets/CapabilitiesPage-6zOJ12cB.js.map +1 -0
  75. package/dashboard/dist/assets/{CollapsibleSection-CRtHQsAv.js → CollapsibleSection-DvBx4tmw.js} +2 -2
  76. package/dashboard/dist/assets/{CollapsibleSection-CRtHQsAv.js.map → CollapsibleSection-DvBx4tmw.js.map} +1 -1
  77. package/dashboard/dist/assets/{CredentialsPage-C7XT1bnO.js → CredentialsPage-C5f-Bg-o.js} +2 -2
  78. package/dashboard/dist/assets/{CredentialsPage-C7XT1bnO.js.map → CredentialsPage-C5f-Bg-o.js.map} +1 -1
  79. package/dashboard/dist/assets/CronLabel-CAVTt5AG.js +2 -0
  80. package/dashboard/dist/assets/CronLabel-CAVTt5AG.js.map +1 -0
  81. package/dashboard/dist/assets/{CustomDurationPicker-BABUv1V2.js → CustomDurationPicker-Bk7D38y7.js} +2 -2
  82. package/dashboard/dist/assets/{CustomDurationPicker-BABUv1V2.js.map → CustomDurationPicker-Bk7D38y7.js.map} +1 -1
  83. package/dashboard/dist/assets/{DataTable-D3-wSEf0.js → DataTable-D9yuBv0w.js} +2 -2
  84. package/dashboard/dist/assets/{DataTable-D3-wSEf0.js.map → DataTable-D9yuBv0w.js.map} +1 -1
  85. package/dashboard/dist/assets/{DropZone-DHKmMqRA.js → DropZone-2mGyDo1P.js} +2 -2
  86. package/dashboard/dist/assets/{DropZone-DHKmMqRA.js.map → DropZone-2mGyDo1P.js.map} +1 -1
  87. package/dashboard/dist/assets/{ElapsedCell-DrJif03B.js → ElapsedCell-BpJjG1s-.js} +2 -2
  88. package/dashboard/dist/assets/{ElapsedCell-DrJif03B.js.map → ElapsedCell-BpJjG1s-.js.map} +1 -1
  89. package/dashboard/dist/assets/{EscalationsOverview-H6CwfeR-.js → EscalationsOverview-DPNd1vjF.js} +2 -2
  90. package/dashboard/dist/assets/{EscalationsOverview-H6CwfeR-.js.map → EscalationsOverview-DPNd1vjF.js.map} +1 -1
  91. package/dashboard/dist/assets/{EventTable-Dh3_9DAY.js → EventTable-BoP8KC3M.js} +2 -2
  92. package/dashboard/dist/assets/{EventTable-Dh3_9DAY.js.map → EventTable-BoP8KC3M.js.map} +1 -1
  93. package/dashboard/dist/assets/EventTopicPill-BUxxvpNg.js +2 -0
  94. package/dashboard/dist/assets/EventTopicPill-BUxxvpNg.js.map +1 -0
  95. package/dashboard/dist/assets/HomePage-h8I5ZolJ.js +2 -0
  96. package/dashboard/dist/assets/HomePage-h8I5ZolJ.js.map +1 -0
  97. package/dashboard/dist/assets/ListToolbar-BaYIIsAt.js +2 -0
  98. package/dashboard/dist/assets/ListToolbar-BaYIIsAt.js.map +1 -0
  99. package/dashboard/dist/assets/{McpOverview-ChLa6Gl7.js → McpOverview-BhZ3lSO6.js} +2 -2
  100. package/dashboard/dist/assets/{McpOverview-ChLa6Gl7.js.map → McpOverview-BhZ3lSO6.js.map} +1 -1
  101. package/dashboard/dist/assets/McpQueryDetailPage-DVgcKa61.js +5 -0
  102. package/dashboard/dist/assets/McpQueryDetailPage-DVgcKa61.js.map +1 -0
  103. package/dashboard/dist/assets/{McpQueryPage-D2DmDFPu.js → McpQueryPage-CTWOBqKT.js} +2 -2
  104. package/dashboard/dist/assets/{McpQueryPage-D2DmDFPu.js.map → McpQueryPage-CTWOBqKT.js.map} +1 -1
  105. package/dashboard/dist/assets/{McpRunDetailPage-ERVuNEEK.js → McpRunDetailPage-CIpZJWRB.js} +2 -2
  106. package/dashboard/dist/assets/{McpRunDetailPage-ERVuNEEK.js.map → McpRunDetailPage-CIpZJWRB.js.map} +1 -1
  107. package/dashboard/dist/assets/McpRunsPage-B3zpzPBf.js +2 -0
  108. package/dashboard/dist/assets/McpRunsPage-B3zpzPBf.js.map +1 -0
  109. package/dashboard/dist/assets/{OperatorDashboard-CJm_BTPU.js → OperatorDashboard-l2hVlIF3.js} +2 -2
  110. package/dashboard/dist/assets/{OperatorDashboard-CJm_BTPU.js.map → OperatorDashboard-l2hVlIF3.js.map} +1 -1
  111. package/dashboard/dist/assets/{PageHeader-B-SN5GZ2.js → PageHeader-DLjHNYHX.js} +2 -2
  112. package/dashboard/dist/assets/{PageHeader-B-SN5GZ2.js.map → PageHeader-DLjHNYHX.js.map} +1 -1
  113. package/dashboard/dist/assets/{PageHeaderWithStats-BZ3AGT5s.js → PageHeaderWithStats-Oljg3n4j.js} +2 -2
  114. package/dashboard/dist/assets/{PageHeaderWithStats-BZ3AGT5s.js.map → PageHeaderWithStats-Oljg3n4j.js.map} +1 -1
  115. package/dashboard/dist/assets/{ProcessDetailPage-vfnCDyQK.js → ProcessDetailPage-BJ1rhK9_.js} +2 -2
  116. package/dashboard/dist/assets/{ProcessDetailPage-vfnCDyQK.js.map → ProcessDetailPage-BJ1rhK9_.js.map} +1 -1
  117. package/dashboard/dist/assets/{ProcessesListPage-DcAN6AJK.js → ProcessesListPage-IQKk_qkn.js} +2 -2
  118. package/dashboard/dist/assets/{ProcessesListPage-DcAN6AJK.js.map → ProcessesListPage-IQKk_qkn.js.map} +1 -1
  119. package/dashboard/dist/assets/RolePill-Bp10-WfX.js +2 -0
  120. package/dashboard/dist/assets/RolePill-Bp10-WfX.js.map +1 -0
  121. package/dashboard/dist/assets/{RolesPage-DYSt2aAr.js → RolesPage-Dwcirtze.js} +2 -2
  122. package/dashboard/dist/assets/{RolesPage-DYSt2aAr.js.map → RolesPage-Dwcirtze.js.map} +1 -1
  123. package/dashboard/dist/assets/RunAsSelector-D4Fu8LVG.js +2 -0
  124. package/dashboard/dist/assets/RunAsSelector-D4Fu8LVG.js.map +1 -0
  125. package/dashboard/dist/assets/ServerName-C9lUCFYb.js +2 -0
  126. package/dashboard/dist/assets/ServerName-C9lUCFYb.js.map +1 -0
  127. package/dashboard/dist/assets/SwimlaneTimeline-DQqgvwmC.js +2 -0
  128. package/dashboard/dist/assets/SwimlaneTimeline-DQqgvwmC.js.map +1 -0
  129. package/dashboard/dist/assets/{TagInput-DftaRHDV.js → TagInput-Dkljw_WI.js} +2 -2
  130. package/dashboard/dist/assets/{TagInput-DftaRHDV.js.map → TagInput-Dkljw_WI.js.map} +1 -1
  131. package/dashboard/dist/assets/{TaskDetailPage-BoA-cfwW.js → TaskDetailPage-AHBMSHAA.js} +2 -2
  132. package/dashboard/dist/assets/{TaskDetailPage-BoA-cfwW.js.map → TaskDetailPage-AHBMSHAA.js.map} +1 -1
  133. package/dashboard/dist/assets/{TaskQueuePill-Ce8KlXtR.js → TaskQueuePill-DPwm25Cc.js} +2 -2
  134. package/dashboard/dist/assets/{TaskQueuePill-Ce8KlXtR.js.map → TaskQueuePill-DPwm25Cc.js.map} +1 -1
  135. package/dashboard/dist/assets/{TasksListPage-g6XIbhju.js → TasksListPage-CnJdTsoX.js} +2 -2
  136. package/dashboard/dist/assets/{TasksListPage-g6XIbhju.js.map → TasksListPage-CnJdTsoX.js.map} +1 -1
  137. package/dashboard/dist/assets/{TimeAgo-BihIwEbB.js → TimeAgo-C3A1r1Cv.js} +2 -2
  138. package/dashboard/dist/assets/{TimeAgo-BihIwEbB.js.map → TimeAgo-C3A1r1Cv.js.map} +1 -1
  139. package/dashboard/dist/assets/{TimestampCell-GOFcvE-i.js → TimestampCell-DPfLR6bZ.js} +2 -2
  140. package/dashboard/dist/assets/{TimestampCell-GOFcvE-i.js.map → TimestampCell-DPfLR6bZ.js.map} +1 -1
  141. package/dashboard/dist/assets/ToolPill-D_DIWFJ5.js +2 -0
  142. package/dashboard/dist/assets/ToolPill-D_DIWFJ5.js.map +1 -0
  143. package/dashboard/dist/assets/ToolTestPanel-CwZ9zkD-.js +2 -0
  144. package/dashboard/dist/assets/ToolTestPanel-CwZ9zkD-.js.map +1 -0
  145. package/dashboard/dist/assets/{UserName-CmMVt4vS.js → UserName-ClO0a6Ar.js} +2 -2
  146. package/dashboard/dist/assets/{UserName-CmMVt4vS.js.map → UserName-ClO0a6Ar.js.map} +1 -1
  147. package/dashboard/dist/assets/{WorkflowExecutionPage-soRFz_30.js → WorkflowExecutionPage-B-2aHAHK.js} +2 -2
  148. package/dashboard/dist/assets/{WorkflowExecutionPage-soRFz_30.js.map → WorkflowExecutionPage-B-2aHAHK.js.map} +1 -1
  149. package/dashboard/dist/assets/{WorkflowPill-DUDDyBsj.js → WorkflowPill-BbgVTGgI.js} +2 -2
  150. package/dashboard/dist/assets/WorkflowPill-BbgVTGgI.js.map +1 -0
  151. package/dashboard/dist/assets/WorkflowsDashboard-NtiQKl_i.js +2 -0
  152. package/dashboard/dist/assets/WorkflowsDashboard-NtiQKl_i.js.map +1 -0
  153. package/dashboard/dist/assets/{WorkflowsOverview-z3Ztiz1y.js → WorkflowsOverview-BQip_pvL.js} +2 -2
  154. package/dashboard/dist/assets/{WorkflowsOverview-z3Ztiz1y.js.map → WorkflowsOverview-BQip_pvL.js.map} +1 -1
  155. package/dashboard/dist/assets/YamlWorkflowsPage-BWFCVQ8b.js +2 -0
  156. package/dashboard/dist/assets/YamlWorkflowsPage-BWFCVQ8b.js.map +1 -0
  157. package/dashboard/dist/assets/agents-5APoyRH8.js +2 -0
  158. package/dashboard/dist/assets/agents-5APoyRH8.js.map +1 -0
  159. package/dashboard/dist/assets/{bots-BZPXDh_y.js → bots-BoDH-pS7.js} +2 -2
  160. package/dashboard/dist/assets/{bots-BZPXDh_y.js.map → bots-BoDH-pS7.js.map} +1 -1
  161. package/dashboard/dist/assets/controlplane-D4NhQux3.js +2 -0
  162. package/dashboard/dist/assets/controlplane-D4NhQux3.js.map +1 -0
  163. package/dashboard/dist/assets/{escalation-DBUIq1Z4.js → escalation-BD2wtAt2.js} +2 -2
  164. package/dashboard/dist/assets/{escalation-DBUIq1Z4.js.map → escalation-BD2wtAt2.js.map} +1 -1
  165. package/dashboard/dist/assets/escalation-columns-DjHcNgjo.js +2 -0
  166. package/dashboard/dist/assets/{escalation-columns-DL4zsR8Y.js.map → escalation-columns-DjHcNgjo.js.map} +1 -1
  167. package/dashboard/dist/assets/{helpers-D50KFFkI.js → helpers-D1ZPA4kI.js} +2 -2
  168. package/dashboard/dist/assets/{helpers-D50KFFkI.js.map → helpers-D1ZPA4kI.js.map} +1 -1
  169. package/dashboard/dist/assets/index-B-Z9TisY.js +2 -0
  170. package/dashboard/dist/assets/index-B-Z9TisY.js.map +1 -0
  171. package/dashboard/dist/assets/index-B6vQeWwf.js +6 -0
  172. package/dashboard/dist/assets/index-B6vQeWwf.js.map +1 -0
  173. package/dashboard/dist/assets/{index-D9_hZmsW.js → index-BD2vW8MG.js} +3 -3
  174. package/dashboard/dist/assets/{index-D9_hZmsW.js.map → index-BD2vW8MG.js.map} +1 -1
  175. package/dashboard/dist/assets/index-BciXgS35.css +1 -0
  176. package/dashboard/dist/assets/index-BgJR7kwH.js +2 -0
  177. package/dashboard/dist/assets/index-BgJR7kwH.js.map +1 -0
  178. package/dashboard/dist/assets/index-D9qswqDQ.js +2 -0
  179. package/dashboard/dist/assets/{index-BpoHVMV7.js.map → index-D9qswqDQ.js.map} +1 -1
  180. package/dashboard/dist/assets/index-DC7f6rWu.js +2 -0
  181. package/dashboard/dist/assets/{index-CEnDYJOO.js.map → index-DC7f6rWu.js.map} +1 -1
  182. package/dashboard/dist/assets/{index-B-jzKfuv.js → index-Zn5XforP.js} +2 -2
  183. package/dashboard/dist/assets/{index-B-jzKfuv.js.map → index-Zn5XforP.js.map} +1 -1
  184. package/dashboard/dist/assets/index-_5qNyf9o.js +2 -0
  185. package/dashboard/dist/assets/index-_5qNyf9o.js.map +1 -0
  186. package/dashboard/dist/assets/index-_dKxJhey.js +2 -0
  187. package/dashboard/dist/assets/{index-DzICLMI7.js.map → index-_dKxJhey.js.map} +1 -1
  188. package/dashboard/dist/assets/index-jp94-YlF.js +2 -0
  189. package/dashboard/dist/assets/index-jp94-YlF.js.map +1 -0
  190. package/dashboard/dist/assets/{index-BUjxYyxc.js → index-oGYUhkFa.js} +27 -27
  191. package/dashboard/dist/assets/index-oGYUhkFa.js.map +1 -0
  192. package/dashboard/dist/assets/index-qdYsS9h2.js +15 -0
  193. package/dashboard/dist/assets/index-qdYsS9h2.js.map +1 -0
  194. package/dashboard/dist/assets/knowledge-DsAU_TGL.js +2 -0
  195. package/dashboard/dist/assets/knowledge-DsAU_TGL.js.map +1 -0
  196. package/dashboard/dist/assets/{mcp-D0GrHRFe.js → mcp-CA3OeIyH.js} +2 -2
  197. package/dashboard/dist/assets/{mcp-D0GrHRFe.js.map → mcp-CA3OeIyH.js.map} +1 -1
  198. package/dashboard/dist/assets/{mcp-query-DC5woQn5.js → mcp-query-BgmTDc7h.js} +2 -2
  199. package/dashboard/dist/assets/{mcp-query-DC5woQn5.js.map → mcp-query-BgmTDc7h.js.map} +1 -1
  200. package/dashboard/dist/assets/{mcp-runs-CsoVQoPB.js → mcp-runs-C-FK2SyD.js} +2 -2
  201. package/dashboard/dist/assets/{mcp-runs-CsoVQoPB.js.map → mcp-runs-C-FK2SyD.js.map} +1 -1
  202. package/dashboard/dist/assets/{namespaces-unpIb4gX.js → namespaces-B8KNk0Jb.js} +2 -2
  203. package/dashboard/dist/assets/{namespaces-unpIb4gX.js.map → namespaces-B8KNk0Jb.js.map} +1 -1
  204. package/dashboard/dist/assets/{roles--kBaFljg.js → roles-BAPy1LU_.js} +2 -2
  205. package/dashboard/dist/assets/{roles--kBaFljg.js.map → roles-BAPy1LU_.js.map} +1 -1
  206. package/dashboard/dist/assets/{settings-B96YkawY.js → settings-Da0QSQDH.js} +2 -2
  207. package/dashboard/dist/assets/{settings-B96YkawY.js.map → settings-Da0QSQDH.js.map} +1 -1
  208. package/dashboard/dist/assets/{tasks-D_1NCfOZ.js → tasks-BHlTusW0.js} +2 -2
  209. package/dashboard/dist/assets/{tasks-D_1NCfOZ.js.map → tasks-BHlTusW0.js.map} +1 -1
  210. package/dashboard/dist/assets/useEventHooks-DBMdj9vw.js +2 -0
  211. package/dashboard/dist/assets/useEventHooks-DBMdj9vw.js.map +1 -0
  212. package/dashboard/dist/assets/{useYamlActivityEvents-D3RQjfzo.js → useYamlActivityEvents-BH_ynR_L.js} +2 -2
  213. package/dashboard/dist/assets/{useYamlActivityEvents-D3RQjfzo.js.map → useYamlActivityEvents-BH_ynR_L.js.map} +1 -1
  214. package/dashboard/dist/assets/{users-e2oatvoj.js → users-C9K2cMyb.js} +2 -2
  215. package/dashboard/dist/assets/{users-e2oatvoj.js.map → users-C9K2cMyb.js.map} +1 -1
  216. package/dashboard/dist/assets/{vendor-icons-BkK55L-1.js → vendor-icons-E6836lXZ.js} +140 -95
  217. package/dashboard/dist/assets/vendor-icons-E6836lXZ.js.map +1 -0
  218. package/dashboard/dist/assets/workflows-B2rsLjoh.js +2 -0
  219. package/dashboard/dist/assets/workflows-B2rsLjoh.js.map +1 -0
  220. package/dashboard/dist/assets/{yaml-workflows-CAKU7LUu.js → yaml-workflows-BLiTvQM2.js} +2 -2
  221. package/dashboard/dist/assets/{yaml-workflows-CAKU7LUu.js.map → yaml-workflows-BLiTvQM2.js.map} +1 -1
  222. package/dashboard/dist/index.html +3 -3
  223. package/docs/agents.md +160 -0
  224. package/docs/api/http/agents.md +201 -0
  225. package/docs/api/sdk/agents.md +138 -0
  226. package/docs/story.md +101 -78
  227. package/package.json +3 -3
  228. package/dashboard/dist/assets/BotPicker-C2xR1xay.js +0 -2
  229. package/dashboard/dist/assets/BotPicker-C2xR1xay.js.map +0 -1
  230. package/dashboard/dist/assets/ListToolbar-CyEkulVR.js +0 -2
  231. package/dashboard/dist/assets/ListToolbar-CyEkulVR.js.map +0 -1
  232. package/dashboard/dist/assets/McpQueryDetailPage-5Dsj6PlL.js +0 -5
  233. package/dashboard/dist/assets/McpQueryDetailPage-5Dsj6PlL.js.map +0 -1
  234. package/dashboard/dist/assets/McpRunsPage-BKba-3Wl.js +0 -2
  235. package/dashboard/dist/assets/McpRunsPage-BKba-3Wl.js.map +0 -1
  236. package/dashboard/dist/assets/RolePill-BhVC0cc3.js +0 -2
  237. package/dashboard/dist/assets/RolePill-BhVC0cc3.js.map +0 -1
  238. package/dashboard/dist/assets/RunAsSelector-CD7_Dmb0.js +0 -2
  239. package/dashboard/dist/assets/RunAsSelector-CD7_Dmb0.js.map +0 -1
  240. package/dashboard/dist/assets/SwimlaneTimeline-CUl5RdXU.js +0 -2
  241. package/dashboard/dist/assets/SwimlaneTimeline-CUl5RdXU.js.map +0 -1
  242. package/dashboard/dist/assets/WorkflowPill-DUDDyBsj.js.map +0 -1
  243. package/dashboard/dist/assets/WorkflowsDashboard-Be1A1zAT.js +0 -2
  244. package/dashboard/dist/assets/WorkflowsDashboard-Be1A1zAT.js.map +0 -1
  245. package/dashboard/dist/assets/YamlWorkflowsPage-C6qzcQcJ.js +0 -2
  246. package/dashboard/dist/assets/YamlWorkflowsPage-C6qzcQcJ.js.map +0 -1
  247. package/dashboard/dist/assets/escalation-columns-DL4zsR8Y.js +0 -2
  248. package/dashboard/dist/assets/index-B-ioA6yv.js +0 -2
  249. package/dashboard/dist/assets/index-B-ioA6yv.js.map +0 -1
  250. package/dashboard/dist/assets/index-BMpoMc4A.js +0 -2
  251. package/dashboard/dist/assets/index-BMpoMc4A.js.map +0 -1
  252. package/dashboard/dist/assets/index-BU04qgJt.js +0 -15
  253. package/dashboard/dist/assets/index-BU04qgJt.js.map +0 -1
  254. package/dashboard/dist/assets/index-BUjxYyxc.js.map +0 -1
  255. package/dashboard/dist/assets/index-BpoHVMV7.js +0 -2
  256. package/dashboard/dist/assets/index-CEnDYJOO.js +0 -2
  257. package/dashboard/dist/assets/index-CbuH92vk.js +0 -6
  258. package/dashboard/dist/assets/index-CbuH92vk.js.map +0 -1
  259. package/dashboard/dist/assets/index-DrouIN-M.js +0 -2
  260. package/dashboard/dist/assets/index-DrouIN-M.js.map +0 -1
  261. package/dashboard/dist/assets/index-DzICLMI7.js +0 -2
  262. package/dashboard/dist/assets/index-efS5gKpv.css +0 -1
  263. package/dashboard/dist/assets/index-qT78AZDq.js +0 -2
  264. package/dashboard/dist/assets/index-qT78AZDq.js.map +0 -1
  265. package/dashboard/dist/assets/useEventHooks-BPjEkCpD.js +0 -2
  266. package/dashboard/dist/assets/useEventHooks-BPjEkCpD.js.map +0 -1
  267. package/dashboard/dist/assets/vendor-icons-BkK55L-1.js.map +0 -1
  268. package/dashboard/dist/assets/workflows-D6diL54s.js +0 -2
  269. package/dashboard/dist/assets/workflows-D6diL54s.js.map +0 -1
@@ -289,16 +289,164 @@ class LTCronRegistry {
289
289
  logger_1.loggerRegistry.info(`[lt-cron] restarted YAML cron ${wf.graph_topic} (${wf.cron_schedule})`);
290
290
  }
291
291
  }
292
+ // ── Agent schedule crons ──────────────────────────────────────────────
293
+ /**
294
+ * Start a single agent schedule cron.
295
+ */
296
+ async startAgentCron(agent, schedule, idx) {
297
+ const key = `agent:${agent.id}-${idx}`;
298
+ if (this.activeCrons.has(key))
299
+ return;
300
+ validateCronSchedule(schedule.cron);
301
+ const connection = (0, db_1.getConnection)();
302
+ const topic = `lt.cron.agent.${agent.id}.${idx}`;
303
+ const cronId = `lt-cron-agent-${agent.id}-${idx}`;
304
+ const executeAs = schedule.execute_as || agent.user_id || undefined;
305
+ let principal;
306
+ if (executeAs) {
307
+ try {
308
+ principal = await (0, principal_1.resolvePrincipal)(executeAs);
309
+ }
310
+ catch { /* use system */ }
311
+ }
312
+ if (!principal) {
313
+ principal = this.systemPrincipal ?? undefined;
314
+ }
315
+ const envelope = {
316
+ data: schedule.envelope ?? {},
317
+ metadata: { source: 'agent-cron', agentId: agent.id, agentName: agent.name, certified: true },
318
+ lt: {
319
+ userId: principal?.id ?? 'lt-system',
320
+ principal,
321
+ scopes: ['workflow:invoke'],
322
+ },
323
+ };
324
+ const isPipeline = schedule.reaction_type === 'pipeline' && schedule.pipeline_id;
325
+ // Resolve the actual task queue from workflow config (durable only)
326
+ let taskQueue;
327
+ if (!isPipeline) {
328
+ const wfConfig = await configService.getWorkflowConfig(schedule.workflow_type);
329
+ taskQueue = wfConfig?.task_queue || schedule.workflow_type;
330
+ }
331
+ const targetLabel = isPipeline ? `pipeline:${schedule.pipeline_id}` : schedule.workflow_type;
332
+ await hotmesh_1.Virtual.cron({
333
+ topic,
334
+ connection,
335
+ callback: async () => {
336
+ try {
337
+ if (isPipeline) {
338
+ const { invokeYamlWorkflow } = await Promise.resolve().then(() => __importStar(require('../yaml-workflow/invoke')));
339
+ const { getYamlWorkflow } = await Promise.resolve().then(() => __importStar(require('../yaml-workflow/db')));
340
+ const wf = await getYamlWorkflow(schedule.pipeline_id);
341
+ if (!wf)
342
+ throw new Error(`Pipeline ${schedule.pipeline_id} not found`);
343
+ logger_1.loggerRegistry.info(`[lt-cron] agent invoking pipeline ${schedule.pipeline_id}`);
344
+ await invokeYamlWorkflow(wf, {
345
+ data: envelope.data ?? {},
346
+ execute_as: executeAs,
347
+ });
348
+ }
349
+ else {
350
+ const client = new hotmesh_1.Durable.Client({ connection });
351
+ const workflowId = `agent-cron-${agent.id}-${idx}-${hotmesh_1.Durable.guid()}`;
352
+ logger_1.loggerRegistry.info(`[lt-cron] agent invoking ${schedule.workflow_type} on ${taskQueue} (${workflowId})`);
353
+ await client.workflow.start({
354
+ args: [envelope],
355
+ taskQueue,
356
+ workflowName: schedule.workflow_type,
357
+ workflowId,
358
+ expire: defaults_1.JOB_EXPIRE_SECS,
359
+ entity: schedule.workflow_type,
360
+ signalIn: false,
361
+ });
362
+ }
363
+ }
364
+ catch (err) {
365
+ logger_1.loggerRegistry.error(`[lt-cron] agent ${agent.name}/${targetLabel} failed: ${err?.message}`);
366
+ }
367
+ },
368
+ args: [],
369
+ options: { id: cronId, interval: schedule.cron },
370
+ });
371
+ this.activeCrons.set(key, cronId);
372
+ logger_1.loggerRegistry.info(`[lt-cron] agent schedule started: ${agent.name}/${targetLabel} (${schedule.cron})`);
373
+ }
374
+ /**
375
+ * Stop all cron schedules for an agent.
376
+ */
377
+ async stopAgentCrons(agentId) {
378
+ const connection = (0, db_1.getConnection)();
379
+ const toRemove = [];
380
+ for (const [key, cronId] of this.activeCrons) {
381
+ if (key.startsWith(`agent:${agentId}-`)) {
382
+ const idx = key.split('-').pop();
383
+ const topic = `lt.cron.agent.${agentId}.${idx}`;
384
+ try {
385
+ await hotmesh_1.Virtual.interrupt({ topic, connection, options: { id: cronId } });
386
+ }
387
+ catch { /* already stopped */ }
388
+ toRemove.push(key);
389
+ }
390
+ }
391
+ for (const key of toRemove)
392
+ this.activeCrons.delete(key);
393
+ if (toRemove.length) {
394
+ logger_1.loggerRegistry.info(`[lt-cron] stopped ${toRemove.length} agent schedule(s) for ${agentId}`);
395
+ }
396
+ }
397
+ /**
398
+ * Restart all cron schedules for an agent (after config change or pause/resume).
399
+ */
400
+ async restartAgentCrons(agent) {
401
+ await this.stopAgentCrons(agent.id);
402
+ if (agent.status !== 'active')
403
+ return;
404
+ const schedules = agent.behaviors?.schedules ?? [];
405
+ for (let i = 0; i < schedules.length; i++) {
406
+ const sched = schedules[i];
407
+ if (sched.cron && (sched.workflow_type || sched.pipeline_id)) {
408
+ await this.startAgentCron(agent, sched, i);
409
+ }
410
+ }
411
+ }
412
+ /**
413
+ * Arm all cron schedules for active agents. Called at startup.
414
+ */
415
+ async connectAgentCrons() {
416
+ const { listAgents } = await Promise.resolve().then(() => __importStar(require('../agent')));
417
+ const { agents } = await listAgents({ status: 'active', limit: 1000 });
418
+ let armed = 0;
419
+ for (const agent of agents) {
420
+ const schedules = agent.behaviors?.schedules ?? [];
421
+ for (let i = 0; i < schedules.length; i++) {
422
+ const sched = schedules[i];
423
+ if (sched.cron && (sched.workflow_type || sched.pipeline_id)) {
424
+ try {
425
+ await this.startAgentCron(agent, sched, i);
426
+ armed++;
427
+ }
428
+ catch (err) {
429
+ logger_1.loggerRegistry.warn(`[lt-cron] agent schedule failed: ${agent.name}/${sched.cron}: ${err.message}`);
430
+ }
431
+ }
432
+ }
433
+ }
434
+ logger_1.loggerRegistry.info(`[lt-cron] ${armed} agent schedule(s) armed`);
435
+ }
292
436
  /**
293
437
  * Stop all active crons. Call during graceful shutdown.
294
438
  */
295
439
  async disconnect() {
296
- for (const workflowType of [...this.activeCrons.keys()]) {
297
- if (workflowType.startsWith('yaml:')) {
298
- await this.stopYamlCron(workflowType.replace('yaml:', ''));
440
+ for (const key of [...this.activeCrons.keys()]) {
441
+ if (key.startsWith('agent:')) {
442
+ const agentId = key.split(':')[1].split('-')[0];
443
+ await this.stopAgentCrons(agentId);
444
+ }
445
+ else if (key.startsWith('yaml:')) {
446
+ await this.stopYamlCron(key.replace('yaml:', ''));
299
447
  }
300
448
  else {
301
- await this.stopCron(workflowType);
449
+ await this.stopCron(key);
302
450
  }
303
451
  }
304
452
  this.connected = false;
@@ -13,6 +13,7 @@ const db_1 = require("../../lib/db");
13
13
  const defaults_1 = require("../../modules/defaults");
14
14
  const utils_1 = require("../../modules/utils");
15
15
  const llm_1 = require("../llm");
16
+ const principal_1 = require("../iam/principal");
16
17
  const prompts_1 = require("./prompts");
17
18
  // ── MCP query invocation ─────────────────────────────────────────────────────
18
19
  async function startMcpQuery(input) {
@@ -23,11 +24,13 @@ async function startMcpQuery(input) {
23
24
  const entity = direct ? 'mcpQuery' : 'mcpQueryRouter';
24
25
  const prefix = direct ? 'mcp-query-direct' : 'mcp-query';
25
26
  const workflowId = `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
27
+ // Resolve the full principal so ToolContext carries identity to tool calls
28
+ const principal = userId ? await (0, principal_1.resolvePrincipal)(userId) : undefined;
26
29
  const handle = await client.workflow.start({
27
30
  args: [{
28
31
  data: { prompt, tags, context },
29
- metadata: { source: 'dashboard' },
30
- lt: { userId },
32
+ metadata: { source: 'dashboard', certified: true },
33
+ lt: { userId, principal, scopes: ['workflow:invoke', 'mcp:tool:call'] },
31
34
  }],
32
35
  taskQueue: 'long-tail-system',
33
36
  workflowName: wfName,
@@ -53,11 +56,12 @@ async function startWorkflowBuilder(input) {
53
56
  const startTime = Date.now();
54
57
  const client = new hotmesh_1.Durable.Client({ connection: (0, db_1.getConnection)() });
55
58
  const workflowId = `wf-builder-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
59
+ const principal = userId ? await (0, principal_1.resolvePrincipal)(userId) : undefined;
56
60
  const handle = await client.workflow.start({
57
61
  args: [{
58
62
  data: { prompt, tags, feedback, prior_yaml, answers, prior_questions },
59
- metadata: { source: 'dashboard' },
60
- lt: { userId },
63
+ metadata: { source: 'dashboard', certified: true },
64
+ lt: { userId, principal, scopes: ['workflow:invoke', 'mcp:tool:call'] },
61
65
  }],
62
66
  taskQueue: 'long-tail-system',
63
67
  workflowName: 'mcpWorkflowBuilder',
@@ -83,11 +87,12 @@ async function startWorkflowPlanner(input) {
83
87
  const startTime = Date.now();
84
88
  const client = new hotmesh_1.Durable.Client({ connection: (0, db_1.getConnection)() });
85
89
  const workflowId = `wf-planner-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
90
+ const principal = userId ? await (0, principal_1.resolvePrincipal)(userId) : undefined;
86
91
  const handle = await client.workflow.start({
87
92
  args: [{
88
93
  data: { specification, setId, existingPlan, existingSchemas },
89
- metadata: { source: 'dashboard' },
90
- lt: { userId },
94
+ metadata: { source: 'dashboard', certified: true },
95
+ lt: { userId, principal, scopes: ['workflow:invoke', 'mcp:tool:call'] },
91
96
  }],
92
97
  taskQueue: 'long-tail-system',
93
98
  workflowName: 'mcpWorkflowPlanner',
@@ -33,6 +33,7 @@ export declare function seedMcpServer(input: {
33
33
  name: string;
34
34
  description?: string;
35
35
  tags?: string[];
36
+ category?: string;
36
37
  compileHints?: string;
37
38
  credentialProviders?: string[];
38
39
  toolManifest?: any[];
@@ -169,6 +169,7 @@ async function seedMcpServer(input) {
169
169
  input.tags || [],
170
170
  input.compileHints || null,
171
171
  input.credentialProviders || [],
172
+ input.category || null,
172
173
  ]);
173
174
  const inserted = (rowCount ?? 0) > 0;
174
175
  if (!inserted) {
@@ -18,4 +18,4 @@ export declare const DELETE_STALE_BUILTIN_SERVERS = "\n DELETE FROM lt_mcp_serv
18
18
  /** Upsert — used by dashboard/API writes (overwrites intentionally). */
19
19
  export declare const UPSERT_MCP_SERVER = "\n INSERT INTO lt_mcp_servers\n (name, description, transport_type, transport_config, auto_connect, status, tool_manifest, metadata, tags, compile_hints, credential_providers, last_connected_at)\n VALUES ($1, $2, $3, $4, true, 'connected', $5, $6, $7, $8, $9, NOW())\n ON CONFLICT (name) DO UPDATE SET\n tool_manifest = EXCLUDED.tool_manifest,\n metadata = EXCLUDED.metadata,\n description = EXCLUDED.description,\n tags = EXCLUDED.tags,\n compile_hints = EXCLUDED.compile_hints,\n credential_providers = EXCLUDED.credential_providers,\n status = 'connected',\n last_connected_at = NOW()";
20
20
  /** Seed — insert-if-absent. DB is source of truth after first boot. */
21
- export declare const SEED_MCP_SERVER = "\n INSERT INTO lt_mcp_servers\n (name, description, transport_type, transport_config, auto_connect, status, tool_manifest, metadata, tags, compile_hints, credential_providers, last_connected_at)\n VALUES ($1, $2, $3, $4, true, 'connected', $5, $6, $7, $8, $9, NOW())\n ON CONFLICT (name) DO NOTHING";
21
+ export declare const SEED_MCP_SERVER = "\n INSERT INTO lt_mcp_servers\n (name, description, transport_type, transport_config, auto_connect, status, tool_manifest, metadata, tags, compile_hints, credential_providers, category, last_connected_at)\n VALUES ($1, $2, $3, $4, true, 'connected', $5, $6, $7, $8, $9, $10, NOW())\n ON CONFLICT (name) DO NOTHING";
@@ -94,6 +94,6 @@ exports.UPSERT_MCP_SERVER = `
94
94
  /** Seed — insert-if-absent. DB is source of truth after first boot. */
95
95
  exports.SEED_MCP_SERVER = `
96
96
  INSERT INTO lt_mcp_servers
97
- (name, description, transport_type, transport_config, auto_connect, status, tool_manifest, metadata, tags, compile_hints, credential_providers, last_connected_at)
98
- VALUES ($1, $2, $3, $4, true, 'connected', $5, $6, $7, $8, $9, NOW())
97
+ (name, description, transport_type, transport_config, auto_connect, status, tool_manifest, metadata, tags, compile_hints, credential_providers, category, last_connected_at)
98
+ VALUES ($1, $2, $3, $4, true, 'connected', $5, $6, $7, $8, $9, $10, NOW())
99
99
  ON CONFLICT (name) DO NOTHING`;
@@ -220,12 +220,79 @@ async function startWorkers(startConfig, workers, builtinMcpServerFactories) {
220
220
  // Register workers for active YAML (deterministic) workflows
221
221
  await yamlWorkflowWorkers.registerAllActiveWorkers();
222
222
  }
223
+ // Seed agents (from startConfig + system agents)
224
+ const { getSystemAgents } = await Promise.resolve().then(() => __importStar(require('../system')));
225
+ const allAgentConfigs = [...(startConfig.agents ?? []), ...getSystemAgents()];
226
+ if (allAgentConfigs.length > 0) {
227
+ const { seedAgent, getAgentByName } = await Promise.resolve().then(() => __importStar(require('../services/agent')));
228
+ const { seedSubscription } = await Promise.resolve().then(() => __importStar(require('../services/agent/subscriptions')));
229
+ for (const agentConfig of allAgentConfigs) {
230
+ try {
231
+ // Map flat schedules into behaviors.schedules for DB storage
232
+ const behaviors = {};
233
+ if (agentConfig.schedules?.length) {
234
+ behaviors.schedules = agentConfig.schedules;
235
+ behaviors.cron = agentConfig.schedules[0].cron;
236
+ }
237
+ const inserted = await seedAgent({
238
+ name: agentConfig.name,
239
+ description: agentConfig.description,
240
+ goals: agentConfig.goals,
241
+ rules: agentConfig.rules,
242
+ status: (agentConfig.status ?? 'active'),
243
+ knowledge_domain: agentConfig.knowledge_domain,
244
+ behaviors,
245
+ workflow_type: agentConfig.schedules?.[0]?.workflow_type,
246
+ });
247
+ if (inserted)
248
+ logger_1.loggerRegistry.info(`[long-tail] agent seeded: ${agentConfig.name}`);
249
+ // Seed subscriptions for this agent
250
+ if (agentConfig.subscriptions?.length) {
251
+ const agent = await getAgentByName(agentConfig.name);
252
+ if (agent) {
253
+ for (const sub of agentConfig.subscriptions) {
254
+ try {
255
+ const subInserted = await seedSubscription(agent.id, sub);
256
+ if (subInserted)
257
+ logger_1.loggerRegistry.info(`[long-tail] subscription seeded: ${agentConfig.name}/${sub.topic}`);
258
+ }
259
+ catch (subErr) {
260
+ logger_1.loggerRegistry.warn(`[long-tail] subscription seed failed: ${agentConfig.name}/${sub.topic}: ${subErr.message}`);
261
+ }
262
+ }
263
+ }
264
+ }
265
+ }
266
+ catch (err) {
267
+ logger_1.loggerRegistry.warn(`[long-tail] agent seed failed for ${agentConfig.name}: ${err.message}`);
268
+ }
269
+ }
270
+ }
271
+ // Register the in-process callback adapter for agent event triggers
272
+ const { CallbackEventAdapter } = await Promise.resolve().then(() => __importStar(require('../lib/events/callback')));
273
+ const { agentTriggerRegistry } = await Promise.resolve().then(() => __importStar(require('../services/agent/trigger-registry')));
274
+ const callbackAdapter = new CallbackEventAdapter();
275
+ events_1.eventRegistry.register(callbackAdapter);
223
276
  // Connect event adapters (outside workers guard so API-only containers
224
277
  // still connect to NATS and can publish/receive events)
225
278
  if (events_1.eventRegistry.hasAdapters) {
226
279
  await events_1.eventRegistry.connect();
227
280
  logger_1.loggerRegistry.info('[long-tail] event adapters connected');
228
281
  }
282
+ // Arm agent event subscriptions (after event adapters are connected)
283
+ try {
284
+ await agentTriggerRegistry.connect(callbackAdapter);
285
+ }
286
+ catch (err) {
287
+ logger_1.loggerRegistry.warn(`[long-tail] agent trigger registry: ${err.message}`);
288
+ }
289
+ // Arm agent cron schedules
290
+ try {
291
+ await cron_1.cronRegistry.connectAgentCrons();
292
+ }
293
+ catch (err) {
294
+ logger_1.loggerRegistry.warn(`[long-tail] agent cron schedules: ${err.message}`);
295
+ }
229
296
  // Ensure system bot account exists for cron/system-initiated workflows
230
297
  const { ensureSystemBot } = await Promise.resolve().then(() => __importStar(require('../services/iam/bots')));
231
298
  await ensureSystemBot().catch((err) => logger_1.loggerRegistry.warn(`[long-tail] system bot seed error: ${err.message}`));
@@ -10,6 +10,7 @@ exports.removeKnowledgeField = removeKnowledgeField;
10
10
  exports.listDomains = listDomains;
11
11
  exports.appendKnowledge = appendKnowledge;
12
12
  const db_1 = require("../../lib/db");
13
+ const publish_1 = require("../../lib/events/publish");
13
14
  const sql_1 = require("./sql");
14
15
  async function withClient(fn) {
15
16
  const { class: PgClient, options } = (0, db_1.getConnection)();
@@ -26,7 +27,9 @@ async function storeKnowledge(args) {
26
27
  return withClient(async (client) => {
27
28
  const sql = args.replace ? sql_1.REPLACE_KNOWLEDGE : sql_1.UPSERT_KNOWLEDGE;
28
29
  const { rows } = await client.query(sql, [args.domain, args.key, JSON.stringify(args.data), args.tags || []]);
29
- return { ...rows[0], updated_at: rows[0].updated_at.toISOString() };
30
+ const result = { ...rows[0], updated_at: rows[0].updated_at.toISOString() };
31
+ (0, publish_1.publishKnowledgeEvent)({ type: 'knowledge.stored', domain: args.domain, key: args.key });
32
+ return result;
30
33
  });
31
34
  }
32
35
  async function getKnowledge(args) {
@@ -111,7 +114,11 @@ async function listKnowledge(args) {
111
114
  async function deleteKnowledge(args) {
112
115
  return withClient(async (client) => {
113
116
  const { rowCount } = await client.query(sql_1.DELETE_KNOWLEDGE, [args.domain, args.key]);
114
- return { deleted: (rowCount ?? 0) > 0 };
117
+ const deleted = (rowCount ?? 0) > 0;
118
+ if (deleted) {
119
+ (0, publish_1.publishKnowledgeEvent)({ type: 'knowledge.deleted', domain: args.domain, key: args.key });
120
+ }
121
+ return { deleted };
115
122
  });
116
123
  }
117
124
  async function setKnowledgeField(args) {
@@ -4,7 +4,7 @@
4
4
  * All declarations carry inline `config` that seeds the DB on first boot.
5
5
  * DB is the source of truth after seeding — startup never overwrites.
6
6
  */
7
- import type { LTWorkerConfig, LTMcpServerConfig } from '../types/startup';
7
+ import type { LTWorkerConfig, LTMcpServerConfig, LTAgentConfig } from '../types/startup';
8
8
  export type SystemWorkerEntry = {
9
9
  taskQueue: string;
10
10
  workflow: (...args: any[]) => any;
@@ -16,3 +16,4 @@ export type McpServerFactoryEntry = {
16
16
  config: LTMcpServerConfig;
17
17
  };
18
18
  export declare const builtinMcpServerFactories: Record<string, McpServerFactoryEntry>;
19
+ export declare function getSystemAgents(): LTAgentConfig[];
@@ -41,6 +41,7 @@ var __importStar = (this && this.__importStar) || (function () {
41
41
  Object.defineProperty(exports, "__esModule", { value: true });
42
42
  exports.builtinMcpServerFactories = void 0;
43
43
  exports.getSystemWorkers = getSystemWorkers;
44
+ exports.getSystemAgents = getSystemAgents;
44
45
  // ── Tool manifests (static JSON schema data) ────────────────────────────────
45
46
  const tool_manifests_escalation_1 = require("./seed/tool-manifests-escalation");
46
47
  const tool_manifests_data_1 = require("./seed/tool-manifests-data");
@@ -48,12 +49,18 @@ const tool_manifests_browser_1 = require("./seed/tool-manifests-browser");
48
49
  const tool_manifests_workflows_1 = require("./seed/tool-manifests-workflows");
49
50
  const tool_manifests_admin_1 = require("./seed/tool-manifests-admin");
50
51
  const tool_manifests_knowledge_1 = require("./seed/tool-manifests-knowledge");
51
- // Gmail is an example connector — loaded conditionally (not in npm package)
52
+ const tool_manifests_events_1 = require("./seed/tool-manifests-events");
53
+ // Example connectors — loaded conditionally (not in npm package)
52
54
  let GMAIL_TOOLS = [];
53
55
  try {
54
56
  GMAIL_TOOLS = require('../examples/seed/tool-manifests-gmail').GMAIL_TOOLS;
55
57
  }
56
58
  catch { /* not available */ }
59
+ let IMAGE_TOOLS = [];
60
+ try {
61
+ IMAGE_TOOLS = require('../examples/mcp-servers/tool-manifests-image').IMAGE_TOOLS;
62
+ }
63
+ catch { /* not available */ }
57
64
  // ── Role constants ──────────────────────────────────────────────────────────
58
65
  const SYSTEM_ROLES = ['reviewer', 'engineer', 'admin'];
59
66
  const ENGINEER = 'engineer';
@@ -135,6 +142,7 @@ exports.builtinMcpServerFactories = {
135
142
  config: {
136
143
  description: 'Built-in escalation and human queue management. Exposes the escalation API as MCP tools for AI agents and remediation workflows.',
137
144
  tags: ['escalation', 'human-queue', 'routing'],
145
+ category: 'Automation',
138
146
  compileHints: [
139
147
  'escalate_and_wait creates a durable pause point.',
140
148
  'The step AFTER escalate_and_wait is always a signal step (kind: "signal") that receives the human response.',
@@ -148,6 +156,7 @@ exports.builtinMcpServerFactories = {
148
156
  config: {
149
157
  description: 'Text translation using LLM. Translates content between languages with automatic source language detection.',
150
158
  tags: ['translation', 'language', 'text-processing'],
159
+ category: 'Analysis',
151
160
  credentialProviders: ['anthropic'],
152
161
  toolManifest: tool_manifests_data_1.TRANSLATION_TOOLS,
153
162
  },
@@ -157,6 +166,7 @@ exports.builtinMcpServerFactories = {
157
166
  config: {
158
167
  description: 'Image analysis and description using LLM vision. Analyzes images to extract structured data, text content, and descriptions.',
159
168
  tags: ['vision', 'image-analysis', 'multimodal'],
169
+ category: 'Analysis',
160
170
  compileHints: [
161
171
  'Vision tools process one image at a time.',
162
172
  'The argument name is `image` (NOT `image_path`). It accepts a storage path, data URI, or https:// URL.',
@@ -172,6 +182,7 @@ exports.builtinMcpServerFactories = {
172
182
  config: {
173
183
  description: 'Low-level browser automation via Playwright. Fine-grained control: navigate, click, fill, wait_for, evaluate, run_script.',
174
184
  tags: ['browser-automation', 'testing', 'screenshots'],
185
+ category: 'Automation',
175
186
  compileHints: [
176
187
  'Session fields (_handle, page_id) MUST be threaded from the step that created them to EVERY subsequent browser step.',
177
188
  'run_script accepts a `steps` array — fixed implementation detail, never a dynamic input.',
@@ -185,6 +196,7 @@ exports.builtinMcpServerFactories = {
185
196
  config: {
186
197
  description: 'High-level browser automation. Intent-based tools that handle session management, timing, and error recovery internally.',
187
198
  tags: ['browser-automation', 'screenshots', 'scraping', 'forms'],
199
+ category: 'Automation',
188
200
  compileHints: [
189
201
  'Session fields (_handle, page_id) MUST be threaded from producing step to ALL subsequent browser steps.',
190
202
  'extract_content returns `links` (structured array) and `script_result` (raw). Use `links` as the source field.',
@@ -198,6 +210,7 @@ exports.builtinMcpServerFactories = {
198
210
  config: {
199
211
  description: 'Product documentation search and retrieval. List, search, and read Long Tail documentation.',
200
212
  tags: ['documentation', 'help', 'reference'],
213
+ category: 'Reference',
201
214
  toolManifest: tool_manifests_data_1.DOCS_TOOLS,
202
215
  },
203
216
  },
@@ -206,6 +219,7 @@ exports.builtinMcpServerFactories = {
206
219
  config: {
207
220
  description: 'Managed file storage for reading, writing, listing, and deleting files.',
208
221
  tags: ['storage', 'files', 'io'],
222
+ category: 'Data',
209
223
  toolManifest: tool_manifests_data_1.FILE_STORAGE_TOOLS,
210
224
  },
211
225
  },
@@ -214,6 +228,7 @@ exports.builtinMcpServerFactories = {
214
228
  config: {
215
229
  description: 'HTTP client tools for making GET, POST, and arbitrary HTTP requests.',
216
230
  tags: ['http', 'api', 'fetch', 'network'],
231
+ category: 'Data',
217
232
  compileHints: 'HTTP response bodies may be large. Prefer specific fields from parsed JSON rather than raw body.',
218
233
  toolManifest: tool_manifests_data_1.HTTP_FETCH_TOOLS,
219
234
  },
@@ -223,6 +238,7 @@ exports.builtinMcpServerFactories = {
223
238
  config: {
224
239
  description: 'OAuth token management. Get fresh access tokens for external services. Handles automatic token refresh.',
225
240
  tags: ['authentication', 'oauth', 'credentials'],
241
+ category: 'System',
226
242
  compileHints: 'get_access_token returns a short-lived token. Call immediately before authenticated API requests — do not cache across steps.',
227
243
  toolManifest: tool_manifests_data_1.OAUTH_TOOLS,
228
244
  },
@@ -232,6 +248,7 @@ exports.builtinMcpServerFactories = {
232
248
  config: {
233
249
  description: 'Agentic coding assistant via Claude Code CLI. Execute development tasks: code generation, refactoring, file analysis, and multi-step workflows.',
234
250
  tags: ['development', 'coding', 'ai-agent', 'terminal', 'code-generation'],
251
+ category: 'Development',
235
252
  compileHints: 'execute_task runs Claude Code as a subprocess. The `prompt` parameter is ALWAYS a dynamic trigger input. ' +
236
253
  'Keep prompts self-contained. For read-only analysis, restrict with allowed_tools: ["Read", "Grep", "Glob"].',
237
254
  credentialProviders: ['anthropic'],
@@ -243,6 +260,7 @@ exports.builtinMcpServerFactories = {
243
260
  config: {
244
261
  description: 'System administration tools for reflexive self-management. Certify workflows, update server tags, manage roles.',
245
262
  tags: ['admin', 'system', 'configuration'],
263
+ category: 'System',
246
264
  compileHints: 'Admin tools modify system configuration. certify_workflow and decertify_workflow change interceptor behavior.',
247
265
  toolManifest: tool_manifests_admin_1.ADMIN_TOOLS,
248
266
  },
@@ -252,6 +270,7 @@ exports.builtinMcpServerFactories = {
252
270
  config: {
253
271
  description: 'Persistent knowledge store for autonomous agents. Store, retrieve, search, and accumulate JSONB documents in isolated domains.',
254
272
  tags: ['knowledge', 'memory', 'state', 'storage'],
273
+ category: 'Data',
255
274
  compileHints: 'store_knowledge: domain (string), key (string), data (object — MUST be JSON object, never string). ' +
256
275
  'Upserts by domain+key. search_knowledge uses JSONB containment (@>). ' +
257
276
  'append_knowledge adds to arrays without replacing. list_domains returns all domains with counts.',
@@ -263,6 +282,7 @@ exports.builtinMcpServerFactories = {
263
282
  config: {
264
283
  description: 'Schema-driven data exchange with external service endpoints. Validates requests and responses against JSON Schema.',
265
284
  tags: ['api', 'schema', 'exchange', 'validation', 'fetch'],
285
+ category: 'Data',
266
286
  compileHints: 'Validates requests before sending and responses after receiving. ' +
267
287
  'Embed request_schema and response_schema as STATIC values. ' +
268
288
  'Exchange output: { status, data, headers, elapsed_ms, validated }. API response is in .data field. ' +
@@ -270,6 +290,17 @@ exports.builtinMcpServerFactories = {
270
290
  toolManifest: tool_manifests_data_1.SCHEMA_EXCHANGE_TOOLS,
271
291
  },
272
292
  },
293
+ 'long-tail-events': {
294
+ factory: () => Promise.resolve().then(() => __importStar(require('./mcp-servers/events'))).then((m) => m.createEventsServer()),
295
+ config: {
296
+ description: 'Event bus for agent-to-agent communication. Publish custom events that other agents subscribe to and react to.',
297
+ tags: ['events', 'messaging', 'pub-sub'],
298
+ category: 'Communication',
299
+ compileHints: 'publish_event: topic follows app.{namespace}.{entity}.{action} convention. ' +
300
+ 'The app. prefix is auto-added if omitted. Events are delivered to all matching subscribers.',
301
+ toolManifest: tool_manifests_events_1.EVENTS_TOOLS,
302
+ },
303
+ },
273
304
  };
274
305
  // Gmail is an example connector — only register when available (not in npm package)
275
306
  if (GMAIL_TOOLS.length > 0) {
@@ -278,6 +309,7 @@ if (GMAIL_TOOLS.length > 0) {
278
309
  config: {
279
310
  description: 'Gmail tools — search, read, summarize, extract, and draft emails using your connected Google account.',
280
311
  tags: ['gmail', 'email', 'messaging', 'google'],
312
+ category: 'Communication',
281
313
  compileHints: 'Requires a connected Google account (OAuth). gmail_search finds messages, gmail_read gets full content, ' +
282
314
  'gmail_summarize for threads, gmail_extract for structured data, gmail_draft for composing.',
283
315
  credentialProviders: ['google'],
@@ -285,3 +317,63 @@ if (GMAIL_TOOLS.length > 0) {
285
317
  },
286
318
  };
287
319
  }
320
+ // Image tools — example connector for image processing via sharp
321
+ if (IMAGE_TOOLS.length > 0) {
322
+ exports.builtinMcpServerFactories['long-tail-image-tools'] = {
323
+ factory: () => Promise.resolve().then(() => __importStar(require('../examples/mcp-servers/image-tools'))).then((m) => m.createImageToolsServer()),
324
+ config: {
325
+ description: 'Image processing tools — resize, crop, rotate, convert, blur, compress, and more.',
326
+ tags: ['image', 'processing', 'vision'],
327
+ category: 'Media',
328
+ compileHints: 'Image tools accept file paths from storage. Use file_storage tools to upload images first.',
329
+ toolManifest: IMAGE_TOOLS,
330
+ },
331
+ };
332
+ }
333
+ // ── System agents ──────────────────────────────────────────────────────────
334
+ function getSystemAgents() {
335
+ return [
336
+ {
337
+ name: 'health-monitor',
338
+ description: 'Watches for workflow failures and schema drift',
339
+ goals: 'Detect failures early, capture diagnostics, and alert before cascading issues',
340
+ rules: 'Do not restart failed workflows automatically. Capture state and escalate.',
341
+ status: 'active',
342
+ knowledge_domain: 'system-health',
343
+ schedules: [
344
+ { cron: '0 * * * *', workflow_type: 'basicEcho' },
345
+ ],
346
+ subscriptions: [
347
+ { topic: 'workflow.failed', reaction_type: 'durable', workflow_type: 'basicEcho', input_mapping: { data: { error: '{event.status}', workflowId: '{event.workflowId}' } } },
348
+ { topic: 'activity.failed', reaction_type: 'durable', workflow_type: 'basicEcho', input_mapping: { data: { activity: '{event.activityName}', workflowId: '{event.workflowId}' } } },
349
+ { topic: 'app.*.*.error', reaction_type: 'durable', workflow_type: 'basicEcho', input_mapping: { data: { error: '{event.data}', source: '{event.source}' } } },
350
+ ],
351
+ },
352
+ {
353
+ name: 'event-coordinator',
354
+ description: 'Coordinates cross-system events and routes them to workflows',
355
+ goals: 'Serve as the central nervous system for event-driven automation',
356
+ rules: 'Route critical events within 5 seconds. Never drop events.',
357
+ status: 'active',
358
+ knowledge_domain: 'event-routing',
359
+ subscriptions: [
360
+ { topic: 'app.>', reaction_type: 'durable', workflow_type: 'basicEcho', input_mapping: { data: { topic: '{event.type}', source: '{event.source}', payload: '{event.data}' } } },
361
+ { topic: 'knowledge.stored', reaction_type: 'durable', workflow_type: 'basicEcho', input_mapping: { data: { domain: '{event.data.domain}', key: '{event.data.key}' } } },
362
+ ],
363
+ },
364
+ {
365
+ name: 'content-triage',
366
+ description: 'Auto-resolves low-confidence content review escalations',
367
+ goals: 'Reduce human review burden by auto-triaging content below confidence thresholds',
368
+ rules: 'Never auto-approve content flagged for legal review.',
369
+ status: 'active',
370
+ knowledge_domain: 'content-review',
371
+ schedules: [
372
+ { cron: '*/15 * * * *', workflow_type: 'reviewContent' },
373
+ ],
374
+ subscriptions: [
375
+ { topic: 'escalation.created', reaction_type: 'durable', workflow_type: 'reviewContent', filter: { workflowName: 'reviewContent' }, input_mapping: { data: { escalationId: '{event.escalationId}', workflowId: '{event.workflowId}' } } },
376
+ ],
377
+ },
378
+ ];
379
+ }
@@ -0,0 +1,5 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function createEventsServer(options?: {
3
+ name?: string;
4
+ }): Promise<McpServer>;
5
+ export declare function stopEventsServer(): Promise<void>;