@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.
- package/build/api/topics.d.ts +22 -0
- package/build/api/topics.js +104 -0
- package/build/index.d.ts +3 -1
- package/build/index.js +7 -2
- package/build/lib/db/schemas/007_topic_catalog.sql +27 -0
- package/build/routes/index.js +2 -0
- package/build/routes/topics.d.ts +2 -0
- package/build/routes/topics.js +90 -0
- package/build/services/topics/index.d.ts +77 -0
- package/build/services/topics/index.js +116 -0
- package/build/services/topics/sql.d.ts +10 -0
- package/build/services/topics/sql.js +80 -0
- package/build/services/topics/system-topics.d.ts +11 -0
- package/build/services/topics/system-topics.js +270 -0
- package/build/start/workers.js +5 -0
- package/build/system/mcp-servers/events.js +73 -1
- package/build/system/seed/tool-manifests-events.d.ts +75 -0
- package/build/system/seed/tool-manifests-events.js +27 -0
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/index.d.ts +2 -2
- package/build/types/startup.d.ts +27 -0
- package/dashboard/dist/assets/AdminDashboard-CbeSejVX.js +2 -0
- package/dashboard/dist/assets/{AdminDashboard-45Ya2uzl.js.map → AdminDashboard-CbeSejVX.js.map} +1 -1
- package/dashboard/dist/assets/AgentConfigPage-CFJNOrlg.js +13 -0
- package/dashboard/dist/assets/AgentConfigPage-CFJNOrlg.js.map +1 -0
- package/dashboard/dist/assets/AgentDetailPage-Dbx2t-Uk.js +4 -0
- package/dashboard/dist/assets/AgentDetailPage-Dbx2t-Uk.js.map +1 -0
- package/dashboard/dist/assets/{AgentsPage--I4d5y9J.js → AgentsPage-Bz61Nl-x.js} +2 -2
- package/dashboard/dist/assets/{AgentsPage--I4d5y9J.js.map → AgentsPage-Bz61Nl-x.js.map} +1 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-DdrzePy4.js +2 -0
- package/dashboard/dist/assets/AvailableEscalationsPage-DdrzePy4.js.map +1 -0
- package/dashboard/dist/assets/{BotPicker-DgbzCesR.js → BotPicker-kKBifD1w.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-DgbzCesR.js.map → BotPicker-kKBifD1w.js.map} +1 -1
- package/dashboard/dist/assets/{CapabilitiesPage-B2S8_Gsc.js → CapabilitiesPage-Ch5qY0I7.js} +2 -2
- package/dashboard/dist/assets/{CapabilitiesPage-B2S8_Gsc.js.map → CapabilitiesPage-Ch5qY0I7.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-4Eo3b5ha.js → CollapsibleSection-kYTBL7dT.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-4Eo3b5ha.js.map → CollapsibleSection-kYTBL7dT.js.map} +1 -1
- package/dashboard/dist/assets/{ConfirmDeleteModal-Bac7RmDD.js → ConfirmDeleteModal-CcaAapMl.js} +2 -2
- package/dashboard/dist/assets/{ConfirmDeleteModal-Bac7RmDD.js.map → ConfirmDeleteModal-CcaAapMl.js.map} +1 -1
- package/dashboard/dist/assets/{CopyableId-BhwdwAJN.js → CopyableId-B4CL12pv.js} +2 -2
- package/dashboard/dist/assets/{CopyableId-BhwdwAJN.js.map → CopyableId-B4CL12pv.js.map} +1 -1
- package/dashboard/dist/assets/{CredentialsPage-CSEBaYx1.js → CredentialsPage-D1VAlwid.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-CSEBaYx1.js.map → CredentialsPage-D1VAlwid.js.map} +1 -1
- package/dashboard/dist/assets/{CronLabel-DV2v2FlP.js → CronLabel-DRmO5rH0.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-DV2v2FlP.js.map → CronLabel-DRmO5rH0.js.map} +1 -1
- package/dashboard/dist/assets/CustomDurationPicker-C06QDDir.js +2 -0
- package/dashboard/dist/assets/{CustomDurationPicker-B_Oxq_nK.js.map → CustomDurationPicker-C06QDDir.js.map} +1 -1
- package/dashboard/dist/assets/{DataTable-etck0Zmp.js → DataTable-J5R6mepB.js} +2 -2
- package/dashboard/dist/assets/{DataTable-etck0Zmp.js.map → DataTable-J5R6mepB.js.map} +1 -1
- package/dashboard/dist/assets/{DropZone-BDpzHWsI.js → DropZone-DwNj3GiG.js} +2 -2
- package/dashboard/dist/assets/{DropZone-BDpzHWsI.js.map → DropZone-DwNj3GiG.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-D35Z-HSJ.js → ElapsedCell-ChyMzl9n.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-D35Z-HSJ.js.map → ElapsedCell-ChyMzl9n.js.map} +1 -1
- package/dashboard/dist/assets/{EmptyState-Bk3_P-b8.js → EmptyState-BXGvOADa.js} +2 -2
- package/dashboard/dist/assets/{EmptyState-Bk3_P-b8.js.map → EmptyState-BXGvOADa.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-Bt6gGFW4.js → EscalationsOverview-DM6zmE4g.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-Bt6gGFW4.js.map → EscalationsOverview-DM6zmE4g.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-BMk93q8A.js → EventTable-CvJ98E8s.js} +2 -2
- package/dashboard/dist/assets/{EventTable-BMk93q8A.js.map → EventTable-CvJ98E8s.js.map} +1 -1
- package/dashboard/dist/assets/{EventTopicPill-9LcMnLF0.js → EventTopicPill-CB_rIGlL.js} +2 -2
- package/dashboard/dist/assets/{EventTopicPill-9LcMnLF0.js.map → EventTopicPill-CB_rIGlL.js.map} +1 -1
- package/dashboard/dist/assets/{FilterBar-CZGTOMoo.js → FilterBar-Bdssa-Xn.js} +2 -2
- package/dashboard/dist/assets/{FilterBar-CZGTOMoo.js.map → FilterBar-Bdssa-Xn.js.map} +1 -1
- package/dashboard/dist/assets/{HomePage-Dtk7mgmf.js → HomePage-BuZkdXZt.js} +2 -2
- package/dashboard/dist/assets/{HomePage-Dtk7mgmf.js.map → HomePage-BuZkdXZt.js.map} +1 -1
- package/dashboard/dist/assets/{ListToolbar-CJEzypCM.js → ListToolbar-jy8NL6ll.js} +2 -2
- package/dashboard/dist/assets/{ListToolbar-CJEzypCM.js.map → ListToolbar-jy8NL6ll.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-ChUa4l3t.js → McpOverview-xkaKuHbX.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-ChUa4l3t.js.map → McpOverview-xkaKuHbX.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryDetailPage-04CTIN0v.js → McpQueryDetailPage-D5ICn6cR.js} +2 -2
- package/dashboard/dist/assets/{McpQueryDetailPage-04CTIN0v.js.map → McpQueryDetailPage-D5ICn6cR.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryPage-DFnHFdbr.js → McpQueryPage-C46fzfm5.js} +2 -2
- package/dashboard/dist/assets/{McpQueryPage-DFnHFdbr.js.map → McpQueryPage-C46fzfm5.js.map} +1 -1
- package/dashboard/dist/assets/McpRunDetailPage-Znsl4Yc-.js +2 -0
- package/dashboard/dist/assets/{McpRunDetailPage-B95c3bFw.js.map → McpRunDetailPage-Znsl4Yc-.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunsPage-DS43YmLU.js → McpRunsPage-DT-armx5.js} +2 -2
- package/dashboard/dist/assets/{McpRunsPage-DS43YmLU.js.map → McpRunsPage-DT-armx5.js.map} +1 -1
- package/dashboard/dist/assets/{Modal-EUrK2c_A.js → Modal-C6k6_5KB.js} +2 -2
- package/dashboard/dist/assets/{Modal-EUrK2c_A.js.map → Modal-C6k6_5KB.js.map} +1 -1
- package/dashboard/dist/assets/{OperatorDashboard-DBF_AbRH.js → OperatorDashboard-e5N3_dVl.js} +2 -2
- package/dashboard/dist/assets/{OperatorDashboard-DBF_AbRH.js.map → OperatorDashboard-e5N3_dVl.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeader-BuUnJ5NY.js → PageHeader-COcgWWf-.js} +2 -2
- package/dashboard/dist/assets/{PageHeader-BuUnJ5NY.js.map → PageHeader-COcgWWf-.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeaderWithStats-cQKaJBAM.js → PageHeaderWithStats-C0PCY3aJ.js} +2 -2
- package/dashboard/dist/assets/{PageHeaderWithStats-cQKaJBAM.js.map → PageHeaderWithStats-C0PCY3aJ.js.map} +1 -1
- package/dashboard/dist/assets/{PriorityBadge-Bl0_pgex.js → PriorityBadge-BQCsYMpM.js} +2 -2
- package/dashboard/dist/assets/{PriorityBadge-Bl0_pgex.js.map → PriorityBadge-BQCsYMpM.js.map} +1 -1
- package/dashboard/dist/assets/ProcessDetailPage-C03LOgI0.js +2 -0
- package/dashboard/dist/assets/{ProcessDetailPage-DgeXrHon.js.map → ProcessDetailPage-C03LOgI0.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessesListPage-BGiiH4dW.js → ProcessesListPage-iyPsmlhm.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-BGiiH4dW.js.map → ProcessesListPage-iyPsmlhm.js.map} +1 -1
- package/dashboard/dist/assets/{RolePill-DsYF2JN9.js → RolePill-CHwys1f9.js} +2 -2
- package/dashboard/dist/assets/{RolePill-DsYF2JN9.js.map → RolePill-CHwys1f9.js.map} +1 -1
- package/dashboard/dist/assets/{RolesPage-CQ7vPamb.js → RolesPage-Bmc3XaUk.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-CQ7vPamb.js.map → RolesPage-Bmc3XaUk.js.map} +1 -1
- package/dashboard/dist/assets/{RowActions-DBpvm3Jy.js → RowActions-Bs4PF-Gd.js} +2 -2
- package/dashboard/dist/assets/{RowActions-DBpvm3Jy.js.map → RowActions-Bs4PF-Gd.js.map} +1 -1
- package/dashboard/dist/assets/{RunAsSelector-ZLKGTYP_.js → RunAsSelector-DXzAr2WW.js} +2 -2
- package/dashboard/dist/assets/{RunAsSelector-ZLKGTYP_.js.map → RunAsSelector-DXzAr2WW.js.map} +1 -1
- package/dashboard/dist/assets/{ServerName-B5-E7gZD.js → ServerName-BIdLC1Ay.js} +2 -2
- package/dashboard/dist/assets/{ServerName-B5-E7gZD.js.map → ServerName-BIdLC1Ay.js.map} +1 -1
- package/dashboard/dist/assets/{StatCard-B7ySTryP.js → StatCard-OKzRSSx4.js} +2 -2
- package/dashboard/dist/assets/{StatCard-B7ySTryP.js.map → StatCard-OKzRSSx4.js.map} +1 -1
- package/dashboard/dist/assets/{StatusBadge-DNXTk01O.js → StatusBadge-CQlF46RR.js} +2 -2
- package/dashboard/dist/assets/{StatusBadge-DNXTk01O.js.map → StatusBadge-CQlF46RR.js.map} +1 -1
- package/dashboard/dist/assets/{StepIndicator-ftNmaJsu.js → StepIndicator-CP7eycjI.js} +2 -2
- package/dashboard/dist/assets/{StepIndicator-ftNmaJsu.js.map → StepIndicator-CP7eycjI.js.map} +1 -1
- package/dashboard/dist/assets/{StickyPagination-CI5AyVVd.js → StickyPagination-CGk8VAKt.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-CI5AyVVd.js.map → StickyPagination-CGk8VAKt.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-BA4aFrHf.js → SwimlaneTimeline-MEUPc3yJ.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-BA4aFrHf.js.map → SwimlaneTimeline-MEUPc3yJ.js.map} +1 -1
- package/dashboard/dist/assets/{TagInput-DfbVwc27.js → TagInput-BGxXKiWD.js} +2 -2
- package/dashboard/dist/assets/{TagInput-DfbVwc27.js.map → TagInput-BGxXKiWD.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-A_kHjYRn.js → TaskDetailPage-pN5BXzYA.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-A_kHjYRn.js.map → TaskDetailPage-pN5BXzYA.js.map} +1 -1
- package/dashboard/dist/assets/{TaskQueuePill-Dtsa8CPO.js → TaskQueuePill-bw8ieKsf.js} +2 -2
- package/dashboard/dist/assets/{TaskQueuePill-Dtsa8CPO.js.map → TaskQueuePill-bw8ieKsf.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-Cw46VTuA.js → TasksListPage-D1INzcrA.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-Cw46VTuA.js.map → TasksListPage-D1INzcrA.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-Cx1kK1id.js → TimeAgo-CywLVIBA.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-Cx1kK1id.js.map → TimeAgo-CywLVIBA.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-VDp4nVn6.js → TimestampCell-B4Pc6f3A.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-VDp4nVn6.js.map → TimestampCell-B4Pc6f3A.js.map} +1 -1
- package/dashboard/dist/assets/{ToolPill-BNaTJhu8.js → ToolPill-DdLN3JOT.js} +2 -2
- package/dashboard/dist/assets/{ToolPill-BNaTJhu8.js.map → ToolPill-DdLN3JOT.js.map} +1 -1
- package/dashboard/dist/assets/{ToolTestPanel-BickLBjP.js → ToolTestPanel-DusbUka5.js} +2 -2
- package/dashboard/dist/assets/{ToolTestPanel-BickLBjP.js.map → ToolTestPanel-DusbUka5.js.map} +1 -1
- package/dashboard/dist/assets/TopicDetailPage-DadwM52Y.js +9 -0
- package/dashboard/dist/assets/TopicDetailPage-DadwM52Y.js.map +1 -0
- package/dashboard/dist/assets/TopicsPage-DbtrnQON.js +2 -0
- package/dashboard/dist/assets/TopicsPage-DbtrnQON.js.map +1 -0
- package/dashboard/dist/assets/{UserName-DCdb6xnk.js → UserName-CLbusknU.js} +2 -2
- package/dashboard/dist/assets/{UserName-DCdb6xnk.js.map → UserName-CLbusknU.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowExecutionPage-BZfxY1iB.js → WorkflowExecutionPage-C61R-3Gg.js} +2 -2
- package/dashboard/dist/assets/{WorkflowExecutionPage-BZfxY1iB.js.map → WorkflowExecutionPage-C61R-3Gg.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowPill-BzhfqGa-.js → WorkflowPill-7vt2F6wR.js} +2 -2
- package/dashboard/dist/assets/{WorkflowPill-BzhfqGa-.js.map → WorkflowPill-7vt2F6wR.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsDashboard-B7M8kPoH.js → WorkflowsDashboard-BWiUNvyl.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsDashboard-B7M8kPoH.js.map → WorkflowsDashboard-BWiUNvyl.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsOverview-1V8vQ-mo.js → WorkflowsOverview-DA2ZOs7D.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-1V8vQ-mo.js.map → WorkflowsOverview-DA2ZOs7D.js.map} +1 -1
- package/dashboard/dist/assets/YamlWorkflowsPage-CLebf2eL.js +2 -0
- package/dashboard/dist/assets/YamlWorkflowsPage-CLebf2eL.js.map +1 -0
- package/dashboard/dist/assets/{agents-SXs4tMLb.js → agents-Dga6NU7U.js} +2 -2
- package/dashboard/dist/assets/{agents-SXs4tMLb.js.map → agents-Dga6NU7U.js.map} +1 -1
- package/dashboard/dist/assets/{bots-Ci5aCzDK.js → bots-CtU4i4OQ.js} +2 -2
- package/dashboard/dist/assets/{bots-Ci5aCzDK.js.map → bots-CtU4i4OQ.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-BiPTCZeL.js → controlplane-BVoALhbL.js} +2 -2
- package/dashboard/dist/assets/{controlplane-BiPTCZeL.js.map → controlplane-BVoALhbL.js.map} +1 -1
- package/dashboard/dist/assets/escalation-_N5GfuIi.js +2 -0
- package/dashboard/dist/assets/escalation-_N5GfuIi.js.map +1 -0
- package/dashboard/dist/assets/{escalation-columns-Bpp7Sdbd.js → escalation-columns-CoTmTpHp.js} +2 -2
- package/dashboard/dist/assets/escalation-columns-CoTmTpHp.js.map +1 -0
- package/dashboard/dist/assets/{helpers-CQZkvg6D.js → helpers-Dz2U3Ctb.js} +2 -2
- package/dashboard/dist/assets/{helpers-CQZkvg6D.js.map → helpers-Dz2U3Ctb.js.map} +1 -1
- package/dashboard/dist/assets/{index-C7FUIcaY.js → index-6Kd78p_v.js} +2 -2
- package/dashboard/dist/assets/{index-C7FUIcaY.js.map → index-6Kd78p_v.js.map} +1 -1
- package/dashboard/dist/assets/{index-DOE7HCzb.js → index-B9ealjkt.js} +4 -4
- package/dashboard/dist/assets/{index-DOE7HCzb.js.map → index-B9ealjkt.js.map} +1 -1
- package/dashboard/dist/assets/index-BIUHY2Jz.css +1 -0
- package/dashboard/dist/assets/{index-hfravTJF.js → index-BWHDW_CF.js} +2 -2
- package/dashboard/dist/assets/{index-hfravTJF.js.map → index-BWHDW_CF.js.map} +1 -1
- package/dashboard/dist/assets/{index-DtbAmRkr.js → index-BYwPVJv0.js} +2 -2
- package/dashboard/dist/assets/{index-DtbAmRkr.js.map → index-BYwPVJv0.js.map} +1 -1
- package/dashboard/dist/assets/index-CCOSf1PY.js +281 -0
- package/dashboard/dist/assets/index-CCOSf1PY.js.map +1 -0
- package/dashboard/dist/assets/{index-DV0_tQW3.js → index-CS61sh5q.js} +2 -2
- package/dashboard/dist/assets/{index-DV0_tQW3.js.map → index-CS61sh5q.js.map} +1 -1
- package/dashboard/dist/assets/index-CtbG3UN-.js +5 -0
- package/dashboard/dist/assets/index-CtbG3UN-.js.map +1 -0
- package/dashboard/dist/assets/{index-CSsOukxa.js → index-DWUunWxh.js} +2 -2
- package/dashboard/dist/assets/{index-CSsOukxa.js.map → index-DWUunWxh.js.map} +1 -1
- package/dashboard/dist/assets/{index-COiEQlp9.js → index-D_H_Prht.js} +2 -2
- package/dashboard/dist/assets/{index-COiEQlp9.js.map → index-D_H_Prht.js.map} +1 -1
- package/dashboard/dist/assets/{index-q4T_i7zT.js → index-Dpjguclc.js} +2 -2
- package/dashboard/dist/assets/{index-q4T_i7zT.js.map → index-Dpjguclc.js.map} +1 -1
- package/dashboard/dist/assets/{index-OTsFiHXP.js → index-QicYdUsl.js} +2 -2
- package/dashboard/dist/assets/index-QicYdUsl.js.map +1 -0
- package/dashboard/dist/assets/{index-Bp5f2OWJ.js → index-dM-OgCY3.js} +2 -2
- package/dashboard/dist/assets/{index-Bp5f2OWJ.js.map → index-dM-OgCY3.js.map} +1 -1
- package/dashboard/dist/assets/{knowledge-D8osen1O.js → knowledge-DJlebU82.js} +2 -2
- package/dashboard/dist/assets/{knowledge-D8osen1O.js.map → knowledge-DJlebU82.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-CUFhWTyT.js → mcp-CsLJ5SRm.js} +2 -2
- package/dashboard/dist/assets/{mcp-CUFhWTyT.js.map → mcp-CsLJ5SRm.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-n1t4sNm7.js → mcp-query-WNK1ItRV.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-n1t4sNm7.js.map → mcp-query-WNK1ItRV.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-runs-BkRnXbcq.js → mcp-runs-DtTTsuPH.js} +2 -2
- package/dashboard/dist/assets/{mcp-runs-BkRnXbcq.js.map → mcp-runs-DtTTsuPH.js.map} +1 -1
- package/dashboard/dist/assets/{namespaces-CacF05ft.js → namespaces-iRejH3_A.js} +2 -2
- package/dashboard/dist/assets/{namespaces-CacF05ft.js.map → namespaces-iRejH3_A.js.map} +1 -1
- package/dashboard/dist/assets/{roles-CjLCgM_6.js → roles-3Jm5KtKc.js} +2 -2
- package/dashboard/dist/assets/{roles-CjLCgM_6.js.map → roles-3Jm5KtKc.js.map} +1 -1
- package/dashboard/dist/assets/settings-DmN2I-c6.js +2 -0
- package/dashboard/dist/assets/settings-DmN2I-c6.js.map +1 -0
- package/dashboard/dist/assets/{tasks-BLCzIHol.js → tasks-Cc-QoITQ.js} +2 -2
- package/dashboard/dist/assets/{tasks-BLCzIHol.js.map → tasks-Cc-QoITQ.js.map} +1 -1
- package/dashboard/dist/assets/topics-p8anbgi0.js +2 -0
- package/dashboard/dist/assets/topics-p8anbgi0.js.map +1 -0
- package/dashboard/dist/assets/{useEventHooks-AwwZnweF.js → useEventHooks-VaJ52jMm.js} +2 -2
- package/dashboard/dist/assets/{useEventHooks-AwwZnweF.js.map → useEventHooks-VaJ52jMm.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-9Zs0PXY6.js → useYamlActivityEvents-BU4Uhksl.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-9Zs0PXY6.js.map → useYamlActivityEvents-BU4Uhksl.js.map} +1 -1
- package/dashboard/dist/assets/{users-BtLRzvZE.js → users-oXOlnold.js} +2 -2
- package/dashboard/dist/assets/{users-BtLRzvZE.js.map → users-oXOlnold.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-1qQ3NKfa.js → vendor-icons-CBOM6Es0.js} +99 -94
- package/dashboard/dist/assets/vendor-icons-CBOM6Es0.js.map +1 -0
- package/dashboard/dist/assets/{workflows-B9xdIsfM.js → workflows-Yq7cK-vR.js} +2 -2
- package/dashboard/dist/assets/{workflows-B9xdIsfM.js.map → workflows-Yq7cK-vR.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-xOJxyEsQ.js → yaml-workflows-Ch53yD43.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-xOJxyEsQ.js.map → yaml-workflows-Ch53yD43.js.map} +1 -1
- package/dashboard/dist/index.html +3 -3
- package/docs/agents.md +6 -0
- package/docs/api/http/topics.md +164 -0
- package/docs/api/sdk/topics.md +204 -0
- package/docs/dashboard.md +22 -0
- package/docs/events.md +7 -0
- package/docs/sdk.md +15 -0
- package/docs/topics.md +154 -0
- package/package.json +2 -2
- package/dashboard/dist/assets/AdminDashboard-45Ya2uzl.js +0 -2
- package/dashboard/dist/assets/AgentConfigPage-BOASC5vi.js +0 -13
- package/dashboard/dist/assets/AgentConfigPage-BOASC5vi.js.map +0 -1
- package/dashboard/dist/assets/AgentDetailPage-5M7JTcFz.js +0 -4
- package/dashboard/dist/assets/AgentDetailPage-5M7JTcFz.js.map +0 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-CXUkRz18.js +0 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-CXUkRz18.js.map +0 -1
- package/dashboard/dist/assets/CustomDurationPicker-B_Oxq_nK.js +0 -2
- package/dashboard/dist/assets/McpRunDetailPage-B95c3bFw.js +0 -2
- package/dashboard/dist/assets/ProcessDetailPage-DgeXrHon.js +0 -2
- package/dashboard/dist/assets/YamlWorkflowsPage-BteCRoV5.js +0 -2
- package/dashboard/dist/assets/YamlWorkflowsPage-BteCRoV5.js.map +0 -1
- package/dashboard/dist/assets/escalation-D-zr9D9G.js +0 -2
- package/dashboard/dist/assets/escalation-D-zr9D9G.js.map +0 -1
- package/dashboard/dist/assets/escalation-columns-Bpp7Sdbd.js.map +0 -1
- package/dashboard/dist/assets/index-BciXgS35.css +0 -1
- package/dashboard/dist/assets/index-Da8R5Fn_.js +0 -281
- package/dashboard/dist/assets/index-Da8R5Fn_.js.map +0 -1
- package/dashboard/dist/assets/index-DzL5pT70.js +0 -5
- package/dashboard/dist/assets/index-DzL5pT70.js.map +0 -1
- package/dashboard/dist/assets/index-OTsFiHXP.js.map +0 -1
- 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.
|
|
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.
|
|
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
|