@hotmeshio/long-tail 0.4.3 → 0.4.5
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.js +14 -0
- package/build/api/settings.js +4 -0
- package/build/lib/db/index.d.ts +1 -7
- package/build/lib/db/schemas/008_capability_reaction.sql +12 -0
- package/build/lib/db/schemas/009_file_topic_category.sql +10 -0
- package/build/lib/events/index.d.ts +9 -0
- package/build/lib/events/index.js +18 -0
- package/build/lib/events/nats.d.ts +15 -1
- package/build/lib/events/nats.js +46 -2
- package/build/lib/events/publish.d.ts +10 -0
- package/build/lib/events/publish.js +28 -0
- package/build/modules/config.d.ts +1 -7
- package/build/services/agent/index.js +14 -0
- package/build/services/agent/subscription-sql.d.ts +3 -3
- package/build/services/agent/subscription-sql.js +7 -5
- package/build/services/agent/subscriptions.d.ts +3 -1
- package/build/services/agent/subscriptions.js +6 -0
- package/build/services/agent/trigger-registry.d.ts +2 -0
- package/build/services/agent/trigger-registry.js +55 -8
- package/build/services/topics/system-topics.js +29 -0
- package/build/services/yaml-workflow/deployer.d.ts +1 -1
- package/build/services/yaml-workflow/deployer.js +2 -2
- package/build/services/yaml-workflow/invoke.d.ts +2 -0
- package/build/services/yaml-workflow/invoke.js +5 -1
- package/build/start/adapters.js +11 -9
- package/build/start/config.js +4 -0
- package/build/start/workers.js +15 -3
- package/build/system/index.js +16 -0
- package/build/system/mcp-servers/file-storage.js +18 -0
- package/build/system/workflows/capability-invoke/activities.d.ts +12 -0
- package/build/system/workflows/capability-invoke/activities.js +14 -0
- package/build/system/workflows/capability-invoke/index.d.ts +14 -0
- package/build/system/workflows/capability-invoke/index.js +74 -0
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/events.d.ts +13 -1
- package/build/types/startup.d.ts +7 -0
- package/dashboard/dist/assets/AdminDashboard-ntLz5Pro.js +2 -0
- package/dashboard/dist/assets/{AdminDashboard-Dr5wTIZT.js.map → AdminDashboard-ntLz5Pro.js.map} +1 -1
- package/dashboard/dist/assets/AgentConfigPage-D27vWOI6.js +16 -0
- package/dashboard/dist/assets/AgentConfigPage-D27vWOI6.js.map +1 -0
- package/dashboard/dist/assets/AgentDetailPage-Cm2KFR4O.js +4 -0
- package/dashboard/dist/assets/AgentDetailPage-Cm2KFR4O.js.map +1 -0
- package/dashboard/dist/assets/AgentsPage-_ptA-0YO.js +2 -0
- package/dashboard/dist/assets/AgentsPage-_ptA-0YO.js.map +1 -0
- package/dashboard/dist/assets/AvailableEscalationsPage-bdPqEzbx.js +2 -0
- package/dashboard/dist/assets/{AvailableEscalationsPage-UzjXcO3W.js.map → AvailableEscalationsPage-bdPqEzbx.js.map} +1 -1
- package/dashboard/dist/assets/BotPicker-CYfFMpkY.js +2 -0
- package/dashboard/dist/assets/{BotPicker-CM-_u73k.js.map → BotPicker-CYfFMpkY.js.map} +1 -1
- package/dashboard/dist/assets/CapabilitiesPage-M7-ZTFNV.js +2 -0
- package/dashboard/dist/assets/CapabilitiesPage-M7-ZTFNV.js.map +1 -0
- package/dashboard/dist/assets/CollapsibleSection-DU5KAtQ-.js +2 -0
- package/dashboard/dist/assets/{CollapsibleSection-CnPKa7df.js.map → CollapsibleSection-DU5KAtQ-.js.map} +1 -1
- package/dashboard/dist/assets/ConfirmDeleteModal-_hW5Vc05.js +2 -0
- package/dashboard/dist/assets/{ConfirmDeleteModal-dOxidrSR.js.map → ConfirmDeleteModal-_hW5Vc05.js.map} +1 -1
- package/dashboard/dist/assets/CopyableId-DiWqv41D.js +2 -0
- package/dashboard/dist/assets/CopyableId-DiWqv41D.js.map +1 -0
- package/dashboard/dist/assets/CredentialsPage-CmbwypSF.js +2 -0
- package/dashboard/dist/assets/{CredentialsPage-CImIzra4.js.map → CredentialsPage-CmbwypSF.js.map} +1 -1
- package/dashboard/dist/assets/CronLabel-nycfAefc.js +2 -0
- package/dashboard/dist/assets/CronLabel-nycfAefc.js.map +1 -0
- package/dashboard/dist/assets/CustomDurationPicker-gNZRBaHg.js +2 -0
- package/dashboard/dist/assets/{CustomDurationPicker-5JzEgS7I.js.map → CustomDurationPicker-gNZRBaHg.js.map} +1 -1
- package/dashboard/dist/assets/DataTable-DGerT2ZM.js +2 -0
- package/dashboard/dist/assets/{DataTable-D9yuBv0w.js.map → DataTable-DGerT2ZM.js.map} +1 -1
- package/dashboard/dist/assets/DropZone-vNcqMd05.js +2 -0
- package/dashboard/dist/assets/{DropZone-BEW3jBzf.js.map → DropZone-vNcqMd05.js.map} +1 -1
- package/dashboard/dist/assets/ElapsedCell-CdvQbtve.js +2 -0
- package/dashboard/dist/assets/{ElapsedCell-B79BF5Mj.js.map → ElapsedCell-CdvQbtve.js.map} +1 -1
- package/dashboard/dist/assets/EmptyState-DMldv8c5.js +2 -0
- package/dashboard/dist/assets/{EmptyState-BcsfPq9T.js.map → EmptyState-DMldv8c5.js.map} +1 -1
- package/dashboard/dist/assets/EscalationsOverview-BNENCL_2.js +2 -0
- package/dashboard/dist/assets/{EscalationsOverview-QvWvbpx3.js.map → EscalationsOverview-BNENCL_2.js.map} +1 -1
- package/dashboard/dist/assets/EventTable-BqDAyXyc.js +2 -0
- package/dashboard/dist/assets/{EventTable-DAclQwfr.js.map → EventTable-BqDAyXyc.js.map} +1 -1
- package/dashboard/dist/assets/EventTopicPill-CnHFBglc.js +2 -0
- package/dashboard/dist/assets/{EventTopicPill-By-6sXDp.js.map → EventTopicPill-CnHFBglc.js.map} +1 -1
- package/dashboard/dist/assets/FilterBar-TYiTtUgv.js +2 -0
- package/dashboard/dist/assets/{FilterBar-Ck4K4rzu.js.map → FilterBar-TYiTtUgv.js.map} +1 -1
- package/dashboard/dist/assets/HomePage-fterfLKH.js +2 -0
- package/dashboard/dist/assets/{HomePage-DVOi7rR1.js.map → HomePage-fterfLKH.js.map} +1 -1
- package/dashboard/dist/assets/ListToolbar-BO5Igi6v.js +2 -0
- package/dashboard/dist/assets/{ListToolbar-Bntl2hex.js.map → ListToolbar-BO5Igi6v.js.map} +1 -1
- package/dashboard/dist/assets/McpOverview-BQokGg0z.js +2 -0
- package/dashboard/dist/assets/{McpOverview-B-xSYPJj.js.map → McpOverview-BQokGg0z.js.map} +1 -1
- package/dashboard/dist/assets/McpQueryDetailPage-0WOp2n_j.js +5 -0
- package/dashboard/dist/assets/{McpQueryDetailPage-Cq71BzjB.js.map → McpQueryDetailPage-0WOp2n_j.js.map} +1 -1
- package/dashboard/dist/assets/McpQueryPage-DUey_h9J.js +2 -0
- package/dashboard/dist/assets/{McpQueryPage-Dfz87aZF.js.map → McpQueryPage-DUey_h9J.js.map} +1 -1
- package/dashboard/dist/assets/McpRunDetailPage-Cv4qyr91.js +2 -0
- package/dashboard/dist/assets/McpRunDetailPage-Cv4qyr91.js.map +1 -0
- package/dashboard/dist/assets/McpRunsPage-B3R6KZ61.js +2 -0
- package/dashboard/dist/assets/{McpRunsPage-MUYvUYqz.js.map → McpRunsPage-B3R6KZ61.js.map} +1 -1
- package/dashboard/dist/assets/Modal-Qe8lW7gQ.js +2 -0
- package/dashboard/dist/assets/{Modal-DEODGeqx.js.map → Modal-Qe8lW7gQ.js.map} +1 -1
- package/dashboard/dist/assets/OperatorDashboard-dldvzjcg.js +2 -0
- package/dashboard/dist/assets/{OperatorDashboard-Rih1SZrn.js.map → OperatorDashboard-dldvzjcg.js.map} +1 -1
- package/dashboard/dist/assets/PageHeader-DF4BeEm4.js +2 -0
- package/dashboard/dist/assets/{PageHeader-Bo0SpcCK.js.map → PageHeader-DF4BeEm4.js.map} +1 -1
- package/dashboard/dist/assets/PageHeaderWithStats-BQZw6BgA.js +2 -0
- package/dashboard/dist/assets/{PageHeaderWithStats-7K5BdhOj.js.map → PageHeaderWithStats-BQZw6BgA.js.map} +1 -1
- package/dashboard/dist/assets/PriorityBadge-DMyB3WLZ.js +2 -0
- package/dashboard/dist/assets/{PriorityBadge-DfQY9St9.js.map → PriorityBadge-DMyB3WLZ.js.map} +1 -1
- package/dashboard/dist/assets/ProcessDetailPage-Beo-QVL-.js +2 -0
- package/dashboard/dist/assets/{ProcessDetailPage-BMkWCjqD.js.map → ProcessDetailPage-Beo-QVL-.js.map} +1 -1
- package/dashboard/dist/assets/ProcessesListPage-C_ars8gp.js +2 -0
- package/dashboard/dist/assets/{ProcessesListPage-vZjUSc7S.js.map → ProcessesListPage-C_ars8gp.js.map} +1 -1
- package/dashboard/dist/assets/RolePill-DrBZ7JJj.js +2 -0
- package/dashboard/dist/assets/{RolePill-BDzPFQUv.js.map → RolePill-DrBZ7JJj.js.map} +1 -1
- package/dashboard/dist/assets/RolesPage-DgSXFFGL.js +2 -0
- package/dashboard/dist/assets/{RolesPage-kjeAsj3_.js.map → RolesPage-DgSXFFGL.js.map} +1 -1
- package/dashboard/dist/assets/RowActions-QcakGbVA.js +2 -0
- package/dashboard/dist/assets/{RowActions-Dg-Fsm5O.js.map → RowActions-QcakGbVA.js.map} +1 -1
- package/dashboard/dist/assets/RunAsSelector-CYMeZwrM.js +2 -0
- package/dashboard/dist/assets/{RunAsSelector-DC4SLtTq.js.map → RunAsSelector-CYMeZwrM.js.map} +1 -1
- package/dashboard/dist/assets/ServerName-D5NKD06M.js +2 -0
- package/dashboard/dist/assets/{ServerName-CEOFF7UG.js.map → ServerName-D5NKD06M.js.map} +1 -1
- package/dashboard/dist/assets/StatCard-PZQmmCHK.js +2 -0
- package/dashboard/dist/assets/{StatCard-DlgF0CJC.js.map → StatCard-PZQmmCHK.js.map} +1 -1
- package/dashboard/dist/assets/StatusBadge-ME2R6a7K.js +2 -0
- package/dashboard/dist/assets/{StatusBadge-XQlNFwmH.js.map → StatusBadge-ME2R6a7K.js.map} +1 -1
- package/dashboard/dist/assets/StepIndicator-CDDVahOz.js +2 -0
- package/dashboard/dist/assets/{StepIndicator-CuUIGxKk.js.map → StepIndicator-CDDVahOz.js.map} +1 -1
- package/dashboard/dist/assets/StickyPagination-Ddy93Q5I.js +2 -0
- package/dashboard/dist/assets/{StickyPagination-F9FZsRy9.js.map → StickyPagination-Ddy93Q5I.js.map} +1 -1
- package/dashboard/dist/assets/SwimlaneTimeline-CYYA8nd9.js +2 -0
- package/dashboard/dist/assets/SwimlaneTimeline-CYYA8nd9.js.map +1 -0
- package/dashboard/dist/assets/TagInput-B45Dm3IW.js +2 -0
- package/dashboard/dist/assets/{TagInput-VBY0xIwb.js.map → TagInput-B45Dm3IW.js.map} +1 -1
- package/dashboard/dist/assets/TaskDetailPage-CoZFkJ6d.js +2 -0
- package/dashboard/dist/assets/TaskDetailPage-CoZFkJ6d.js.map +1 -0
- package/dashboard/dist/assets/TaskQueuePill-BJRUjVDv.js +2 -0
- package/dashboard/dist/assets/{TaskQueuePill-DZykFijh.js.map → TaskQueuePill-BJRUjVDv.js.map} +1 -1
- package/dashboard/dist/assets/TasksListPage-Czu08px3.js +2 -0
- package/dashboard/dist/assets/{TasksListPage-69ZWCaCP.js.map → TasksListPage-Czu08px3.js.map} +1 -1
- package/dashboard/dist/assets/TimeAgo-CJ56IUy6.js +2 -0
- package/dashboard/dist/assets/{TimeAgo-CttiZG0k.js.map → TimeAgo-CJ56IUy6.js.map} +1 -1
- package/dashboard/dist/assets/TimestampCell-QtcYZ9Jx.js +2 -0
- package/dashboard/dist/assets/{TimestampCell-CYFbEhqc.js.map → TimestampCell-QtcYZ9Jx.js.map} +1 -1
- package/dashboard/dist/assets/ToolPill-DpDv3FwI.js +2 -0
- package/dashboard/dist/assets/{ToolPill-RP2Tvlrx.js.map → ToolPill-DpDv3FwI.js.map} +1 -1
- package/dashboard/dist/assets/ToolTestPanel-BzFOwzd_.js +2 -0
- package/dashboard/dist/assets/ToolTestPanel-BzFOwzd_.js.map +1 -0
- package/dashboard/dist/assets/TopicDetailPage-DwShZbh9.js +9 -0
- package/dashboard/dist/assets/{TopicDetailPage-Aq4-6GLl.js.map → TopicDetailPage-DwShZbh9.js.map} +1 -1
- package/dashboard/dist/assets/TopicsPage-DKXlpZl_.js +2 -0
- package/dashboard/dist/assets/{TopicsPage-BYFKjRY_.js.map → TopicsPage-DKXlpZl_.js.map} +1 -1
- package/dashboard/dist/assets/UserName-zlR1so37.js +2 -0
- package/dashboard/dist/assets/{UserName-C4_T5-rI.js.map → UserName-zlR1so37.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowExecutionPage-BMNIxeJB.js +2 -0
- package/dashboard/dist/assets/WorkflowExecutionPage-BMNIxeJB.js.map +1 -0
- package/dashboard/dist/assets/WorkflowPill-B5B3yGlh.js +2 -0
- package/dashboard/dist/assets/WorkflowPill-B5B3yGlh.js.map +1 -0
- package/dashboard/dist/assets/WorkflowsDashboard-BlAPZbQZ.js +2 -0
- package/dashboard/dist/assets/{WorkflowsDashboard-_LMWc-OC.js.map → WorkflowsDashboard-BlAPZbQZ.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowsOverview-NnPi6rwS.js +2 -0
- package/dashboard/dist/assets/{WorkflowsOverview-DFrfw554.js.map → WorkflowsOverview-NnPi6rwS.js.map} +1 -1
- package/dashboard/dist/assets/YamlWorkflowsPage-C4mZum6x.js +2 -0
- package/dashboard/dist/assets/{YamlWorkflowsPage-CZzGwfol.js.map → YamlWorkflowsPage-C4mZum6x.js.map} +1 -1
- package/dashboard/dist/assets/{agents-CsKILVSU.js → agents-B5wvILeV.js} +2 -2
- package/dashboard/dist/assets/{agents-CsKILVSU.js.map → agents-B5wvILeV.js.map} +1 -1
- package/dashboard/dist/assets/{bots-BzEs6Q9L.js → bots-BPlouRDm.js} +2 -2
- package/dashboard/dist/assets/{bots-BzEs6Q9L.js.map → bots-BPlouRDm.js.map} +1 -1
- package/dashboard/dist/assets/capabilities-DkvRG09b.js +2 -0
- package/dashboard/dist/assets/capabilities-DkvRG09b.js.map +1 -0
- package/dashboard/dist/assets/{controlplane-COYEIIAz.js → controlplane-0m_rA-UW.js} +2 -2
- package/dashboard/dist/assets/{controlplane-COYEIIAz.js.map → controlplane-0m_rA-UW.js.map} +1 -1
- package/dashboard/dist/assets/escalation-CfIAIUg2.js +2 -0
- package/dashboard/dist/assets/{escalation-BZjS2202.js.map → escalation-CfIAIUg2.js.map} +1 -1
- package/dashboard/dist/assets/escalation-columns-CLIdxlbe.js +2 -0
- package/dashboard/dist/assets/{escalation-columns-DtRVmPSB.js.map → escalation-columns-CLIdxlbe.js.map} +1 -1
- package/dashboard/dist/assets/helpers-prGqC38M.js +2 -0
- package/dashboard/dist/assets/{helpers-BngVEys5.js.map → helpers-prGqC38M.js.map} +1 -1
- package/dashboard/dist/assets/index-4T7Z_gQ4.js +281 -0
- package/dashboard/dist/assets/index-4T7Z_gQ4.js.map +1 -0
- package/dashboard/dist/assets/index-BPxglOYm.css +1 -0
- package/dashboard/dist/assets/index-BR3SwTNI.js +2 -0
- package/dashboard/dist/assets/{index-COgyD_H2.js.map → index-BR3SwTNI.js.map} +1 -1
- package/dashboard/dist/assets/index-BWKIigEk.js +2 -0
- package/dashboard/dist/assets/{index-Byp8BDPs.js.map → index-BWKIigEk.js.map} +1 -1
- package/dashboard/dist/assets/index-BgVuyWhi.js +15 -0
- package/dashboard/dist/assets/{index-DykjJxzr.js.map → index-BgVuyWhi.js.map} +1 -1
- package/dashboard/dist/assets/index-C0sDEKdo.js +2 -0
- package/dashboard/dist/assets/{index-DxMNiFPS.js.map → index-C0sDEKdo.js.map} +1 -1
- package/dashboard/dist/assets/index-C2MJzu6J.js +2 -0
- package/dashboard/dist/assets/{index-ByxH4qQ-.js.map → index-C2MJzu6J.js.map} +1 -1
- package/dashboard/dist/assets/index-CFoddJDr.js +6 -0
- package/dashboard/dist/assets/{index-BCsShN2l.js.map → index-CFoddJDr.js.map} +1 -1
- package/dashboard/dist/assets/index-CrMxD5Ib.js +6 -0
- package/dashboard/dist/assets/index-CrMxD5Ib.js.map +1 -0
- package/dashboard/dist/assets/index-CuY5hPYB.js +2 -0
- package/dashboard/dist/assets/{index-Bq5MSkCL.js.map → index-CuY5hPYB.js.map} +1 -1
- package/dashboard/dist/assets/index-CwkJBn87.js +2 -0
- package/dashboard/dist/assets/{index-R61-yG56.js.map → index-CwkJBn87.js.map} +1 -1
- package/dashboard/dist/assets/index-DeL84Cag.js +2 -0
- package/dashboard/dist/assets/{index-xgl431mG.js.map → index-DeL84Cag.js.map} +1 -1
- package/dashboard/dist/assets/index-DqeLbz6j.js +2 -0
- package/dashboard/dist/assets/{index-ABsZZf_U.js.map → index-DqeLbz6j.js.map} +1 -1
- package/dashboard/dist/assets/index-P9huxx3-.js +2 -0
- package/dashboard/dist/assets/{index-BwivT39P.js.map → index-P9huxx3-.js.map} +1 -1
- package/dashboard/dist/assets/{knowledge-DhCbDgy4.js → knowledge-CUZxyRCO.js} +2 -2
- package/dashboard/dist/assets/{knowledge-DhCbDgy4.js.map → knowledge-CUZxyRCO.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-xh7T0I-f.js → mcp-B5VQPoF3.js} +2 -2
- package/dashboard/dist/assets/{mcp-xh7T0I-f.js.map → mcp-B5VQPoF3.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-il3CfU3U.js → mcp-query-Ba5Zj3yg.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-il3CfU3U.js.map → mcp-query-Ba5Zj3yg.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-runs-4fyRpegc.js → mcp-runs-CAiEr5Fc.js} +2 -2
- package/dashboard/dist/assets/{mcp-runs-4fyRpegc.js.map → mcp-runs-CAiEr5Fc.js.map} +1 -1
- package/dashboard/dist/assets/namespaces-sVr5scma.js +2 -0
- package/dashboard/dist/assets/{namespaces-BBTvHnRF.js.map → namespaces-sVr5scma.js.map} +1 -1
- package/dashboard/dist/assets/{roles-D7bx5FAM.js → roles-E_bA4e0f.js} +2 -2
- package/dashboard/dist/assets/{roles-D7bx5FAM.js.map → roles-E_bA4e0f.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-BgxRbhVM.js → tasks-CL6Gv8jB.js} +2 -2
- package/dashboard/dist/assets/{tasks-BgxRbhVM.js.map → tasks-CL6Gv8jB.js.map} +1 -1
- package/dashboard/dist/assets/{topics-CTtCboHe.js → topics-DbtPHERP.js} +2 -2
- package/dashboard/dist/assets/{topics-CTtCboHe.js.map → topics-DbtPHERP.js.map} +1 -1
- package/dashboard/dist/assets/{useCollapsedSections-BU5HULGs.js → useCollapsedSections-CGNA5oKV.js} +2 -2
- package/dashboard/dist/assets/{useCollapsedSections-BU5HULGs.js.map → useCollapsedSections-CGNA5oKV.js.map} +1 -1
- package/dashboard/dist/assets/useEventHooks-C6c618cj.js +2 -0
- package/dashboard/dist/assets/useEventHooks-C6c618cj.js.map +1 -0
- package/dashboard/dist/assets/{useExpandedRows-CkcEntB-.js → useExpandedRows-Cg9iq6Vy.js} +2 -2
- package/dashboard/dist/assets/{useExpandedRows-CkcEntB-.js.map → useExpandedRows-Cg9iq6Vy.js.map} +1 -1
- package/dashboard/dist/assets/{useFilterParams-DZCAaBC7.js → useFilterParams-CGRYFw_A.js} +2 -2
- package/dashboard/dist/assets/{useFilterParams-DZCAaBC7.js.map → useFilterParams-CGRYFw_A.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-CSMX9He5.js → useYamlActivityEvents-eK7kIUdh.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-CSMX9He5.js.map → useYamlActivityEvents-eK7kIUdh.js.map} +1 -1
- package/dashboard/dist/assets/{users-CyF-5WLI.js → users-CCHSIAxt.js} +2 -2
- package/dashboard/dist/assets/{users-CyF-5WLI.js.map → users-CCHSIAxt.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-BNtvBbnj.js → vendor-icons-D8-ZINAH.js} +3 -3
- package/dashboard/dist/assets/{vendor-icons-BNtvBbnj.js.map → vendor-icons-D8-ZINAH.js.map} +1 -1
- package/dashboard/dist/assets/vendor-query-DLp59M9_.js +35 -0
- package/dashboard/dist/assets/vendor-query-DLp59M9_.js.map +1 -0
- package/dashboard/dist/assets/vendor-react-Co3Y8ikm.js +26 -0
- package/dashboard/dist/assets/vendor-react-Co3Y8ikm.js.map +1 -0
- package/dashboard/dist/assets/{workflows-Bf4_w24H.js → workflows-BNbocg_9.js} +2 -2
- package/dashboard/dist/assets/{workflows-Bf4_w24H.js.map → workflows-BNbocg_9.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-Cp1N0NMK.js → yaml-workflows-Cu1FUwrc.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-Cp1N0NMK.js.map → yaml-workflows-Cu1FUwrc.js.map} +1 -1
- package/dashboard/dist/index.html +5 -5
- package/docs/agents.md +9 -9
- package/docs/api/http/agents.md +12 -10
- package/docs/api/http/settings.md +4 -0
- package/docs/api/sdk/agents.md +4 -2
- package/docs/api/sdk/settings.md +2 -1
- package/docs/dashboard.md +1 -1
- package/package.json +2 -2
- package/dashboard/dist/assets/AdminDashboard-Dr5wTIZT.js +0 -2
- package/dashboard/dist/assets/AgentConfigPage-D52KyJY-.js +0 -13
- package/dashboard/dist/assets/AgentConfigPage-D52KyJY-.js.map +0 -1
- package/dashboard/dist/assets/AgentDetailPage-Cbo_qrYF.js +0 -4
- package/dashboard/dist/assets/AgentDetailPage-Cbo_qrYF.js.map +0 -1
- package/dashboard/dist/assets/AgentsPage-CvuF8--H.js +0 -2
- package/dashboard/dist/assets/AgentsPage-CvuF8--H.js.map +0 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-UzjXcO3W.js +0 -2
- package/dashboard/dist/assets/BotPicker-CM-_u73k.js +0 -2
- package/dashboard/dist/assets/CapabilitiesPage-D1QEHMKw.js +0 -2
- package/dashboard/dist/assets/CapabilitiesPage-D1QEHMKw.js.map +0 -1
- package/dashboard/dist/assets/CollapsibleSection-CnPKa7df.js +0 -2
- package/dashboard/dist/assets/ConfirmDeleteModal-dOxidrSR.js +0 -2
- package/dashboard/dist/assets/CopyableId-DmLF-RqZ.js +0 -2
- package/dashboard/dist/assets/CopyableId-DmLF-RqZ.js.map +0 -1
- package/dashboard/dist/assets/CredentialsPage-CImIzra4.js +0 -2
- package/dashboard/dist/assets/CronLabel-5HPAmciI.js +0 -2
- package/dashboard/dist/assets/CronLabel-5HPAmciI.js.map +0 -1
- package/dashboard/dist/assets/CustomDurationPicker-5JzEgS7I.js +0 -2
- package/dashboard/dist/assets/DataTable-D9yuBv0w.js +0 -2
- package/dashboard/dist/assets/DropZone-BEW3jBzf.js +0 -2
- package/dashboard/dist/assets/ElapsedCell-B79BF5Mj.js +0 -2
- package/dashboard/dist/assets/EmptyState-BcsfPq9T.js +0 -2
- package/dashboard/dist/assets/EscalationsOverview-QvWvbpx3.js +0 -2
- package/dashboard/dist/assets/EventTable-DAclQwfr.js +0 -2
- package/dashboard/dist/assets/EventTopicPill-By-6sXDp.js +0 -2
- package/dashboard/dist/assets/FilterBar-Ck4K4rzu.js +0 -2
- package/dashboard/dist/assets/HomePage-DVOi7rR1.js +0 -2
- package/dashboard/dist/assets/ListToolbar-Bntl2hex.js +0 -2
- package/dashboard/dist/assets/McpOverview-B-xSYPJj.js +0 -2
- package/dashboard/dist/assets/McpQueryDetailPage-Cq71BzjB.js +0 -5
- package/dashboard/dist/assets/McpQueryPage-Dfz87aZF.js +0 -2
- package/dashboard/dist/assets/McpRunDetailPage-CXXRgMmJ.js +0 -2
- package/dashboard/dist/assets/McpRunDetailPage-CXXRgMmJ.js.map +0 -1
- package/dashboard/dist/assets/McpRunsPage-MUYvUYqz.js +0 -2
- package/dashboard/dist/assets/Modal-DEODGeqx.js +0 -2
- package/dashboard/dist/assets/OperatorDashboard-Rih1SZrn.js +0 -2
- package/dashboard/dist/assets/PageHeader-Bo0SpcCK.js +0 -2
- package/dashboard/dist/assets/PageHeaderWithStats-7K5BdhOj.js +0 -2
- package/dashboard/dist/assets/PriorityBadge-DfQY9St9.js +0 -2
- package/dashboard/dist/assets/ProcessDetailPage-BMkWCjqD.js +0 -2
- package/dashboard/dist/assets/ProcessesListPage-vZjUSc7S.js +0 -2
- package/dashboard/dist/assets/RolePill-BDzPFQUv.js +0 -2
- package/dashboard/dist/assets/RolesPage-kjeAsj3_.js +0 -2
- package/dashboard/dist/assets/RowActions-Dg-Fsm5O.js +0 -2
- package/dashboard/dist/assets/RunAsSelector-DC4SLtTq.js +0 -2
- package/dashboard/dist/assets/ServerName-CEOFF7UG.js +0 -2
- package/dashboard/dist/assets/StatCard-DlgF0CJC.js +0 -2
- package/dashboard/dist/assets/StatusBadge-XQlNFwmH.js +0 -2
- package/dashboard/dist/assets/StepIndicator-CuUIGxKk.js +0 -2
- package/dashboard/dist/assets/StickyPagination-F9FZsRy9.js +0 -2
- package/dashboard/dist/assets/SwimlaneTimeline-MUUXgT3o.js +0 -2
- package/dashboard/dist/assets/SwimlaneTimeline-MUUXgT3o.js.map +0 -1
- package/dashboard/dist/assets/TagInput-VBY0xIwb.js +0 -2
- package/dashboard/dist/assets/TaskDetailPage-C0AlG_2t.js +0 -2
- package/dashboard/dist/assets/TaskDetailPage-C0AlG_2t.js.map +0 -1
- package/dashboard/dist/assets/TaskQueuePill-DZykFijh.js +0 -2
- package/dashboard/dist/assets/TasksListPage-69ZWCaCP.js +0 -2
- package/dashboard/dist/assets/TimeAgo-CttiZG0k.js +0 -2
- package/dashboard/dist/assets/TimestampCell-CYFbEhqc.js +0 -2
- package/dashboard/dist/assets/ToolPill-RP2Tvlrx.js +0 -2
- package/dashboard/dist/assets/ToolTestPanel-CY_PLZSe.js +0 -2
- package/dashboard/dist/assets/ToolTestPanel-CY_PLZSe.js.map +0 -1
- package/dashboard/dist/assets/TopicDetailPage-Aq4-6GLl.js +0 -9
- package/dashboard/dist/assets/TopicsPage-BYFKjRY_.js +0 -2
- package/dashboard/dist/assets/UserName-C4_T5-rI.js +0 -2
- package/dashboard/dist/assets/WorkflowExecutionPage-DUSTBasv.js +0 -2
- package/dashboard/dist/assets/WorkflowExecutionPage-DUSTBasv.js.map +0 -1
- package/dashboard/dist/assets/WorkflowPill-pPuGH8v9.js +0 -2
- package/dashboard/dist/assets/WorkflowPill-pPuGH8v9.js.map +0 -1
- package/dashboard/dist/assets/WorkflowsDashboard-_LMWc-OC.js +0 -2
- package/dashboard/dist/assets/WorkflowsOverview-DFrfw554.js +0 -2
- package/dashboard/dist/assets/YamlWorkflowsPage-CZzGwfol.js +0 -2
- package/dashboard/dist/assets/escalation-BZjS2202.js +0 -2
- package/dashboard/dist/assets/escalation-columns-DtRVmPSB.js +0 -2
- package/dashboard/dist/assets/helpers-BngVEys5.js +0 -2
- package/dashboard/dist/assets/index-ABsZZf_U.js +0 -2
- package/dashboard/dist/assets/index-BCsShN2l.js +0 -6
- package/dashboard/dist/assets/index-Bq5MSkCL.js +0 -2
- package/dashboard/dist/assets/index-BwivT39P.js +0 -2
- package/dashboard/dist/assets/index-Byp8BDPs.js +0 -2
- package/dashboard/dist/assets/index-ByxH4qQ-.js +0 -2
- package/dashboard/dist/assets/index-COgyD_H2.js +0 -2
- package/dashboard/dist/assets/index-DXEYynKO.css +0 -1
- package/dashboard/dist/assets/index-DcpCR9c_.js +0 -63
- package/dashboard/dist/assets/index-DcpCR9c_.js.map +0 -1
- package/dashboard/dist/assets/index-DuPY59Yu.js +0 -5
- package/dashboard/dist/assets/index-DuPY59Yu.js.map +0 -1
- package/dashboard/dist/assets/index-DxMNiFPS.js +0 -2
- package/dashboard/dist/assets/index-DykjJxzr.js +0 -15
- package/dashboard/dist/assets/index-R61-yG56.js +0 -2
- package/dashboard/dist/assets/index-xgl431mG.js +0 -2
- package/dashboard/dist/assets/namespaces-BBTvHnRF.js +0 -2
- package/dashboard/dist/assets/settings-nt6qyR1S.js +0 -2
- package/dashboard/dist/assets/settings-nt6qyR1S.js.map +0 -1
- package/dashboard/dist/assets/useEventHooks-CkJOmbF-.js +0 -2
- package/dashboard/dist/assets/useEventHooks-CkJOmbF-.js.map +0 -1
- package/dashboard/dist/assets/vendor-query-B2UbickB.js +0 -18
- package/dashboard/dist/assets/vendor-query-B2UbickB.js.map +0 -1
- package/dashboard/dist/assets/vendor-react-CX88sFS5.js +0 -22
- package/dashboard/dist/assets/vendor-react-CX88sFS5.js.map +0 -1
|
@@ -38,6 +38,15 @@ exports.createSubscription = createSubscription;
|
|
|
38
38
|
exports.updateSubscription = updateSubscription;
|
|
39
39
|
exports.deleteSubscription = deleteSubscription;
|
|
40
40
|
const subService = __importStar(require("../services/agent/subscriptions"));
|
|
41
|
+
const publish_1 = require("../lib/events/publish");
|
|
42
|
+
function notifyTriggersChanged(agentId) {
|
|
43
|
+
(0, publish_1.publishAgentEvent)({
|
|
44
|
+
type: 'agent.triggers_changed',
|
|
45
|
+
agentId,
|
|
46
|
+
agentName: agentId,
|
|
47
|
+
data: { action: 'subscription_changed' },
|
|
48
|
+
});
|
|
49
|
+
}
|
|
41
50
|
async function listSubscriptions(input) {
|
|
42
51
|
try {
|
|
43
52
|
const subs = await subService.listSubscriptions(input.agentId);
|
|
@@ -51,6 +60,7 @@ async function createSubscription(input) {
|
|
|
51
60
|
try {
|
|
52
61
|
const { agentId, ...data } = input;
|
|
53
62
|
const sub = await subService.createSubscription(agentId, data);
|
|
63
|
+
notifyTriggersChanged(agentId);
|
|
54
64
|
return { status: 201, data: sub };
|
|
55
65
|
}
|
|
56
66
|
catch (err) {
|
|
@@ -63,6 +73,7 @@ async function updateSubscription(input) {
|
|
|
63
73
|
const sub = await subService.updateSubscription(id, data);
|
|
64
74
|
if (!sub)
|
|
65
75
|
return { status: 404, error: 'Subscription not found' };
|
|
76
|
+
notifyTriggersChanged(sub.agent_id);
|
|
66
77
|
return { status: 200, data: sub };
|
|
67
78
|
}
|
|
68
79
|
catch (err) {
|
|
@@ -71,9 +82,12 @@ async function updateSubscription(input) {
|
|
|
71
82
|
}
|
|
72
83
|
async function deleteSubscription(input) {
|
|
73
84
|
try {
|
|
85
|
+
const sub = await subService.getSubscription(input.id);
|
|
74
86
|
const deleted = await subService.deleteSubscription(input.id);
|
|
75
87
|
if (!deleted)
|
|
76
88
|
return { status: 404, error: 'Subscription not found' };
|
|
89
|
+
if (sub)
|
|
90
|
+
notifyTriggersChanged(sub.agent_id);
|
|
77
91
|
return { status: 200, data: { deleted: true } };
|
|
78
92
|
}
|
|
79
93
|
catch (err) {
|
package/build/api/settings.js
CHANGED
|
@@ -6,6 +6,7 @@ const events_1 = require("../lib/events");
|
|
|
6
6
|
const nats_1 = require("../lib/events/nats");
|
|
7
7
|
const socketio_1 = require("../lib/events/socketio");
|
|
8
8
|
const defaults_1 = require("../modules/defaults");
|
|
9
|
+
const llm_1 = require("../services/llm");
|
|
9
10
|
/**
|
|
10
11
|
* Return platform settings for the current deployment.
|
|
11
12
|
*
|
|
@@ -39,6 +40,9 @@ async function getSettings() {
|
|
|
39
40
|
? (process.env.VITE_NATS_WS_URL || process.env.NATS_WS_URL || null)
|
|
40
41
|
: null,
|
|
41
42
|
},
|
|
43
|
+
ai: {
|
|
44
|
+
enabled: (0, llm_1.hasLLMApiKey)(),
|
|
45
|
+
},
|
|
42
46
|
},
|
|
43
47
|
};
|
|
44
48
|
}
|
package/build/lib/db/index.d.ts
CHANGED
|
@@ -8,11 +8,5 @@ export declare function closePool(): Promise<void>;
|
|
|
8
8
|
*/
|
|
9
9
|
export declare function getConnection(): {
|
|
10
10
|
class: typeof Client;
|
|
11
|
-
options:
|
|
12
|
-
host: string;
|
|
13
|
-
port: number;
|
|
14
|
-
user: string;
|
|
15
|
-
password: string;
|
|
16
|
-
database: string;
|
|
17
|
-
};
|
|
11
|
+
options: Record<string, unknown>;
|
|
18
12
|
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
-- Add 'capability' reaction type and server_id/tool_name columns
|
|
2
|
+
-- for late-binding MCP tool invocation via agent subscriptions.
|
|
3
|
+
|
|
4
|
+
ALTER TABLE lt_agent_subscriptions
|
|
5
|
+
DROP CONSTRAINT IF EXISTS lt_agent_subscriptions_reaction_type_check;
|
|
6
|
+
|
|
7
|
+
ALTER TABLE lt_agent_subscriptions
|
|
8
|
+
ADD CONSTRAINT lt_agent_subscriptions_reaction_type_check
|
|
9
|
+
CHECK (reaction_type IN ('durable', 'pipeline', 'mcp_query', 'capability'));
|
|
10
|
+
|
|
11
|
+
ALTER TABLE lt_agent_subscriptions ADD COLUMN IF NOT EXISTS server_id TEXT;
|
|
12
|
+
ALTER TABLE lt_agent_subscriptions ADD COLUMN IF NOT EXISTS tool_name TEXT;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
-- Add 'file' to the topic catalog category check constraint.
|
|
2
|
+
|
|
3
|
+
ALTER TABLE lt_topic_catalog
|
|
4
|
+
DROP CONSTRAINT IF EXISTS lt_topic_catalog_category_check;
|
|
5
|
+
|
|
6
|
+
ALTER TABLE lt_topic_catalog
|
|
7
|
+
ADD CONSTRAINT lt_topic_catalog_category_check
|
|
8
|
+
CHECK (category IN (
|
|
9
|
+
'task','workflow','escalation','activity','knowledge','file','agent','app','milestone'
|
|
10
|
+
));
|
|
@@ -31,6 +31,15 @@ declare class LTEventRegistry {
|
|
|
31
31
|
* Return the first registered adapter that matches the given type.
|
|
32
32
|
*/
|
|
33
33
|
getAdapter<T extends LTEventAdapter>(ctor: new (...args: any[]) => T): T | undefined;
|
|
34
|
+
/**
|
|
35
|
+
* Bridge cross-container events to the in-process callback adapter.
|
|
36
|
+
*
|
|
37
|
+
* Iterates all registered adapters and calls `setCallbackBridge()` on
|
|
38
|
+
* any that implement it. This is the generic contract — any transport
|
|
39
|
+
* adapter (NATS, SNS, GCP Pub/Sub, Kafka) that supports cross-process
|
|
40
|
+
* delivery implements `setCallbackBridge` on the LTEventAdapter interface.
|
|
41
|
+
*/
|
|
42
|
+
bridgeCallbackAdapter(callbackAdapter: LTEventAdapter): void;
|
|
34
43
|
}
|
|
35
44
|
/** Singleton event registry */
|
|
36
45
|
export declare const eventRegistry: LTEventRegistry;
|
|
@@ -59,6 +59,24 @@ class LTEventRegistry {
|
|
|
59
59
|
getAdapter(ctor) {
|
|
60
60
|
return this.adapters.find((a) => a instanceof ctor);
|
|
61
61
|
}
|
|
62
|
+
/**
|
|
63
|
+
* Bridge cross-container events to the in-process callback adapter.
|
|
64
|
+
*
|
|
65
|
+
* Iterates all registered adapters and calls `setCallbackBridge()` on
|
|
66
|
+
* any that implement it. This is the generic contract — any transport
|
|
67
|
+
* adapter (NATS, SNS, GCP Pub/Sub, Kafka) that supports cross-process
|
|
68
|
+
* delivery implements `setCallbackBridge` on the LTEventAdapter interface.
|
|
69
|
+
*/
|
|
70
|
+
bridgeCallbackAdapter(callbackAdapter) {
|
|
71
|
+
let bridged = 0;
|
|
72
|
+
for (const adapter of this.adapters) {
|
|
73
|
+
if (adapter !== callbackAdapter && typeof adapter.setCallbackBridge === 'function') {
|
|
74
|
+
adapter.setCallbackBridge(callbackAdapter);
|
|
75
|
+
bridged++;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
logger_1.loggerRegistry.info(`[lt-events] callback bridge wired to ${bridged} transport adapter(s)`);
|
|
79
|
+
}
|
|
62
80
|
}
|
|
63
81
|
/** Singleton event registry */
|
|
64
82
|
exports.eventRegistry = new LTEventRegistry();
|
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
import type { LTEvent, LTEventAdapter } from '../../types';
|
|
2
2
|
/**
|
|
3
|
-
* NATS event adapter —
|
|
3
|
+
* NATS event adapter — publish AND subscribe.
|
|
4
4
|
*
|
|
5
5
|
* Publishes LTEvent payloads as JSON to NATS subjects
|
|
6
6
|
* following the pattern: `{subjectPrefix}.{event.type}`
|
|
7
7
|
*
|
|
8
|
+
* When a CallbackEventAdapter is bridged via `setCallbackBridge()`,
|
|
9
|
+
* this adapter also subscribes to `{subjectPrefix}.>` and forwards
|
|
10
|
+
* events from other containers to the local callback adapter.
|
|
11
|
+
* An `_originId` field prevents the publishing container from
|
|
12
|
+
* re-dispatching its own events.
|
|
13
|
+
*
|
|
8
14
|
* Usage:
|
|
9
15
|
* ```typescript
|
|
10
16
|
* import { eventRegistry, NatsEventAdapter } from '@hotmeshio/long-tail';
|
|
@@ -15,14 +21,22 @@ import type { LTEvent, LTEventAdapter } from '../../types';
|
|
|
15
21
|
*/
|
|
16
22
|
export declare class NatsEventAdapter implements LTEventAdapter {
|
|
17
23
|
private nc;
|
|
24
|
+
private sub;
|
|
18
25
|
private url;
|
|
19
26
|
private subjectPrefix;
|
|
20
27
|
private token?;
|
|
28
|
+
private originId;
|
|
29
|
+
private callbackAdapter;
|
|
21
30
|
constructor(options?: {
|
|
22
31
|
url?: string;
|
|
23
32
|
subjectPrefix?: string;
|
|
24
33
|
token?: string;
|
|
25
34
|
});
|
|
35
|
+
/**
|
|
36
|
+
* Bridge NATS → local callback adapter for cross-container dispatch.
|
|
37
|
+
* Part of the LTEventAdapter contract. Call before `connect()`.
|
|
38
|
+
*/
|
|
39
|
+
setCallbackBridge(adapter: LTEventAdapter): void;
|
|
26
40
|
connect(): Promise<void>;
|
|
27
41
|
publish(event: LTEvent): Promise<void>;
|
|
28
42
|
disconnect(): Promise<void>;
|
package/build/lib/events/nats.js
CHANGED
|
@@ -1,16 +1,23 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.NatsEventAdapter = void 0;
|
|
4
|
+
const crypto_1 = require("crypto");
|
|
4
5
|
const nats_1 = require("nats");
|
|
5
6
|
const config_1 = require("../../modules/config");
|
|
6
7
|
const logger_1 = require("../logger");
|
|
7
8
|
const sc = (0, nats_1.StringCodec)();
|
|
8
9
|
/**
|
|
9
|
-
* NATS event adapter —
|
|
10
|
+
* NATS event adapter — publish AND subscribe.
|
|
10
11
|
*
|
|
11
12
|
* Publishes LTEvent payloads as JSON to NATS subjects
|
|
12
13
|
* following the pattern: `{subjectPrefix}.{event.type}`
|
|
13
14
|
*
|
|
15
|
+
* When a CallbackEventAdapter is bridged via `setCallbackBridge()`,
|
|
16
|
+
* this adapter also subscribes to `{subjectPrefix}.>` and forwards
|
|
17
|
+
* events from other containers to the local callback adapter.
|
|
18
|
+
* An `_originId` field prevents the publishing container from
|
|
19
|
+
* re-dispatching its own events.
|
|
20
|
+
*
|
|
14
21
|
* Usage:
|
|
15
22
|
* ```typescript
|
|
16
23
|
* import { eventRegistry, NatsEventAdapter } from '@hotmeshio/long-tail';
|
|
@@ -22,24 +29,61 @@ const sc = (0, nats_1.StringCodec)();
|
|
|
22
29
|
class NatsEventAdapter {
|
|
23
30
|
constructor(options) {
|
|
24
31
|
this.nc = null;
|
|
32
|
+
this.sub = null;
|
|
33
|
+
this.originId = (0, crypto_1.randomUUID)();
|
|
34
|
+
this.callbackAdapter = null;
|
|
25
35
|
this.url = options?.url || config_1.config.NATS_URL;
|
|
26
36
|
this.subjectPrefix = options?.subjectPrefix || 'lt.events';
|
|
27
37
|
this.token = options?.token || process.env.NATS_TOKEN || 'dev_api_secret';
|
|
28
38
|
}
|
|
39
|
+
/**
|
|
40
|
+
* Bridge NATS → local callback adapter for cross-container dispatch.
|
|
41
|
+
* Part of the LTEventAdapter contract. Call before `connect()`.
|
|
42
|
+
*/
|
|
43
|
+
setCallbackBridge(adapter) {
|
|
44
|
+
this.callbackAdapter = adapter;
|
|
45
|
+
}
|
|
29
46
|
async connect() {
|
|
30
47
|
this.nc = await (0, nats_1.connect)({
|
|
31
48
|
servers: this.url,
|
|
32
49
|
token: this.token,
|
|
33
50
|
});
|
|
34
51
|
logger_1.loggerRegistry.info(`[lt-events:nats] connected to ${this.url}`);
|
|
52
|
+
// Subscribe to all events for cross-container bridging
|
|
53
|
+
if (this.callbackAdapter) {
|
|
54
|
+
const adapter = this.callbackAdapter;
|
|
55
|
+
this.sub = this.nc.subscribe(`${this.subjectPrefix}.>`);
|
|
56
|
+
logger_1.loggerRegistry.info(`[lt-events:nats] subscribed to ${this.subjectPrefix}.> for cross-container bridge`);
|
|
57
|
+
(async () => {
|
|
58
|
+
for await (const msg of this.sub) {
|
|
59
|
+
try {
|
|
60
|
+
const event = JSON.parse(sc.decode(msg.data));
|
|
61
|
+
// Skip events that originated from this container
|
|
62
|
+
if (event._originId === this.originId)
|
|
63
|
+
continue;
|
|
64
|
+
logger_1.loggerRegistry.info(`[lt-events:nats] bridge received: ${event.type} from ${event._originId?.slice(0, 8)}`);
|
|
65
|
+
adapter.publish(event);
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
// Malformed message — skip
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
})();
|
|
72
|
+
}
|
|
35
73
|
}
|
|
36
74
|
async publish(event) {
|
|
37
75
|
if (!this.nc)
|
|
38
76
|
return;
|
|
39
77
|
const subject = `${this.subjectPrefix}.${event.type}`;
|
|
40
|
-
this.
|
|
78
|
+
const enriched = { ...event, _originId: this.originId };
|
|
79
|
+
this.nc.publish(subject, sc.encode(JSON.stringify(enriched)));
|
|
80
|
+
logger_1.loggerRegistry.info(`[lt-events:nats] published: ${subject} (origin=${this.originId.slice(0, 8)})`);
|
|
41
81
|
}
|
|
42
82
|
async disconnect() {
|
|
83
|
+
if (this.sub) {
|
|
84
|
+
this.sub.unsubscribe();
|
|
85
|
+
this.sub = null;
|
|
86
|
+
}
|
|
43
87
|
if (this.nc) {
|
|
44
88
|
await this.nc.drain();
|
|
45
89
|
this.nc = null;
|
|
@@ -66,6 +66,16 @@ export declare function publishKnowledgeEvent(params: {
|
|
|
66
66
|
domain: string;
|
|
67
67
|
key: string;
|
|
68
68
|
}): Promise<void>;
|
|
69
|
+
/**
|
|
70
|
+
* Publish a file storage event (stored, deleted).
|
|
71
|
+
* Includes rich metadata: path, name, extension, mime type, size.
|
|
72
|
+
*/
|
|
73
|
+
export declare function publishFileEvent(params: {
|
|
74
|
+
type: 'file.stored' | 'file.deleted';
|
|
75
|
+
path: string;
|
|
76
|
+
size?: number;
|
|
77
|
+
mime?: string;
|
|
78
|
+
}): Promise<void>;
|
|
69
79
|
/**
|
|
70
80
|
* Publish an agent lifecycle event.
|
|
71
81
|
*/
|
|
@@ -5,6 +5,7 @@ exports.publishTaskEvent = publishTaskEvent;
|
|
|
5
5
|
exports.publishEscalationEvent = publishEscalationEvent;
|
|
6
6
|
exports.publishActivityEvent = publishActivityEvent;
|
|
7
7
|
exports.publishKnowledgeEvent = publishKnowledgeEvent;
|
|
8
|
+
exports.publishFileEvent = publishFileEvent;
|
|
8
9
|
exports.publishAgentEvent = publishAgentEvent;
|
|
9
10
|
exports.publishWorkflowEvent = publishWorkflowEvent;
|
|
10
11
|
const index_1 = require("./index");
|
|
@@ -105,6 +106,33 @@ function publishKnowledgeEvent(params) {
|
|
|
105
106
|
timestamp: new Date().toISOString(),
|
|
106
107
|
});
|
|
107
108
|
}
|
|
109
|
+
/**
|
|
110
|
+
* Publish a file storage event (stored, deleted).
|
|
111
|
+
* Includes rich metadata: path, name, extension, mime type, size.
|
|
112
|
+
*/
|
|
113
|
+
function publishFileEvent(params) {
|
|
114
|
+
const parsed = params.path.split('/');
|
|
115
|
+
const filename = parsed[parsed.length - 1] || '';
|
|
116
|
+
const dotIdx = filename.lastIndexOf('.');
|
|
117
|
+
const name = dotIdx > 0 ? filename.slice(0, dotIdx) : filename;
|
|
118
|
+
const extension = dotIdx > 0 ? filename.slice(dotIdx + 1) : '';
|
|
119
|
+
return fireAndForget({
|
|
120
|
+
type: params.type,
|
|
121
|
+
source: 'file-storage',
|
|
122
|
+
workflowId: '',
|
|
123
|
+
workflowName: '',
|
|
124
|
+
taskQueue: '',
|
|
125
|
+
data: {
|
|
126
|
+
path: params.path,
|
|
127
|
+
name,
|
|
128
|
+
extension,
|
|
129
|
+
filename,
|
|
130
|
+
mime: params.mime,
|
|
131
|
+
size: params.size,
|
|
132
|
+
},
|
|
133
|
+
timestamp: new Date().toISOString(),
|
|
134
|
+
});
|
|
135
|
+
}
|
|
108
136
|
/**
|
|
109
137
|
* Publish an agent lifecycle event.
|
|
110
138
|
*/
|
|
@@ -10,10 +10,4 @@ export declare const config: {
|
|
|
10
10
|
JWT_SECRET: string;
|
|
11
11
|
HONEYCOMB_API_KEY: string;
|
|
12
12
|
};
|
|
13
|
-
export declare const postgres_options:
|
|
14
|
-
host: string;
|
|
15
|
-
port: number;
|
|
16
|
-
user: string;
|
|
17
|
-
password: string;
|
|
18
|
-
database: string;
|
|
19
|
-
};
|
|
13
|
+
export declare const postgres_options: Record<string, unknown>;
|
|
@@ -115,6 +115,13 @@ async function updateAgent(id, data) {
|
|
|
115
115
|
if (updated && (data.status || data.behaviors)) {
|
|
116
116
|
Promise.resolve().then(() => __importStar(require('./trigger-registry'))).then(({ agentTriggerRegistry }) => agentTriggerRegistry.restartAgent(id)).catch(() => { });
|
|
117
117
|
Promise.resolve().then(() => __importStar(require('../cron'))).then(({ cronRegistry }) => cronRegistry.restartAgentCrons(updated)).catch(() => { });
|
|
118
|
+
// Signal other containers to re-arm triggers for this agent
|
|
119
|
+
(0, publish_1.publishAgentEvent)({
|
|
120
|
+
type: 'agent.triggers_changed',
|
|
121
|
+
agentId: id,
|
|
122
|
+
agentName: id,
|
|
123
|
+
data: { action: 'updated' },
|
|
124
|
+
});
|
|
118
125
|
}
|
|
119
126
|
return updated;
|
|
120
127
|
}
|
|
@@ -122,6 +129,13 @@ async function deleteAgent(id) {
|
|
|
122
129
|
// Stop event triggers and cron schedules before deleting
|
|
123
130
|
Promise.resolve().then(() => __importStar(require('./trigger-registry'))).then(({ agentTriggerRegistry }) => agentTriggerRegistry.stopAgent(id)).catch(() => { });
|
|
124
131
|
Promise.resolve().then(() => __importStar(require('../cron'))).then(({ cronRegistry }) => cronRegistry.stopAgentCrons(id)).catch(() => { });
|
|
132
|
+
// Signal other containers to stop triggers for this agent
|
|
133
|
+
(0, publish_1.publishAgentEvent)({
|
|
134
|
+
type: 'agent.triggers_changed',
|
|
135
|
+
agentId: id,
|
|
136
|
+
agentName: id,
|
|
137
|
+
data: { action: 'deleted' },
|
|
138
|
+
});
|
|
125
139
|
const pool = (0, db_1.getPool)();
|
|
126
140
|
const { rowCount } = await pool.query(sql_1.DELETE_AGENT, [id]);
|
|
127
141
|
return (rowCount ?? 0) > 0;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export declare const LIST_SUBSCRIPTIONS = "\n SELECT * FROM lt_agent_subscriptions\n WHERE agent_id = $1\n ORDER BY created_at\n";
|
|
2
2
|
export declare const GET_SUBSCRIPTION = "\n SELECT * FROM lt_agent_subscriptions WHERE id = $1\n";
|
|
3
|
-
export declare const INSERT_SUBSCRIPTION = "\n INSERT INTO lt_agent_subscriptions\n (agent_id, topic, filter, reaction_type, workflow_type, pipeline_id, mcp_prompt,\n input_mapping, execute_as, enabled)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)\n RETURNING *\n";
|
|
4
|
-
export declare const UPDATE_SUBSCRIPTION = "\n UPDATE lt_agent_subscriptions SET\n topic = COALESCE($2, topic),\n filter = COALESCE($3, filter),\n reaction_type = COALESCE($4, reaction_type),\n workflow_type = COALESCE($5, workflow_type),\n pipeline_id = COALESCE($6, pipeline_id),\n mcp_prompt = COALESCE($7, mcp_prompt),\n input_mapping = COALESCE($8, input_mapping),\n execute_as = COALESCE($9, execute_as),\n enabled = COALESCE($10, enabled)\n WHERE id = $1\n RETURNING *\n";
|
|
3
|
+
export declare const INSERT_SUBSCRIPTION = "\n INSERT INTO lt_agent_subscriptions\n (agent_id, topic, filter, reaction_type, workflow_type, pipeline_id, mcp_prompt,\n input_mapping, execute_as, enabled, server_id, tool_name)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)\n RETURNING *\n";
|
|
4
|
+
export declare const UPDATE_SUBSCRIPTION = "\n UPDATE lt_agent_subscriptions SET\n topic = COALESCE($2, topic),\n filter = COALESCE($3, filter),\n reaction_type = COALESCE($4, reaction_type),\n workflow_type = COALESCE($5, workflow_type),\n pipeline_id = COALESCE($6, pipeline_id),\n mcp_prompt = COALESCE($7, mcp_prompt),\n input_mapping = COALESCE($8, input_mapping),\n execute_as = COALESCE($9, execute_as),\n enabled = COALESCE($10, enabled),\n server_id = COALESCE($11, server_id),\n tool_name = COALESCE($12, tool_name)\n WHERE id = $1\n RETURNING *\n";
|
|
5
5
|
export declare const DELETE_SUBSCRIPTION = "\n DELETE FROM lt_agent_subscriptions WHERE id = $1\n";
|
|
6
|
-
export declare const SEED_SUBSCRIPTION = "\n INSERT INTO lt_agent_subscriptions\n (agent_id, topic, filter, reaction_type, workflow_type, pipeline_id, mcp_prompt,\n input_mapping, execute_as, enabled)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, true)\n ON CONFLICT (agent_id, topic) DO NOTHING\n";
|
|
6
|
+
export declare const SEED_SUBSCRIPTION = "\n INSERT INTO lt_agent_subscriptions\n (agent_id, topic, filter, reaction_type, workflow_type, pipeline_id, mcp_prompt,\n input_mapping, execute_as, enabled, server_id, tool_name)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, true, $10, $11)\n ON CONFLICT (agent_id, topic) DO NOTHING\n";
|
|
7
7
|
export declare const LIST_ACTIVE_SUBSCRIPTIONS = "\n SELECT s.*, a.id AS agent_name, a.user_id AS agent_user_id\n FROM lt_agent_subscriptions s\n JOIN lt_agents a ON s.agent_id = a.id\n WHERE s.enabled = true AND a.status = 'active'\n ORDER BY s.created_at\n";
|
|
@@ -12,8 +12,8 @@ exports.GET_SUBSCRIPTION = `
|
|
|
12
12
|
exports.INSERT_SUBSCRIPTION = `
|
|
13
13
|
INSERT INTO lt_agent_subscriptions
|
|
14
14
|
(agent_id, topic, filter, reaction_type, workflow_type, pipeline_id, mcp_prompt,
|
|
15
|
-
input_mapping, execute_as, enabled)
|
|
16
|
-
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)
|
|
15
|
+
input_mapping, execute_as, enabled, server_id, tool_name)
|
|
16
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)
|
|
17
17
|
RETURNING *
|
|
18
18
|
`;
|
|
19
19
|
exports.UPDATE_SUBSCRIPTION = `
|
|
@@ -26,7 +26,9 @@ exports.UPDATE_SUBSCRIPTION = `
|
|
|
26
26
|
mcp_prompt = COALESCE($7, mcp_prompt),
|
|
27
27
|
input_mapping = COALESCE($8, input_mapping),
|
|
28
28
|
execute_as = COALESCE($9, execute_as),
|
|
29
|
-
enabled = COALESCE($10, enabled)
|
|
29
|
+
enabled = COALESCE($10, enabled),
|
|
30
|
+
server_id = COALESCE($11, server_id),
|
|
31
|
+
tool_name = COALESCE($12, tool_name)
|
|
30
32
|
WHERE id = $1
|
|
31
33
|
RETURNING *
|
|
32
34
|
`;
|
|
@@ -36,8 +38,8 @@ exports.DELETE_SUBSCRIPTION = `
|
|
|
36
38
|
exports.SEED_SUBSCRIPTION = `
|
|
37
39
|
INSERT INTO lt_agent_subscriptions
|
|
38
40
|
(agent_id, topic, filter, reaction_type, workflow_type, pipeline_id, mcp_prompt,
|
|
39
|
-
input_mapping, execute_as, enabled)
|
|
40
|
-
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, true)
|
|
41
|
+
input_mapping, execute_as, enabled, server_id, tool_name)
|
|
42
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, true, $10, $11)
|
|
41
43
|
ON CONFLICT (agent_id, topic) DO NOTHING
|
|
42
44
|
`;
|
|
43
45
|
exports.LIST_ACTIVE_SUBSCRIPTIONS = `
|
|
@@ -3,10 +3,12 @@ export interface AgentSubscription {
|
|
|
3
3
|
agent_id: string;
|
|
4
4
|
topic: string;
|
|
5
5
|
filter?: Record<string, any>;
|
|
6
|
-
reaction_type: 'durable' | 'pipeline' | 'mcp_query';
|
|
6
|
+
reaction_type: 'durable' | 'pipeline' | 'mcp_query' | 'capability';
|
|
7
7
|
workflow_type?: string;
|
|
8
8
|
pipeline_id?: string;
|
|
9
9
|
mcp_prompt?: string;
|
|
10
|
+
server_id?: string;
|
|
11
|
+
tool_name?: string;
|
|
10
12
|
input_mapping: Record<string, any>;
|
|
11
13
|
execute_as?: string;
|
|
12
14
|
enabled: boolean;
|
|
@@ -32,6 +32,8 @@ async function createSubscription(agentId, data) {
|
|
|
32
32
|
JSON.stringify(data.input_mapping ?? {}),
|
|
33
33
|
data.execute_as ?? null,
|
|
34
34
|
data.enabled !== false,
|
|
35
|
+
data.server_id ?? null,
|
|
36
|
+
data.tool_name ?? null,
|
|
35
37
|
]);
|
|
36
38
|
return rows[0];
|
|
37
39
|
}
|
|
@@ -48,6 +50,8 @@ async function updateSubscription(id, data) {
|
|
|
48
50
|
data.input_mapping ? JSON.stringify(data.input_mapping) : null,
|
|
49
51
|
data.execute_as ?? null,
|
|
50
52
|
data.enabled ?? null,
|
|
53
|
+
data.server_id ?? null,
|
|
54
|
+
data.tool_name ?? null,
|
|
51
55
|
]);
|
|
52
56
|
return rows[0] ?? null;
|
|
53
57
|
}
|
|
@@ -77,6 +81,8 @@ async function seedSubscription(agentId, data) {
|
|
|
77
81
|
data.mcp_prompt ?? null,
|
|
78
82
|
JSON.stringify(data.input_mapping ?? {}),
|
|
79
83
|
data.execute_as ?? null,
|
|
84
|
+
data.server_id ?? null,
|
|
85
|
+
data.tool_name ?? null,
|
|
80
86
|
]);
|
|
81
87
|
return (rowCount ?? 0) > 0;
|
|
82
88
|
}
|
|
@@ -12,6 +12,8 @@ declare class AgentTriggerRegistry {
|
|
|
12
12
|
private connected;
|
|
13
13
|
/**
|
|
14
14
|
* Load all active subscriptions from DB and arm event listeners.
|
|
15
|
+
* Also subscribes to `agent.triggers_changed` so other containers
|
|
16
|
+
* can signal this one to re-arm after subscription CRUD.
|
|
15
17
|
*/
|
|
16
18
|
connect(adapter: CallbackEventAdapter): Promise<void>;
|
|
17
19
|
/**
|
|
@@ -55,13 +55,32 @@ class AgentTriggerRegistry {
|
|
|
55
55
|
}
|
|
56
56
|
/**
|
|
57
57
|
* Load all active subscriptions from DB and arm event listeners.
|
|
58
|
+
* Also subscribes to `agent.triggers_changed` so other containers
|
|
59
|
+
* can signal this one to re-arm after subscription CRUD.
|
|
58
60
|
*/
|
|
59
61
|
async connect(adapter) {
|
|
60
62
|
this.adapter = adapter;
|
|
61
63
|
const subs = await (0, subscriptions_1.listActiveSubscriptions)();
|
|
62
64
|
for (const sub of subs) {
|
|
65
|
+
logger_1.loggerRegistry.info(`[long-tail] arming trigger: ${sub.agent_name}/${sub.topic} → ${sub.reaction_type}:${sub.tool_name || sub.workflow_type || sub.mcp_prompt?.slice(0, 20) || '?'}`);
|
|
63
66
|
this.armSubscription(sub);
|
|
64
67
|
}
|
|
68
|
+
// Listen for cross-container trigger sync signals
|
|
69
|
+
adapter.on('agent.triggers_changed', (event) => {
|
|
70
|
+
const agentId = event.data?.agentId;
|
|
71
|
+
const action = event.data?.action;
|
|
72
|
+
if (!agentId)
|
|
73
|
+
return;
|
|
74
|
+
if (action === 'deleted') {
|
|
75
|
+
this.stopAgent(agentId);
|
|
76
|
+
logger_1.loggerRegistry.info(`[long-tail] agent triggers stopped (remote): ${agentId}`);
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
this.restartAgent(agentId).then(() => {
|
|
80
|
+
logger_1.loggerRegistry.info(`[long-tail] agent triggers synced (remote): ${agentId}`);
|
|
81
|
+
}).catch(() => { });
|
|
82
|
+
}
|
|
83
|
+
});
|
|
65
84
|
this.connected = true;
|
|
66
85
|
logger_1.loggerRegistry.info(`[long-tail] agent trigger registry: ${subs.length} subscription(s) armed`);
|
|
67
86
|
}
|
|
@@ -123,8 +142,10 @@ class AgentTriggerRegistry {
|
|
|
123
142
|
buildHandler(sub) {
|
|
124
143
|
return async (event) => {
|
|
125
144
|
try {
|
|
145
|
+
logger_1.loggerRegistry.info(`[long-tail] trigger matched: ${sub.agent_name}/${sub.topic} for event ${event.type}`);
|
|
126
146
|
// 1. Evaluate optional filter
|
|
127
147
|
if (sub.filter && !this.matchesFilter(event, sub.filter)) {
|
|
148
|
+
logger_1.loggerRegistry.info(`[long-tail] trigger filtered out: ${sub.agent_name}/${sub.topic}`);
|
|
128
149
|
return;
|
|
129
150
|
}
|
|
130
151
|
// 2. Derive deterministic workflow ID for distributed dedup
|
|
@@ -154,14 +175,22 @@ class AgentTriggerRegistry {
|
|
|
154
175
|
}).catch(() => { }); // best-effort
|
|
155
176
|
}
|
|
156
177
|
catch (err) {
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
178
|
+
// Duplicate job errors are expected in multi-container — another
|
|
179
|
+
// container won the race. Log as info and continue.
|
|
180
|
+
const isDuplicate = err.message?.includes('already exists');
|
|
181
|
+
if (isDuplicate) {
|
|
182
|
+
logger_1.loggerRegistry.info(`[long-tail] agent trigger dedup (another container handled): ${sub.agent_name}/${sub.topic}`);
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
(0, publish_1.publishAgentEvent)({
|
|
186
|
+
type: 'agent.failed',
|
|
187
|
+
agentId: sub.agent_id,
|
|
188
|
+
agentName: sub.agent_name,
|
|
189
|
+
status: 'error',
|
|
190
|
+
data: { topic: sub.topic, error: err.message },
|
|
191
|
+
});
|
|
192
|
+
logger_1.loggerRegistry.warn(`[long-tail] agent trigger failed: ${sub.agent_name}/${sub.topic}: ${err.message}`);
|
|
193
|
+
}
|
|
165
194
|
}
|
|
166
195
|
};
|
|
167
196
|
}
|
|
@@ -214,6 +243,7 @@ class AgentTriggerRegistry {
|
|
|
214
243
|
data: mapped.data ?? mapped,
|
|
215
244
|
execute_as: sub.execute_as ?? sub.agent_user_id ?? undefined,
|
|
216
245
|
source: 'agent',
|
|
246
|
+
jobId: deterministicId,
|
|
217
247
|
});
|
|
218
248
|
break;
|
|
219
249
|
}
|
|
@@ -226,6 +256,23 @@ class AgentTriggerRegistry {
|
|
|
226
256
|
});
|
|
227
257
|
break;
|
|
228
258
|
}
|
|
259
|
+
case 'capability': {
|
|
260
|
+
logger_1.loggerRegistry.info(`[long-tail] agent capability: ${sub.agent_name} → ${sub.tool_name} on ${sub.server_id} (id=${deterministicId})`);
|
|
261
|
+
const { invokeWorkflow } = await Promise.resolve().then(() => __importStar(require('../workflow-invocation')));
|
|
262
|
+
await invokeWorkflow({
|
|
263
|
+
workflowType: 'capabilityInvoke',
|
|
264
|
+
data: {
|
|
265
|
+
serverId: sub.server_id,
|
|
266
|
+
toolName: sub.tool_name,
|
|
267
|
+
arguments: mapped,
|
|
268
|
+
},
|
|
269
|
+
metadata: { source: 'agent' },
|
|
270
|
+
executeAs: sub.execute_as ?? sub.agent_user_id ?? undefined,
|
|
271
|
+
options: { workflowId: deterministicId },
|
|
272
|
+
auth: { userId: sub.agent_user_id || 'lt-system', role: 'admin' },
|
|
273
|
+
});
|
|
274
|
+
break;
|
|
275
|
+
}
|
|
229
276
|
}
|
|
230
277
|
}
|
|
231
278
|
}
|
|
@@ -158,6 +158,35 @@ const SYSTEM_TOPICS = [
|
|
|
158
158
|
example_payload: { domain: 'orders', key: 'order-12345' },
|
|
159
159
|
tags: ['lifecycle', 'knowledge'],
|
|
160
160
|
},
|
|
161
|
+
// File storage
|
|
162
|
+
{
|
|
163
|
+
topic: 'file.stored',
|
|
164
|
+
description: 'A file has been written to storage.',
|
|
165
|
+
category: 'file',
|
|
166
|
+
payload_schema: objectSchema({
|
|
167
|
+
path: { type: 'string', description: 'File path in storage' },
|
|
168
|
+
name: { type: 'string', description: 'File name without extension' },
|
|
169
|
+
extension: { type: 'string', description: 'File extension (without dot)' },
|
|
170
|
+
filename: { type: 'string', description: 'Full filename with extension' },
|
|
171
|
+
mime: { type: 'string', description: 'MIME type' },
|
|
172
|
+
size: { type: 'number', description: 'File size in bytes' },
|
|
173
|
+
}),
|
|
174
|
+
example_payload: { path: '/images/photo.jpg', name: 'photo', extension: 'jpg', filename: 'photo.jpg', mime: 'image/jpeg', size: 245760 },
|
|
175
|
+
tags: ['lifecycle', 'file', 'storage'],
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
topic: 'file.deleted',
|
|
179
|
+
description: 'A file has been removed from storage.',
|
|
180
|
+
category: 'file',
|
|
181
|
+
payload_schema: objectSchema({
|
|
182
|
+
path: { type: 'string', description: 'File path in storage' },
|
|
183
|
+
name: { type: 'string', description: 'File name without extension' },
|
|
184
|
+
extension: { type: 'string', description: 'File extension (without dot)' },
|
|
185
|
+
filename: { type: 'string', description: 'Full filename with extension' },
|
|
186
|
+
}),
|
|
187
|
+
example_payload: { path: '/images/photo.jpg', name: 'photo', extension: 'jpg', filename: 'photo.jpg' },
|
|
188
|
+
tags: ['lifecycle', 'file', 'storage'],
|
|
189
|
+
},
|
|
161
190
|
// Agent lifecycle
|
|
162
191
|
{
|
|
163
192
|
topic: 'agent.started',
|
|
@@ -30,7 +30,7 @@ export declare function activateYamlWorkflow(appId: string, version: string): Pr
|
|
|
30
30
|
/**
|
|
31
31
|
* Invoke a YAML workflow (fire-and-forget). Returns the job ID.
|
|
32
32
|
*/
|
|
33
|
-
export declare function invokeYamlWorkflow(appId: string, topic: string, data: Record<string, unknown>, entity?: string): Promise<string>;
|
|
33
|
+
export declare function invokeYamlWorkflow(appId: string, topic: string, data: Record<string, unknown>, entity?: string, context?: Record<string, any>): Promise<string>;
|
|
34
34
|
/**
|
|
35
35
|
* Invoke a YAML workflow and wait for the result.
|
|
36
36
|
*
|
|
@@ -136,9 +136,9 @@ async function activateYamlWorkflow(appId, version) {
|
|
|
136
136
|
/**
|
|
137
137
|
* Invoke a YAML workflow (fire-and-forget). Returns the job ID.
|
|
138
138
|
*/
|
|
139
|
-
async function invokeYamlWorkflow(appId, topic, data, entity) {
|
|
139
|
+
async function invokeYamlWorkflow(appId, topic, data, entity, context) {
|
|
140
140
|
const engine = await getEngine(appId);
|
|
141
|
-
return engine.pub(topic, data,
|
|
141
|
+
return engine.pub(topic, data, context, entity ? { entity } : undefined);
|
|
142
142
|
}
|
|
143
143
|
/**
|
|
144
144
|
* Invoke a YAML workflow and wait for the result.
|
|
@@ -7,6 +7,8 @@ interface InvokeOptions {
|
|
|
7
7
|
userId?: string;
|
|
8
8
|
/** Source identifier for metadata injection (e.g., 'cron') */
|
|
9
9
|
source?: string;
|
|
10
|
+
/** Deterministic job ID for idempotent execution (agent subscriptions) */
|
|
11
|
+
jobId?: string;
|
|
10
12
|
}
|
|
11
13
|
/**
|
|
12
14
|
* Invoke a YAML workflow with scope injection.
|