@hotmeshio/long-tail 0.1.16 → 0.1.18
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/escalations/resolve.js +1 -0
- package/build/api/files.d.ts +4 -0
- package/build/api/files.js +14 -0
- package/build/api/workflows/config.js +5 -0
- package/build/index.d.ts +1 -1
- package/build/index.js +3 -3
- package/build/lib/db/schemas/002_seed.sql +3 -81
- package/build/lib/storage/mime.js +20 -0
- package/build/routes/file-browser.js +30 -0
- package/build/routes/files.js +20 -18
- package/build/services/config/sql.d.ts +3 -0
- package/build/services/config/sql.js +15 -1
- package/build/services/config/write.d.ts +6 -0
- package/build/services/config/write.js +64 -0
- package/build/services/cron/index.d.ts +5 -0
- package/build/services/cron/index.js +30 -0
- package/build/services/insight/index.js +3 -0
- package/build/services/interceptor/activities/task.d.ts +1 -0
- package/build/services/interceptor/activities/task.js +2 -1
- package/build/services/interceptor/activities/workflow.js +1 -0
- package/build/services/interceptor/index.js +4 -4
- package/build/services/interceptor/lifecycle.js +1 -1
- package/build/services/mcp/db.d.ts +17 -0
- package/build/services/mcp/db.js +50 -0
- package/build/services/mcp/sql.d.ts +4 -1
- package/build/services/mcp/sql.js +9 -2
- package/build/services/oauth/index.js +4 -1
- package/build/services/oauth/providers/google.js +7 -2
- package/build/services/orchestrator/index.js +5 -0
- package/build/services/task/crud.js +1 -0
- package/build/services/task/sql.d.ts +1 -1
- package/build/services/task/sql.js +2 -2
- package/build/services/task/types.d.ts +2 -0
- package/build/services/workers/registry.js +3 -1
- package/build/services/workflow-invocation.js +8 -1
- package/build/start/workers.d.ts +2 -1
- package/build/start/workers.js +66 -6
- package/build/system/index.d.ts +12 -10
- package/build/system/index.js +240 -67
- package/build/system/mcp-servers/playwright/schemas.d.ts +12 -12
- package/build/system/seed/index.d.ts +0 -7
- package/build/system/seed/index.js +5 -46
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/index.d.ts +1 -1
- package/build/types/startup.d.ts +59 -2
- package/dashboard/dist/assets/AdminDashboard-CsTOErp1.js +2 -0
- package/dashboard/dist/assets/{AdminDashboard-Bprul9Eb.js.map → AdminDashboard-CsTOErp1.js.map} +1 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-BqQA3IJp.js +2 -0
- package/dashboard/dist/assets/{AvailableEscalationsPage-H_z5mC10.js.map → AvailableEscalationsPage-BqQA3IJp.js.map} +1 -1
- package/dashboard/dist/assets/BotPicker-C2xR1xay.js +2 -0
- package/dashboard/dist/assets/{BotPicker-DcvILNUf.js.map → BotPicker-C2xR1xay.js.map} +1 -1
- package/dashboard/dist/assets/CollapsibleSection-CRtHQsAv.js +2 -0
- package/dashboard/dist/assets/{CollapsibleSection-BWPbzgEe.js.map → CollapsibleSection-CRtHQsAv.js.map} +1 -1
- package/dashboard/dist/assets/ConfirmDeleteModal-dOxidrSR.js +2 -0
- package/dashboard/dist/assets/{ConfirmDeleteModal-Cy6KVLfC.js.map → ConfirmDeleteModal-dOxidrSR.js.map} +1 -1
- package/dashboard/dist/assets/CopyableId-DmLF-RqZ.js +2 -0
- package/dashboard/dist/assets/{CopyableId-CRED8hvk.js.map → CopyableId-DmLF-RqZ.js.map} +1 -1
- package/dashboard/dist/assets/CredentialsPage-C7XT1bnO.js +2 -0
- package/dashboard/dist/assets/CredentialsPage-C7XT1bnO.js.map +1 -0
- package/dashboard/dist/assets/CustomDurationPicker-BABUv1V2.js +2 -0
- package/dashboard/dist/assets/{CustomDurationPicker-eOk2EqQ5.js.map → CustomDurationPicker-BABUv1V2.js.map} +1 -1
- package/dashboard/dist/assets/DataTable-D3-wSEf0.js +2 -0
- package/dashboard/dist/assets/{DataTable-bd2PTBJd.js.map → DataTable-D3-wSEf0.js.map} +1 -1
- package/dashboard/dist/assets/DropZone-DHKmMqRA.js +2 -0
- package/dashboard/dist/assets/DropZone-DHKmMqRA.js.map +1 -0
- package/dashboard/dist/assets/ElapsedCell-DrJif03B.js +2 -0
- package/dashboard/dist/assets/{ElapsedCell-BGo8vyus.js.map → ElapsedCell-DrJif03B.js.map} +1 -1
- package/dashboard/dist/assets/EmptyState-BcsfPq9T.js +2 -0
- package/dashboard/dist/assets/EmptyState-BcsfPq9T.js.map +1 -0
- package/dashboard/dist/assets/EscalationsOverview-H6CwfeR-.js +2 -0
- package/dashboard/dist/assets/EscalationsOverview-H6CwfeR-.js.map +1 -0
- package/dashboard/dist/assets/EventTable-Dh3_9DAY.js +2 -0
- package/dashboard/dist/assets/{EventTable-CmFhswLW.js.map → EventTable-Dh3_9DAY.js.map} +1 -1
- package/dashboard/dist/assets/FilterBar-Ck4K4rzu.js +2 -0
- package/dashboard/dist/assets/{FilterBar-BQNzsd3A.js.map → FilterBar-Ck4K4rzu.js.map} +1 -1
- package/dashboard/dist/assets/ListToolbar-CyEkulVR.js +2 -0
- package/dashboard/dist/assets/{ListToolbar-OWOn-HiC.js.map → ListToolbar-CyEkulVR.js.map} +1 -1
- package/dashboard/dist/assets/McpOverview-ChLa6Gl7.js +2 -0
- package/dashboard/dist/assets/{McpOverview-OkEzvClD.js.map → McpOverview-ChLa6Gl7.js.map} +1 -1
- package/dashboard/dist/assets/McpQueryDetailPage-5Dsj6PlL.js +5 -0
- package/dashboard/dist/assets/McpQueryDetailPage-5Dsj6PlL.js.map +1 -0
- package/dashboard/dist/assets/McpQueryPage-D2DmDFPu.js +2 -0
- package/dashboard/dist/assets/McpQueryPage-D2DmDFPu.js.map +1 -0
- package/dashboard/dist/assets/McpRunDetailPage-ERVuNEEK.js +2 -0
- package/dashboard/dist/assets/{McpRunDetailPage-DMeiG4i_.js.map → McpRunDetailPage-ERVuNEEK.js.map} +1 -1
- package/dashboard/dist/assets/McpRunsPage-BKba-3Wl.js +2 -0
- package/dashboard/dist/assets/McpRunsPage-BKba-3Wl.js.map +1 -0
- package/dashboard/dist/assets/Modal-DEODGeqx.js +2 -0
- package/dashboard/dist/assets/{Modal-Dir9Rlnx.js.map → Modal-DEODGeqx.js.map} +1 -1
- package/dashboard/dist/assets/OperatorDashboard-CJm_BTPU.js +2 -0
- package/dashboard/dist/assets/{OperatorDashboard-OqWC6Azy.js.map → OperatorDashboard-CJm_BTPU.js.map} +1 -1
- package/dashboard/dist/assets/PageHeader-B-SN5GZ2.js +2 -0
- package/dashboard/dist/assets/PageHeader-B-SN5GZ2.js.map +1 -0
- package/dashboard/dist/assets/PageHeaderWithStats-BZ3AGT5s.js +2 -0
- package/dashboard/dist/assets/PageHeaderWithStats-BZ3AGT5s.js.map +1 -0
- package/dashboard/dist/assets/PriorityBadge-DfQY9St9.js +2 -0
- package/dashboard/dist/assets/{PriorityBadge-C7D5d_HY.js.map → PriorityBadge-DfQY9St9.js.map} +1 -1
- package/dashboard/dist/assets/ProcessDetailPage-vfnCDyQK.js +2 -0
- package/dashboard/dist/assets/{ProcessDetailPage-DZIP6grw.js.map → ProcessDetailPage-vfnCDyQK.js.map} +1 -1
- package/dashboard/dist/assets/ProcessesListPage-DcAN6AJK.js +2 -0
- package/dashboard/dist/assets/ProcessesListPage-DcAN6AJK.js.map +1 -0
- package/dashboard/dist/assets/RolePill-BhVC0cc3.js +2 -0
- package/dashboard/dist/assets/{RolePill-D6nMxMvp.js.map → RolePill-BhVC0cc3.js.map} +1 -1
- package/dashboard/dist/assets/RolesPage-DYSt2aAr.js +2 -0
- package/dashboard/dist/assets/RolesPage-DYSt2aAr.js.map +1 -0
- package/dashboard/dist/assets/RowActions-Dg-Fsm5O.js +2 -0
- package/dashboard/dist/assets/{RowActions-JqgAB0p3.js.map → RowActions-Dg-Fsm5O.js.map} +1 -1
- package/dashboard/dist/assets/RunAsSelector-CD7_Dmb0.js +2 -0
- package/dashboard/dist/assets/{RunAsSelector-KAlKtitB.js.map → RunAsSelector-CD7_Dmb0.js.map} +1 -1
- package/dashboard/dist/assets/StatCard-DlgF0CJC.js +2 -0
- package/dashboard/dist/assets/{StatCard-B-WLhOaH.js.map → StatCard-DlgF0CJC.js.map} +1 -1
- package/dashboard/dist/assets/StatusBadge-XQlNFwmH.js +2 -0
- package/dashboard/dist/assets/StatusBadge-XQlNFwmH.js.map +1 -0
- package/dashboard/dist/assets/StepIndicator-CuUIGxKk.js +2 -0
- package/dashboard/dist/assets/{StepIndicator-D9Xvdf18.js.map → StepIndicator-CuUIGxKk.js.map} +1 -1
- package/dashboard/dist/assets/StickyPagination-F9FZsRy9.js +2 -0
- package/dashboard/dist/assets/{StickyPagination-CJHMzYJj.js.map → StickyPagination-F9FZsRy9.js.map} +1 -1
- package/dashboard/dist/assets/SwimlaneTimeline-CUl5RdXU.js +2 -0
- package/dashboard/dist/assets/SwimlaneTimeline-CUl5RdXU.js.map +1 -0
- package/dashboard/dist/assets/TagInput-DftaRHDV.js +2 -0
- package/dashboard/dist/assets/{TagInput-DcPnUnSJ.js.map → TagInput-DftaRHDV.js.map} +1 -1
- package/dashboard/dist/assets/TaskDetailPage-BoA-cfwW.js +2 -0
- package/dashboard/dist/assets/TaskDetailPage-BoA-cfwW.js.map +1 -0
- package/dashboard/dist/assets/TaskQueuePill-Ce8KlXtR.js +2 -0
- package/dashboard/dist/assets/TaskQueuePill-Ce8KlXtR.js.map +1 -0
- package/dashboard/dist/assets/TasksListPage-g6XIbhju.js +2 -0
- package/dashboard/dist/assets/{TasksListPage-DeewV4Gp.js.map → TasksListPage-g6XIbhju.js.map} +1 -1
- package/dashboard/dist/assets/TimeAgo-BihIwEbB.js +2 -0
- package/dashboard/dist/assets/{TimeAgo-DJZq-e4R.js.map → TimeAgo-BihIwEbB.js.map} +1 -1
- package/dashboard/dist/assets/TimestampCell-GOFcvE-i.js +2 -0
- package/dashboard/dist/assets/{TimestampCell-Dx5uwGfS.js.map → TimestampCell-GOFcvE-i.js.map} +1 -1
- package/dashboard/dist/assets/UserName-CmMVt4vS.js +2 -0
- package/dashboard/dist/assets/{UserName-CnGk7MgL.js.map → UserName-CmMVt4vS.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowExecutionPage-soRFz_30.js +2 -0
- package/dashboard/dist/assets/{WorkflowExecutionPage-CPQ0fIwf.js.map → WorkflowExecutionPage-soRFz_30.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowPill-DUDDyBsj.js +2 -0
- package/dashboard/dist/assets/{WorkflowPill-BrD5d1AG.js.map → WorkflowPill-DUDDyBsj.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowsDashboard-Be1A1zAT.js +2 -0
- package/dashboard/dist/assets/WorkflowsDashboard-Be1A1zAT.js.map +1 -0
- package/dashboard/dist/assets/WorkflowsOverview-z3Ztiz1y.js +2 -0
- package/dashboard/dist/assets/{WorkflowsOverview-lBp2E6rN.js.map → WorkflowsOverview-z3Ztiz1y.js.map} +1 -1
- package/dashboard/dist/assets/YamlWorkflowsPage-C6qzcQcJ.js +2 -0
- package/dashboard/dist/assets/YamlWorkflowsPage-C6qzcQcJ.js.map +1 -0
- package/dashboard/dist/assets/{bots-fc_O_YIq.js → bots-BZPXDh_y.js} +2 -2
- package/dashboard/dist/assets/{bots-fc_O_YIq.js.map → bots-BZPXDh_y.js.map} +1 -1
- package/dashboard/dist/assets/escalation-DBUIq1Z4.js +2 -0
- package/dashboard/dist/assets/{escalation-BYhLYHBz.js.map → escalation-DBUIq1Z4.js.map} +1 -1
- package/dashboard/dist/assets/escalation-columns-DL4zsR8Y.js +2 -0
- package/dashboard/dist/assets/{escalation-columns-DjJyuC1g.js.map → escalation-columns-DL4zsR8Y.js.map} +1 -1
- package/dashboard/dist/assets/helpers-D50KFFkI.js +2 -0
- package/dashboard/dist/assets/{helpers-CQG3Rh2y.js.map → helpers-D50KFFkI.js.map} +1 -1
- package/dashboard/dist/assets/index-B-ioA6yv.js +2 -0
- package/dashboard/dist/assets/index-B-ioA6yv.js.map +1 -0
- package/dashboard/dist/assets/index-B-jzKfuv.js +2 -0
- package/dashboard/dist/assets/index-B-jzKfuv.js.map +1 -0
- package/dashboard/dist/assets/index-BMpoMc4A.js +2 -0
- package/dashboard/dist/assets/{index-D51PaQZY.js.map → index-BMpoMc4A.js.map} +1 -1
- package/dashboard/dist/assets/index-BU04qgJt.js +15 -0
- package/dashboard/dist/assets/index-BU04qgJt.js.map +1 -0
- package/dashboard/dist/assets/index-BUjxYyxc.js +63 -0
- package/dashboard/dist/assets/index-BUjxYyxc.js.map +1 -0
- package/dashboard/dist/assets/index-BpoHVMV7.js +2 -0
- package/dashboard/dist/assets/index-BpoHVMV7.js.map +1 -0
- package/dashboard/dist/assets/index-CEnDYJOO.js +2 -0
- package/dashboard/dist/assets/index-CEnDYJOO.js.map +1 -0
- package/dashboard/dist/assets/index-CbuH92vk.js +6 -0
- package/dashboard/dist/assets/index-CbuH92vk.js.map +1 -0
- package/dashboard/dist/assets/index-D9_hZmsW.js +5 -0
- package/dashboard/dist/assets/{index-KYpLvJKB.js.map → index-D9_hZmsW.js.map} +1 -1
- package/dashboard/dist/assets/index-DrouIN-M.js +2 -0
- package/dashboard/dist/assets/{index-DR4qQvlW.js.map → index-DrouIN-M.js.map} +1 -1
- package/dashboard/dist/assets/index-DzICLMI7.js +2 -0
- package/dashboard/dist/assets/{index-DNtXXy1o.js.map → index-DzICLMI7.js.map} +1 -1
- package/dashboard/dist/assets/index-efS5gKpv.css +1 -0
- package/dashboard/dist/assets/index-qT78AZDq.js +2 -0
- package/dashboard/dist/assets/index-qT78AZDq.js.map +1 -0
- package/dashboard/dist/assets/mcp-D0GrHRFe.js +2 -0
- package/dashboard/dist/assets/{mcp-D2XfRh8v.js.map → mcp-D0GrHRFe.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-CIx_mIC7.js → mcp-query-DC5woQn5.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-CIx_mIC7.js.map → mcp-query-DC5woQn5.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-runs-C9_J4LIH.js → mcp-runs-CsoVQoPB.js} +2 -2
- package/dashboard/dist/assets/{mcp-runs-C9_J4LIH.js.map → mcp-runs-CsoVQoPB.js.map} +1 -1
- package/dashboard/dist/assets/namespaces-unpIb4gX.js +2 -0
- package/dashboard/dist/assets/{namespaces-BwMljx6f.js.map → namespaces-unpIb4gX.js.map} +1 -1
- package/dashboard/dist/assets/{roles-Bd_sTV6I.js → roles--kBaFljg.js} +2 -2
- package/dashboard/dist/assets/{roles-Bd_sTV6I.js.map → roles--kBaFljg.js.map} +1 -1
- package/dashboard/dist/assets/settings-B96YkawY.js +2 -0
- package/dashboard/dist/assets/{settings-BCb8eFyA.js.map → settings-B96YkawY.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-Bq54qGGq.js → tasks-D_1NCfOZ.js} +2 -2
- package/dashboard/dist/assets/{tasks-Bq54qGGq.js.map → tasks-D_1NCfOZ.js.map} +1 -1
- package/dashboard/dist/assets/{useEventHooks-BTbGf536.js → useEventHooks-BPjEkCpD.js} +2 -2
- package/dashboard/dist/assets/{useEventHooks-BTbGf536.js.map → useEventHooks-BPjEkCpD.js.map} +1 -1
- package/dashboard/dist/assets/{useExpandedRows-Cg9iq6Vy.js → useExpandedRows-CkcEntB-.js} +2 -2
- package/dashboard/dist/assets/{useExpandedRows-Cg9iq6Vy.js.map → useExpandedRows-CkcEntB-.js.map} +1 -1
- package/dashboard/dist/assets/{useFilterParams-CGRYFw_A.js → useFilterParams-DZCAaBC7.js} +2 -2
- package/dashboard/dist/assets/{useFilterParams-CGRYFw_A.js.map → useFilterParams-DZCAaBC7.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-CsYP09W5.js → useYamlActivityEvents-D3RQjfzo.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-CsYP09W5.js.map → useYamlActivityEvents-D3RQjfzo.js.map} +1 -1
- package/dashboard/dist/assets/{users-BTBhafGc.js → users-e2oatvoj.js} +2 -2
- package/dashboard/dist/assets/{users-BTBhafGc.js.map → users-e2oatvoj.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-CWl44VA6.js → vendor-icons-BkK55L-1.js} +103 -88
- package/dashboard/dist/assets/vendor-icons-BkK55L-1.js.map +1 -0
- package/dashboard/dist/assets/vendor-query-B2UbickB.js +18 -0
- package/dashboard/dist/assets/vendor-query-B2UbickB.js.map +1 -0
- package/dashboard/dist/assets/vendor-react-CX88sFS5.js +22 -0
- package/dashboard/dist/assets/vendor-react-CX88sFS5.js.map +1 -0
- package/dashboard/dist/assets/{workflows-BkzA4ahe.js → workflows-D6diL54s.js} +2 -2
- package/dashboard/dist/assets/{workflows-BkzA4ahe.js.map → workflows-D6diL54s.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-Cs0EYp0F.js → yaml-workflows-CAKU7LUu.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-Cs0EYp0F.js.map → yaml-workflows-CAKU7LUu.js.map} +1 -1
- package/dashboard/dist/index.html +5 -5
- package/docs/dashboard.md +233 -65
- package/package.json +3 -2
- package/build/examples/external-mcp-server/server.d.ts +0 -17
- package/build/examples/external-mcp-server/server.js +0 -116
- package/build/examples/index.d.ts +0 -2
- package/build/examples/index.js +0 -7
- package/build/examples/seed-data.d.ts +0 -55
- package/build/examples/seed-data.js +0 -161
- package/build/examples/seed.d.ts +0 -5
- package/build/examples/seed.js +0 -132
- package/build/examples/types/envelopes.d.ts +0 -69
- package/build/examples/types/envelopes.js +0 -8
- package/build/examples/types/index.d.ts +0 -10
- package/build/examples/types/index.js +0 -9
- package/build/examples/types/resolvers.d.ts +0 -27
- package/build/examples/types/resolvers.js +0 -9
- package/build/examples/workers.d.ts +0 -10
- package/build/examples/workers.js +0 -59
- package/build/examples/workflows/assembly-line/activities.d.ts +0 -28
- package/build/examples/workflows/assembly-line/activities.js +0 -53
- package/build/examples/workflows/assembly-line/index.d.ts +0 -17
- package/build/examples/workflows/assembly-line/index.js +0 -60
- package/build/examples/workflows/assembly-line/iterator.d.ts +0 -12
- package/build/examples/workflows/assembly-line/iterator.js +0 -54
- package/build/examples/workflows/assembly-line/reverter.d.ts +0 -18
- package/build/examples/workflows/assembly-line/reverter.js +0 -89
- package/build/examples/workflows/assembly-line/types.d.ts +0 -25
- package/build/examples/workflows/assembly-line/types.js +0 -8
- package/build/examples/workflows/assembly-line/worker.d.ts +0 -13
- package/build/examples/workflows/assembly-line/worker.js +0 -81
- package/build/examples/workflows/basic-echo/activities.d.ts +0 -20
- package/build/examples/workflows/basic-echo/activities.js +0 -55
- package/build/examples/workflows/basic-echo/index.d.ts +0 -14
- package/build/examples/workflows/basic-echo/index.js +0 -66
- package/build/examples/workflows/basic-signal/activities.d.ts +0 -17
- package/build/examples/workflows/basic-signal/activities.js +0 -18
- package/build/examples/workflows/basic-signal/index.d.ts +0 -17
- package/build/examples/workflows/basic-signal/index.js +0 -116
- package/build/examples/workflows/kitchen-sink/activities.d.ts +0 -40
- package/build/examples/workflows/kitchen-sink/activities.js +0 -46
- package/build/examples/workflows/kitchen-sink/index.d.ts +0 -22
- package/build/examples/workflows/kitchen-sink/index.js +0 -123
- package/build/examples/workflows/review-content/activities.d.ts +0 -10
- package/build/examples/workflows/review-content/activities.js +0 -44
- package/build/examples/workflows/review-content/index.d.ts +0 -10
- package/build/examples/workflows/review-content/index.js +0 -95
- package/build/examples/workflows/review-content/types.d.ts +0 -28
- package/build/examples/workflows/review-content/types.js +0 -2
- package/build/lib/db/schemas/schemas/001_schema.sql +0 -485
- package/build/lib/db/schemas/schemas/002_seed.sql +0 -92
- package/build/system/seed/server-definitions.d.ts +0 -3210
- package/build/system/seed/server-definitions.js +0 -232
- package/dashboard/dist/assets/AdminDashboard-Bprul9Eb.js +0 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-H_z5mC10.js +0 -2
- package/dashboard/dist/assets/BotPicker-DcvILNUf.js +0 -2
- package/dashboard/dist/assets/CollapsibleSection-BWPbzgEe.js +0 -2
- package/dashboard/dist/assets/ConfirmDeleteModal-Cy6KVLfC.js +0 -2
- package/dashboard/dist/assets/CopyableId-CRED8hvk.js +0 -2
- package/dashboard/dist/assets/CredentialsPage-BUdvxiE3.js +0 -2
- package/dashboard/dist/assets/CredentialsPage-BUdvxiE3.js.map +0 -1
- package/dashboard/dist/assets/CustomDurationPicker-eOk2EqQ5.js +0 -2
- package/dashboard/dist/assets/DataTable-bd2PTBJd.js +0 -2
- package/dashboard/dist/assets/ElapsedCell-BGo8vyus.js +0 -2
- package/dashboard/dist/assets/EmptyState-BygtU-Rh.js +0 -2
- package/dashboard/dist/assets/EmptyState-BygtU-Rh.js.map +0 -1
- package/dashboard/dist/assets/EscalationsOverview-DUEcN5MP.js +0 -2
- package/dashboard/dist/assets/EscalationsOverview-DUEcN5MP.js.map +0 -1
- package/dashboard/dist/assets/EventTable-CmFhswLW.js +0 -2
- package/dashboard/dist/assets/FilterBar-BQNzsd3A.js +0 -2
- package/dashboard/dist/assets/ListToolbar-OWOn-HiC.js +0 -2
- package/dashboard/dist/assets/McpOverview-OkEzvClD.js +0 -2
- package/dashboard/dist/assets/McpQueryDetailPage-C6Ih5sC_.js +0 -5
- package/dashboard/dist/assets/McpQueryDetailPage-C6Ih5sC_.js.map +0 -1
- package/dashboard/dist/assets/McpQueryPage-BAuOf5TL.js +0 -2
- package/dashboard/dist/assets/McpQueryPage-BAuOf5TL.js.map +0 -1
- package/dashboard/dist/assets/McpRunDetailPage-DMeiG4i_.js +0 -2
- package/dashboard/dist/assets/McpRunsPage-CG3cNJh8.js +0 -2
- package/dashboard/dist/assets/McpRunsPage-CG3cNJh8.js.map +0 -1
- package/dashboard/dist/assets/Modal-Dir9Rlnx.js +0 -2
- package/dashboard/dist/assets/OperatorDashboard-OqWC6Azy.js +0 -2
- package/dashboard/dist/assets/PageHeader-FJIemmrC.js +0 -2
- package/dashboard/dist/assets/PageHeader-FJIemmrC.js.map +0 -1
- package/dashboard/dist/assets/PageHeaderWithStats-Br5y9qNO.js +0 -2
- package/dashboard/dist/assets/PageHeaderWithStats-Br5y9qNO.js.map +0 -1
- package/dashboard/dist/assets/PriorityBadge-C7D5d_HY.js +0 -2
- package/dashboard/dist/assets/ProcessDetailPage-DZIP6grw.js +0 -2
- package/dashboard/dist/assets/ProcessesListPage-BQoPYkeB.js +0 -2
- package/dashboard/dist/assets/ProcessesListPage-BQoPYkeB.js.map +0 -1
- package/dashboard/dist/assets/RolePill-D6nMxMvp.js +0 -2
- package/dashboard/dist/assets/RolesPage-CwLnJFhy.js +0 -2
- package/dashboard/dist/assets/RolesPage-CwLnJFhy.js.map +0 -1
- package/dashboard/dist/assets/RowActions-JqgAB0p3.js +0 -2
- package/dashboard/dist/assets/RunAsSelector-KAlKtitB.js +0 -2
- package/dashboard/dist/assets/StatCard-B-WLhOaH.js +0 -2
- package/dashboard/dist/assets/StatusBadge-DVCf2ncM.js +0 -2
- package/dashboard/dist/assets/StatusBadge-DVCf2ncM.js.map +0 -1
- package/dashboard/dist/assets/StepIndicator-D9Xvdf18.js +0 -2
- package/dashboard/dist/assets/StickyPagination-CJHMzYJj.js +0 -2
- package/dashboard/dist/assets/SwimlaneTimeline-YiXPDyEL.js +0 -2
- package/dashboard/dist/assets/SwimlaneTimeline-YiXPDyEL.js.map +0 -1
- package/dashboard/dist/assets/TagInput-DcPnUnSJ.js +0 -2
- package/dashboard/dist/assets/TaskDetailPage-DftmYWD7.js +0 -2
- package/dashboard/dist/assets/TaskDetailPage-DftmYWD7.js.map +0 -1
- package/dashboard/dist/assets/TaskQueuePill-BzduBqwy.js +0 -2
- package/dashboard/dist/assets/TaskQueuePill-BzduBqwy.js.map +0 -1
- package/dashboard/dist/assets/TasksListPage-DeewV4Gp.js +0 -2
- package/dashboard/dist/assets/TimeAgo-DJZq-e4R.js +0 -2
- package/dashboard/dist/assets/TimestampCell-Dx5uwGfS.js +0 -2
- package/dashboard/dist/assets/UserName-CnGk7MgL.js +0 -2
- package/dashboard/dist/assets/WorkflowExecutionPage-CPQ0fIwf.js +0 -2
- package/dashboard/dist/assets/WorkflowPill-BrD5d1AG.js +0 -2
- package/dashboard/dist/assets/WorkflowsDashboard-BzjhABZP.js +0 -2
- package/dashboard/dist/assets/WorkflowsDashboard-BzjhABZP.js.map +0 -1
- package/dashboard/dist/assets/WorkflowsOverview-lBp2E6rN.js +0 -2
- package/dashboard/dist/assets/YamlWorkflowsPage-C_MkAp2i.js +0 -2
- package/dashboard/dist/assets/YamlWorkflowsPage-C_MkAp2i.js.map +0 -1
- package/dashboard/dist/assets/escalation-BYhLYHBz.js +0 -2
- package/dashboard/dist/assets/escalation-columns-DjJyuC1g.js +0 -2
- package/dashboard/dist/assets/helpers-CQG3Rh2y.js +0 -2
- package/dashboard/dist/assets/index-2nBhR7Dg.js +0 -2
- package/dashboard/dist/assets/index-2nBhR7Dg.js.map +0 -1
- package/dashboard/dist/assets/index-4IUoh_hd.js +0 -2
- package/dashboard/dist/assets/index-4IUoh_hd.js.map +0 -1
- package/dashboard/dist/assets/index-B2CqPzLK.js +0 -2
- package/dashboard/dist/assets/index-B2CqPzLK.js.map +0 -1
- package/dashboard/dist/assets/index-B78xalb4.js +0 -2
- package/dashboard/dist/assets/index-B78xalb4.js.map +0 -1
- package/dashboard/dist/assets/index-BI8r69O_.js +0 -2
- package/dashboard/dist/assets/index-BI8r69O_.js.map +0 -1
- package/dashboard/dist/assets/index-C5TUqJu0.css +0 -1
- package/dashboard/dist/assets/index-CUqCBBZG.js +0 -6
- package/dashboard/dist/assets/index-CUqCBBZG.js.map +0 -1
- package/dashboard/dist/assets/index-D51PaQZY.js +0 -2
- package/dashboard/dist/assets/index-DNtXXy1o.js +0 -2
- package/dashboard/dist/assets/index-DR4qQvlW.js +0 -2
- package/dashboard/dist/assets/index-Dh0PCbR-.js +0 -15
- package/dashboard/dist/assets/index-Dh0PCbR-.js.map +0 -1
- package/dashboard/dist/assets/index-KYpLvJKB.js +0 -5
- package/dashboard/dist/assets/index-sNrqYt0Q.js +0 -281
- package/dashboard/dist/assets/index-sNrqYt0Q.js.map +0 -1
- package/dashboard/dist/assets/mcp-D2XfRh8v.js +0 -2
- package/dashboard/dist/assets/namespaces-BwMljx6f.js +0 -2
- package/dashboard/dist/assets/settings-BCb8eFyA.js +0 -2
- package/dashboard/dist/assets/vendor-icons-CWl44VA6.js.map +0 -1
- package/dashboard/dist/assets/vendor-query-DLp59M9_.js +0 -35
- package/dashboard/dist/assets/vendor-query-DLp59M9_.js.map +0 -1
- package/dashboard/dist/assets/vendor-react-Co3Y8ikm.js +0 -26
- package/dashboard/dist/assets/vendor-react-Co3Y8ikm.js.map +0 -1
|
@@ -159,6 +159,7 @@ async function resolveViaTriage(escalation, resolverPayload, triageEnvelope) {
|
|
|
159
159
|
workflowId: triageWorkflowId,
|
|
160
160
|
expire: defaults_1.JOB_EXPIRE_SECS,
|
|
161
161
|
entity: 'mcpTriageRouter',
|
|
162
|
+
signalIn: false,
|
|
162
163
|
});
|
|
163
164
|
await escalationService.resolveEscalation(escalation.id, {
|
|
164
165
|
...resolverPayload,
|
package/build/api/files.d.ts
CHANGED
|
@@ -10,6 +10,10 @@ export declare function getFileMetadata(input: {
|
|
|
10
10
|
export declare function deleteFile(input: {
|
|
11
11
|
filePath: string;
|
|
12
12
|
}): Promise<LTApiResult>;
|
|
13
|
+
export declare function uploadFile(input: {
|
|
14
|
+
path: string;
|
|
15
|
+
buffer: Buffer;
|
|
16
|
+
}): Promise<LTApiResult>;
|
|
13
17
|
export declare function generateSignedUrl(input: {
|
|
14
18
|
filePath: string;
|
|
15
19
|
expiresIn: number;
|
package/build/api/files.js
CHANGED
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.browseFiles = browseFiles;
|
|
4
4
|
exports.getFileMetadata = getFileMetadata;
|
|
5
5
|
exports.deleteFile = deleteFile;
|
|
6
|
+
exports.uploadFile = uploadFile;
|
|
6
7
|
exports.generateSignedUrl = generateSignedUrl;
|
|
7
8
|
const storage_1 = require("../lib/storage");
|
|
8
9
|
const mime_1 = require("../lib/storage/mime");
|
|
@@ -43,6 +44,19 @@ async function deleteFile(input) {
|
|
|
43
44
|
return { status: 500, error: err.message };
|
|
44
45
|
}
|
|
45
46
|
}
|
|
47
|
+
async function uploadFile(input) {
|
|
48
|
+
try {
|
|
49
|
+
const result = await (0, storage_1.getStorageBackend)().write(input.path, input.buffer);
|
|
50
|
+
const contentType = (0, mime_1.mimeFromPath)(input.path);
|
|
51
|
+
return {
|
|
52
|
+
status: 200,
|
|
53
|
+
data: { path: input.path, size: result.size, content_type: contentType },
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
return { status: 500, error: err.message };
|
|
58
|
+
}
|
|
59
|
+
}
|
|
46
60
|
async function generateSignedUrl(input) {
|
|
47
61
|
if (!ALLOWED_EXPIRY.includes(input.expiresIn)) {
|
|
48
62
|
return {
|
|
@@ -95,6 +95,11 @@ async function getWorkflowConfig(input) {
|
|
|
95
95
|
*/
|
|
96
96
|
async function upsertWorkflowConfig(input) {
|
|
97
97
|
try {
|
|
98
|
+
// Validate cron expression before persisting
|
|
99
|
+
if (input.cron_schedule) {
|
|
100
|
+
const { validateCronSchedule } = await Promise.resolve().then(() => __importStar(require('../../services/cron')));
|
|
101
|
+
validateCronSchedule(input.cron_schedule);
|
|
102
|
+
}
|
|
98
103
|
const config = await configService.upsertWorkflowConfig({
|
|
99
104
|
workflow_type: input.type,
|
|
100
105
|
invocable: input.invocable ?? false,
|
package/build/index.d.ts
CHANGED
|
@@ -37,8 +37,8 @@ export { getActivityIdentity } from './services/iam/activity';
|
|
|
37
37
|
export { getToolContext } from './services/iam/context';
|
|
38
38
|
export { registerMcpTool } from './services/mcp/register-tool';
|
|
39
39
|
export { getSystemWorkers, builtinMcpServerFactories } from './system';
|
|
40
|
-
export { seedSystemMcpServers } from './system/seed';
|
|
41
40
|
export { CallbackEventAdapter } from './lib/events/callback';
|
|
42
41
|
export { createClient } from './sdk';
|
|
42
|
+
export { getFreshAccessToken } from './services/oauth';
|
|
43
43
|
export type { LTClient, LTClientOptions } from './sdk';
|
|
44
44
|
export * as api from './api';
|
package/build/index.js
CHANGED
|
@@ -36,7 +36,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
36
36
|
};
|
|
37
37
|
})();
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
exports.
|
|
39
|
+
exports.getFreshAccessToken = exports.createClient = exports.CallbackEventAdapter = exports.builtinMcpServerFactories = exports.getSystemWorkers = exports.registerMcpTool = exports.getToolContext = exports.getActivityIdentity = exports.seedExamples = exports.exampleWorkers = exports.McpEscalationStrategy = exports.DefaultEscalationStrategy = exports.escalationStrategyRegistry = exports.McpVisionServer = exports.McpTranslationServer = exports.McpServer = exports.McpClient = exports.McpService = exports.BuiltInMcpAdapter = exports.mcpRegistry = exports.defaultMaintenanceConfig = exports.maintenanceRegistry = exports.PinoLoggerAdapter = exports.loggerRegistry = exports.HoneycombTelemetryAdapter = exports.telemetryRegistry = exports.publishWorkflowEvent = exports.publishEscalationEvent = exports.publishTaskEvent = exports.publishMilestoneEvent = exports.SocketIOEventAdapter = exports.InMemoryEventAdapter = exports.NatsEventAdapter = exports.eventRegistry = exports.ltConfig = exports.UserService = exports.ConfigService = exports.EscalationService = exports.TaskService = exports.signToken = exports.requireAdmin = exports.requireAuth = exports.createAuthMiddleware = exports.JwtAuthAdapter = exports.conditionLT = exports.executeLT = exports.createLTActivityInterceptor = exports.createLTInterceptor = exports.registerLT = exports.start = void 0;
|
|
40
40
|
exports.api = void 0;
|
|
41
41
|
const config_1 = require("./modules/config");
|
|
42
42
|
const logger_1 = require("./lib/logger");
|
|
@@ -118,12 +118,12 @@ Object.defineProperty(exports, "registerMcpTool", { enumerable: true, get: funct
|
|
|
118
118
|
var system_1 = require("./system");
|
|
119
119
|
Object.defineProperty(exports, "getSystemWorkers", { enumerable: true, get: function () { return system_1.getSystemWorkers; } });
|
|
120
120
|
Object.defineProperty(exports, "builtinMcpServerFactories", { enumerable: true, get: function () { return system_1.builtinMcpServerFactories; } });
|
|
121
|
-
var seed_1 = require("./system/seed");
|
|
122
|
-
Object.defineProperty(exports, "seedSystemMcpServers", { enumerable: true, get: function () { return seed_1.seedSystemMcpServers; } });
|
|
123
121
|
var callback_1 = require("./lib/events/callback");
|
|
124
122
|
Object.defineProperty(exports, "CallbackEventAdapter", { enumerable: true, get: function () { return callback_1.CallbackEventAdapter; } });
|
|
125
123
|
var sdk_1 = require("./sdk");
|
|
126
124
|
Object.defineProperty(exports, "createClient", { enumerable: true, get: function () { return sdk_1.createClient; } });
|
|
125
|
+
var oauth_1 = require("./services/oauth");
|
|
126
|
+
Object.defineProperty(exports, "getFreshAccessToken", { enumerable: true, get: function () { return oauth_1.getFreshAccessToken; } });
|
|
127
127
|
exports.api = __importStar(require("./api"));
|
|
128
128
|
// ─── Server ──────────────────────────────────────────────────────────────────
|
|
129
129
|
async function main() {
|
|
@@ -1,18 +1,6 @@
|
|
|
1
|
-
-- System seed data:
|
|
2
|
-
--
|
|
3
|
-
|
|
4
|
-
-- ─── Built-in MCP server ───────────────────────────────────────────────────
|
|
5
|
-
|
|
6
|
-
INSERT INTO lt_mcp_servers (name, description, transport_type, transport_config, auto_connect, status)
|
|
7
|
-
VALUES (
|
|
8
|
-
'long-tail-db-query',
|
|
9
|
-
'Built-in read-only query server for tasks, escalations, processes, and system health',
|
|
10
|
-
'stdio',
|
|
11
|
-
'{"builtin": true}'::jsonb,
|
|
12
|
-
false,
|
|
13
|
-
'connected'
|
|
14
|
-
)
|
|
15
|
-
ON CONFLICT (name) DO NOTHING;
|
|
1
|
+
-- System seed data: escalation chains.
|
|
2
|
+
-- Workflow configs and MCP server definitions are seeded at startup
|
|
3
|
+
-- via inline config on worker and factory declarations.
|
|
16
4
|
|
|
17
5
|
-- ─── Escalation chains ─────────────────────────────────────────────────────
|
|
18
6
|
|
|
@@ -24,69 +12,3 @@ INSERT INTO lt_config_role_escalations (source_role, target_role) VALUES
|
|
|
24
12
|
('admin', 'engineer'),
|
|
25
13
|
('admin', 'superadmin')
|
|
26
14
|
ON CONFLICT DO NOTHING;
|
|
27
|
-
|
|
28
|
-
-- ─── System workflow configs ────────────────────────────────────────────────
|
|
29
|
-
|
|
30
|
-
INSERT INTO lt_config_workflows
|
|
31
|
-
(workflow_type, task_queue, default_role, invocable, description, tool_tags)
|
|
32
|
-
VALUES
|
|
33
|
-
('mcpQuery', 'long-tail-system', 'engineer', false,
|
|
34
|
-
'Dynamic MCP tool orchestration — LLM agentic loop with raw MCP tools',
|
|
35
|
-
'{}'),
|
|
36
|
-
('mcpTriage', 'long-tail-system', 'engineer', false,
|
|
37
|
-
'Dynamic MCP triage — LLM agentic loop for escalation remediation',
|
|
38
|
-
'{}'),
|
|
39
|
-
('mcpWorkflowBuilder', 'long-tail-system', 'engineer', false,
|
|
40
|
-
'Direct pipeline builder — LLM constructs DAG from tool schemas',
|
|
41
|
-
'{}'),
|
|
42
|
-
('mcpWorkflowPlanner', 'long-tail-system', 'engineer', false,
|
|
43
|
-
'Plan mode — decomposes specifications into multi-workflow sets',
|
|
44
|
-
'{}')
|
|
45
|
-
ON CONFLICT (workflow_type) DO NOTHING;
|
|
46
|
-
|
|
47
|
-
-- Query router (orchestrator entry point)
|
|
48
|
-
INSERT INTO lt_config_workflows
|
|
49
|
-
(workflow_type, task_queue, default_role, invocable, description, tool_tags, envelope_schema)
|
|
50
|
-
VALUES
|
|
51
|
-
('mcpQueryRouter', 'long-tail-system', 'engineer', true,
|
|
52
|
-
'Do anything with tools — browser automation, file operations, HTTP requests, database queries, document processing, and more',
|
|
53
|
-
'{}',
|
|
54
|
-
'{"data": {"prompt": "Describe what you want to accomplish using available tools..."}, "metadata": {"source": "dashboard"}}'::jsonb)
|
|
55
|
-
ON CONFLICT (workflow_type) DO NOTHING;
|
|
56
|
-
|
|
57
|
-
-- Deterministic execution (compiled YAML workflows)
|
|
58
|
-
INSERT INTO lt_config_workflows
|
|
59
|
-
(workflow_type, task_queue, default_role, invocable, description, tool_tags)
|
|
60
|
-
VALUES
|
|
61
|
-
('mcpDeterministic', 'long-tail-system', 'engineer', false,
|
|
62
|
-
'Deterministic execution — invokes matched compiled YAML workflows with extracted inputs',
|
|
63
|
-
'{}')
|
|
64
|
-
ON CONFLICT (workflow_type) DO NOTHING;
|
|
65
|
-
|
|
66
|
-
-- Triage router
|
|
67
|
-
INSERT INTO lt_config_workflows
|
|
68
|
-
(workflow_type, task_queue, default_role, invocable, description, tool_tags)
|
|
69
|
-
VALUES
|
|
70
|
-
('mcpTriageRouter', 'long-tail-system', 'engineer', false,
|
|
71
|
-
'Triage router — discovers compiled workflows for remediation, routes to deterministic or dynamic triage',
|
|
72
|
-
'{}')
|
|
73
|
-
ON CONFLICT (workflow_type) DO NOTHING;
|
|
74
|
-
|
|
75
|
-
-- Triage deterministic
|
|
76
|
-
INSERT INTO lt_config_workflows
|
|
77
|
-
(workflow_type, task_queue, default_role, invocable, description, tool_tags)
|
|
78
|
-
VALUES
|
|
79
|
-
('mcpTriageDeterministic', 'long-tail-system', 'engineer', false,
|
|
80
|
-
'Deterministic triage — invokes matched compiled workflows for escalation remediation',
|
|
81
|
-
'{}')
|
|
82
|
-
ON CONFLICT (workflow_type) DO NOTHING;
|
|
83
|
-
|
|
84
|
-
-- ─── Assign roles to all system workflows ──────────────────────────────────
|
|
85
|
-
|
|
86
|
-
INSERT INTO lt_config_roles (workflow_type, role)
|
|
87
|
-
SELECT wt, unnest(ARRAY['reviewer', 'engineer', 'admin'])
|
|
88
|
-
FROM unnest(ARRAY[
|
|
89
|
-
'mcpQuery', 'mcpTriage', 'mcpWorkflowBuilder', 'mcpWorkflowPlanner',
|
|
90
|
-
'mcpQueryRouter', 'mcpDeterministic', 'mcpTriageRouter', 'mcpTriageDeterministic'
|
|
91
|
-
]) AS wt
|
|
92
|
-
ON CONFLICT (workflow_type, role) DO NOTHING;
|
|
@@ -21,6 +21,26 @@ exports.MIME_TYPES = {
|
|
|
21
21
|
'.yaml': 'text/yaml',
|
|
22
22
|
'.yml': 'text/yaml',
|
|
23
23
|
'.md': 'text/markdown',
|
|
24
|
+
'.ts': 'text/typescript',
|
|
25
|
+
'.tsx': 'text/typescript',
|
|
26
|
+
'.jsx': 'application/javascript',
|
|
27
|
+
'.sh': 'text/x-shellscript',
|
|
28
|
+
'.py': 'text/x-python',
|
|
29
|
+
'.rb': 'text/x-ruby',
|
|
30
|
+
'.go': 'text/x-go',
|
|
31
|
+
'.rs': 'text/x-rust',
|
|
32
|
+
'.java': 'text/x-java',
|
|
33
|
+
'.c': 'text/x-c',
|
|
34
|
+
'.cpp': 'text/x-c++',
|
|
35
|
+
'.h': 'text/x-c',
|
|
36
|
+
'.sql': 'text/x-sql',
|
|
37
|
+
'.toml': 'text/toml',
|
|
38
|
+
'.env': 'text/plain',
|
|
39
|
+
'.log': 'text/plain',
|
|
40
|
+
'.ini': 'text/plain',
|
|
41
|
+
'.cfg': 'text/plain',
|
|
42
|
+
'.conf': 'text/plain',
|
|
43
|
+
'.scss': 'text/css',
|
|
24
44
|
'.zip': 'application/zip',
|
|
25
45
|
'.gz': 'application/gzip',
|
|
26
46
|
};
|
|
@@ -123,4 +123,34 @@ router.get('/download/{*filePath}', async (req, res) => {
|
|
|
123
123
|
res.status(404).json({ error: 'File not found' });
|
|
124
124
|
}
|
|
125
125
|
});
|
|
126
|
+
/**
|
|
127
|
+
* POST /api/file-browser/upload
|
|
128
|
+
* Upload a file to storage.
|
|
129
|
+
* Query: ?path=images/photo.png (target path including filename)
|
|
130
|
+
* Body: raw file bytes (Content-Type should match the file type)
|
|
131
|
+
*/
|
|
132
|
+
router.post('/upload', async (req, res) => {
|
|
133
|
+
const targetPath = req.query.path;
|
|
134
|
+
if (!targetPath) {
|
|
135
|
+
res.status(400).json({ error: 'path query parameter required (e.g., ?path=images/photo.png)' });
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
// Collect raw body chunks
|
|
139
|
+
const chunks = [];
|
|
140
|
+
req.on('data', (chunk) => chunks.push(chunk));
|
|
141
|
+
req.on('end', async () => {
|
|
142
|
+
try {
|
|
143
|
+
const buffer = Buffer.concat(chunks);
|
|
144
|
+
if (buffer.length === 0) {
|
|
145
|
+
res.status(400).json({ error: 'Empty file body' });
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
const result = await api.uploadFile({ path: targetPath, buffer });
|
|
149
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
150
|
+
}
|
|
151
|
+
catch (err) {
|
|
152
|
+
res.status(500).json({ error: err.message });
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
});
|
|
126
156
|
exports.default = router;
|
package/build/routes/files.js
CHANGED
|
@@ -11,8 +11,8 @@ const router = (0, express_1.Router)();
|
|
|
11
11
|
/**
|
|
12
12
|
* GET /api/files/*
|
|
13
13
|
* Serve files from managed file storage.
|
|
14
|
-
*
|
|
15
|
-
*
|
|
14
|
+
* Requires a signed token (?token=<jwt>) for authenticated access.
|
|
15
|
+
* Use POST /api/file-browser/signed-url to generate a token.
|
|
16
16
|
*/
|
|
17
17
|
router.get('/{*filePath}', async (req, res) => {
|
|
18
18
|
const raw = req.params.filePath;
|
|
@@ -21,26 +21,28 @@ router.get('/{*filePath}', async (req, res) => {
|
|
|
21
21
|
res.status(400).json({ error: 'File path required' });
|
|
22
22
|
return;
|
|
23
23
|
}
|
|
24
|
-
//
|
|
24
|
+
// Require signed token — no unauthenticated file access
|
|
25
25
|
const token = req.query.token;
|
|
26
|
-
if (token) {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
catch {
|
|
40
|
-
res.status(403).json({ error: 'Invalid or expired token' });
|
|
26
|
+
if (!token) {
|
|
27
|
+
res.status(401).json({ error: 'Signed token required. Use /api/file-browser/signed-url to generate one.' });
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const secret = process.env.JWT_SECRET;
|
|
31
|
+
if (!secret) {
|
|
32
|
+
res.status(500).json({ error: 'Server not configured for signed URLs' });
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
try {
|
|
36
|
+
const decoded = jsonwebtoken_1.default.verify(token, secret);
|
|
37
|
+
if (decoded.purpose !== 'file-download' || decoded.filePath !== filePath.replace(/^\/+/, '')) {
|
|
38
|
+
res.status(403).json({ error: 'Token does not match requested file' });
|
|
41
39
|
return;
|
|
42
40
|
}
|
|
43
41
|
}
|
|
42
|
+
catch {
|
|
43
|
+
res.status(403).json({ error: 'Invalid or expired token' });
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
44
46
|
try {
|
|
45
47
|
const stream = await (0, storage_1.getStorageBackend)().createReadStream(filePath);
|
|
46
48
|
const contentType = (0, mime_1.mimeFromPath)(filePath);
|
|
@@ -11,4 +11,7 @@ export declare const INSERT_CONFIG_ROLE = "INSERT INTO lt_config_roles (workflow
|
|
|
11
11
|
export declare const DELETE_INVOCATION_ROLES = "DELETE FROM lt_config_invocation_roles WHERE workflow_type = $1";
|
|
12
12
|
export declare const INSERT_INVOCATION_ROLE = "INSERT INTO lt_config_invocation_roles (workflow_type, role) VALUES ($1, $2)";
|
|
13
13
|
export declare const DELETE_WORKFLOW = "DELETE FROM lt_config_workflows WHERE workflow_type = $1";
|
|
14
|
+
export declare const SEED_WORKFLOW_CONFIG = "INSERT INTO lt_config_workflows\n (workflow_type, invocable, task_queue, default_role, description, consumes, envelope_schema, resolver_schema, cron_schedule, tool_tags, execute_as)\nVALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)\nON CONFLICT (workflow_type) DO NOTHING";
|
|
15
|
+
export declare const SEED_CONFIG_ROLE = "INSERT INTO lt_config_roles (workflow_type, role) VALUES ($1, $2)\nON CONFLICT (workflow_type, role) DO NOTHING";
|
|
16
|
+
export declare const SEED_INVOCATION_ROLE = "INSERT INTO lt_config_invocation_roles (workflow_type, role) VALUES ($1, $2)\nON CONFLICT (workflow_type, role) DO NOTHING";
|
|
14
17
|
export declare const GET_PROVIDER_DATA = "SELECT workflow_type, data, completed_at\n FROM lt_tasks\n WHERE origin_id = $1\n AND workflow_type = ANY($2)\n AND status = 'completed'\n ORDER BY completed_at DESC";
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// Read queries //
|
|
4
4
|
// ------------------------------------------------------------------ //
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.GET_PROVIDER_DATA = exports.DELETE_WORKFLOW = exports.INSERT_INVOCATION_ROLE = exports.DELETE_INVOCATION_ROLES = exports.INSERT_CONFIG_ROLE = exports.DELETE_CONFIG_ROLES = exports.UPSERT_WORKFLOW = exports.ENSURE_ROLE_EXISTS = exports.LIST_ALL_INVOCATION_ROLES = exports.LIST_ALL_ROLES = exports.LIST_ALL_WORKFLOWS = exports.GET_WORKFLOW_INVOCATION_ROLES = exports.GET_WORKFLOW_ROLES = exports.GET_WORKFLOW = void 0;
|
|
6
|
+
exports.GET_PROVIDER_DATA = exports.SEED_INVOCATION_ROLE = exports.SEED_CONFIG_ROLE = exports.SEED_WORKFLOW_CONFIG = exports.DELETE_WORKFLOW = exports.INSERT_INVOCATION_ROLE = exports.DELETE_INVOCATION_ROLES = exports.INSERT_CONFIG_ROLE = exports.DELETE_CONFIG_ROLES = exports.UPSERT_WORKFLOW = exports.ENSURE_ROLE_EXISTS = exports.LIST_ALL_INVOCATION_ROLES = exports.LIST_ALL_ROLES = exports.LIST_ALL_WORKFLOWS = exports.GET_WORKFLOW_INVOCATION_ROLES = exports.GET_WORKFLOW_ROLES = exports.GET_WORKFLOW = void 0;
|
|
7
7
|
exports.GET_WORKFLOW = `\
|
|
8
8
|
SELECT * FROM lt_config_workflows WHERE workflow_type = $1`;
|
|
9
9
|
exports.GET_WORKFLOW_ROLES = `\
|
|
@@ -47,6 +47,20 @@ INSERT INTO lt_config_invocation_roles (workflow_type, role) VALUES ($1, $2)`;
|
|
|
47
47
|
exports.DELETE_WORKFLOW = `\
|
|
48
48
|
DELETE FROM lt_config_workflows WHERE workflow_type = $1`;
|
|
49
49
|
// ------------------------------------------------------------------ //
|
|
50
|
+
// Seed (insert-if-absent — used at startup, DB is source of truth) //
|
|
51
|
+
// ------------------------------------------------------------------ //
|
|
52
|
+
exports.SEED_WORKFLOW_CONFIG = `\
|
|
53
|
+
INSERT INTO lt_config_workflows
|
|
54
|
+
(workflow_type, invocable, task_queue, default_role, description, consumes, envelope_schema, resolver_schema, cron_schedule, tool_tags, execute_as)
|
|
55
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)
|
|
56
|
+
ON CONFLICT (workflow_type) DO NOTHING`;
|
|
57
|
+
exports.SEED_CONFIG_ROLE = `\
|
|
58
|
+
INSERT INTO lt_config_roles (workflow_type, role) VALUES ($1, $2)
|
|
59
|
+
ON CONFLICT (workflow_type, role) DO NOTHING`;
|
|
60
|
+
exports.SEED_INVOCATION_ROLE = `\
|
|
61
|
+
INSERT INTO lt_config_invocation_roles (workflow_type, role) VALUES ($1, $2)
|
|
62
|
+
ON CONFLICT (workflow_type, role) DO NOTHING`;
|
|
63
|
+
// ------------------------------------------------------------------ //
|
|
50
64
|
// Provider queries //
|
|
51
65
|
// ------------------------------------------------------------------ //
|
|
52
66
|
exports.GET_PROVIDER_DATA = `\
|
|
@@ -3,3 +3,9 @@ export declare function upsertWorkflowConfig(config: LTWorkflowConfig & {
|
|
|
3
3
|
lifecycle?: any;
|
|
4
4
|
}): Promise<LTWorkflowConfig>;
|
|
5
5
|
export declare function deleteWorkflowConfig(workflowType: string): Promise<boolean>;
|
|
6
|
+
/**
|
|
7
|
+
* Seed a workflow config at startup (insert-if-absent).
|
|
8
|
+
* DB is the source of truth — if the row already exists, log drift warnings
|
|
9
|
+
* but do not overwrite. Returns true if inserted, false if already existed.
|
|
10
|
+
*/
|
|
11
|
+
export declare function seedWorkflowConfig(config: LTWorkflowConfig): Promise<boolean>;
|
|
@@ -2,8 +2,10 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.upsertWorkflowConfig = upsertWorkflowConfig;
|
|
4
4
|
exports.deleteWorkflowConfig = deleteWorkflowConfig;
|
|
5
|
+
exports.seedWorkflowConfig = seedWorkflowConfig;
|
|
5
6
|
const db_1 = require("../../lib/db");
|
|
6
7
|
const read_1 = require("./read");
|
|
8
|
+
const logger_1 = require("../../lib/logger");
|
|
7
9
|
const sql_1 = require("./sql");
|
|
8
10
|
async function upsertWorkflowConfig(config) {
|
|
9
11
|
const pool = (0, db_1.getPool)();
|
|
@@ -59,3 +61,65 @@ async function deleteWorkflowConfig(workflowType) {
|
|
|
59
61
|
const { rowCount } = await pool.query(sql_1.DELETE_WORKFLOW, [workflowType]);
|
|
60
62
|
return (rowCount ?? 0) > 0;
|
|
61
63
|
}
|
|
64
|
+
/**
|
|
65
|
+
* Seed a workflow config at startup (insert-if-absent).
|
|
66
|
+
* DB is the source of truth — if the row already exists, log drift warnings
|
|
67
|
+
* but do not overwrite. Returns true if inserted, false if already existed.
|
|
68
|
+
*/
|
|
69
|
+
async function seedWorkflowConfig(config) {
|
|
70
|
+
const pool = (0, db_1.getPool)();
|
|
71
|
+
// Ensure referenced roles exist
|
|
72
|
+
const allRoles = new Set([
|
|
73
|
+
config.default_role,
|
|
74
|
+
...config.roles,
|
|
75
|
+
...config.invocation_roles,
|
|
76
|
+
]);
|
|
77
|
+
for (const role of allRoles) {
|
|
78
|
+
await pool.query(sql_1.ENSURE_ROLE_EXISTS, [role]);
|
|
79
|
+
}
|
|
80
|
+
// Insert-if-absent
|
|
81
|
+
const { rowCount } = await pool.query(sql_1.SEED_WORKFLOW_CONFIG, [
|
|
82
|
+
config.workflow_type,
|
|
83
|
+
config.invocable,
|
|
84
|
+
config.task_queue,
|
|
85
|
+
config.default_role,
|
|
86
|
+
config.description,
|
|
87
|
+
config.consumes,
|
|
88
|
+
config.envelope_schema ?? null,
|
|
89
|
+
config.resolver_schema ?? null,
|
|
90
|
+
config.cron_schedule ?? null,
|
|
91
|
+
config.tool_tags || [],
|
|
92
|
+
config.execute_as ?? null,
|
|
93
|
+
]);
|
|
94
|
+
const inserted = (rowCount ?? 0) > 0;
|
|
95
|
+
if (inserted) {
|
|
96
|
+
// Seed roles (also insert-if-absent)
|
|
97
|
+
for (const role of config.roles) {
|
|
98
|
+
await pool.query(sql_1.SEED_CONFIG_ROLE, [config.workflow_type, role]);
|
|
99
|
+
}
|
|
100
|
+
for (const role of config.invocation_roles) {
|
|
101
|
+
await pool.query(sql_1.SEED_INVOCATION_ROLE, [config.workflow_type, role]);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
// Drift detection — compare key fields
|
|
106
|
+
const existing = await (0, read_1.getWorkflowConfig)(config.workflow_type);
|
|
107
|
+
if (existing) {
|
|
108
|
+
const drifts = [];
|
|
109
|
+
if (config.description && existing.description !== config.description)
|
|
110
|
+
drifts.push('description');
|
|
111
|
+
if (config.invocable !== existing.invocable)
|
|
112
|
+
drifts.push('invocable');
|
|
113
|
+
if (config.default_role !== existing.default_role)
|
|
114
|
+
drifts.push('default_role');
|
|
115
|
+
if (JSON.stringify(config.envelope_schema) !== JSON.stringify(existing.envelope_schema))
|
|
116
|
+
drifts.push('envelope_schema');
|
|
117
|
+
if (JSON.stringify(config.resolver_schema) !== JSON.stringify(existing.resolver_schema))
|
|
118
|
+
drifts.push('resolver_schema');
|
|
119
|
+
if (drifts.length) {
|
|
120
|
+
logger_1.loggerRegistry.warn(`[long-tail] config drift: ${config.workflow_type} — ${drifts.join(', ')} differ between code and DB`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return inserted;
|
|
125
|
+
}
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import type { LTWorkflowConfig } from '../../types';
|
|
2
2
|
import type { LTYamlWorkflowRecord } from '../../types/yaml-workflow';
|
|
3
|
+
/**
|
|
4
|
+
* Validate a cron expression and enforce a minimum interval.
|
|
5
|
+
* Throws if the expression is invalid or fires more often than once per minute.
|
|
6
|
+
*/
|
|
7
|
+
export declare function validateCronSchedule(expr: string): void;
|
|
3
8
|
/**
|
|
4
9
|
* Singleton registry for workflow cron schedules.
|
|
5
10
|
*
|
|
@@ -34,12 +34,34 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.cronRegistry = void 0;
|
|
37
|
+
exports.validateCronSchedule = validateCronSchedule;
|
|
37
38
|
const hotmesh_1 = require("@hotmeshio/hotmesh");
|
|
39
|
+
const cron_parser_1 = require("cron-parser");
|
|
38
40
|
const db_1 = require("../../lib/db");
|
|
39
41
|
const defaults_1 = require("../../modules/defaults");
|
|
40
42
|
const logger_1 = require("../../lib/logger");
|
|
41
43
|
const configService = __importStar(require("../config"));
|
|
42
44
|
const principal_1 = require("../iam/principal");
|
|
45
|
+
const MIN_CRON_INTERVAL_MS = 60_000; // 1 minute minimum
|
|
46
|
+
/**
|
|
47
|
+
* Validate a cron expression and enforce a minimum interval.
|
|
48
|
+
* Throws if the expression is invalid or fires more often than once per minute.
|
|
49
|
+
*/
|
|
50
|
+
function validateCronSchedule(expr) {
|
|
51
|
+
let interval;
|
|
52
|
+
try {
|
|
53
|
+
interval = (0, cron_parser_1.parseExpression)(expr, { utc: true });
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
throw new Error(`Invalid cron expression: "${expr}"`);
|
|
57
|
+
}
|
|
58
|
+
const first = interval.next().toDate().getTime();
|
|
59
|
+
const second = interval.next().toDate().getTime();
|
|
60
|
+
const gap = second - first;
|
|
61
|
+
if (gap < MIN_CRON_INTERVAL_MS) {
|
|
62
|
+
throw new Error(`Cron interval too frequent: "${expr}" fires every ${Math.round(gap / 1000)}s (minimum is 60s)`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
43
65
|
const CRON_TOPIC_PREFIX = 'lt.cron';
|
|
44
66
|
const CRON_ID_PREFIX = 'lt-cron';
|
|
45
67
|
const YAML_CRON_TOPIC_PREFIX = 'lt.cron.yaml';
|
|
@@ -86,6 +108,7 @@ class LTCronRegistry {
|
|
|
86
108
|
async startCron(config) {
|
|
87
109
|
if (!config.cron_schedule || !config.task_queue)
|
|
88
110
|
return;
|
|
111
|
+
validateCronSchedule(config.cron_schedule);
|
|
89
112
|
const connection = (0, db_1.getConnection)();
|
|
90
113
|
const topic = `${CRON_TOPIC_PREFIX}.${config.workflow_type}`;
|
|
91
114
|
const cronId = `${CRON_ID_PREFIX}-${config.workflow_type}`;
|
|
@@ -96,6 +119,11 @@ class LTCronRegistry {
|
|
|
96
119
|
if (!defaultEnvelope.metadata)
|
|
97
120
|
defaultEnvelope.metadata = {};
|
|
98
121
|
defaultEnvelope.metadata.source = 'cron';
|
|
122
|
+
// Auto-certify if the workflow config has roles or consumes
|
|
123
|
+
const isCertified = (config.roles?.length ?? 0) > 0 || (config.consumes?.length ?? 0) > 0;
|
|
124
|
+
if (isCertified) {
|
|
125
|
+
defaultEnvelope.metadata.certified = true;
|
|
126
|
+
}
|
|
99
127
|
// Resolve executing principal: per-config execute_as, or system bot fallback
|
|
100
128
|
if (!defaultEnvelope.lt)
|
|
101
129
|
defaultEnvelope.lt = {};
|
|
@@ -129,6 +157,7 @@ class LTCronRegistry {
|
|
|
129
157
|
workflowId,
|
|
130
158
|
expire: defaults_1.JOB_EXPIRE_SECS,
|
|
131
159
|
entity: workflowType,
|
|
160
|
+
signalIn: false,
|
|
132
161
|
});
|
|
133
162
|
}
|
|
134
163
|
catch (err) {
|
|
@@ -195,6 +224,7 @@ class LTCronRegistry {
|
|
|
195
224
|
async startYamlCron(wf) {
|
|
196
225
|
if (!wf.cron_schedule)
|
|
197
226
|
return;
|
|
227
|
+
validateCronSchedule(wf.cron_schedule);
|
|
198
228
|
const connection = (0, db_1.getConnection)();
|
|
199
229
|
const topic = `${YAML_CRON_TOPIC_PREFIX}.${wf.id}`;
|
|
200
230
|
const cronId = `${YAML_CRON_ID_PREFIX}-${wf.id}`;
|
|
@@ -34,6 +34,7 @@ async function startMcpQuery(input) {
|
|
|
34
34
|
workflowId,
|
|
35
35
|
expire: defaults_1.JOB_EXPIRE_SECS,
|
|
36
36
|
entity,
|
|
37
|
+
signalIn: false,
|
|
37
38
|
});
|
|
38
39
|
if (wait === false) {
|
|
39
40
|
return { workflow_id: workflowId, status: 'started', prompt };
|
|
@@ -63,6 +64,7 @@ async function startWorkflowBuilder(input) {
|
|
|
63
64
|
workflowId,
|
|
64
65
|
expire: defaults_1.JOB_EXPIRE_SECS,
|
|
65
66
|
entity: 'mcpWorkflowBuilder',
|
|
67
|
+
signalIn: false,
|
|
66
68
|
});
|
|
67
69
|
if (wait === false) {
|
|
68
70
|
return { workflow_id: workflowId, status: 'started', prompt };
|
|
@@ -92,6 +94,7 @@ async function startWorkflowPlanner(input) {
|
|
|
92
94
|
workflowId,
|
|
93
95
|
expire: defaults_1.JOB_EXPIRE_SECS,
|
|
94
96
|
entity: 'mcpWorkflowPlanner',
|
|
97
|
+
signalIn: false,
|
|
95
98
|
});
|
|
96
99
|
if (wait === false) {
|
|
97
100
|
return { workflow_id: workflowId, status: 'started', prompt: specification.slice(0, 200) };
|
|
@@ -79,6 +79,7 @@ async function ltCreateTask(input) {
|
|
|
79
79
|
initiated_by: initiatedByUuid,
|
|
80
80
|
principal_type: input.principalType,
|
|
81
81
|
executing_as: input.executingAs,
|
|
82
|
+
status: input.status,
|
|
82
83
|
});
|
|
83
84
|
(0, publish_1.publishTaskEvent)({
|
|
84
85
|
type: 'task.created',
|
|
@@ -88,7 +89,7 @@ async function ltCreateTask(input) {
|
|
|
88
89
|
taskQueue: input.taskQueue || 'unknown',
|
|
89
90
|
taskId: task.id,
|
|
90
91
|
originId: input.originId,
|
|
91
|
-
status: 'pending',
|
|
92
|
+
status: input.status || 'pending',
|
|
92
93
|
});
|
|
93
94
|
return task.id;
|
|
94
95
|
}
|
|
@@ -35,6 +35,7 @@ async function ltStartWorkflow(input) {
|
|
|
35
35
|
taskQueue: input.taskQueue,
|
|
36
36
|
workflowId: input.workflowId,
|
|
37
37
|
expire: input.expire ?? defaults_1.JOB_EXPIRE_SECS,
|
|
38
|
+
signalIn: false,
|
|
38
39
|
});
|
|
39
40
|
logger_1.loggerRegistry.info(`[ltStartWorkflow] started ${input.workflowName} (${input.workflowId})`);
|
|
40
41
|
}
|
|
@@ -99,10 +99,10 @@ function createLTInterceptor(options) {
|
|
|
99
99
|
retry: { maximumAttempts: 3 },
|
|
100
100
|
});
|
|
101
101
|
const envelope = (0, state_1.extractEnvelope)(ctx);
|
|
102
|
-
// 2. Fast path:
|
|
103
|
-
//
|
|
104
|
-
//
|
|
105
|
-
if (envelope?.metadata?.certified
|
|
102
|
+
// 2. Fast path: certification is opt-in. Only workflows with
|
|
103
|
+
// metadata.certified === true pay for the config lookup,
|
|
104
|
+
// task creation, and escalation wiring.
|
|
105
|
+
if (envelope?.metadata?.certified !== true) {
|
|
106
106
|
const toolCtx = (0, envelope_1.buildToolContextFromEnvelope)(envelope, wf.workflowId, wf.workflowTrace, wf.workflowSpan);
|
|
107
107
|
return toolCtx ? (0, context_2.runWithToolContext)(toolCtx, next) : next();
|
|
108
108
|
}
|
|
@@ -120,8 +120,8 @@ async function ensureTaskWithRouting(activities, wf, envelope, existingTask, tas
|
|
|
120
120
|
spanId: wf.workflowSpan,
|
|
121
121
|
initiatedBy: envelope?.lt?.initiatedBy ?? envelope?.lt?.userId,
|
|
122
122
|
executingAs: envelope?.lt?.initiatedBy ? envelope?.lt?.userId : undefined,
|
|
123
|
+
status: 'in_progress',
|
|
123
124
|
});
|
|
124
|
-
await activities.ltStartTask(taskId);
|
|
125
125
|
}
|
|
126
126
|
else if (existingTask?.status === 'pending') {
|
|
127
127
|
await activities.ltStartTask(taskId);
|
|
@@ -24,3 +24,20 @@ export declare function getAutoConnectServers(): Promise<LTMcpServerRecord[]>;
|
|
|
24
24
|
* @param match - 'any' (OR — server has at least one tag) or 'all' (AND — server has all tags)
|
|
25
25
|
*/
|
|
26
26
|
export declare function findServersByTags(tags: string[], match?: 'any' | 'all'): Promise<LTMcpServerRecord[]>;
|
|
27
|
+
/**
|
|
28
|
+
* Seed an MCP server at startup (insert-if-absent).
|
|
29
|
+
* DB is the source of truth — if the row already exists, log drift warnings
|
|
30
|
+
* but do not overwrite. Returns true if inserted, false if already existed.
|
|
31
|
+
*/
|
|
32
|
+
export declare function seedMcpServer(input: {
|
|
33
|
+
name: string;
|
|
34
|
+
description?: string;
|
|
35
|
+
tags?: string[];
|
|
36
|
+
compileHints?: string;
|
|
37
|
+
credentialProviders?: string[];
|
|
38
|
+
toolManifest?: any[];
|
|
39
|
+
}): Promise<boolean>;
|
|
40
|
+
/**
|
|
41
|
+
* Remove builtin MCP servers that are no longer declared in factory config.
|
|
42
|
+
*/
|
|
43
|
+
export declare function cleanStaleBuiltinServers(activeNames: string[]): Promise<void>;
|