@hotmeshio/long-tail 0.1.21 → 0.2.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/agent-subscriptions.d.ts +15 -0
- package/build/api/agent-subscriptions.js +82 -0
- package/build/api/agents.d.ts +21 -0
- package/build/api/agents.js +100 -0
- package/build/api/capabilities.d.ts +2 -0
- package/build/api/capabilities.js +76 -0
- package/build/index.d.ts +2 -2
- package/build/index.js +5 -2
- package/build/lib/db/schemas/003_agents.sql +46 -0
- package/build/lib/db/schemas/004_agent_subscriptions.sql +38 -0
- package/build/lib/db/schemas/005_server_category.sql +6 -0
- package/build/lib/db/schemas/006_agent_sub_unique.sql +9 -0
- package/build/lib/events/callback.d.ts +4 -18
- package/build/lib/events/callback.js +8 -45
- package/build/lib/events/matching.d.ts +13 -0
- package/build/lib/events/matching.js +31 -0
- package/build/lib/events/publish.d.ts +20 -0
- package/build/lib/events/publish.js +33 -0
- package/build/routes/agents.d.ts +2 -0
- package/build/routes/agents.js +130 -0
- package/build/routes/capabilities.d.ts +2 -0
- package/build/routes/capabilities.js +47 -0
- package/build/routes/index.js +4 -0
- package/build/sdk/index.d.ts +13 -0
- package/build/sdk/index.js +14 -0
- package/build/services/agent/index.d.ts +32 -0
- package/build/services/agent/index.js +195 -0
- package/build/services/agent/input-mapper.d.ts +18 -0
- package/build/services/agent/input-mapper.js +51 -0
- package/build/services/agent/sql.d.ts +10 -0
- package/build/services/agent/sql.js +70 -0
- package/build/services/agent/subscription-sql.d.ts +7 -0
- package/build/services/agent/subscription-sql.js +49 -0
- package/build/services/agent/subscriptions.d.ts +30 -0
- package/build/services/agent/subscriptions.js +82 -0
- package/build/services/agent/trigger-registry.d.ts +45 -0
- package/build/services/agent/trigger-registry.js +232 -0
- package/build/services/cron/index.d.ts +17 -1
- package/build/services/cron/index.js +152 -4
- package/build/services/insight/index.js +11 -6
- package/build/services/mcp/db.d.ts +1 -0
- package/build/services/mcp/db.js +1 -0
- package/build/services/mcp/sql.d.ts +1 -1
- package/build/services/mcp/sql.js +2 -2
- package/build/start/workers.js +67 -0
- package/build/system/activities/knowledge.js +9 -2
- package/build/system/index.d.ts +2 -1
- package/build/system/index.js +93 -1
- package/build/system/mcp-servers/events.d.ts +5 -0
- package/build/system/mcp-servers/events.js +104 -0
- package/build/system/mcp-servers/playwright/schemas.d.ts +6 -6
- package/build/system/seed/tool-manifests-events.d.ts +37 -0
- package/build/system/seed/tool-manifests-events.js +30 -0
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/agent.d.ts +72 -0
- package/build/types/agent.js +6 -0
- package/build/types/events.d.ts +7 -1
- package/build/types/index.d.ts +2 -1
- package/build/types/mcp.d.ts +2 -0
- package/build/types/startup.d.ts +37 -0
- package/dashboard/dist/assets/{AdminDashboard-CsTOErp1.js → AdminDashboard-DThDjhN5.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-CsTOErp1.js.map → AdminDashboard-DThDjhN5.js.map} +1 -1
- package/dashboard/dist/assets/AgentConfigPage-NgxblxBW.js +13 -0
- package/dashboard/dist/assets/AgentConfigPage-NgxblxBW.js.map +1 -0
- package/dashboard/dist/assets/AgentDetailPage-DMS46nYY.js +4 -0
- package/dashboard/dist/assets/AgentDetailPage-DMS46nYY.js.map +1 -0
- package/dashboard/dist/assets/AgentsPage-pKfjHe4u.js +2 -0
- package/dashboard/dist/assets/AgentsPage-pKfjHe4u.js.map +1 -0
- package/dashboard/dist/assets/{AvailableEscalationsPage-BqQA3IJp.js → AvailableEscalationsPage-BFzHVnPh.js} +2 -2
- package/dashboard/dist/assets/{AvailableEscalationsPage-BqQA3IJp.js.map → AvailableEscalationsPage-BFzHVnPh.js.map} +1 -1
- package/dashboard/dist/assets/BotPicker-Zxf7Npew.js +2 -0
- package/dashboard/dist/assets/BotPicker-Zxf7Npew.js.map +1 -0
- package/dashboard/dist/assets/CapabilitiesPage-6zOJ12cB.js +2 -0
- package/dashboard/dist/assets/CapabilitiesPage-6zOJ12cB.js.map +1 -0
- package/dashboard/dist/assets/{CollapsibleSection-CRtHQsAv.js → CollapsibleSection-DvBx4tmw.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-CRtHQsAv.js.map → CollapsibleSection-DvBx4tmw.js.map} +1 -1
- package/dashboard/dist/assets/{CredentialsPage-C7XT1bnO.js → CredentialsPage-C5f-Bg-o.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-C7XT1bnO.js.map → CredentialsPage-C5f-Bg-o.js.map} +1 -1
- package/dashboard/dist/assets/CronLabel-CAVTt5AG.js +2 -0
- package/dashboard/dist/assets/CronLabel-CAVTt5AG.js.map +1 -0
- package/dashboard/dist/assets/{CustomDurationPicker-BABUv1V2.js → CustomDurationPicker-Bk7D38y7.js} +2 -2
- package/dashboard/dist/assets/{CustomDurationPicker-BABUv1V2.js.map → CustomDurationPicker-Bk7D38y7.js.map} +1 -1
- package/dashboard/dist/assets/{DataTable-D3-wSEf0.js → DataTable-D9yuBv0w.js} +2 -2
- package/dashboard/dist/assets/{DataTable-D3-wSEf0.js.map → DataTable-D9yuBv0w.js.map} +1 -1
- package/dashboard/dist/assets/{DropZone-DHKmMqRA.js → DropZone-2mGyDo1P.js} +2 -2
- package/dashboard/dist/assets/{DropZone-DHKmMqRA.js.map → DropZone-2mGyDo1P.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-DrJif03B.js → ElapsedCell-BpJjG1s-.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-DrJif03B.js.map → ElapsedCell-BpJjG1s-.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-H6CwfeR-.js → EscalationsOverview-DPNd1vjF.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-H6CwfeR-.js.map → EscalationsOverview-DPNd1vjF.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-Dh3_9DAY.js → EventTable-BoP8KC3M.js} +2 -2
- package/dashboard/dist/assets/{EventTable-Dh3_9DAY.js.map → EventTable-BoP8KC3M.js.map} +1 -1
- package/dashboard/dist/assets/EventTopicPill-BUxxvpNg.js +2 -0
- package/dashboard/dist/assets/EventTopicPill-BUxxvpNg.js.map +1 -0
- package/dashboard/dist/assets/HomePage-h8I5ZolJ.js +2 -0
- package/dashboard/dist/assets/HomePage-h8I5ZolJ.js.map +1 -0
- package/dashboard/dist/assets/ListToolbar-BaYIIsAt.js +2 -0
- package/dashboard/dist/assets/ListToolbar-BaYIIsAt.js.map +1 -0
- package/dashboard/dist/assets/{McpOverview-ChLa6Gl7.js → McpOverview-BhZ3lSO6.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-ChLa6Gl7.js.map → McpOverview-BhZ3lSO6.js.map} +1 -1
- package/dashboard/dist/assets/McpQueryDetailPage-DVgcKa61.js +5 -0
- package/dashboard/dist/assets/McpQueryDetailPage-DVgcKa61.js.map +1 -0
- package/dashboard/dist/assets/{McpQueryPage-D2DmDFPu.js → McpQueryPage-CTWOBqKT.js} +2 -2
- package/dashboard/dist/assets/{McpQueryPage-D2DmDFPu.js.map → McpQueryPage-CTWOBqKT.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunDetailPage-ERVuNEEK.js → McpRunDetailPage-CIpZJWRB.js} +2 -2
- package/dashboard/dist/assets/{McpRunDetailPage-ERVuNEEK.js.map → McpRunDetailPage-CIpZJWRB.js.map} +1 -1
- package/dashboard/dist/assets/McpRunsPage-B3zpzPBf.js +2 -0
- package/dashboard/dist/assets/McpRunsPage-B3zpzPBf.js.map +1 -0
- package/dashboard/dist/assets/{OperatorDashboard-CJm_BTPU.js → OperatorDashboard-l2hVlIF3.js} +2 -2
- package/dashboard/dist/assets/{OperatorDashboard-CJm_BTPU.js.map → OperatorDashboard-l2hVlIF3.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeader-B-SN5GZ2.js → PageHeader-DLjHNYHX.js} +2 -2
- package/dashboard/dist/assets/{PageHeader-B-SN5GZ2.js.map → PageHeader-DLjHNYHX.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeaderWithStats-BZ3AGT5s.js → PageHeaderWithStats-Oljg3n4j.js} +2 -2
- package/dashboard/dist/assets/{PageHeaderWithStats-BZ3AGT5s.js.map → PageHeaderWithStats-Oljg3n4j.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessDetailPage-vfnCDyQK.js → ProcessDetailPage-BJ1rhK9_.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-vfnCDyQK.js.map → ProcessDetailPage-BJ1rhK9_.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessesListPage-DcAN6AJK.js → ProcessesListPage-IQKk_qkn.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-DcAN6AJK.js.map → ProcessesListPage-IQKk_qkn.js.map} +1 -1
- package/dashboard/dist/assets/RolePill-Bp10-WfX.js +2 -0
- package/dashboard/dist/assets/RolePill-Bp10-WfX.js.map +1 -0
- package/dashboard/dist/assets/{RolesPage-DYSt2aAr.js → RolesPage-Dwcirtze.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-DYSt2aAr.js.map → RolesPage-Dwcirtze.js.map} +1 -1
- package/dashboard/dist/assets/RunAsSelector-D4Fu8LVG.js +2 -0
- package/dashboard/dist/assets/RunAsSelector-D4Fu8LVG.js.map +1 -0
- package/dashboard/dist/assets/ServerName-C9lUCFYb.js +2 -0
- package/dashboard/dist/assets/ServerName-C9lUCFYb.js.map +1 -0
- package/dashboard/dist/assets/SwimlaneTimeline-DQqgvwmC.js +2 -0
- package/dashboard/dist/assets/SwimlaneTimeline-DQqgvwmC.js.map +1 -0
- package/dashboard/dist/assets/{TagInput-DftaRHDV.js → TagInput-Dkljw_WI.js} +2 -2
- package/dashboard/dist/assets/{TagInput-DftaRHDV.js.map → TagInput-Dkljw_WI.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-BoA-cfwW.js → TaskDetailPage-AHBMSHAA.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-BoA-cfwW.js.map → TaskDetailPage-AHBMSHAA.js.map} +1 -1
- package/dashboard/dist/assets/{TaskQueuePill-Ce8KlXtR.js → TaskQueuePill-DPwm25Cc.js} +2 -2
- package/dashboard/dist/assets/{TaskQueuePill-Ce8KlXtR.js.map → TaskQueuePill-DPwm25Cc.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-g6XIbhju.js → TasksListPage-CnJdTsoX.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-g6XIbhju.js.map → TasksListPage-CnJdTsoX.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-BihIwEbB.js → TimeAgo-C3A1r1Cv.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-BihIwEbB.js.map → TimeAgo-C3A1r1Cv.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-GOFcvE-i.js → TimestampCell-DPfLR6bZ.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-GOFcvE-i.js.map → TimestampCell-DPfLR6bZ.js.map} +1 -1
- package/dashboard/dist/assets/ToolPill-D_DIWFJ5.js +2 -0
- package/dashboard/dist/assets/ToolPill-D_DIWFJ5.js.map +1 -0
- package/dashboard/dist/assets/ToolTestPanel-CwZ9zkD-.js +2 -0
- package/dashboard/dist/assets/ToolTestPanel-CwZ9zkD-.js.map +1 -0
- package/dashboard/dist/assets/{UserName-CmMVt4vS.js → UserName-ClO0a6Ar.js} +2 -2
- package/dashboard/dist/assets/{UserName-CmMVt4vS.js.map → UserName-ClO0a6Ar.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowExecutionPage-soRFz_30.js → WorkflowExecutionPage-B-2aHAHK.js} +2 -2
- package/dashboard/dist/assets/{WorkflowExecutionPage-soRFz_30.js.map → WorkflowExecutionPage-B-2aHAHK.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowPill-DUDDyBsj.js → WorkflowPill-BbgVTGgI.js} +2 -2
- package/dashboard/dist/assets/WorkflowPill-BbgVTGgI.js.map +1 -0
- package/dashboard/dist/assets/WorkflowsDashboard-NtiQKl_i.js +2 -0
- package/dashboard/dist/assets/WorkflowsDashboard-NtiQKl_i.js.map +1 -0
- package/dashboard/dist/assets/{WorkflowsOverview-z3Ztiz1y.js → WorkflowsOverview-BQip_pvL.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-z3Ztiz1y.js.map → WorkflowsOverview-BQip_pvL.js.map} +1 -1
- package/dashboard/dist/assets/YamlWorkflowsPage-BWFCVQ8b.js +2 -0
- package/dashboard/dist/assets/YamlWorkflowsPage-BWFCVQ8b.js.map +1 -0
- package/dashboard/dist/assets/agents-5APoyRH8.js +2 -0
- package/dashboard/dist/assets/agents-5APoyRH8.js.map +1 -0
- package/dashboard/dist/assets/{bots-BZPXDh_y.js → bots-BoDH-pS7.js} +2 -2
- package/dashboard/dist/assets/{bots-BZPXDh_y.js.map → bots-BoDH-pS7.js.map} +1 -1
- package/dashboard/dist/assets/controlplane-D4NhQux3.js +2 -0
- package/dashboard/dist/assets/controlplane-D4NhQux3.js.map +1 -0
- package/dashboard/dist/assets/{escalation-DBUIq1Z4.js → escalation-BD2wtAt2.js} +2 -2
- package/dashboard/dist/assets/{escalation-DBUIq1Z4.js.map → escalation-BD2wtAt2.js.map} +1 -1
- package/dashboard/dist/assets/escalation-columns-DjHcNgjo.js +2 -0
- package/dashboard/dist/assets/{escalation-columns-DL4zsR8Y.js.map → escalation-columns-DjHcNgjo.js.map} +1 -1
- package/dashboard/dist/assets/{helpers-D50KFFkI.js → helpers-D1ZPA4kI.js} +2 -2
- package/dashboard/dist/assets/{helpers-D50KFFkI.js.map → helpers-D1ZPA4kI.js.map} +1 -1
- package/dashboard/dist/assets/index-B-Z9TisY.js +2 -0
- package/dashboard/dist/assets/index-B-Z9TisY.js.map +1 -0
- package/dashboard/dist/assets/index-B6vQeWwf.js +6 -0
- package/dashboard/dist/assets/index-B6vQeWwf.js.map +1 -0
- package/dashboard/dist/assets/{index-D9_hZmsW.js → index-BD2vW8MG.js} +3 -3
- package/dashboard/dist/assets/{index-D9_hZmsW.js.map → index-BD2vW8MG.js.map} +1 -1
- package/dashboard/dist/assets/index-BciXgS35.css +1 -0
- package/dashboard/dist/assets/index-BgJR7kwH.js +2 -0
- package/dashboard/dist/assets/index-BgJR7kwH.js.map +1 -0
- package/dashboard/dist/assets/index-D9qswqDQ.js +2 -0
- package/dashboard/dist/assets/{index-BpoHVMV7.js.map → index-D9qswqDQ.js.map} +1 -1
- package/dashboard/dist/assets/index-DC7f6rWu.js +2 -0
- package/dashboard/dist/assets/{index-CEnDYJOO.js.map → index-DC7f6rWu.js.map} +1 -1
- package/dashboard/dist/assets/{index-B-jzKfuv.js → index-Zn5XforP.js} +2 -2
- package/dashboard/dist/assets/{index-B-jzKfuv.js.map → index-Zn5XforP.js.map} +1 -1
- package/dashboard/dist/assets/index-_5qNyf9o.js +2 -0
- package/dashboard/dist/assets/index-_5qNyf9o.js.map +1 -0
- package/dashboard/dist/assets/index-_dKxJhey.js +2 -0
- package/dashboard/dist/assets/{index-DzICLMI7.js.map → index-_dKxJhey.js.map} +1 -1
- package/dashboard/dist/assets/index-jp94-YlF.js +2 -0
- package/dashboard/dist/assets/index-jp94-YlF.js.map +1 -0
- package/dashboard/dist/assets/{index-BUjxYyxc.js → index-oGYUhkFa.js} +27 -27
- package/dashboard/dist/assets/index-oGYUhkFa.js.map +1 -0
- package/dashboard/dist/assets/index-qdYsS9h2.js +15 -0
- package/dashboard/dist/assets/index-qdYsS9h2.js.map +1 -0
- package/dashboard/dist/assets/knowledge-DsAU_TGL.js +2 -0
- package/dashboard/dist/assets/knowledge-DsAU_TGL.js.map +1 -0
- package/dashboard/dist/assets/{mcp-D0GrHRFe.js → mcp-CA3OeIyH.js} +2 -2
- package/dashboard/dist/assets/{mcp-D0GrHRFe.js.map → mcp-CA3OeIyH.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-DC5woQn5.js → mcp-query-BgmTDc7h.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-DC5woQn5.js.map → mcp-query-BgmTDc7h.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-runs-CsoVQoPB.js → mcp-runs-C-FK2SyD.js} +2 -2
- package/dashboard/dist/assets/{mcp-runs-CsoVQoPB.js.map → mcp-runs-C-FK2SyD.js.map} +1 -1
- package/dashboard/dist/assets/{namespaces-unpIb4gX.js → namespaces-B8KNk0Jb.js} +2 -2
- package/dashboard/dist/assets/{namespaces-unpIb4gX.js.map → namespaces-B8KNk0Jb.js.map} +1 -1
- package/dashboard/dist/assets/{roles--kBaFljg.js → roles-BAPy1LU_.js} +2 -2
- package/dashboard/dist/assets/{roles--kBaFljg.js.map → roles-BAPy1LU_.js.map} +1 -1
- package/dashboard/dist/assets/{settings-B96YkawY.js → settings-Da0QSQDH.js} +2 -2
- package/dashboard/dist/assets/{settings-B96YkawY.js.map → settings-Da0QSQDH.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-D_1NCfOZ.js → tasks-BHlTusW0.js} +2 -2
- package/dashboard/dist/assets/{tasks-D_1NCfOZ.js.map → tasks-BHlTusW0.js.map} +1 -1
- package/dashboard/dist/assets/useEventHooks-DBMdj9vw.js +2 -0
- package/dashboard/dist/assets/useEventHooks-DBMdj9vw.js.map +1 -0
- package/dashboard/dist/assets/{useYamlActivityEvents-D3RQjfzo.js → useYamlActivityEvents-BH_ynR_L.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-D3RQjfzo.js.map → useYamlActivityEvents-BH_ynR_L.js.map} +1 -1
- package/dashboard/dist/assets/{users-e2oatvoj.js → users-C9K2cMyb.js} +2 -2
- package/dashboard/dist/assets/{users-e2oatvoj.js.map → users-C9K2cMyb.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-BkK55L-1.js → vendor-icons-E6836lXZ.js} +140 -95
- package/dashboard/dist/assets/vendor-icons-E6836lXZ.js.map +1 -0
- package/dashboard/dist/assets/workflows-B2rsLjoh.js +2 -0
- package/dashboard/dist/assets/workflows-B2rsLjoh.js.map +1 -0
- package/dashboard/dist/assets/{yaml-workflows-CAKU7LUu.js → yaml-workflows-BLiTvQM2.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-CAKU7LUu.js.map → yaml-workflows-BLiTvQM2.js.map} +1 -1
- package/dashboard/dist/index.html +3 -3
- package/docs/agents.md +160 -0
- package/docs/api/http/agents.md +201 -0
- package/docs/api/sdk/agents.md +138 -0
- package/docs/story.md +101 -78
- package/package.json +3 -3
- package/dashboard/dist/assets/BotPicker-C2xR1xay.js +0 -2
- package/dashboard/dist/assets/BotPicker-C2xR1xay.js.map +0 -1
- package/dashboard/dist/assets/ListToolbar-CyEkulVR.js +0 -2
- package/dashboard/dist/assets/ListToolbar-CyEkulVR.js.map +0 -1
- package/dashboard/dist/assets/McpQueryDetailPage-5Dsj6PlL.js +0 -5
- package/dashboard/dist/assets/McpQueryDetailPage-5Dsj6PlL.js.map +0 -1
- package/dashboard/dist/assets/McpRunsPage-BKba-3Wl.js +0 -2
- package/dashboard/dist/assets/McpRunsPage-BKba-3Wl.js.map +0 -1
- package/dashboard/dist/assets/RolePill-BhVC0cc3.js +0 -2
- package/dashboard/dist/assets/RolePill-BhVC0cc3.js.map +0 -1
- package/dashboard/dist/assets/RunAsSelector-CD7_Dmb0.js +0 -2
- package/dashboard/dist/assets/RunAsSelector-CD7_Dmb0.js.map +0 -1
- package/dashboard/dist/assets/SwimlaneTimeline-CUl5RdXU.js +0 -2
- package/dashboard/dist/assets/SwimlaneTimeline-CUl5RdXU.js.map +0 -1
- package/dashboard/dist/assets/WorkflowPill-DUDDyBsj.js.map +0 -1
- package/dashboard/dist/assets/WorkflowsDashboard-Be1A1zAT.js +0 -2
- package/dashboard/dist/assets/WorkflowsDashboard-Be1A1zAT.js.map +0 -1
- package/dashboard/dist/assets/YamlWorkflowsPage-C6qzcQcJ.js +0 -2
- package/dashboard/dist/assets/YamlWorkflowsPage-C6qzcQcJ.js.map +0 -1
- package/dashboard/dist/assets/escalation-columns-DL4zsR8Y.js +0 -2
- package/dashboard/dist/assets/index-B-ioA6yv.js +0 -2
- package/dashboard/dist/assets/index-B-ioA6yv.js.map +0 -1
- package/dashboard/dist/assets/index-BMpoMc4A.js +0 -2
- package/dashboard/dist/assets/index-BMpoMc4A.js.map +0 -1
- package/dashboard/dist/assets/index-BU04qgJt.js +0 -15
- package/dashboard/dist/assets/index-BU04qgJt.js.map +0 -1
- package/dashboard/dist/assets/index-BUjxYyxc.js.map +0 -1
- package/dashboard/dist/assets/index-BpoHVMV7.js +0 -2
- package/dashboard/dist/assets/index-CEnDYJOO.js +0 -2
- package/dashboard/dist/assets/index-CbuH92vk.js +0 -6
- package/dashboard/dist/assets/index-CbuH92vk.js.map +0 -1
- package/dashboard/dist/assets/index-DrouIN-M.js +0 -2
- package/dashboard/dist/assets/index-DrouIN-M.js.map +0 -1
- package/dashboard/dist/assets/index-DzICLMI7.js +0 -2
- package/dashboard/dist/assets/index-efS5gKpv.css +0 -1
- package/dashboard/dist/assets/index-qT78AZDq.js +0 -2
- package/dashboard/dist/assets/index-qT78AZDq.js.map +0 -1
- package/dashboard/dist/assets/useEventHooks-BPjEkCpD.js +0 -2
- package/dashboard/dist/assets/useEventHooks-BPjEkCpD.js.map +0 -1
- package/dashboard/dist/assets/vendor-icons-BkK55L-1.js.map +0 -1
- package/dashboard/dist/assets/workflows-D6diL54s.js +0 -2
- package/dashboard/dist/assets/workflows-D6diL54s.js.map +0 -1
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
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.GET_AGENT_BY_NAME = exports.GET_AGENT = exports.COUNT_AGENTS = exports.LIST_AGENTS = void 0;
|
|
4
|
+
exports.LIST_AGENTS = `
|
|
5
|
+
SELECT a.*,
|
|
6
|
+
COALESCE(s.sub_count, 0)::int AS subscription_count,
|
|
7
|
+
s.sub_topics
|
|
8
|
+
FROM lt_agents a
|
|
9
|
+
LEFT JOIN LATERAL (
|
|
10
|
+
SELECT COUNT(*)::int AS sub_count,
|
|
11
|
+
array_agg(topic ORDER BY created_at) AS sub_topics
|
|
12
|
+
FROM lt_agent_subscriptions
|
|
13
|
+
WHERE agent_id = a.id AND enabled = true
|
|
14
|
+
) s ON true
|
|
15
|
+
WHERE ($1::text IS NULL OR a.status = $1)
|
|
16
|
+
AND ($2::text IS NULL OR a.knowledge_domain = $2)
|
|
17
|
+
ORDER BY a.updated_at DESC
|
|
18
|
+
LIMIT $3 OFFSET $4
|
|
19
|
+
`;
|
|
20
|
+
exports.COUNT_AGENTS = `
|
|
21
|
+
SELECT COUNT(*)::int AS total FROM lt_agents
|
|
22
|
+
WHERE ($1::text IS NULL OR status = $1)
|
|
23
|
+
AND ($2::text IS NULL OR knowledge_domain = $2)
|
|
24
|
+
`;
|
|
25
|
+
exports.GET_AGENT = `
|
|
26
|
+
SELECT * FROM lt_agents WHERE id = $1
|
|
27
|
+
`;
|
|
28
|
+
exports.GET_AGENT_BY_NAME = `
|
|
29
|
+
SELECT * FROM lt_agents WHERE name = $1
|
|
30
|
+
`;
|
|
31
|
+
exports.INSERT_AGENT = `
|
|
32
|
+
INSERT INTO lt_agents (name, description, status, user_id, knowledge_domain,
|
|
33
|
+
capabilities, behaviors, goals, rules, workflow_type, pipeline_id, metadata)
|
|
34
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)
|
|
35
|
+
RETURNING *
|
|
36
|
+
`;
|
|
37
|
+
exports.UPDATE_AGENT = `
|
|
38
|
+
UPDATE lt_agents SET
|
|
39
|
+
name = COALESCE($2, name),
|
|
40
|
+
description = COALESCE($3, description),
|
|
41
|
+
status = COALESCE($4, status),
|
|
42
|
+
user_id = COALESCE($5, user_id),
|
|
43
|
+
knowledge_domain = COALESCE($6, knowledge_domain),
|
|
44
|
+
capabilities = COALESCE($7, capabilities),
|
|
45
|
+
behaviors = COALESCE($8, behaviors),
|
|
46
|
+
goals = COALESCE($9, goals),
|
|
47
|
+
rules = COALESCE($10, rules),
|
|
48
|
+
workflow_type = COALESCE($11, workflow_type),
|
|
49
|
+
pipeline_id = COALESCE($12, pipeline_id),
|
|
50
|
+
metadata = COALESCE($13, metadata),
|
|
51
|
+
last_run_at = COALESCE($14, last_run_at)
|
|
52
|
+
WHERE id = $1
|
|
53
|
+
RETURNING *
|
|
54
|
+
`;
|
|
55
|
+
exports.DELETE_AGENT = `
|
|
56
|
+
DELETE FROM lt_agents WHERE id = $1
|
|
57
|
+
`;
|
|
58
|
+
exports.SEED_AGENT = `
|
|
59
|
+
INSERT INTO lt_agents (name, description, status, user_id, knowledge_domain,
|
|
60
|
+
capabilities, behaviors, goals, rules, workflow_type, pipeline_id, metadata)
|
|
61
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)
|
|
62
|
+
ON CONFLICT (name) DO NOTHING
|
|
63
|
+
`;
|
|
64
|
+
exports.KNOWLEDGE_COUNT = `
|
|
65
|
+
SELECT COUNT(*)::int AS count FROM lt_knowledge WHERE domain = $1
|
|
66
|
+
`;
|
|
67
|
+
exports.ESCALATION_COUNT = `
|
|
68
|
+
SELECT COUNT(*)::int AS count FROM lt_escalations
|
|
69
|
+
WHERE status = 'pending' AND created_by = $1
|
|
70
|
+
`;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const LIST_SUBSCRIPTIONS = "\n SELECT * FROM lt_agent_subscriptions\n WHERE agent_id = $1\n ORDER BY created_at\n";
|
|
2
|
+
export declare const GET_SUBSCRIPTION = "\n SELECT * FROM lt_agent_subscriptions WHERE id = $1\n";
|
|
3
|
+
export declare const INSERT_SUBSCRIPTION = "\n INSERT INTO lt_agent_subscriptions\n (agent_id, topic, filter, reaction_type, workflow_type, pipeline_id, mcp_prompt,\n input_mapping, execute_as, enabled)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)\n RETURNING *\n";
|
|
4
|
+
export declare const UPDATE_SUBSCRIPTION = "\n UPDATE lt_agent_subscriptions SET\n topic = COALESCE($2, topic),\n filter = COALESCE($3, filter),\n reaction_type = COALESCE($4, reaction_type),\n workflow_type = COALESCE($5, workflow_type),\n pipeline_id = COALESCE($6, pipeline_id),\n mcp_prompt = COALESCE($7, mcp_prompt),\n input_mapping = COALESCE($8, input_mapping),\n execute_as = COALESCE($9, execute_as),\n enabled = COALESCE($10, enabled)\n WHERE id = $1\n RETURNING *\n";
|
|
5
|
+
export declare const DELETE_SUBSCRIPTION = "\n DELETE FROM lt_agent_subscriptions WHERE id = $1\n";
|
|
6
|
+
export declare const SEED_SUBSCRIPTION = "\n INSERT INTO lt_agent_subscriptions\n (agent_id, topic, filter, reaction_type, workflow_type, pipeline_id, mcp_prompt,\n input_mapping, execute_as, enabled)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, true)\n ON CONFLICT (agent_id, topic) DO NOTHING\n";
|
|
7
|
+
export declare const LIST_ACTIVE_SUBSCRIPTIONS = "\n SELECT s.*, a.name 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";
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LIST_ACTIVE_SUBSCRIPTIONS = exports.SEED_SUBSCRIPTION = exports.DELETE_SUBSCRIPTION = exports.UPDATE_SUBSCRIPTION = exports.INSERT_SUBSCRIPTION = exports.GET_SUBSCRIPTION = exports.LIST_SUBSCRIPTIONS = void 0;
|
|
4
|
+
exports.LIST_SUBSCRIPTIONS = `
|
|
5
|
+
SELECT * FROM lt_agent_subscriptions
|
|
6
|
+
WHERE agent_id = $1
|
|
7
|
+
ORDER BY created_at
|
|
8
|
+
`;
|
|
9
|
+
exports.GET_SUBSCRIPTION = `
|
|
10
|
+
SELECT * FROM lt_agent_subscriptions WHERE id = $1
|
|
11
|
+
`;
|
|
12
|
+
exports.INSERT_SUBSCRIPTION = `
|
|
13
|
+
INSERT INTO lt_agent_subscriptions
|
|
14
|
+
(agent_id, topic, filter, reaction_type, workflow_type, pipeline_id, mcp_prompt,
|
|
15
|
+
input_mapping, execute_as, enabled)
|
|
16
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)
|
|
17
|
+
RETURNING *
|
|
18
|
+
`;
|
|
19
|
+
exports.UPDATE_SUBSCRIPTION = `
|
|
20
|
+
UPDATE lt_agent_subscriptions SET
|
|
21
|
+
topic = COALESCE($2, topic),
|
|
22
|
+
filter = COALESCE($3, filter),
|
|
23
|
+
reaction_type = COALESCE($4, reaction_type),
|
|
24
|
+
workflow_type = COALESCE($5, workflow_type),
|
|
25
|
+
pipeline_id = COALESCE($6, pipeline_id),
|
|
26
|
+
mcp_prompt = COALESCE($7, mcp_prompt),
|
|
27
|
+
input_mapping = COALESCE($8, input_mapping),
|
|
28
|
+
execute_as = COALESCE($9, execute_as),
|
|
29
|
+
enabled = COALESCE($10, enabled)
|
|
30
|
+
WHERE id = $1
|
|
31
|
+
RETURNING *
|
|
32
|
+
`;
|
|
33
|
+
exports.DELETE_SUBSCRIPTION = `
|
|
34
|
+
DELETE FROM lt_agent_subscriptions WHERE id = $1
|
|
35
|
+
`;
|
|
36
|
+
exports.SEED_SUBSCRIPTION = `
|
|
37
|
+
INSERT INTO lt_agent_subscriptions
|
|
38
|
+
(agent_id, topic, filter, reaction_type, workflow_type, pipeline_id, mcp_prompt,
|
|
39
|
+
input_mapping, execute_as, enabled)
|
|
40
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, true)
|
|
41
|
+
ON CONFLICT (agent_id, topic) DO NOTHING
|
|
42
|
+
`;
|
|
43
|
+
exports.LIST_ACTIVE_SUBSCRIPTIONS = `
|
|
44
|
+
SELECT s.*, a.name AS agent_name, a.user_id AS agent_user_id
|
|
45
|
+
FROM lt_agent_subscriptions s
|
|
46
|
+
JOIN lt_agents a ON s.agent_id = a.id
|
|
47
|
+
WHERE s.enabled = true AND a.status = 'active'
|
|
48
|
+
ORDER BY s.created_at
|
|
49
|
+
`;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export interface AgentSubscription {
|
|
2
|
+
id: string;
|
|
3
|
+
agent_id: string;
|
|
4
|
+
topic: string;
|
|
5
|
+
filter?: Record<string, any>;
|
|
6
|
+
reaction_type: 'durable' | 'pipeline' | 'mcp_query';
|
|
7
|
+
workflow_type?: string;
|
|
8
|
+
pipeline_id?: string;
|
|
9
|
+
mcp_prompt?: string;
|
|
10
|
+
input_mapping: Record<string, any>;
|
|
11
|
+
execute_as?: string;
|
|
12
|
+
enabled: boolean;
|
|
13
|
+
created_at: string;
|
|
14
|
+
updated_at: string;
|
|
15
|
+
}
|
|
16
|
+
export interface ActiveSubscription extends AgentSubscription {
|
|
17
|
+
agent_name: string;
|
|
18
|
+
agent_user_id?: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function listSubscriptions(agentId: string): Promise<AgentSubscription[]>;
|
|
21
|
+
export declare function getSubscription(id: string): Promise<AgentSubscription | null>;
|
|
22
|
+
export declare function createSubscription(agentId: string, data: Partial<AgentSubscription>): Promise<AgentSubscription>;
|
|
23
|
+
export declare function updateSubscription(id: string, data: Partial<AgentSubscription>): Promise<AgentSubscription | null>;
|
|
24
|
+
export declare function deleteSubscription(id: string): Promise<boolean>;
|
|
25
|
+
export declare function listActiveSubscriptions(): Promise<ActiveSubscription[]>;
|
|
26
|
+
/**
|
|
27
|
+
* Seed a subscription at startup (insert-if-absent).
|
|
28
|
+
* Conflict on (agent_id, topic) — DB is source of truth after first boot.
|
|
29
|
+
*/
|
|
30
|
+
export declare function seedSubscription(agentId: string, data: Partial<AgentSubscription>): Promise<boolean>;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.listSubscriptions = listSubscriptions;
|
|
4
|
+
exports.getSubscription = getSubscription;
|
|
5
|
+
exports.createSubscription = createSubscription;
|
|
6
|
+
exports.updateSubscription = updateSubscription;
|
|
7
|
+
exports.deleteSubscription = deleteSubscription;
|
|
8
|
+
exports.listActiveSubscriptions = listActiveSubscriptions;
|
|
9
|
+
exports.seedSubscription = seedSubscription;
|
|
10
|
+
const db_1 = require("../../lib/db");
|
|
11
|
+
const subscription_sql_1 = require("./subscription-sql");
|
|
12
|
+
async function listSubscriptions(agentId) {
|
|
13
|
+
const pool = (0, db_1.getPool)();
|
|
14
|
+
const { rows } = await pool.query(subscription_sql_1.LIST_SUBSCRIPTIONS, [agentId]);
|
|
15
|
+
return rows;
|
|
16
|
+
}
|
|
17
|
+
async function getSubscription(id) {
|
|
18
|
+
const pool = (0, db_1.getPool)();
|
|
19
|
+
const { rows } = await pool.query(subscription_sql_1.GET_SUBSCRIPTION, [id]);
|
|
20
|
+
return rows[0] ?? null;
|
|
21
|
+
}
|
|
22
|
+
async function createSubscription(agentId, data) {
|
|
23
|
+
const pool = (0, db_1.getPool)();
|
|
24
|
+
const { rows } = await pool.query(subscription_sql_1.INSERT_SUBSCRIPTION, [
|
|
25
|
+
agentId,
|
|
26
|
+
data.topic,
|
|
27
|
+
data.filter ? JSON.stringify(data.filter) : null,
|
|
28
|
+
data.reaction_type,
|
|
29
|
+
data.workflow_type ?? null,
|
|
30
|
+
data.pipeline_id ?? null,
|
|
31
|
+
data.mcp_prompt ?? null,
|
|
32
|
+
JSON.stringify(data.input_mapping ?? {}),
|
|
33
|
+
data.execute_as ?? null,
|
|
34
|
+
data.enabled !== false,
|
|
35
|
+
]);
|
|
36
|
+
return rows[0];
|
|
37
|
+
}
|
|
38
|
+
async function updateSubscription(id, data) {
|
|
39
|
+
const pool = (0, db_1.getPool)();
|
|
40
|
+
const { rows } = await pool.query(subscription_sql_1.UPDATE_SUBSCRIPTION, [
|
|
41
|
+
id,
|
|
42
|
+
data.topic ?? null,
|
|
43
|
+
data.filter ? JSON.stringify(data.filter) : null,
|
|
44
|
+
data.reaction_type ?? null,
|
|
45
|
+
data.workflow_type ?? null,
|
|
46
|
+
data.pipeline_id ?? null,
|
|
47
|
+
data.mcp_prompt ?? null,
|
|
48
|
+
data.input_mapping ? JSON.stringify(data.input_mapping) : null,
|
|
49
|
+
data.execute_as ?? null,
|
|
50
|
+
data.enabled ?? null,
|
|
51
|
+
]);
|
|
52
|
+
return rows[0] ?? null;
|
|
53
|
+
}
|
|
54
|
+
async function deleteSubscription(id) {
|
|
55
|
+
const pool = (0, db_1.getPool)();
|
|
56
|
+
const { rowCount } = await pool.query(subscription_sql_1.DELETE_SUBSCRIPTION, [id]);
|
|
57
|
+
return (rowCount ?? 0) > 0;
|
|
58
|
+
}
|
|
59
|
+
async function listActiveSubscriptions() {
|
|
60
|
+
const pool = (0, db_1.getPool)();
|
|
61
|
+
const { rows } = await pool.query(subscription_sql_1.LIST_ACTIVE_SUBSCRIPTIONS);
|
|
62
|
+
return rows;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Seed a subscription at startup (insert-if-absent).
|
|
66
|
+
* Conflict on (agent_id, topic) — DB is source of truth after first boot.
|
|
67
|
+
*/
|
|
68
|
+
async function seedSubscription(agentId, data) {
|
|
69
|
+
const pool = (0, db_1.getPool)();
|
|
70
|
+
const { rowCount } = await pool.query(subscription_sql_1.SEED_SUBSCRIPTION, [
|
|
71
|
+
agentId,
|
|
72
|
+
data.topic,
|
|
73
|
+
data.filter ? JSON.stringify(data.filter) : null,
|
|
74
|
+
data.reaction_type,
|
|
75
|
+
data.workflow_type ?? null,
|
|
76
|
+
data.pipeline_id ?? null,
|
|
77
|
+
data.mcp_prompt ?? null,
|
|
78
|
+
JSON.stringify(data.input_mapping ?? {}),
|
|
79
|
+
data.execute_as ?? null,
|
|
80
|
+
]);
|
|
81
|
+
return (rowCount ?? 0) > 0;
|
|
82
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { CallbackEventAdapter } from '../../lib/events/callback';
|
|
2
|
+
/**
|
|
3
|
+
* Agent Trigger Registry — arms event subscriptions for active agents at startup.
|
|
4
|
+
*
|
|
5
|
+
* Analogous to LTCronRegistry but for event-driven reactions. When an event
|
|
6
|
+
* matches a subscription's topic pattern (and optional filter), the registry
|
|
7
|
+
* invokes the configured workflow with a deterministic ID for distributed dedup.
|
|
8
|
+
*/
|
|
9
|
+
declare class AgentTriggerRegistry {
|
|
10
|
+
private adapter;
|
|
11
|
+
private unsubs;
|
|
12
|
+
private connected;
|
|
13
|
+
/**
|
|
14
|
+
* Load all active subscriptions from DB and arm event listeners.
|
|
15
|
+
*/
|
|
16
|
+
connect(adapter: CallbackEventAdapter): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Re-arm all subscriptions for a specific agent (after config change).
|
|
19
|
+
*/
|
|
20
|
+
restartAgent(agentId: string): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Stop all subscriptions for a specific agent.
|
|
23
|
+
*/
|
|
24
|
+
stopAgent(agentId: string): void;
|
|
25
|
+
/**
|
|
26
|
+
* Disconnect all subscriptions.
|
|
27
|
+
*/
|
|
28
|
+
disconnect(): void;
|
|
29
|
+
private armSubscription;
|
|
30
|
+
private buildHandler;
|
|
31
|
+
/**
|
|
32
|
+
* Shallow key-value match: every key in filter must match the corresponding
|
|
33
|
+
* key in event.data. Missing keys in event.data fail the match.
|
|
34
|
+
*/
|
|
35
|
+
private matchesFilter;
|
|
36
|
+
/**
|
|
37
|
+
* Deterministic workflow ID derived from the subscription + event.
|
|
38
|
+
* Multiple containers receiving the same event produce the same ID,
|
|
39
|
+
* so HotMesh's idempotent workflow.start() prevents duplicate execution.
|
|
40
|
+
*/
|
|
41
|
+
private deriveWorkflowId;
|
|
42
|
+
private executeReaction;
|
|
43
|
+
}
|
|
44
|
+
export declare const agentTriggerRegistry: AgentTriggerRegistry;
|
|
45
|
+
export {};
|
|
@@ -0,0 +1,232 @@
|
|
|
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.agentTriggerRegistry = void 0;
|
|
37
|
+
const crypto_1 = require("crypto");
|
|
38
|
+
const logger_1 = require("../../lib/logger");
|
|
39
|
+
const publish_1 = require("../../lib/events/publish");
|
|
40
|
+
const subscriptions_1 = require("./subscriptions");
|
|
41
|
+
const input_mapper_1 = require("./input-mapper");
|
|
42
|
+
const index_1 = require("./index");
|
|
43
|
+
/**
|
|
44
|
+
* Agent Trigger Registry — arms event subscriptions for active agents at startup.
|
|
45
|
+
*
|
|
46
|
+
* Analogous to LTCronRegistry but for event-driven reactions. When an event
|
|
47
|
+
* matches a subscription's topic pattern (and optional filter), the registry
|
|
48
|
+
* invokes the configured workflow with a deterministic ID for distributed dedup.
|
|
49
|
+
*/
|
|
50
|
+
class AgentTriggerRegistry {
|
|
51
|
+
constructor() {
|
|
52
|
+
this.adapter = null;
|
|
53
|
+
this.unsubs = new Map();
|
|
54
|
+
this.connected = false;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Load all active subscriptions from DB and arm event listeners.
|
|
58
|
+
*/
|
|
59
|
+
async connect(adapter) {
|
|
60
|
+
this.adapter = adapter;
|
|
61
|
+
const subs = await (0, subscriptions_1.listActiveSubscriptions)();
|
|
62
|
+
for (const sub of subs) {
|
|
63
|
+
this.armSubscription(sub);
|
|
64
|
+
}
|
|
65
|
+
this.connected = true;
|
|
66
|
+
logger_1.loggerRegistry.info(`[long-tail] agent trigger registry: ${subs.length} subscription(s) armed`);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Re-arm all subscriptions for a specific agent (after config change).
|
|
70
|
+
*/
|
|
71
|
+
async restartAgent(agentId) {
|
|
72
|
+
if (!this.adapter)
|
|
73
|
+
return;
|
|
74
|
+
// Stop existing subs for this agent
|
|
75
|
+
for (const [key, unsub] of this.unsubs) {
|
|
76
|
+
if (key.startsWith(`${agentId}:`)) {
|
|
77
|
+
unsub();
|
|
78
|
+
this.unsubs.delete(key);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// Reload from DB
|
|
82
|
+
const subs = await (0, subscriptions_1.listActiveSubscriptions)();
|
|
83
|
+
const agentSubs = subs.filter((s) => s.agent_id === agentId);
|
|
84
|
+
for (const sub of agentSubs) {
|
|
85
|
+
this.armSubscription(sub);
|
|
86
|
+
}
|
|
87
|
+
logger_1.loggerRegistry.info(`[long-tail] agent triggers restarted for ${agentId}: ${agentSubs.length} sub(s)`);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Stop all subscriptions for a specific agent.
|
|
91
|
+
*/
|
|
92
|
+
stopAgent(agentId) {
|
|
93
|
+
for (const [key, unsub] of this.unsubs) {
|
|
94
|
+
if (key.startsWith(`${agentId}:`)) {
|
|
95
|
+
unsub();
|
|
96
|
+
this.unsubs.delete(key);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Disconnect all subscriptions.
|
|
102
|
+
*/
|
|
103
|
+
disconnect() {
|
|
104
|
+
for (const unsub of this.unsubs.values()) {
|
|
105
|
+
unsub();
|
|
106
|
+
}
|
|
107
|
+
this.unsubs.clear();
|
|
108
|
+
this.connected = false;
|
|
109
|
+
logger_1.loggerRegistry.info('[long-tail] agent trigger registry disconnected');
|
|
110
|
+
}
|
|
111
|
+
armSubscription(sub) {
|
|
112
|
+
if (!this.adapter)
|
|
113
|
+
return;
|
|
114
|
+
const key = `${sub.agent_id}:${sub.id}`;
|
|
115
|
+
const handler = this.buildHandler(sub);
|
|
116
|
+
// Normalize topic: strip the 'lt.events.' prefix if present, since
|
|
117
|
+
// CallbackEventAdapter matches against raw event.type (e.g., 'workflow.failed',
|
|
118
|
+
// not 'lt.events.workflow.failed'). Users may store either form in the DB.
|
|
119
|
+
const rawTopic = sub.topic.replace(/^lt\.events\./, '');
|
|
120
|
+
const unsub = this.adapter.on(rawTopic, handler);
|
|
121
|
+
this.unsubs.set(key, unsub);
|
|
122
|
+
}
|
|
123
|
+
buildHandler(sub) {
|
|
124
|
+
return async (event) => {
|
|
125
|
+
try {
|
|
126
|
+
// 1. Evaluate optional filter
|
|
127
|
+
if (sub.filter && !this.matchesFilter(event, sub.filter)) {
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
// 2. Derive deterministic workflow ID for distributed dedup
|
|
131
|
+
const deterministicId = this.deriveWorkflowId(sub, event);
|
|
132
|
+
// 3. Apply input mapping to transform event → envelope data
|
|
133
|
+
const mapped = Object.keys(sub.input_mapping).length > 0
|
|
134
|
+
? (0, input_mapper_1.applyInputMapping)(sub.input_mapping, event)
|
|
135
|
+
: { data: event.data ?? {}, metadata: { source: 'agent', agentName: sub.agent_name } };
|
|
136
|
+
// 4. Emit agent.started
|
|
137
|
+
(0, publish_1.publishAgentEvent)({
|
|
138
|
+
type: 'agent.started',
|
|
139
|
+
agentId: sub.agent_id,
|
|
140
|
+
agentName: sub.agent_name,
|
|
141
|
+
data: { topic: sub.topic, eventType: event.type, deterministicId },
|
|
142
|
+
});
|
|
143
|
+
// 5. Invoke the reaction workflow
|
|
144
|
+
await this.executeReaction(sub, mapped, deterministicId);
|
|
145
|
+
// 6. Emit agent.completed + update last_run_at
|
|
146
|
+
(0, publish_1.publishAgentEvent)({
|
|
147
|
+
type: 'agent.completed',
|
|
148
|
+
agentId: sub.agent_id,
|
|
149
|
+
agentName: sub.agent_name,
|
|
150
|
+
data: { topic: sub.topic, eventType: event.type },
|
|
151
|
+
});
|
|
152
|
+
(0, index_1.updateAgent)(sub.agent_id, {
|
|
153
|
+
last_run_at: new Date().toISOString(),
|
|
154
|
+
}).catch(() => { }); // best-effort
|
|
155
|
+
}
|
|
156
|
+
catch (err) {
|
|
157
|
+
(0, publish_1.publishAgentEvent)({
|
|
158
|
+
type: 'agent.failed',
|
|
159
|
+
agentId: sub.agent_id,
|
|
160
|
+
agentName: sub.agent_name,
|
|
161
|
+
status: 'error',
|
|
162
|
+
data: { topic: sub.topic, error: err.message },
|
|
163
|
+
});
|
|
164
|
+
logger_1.loggerRegistry.warn(`[long-tail] agent trigger failed: ${sub.agent_name}/${sub.topic}: ${err.message}`);
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Shallow key-value match: every key in filter must match the corresponding
|
|
170
|
+
* key in event.data. Missing keys in event.data fail the match.
|
|
171
|
+
*/
|
|
172
|
+
matchesFilter(event, filter) {
|
|
173
|
+
const data = event.data ?? {};
|
|
174
|
+
for (const [key, expected] of Object.entries(filter)) {
|
|
175
|
+
if (data[key] !== expected)
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
return true;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Deterministic workflow ID derived from the subscription + event.
|
|
182
|
+
* Multiple containers receiving the same event produce the same ID,
|
|
183
|
+
* so HotMesh's idempotent workflow.start() prevents duplicate execution.
|
|
184
|
+
*/
|
|
185
|
+
deriveWorkflowId(sub, event) {
|
|
186
|
+
const eventKey = event.workflowId || event.taskId || event.escalationId || '';
|
|
187
|
+
const uniquePart = eventKey || (0, crypto_1.createHash)('sha256')
|
|
188
|
+
.update(`${event.timestamp}:${event.type}:${JSON.stringify(event.data ?? {})}`)
|
|
189
|
+
.digest('hex')
|
|
190
|
+
.slice(0, 12);
|
|
191
|
+
return `agent-${sub.agent_id.slice(0, 8)}-${sub.id.slice(0, 8)}-${uniquePart}`;
|
|
192
|
+
}
|
|
193
|
+
async executeReaction(sub, mapped, deterministicId) {
|
|
194
|
+
switch (sub.reaction_type) {
|
|
195
|
+
case 'durable': {
|
|
196
|
+
const { invokeWorkflow } = await Promise.resolve().then(() => __importStar(require('../workflow-invocation')));
|
|
197
|
+
await invokeWorkflow({
|
|
198
|
+
workflowType: sub.workflow_type,
|
|
199
|
+
data: mapped.data ?? mapped,
|
|
200
|
+
metadata: mapped.metadata ?? { source: 'agent', certified: true },
|
|
201
|
+
executeAs: sub.execute_as ?? sub.agent_user_id ?? undefined,
|
|
202
|
+
options: { workflowId: deterministicId },
|
|
203
|
+
auth: { userId: sub.agent_user_id || 'lt-system', role: 'admin' },
|
|
204
|
+
});
|
|
205
|
+
break;
|
|
206
|
+
}
|
|
207
|
+
case 'pipeline': {
|
|
208
|
+
const { invokeYamlWorkflow } = await Promise.resolve().then(() => __importStar(require('../yaml-workflow/invoke')));
|
|
209
|
+
const { getYamlWorkflow } = await Promise.resolve().then(() => __importStar(require('../yaml-workflow/db')));
|
|
210
|
+
const wf = await getYamlWorkflow(sub.pipeline_id);
|
|
211
|
+
if (!wf)
|
|
212
|
+
throw new Error(`Pipeline ${sub.pipeline_id} not found`);
|
|
213
|
+
await invokeYamlWorkflow(wf, {
|
|
214
|
+
data: mapped.data ?? mapped,
|
|
215
|
+
execute_as: sub.execute_as ?? sub.agent_user_id ?? undefined,
|
|
216
|
+
source: 'agent',
|
|
217
|
+
});
|
|
218
|
+
break;
|
|
219
|
+
}
|
|
220
|
+
case 'mcp_query': {
|
|
221
|
+
const { startMcpQuery } = await Promise.resolve().then(() => __importStar(require('../insight')));
|
|
222
|
+
await startMcpQuery({
|
|
223
|
+
prompt: sub.mcp_prompt,
|
|
224
|
+
wait: false,
|
|
225
|
+
userId: sub.agent_user_id ?? undefined,
|
|
226
|
+
});
|
|
227
|
+
break;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
exports.agentTriggerRegistry = new AgentTriggerRegistry();
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { LTWorkflowConfig } from '../../types';
|
|
1
|
+
import type { LTWorkflowConfig, LTAgent, AgentSchedule } from '../../types';
|
|
2
2
|
import type { LTYamlWorkflowRecord } from '../../types/yaml-workflow';
|
|
3
3
|
/**
|
|
4
4
|
* Validate a cron expression and enforce a minimum interval.
|
|
@@ -52,6 +52,22 @@ declare class LTCronRegistry {
|
|
|
52
52
|
* Restart a YAML workflow cron after config change.
|
|
53
53
|
*/
|
|
54
54
|
restartYamlCron(wf: LTYamlWorkflowRecord): Promise<void>;
|
|
55
|
+
/**
|
|
56
|
+
* Start a single agent schedule cron.
|
|
57
|
+
*/
|
|
58
|
+
startAgentCron(agent: LTAgent, schedule: AgentSchedule, idx: number): Promise<void>;
|
|
59
|
+
/**
|
|
60
|
+
* Stop all cron schedules for an agent.
|
|
61
|
+
*/
|
|
62
|
+
stopAgentCrons(agentId: string): Promise<void>;
|
|
63
|
+
/**
|
|
64
|
+
* Restart all cron schedules for an agent (after config change or pause/resume).
|
|
65
|
+
*/
|
|
66
|
+
restartAgentCrons(agent: LTAgent): Promise<void>;
|
|
67
|
+
/**
|
|
68
|
+
* Arm all cron schedules for active agents. Called at startup.
|
|
69
|
+
*/
|
|
70
|
+
connectAgentCrons(): Promise<void>;
|
|
55
71
|
/**
|
|
56
72
|
* Stop all active crons. Call during graceful shutdown.
|
|
57
73
|
*/
|