@hotmeshio/long-tail 0.4.3 → 0.4.5

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 (346) hide show
  1. package/build/api/agent-subscriptions.js +14 -0
  2. package/build/api/settings.js +4 -0
  3. package/build/lib/db/index.d.ts +1 -7
  4. package/build/lib/db/schemas/008_capability_reaction.sql +12 -0
  5. package/build/lib/db/schemas/009_file_topic_category.sql +10 -0
  6. package/build/lib/events/index.d.ts +9 -0
  7. package/build/lib/events/index.js +18 -0
  8. package/build/lib/events/nats.d.ts +15 -1
  9. package/build/lib/events/nats.js +46 -2
  10. package/build/lib/events/publish.d.ts +10 -0
  11. package/build/lib/events/publish.js +28 -0
  12. package/build/modules/config.d.ts +1 -7
  13. package/build/services/agent/index.js +14 -0
  14. package/build/services/agent/subscription-sql.d.ts +3 -3
  15. package/build/services/agent/subscription-sql.js +7 -5
  16. package/build/services/agent/subscriptions.d.ts +3 -1
  17. package/build/services/agent/subscriptions.js +6 -0
  18. package/build/services/agent/trigger-registry.d.ts +2 -0
  19. package/build/services/agent/trigger-registry.js +55 -8
  20. package/build/services/topics/system-topics.js +29 -0
  21. package/build/services/yaml-workflow/deployer.d.ts +1 -1
  22. package/build/services/yaml-workflow/deployer.js +2 -2
  23. package/build/services/yaml-workflow/invoke.d.ts +2 -0
  24. package/build/services/yaml-workflow/invoke.js +5 -1
  25. package/build/start/adapters.js +11 -9
  26. package/build/start/config.js +4 -0
  27. package/build/start/workers.js +15 -3
  28. package/build/system/index.js +16 -0
  29. package/build/system/mcp-servers/file-storage.js +18 -0
  30. package/build/system/workflows/capability-invoke/activities.d.ts +12 -0
  31. package/build/system/workflows/capability-invoke/activities.js +14 -0
  32. package/build/system/workflows/capability-invoke/index.d.ts +14 -0
  33. package/build/system/workflows/capability-invoke/index.js +74 -0
  34. package/build/tsconfig.tsbuildinfo +1 -1
  35. package/build/types/events.d.ts +13 -1
  36. package/build/types/startup.d.ts +7 -0
  37. package/dashboard/dist/assets/AdminDashboard-ntLz5Pro.js +2 -0
  38. package/dashboard/dist/assets/{AdminDashboard-Dr5wTIZT.js.map → AdminDashboard-ntLz5Pro.js.map} +1 -1
  39. package/dashboard/dist/assets/AgentConfigPage-D27vWOI6.js +16 -0
  40. package/dashboard/dist/assets/AgentConfigPage-D27vWOI6.js.map +1 -0
  41. package/dashboard/dist/assets/AgentDetailPage-Cm2KFR4O.js +4 -0
  42. package/dashboard/dist/assets/AgentDetailPage-Cm2KFR4O.js.map +1 -0
  43. package/dashboard/dist/assets/AgentsPage-_ptA-0YO.js +2 -0
  44. package/dashboard/dist/assets/AgentsPage-_ptA-0YO.js.map +1 -0
  45. package/dashboard/dist/assets/AvailableEscalationsPage-bdPqEzbx.js +2 -0
  46. package/dashboard/dist/assets/{AvailableEscalationsPage-UzjXcO3W.js.map → AvailableEscalationsPage-bdPqEzbx.js.map} +1 -1
  47. package/dashboard/dist/assets/BotPicker-CYfFMpkY.js +2 -0
  48. package/dashboard/dist/assets/{BotPicker-CM-_u73k.js.map → BotPicker-CYfFMpkY.js.map} +1 -1
  49. package/dashboard/dist/assets/CapabilitiesPage-M7-ZTFNV.js +2 -0
  50. package/dashboard/dist/assets/CapabilitiesPage-M7-ZTFNV.js.map +1 -0
  51. package/dashboard/dist/assets/CollapsibleSection-DU5KAtQ-.js +2 -0
  52. package/dashboard/dist/assets/{CollapsibleSection-CnPKa7df.js.map → CollapsibleSection-DU5KAtQ-.js.map} +1 -1
  53. package/dashboard/dist/assets/ConfirmDeleteModal-_hW5Vc05.js +2 -0
  54. package/dashboard/dist/assets/{ConfirmDeleteModal-dOxidrSR.js.map → ConfirmDeleteModal-_hW5Vc05.js.map} +1 -1
  55. package/dashboard/dist/assets/CopyableId-DiWqv41D.js +2 -0
  56. package/dashboard/dist/assets/CopyableId-DiWqv41D.js.map +1 -0
  57. package/dashboard/dist/assets/CredentialsPage-CmbwypSF.js +2 -0
  58. package/dashboard/dist/assets/{CredentialsPage-CImIzra4.js.map → CredentialsPage-CmbwypSF.js.map} +1 -1
  59. package/dashboard/dist/assets/CronLabel-nycfAefc.js +2 -0
  60. package/dashboard/dist/assets/CronLabel-nycfAefc.js.map +1 -0
  61. package/dashboard/dist/assets/CustomDurationPicker-gNZRBaHg.js +2 -0
  62. package/dashboard/dist/assets/{CustomDurationPicker-5JzEgS7I.js.map → CustomDurationPicker-gNZRBaHg.js.map} +1 -1
  63. package/dashboard/dist/assets/DataTable-DGerT2ZM.js +2 -0
  64. package/dashboard/dist/assets/{DataTable-D9yuBv0w.js.map → DataTable-DGerT2ZM.js.map} +1 -1
  65. package/dashboard/dist/assets/DropZone-vNcqMd05.js +2 -0
  66. package/dashboard/dist/assets/{DropZone-BEW3jBzf.js.map → DropZone-vNcqMd05.js.map} +1 -1
  67. package/dashboard/dist/assets/ElapsedCell-CdvQbtve.js +2 -0
  68. package/dashboard/dist/assets/{ElapsedCell-B79BF5Mj.js.map → ElapsedCell-CdvQbtve.js.map} +1 -1
  69. package/dashboard/dist/assets/EmptyState-DMldv8c5.js +2 -0
  70. package/dashboard/dist/assets/{EmptyState-BcsfPq9T.js.map → EmptyState-DMldv8c5.js.map} +1 -1
  71. package/dashboard/dist/assets/EscalationsOverview-BNENCL_2.js +2 -0
  72. package/dashboard/dist/assets/{EscalationsOverview-QvWvbpx3.js.map → EscalationsOverview-BNENCL_2.js.map} +1 -1
  73. package/dashboard/dist/assets/EventTable-BqDAyXyc.js +2 -0
  74. package/dashboard/dist/assets/{EventTable-DAclQwfr.js.map → EventTable-BqDAyXyc.js.map} +1 -1
  75. package/dashboard/dist/assets/EventTopicPill-CnHFBglc.js +2 -0
  76. package/dashboard/dist/assets/{EventTopicPill-By-6sXDp.js.map → EventTopicPill-CnHFBglc.js.map} +1 -1
  77. package/dashboard/dist/assets/FilterBar-TYiTtUgv.js +2 -0
  78. package/dashboard/dist/assets/{FilterBar-Ck4K4rzu.js.map → FilterBar-TYiTtUgv.js.map} +1 -1
  79. package/dashboard/dist/assets/HomePage-fterfLKH.js +2 -0
  80. package/dashboard/dist/assets/{HomePage-DVOi7rR1.js.map → HomePage-fterfLKH.js.map} +1 -1
  81. package/dashboard/dist/assets/ListToolbar-BO5Igi6v.js +2 -0
  82. package/dashboard/dist/assets/{ListToolbar-Bntl2hex.js.map → ListToolbar-BO5Igi6v.js.map} +1 -1
  83. package/dashboard/dist/assets/McpOverview-BQokGg0z.js +2 -0
  84. package/dashboard/dist/assets/{McpOverview-B-xSYPJj.js.map → McpOverview-BQokGg0z.js.map} +1 -1
  85. package/dashboard/dist/assets/McpQueryDetailPage-0WOp2n_j.js +5 -0
  86. package/dashboard/dist/assets/{McpQueryDetailPage-Cq71BzjB.js.map → McpQueryDetailPage-0WOp2n_j.js.map} +1 -1
  87. package/dashboard/dist/assets/McpQueryPage-DUey_h9J.js +2 -0
  88. package/dashboard/dist/assets/{McpQueryPage-Dfz87aZF.js.map → McpQueryPage-DUey_h9J.js.map} +1 -1
  89. package/dashboard/dist/assets/McpRunDetailPage-Cv4qyr91.js +2 -0
  90. package/dashboard/dist/assets/McpRunDetailPage-Cv4qyr91.js.map +1 -0
  91. package/dashboard/dist/assets/McpRunsPage-B3R6KZ61.js +2 -0
  92. package/dashboard/dist/assets/{McpRunsPage-MUYvUYqz.js.map → McpRunsPage-B3R6KZ61.js.map} +1 -1
  93. package/dashboard/dist/assets/Modal-Qe8lW7gQ.js +2 -0
  94. package/dashboard/dist/assets/{Modal-DEODGeqx.js.map → Modal-Qe8lW7gQ.js.map} +1 -1
  95. package/dashboard/dist/assets/OperatorDashboard-dldvzjcg.js +2 -0
  96. package/dashboard/dist/assets/{OperatorDashboard-Rih1SZrn.js.map → OperatorDashboard-dldvzjcg.js.map} +1 -1
  97. package/dashboard/dist/assets/PageHeader-DF4BeEm4.js +2 -0
  98. package/dashboard/dist/assets/{PageHeader-Bo0SpcCK.js.map → PageHeader-DF4BeEm4.js.map} +1 -1
  99. package/dashboard/dist/assets/PageHeaderWithStats-BQZw6BgA.js +2 -0
  100. package/dashboard/dist/assets/{PageHeaderWithStats-7K5BdhOj.js.map → PageHeaderWithStats-BQZw6BgA.js.map} +1 -1
  101. package/dashboard/dist/assets/PriorityBadge-DMyB3WLZ.js +2 -0
  102. package/dashboard/dist/assets/{PriorityBadge-DfQY9St9.js.map → PriorityBadge-DMyB3WLZ.js.map} +1 -1
  103. package/dashboard/dist/assets/ProcessDetailPage-Beo-QVL-.js +2 -0
  104. package/dashboard/dist/assets/{ProcessDetailPage-BMkWCjqD.js.map → ProcessDetailPage-Beo-QVL-.js.map} +1 -1
  105. package/dashboard/dist/assets/ProcessesListPage-C_ars8gp.js +2 -0
  106. package/dashboard/dist/assets/{ProcessesListPage-vZjUSc7S.js.map → ProcessesListPage-C_ars8gp.js.map} +1 -1
  107. package/dashboard/dist/assets/RolePill-DrBZ7JJj.js +2 -0
  108. package/dashboard/dist/assets/{RolePill-BDzPFQUv.js.map → RolePill-DrBZ7JJj.js.map} +1 -1
  109. package/dashboard/dist/assets/RolesPage-DgSXFFGL.js +2 -0
  110. package/dashboard/dist/assets/{RolesPage-kjeAsj3_.js.map → RolesPage-DgSXFFGL.js.map} +1 -1
  111. package/dashboard/dist/assets/RowActions-QcakGbVA.js +2 -0
  112. package/dashboard/dist/assets/{RowActions-Dg-Fsm5O.js.map → RowActions-QcakGbVA.js.map} +1 -1
  113. package/dashboard/dist/assets/RunAsSelector-CYMeZwrM.js +2 -0
  114. package/dashboard/dist/assets/{RunAsSelector-DC4SLtTq.js.map → RunAsSelector-CYMeZwrM.js.map} +1 -1
  115. package/dashboard/dist/assets/ServerName-D5NKD06M.js +2 -0
  116. package/dashboard/dist/assets/{ServerName-CEOFF7UG.js.map → ServerName-D5NKD06M.js.map} +1 -1
  117. package/dashboard/dist/assets/StatCard-PZQmmCHK.js +2 -0
  118. package/dashboard/dist/assets/{StatCard-DlgF0CJC.js.map → StatCard-PZQmmCHK.js.map} +1 -1
  119. package/dashboard/dist/assets/StatusBadge-ME2R6a7K.js +2 -0
  120. package/dashboard/dist/assets/{StatusBadge-XQlNFwmH.js.map → StatusBadge-ME2R6a7K.js.map} +1 -1
  121. package/dashboard/dist/assets/StepIndicator-CDDVahOz.js +2 -0
  122. package/dashboard/dist/assets/{StepIndicator-CuUIGxKk.js.map → StepIndicator-CDDVahOz.js.map} +1 -1
  123. package/dashboard/dist/assets/StickyPagination-Ddy93Q5I.js +2 -0
  124. package/dashboard/dist/assets/{StickyPagination-F9FZsRy9.js.map → StickyPagination-Ddy93Q5I.js.map} +1 -1
  125. package/dashboard/dist/assets/SwimlaneTimeline-CYYA8nd9.js +2 -0
  126. package/dashboard/dist/assets/SwimlaneTimeline-CYYA8nd9.js.map +1 -0
  127. package/dashboard/dist/assets/TagInput-B45Dm3IW.js +2 -0
  128. package/dashboard/dist/assets/{TagInput-VBY0xIwb.js.map → TagInput-B45Dm3IW.js.map} +1 -1
  129. package/dashboard/dist/assets/TaskDetailPage-CoZFkJ6d.js +2 -0
  130. package/dashboard/dist/assets/TaskDetailPage-CoZFkJ6d.js.map +1 -0
  131. package/dashboard/dist/assets/TaskQueuePill-BJRUjVDv.js +2 -0
  132. package/dashboard/dist/assets/{TaskQueuePill-DZykFijh.js.map → TaskQueuePill-BJRUjVDv.js.map} +1 -1
  133. package/dashboard/dist/assets/TasksListPage-Czu08px3.js +2 -0
  134. package/dashboard/dist/assets/{TasksListPage-69ZWCaCP.js.map → TasksListPage-Czu08px3.js.map} +1 -1
  135. package/dashboard/dist/assets/TimeAgo-CJ56IUy6.js +2 -0
  136. package/dashboard/dist/assets/{TimeAgo-CttiZG0k.js.map → TimeAgo-CJ56IUy6.js.map} +1 -1
  137. package/dashboard/dist/assets/TimestampCell-QtcYZ9Jx.js +2 -0
  138. package/dashboard/dist/assets/{TimestampCell-CYFbEhqc.js.map → TimestampCell-QtcYZ9Jx.js.map} +1 -1
  139. package/dashboard/dist/assets/ToolPill-DpDv3FwI.js +2 -0
  140. package/dashboard/dist/assets/{ToolPill-RP2Tvlrx.js.map → ToolPill-DpDv3FwI.js.map} +1 -1
  141. package/dashboard/dist/assets/ToolTestPanel-BzFOwzd_.js +2 -0
  142. package/dashboard/dist/assets/ToolTestPanel-BzFOwzd_.js.map +1 -0
  143. package/dashboard/dist/assets/TopicDetailPage-DwShZbh9.js +9 -0
  144. package/dashboard/dist/assets/{TopicDetailPage-Aq4-6GLl.js.map → TopicDetailPage-DwShZbh9.js.map} +1 -1
  145. package/dashboard/dist/assets/TopicsPage-DKXlpZl_.js +2 -0
  146. package/dashboard/dist/assets/{TopicsPage-BYFKjRY_.js.map → TopicsPage-DKXlpZl_.js.map} +1 -1
  147. package/dashboard/dist/assets/UserName-zlR1so37.js +2 -0
  148. package/dashboard/dist/assets/{UserName-C4_T5-rI.js.map → UserName-zlR1so37.js.map} +1 -1
  149. package/dashboard/dist/assets/WorkflowExecutionPage-BMNIxeJB.js +2 -0
  150. package/dashboard/dist/assets/WorkflowExecutionPage-BMNIxeJB.js.map +1 -0
  151. package/dashboard/dist/assets/WorkflowPill-B5B3yGlh.js +2 -0
  152. package/dashboard/dist/assets/WorkflowPill-B5B3yGlh.js.map +1 -0
  153. package/dashboard/dist/assets/WorkflowsDashboard-BlAPZbQZ.js +2 -0
  154. package/dashboard/dist/assets/{WorkflowsDashboard-_LMWc-OC.js.map → WorkflowsDashboard-BlAPZbQZ.js.map} +1 -1
  155. package/dashboard/dist/assets/WorkflowsOverview-NnPi6rwS.js +2 -0
  156. package/dashboard/dist/assets/{WorkflowsOverview-DFrfw554.js.map → WorkflowsOverview-NnPi6rwS.js.map} +1 -1
  157. package/dashboard/dist/assets/YamlWorkflowsPage-C4mZum6x.js +2 -0
  158. package/dashboard/dist/assets/{YamlWorkflowsPage-CZzGwfol.js.map → YamlWorkflowsPage-C4mZum6x.js.map} +1 -1
  159. package/dashboard/dist/assets/{agents-CsKILVSU.js → agents-B5wvILeV.js} +2 -2
  160. package/dashboard/dist/assets/{agents-CsKILVSU.js.map → agents-B5wvILeV.js.map} +1 -1
  161. package/dashboard/dist/assets/{bots-BzEs6Q9L.js → bots-BPlouRDm.js} +2 -2
  162. package/dashboard/dist/assets/{bots-BzEs6Q9L.js.map → bots-BPlouRDm.js.map} +1 -1
  163. package/dashboard/dist/assets/capabilities-DkvRG09b.js +2 -0
  164. package/dashboard/dist/assets/capabilities-DkvRG09b.js.map +1 -0
  165. package/dashboard/dist/assets/{controlplane-COYEIIAz.js → controlplane-0m_rA-UW.js} +2 -2
  166. package/dashboard/dist/assets/{controlplane-COYEIIAz.js.map → controlplane-0m_rA-UW.js.map} +1 -1
  167. package/dashboard/dist/assets/escalation-CfIAIUg2.js +2 -0
  168. package/dashboard/dist/assets/{escalation-BZjS2202.js.map → escalation-CfIAIUg2.js.map} +1 -1
  169. package/dashboard/dist/assets/escalation-columns-CLIdxlbe.js +2 -0
  170. package/dashboard/dist/assets/{escalation-columns-DtRVmPSB.js.map → escalation-columns-CLIdxlbe.js.map} +1 -1
  171. package/dashboard/dist/assets/helpers-prGqC38M.js +2 -0
  172. package/dashboard/dist/assets/{helpers-BngVEys5.js.map → helpers-prGqC38M.js.map} +1 -1
  173. package/dashboard/dist/assets/index-4T7Z_gQ4.js +281 -0
  174. package/dashboard/dist/assets/index-4T7Z_gQ4.js.map +1 -0
  175. package/dashboard/dist/assets/index-BPxglOYm.css +1 -0
  176. package/dashboard/dist/assets/index-BR3SwTNI.js +2 -0
  177. package/dashboard/dist/assets/{index-COgyD_H2.js.map → index-BR3SwTNI.js.map} +1 -1
  178. package/dashboard/dist/assets/index-BWKIigEk.js +2 -0
  179. package/dashboard/dist/assets/{index-Byp8BDPs.js.map → index-BWKIigEk.js.map} +1 -1
  180. package/dashboard/dist/assets/index-BgVuyWhi.js +15 -0
  181. package/dashboard/dist/assets/{index-DykjJxzr.js.map → index-BgVuyWhi.js.map} +1 -1
  182. package/dashboard/dist/assets/index-C0sDEKdo.js +2 -0
  183. package/dashboard/dist/assets/{index-DxMNiFPS.js.map → index-C0sDEKdo.js.map} +1 -1
  184. package/dashboard/dist/assets/index-C2MJzu6J.js +2 -0
  185. package/dashboard/dist/assets/{index-ByxH4qQ-.js.map → index-C2MJzu6J.js.map} +1 -1
  186. package/dashboard/dist/assets/index-CFoddJDr.js +6 -0
  187. package/dashboard/dist/assets/{index-BCsShN2l.js.map → index-CFoddJDr.js.map} +1 -1
  188. package/dashboard/dist/assets/index-CrMxD5Ib.js +6 -0
  189. package/dashboard/dist/assets/index-CrMxD5Ib.js.map +1 -0
  190. package/dashboard/dist/assets/index-CuY5hPYB.js +2 -0
  191. package/dashboard/dist/assets/{index-Bq5MSkCL.js.map → index-CuY5hPYB.js.map} +1 -1
  192. package/dashboard/dist/assets/index-CwkJBn87.js +2 -0
  193. package/dashboard/dist/assets/{index-R61-yG56.js.map → index-CwkJBn87.js.map} +1 -1
  194. package/dashboard/dist/assets/index-DeL84Cag.js +2 -0
  195. package/dashboard/dist/assets/{index-xgl431mG.js.map → index-DeL84Cag.js.map} +1 -1
  196. package/dashboard/dist/assets/index-DqeLbz6j.js +2 -0
  197. package/dashboard/dist/assets/{index-ABsZZf_U.js.map → index-DqeLbz6j.js.map} +1 -1
  198. package/dashboard/dist/assets/index-P9huxx3-.js +2 -0
  199. package/dashboard/dist/assets/{index-BwivT39P.js.map → index-P9huxx3-.js.map} +1 -1
  200. package/dashboard/dist/assets/{knowledge-DhCbDgy4.js → knowledge-CUZxyRCO.js} +2 -2
  201. package/dashboard/dist/assets/{knowledge-DhCbDgy4.js.map → knowledge-CUZxyRCO.js.map} +1 -1
  202. package/dashboard/dist/assets/{mcp-xh7T0I-f.js → mcp-B5VQPoF3.js} +2 -2
  203. package/dashboard/dist/assets/{mcp-xh7T0I-f.js.map → mcp-B5VQPoF3.js.map} +1 -1
  204. package/dashboard/dist/assets/{mcp-query-il3CfU3U.js → mcp-query-Ba5Zj3yg.js} +2 -2
  205. package/dashboard/dist/assets/{mcp-query-il3CfU3U.js.map → mcp-query-Ba5Zj3yg.js.map} +1 -1
  206. package/dashboard/dist/assets/{mcp-runs-4fyRpegc.js → mcp-runs-CAiEr5Fc.js} +2 -2
  207. package/dashboard/dist/assets/{mcp-runs-4fyRpegc.js.map → mcp-runs-CAiEr5Fc.js.map} +1 -1
  208. package/dashboard/dist/assets/namespaces-sVr5scma.js +2 -0
  209. package/dashboard/dist/assets/{namespaces-BBTvHnRF.js.map → namespaces-sVr5scma.js.map} +1 -1
  210. package/dashboard/dist/assets/{roles-D7bx5FAM.js → roles-E_bA4e0f.js} +2 -2
  211. package/dashboard/dist/assets/{roles-D7bx5FAM.js.map → roles-E_bA4e0f.js.map} +1 -1
  212. package/dashboard/dist/assets/{tasks-BgxRbhVM.js → tasks-CL6Gv8jB.js} +2 -2
  213. package/dashboard/dist/assets/{tasks-BgxRbhVM.js.map → tasks-CL6Gv8jB.js.map} +1 -1
  214. package/dashboard/dist/assets/{topics-CTtCboHe.js → topics-DbtPHERP.js} +2 -2
  215. package/dashboard/dist/assets/{topics-CTtCboHe.js.map → topics-DbtPHERP.js.map} +1 -1
  216. package/dashboard/dist/assets/{useCollapsedSections-BU5HULGs.js → useCollapsedSections-CGNA5oKV.js} +2 -2
  217. package/dashboard/dist/assets/{useCollapsedSections-BU5HULGs.js.map → useCollapsedSections-CGNA5oKV.js.map} +1 -1
  218. package/dashboard/dist/assets/useEventHooks-C6c618cj.js +2 -0
  219. package/dashboard/dist/assets/useEventHooks-C6c618cj.js.map +1 -0
  220. package/dashboard/dist/assets/{useExpandedRows-CkcEntB-.js → useExpandedRows-Cg9iq6Vy.js} +2 -2
  221. package/dashboard/dist/assets/{useExpandedRows-CkcEntB-.js.map → useExpandedRows-Cg9iq6Vy.js.map} +1 -1
  222. package/dashboard/dist/assets/{useFilterParams-DZCAaBC7.js → useFilterParams-CGRYFw_A.js} +2 -2
  223. package/dashboard/dist/assets/{useFilterParams-DZCAaBC7.js.map → useFilterParams-CGRYFw_A.js.map} +1 -1
  224. package/dashboard/dist/assets/{useYamlActivityEvents-CSMX9He5.js → useYamlActivityEvents-eK7kIUdh.js} +2 -2
  225. package/dashboard/dist/assets/{useYamlActivityEvents-CSMX9He5.js.map → useYamlActivityEvents-eK7kIUdh.js.map} +1 -1
  226. package/dashboard/dist/assets/{users-CyF-5WLI.js → users-CCHSIAxt.js} +2 -2
  227. package/dashboard/dist/assets/{users-CyF-5WLI.js.map → users-CCHSIAxt.js.map} +1 -1
  228. package/dashboard/dist/assets/{vendor-icons-BNtvBbnj.js → vendor-icons-D8-ZINAH.js} +3 -3
  229. package/dashboard/dist/assets/{vendor-icons-BNtvBbnj.js.map → vendor-icons-D8-ZINAH.js.map} +1 -1
  230. package/dashboard/dist/assets/vendor-query-DLp59M9_.js +35 -0
  231. package/dashboard/dist/assets/vendor-query-DLp59M9_.js.map +1 -0
  232. package/dashboard/dist/assets/vendor-react-Co3Y8ikm.js +26 -0
  233. package/dashboard/dist/assets/vendor-react-Co3Y8ikm.js.map +1 -0
  234. package/dashboard/dist/assets/{workflows-Bf4_w24H.js → workflows-BNbocg_9.js} +2 -2
  235. package/dashboard/dist/assets/{workflows-Bf4_w24H.js.map → workflows-BNbocg_9.js.map} +1 -1
  236. package/dashboard/dist/assets/{yaml-workflows-Cp1N0NMK.js → yaml-workflows-Cu1FUwrc.js} +2 -2
  237. package/dashboard/dist/assets/{yaml-workflows-Cp1N0NMK.js.map → yaml-workflows-Cu1FUwrc.js.map} +1 -1
  238. package/dashboard/dist/index.html +5 -5
  239. package/docs/agents.md +9 -9
  240. package/docs/api/http/agents.md +12 -10
  241. package/docs/api/http/settings.md +4 -0
  242. package/docs/api/sdk/agents.md +4 -2
  243. package/docs/api/sdk/settings.md +2 -1
  244. package/docs/dashboard.md +1 -1
  245. package/package.json +2 -2
  246. package/dashboard/dist/assets/AdminDashboard-Dr5wTIZT.js +0 -2
  247. package/dashboard/dist/assets/AgentConfigPage-D52KyJY-.js +0 -13
  248. package/dashboard/dist/assets/AgentConfigPage-D52KyJY-.js.map +0 -1
  249. package/dashboard/dist/assets/AgentDetailPage-Cbo_qrYF.js +0 -4
  250. package/dashboard/dist/assets/AgentDetailPage-Cbo_qrYF.js.map +0 -1
  251. package/dashboard/dist/assets/AgentsPage-CvuF8--H.js +0 -2
  252. package/dashboard/dist/assets/AgentsPage-CvuF8--H.js.map +0 -1
  253. package/dashboard/dist/assets/AvailableEscalationsPage-UzjXcO3W.js +0 -2
  254. package/dashboard/dist/assets/BotPicker-CM-_u73k.js +0 -2
  255. package/dashboard/dist/assets/CapabilitiesPage-D1QEHMKw.js +0 -2
  256. package/dashboard/dist/assets/CapabilitiesPage-D1QEHMKw.js.map +0 -1
  257. package/dashboard/dist/assets/CollapsibleSection-CnPKa7df.js +0 -2
  258. package/dashboard/dist/assets/ConfirmDeleteModal-dOxidrSR.js +0 -2
  259. package/dashboard/dist/assets/CopyableId-DmLF-RqZ.js +0 -2
  260. package/dashboard/dist/assets/CopyableId-DmLF-RqZ.js.map +0 -1
  261. package/dashboard/dist/assets/CredentialsPage-CImIzra4.js +0 -2
  262. package/dashboard/dist/assets/CronLabel-5HPAmciI.js +0 -2
  263. package/dashboard/dist/assets/CronLabel-5HPAmciI.js.map +0 -1
  264. package/dashboard/dist/assets/CustomDurationPicker-5JzEgS7I.js +0 -2
  265. package/dashboard/dist/assets/DataTable-D9yuBv0w.js +0 -2
  266. package/dashboard/dist/assets/DropZone-BEW3jBzf.js +0 -2
  267. package/dashboard/dist/assets/ElapsedCell-B79BF5Mj.js +0 -2
  268. package/dashboard/dist/assets/EmptyState-BcsfPq9T.js +0 -2
  269. package/dashboard/dist/assets/EscalationsOverview-QvWvbpx3.js +0 -2
  270. package/dashboard/dist/assets/EventTable-DAclQwfr.js +0 -2
  271. package/dashboard/dist/assets/EventTopicPill-By-6sXDp.js +0 -2
  272. package/dashboard/dist/assets/FilterBar-Ck4K4rzu.js +0 -2
  273. package/dashboard/dist/assets/HomePage-DVOi7rR1.js +0 -2
  274. package/dashboard/dist/assets/ListToolbar-Bntl2hex.js +0 -2
  275. package/dashboard/dist/assets/McpOverview-B-xSYPJj.js +0 -2
  276. package/dashboard/dist/assets/McpQueryDetailPage-Cq71BzjB.js +0 -5
  277. package/dashboard/dist/assets/McpQueryPage-Dfz87aZF.js +0 -2
  278. package/dashboard/dist/assets/McpRunDetailPage-CXXRgMmJ.js +0 -2
  279. package/dashboard/dist/assets/McpRunDetailPage-CXXRgMmJ.js.map +0 -1
  280. package/dashboard/dist/assets/McpRunsPage-MUYvUYqz.js +0 -2
  281. package/dashboard/dist/assets/Modal-DEODGeqx.js +0 -2
  282. package/dashboard/dist/assets/OperatorDashboard-Rih1SZrn.js +0 -2
  283. package/dashboard/dist/assets/PageHeader-Bo0SpcCK.js +0 -2
  284. package/dashboard/dist/assets/PageHeaderWithStats-7K5BdhOj.js +0 -2
  285. package/dashboard/dist/assets/PriorityBadge-DfQY9St9.js +0 -2
  286. package/dashboard/dist/assets/ProcessDetailPage-BMkWCjqD.js +0 -2
  287. package/dashboard/dist/assets/ProcessesListPage-vZjUSc7S.js +0 -2
  288. package/dashboard/dist/assets/RolePill-BDzPFQUv.js +0 -2
  289. package/dashboard/dist/assets/RolesPage-kjeAsj3_.js +0 -2
  290. package/dashboard/dist/assets/RowActions-Dg-Fsm5O.js +0 -2
  291. package/dashboard/dist/assets/RunAsSelector-DC4SLtTq.js +0 -2
  292. package/dashboard/dist/assets/ServerName-CEOFF7UG.js +0 -2
  293. package/dashboard/dist/assets/StatCard-DlgF0CJC.js +0 -2
  294. package/dashboard/dist/assets/StatusBadge-XQlNFwmH.js +0 -2
  295. package/dashboard/dist/assets/StepIndicator-CuUIGxKk.js +0 -2
  296. package/dashboard/dist/assets/StickyPagination-F9FZsRy9.js +0 -2
  297. package/dashboard/dist/assets/SwimlaneTimeline-MUUXgT3o.js +0 -2
  298. package/dashboard/dist/assets/SwimlaneTimeline-MUUXgT3o.js.map +0 -1
  299. package/dashboard/dist/assets/TagInput-VBY0xIwb.js +0 -2
  300. package/dashboard/dist/assets/TaskDetailPage-C0AlG_2t.js +0 -2
  301. package/dashboard/dist/assets/TaskDetailPage-C0AlG_2t.js.map +0 -1
  302. package/dashboard/dist/assets/TaskQueuePill-DZykFijh.js +0 -2
  303. package/dashboard/dist/assets/TasksListPage-69ZWCaCP.js +0 -2
  304. package/dashboard/dist/assets/TimeAgo-CttiZG0k.js +0 -2
  305. package/dashboard/dist/assets/TimestampCell-CYFbEhqc.js +0 -2
  306. package/dashboard/dist/assets/ToolPill-RP2Tvlrx.js +0 -2
  307. package/dashboard/dist/assets/ToolTestPanel-CY_PLZSe.js +0 -2
  308. package/dashboard/dist/assets/ToolTestPanel-CY_PLZSe.js.map +0 -1
  309. package/dashboard/dist/assets/TopicDetailPage-Aq4-6GLl.js +0 -9
  310. package/dashboard/dist/assets/TopicsPage-BYFKjRY_.js +0 -2
  311. package/dashboard/dist/assets/UserName-C4_T5-rI.js +0 -2
  312. package/dashboard/dist/assets/WorkflowExecutionPage-DUSTBasv.js +0 -2
  313. package/dashboard/dist/assets/WorkflowExecutionPage-DUSTBasv.js.map +0 -1
  314. package/dashboard/dist/assets/WorkflowPill-pPuGH8v9.js +0 -2
  315. package/dashboard/dist/assets/WorkflowPill-pPuGH8v9.js.map +0 -1
  316. package/dashboard/dist/assets/WorkflowsDashboard-_LMWc-OC.js +0 -2
  317. package/dashboard/dist/assets/WorkflowsOverview-DFrfw554.js +0 -2
  318. package/dashboard/dist/assets/YamlWorkflowsPage-CZzGwfol.js +0 -2
  319. package/dashboard/dist/assets/escalation-BZjS2202.js +0 -2
  320. package/dashboard/dist/assets/escalation-columns-DtRVmPSB.js +0 -2
  321. package/dashboard/dist/assets/helpers-BngVEys5.js +0 -2
  322. package/dashboard/dist/assets/index-ABsZZf_U.js +0 -2
  323. package/dashboard/dist/assets/index-BCsShN2l.js +0 -6
  324. package/dashboard/dist/assets/index-Bq5MSkCL.js +0 -2
  325. package/dashboard/dist/assets/index-BwivT39P.js +0 -2
  326. package/dashboard/dist/assets/index-Byp8BDPs.js +0 -2
  327. package/dashboard/dist/assets/index-ByxH4qQ-.js +0 -2
  328. package/dashboard/dist/assets/index-COgyD_H2.js +0 -2
  329. package/dashboard/dist/assets/index-DXEYynKO.css +0 -1
  330. package/dashboard/dist/assets/index-DcpCR9c_.js +0 -63
  331. package/dashboard/dist/assets/index-DcpCR9c_.js.map +0 -1
  332. package/dashboard/dist/assets/index-DuPY59Yu.js +0 -5
  333. package/dashboard/dist/assets/index-DuPY59Yu.js.map +0 -1
  334. package/dashboard/dist/assets/index-DxMNiFPS.js +0 -2
  335. package/dashboard/dist/assets/index-DykjJxzr.js +0 -15
  336. package/dashboard/dist/assets/index-R61-yG56.js +0 -2
  337. package/dashboard/dist/assets/index-xgl431mG.js +0 -2
  338. package/dashboard/dist/assets/namespaces-BBTvHnRF.js +0 -2
  339. package/dashboard/dist/assets/settings-nt6qyR1S.js +0 -2
  340. package/dashboard/dist/assets/settings-nt6qyR1S.js.map +0 -1
  341. package/dashboard/dist/assets/useEventHooks-CkJOmbF-.js +0 -2
  342. package/dashboard/dist/assets/useEventHooks-CkJOmbF-.js.map +0 -1
  343. package/dashboard/dist/assets/vendor-query-B2UbickB.js +0 -18
  344. package/dashboard/dist/assets/vendor-query-B2UbickB.js.map +0 -1
  345. package/dashboard/dist/assets/vendor-react-CX88sFS5.js +0 -22
  346. package/dashboard/dist/assets/vendor-react-CX88sFS5.js.map +0 -1
