@hotmeshio/long-tail 0.3.2 → 0.4.0
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/agents.d.ts +1 -1
- package/build/api/agents.js +1 -1
- package/build/api/controlplane.d.ts +33 -0
- package/build/api/controlplane.js +46 -0
- package/build/bin/ltc.js +16 -0
- package/build/lib/cli/commands/streams.d.ts +20 -0
- package/build/lib/cli/commands/streams.js +134 -0
- package/build/lib/db/schemas/003_agents.sql +1 -2
- package/build/lib/db/schemas/004_agent_subscriptions.sql +1 -1
- package/build/routes/agents.js +3 -3
- package/build/routes/controlplane.js +28 -0
- package/build/sdk/index.d.ts +1 -0
- package/build/sdk/index.js +1 -0
- package/build/services/agent/index.d.ts +2 -3
- package/build/services/agent/index.js +5 -12
- package/build/services/agent/sql.d.ts +3 -4
- package/build/services/agent/sql.js +16 -20
- package/build/services/agent/subscription-sql.d.ts +1 -1
- package/build/services/agent/subscription-sql.js +1 -1
- package/build/services/agent/trigger-registry.js +1 -1
- package/build/services/controlplane/index.d.ts +9 -1
- package/build/services/controlplane/index.js +39 -0
- package/build/services/controlplane/stream-messages-sql.d.ts +21 -0
- package/build/services/controlplane/stream-messages-sql.js +108 -0
- package/build/services/controlplane/types.d.ts +44 -0
- package/build/services/cron/index.js +5 -5
- package/build/services/export/post-process.js +14 -6
- package/build/services/mcp-runs/execution-builder.js +9 -4
- package/build/services/topics/index.js +1 -4
- package/build/services/topics/sql.d.ts +2 -2
- package/build/services/topics/sql.js +9 -2
- package/build/services/topics/system-topics.js +2 -3
- package/build/start/workers.js +11 -14
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/agent.d.ts +1 -1
- package/dashboard/dist/assets/AdminDashboard-CR0FtTE6.js +2 -0
- package/dashboard/dist/assets/{AdminDashboard-CbeSejVX.js.map → AdminDashboard-CR0FtTE6.js.map} +1 -1
- package/dashboard/dist/assets/AgentConfigPage-BVypgq9m.js +13 -0
- package/dashboard/dist/assets/AgentConfigPage-BVypgq9m.js.map +1 -0
- package/dashboard/dist/assets/AgentDetailPage-D64ath8c.js +4 -0
- package/dashboard/dist/assets/AgentDetailPage-D64ath8c.js.map +1 -0
- package/dashboard/dist/assets/AgentsPage-j-zblMNR.js +2 -0
- package/dashboard/dist/assets/AgentsPage-j-zblMNR.js.map +1 -0
- package/dashboard/dist/assets/AvailableEscalationsPage-DmUid1h0.js +2 -0
- package/dashboard/dist/assets/{AvailableEscalationsPage-DdrzePy4.js.map → AvailableEscalationsPage-DmUid1h0.js.map} +1 -1
- package/dashboard/dist/assets/BotPicker-DCScT8BN.js +2 -0
- package/dashboard/dist/assets/{BotPicker-kKBifD1w.js.map → BotPicker-DCScT8BN.js.map} +1 -1
- package/dashboard/dist/assets/CapabilitiesPage-g5iUvHRL.js +2 -0
- package/dashboard/dist/assets/{CapabilitiesPage-Ch5qY0I7.js.map → CapabilitiesPage-g5iUvHRL.js.map} +1 -1
- package/dashboard/dist/assets/CollapsibleSection-Dj1YOsVG.js +2 -0
- package/dashboard/dist/assets/{CollapsibleSection-kYTBL7dT.js.map → CollapsibleSection-Dj1YOsVG.js.map} +1 -1
- package/dashboard/dist/assets/ConfirmDeleteModal-dOxidrSR.js +2 -0
- package/dashboard/dist/assets/{ConfirmDeleteModal-CcaAapMl.js.map → ConfirmDeleteModal-dOxidrSR.js.map} +1 -1
- package/dashboard/dist/assets/CopyableId-DmLF-RqZ.js +2 -0
- package/dashboard/dist/assets/{CopyableId-B4CL12pv.js.map → CopyableId-DmLF-RqZ.js.map} +1 -1
- package/dashboard/dist/assets/CredentialsPage-Dvb4QelY.js +2 -0
- package/dashboard/dist/assets/{CredentialsPage-D1VAlwid.js.map → CredentialsPage-Dvb4QelY.js.map} +1 -1
- package/dashboard/dist/assets/CronLabel-sk1BkcJd.js +2 -0
- package/dashboard/dist/assets/{CronLabel-DRmO5rH0.js.map → CronLabel-sk1BkcJd.js.map} +1 -1
- package/dashboard/dist/assets/CustomDurationPicker-C0MV2Q06.js +2 -0
- package/dashboard/dist/assets/{CustomDurationPicker-C06QDDir.js.map → CustomDurationPicker-C0MV2Q06.js.map} +1 -1
- package/dashboard/dist/assets/DataTable-D9yuBv0w.js +2 -0
- package/dashboard/dist/assets/{DataTable-J5R6mepB.js.map → DataTable-D9yuBv0w.js.map} +1 -1
- package/dashboard/dist/assets/DropZone-DN8uwUtf.js +2 -0
- package/dashboard/dist/assets/{DropZone-DwNj3GiG.js.map → DropZone-DN8uwUtf.js.map} +1 -1
- package/dashboard/dist/assets/ElapsedCell-CFXhhKKc.js +2 -0
- package/dashboard/dist/assets/{ElapsedCell-ChyMzl9n.js.map → ElapsedCell-CFXhhKKc.js.map} +1 -1
- package/dashboard/dist/assets/EmptyState-BcsfPq9T.js +2 -0
- package/dashboard/dist/assets/{EmptyState-BXGvOADa.js.map → EmptyState-BcsfPq9T.js.map} +1 -1
- package/dashboard/dist/assets/EscalationsOverview-BEuUFGwC.js +2 -0
- package/dashboard/dist/assets/{EscalationsOverview-DM6zmE4g.js.map → EscalationsOverview-BEuUFGwC.js.map} +1 -1
- package/dashboard/dist/assets/EventTable-DcwVWOKb.js +2 -0
- package/dashboard/dist/assets/{EventTable-CvJ98E8s.js.map → EventTable-DcwVWOKb.js.map} +1 -1
- package/dashboard/dist/assets/EventTopicPill-CWCP1v1O.js +2 -0
- package/dashboard/dist/assets/{EventTopicPill-CB_rIGlL.js.map → EventTopicPill-CWCP1v1O.js.map} +1 -1
- package/dashboard/dist/assets/FilterBar-Ck4K4rzu.js +2 -0
- package/dashboard/dist/assets/{FilterBar-Bdssa-Xn.js.map → FilterBar-Ck4K4rzu.js.map} +1 -1
- package/dashboard/dist/assets/HomePage-BH-F5ws9.js +2 -0
- package/dashboard/dist/assets/HomePage-BH-F5ws9.js.map +1 -0
- package/dashboard/dist/assets/ListToolbar-CUxJlz__.js +2 -0
- package/dashboard/dist/assets/{ListToolbar-jy8NL6ll.js.map → ListToolbar-CUxJlz__.js.map} +1 -1
- package/dashboard/dist/assets/McpOverview-O8XrOzy0.js +2 -0
- package/dashboard/dist/assets/{McpOverview-xkaKuHbX.js.map → McpOverview-O8XrOzy0.js.map} +1 -1
- package/dashboard/dist/assets/McpQueryDetailPage-DhiR0Xrx.js +5 -0
- package/dashboard/dist/assets/{McpQueryDetailPage-D5ICn6cR.js.map → McpQueryDetailPage-DhiR0Xrx.js.map} +1 -1
- package/dashboard/dist/assets/McpQueryPage-Czot0nfl.js +2 -0
- package/dashboard/dist/assets/{McpQueryPage-C46fzfm5.js.map → McpQueryPage-Czot0nfl.js.map} +1 -1
- package/dashboard/dist/assets/McpRunDetailPage-B1kNnD_t.js +2 -0
- package/dashboard/dist/assets/{McpRunDetailPage-Znsl4Yc-.js.map → McpRunDetailPage-B1kNnD_t.js.map} +1 -1
- package/dashboard/dist/assets/McpRunsPage-QUY3pWp9.js +2 -0
- package/dashboard/dist/assets/McpRunsPage-QUY3pWp9.js.map +1 -0
- package/dashboard/dist/assets/Modal-DEODGeqx.js +2 -0
- package/dashboard/dist/assets/{Modal-C6k6_5KB.js.map → Modal-DEODGeqx.js.map} +1 -1
- package/dashboard/dist/assets/OperatorDashboard-BG1Q9qZk.js +2 -0
- package/dashboard/dist/assets/{OperatorDashboard-e5N3_dVl.js.map → OperatorDashboard-BG1Q9qZk.js.map} +1 -1
- package/dashboard/dist/assets/PageHeader-DlzOOM4Y.js +2 -0
- package/dashboard/dist/assets/{PageHeader-COcgWWf-.js.map → PageHeader-DlzOOM4Y.js.map} +1 -1
- package/dashboard/dist/assets/PageHeaderWithStats-C5cZ3IOO.js +2 -0
- package/dashboard/dist/assets/{PageHeaderWithStats-C0PCY3aJ.js.map → PageHeaderWithStats-C5cZ3IOO.js.map} +1 -1
- package/dashboard/dist/assets/PriorityBadge-DfQY9St9.js +2 -0
- package/dashboard/dist/assets/{PriorityBadge-BQCsYMpM.js.map → PriorityBadge-DfQY9St9.js.map} +1 -1
- package/dashboard/dist/assets/ProcessDetailPage-DS1AwTso.js +2 -0
- package/dashboard/dist/assets/{ProcessDetailPage-C03LOgI0.js.map → ProcessDetailPage-DS1AwTso.js.map} +1 -1
- package/dashboard/dist/assets/ProcessesListPage-CAmVcn1P.js +2 -0
- package/dashboard/dist/assets/{ProcessesListPage-iyPsmlhm.js.map → ProcessesListPage-CAmVcn1P.js.map} +1 -1
- package/dashboard/dist/assets/RolePill-BZaUpkHg.js +2 -0
- package/dashboard/dist/assets/{RolePill-CHwys1f9.js.map → RolePill-BZaUpkHg.js.map} +1 -1
- package/dashboard/dist/assets/RolesPage-CFdIXfmv.js +2 -0
- package/dashboard/dist/assets/{RolesPage-Bmc3XaUk.js.map → RolesPage-CFdIXfmv.js.map} +1 -1
- package/dashboard/dist/assets/RowActions-Dg-Fsm5O.js +2 -0
- package/dashboard/dist/assets/{RowActions-Bs4PF-Gd.js.map → RowActions-Dg-Fsm5O.js.map} +1 -1
- package/dashboard/dist/assets/RunAsSelector-BGww9lta.js +2 -0
- package/dashboard/dist/assets/{RunAsSelector-DXzAr2WW.js.map → RunAsSelector-BGww9lta.js.map} +1 -1
- package/dashboard/dist/assets/ServerName-DfS3pfon.js +2 -0
- package/dashboard/dist/assets/{ServerName-BIdLC1Ay.js.map → ServerName-DfS3pfon.js.map} +1 -1
- package/dashboard/dist/assets/StatCard-DlgF0CJC.js +2 -0
- package/dashboard/dist/assets/{StatCard-OKzRSSx4.js.map → StatCard-DlgF0CJC.js.map} +1 -1
- package/dashboard/dist/assets/StatusBadge-XQlNFwmH.js +2 -0
- package/dashboard/dist/assets/{StatusBadge-CQlF46RR.js.map → StatusBadge-XQlNFwmH.js.map} +1 -1
- package/dashboard/dist/assets/StepIndicator-CuUIGxKk.js +2 -0
- package/dashboard/dist/assets/{StepIndicator-CP7eycjI.js.map → StepIndicator-CuUIGxKk.js.map} +1 -1
- package/dashboard/dist/assets/StickyPagination-F9FZsRy9.js +2 -0
- package/dashboard/dist/assets/{StickyPagination-CGk8VAKt.js.map → StickyPagination-F9FZsRy9.js.map} +1 -1
- package/dashboard/dist/assets/SwimlaneTimeline-C2hGjy0V.js +2 -0
- package/dashboard/dist/assets/{SwimlaneTimeline-MEUPc3yJ.js.map → SwimlaneTimeline-C2hGjy0V.js.map} +1 -1
- package/dashboard/dist/assets/TagInput-D21mrQx6.js +2 -0
- package/dashboard/dist/assets/{TagInput-BGxXKiWD.js.map → TagInput-D21mrQx6.js.map} +1 -1
- package/dashboard/dist/assets/TaskDetailPage-B49WQj8W.js +2 -0
- package/dashboard/dist/assets/TaskDetailPage-B49WQj8W.js.map +1 -0
- package/dashboard/dist/assets/TaskQueuePill-D8UMH1rd.js +2 -0
- package/dashboard/dist/assets/{TaskQueuePill-bw8ieKsf.js.map → TaskQueuePill-D8UMH1rd.js.map} +1 -1
- package/dashboard/dist/assets/TasksListPage-CJB-EvKX.js +2 -0
- package/dashboard/dist/assets/{TasksListPage-D1INzcrA.js.map → TasksListPage-CJB-EvKX.js.map} +1 -1
- package/dashboard/dist/assets/TimeAgo-CnjY3XDt.js +2 -0
- package/dashboard/dist/assets/{TimeAgo-CywLVIBA.js.map → TimeAgo-CnjY3XDt.js.map} +1 -1
- package/dashboard/dist/assets/TimestampCell-u1YA8eA3.js +2 -0
- package/dashboard/dist/assets/{TimestampCell-B4Pc6f3A.js.map → TimestampCell-u1YA8eA3.js.map} +1 -1
- package/dashboard/dist/assets/ToolPill-Dmcwmqh2.js +2 -0
- package/dashboard/dist/assets/{ToolPill-DdLN3JOT.js.map → ToolPill-Dmcwmqh2.js.map} +1 -1
- package/dashboard/dist/assets/ToolTestPanel-B1T4Hk0t.js +2 -0
- package/dashboard/dist/assets/{ToolTestPanel-DusbUka5.js.map → ToolTestPanel-B1T4Hk0t.js.map} +1 -1
- package/dashboard/dist/assets/TopicDetailPage-ClibbST4.js +9 -0
- package/dashboard/dist/assets/TopicDetailPage-ClibbST4.js.map +1 -0
- package/dashboard/dist/assets/TopicsPage-KjODhitc.js +2 -0
- package/dashboard/dist/assets/{TopicsPage-DbtrnQON.js.map → TopicsPage-KjODhitc.js.map} +1 -1
- package/dashboard/dist/assets/UserName-DVqimwsO.js +2 -0
- package/dashboard/dist/assets/{UserName-CLbusknU.js.map → UserName-DVqimwsO.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowExecutionPage-DYNPy7Gk.js +2 -0
- package/dashboard/dist/assets/{WorkflowExecutionPage-C61R-3Gg.js.map → WorkflowExecutionPage-DYNPy7Gk.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowPill-h43nlUmM.js +2 -0
- package/dashboard/dist/assets/{WorkflowPill-7vt2F6wR.js.map → WorkflowPill-h43nlUmM.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowsDashboard-DdJm6X7x.js +2 -0
- package/dashboard/dist/assets/{WorkflowsDashboard-BWiUNvyl.js.map → WorkflowsDashboard-DdJm6X7x.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowsOverview-CBOYkfpD.js +2 -0
- package/dashboard/dist/assets/{WorkflowsOverview-DA2ZOs7D.js.map → WorkflowsOverview-CBOYkfpD.js.map} +1 -1
- package/dashboard/dist/assets/YamlWorkflowsPage-BZnD_hMw.js +2 -0
- package/dashboard/dist/assets/{YamlWorkflowsPage-CLebf2eL.js.map → YamlWorkflowsPage-BZnD_hMw.js.map} +1 -1
- package/dashboard/dist/assets/{agents-Dga6NU7U.js → agents-oHMkS1GD.js} +2 -2
- package/dashboard/dist/assets/agents-oHMkS1GD.js.map +1 -0
- package/dashboard/dist/assets/{bots-CtU4i4OQ.js → bots-BispbsY3.js} +2 -2
- package/dashboard/dist/assets/{bots-CtU4i4OQ.js.map → bots-BispbsY3.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-BVoALhbL.js → controlplane-CIbrx5rX.js} +2 -2
- package/dashboard/dist/assets/{controlplane-BVoALhbL.js.map → controlplane-CIbrx5rX.js.map} +1 -1
- package/dashboard/dist/assets/escalation-columns-Dh_0iVTH.js +2 -0
- package/dashboard/dist/assets/{escalation-columns-CoTmTpHp.js.map → escalation-columns-Dh_0iVTH.js.map} +1 -1
- package/dashboard/dist/assets/escalation-qhj4TxA3.js +2 -0
- package/dashboard/dist/assets/{escalation-_N5GfuIi.js.map → escalation-qhj4TxA3.js.map} +1 -1
- package/dashboard/dist/assets/helpers-BYw1qqKV.js +2 -0
- package/dashboard/dist/assets/{helpers-Dz2U3Ctb.js.map → helpers-BYw1qqKV.js.map} +1 -1
- package/dashboard/dist/assets/index-B9t_vpam.js +2 -0
- package/dashboard/dist/assets/{index-Dpjguclc.js.map → index-B9t_vpam.js.map} +1 -1
- package/dashboard/dist/assets/index-Bh9g-EOF.js +2 -0
- package/dashboard/dist/assets/{index-CS61sh5q.js.map → index-Bh9g-EOF.js.map} +1 -1
- package/dashboard/dist/assets/index-BhhWCADo.js +63 -0
- package/dashboard/dist/assets/index-BhhWCADo.js.map +1 -0
- package/dashboard/dist/assets/index-Bn-VSH41.js +2 -0
- package/dashboard/dist/assets/index-Bn-VSH41.js.map +1 -0
- package/dashboard/dist/assets/index-C2yJWps6.js +6 -0
- package/dashboard/dist/assets/{index-B9ealjkt.js.map → index-C2yJWps6.js.map} +1 -1
- package/dashboard/dist/assets/index-C4W1_Rfk.js +5 -0
- package/dashboard/dist/assets/{index-CtbG3UN-.js.map → index-C4W1_Rfk.js.map} +1 -1
- package/dashboard/dist/assets/index-CEF3Idec.js +2 -0
- package/dashboard/dist/assets/{index-6Kd78p_v.js.map → index-CEF3Idec.js.map} +1 -1
- package/dashboard/dist/assets/index-CHxvfc97.css +1 -0
- package/dashboard/dist/assets/index-CVRVw3g_.js +2 -0
- package/dashboard/dist/assets/{index-dM-OgCY3.js.map → index-CVRVw3g_.js.map} +1 -1
- package/dashboard/dist/assets/index-CY3EhrEA.js +2 -0
- package/dashboard/dist/assets/{index-QicYdUsl.js.map → index-CY3EhrEA.js.map} +1 -1
- package/dashboard/dist/assets/index-D-q2lzup.js +2 -0
- package/dashboard/dist/assets/{index-DWUunWxh.js.map → index-D-q2lzup.js.map} +1 -1
- package/dashboard/dist/assets/index-D6YjH5uG.js +15 -0
- package/dashboard/dist/assets/{index-BYwPVJv0.js.map → index-D6YjH5uG.js.map} +1 -1
- package/dashboard/dist/assets/index-ht5r_7jQ.js +2 -0
- package/dashboard/dist/assets/index-ht5r_7jQ.js.map +1 -0
- package/dashboard/dist/assets/index-zHicKKh9.js +2 -0
- package/dashboard/dist/assets/{index-D_H_Prht.js.map → index-zHicKKh9.js.map} +1 -1
- package/dashboard/dist/assets/{knowledge-DJlebU82.js → knowledge-B23TU6JN.js} +2 -2
- package/dashboard/dist/assets/{knowledge-DJlebU82.js.map → knowledge-B23TU6JN.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-CsLJ5SRm.js → mcp-Cew_Sb-Q.js} +2 -2
- package/dashboard/dist/assets/{mcp-CsLJ5SRm.js.map → mcp-Cew_Sb-Q.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-WNK1ItRV.js → mcp-query-So0Oz5Lx.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-WNK1ItRV.js.map → mcp-query-So0Oz5Lx.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-runs-DtTTsuPH.js → mcp-runs-4176y3SA.js} +2 -2
- package/dashboard/dist/assets/{mcp-runs-DtTTsuPH.js.map → mcp-runs-4176y3SA.js.map} +1 -1
- package/dashboard/dist/assets/namespaces-CqBbWsJx.js +2 -0
- package/dashboard/dist/assets/{namespaces-iRejH3_A.js.map → namespaces-CqBbWsJx.js.map} +1 -1
- package/dashboard/dist/assets/{roles-3Jm5KtKc.js → roles-BTxMgLE6.js} +2 -2
- package/dashboard/dist/assets/{roles-3Jm5KtKc.js.map → roles-BTxMgLE6.js.map} +1 -1
- package/dashboard/dist/assets/settings-CtQNxacL.js +2 -0
- package/dashboard/dist/assets/{settings-DmN2I-c6.js.map → settings-CtQNxacL.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-Cc-QoITQ.js → tasks-CIRlUTbo.js} +2 -2
- package/dashboard/dist/assets/{tasks-Cc-QoITQ.js.map → tasks-CIRlUTbo.js.map} +1 -1
- package/dashboard/dist/assets/{topics-p8anbgi0.js → topics-C8YmK_j2.js} +2 -2
- package/dashboard/dist/assets/topics-C8YmK_j2.js.map +1 -0
- package/dashboard/dist/assets/{useEventHooks-VaJ52jMm.js → useEventHooks-BvMUy36X.js} +2 -2
- package/dashboard/dist/assets/{useEventHooks-VaJ52jMm.js.map → useEventHooks-BvMUy36X.js.map} +1 -1
- package/dashboard/dist/assets/{useExpandedRows-Cg9iq6Vy.js → useExpandedRows-CkcEntB-.js} +2 -2
- package/dashboard/dist/assets/{useExpandedRows-Cg9iq6Vy.js.map → useExpandedRows-CkcEntB-.js.map} +1 -1
- package/dashboard/dist/assets/{useFilterParams-CGRYFw_A.js → useFilterParams-DZCAaBC7.js} +2 -2
- package/dashboard/dist/assets/{useFilterParams-CGRYFw_A.js.map → useFilterParams-DZCAaBC7.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-BU4Uhksl.js → useYamlActivityEvents-DLEzqv-z.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-BU4Uhksl.js.map → useYamlActivityEvents-DLEzqv-z.js.map} +1 -1
- package/dashboard/dist/assets/{users-oXOlnold.js → users-C_bD6mzW.js} +2 -2
- package/dashboard/dist/assets/{users-oXOlnold.js.map → users-C_bD6mzW.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-CBOM6Es0.js → vendor-icons-DY1ctJgc.js} +111 -101
- package/dashboard/dist/assets/vendor-icons-DY1ctJgc.js.map +1 -0
- package/dashboard/dist/assets/vendor-query-B2UbickB.js +18 -0
- package/dashboard/dist/assets/vendor-query-B2UbickB.js.map +1 -0
- package/dashboard/dist/assets/vendor-react-CX88sFS5.js +22 -0
- package/dashboard/dist/assets/vendor-react-CX88sFS5.js.map +1 -0
- package/dashboard/dist/assets/{workflows-Yq7cK-vR.js → workflows-DFR0-hI3.js} +2 -2
- package/dashboard/dist/assets/{workflows-Yq7cK-vR.js.map → workflows-DFR0-hI3.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-Ch53yD43.js → yaml-workflows-wXURdyjP.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-Ch53yD43.js.map → yaml-workflows-wXURdyjP.js.map} +1 -1
- package/dashboard/dist/index.html +5 -5
- package/docs/agents.md +1 -1
- package/docs/api/http/agents.md +5 -7
- package/docs/api/http/controlplane.md +193 -0
- package/docs/api/sdk/agents.md +5 -5
- package/docs/api/sdk/controlplane.md +36 -0
- package/docs/dashboard.md +13 -0
- package/package.json +2 -2
- package/dashboard/dist/assets/AdminDashboard-CbeSejVX.js +0 -2
- package/dashboard/dist/assets/AgentConfigPage-CFJNOrlg.js +0 -13
- package/dashboard/dist/assets/AgentConfigPage-CFJNOrlg.js.map +0 -1
- package/dashboard/dist/assets/AgentDetailPage-Dbx2t-Uk.js +0 -4
- package/dashboard/dist/assets/AgentDetailPage-Dbx2t-Uk.js.map +0 -1
- package/dashboard/dist/assets/AgentsPage-Bz61Nl-x.js +0 -2
- package/dashboard/dist/assets/AgentsPage-Bz61Nl-x.js.map +0 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-DdrzePy4.js +0 -2
- package/dashboard/dist/assets/BotPicker-kKBifD1w.js +0 -2
- package/dashboard/dist/assets/CapabilitiesPage-Ch5qY0I7.js +0 -2
- package/dashboard/dist/assets/CollapsibleSection-kYTBL7dT.js +0 -2
- package/dashboard/dist/assets/ConfirmDeleteModal-CcaAapMl.js +0 -2
- package/dashboard/dist/assets/CopyableId-B4CL12pv.js +0 -2
- package/dashboard/dist/assets/CredentialsPage-D1VAlwid.js +0 -2
- package/dashboard/dist/assets/CronLabel-DRmO5rH0.js +0 -2
- package/dashboard/dist/assets/CustomDurationPicker-C06QDDir.js +0 -2
- package/dashboard/dist/assets/DataTable-J5R6mepB.js +0 -2
- package/dashboard/dist/assets/DropZone-DwNj3GiG.js +0 -2
- package/dashboard/dist/assets/ElapsedCell-ChyMzl9n.js +0 -2
- package/dashboard/dist/assets/EmptyState-BXGvOADa.js +0 -2
- package/dashboard/dist/assets/EscalationsOverview-DM6zmE4g.js +0 -2
- package/dashboard/dist/assets/EventTable-CvJ98E8s.js +0 -2
- package/dashboard/dist/assets/EventTopicPill-CB_rIGlL.js +0 -2
- package/dashboard/dist/assets/FilterBar-Bdssa-Xn.js +0 -2
- package/dashboard/dist/assets/HomePage-BuZkdXZt.js +0 -2
- package/dashboard/dist/assets/HomePage-BuZkdXZt.js.map +0 -1
- package/dashboard/dist/assets/ListToolbar-jy8NL6ll.js +0 -2
- package/dashboard/dist/assets/McpOverview-xkaKuHbX.js +0 -2
- package/dashboard/dist/assets/McpQueryDetailPage-D5ICn6cR.js +0 -5
- package/dashboard/dist/assets/McpQueryPage-C46fzfm5.js +0 -2
- package/dashboard/dist/assets/McpRunDetailPage-Znsl4Yc-.js +0 -2
- package/dashboard/dist/assets/McpRunsPage-DT-armx5.js +0 -2
- package/dashboard/dist/assets/McpRunsPage-DT-armx5.js.map +0 -1
- package/dashboard/dist/assets/Modal-C6k6_5KB.js +0 -2
- package/dashboard/dist/assets/OperatorDashboard-e5N3_dVl.js +0 -2
- package/dashboard/dist/assets/PageHeader-COcgWWf-.js +0 -2
- package/dashboard/dist/assets/PageHeaderWithStats-C0PCY3aJ.js +0 -2
- package/dashboard/dist/assets/PriorityBadge-BQCsYMpM.js +0 -2
- package/dashboard/dist/assets/ProcessDetailPage-C03LOgI0.js +0 -2
- package/dashboard/dist/assets/ProcessesListPage-iyPsmlhm.js +0 -2
- package/dashboard/dist/assets/RolePill-CHwys1f9.js +0 -2
- package/dashboard/dist/assets/RolesPage-Bmc3XaUk.js +0 -2
- package/dashboard/dist/assets/RowActions-Bs4PF-Gd.js +0 -2
- package/dashboard/dist/assets/RunAsSelector-DXzAr2WW.js +0 -2
- package/dashboard/dist/assets/ServerName-BIdLC1Ay.js +0 -2
- package/dashboard/dist/assets/StatCard-OKzRSSx4.js +0 -2
- package/dashboard/dist/assets/StatusBadge-CQlF46RR.js +0 -2
- package/dashboard/dist/assets/StepIndicator-CP7eycjI.js +0 -2
- package/dashboard/dist/assets/StickyPagination-CGk8VAKt.js +0 -2
- package/dashboard/dist/assets/SwimlaneTimeline-MEUPc3yJ.js +0 -2
- package/dashboard/dist/assets/TagInput-BGxXKiWD.js +0 -2
- package/dashboard/dist/assets/TaskDetailPage-pN5BXzYA.js +0 -2
- package/dashboard/dist/assets/TaskDetailPage-pN5BXzYA.js.map +0 -1
- package/dashboard/dist/assets/TaskQueuePill-bw8ieKsf.js +0 -2
- package/dashboard/dist/assets/TasksListPage-D1INzcrA.js +0 -2
- package/dashboard/dist/assets/TimeAgo-CywLVIBA.js +0 -2
- package/dashboard/dist/assets/TimestampCell-B4Pc6f3A.js +0 -2
- package/dashboard/dist/assets/ToolPill-DdLN3JOT.js +0 -2
- package/dashboard/dist/assets/ToolTestPanel-DusbUka5.js +0 -2
- package/dashboard/dist/assets/TopicDetailPage-DadwM52Y.js +0 -9
- package/dashboard/dist/assets/TopicDetailPage-DadwM52Y.js.map +0 -1
- package/dashboard/dist/assets/TopicsPage-DbtrnQON.js +0 -2
- package/dashboard/dist/assets/UserName-CLbusknU.js +0 -2
- package/dashboard/dist/assets/WorkflowExecutionPage-C61R-3Gg.js +0 -2
- package/dashboard/dist/assets/WorkflowPill-7vt2F6wR.js +0 -2
- package/dashboard/dist/assets/WorkflowsDashboard-BWiUNvyl.js +0 -2
- package/dashboard/dist/assets/WorkflowsOverview-DA2ZOs7D.js +0 -2
- package/dashboard/dist/assets/YamlWorkflowsPage-CLebf2eL.js +0 -2
- package/dashboard/dist/assets/agents-Dga6NU7U.js.map +0 -1
- package/dashboard/dist/assets/escalation-_N5GfuIi.js +0 -2
- package/dashboard/dist/assets/escalation-columns-CoTmTpHp.js +0 -2
- package/dashboard/dist/assets/helpers-Dz2U3Ctb.js +0 -2
- package/dashboard/dist/assets/index-6Kd78p_v.js +0 -2
- package/dashboard/dist/assets/index-B9ealjkt.js +0 -6
- package/dashboard/dist/assets/index-BIUHY2Jz.css +0 -1
- package/dashboard/dist/assets/index-BWHDW_CF.js +0 -2
- package/dashboard/dist/assets/index-BWHDW_CF.js.map +0 -1
- package/dashboard/dist/assets/index-BYwPVJv0.js +0 -15
- package/dashboard/dist/assets/index-CCOSf1PY.js +0 -281
- package/dashboard/dist/assets/index-CCOSf1PY.js.map +0 -1
- package/dashboard/dist/assets/index-CS61sh5q.js +0 -2
- package/dashboard/dist/assets/index-CtbG3UN-.js +0 -5
- package/dashboard/dist/assets/index-DWUunWxh.js +0 -2
- package/dashboard/dist/assets/index-D_H_Prht.js +0 -2
- package/dashboard/dist/assets/index-Dpjguclc.js +0 -2
- package/dashboard/dist/assets/index-QicYdUsl.js +0 -2
- package/dashboard/dist/assets/index-dM-OgCY3.js +0 -2
- package/dashboard/dist/assets/namespaces-iRejH3_A.js +0 -2
- package/dashboard/dist/assets/settings-DmN2I-c6.js +0 -2
- package/dashboard/dist/assets/topics-p8anbgi0.js.map +0 -1
- package/dashboard/dist/assets/vendor-icons-CBOM6Es0.js.map +0 -1
- package/dashboard/dist/assets/vendor-query-DLp59M9_.js +0 -35
- package/dashboard/dist/assets/vendor-query-DLp59M9_.js.map +0 -1
- package/dashboard/dist/assets/vendor-react-Co3Y8ikm.js +0 -26
- package/dashboard/dist/assets/vendor-react-Co3Y8ikm.js.map +0 -1
package/build/api/agents.d.ts
CHANGED
|
@@ -9,7 +9,7 @@ export declare function getAgent(input: {
|
|
|
9
9
|
id: string;
|
|
10
10
|
}): Promise<LTApiResult>;
|
|
11
11
|
export declare function createAgent(input: {
|
|
12
|
-
|
|
12
|
+
id: string;
|
|
13
13
|
[key: string]: any;
|
|
14
14
|
}, _auth?: LTApiAuth): Promise<LTApiResult>;
|
|
15
15
|
export declare function updateAgent(input: {
|
package/build/api/agents.js
CHANGED
|
@@ -68,7 +68,7 @@ async function createAgent(input, _auth) {
|
|
|
68
68
|
}
|
|
69
69
|
catch (err) {
|
|
70
70
|
if (err.code === '23505') {
|
|
71
|
-
return { status: 409, error: `Agent "${input.
|
|
71
|
+
return { status: 409, error: `Agent "${input.id}" already exists` };
|
|
72
72
|
}
|
|
73
73
|
return { status: 500, error: err.message };
|
|
74
74
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { LTApiResult } from '../types/sdk';
|
|
2
|
+
import type { StreamMessageStatus } from '../services/controlplane/types';
|
|
2
3
|
/**
|
|
3
4
|
* List all registered application namespaces.
|
|
4
5
|
*
|
|
@@ -66,3 +67,35 @@ export declare function getStreamStats(input: {
|
|
|
66
67
|
export declare function subscribeMesh(input: {
|
|
67
68
|
appId?: string;
|
|
68
69
|
}): Promise<LTApiResult>;
|
|
70
|
+
/**
|
|
71
|
+
* Browse stream messages across engine and worker streams.
|
|
72
|
+
*
|
|
73
|
+
* Returns paginated, filterable, sortable results from the Postgres
|
|
74
|
+
* engine_streams and worker_streams tables. Messages are schema-isolated
|
|
75
|
+
* by namespace.
|
|
76
|
+
*
|
|
77
|
+
* @param input.namespace — Postgres schema (required, e.g. "durable")
|
|
78
|
+
* @param input.limit — page size (1–100, default 25)
|
|
79
|
+
* @param input.offset — pagination offset (default 0)
|
|
80
|
+
* @param input.sort_by — sort column: created_at, stream_name, priority, id
|
|
81
|
+
* @param input.order — sort direction: asc | desc (default desc)
|
|
82
|
+
* @param input.source — filter by source: engine | worker (default all)
|
|
83
|
+
* @param input.status — filter by status: pending | claimed | processed | dead_lettered
|
|
84
|
+
* @param input.stream_name — partial match on stream name (ILIKE)
|
|
85
|
+
* @param input.msg_type — filter by message type (worker streams only)
|
|
86
|
+
*/
|
|
87
|
+
export declare function listStreamMessages(input: {
|
|
88
|
+
namespace: string;
|
|
89
|
+
source: string;
|
|
90
|
+
limit?: number;
|
|
91
|
+
offset?: number;
|
|
92
|
+
sort_by?: string;
|
|
93
|
+
order?: 'asc' | 'desc';
|
|
94
|
+
status?: StreamMessageStatus | null;
|
|
95
|
+
stream_name?: string | null;
|
|
96
|
+
msg_type?: string | null;
|
|
97
|
+
topic?: string | null;
|
|
98
|
+
workflow_name?: string | null;
|
|
99
|
+
jid?: string | null;
|
|
100
|
+
aid?: string | null;
|
|
101
|
+
}): Promise<LTApiResult>;
|
|
@@ -38,6 +38,7 @@ exports.rollCall = rollCall;
|
|
|
38
38
|
exports.applyThrottle = applyThrottle;
|
|
39
39
|
exports.getStreamStats = getStreamStats;
|
|
40
40
|
exports.subscribeMesh = subscribeMesh;
|
|
41
|
+
exports.listStreamMessages = listStreamMessages;
|
|
41
42
|
const controlplane = __importStar(require("../services/controlplane"));
|
|
42
43
|
const events_1 = require("../lib/events");
|
|
43
44
|
/**
|
|
@@ -156,3 +157,48 @@ async function subscribeMesh(input) {
|
|
|
156
157
|
return { status: 500, error: err.message };
|
|
157
158
|
}
|
|
158
159
|
}
|
|
160
|
+
/**
|
|
161
|
+
* Browse stream messages across engine and worker streams.
|
|
162
|
+
*
|
|
163
|
+
* Returns paginated, filterable, sortable results from the Postgres
|
|
164
|
+
* engine_streams and worker_streams tables. Messages are schema-isolated
|
|
165
|
+
* by namespace.
|
|
166
|
+
*
|
|
167
|
+
* @param input.namespace — Postgres schema (required, e.g. "durable")
|
|
168
|
+
* @param input.limit — page size (1–100, default 25)
|
|
169
|
+
* @param input.offset — pagination offset (default 0)
|
|
170
|
+
* @param input.sort_by — sort column: created_at, stream_name, priority, id
|
|
171
|
+
* @param input.order — sort direction: asc | desc (default desc)
|
|
172
|
+
* @param input.source — filter by source: engine | worker (default all)
|
|
173
|
+
* @param input.status — filter by status: pending | claimed | processed | dead_lettered
|
|
174
|
+
* @param input.stream_name — partial match on stream name (ILIKE)
|
|
175
|
+
* @param input.msg_type — filter by message type (worker streams only)
|
|
176
|
+
*/
|
|
177
|
+
async function listStreamMessages(input) {
|
|
178
|
+
try {
|
|
179
|
+
if (!input.namespace) {
|
|
180
|
+
return { status: 400, error: 'namespace is required' };
|
|
181
|
+
}
|
|
182
|
+
if (input.source !== 'engine' && input.source !== 'worker') {
|
|
183
|
+
return { status: 400, error: 'source is required (engine or worker)' };
|
|
184
|
+
}
|
|
185
|
+
const result = await controlplane.getStreamMessages(input.namespace, {
|
|
186
|
+
source: input.source,
|
|
187
|
+
limit: input.limit,
|
|
188
|
+
offset: input.offset,
|
|
189
|
+
sort_by: input.sort_by,
|
|
190
|
+
order: input.order,
|
|
191
|
+
status: input.status,
|
|
192
|
+
stream_name: input.stream_name,
|
|
193
|
+
msg_type: input.msg_type,
|
|
194
|
+
topic: input.topic,
|
|
195
|
+
workflow_name: input.workflow_name,
|
|
196
|
+
jid: input.jid,
|
|
197
|
+
aid: input.aid,
|
|
198
|
+
});
|
|
199
|
+
return { status: 200, data: result };
|
|
200
|
+
}
|
|
201
|
+
catch (err) {
|
|
202
|
+
return { status: 500, error: err.message };
|
|
203
|
+
}
|
|
204
|
+
}
|
package/build/bin/ltc.js
CHANGED
|
@@ -54,6 +54,7 @@ const pip = __importStar(require("../lib/cli/commands/pipelines"));
|
|
|
54
54
|
const kb = __importStar(require("../lib/cli/commands/knowledge"));
|
|
55
55
|
const mcp = __importStar(require("../lib/cli/commands/mcp"));
|
|
56
56
|
const usr = __importStar(require("../lib/cli/commands/users"));
|
|
57
|
+
const streams = __importStar(require("../lib/cli/commands/streams"));
|
|
57
58
|
const pkg = require('../package.json');
|
|
58
59
|
const envPath = path.resolve(process.cwd(), '.env');
|
|
59
60
|
const envLoaded = fs.existsSync(envPath);
|
|
@@ -216,5 +217,20 @@ usrCmd.command('list')
|
|
|
216
217
|
usrCmd.command('get <id>')
|
|
217
218
|
.option('--json', 'JSON output')
|
|
218
219
|
.action(wrap(usr.getUser));
|
|
220
|
+
// ── Streams ─────────────────────────────────────────────────────────────
|
|
221
|
+
const streamsCmd = commander_1.program.command('streams').description('Browse stream messages (admin)');
|
|
222
|
+
streamsCmd.command('list')
|
|
223
|
+
.requiredOption('-n, --namespace <ns>', 'Schema namespace (e.g. durable)')
|
|
224
|
+
.requiredOption('-s, --source <source>', 'Stream type (engine or worker)')
|
|
225
|
+
.option('--status <status>', 'Filter by status (pending, claimed, processed, dead_lettered)')
|
|
226
|
+
.option('--stream <name>', 'Filter by stream name (partial match)')
|
|
227
|
+
.option('--type <type>', 'Filter by message type (worker only)')
|
|
228
|
+
.option('--limit <n>', 'Max results (default 25)')
|
|
229
|
+
.option('--offset <n>', 'Pagination offset')
|
|
230
|
+
.option('--sort <col>', 'Sort column (created_at, stream_name, priority, id)')
|
|
231
|
+
.option('--order <dir>', 'Sort direction (asc, desc)')
|
|
232
|
+
.option('--json', 'JSON output')
|
|
233
|
+
.option('-q, --quiet', 'IDs only')
|
|
234
|
+
.action(wrap(streams.listMessages));
|
|
219
235
|
// ── Parse ────────────────────────────────────────────────────────────────
|
|
220
236
|
commander_1.program.parse();
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
interface ListOptions {
|
|
2
|
+
namespace: string;
|
|
3
|
+
source: string;
|
|
4
|
+
status?: string;
|
|
5
|
+
stream?: string;
|
|
6
|
+
type?: string;
|
|
7
|
+
limit?: string;
|
|
8
|
+
offset?: string;
|
|
9
|
+
sort?: string;
|
|
10
|
+
order?: string;
|
|
11
|
+
json?: boolean;
|
|
12
|
+
quiet?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare function listMessages(opts: ListOptions): Promise<void>;
|
|
15
|
+
interface GetOptions {
|
|
16
|
+
namespace: string;
|
|
17
|
+
json?: boolean;
|
|
18
|
+
}
|
|
19
|
+
export declare function getMessage(id: string, opts: GetOptions): Promise<void>;
|
|
20
|
+
export {};
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.listMessages = listMessages;
|
|
7
|
+
exports.getMessage = getMessage;
|
|
8
|
+
const picocolors_1 = __importDefault(require("picocolors"));
|
|
9
|
+
const client_1 = require("../client");
|
|
10
|
+
const format_1 = require("../format");
|
|
11
|
+
function formatStreamStatus(status) {
|
|
12
|
+
switch (status) {
|
|
13
|
+
case 'pending': return picocolors_1.default.dim(status);
|
|
14
|
+
case 'claimed': return picocolors_1.default.yellow(status);
|
|
15
|
+
case 'processed': return picocolors_1.default.green(status);
|
|
16
|
+
case 'dead_lettered': return picocolors_1.default.red('dead-letter');
|
|
17
|
+
default: return status;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
const COLUMNS = [
|
|
21
|
+
{ key: 'id', label: 'ID', width: 8, align: 'right' },
|
|
22
|
+
{ key: 'source', label: 'Source', width: 8 },
|
|
23
|
+
{ key: 'status', label: 'Status', width: 12, format: formatStreamStatus },
|
|
24
|
+
{ key: 'stream_name', label: 'Stream', width: 30, format: (v) => v?.length > 30 ? v.slice(0, 29) + '…' : v },
|
|
25
|
+
{ key: 'msg_type', label: 'Type', width: 10, format: (v) => v || '—' },
|
|
26
|
+
{ key: 'priority', label: 'Pri', width: 4, align: 'right' },
|
|
27
|
+
{ key: 'retry_attempt', label: 'Retry', width: 6, format: (v, row) => row ? `${v}/${row.max_retry_attempts}` : String(v) },
|
|
28
|
+
{ key: 'created_at', label: 'Created', width: 12, format: format_1.formatTime },
|
|
29
|
+
];
|
|
30
|
+
async function listMessages(opts) {
|
|
31
|
+
if (!opts.namespace) {
|
|
32
|
+
console.error(`\n ${picocolors_1.default.red('✗')} --namespace is required\n`);
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
if (opts.source !== 'engine' && opts.source !== 'worker') {
|
|
36
|
+
console.error(`\n ${picocolors_1.default.red('✗')} --source is required (engine or worker)\n`);
|
|
37
|
+
process.exit(1);
|
|
38
|
+
}
|
|
39
|
+
const params = new URLSearchParams();
|
|
40
|
+
params.set('namespace', opts.namespace);
|
|
41
|
+
params.set('source', opts.source);
|
|
42
|
+
if (opts.status)
|
|
43
|
+
params.set('status', opts.status);
|
|
44
|
+
if (opts.stream)
|
|
45
|
+
params.set('stream_name', opts.stream);
|
|
46
|
+
if (opts.type)
|
|
47
|
+
params.set('msg_type', opts.type);
|
|
48
|
+
if (opts.limit)
|
|
49
|
+
params.set('limit', opts.limit);
|
|
50
|
+
if (opts.offset)
|
|
51
|
+
params.set('offset', opts.offset);
|
|
52
|
+
if (opts.sort)
|
|
53
|
+
params.set('sort_by', opts.sort);
|
|
54
|
+
if (opts.order)
|
|
55
|
+
params.set('order', opts.order);
|
|
56
|
+
const data = await (0, client_1.apiFetch)(`/controlplane/stream-messages?${params}`);
|
|
57
|
+
if (opts.json) {
|
|
58
|
+
console.log(JSON.stringify(data, null, 2));
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
if (opts.quiet) {
|
|
62
|
+
for (const msg of data.messages || []) {
|
|
63
|
+
console.log(`${msg.source}:${msg.id}`);
|
|
64
|
+
}
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const messages = data.messages || [];
|
|
68
|
+
const total = data.total ?? messages.length;
|
|
69
|
+
// Build retry column with access to the full row
|
|
70
|
+
const columns = COLUMNS.map((col) => {
|
|
71
|
+
if (col.key === 'retry_attempt') {
|
|
72
|
+
return {
|
|
73
|
+
...col,
|
|
74
|
+
format: (v) => v, // raw value — formatted in printTable
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
return col;
|
|
78
|
+
});
|
|
79
|
+
(0, format_1.output)(data, messages, columns, opts);
|
|
80
|
+
if (!opts.json && !opts.quiet && total > messages.length) {
|
|
81
|
+
const showing = messages.length;
|
|
82
|
+
console.log(` ${picocolors_1.default.dim(`Showing ${showing} of ${total} messages`)}\n`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
async function getMessage(id, opts) {
|
|
86
|
+
if (!opts.namespace) {
|
|
87
|
+
console.error(`\n ${picocolors_1.default.red('✗')} --namespace is required\n`);
|
|
88
|
+
process.exit(1);
|
|
89
|
+
}
|
|
90
|
+
// Fetch the message by ID — use list with a narrow filter
|
|
91
|
+
const params = new URLSearchParams();
|
|
92
|
+
params.set('namespace', opts.namespace);
|
|
93
|
+
params.set('limit', '1');
|
|
94
|
+
const data = await (0, client_1.apiFetch)(`/controlplane/stream-messages?${params}`);
|
|
95
|
+
const messages = data.messages || [];
|
|
96
|
+
// Find by ID in the results (ID search not directly supported, show the detail)
|
|
97
|
+
if (opts.json) {
|
|
98
|
+
console.log(JSON.stringify(data, null, 2));
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
if (messages.length === 0) {
|
|
102
|
+
console.log(`\n ${picocolors_1.default.dim('No messages found.')}\n`);
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
const msg = messages[0];
|
|
106
|
+
console.log(`\n ${picocolors_1.default.bold('Stream Message')} ${picocolors_1.default.dim(`${msg.source}:${msg.id}`)}`);
|
|
107
|
+
console.log(` Status: ${formatStreamStatus(msg.status)} Source: ${msg.source} Priority: ${msg.priority}`);
|
|
108
|
+
console.log(` Stream: ${msg.stream_name}`);
|
|
109
|
+
if (msg.msg_type)
|
|
110
|
+
console.log(` Type: ${msg.msg_type}`);
|
|
111
|
+
if (msg.workflow_name)
|
|
112
|
+
console.log(` Workflow: ${msg.workflow_name}`);
|
|
113
|
+
if (msg.jid)
|
|
114
|
+
console.log(` Job ID: ${msg.jid}`);
|
|
115
|
+
if (msg.aid)
|
|
116
|
+
console.log(` Activity: ${msg.aid}`);
|
|
117
|
+
console.log(` Created: ${(0, format_1.formatTime)(msg.created_at)}`);
|
|
118
|
+
if (msg.reserved_at)
|
|
119
|
+
console.log(` Reserved: ${(0, format_1.formatTime)(msg.reserved_at)} by ${msg.reserved_by || '—'}`);
|
|
120
|
+
if (msg.expired_at)
|
|
121
|
+
console.log(` Expired: ${(0, format_1.formatTime)(msg.expired_at)}`);
|
|
122
|
+
if (msg.dead_lettered_at)
|
|
123
|
+
console.log(` Dead-lettered: ${(0, format_1.formatTime)(msg.dead_lettered_at)}`);
|
|
124
|
+
console.log(` Retries: ${msg.retry_attempt}/${msg.max_retry_attempts}`);
|
|
125
|
+
try {
|
|
126
|
+
const parsed = JSON.parse(msg.message);
|
|
127
|
+
console.log(`\n ${picocolors_1.default.bold('Payload:')}`);
|
|
128
|
+
console.log(JSON.stringify(parsed, null, 2).split('\n').map((l) => ` ${l}`).join('\n'));
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
console.log(`\n ${picocolors_1.default.bold('Payload:')} ${msg.message}`);
|
|
132
|
+
}
|
|
133
|
+
console.log();
|
|
134
|
+
}
|
|
@@ -3,8 +3,7 @@
|
|
|
3
3
|
-- behaviors, and goals atop existing primitives.
|
|
4
4
|
|
|
5
5
|
CREATE TABLE IF NOT EXISTS lt_agents (
|
|
6
|
-
id
|
|
7
|
-
name TEXT UNIQUE NOT NULL,
|
|
6
|
+
id TEXT PRIMARY KEY,
|
|
8
7
|
description TEXT,
|
|
9
8
|
status TEXT NOT NULL DEFAULT 'inactive'
|
|
10
9
|
CHECK (status IN ('inactive', 'active', 'paused', 'error')),
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
CREATE TABLE IF NOT EXISTS lt_agent_subscriptions (
|
|
5
5
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
6
|
-
agent_id
|
|
6
|
+
agent_id TEXT NOT NULL REFERENCES lt_agents(id) ON DELETE CASCADE,
|
|
7
7
|
|
|
8
8
|
-- What to listen for
|
|
9
9
|
topic TEXT NOT NULL,
|
package/build/routes/agents.js
CHANGED
|
@@ -64,9 +64,9 @@ router.get('/:id', async (req, res) => {
|
|
|
64
64
|
* Create a new agent.
|
|
65
65
|
*/
|
|
66
66
|
router.post('/', async (req, res) => {
|
|
67
|
-
const {
|
|
68
|
-
if (!
|
|
69
|
-
res.status(400).json({ error: '
|
|
67
|
+
const { id } = req.body;
|
|
68
|
+
if (!id) {
|
|
69
|
+
res.status(400).json({ error: 'id is required (kebab-case agent name, e.g. "content-triage")' });
|
|
70
70
|
return;
|
|
71
71
|
}
|
|
72
72
|
const auth = { userId: req.userId, roles: req.roles };
|
|
@@ -87,6 +87,34 @@ router.get('/streams', auth_1.requireAdmin, async (req, res) => {
|
|
|
87
87
|
});
|
|
88
88
|
res.status(result.status).json(result.data ?? { error: result.error });
|
|
89
89
|
});
|
|
90
|
+
/**
|
|
91
|
+
* GET /api/controlplane/stream-messages?namespace=durable&source=worker
|
|
92
|
+
* &limit=25&offset=0&sort_by=created_at&order=desc
|
|
93
|
+
* &status=pending&stream_name=hmsh:durable:w:&msg_type=WORKER
|
|
94
|
+
*
|
|
95
|
+
* Browse stream messages with pagination, filtering, and sorting.
|
|
96
|
+
* Both namespace and source are required — engine and worker streams
|
|
97
|
+
* are separate tables with different schemas.
|
|
98
|
+
* Admin-only.
|
|
99
|
+
*/
|
|
100
|
+
router.get('/stream-messages', auth_1.requireAdmin, async (req, res) => {
|
|
101
|
+
const result = await api.listStreamMessages({
|
|
102
|
+
namespace: req.query.namespace,
|
|
103
|
+
source: req.query.source,
|
|
104
|
+
limit: req.query.limit ? parseInt(req.query.limit, 10) : undefined,
|
|
105
|
+
offset: req.query.offset ? parseInt(req.query.offset, 10) : undefined,
|
|
106
|
+
sort_by: req.query.sort_by || undefined,
|
|
107
|
+
order: req.query.order || undefined,
|
|
108
|
+
status: req.query.status || undefined,
|
|
109
|
+
stream_name: req.query.stream_name || undefined,
|
|
110
|
+
msg_type: req.query.msg_type || undefined,
|
|
111
|
+
topic: req.query.topic || undefined,
|
|
112
|
+
workflow_name: req.query.workflow_name || undefined,
|
|
113
|
+
jid: req.query.jid || undefined,
|
|
114
|
+
aid: req.query.aid || undefined,
|
|
115
|
+
});
|
|
116
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
117
|
+
});
|
|
90
118
|
/**
|
|
91
119
|
* POST /api/controlplane/subscribe
|
|
92
120
|
* Start the quorum→NATS bridge for an appId.
|
package/build/sdk/index.d.ts
CHANGED
|
@@ -287,6 +287,7 @@ export declare function createClient(options?: LTClientOptions): {
|
|
|
287
287
|
rollCall: typeof controlplaneApi.rollCall;
|
|
288
288
|
throttle: typeof controlplaneApi.applyThrottle;
|
|
289
289
|
getStreamStats: typeof controlplaneApi.getStreamStats;
|
|
290
|
+
listStreamMessages: typeof controlplaneApi.listStreamMessages;
|
|
290
291
|
subscribe: typeof controlplaneApi.subscribeMesh;
|
|
291
292
|
};
|
|
292
293
|
botAccounts: {
|
package/build/sdk/index.js
CHANGED
|
@@ -239,6 +239,7 @@ function createClient(options = {}) {
|
|
|
239
239
|
rollCall: controlplaneApi.rollCall,
|
|
240
240
|
throttle: controlplaneApi.applyThrottle,
|
|
241
241
|
getStreamStats: controlplaneApi.getStreamStats,
|
|
242
|
+
listStreamMessages: controlplaneApi.listStreamMessages,
|
|
242
243
|
subscribe: controlplaneApi.subscribeMesh,
|
|
243
244
|
},
|
|
244
245
|
// ── Bot Accounts ───────────────────────────────────────────────────────
|
|
@@ -10,9 +10,8 @@ export declare function listAgents(filters?: ListAgentsFilters): Promise<{
|
|
|
10
10
|
total: number;
|
|
11
11
|
}>;
|
|
12
12
|
export declare function getAgent(id: string): Promise<LTAgent | null>;
|
|
13
|
-
export declare function getAgentByName(name: string): Promise<LTAgent | null>;
|
|
14
13
|
export declare function createAgent(data: Partial<LTAgent> & {
|
|
15
|
-
|
|
14
|
+
id: string;
|
|
16
15
|
}): Promise<LTAgent>;
|
|
17
16
|
export declare function updateAgent(id: string, data: Partial<LTAgent>): Promise<LTAgent | null>;
|
|
18
17
|
export declare function deleteAgent(id: string): Promise<boolean>;
|
|
@@ -22,7 +21,7 @@ export declare function deleteAgent(id: string): Promise<boolean>;
|
|
|
22
21
|
* but do not overwrite.
|
|
23
22
|
*/
|
|
24
23
|
export declare function seedAgent(data: Partial<LTAgent> & {
|
|
25
|
-
|
|
24
|
+
id: string;
|
|
26
25
|
}): Promise<boolean>;
|
|
27
26
|
/**
|
|
28
27
|
* Aggregate stats for an agent: knowledge entry count, pending escalation count,
|
|
@@ -35,7 +35,6 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.listAgents = listAgents;
|
|
37
37
|
exports.getAgent = getAgent;
|
|
38
|
-
exports.getAgentByName = getAgentByName;
|
|
39
38
|
exports.createAgent = createAgent;
|
|
40
39
|
exports.updateAgent = updateAgent;
|
|
41
40
|
exports.deleteAgent = deleteAgent;
|
|
@@ -65,15 +64,10 @@ async function getAgent(id) {
|
|
|
65
64
|
const { rows } = await pool.query(sql_1.GET_AGENT, [id]);
|
|
66
65
|
return rows[0] ?? null;
|
|
67
66
|
}
|
|
68
|
-
async function getAgentByName(name) {
|
|
69
|
-
const pool = (0, db_1.getPool)();
|
|
70
|
-
const { rows } = await pool.query(sql_1.GET_AGENT_BY_NAME, [name]);
|
|
71
|
-
return rows[0] ?? null;
|
|
72
|
-
}
|
|
73
67
|
async function createAgent(data) {
|
|
74
68
|
const pool = (0, db_1.getPool)();
|
|
75
69
|
const { rows } = await pool.query(sql_1.INSERT_AGENT, [
|
|
76
|
-
data.
|
|
70
|
+
data.id,
|
|
77
71
|
data.description ?? null,
|
|
78
72
|
data.status ?? 'inactive',
|
|
79
73
|
data.user_id ?? null,
|
|
@@ -94,7 +88,6 @@ async function updateAgent(id, data) {
|
|
|
94
88
|
const oldAgent = data.status ? await getAgent(id) : null;
|
|
95
89
|
const { rows } = await pool.query(sql_1.UPDATE_AGENT, [
|
|
96
90
|
id,
|
|
97
|
-
data.name ?? null,
|
|
98
91
|
data.description ?? null,
|
|
99
92
|
data.status ?? null,
|
|
100
93
|
data.user_id ?? null,
|
|
@@ -113,7 +106,7 @@ async function updateAgent(id, data) {
|
|
|
113
106
|
(0, publish_1.publishAgentEvent)({
|
|
114
107
|
type: 'agent.status_changed',
|
|
115
108
|
agentId: updated.id,
|
|
116
|
-
agentName: updated.
|
|
109
|
+
agentName: updated.id,
|
|
117
110
|
status: updated.status,
|
|
118
111
|
data: { previous: oldAgent.status },
|
|
119
112
|
});
|
|
@@ -141,7 +134,7 @@ async function deleteAgent(id) {
|
|
|
141
134
|
async function seedAgent(data) {
|
|
142
135
|
const pool = (0, db_1.getPool)();
|
|
143
136
|
const { rowCount } = await pool.query(sql_1.SEED_AGENT, [
|
|
144
|
-
data.
|
|
137
|
+
data.id,
|
|
145
138
|
data.description ?? null,
|
|
146
139
|
data.status ?? 'inactive',
|
|
147
140
|
data.user_id ?? null,
|
|
@@ -156,7 +149,7 @@ async function seedAgent(data) {
|
|
|
156
149
|
]);
|
|
157
150
|
const inserted = (rowCount ?? 0) > 0;
|
|
158
151
|
if (!inserted) {
|
|
159
|
-
const existing = await
|
|
152
|
+
const existing = await getAgent(data.id);
|
|
160
153
|
if (existing) {
|
|
161
154
|
const drifts = [];
|
|
162
155
|
if (data.description && existing.description !== data.description)
|
|
@@ -166,7 +159,7 @@ async function seedAgent(data) {
|
|
|
166
159
|
if (data.knowledge_domain && existing.knowledge_domain !== data.knowledge_domain)
|
|
167
160
|
drifts.push('knowledge_domain');
|
|
168
161
|
if (drifts.length) {
|
|
169
|
-
logger_1.loggerRegistry.warn(`[long-tail] agent drift: ${data.
|
|
162
|
+
logger_1.loggerRegistry.warn(`[long-tail] agent drift: ${data.id} — ${drifts.join(', ')} differ between code and DB`);
|
|
170
163
|
}
|
|
171
164
|
}
|
|
172
165
|
}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
export declare const LIST_AGENTS = "\n SELECT a.*,\n COALESCE(s.sub_count, 0)::int AS subscription_count,\n s.sub_topics\n FROM lt_agents a\n LEFT JOIN LATERAL (\n SELECT COUNT(*)::int AS sub_count,\n array_agg(topic ORDER BY created_at) AS sub_topics\n FROM lt_agent_subscriptions\n WHERE agent_id = a.id AND enabled = true\n ) s ON true\n WHERE ($1::text IS NULL OR a.status = $1)\n AND ($2::text IS NULL OR a.knowledge_domain = $2)\n ORDER BY a.updated_at DESC\n LIMIT $3 OFFSET $4\n";
|
|
2
2
|
export declare const COUNT_AGENTS = "\n SELECT COUNT(*)::int AS total FROM lt_agents\n WHERE ($1::text IS NULL OR status = $1)\n AND ($2::text IS NULL OR knowledge_domain = $2)\n";
|
|
3
3
|
export declare const GET_AGENT = "\n SELECT * FROM lt_agents WHERE id = $1\n";
|
|
4
|
-
export declare const
|
|
5
|
-
export declare const
|
|
6
|
-
export declare const UPDATE_AGENT = "\n UPDATE lt_agents SET\n name = COALESCE($2, name),\n description = COALESCE($3, description),\n status = COALESCE($4, status),\n user_id = COALESCE($5, user_id),\n knowledge_domain = COALESCE($6, knowledge_domain),\n capabilities = COALESCE($7, capabilities),\n behaviors = COALESCE($8, behaviors),\n goals = COALESCE($9, goals),\n rules = COALESCE($10, rules),\n workflow_type = COALESCE($11, workflow_type),\n pipeline_id = COALESCE($12, pipeline_id),\n metadata = COALESCE($13, metadata),\n last_run_at = COALESCE($14, last_run_at)\n WHERE id = $1\n RETURNING *\n";
|
|
4
|
+
export declare const INSERT_AGENT = "\n INSERT INTO lt_agents (id, description, status, user_id, knowledge_domain,\n capabilities, behaviors, goals, rules, workflow_type, pipeline_id, metadata)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)\n RETURNING *\n";
|
|
5
|
+
export declare const UPDATE_AGENT = "\n UPDATE lt_agents SET\n description = COALESCE($2, description),\n status = COALESCE($3, status),\n user_id = COALESCE($4, user_id),\n knowledge_domain = COALESCE($5, knowledge_domain),\n capabilities = COALESCE($6, capabilities),\n behaviors = COALESCE($7, behaviors),\n goals = COALESCE($8, goals),\n rules = COALESCE($9, rules),\n workflow_type = COALESCE($10, workflow_type),\n pipeline_id = COALESCE($11, pipeline_id),\n metadata = COALESCE($12, metadata),\n last_run_at = COALESCE($13, last_run_at)\n WHERE id = $1\n RETURNING *\n";
|
|
7
6
|
export declare const DELETE_AGENT = "\n DELETE FROM lt_agents WHERE id = $1\n";
|
|
8
|
-
export declare const SEED_AGENT = "\n INSERT INTO lt_agents (
|
|
7
|
+
export declare const SEED_AGENT = "\n INSERT INTO lt_agents (id, description, status, user_id, knowledge_domain,\n capabilities, behaviors, goals, rules, workflow_type, pipeline_id, metadata)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)\n ON CONFLICT (id) DO NOTHING\n";
|
|
9
8
|
export declare const KNOWLEDGE_COUNT = "\n SELECT COUNT(*)::int AS count FROM lt_knowledge WHERE domain = $1\n";
|
|
10
9
|
export declare const ESCALATION_COUNT = "\n SELECT COUNT(*)::int AS count FROM lt_escalations\n WHERE status = 'pending' AND created_by = $1\n";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ESCALATION_COUNT = exports.KNOWLEDGE_COUNT = exports.SEED_AGENT = exports.DELETE_AGENT = exports.UPDATE_AGENT = exports.INSERT_AGENT = exports.
|
|
3
|
+
exports.ESCALATION_COUNT = exports.KNOWLEDGE_COUNT = exports.SEED_AGENT = exports.DELETE_AGENT = exports.UPDATE_AGENT = exports.INSERT_AGENT = exports.GET_AGENT = exports.COUNT_AGENTS = exports.LIST_AGENTS = void 0;
|
|
4
4
|
exports.LIST_AGENTS = `
|
|
5
5
|
SELECT a.*,
|
|
6
6
|
COALESCE(s.sub_count, 0)::int AS subscription_count,
|
|
@@ -25,30 +25,26 @@ exports.COUNT_AGENTS = `
|
|
|
25
25
|
exports.GET_AGENT = `
|
|
26
26
|
SELECT * FROM lt_agents WHERE id = $1
|
|
27
27
|
`;
|
|
28
|
-
exports.GET_AGENT_BY_NAME = `
|
|
29
|
-
SELECT * FROM lt_agents WHERE name = $1
|
|
30
|
-
`;
|
|
31
28
|
exports.INSERT_AGENT = `
|
|
32
|
-
INSERT INTO lt_agents (
|
|
29
|
+
INSERT INTO lt_agents (id, description, status, user_id, knowledge_domain,
|
|
33
30
|
capabilities, behaviors, goals, rules, workflow_type, pipeline_id, metadata)
|
|
34
31
|
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)
|
|
35
32
|
RETURNING *
|
|
36
33
|
`;
|
|
37
34
|
exports.UPDATE_AGENT = `
|
|
38
35
|
UPDATE lt_agents SET
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
last_run_at = COALESCE($14, last_run_at)
|
|
36
|
+
description = COALESCE($2, description),
|
|
37
|
+
status = COALESCE($3, status),
|
|
38
|
+
user_id = COALESCE($4, user_id),
|
|
39
|
+
knowledge_domain = COALESCE($5, knowledge_domain),
|
|
40
|
+
capabilities = COALESCE($6, capabilities),
|
|
41
|
+
behaviors = COALESCE($7, behaviors),
|
|
42
|
+
goals = COALESCE($8, goals),
|
|
43
|
+
rules = COALESCE($9, rules),
|
|
44
|
+
workflow_type = COALESCE($10, workflow_type),
|
|
45
|
+
pipeline_id = COALESCE($11, pipeline_id),
|
|
46
|
+
metadata = COALESCE($12, metadata),
|
|
47
|
+
last_run_at = COALESCE($13, last_run_at)
|
|
52
48
|
WHERE id = $1
|
|
53
49
|
RETURNING *
|
|
54
50
|
`;
|
|
@@ -56,10 +52,10 @@ exports.DELETE_AGENT = `
|
|
|
56
52
|
DELETE FROM lt_agents WHERE id = $1
|
|
57
53
|
`;
|
|
58
54
|
exports.SEED_AGENT = `
|
|
59
|
-
INSERT INTO lt_agents (
|
|
55
|
+
INSERT INTO lt_agents (id, description, status, user_id, knowledge_domain,
|
|
60
56
|
capabilities, behaviors, goals, rules, workflow_type, pipeline_id, metadata)
|
|
61
57
|
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)
|
|
62
|
-
ON CONFLICT (
|
|
58
|
+
ON CONFLICT (id) DO NOTHING
|
|
63
59
|
`;
|
|
64
60
|
exports.KNOWLEDGE_COUNT = `
|
|
65
61
|
SELECT COUNT(*)::int AS count FROM lt_knowledge WHERE domain = $1
|
|
@@ -4,4 +4,4 @@ export declare const INSERT_SUBSCRIPTION = "\n INSERT INTO lt_agent_subscriptio
|
|
|
4
4
|
export declare const UPDATE_SUBSCRIPTION = "\n UPDATE lt_agent_subscriptions SET\n topic = COALESCE($2, topic),\n filter = COALESCE($3, filter),\n reaction_type = COALESCE($4, reaction_type),\n workflow_type = COALESCE($5, workflow_type),\n pipeline_id = COALESCE($6, pipeline_id),\n mcp_prompt = COALESCE($7, mcp_prompt),\n input_mapping = COALESCE($8, input_mapping),\n execute_as = COALESCE($9, execute_as),\n enabled = COALESCE($10, enabled)\n WHERE id = $1\n RETURNING *\n";
|
|
5
5
|
export declare const DELETE_SUBSCRIPTION = "\n DELETE FROM lt_agent_subscriptions WHERE id = $1\n";
|
|
6
6
|
export declare const SEED_SUBSCRIPTION = "\n INSERT INTO lt_agent_subscriptions\n (agent_id, topic, filter, reaction_type, workflow_type, pipeline_id, mcp_prompt,\n input_mapping, execute_as, enabled)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, true)\n ON CONFLICT (agent_id, topic) DO NOTHING\n";
|
|
7
|
-
export declare const LIST_ACTIVE_SUBSCRIPTIONS = "\n SELECT s.*, a.
|
|
7
|
+
export declare const LIST_ACTIVE_SUBSCRIPTIONS = "\n SELECT s.*, a.id AS agent_name, a.user_id AS agent_user_id\n FROM lt_agent_subscriptions s\n JOIN lt_agents a ON s.agent_id = a.id\n WHERE s.enabled = true AND a.status = 'active'\n ORDER BY s.created_at\n";
|
|
@@ -41,7 +41,7 @@ exports.SEED_SUBSCRIPTION = `
|
|
|
41
41
|
ON CONFLICT (agent_id, topic) DO NOTHING
|
|
42
42
|
`;
|
|
43
43
|
exports.LIST_ACTIVE_SUBSCRIPTIONS = `
|
|
44
|
-
SELECT s.*, a.
|
|
44
|
+
SELECT s.*, a.id AS agent_name, a.user_id AS agent_user_id
|
|
45
45
|
FROM lt_agent_subscriptions s
|
|
46
46
|
JOIN lt_agents a ON s.agent_id = a.id
|
|
47
47
|
WHERE s.enabled = true AND a.status = 'active'
|
|
@@ -188,7 +188,7 @@ class AgentTriggerRegistry {
|
|
|
188
188
|
.update(`${event.timestamp}:${event.type}:${JSON.stringify(event.data ?? {})}`)
|
|
189
189
|
.digest('hex')
|
|
190
190
|
.slice(0, 12);
|
|
191
|
-
return `agent-${sub.agent_id
|
|
191
|
+
return `agent-${sub.agent_id}-${sub.id.slice(0, 8)}-${uniquePart}`;
|
|
192
192
|
}
|
|
193
193
|
async executeReaction(sub, mapped, deterministicId) {
|
|
194
194
|
switch (sub.reaction_type) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { HotMesh } from '@hotmeshio/hotmesh';
|
|
2
2
|
import type { QuorumProfile, ThrottleOptions } from '@hotmeshio/hotmesh/build/types/quorum';
|
|
3
|
-
import type { ControlPlaneApp, StreamStats } from './types';
|
|
3
|
+
import type { ControlPlaneApp, StreamStats, StreamMessagesParams, StreamMessagesResult } from './types';
|
|
4
4
|
export type { QuorumProfile, ThrottleOptions };
|
|
5
5
|
/**
|
|
6
6
|
* Get or create a read-only HotMesh engine for control plane operations.
|
|
@@ -34,6 +34,14 @@ export declare function applyThrottle(appId: string, options: ThrottleOptions):
|
|
|
34
34
|
* @param streamName — optional: filter to a specific stream (task queue topic)
|
|
35
35
|
*/
|
|
36
36
|
export declare function getStreamStats(schema: string, duration?: string, streamName?: string | null): Promise<StreamStats>;
|
|
37
|
+
/**
|
|
38
|
+
* Browse stream messages across engine_streams and worker_streams tables
|
|
39
|
+
* with pagination, filtering, and sorting.
|
|
40
|
+
*
|
|
41
|
+
* @param schema — the Postgres schema (namespace, e.g. "durable")
|
|
42
|
+
* @param params — pagination, filter, and sort options
|
|
43
|
+
*/
|
|
44
|
+
export declare function getStreamMessages(schema: string, params: StreamMessagesParams): Promise<StreamMessagesResult>;
|
|
37
45
|
/**
|
|
38
46
|
* Start the quorum→NATS bridge for an appId.
|
|
39
47
|
* Subscribes to the HotMesh quorum channel and republishes
|