@hotmeshio/long-tail 0.1.21 → 0.2.1

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,15 @@
1
+ import type { LTApiResult } from '../types/sdk';
2
+ export declare function listSubscriptions(input: {
3
+ agentId: string;
4
+ }): Promise<LTApiResult>;
5
+ export declare function createSubscription(input: {
6
+ agentId: string;
7
+ [key: string]: any;
8
+ }): Promise<LTApiResult>;
9
+ export declare function updateSubscription(input: {
10
+ id: string;
11
+ [key: string]: any;
12
+ }): Promise<LTApiResult>;
13
+ export declare function deleteSubscription(input: {
14
+ id: string;
15
+ }): Promise<LTApiResult>;
@@ -0,0 +1,82 @@
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.listSubscriptions = listSubscriptions;
37
+ exports.createSubscription = createSubscription;
38
+ exports.updateSubscription = updateSubscription;
39
+ exports.deleteSubscription = deleteSubscription;
40
+ const subService = __importStar(require("../services/agent/subscriptions"));
41
+ async function listSubscriptions(input) {
42
+ try {
43
+ const subs = await subService.listSubscriptions(input.agentId);
44
+ return { status: 200, data: { subscriptions: subs } };
45
+ }
46
+ catch (err) {
47
+ return { status: 500, error: err.message };
48
+ }
49
+ }
50
+ async function createSubscription(input) {
51
+ try {
52
+ const { agentId, ...data } = input;
53
+ const sub = await subService.createSubscription(agentId, data);
54
+ return { status: 201, data: sub };
55
+ }
56
+ catch (err) {
57
+ return { status: 500, error: err.message };
58
+ }
59
+ }
60
+ async function updateSubscription(input) {
61
+ try {
62
+ const { id, ...data } = input;
63
+ const sub = await subService.updateSubscription(id, data);
64
+ if (!sub)
65
+ return { status: 404, error: 'Subscription not found' };
66
+ return { status: 200, data: sub };
67
+ }
68
+ catch (err) {
69
+ return { status: 500, error: err.message };
70
+ }
71
+ }
72
+ async function deleteSubscription(input) {
73
+ try {
74
+ const deleted = await subService.deleteSubscription(input.id);
75
+ if (!deleted)
76
+ return { status: 404, error: 'Subscription not found' };
77
+ return { status: 200, data: { deleted: true } };
78
+ }
79
+ catch (err) {
80
+ return { status: 500, error: err.message };
81
+ }
82
+ }
@@ -0,0 +1,21 @@
1
+ import type { LTApiResult, LTApiAuth } from '../types/sdk';
2
+ export declare function listAgents(input: {
3
+ status?: string;
4
+ knowledge_domain?: string;
5
+ limit?: number;
6
+ offset?: number;
7
+ }): Promise<LTApiResult>;
8
+ export declare function getAgent(input: {
9
+ id: string;
10
+ }): Promise<LTApiResult>;
11
+ export declare function createAgent(input: {
12
+ name: string;
13
+ [key: string]: any;
14
+ }, _auth?: LTApiAuth): Promise<LTApiResult>;
15
+ export declare function updateAgent(input: {
16
+ id: string;
17
+ [key: string]: any;
18
+ }): Promise<LTApiResult>;
19
+ export declare function deleteAgent(input: {
20
+ id: string;
21
+ }): Promise<LTApiResult>;
@@ -0,0 +1,100 @@
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.listAgents = listAgents;
37
+ exports.getAgent = getAgent;
38
+ exports.createAgent = createAgent;
39
+ exports.updateAgent = updateAgent;
40
+ exports.deleteAgent = deleteAgent;
41
+ const agentService = __importStar(require("../services/agent"));
42
+ async function listAgents(input) {
43
+ try {
44
+ const result = await agentService.listAgents(input);
45
+ return { status: 200, data: result };
46
+ }
47
+ catch (err) {
48
+ return { status: 500, error: err.message };
49
+ }
50
+ }
51
+ async function getAgent(input) {
52
+ try {
53
+ const agent = await agentService.getAgent(input.id);
54
+ if (!agent) {
55
+ return { status: 404, error: 'Agent not found' };
56
+ }
57
+ const stats = await agentService.getAgentStats(agent);
58
+ return { status: 200, data: { ...agent, stats } };
59
+ }
60
+ catch (err) {
61
+ return { status: 500, error: err.message };
62
+ }
63
+ }
64
+ async function createAgent(input, _auth) {
65
+ try {
66
+ const agent = await agentService.createAgent(input);
67
+ return { status: 201, data: agent };
68
+ }
69
+ catch (err) {
70
+ if (err.code === '23505') {
71
+ return { status: 409, error: `Agent "${input.name}" already exists` };
72
+ }
73
+ return { status: 500, error: err.message };
74
+ }
75
+ }
76
+ async function updateAgent(input) {
77
+ try {
78
+ const { id, ...data } = input;
79
+ const agent = await agentService.updateAgent(id, data);
80
+ if (!agent) {
81
+ return { status: 404, error: 'Agent not found' };
82
+ }
83
+ return { status: 200, data: agent };
84
+ }
85
+ catch (err) {
86
+ return { status: 500, error: err.message };
87
+ }
88
+ }
89
+ async function deleteAgent(input) {
90
+ try {
91
+ const deleted = await agentService.deleteAgent(input.id);
92
+ if (!deleted) {
93
+ return { status: 404, error: 'Agent not found' };
94
+ }
95
+ return { status: 200, data: { deleted: true } };
96
+ }
97
+ catch (err) {
98
+ return { status: 500, error: err.message };
99
+ }
100
+ }
@@ -0,0 +1,2 @@
1
+ import type { LTApiResult } from '../types/sdk';
2
+ export declare function listCapabilities(): Promise<LTApiResult>;
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.listCapabilities = listCapabilities;
4
+ const db_1 = require("../lib/db");
5
+ const LIST_SERVERS_WITH_TOOLS = `
6
+ SELECT id, name, description, tags, tool_manifest, compile_hints, category
7
+ FROM lt_mcp_servers
8
+ WHERE status IN ('registered', 'connected')
9
+ AND tool_manifest IS NOT NULL
10
+ ORDER BY name
11
+ `;
12
+ /**
13
+ * Fallback tag-to-category mapping for servers that don't have an explicit category.
14
+ */
15
+ const TAG_FALLBACK = {
16
+ 'escalation': 'Automation',
17
+ 'browser-automation': 'Automation',
18
+ 'translation': 'Analysis',
19
+ 'vision': 'Analysis',
20
+ 'gmail': 'Communication',
21
+ 'email': 'Communication',
22
+ 'messaging': 'Communication',
23
+ 'storage': 'Data',
24
+ 'knowledge': 'Data',
25
+ 'http': 'Data',
26
+ 'api': 'Data',
27
+ 'authentication': 'System',
28
+ 'admin': 'System',
29
+ 'documentation': 'Reference',
30
+ 'development': 'Development',
31
+ };
32
+ const CATEGORY_ORDER = ['Communication', 'Analysis', 'Media', 'Data', 'Automation', 'Development', 'System', 'Reference', 'Other'];
33
+ function resolveCategory(server) {
34
+ if (server.category)
35
+ return server.category;
36
+ for (const tag of server.tags ?? []) {
37
+ const cat = TAG_FALLBACK[tag];
38
+ if (cat)
39
+ return cat;
40
+ }
41
+ return 'Other';
42
+ }
43
+ async function listCapabilities() {
44
+ try {
45
+ const pool = (0, db_1.getPool)();
46
+ const { rows } = await pool.query(LIST_SERVERS_WITH_TOOLS);
47
+ const categoryMap = new Map();
48
+ for (const server of rows) {
49
+ const category = resolveCategory(server);
50
+ const tools = (server.tool_manifest || []);
51
+ if (!categoryMap.has(category)) {
52
+ categoryMap.set(category, []);
53
+ }
54
+ for (const tool of tools) {
55
+ categoryMap.get(category).push({
56
+ name: tool.name,
57
+ description: tool.description || '',
58
+ inputSchema: tool.inputSchema || {},
59
+ serverName: server.name,
60
+ serverId: server.id,
61
+ });
62
+ }
63
+ }
64
+ const categories = CATEGORY_ORDER
65
+ .filter((name) => categoryMap.has(name))
66
+ .map((name) => ({
67
+ name,
68
+ tools: categoryMap.get(name).sort((a, b) => a.name.localeCompare(b.name)),
69
+ }));
70
+ const totalTools = categories.reduce((sum, c) => sum + c.tools.length, 0);
71
+ return { status: 200, data: { categories, totalTools } };
72
+ }
73
+ catch (err) {
74
+ return { status: 500, error: err.message };
75
+ }
76
+ }
package/build/index.d.ts CHANGED
@@ -15,7 +15,7 @@ export { eventRegistry } from './lib/events';
15
15
  export { NatsEventAdapter } from './lib/events/nats';