@@ -38,6 +38,15 @@ exports.createSubscription = createSubscription;
38
38
  exports.updateSubscription = updateSubscription;
39
39
  exports.deleteSubscription = deleteSubscription;
40
40
  const subService = __importStar(require("../services/agent/subscriptions"));
41
+ const publish_1 = require("../lib/events/publish");
42
+ function notifyTriggersChanged(agentId) {
43
+ (0, publish_1.publishAgentEvent)({
44
+ type: 'agent.triggers_changed',
45
+ agentId,
46
+ agentName: agentId,
47
+ data: { action: 'subscription_changed' },
48
+ });
49
+ }
41
50
  async function listSubscriptions(input) {
42
51
  try {
43
52
  const subs = await subService.listSubscriptions(input.agentId);
@@ -51,6 +60,7 @@ async function createSubscription(input) {
51
60
  try {
52
61
  const { agentId, ...data } = input;
53
62
  const sub = await subService.createSubscription(agentId, data);
63
+ notifyTriggersChanged(agentId);
54
64
  return { status: 201, data: sub };
55
65
  }
56
66
  catch (err) {
@@ -63,6 +73,7 @@ async function updateSubscription(input) {
63
73
  const sub = await subService.updateSubscription(id, data);
64
74
  if (!sub)
65
75
  return { status: 404, error: 'Subscription not found' };
76
+ notifyTriggersChanged(sub.agent_id);
66
77
  return { status: 200, data: sub };
67
78
  }
68
79
  catch (err) {
@@ -71,9 +82,12 @@ async function updateSubscription(input) {
71
82
  }
72
83
  async function deleteSubscription(input) {
73
84
  try {
85
+ const sub = await subService.getSubscription(input.id);
74
86
  const deleted = await subService.deleteSubscription(input.id);
75
87
  if (!deleted)
76
88
  return { status: 404, error: 'Subscription not found' };
89
+ if (sub)
90
+ notifyTriggersChanged(sub.agent_id);
77
91
  return { status: 200, data: { deleted: true } };
78
92
  }
79
93
  catch (err) {
@@ -6,6 +6,7 @@ const events_1 = require("../lib/events");
6
6
  const nats_1 = require("../lib/events/nats");
7
7
  const socketio_1 = require("../lib/events/socketio");
8
8
  const defaults_1 = require("../modules/defaults");
9
+ const llm_1 = require("../services/llm");
9
10
  /**
10
11
  * Return platform settings for the current deployment.
11
12
  *
@@ -39,6 +40,9 @@ async function getSettings() {
39
40
  ? (process.env.VITE_NATS_WS_URL || process.env.NATS_WS_URL || null)
40
41
  : null,
41
42
  },
43
+ ai: {
44
+ enabled: (0, llm_1.hasLLMApiKey)(),
45
+ },
42
46
  },
43
47
  };
44
48
  }
@@ -8,11 +8,5 @@ export declare function closePool(): Promise<void>;
8
8
  */
9
9
  export declare function getConnection(): {
10
10
  class: typeof Client;
11
- options: {
12
- host: string;
13
- port: number;
14
- user: string;
15
- password: string;
16
- database: string;
17
- };
11
+ options: Record<string, unknown>;
18
12
  };
@@ -0,0 +1,12 @@
1
+ -- Add 'capability' reaction type and server_id/tool_name columns
2
+ -- for late-binding MCP tool invocation via agent subscriptions.
3
+
4
+ ALTER TABLE lt_agent_subscriptions
5
+ DROP CONSTRAINT IF EXISTS lt_agent_subscriptions_reaction_type_check;
6
+
7
+ ALTER TABLE lt_agent_subscriptions
8
+ ADD CONSTRAINT lt_agent_subscriptions_reaction_type_check
9
+ CHECK (reaction_type IN ('durable', 'pipeline', 'mcp_query', 'capability'));
10
+
11
+ ALTER TABLE lt_agent_subscriptions ADD COLUMN IF NOT EXISTS server_id TEXT;
12
+ ALTER TABLE lt_agent_subscriptions ADD COLUMN IF NOT EXISTS tool_name TEXT;
@@ -0,0 +1,10 @@
1
+ -- Add 'file' to the topic catalog category check constraint.
2
+
3
+ ALTER TABLE lt_topic_catalog
4
+ DROP CONSTRAINT IF EXISTS lt_topic_catalog_category_check;
5
+
6
+ ALTER TABLE lt_topic_catalog
7
+ ADD CONSTRAINT lt_topic_catalog_category_check
8
+ CHECK (category IN (
9
+ 'task','workflow','escalation','activity','knowledge','file','agent','app','milestone'
10
+ ));
@@ -31,6 +31,15 @@ declare class LTEventRegistry {
31
31
  * Return the first registered adapter that matches the given type.
32
32
  */
33
33
  getAdapter<T extends LTEventAdapter>(ctor: new (...args: any[]) => T): T | undefined;
34
+ /**
35
+ * Bridge cross-container events to the in-process callback adapter.
36
+ *
37
+ * Iterates all registered adapters and calls `setCallbackBridge()` on
38
+ * any that implement it. This is the generic contract — any transport
39
+ * adapter (NATS, SNS, GCP Pub/Sub, Kafka) that supports cross-process
40
+ * delivery implements `setCallbackBridge` on the LTEventAdapter interface.
41
+ */
42
+ bridgeCallbackAdapter(callbackAdapter: LTEventAdapter): void;
34
43
  }
35
44
  /** Singleton event registry */
36
45
  export declare const eventRegistry: LTEventRegistry;
@@ -59,6 +59,24 @@ class LTEventRegistry {
59
59
  getAdapter(ctor) {
60
60
  return this.adapters.find((a) => a instanceof ctor);
61
61
  }
62
+ /**
63
+ * Bridge cross-container events to the in-process callback adapter.
64
+ *
65
+ * Iterates all registered adapters and calls `setCallbackBridge()` on
66
+ * any that implement it. This is the generic contract — any transport
67
+ * adapter (NATS, SNS, GCP Pub/Sub, Kafka) that supports cross-process
68
+ * delivery implements `setCallbackBridge` on the LTEventAdapter interface.
69
+ */
70
+ bridgeCallbackAdapter(callbackAdapter) {
71
+ let bridged = 0;
72
+ for (const adapter of this.adapters) {
73
+ if (adapter !== callbackAdapter && typeof adapter.setCallbackBridge === 'function') {
74
+ adapter.setCallbackBridge(callbackAdapter);
75
+ bridged++;
76
+ }
77
+ }
78
+ logger_1.loggerRegistry.info(`[lt-events] callback bridge wired to ${bridged} transport adapter(s)`);
79
+ }
62
80
  }
63
81
  /** Singleton event registry */
64
82
  exports.eventRegistry = new LTEventRegistry();
@@ -1,10 +1,16 @@
1
1
  import type { LTEvent, LTEventAdapter } from '../../types';
2
2
  /**
3
- * NATS event adapter — reference implementation.
3
+ * NATS event adapter — publish AND subscribe.
4
4
  *
5
5
  * Publishes LTEvent payloads as JSON to NATS subjects
6
6
  * following the pattern: `{subjectPrefix}.{event.type}`
7
7
  *
8
+ * When a CallbackEventAdapter is bridged via `setCallbackBridge()`,
9
+ * this adapter also subscribes to `{subjectPrefix}.>` and forwards
10
+ * events from other containers to the local callback adapter.
11
+ * An `_originId` field prevents the publishing container from
12
+ * re-dispatching its own events.
13
+ *
8
14
  * Usage:
9
15
  * ```typescript
10
16
  * import { eventRegistry, NatsEventAdapter } from '@hotmeshio/long-tail';
@@ -15,14 +21,22 @@ import type { LTEvent, LTEventAdapter } from '../../types';
15
21
  */
16
22
  export declare class NatsEventAdapter implements LTEventAdapter {
17
23
  private nc;
24
+ private sub;
18
25
  private url;
19
26
  private subjectPrefix;
20
27
  private token?;
28
+ private originId;
29
+ private callbackAdapter;
21
30
  constructor(options?: {
22
31
  url?: string;
23
32
  subjectPrefix?: string;
24
33
  token?: string;
25
34
  });
35
+ /**
36
+ * Bridge NATS → local callback adapter for cross-container dispatch.
37
+ * Part of the LTEventAdapter contract. Call before `connect()`.
38
+ */
39
+ setCallbackBridge(adapter: LTEventAdapter): void;
26
40
  connect(): Promise<void>;
27
41
  publish(event: LTEvent): Promise<void>;
28
42
  disconnect(): Promise<void>;
@@ -1,16 +1,23 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.NatsEventAdapter = void 0;
4
+ const crypto_1 = require("crypto");
4
5
  const nats_1 = require("nats");
5
6
  const config_1 = require("../../modules/config");
6
7
  const logger_1 = require("../logger");
7
8
  const sc = (0, nats_1.StringCodec)();
8
9
  /**
9
- * NATS event adapter — reference implementation.
10
+ * NATS event adapter — publish AND subscribe.
10
11
  *
11
12
  * Publishes LTEvent payloads as JSON to NATS subjects
12
13
  * following the pattern: `{subjectPrefix}.{event.type}`
13
14
  *
15
+ * When a CallbackEventAdapter is bridged via `setCallbackBridge()`,
16
+ * this adapter also subscribes to `{subjectPrefix}.>` and forwards
17
+ * events from other containers to the local callback adapter.
18
+ * An `_originId` field prevents the publishing container from
19
+ * re-dispatching its own events.
20
+ *
14
21
  * Usage:
15
22
  * ```typescript
16
23
  * import { eventRegistry, NatsEventAdapter } from '@hotmeshio/long-tail';
@@ -22,24 +29,61 @@ const sc = (0, nats_1.StringCodec)();
22
29
  class NatsEventAdapter {
23
30
  constructor(options) {
24
31
  this.nc = null;
32
+ this.sub = null;
33
+ this.originId = (0, crypto_1.randomUUID)();
34
+ this.callbackAdapter = null;
25
35
  this.url = options?.url || config_1.config.NATS_URL;
26
36
  this.subjectPrefix = options?.subjectPrefix || 'lt.events';
27
37
  this.token = options?.token || process.env.NATS_TOKEN || 'dev_api_secret';
28
38
  }
39
+ /**
40
+ * Bridge NATS → local callback adapter for cross-container dispatch.
41
+ * Part of the LTEventAdapter contract. Call before `connect()`.
42
+ */
43
+ setCallbackBridge(adapter) {
44
+ this.callbackAdapter = adapter;
45
+ }
29
46
  async connect() {
30
47
  this.nc = await (0, nats_1.connect)({
31
48
  servers: this.url,
32
49
  token: this.token,
33
50
  });
34
51
  logger_1.loggerRegistry.info(`[lt-events:nats] connected to ${this.url}`);
52
+ // Subscribe to all events for cross-container bridging
53
+ if (this.callbackAdapter) {
54
+ const adapter = this.callbackAdapter;
55
+ this.sub = this.nc.subscribe(`${this.subjectPrefix}.>`);
56
+ logger_1.loggerRegistry.info(`[lt-events:nats] subscribed to ${this.subjectPrefix}.> for cross-container bridge`);
57
+ (async () => {
58
+ for await (const msg of this.sub) {
59
+ try {
60
+ const event = JSON.parse(sc.decode(msg.data));
61
+ // Skip events that originated from this container
62
+ if (event._originId === this.originId)
63
+ continue;
64
+ logger_1.loggerRegistry.info(`[lt-events:nats] bridge received: ${event.type} from ${event._originId?.slice(0, 8)}`);
65
+ adapter.publish(event);
66
+ }
67
+ catch {
68
+ // Malformed message — skip
69
+ }
70
+ }
71
+ })();
72
+ }
35
73
  }
36
74
  async publish(event) {
37
75
  if (!this.nc)
38
76
  return;
39
77
  const subject = `${this.subjectPrefix}.${event.type}`;
40
- this.nc.publish(subject, sc.encode(JSON.stringify(event)));
78
+ const enriched = { ...event, _originId: this.originId };
79
+ this.nc.publish(subject, sc.encode(JSON.stringify(enriched)));
80
+ logger_1.loggerRegistry.info(`[lt-events:nats] published: ${subject} (origin=${this.originId.slice(0, 8)})`);
41
81
  }
42
82
  async disconnect() {
83
+ if (this.sub) {
84
+ this.sub.unsubscribe();
85
+ this.sub = null;
86
+ }
43
87
  if (this.nc) {
44
88
  await this.nc.drain();
45
89
  this.nc = null;
@@ -66,6 +66,16 @@ export declare function publishKnowledgeEvent(params: {
66
66
  domain: string;
67
67
  key: string;
68
68
  }): Promise<void>;
69
+ /**
70
+ * Publish a file storage event (stored, deleted).
71
+ * Includes rich metadata: path, name, extension, mime type, size.
72
+ */
73
+ export declare function publishFileEvent(params: {
74
+ type: 'file.stored' | 'file.deleted';
75
+ path: string;
76
+ size?: number;
77
+ mime?: string;
78
+ }): Promise<void>;
69
79
  /**
70
80
  * Publish an agent lifecycle event.
71
81
  */
@@ -5,6 +5,7 @@ exports.publishTaskEvent = publishTaskEvent;
5
5
  exports.publishEscalationEvent = publishEscalationEvent;
6
6
  exports.publishActivityEvent = publishActivityEvent;
7
7
  exports.publishKnowledgeEvent = publishKnowledgeEvent;
8
+ exports.publishFileEvent = publishFileEvent;
8
9
  exports.publishAgentEvent = publishAgentEvent;
9
10
  exports.publishWorkflowEvent = publishWorkflowEvent;
10
11
  const index_1 = require("./index");
@@ -105,6 +106,33 @@ function publishKnowledgeEvent(params) {
105
106
  timestamp: new Date().toISOString(),
106
107
  });
107
108
  }
109
+ /**
110
+ * Publish a file storage event (stored, deleted).
111
+ * Includes rich metadata: path, name, extension, mime type, size.
112
+ */
113
+ function publishFileEvent(params) {
114
+ const parsed = params.path.split('/');
115
+ const filename = parsed[parsed.length - 1] || '';
116
+ const dotIdx = filename.lastIndexOf('.');
117
+ const name = dotIdx > 0 ? filename.slice(0, dotIdx) : filename;
118
+ const extension = dotIdx > 0 ? filename.slice(dotIdx + 1) : '';
119
+ return fireAndForget({
120
+ type: params.type,
121
+ source: 'file-storage',
122
+ workflowId: '',
123
+ workflowName: '',
124
+ taskQueue: '',
125
+ data: {
126
+ path: params.path,
127
+ name,
128
+ extension,
129
+ filename,
130
+ mime: params.mime,
131
+ size: params.size,
132
+ },
133
+ timestamp: new Date().toISOString(),
134
+ });
135
+ }
108
136
  /**
109
137
  * Publish an agent lifecycle event.
110
138
  */
@@ -10,10 +10,4 @@ export declare const config: {
10
10
  JWT_SECRET: string;
11
11
  HONEYCOMB_API_KEY: string;
12
12
  };
13
- export declare const postgres_options: {
14
- host: string;
15
- port: number;
16
- user: string;
17
- password: string;
18
- database: string;
19
- };
13
+ export declare const postgres_options: Record<string, unknown>;
@@ -115,6 +115,13 @@ async function updateAgent(id, data) {
115
115
  if (updated && (data.status || data.behaviors)) {
116
116
  Promise.resolve().then(() => __importStar(require('./trigger-registry'))).then(({ agentTriggerRegistry }) => agentTriggerRegistry.restartAgent(id)).catch(() => { });
117
117
  Promise.resolve().then(() => __importStar(require('../cron'))).then(({ cronRegistry }) => cronRegistry.restartAgentCrons(updated)).catch(() => { });
118
+ // Signal other containers to re-arm triggers for this agent
119
+ (0, publish_1.publishAgentEvent)({
120
+ type: 'agent.triggers_changed',
121
+ agentId: id,
122
+ agentName: id,
123
+ data: { action: 'updated' },
124
+ });
118
125
  }
119
126
  return updated;
120
127
  }
@@ -122,6 +129,13 @@ async function deleteAgent(id) {
122
129
  // Stop event triggers and cron schedules before deleting
123
130
  Promise.resolve().then(() => __importStar(require('./trigger-registry'))).then(({ agentTriggerRegistry }) => agentTriggerRegistry.stopAgent(id)).catch(() => { });
124
131
  Promise.resolve().then(() => __importStar(require('../cron'))).then(({ cronRegistry }) => cronRegistry.stopAgentCrons(id)).catch(() => { });
132
+ // Signal other containers to stop triggers for this agent
133
+ (0, publish_1.publishAgentEvent)({
134
+ type: 'agent.triggers_changed',
135
+ agentId: id,
136
+ agentName: id,
137
+ data: { action: 'deleted' },
138
+ });
125
139
  const pool = (0, db_1.getPool)();
126
140
  const { rowCount } = await pool.query(sql_1.DELETE_AGENT, [id]);
127
141
  return (rowCount ?? 0) > 0;
@@ -1,7 +1,7 @@
1
1
  export declare const LIST_SUBSCRIPTIONS = "\n SELECT * FROM lt_agent_subscriptions\n WHERE agent_id = $1\n ORDER BY created_at\n";
2
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";
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, server_id, tool_name)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)\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 server_id = COALESCE($11, server_id),\n tool_name = COALESCE($12, tool_name)\n WHERE id = $1\n RETURNING *\n";
5
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";
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, server_id, tool_name)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, true, $10, $11)\n ON CONFLICT (agent_id, topic) DO NOTHING\n";
7
7
  export declare const LIST_ACTIVE_SUBSCRIPTIONS = "\n SELECT s.*, a.id 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";
@@ -12,8 +12,8 @@ exports.GET_SUBSCRIPTION = `
12
12
  exports.INSERT_SUBSCRIPTION = `
13
13
  INSERT INTO lt_agent_subscriptions
14
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)
15
+ input_mapping, execute_as, enabled, server_id, tool_name)
16
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)
17
17
  RETURNING *
18
18
  `;
19
19
  exports.UPDATE_SUBSCRIPTION = `
@@ -26,7 +26,9 @@ exports.UPDATE_SUBSCRIPTION = `
26
26
  mcp_prompt = COALESCE($7, mcp_prompt),
27
27
  input_mapping = COALESCE($8, input_mapping),
28
28
  execute_as = COALESCE($9, execute_as),
29
- enabled = COALESCE($10, enabled)
29
+ enabled = COALESCE($10, enabled),
30
+ server_id = COALESCE($11, server_id),
31
+ tool_name = COALESCE($12, tool_name)
30
32
  WHERE id = $1
31
33
  RETURNING *
32
34
  `;
@@ -36,8 +38,8 @@ exports.DELETE_SUBSCRIPTION = `
36
38
  exports.SEED_SUBSCRIPTION = `
37
39
  INSERT INTO lt_agent_subscriptions
38
40
  (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
+ input_mapping, execute_as, enabled, server_id, tool_name)
42
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, true, $10, $11)
41
43
  ON CONFLICT (agent_id, topic) DO NOTHING
42
44
  `;
43
45
  exports.LIST_ACTIVE_SUBSCRIPTIONS = `
@@ -3,10 +3,12 @@ export interface AgentSubscription {
3
3
  agent_id: string;
4
4
  topic: string;
5
5
  filter?: Record<string, any>;
6
- reaction_type: 'durable' | 'pipeline' | 'mcp_query';
6
+ reaction_type: 'durable' | 'pipeline' | 'mcp_query' | 'capability';
7
7
  workflow_type?: string;
8
8
  pipeline_id?: string;
9
9
  mcp_prompt?: string;
10
+ server_id?: string;
11
+ tool_name?: string;
10
12
  input_mapping: Record<string, any>;
11
13
  execute_as?: string;
12
14
  enabled: boolean;
@@ -32,6 +32,8 @@ async function createSubscription(agentId, data) {
32
32
  JSON.stringify(data.input_mapping ?? {}),
33
33
  data.execute_as ?? null,
34
34
  data.enabled !== false,
35
+ data.server_id ?? null,
36
+ data.tool_name ?? null,
35
37
  ]);
36
38
  return rows[0];
37
39
  }
