@hotmeshio/long-tail 0.3.0 → 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-Bb6zouF5.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-WwA573u9.js.map → AgentDetailPage-Dbx2t-Uk.js.map} +1 -1
- package/dashboard/dist/assets/AgentsPage-Bz61Nl-x.js +2 -0
- package/dashboard/dist/assets/{AgentsPage-BZkZ_hXN.js.map → AgentsPage-Bz61Nl-x.js.map} +1 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-DdrzePy4.js +2 -0
- package/dashboard/dist/assets/{AvailableEscalationsPage-C-Df3ZsZ.js.map → AvailableEscalationsPage-DdrzePy4.js.map} +1 -1
- package/dashboard/dist/assets/BotPicker-kKBifD1w.js +2 -0
- package/dashboard/dist/assets/{BotPicker-CwfVVWxh.js.map → BotPicker-kKBifD1w.js.map} +1 -1
- package/dashboard/dist/assets/CapabilitiesPage-Ch5qY0I7.js +2 -0
- package/dashboard/dist/assets/{CapabilitiesPage-DJEQ_5dV.js.map → CapabilitiesPage-Ch5qY0I7.js.map} +1 -1
- package/dashboard/dist/assets/CollapsibleSection-kYTBL7dT.js +2 -0
- package/dashboard/dist/assets/{CollapsibleSection-DaFQGU6S.js.map → CollapsibleSection-kYTBL7dT.js.map} +1 -1
- package/dashboard/dist/assets/ConfirmDeleteModal-CcaAapMl.js +2 -0
- package/dashboard/dist/assets/{ConfirmDeleteModal-dOxidrSR.js.map → ConfirmDeleteModal-CcaAapMl.js.map} +1 -1
- package/dashboard/dist/assets/CopyableId-B4CL12pv.js +2 -0
- package/dashboard/dist/assets/{CopyableId-DmLF-RqZ.js.map → CopyableId-B4CL12pv.js.map} +1 -1
- package/dashboard/dist/assets/CredentialsPage-D1VAlwid.js +2 -0
- package/dashboard/dist/assets/{CredentialsPage-D-tkqdhu.js.map → CredentialsPage-D1VAlwid.js.map} +1 -1
- package/dashboard/dist/assets/CronLabel-DRmO5rH0.js +2 -0
- package/dashboard/dist/assets/{CronLabel-C6iCjsXd.js.map → CronLabel-DRmO5rH0.js.map} +1 -1
- package/dashboard/dist/assets/CustomDurationPicker-C06QDDir.js +2 -0
- package/dashboard/dist/assets/{CustomDurationPicker--wCtBkmT.js.map → CustomDurationPicker-C06QDDir.js.map} +1 -1
- package/dashboard/dist/assets/DataTable-J5R6mepB.js +2 -0
- package/dashboard/dist/assets/{DataTable-D9yuBv0w.js.map → DataTable-J5R6mepB.js.map} +1 -1
- package/dashboard/dist/assets/DropZone-DwNj3GiG.js +2 -0
- package/dashboard/dist/assets/{DropZone-2mGyDo1P.js.map → DropZone-DwNj3GiG.js.map} +1 -1
- package/dashboard/dist/assets/ElapsedCell-ChyMzl9n.js +2 -0
- package/dashboard/dist/assets/{ElapsedCell-DKoH0bqR.js.map → ElapsedCell-ChyMzl9n.js.map} +1 -1
- package/dashboard/dist/assets/EmptyState-BXGvOADa.js +2 -0
- package/dashboard/dist/assets/{EmptyState-BcsfPq9T.js.map → EmptyState-BXGvOADa.js.map} +1 -1
- package/dashboard/dist/assets/EscalationsOverview-DM6zmE4g.js +2 -0
- package/dashboard/dist/assets/{EscalationsOverview-C6A4Q9Ne.js.map → EscalationsOverview-DM6zmE4g.js.map} +1 -1
- package/dashboard/dist/assets/EventTable-CvJ98E8s.js +2 -0
- package/dashboard/dist/assets/{EventTable-DWxH0vMp.js.map → EventTable-CvJ98E8s.js.map} +1 -1
- package/dashboard/dist/assets/EventTopicPill-CB_rIGlL.js +2 -0
- package/dashboard/dist/assets/{EventTopicPill-BUxxvpNg.js.map → EventTopicPill-CB_rIGlL.js.map} +1 -1
- package/dashboard/dist/assets/FilterBar-Bdssa-Xn.js +2 -0
- package/dashboard/dist/assets/{FilterBar-Ck4K4rzu.js.map → FilterBar-Bdssa-Xn.js.map} +1 -1
- package/dashboard/dist/assets/HomePage-BuZkdXZt.js +2 -0
- package/dashboard/dist/assets/{HomePage-Tlu1j8fK.js.map → HomePage-BuZkdXZt.js.map} +1 -1
- package/dashboard/dist/assets/ListToolbar-jy8NL6ll.js +2 -0
- package/dashboard/dist/assets/{ListToolbar-DuON-br0.js.map → ListToolbar-jy8NL6ll.js.map} +1 -1
- package/dashboard/dist/assets/McpOverview-xkaKuHbX.js +2 -0
- package/dashboard/dist/assets/{McpOverview-byott48x.js.map → McpOverview-xkaKuHbX.js.map} +1 -1
- package/dashboard/dist/assets/McpQueryDetailPage-D5ICn6cR.js +5 -0
- package/dashboard/dist/assets/{McpQueryDetailPage-ieZPpcPn.js.map → McpQueryDetailPage-D5ICn6cR.js.map} +1 -1
- package/dashboard/dist/assets/McpQueryPage-C46fzfm5.js +2 -0
- package/dashboard/dist/assets/{McpQueryPage-BOO0ACYO.js.map → McpQueryPage-C46fzfm5.js.map} +1 -1
- package/dashboard/dist/assets/McpRunDetailPage-Znsl4Yc-.js +2 -0
- package/dashboard/dist/assets/{McpRunDetailPage-Di8s7-u9.js.map → McpRunDetailPage-Znsl4Yc-.js.map} +1 -1
- package/dashboard/dist/assets/McpRunsPage-DT-armx5.js +2 -0
- package/dashboard/dist/assets/{McpRunsPage-DdUVqUFi.js.map → McpRunsPage-DT-armx5.js.map} +1 -1
- package/dashboard/dist/assets/Modal-C6k6_5KB.js +2 -0
- package/dashboard/dist/assets/{Modal-DEODGeqx.js.map → Modal-C6k6_5KB.js.map} +1 -1
- package/dashboard/dist/assets/OperatorDashboard-e5N3_dVl.js +2 -0
- package/dashboard/dist/assets/{OperatorDashboard-oGmDbNYv.js.map → OperatorDashboard-e5N3_dVl.js.map} +1 -1
- package/dashboard/dist/assets/PageHeader-COcgWWf-.js +2 -0
- package/dashboard/dist/assets/{PageHeader-DLjHNYHX.js.map → PageHeader-COcgWWf-.js.map} +1 -1
- package/dashboard/dist/assets/PageHeaderWithStats-C0PCY3aJ.js +2 -0
- package/dashboard/dist/assets/{PageHeaderWithStats-Oljg3n4j.js.map → PageHeaderWithStats-C0PCY3aJ.js.map} +1 -1
- package/dashboard/dist/assets/PriorityBadge-BQCsYMpM.js +2 -0
- package/dashboard/dist/assets/{PriorityBadge-DfQY9St9.js.map → PriorityBadge-BQCsYMpM.js.map} +1 -1
- package/dashboard/dist/assets/ProcessDetailPage-C03LOgI0.js +2 -0
- package/dashboard/dist/assets/{ProcessDetailPage-Da-miMYZ.js.map → ProcessDetailPage-C03LOgI0.js.map} +1 -1
- package/dashboard/dist/assets/ProcessesListPage-iyPsmlhm.js +2 -0
- package/dashboard/dist/assets/{ProcessesListPage-CW-2yFw_.js.map → ProcessesListPage-iyPsmlhm.js.map} +1 -1
- package/dashboard/dist/assets/RolePill-CHwys1f9.js +2 -0
- package/dashboard/dist/assets/{RolePill-Bp10-WfX.js.map → RolePill-CHwys1f9.js.map} +1 -1
- package/dashboard/dist/assets/RolesPage-Bmc3XaUk.js +2 -0
- package/dashboard/dist/assets/{RolesPage-Bg_hEu9H.js.map → RolesPage-Bmc3XaUk.js.map} +1 -1
- package/dashboard/dist/assets/RowActions-Bs4PF-Gd.js +2 -0
- package/dashboard/dist/assets/{RowActions-Dg-Fsm5O.js.map → RowActions-Bs4PF-Gd.js.map} +1 -1
- package/dashboard/dist/assets/RunAsSelector-DXzAr2WW.js +2 -0
- package/dashboard/dist/assets/{RunAsSelector-hYP59xHH.js.map → RunAsSelector-DXzAr2WW.js.map} +1 -1
- package/dashboard/dist/assets/ServerName-BIdLC1Ay.js +2 -0
- package/dashboard/dist/assets/{ServerName-C9lUCFYb.js.map → ServerName-BIdLC1Ay.js.map} +1 -1
- package/dashboard/dist/assets/StatCard-OKzRSSx4.js +2 -0
- package/dashboard/dist/assets/{StatCard-DlgF0CJC.js.map → StatCard-OKzRSSx4.js.map} +1 -1
- package/dashboard/dist/assets/StatusBadge-CQlF46RR.js +2 -0
- package/dashboard/dist/assets/{StatusBadge-XQlNFwmH.js.map → StatusBadge-CQlF46RR.js.map} +1 -1
- package/dashboard/dist/assets/StepIndicator-CP7eycjI.js +2 -0
- package/dashboard/dist/assets/{StepIndicator-CuUIGxKk.js.map → StepIndicator-CP7eycjI.js.map} +1 -1
- package/dashboard/dist/assets/StickyPagination-CGk8VAKt.js +2 -0
- package/dashboard/dist/assets/{StickyPagination-F9FZsRy9.js.map → StickyPagination-CGk8VAKt.js.map} +1 -1
- package/dashboard/dist/assets/SwimlaneTimeline-MEUPc3yJ.js +2 -0
- package/dashboard/dist/assets/{SwimlaneTimeline-2JHwAM2f.js.map → SwimlaneTimeline-MEUPc3yJ.js.map} +1 -1
- package/dashboard/dist/assets/TagInput-BGxXKiWD.js +2 -0
- package/dashboard/dist/assets/{TagInput-Dkljw_WI.js.map → TagInput-BGxXKiWD.js.map} +1 -1
- package/dashboard/dist/assets/TaskDetailPage-pN5BXzYA.js +2 -0
- package/dashboard/dist/assets/TaskDetailPage-pN5BXzYA.js.map +1 -0
- package/dashboard/dist/assets/TaskQueuePill-bw8ieKsf.js +2 -0
- package/dashboard/dist/assets/{TaskQueuePill-DPwm25Cc.js.map → TaskQueuePill-bw8ieKsf.js.map} +1 -1
- package/dashboard/dist/assets/TasksListPage-D1INzcrA.js +2 -0
- package/dashboard/dist/assets/{TasksListPage-kCH4r-70.js.map → TasksListPage-D1INzcrA.js.map} +1 -1
- package/dashboard/dist/assets/TimeAgo-CywLVIBA.js +2 -0
- package/dashboard/dist/assets/{TimeAgo-RPbch7Te.js.map → TimeAgo-CywLVIBA.js.map} +1 -1
- package/dashboard/dist/assets/TimestampCell-B4Pc6f3A.js +2 -0
- package/dashboard/dist/assets/{TimestampCell-Dgpl-lKv.js.map → TimestampCell-B4Pc6f3A.js.map} +1 -1
- package/dashboard/dist/assets/ToolPill-DdLN3JOT.js +2 -0
- package/dashboard/dist/assets/{ToolPill-D_DIWFJ5.js.map → ToolPill-DdLN3JOT.js.map} +1 -1
- package/dashboard/dist/assets/ToolTestPanel-DusbUka5.js +2 -0
- package/dashboard/dist/assets/{ToolTestPanel-D1TWdZQi.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-CLbusknU.js +2 -0
- package/dashboard/dist/assets/{UserName-BXZGXJsU.js.map → UserName-CLbusknU.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowExecutionPage-C61R-3Gg.js +2 -0
- package/dashboard/dist/assets/{WorkflowExecutionPage-DWlNYb2M.js.map → WorkflowExecutionPage-C61R-3Gg.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowPill-7vt2F6wR.js +2 -0
- package/dashboard/dist/assets/{WorkflowPill-BbgVTGgI.js.map → WorkflowPill-7vt2F6wR.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowsDashboard-BWiUNvyl.js +2 -0
- package/dashboard/dist/assets/{WorkflowsDashboard-Dgq8RcD6.js.map → WorkflowsDashboard-BWiUNvyl.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowsOverview-DA2ZOs7D.js +2 -0
- package/dashboard/dist/assets/{WorkflowsOverview-DnInrUPO.js.map → WorkflowsOverview-DA2ZOs7D.js.map} +1 -1
- package/dashboard/dist/assets/YamlWorkflowsPage-CLebf2eL.js +2 -0
- package/dashboard/dist/assets/{YamlWorkflowsPage-z1Z9J-mc.js.map → YamlWorkflowsPage-CLebf2eL.js.map} +1 -1
- package/dashboard/dist/assets/{agents-C9RLPt1z.js → agents-Dga6NU7U.js} +2 -2
- package/dashboard/dist/assets/{agents-C9RLPt1z.js.map → agents-Dga6NU7U.js.map} +1 -1
- package/dashboard/dist/assets/{bots-zyUDnQhH.js → bots-CtU4i4OQ.js} +2 -2
- package/dashboard/dist/assets/{bots-zyUDnQhH.js.map → bots-CtU4i4OQ.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-v-5KV6pl.js → controlplane-BVoALhbL.js} +2 -2
- package/dashboard/dist/assets/{controlplane-v-5KV6pl.js.map → controlplane-BVoALhbL.js.map} +1 -1
- package/dashboard/dist/assets/escalation-_N5GfuIi.js +2 -0
- package/dashboard/dist/assets/{escalation-BseAikei.js.map → escalation-_N5GfuIi.js.map} +1 -1
- package/dashboard/dist/assets/escalation-columns-CoTmTpHp.js +2 -0
- package/dashboard/dist/assets/{escalation-columns-Cs2CkkEs.js.map → escalation-columns-CoTmTpHp.js.map} +1 -1
- package/dashboard/dist/assets/helpers-Dz2U3Ctb.js +2 -0
- package/dashboard/dist/assets/{helpers-DVICI_VA.js.map → helpers-Dz2U3Ctb.js.map} +1 -1
- package/dashboard/dist/assets/index-6Kd78p_v.js +2 -0
- package/dashboard/dist/assets/{index-BzBZo8Sn.js.map → index-6Kd78p_v.js.map} +1 -1
- package/dashboard/dist/assets/index-B9ealjkt.js +6 -0
- package/dashboard/dist/assets/{index-CPpNn3z2.js.map → index-B9ealjkt.js.map} +1 -1
- package/dashboard/dist/assets/index-BIUHY2Jz.css +1 -0
- package/dashboard/dist/assets/index-BWHDW_CF.js +2 -0
- package/dashboard/dist/assets/{index-XCEX7Zof.js.map → index-BWHDW_CF.js.map} +1 -1
- package/dashboard/dist/assets/index-BYwPVJv0.js +15 -0
- package/dashboard/dist/assets/{index-M17tP_HX.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-CS61sh5q.js +2 -0
- package/dashboard/dist/assets/{index-BP76o_S8.js.map → index-CS61sh5q.js.map} +1 -1
- package/dashboard/dist/assets/index-CtbG3UN-.js +5 -0
- package/dashboard/dist/assets/{index-DVFm5329.js.map → index-CtbG3UN-.js.map} +1 -1
- package/dashboard/dist/assets/index-DWUunWxh.js +2 -0
- package/dashboard/dist/assets/{index-DyqdoZPY.js.map → index-DWUunWxh.js.map} +1 -1
- package/dashboard/dist/assets/index-D_H_Prht.js +2 -0
- package/dashboard/dist/assets/{index-C0TSBQw8.js.map → index-D_H_Prht.js.map} +1 -1
- package/dashboard/dist/assets/index-Dpjguclc.js +2 -0
- package/dashboard/dist/assets/{index-DDFK1A8T.js.map → index-Dpjguclc.js.map} +1 -1
- package/dashboard/dist/assets/index-QicYdUsl.js +2 -0
- package/dashboard/dist/assets/{index-tK8lfgAj.js.map → index-QicYdUsl.js.map} +1 -1
- package/dashboard/dist/assets/index-dM-OgCY3.js +2 -0
- package/dashboard/dist/assets/{index-D2tDlpuv.js.map → index-dM-OgCY3.js.map} +1 -1
- package/dashboard/dist/assets/{knowledge-BhK8xuod.js → knowledge-DJlebU82.js} +2 -2
- package/dashboard/dist/assets/{knowledge-BhK8xuod.js.map → knowledge-DJlebU82.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-CWFliwjc.js → mcp-CsLJ5SRm.js} +2 -2
- package/dashboard/dist/assets/{mcp-CWFliwjc.js.map → mcp-CsLJ5SRm.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-Dm7_m5Fi.js → mcp-query-WNK1ItRV.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-Dm7_m5Fi.js.map → mcp-query-WNK1ItRV.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-runs-aBDudwEi.js → mcp-runs-DtTTsuPH.js} +2 -2
- package/dashboard/dist/assets/{mcp-runs-aBDudwEi.js.map → mcp-runs-DtTTsuPH.js.map} +1 -1
- package/dashboard/dist/assets/namespaces-iRejH3_A.js +2 -0
- package/dashboard/dist/assets/{namespaces-C45c4uoO.js.map → namespaces-iRejH3_A.js.map} +1 -1
- package/dashboard/dist/assets/{roles-BMAzzeHR.js → roles-3Jm5KtKc.js} +2 -2
- package/dashboard/dist/assets/{roles-BMAzzeHR.js.map → roles-3Jm5KtKc.js.map} +1 -1
- package/dashboard/dist/assets/settings-DmN2I-c6.js +2 -0
- package/dashboard/dist/assets/{settings-D0v7RI3o.js.map → settings-DmN2I-c6.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-DwEUQ6my.js → tasks-Cc-QoITQ.js} +2 -2
- package/dashboard/dist/assets/{tasks-DwEUQ6my.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-BccPxFR6.js → useEventHooks-VaJ52jMm.js} +2 -2
- package/dashboard/dist/assets/{useEventHooks-BccPxFR6.js.map → useEventHooks-VaJ52jMm.js.map} +1 -1
- package/dashboard/dist/assets/{useExpandedRows-CkcEntB-.js → useExpandedRows-Cg9iq6Vy.js} +2 -2
- package/dashboard/dist/assets/{useExpandedRows-CkcEntB-.js.map → useExpandedRows-Cg9iq6Vy.js.map} +1 -1
- package/dashboard/dist/assets/{useFilterParams-DZCAaBC7.js → useFilterParams-CGRYFw_A.js} +2 -2
- package/dashboard/dist/assets/{useFilterParams-DZCAaBC7.js.map → useFilterParams-CGRYFw_A.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-BBioXSKA.js → useYamlActivityEvents-BU4Uhksl.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-BBioXSKA.js.map → useYamlActivityEvents-BU4Uhksl.js.map} +1 -1
- package/dashboard/dist/assets/{users-CCHT00of.js → users-oXOlnold.js} +2 -2
- package/dashboard/dist/assets/{users-CCHT00of.js.map → users-oXOlnold.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-E6836lXZ.js → vendor-icons-CBOM6Es0.js} +100 -95
- package/dashboard/dist/assets/vendor-icons-CBOM6Es0.js.map +1 -0
- package/dashboard/dist/assets/vendor-query-DLp59M9_.js +35 -0
- package/dashboard/dist/assets/vendor-query-DLp59M9_.js.map +1 -0
- package/dashboard/dist/assets/vendor-react-Co3Y8ikm.js +26 -0
- package/dashboard/dist/assets/vendor-react-Co3Y8ikm.js.map +1 -0
- package/dashboard/dist/assets/{workflows-DNZf6Pmq.js → workflows-Yq7cK-vR.js} +2 -2
- package/dashboard/dist/assets/{workflows-DNZf6Pmq.js.map → workflows-Yq7cK-vR.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-BKZdGciI.js → yaml-workflows-Ch53yD43.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-BKZdGciI.js.map → yaml-workflows-Ch53yD43.js.map} +1 -1
- package/dashboard/dist/index.html +5 -5
- 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-Bb6zouF5.js +0 -2
- package/dashboard/dist/assets/AgentConfigPage-DqHEK73E.js +0 -13
- package/dashboard/dist/assets/AgentConfigPage-DqHEK73E.js.map +0 -1
- package/dashboard/dist/assets/AgentDetailPage-WwA573u9.js +0 -4
- package/dashboard/dist/assets/AgentsPage-BZkZ_hXN.js +0 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-C-Df3ZsZ.js +0 -2
- package/dashboard/dist/assets/BotPicker-CwfVVWxh.js +0 -2
- package/dashboard/dist/assets/CapabilitiesPage-DJEQ_5dV.js +0 -2
- package/dashboard/dist/assets/CollapsibleSection-DaFQGU6S.js +0 -2
- package/dashboard/dist/assets/ConfirmDeleteModal-dOxidrSR.js +0 -2
- package/dashboard/dist/assets/CopyableId-DmLF-RqZ.js +0 -2
- package/dashboard/dist/assets/CredentialsPage-D-tkqdhu.js +0 -2
- package/dashboard/dist/assets/CronLabel-C6iCjsXd.js +0 -2
- package/dashboard/dist/assets/CustomDurationPicker--wCtBkmT.js +0 -2
- package/dashboard/dist/assets/DataTable-D9yuBv0w.js +0 -2
- package/dashboard/dist/assets/DropZone-2mGyDo1P.js +0 -2
- package/dashboard/dist/assets/ElapsedCell-DKoH0bqR.js +0 -2
- package/dashboard/dist/assets/EmptyState-BcsfPq9T.js +0 -2
- package/dashboard/dist/assets/EscalationsOverview-C6A4Q9Ne.js +0 -2
- package/dashboard/dist/assets/EventTable-DWxH0vMp.js +0 -2
- package/dashboard/dist/assets/EventTopicPill-BUxxvpNg.js +0 -2
- package/dashboard/dist/assets/FilterBar-Ck4K4rzu.js +0 -2
- package/dashboard/dist/assets/HomePage-Tlu1j8fK.js +0 -2
- package/dashboard/dist/assets/ListToolbar-DuON-br0.js +0 -2
- package/dashboard/dist/assets/McpOverview-byott48x.js +0 -2
- package/dashboard/dist/assets/McpQueryDetailPage-ieZPpcPn.js +0 -5
- package/dashboard/dist/assets/McpQueryPage-BOO0ACYO.js +0 -2
- package/dashboard/dist/assets/McpRunDetailPage-Di8s7-u9.js +0 -2
- package/dashboard/dist/assets/McpRunsPage-DdUVqUFi.js +0 -2
- package/dashboard/dist/assets/Modal-DEODGeqx.js +0 -2
- package/dashboard/dist/assets/OperatorDashboard-oGmDbNYv.js +0 -2
- package/dashboard/dist/assets/PageHeader-DLjHNYHX.js +0 -2
- package/dashboard/dist/assets/PageHeaderWithStats-Oljg3n4j.js +0 -2
- package/dashboard/dist/assets/PriorityBadge-DfQY9St9.js +0 -2
- package/dashboard/dist/assets/ProcessDetailPage-Da-miMYZ.js +0 -2
- package/dashboard/dist/assets/ProcessesListPage-CW-2yFw_.js +0 -2
- package/dashboard/dist/assets/RolePill-Bp10-WfX.js +0 -2
- package/dashboard/dist/assets/RolesPage-Bg_hEu9H.js +0 -2
- package/dashboard/dist/assets/RowActions-Dg-Fsm5O.js +0 -2
- package/dashboard/dist/assets/RunAsSelector-hYP59xHH.js +0 -2
- package/dashboard/dist/assets/ServerName-C9lUCFYb.js +0 -2
- package/dashboard/dist/assets/StatCard-DlgF0CJC.js +0 -2
- package/dashboard/dist/assets/StatusBadge-XQlNFwmH.js +0 -2
- package/dashboard/dist/assets/StepIndicator-CuUIGxKk.js +0 -2
- package/dashboard/dist/assets/StickyPagination-F9FZsRy9.js +0 -2
- package/dashboard/dist/assets/SwimlaneTimeline-2JHwAM2f.js +0 -2
- package/dashboard/dist/assets/TagInput-Dkljw_WI.js +0 -2
- package/dashboard/dist/assets/TaskDetailPage--9FEVeTB.js +0 -2
- package/dashboard/dist/assets/TaskDetailPage--9FEVeTB.js.map +0 -1
- package/dashboard/dist/assets/TaskQueuePill-DPwm25Cc.js +0 -2
- package/dashboard/dist/assets/TasksListPage-kCH4r-70.js +0 -2
- package/dashboard/dist/assets/TimeAgo-RPbch7Te.js +0 -2
- package/dashboard/dist/assets/TimestampCell-Dgpl-lKv.js +0 -2
- package/dashboard/dist/assets/ToolPill-D_DIWFJ5.js +0 -2
- package/dashboard/dist/assets/ToolTestPanel-D1TWdZQi.js +0 -2
- package/dashboard/dist/assets/UserName-BXZGXJsU.js +0 -2
- package/dashboard/dist/assets/WorkflowExecutionPage-DWlNYb2M.js +0 -2
- package/dashboard/dist/assets/WorkflowPill-BbgVTGgI.js +0 -2
- package/dashboard/dist/assets/WorkflowsDashboard-Dgq8RcD6.js +0 -2
- package/dashboard/dist/assets/WorkflowsOverview-DnInrUPO.js +0 -2
- package/dashboard/dist/assets/YamlWorkflowsPage-z1Z9J-mc.js +0 -2
- package/dashboard/dist/assets/escalation-BseAikei.js +0 -2
- package/dashboard/dist/assets/escalation-columns-Cs2CkkEs.js +0 -2
- package/dashboard/dist/assets/helpers-DVICI_VA.js +0 -2
- package/dashboard/dist/assets/index-BMIU7Im5.js +0 -63
- package/dashboard/dist/assets/index-BMIU7Im5.js.map +0 -1
- package/dashboard/dist/assets/index-BP76o_S8.js +0 -2
- package/dashboard/dist/assets/index-BciXgS35.css +0 -1
- package/dashboard/dist/assets/index-BzBZo8Sn.js +0 -2
- package/dashboard/dist/assets/index-C0TSBQw8.js +0 -2
- package/dashboard/dist/assets/index-CPpNn3z2.js +0 -6
- package/dashboard/dist/assets/index-D2tDlpuv.js +0 -2
- package/dashboard/dist/assets/index-DDFK1A8T.js +0 -2
- package/dashboard/dist/assets/index-DVFm5329.js +0 -5
- package/dashboard/dist/assets/index-DyqdoZPY.js +0 -2
- package/dashboard/dist/assets/index-M17tP_HX.js +0 -15
- package/dashboard/dist/assets/index-XCEX7Zof.js +0 -2
- package/dashboard/dist/assets/index-tK8lfgAj.js +0 -2
- package/dashboard/dist/assets/namespaces-C45c4uoO.js +0 -2
- package/dashboard/dist/assets/settings-D0v7RI3o.js +0 -2
- package/dashboard/dist/assets/vendor-icons-E6836lXZ.js.map +0 -1
- package/dashboard/dist/assets/vendor-query-B2UbickB.js +0 -18
- package/dashboard/dist/assets/vendor-query-B2UbickB.js.map +0 -1
- package/dashboard/dist/assets/vendor-react-CX88sFS5.js +0 -22
- package/dashboard/dist/assets/vendor-react-CX88sFS5.js.map +0 -1
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { LTApiResult } from '../types/sdk';
|
|
2
|
+
export declare function listTopics(input: {
|
|
3
|
+
category?: string;
|
|
4
|
+
search?: string;
|
|
5
|
+
limit?: number;
|
|
6
|
+
offset?: number;
|
|
7
|
+
}): Promise<LTApiResult>;
|
|
8
|
+
export declare function getTopic(input: {
|
|
9
|
+
topic: string;
|
|
10
|
+
}): Promise<LTApiResult>;
|
|
11
|
+
export declare function createTopic(input: {
|
|
12
|
+
topic: string;
|
|
13
|
+
category: string;
|
|
14
|
+
[key: string]: any;
|
|
15
|
+
}): Promise<LTApiResult>;
|
|
16
|
+
export declare function updateTopic(input: {
|
|
17
|
+
topic: string;
|
|
18
|
+
[key: string]: any;
|
|
19
|
+
}): Promise<LTApiResult>;
|
|
20
|
+
export declare function deleteTopic(input: {
|
|
21
|
+
topic: string;
|
|
22
|
+
}): Promise<LTApiResult>;
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.listTopics = listTopics;
|
|
37
|
+
exports.getTopic = getTopic;
|
|
38
|
+
exports.createTopic = createTopic;
|
|
39
|
+
exports.updateTopic = updateTopic;
|
|
40
|
+
exports.deleteTopic = deleteTopic;
|
|
41
|
+
const topicService = __importStar(require("../services/topics"));
|
|
42
|
+
async function listTopics(input) {
|
|
43
|
+
try {
|
|
44
|
+
const result = await topicService.listTopics(input);
|
|
45
|
+
return { status: 200, data: result };
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
return { status: 500, error: err.message };
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
async function getTopic(input) {
|
|
52
|
+
try {
|
|
53
|
+
const topic = await topicService.getTopic(input.topic);
|
|
54
|
+
if (!topic) {
|
|
55
|
+
return { status: 404, error: 'Topic not found' };
|
|
56
|
+
}
|
|
57
|
+
return { status: 200, data: topic };
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
return { status: 500, error: err.message };
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
async function createTopic(input) {
|
|
64
|
+
try {
|
|
65
|
+
const topic = await topicService.createTopic(input);
|
|
66
|
+
return { status: 201, data: topic };
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
if (err.code === '23505') {
|
|
70
|
+
return { status: 409, error: `Topic "${input.topic}" already exists` };
|
|
71
|
+
}
|
|
72
|
+
return { status: 500, error: err.message };
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
async function updateTopic(input) {
|
|
76
|
+
try {
|
|
77
|
+
const { topic, ...data } = input;
|
|
78
|
+
const updated = await topicService.updateTopic(topic, data);
|
|
79
|
+
if (!updated) {
|
|
80
|
+
return { status: 404, error: 'Topic not found' };
|
|
81
|
+
}
|
|
82
|
+
return { status: 200, data: updated };
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
return { status: 500, error: err.message };
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
async function deleteTopic(input) {
|
|
89
|
+
try {
|
|
90
|
+
// Check if it exists and if it's a system topic
|
|
91
|
+
const existing = await topicService.getTopic(input.topic);
|
|
92
|
+
if (!existing) {
|
|
93
|
+
return { status: 404, error: 'Topic not found' };
|
|
94
|
+
}
|
|
95
|
+
if (existing.source === 'system') {
|
|
96
|
+
return { status: 403, error: 'System topics cannot be deleted' };
|
|
97
|
+
}
|
|
98
|
+
await topicService.deleteTopic(input.topic);
|
|
99
|
+
return { status: 200, data: { deleted: true } };
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
return { status: 500, error: err.message };
|
|
103
|
+
}
|
|
104
|
+
}
|
package/build/index.d.ts
CHANGED
|
@@ -10,12 +10,14 @@ export * as TaskService from './services/task';
|
|
|
10
10
|
export * as EscalationService from './services/escalation';
|
|
11
11
|
export * as ConfigService from './services/config';
|
|
12
12
|
export * as UserService from './services/user';
|
|
13
|
+
export * as TopicService from './services/topics';
|
|
14
|
+
export { seedSystemTopics, seedConfigTopics } from './services/topics/system-topics';
|
|
13
15
|
export { ltConfig } from './modules/ltconfig';
|
|
14
16
|
export { eventRegistry } from './lib/events';
|
|
15
17
|
export { NatsEventAdapter } from './lib/events/nats';
|
|
16
18
|
export { InMemoryEventAdapter } from './lib/events/memory';
|
|
17
19
|
export { SocketIOEventAdapter, type SocketIOAuthenticator } from './lib/events/socketio';
|
|
18
|
-
export { publishMilestoneEvent, publishTaskEvent, publishEscalationEvent, publishWorkflowEvent, publishAgentEvent, publishKnowledgeEvent } from './lib/events/publish';
|
|
20
|
+
export { publishMilestoneEvent, publishTaskEvent, publishEscalationEvent, publishActivityEvent, publishWorkflowEvent, publishAgentEvent, publishKnowledgeEvent } from './lib/events/publish';
|
|
19
21
|
export { telemetryRegistry } from './lib/telemetry';
|
|
20
22
|
export { HoneycombTelemetryAdapter } from './lib/telemetry/honeycomb';
|
|
21
23
|
export { loggerRegistry } from './lib/logger';
|
package/build/index.js
CHANGED
|
@@ -36,8 +36,8 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
36
36
|
};
|
|
37
37
|
})();
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
exports.
|
|
40
|
-
exports.api = exports.KnowledgeApi = exports.resolveCredential = exports.mimeFromPath = exports.getStorageBackend = exports.listOAuthConnections = exports.getFreshAccessToken = void 0;
|
|
39
|
+
exports.getSystemWorkers = exports.registerMcpTool = exports.getToolContext = exports.getActivityIdentity = exports.McpEscalationStrategy = exports.DefaultEscalationStrategy = exports.escalationStrategyRegistry = exports.McpVisionServer = exports.McpTranslationServer = exports.McpServer = exports.McpClient = exports.McpService = exports.BuiltInMcpAdapter = exports.mcpRegistry = exports.defaultMaintenanceConfig = exports.maintenanceRegistry = exports.PinoLoggerAdapter = exports.loggerRegistry = exports.HoneycombTelemetryAdapter = exports.telemetryRegistry = exports.publishKnowledgeEvent = exports.publishAgentEvent = exports.publishWorkflowEvent = exports.publishActivityEvent = exports.publishEscalationEvent = exports.publishTaskEvent = exports.publishMilestoneEvent = exports.SocketIOEventAdapter = exports.InMemoryEventAdapter = exports.NatsEventAdapter = exports.eventRegistry = exports.ltConfig = exports.seedConfigTopics = exports.seedSystemTopics = exports.TopicService = exports.UserService = exports.ConfigService = exports.EscalationService = exports.TaskService = exports.signToken = exports.requireAdmin = exports.requireAuth = exports.createAuthMiddleware = exports.JwtAuthAdapter = exports.conditionLT = exports.executeLT = exports.createLTActivityInterceptor = exports.createLTInterceptor = exports.registerLT = exports.start = void 0;
|
|
40
|
+
exports.api = exports.KnowledgeApi = exports.resolveCredential = exports.mimeFromPath = exports.getStorageBackend = exports.listOAuthConnections = exports.getFreshAccessToken = exports.createClient = exports.CallbackEventAdapter = exports.builtinMcpServerFactories = exports.getSystemAgents = void 0;
|
|
41
41
|
const config_1 = require("./modules/config");
|
|
42
42
|
const logger_1 = require("./lib/logger");
|
|
43
43
|
const start_1 = require("./start");
|
|
@@ -64,6 +64,10 @@ exports.TaskService = __importStar(require("./services/task"));
|
|
|
64
64
|
exports.EscalationService = __importStar(require("./services/escalation"));
|
|
65
65
|
exports.ConfigService = __importStar(require("./services/config"));
|
|
66
66
|
exports.UserService = __importStar(require("./services/user"));
|
|
67
|
+
exports.TopicService = __importStar(require("./services/topics"));
|
|
68
|
+
var system_topics_1 = require("./services/topics/system-topics");
|
|
69
|
+
Object.defineProperty(exports, "seedSystemTopics", { enumerable: true, get: function () { return system_topics_1.seedSystemTopics; } });
|
|
70
|
+
Object.defineProperty(exports, "seedConfigTopics", { enumerable: true, get: function () { return system_topics_1.seedConfigTopics; } });
|
|
67
71
|
var ltconfig_1 = require("./modules/ltconfig");
|
|
68
72
|
Object.defineProperty(exports, "ltConfig", { enumerable: true, get: function () { return ltconfig_1.ltConfig; } });
|
|
69
73
|
var events_1 = require("./lib/events");
|
|
@@ -78,6 +82,7 @@ var publish_1 = require("./lib/events/publish");
|
|
|
78
82
|
Object.defineProperty(exports, "publishMilestoneEvent", { enumerable: true, get: function () { return publish_1.publishMilestoneEvent; } });
|
|
79
83
|
Object.defineProperty(exports, "publishTaskEvent", { enumerable: true, get: function () { return publish_1.publishTaskEvent; } });
|
|
80
84
|
Object.defineProperty(exports, "publishEscalationEvent", { enumerable: true, get: function () { return publish_1.publishEscalationEvent; } });
|
|
85
|
+
Object.defineProperty(exports, "publishActivityEvent", { enumerable: true, get: function () { return publish_1.publishActivityEvent; } });
|
|
81
86
|
Object.defineProperty(exports, "publishWorkflowEvent", { enumerable: true, get: function () { return publish_1.publishWorkflowEvent; } });
|
|
82
87
|
Object.defineProperty(exports, "publishAgentEvent", { enumerable: true, get: function () { return publish_1.publishAgentEvent; } });
|
|
83
88
|
Object.defineProperty(exports, "publishKnowledgeEvent", { enumerable: true, get: function () { return publish_1.publishKnowledgeEvent; } });
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
-- Topic catalog — persistent registry of known event topics with metadata.
|
|
2
|
+
-- Each row describes a topic: what it means, what payload shape it carries,
|
|
3
|
+
-- and who publishes it. System topics are seeded at startup; app topics
|
|
4
|
+
-- are auto-registered on first publish.
|
|
5
|
+
|
|
6
|
+
CREATE TABLE IF NOT EXISTS lt_topic_catalog (
|
|
7
|
+
topic TEXT PRIMARY KEY,
|
|
8
|
+
description TEXT,
|
|
9
|
+
category TEXT NOT NULL CHECK (category IN (
|
|
10
|
+
'task','workflow','escalation','activity','knowledge','agent','app','milestone'
|
|
11
|
+
)),
|
|
12
|
+
payload_schema JSONB,
|
|
13
|
+
example_payload JSONB,
|
|
14
|
+
source TEXT NOT NULL DEFAULT 'system',
|
|
15
|
+
tags TEXT[] NOT NULL DEFAULT '{}',
|
|
16
|
+
managed BOOLEAN NOT NULL DEFAULT false,
|
|
17
|
+
last_seen_at TIMESTAMPTZ,
|
|
18
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
19
|
+
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
CREATE INDEX IF NOT EXISTS idx_lt_topic_catalog_category ON lt_topic_catalog (category);
|
|
23
|
+
CREATE INDEX IF NOT EXISTS idx_lt_topic_catalog_tags ON lt_topic_catalog USING GIN (tags);
|
|
24
|
+
|
|
25
|
+
CREATE OR REPLACE TRIGGER trg_lt_topic_catalog_updated_at
|
|
26
|
+
BEFORE UPDATE ON lt_topic_catalog
|
|
27
|
+
FOR EACH ROW EXECUTE FUNCTION lt_set_updated_at();
|
package/build/routes/index.js
CHANGED
|
@@ -31,6 +31,7 @@ const workflow_sets_1 = __importDefault(require("./workflow-sets"));
|
|
|
31
31
|
const knowledge_1 = __importDefault(require("./knowledge"));
|
|
32
32
|
const agents_1 = __importDefault(require("./agents"));
|
|
33
33
|
const capabilities_1 = __importDefault(require("./capabilities"));
|
|
34
|
+
const topics_1 = __importDefault(require("./topics"));
|
|
34
35
|
const nats_credentials_1 = __importDefault(require("./nats-credentials"));
|
|
35
36
|
const router = (0, express_1.Router)();
|
|
36
37
|
// Public routes (no auth required — they handle their own auth)
|
|
@@ -63,4 +64,5 @@ router.use('/workflow-sets', workflow_sets_1.default);
|
|
|
63
64
|
router.use('/knowledge', knowledge_1.default);
|
|
64
65
|
router.use('/agents', agents_1.default);
|
|
65
66
|
router.use('/capabilities', capabilities_1.default);
|
|
67
|
+
router.use('/topics', topics_1.default);
|
|
66
68
|
exports.default = router;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
const express_1 = require("express");
|
|
37
|
+
const api = __importStar(require("../api/topics"));
|
|
38
|
+
const router = (0, express_1.Router)();
|
|
39
|
+
/**
|
|
40
|
+
* GET /api/topics
|
|
41
|
+
* List topics with optional filters.
|
|
42
|
+
* Query: ?category=task&search=...&limit=50&offset=0
|
|
43
|
+
*/
|
|
44
|
+
router.get('/', async (req, res) => {
|
|
45
|
+
const result = await api.listTopics({
|
|
46
|
+
category: req.query.category || undefined,
|
|
47
|
+
search: req.query.search || undefined,
|
|
48
|
+
limit: req.query.limit ? parseInt(req.query.limit, 10) : undefined,
|
|
49
|
+
offset: req.query.offset ? parseInt(req.query.offset, 10) : undefined,
|
|
50
|
+
});
|
|
51
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
52
|
+
});
|
|
53
|
+
/**
|
|
54
|
+
* POST /api/topics
|
|
55
|
+
* Register a new topic in the catalog.
|
|
56
|
+
*/
|
|
57
|
+
router.post('/', async (req, res) => {
|
|
58
|
+
const { topic, category } = req.body;
|
|
59
|
+
if (!topic || !category) {
|
|
60
|
+
res.status(400).json({ error: 'topic and category are required' });
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const result = await api.createTopic(req.body);
|
|
64
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
65
|
+
});
|
|
66
|
+
/**
|
|
67
|
+
* GET /api/topics/by-name/:topic
|
|
68
|
+
* Get a single topic by key. Client must encodeURIComponent the topic.
|
|
69
|
+
*/
|
|
70
|
+
router.get('/by-name/:topic', async (req, res) => {
|
|
71
|
+
const result = await api.getTopic({ topic: decodeURIComponent(req.params.topic) });
|
|
72
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
73
|
+
});
|
|
74
|
+
/**
|
|
75
|
+
* PUT /api/topics/by-name/:topic
|
|
76
|
+
* Update a topic in the catalog.
|
|
77
|
+
*/
|
|
78
|
+
router.put('/by-name/:topic', async (req, res) => {
|
|
79
|
+
const result = await api.updateTopic({ topic: decodeURIComponent(req.params.topic), ...req.body });
|
|
80
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
81
|
+
});
|
|
82
|
+
/**
|
|
83
|
+
* DELETE /api/topics/by-name/:topic
|
|
84
|
+
* Delete a topic from the catalog (system topics are protected).
|
|
85
|
+
*/
|
|
86
|
+
router.delete('/by-name/:topic', async (req, res) => {
|
|
87
|
+
const result = await api.deleteTopic({ topic: decodeURIComponent(req.params.topic) });
|
|
88
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
89
|
+
});
|
|
90
|
+
exports.default = router;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
export interface TopicCatalogEntry {
|
|
2
|
+
topic: string;
|
|
3
|
+
description?: string;
|
|
4
|
+
category: string;
|
|
5
|
+
payload_schema?: Record<string, any>;
|
|
6
|
+
example_payload?: Record<string, any>;
|
|
7
|
+
source: string;
|
|
8
|
+
tags: string[];
|
|
9
|
+
/** When true, this topic is managed by static config (reset: true). Dashboard edits would be overwritten on next boot. */
|
|
10
|
+
managed: boolean;
|
|
11
|
+
last_seen_at?: string;
|
|
12
|
+
subscriber_count?: number;
|
|
13
|
+
created_at: string;
|
|
14
|
+
updated_at: string;
|
|
15
|
+
}
|
|
16
|
+
export interface TopicSubscriber {
|
|
17
|
+
id: string;
|
|
18
|
+
agent_id: string;
|
|
19
|
+
agent_name: string;
|
|
20
|
+
topic: string;
|
|
21
|
+
reaction_type: string;
|
|
22
|
+
}
|
|
23
|
+
export declare function listTopics(filters?: {
|
|
24
|
+
category?: string;
|
|
25
|
+
search?: string;
|
|
26
|
+
limit?: number;
|
|
27
|
+
offset?: number;
|
|
28
|
+
}): Promise<{
|
|
29
|
+
topics: TopicCatalogEntry[];
|
|
30
|
+
total: number;
|
|
31
|
+
}>;
|
|
32
|
+
export declare function getTopic(topic: string): Promise<(TopicCatalogEntry & {
|
|
33
|
+
subscribers: TopicSubscriber[];
|
|
34
|
+
}) | null>;
|
|
35
|
+
export declare function createTopic(data: {
|
|
36
|
+
topic: string;
|
|
37
|
+
description?: string;
|
|
38
|
+
category: string;
|
|
39
|
+
payload_schema?: Record<string, any>;
|
|
40
|
+
example_payload?: Record<string, any>;
|
|
41
|
+
source?: string;
|
|
42
|
+
tags?: string[];
|
|
43
|
+
}): Promise<TopicCatalogEntry>;
|
|
44
|
+
export declare function updateTopic(topic: string, data: Partial<TopicCatalogEntry>): Promise<TopicCatalogEntry | null>;
|
|
45
|
+
export declare function deleteTopic(topic: string): Promise<boolean>;
|
|
46
|
+
/**
|
|
47
|
+
* Auto-register or update a topic on publish (learn-on-first-use).
|
|
48
|
+
* Creates the entry on first publish; updates last_seen on subsequent publishes.
|
|
49
|
+
*/
|
|
50
|
+
export declare function upsertTopicOnPublish(topic: string, data?: Record<string, any>, source?: string): Promise<void>;
|
|
51
|
+
/**
|
|
52
|
+
* Seed a topic at startup (insert-if-absent).
|
|
53
|
+
* Conflict on topic — DB is source of truth after first boot.
|
|
54
|
+
*/
|
|
55
|
+
export declare function seedTopic(data: {
|
|
56
|
+
topic: string;
|
|
57
|
+
description: string;
|
|
58
|
+
category: string;
|
|
59
|
+
payload_schema?: Record<string, any>;
|
|
60
|
+
example_payload?: Record<string, any>;
|
|
61
|
+
source?: string;
|
|
62
|
+
tags?: string[];
|
|
63
|
+
}): Promise<boolean>;
|
|
64
|
+
/**
|
|
65
|
+
* Reset a topic at startup — config is source of truth.
|
|
66
|
+
* Overwrites description, category, schema, tags on every boot.
|
|
67
|
+
* Used when `reset: true` is set in static topic config.
|
|
68
|
+
*/
|
|
69
|
+
export declare function resetTopic(data: {
|
|
70
|
+
topic: string;
|
|
71
|
+
description: string;
|
|
72
|
+
category: string;
|
|
73
|
+
payload_schema?: Record<string, any>;
|
|
74
|
+
example_payload?: Record<string, any>;
|
|
75
|
+
source?: string;
|
|
76
|
+
tags?: string[];
|
|
77
|
+
}): Promise<void>;
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.listTopics = listTopics;
|
|
4
|
+
exports.getTopic = getTopic;
|
|
5
|
+
exports.createTopic = createTopic;
|
|
6
|
+
exports.updateTopic = updateTopic;
|
|
7
|
+
exports.deleteTopic = deleteTopic;
|
|
8
|
+
exports.upsertTopicOnPublish = upsertTopicOnPublish;
|
|
9
|
+
exports.seedTopic = seedTopic;
|
|
10
|
+
exports.resetTopic = resetTopic;
|
|
11
|
+
const db_1 = require("../../lib/db");
|
|
12
|
+
const matching_1 = require("../../lib/events/matching");
|
|
13
|
+
const sql_1 = require("./sql");
|
|
14
|
+
async function listTopics(filters = {}) {
|
|
15
|
+
const pool = (0, db_1.getPool)();
|
|
16
|
+
const limit = filters.limit ?? 50;
|
|
17
|
+
const offset = filters.offset ?? 0;
|
|
18
|
+
const category = filters.category ?? null;
|
|
19
|
+
const search = filters.search ?? null;
|
|
20
|
+
const [dataResult, countResult] = await Promise.all([
|
|
21
|
+
pool.query(sql_1.LIST_TOPICS, [category, search, limit, offset]),
|
|
22
|
+
pool.query(sql_1.COUNT_TOPICS, [category, search]),
|
|
23
|
+
]);
|
|
24
|
+
return {
|
|
25
|
+
topics: dataResult.rows,
|
|
26
|
+
total: countResult.rows[0]?.total ?? 0,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
async function getTopic(topic) {
|
|
30
|
+
const pool = (0, db_1.getPool)();
|
|
31
|
+
const { rows } = await pool.query(sql_1.GET_TOPIC, [topic]);
|
|
32
|
+
if (!rows[0])
|
|
33
|
+
return null;
|
|
34
|
+
// Find all active subscriptions whose pattern matches this topic
|
|
35
|
+
const { rows: allSubs } = await pool.query(sql_1.LIST_SUBSCRIBERS);
|
|
36
|
+
const subscribers = allSubs.filter((sub) => (0, matching_1.subjectMatchesPattern)(topic, sub.topic));
|
|
37
|
+
return { ...rows[0], subscribers };
|
|
38
|
+
}
|
|
39
|
+
async function createTopic(data) {
|
|
40
|
+
const pool = (0, db_1.getPool)();
|
|
41
|
+
const { rows } = await pool.query(sql_1.INSERT_TOPIC, [
|
|
42
|
+
data.topic,
|
|
43
|
+
data.description ?? null,
|
|
44
|
+
data.category,
|
|
45
|
+
data.payload_schema ? JSON.stringify(data.payload_schema) : null,
|
|
46
|
+
data.example_payload ? JSON.stringify(data.example_payload) : null,
|
|
47
|
+
data.source ?? 'app',
|
|
48
|
+
data.tags ?? [],
|
|
49
|
+
]);
|
|
50
|
+
return rows[0];
|
|
51
|
+
}
|
|
52
|
+
async function updateTopic(topic, data) {
|
|
53
|
+
const pool = (0, db_1.getPool)();
|
|
54
|
+
const { rows } = await pool.query(sql_1.UPDATE_TOPIC, [
|
|
55
|
+
topic,
|
|
56
|
+
data.description ?? null,
|
|
57
|
+
data.category ?? null,
|
|
58
|
+
data.payload_schema ? JSON.stringify(data.payload_schema) : null,
|
|
59
|
+
data.example_payload ? JSON.stringify(data.example_payload) : null,
|
|
60
|
+
data.tags ?? null,
|
|
61
|
+
]);
|
|
62
|
+
return rows[0] ?? null;
|
|
63
|
+
}
|
|
64
|
+
async function deleteTopic(topic) {
|
|
65
|
+
const pool = (0, db_1.getPool)();
|
|
66
|
+
const { rowCount } = await pool.query(sql_1.DELETE_TOPIC, [topic]);
|
|
67
|
+
return (rowCount ?? 0) > 0;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Auto-register or update a topic on publish (learn-on-first-use).
|
|
71
|
+
* Creates the entry on first publish; updates last_seen on subsequent publishes.
|
|
72
|
+
*/
|
|
73
|
+
async function upsertTopicOnPublish(topic, data, source) {
|
|
74
|
+
const pool = (0, db_1.getPool)();
|
|
75
|
+
const category = topic.startsWith('app.') ? 'app' : topic.split('.')[0];
|
|
76
|
+
await pool.query(sql_1.UPSERT_ON_PUBLISH, [
|
|
77
|
+
topic,
|
|
78
|
+
category,
|
|
79
|
+
source ?? 'mcp-tool',
|
|
80
|
+
data ? JSON.stringify(data) : null,
|
|
81
|
+
]);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Seed a topic at startup (insert-if-absent).
|
|
85
|
+
* Conflict on topic — DB is source of truth after first boot.
|
|
86
|
+
*/
|
|
87
|
+
async function seedTopic(data) {
|
|
88
|
+
const pool = (0, db_1.getPool)();
|
|
89
|
+
const { rowCount } = await pool.query(sql_1.SEED_TOPIC, [
|
|
90
|
+
data.topic,
|
|
91
|
+
data.description,
|
|
92
|
+
data.category,
|
|
93
|
+
data.payload_schema ? JSON.stringify(data.payload_schema) : null,
|
|
94
|
+
data.example_payload ? JSON.stringify(data.example_payload) : null,
|
|
95
|
+
data.source ?? 'system',
|
|
96
|
+
data.tags ?? [],
|
|
97
|
+
]);
|
|
98
|
+
return (rowCount ?? 0) > 0;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Reset a topic at startup — config is source of truth.
|
|
102
|
+
* Overwrites description, category, schema, tags on every boot.
|
|
103
|
+
* Used when `reset: true` is set in static topic config.
|
|
104
|
+
*/
|
|
105
|
+
async function resetTopic(data) {
|
|
106
|
+
const pool = (0, db_1.getPool)();
|
|
107
|
+
await pool.query(sql_1.RESET_TOPIC, [
|
|
108
|
+
data.topic,
|
|
109
|
+
data.description,
|
|
110
|
+
data.category,
|
|
111
|
+
data.payload_schema ? JSON.stringify(data.payload_schema) : null,
|
|
112
|
+
data.example_payload ? JSON.stringify(data.example_payload) : null,
|
|
113
|
+
data.source ?? 'config',
|
|
114
|
+
data.tags ?? [],
|
|
115
|
+
]);
|
|
116
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare const LIST_TOPICS = "\n SELECT t.*,\n COALESCE(s.sub_count, 0)::int AS subscriber_count\n FROM lt_topic_catalog t\n LEFT JOIN LATERAL (\n SELECT COUNT(*)::int AS sub_count\n FROM lt_agent_subscriptions\n WHERE enabled = true\n AND (topic = t.topic OR topic LIKE '%>%' OR topic LIKE '%*%')\n ) s ON true\n WHERE ($1::text IS NULL OR t.category = $1)\n AND ($2::text IS NULL OR t.topic ILIKE '%' || $2 || '%' OR t.description ILIKE '%' || $2 || '%')\n ORDER BY t.category, t.topic\n LIMIT $3 OFFSET $4\n";
|
|
2
|
+
export declare const COUNT_TOPICS = "\n SELECT COUNT(*)::int AS total FROM lt_topic_catalog\n WHERE ($1::text IS NULL OR category = $1)\n AND ($2::text IS NULL OR topic ILIKE '%' || $2 || '%' OR description ILIKE '%' || $2 || '%')\n";
|
|
3
|
+
export declare const GET_TOPIC = "\n SELECT * FROM lt_topic_catalog WHERE topic = $1\n";
|
|
4
|
+
export declare const INSERT_TOPIC = "\n INSERT INTO lt_topic_catalog\n (topic, description, category, payload_schema, example_payload, source, tags)\n VALUES ($1, $2, $3, $4, $5, $6, $7)\n RETURNING *\n";
|
|
5
|
+
export declare const UPDATE_TOPIC = "\n UPDATE lt_topic_catalog SET\n description = COALESCE($2, description),\n category = COALESCE($3, category),\n payload_schema = COALESCE($4, payload_schema),\n example_payload = COALESCE($5, example_payload),\n tags = COALESCE($6, tags)\n WHERE topic = $1\n RETURNING *\n";
|
|
6
|
+
export declare const DELETE_TOPIC = "\n DELETE FROM lt_topic_catalog WHERE topic = $1 AND source != 'system'\n";
|
|
7
|
+
export declare const UPSERT_ON_PUBLISH = "\n INSERT INTO lt_topic_catalog\n (topic, category, source, example_payload, last_seen_at)\n VALUES ($1, $2, $3, $4, NOW())\n ON CONFLICT (topic) DO UPDATE SET\n last_seen_at = NOW(),\n example_payload = COALESCE(EXCLUDED.example_payload, lt_topic_catalog.example_payload)\n";
|
|
8
|
+
export declare const SEED_TOPIC = "\n INSERT INTO lt_topic_catalog\n (topic, description, category, payload_schema, example_payload, source, tags)\n VALUES ($1, $2, $3, $4, $5, $6, $7)\n ON CONFLICT (topic) DO NOTHING\n";
|
|
9
|
+
export declare const RESET_TOPIC = "\n INSERT INTO lt_topic_catalog\n (topic, description, category, payload_schema, example_payload, source, tags, managed)\n VALUES ($1, $2, $3, $4, $5, $6, $7, true)\n ON CONFLICT (topic) DO UPDATE SET\n description = EXCLUDED.description,\n category = EXCLUDED.category,\n payload_schema = EXCLUDED.payload_schema,\n example_payload = EXCLUDED.example_payload,\n source = EXCLUDED.source,\n tags = EXCLUDED.tags,\n managed = true\n";
|
|
10
|
+
export declare const LIST_SUBSCRIBERS = "\n SELECT s.id, s.agent_id, s.topic, s.reaction_type,\n a.name AS agent_name\n FROM lt_agent_subscriptions s\n JOIN lt_agents a ON s.agent_id = a.id\n WHERE s.enabled = true AND a.status = 'active'\n ORDER BY s.created_at\n";
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LIST_SUBSCRIBERS = exports.RESET_TOPIC = exports.SEED_TOPIC = exports.UPSERT_ON_PUBLISH = exports.DELETE_TOPIC = exports.UPDATE_TOPIC = exports.INSERT_TOPIC = exports.GET_TOPIC = exports.COUNT_TOPICS = exports.LIST_TOPICS = void 0;
|
|
4
|
+
exports.LIST_TOPICS = `
|
|
5
|
+
SELECT t.*,
|
|
6
|
+
COALESCE(s.sub_count, 0)::int AS subscriber_count
|
|
7
|
+
FROM lt_topic_catalog t
|
|
8
|
+
LEFT JOIN LATERAL (
|
|
9
|
+
SELECT COUNT(*)::int AS sub_count
|
|
10
|
+
FROM lt_agent_subscriptions
|
|
11
|
+
WHERE enabled = true
|
|
12
|
+
AND (topic = t.topic OR topic LIKE '%>%' OR topic LIKE '%*%')
|
|
13
|
+
) s ON true
|
|
14
|
+
WHERE ($1::text IS NULL OR t.category = $1)
|
|
15
|
+
AND ($2::text IS NULL OR t.topic ILIKE '%' || $2 || '%' OR t.description ILIKE '%' || $2 || '%')
|
|
16
|
+
ORDER BY t.category, t.topic
|
|
17
|
+
LIMIT $3 OFFSET $4
|
|
18
|
+
`;
|
|
19
|
+
exports.COUNT_TOPICS = `
|
|
20
|
+
SELECT COUNT(*)::int AS total FROM lt_topic_catalog
|
|
21
|
+
WHERE ($1::text IS NULL OR category = $1)
|
|
22
|
+
AND ($2::text IS NULL OR topic ILIKE '%' || $2 || '%' OR description ILIKE '%' || $2 || '%')
|
|
23
|
+
`;
|
|
24
|
+
exports.GET_TOPIC = `
|
|
25
|
+
SELECT * FROM lt_topic_catalog WHERE topic = $1
|
|
26
|
+
`;
|
|
27
|
+
exports.INSERT_TOPIC = `
|
|
28
|
+
INSERT INTO lt_topic_catalog
|
|
29
|
+
(topic, description, category, payload_schema, example_payload, source, tags)
|
|
30
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7)
|
|
31
|
+
RETURNING *
|
|
32
|
+
`;
|
|
33
|
+
exports.UPDATE_TOPIC = `
|
|
34
|
+
UPDATE lt_topic_catalog SET
|
|
35
|
+
description = COALESCE($2, description),
|
|
36
|
+
category = COALESCE($3, category),
|
|
37
|
+
payload_schema = COALESCE($4, payload_schema),
|
|
38
|
+
example_payload = COALESCE($5, example_payload),
|
|
39
|
+
tags = COALESCE($6, tags)
|
|
40
|
+
WHERE topic = $1
|
|
41
|
+
RETURNING *
|
|
42
|
+
`;
|
|
43
|
+
exports.DELETE_TOPIC = `
|
|
44
|
+
DELETE FROM lt_topic_catalog WHERE topic = $1 AND source != 'system'
|
|
45
|
+
`;
|
|
46
|
+
exports.UPSERT_ON_PUBLISH = `
|
|
47
|
+
INSERT INTO lt_topic_catalog
|
|
48
|
+
(topic, category, source, example_payload, last_seen_at)
|
|
49
|
+
VALUES ($1, $2, $3, $4, NOW())
|
|
50
|
+
ON CONFLICT (topic) DO UPDATE SET
|
|
51
|
+
last_seen_at = NOW(),
|
|
52
|
+
example_payload = COALESCE(EXCLUDED.example_payload, lt_topic_catalog.example_payload)
|
|
53
|
+
`;
|
|
54
|
+
exports.SEED_TOPIC = `
|
|
55
|
+
INSERT INTO lt_topic_catalog
|
|
56
|
+
(topic, description, category, payload_schema, example_payload, source, tags)
|
|
57
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7)
|
|
58
|
+
ON CONFLICT (topic) DO NOTHING
|
|
59
|
+
`;
|
|
60
|
+
exports.RESET_TOPIC = `
|
|
61
|
+
INSERT INTO lt_topic_catalog
|
|
62
|
+
(topic, description, category, payload_schema, example_payload, source, tags, managed)
|
|
63
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7, true)
|
|
64
|
+
ON CONFLICT (topic) DO UPDATE SET
|
|
65
|
+
description = EXCLUDED.description,
|
|
66
|
+
category = EXCLUDED.category,
|
|
67
|
+
payload_schema = EXCLUDED.payload_schema,
|
|
68
|
+
example_payload = EXCLUDED.example_payload,
|
|
69
|
+
source = EXCLUDED.source,
|
|
70
|
+
tags = EXCLUDED.tags,
|
|
71
|
+
managed = true
|
|
72
|
+
`;
|
|
73
|
+
exports.LIST_SUBSCRIBERS = `
|
|
74
|
+
SELECT s.id, s.agent_id, s.topic, s.reaction_type,
|
|
75
|
+
a.name AS agent_name
|
|
76
|
+
FROM lt_agent_subscriptions s
|
|
77
|
+
JOIN lt_agents a ON s.agent_id = a.id
|
|
78
|
+
WHERE s.enabled = true AND a.status = 'active'
|
|
79
|
+
ORDER BY s.created_at
|
|
80
|
+
`;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { LTTopicConfig } from '../../types';
|
|
2
|
+
/**
|
|
3
|
+
* Seed all 22 built-in system topics into the catalog.
|
|
4
|
+
* Called once at startup after migrations.
|
|
5
|
+
*/
|
|
6
|
+
export declare function seedSystemTopics(): Promise<void>;
|
|
7
|
+
/**
|
|
8
|
+
* Seed user-declared topics from startConfig.topics[].
|
|
9
|
+
* Respects `reset: true` — overwrites DB from config on every boot.
|
|
10
|
+
*/
|
|
11
|
+
export declare function seedConfigTopics(topics: LTTopicConfig[]): Promise<void>;
|