16
16
  export { InMemoryEventAdapter } from './lib/events/memory';
17
17
  export { SocketIOEventAdapter, type SocketIOAuthenticator } from './lib/events/socketio';
18
- export { publishMilestoneEvent, publishTaskEvent, publishEscalationEvent, publishWorkflowEvent } from './lib/events/publish';
18
+ export { publishMilestoneEvent, publishTaskEvent, publishEscalationEvent, publishWorkflowEvent, publishAgentEvent, publishKnowledgeEvent } from './lib/events/publish';
19
19
  export { telemetryRegistry } from './lib/telemetry';
20
20
  export { HoneycombTelemetryAdapter } from './lib/telemetry/honeycomb';
21
21
  export { loggerRegistry } from './lib/logger';
@@ -35,7 +35,7 @@ export { McpEscalationStrategy } from './services/escalation-strategy/mcp';
35
35
  export { getActivityIdentity } from './services/iam/activity';
36
36
  export { getToolContext } from './services/iam/context';
37
37
  export { registerMcpTool } from './services/mcp/register-tool';
38
- export { getSystemWorkers, builtinMcpServerFactories } from './system';
38
+ export { getSystemWorkers, getSystemAgents, builtinMcpServerFactories } from './system';
39
39
  export { CallbackEventAdapter } from './lib/events/callback';
