@hotmeshio/long-tail 0.2.10 → 0.3.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 (241) hide show
  1. package/build/api/topics.d.ts +22 -0
  2. package/build/api/topics.js +104 -0
  3. package/build/index.d.ts +3 -1
  4. package/build/index.js +7 -2
  5. package/build/lib/db/schemas/007_topic_catalog.sql +27 -0
  6. package/build/routes/index.js +2 -0
  7. package/build/routes/topics.d.ts +2 -0
  8. package/build/routes/topics.js +90 -0
  9. package/build/services/topics/index.d.ts +77 -0
  10. package/build/services/topics/index.js +116 -0
  11. package/build/services/topics/sql.d.ts +10 -0
  12. package/build/services/topics/sql.js +80 -0
  13. package/build/services/topics/system-topics.d.ts +11 -0
  14. package/build/services/topics/system-topics.js +270 -0
  15. package/build/start/workers.js +5 -0
  16. package/build/system/mcp-servers/events.js +73 -1
  17. package/build/system/seed/tool-manifests-events.d.ts +75 -0
  18. package/build/system/seed/tool-manifests-events.js +27 -0
  19. package/build/tsconfig.tsbuildinfo +1 -1
  20. package/build/types/index.d.ts +2 -2
  21. package/build/types/startup.d.ts +27 -0
  22. package/dashboard/dist/assets/AdminDashboard-CbeSejVX.js +2 -0
  23. package/dashboard/dist/assets/{AdminDashboard-45Ya2uzl.js.map → AdminDashboard-CbeSejVX.js.map} +1 -1
  24. package/dashboard/dist/assets/AgentConfigPage-CFJNOrlg.js +13 -0
  25. package/dashboard/dist/assets/AgentConfigPage-CFJNOrlg.js.map +1 -0
  26. package/dashboard/dist/assets/AgentDetailPage-Dbx2t-Uk.js +4 -0
  27. package/dashboard/dist/assets/AgentDetailPage-Dbx2t-Uk.js.map +1 -0
  28. package/dashboard/dist/assets/{AgentsPage--I4d5y9J.js → AgentsPage-Bz61Nl-x.js} +2 -2
  29. package/dashboard/dist/assets/{AgentsPage--I4d5y9J.js.map → AgentsPage-Bz61Nl-x.js.map} +1 -1
  30. package/dashboard/dist/assets/AvailableEscalationsPage-DdrzePy4.js +2 -0
  31. package/dashboard/dist/assets/AvailableEscalationsPage-DdrzePy4.js.map +1 -0
  32. package/dashboard/dist/assets/{BotPicker-DgbzCesR.js → BotPicker-kKBifD1w.js} +2 -2
  33. package/dashboard/dist/assets/{BotPicker-DgbzCesR.js.map → BotPicker-kKBifD1w.js.map} +1 -1
  34. package/dashboard/dist/assets/{CapabilitiesPage-B2S8_Gsc.js → CapabilitiesPage-Ch5qY0I7.js} +2 -2
  35. package/dashboard/dist/assets/{CapabilitiesPage-B2S8_Gsc.js.map → CapabilitiesPage-Ch5qY0I7.js.map} +1 -1
  36. package/dashboard/dist/assets/{CollapsibleSection-4Eo3b5ha.js → CollapsibleSection-kYTBL7dT.js} +2 -2
  37. package/dashboard/dist/assets/{CollapsibleSection-4Eo3b5ha.js.map → CollapsibleSection-kYTBL7dT.js.map} +1 -1
  38. package/dashboard/dist/assets/{ConfirmDeleteModal-Bac7RmDD.js → ConfirmDeleteModal-CcaAapMl.js} +2 -2
  39. package/dashboard/dist/assets/{ConfirmDeleteModal-Bac7RmDD.js.map → ConfirmDeleteModal-CcaAapMl.js.map} +1 -1
  40. package/dashboard/dist/assets/{CopyableId-BhwdwAJN.js → CopyableId-B4CL12pv.js} +2 -2
  41. package/dashboard/dist/assets/{CopyableId-BhwdwAJN.js.map → CopyableId-B4CL12pv.js.map} +1 -1
  42. package/dashboard/dist/assets/{CredentialsPage-CSEBaYx1.js → CredentialsPage-D1VAlwid.js} +2 -2
  43. package/dashboard/dist/assets/{CredentialsPage-CSEBaYx1.js.map → CredentialsPage-D1VAlwid.js.map} +1 -1
  44. package/dashboard/dist/assets/{CronLabel-DV2v2FlP.js → CronLabel-DRmO5rH0.js} +2 -2
  45. package/dashboard/dist/assets/{CronLabel-DV2v2FlP.js.map → CronLabel-DRmO5rH0.js.map} +1 -1
  46. package/dashboard/dist/assets/CustomDurationPicker-C06QDDir.js +2 -0
  47. package/dashboard/dist/assets/{CustomDurationPicker-B_Oxq_nK.js.map → CustomDurationPicker-C06QDDir.js.map} +1 -1
  48. package/dashboard/dist/assets/{DataTable-etck0Zmp.js → DataTable-J5R6mepB.js} +2 -2
  49. package/dashboard/dist/assets/{DataTable-etck0Zmp.js.map → DataTable-J5R6mepB.js.map} +1 -1
  50. package/dashboard/dist/assets/{DropZone-BDpzHWsI.js → DropZone-DwNj3GiG.js} +2 -2
  51. package/dashboard/dist/assets/{DropZone-BDpzHWsI.js.map → DropZone-DwNj3GiG.js.map} +1 -1
  52. package/dashboard/dist/assets/{ElapsedCell-D35Z-HSJ.js → ElapsedCell-ChyMzl9n.js} +2 -2
  53. package/dashboard/dist/assets/{ElapsedCell-D35Z-HSJ.js.map → ElapsedCell-ChyMzl9n.js.map} +1 -1
  54. package/dashboard/dist/assets/{EmptyState-Bk3_P-b8.js → EmptyState-BXGvOADa.js} +2 -2
  55. package/dashboard/dist/assets/{EmptyState-Bk3_P-b8.js.map → EmptyState-BXGvOADa.js.map} +1 -1
  56. package/dashboard/dist/assets/{EscalationsOverview-Bt6gGFW4.js → EscalationsOverview-DM6zmE4g.js} +2 -2
  57. package/dashboard/dist/assets/{EscalationsOverview-Bt6gGFW4.js.map → EscalationsOverview-DM6zmE4g.js.map} +1 -1
  58. package/dashboard/dist/assets/{EventTable-BMk93q8A.js → EventTable-CvJ98E8s.js} +2 -2
  59. package/dashboard/dist/assets/{EventTable-BMk93q8A.js.map → EventTable-CvJ98E8s.js.map} +1 -1
  60. package/dashboard/dist/assets/{EventTopicPill-9LcMnLF0.js → EventTopicPill-CB_rIGlL.js} +2 -2
  61. package/dashboard/dist/assets/{EventTopicPill-9LcMnLF0.js.map → EventTopicPill-CB_rIGlL.js.map} +1 -1
  62. package/dashboard/dist/assets/{FilterBar-CZGTOMoo.js → FilterBar-Bdssa-Xn.js} +2 -2
  63. package/dashboard/dist/assets/{FilterBar-CZGTOMoo.js.map → FilterBar-Bdssa-Xn.js.map} +1 -1
  64. package/dashboard/dist/assets/{HomePage-Dtk7mgmf.js → HomePage-BuZkdXZt.js} +2 -2
  65. package/dashboard/dist/assets/{HomePage-Dtk7mgmf.js.map → HomePage-BuZkdXZt.js.map} +1 -1
  66. package/dashboard/dist/assets/{ListToolbar-CJEzypCM.js → ListToolbar-jy8NL6ll.js} +2 -2
  67. package/dashboard/dist/assets/{ListToolbar-CJEzypCM.js.map → ListToolbar-jy8NL6ll.js.map} +1 -1
  68. package/dashboard/dist/assets/{McpOverview-ChUa4l3t.js → McpOverview-xkaKuHbX.js} +2 -2
  69. package/dashboard/dist/assets/{McpOverview-ChUa4l3t.js.map → McpOverview-xkaKuHbX.js.map} +1 -1
  70. package/dashboard/dist/assets/{McpQueryDetailPage-04CTIN0v.js → McpQueryDetailPage-D5ICn6cR.js} +2 -2
  71. package/dashboard/dist/assets/{McpQueryDetailPage-04CTIN0v.js.map → McpQueryDetailPage-D5ICn6cR.js.map} +1 -1
  72. package/dashboard/dist/assets/{McpQueryPage-DFnHFdbr.js → McpQueryPage-C46fzfm5.js} +2 -2
  73. package/dashboard/dist/assets/{McpQueryPage-DFnHFdbr.js.map → McpQueryPage-C46fzfm5.js.map} +1 -1
  74. package/dashboard/dist/assets/McpRunDetailPage-Znsl4Yc-.js +2 -0
  75. package/dashboard/dist/assets/{McpRunDetailPage-B95c3bFw.js.map → McpRunDetailPage-Znsl4Yc-.js.map} +1 -1
  76. package/dashboard/dist/assets/{McpRunsPage-DS43YmLU.js → McpRunsPage-DT-armx5.js} +2 -2
  77. package/dashboard/dist/assets/{McpRunsPage-DS43YmLU.js.map → McpRunsPage-DT-armx5.js.map} +1 -1
  78. package/dashboard/dist/assets/{Modal-EUrK2c_A.js → Modal-C6k6_5KB.js} +2 -2
  79. package/dashboard/dist/assets/{Modal-EUrK2c_A.js.map → Modal-C6k6_5KB.js.map} +1 -1
  80. package/dashboard/dist/assets/{OperatorDashboard-DBF_AbRH.js → OperatorDashboard-e5N3_dVl.js} +2 -2
  81. package/dashboard/dist/assets/{OperatorDashboard-DBF_AbRH.js.map → OperatorDashboard-e5N3_dVl.js.map} +1 -1
  82. package/dashboard/dist/assets/{PageHeader-BuUnJ5NY.js → PageHeader-COcgWWf-.js} +2 -2
  83. package/dashboard/dist/assets/{PageHeader-BuUnJ5NY.js.map → PageHeader-COcgWWf-.js.map} +1 -1
  84. package/dashboard/dist/assets/{PageHeaderWithStats-cQKaJBAM.js → PageHeaderWithStats-C0PCY3aJ.js} +2 -2
  85. package/dashboard/dist/assets/{PageHeaderWithStats-cQKaJBAM.js.map → PageHeaderWithStats-C0PCY3aJ.js.map} +1 -1
  86. package/dashboard/dist/assets/{PriorityBadge-Bl0_pgex.js → PriorityBadge-BQCsYMpM.js} +2 -2
  87. package/dashboard/dist/assets/{PriorityBadge-Bl0_pgex.js.map → PriorityBadge-BQCsYMpM.js.map} +1 -1
  88. package/dashboard/dist/assets/ProcessDetailPage-C03LOgI0.js +2 -0
  89. package/dashboard/dist/assets/{ProcessDetailPage-DgeXrHon.js.map → ProcessDetailPage-C03LOgI0.js.map} +1 -1
  90. package/dashboard/dist/assets/{ProcessesListPage-BGiiH4dW.js → ProcessesListPage-iyPsmlhm.js} +2 -2
  91. package/dashboard/dist/assets/{ProcessesListPage-BGiiH4dW.js.map → ProcessesListPage-iyPsmlhm.js.map} +1 -1
  92. package/dashboard/dist/assets/{RolePill-DsYF2JN9.js → RolePill-CHwys1f9.js} +2 -2
  93. package/dashboard/dist/assets/{RolePill-DsYF2JN9.js.map → RolePill-CHwys1f9.js.map} +1 -1
  94. package/dashboard/dist/assets/{RolesPage-CQ7vPamb.js → RolesPage-Bmc3XaUk.js} +2 -2
  95. package/dashboard/dist/assets/{RolesPage-CQ7vPamb.js.map → RolesPage-Bmc3XaUk.js.map} +1 -1
  96. package/dashboard/dist/assets/{RowActions-DBpvm3Jy.js → RowActions-Bs4PF-Gd.js} +2 -2
  97. package/dashboard/dist/assets/{RowActions-DBpvm3Jy.js.map → RowActions-Bs4PF-Gd.js.map} +1 -1
  98. package/dashboard/dist/assets/{RunAsSelector-ZLKGTYP_.js → RunAsSelector-DXzAr2WW.js} +2 -2
  99. package/dashboard/dist/assets/{RunAsSelector-ZLKGTYP_.js.map → RunAsSelector-DXzAr2WW.js.map} +1 -1
  100. package/dashboard/dist/assets/{ServerName-B5-E7gZD.js → ServerName-BIdLC1Ay.js} +2 -2
  101. package/dashboard/dist/assets/{ServerName-B5-E7gZD.js.map → ServerName-BIdLC1Ay.js.map} +1 -1
  102. package/dashboard/dist/assets/{StatCard-B7ySTryP.js → StatCard-OKzRSSx4.js} +2 -2
  103. package/dashboard/dist/assets/{StatCard-B7ySTryP.js.map → StatCard-OKzRSSx4.js.map} +1 -1
  104. package/dashboard/dist/assets/{StatusBadge-DNXTk01O.js → StatusBadge-CQlF46RR.js} +2 -2
  105. package/dashboard/dist/assets/{StatusBadge-DNXTk01O.js.map → StatusBadge-CQlF46RR.js.map} +1 -1
  106. package/dashboard/dist/assets/{StepIndicator-ftNmaJsu.js → StepIndicator-CP7eycjI.js} +2 -2
  107. package/dashboard/dist/assets/{StepIndicator-ftNmaJsu.js.map → StepIndicator-CP7eycjI.js.map} +1 -1
  108. package/dashboard/dist/assets/{StickyPagination-CI5AyVVd.js → StickyPagination-CGk8VAKt.js} +2 -2
  109. package/dashboard/dist/assets/{StickyPagination-CI5AyVVd.js.map → StickyPagination-CGk8VAKt.js.map} +1 -1
  110. package/dashboard/dist/assets/{SwimlaneTimeline-BA4aFrHf.js → SwimlaneTimeline-MEUPc3yJ.js} +2 -2
  111. package/dashboard/dist/assets/{SwimlaneTimeline-BA4aFrHf.js.map → SwimlaneTimeline-MEUPc3yJ.js.map} +1 -1
  112. package/dashboard/dist/assets/{TagInput-DfbVwc27.js → TagInput-BGxXKiWD.js} +2 -2
  113. package/dashboard/dist/assets/{TagInput-DfbVwc27.js.map → TagInput-BGxXKiWD.js.map} +1 -1
  114. package/dashboard/dist/assets/{TaskDetailPage-A_kHjYRn.js → TaskDetailPage-pN5BXzYA.js} +2 -2
  115. package/dashboard/dist/assets/{TaskDetailPage-A_kHjYRn.js.map → TaskDetailPage-pN5BXzYA.js.map} +1 -1
  116. package/dashboard/dist/assets/{TaskQueuePill-Dtsa8CPO.js → TaskQueuePill-bw8ieKsf.js} +2 -2
  117. package/dashboard/dist/assets/{TaskQueuePill-Dtsa8CPO.js.map → TaskQueuePill-bw8ieKsf.js.map} +1 -1
  118. package/dashboard/dist/assets/{TasksListPage-Cw46VTuA.js → TasksListPage-D1INzcrA.js} +2 -2
  119. package/dashboard/dist/assets/{TasksListPage-Cw46VTuA.js.map → TasksListPage-D1INzcrA.js.map} +1 -1
  120. package/dashboard/dist/assets/{TimeAgo-Cx1kK1id.js → TimeAgo-CywLVIBA.js} +2 -2
  121. package/dashboard/dist/assets/{TimeAgo-Cx1kK1id.js.map → TimeAgo-CywLVIBA.js.map} +1 -1
  122. package/dashboard/dist/assets/{TimestampCell-VDp4nVn6.js → TimestampCell-B4Pc6f3A.js} +2 -2
  123. package/dashboard/dist/assets/{TimestampCell-VDp4nVn6.js.map → TimestampCell-B4Pc6f3A.js.map} +1 -1
  124. package/dashboard/dist/assets/{ToolPill-BNaTJhu8.js → ToolPill-DdLN3JOT.js} +2 -2
  125. package/dashboard/dist/assets/{ToolPill-BNaTJhu8.js.map → ToolPill-DdLN3JOT.js.map} +1 -1
  126. package/dashboard/dist/assets/{ToolTestPanel-BickLBjP.js → ToolTestPanel-DusbUka5.js} +2 -2
  127. package/dashboard/dist/assets/{ToolTestPanel-BickLBjP.js.map → ToolTestPanel-DusbUka5.js.map} +1 -1
  128. package/dashboard/dist/assets/TopicDetailPage-DadwM52Y.js +9 -0
  129. package/dashboard/dist/assets/TopicDetailPage-DadwM52Y.js.map +1 -0
  130. package/dashboard/dist/assets/TopicsPage-DbtrnQON.js +2 -0
  131. package/dashboard/dist/assets/TopicsPage-DbtrnQON.js.map +1 -0
  132. package/dashboard/dist/assets/{UserName-DCdb6xnk.js → UserName-CLbusknU.js} +2 -2
  133. package/dashboard/dist/assets/{UserName-DCdb6xnk.js.map → UserName-CLbusknU.js.map} +1 -1
  134. package/dashboard/dist/assets/{WorkflowExecutionPage-BZfxY1iB.js → WorkflowExecutionPage-C61R-3Gg.js} +2 -2
  135. package/dashboard/dist/assets/{WorkflowExecutionPage-BZfxY1iB.js.map → WorkflowExecutionPage-C61R-3Gg.js.map} +1 -1
  136. package/dashboard/dist/assets/{WorkflowPill-BzhfqGa-.js → WorkflowPill-7vt2F6wR.js} +2 -2
  137. package/dashboard/dist/assets/{WorkflowPill-BzhfqGa-.js.map → WorkflowPill-7vt2F6wR.js.map} +1 -1
  138. package/dashboard/dist/assets/{WorkflowsDashboard-B7M8kPoH.js → WorkflowsDashboard-BWiUNvyl.js} +2 -2
  139. package/dashboard/dist/assets/{WorkflowsDashboard-B7M8kPoH.js.map → WorkflowsDashboard-BWiUNvyl.js.map} +1 -1
  140. package/dashboard/dist/assets/{WorkflowsOverview-1V8vQ-mo.js → WorkflowsOverview-DA2ZOs7D.js} +2 -2
  141. package/dashboard/dist/assets/{WorkflowsOverview-1V8vQ-mo.js.map → WorkflowsOverview-DA2ZOs7D.js.map} +1 -1
  142. package/dashboard/dist/assets/YamlWorkflowsPage-CLebf2eL.js +2 -0
  143. package/dashboard/dist/assets/YamlWorkflowsPage-CLebf2eL.js.map +1 -0
  144. package/dashboard/dist/assets/{agents-SXs4tMLb.js → agents-Dga6NU7U.js} +2 -2
  145. package/dashboard/dist/assets/{agents-SXs4tMLb.js.map → agents-Dga6NU7U.js.map} +1 -1
  146. package/dashboard/dist/assets/{bots-Ci5aCzDK.js → bots-CtU4i4OQ.js} +2 -2
  147. package/dashboard/dist/assets/{bots-Ci5aCzDK.js.map → bots-CtU4i4OQ.js.map} +1 -1
  148. package/dashboard/dist/assets/{controlplane-BiPTCZeL.js → controlplane-BVoALhbL.js} +2 -2
  149. package/dashboard/dist/assets/{controlplane-BiPTCZeL.js.map → controlplane-BVoALhbL.js.map} +1 -1
  150. package/dashboard/dist/assets/escalation-_N5GfuIi.js +2 -0
  151. package/dashboard/dist/assets/escalation-_N5GfuIi.js.map +1 -0
  152. package/dashboard/dist/assets/{escalation-columns-Bpp7Sdbd.js → escalation-columns-CoTmTpHp.js} +2 -2
  153. package/dashboard/dist/assets/escalation-columns-CoTmTpHp.js.map +1 -0
  154. package/dashboard/dist/assets/{helpers-CQZkvg6D.js → helpers-Dz2U3Ctb.js} +2 -2
  155. package/dashboard/dist/assets/{helpers-CQZkvg6D.js.map → helpers-Dz2U3Ctb.js.map} +1 -1
  156. package/dashboard/dist/assets/{index-C7FUIcaY.js → index-6Kd78p_v.js} +2 -2
  157. package/dashboard/dist/assets/{index-C7FUIcaY.js.map → index-6Kd78p_v.js.map} +1 -1
  158. package/dashboard/dist/assets/{index-DOE7HCzb.js → index-B9ealjkt.js} +4 -4
  159. package/dashboard/dist/assets/{index-DOE7HCzb.js.map → index-B9ealjkt.js.map} +1 -1
  160. package/dashboard/dist/assets/index-BIUHY2Jz.css +1 -0
  161. package/dashboard/dist/assets/{index-hfravTJF.js → index-BWHDW_CF.js} +2 -2
  162. package/dashboard/dist/assets/{index-hfravTJF.js.map → index-BWHDW_CF.js.map} +1 -1
  163. package/dashboard/dist/assets/{index-DtbAmRkr.js → index-BYwPVJv0.js} +2 -2
  164. package/dashboard/dist/assets/{index-DtbAmRkr.js.map → index-BYwPVJv0.js.map} +1 -1
  165. package/dashboard/dist/assets/index-CCOSf1PY.js +281 -0
  166. package/dashboard/dist/assets/index-CCOSf1PY.js.map +1 -0
  167. package/dashboard/dist/assets/{index-DV0_tQW3.js → index-CS61sh5q.js} +2 -2
  168. package/dashboard/dist/assets/{index-DV0_tQW3.js.map → index-CS61sh5q.js.map} +1 -1
  169. package/dashboard/dist/assets/index-CtbG3UN-.js +5 -0
  170. package/dashboard/dist/assets/index-CtbG3UN-.js.map +1 -0
  171. package/dashboard/dist/assets/{index-CSsOukxa.js → index-DWUunWxh.js} +2 -2
  172. package/dashboard/dist/assets/{index-CSsOukxa.js.map → index-DWUunWxh.js.map} +1 -1
  173. package/dashboard/dist/assets/{index-COiEQlp9.js → index-D_H_Prht.js} +2 -2
  174. package/dashboard/dist/assets/{index-COiEQlp9.js.map → index-D_H_Prht.js.map} +1 -1
  175. package/dashboard/dist/assets/{index-q4T_i7zT.js → index-Dpjguclc.js} +2 -2
  176. package/dashboard/dist/assets/{index-q4T_i7zT.js.map → index-Dpjguclc.js.map} +1 -1
  177. package/dashboard/dist/assets/{index-OTsFiHXP.js → index-QicYdUsl.js} +2 -2
  178. package/dashboard/dist/assets/index-QicYdUsl.js.map +1 -0
  179. package/dashboard/dist/assets/{index-Bp5f2OWJ.js → index-dM-OgCY3.js} +2 -2
  180. package/dashboard/dist/assets/{index-Bp5f2OWJ.js.map → index-dM-OgCY3.js.map} +1 -1
  181. package/dashboard/dist/assets/{knowledge-D8osen1O.js → knowledge-DJlebU82.js} +2 -2
  182. package/dashboard/dist/assets/{knowledge-D8osen1O.js.map → knowledge-DJlebU82.js.map} +1 -1
  183. package/dashboard/dist/assets/{mcp-CUFhWTyT.js → mcp-CsLJ5SRm.js} +2 -2
  184. package/dashboard/dist/assets/{mcp-CUFhWTyT.js.map → mcp-CsLJ5SRm.js.map} +1 -1
  185. package/dashboard/dist/assets/{mcp-query-n1t4sNm7.js → mcp-query-WNK1ItRV.js} +2 -2
  186. package/dashboard/dist/assets/{mcp-query-n1t4sNm7.js.map → mcp-query-WNK1ItRV.js.map} +1 -1
  187. package/dashboard/dist/assets/{mcp-runs-BkRnXbcq.js → mcp-runs-DtTTsuPH.js} +2 -2
  188. package/dashboard/dist/assets/{mcp-runs-BkRnXbcq.js.map → mcp-runs-DtTTsuPH.js.map} +1 -1
  189. package/dashboard/dist/assets/{namespaces-CacF05ft.js → namespaces-iRejH3_A.js} +2 -2
  190. package/dashboard/dist/assets/{namespaces-CacF05ft.js.map → namespaces-iRejH3_A.js.map} +1 -1
  191. package/dashboard/dist/assets/{roles-CjLCgM_6.js → roles-3Jm5KtKc.js} +2 -2
  192. package/dashboard/dist/assets/{roles-CjLCgM_6.js.map → roles-3Jm5KtKc.js.map} +1 -1
  193. package/dashboard/dist/assets/settings-DmN2I-c6.js +2 -0
  194. package/dashboard/dist/assets/settings-DmN2I-c6.js.map +1 -0
  195. package/dashboard/dist/assets/{tasks-BLCzIHol.js → tasks-Cc-QoITQ.js} +2 -2
  196. package/dashboard/dist/assets/{tasks-BLCzIHol.js.map → tasks-Cc-QoITQ.js.map} +1 -1
  197. package/dashboard/dist/assets/topics-p8anbgi0.js +2 -0
  198. package/dashboard/dist/assets/topics-p8anbgi0.js.map +1 -0
  199. package/dashboard/dist/assets/{useEventHooks-AwwZnweF.js → useEventHooks-VaJ52jMm.js} +2 -2
  200. package/dashboard/dist/assets/{useEventHooks-AwwZnweF.js.map → useEventHooks-VaJ52jMm.js.map} +1 -1
  201. package/dashboard/dist/assets/{useYamlActivityEvents-9Zs0PXY6.js → useYamlActivityEvents-BU4Uhksl.js} +2 -2
  202. package/dashboard/dist/assets/{useYamlActivityEvents-9Zs0PXY6.js.map → useYamlActivityEvents-BU4Uhksl.js.map} +1 -1
  203. package/dashboard/dist/assets/{users-BtLRzvZE.js → users-oXOlnold.js} +2 -2
  204. package/dashboard/dist/assets/{users-BtLRzvZE.js.map → users-oXOlnold.js.map} +1 -1
  205. package/dashboard/dist/assets/{vendor-icons-1qQ3NKfa.js → vendor-icons-CBOM6Es0.js} +99 -94
  206. package/dashboard/dist/assets/vendor-icons-CBOM6Es0.js.map +1 -0
  207. package/dashboard/dist/assets/{workflows-B9xdIsfM.js → workflows-Yq7cK-vR.js} +2 -2
  208. package/dashboard/dist/assets/{workflows-B9xdIsfM.js.map → workflows-Yq7cK-vR.js.map} +1 -1
  209. package/dashboard/dist/assets/{yaml-workflows-xOJxyEsQ.js → yaml-workflows-Ch53yD43.js} +2 -2
  210. package/dashboard/dist/assets/{yaml-workflows-xOJxyEsQ.js.map → yaml-workflows-Ch53yD43.js.map} +1 -1
  211. package/dashboard/dist/index.html +3 -3
  212. package/docs/agents.md +6 -0
  213. package/docs/api/http/topics.md +164 -0
  214. package/docs/api/sdk/topics.md +204 -0
  215. package/docs/dashboard.md +22 -0
  216. package/docs/events.md +7 -0
  217. package/docs/sdk.md +15 -0
  218. package/docs/topics.md +154 -0
  219. package/package.json +2 -2
  220. package/dashboard/dist/assets/AdminDashboard-45Ya2uzl.js +0 -2
  221. package/dashboard/dist/assets/AgentConfigPage-BOASC5vi.js +0 -13
  222. package/dashboard/dist/assets/AgentConfigPage-BOASC5vi.js.map +0 -1
  223. package/dashboard/dist/assets/AgentDetailPage-5M7JTcFz.js +0 -4
  224. package/dashboard/dist/assets/AgentDetailPage-5M7JTcFz.js.map +0 -1
  225. package/dashboard/dist/assets/AvailableEscalationsPage-CXUkRz18.js +0 -2
  226. package/dashboard/dist/assets/AvailableEscalationsPage-CXUkRz18.js.map +0 -1
  227. package/dashboard/dist/assets/CustomDurationPicker-B_Oxq_nK.js +0 -2
  228. package/dashboard/dist/assets/McpRunDetailPage-B95c3bFw.js +0 -2
  229. package/dashboard/dist/assets/ProcessDetailPage-DgeXrHon.js +0 -2
  230. package/dashboard/dist/assets/YamlWorkflowsPage-BteCRoV5.js +0 -2
  231. package/dashboard/dist/assets/YamlWorkflowsPage-BteCRoV5.js.map +0 -1
  232. package/dashboard/dist/assets/escalation-D-zr9D9G.js +0 -2
  233. package/dashboard/dist/assets/escalation-D-zr9D9G.js.map +0 -1
  234. package/dashboard/dist/assets/escalation-columns-Bpp7Sdbd.js.map +0 -1
  235. package/dashboard/dist/assets/index-BciXgS35.css +0 -1
  236. package/dashboard/dist/assets/index-Da8R5Fn_.js +0 -281
  237. package/dashboard/dist/assets/index-Da8R5Fn_.js.map +0 -1
  238. package/dashboard/dist/assets/index-DzL5pT70.js +0 -5
  239. package/dashboard/dist/assets/index-DzL5pT70.js.map +0 -1
  240. package/dashboard/dist/assets/index-OTsFiHXP.js.map +0 -1
  241. package/dashboard/dist/assets/vendor-icons-1qQ3NKfa.js.map +0 -1
