@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
|
@@ -289,16 +289,164 @@ class LTCronRegistry {
|
|
|
289
289
|
logger_1.loggerRegistry.info(`[lt-cron] restarted YAML cron ${wf.graph_topic} (${wf.cron_schedule})`);
|
|
290
290
|
}
|
|
291
291
|
}
|
|
292
|
+
// ── Agent schedule crons ──────────────────────────────────────────────
|
|
293
|
+
/**
|
|
294
|
+
* Start a single agent schedule cron.
|
|
295
|
+
*/
|
|
296
|
+
async startAgentCron(agent, schedule, idx) {
|
|
297
|
+
const key = `agent:${agent.id}-${idx}`;
|
|
298
|
+
if (this.activeCrons.has(key))
|
|
299
|
+
return;
|
|
300
|
+
validateCronSchedule(schedule.cron);
|
|
301
|
+
const connection = (0, db_1.getConnection)();
|
|
302
|
+
const topic = `lt.cron.agent.${agent.id}.${idx}`;
|
|
303
|
+
const cronId = `lt-cron-agent-${agent.id}-${idx}`;
|
|
304
|
+
const executeAs = schedule.execute_as || agent.user_id || undefined;
|
|
305
|
+
let principal;
|
|
306
|
+
if (executeAs) {
|
|
307
|
+
try {
|
|
308
|
+
principal = await (0, principal_1.resolvePrincipal)(executeAs);
|
|
309
|
+
}
|
|
310
|
+
catch { /* use system */ }
|
|
311
|
+
}
|
|
312
|
+
if (!principal) {
|
|
313
|
+
principal = this.systemPrincipal ?? undefined;
|
|
314
|
+
}
|
|
315
|
+
const envelope = {
|
|
316
|
+
data: schedule.envelope ?? {},
|
|
317
|
+
metadata: { source: 'agent-cron', agentId: agent.id, agentName: agent.name, certified: true },
|
|
318
|
+
lt: {
|
|
319
|
+
userId: principal?.id ?? 'lt-system',
|
|
320
|
+
principal,
|
|
321
|
+
scopes: ['workflow:invoke'],
|
|
322
|
+
},
|
|
323
|
+
};
|
|
324
|
+
const isPipeline = schedule.reaction_type === 'pipeline' && schedule.pipeline_id;
|
|
325
|
+
// Resolve the actual task queue from workflow config (durable only)
|
|
326
|
+
let taskQueue;
|
|
327
|
+
if (!isPipeline) {
|
|
328
|
+
const wfConfig = await configService.getWorkflowConfig(schedule.workflow_type);
|
|
329
|
+
taskQueue = wfConfig?.task_queue || schedule.workflow_type;
|
|
330
|
+
}
|
|
331
|
+
const targetLabel = isPipeline ? `pipeline:${schedule.pipeline_id}` : schedule.workflow_type;
|
|
332
|
+
await hotmesh_1.Virtual.cron({
|
|
333
|
+
topic,
|
|
334
|
+
connection,
|
|
335
|
+
callback: async () => {
|
|
336
|
+
try {
|
|
337
|
+
if (isPipeline) {
|
|
338
|
+
const { invokeYamlWorkflow } = await Promise.resolve().then(() => __importStar(require('../yaml-workflow/invoke')));
|
|
339
|
+
const { getYamlWorkflow } = await Promise.resolve().then(() => __importStar(require('../yaml-workflow/db')));
|
|
340
|
+
const wf = await getYamlWorkflow(schedule.pipeline_id);
|
|
341
|
+
if (!wf)
|
|
342
|
+
throw new Error(`Pipeline ${schedule.pipeline_id} not found`);
|
|
343
|
+
logger_1.loggerRegistry.info(`[lt-cron] agent invoking pipeline ${schedule.pipeline_id}`);
|
|
344
|
+
await invokeYamlWorkflow(wf, {
|
|
345
|
+
data: envelope.data ?? {},
|
|
346
|
+
execute_as: executeAs,
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
else {
|
|
350
|
+
const client = new hotmesh_1.Durable.Client({ connection });
|
|
351
|
+
const workflowId = `agent-cron-${agent.id}-${idx}-${hotmesh_1.Durable.guid()}`;
|
|
352
|
+
logger_1.loggerRegistry.info(`[lt-cron] agent invoking ${schedule.workflow_type} on ${taskQueue} (${workflowId})`);
|
|
353
|
+
await client.workflow.start({
|
|
354
|
+
args: [envelope],
|
|
355
|
+
taskQueue,
|
|
356
|
+
workflowName: schedule.workflow_type,
|
|
357
|
+
workflowId,
|
|
358
|
+
expire: defaults_1.JOB_EXPIRE_SECS,
|
|
359
|
+
entity: schedule.workflow_type,
|
|
360
|
+
signalIn: false,
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
catch (err) {
|
|
365
|
+
logger_1.loggerRegistry.error(`[lt-cron] agent ${agent.name}/${targetLabel} failed: ${err?.message}`);
|
|
366
|
+
}
|
|
367
|
+
},
|
|
368
|
+
args: [],
|
|
369
|
+
options: { id: cronId, interval: schedule.cron },
|
|
370
|
+
});
|
|
371
|
+
this.activeCrons.set(key, cronId);
|
|
372
|
+
logger_1.loggerRegistry.info(`[lt-cron] agent schedule started: ${agent.name}/${targetLabel} (${schedule.cron})`);
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Stop all cron schedules for an agent.
|
|
376
|
+
*/
|
|
377
|
+
async stopAgentCrons(agentId) {
|
|
378
|
+
const connection = (0, db_1.getConnection)();
|
|
379
|
+
const toRemove = [];
|
|
380
|
+
for (const [key, cronId] of this.activeCrons) {
|
|
381
|
+
if (key.startsWith(`agent:${agentId}-`)) {
|
|
382
|
+
const idx = key.split('-').pop();
|
|
383
|
+
const topic = `lt.cron.agent.${agentId}.${idx}`;
|
|
384
|
+
try {
|
|
385
|
+
await hotmesh_1.Virtual.interrupt({ topic, connection, options: { id: cronId } });
|
|
386
|
+
}
|
|
387
|
+
catch { /* already stopped */ }
|
|
388
|
+
toRemove.push(key);
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
for (const key of toRemove)
|
|
392
|
+
this.activeCrons.delete(key);
|
|
393
|
+
if (toRemove.length) {
|
|
394
|
+
logger_1.loggerRegistry.info(`[lt-cron] stopped ${toRemove.length} agent schedule(s) for ${agentId}`);
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* Restart all cron schedules for an agent (after config change or pause/resume).
|
|
399
|
+
*/
|
|
400
|
+
async restartAgentCrons(agent) {
|
|
401
|
+
await this.stopAgentCrons(agent.id);
|
|
402
|
+
if (agent.status !== 'active')
|
|
403
|
+
return;
|
|
404
|
+
const schedules = agent.behaviors?.schedules ?? [];
|
|
405
|
+
for (let i = 0; i < schedules.length; i++) {
|
|
406
|
+
const sched = schedules[i];
|
|
407
|
+
if (sched.cron && (sched.workflow_type || sched.pipeline_id)) {
|
|
408
|
+
await this.startAgentCron(agent, sched, i);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
/**
|
|
413
|
+
* Arm all cron schedules for active agents. Called at startup.
|
|
414
|
+
*/
|
|
415
|
+
async connectAgentCrons() {
|
|
416
|
+
const { listAgents } = await Promise.resolve().then(() => __importStar(require('../agent')));
|
|
417
|
+
const { agents } = await listAgents({ status: 'active', limit: 1000 });
|
|
418
|
+
let armed = 0;
|
|
419
|
+
for (const agent of agents) {
|
|
420
|
+
const schedules = agent.behaviors?.schedules ?? [];
|
|
421
|
+
for (let i = 0; i < schedules.length; i++) {
|
|
422
|
+
const sched = schedules[i];
|
|
423
|
+
if (sched.cron && (sched.workflow_type || sched.pipeline_id)) {
|
|
424
|
+
try {
|
|
425
|
+
await this.startAgentCron(agent, sched, i);
|
|
426
|
+
armed++;
|
|
427
|
+
}
|
|
428
|
+
catch (err) {
|
|
429
|
+
logger_1.loggerRegistry.warn(`[lt-cron] agent schedule failed: ${agent.name}/${sched.cron}: ${err.message}`);
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
logger_1.loggerRegistry.info(`[lt-cron] ${armed} agent schedule(s) armed`);
|
|
435
|
+
}
|
|
292
436
|
/**
|
|
293
437
|
* Stop all active crons. Call during graceful shutdown.
|
|
294
438
|
*/
|
|
295
439
|
async disconnect() {
|
|
296
|
-
for (const
|
|
297
|
-
if (
|
|
298
|
-
|
|
440
|
+
for (const key of [...this.activeCrons.keys()]) {
|
|
441
|
+
if (key.startsWith('agent:')) {
|
|
442
|
+
const agentId = key.split(':')[1].split('-')[0];
|
|
443
|
+
await this.stopAgentCrons(agentId);
|
|
444
|
+
}
|
|
445
|
+
else if (key.startsWith('yaml:')) {
|
|
446
|
+
await this.stopYamlCron(key.replace('yaml:', ''));
|
|
299
447
|
}
|
|
300
448
|
else {
|
|
301
|
-
await this.stopCron(
|
|
449
|
+
await this.stopCron(key);
|
|
302
450
|
}
|
|
303
451
|
}
|
|
304
452
|
this.connected = false;
|
|
@@ -13,6 +13,7 @@ const db_1 = require("../../lib/db");
|
|
|
13
13
|
const defaults_1 = require("../../modules/defaults");
|
|
14
14
|
const utils_1 = require("../../modules/utils");
|
|
15
15
|
const llm_1 = require("../llm");
|
|
16
|
+
const principal_1 = require("../iam/principal");
|
|
16
17
|
const prompts_1 = require("./prompts");
|
|
17
18
|
// ── MCP query invocation ─────────────────────────────────────────────────────
|
|
18
19
|
async function startMcpQuery(input) {
|
|
@@ -23,11 +24,13 @@ async function startMcpQuery(input) {
|
|
|
23
24
|
const entity = direct ? 'mcpQuery' : 'mcpQueryRouter';
|
|
24
25
|
const prefix = direct ? 'mcp-query-direct' : 'mcp-query';
|
|
25
26
|
const workflowId = `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
27
|
+
// Resolve the full principal so ToolContext carries identity to tool calls
|
|
28
|
+
const principal = userId ? await (0, principal_1.resolvePrincipal)(userId) : undefined;
|
|
26
29
|
const handle = await client.workflow.start({
|
|
27
30
|
args: [{
|
|
28
31
|
data: { prompt, tags, context },
|
|
29
|
-
metadata: { source: 'dashboard' },
|
|
30
|
-
lt: { userId },
|
|
32
|
+
metadata: { source: 'dashboard', certified: true },
|
|
33
|
+
lt: { userId, principal, scopes: ['workflow:invoke', 'mcp:tool:call'] },
|
|
31
34
|
}],
|
|
32
35
|
taskQueue: 'long-tail-system',
|
|
33
36
|
workflowName: wfName,
|
|
@@ -53,11 +56,12 @@ async function startWorkflowBuilder(input) {
|
|
|
53
56
|
const startTime = Date.now();
|
|
54
57
|
const client = new hotmesh_1.Durable.Client({ connection: (0, db_1.getConnection)() });
|
|
55
58
|
const workflowId = `wf-builder-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
59
|
+
const principal = userId ? await (0, principal_1.resolvePrincipal)(userId) : undefined;
|
|
56
60
|
const handle = await client.workflow.start({
|
|
57
61
|
args: [{
|
|
58
62
|
data: { prompt, tags, feedback, prior_yaml, answers, prior_questions },
|
|
59
|
-
metadata: { source: 'dashboard' },
|
|
60
|
-
lt: { userId },
|
|
63
|
+
metadata: { source: 'dashboard', certified: true },
|
|
64
|
+
lt: { userId, principal, scopes: ['workflow:invoke', 'mcp:tool:call'] },
|
|
61
65
|
}],
|
|
62
66
|
taskQueue: 'long-tail-system',
|
|
63
67
|
workflowName: 'mcpWorkflowBuilder',
|
|
@@ -83,11 +87,12 @@ async function startWorkflowPlanner(input) {
|
|
|
83
87
|
const startTime = Date.now();
|
|
84
88
|
const client = new hotmesh_1.Durable.Client({ connection: (0, db_1.getConnection)() });
|
|
85
89
|
const workflowId = `wf-planner-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
90
|
+
const principal = userId ? await (0, principal_1.resolvePrincipal)(userId) : undefined;
|
|
86
91
|
const handle = await client.workflow.start({
|
|
87
92
|
args: [{
|
|
88
93
|
data: { specification, setId, existingPlan, existingSchemas },
|
|
89
|
-
metadata: { source: 'dashboard' },
|
|
90
|
-
lt: { userId },
|
|
94
|
+
metadata: { source: 'dashboard', certified: true },
|
|
95
|
+
lt: { userId, principal, scopes: ['workflow:invoke', 'mcp:tool:call'] },
|
|
91
96
|
}],
|
|
92
97
|
taskQueue: 'long-tail-system',
|
|
93
98
|
workflowName: 'mcpWorkflowPlanner',
|
package/build/services/mcp/db.js
CHANGED
|
@@ -18,4 +18,4 @@ export declare const DELETE_STALE_BUILTIN_SERVERS = "\n DELETE FROM lt_mcp_serv
|
|
|
18
18
|
/** Upsert — used by dashboard/API writes (overwrites intentionally). */
|
|
19
19
|
export declare const UPSERT_MCP_SERVER = "\n INSERT INTO lt_mcp_servers\n (name, description, transport_type, transport_config, auto_connect, status, tool_manifest, metadata, tags, compile_hints, credential_providers, last_connected_at)\n VALUES ($1, $2, $3, $4, true, 'connected', $5, $6, $7, $8, $9, NOW())\n ON CONFLICT (name) DO UPDATE SET\n tool_manifest = EXCLUDED.tool_manifest,\n metadata = EXCLUDED.metadata,\n description = EXCLUDED.description,\n tags = EXCLUDED.tags,\n compile_hints = EXCLUDED.compile_hints,\n credential_providers = EXCLUDED.credential_providers,\n status = 'connected',\n last_connected_at = NOW()";
|
|
20
20
|
/** Seed — insert-if-absent. DB is source of truth after first boot. */
|
|
21
|
-
export declare const SEED_MCP_SERVER = "\n INSERT INTO lt_mcp_servers\n (name, description, transport_type, transport_config, auto_connect, status, tool_manifest, metadata, tags, compile_hints, credential_providers, last_connected_at)\n VALUES ($1, $2, $3, $4, true, 'connected', $5, $6, $7, $8, $9, NOW())\n ON CONFLICT (name) DO NOTHING";
|
|
21
|
+
export declare const SEED_MCP_SERVER = "\n INSERT INTO lt_mcp_servers\n (name, description, transport_type, transport_config, auto_connect, status, tool_manifest, metadata, tags, compile_hints, credential_providers, category, last_connected_at)\n VALUES ($1, $2, $3, $4, true, 'connected', $5, $6, $7, $8, $9, $10, NOW())\n ON CONFLICT (name) DO NOTHING";
|
|
@@ -94,6 +94,6 @@ exports.UPSERT_MCP_SERVER = `
|
|
|
94
94
|
/** Seed — insert-if-absent. DB is source of truth after first boot. */
|
|
95
95
|
exports.SEED_MCP_SERVER = `
|
|
96
96
|
INSERT INTO lt_mcp_servers
|
|
97
|
-
(name, description, transport_type, transport_config, auto_connect, status, tool_manifest, metadata, tags, compile_hints, credential_providers, last_connected_at)
|
|
98
|
-
VALUES ($1, $2, $3, $4, true, 'connected', $5, $6, $7, $8, $9, NOW())
|
|
97
|
+
(name, description, transport_type, transport_config, auto_connect, status, tool_manifest, metadata, tags, compile_hints, credential_providers, category, last_connected_at)
|
|
98
|
+
VALUES ($1, $2, $3, $4, true, 'connected', $5, $6, $7, $8, $9, $10, NOW())
|
|
99
99
|
ON CONFLICT (name) DO NOTHING`;
|
package/build/start/workers.js
CHANGED
|
@@ -220,12 +220,79 @@ async function startWorkers(startConfig, workers, builtinMcpServerFactories) {
|
|
|
220
220
|
// Register workers for active YAML (deterministic) workflows
|
|
221
221
|
await yamlWorkflowWorkers.registerAllActiveWorkers();
|
|
222
222
|
}
|
|
223
|
+
// Seed agents (from startConfig + system agents)
|
|
224
|
+
const { getSystemAgents } = await Promise.resolve().then(() => __importStar(require('../system')));
|
|
225
|
+
const allAgentConfigs = [...(startConfig.agents ?? []), ...getSystemAgents()];
|
|
226
|
+
if (allAgentConfigs.length > 0) {
|
|
227
|
+
const { seedAgent, getAgentByName } = await Promise.resolve().then(() => __importStar(require('../services/agent')));
|
|
228
|
+
const { seedSubscription } = await Promise.resolve().then(() => __importStar(require('../services/agent/subscriptions')));
|
|
229
|
+
for (const agentConfig of allAgentConfigs) {
|
|
230
|
+
try {
|
|
231
|
+
// Map flat schedules into behaviors.schedules for DB storage
|
|
232
|
+
const behaviors = {};
|
|
233
|
+
if (agentConfig.schedules?.length) {
|
|
234
|
+
behaviors.schedules = agentConfig.schedules;
|
|
235
|
+
behaviors.cron = agentConfig.schedules[0].cron;
|
|
236
|
+
}
|
|
237
|
+
const inserted = await seedAgent({
|
|
238
|
+
name: agentConfig.name,
|
|
239
|
+
description: agentConfig.description,
|
|
240
|
+
goals: agentConfig.goals,
|
|
241
|
+
rules: agentConfig.rules,
|
|
242
|
+
status: (agentConfig.status ?? 'active'),
|
|
243
|
+
knowledge_domain: agentConfig.knowledge_domain,
|
|
244
|
+
behaviors,
|
|
245
|
+
workflow_type: agentConfig.schedules?.[0]?.workflow_type,
|
|
246
|
+
});
|
|
247
|
+
if (inserted)
|
|
248
|
+
logger_1.loggerRegistry.info(`[long-tail] agent seeded: ${agentConfig.name}`);
|
|
249
|
+
// Seed subscriptions for this agent
|
|
250
|
+
if (agentConfig.subscriptions?.length) {
|
|
251
|
+
const agent = await getAgentByName(agentConfig.name);
|
|
252
|
+
if (agent) {
|
|
253
|
+
for (const sub of agentConfig.subscriptions) {
|
|
254
|
+
try {
|
|
255
|
+
const subInserted = await seedSubscription(agent.id, sub);
|
|
256
|
+
if (subInserted)
|
|
257
|
+
logger_1.loggerRegistry.info(`[long-tail] subscription seeded: ${agentConfig.name}/${sub.topic}`);
|
|
258
|
+
}
|
|
259
|
+
catch (subErr) {
|
|
260
|
+
logger_1.loggerRegistry.warn(`[long-tail] subscription seed failed: ${agentConfig.name}/${sub.topic}: ${subErr.message}`);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
catch (err) {
|
|
267
|
+
logger_1.loggerRegistry.warn(`[long-tail] agent seed failed for ${agentConfig.name}: ${err.message}`);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
// Register the in-process callback adapter for agent event triggers
|
|
272
|
+
const { CallbackEventAdapter } = await Promise.resolve().then(() => __importStar(require('../lib/events/callback')));
|
|
273
|
+
const { agentTriggerRegistry } = await Promise.resolve().then(() => __importStar(require('../services/agent/trigger-registry')));
|
|
274
|
+
const callbackAdapter = new CallbackEventAdapter();
|
|
275
|
+
events_1.eventRegistry.register(callbackAdapter);
|
|
223
276
|
// Connect event adapters (outside workers guard so API-only containers
|
|
224
277
|
// still connect to NATS and can publish/receive events)
|
|
225
278
|
if (events_1.eventRegistry.hasAdapters) {
|
|
226
279
|
await events_1.eventRegistry.connect();
|
|
227
280
|
logger_1.loggerRegistry.info('[long-tail] event adapters connected');
|
|
228
281
|
}
|
|
282
|
+
// Arm agent event subscriptions (after event adapters are connected)
|
|
283
|
+
try {
|
|
284
|
+
await agentTriggerRegistry.connect(callbackAdapter);
|
|
285
|
+
}
|
|
286
|
+
catch (err) {
|
|
287
|
+
logger_1.loggerRegistry.warn(`[long-tail] agent trigger registry: ${err.message}`);
|
|
288
|
+
}
|
|
289
|
+
// Arm agent cron schedules
|
|
290
|
+
try {
|
|
291
|
+
await cron_1.cronRegistry.connectAgentCrons();
|
|
292
|
+
}
|
|
293
|
+
catch (err) {
|
|
294
|
+
logger_1.loggerRegistry.warn(`[long-tail] agent cron schedules: ${err.message}`);
|
|
295
|
+
}
|
|
229
296
|
// Ensure system bot account exists for cron/system-initiated workflows
|
|
230
297
|
const { ensureSystemBot } = await Promise.resolve().then(() => __importStar(require('../services/iam/bots')));
|
|
231
298
|
await ensureSystemBot().catch((err) => logger_1.loggerRegistry.warn(`[long-tail] system bot seed error: ${err.message}`));
|
|
@@ -10,6 +10,7 @@ exports.removeKnowledgeField = removeKnowledgeField;
|
|
|
10
10
|
exports.listDomains = listDomains;
|
|
11
11
|
exports.appendKnowledge = appendKnowledge;
|
|
12
12
|
const db_1 = require("../../lib/db");
|
|
13
|
+
const publish_1 = require("../../lib/events/publish");
|
|
13
14
|
const sql_1 = require("./sql");
|
|
14
15
|
async function withClient(fn) {
|
|
15
16
|
const { class: PgClient, options } = (0, db_1.getConnection)();
|
|
@@ -26,7 +27,9 @@ async function storeKnowledge(args) {
|
|
|
26
27
|
return withClient(async (client) => {
|
|
27
28
|
const sql = args.replace ? sql_1.REPLACE_KNOWLEDGE : sql_1.UPSERT_KNOWLEDGE;
|
|
28
29
|
const { rows } = await client.query(sql, [args.domain, args.key, JSON.stringify(args.data), args.tags || []]);
|
|
29
|
-
|
|
30
|
+
const result = { ...rows[0], updated_at: rows[0].updated_at.toISOString() };
|
|
31
|
+
(0, publish_1.publishKnowledgeEvent)({ type: 'knowledge.stored', domain: args.domain, key: args.key });
|
|
32
|
+
return result;
|
|
30
33
|
});
|
|
31
34
|
}
|
|
32
35
|
async function getKnowledge(args) {
|
|
@@ -111,7 +114,11 @@ async function listKnowledge(args) {
|
|
|
111
114
|
async function deleteKnowledge(args) {
|
|
112
115
|
return withClient(async (client) => {
|
|
113
116
|
const { rowCount } = await client.query(sql_1.DELETE_KNOWLEDGE, [args.domain, args.key]);
|
|
114
|
-
|
|
117
|
+
const deleted = (rowCount ?? 0) > 0;
|
|
118
|
+
if (deleted) {
|
|
119
|
+
(0, publish_1.publishKnowledgeEvent)({ type: 'knowledge.deleted', domain: args.domain, key: args.key });
|
|
120
|
+
}
|
|
121
|
+
return { deleted };
|
|
115
122
|
});
|
|
116
123
|
}
|
|
117
124
|
async function setKnowledgeField(args) {
|
package/build/system/index.d.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* All declarations carry inline `config` that seeds the DB on first boot.
|
|
5
5
|
* DB is the source of truth after seeding — startup never overwrites.
|
|
6
6
|
*/
|
|
7
|
-
import type { LTWorkerConfig, LTMcpServerConfig } from '../types/startup';
|
|
7
|
+
import type { LTWorkerConfig, LTMcpServerConfig, LTAgentConfig } from '../types/startup';
|
|
8
8
|
export type SystemWorkerEntry = {
|
|
9
9
|
taskQueue: string;
|
|
10
10
|
workflow: (...args: any[]) => any;
|
|
@@ -16,3 +16,4 @@ export type McpServerFactoryEntry = {
|
|
|
16
16
|
config: LTMcpServerConfig;
|
|
17
17
|
};
|
|
18
18
|
export declare const builtinMcpServerFactories: Record<string, McpServerFactoryEntry>;
|
|
19
|
+
export declare function getSystemAgents(): LTAgentConfig[];
|
package/build/system/index.js
CHANGED
|
@@ -41,6 +41,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
41
41
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
42
|
exports.builtinMcpServerFactories = void 0;
|
|
43
43
|
exports.getSystemWorkers = getSystemWorkers;
|
|
44
|
+
exports.getSystemAgents = getSystemAgents;
|
|
44
45
|
// ── Tool manifests (static JSON schema data) ────────────────────────────────
|
|
45
46
|
const tool_manifests_escalation_1 = require("./seed/tool-manifests-escalation");
|
|
46
47
|
const tool_manifests_data_1 = require("./seed/tool-manifests-data");
|
|
@@ -48,12 +49,18 @@ const tool_manifests_browser_1 = require("./seed/tool-manifests-browser");
|
|
|
48
49
|
const tool_manifests_workflows_1 = require("./seed/tool-manifests-workflows");
|
|
49
50
|
const tool_manifests_admin_1 = require("./seed/tool-manifests-admin");
|
|
50
51
|
const tool_manifests_knowledge_1 = require("./seed/tool-manifests-knowledge");
|
|
51
|
-
|
|
52
|
+
const tool_manifests_events_1 = require("./seed/tool-manifests-events");
|
|
53
|
+
// Example connectors — loaded conditionally (not in npm package)
|
|
52
54
|
let GMAIL_TOOLS = [];
|
|
53
55
|
try {
|
|
54
56
|
GMAIL_TOOLS = require('../examples/seed/tool-manifests-gmail').GMAIL_TOOLS;
|
|
55
57
|
}
|
|
56
58
|
catch { /* not available */ }
|
|
59
|
+
let IMAGE_TOOLS = [];
|
|
60
|
+
try {
|
|
61
|
+
IMAGE_TOOLS = require('../examples/mcp-servers/tool-manifests-image').IMAGE_TOOLS;
|
|
62
|
+
}
|
|
63
|
+
catch { /* not available */ }
|
|
57
64
|
// ── Role constants ──────────────────────────────────────────────────────────
|
|
58
65
|
const SYSTEM_ROLES = ['reviewer', 'engineer', 'admin'];
|
|
59
66
|
const ENGINEER = 'engineer';
|
|
@@ -135,6 +142,7 @@ exports.builtinMcpServerFactories = {
|
|
|
135
142
|
config: {
|
|
136
143
|
description: 'Built-in escalation and human queue management. Exposes the escalation API as MCP tools for AI agents and remediation workflows.',
|
|
137
144
|
tags: ['escalation', 'human-queue', 'routing'],
|
|
145
|
+
category: 'Automation',
|
|
138
146
|
compileHints: [
|
|
139
147
|
'escalate_and_wait creates a durable pause point.',
|
|
140
148
|
'The step AFTER escalate_and_wait is always a signal step (kind: "signal") that receives the human response.',
|
|
@@ -148,6 +156,7 @@ exports.builtinMcpServerFactories = {
|
|
|
148
156
|
config: {
|
|
149
157
|
description: 'Text translation using LLM. Translates content between languages with automatic source language detection.',
|
|
150
158
|
tags: ['translation', 'language', 'text-processing'],
|
|
159
|
+
category: 'Analysis',
|
|
151
160
|
credentialProviders: ['anthropic'],
|
|
152
161
|
toolManifest: tool_manifests_data_1.TRANSLATION_TOOLS,
|
|
153
162
|
},
|
|
@@ -157,6 +166,7 @@ exports.builtinMcpServerFactories = {
|
|
|
157
166
|
config: {
|
|
158
167
|
description: 'Image analysis and description using LLM vision. Analyzes images to extract structured data, text content, and descriptions.',
|
|
159
168
|
tags: ['vision', 'image-analysis', 'multimodal'],
|
|
169
|
+
category: 'Analysis',
|
|
160
170
|
compileHints: [
|
|
161
171
|
'Vision tools process one image at a time.',
|
|
162
172
|
'The argument name is `image` (NOT `image_path`). It accepts a storage path, data URI, or https:// URL.',
|
|
@@ -172,6 +182,7 @@ exports.builtinMcpServerFactories = {
|
|
|
172
182
|
config: {
|
|
173
183
|
description: 'Low-level browser automation via Playwright. Fine-grained control: navigate, click, fill, wait_for, evaluate, run_script.',
|
|
174
184
|
tags: ['browser-automation', 'testing', 'screenshots'],
|
|
185
|
+
category: 'Automation',
|
|
175
186
|
compileHints: [
|
|
176
187
|
'Session fields (_handle, page_id) MUST be threaded from the step that created them to EVERY subsequent browser step.',
|
|
177
188
|
'run_script accepts a `steps` array — fixed implementation detail, never a dynamic input.',
|
|
@@ -185,6 +196,7 @@ exports.builtinMcpServerFactories = {
|
|
|
185
196
|
config: {
|
|
186
197
|
description: 'High-level browser automation. Intent-based tools that handle session management, timing, and error recovery internally.',
|
|
187
198
|
tags: ['browser-automation', 'screenshots', 'scraping', 'forms'],
|
|
199
|
+
category: 'Automation',
|
|
188
200
|
compileHints: [
|
|
189
201
|
'Session fields (_handle, page_id) MUST be threaded from producing step to ALL subsequent browser steps.',
|
|
190
202
|
'extract_content returns `links` (structured array) and `script_result` (raw). Use `links` as the source field.',
|
|
@@ -198,6 +210,7 @@ exports.builtinMcpServerFactories = {
|
|
|
198
210
|
config: {
|
|
199
211
|
description: 'Product documentation search and retrieval. List, search, and read Long Tail documentation.',
|
|
200
212
|
tags: ['documentation', 'help', 'reference'],
|
|
213
|
+
category: 'Reference',
|
|
201
214
|
toolManifest: tool_manifests_data_1.DOCS_TOOLS,
|
|
202
215
|
},
|
|
203
216
|
},
|
|
@@ -206,6 +219,7 @@ exports.builtinMcpServerFactories = {
|
|
|
206
219
|
config: {
|
|
207
220
|
description: 'Managed file storage for reading, writing, listing, and deleting files.',
|
|
208
221
|
tags: ['storage', 'files', 'io'],
|
|
222
|
+
category: 'Data',
|
|
209
223
|
toolManifest: tool_manifests_data_1.FILE_STORAGE_TOOLS,
|
|
210
224
|
},
|
|
211
225
|
},
|
|
@@ -214,6 +228,7 @@ exports.builtinMcpServerFactories = {
|
|
|
214
228
|
config: {
|
|
215
229
|
description: 'HTTP client tools for making GET, POST, and arbitrary HTTP requests.',
|
|
216
230
|
tags: ['http', 'api', 'fetch', 'network'],
|
|
231
|
+
category: 'Data',
|
|
217
232
|
compileHints: 'HTTP response bodies may be large. Prefer specific fields from parsed JSON rather than raw body.',
|
|
218
233
|
toolManifest: tool_manifests_data_1.HTTP_FETCH_TOOLS,
|
|
219
234
|
},
|
|
@@ -223,6 +238,7 @@ exports.builtinMcpServerFactories = {
|
|
|
223
238
|
config: {
|
|
224
239
|
description: 'OAuth token management. Get fresh access tokens for external services. Handles automatic token refresh.',
|
|
225
240
|
tags: ['authentication', 'oauth', 'credentials'],
|
|
241
|
+
category: 'System',
|
|
226
242
|
compileHints: 'get_access_token returns a short-lived token. Call immediately before authenticated API requests — do not cache across steps.',
|
|
227
243
|
toolManifest: tool_manifests_data_1.OAUTH_TOOLS,
|
|
228
244
|
},
|
|
@@ -232,6 +248,7 @@ exports.builtinMcpServerFactories = {
|
|
|
232
248
|
config: {
|
|
233
249
|
description: 'Agentic coding assistant via Claude Code CLI. Execute development tasks: code generation, refactoring, file analysis, and multi-step workflows.',
|
|
234
250
|
tags: ['development', 'coding', 'ai-agent', 'terminal', 'code-generation'],
|
|
251
|
+
category: 'Development',
|
|
235
252
|
compileHints: 'execute_task runs Claude Code as a subprocess. The `prompt` parameter is ALWAYS a dynamic trigger input. ' +
|
|
236
253
|
'Keep prompts self-contained. For read-only analysis, restrict with allowed_tools: ["Read", "Grep", "Glob"].',
|
|
237
254
|
credentialProviders: ['anthropic'],
|
|
@@ -243,6 +260,7 @@ exports.builtinMcpServerFactories = {
|
|
|
243
260
|
config: {
|
|
244
261
|
description: 'System administration tools for reflexive self-management. Certify workflows, update server tags, manage roles.',
|
|
245
262
|
tags: ['admin', 'system', 'configuration'],
|
|
263
|
+
category: 'System',
|
|
246
264
|
compileHints: 'Admin tools modify system configuration. certify_workflow and decertify_workflow change interceptor behavior.',
|
|
247
265
|
toolManifest: tool_manifests_admin_1.ADMIN_TOOLS,
|
|
248
266
|
},
|
|
@@ -252,6 +270,7 @@ exports.builtinMcpServerFactories = {
|
|
|
252
270
|
config: {
|
|
253
271
|
description: 'Persistent knowledge store for autonomous agents. Store, retrieve, search, and accumulate JSONB documents in isolated domains.',
|
|
254
272
|
tags: ['knowledge', 'memory', 'state', 'storage'],
|
|
273
|
+
category: 'Data',
|
|
255
274
|
compileHints: 'store_knowledge: domain (string), key (string), data (object — MUST be JSON object, never string). ' +
|
|
256
275
|
'Upserts by domain+key. search_knowledge uses JSONB containment (@>). ' +
|
|
257
276
|
'append_knowledge adds to arrays without replacing. list_domains returns all domains with counts.',
|
|
@@ -263,6 +282,7 @@ exports.builtinMcpServerFactories = {
|
|
|
263
282
|
config: {
|
|
264
283
|
description: 'Schema-driven data exchange with external service endpoints. Validates requests and responses against JSON Schema.',
|
|
265
284
|
tags: ['api', 'schema', 'exchange', 'validation', 'fetch'],
|
|
285
|
+
category: 'Data',
|
|
266
286
|
compileHints: 'Validates requests before sending and responses after receiving. ' +
|
|
267
287
|
'Embed request_schema and response_schema as STATIC values. ' +
|
|
268
288
|
'Exchange output: { status, data, headers, elapsed_ms, validated }. API response is in .data field. ' +
|
|
@@ -270,6 +290,17 @@ exports.builtinMcpServerFactories = {
|
|
|
270
290
|
toolManifest: tool_manifests_data_1.SCHEMA_EXCHANGE_TOOLS,
|
|
271
291
|
},
|
|
272
292
|
},
|
|
293
|
+
'long-tail-events': {
|
|
294
|
+
factory: () => Promise.resolve().then(() => __importStar(require('./mcp-servers/events'))).then((m) => m.createEventsServer()),
|
|
295
|
+
config: {
|
|
296
|
+
description: 'Event bus for agent-to-agent communication. Publish custom events that other agents subscribe to and react to.',
|
|
297
|
+
tags: ['events', 'messaging', 'pub-sub'],
|
|
298
|
+
category: 'Communication',
|
|
299
|
+
compileHints: 'publish_event: topic follows app.{namespace}.{entity}.{action} convention. ' +
|
|
300
|
+
'The app. prefix is auto-added if omitted. Events are delivered to all matching subscribers.',
|
|
301
|
+
toolManifest: tool_manifests_events_1.EVENTS_TOOLS,
|
|
302
|
+
},
|
|
303
|
+
},
|
|
273
304
|
};
|
|
274
305
|
// Gmail is an example connector — only register when available (not in npm package)
|
|
275
306
|
if (GMAIL_TOOLS.length > 0) {
|
|
@@ -278,6 +309,7 @@ if (GMAIL_TOOLS.length > 0) {
|
|
|
278
309
|
config: {
|
|
279
310
|
description: 'Gmail tools — search, read, summarize, extract, and draft emails using your connected Google account.',
|
|
280
311
|
tags: ['gmail', 'email', 'messaging', 'google'],
|
|
312
|
+
category: 'Communication',
|
|
281
313
|
compileHints: 'Requires a connected Google account (OAuth). gmail_search finds messages, gmail_read gets full content, ' +
|
|
282
314
|
'gmail_summarize for threads, gmail_extract for structured data, gmail_draft for composing.',
|
|
283
315
|
credentialProviders: ['google'],
|
|
@@ -285,3 +317,63 @@ if (GMAIL_TOOLS.length > 0) {
|
|
|
285
317
|
},
|
|
286
318
|
};
|
|
287
319
|
}
|
|
320
|
+
// Image tools — example connector for image processing via sharp
|
|
321
|
+
if (IMAGE_TOOLS.length > 0) {
|
|
322
|
+
exports.builtinMcpServerFactories['long-tail-image-tools'] = {
|
|
323
|
+
factory: () => Promise.resolve().then(() => __importStar(require('../examples/mcp-servers/image-tools'))).then((m) => m.createImageToolsServer()),
|
|
324
|
+
config: {
|
|
325
|
+
description: 'Image processing tools — resize, crop, rotate, convert, blur, compress, and more.',
|
|
326
|
+
tags: ['image', 'processing', 'vision'],
|
|
327
|
+
category: 'Media',
|
|
328
|
+
compileHints: 'Image tools accept file paths from storage. Use file_storage tools to upload images first.',
|
|
329
|
+
toolManifest: IMAGE_TOOLS,
|
|
330
|
+
},
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
// ── System agents ──────────────────────────────────────────────────────────
|
|
334
|
+
function getSystemAgents() {
|
|
335
|
+
return [
|
|
336
|
+
{
|
|
337
|
+
name: 'health-monitor',
|
|
338
|
+
description: 'Watches for workflow failures and schema drift',
|
|
339
|
+
goals: 'Detect failures early, capture diagnostics, and alert before cascading issues',
|
|
340
|
+
rules: 'Do not restart failed workflows automatically. Capture state and escalate.',
|
|
341
|
+
status: 'active',
|
|
342
|
+
knowledge_domain: 'system-health',
|
|
343
|
+
schedules: [
|
|
344
|
+
{ cron: '0 * * * *', workflow_type: 'basicEcho' },
|
|
345
|
+
],
|
|
346
|
+
subscriptions: [
|
|
347
|
+
{ topic: 'workflow.failed', reaction_type: 'durable', workflow_type: 'basicEcho', input_mapping: { data: { error: '{event.status}', workflowId: '{event.workflowId}' } } },
|
|
348
|
+
{ topic: 'activity.failed', reaction_type: 'durable', workflow_type: 'basicEcho', input_mapping: { data: { activity: '{event.activityName}', workflowId: '{event.workflowId}' } } },
|
|
349
|
+
{ topic: 'app.*.*.error', reaction_type: 'durable', workflow_type: 'basicEcho', input_mapping: { data: { error: '{event.data}', source: '{event.source}' } } },
|
|
350
|
+
],
|
|
351
|
+
},
|
|
352
|
+
{
|
|
353
|
+
name: 'event-coordinator',
|
|
354
|
+
description: 'Coordinates cross-system events and routes them to workflows',
|
|
355
|
+
goals: 'Serve as the central nervous system for event-driven automation',
|
|
356
|
+
rules: 'Route critical events within 5 seconds. Never drop events.',
|
|
357
|
+
status: 'active',
|
|
358
|
+
knowledge_domain: 'event-routing',
|
|
359
|
+
subscriptions: [
|
|
360
|
+
{ topic: 'app.>', reaction_type: 'durable', workflow_type: 'basicEcho', input_mapping: { data: { topic: '{event.type}', source: '{event.source}', payload: '{event.data}' } } },
|
|
361
|
+
{ topic: 'knowledge.stored', reaction_type: 'durable', workflow_type: 'basicEcho', input_mapping: { data: { domain: '{event.data.domain}', key: '{event.data.key}' } } },
|
|
362
|
+
],
|
|
363
|
+
},
|
|
364
|
+
{
|
|
365
|
+
name: 'content-triage',
|
|
366
|
+
description: 'Auto-resolves low-confidence content review escalations',
|
|
367
|
+
goals: 'Reduce human review burden by auto-triaging content below confidence thresholds',
|
|
368
|
+
rules: 'Never auto-approve content flagged for legal review.',
|
|
369
|
+
status: 'active',
|
|
370
|
+
knowledge_domain: 'content-review',
|
|
371
|
+
schedules: [
|
|
372
|
+
{ cron: '*/15 * * * *', workflow_type: 'reviewContent' },
|
|
373
|
+
],
|
|
374
|
+
subscriptions: [
|
|
375
|
+
{ topic: 'escalation.created', reaction_type: 'durable', workflow_type: 'reviewContent', filter: { workflowName: 'reviewContent' }, input_mapping: { data: { escalationId: '{event.escalationId}', workflowId: '{event.workflowId}' } } },
|
|
376
|
+
],
|
|
377
|
+
},
|
|
378
|
+
];
|
|
379
|
+
}
|