@@ -48,6 +50,8 @@ async function updateSubscription(id, data) {
48
50
  data.input_mapping ? JSON.stringify(data.input_mapping) : null,
49
51
  data.execute_as ?? null,
50
52
  data.enabled ?? null,
53
+ data.server_id ?? null,
54
+ data.tool_name ?? null,
51
55
  ]);
52
56
  return rows[0] ?? null;
53
57
  }
@@ -77,6 +81,8 @@ async function seedSubscription(agentId, data) {
77
81
  data.mcp_prompt ?? null,
78
82
  JSON.stringify(data.input_mapping ?? {}),
79
83
  data.execute_as ?? null,
84
+ data.server_id ?? null,
85
+ data.tool_name ?? null,
80
86
  ]);
81
87
  return (rowCount ?? 0) > 0;
82
88
  }
@@ -12,6 +12,8 @@ declare class AgentTriggerRegistry {
12
12
  private connected;
13
13
  /**
14
14
  * Load all active subscriptions from DB and arm event listeners.
15
+ * Also subscribes to `agent.triggers_changed` so other containers
16
+ * can signal this one to re-arm after subscription CRUD.
15
17
  */
16
18
  connect(adapter: CallbackEventAdapter): Promise<void>;
17
19
  /**
@@ -55,13 +55,32 @@ class AgentTriggerRegistry {
55
55
  }
56
56
  /**
57
57
  * Load all active subscriptions from DB and arm event listeners.
58
+ * Also subscribes to `agent.triggers_changed` so other containers
59
+ * can signal this one to re-arm after subscription CRUD.
58
60
  */
59
61
  async connect(adapter) {
60
62
  this.adapter = adapter;
61
63
  const subs = await (0, subscriptions_1.listActiveSubscriptions)();
62
64
  for (const sub of subs) {
65
+ logger_1.loggerRegistry.info(`[long-tail] arming trigger: ${sub.agent_name}/${sub.topic} → ${sub.reaction_type}:${sub.tool_name || sub.workflow_type || sub.mcp_prompt?.slice(0, 20) || '?'}`);
63
66
  this.armSubscription(sub);
64
67
  }
68
+ // Listen for cross-container trigger sync signals
69
+ adapter.on('agent.triggers_changed', (event) => {
70
+ const agentId = event.data?.agentId;
71
+ const action = event.data?.action;
72
+ if (!agentId)
73
+ return;
74
+ if (action === 'deleted') {
75
+ this.stopAgent(agentId);
76
+ logger_1.loggerRegistry.info(`[long-tail] agent triggers stopped (remote): ${agentId}`);
77
+ }
78
+ else {
79
+ this.restartAgent(agentId).then(() => {
80
+ logger_1.loggerRegistry.info(`[long-tail] agent triggers synced (remote): ${agentId}`);
81
+ }).catch(() => { });
82
+ }
83
+ });
65
84
  this.connected = true;
66
85
  logger_1.loggerRegistry.info(`[long-tail] agent trigger registry: ${subs.length} subscription(s) armed`);
67
86
  }
@@ -123,8 +142,10 @@ class AgentTriggerRegistry {
123
142
  buildHandler(sub) {
124
143
  return async (event) => {
125
144
  try {
145
+ logger_1.loggerRegistry.info(`[long-tail] trigger matched: ${sub.agent_name}/${sub.topic} for event ${event.type}`);
126
146
  // 1. Evaluate optional filter
127
147
  if (sub.filter && !this.matchesFilter(event, sub.filter)) {
148
+ logger_1.loggerRegistry.info(`[long-tail] trigger filtered out: ${sub.agent_name}/${sub.topic}`);
128
149
  return;
129
150
  }
130
151
  // 2. Derive deterministic workflow ID for distributed dedup
@@ -154,14 +175,22 @@ class AgentTriggerRegistry {
154
175
  }).catch(() => { }); // best-effort
155
176
  }
156
177
  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}`);
178
+ // Duplicate job errors are expected in multi-container — another
179
+ // container won the race. Log as info and continue.
180
+ const isDuplicate = err.message?.includes('already exists');
181
+ if (isDuplicate) {
182
+ logger_1.loggerRegistry.info(`[long-tail] agent trigger dedup (another container handled): ${sub.agent_name}/${sub.topic}`);
183
+ }
184
+ else {
185
+ (0, publish_1.publishAgentEvent)({
186
+ type: 'agent.failed',
187
+ agentId: sub.agent_id,
188
+ agentName: sub.agent_name,
189
+ status: 'error',
190
+ data: { topic: sub.topic, error: err.message },
191
+ });
192
+ logger_1.loggerRegistry.warn(`[long-tail] agent trigger failed: ${sub.agent_name}/${sub.topic}: ${err.message}`);
193
+ }
165
194
  }
166
195
  };
167
196
  }
@@ -214,6 +243,7 @@ class AgentTriggerRegistry {
214
243
  data: mapped.data ?? mapped,
215
244
  execute_as: sub.execute_as ?? sub.agent_user_id ?? undefined,
216
245
  source: 'agent',
246
+ jobId: deterministicId,
217
247
  });
218
248
  break;
219
249
  }
@@ -226,6 +256,23 @@ class AgentTriggerRegistry {
226
256
  });
227
257
  break;
228
258
  }
259
+ case 'capability': {
260
+ logger_1.loggerRegistry.info(`[long-tail] agent capability: ${sub.agent_name} → ${sub.tool_name} on ${sub.server_id} (id=${deterministicId})`);
261
+ const { invokeWorkflow } = await Promise.resolve().then(() => __importStar(require('../workflow-invocation')));
262
+ await invokeWorkflow({
263
+ workflowType: 'capabilityInvoke',
264
+ data: {
265
+ serverId: sub.server_id,
266
+ toolName: sub.tool_name,
267
+ arguments: mapped,
268
+ },
269
+ metadata: { source: 'agent' },
270
+ executeAs: sub.execute_as ?? sub.agent_user_id ?? undefined,
271
+ options: { workflowId: deterministicId },
272
+ auth: { userId: sub.agent_user_id || 'lt-system', role: 'admin' },
273
+ });
274
+ break;
275
+ }
229
276
  }
230
277
  }
231
278
  }
@@ -158,6 +158,35 @@ const SYSTEM_TOPICS = [
158
158
  example_payload: { domain: 'orders', key: 'order-12345' },
159
159
  tags: ['lifecycle', 'knowledge'],
160
160
  },
161
+ // File storage
162
+ {
163
+ topic: 'file.stored',
164
+ description: 'A file has been written to storage.',
165
+ category: 'file',
166
+ payload_schema: objectSchema({
167
+ path: { type: 'string', description: 'File path in storage' },
168
+ name: { type: 'string', description: 'File name without extension' },
169
+ extension: { type: 'string', description: 'File extension (without dot)' },
170
+ filename: { type: 'string', description: 'Full filename with extension' },
171
+ mime: { type: 'string', description: 'MIME type' },
172
+ size: { type: 'number', description: 'File size in bytes' },
173
+ }),
174
+ example_payload: { path: '/images/photo.jpg', name: 'photo', extension: 'jpg', filename: 'photo.jpg', mime: 'image/jpeg', size: 245760 },
175
+ tags: ['lifecycle', 'file', 'storage'],
176
+ },
177
+ {
178
+ topic: 'file.deleted',
179
+ description: 'A file has been removed from storage.',
180
+ category: 'file',
181
+ payload_schema: objectSchema({
182
+ path: { type: 'string', description: 'File path in storage' },
183
+ name: { type: 'string', description: 'File name without extension' },
184
+ extension: { type: 'string', description: 'File extension (without dot)' },
185
+ filename: { type: 'string', description: 'Full filename with extension' },
186
+ }),
187
+ example_payload: { path: '/images/photo.jpg', name: 'photo', extension: 'jpg', filename: 'photo.jpg' },
188
+ tags: ['lifecycle', 'file', 'storage'],
189
+ },
161
190
  // Agent lifecycle
162
191
  {
163
192
  topic: 'agent.started',
@@ -30,7 +30,7 @@ export declare function activateYamlWorkflow(appId: string, version: string): Pr
30
30
  /**
31
31
  * Invoke a YAML workflow (fire-and-forget). Returns the job ID.
32
32
  */
33
- export declare function invokeYamlWorkflow(appId: string, topic: string, data: Record<string, unknown>, entity?: string): Promise<string>;
33
+ export declare function invokeYamlWorkflow(appId: string, topic: string, data: Record<string, unknown>, entity?: string, context?: Record<string, any>): Promise<string>;
34
34
  /**
35
35
  * Invoke a YAML workflow and wait for the result.
36
36
  *
@@ -136,9 +136,9 @@ async function activateYamlWorkflow(appId, version) {
136
136
  /**
137
137
  * Invoke a YAML workflow (fire-and-forget). Returns the job ID.
138
138
  */
139
- async function invokeYamlWorkflow(appId, topic, data, entity) {
139
+ async function invokeYamlWorkflow(appId, topic, data, entity, context) {
140
140
  const engine = await getEngine(appId);
141
- return engine.pub(topic, data, undefined, entity ? { entity } : undefined);
141
+ return engine.pub(topic, data, context, entity ? { entity } : undefined);
142
142
  }
143
143
  /**
144
144
  * Invoke a YAML workflow and wait for the result.
@@ -7,6 +7,8 @@ interface InvokeOptions {
7
7
  userId?: string;
8
8
  /** Source identifier for metadata injection (e.g., 'cron') */
9
9
  source?: string;
10
+ /** Deterministic job ID for idempotent execution (agent subscriptions) */
11
+ jobId?: string;
10
12
  }
11
13
  /**
12
14
  * Invoke a YAML workflow with scope injection.