@@ -0,0 +1,164 @@
1
+ # Topics API
2
+
3
+ Browse, register, and manage the topic catalog — a persistent registry of known event topics with descriptions, payload schemas, and subscriber counts.
4
+
5
+ All endpoints require authentication.
6
+
7
+ ## List topics
8
+
9
+ ```
10
+ GET /api/topics?category=task&search=created&limit=50&offset=0
11
+ ```
12
+
13
+ Returns topics with subscriber counts (computed via JOIN on active subscriptions).
14
+
15
+ | Parameter | Type | Required | Description |
16
+ |-----------|------|----------|-------------|
17
+ | `category` | `string` | No | Filter by category: `task`, `workflow`, `escalation`, `activity`, `knowledge`, `agent`, `app`, `milestone` |
18
+ | `search` | `string` | No | Search topic name or description (case-insensitive) |
19
+ | `limit` | `number` | No | Max results (default: 50) |
20
+ | `offset` | `number` | No | Pagination offset |
21
+
22
+ **Response 200:**
23
+
24
+ ```json
25
+ {
26
+ "topics": [
27
+ {
28
+ "topic": "task.created",
29
+ "description": "A new task has been created and queued for execution.",
30
+ "category": "task",
31
+ "payload_schema": {
32
+ "type": "object",
33
+ "properties": {
34
+ "taskId": { "type": "string" },
35
+ "status": { "type": "string" },
36
+ "workflowId": { "type": "string" }
37
+ }
38
+ },
39
+ "example_payload": { "taskId": "tsk-001", "status": "pending" },
40
+ "source": "system",
41
+ "tags": ["lifecycle", "core"],
42
+ "subscriber_count": 2,
43
+ "last_seen_at": "2026-05-20T12:00:00Z",
44
+ "created_at": "2026-05-20T00:00:00Z",
45
+ "updated_at": "2026-05-20T00:00:00Z"
46
+ }
47
+ ],
48
+ "total": 22
49
+ }
50
+ ```
51
+
52
+ ## Get topic
53
+
54
+ ```
55
+ GET /api/topics/by-name/:topic
56
+ ```
57
+
58
+ Returns a single topic with its full schema, example payload, and a list of agents whose subscription patterns match this topic.
59
+
60
+ The `:topic` parameter must be URL-encoded (e.g., `task.created` becomes `task.created` — Express auto-decodes).
61
+
62
+ **Response 200:**
63
+
64
+ ```json
65
+ {
66
+ "topic": "task.created",
67
+ "description": "A new task has been created and queued for execution.",
68
+ "category": "task",
69
+ "payload_schema": { "..." },
70
+ "example_payload": { "..." },
71
+ "source": "system",
72
+ "tags": ["lifecycle", "core"],
73
+ "subscribers": [
74
+ {
75
+ "id": "uuid",
76
+ "agent_id": "uuid",
77
+ "agent_name": "health-monitor",
78
+ "topic": "task.*",
79
+ "reaction_type": "durable"
80
+ }
81
+ ],
82
+ "created_at": "2026-05-20T00:00:00Z",
83
+ "updated_at": "2026-05-20T00:00:00Z"
84
+ }
85
+ ```
86
+
87
+ Subscribers are matched using NATS-style pattern matching — an agent subscribed to `task.*` appears on the `task.created` detail page.
88
+
89
+ **Response 404:** `{ "error": "Topic not found" }`
90
+
91
+ ## Register topic
92
+
93
+ ```
94
+ POST /api/topics
95
+ ```
96
+
97
+ Manually register a topic in the catalog. Use this to pre-declare topics before first publish.
98
+
99
+ **Body:**
100
+
101
+ ```json
102
+ {
103
+ "topic": "app.vendor.orders.created",
104
+ "description": "Fired when a new order is placed.",
105
+ "category": "app",
106
+ "payload_schema": {
107
+ "type": "object",
108
+ "properties": {
109
+ "orderId": { "type": "string" },
110
+ "total": { "type": "number" }
111
+ }
112
+ },
113
+ "tags": ["orders", "lifecycle"]
114
+ }
115
+ ```
116
+
117
+ | Field | Type | Required | Description |
118
+ |-------|------|----------|-------------|
119
+ | `topic` | `string` | Yes | Unique topic name (dot-delimited) |
120
+ | `category` | `string` | Yes | One of: `task`, `workflow`, `escalation`, `activity`, `knowledge`, `agent`, `app`, `milestone` |
121
+ | `description` | `string` | No | Human-readable description |
122
+ | `payload_schema` | `object` | No | JSON Schema for `event.data` |
123
+ | `example_payload` | `object` | No | Concrete example of `event.data` |
124
+ | `source` | `string` | No | Source identifier (default: `'app'`) |
125
+ | `tags` | `string[]` | No | Filterable tags |
126
+
127
+ **Response 201:** The created topic.
128
+
129
+ **Response 409:** `{ "error": "Topic \"app.vendor.orders.created\" already exists" }`
130
+
131
+ ## Update topic
132
+
133
+ ```
134
+ PUT /api/topics/by-name/:topic
135
+ ```
136
+
137
+ Partial update — only include fields to change. System topics (`source: 'system'`) can be updated (description, tags) but not deleted.
138
+
139
+ **Body:**
140
+
141
+ ```json
142
+ {
143
+ "description": "Updated description",
144
+ "tags": ["orders", "lifecycle", "critical"]
145
+ }
146
+ ```
147
+
148
+ **Response 200:** The updated topic.
149
+
150
+ **Response 404:** `{ "error": "Topic not found" }`
151
+
152
+ ## Delete topic
153
+
154
+ ```
155
+ DELETE /api/topics/by-name/:topic
156
+ ```
157
+
158
+ Permanently removes a topic from the catalog. System topics are protected.
159
+
160
+ **Response 200:** `{ "deleted": true }`
161
+
162
+ **Response 403:** `{ "error": "System topics cannot be deleted" }`
163
+
164
+ **Response 404:** `{ "error": "Topic not found" }`
@@ -0,0 +1,204 @@
1
+ # TopicService
2
+
3
+ Topic catalog operations — browse, register, and manage event topic definitions.
4
+
5
+ Imported as a namespace:
6
+
7
+ ```typescript
8
+ import { TopicService } from '@hotmeshio/long-tail';
9
+ ```
10
+
11
+ ## listTopics
12
+
13
+ List topics with optional filters.
14
+
15
+ ```typescript
16
+ const result = await TopicService.listTopics({
17
+ category: 'task',
18
+ search: 'failed',
19
+ limit: 50,
20
+ offset: 0,
21
+ });
22
+ // result.topics: TopicCatalogEntry[]
23
+ // result.total: number
24
+ ```
25
+
26
+ | Parameter | Type | Required | Description |
27
+ |-----------|------|----------|-------------|
28
+ | `category` | `string` | No | Filter by category |
29
+ | `search` | `string` | No | Search name or description |
30
+ | `limit` | `number` | No | Max results (default: 50) |
31
+ | `offset` | `number` | No | Pagination offset |
32
+
33
+ **Returns:** `{ topics: TopicCatalogEntry[], total: number }`
34
+
35
+ ## getTopic
36
+
37
+ Get a single topic with its subscriber list.
38
+
39
+ ```typescript
40
+ const topic = await TopicService.getTopic('task.created');
41
+ // topic.payload_schema — JSON Schema for event.data
42
+ // topic.subscribers — agents whose patterns match this topic
43
+ ```
44
+
45
+ **Returns:** `TopicCatalogEntry & { subscribers: TopicSubscriber[] }` or `null`
46
+
47
+ Subscribers are matched using NATS-style pattern matching. An agent subscribed to `task.*` appears in the `task.created` subscriber list.
48
+
49
+ ## createTopic
50
+
51
+ Register a new topic in the catalog.
52
+
53
+ ```typescript
54
+ const entry = await TopicService.createTopic({
55
+ topic: 'app.vendor.orders.created',
56
+ description: 'Fired when a new order is placed.',
57
+ category: 'app',
58
+ payload_schema: {
59
+ type: 'object',
60
+ properties: {
61
+ orderId: { type: 'string' },
62
+ total: { type: 'number' },
63
+ },
64
+ },
65
+ tags: ['orders', 'lifecycle'],
66
+ });
67
+ ```
68
+
69
+ | Parameter | Type | Required | Description |
70
+ |-----------|------|----------|-------------|
71
+ | `topic` | `string` | Yes | Unique topic name |
72
+ | `category` | `string` | Yes | Topic category |
73
+ | `description` | `string` | No | Human-readable description |
74
+ | `payload_schema` | `object` | No | JSON Schema for `event.data` |
75
+ | `example_payload` | `object` | No | Example `event.data` |
76
+ | `source` | `string` | No | Source identifier (default: `'app'`) |
77
+ | `tags` | `string[]` | No | Tags for filtering |
78
+
79
+ **Returns:** `TopicCatalogEntry`
80
+
81
+ **Throws:** Postgres unique violation if topic already exists.
82
+
83
+ ## updateTopic
84
+
85
+ Partial update of a topic's metadata.
86
+
87
+ ```typescript
88
+ const updated = await TopicService.updateTopic('app.vendor.orders.created', {
89
+ description: 'Updated description',
90
+ tags: ['orders', 'critical'],
91
+ });
92
+ ```
93
+
94
+ **Returns:** `TopicCatalogEntry | null`
95
+
96
+ ## deleteTopic
97
+
98
+ Delete a topic. The SQL guards against deleting system topics (`source != 'system'`).
99
+
100
+ ```typescript
101
+ const deleted = await TopicService.deleteTopic('app.vendor.orders.created');
102
+ // deleted: true/false
103
+ ```
104
+
105
+ **Returns:** `boolean`
106
+
107
+ ## seedTopic
108
+
109
+ Insert-if-absent. Used at startup for first-boot seeding.
110
+
111
+ ```typescript
112
+ const inserted = await TopicService.seedTopic({
113
+ topic: 'app.orders.created',
114
+ description: 'New order placed',
115
+ category: 'app',
116
+ tags: ['orders'],
117
+ });
118
+ // inserted: true if new, false if already existed
119
+ ```
120
+
121
+ **Returns:** `boolean`
122
+
123
+ ## resetTopic
124
+
125
+ Upsert from config — overwrites description, category, schema, and tags on every call. Used when `reset: true` is set in static config.
126
+
127
+ ```typescript
128
+ await TopicService.resetTopic({
129
+ topic: 'app.orders.created',
130
+ description: 'New order placed (updated)',
131
+ category: 'app',
132
+ payload_schema: { type: 'object', properties: { orderId: { type: 'string' } } },
133
+ });
134
+ ```
135
+
136
+ **Returns:** `void`
137
+
138
+ ## upsertTopicOnPublish
139
+
140
+ Auto-register or update a topic when an event is published. Creates the entry on first publish; updates `last_seen_at` and `example_payload` on subsequent publishes.
141
+
142
+ ```typescript
143
+ await TopicService.upsertTopicOnPublish(
144
+ 'app.vendor.orders.error',
145
+ { orderId: '123', error: 'timeout' }, // example data
146
+ 'order-processor', // source
147
+ );
148
+ ```
149
+
150
+ Called automatically by the `publish_event` MCP tool. You only need this for manual publish paths.
151
+
152
+ **Returns:** `void`
153
+
154
+ ---
155
+
156
+ ## Types
157
+
158
+ ### TopicCatalogEntry
159
+
160
+ ```typescript
161
+ interface TopicCatalogEntry {
162
+ topic: string;
163
+ description?: string;
164
+ category: string;
165
+ payload_schema?: Record<string, any>;
166
+ example_payload?: Record<string, any>;
167
+ source: string; // 'system', 'config', 'app', 'mcp-tool'
168
+ tags: string[];
169
+ subscriber_count?: number; // populated by listTopics
170
+ last_seen_at?: string; // ISO 8601, updated on each publish
171
+ created_at: string;
172
+ updated_at: string;
173
+ }
174
+ ```
175
+
176
+ ### TopicSubscriber
177
+
178
+ ```typescript
179
+ interface TopicSubscriber {
180
+ id: string;
181
+ agent_id: string;
182
+ agent_name: string;
183
+ topic: string; // the subscription pattern
184
+ reaction_type: string; // 'durable', 'pipeline', 'mcp_query'
185
+ }
186
+ ```
187
+
188
+ ## Seeding helpers
189
+
190
+ For advanced startup flows, two seeding functions are also exported from the package root:
191
+
192
+ ```typescript
193
+ import { seedSystemTopics, seedConfigTopics } from '@hotmeshio/long-tail';
194
+
195
+ // Seed the 22 built-in system topics
196
+ await seedSystemTopics();
197
+
198
+ // Seed user-declared topics (respects reset: true)
199
+ await seedConfigTopics([
200
+ { topic: 'app.orders.created', description: 'Order placed', reset: true },
201
+ ]);
202
+ ```
203
+
204
+ These are called automatically by `start()`. You only need them if you're building a custom startup flow.
package/docs/dashboard.md CHANGED
@@ -23,6 +23,15 @@ The sidebar organizes pages into five groups.
23
23
  | **MCP Pipeline Tools** | `/mcp/workflows` | YAML pipeline tools available to the orchestrator. Shows compiled deterministic workflows. |
