@hotmeshio/long-tail 0.1.15 → 0.1.17
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/settings.js +0 -3
- package/build/api/workflows/config.js +5 -0
- package/build/api/yaml-workflows/crud.js +25 -5
- package/build/index.d.ts +1 -2
- package/build/index.js +1 -4
- package/build/lib/db/schemas/002_seed.sql +3 -81
- package/build/lib/events/socketio.d.ts +12 -0
- package/build/lib/events/socketio.js +24 -1
- 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/routes/index.js +2 -0
- package/build/routes/nats-credentials.d.ts +2 -0
- package/build/routes/nats-credentials.js +22 -0
- 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/services/yaml-workflow/workers/register.js +4 -2
- package/build/start/adapters.js +4 -1
- package/build/start/socket-auth.d.ts +13 -0
- package/build/start/socket-auth.js +32 -0
- 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-NLryl1_B.js.map → AdminDashboard-CsTOErp1.js.map} +1 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-BqQA3IJp.js +2 -0
- package/dashboard/dist/assets/{AvailableEscalationsPage-6vexlrk3.js.map → AvailableEscalationsPage-BqQA3IJp.js.map} +1 -1
- package/dashboard/dist/assets/BotPicker-C2xR1xay.js +2 -0
- package/dashboard/dist/assets/{BotPicker-DWhn0tr1.js.map → BotPicker-C2xR1xay.js.map} +1 -1
- package/dashboard/dist/assets/CollapsibleSection-CRtHQsAv.js +2 -0
- package/dashboard/dist/assets/{CollapsibleSection-CgYgQiOc.js.map → CollapsibleSection-CRtHQsAv.js.map} +1 -1
- package/dashboard/dist/assets/ConfirmDeleteModal-dOxidrSR.js +2 -0
- package/dashboard/dist/assets/{ConfirmDeleteModal-DCKAPXD3.js.map → ConfirmDeleteModal-dOxidrSR.js.map} +1 -1
- package/dashboard/dist/assets/CopyableId-DmLF-RqZ.js +2 -0
- package/dashboard/dist/assets/{CopyableId-DXkaAOYk.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-D2G1ldiF.js.map → CustomDurationPicker-BABUv1V2.js.map} +1 -1
- package/dashboard/dist/assets/DataTable-D3-wSEf0.js +2 -0
- package/dashboard/dist/assets/{DataTable-DXSUbA26.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-CQGqkXP_.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-BMJAPkMi.js.map → EventTable-Dh3_9DAY.js.map} +1 -1
- package/dashboard/dist/assets/FilterBar-Ck4K4rzu.js +2 -0
- package/dashboard/dist/assets/{FilterBar-DbVbCzH2.js.map → FilterBar-Ck4K4rzu.js.map} +1 -1
- package/dashboard/dist/assets/ListToolbar-CyEkulVR.js +2 -0
- package/dashboard/dist/assets/{ListToolbar-0XNuXj0M.js.map → ListToolbar-CyEkulVR.js.map} +1 -1
- package/dashboard/dist/assets/McpOverview-ChLa6Gl7.js +2 -0
- package/dashboard/dist/assets/{McpOverview-CeYnCzBN.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-CZtodW_Z.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-yyhUeKoA.js.map → Modal-DEODGeqx.js.map} +1 -1
- package/dashboard/dist/assets/OperatorDashboard-CJm_BTPU.js +2 -0
- package/dashboard/dist/assets/{OperatorDashboard-Ceh7OQtZ.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-BrPikMFy.js.map → PriorityBadge-DfQY9St9.js.map} +1 -1
- package/dashboard/dist/assets/ProcessDetailPage-vfnCDyQK.js +2 -0
- package/dashboard/dist/assets/{ProcessDetailPage-2miaYd8G.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-DxbJMfJu.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-DurFwIwe.js.map → RowActions-Dg-Fsm5O.js.map} +1 -1
- package/dashboard/dist/assets/RunAsSelector-CD7_Dmb0.js +2 -0
- package/dashboard/dist/assets/{RunAsSelector-CNKraP6u.js.map → RunAsSelector-CD7_Dmb0.js.map} +1 -1
- package/dashboard/dist/assets/StatCard-DlgF0CJC.js +2 -0
- package/dashboard/dist/assets/{StatCard-CKplpK3w.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-Dicx0WTZ.js.map → StepIndicator-CuUIGxKk.js.map} +1 -1
- package/dashboard/dist/assets/StickyPagination-F9FZsRy9.js +2 -0
- package/dashboard/dist/assets/{StickyPagination-B2jYvU3-.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-CypDZ6Kl.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-D7CdkAeg.js.map → TasksListPage-g6XIbhju.js.map} +1 -1
- package/dashboard/dist/assets/TimeAgo-BihIwEbB.js +2 -0
- package/dashboard/dist/assets/{TimeAgo-B5LXB2aj.js.map → TimeAgo-BihIwEbB.js.map} +1 -1
- package/dashboard/dist/assets/TimestampCell-GOFcvE-i.js +2 -0
- package/dashboard/dist/assets/{TimestampCell-Crb9b0Gw.js.map → TimestampCell-GOFcvE-i.js.map} +1 -1
- package/dashboard/dist/assets/UserName-CmMVt4vS.js +2 -0
- package/dashboard/dist/assets/{UserName-OPg-nkRa.js.map → UserName-CmMVt4vS.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowExecutionPage-soRFz_30.js +2 -0
- package/dashboard/dist/assets/{WorkflowExecutionPage-CcLVrs9b.js.map → WorkflowExecutionPage-soRFz_30.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowPill-DUDDyBsj.js +2 -0
- package/dashboard/dist/assets/{WorkflowPill-CCV4MMj7.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-DvShiYJV.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-Dqos20NE.js → bots-BZPXDh_y.js} +2 -2
- package/dashboard/dist/assets/{bots-Dqos20NE.js.map → bots-BZPXDh_y.js.map} +1 -1
- package/dashboard/dist/assets/escalation-DBUIq1Z4.js +2 -0
- package/dashboard/dist/assets/{escalation-A0CsbvNV.js.map → escalation-DBUIq1Z4.js.map} +1 -1
- package/dashboard/dist/assets/escalation-columns-DL4zsR8Y.js +2 -0
- package/dashboard/dist/assets/{escalation-columns-BpBJN6k4.js.map → escalation-columns-DL4zsR8Y.js.map} +1 -1
- package/dashboard/dist/assets/helpers-D50KFFkI.js +2 -0
- package/dashboard/dist/assets/{helpers-CmznCuAx.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-Cr0Rqsj7.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-BYwD3kHN.js.map → index-D9_hZmsW.js.map} +1 -1
- package/dashboard/dist/assets/index-DrouIN-M.js +2 -0
- package/dashboard/dist/assets/{index-VnYkWW8r.js.map → index-DrouIN-M.js.map} +1 -1
- package/dashboard/dist/assets/index-DzICLMI7.js +2 -0
- package/dashboard/dist/assets/{index-XGOmZ117.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-DrWymhSu.js.map → mcp-D0GrHRFe.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-BhUxVEMS.js → mcp-query-DC5woQn5.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-BhUxVEMS.js.map → mcp-query-DC5woQn5.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-runs-DUfz4mLd.js → mcp-runs-CsoVQoPB.js} +2 -2
- package/dashboard/dist/assets/{mcp-runs-DUfz4mLd.js.map → mcp-runs-CsoVQoPB.js.map} +1 -1
- package/dashboard/dist/assets/namespaces-unpIb4gX.js +2 -0
- package/dashboard/dist/assets/{namespaces-Cm6AY5sh.js.map → namespaces-unpIb4gX.js.map} +1 -1
- package/dashboard/dist/assets/{roles-2v1Kc7BJ.js → roles--kBaFljg.js} +2 -2
- package/dashboard/dist/assets/{roles-2v1Kc7BJ.js.map → roles--kBaFljg.js.map} +1 -1
- package/dashboard/dist/assets/settings-B96YkawY.js +2 -0
- package/dashboard/dist/assets/{settings-DTQNp6tH.js.map → settings-B96YkawY.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-CS1rgG1s.js → tasks-D_1NCfOZ.js} +2 -2
- package/dashboard/dist/assets/{tasks-CS1rgG1s.js.map → tasks-D_1NCfOZ.js.map} +1 -1
- package/dashboard/dist/assets/{useEventHooks-BjXX8x3a.js → useEventHooks-BPjEkCpD.js} +2 -2
- package/dashboard/dist/assets/{useEventHooks-BjXX8x3a.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-BeR-nVWQ.js → useYamlActivityEvents-D3RQjfzo.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-BeR-nVWQ.js.map → useYamlActivityEvents-D3RQjfzo.js.map} +1 -1
- package/dashboard/dist/assets/{users-DYsdQ7Md.js → users-e2oatvoj.js} +2 -2
- package/dashboard/dist/assets/{users-DYsdQ7Md.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-2QAXh3UD.js → workflows-D6diL54s.js} +2 -2
- package/dashboard/dist/assets/{workflows-2QAXh3UD.js.map → workflows-D6diL54s.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-sx8-UEE3.js → yaml-workflows-CAKU7LUu.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-sx8-UEE3.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/system/seed/server-definitions.d.ts +0 -3210
- package/build/system/seed/server-definitions.js +0 -232
- package/dashboard/dist/assets/AdminDashboard-NLryl1_B.js +0 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-6vexlrk3.js +0 -2
- package/dashboard/dist/assets/BotPicker-DWhn0tr1.js +0 -2
- package/dashboard/dist/assets/CollapsibleSection-CgYgQiOc.js +0 -2
- package/dashboard/dist/assets/ConfirmDeleteModal-DCKAPXD3.js +0 -2
- package/dashboard/dist/assets/CopyableId-DXkaAOYk.js +0 -2
- package/dashboard/dist/assets/CredentialsPage-B361BOfU.js +0 -2
- package/dashboard/dist/assets/CredentialsPage-B361BOfU.js.map +0 -1
- package/dashboard/dist/assets/CustomDurationPicker-D2G1ldiF.js +0 -2
- package/dashboard/dist/assets/DataTable-DXSUbA26.js +0 -2
- package/dashboard/dist/assets/ElapsedCell-CQGqkXP_.js +0 -2
- package/dashboard/dist/assets/EmptyState-Dep92Wkg.js +0 -2
- package/dashboard/dist/assets/EmptyState-Dep92Wkg.js.map +0 -1
- package/dashboard/dist/assets/EscalationsOverview-DVEFVjs7.js +0 -2
- package/dashboard/dist/assets/EscalationsOverview-DVEFVjs7.js.map +0 -1
- package/dashboard/dist/assets/EventTable-BMJAPkMi.js +0 -2
- package/dashboard/dist/assets/FilterBar-DbVbCzH2.js +0 -2
- package/dashboard/dist/assets/ListToolbar-0XNuXj0M.js +0 -2
- package/dashboard/dist/assets/McpOverview-CeYnCzBN.js +0 -2
- package/dashboard/dist/assets/McpQueryDetailPage-t3qW3QNa.js +0 -5
- package/dashboard/dist/assets/McpQueryDetailPage-t3qW3QNa.js.map +0 -1
- package/dashboard/dist/assets/McpQueryPage-CfUcdzaj.js +0 -2
- package/dashboard/dist/assets/McpQueryPage-CfUcdzaj.js.map +0 -1
- package/dashboard/dist/assets/McpRunDetailPage-CZtodW_Z.js +0 -2
- package/dashboard/dist/assets/McpRunsPage-Dzgq7HGt.js +0 -2
- package/dashboard/dist/assets/McpRunsPage-Dzgq7HGt.js.map +0 -1
- package/dashboard/dist/assets/Modal-yyhUeKoA.js +0 -2
- package/dashboard/dist/assets/OperatorDashboard-Ceh7OQtZ.js +0 -2
- package/dashboard/dist/assets/PageHeader-CZ9a8cpr.js +0 -2
- package/dashboard/dist/assets/PageHeader-CZ9a8cpr.js.map +0 -1
- package/dashboard/dist/assets/PageHeaderWithStats-BJuNs5NM.js +0 -2
- package/dashboard/dist/assets/PageHeaderWithStats-BJuNs5NM.js.map +0 -1
- package/dashboard/dist/assets/PriorityBadge-BrPikMFy.js +0 -2
- package/dashboard/dist/assets/ProcessDetailPage-2miaYd8G.js +0 -2
- package/dashboard/dist/assets/ProcessesListPage-DqpRDqjk.js +0 -2
- package/dashboard/dist/assets/ProcessesListPage-DqpRDqjk.js.map +0 -1
- package/dashboard/dist/assets/RolePill-DxbJMfJu.js +0 -2
- package/dashboard/dist/assets/RolesPage-CYHRo21-.js +0 -2
- package/dashboard/dist/assets/RolesPage-CYHRo21-.js.map +0 -1
- package/dashboard/dist/assets/RowActions-DurFwIwe.js +0 -2
- package/dashboard/dist/assets/RunAsSelector-CNKraP6u.js +0 -2
- package/dashboard/dist/assets/StatCard-CKplpK3w.js +0 -2
- package/dashboard/dist/assets/StatusBadge-Dm0V1dNN.js +0 -2
- package/dashboard/dist/assets/StatusBadge-Dm0V1dNN.js.map +0 -1
- package/dashboard/dist/assets/StepIndicator-Dicx0WTZ.js +0 -2
- package/dashboard/dist/assets/StickyPagination-B2jYvU3-.js +0 -2
- package/dashboard/dist/assets/SwimlaneTimeline-ClwumkT1.js +0 -2
- package/dashboard/dist/assets/SwimlaneTimeline-ClwumkT1.js.map +0 -1
- package/dashboard/dist/assets/TagInput-CypDZ6Kl.js +0 -2
- package/dashboard/dist/assets/TaskDetailPage-DooDNJGT.js +0 -2
- package/dashboard/dist/assets/TaskDetailPage-DooDNJGT.js.map +0 -1
- package/dashboard/dist/assets/TaskQueuePill-C1hZ-j31.js +0 -2
- package/dashboard/dist/assets/TaskQueuePill-C1hZ-j31.js.map +0 -1
- package/dashboard/dist/assets/TasksListPage-D7CdkAeg.js +0 -2
- package/dashboard/dist/assets/TimeAgo-B5LXB2aj.js +0 -2
- package/dashboard/dist/assets/TimestampCell-Crb9b0Gw.js +0 -2
- package/dashboard/dist/assets/UserName-OPg-nkRa.js +0 -2
- package/dashboard/dist/assets/WorkflowExecutionPage-CcLVrs9b.js +0 -2
- package/dashboard/dist/assets/WorkflowPill-CCV4MMj7.js +0 -2
- package/dashboard/dist/assets/WorkflowsDashboard-DB1SncBi.js +0 -2
- package/dashboard/dist/assets/WorkflowsDashboard-DB1SncBi.js.map +0 -1
- package/dashboard/dist/assets/WorkflowsOverview-DvShiYJV.js +0 -2
- package/dashboard/dist/assets/YamlWorkflowsPage-DCBoMeGI.js +0 -2
- package/dashboard/dist/assets/YamlWorkflowsPage-DCBoMeGI.js.map +0 -1
- package/dashboard/dist/assets/escalation-A0CsbvNV.js +0 -2
- package/dashboard/dist/assets/escalation-columns-BpBJN6k4.js +0 -2
- package/dashboard/dist/assets/helpers-CmznCuAx.js +0 -2
- package/dashboard/dist/assets/index-BIeYV5QK.js +0 -2
- package/dashboard/dist/assets/index-BIeYV5QK.js.map +0 -1
- package/dashboard/dist/assets/index-BYwD3kHN.js +0 -5
- package/dashboard/dist/assets/index-C5TUqJu0.css +0 -1
- package/dashboard/dist/assets/index-C8-UaN4N.js +0 -2
- package/dashboard/dist/assets/index-C8-UaN4N.js.map +0 -1
- package/dashboard/dist/assets/index-CAj5LT9H.js +0 -15
- package/dashboard/dist/assets/index-CAj5LT9H.js.map +0 -1
- package/dashboard/dist/assets/index-CjxHCVxl.js +0 -2
- package/dashboard/dist/assets/index-CjxHCVxl.js.map +0 -1
- package/dashboard/dist/assets/index-Cr0Rqsj7.js +0 -2
- package/dashboard/dist/assets/index-DZHNte4o.js +0 -2
- package/dashboard/dist/assets/index-DZHNte4o.js.map +0 -1
- package/dashboard/dist/assets/index-VnYkWW8r.js +0 -2
- package/dashboard/dist/assets/index-XGOmZ117.js +0 -2
- package/dashboard/dist/assets/index-ZjOUzWhc.js +0 -2
- package/dashboard/dist/assets/index-ZjOUzWhc.js.map +0 -1
- package/dashboard/dist/assets/index-puKKZ5l8.js +0 -281
- package/dashboard/dist/assets/index-puKKZ5l8.js.map +0 -1
- package/dashboard/dist/assets/index-t5frSddy.js +0 -6
- package/dashboard/dist/assets/index-t5frSddy.js.map +0 -1
- package/dashboard/dist/assets/mcp-DrWymhSu.js +0 -2
- package/dashboard/dist/assets/namespaces-Cm6AY5sh.js +0 -2
- package/dashboard/dist/assets/settings-DTQNp6tH.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
|
@@ -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>;
|
package/build/services/mcp/db.js
CHANGED
|
@@ -9,7 +9,10 @@ exports.updateMcpServerStatus = updateMcpServerStatus;
|
|
|
9
9
|
exports.listMcpServers = listMcpServers;
|
|
10
10
|
exports.getAutoConnectServers = getAutoConnectServers;
|
|
11
11
|
exports.findServersByTags = findServersByTags;
|
|
12
|
+
exports.seedMcpServer = seedMcpServer;
|
|
13
|
+
exports.cleanStaleBuiltinServers = cleanStaleBuiltinServers;
|
|
12
14
|
const db_1 = require("../../lib/db");
|
|
15
|
+
const logger_1 = require("../../lib/logger");
|
|
13
16
|
const sql_1 = require("./sql");
|
|
14
17
|
async function createMcpServer(input) {
|
|
15
18
|
const pool = (0, db_1.getPool)();
|
|
@@ -149,3 +152,50 @@ async function findServersByTags(tags, match = 'any') {
|
|
|
149
152
|
const { rows } = await pool.query(`SELECT * FROM lt_mcp_servers WHERE tags ${operator} $1::text[] ORDER BY name`, [tags]);
|
|
150
153
|
return rows;
|
|
151
154
|
}
|
|
155
|
+
/**
|
|
156
|
+
* Seed an MCP server at startup (insert-if-absent).
|
|
157
|
+
* DB is the source of truth — if the row already exists, log drift warnings
|
|
158
|
+
* but do not overwrite. Returns true if inserted, false if already existed.
|
|
159
|
+
*/
|
|
160
|
+
async function seedMcpServer(input) {
|
|
161
|
+
const pool = (0, db_1.getPool)();
|
|
162
|
+
const { rowCount } = await pool.query(sql_1.SEED_MCP_SERVER, [
|
|
163
|
+
input.name,
|
|
164
|
+
input.description || null,
|
|
165
|
+
'stdio',
|
|
166
|
+
JSON.stringify({ builtin: true, process: 'in-memory' }),
|
|
167
|
+
JSON.stringify(input.toolManifest || []),
|
|
168
|
+
JSON.stringify({ builtin: true }),
|
|
169
|
+
input.tags || [],
|
|
170
|
+
input.compileHints || null,
|
|
171
|
+
input.credentialProviders || [],
|
|
172
|
+
]);
|
|
173
|
+
const inserted = (rowCount ?? 0) > 0;
|
|
174
|
+
if (!inserted) {
|
|
175
|
+
// Drift detection
|
|
176
|
+
const existing = await getMcpServerByName(input.name);
|
|
177
|
+
if (existing) {
|
|
178
|
+
const drifts = [];
|
|
179
|
+
if (input.description && existing.description !== input.description)
|
|
180
|
+
drifts.push('description');
|
|
181
|
+
if (input.compileHints && existing.compile_hints !== input.compileHints)
|
|
182
|
+
drifts.push('compile_hints');
|
|
183
|
+
if (JSON.stringify(input.tags || []) !== JSON.stringify(existing.tags || []))
|
|
184
|
+
drifts.push('tags');
|
|
185
|
+
if (drifts.length) {
|
|
186
|
+
logger_1.loggerRegistry.warn(`[long-tail] MCP server drift: ${input.name} — ${drifts.join(', ')} differ between code and DB`);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return inserted;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Remove builtin MCP servers that are no longer declared in factory config.
|
|
194
|
+
*/
|
|
195
|
+
async function cleanStaleBuiltinServers(activeNames) {
|
|
196
|
+
const pool = (0, db_1.getPool)();
|
|
197
|
+
const { rows } = await pool.query(sql_1.DELETE_STALE_BUILTIN_SERVERS, [activeNames]);
|
|
198
|
+
for (const row of rows) {
|
|
199
|
+
logger_1.loggerRegistry.info(`[long-tail] removed stale builtin MCP server: ${row.name}`);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
@@ -15,4 +15,7 @@ export declare const HEALTH_COMPILED_WORKFLOWS = "\n SELECT\n COUNT(*)::int
|
|
|
15
15
|
export declare const HEALTH_WORKFLOW_CONFIGS = "\n SELECT workflow_type, task_queue, description\n FROM lt_config_workflows ORDER BY workflow_type";
|
|
16
16
|
export declare const HEALTH_DURABLE_WORKFLOWS = "\n SELECT\n COALESCE(entity, '_internal') AS entity,\n COUNT(*)::int AS total,\n COUNT(*) FILTER (WHERE status = 0)::int AS active,\n COUNT(*) FILTER (WHERE status = 1)::int AS completed\n FROM durable.jobs\n WHERE entity IS NOT NULL AND entity != ''\n GROUP BY entity\n ORDER BY entity";
|
|
17
17
|
export declare const DELETE_STALE_BUILTIN_SERVERS = "\n DELETE FROM lt_mcp_servers\n WHERE (metadata->>'builtin')::boolean = true\n AND name != ALL($1)\n RETURNING name";
|
|
18
|
-
|
|
18
|
+
/** Upsert — used by dashboard/API writes (overwrites intentionally). */
|
|
19
|
+
export declare const UPSERT_MCP_SERVER = "\n INSERT INTO lt_mcp_servers\n (name, description, transport_type, transport_config, auto_connect, status, tool_manifest, metadata, tags, compile_hints, credential_providers, last_connected_at)\n VALUES ($1, $2, $3, $4, true, 'connected', $5, $6, $7, $8, $9, NOW())\n ON CONFLICT (name) DO UPDATE SET\n tool_manifest = EXCLUDED.tool_manifest,\n metadata = EXCLUDED.metadata,\n description = EXCLUDED.description,\n tags = EXCLUDED.tags,\n compile_hints = EXCLUDED.compile_hints,\n credential_providers = EXCLUDED.credential_providers,\n status = 'connected',\n last_connected_at = NOW()";
|
|
20
|
+
/** Seed — insert-if-absent. DB is source of truth after first boot. */
|
|
21
|
+
export declare const SEED_MCP_SERVER = "\n INSERT INTO lt_mcp_servers\n (name, description, transport_type, transport_config, auto_connect, status, tool_manifest, metadata, tags, compile_hints, credential_providers, last_connected_at)\n VALUES ($1, $2, $3, $4, true, 'connected', $5, $6, $7, $8, $9, NOW())\n ON CONFLICT (name) DO NOTHING";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
// ─── MCP server CRUD ────────────────────────────────────────────────────────
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.SEED_MCP_SERVER = exports.DELETE_STALE_BUILTIN_SERVERS = exports.HEALTH_DURABLE_WORKFLOWS = exports.HEALTH_WORKFLOW_CONFIGS = exports.HEALTH_COMPILED_WORKFLOWS = exports.HEALTH_MCP_SERVER_LIST = exports.HEALTH_MCP_SERVERS = exports.HEALTH_RECENT_ACTIVITY = exports.HEALTH_ACTIVE_WORKFLOW_TYPES = exports.HEALTH_ESCALATION_COUNTS = exports.HEALTH_TASK_COUNTS = exports.GET_AUTO_CONNECT_SERVERS = exports.UPDATE_STATUS = exports.UPDATE_STATUS_CONNECTED = exports.DELETE_MCP_SERVER = exports.GET_MCP_SERVER_BY_NAME = exports.GET_MCP_SERVER = exports.CREATE_MCP_SERVER = void 0;
|
|
4
|
+
exports.SEED_MCP_SERVER = exports.UPSERT_MCP_SERVER = exports.DELETE_STALE_BUILTIN_SERVERS = exports.HEALTH_DURABLE_WORKFLOWS = exports.HEALTH_WORKFLOW_CONFIGS = exports.HEALTH_COMPILED_WORKFLOWS = exports.HEALTH_MCP_SERVER_LIST = exports.HEALTH_MCP_SERVERS = exports.HEALTH_RECENT_ACTIVITY = exports.HEALTH_ACTIVE_WORKFLOW_TYPES = exports.HEALTH_ESCALATION_COUNTS = exports.HEALTH_TASK_COUNTS = exports.GET_AUTO_CONNECT_SERVERS = exports.UPDATE_STATUS = exports.UPDATE_STATUS_CONNECTED = exports.DELETE_MCP_SERVER = exports.GET_MCP_SERVER_BY_NAME = exports.GET_MCP_SERVER = exports.CREATE_MCP_SERVER = void 0;
|
|
5
5
|
exports.CREATE_MCP_SERVER = `
|
|
6
6
|
INSERT INTO lt_mcp_servers
|
|
7
7
|
(name, description, transport_type, transport_config, auto_connect, metadata, tags, compile_hints, credential_providers)
|
|
@@ -77,7 +77,8 @@ exports.DELETE_STALE_BUILTIN_SERVERS = `
|
|
|
77
77
|
WHERE (metadata->>'builtin')::boolean = true
|
|
78
78
|
AND name != ALL($1)
|
|
79
79
|
RETURNING name`;
|
|
80
|
-
|
|
80
|
+
/** Upsert — used by dashboard/API writes (overwrites intentionally). */
|
|
81
|
+
exports.UPSERT_MCP_SERVER = `
|
|
81
82
|
INSERT INTO lt_mcp_servers
|
|
82
83
|
(name, description, transport_type, transport_config, auto_connect, status, tool_manifest, metadata, tags, compile_hints, credential_providers, last_connected_at)
|
|
83
84
|
VALUES ($1, $2, $3, $4, true, 'connected', $5, $6, $7, $8, $9, NOW())
|
|
@@ -90,3 +91,9 @@ exports.SEED_MCP_SERVER = `
|
|
|
90
91
|
credential_providers = EXCLUDED.credential_providers,
|
|
91
92
|
status = 'connected',
|
|
92
93
|
last_connected_at = NOW()`;
|
|
94
|
+
/** Seed — insert-if-absent. DB is source of truth after first boot. */
|
|
95
|
+
exports.SEED_MCP_SERVER = `
|
|
96
|
+
INSERT INTO lt_mcp_servers
|
|
97
|
+
(name, description, transport_type, transport_config, auto_connect, status, tool_manifest, metadata, tags, compile_hints, credential_providers, last_connected_at)
|
|
98
|
+
VALUES ($1, $2, $3, $4, true, 'connected', $5, $6, $7, $8, $9, NOW())
|
|
99
|
+
ON CONFLICT (name) DO NOTHING`;
|
|
@@ -57,11 +57,14 @@ function initializeOAuth(config) {
|
|
|
57
57
|
}
|
|
58
58
|
}
|
|
59
59
|
// Auto-detect providers from environment variables
|
|
60
|
+
const port = process.env.PORT || '3000';
|
|
61
|
+
const baseUrl = process.env.BASE_URL || `http://localhost:${port}`;
|
|
60
62
|
for (const { provider, idVar, secretVar } of ENV_PROVIDERS) {
|
|
61
63
|
const clientId = process.env[idVar];
|
|
62
64
|
const clientSecret = process.env[secretVar];
|
|
63
65
|
if (clientId && clientSecret && !(0, providers_1.getProvider)(provider)) {
|
|
64
|
-
|
|
66
|
+
const redirectUri = `${baseUrl}/api/auth/oauth/${provider}/callback`;
|
|
67
|
+
(0, providers_1.registerProvider)({ provider, clientId, clientSecret, scopes: [], redirectUri });
|
|
65
68
|
}
|
|
66
69
|
}
|
|
67
70
|
// Register built-in credential providers (API key paste flow, no real OAuth)
|
|
@@ -48,8 +48,13 @@ function createGoogleHandler(cfg) {
|
|
|
48
48
|
config: cfg,
|
|
49
49
|
async createAuthorizationURL(state, codeVerifier) {
|
|
50
50
|
const google = await getClient();
|
|
51
|
-
const scopes = cfg.scopes.length > 0
|
|
52
|
-
|
|
51
|
+
const scopes = cfg.scopes.length > 0
|
|
52
|
+
? cfg.scopes
|
|
53
|
+
: ['openid', 'email', 'profile', 'https://www.googleapis.com/auth/gmail.readonly'];
|
|
54
|
+
const url = google.createAuthorizationURL(state, codeVerifier, scopes);
|
|
55
|
+
url.searchParams.set('access_type', 'offline');
|
|
56
|
+
url.searchParams.set('prompt', 'consent');
|
|
57
|
+
return url;
|
|
53
58
|
},
|
|
54
59
|
async validateAuthorizationCode(code, codeVerifier) {
|
|
55
60
|
const google = await getClient();
|
|
@@ -131,6 +131,10 @@ async function executeLT(options) {
|
|
|
131
131
|
if (envelope) {
|
|
132
132
|
const userId = envelope.lt?.userId || orchCtx?.userId;
|
|
133
133
|
envelope.lt = { ...envelope.lt, taskId, originId, parentId, userId };
|
|
134
|
+
// Propagate certified flag from parent to child
|
|
135
|
+
if (envelope0?.metadata?.certified === true && envelope.metadata) {
|
|
136
|
+
envelope.metadata.certified = true;
|
|
137
|
+
}
|
|
134
138
|
}
|
|
135
139
|
// 5. Start child workflow (fire-and-forget — only the start is awaited)
|
|
136
140
|
await hotmesh_1.Durable.workflow.startChild({
|
|
@@ -140,6 +144,7 @@ async function executeLT(options) {
|
|
|
140
144
|
workflowId: childWorkflowId,
|
|
141
145
|
expire: expire || defaults_1.JOB_EXPIRE_SECS,
|
|
142
146
|
entity: workflowName,
|
|
147
|
+
signalIn: false,
|
|
143
148
|
});
|
|
144
149
|
// 6. Wait for the child's interceptor to signal back with the result
|
|
145
150
|
const result = await hotmesh_1.Durable.workflow.condition(signalId);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare const CREATE_TASK = "\n INSERT INTO lt_tasks\n (workflow_id, workflow_type, lt_type, task_queue, signal_id,\n parent_workflow_id, origin_id, parent_id, envelope, metadata, priority,\n trace_id, span_id, initiated_by, principal_type, executing_as)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16)\n RETURNING *";
|
|
1
|
+
export declare const CREATE_TASK = "\n INSERT INTO lt_tasks\n (workflow_id, workflow_type, lt_type, task_queue, signal_id,\n parent_workflow_id, origin_id, parent_id, envelope, metadata, priority,\n trace_id, span_id, initiated_by, principal_type, executing_as, status)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, COALESCE($17, 'pending'))\n RETURNING *";
|
|
2
2
|
export declare const APPEND_MILESTONES = "\n UPDATE lt_tasks\n SET milestones = milestones || $1::jsonb\n WHERE id = $2\n RETURNING *";
|
|
3
3
|
export declare const GET_TASK = "SELECT * FROM lt_tasks WHERE id = $1";
|
|
4
4
|
export declare const GET_TASK_BY_SIGNAL_ID = "SELECT * FROM lt_tasks WHERE signal_id = $1";
|
|
@@ -11,8 +11,8 @@ exports.CREATE_TASK = `
|
|
|
11
11
|
INSERT INTO lt_tasks
|
|
12
12
|
(workflow_id, workflow_type, lt_type, task_queue, signal_id,
|
|
13
13
|
parent_workflow_id, origin_id, parent_id, envelope, metadata, priority,
|
|
14
|
-
trace_id, span_id, initiated_by, principal_type, executing_as)
|
|
15
|
-
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16)
|
|
14
|
+
trace_id, span_id, initiated_by, principal_type, executing_as, status)
|
|
15
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, COALESCE($17, 'pending'))
|
|
16
16
|
RETURNING *`;
|
|
17
17
|
exports.APPEND_MILESTONES = `
|
|
18
18
|
UPDATE lt_tasks
|
|
@@ -23,6 +23,8 @@ export interface CreateTaskInput {
|
|
|
23
23
|
principal_type?: string;
|
|
24
24
|
/** Executing principal (bot external_id) when proxy invocation is used. */
|
|
25
25
|
executing_as?: string;
|
|
26
|
+
/** Initial status. Default: 'pending'. */
|
|
27
|
+
status?: string;
|
|
26
28
|
}
|
|
27
29
|
export interface UpdateTaskInput {
|
|
28
30
|
status?: LTTaskStatus;
|
|
@@ -17,10 +17,12 @@ function getRegisteredWorkers() {
|
|
|
17
17
|
/** System workflows excluded from the overview by default. */
|
|
18
18
|
exports.SYSTEM_WORKFLOWS = new Set([
|
|
19
19
|
'mcpQuery',
|
|
20
|
-
'mcpDeterministic',
|
|
21
20
|
'mcpQueryRouter',
|
|
21
|
+
'mcpDeterministic',
|
|
22
22
|
'mcpTriage',
|
|
23
23
|
'mcpTriageRouter',
|
|
24
24
|
'mcpTriageDeterministic',
|
|
25
|
+
'mcpWorkflowBuilder',
|
|
26
|
+
'mcpWorkflowPlanner',
|
|
25
27
|
'insightQuery',
|
|
26
28
|
]);
|
|
@@ -91,7 +91,13 @@ async function invokeWorkflow(input) {
|
|
|
91
91
|
}
|
|
92
92
|
// 4. Resolve principals and build envelope
|
|
93
93
|
const wfConfig = await configService.getWorkflowConfig(workflowType);
|
|
94
|
-
const
|
|
94
|
+
const isCertified = !!(wfConfig &&
|
|
95
|
+
((wfConfig.roles?.length ?? 0) > 0 || (wfConfig.consumes?.length ?? 0) > 0));
|
|
96
|
+
const resolvedMetadata = { ...(metadata ?? {}) };
|
|
97
|
+
if (isCertified && resolvedMetadata.certified !== false) {
|
|
98
|
+
resolvedMetadata.certified = true;
|
|
99
|
+
}
|
|
100
|
+
const envelope = await buildEnvelope(data, resolvedMetadata, auth.userId, executeAsOverride, wfConfig?.execute_as ?? undefined);
|
|
95
101
|
// 5. Start workflow — caller options pass through to Durable client
|
|
96
102
|
const client = (0, workers_1.createClient)();
|
|
97
103
|
const callerOpts = input.options ?? {};
|
|
@@ -104,6 +110,7 @@ async function invokeWorkflow(input) {
|
|
|
104
110
|
workflowId,
|
|
105
111
|
expire: callerOpts.expire ?? defaults_1.JOB_EXPIRE_SECS,
|
|
106
112
|
entity: callerOpts.entity ?? workflowType,
|
|
113
|
+
signalIn: false,
|
|
107
114
|
});
|
|
108
115
|
return { workflowId };
|
|
109
116
|
}
|
|
@@ -138,7 +138,8 @@ async function registerWorkersForWorkflow(workflow) {
|
|
|
138
138
|
else if (toolSource === 'db') {
|
|
139
139
|
if (!activity.mcp_tool_name)
|
|
140
140
|
continue;
|
|
141
|
-
const
|
|
141
|
+
const rawToolName = activity.mcp_tool_name;
|
|
142
|
+
const toolName = rawToolName.includes('__') ? rawToolName.slice(rawToolName.indexOf('__') + 2) : rawToolName;
|
|
142
143
|
const dbServerId = activity.mcp_server_id || 'long-tail-db';
|
|
143
144
|
const toolArgs = activity.tool_arguments;
|
|
144
145
|
workerConfigs.push({
|
|
@@ -163,7 +164,8 @@ async function registerWorkersForWorkflow(workflow) {
|
|
|
163
164
|
else {
|
|
164
165
|
if (!activity.mcp_tool_name)
|
|
165
166
|
continue;
|
|
166
|
-
const
|
|
167
|
+
const rawToolName = activity.mcp_tool_name;
|
|
168
|
+
const toolName = rawToolName.includes('__') ? rawToolName.slice(rawToolName.indexOf('__') + 2) : rawToolName;
|
|
167
169
|
const serverId = activity.mcp_server_id;
|
|
168
170
|
if (!serverId)
|
|
169
171
|
continue;
|
package/build/start/adapters.js
CHANGED
|
@@ -16,6 +16,7 @@ const adapter_1 = require("../services/mcp/adapter");
|
|
|
16
16
|
const escalation_strategy_1 = require("../services/escalation-strategy");
|
|
17
17
|
const default_1 = require("../services/escalation-strategy/default");
|
|
18
18
|
const mcp_2 = require("../services/escalation-strategy/mcp");
|
|
19
|
+
const socket_auth_1 = require("./socket-auth");
|
|
19
20
|
/**
|
|
20
21
|
* Register all adapters (logging, telemetry, events, maintenance,
|
|
21
22
|
* escalation strategy, MCP) based on the startup config.
|
|
@@ -46,7 +47,9 @@ function registerAdapters(startConfig) {
|
|
|
46
47
|
if (startConfig.events?.nats) {
|
|
47
48
|
events_1.eventRegistry.register(new nats_1.NatsEventAdapter(startConfig.events.nats));
|
|
48
49
|
}
|
|
49
|
-
events_1.eventRegistry.register(new socketio_1.SocketIOEventAdapter(
|
|
50
|
+
events_1.eventRegistry.register(new socketio_1.SocketIOEventAdapter({
|
|
51
|
+
authenticate: (0, socket_auth_1.createSocketIOAuthenticator)(startConfig),
|
|
52
|
+
}));
|
|
50
53
|
}
|
|
51
54
|
// Always register the callback adapter for SDK event subscriptions.
|
|
52
55
|
// Zero-cost when no listeners are registered.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { SocketIOAuthenticator } from '../lib/events/socketio';
|
|
2
|
+
import type { LTStartConfig } from '../types/startup';
|
|
3
|
+
/**
|
|
4
|
+
* Build a Socket.IO handshake authenticator from the startup config.
|
|
5
|
+
*
|
|
6
|
+
* Uses the same JWT secret as `requireAuth` — either the explicit
|
|
7
|
+
* secret from startConfig.auth.secret or the JWT_SECRET env var.
|
|
8
|
+
*
|
|
9
|
+
* Returns `undefined` when no secret is configured (e.g. tests or
|
|
10
|
+
* deployments that intentionally skip auth), which leaves Socket.IO
|
|
11
|
+
* open as before.
|
|
12
|
+
*/
|
|
13
|
+
export declare function createSocketIOAuthenticator(startConfig: LTStartConfig): SocketIOAuthenticator | undefined;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.createSocketIOAuthenticator = createSocketIOAuthenticator;
|
|
7
|
+
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
|
|
8
|
+
const config_1 = require("../modules/config");
|
|
9
|
+
/**
|
|
10
|
+
* Build a Socket.IO handshake authenticator from the startup config.
|
|
11
|
+
*
|
|
12
|
+
* Uses the same JWT secret as `requireAuth` — either the explicit
|
|
13
|
+
* secret from startConfig.auth.secret or the JWT_SECRET env var.
|
|
14
|
+
*
|
|
15
|
+
* Returns `undefined` when no secret is configured (e.g. tests or
|
|
16
|
+
* deployments that intentionally skip auth), which leaves Socket.IO
|
|
17
|
+
* open as before.
|
|
18
|
+
*/
|
|
19
|
+
function createSocketIOAuthenticator(startConfig) {
|
|
20
|
+
const secret = startConfig.auth?.secret ?? config_1.config.JWT_SECRET;
|
|
21
|
+
if (!secret)
|
|
22
|
+
return undefined;
|
|
23
|
+
return (token) => {
|
|
24
|
+
try {
|
|
25
|
+
const payload = jsonwebtoken_1.default.verify(token, secret);
|
|
26
|
+
return !!(payload && typeof payload === 'object' && payload.userId);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
}
|
package/build/start/workers.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { LTStartConfig } from '../types/startup';
|
|
1
|
+
import type { LTStartConfig, LTWorkerConfig } from '../types/startup';
|
|
2
2
|
type WorkerEntry = {
|
|
3
3
|
taskQueue: string;
|
|
4
4
|
workflow: (...args: any[]) => any;
|
|
@@ -6,6 +6,7 @@ type WorkerEntry = {
|
|
|
6
6
|
readonly?: boolean;
|
|
7
7
|
retry?: Record<string, unknown>;
|
|
8
8
|
};
|
|
9
|
+
config?: LTWorkerConfig;
|
|
9
10
|
};
|
|
10
11
|
/**
|
|
11
12
|
* Build the connection descriptor used by HotMesh / Durable.
|