@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
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ESCALATION_COUNT = exports.KNOWLEDGE_COUNT = exports.SEED_AGENT = exports.DELETE_AGENT = exports.UPDATE_AGENT = exports.INSERT_AGENT = exports.GET_AGENT_BY_NAME = exports.GET_AGENT = exports.COUNT_AGENTS = exports.LIST_AGENTS = void 0;
4
+ exports.LIST_AGENTS = `
5
+ SELECT a.*,
6
+ COALESCE(s.sub_count, 0)::int AS subscription_count,
7
+ s.sub_topics
8
+ FROM lt_agents a
9
+ LEFT JOIN LATERAL (
10
+ SELECT COUNT(*)::int AS sub_count,
11
+ array_agg(topic ORDER BY created_at) AS sub_topics
12
+ FROM lt_agent_subscriptions
13
+ WHERE agent_id = a.id AND enabled = true
14
+ ) s ON true
15
+ WHERE ($1::text IS NULL OR a.status = $1)
16
+ AND ($2::text IS NULL OR a.knowledge_domain = $2)
17
+ ORDER BY a.updated_at DESC
18
+ LIMIT $3 OFFSET $4
19
+ `;
20
+ exports.COUNT_AGENTS = `
21
+ SELECT COUNT(*)::int AS total FROM lt_agents
22
+ WHERE ($1::text IS NULL OR status = $1)
23
+ AND ($2::text IS NULL OR knowledge_domain = $2)
24
+ `;
25
+ exports.GET_AGENT = `
26
+ SELECT * FROM lt_agents WHERE id = $1
27
+ `;
28
+ exports.GET_AGENT_BY_NAME = `
29
+ SELECT * FROM lt_agents WHERE name = $1
30
+ `;
31
+ exports.INSERT_AGENT = `
32
+ INSERT INTO lt_agents (name, description, status, user_id, knowledge_domain,
33
+ capabilities, behaviors, goals, rules, workflow_type, pipeline_id, metadata)
34
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)
35
+ RETURNING *
36
+ `;
37
+ exports.UPDATE_AGENT = `
38
+ UPDATE lt_agents SET
39
+ name = COALESCE($2, name),
40
+ description = COALESCE($3, description),
41
+ status = COALESCE($4, status),
42
+ user_id = COALESCE($5, user_id),
43
+ knowledge_domain = COALESCE($6, knowledge_domain),
44
+ capabilities = COALESCE($7, capabilities),
45
+ behaviors = COALESCE($8, behaviors),
46
+ goals = COALESCE($9, goals),
47
+ rules = COALESCE($10, rules),
48
+ workflow_type = COALESCE($11, workflow_type),
49
+ pipeline_id = COALESCE($12, pipeline_id),
50
+ metadata = COALESCE($13, metadata),
51
+ last_run_at = COALESCE($14, last_run_at)
52
+ WHERE id = $1
53
+ RETURNING *
54
+ `;
55
+ exports.DELETE_AGENT = `
56
+ DELETE FROM lt_agents WHERE id = $1
57
+ `;
58
+ exports.SEED_AGENT = `
59
+ INSERT INTO lt_agents (name, description, status, user_id, knowledge_domain,
60
+ capabilities, behaviors, goals, rules, workflow_type, pipeline_id, metadata)
61
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)
62
+ ON CONFLICT (name) DO NOTHING
63
+ `;
64
+ exports.KNOWLEDGE_COUNT = `
65
+ SELECT COUNT(*)::int AS count FROM lt_knowledge WHERE domain = $1
66
+ `;
67
+ exports.ESCALATION_COUNT = `
68
+ SELECT COUNT(*)::int AS count FROM lt_escalations
69
+ WHERE status = 'pending' AND created_by = $1
70
+ `;
@@ -0,0 +1,7 @@
1
+ export declare const LIST_SUBSCRIPTIONS = "\n SELECT * FROM lt_agent_subscriptions\n WHERE agent_id = $1\n ORDER BY created_at\n";
2
+ export declare const GET_SUBSCRIPTION = "\n SELECT * FROM lt_agent_subscriptions WHERE id = $1\n";
3
+ export declare const INSERT_SUBSCRIPTION = "\n INSERT INTO lt_agent_subscriptions\n (agent_id, topic, filter, reaction_type, workflow_type, pipeline_id, mcp_prompt,\n input_mapping, execute_as, enabled)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)\n RETURNING *\n";
4
+ export declare const UPDATE_SUBSCRIPTION = "\n UPDATE lt_agent_subscriptions SET\n topic = COALESCE($2, topic),\n filter = COALESCE($3, filter),\n reaction_type = COALESCE($4, reaction_type),\n workflow_type = COALESCE($5, workflow_type),\n pipeline_id = COALESCE($6, pipeline_id),\n mcp_prompt = COALESCE($7, mcp_prompt),\n input_mapping = COALESCE($8, input_mapping),\n execute_as = COALESCE($9, execute_as),\n enabled = COALESCE($10, enabled)\n WHERE id = $1\n RETURNING *\n";
5
+ export declare const DELETE_SUBSCRIPTION = "\n DELETE FROM lt_agent_subscriptions WHERE id = $1\n";
6
+ export declare const SEED_SUBSCRIPTION = "\n INSERT INTO lt_agent_subscriptions\n (agent_id, topic, filter, reaction_type, workflow_type, pipeline_id, mcp_prompt,\n input_mapping, execute_as, enabled)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, true)\n ON CONFLICT (agent_id, topic) DO NOTHING\n";
7
+ export declare const LIST_ACTIVE_SUBSCRIPTIONS = "\n SELECT s.*, a.name AS agent_name, a.user_id AS agent_user_id\n FROM lt_agent_subscriptions s\n JOIN lt_agents a ON s.agent_id = a.id\n WHERE s.enabled = true AND a.status = 'active'\n ORDER BY s.created_at\n";
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LIST_ACTIVE_SUBSCRIPTIONS = exports.SEED_SUBSCRIPTION = exports.DELETE_SUBSCRIPTION = exports.UPDATE_SUBSCRIPTION = exports.INSERT_SUBSCRIPTION = exports.GET_SUBSCRIPTION = exports.LIST_SUBSCRIPTIONS = void 0;
4
+ exports.LIST_SUBSCRIPTIONS = `
5
+ SELECT * FROM lt_agent_subscriptions
6
+ WHERE agent_id = $1
7
+ ORDER BY created_at
8
+ `;
9
+ exports.GET_SUBSCRIPTION = `
10
+ SELECT * FROM lt_agent_subscriptions WHERE id = $1
11
+ `;
12
+ exports.INSERT_SUBSCRIPTION = `
13
+ INSERT INTO lt_agent_subscriptions
14
+ (agent_id, topic, filter, reaction_type, workflow_type, pipeline_id, mcp_prompt,
15
+ input_mapping, execute_as, enabled)
16
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)
17
+ RETURNING *
18
+ `;
19
+ exports.UPDATE_SUBSCRIPTION = `
20
+ UPDATE lt_agent_subscriptions SET
21
+ topic = COALESCE($2, topic),
22
+ filter = COALESCE($3, filter),
23
+ reaction_type = COALESCE($4, reaction_type),
24
+ workflow_type = COALESCE($5, workflow_type),
25
+ pipeline_id = COALESCE($6, pipeline_id),
26
+ mcp_prompt = COALESCE($7, mcp_prompt),
27
+ input_mapping = COALESCE($8, input_mapping),
28
+ execute_as = COALESCE($9, execute_as),
29
+ enabled = COALESCE($10, enabled)
30
+ WHERE id = $1
31
+ RETURNING *
32
+ `;
33
+ exports.DELETE_SUBSCRIPTION = `
34
+ DELETE FROM lt_agent_subscriptions WHERE id = $1
35
+ `;
36
+ exports.SEED_SUBSCRIPTION = `
37
+ INSERT INTO lt_agent_subscriptions
38
+ (agent_id, topic, filter, reaction_type, workflow_type, pipeline_id, mcp_prompt,
39
+ input_mapping, execute_as, enabled)
40
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, true)
41
+ ON CONFLICT (agent_id, topic) DO NOTHING
42
+ `;
43
+ exports.LIST_ACTIVE_SUBSCRIPTIONS = `
44
+ SELECT s.*, a.name AS agent_name, a.user_id AS agent_user_id
45
+ FROM lt_agent_subscriptions s
46
+ JOIN lt_agents a ON s.agent_id = a.id
47
+ WHERE s.enabled = true AND a.status = 'active'
48
+ ORDER BY s.created_at
49
+ `;
@@ -0,0 +1,30 @@
1
+ export interface AgentSubscription {
2
+ id: string;
3
+ agent_id: string;
4
+ topic: string;
5
+ filter?: Record<string, any>;
6
+ reaction_type: 'durable' | 'pipeline' | 'mcp_query';
7
+ workflow_type?: string;
8
+ pipeline_id?: string;
9
+ mcp_prompt?: string;
10
+ input_mapping: Record<string, any>;
11
+ execute_as?: string;
12
+ enabled: boolean;
13
+ created_at: string;
14
+ updated_at: string;
15
+ }
16
+ export interface ActiveSubscription extends AgentSubscription {
17
+ agent_name: string;
18
+ agent_user_id?: string;
19
+ }
20
+ export declare function listSubscriptions(agentId: string): Promise<AgentSubscription[]>;
21
+ export declare function getSubscription(id: string): Promise<AgentSubscription | null>;
22
+ export declare function createSubscription(agentId: string, data: Partial<AgentSubscription>): Promise<AgentSubscription>;
23
+ export declare function updateSubscription(id: string, data: Partial<AgentSubscription>): Promise<AgentSubscription | null>;
24
+ export declare function deleteSubscription(id: string): Promise<boolean>;
25
+ export declare function listActiveSubscriptions(): Promise<ActiveSubscription[]>;
26
+ /**
27
+ * Seed a subscription at startup (insert-if-absent).
28
+ * Conflict on (agent_id, topic) — DB is source of truth after first boot.
29
+ */
30
+ export declare function seedSubscription(agentId: string, data: Partial<AgentSubscription>): Promise<boolean>;
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.listSubscriptions = listSubscriptions;
4
+ exports.getSubscription = getSubscription;
5
+ exports.createSubscription = createSubscription;
6
+ exports.updateSubscription = updateSubscription;
7
+ exports.deleteSubscription = deleteSubscription;
8
+ exports.listActiveSubscriptions = listActiveSubscriptions;
9
+ exports.seedSubscription = seedSubscription;
10
+ const db_1 = require("../../lib/db");
11
+ const subscription_sql_1 = require("./subscription-sql");
12
+ async function listSubscriptions(agentId) {
13
+ const pool = (0, db_1.getPool)();
14
+ const { rows } = await pool.query(subscription_sql_1.LIST_SUBSCRIPTIONS, [agentId]);
15
+ return rows;
16
+ }
17
+ async function getSubscription(id) {
18
+ const pool = (0, db_1.getPool)();
19
+ const { rows } = await pool.query(subscription_sql_1.GET_SUBSCRIPTION, [id]);
20
+ return rows[0] ?? null;
21
+ }
22
+ async function createSubscription(agentId, data) {
23
+ const pool = (0, db_1.getPool)();
24
+ const { rows } = await pool.query(subscription_sql_1.INSERT_SUBSCRIPTION, [
25
+ agentId,
26
+ data.topic,
27
+ data.filter ? JSON.stringify(data.filter) : null,
28
+ data.reaction_type,
29
+ data.workflow_type ?? null,
30
+ data.pipeline_id ?? null,
31
+ data.mcp_prompt ?? null,
32
+ JSON.stringify(data.input_mapping ?? {}),
33
+ data.execute_as ?? null,
34
+ data.enabled !== false,
35
+ ]);
36
+ return rows[0];
37
+ }
38
+ async function updateSubscription(id, data) {
39
+ const pool = (0, db_1.getPool)();
40
+ const { rows } = await pool.query(subscription_sql_1.UPDATE_SUBSCRIPTION, [
41
+ id,
42
+ data.topic ?? null,
43
+ data.filter ? JSON.stringify(data.filter) : null,
44
+ data.reaction_type ?? null,
45
+ data.workflow_type ?? null,
46
+ data.pipeline_id ?? null,
47
+ data.mcp_prompt ?? null,
48
+ data.input_mapping ? JSON.stringify(data.input_mapping) : null,
49
+ data.execute_as ?? null,
50
+ data.enabled ?? null,
51
+ ]);
52
+ return rows[0] ?? null;
53
+ }
54
+ async function deleteSubscription(id) {
55
+ const pool = (0, db_1.getPool)();
56
+ const { rowCount } = await pool.query(subscription_sql_1.DELETE_SUBSCRIPTION, [id]);
57
+ return (rowCount ?? 0) > 0;
58
+ }
59
+ async function listActiveSubscriptions() {
60
+ const pool = (0, db_1.getPool)();
61
+ const { rows } = await pool.query(subscription_sql_1.LIST_ACTIVE_SUBSCRIPTIONS);
62
+ return rows;
63
+ }
64
+ /**
65
+ * Seed a subscription at startup (insert-if-absent).
66
+ * Conflict on (agent_id, topic) — DB is source of truth after first boot.
67
+ */
68
+ async function seedSubscription(agentId, data) {
69
+ const pool = (0, db_1.getPool)();
70
+ const { rowCount } = await pool.query(subscription_sql_1.SEED_SUBSCRIPTION, [
71
+ agentId,
72
+ data.topic,
73
+ data.filter ? JSON.stringify(data.filter) : null,
74
+ data.reaction_type,
75
+ data.workflow_type ?? null,
76
+ data.pipeline_id ?? null,
77
+ data.mcp_prompt ?? null,
78
+ JSON.stringify(data.input_mapping ?? {}),
79
+ data.execute_as ?? null,
80
+ ]);
81
+ return (rowCount ?? 0) > 0;
82
+ }
@@ -0,0 +1,45 @@
1
+ import type { CallbackEventAdapter } from '../../lib/events/callback';
2
+ /**
3
+ * Agent Trigger Registry — arms event subscriptions for active agents at startup.
4
+ *
5
+ * Analogous to LTCronRegistry but for event-driven reactions. When an event
6
+ * matches a subscription's topic pattern (and optional filter), the registry
7
+ * invokes the configured workflow with a deterministic ID for distributed dedup.
8
+ */
9
+ declare class AgentTriggerRegistry {
10
+ private adapter;
11
+ private unsubs;
12
+ private connected;
13
+ /**
14
+ * Load all active subscriptions from DB and arm event listeners.
15
+ */
16
+ connect(adapter: CallbackEventAdapter): Promise<void>;
17
+ /**
18
+ * Re-arm all subscriptions for a specific agent (after config change).
19
+ */
20
+ restartAgent(agentId: string): Promise<void>;
21
+ /**
22
+ * Stop all subscriptions for a specific agent.
23
+ */
24
+ stopAgent(agentId: string): void;
25
+ /**
26
+ * Disconnect all subscriptions.
27
+ */
28
+ disconnect(): void;
29
+ private armSubscription;
30
+ private buildHandler;
31
+ /**
32
+ * Shallow key-value match: every key in filter must match the corresponding
33
+ * key in event.data. Missing keys in event.data fail the match.
34
+ */
35
+ private matchesFilter;
36
+ /**
37
+ * Deterministic workflow ID derived from the subscription + event.
38
+ * Multiple containers receiving the same event produce the same ID,
39
+ * so HotMesh's idempotent workflow.start() prevents duplicate execution.
40
+ */
41
+ private deriveWorkflowId;
42
+ private executeReaction;
43
+ }
44
+ export declare const agentTriggerRegistry: AgentTriggerRegistry;
45
+ export {};
@@ -0,0 +1,232 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.agentTriggerRegistry = void 0;
37
+ const crypto_1 = require("crypto");
38
+ const logger_1 = require("../../lib/logger");
39
+ const publish_1 = require("../../lib/events/publish");
40
+ const subscriptions_1 = require("./subscriptions");
41
+ const input_mapper_1 = require("./input-mapper");
42
+ const index_1 = require("./index");
43
+ /**
44
+ * Agent Trigger Registry — arms event subscriptions for active agents at startup.
45
+ *
46
+ * Analogous to LTCronRegistry but for event-driven reactions. When an event
47
+ * matches a subscription's topic pattern (and optional filter), the registry
48
+ * invokes the configured workflow with a deterministic ID for distributed dedup.
49
+ */
50
+ class AgentTriggerRegistry {
51
+ constructor() {
52
+ this.adapter = null;
53
+ this.unsubs = new Map();
54
+ this.connected = false;
55
+ }
56
+ /**
57
+ * Load all active subscriptions from DB and arm event listeners.
58
+ */
59
+ async connect(adapter) {
60
+ this.adapter = adapter;
61
+ const subs = await (0, subscriptions_1.listActiveSubscriptions)();
62
+ for (const sub of subs) {
63
+ this.armSubscription(sub);
64
+ }
65
+ this.connected = true;
66
+ logger_1.loggerRegistry.info(`[long-tail] agent trigger registry: ${subs.length} subscription(s) armed`);
67
+ }
68
+ /**
69
+ * Re-arm all subscriptions for a specific agent (after config change).
70
+ */
71
+ async restartAgent(agentId) {
72
+ if (!this.adapter)
73
+ return;
74
+ // Stop existing subs for this agent
75
+ for (const [key, unsub] of this.unsubs) {
76
+ if (key.startsWith(`${agentId}:`)) {
77
+ unsub();
78
+ this.unsubs.delete(key);
79
+ }
80
+ }
81
+ // Reload from DB
82
+ const subs = await (0, subscriptions_1.listActiveSubscriptions)();
83
+ const agentSubs = subs.filter((s) => s.agent_id === agentId);
84
+ for (const sub of agentSubs) {
85
+ this.armSubscription(sub);
86
+ }
87
+ logger_1.loggerRegistry.info(`[long-tail] agent triggers restarted for ${agentId}: ${agentSubs.length} sub(s)`);
88
+ }
89
+ /**
90
+ * Stop all subscriptions for a specific agent.
91
+ */
92
+ stopAgent(agentId) {
93
+ for (const [key, unsub] of this.unsubs) {
94
+ if (key.startsWith(`${agentId}:`)) {
95
+ unsub();
96
+ this.unsubs.delete(key);
97
+ }
98
+ }
99
+ }
100
+ /**
101
+ * Disconnect all subscriptions.
102
+ */
103
+ disconnect() {
104
+ for (const unsub of this.unsubs.values()) {
105
+ unsub();
106
+ }
107
+ this.unsubs.clear();
108
+ this.connected = false;
109
+ logger_1.loggerRegistry.info('[long-tail] agent trigger registry disconnected');
110
+ }
111
+ armSubscription(sub) {
112
+ if (!this.adapter)
113
+ return;
114
+ const key = `${sub.agent_id}:${sub.id}`;
115
+ const handler = this.buildHandler(sub);
116
+ // Normalize topic: strip the 'lt.events.' prefix if present, since
117
+ // CallbackEventAdapter matches against raw event.type (e.g., 'workflow.failed',
118
+ // not 'lt.events.workflow.failed'). Users may store either form in the DB.
119
+ const rawTopic = sub.topic.replace(/^lt\.events\./, '');
120
+ const unsub = this.adapter.on(rawTopic, handler);
121
+ this.unsubs.set(key, unsub);
122
+ }
123
+ buildHandler(sub) {
124
+ return async (event) => {
125
+ try {
126
+ // 1. Evaluate optional filter
127
+ if (sub.filter && !this.matchesFilter(event, sub.filter)) {
128
+ return;
129
+ }
130
+ // 2. Derive deterministic workflow ID for distributed dedup
131
+ const deterministicId = this.deriveWorkflowId(sub, event);
132
+ // 3. Apply input mapping to transform event → envelope data
133
+ const mapped = Object.keys(sub.input_mapping).length > 0
134
+ ? (0, input_mapper_1.applyInputMapping)(sub.input_mapping, event)
135
+ : { data: event.data ?? {}, metadata: { source: 'agent', agentName: sub.agent_name } };
136
+ // 4. Emit agent.started
137
+ (0, publish_1.publishAgentEvent)({
138
+ type: 'agent.started',
139
+ agentId: sub.agent_id,
140
+ agentName: sub.agent_name,
141
+ data: { topic: sub.topic, eventType: event.type, deterministicId },
142
+ });
143
+ // 5. Invoke the reaction workflow
144
+ await this.executeReaction(sub, mapped, deterministicId);
145
+ // 6. Emit agent.completed + update last_run_at
146
+ (0, publish_1.publishAgentEvent)({
147
+ type: 'agent.completed',
148
+ agentId: sub.agent_id,
149
+ agentName: sub.agent_name,
150
+ data: { topic: sub.topic, eventType: event.type },
151
+ });
152
+ (0, index_1.updateAgent)(sub.agent_id, {
153
+ last_run_at: new Date().toISOString(),
154
+ }).catch(() => { }); // best-effort
155
+ }
156
+ catch (err) {
157
+ (0, publish_1.publishAgentEvent)({
158
+ type: 'agent.failed',
159
+ agentId: sub.agent_id,
160
+ agentName: sub.agent_name,
161
+ status: 'error',
162
+ data: { topic: sub.topic, error: err.message },
163
+ });
164
+ logger_1.loggerRegistry.warn(`[long-tail] agent trigger failed: ${sub.agent_name}/${sub.topic}: ${err.message}`);
165
+ }
166
+ };
167
+ }
168
+ /**
169
+ * Shallow key-value match: every key in filter must match the corresponding
170
+ * key in event.data. Missing keys in event.data fail the match.
171
+ */
172
+ matchesFilter(event, filter) {
173
+ const data = event.data ?? {};
174
+ for (const [key, expected] of Object.entries(filter)) {
175
+ if (data[key] !== expected)
176
+ return false;
177
+ }
178
+ return true;
179
+ }
180
+ /**
181
+ * Deterministic workflow ID derived from the subscription + event.
182
+ * Multiple containers receiving the same event produce the same ID,
183
+ * so HotMesh's idempotent workflow.start() prevents duplicate execution.
184
+ */
185
+ deriveWorkflowId(sub, event) {
186
+ const eventKey = event.workflowId || event.taskId || event.escalationId || '';
187
+ const uniquePart = eventKey || (0, crypto_1.createHash)('sha256')
188
+ .update(`${event.timestamp}:${event.type}:${JSON.stringify(event.data ?? {})}`)
189
+ .digest('hex')
190
+ .slice(0, 12);
191
+ return `agent-${sub.agent_id.slice(0, 8)}-${sub.id.slice(0, 8)}-${uniquePart}`;
192
+ }
193
+ async executeReaction(sub, mapped, deterministicId) {
194
+ switch (sub.reaction_type) {
195
+ case 'durable': {
196
+ const { invokeWorkflow } = await Promise.resolve().then(() => __importStar(require('../workflow-invocation')));
197
+ await invokeWorkflow({
198
+ workflowType: sub.workflow_type,
199
+ data: mapped.data ?? mapped,
200
+ metadata: mapped.metadata ?? { source: 'agent', certified: true },
201
+ executeAs: sub.execute_as ?? sub.agent_user_id ?? undefined,
202
+ options: { workflowId: deterministicId },
203
+ auth: { userId: sub.agent_user_id || 'lt-system', role: 'admin' },
204
+ });
205
+ break;
206
+ }
207
+ case 'pipeline': {
208
+ const { invokeYamlWorkflow } = await Promise.resolve().then(() => __importStar(require('../yaml-workflow/invoke')));
209
+ const { getYamlWorkflow } = await Promise.resolve().then(() => __importStar(require('../yaml-workflow/db')));
210
+ const wf = await getYamlWorkflow(sub.pipeline_id);
211
+ if (!wf)
212
+ throw new Error(`Pipeline ${sub.pipeline_id} not found`);
213
+ await invokeYamlWorkflow(wf, {
214
+ data: mapped.data ?? mapped,
215
+ execute_as: sub.execute_as ?? sub.agent_user_id ?? undefined,
216
+ source: 'agent',
217
+ });
218
+ break;
219
+ }
220
+ case 'mcp_query': {
221
+ const { startMcpQuery } = await Promise.resolve().then(() => __importStar(require('../insight')));
222
+ await startMcpQuery({
223
+ prompt: sub.mcp_prompt,
224
+ wait: false,
225
+ userId: sub.agent_user_id ?? undefined,
226
+ });
227
+ break;
228
+ }
229
+ }
230
+ }
231
+ }
232
+ exports.agentTriggerRegistry = new AgentTriggerRegistry();
@@ -1,4 +1,4 @@
1
- import type { LTWorkflowConfig } from '../../types';
1
+ import type { LTWorkflowConfig, LTAgent, AgentSchedule } from '../../types';
2
2
  import type { LTYamlWorkflowRecord } from '../../types/yaml-workflow';
3
3
  /**
4
4
  * Validate a cron expression and enforce a minimum interval.
@@ -52,6 +52,22 @@ declare class LTCronRegistry {
52
52
  * Restart a YAML workflow cron after config change.
53
53
  */
54
54
  restartYamlCron(wf: LTYamlWorkflowRecord): Promise<void>;
55
+ /**
56
+ * Start a single agent schedule cron.
57
+ */
58
+ startAgentCron(agent: LTAgent, schedule: AgentSchedule, idx: number): Promise<void>;
59
+ /**
60
+ * Stop all cron schedules for an agent.
61
+ */
62
+ stopAgentCrons(agentId: string): Promise<void>;
63
+ /**
64
+ * Restart all cron schedules for an agent (after config change or pause/resume).
65
+ */
66
+ restartAgentCrons(agent: LTAgent): Promise<void>;
67
+ /**
68
+ * Arm all cron schedules for active agents. Called at startup.
69
+ */
70
+ connectAgentCrons(): Promise<void>;
55
71
  /**
56
72
  * Stop all active crons. Call during graceful shutdown.
57
73
  */