24
24
  | **Pipeline Executions** | `/mcp/executions` | Execution history for MCP pipelines — both dynamic (agentic) and compiled (deterministic) runs. |
25
25
 
26
+ ### Work
27
+
28
+ | Page | Route | Purpose |
29
+ |------|-------|---------|
30
+ | **Recent Activity** | `/` | Live event stream and business process overview. |
31
+ | **Capabilities** | `/capabilities` | Browse MCP servers grouped by capability category. |
32
+ | **Agents** | `/agents` | Autonomous event-driven agents. Configure subscriptions, schedules, and knowledge domains. |
33
+ | **Topics** | `/topics` | Topic catalog — browse all known event topics with descriptions, schemas, and subscriber counts. |
34
+
26
35
  ### Storage
27
36
 
28
37
  | Page | Route | Purpose |
@@ -283,6 +292,19 @@ Knowledge entries are accessed by workflows via the `get_knowledge` MCP tool. Th
283
292
 
284
293
  **API:** `GET /api/knowledge` lists entries. `PUT /api/knowledge/:domain/:key` creates or updates. `DELETE /api/knowledge/:domain/:key` removes.
285
294
 
295
+ ### Topic Catalog
296
+
297
+ The persistent registry of all known event topics. Browse, search, and inspect what the event bus carries.
298
+
299
+ - **Topic list** — all registered topics with category pills, descriptions, subscriber counts, and last-seen timestamps. Filter by category (task, workflow, escalation, activity, knowledge, agent, app, milestone).
300
+ - **Topic detail** — click any topic to see its full payload schema (JSON Schema), example payload, tags, and a list of agents whose subscription patterns match the topic.
301
+ - **Subscriber discovery** — the detail page uses NATS-style pattern matching to show all agents that would receive this event. An agent subscribed to `task.*` appears on every `task.created`, `task.failed`, etc. detail page.
302
+ - **Schema preview in subscriptions** — when editing an agent's subscriptions, selecting a topic from the catalog shows its payload schema inline, so you know what `{event.data.*}` fields are available for input mapping.
303
+
304
+ Topics enter the catalog three ways: system topics are seeded at startup (22 built-in), config topics are declared in `startConfig.topics[]`, and runtime topics are auto-discovered when `publish_event` fires for the first time.
305
+
306
+ **API:** `GET /api/topics` lists topics. `GET /api/topics/by-name/:topic` returns detail with subscribers. `POST /api/topics` registers a new topic. See [Topics HTTP API](api/http/topics.md) and [TopicService SDK](api/sdk/topics.md).
307
+
286
308
  ### Credentials