40
40
  export { createClient } from './sdk';
41
41
  export { getFreshAccessToken, listOAuthConnections } from './services/oauth';
package/build/index.js CHANGED
@@ -36,8 +36,8 @@ var __importStar = (this && this.__importStar) || (function () {
36
36
  };
37
37
  })();
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.getStorageBackend = exports.listOAuthConnections = exports.getFreshAccessToken = exports.createClient = exports.CallbackEventAdapter = exports.builtinMcpServerFactories = exports.getSystemWorkers = exports.registerMcpTool = exports.getToolContext = exports.getActivityIdentity = exports.McpEscalationStrategy = exports.DefaultEscalationStrategy = exports.escalationStrategyRegistry = exports.McpVisionServer = exports.McpTranslationServer = exports.McpServer = exports.McpClient = exports.McpService = exports.BuiltInMcpAdapter = exports.mcpRegistry = exports.defaultMaintenanceConfig = exports.maintenanceRegistry = exports.PinoLoggerAdapter = exports.loggerRegistry = exports.HoneycombTelemetryAdapter = exports.telemetryRegistry = exports.publishWorkflowEvent = exports.publishEscalationEvent = exports.publishTaskEvent = exports.publishMilestoneEvent = exports.SocketIOEventAdapter = exports.InMemoryEventAdapter = exports.NatsEventAdapter = exports.eventRegistry = exports.ltConfig = exports.UserService = exports.ConfigService = exports.EscalationService = exports.TaskService = exports.signToken = exports.requireAdmin = exports.requireAuth = exports.createAuthMiddleware = exports.JwtAuthAdapter = exports.conditionLT = exports.executeLT = exports.createLTActivityInterceptor = exports.createLTInterceptor = exports.registerLT = exports.start = void 0;
40
- exports.api = exports.KnowledgeApi = exports.resolveCredential = exports.mimeFromPath = void 0;
39
+ exports.createClient = exports.CallbackEventAdapter = exports.builtinMcpServerFactories = exports.getSystemAgents = exports.getSystemWorkers = exports.registerMcpTool = exports.getToolContext = exports.getActivityIdentity = exports.McpEscalationStrategy = exports.DefaultEscalationStrategy = exports.escalationStrategyRegistry = exports.McpVisionServer = exports.McpTranslationServer = exports.McpServer = exports.McpClient = exports.McpService = exports.BuiltInMcpAdapter = exports.mcpRegistry = exports.defaultMaintenanceConfig = exports.maintenanceRegistry = exports.PinoLoggerAdapter = exports.loggerRegistry = exports.HoneycombTelemetryAdapter = exports.telemetryRegistry = exports.publishKnowledgeEvent = exports.publishAgentEvent = exports.publishWorkflowEvent = exports.publishEscalationEvent = exports.publishTaskEvent = exports.publishMilestoneEvent = exports.SocketIOEventAdapter = exports.InMemoryEventAdapter = exports.NatsEventAdapter = exports.eventRegistry = exports.ltConfig = exports.UserService = exports.ConfigService = exports.EscalationService = exports.TaskService = exports.signToken = exports.requireAdmin = exports.requireAuth = exports.createAuthMiddleware = exports.JwtAuthAdapter = exports.conditionLT = exports.executeLT = exports.createLTActivityInterceptor = exports.createLTInterceptor = exports.registerLT = exports.start = void 0;
40
+ exports.api = exports.KnowledgeApi = exports.resolveCredential = exports.mimeFromPath = exports.getStorageBackend = exports.listOAuthConnections = exports.getFreshAccessToken = void 0;
41
41
  const config_1 = require("./modules/config");
