@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
|
@@ -4,6 +4,8 @@ exports.publishMilestoneEvent = publishMilestoneEvent;
|
|
|
4
4
|
exports.publishTaskEvent = publishTaskEvent;
|
|
5
5
|
exports.publishEscalationEvent = publishEscalationEvent;
|
|
6
6
|
exports.publishActivityEvent = publishActivityEvent;
|
|
7
|
+
exports.publishKnowledgeEvent = publishKnowledgeEvent;
|
|
8
|
+
exports.publishAgentEvent = publishAgentEvent;
|
|
7
9
|
exports.publishWorkflowEvent = publishWorkflowEvent;
|
|
8
10
|
const index_1 = require("./index");
|
|
9
11
|
/**
|
|
@@ -87,6 +89,37 @@ function publishActivityEvent(params) {
|
|
|
87
89
|
timestamp: new Date().toISOString(),
|
|
88
90
|
});
|
|
89
91
|
}
|
|
92
|
+
/**
|
|
93
|
+
* Publish a knowledge lifecycle event (stored, deleted).
|
|
94
|
+
* Lightweight — no workflow context required since knowledge writes
|
|
95
|
+
* happen both inside and outside workflows.
|
|
96
|
+
*/
|
|
97
|
+
function publishKnowledgeEvent(params) {
|
|
98
|
+
return fireAndForget({
|
|
99
|
+
type: params.type,
|
|
100
|
+
source: 'knowledge',
|
|
101
|
+
workflowId: '',
|
|
102
|
+
workflowName: '',
|
|
103
|
+
taskQueue: '',
|
|
104
|
+
data: { domain: params.domain, key: params.key },
|
|
105
|
+
timestamp: new Date().toISOString(),
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Publish an agent lifecycle event.
|
|
110
|
+
*/
|
|
111
|
+
function publishAgentEvent(params) {
|
|
112
|
+
return fireAndForget({
|
|
113
|
+
type: params.type,
|
|
114
|
+
source: 'agent',
|
|
115
|
+
workflowId: params.agentId,
|
|
116
|
+
workflowName: params.agentName,
|
|
117
|
+
taskQueue: '',
|
|
118
|
+
status: params.status,
|
|
119
|
+
data: params.data,
|
|
120
|
+
timestamp: new Date().toISOString(),
|
|
121
|
+
});
|
|
122
|
+
}
|
|
90
123
|
/**
|
|
91
124
|
* Publish a workflow lifecycle event (started, completed, failed).
|
|
92
125
|
*/
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
const express_1 = require("express");
|
|
37
|
+
const api = __importStar(require("../api/agents"));
|
|
38
|
+
const subApi = __importStar(require("../api/agent-subscriptions"));
|
|
39
|
+
const router = (0, express_1.Router)();
|
|
40
|
+
/**
|
|
41
|
+
* GET /api/agents
|
|
42
|
+
* List agents with optional filters.
|
|
43
|
+
* Query: ?status=active&knowledge_domain=...&limit=50&offset=0
|
|
44
|
+
*/
|
|
45
|
+
router.get('/', async (req, res) => {
|
|
46
|
+
const result = await api.listAgents({
|
|
47
|
+
status: req.query.status || undefined,
|
|
48
|
+
knowledge_domain: req.query.knowledge_domain || undefined,
|
|
49
|
+
limit: req.query.limit ? parseInt(req.query.limit, 10) : undefined,
|
|
50
|
+
offset: req.query.offset ? parseInt(req.query.offset, 10) : undefined,
|
|
51
|
+
});
|
|
52
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
53
|
+
});
|
|
54
|
+
/**
|
|
55
|
+
* GET /api/agents/:id
|
|
56
|
+
* Get a single agent by ID (includes stats).
|
|
57
|
+
*/
|
|
58
|
+
router.get('/:id', async (req, res) => {
|
|
59
|
+
const result = await api.getAgent({ id: req.params.id });
|
|
60
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
61
|
+
});
|
|
62
|
+
/**
|
|
63
|
+
* POST /api/agents
|
|
64
|
+
* Create a new agent.
|
|
65
|
+
*/
|
|
66
|
+
router.post('/', async (req, res) => {
|
|
67
|
+
const { name } = req.body;
|
|
68
|
+
if (!name) {
|
|
69
|
+
res.status(400).json({ error: 'name is required' });
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
const auth = { userId: req.userId, roles: req.roles };
|
|
73
|
+
const result = await api.createAgent(req.body, auth);
|
|
74
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
75
|
+
});
|
|
76
|
+
/**
|
|
77
|
+
* PUT /api/agents/:id
|
|
78
|
+
* Update an existing agent.
|
|
79
|
+
*/
|
|
80
|
+
router.put('/:id', async (req, res) => {
|
|
81
|
+
const result = await api.updateAgent({ id: req.params.id, ...req.body });
|
|
82
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
83
|
+
});
|
|
84
|
+
/**
|
|
85
|
+
* DELETE /api/agents/:id
|
|
86
|
+
* Delete an agent.
|
|
87
|
+
*/
|
|
88
|
+
router.delete('/:id', async (req, res) => {
|
|
89
|
+
const result = await api.deleteAgent({ id: req.params.id });
|
|
90
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
91
|
+
});
|
|
92
|
+
// ── Subscription routes (nested under agent) ─────────────────────────────────
|
|
93
|
+
/**
|
|
94
|
+
* GET /api/agents/:agentId/subscriptions
|
|
95
|
+
* List all event subscriptions for an agent.
|
|
96
|
+
*/
|
|
97
|
+
router.get('/:agentId/subscriptions', async (req, res) => {
|
|
98
|
+
const result = await subApi.listSubscriptions({ agentId: req.params.agentId });
|
|
99
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
100
|
+
});
|
|
101
|
+
/**
|
|
102
|
+
* POST /api/agents/:agentId/subscriptions
|
|
103
|
+
* Create an event subscription for an agent.
|
|
104
|
+
*/
|
|
105
|
+
router.post('/:agentId/subscriptions', async (req, res) => {
|
|
106
|
+
const { topic, reaction_type } = req.body;
|
|
107
|
+
if (!topic || !reaction_type) {
|
|
108
|
+
res.status(400).json({ error: 'topic and reaction_type are required' });
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
const result = await subApi.createSubscription({ agentId: req.params.agentId, ...req.body });
|
|
112
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
113
|
+
});
|
|
114
|
+
/**
|
|
115
|
+
* PUT /api/agents/:agentId/subscriptions/:subId
|
|
116
|
+
* Update an event subscription.
|
|
117
|
+
*/
|
|
118
|
+
router.put('/:agentId/subscriptions/:subId', async (req, res) => {
|
|
119
|
+
const result = await subApi.updateSubscription({ id: req.params.subId, ...req.body });
|
|
120
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
121
|
+
});
|
|
122
|
+
/**
|
|
123
|
+
* DELETE /api/agents/:agentId/subscriptions/:subId
|
|
124
|
+
* Delete an event subscription.
|
|
125
|
+
*/
|
|
126
|
+
router.delete('/:agentId/subscriptions/:subId', async (req, res) => {
|
|
127
|
+
const result = await subApi.deleteSubscription({ id: req.params.subId });
|
|
128
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
129
|
+
});
|
|
130
|
+
exports.default = router;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
const express_1 = require("express");
|
|
37
|
+
const api = __importStar(require("../api/capabilities"));
|
|
38
|
+
const router = (0, express_1.Router)();
|
|
39
|
+
/**
|
|
40
|
+
* GET /api/capabilities
|
|
41
|
+
* List all platform capabilities grouped by category.
|
|
42
|
+
*/
|
|
43
|
+
router.get('/', async (_req, res) => {
|
|
44
|
+
const result = await api.listCapabilities();
|
|
45
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
46
|
+
});
|
|
47
|
+
exports.default = router;
|
package/build/routes/index.js
CHANGED
|
@@ -29,6 +29,8 @@ const bot_accounts_1 = __importDefault(require("./bot-accounts"));
|
|
|
29
29
|
const docs_1 = __importDefault(require("./docs"));
|
|
30
30
|
const workflow_sets_1 = __importDefault(require("./workflow-sets"));
|
|
31
31
|
const knowledge_1 = __importDefault(require("./knowledge"));
|
|
32
|
+
const agents_1 = __importDefault(require("./agents"));
|
|
33
|
+
const capabilities_1 = __importDefault(require("./capabilities"));
|
|
32
34
|
const nats_credentials_1 = __importDefault(require("./nats-credentials"));
|
|
33
35
|
const router = (0, express_1.Router)();
|
|
34
36
|
// Public routes (no auth required — they handle their own auth)
|
|
@@ -59,4 +61,6 @@ router.use('/bot-accounts', bot_accounts_1.default);
|
|
|
59
61
|
router.use('/docs', docs_1.default);
|
|
60
62
|
router.use('/workflow-sets', workflow_sets_1.default);
|
|
61
63
|
router.use('/knowledge', knowledge_1.default);
|
|
64
|
+
router.use('/agents', agents_1.default);
|
|
65
|
+
router.use('/capabilities', capabilities_1.default);
|
|
62
66
|
exports.default = router;
|
package/build/sdk/index.d.ts
CHANGED
|
@@ -18,6 +18,8 @@ import * as namespacesApi from '../api/namespaces';
|
|
|
18
18
|
import * as maintenanceApi from '../api/maintenance';
|
|
19
19
|
import * as filesApi from '../api/files';
|
|
20
20
|
import * as knowledgeApi from '../api/knowledge';
|
|
21
|
+
import * as agentsApi from '../api/agents';
|
|
22
|
+
import * as agentSubsApi from '../api/agent-subscriptions';
|
|
21
23
|
import type { LTApiAuth, LTApiResult } from '../types/sdk';
|
|
22
24
|
import type { LTEvent, LTEventType } from '../types/events';
|
|
23
25
|
/**
|
|
@@ -347,6 +349,17 @@ export declare function createClient(options?: LTClientOptions): {
|
|
|
347
349
|
removeField: typeof knowledgeApi.removeField;
|
|
348
350
|
deleteEntry: typeof knowledgeApi.deleteEntry;
|
|
349
351
|
};
|
|
352
|
+
agents: {
|
|
353
|
+
list: (input?: Parameters<typeof agentsApi.listAgents>[0]) => Promise<LTApiResult<any>>;
|
|
354
|
+
get: typeof agentsApi.getAgent;
|
|
355
|
+
create: (input: Parameters<typeof agentsApi.createAgent>[0]) => Promise<LTApiResult<any>>;
|
|
356
|
+
update: typeof agentsApi.updateAgent;
|
|
357
|
+
delete: typeof agentsApi.deleteAgent;
|
|
358
|
+
listSubscriptions: typeof agentSubsApi.listSubscriptions;
|
|
359
|
+
createSubscription: typeof agentSubsApi.createSubscription;
|
|
360
|
+
updateSubscription: typeof agentSubsApi.updateSubscription;
|
|
361
|
+
deleteSubscription: typeof agentSubsApi.deleteSubscription;
|
|
362
|
+
};
|
|
350
363
|
events: {
|
|
351
364
|
/**
|
|
352
365
|
* Subscribe to Long Tail events.
|
package/build/sdk/index.js
CHANGED
|
@@ -54,6 +54,8 @@ const namespacesApi = __importStar(require("../api/namespaces"));
|
|
|
54
54
|
const maintenanceApi = __importStar(require("../api/maintenance"));
|
|
55
55
|
const filesApi = __importStar(require("../api/files"));
|
|
56
56
|
const knowledgeApi = __importStar(require("../api/knowledge"));
|
|
57
|
+
const agentsApi = __importStar(require("../api/agents"));
|
|
58
|
+
const agentSubsApi = __importStar(require("../api/agent-subscriptions"));
|
|
57
59
|
const events_1 = require("../lib/events");
|
|
58
60
|
const callback_1 = require("../lib/events/callback");
|
|
59
61
|
/** Bind auth context to a function that expects it as the last argument. */
|
|
@@ -294,6 +296,18 @@ function createClient(options = {}) {
|
|
|
294
296
|
removeField: knowledgeApi.removeField,
|
|
295
297
|
deleteEntry: knowledgeApi.deleteEntry,
|
|
296
298
|
},
|
|
299
|
+
// ── Agents ──────────────────────────────────────────────────────────────
|
|
300
|
+
agents: {
|
|
301
|
+
list: (input) => agentsApi.listAgents(input ?? {}),
|
|
302
|
+
get: agentsApi.getAgent,
|
|
303
|
+
create: (input) => agentsApi.createAgent(input, auth),
|
|
304
|
+
update: agentsApi.updateAgent,
|
|
305
|
+
delete: agentsApi.deleteAgent,
|
|
306
|
+
listSubscriptions: agentSubsApi.listSubscriptions,
|
|
307
|
+
createSubscription: agentSubsApi.createSubscription,
|
|
308
|
+
updateSubscription: agentSubsApi.updateSubscription,
|
|
309
|
+
deleteSubscription: agentSubsApi.deleteSubscription,
|
|
310
|
+
},
|
|
297
311
|
// ── Events ─────────────────────────────────────────────────────────────
|
|
298
312
|
events: {
|
|
299
313
|
/**
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { LTAgent, LTAgentStats } from '../../types/agent';
|
|
2
|
+
interface ListAgentsFilters {
|
|
3
|
+
status?: string;
|
|
4
|
+
knowledge_domain?: string;
|
|
5
|
+
limit?: number;
|
|
6
|
+
offset?: number;
|
|
7
|
+
}
|
|
8
|
+
export declare function listAgents(filters?: ListAgentsFilters): Promise<{
|
|
9
|
+
agents: LTAgent[];
|
|
10
|
+
total: number;
|
|
11
|
+
}>;
|
|
12
|
+
export declare function getAgent(id: string): Promise<LTAgent | null>;
|
|
13
|
+
export declare function getAgentByName(name: string): Promise<LTAgent | null>;
|
|
14
|
+
export declare function createAgent(data: Partial<LTAgent> & {
|
|
15
|
+
name: string;
|
|
16
|
+
}): Promise<LTAgent>;
|
|
17
|
+
export declare function updateAgent(id: string, data: Partial<LTAgent>): Promise<LTAgent | null>;
|
|
18
|
+
export declare function deleteAgent(id: string): Promise<boolean>;
|
|
19
|
+
/**
|
|
20
|
+
* Seed an agent at startup (insert-if-absent).
|
|
21
|
+
* DB is the source of truth — if the row already exists, log drift warnings
|
|
22
|
+
* but do not overwrite.
|
|
23
|
+
*/
|
|
24
|
+
export declare function seedAgent(data: Partial<LTAgent> & {
|
|
25
|
+
name: string;
|
|
26
|
+
}): Promise<boolean>;
|
|
27
|
+
/**
|
|
28
|
+
* Aggregate stats for an agent: knowledge entry count, pending escalation count,
|
|
29
|
+
* and last workflow execution time.
|
|
30
|
+
*/
|
|
31
|
+
export declare function getAgentStats(agent: LTAgent): Promise<LTAgentStats>;
|
|
32
|
+
export {};
|
|
@@ -0,0 +1,195 @@
|
|
|
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.listAgents = listAgents;
|
|
37
|
+
exports.getAgent = getAgent;
|
|
38
|
+
exports.getAgentByName = getAgentByName;
|
|
39
|
+
exports.createAgent = createAgent;
|
|
40
|
+
exports.updateAgent = updateAgent;
|
|
41
|
+
exports.deleteAgent = deleteAgent;
|
|
42
|
+
exports.seedAgent = seedAgent;
|
|
43
|
+
exports.getAgentStats = getAgentStats;
|
|
44
|
+
const db_1 = require("../../lib/db");
|
|
45
|
+
const logger_1 = require("../../lib/logger");
|
|
46
|
+
const publish_1 = require("../../lib/events/publish");
|
|
47
|
+
const sql_1 = require("./sql");
|
|
48
|
+
async function listAgents(filters = {}) {
|
|
49
|
+
const pool = (0, db_1.getPool)();
|
|
50
|
+
const limit = filters.limit ?? 50;
|
|
51
|
+
const offset = filters.offset ?? 0;
|
|
52
|
+
const status = filters.status ?? null;
|
|
53
|
+
const domain = filters.knowledge_domain ?? null;
|
|
54
|
+
const [dataRes, countRes] = await Promise.all([
|
|
55
|
+
pool.query(sql_1.LIST_AGENTS, [status, domain, limit, offset]),
|
|
56
|
+
pool.query(sql_1.COUNT_AGENTS, [status, domain]),
|
|
57
|
+
]);
|
|
58
|
+
return {
|
|
59
|
+
agents: dataRes.rows,
|
|
60
|
+
total: countRes.rows[0]?.total ?? 0,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
async function getAgent(id) {
|
|
64
|
+
const pool = (0, db_1.getPool)();
|
|
65
|
+
const { rows } = await pool.query(sql_1.GET_AGENT, [id]);
|
|
66
|
+
return rows[0] ?? null;
|
|
67
|
+
}
|
|
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
|
+
async function createAgent(data) {
|
|
74
|
+
const pool = (0, db_1.getPool)();
|
|
75
|
+
const { rows } = await pool.query(sql_1.INSERT_AGENT, [
|
|
76
|
+
data.name,
|
|
77
|
+
data.description ?? null,
|
|
78
|
+
data.status ?? 'inactive',
|
|
79
|
+
data.user_id ?? null,
|
|
80
|
+
data.knowledge_domain ?? null,
|
|
81
|
+
JSON.stringify(data.capabilities ?? []),
|
|
82
|
+
JSON.stringify(data.behaviors ?? {}),
|
|
83
|
+
data.goals ?? null,
|
|
84
|
+
data.rules ?? null,
|
|
85
|
+
data.workflow_type ?? null,
|
|
86
|
+
data.pipeline_id ?? null,
|
|
87
|
+
JSON.stringify(data.metadata ?? {}),
|
|
88
|
+
]);
|
|
89
|
+
return rows[0];
|
|
90
|
+
}
|
|
91
|
+
async function updateAgent(id, data) {
|
|
92
|
+
const pool = (0, db_1.getPool)();
|
|
93
|
+
// Check current status before update for change detection
|
|
94
|
+
const oldAgent = data.status ? await getAgent(id) : null;
|
|
95
|
+
const { rows } = await pool.query(sql_1.UPDATE_AGENT, [
|
|
96
|
+
id,
|
|
97
|
+
data.name ?? null,
|
|
98
|
+
data.description ?? null,
|
|
99
|
+
data.status ?? null,
|
|
100
|
+
data.user_id ?? null,
|
|
101
|
+
data.knowledge_domain ?? null,
|
|
102
|
+
data.capabilities ? JSON.stringify(data.capabilities) : null,
|
|
103
|
+
data.behaviors ? JSON.stringify(data.behaviors) : null,
|
|
104
|
+
data.goals ?? null,
|
|
105
|
+
data.rules ?? null,
|
|
106
|
+
data.workflow_type ?? null,
|
|
107
|
+
data.pipeline_id ?? null,
|
|
108
|
+
data.metadata ? JSON.stringify(data.metadata) : null,
|
|
109
|
+
data.last_run_at ?? null,
|
|
110
|
+
]);
|
|
111
|
+
const updated = rows[0] ?? null;
|
|
112
|
+
if (updated && oldAgent && data.status && oldAgent.status !== updated.status) {
|
|
113
|
+
(0, publish_1.publishAgentEvent)({
|
|
114
|
+
type: 'agent.status_changed',
|
|
115
|
+
agentId: updated.id,
|
|
116
|
+
agentName: updated.name,
|
|
117
|
+
status: updated.status,
|
|
118
|
+
data: { previous: oldAgent.status },
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
// Restart event triggers and cron schedules if status or behaviors changed
|
|
122
|
+
if (updated && (data.status || data.behaviors)) {
|
|
123
|
+
Promise.resolve().then(() => __importStar(require('./trigger-registry'))).then(({ agentTriggerRegistry }) => agentTriggerRegistry.restartAgent(id)).catch(() => { });
|
|
124
|
+
Promise.resolve().then(() => __importStar(require('../cron'))).then(({ cronRegistry }) => cronRegistry.restartAgentCrons(updated)).catch(() => { });
|
|
125
|
+
}
|
|
126
|
+
return updated;
|
|
127
|
+
}
|
|
128
|
+
async function deleteAgent(id) {
|
|
129
|
+
// Stop event triggers and cron schedules before deleting
|
|
130
|
+
Promise.resolve().then(() => __importStar(require('./trigger-registry'))).then(({ agentTriggerRegistry }) => agentTriggerRegistry.stopAgent(id)).catch(() => { });
|
|
131
|
+
Promise.resolve().then(() => __importStar(require('../cron'))).then(({ cronRegistry }) => cronRegistry.stopAgentCrons(id)).catch(() => { });
|
|
132
|
+
const pool = (0, db_1.getPool)();
|
|
133
|
+
const { rowCount } = await pool.query(sql_1.DELETE_AGENT, [id]);
|
|
134
|
+
return (rowCount ?? 0) > 0;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Seed an agent at startup (insert-if-absent).
|
|
138
|
+
* DB is the source of truth — if the row already exists, log drift warnings
|
|
139
|
+
* but do not overwrite.
|
|
140
|
+
*/
|
|
141
|
+
async function seedAgent(data) {
|
|
142
|
+
const pool = (0, db_1.getPool)();
|
|
143
|
+
const { rowCount } = await pool.query(sql_1.SEED_AGENT, [
|
|
144
|
+
data.name,
|
|
145
|
+
data.description ?? null,
|
|
146
|
+
data.status ?? 'inactive',
|
|
147
|
+
data.user_id ?? null,
|
|
148
|
+
data.knowledge_domain ?? null,
|
|
149
|
+
JSON.stringify(data.capabilities ?? []),
|
|
150
|
+
JSON.stringify(data.behaviors ?? {}),
|
|
151
|
+
data.goals ?? null,
|
|
152
|
+
data.rules ?? null,
|
|
153
|
+
data.workflow_type ?? null,
|
|
154
|
+
data.pipeline_id ?? null,
|
|
155
|
+
JSON.stringify(data.metadata ?? {}),
|
|
156
|
+
]);
|
|
157
|
+
const inserted = (rowCount ?? 0) > 0;
|
|
158
|
+
if (!inserted) {
|
|
159
|
+
const existing = await getAgentByName(data.name);
|
|
160
|
+
if (existing) {
|
|
161
|
+
const drifts = [];
|
|
162
|
+
if (data.description && existing.description !== data.description)
|
|
163
|
+
drifts.push('description');
|
|
164
|
+
if (data.status && existing.status !== data.status)
|
|
165
|
+
drifts.push('status');
|
|
166
|
+
if (data.knowledge_domain && existing.knowledge_domain !== data.knowledge_domain)
|
|
167
|
+
drifts.push('knowledge_domain');
|
|
168
|
+
if (drifts.length) {
|
|
169
|
+
logger_1.loggerRegistry.warn(`[long-tail] agent drift: ${data.name} — ${drifts.join(', ')} differ between code and DB`);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return inserted;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Aggregate stats for an agent: knowledge entry count, pending escalation count,
|
|
177
|
+
* and last workflow execution time.
|
|
178
|
+
*/
|
|
179
|
+
async function getAgentStats(agent) {
|
|
180
|
+
const pool = (0, db_1.getPool)();
|
|
181
|
+
const stats = {
|
|
182
|
+
knowledge_count: 0,
|
|
183
|
+
escalation_count: 0,
|
|
184
|
+
};
|
|
185
|
+
if (agent.knowledge_domain) {
|
|
186
|
+
const { rows } = await pool.query(sql_1.KNOWLEDGE_COUNT, [agent.knowledge_domain]);
|
|
187
|
+
stats.knowledge_count = rows[0]?.count ?? 0;
|
|
188
|
+
}
|
|
189
|
+
if (agent.user_id) {
|
|
190
|
+
const { rows } = await pool.query(sql_1.ESCALATION_COUNT, [agent.user_id]);
|
|
191
|
+
stats.escalation_count = rows[0]?.count ?? 0;
|
|
192
|
+
}
|
|
193
|
+
stats.last_execution_at = agent.last_run_at ?? undefined;
|
|
194
|
+
return stats;
|
|
195
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { LTEvent } from '../../types';
|
|
2
|
+
/**
|
|
3
|
+
* Recursively apply input mapping templates against an event.
|
|
4
|
+
*
|
|
5
|
+
* Input mapping is a nested object where string values are templates:
|
|
6
|
+
* ```json
|
|
7
|
+
* {
|
|
8
|
+
* "data": {
|
|
9
|
+
* "orderId": "{event.data.orderId}",
|
|
10
|
+
* "errorMessage": "{event.data.error}"
|
|
11
|
+
* },
|
|
12
|
+
* "metadata": { "source": "agent", "certified": true }
|
|
13
|
+
* }
|
|
14
|
+
* ```
|
|
15
|
+
*
|
|
16
|
+
* Non-string values (numbers, booleans, null) pass through unchanged.
|
|
17
|
+
*/
|
|
18
|
+
export declare function applyInputMapping(mapping: Record<string, any>, event: LTEvent): Record<string, any>;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.applyInputMapping = applyInputMapping;
|
|
4
|
+
/**
|
|
5
|
+
* Resolve a template string like "{event.data.orderId}" against an event object.
|
|
6
|
+
* Returns the resolved value, or the raw template if the path doesn't exist.
|
|
7
|
+
*/
|
|
8
|
+
function resolveTemplate(template, event) {
|
|
9
|
+
const match = template.match(/^\{(.+)\}$/);
|
|
10
|
+
if (!match)
|
|
11
|
+
return template;
|
|
12
|
+
const path = match[1].split('.');
|
|
13
|
+
let current = { event };
|
|
14
|
+
for (const segment of path) {
|
|
15
|
+
if (current == null || typeof current !== 'object')
|
|
16
|
+
return template;
|
|
17
|
+
current = current[segment];
|
|
18
|
+
}
|
|
19
|
+
return current ?? template;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Recursively apply input mapping templates against an event.
|
|
23
|
+
*
|
|
24
|
+
* Input mapping is a nested object where string values are templates:
|
|
25
|
+
* ```json
|
|
26
|
+
* {
|
|
27
|
+
* "data": {
|
|
28
|
+
* "orderId": "{event.data.orderId}",
|
|
29
|
+
* "errorMessage": "{event.data.error}"
|
|
30
|
+
* },
|
|
31
|
+
* "metadata": { "source": "agent", "certified": true }
|
|
32
|
+
* }
|
|
33
|
+
* ```
|
|
34
|
+
*
|
|
35
|
+
* Non-string values (numbers, booleans, null) pass through unchanged.
|
|
36
|
+
*/
|
|
37
|
+
function applyInputMapping(mapping, event) {
|
|
38
|
+
const result = {};
|
|
39
|
+
for (const [key, value] of Object.entries(mapping)) {
|
|
40
|
+
if (typeof value === 'string') {
|
|
41
|
+
result[key] = resolveTemplate(value, event);
|
|
42
|
+
}
|
|
43
|
+
else if (value && typeof value === 'object' && !Array.isArray(value)) {
|
|
44
|
+
result[key] = applyInputMapping(value, event);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
result[key] = value;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return result;
|
|
51
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
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
|
+
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
|
+
export declare const GET_AGENT = "\n SELECT * FROM lt_agents WHERE id = $1\n";
|
|
4
|
+
export declare const GET_AGENT_BY_NAME = "\n SELECT * FROM lt_agents WHERE name = $1\n";
|
|
5
|
+
export declare const INSERT_AGENT = "\n INSERT INTO lt_agents (name, 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";
|
|
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";
|
|
7
|
+
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 (name, 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 (name) DO NOTHING\n";
|
|
9
|
+
export declare const KNOWLEDGE_COUNT = "\n SELECT COUNT(*)::int AS count FROM lt_knowledge WHERE domain = $1\n";
|
|
10
|
+
export declare const ESCALATION_COUNT = "\n SELECT COUNT(*)::int AS count FROM lt_escalations\n WHERE status = 'pending' AND created_by = $1\n";
|