287
309
 
288
310
  Accessible via the user menu (or at `/credentials`). Manage OAuth provider connections and API keys for the current user.
package/docs/events.md CHANGED
@@ -296,3 +296,10 @@ The activity interceptor inspects every activity result. If the result contains
296
296
  ### Delivery Semantics
297
297
 
298
298
  All three call sites use `publishMilestoneEvent()`, which is fire-and-forget. It returns immediately, never throws, and swallows errors. Events are a non-durable side effect: they are not replayed on workflow recovery. If the process crashes between task completion and event publication, the event is lost. Design downstream consumers accordingly.
299
+
300
+ ## Related
301
+
302
+ - [Topic Catalog](topics.md) — persistent registry of known topics with schemas and discovery
303
+ - [Agents: Subscriptions](agents.md#subscriptions) — wiring topics to reactive workflows
304
+ - [Topics HTTP API](api/http/topics.md) — REST endpoints for the catalog
305
+ - [Topics SDK](api/sdk/topics.md) — `TopicService` programmatic access
package/docs/sdk.md CHANGED
@@ -81,6 +81,21 @@ The client mirrors the REST route structure:
81
81
  | `lt.namespaces` | `/api/namespaces` | `list`, `register` |
82
82
  | `lt.maintenance` | `/api/config/maintenance` | `getConfig`, `updateConfig` |
83
83
 
84
+ ### Direct imports
85
+
86
+ Some services are exported as namespaces for direct import rather than through the client:
87
+
88
+ ```typescript
89
+ import { TopicService } from '@hotmeshio/long-tail';
90
+
91
+ const { topics, total } = await TopicService.listTopics({ category: 'task' });
92
+ const detail = await TopicService.getTopic('task.created');
93
+ ```
94
+
95
+ | Import | Key operations | Docs |
96
+ |--------|---------------|------|
97
+ | `TopicService` | `listTopics`, `getTopic`, `createTopic`, `updateTopic`, `deleteTopic`, `seedTopic`, `resetTopic` | [TopicService](api/sdk/topics.md) |
98
+
84
99
  ## Events
85
100
 
86
101
  The SDK includes a callback-based event adapter. Subscribe to events directly — no socket.io client, no WebSocket connection.
package/docs/topics.md ADDED
@@ -0,0 +1,154 @@
1
+ # Topic Catalog
2
+
3
+ The topic catalog is a persistent registry of known event topics. Every topic has a name, description, payload schema, and metadata — making the event bus discoverable, documented, and queryable.
4
+
5
+ Topics are the foundation of agentic automation. Agents subscribe to topics and react when events fire. The catalog tells agents (and humans) what topics exist, what data they carry, and who's listening.
6
+
7
+ ## How topics enter the catalog
8
+
9
+ Topics arrive through three paths:
10
+
11
+ ### 1. System topics (built-in)
12
+
13
+ The platform seeds 22 system topics at startup — one for every `LTEventType`. These describe the lifecycle events the platform emits automatically: task, workflow, escalation, activity, knowledge, agent, and milestone events.
14
+
15
+ System topics are read-only. They can't be deleted or renamed. Their schemas are derived directly from the publish helpers in the source code.
16
+
17
+ ### 2. Config topics (declared in code)
18
+
19
+ Projects declare topics in `startConfig.topics[]`. This is the primary way applications document what they publish:
20
+
21
+ ```typescript
22
+ import { start } from '@hotmeshio/long-tail';
23
+
24
+ await start({
25
+ database: { connectionString: process.env.DATABASE_URL },
26
+ workers: [{ taskQueue: 'orders', workflow: processOrder }],
27
+
28
+ topics: [
29
+ {
30
+ topic: 'app.orders.created',
31
+ description: 'Fired when a new order is placed.',
32
+ payload_schema: {
33
+ type: 'object',
34
+ properties: {
35
+ orderId: { type: 'string' },
36
+ total: { type: 'number' },
37
+ customer: { type: 'string' },
38
+ },
39
+ },
40
+ example_payload: { orderId: 'ord-123', total: 99.99, customer: 'acme' },
41
+ tags: ['orders', 'lifecycle'],
42
+ },
43
+ {
44
+ topic: 'app.orders.failed',
45
+ description: 'Fired when order processing fails.',
46
+ payload_schema: {
47
+ type: 'object',
48
+ properties: {
49
+ orderId: { type: 'string' },
50
+ error: { type: 'string' },
51
+ },
52
+ },
53
+ tags: ['orders', 'error'],
54
+ reset: true, // config is source of truth — overwrite DB on every boot
55
+ },
56
+ ],
57
+ });
58
+ ```
59
+
60
+ Config topics are seeded on first boot (insert-if-absent). The database owns the record after that — dashboard edits stick.
61
+
62
+ ### 3. Runtime topics (auto-discovered)
63
+
64
+ When the `publish_event` MCP tool fires with a topic that isn't in the catalog, the system auto-registers it. The topic appears in the catalog with the payload as an example. This is learn-on-first-use — topics accumulate over time.
65
+
66
+ ## The reset flag
67
+
68
+ By default, config topics follow insert-if-absent semantics. Once seeded, the database owns the record. Dashboard edits persist across restarts.
69
+
70
+ Set `reset: true` to make config the source of truth:
71
+
72
+ ```typescript
73
+ {
74
+ topic: 'app.orders.created',
75
+ description: 'Updated description from code',
76
+ reset: true,
77
+ }
78
+ ```
79
+
80
+ With `reset: true`:
81
+ - Every boot overwrites description, schema, tags from the config
82
+ - Dashboard edits are transient — next deploy resets them
83
+ - The topic definition lives in git, reviewed in PRs, enforced by CI/CD
84
+
85
+ Without `reset`:
86
+ - First boot seeds the record
87
+ - Dashboard edits persist
88
+ - Config changes in code are ignored after first boot
89
+
90
+ ## Topic naming
91
+
92
+ Topics are dot-delimited strings. The convention:
93
+
94
+ | Prefix | Who publishes | Example |
95
+ |--------|--------------|---------|
96
+ | `task.*` | Platform (automatic) | `task.created`, `task.failed` |
97
+ | `workflow.*` | Platform (automatic) | `workflow.completed` |
98
+ | `escalation.*` | Platform (automatic) | `escalation.resolved` |
99
+ | `activity.*` | Platform (automatic) | `activity.started` |
100
+ | `knowledge.*` | Platform (automatic) | `knowledge.stored` |
101
+ | `agent.*` | Platform (automatic) | `agent.status_changed` |
102
+ | `milestone` | Platform (automatic) | `milestone` |
103
+ | `app.*` | Application code | `app.vendor.orders.created` |
104
+
105
+ Application topics follow `app.{namespace}.{entity}.{action}`. The `app.` prefix is auto-added by the `publish_event` MCP tool if omitted.
106
+
107
+ ## Payload schemas
108
+
109
+ Each topic can carry a JSON Schema describing the `event.data` shape. This serves two purposes:
110
+
111
+ 1. **Documentation** — developers and agents know what fields are available
112
+ 2. **Input mapping** — when wiring a subscription, the schema shows what `{event.data.*}` templates resolve to
113
+
114
+ System topics have schemas derived from the publish helpers. Config topics declare schemas explicitly. Runtime topics learn by example.
115
+
116
+ ## Categories
117
+
118
+ Every topic belongs to a category: `task`, `workflow`, `escalation`, `activity`, `knowledge`, `agent`, `app`, or `milestone`. Categories are inferred from the first segment of the topic name. The dashboard uses categories for filtering and color-coding.
119
+
120
+ ## Subscriber discovery
121
+
122
+ The topic detail view shows which agents subscribe. This uses the same NATS-style pattern matching as the event bus — if an agent subscribes to `task.*`, it appears on every `task.created`, `task.failed`, etc. detail page.
123
+
124
+ ## MCP tools
125
+
126
+ Two MCP tools give agents programmatic access to the catalog:
127
+
128
+ - **`list_topics`** — browse topics by category or search term
129
+ - **`register_topic`** — declare a topic with schema before first publish
130
+
131
+ This enables autonomous wiring: an agent can discover available topics, read their schemas, and create subscriptions — all through tool calls.
132
+
133
+ ## LTTopicConfig
134
+
135
+ The TypeScript interface for static topic declarations:
136
+
137
+ ```typescript
138
+ interface LTTopicConfig {
139
+ topic: string;
140
+ description?: string;
141
+ category?: string; // defaults to first segment or 'app'
142
+ payload_schema?: object; // JSON Schema for event.data
143
+ example_payload?: object; // concrete example
144
+ tags?: string[];
145
+ reset?: boolean; // true = config is source of truth
146
+ }
147
+ ```
148
+
149
+ ## Related
150
+
151
+ - [Events](events.md) — transport adapters, event registry, publishing
152
+ - [Agents: Subscriptions](agents.md#subscriptions) — wiring topics to workflows
153
+ - [Topics HTTP API](api/http/topics.md) — REST endpoints
154
+ - [Topics SDK](api/sdk/topics.md) — `TopicService` namespace
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hotmeshio/long-tail",
3
- "version": "0.2.10",
3
+ "version": "0.3.1",
4
4
  "description": "Long Tail Workflows — Durable AI workflows with human-in-the-loop escalation. Powered by PostgreSQL.",
5
5
  "main": "./build/index.js",
6
6
  "types": "./build/index.d.ts",
@@ -70,7 +70,7 @@
70
70
  "@anthropic-ai/sdk": "^0.92.0",
71
71
  "@aws-sdk/client-s3": "^3.1017.0",
72
72
  "@aws-sdk/s3-request-presigner": "^3.1045.0",
73
- "@hotmeshio/hotmesh": "^0.16.6",
73
+ "@hotmeshio/hotmesh": "^0.17.1",
74
74
  "@modelcontextprotocol/sdk": "^1.27.1",
75
75
  "@opentelemetry/exporter-trace-otlp-proto": "^0.215.0",
76
76
  "@opentelemetry/resources": "^2.5.1",
@@ -1,2 +0,0 @@
1
- import{s as n,j as o}from"./index-Da8R5Fn_.js";import{c as m}from"./tasks-BLCzIHol.js";import{f as d}from"./useEventHooks-AwwZnweF.js";import{u}from"./mcp-CUFhWTyT.js";import{P as c}from"./PageHeaderWithStats-cQKaJBAM.js";import"./vendor-query-DLp59M9_.js";import"./vendor-react-Co3Y8ikm.js";import"./vendor-icons-1qQ3NKfa.js";function N(){var e;d();const{data:a}=m({limit:1}),{data:t}=n({status:"pending",limit:1}),{data:s}=u(),i=((e=s==null?void 0:s.servers)==null?void 0:e.filter(l=>l.status==="connected").length)??0,r=s?`${i}/${s.total}`:"—";return o.jsxDEV("div",{children:o.jsxDEV(c,{title:"Admin",stats:[{label:"Tasks",value:(a==null?void 0:a.total)??"—"},{label:"Pending Escalations",value:(t==null?void 0:t.total)??"—",dotClass:"bg-status-pending"},{label:"MCP Servers",value:r},{label:"System",value:"Healthy",dotClass:"bg-status-success"}]},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/AdminDashboard.tsx",lineNumber:19,columnNumber:7},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/AdminDashboard.tsx",lineNumber:18,columnNumber:5},this)}export{N as AdminDashboard};
2
- //# sourceMappingURL=AdminDashboard-45Ya2uzl.js.map