42
42
  const logger_1 = require("./lib/logger");
43
43
  const start_1 = require("./start");
@@ -79,6 +79,8 @@ Object.defineProperty(exports, "publishMilestoneEvent", { enumerable: true, get:
79
79
  Object.defineProperty(exports, "publishTaskEvent", { enumerable: true, get: function () { return publish_1.publishTaskEvent; } });
80
80
  Object.defineProperty(exports, "publishEscalationEvent", { enumerable: true, get: function () { return publish_1.publishEscalationEvent; } });
81
81
  Object.defineProperty(exports, "publishWorkflowEvent", { enumerable: true, get: function () { return publish_1.publishWorkflowEvent; } });
82
+ Object.defineProperty(exports, "publishAgentEvent", { enumerable: true, get: function () { return publish_1.publishAgentEvent; } });
83
+ Object.defineProperty(exports, "publishKnowledgeEvent", { enumerable: true, get: function () { return publish_1.publishKnowledgeEvent; } });
82
84
  var telemetry_1 = require("./lib/telemetry");
83
85
  Object.defineProperty(exports, "telemetryRegistry", { enumerable: true, get: function () { return telemetry_1.telemetryRegistry; } });
84
86
  var honeycomb_1 = require("./lib/telemetry/honeycomb");
@@ -114,6 +116,7 @@ var register_tool_1 = require("./services/mcp/register-tool");
114
116
  Object.defineProperty(exports, "registerMcpTool", { enumerable: true, get: function () { return register_tool_1.registerMcpTool; } });
115
117
  var system_1 = require("./system");
116
118
  Object.defineProperty(exports, "getSystemWorkers", { enumerable: true, get: function () { return system_1.getSystemWorkers; } });
119
+ Object.defineProperty(exports, "getSystemAgents", { enumerable: true, get: function () { return system_1.getSystemAgents; } });
117
120
  Object.defineProperty(exports, "builtinMcpServerFactories", { enumerable: true, get: function () { return system_1.builtinMcpServerFactories; } });
118
121
  var callback_1 = require("./lib/events/callback");
119
122
  Object.defineProperty(exports, "CallbackEventAdapter", { enumerable: true, get: function () { return callback_1.CallbackEventAdapter; } });
@@ -0,0 +1,46 @@
1
+ -- Long Tail: Agent data model
2
+ -- Agents are autonomous personas that compose identity, memory, capabilities,
3
+ -- behaviors, and goals atop existing primitives.
4
+
5
+ CREATE TABLE IF NOT EXISTS lt_agents (
6
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
7
+ name TEXT UNIQUE NOT NULL,
8
+ description TEXT,
9
+ status TEXT NOT NULL DEFAULT 'inactive'
10
+ CHECK (status IN ('inactive', 'active', 'paused', 'error')),
11
+
12
+ -- Identity: links to a service account (bot user)
13
+ user_id UUID REFERENCES lt_users(id) ON DELETE SET NULL,
14
+
15
+ -- Memory: knowledge domain this agent owns
16
+ knowledge_domain TEXT,
17
+
18
+ -- Capabilities: which MCP servers/tools it can use
19
+ capabilities JSONB NOT NULL DEFAULT '[]'::JSONB,
20
+
21
+ -- Behaviors: triggers, schedules, escalation patterns
22
+ behaviors JSONB NOT NULL DEFAULT '{}'::JSONB,
23
+
24
+ -- Goals and guardrails (natural language)
25
+ goals TEXT,
26
+ rules TEXT,
27
+
28
+ -- Workflow bindings (soft references)
29
+ workflow_type TEXT,
30
+ pipeline_id UUID,
31
+
32
+ -- Metadata
33
+ metadata JSONB NOT NULL DEFAULT '{}'::JSONB,
34
+ last_run_at TIMESTAMPTZ,
35
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
36
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
37
+ );
38
+
39
+ CREATE INDEX IF NOT EXISTS idx_lt_agents_status ON lt_agents (status);
40
+ CREATE INDEX IF NOT EXISTS idx_lt_agents_user_id ON lt_agents (user_id);
41
+ CREATE INDEX IF NOT EXISTS idx_lt_agents_knowledge_domain ON lt_agents (knowledge_domain);
42
+ CREATE INDEX IF NOT EXISTS idx_lt_agents_capabilities ON lt_agents USING GIN (capabilities);
43
+
44
+ CREATE OR REPLACE TRIGGER trg_lt_agents_updated_at
45
+ BEFORE UPDATE ON lt_agents
46
+ FOR EACH ROW EXECUTE FUNCTION lt_set_updated_at();
@@ -0,0 +1,38 @@
1
+ -- Agent event subscriptions — reactive wiring from events to workflows.
2
+ -- Each row maps a topic pattern to a workflow reaction for a specific agent.
3
+
4
+ CREATE TABLE IF NOT EXISTS lt_agent_subscriptions (
5
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
6
+ agent_id UUID NOT NULL REFERENCES lt_agents(id) ON DELETE CASCADE,
7
+
8
+ -- What to listen for
9
+ topic TEXT NOT NULL,
10
+ filter JSONB,
11
+
12
+ -- How to react
13
+ reaction_type TEXT NOT NULL CHECK (reaction_type IN ('durable', 'pipeline', 'mcp_query')),
14
+ workflow_type TEXT,
15
+ pipeline_id UUID,
16
+ mcp_prompt TEXT,
17
+
18
+ -- Input mapping: transform event payload → workflow envelope
19
+ input_mapping JSONB NOT NULL DEFAULT '{}'::JSONB,
20
+
21
+ -- Identity for the reaction execution
22
+ execute_as TEXT,
23
+
24
+ enabled BOOLEAN NOT NULL DEFAULT true,
25
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
26
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
27
+ );
28
+
29
+ CREATE INDEX IF NOT EXISTS idx_lt_agent_subs_agent ON lt_agent_subscriptions (agent_id);
30
+ CREATE INDEX IF NOT EXISTS idx_lt_agent_subs_topic ON lt_agent_subscriptions (topic);
31
+ CREATE INDEX IF NOT EXISTS idx_lt_agent_subs_enabled ON lt_agent_subscriptions (enabled) WHERE enabled = true;
32
+
33
+ CREATE OR REPLACE TRIGGER trg_lt_agent_subs_updated_at
34
+ BEFORE UPDATE ON lt_agent_subscriptions
35
+ FOR EACH ROW EXECUTE FUNCTION lt_set_updated_at();
36
+
37
+ -- Add GIN index on agent behaviors for efficient trigger queries
38
+ CREATE INDEX IF NOT EXISTS idx_lt_agents_behaviors ON lt_agents USING GIN (behaviors);
@@ -0,0 +1,6 @@
1
+ -- Add category column to MCP servers for capability grouping.
2
+ -- Replaces the tag-derived category mapping with an explicit, configurable value.
3
+
4
+ ALTER TABLE lt_mcp_servers ADD COLUMN IF NOT EXISTS category TEXT;
5
+
6
+ CREATE INDEX IF NOT EXISTS idx_lt_mcp_servers_category ON lt_mcp_servers (category) WHERE category IS NOT NULL;
@@ -0,0 +1,9 @@
1
+ -- Add unique constraint on (agent_id, topic) for idempotent subscription seeding.
2
+ -- Two containers inserting the same subscription simultaneously: one wins, other is a no-op.
3
+
4
+ DO $$ BEGIN
5
+ ALTER TABLE lt_agent_subscriptions
6
+ ADD CONSTRAINT uq_agent_sub_topic UNIQUE (agent_id, topic);
7
+ EXCEPTION
8
+ WHEN duplicate_object THEN NULL;
9
+ END $$;
@@ -7,25 +7,11 @@ type EventCallback = (event: LTEvent) => void;
7
7
  * SDK callers subscribe with `.on()` and receive events as direct
8
8
  * function calls — no network transport, no serialization overhead.
9
9
  *
10
- * Supports:
11
- * - Exact type matching: `on('task.created', cb)`
12
- * - Category wildcards: `on('task.*', cb)` — matches all task.* events
10
+ * Supports NATS-style pattern matching:
11
+ * - Exact: `on('task.created', cb)`
12
+ * - Single-token wildcard: `on('task.*', cb)` — matches task.created, task.failed, etc.
13
+ * - Multi-token wildcard: `on('app.epic.>', cb)` — matches app.epic.apis.createorder.error
13
14
  * - Global wildcard: `on('*', cb)` — matches every event
14
- *
15
- * Usage:
16
- * ```typescript
17
- * import { CallbackEventAdapter } from '@hotmeshio/long-tail';
18
- * import { eventRegistry } from '@hotmeshio/long-tail';
19
- *
20
- * const adapter = new CallbackEventAdapter();
21
- * eventRegistry.register(adapter);
22
- *
23
- * const unsub = adapter.on('escalation.claimed', (event) => {
24
- * console.log('claimed:', event.escalationId);
25
- * });
26
- *
27
- * // Later: unsub() to remove the listener
28
- * ```
29
15
  */
30
16
  export declare class CallbackEventAdapter implements LTEventAdapter {
31
17
  private listeners;
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.CallbackEventAdapter = void 0;
4
4
  const logger_1 = require("../logger");
5
+ const matching_1 = require("./matching");
5
6
  /**
6
7
  * In-process event adapter that delivers events via registered callbacks.
7
8
  *
@@ -9,25 +10,11 @@ const logger_1 = require("../logger");
9
10
  * SDK callers subscribe with `.on()` and receive events as direct
10
11
  * function calls — no network transport, no serialization overhead.
11
12
  *
12
- * Supports:
13
- * - Exact type matching: `on('task.created', cb)`
14
- * - Category wildcards: `on('task.*', cb)` — matches all task.* events
13
+ * Supports NATS-style pattern matching:
14
+ * - Exact: `on('task.created', cb)`
15
+ * - Single-token wildcard: `on('task.*', cb)` — matches task.created, task.failed, etc.
16
+ * - Multi-token wildcard: `on('app.epic.>', cb)` — matches app.epic.apis.createorder.error
15
17
  * - Global wildcard: `on('*', cb)` — matches every event
16
- *
17
- * Usage:
18
- * ```typescript
19
- * import { CallbackEventAdapter } from '@hotmeshio/long-tail';
20
- * import { eventRegistry } from '@hotmeshio/long-tail';
21
- *
22
- * const adapter = new CallbackEventAdapter();
23
- * eventRegistry.register(adapter);
24
- *
25
- * const unsub = adapter.on('escalation.claimed', (event) => {
26
- * console.log('claimed:', event.escalationId);
27
- * });
28
- *
29
- * // Later: unsub() to remove the listener
30
- * ```
31
18
  */
32
19
  class CallbackEventAdapter {
33
20
  constructor() {
@@ -55,23 +42,9 @@ class CallbackEventAdapter {
55
42
  logger_1.loggerRegistry.info('[lt-events:callback] adapter connected');
56
43
  }
57
44
  async publish(event) {
58
- // Exact match listeners
59
- const exact = this.listeners.get(event.type);
60
- if (exact) {
61
- for (const cb of exact) {
62
- try {
63
- cb(event);
64
- }
65
- catch { /* fire-and-forget */ }
66
- }
67
- }
68
- // Category wildcard listeners (e.g. 'task.*' matches 'task.created')
69
- const dotIdx = event.type.indexOf('.');
70
- if (dotIdx > 0) {
71
- const category = event.type.slice(0, dotIdx) + '.*';
72
- const catListeners = this.listeners.get(category);
73
- if (catListeners) {
74
- for (const cb of catListeners) {
45
+ for (const [pattern, callbacks] of this.listeners) {
46
+ if ((0, matching_1.subjectMatchesPattern)(event.type, pattern)) {
47
+ for (const cb of callbacks) {
75
48
  try {
76
49
  cb(event);
77
50
  }
@@ -79,16 +52,6 @@ class CallbackEventAdapter {
79
52
  }
80
53
  }
81
54
  }
82
- // Global wildcard listeners
83
- const global = this.listeners.get('*');
84
- if (global) {
85
- for (const cb of global) {
86
- try {
87
- cb(event);
88
- }
89
- catch { /* fire-and-forget */ }
90
- }
91
- }
92
55
  }
93
56
  async disconnect() {
94
57
  this.listeners.clear();
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Match a dot-delimited subject against a pattern with NATS-style wildcards.
3
+ *
4
+ * - `*` matches exactly one token
5
+ * - `>` matches one or more remaining tokens (must be last segment)
6
+ *
7
+ * Examples:
8
+ * - `task.created` matches `task.*`
9
+ * - `app.epic.apis.createorder.error` matches `app.epic.apis.*.error`
10
+ * - `app.epic.apis.createorder.error` matches `app.epic.>`
11
+ * - `app.epic.apis.createorder.error` does NOT match `app.vendor.>`
12
+ */
13
+ export declare function subjectMatchesPattern(subject: string, pattern: string): boolean;
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.subjectMatchesPattern = subjectMatchesPattern;
4
+ /**
5
+ * Match a dot-delimited subject against a pattern with NATS-style wildcards.
6
+ *
7
+ * - `*` matches exactly one token
8
+ * - `>` matches one or more remaining tokens (must be last segment)
9
+ *
10
+ * Examples:
11
+ * - `task.created` matches `task.*`
12
+ * - `app.epic.apis.createorder.error` matches `app.epic.apis.*.error`
13
+ * - `app.epic.apis.createorder.error` matches `app.epic.>`
14
+ * - `app.epic.apis.createorder.error` does NOT match `app.vendor.>`
15
+ */
16
+ function subjectMatchesPattern(subject, pattern) {
17
+ if (pattern === '*')
18
+ return true;
19
+ const subjectTokens = subject.split('.');
20
+ const patternTokens = pattern.split('.');
21
+ for (let i = 0; i < patternTokens.length; i++) {
22
+ const pt = patternTokens[i];
23
+ if (pt === '>')
24
+ return true;
25
+ if (i >= subjectTokens.length)
26
+ return false;
27
+ if (pt !== '*' && pt !== subjectTokens[i])
28
+ return false;
29
+ }
30
+ return subjectTokens.length === patternTokens.length;
31
+ }
@@ -56,6 +56,26 @@ export declare function publishActivityEvent(params: {
56
56
  activityName: string;
57
57
  data?: Record<string, any>;
58
58
  }): Promise<void>;
59
+ /**
60
+ * Publish a knowledge lifecycle event (stored, deleted).
61
+ * Lightweight — no workflow context required since knowledge writes
62
+ * happen both inside and outside workflows.
63
+ */
64
+ export declare function publishKnowledgeEvent(params: {
65
+ type: 'knowledge.stored' | 'knowledge.deleted';
66
+ domain: string;
67
+ key: string;
68
+ }): Promise<void>;
69
+ /**
70
+ * Publish an agent lifecycle event.
71
+ */
72
+ export declare function publishAgentEvent(params: {
73
+ type: 'agent.started' | 'agent.completed' | 'agent.failed' | 'agent.status_changed';
74
+ agentId: string;
75
+ agentName: string;
76
+ status?: string;
77
+ data?: Record<string, any>;
78
+ }): Promise<void>;
59
79
  /**
60
80
  * Publish a workflow lifecycle event (started, completed, failed).
61
81
  */