@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
|
@@ -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 {
|
package/build/api/settings.js
CHANGED
|
@@ -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,
|
|
@@ -49,6 +49,23 @@ const builder_regenerate_1 = require("../../services/yaml-workflow/builder-regen
|
|
|
49
49
|
const task_1 = require("../../services/task");
|
|
50
50
|
const utils_1 = require("../../modules/utils");
|
|
51
51
|
const helpers_1 = require("./helpers");
|
|
52
|
+
/**
|
|
53
|
+
* Strip the qualified `{slug}__` prefix from mcp_tool_name entries.
|
|
54
|
+
* The builder LLM sometimes echoes the qualified name (e.g.
|
|
55
|
+
* "long_tail_playwright_cli__capture_page") instead of the short
|
|
56
|
+
* tool name ("capture_page"). MCP servers register tools by short
|
|
57
|
+
* name, so the qualified form fails at runtime.
|
|
58
|
+
*/
|
|
59
|
+
function normalizeManifestToolNames(manifest) {
|
|
60
|
+
if (!manifest)
|
|
61
|
+
return manifest;
|
|
62
|
+
for (const entry of manifest) {
|
|
63
|
+
if (entry.mcp_tool_name?.includes('__')) {
|
|
64
|
+
entry.mcp_tool_name = entry.mcp_tool_name.slice(entry.mcp_tool_name.indexOf('__') + 2);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return manifest;
|
|
68
|
+
}
|
|
52
69
|
/**
|
|
53
70
|
* List YAML workflows with optional filtering and pagination.
|
|
54
71
|
*
|
|
@@ -157,7 +174,7 @@ async function createYamlWorkflow(input) {
|
|
|
157
174
|
graph_topic: result.graphTopic,
|
|
158
175
|
input_schema: result.inputSchema,
|
|
159
176
|
output_schema: result.outputSchema,
|
|
160
|
-
activity_manifest: result.activityManifest,
|
|
177
|
+
activity_manifest: normalizeManifestToolNames(result.activityManifest),
|
|
161
178
|
tags: mergedTags,
|
|
162
179
|
source_workflow_id: workflow_id,
|
|
163
180
|
source_workflow_type: workflow_name,
|
|
@@ -242,7 +259,7 @@ async function createYamlWorkflowDirect(input) {
|
|
|
242
259
|
graph_topic: graphTopic,
|
|
243
260
|
input_schema: input_schema || {},
|
|
244
261
|
output_schema: {},
|
|
245
|
-
activity_manifest: activity_manifest || [],
|
|
262
|
+
activity_manifest: normalizeManifestToolNames(activity_manifest) || [],
|
|
246
263
|
tags: tags || [],
|
|
247
264
|
original_prompt: description,
|
|
248
265
|
category: 'builder',
|
|
@@ -300,6 +317,9 @@ async function getYamlWorkflow(input) {
|
|
|
300
317
|
async function updateYamlWorkflow(input) {
|
|
301
318
|
try {
|
|
302
319
|
const { id, ...fields } = input;
|
|
320
|
+
if (fields.activity_manifest) {
|
|
321
|
+
normalizeManifestToolNames(fields.activity_manifest);
|
|
322
|
+
}
|
|
303
323
|
const wf = await yamlDb.updateYamlWorkflow(id, fields);
|
|
304
324
|
if (!wf) {
|
|
305
325
|
return { status: 404, error: 'YAML workflow not found' };
|
|
@@ -352,7 +372,7 @@ async function regenerateYamlWorkflow(input) {
|
|
|
352
372
|
yaml_content: result.yaml,
|
|
353
373
|
input_schema: result.inputSchema,
|
|
354
374
|
output_schema: result.outputSchema,
|
|
355
|
-
activity_manifest: result.activityManifest,
|
|
375
|
+
activity_manifest: normalizeManifestToolNames(result.activityManifest),
|
|
356
376
|
tags: result.tags,
|
|
357
377
|
});
|
|
358
378
|
return { status: 200, data: updated };
|
|
@@ -383,7 +403,7 @@ async function regenerateYamlWorkflow(input) {
|
|
|
383
403
|
yaml_content: result.yaml,
|
|
384
404
|
input_schema: result.inputSchema,
|
|
385
405
|
output_schema: result.outputSchema,
|
|
386
|
-
activity_manifest: result.activityManifest,
|
|
406
|
+
activity_manifest: normalizeManifestToolNames(result.activityManifest),
|
|
387
407
|
tags: result.tags,
|
|
388
408
|
metadata: { input_field_meta: result.inputFieldMeta },
|
|
389
409
|
});
|
|
@@ -464,7 +484,7 @@ async function createYamlWorkflowFromDurable(input) {
|
|
|
464
484
|
graph_topic: result.graphTopic,
|
|
465
485
|
input_schema: result.inputSchema,
|
|
466
486
|
output_schema: result.outputSchema,
|
|
467
|
-
activity_manifest: result.activityManifest,
|
|
487
|
+
activity_manifest: normalizeManifestToolNames(result.activityManifest),
|
|
468
488
|
tags: mergedTags,
|
|
469
489
|
source_workflow_type: 'durable',
|
|
470
490
|
original_prompt: description,
|
package/build/index.d.ts
CHANGED
|
@@ -14,7 +14,7 @@ export { ltConfig } from './modules/ltconfig';
|
|
|
14
14
|
export { eventRegistry } from './lib/events';
|
|
15
15
|
export { NatsEventAdapter } from './lib/events/nats';
|
|
16
16
|
export { InMemoryEventAdapter } from './lib/events/memory';
|
|
17
|
-
export { SocketIOEventAdapter } from './lib/events/socketio';
|
|
17
|
+
export { SocketIOEventAdapter, type SocketIOAuthenticator } from './lib/events/socketio';
|
|
18
18
|
export { publishMilestoneEvent, publishTaskEvent, publishEscalationEvent, publishWorkflowEvent } from './lib/events/publish';
|
|
19
19
|
export { telemetryRegistry } from './lib/telemetry';
|
|
20
20
|
export { HoneycombTelemetryAdapter } from './lib/telemetry/honeycomb';
|
|
@@ -37,7 +37,6 @@ 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';
|
|
43
42
|
export type { LTClient, LTClientOptions } from './sdk';
|
package/build/index.js
CHANGED
|
@@ -36,8 +36,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
36
36
|
};
|
|
37
37
|
})();
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
exports.
|
|
40
|
-
exports.api = void 0;
|
|
39
|
+
exports.api = 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;
|
|
41
40
|
const config_1 = require("./modules/config");
|
|
42
41
|
const logger_1 = require("./lib/logger");
|
|
43
42
|
const start_1 = require("./start");
|
|
@@ -118,8 +117,6 @@ Object.defineProperty(exports, "registerMcpTool", { enumerable: true, get: funct
|
|
|
118
117
|
var system_1 = require("./system");
|
|
119
118
|
Object.defineProperty(exports, "getSystemWorkers", { enumerable: true, get: function () { return system_1.getSystemWorkers; } });
|
|
120
119
|
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
120
|
var callback_1 = require("./lib/events/callback");
|
|
124
121
|
Object.defineProperty(exports, "CallbackEventAdapter", { enumerable: true, get: function () { return callback_1.CallbackEventAdapter; } });
|
|
125
122
|
var sdk_1 = require("./sdk");
|
|
@@ -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;
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import type { Server as HttpServer } from 'http';
|
|
2
2
|
import type { LTEvent, LTEventAdapter } from '../../types';
|
|
3
|
+
/**
|
|
4
|
+
* Callback to verify a Socket.IO handshake token.
|
|
5
|
+
* Return `true` to allow the connection, `false` to reject.
|
|
6
|
+
*/
|
|
7
|
+
export type SocketIOAuthenticator = (token: string) => boolean | Promise<boolean>;
|
|
3
8
|
/**
|
|
4
9
|
* Socket.IO event adapter for browser clients.
|
|
5
10
|
*
|
|
@@ -10,6 +15,9 @@ import type { LTEvent, LTEventAdapter } from '../../types';
|
|
|
10
15
|
* `connect()` is called. The startup flow handles this automatically
|
|
11
16
|
* when Socket.IO is the active event transport.
|
|
12
17
|
*
|
|
18
|
+
* When an `authenticate` callback is provided, Socket.IO middleware
|
|
19
|
+
* rejects handshakes that do not include a valid `auth.token`.
|
|
20
|
+
*
|
|
13
21
|
* Usage:
|
|
14
22
|
* ```typescript
|
|
15
23
|
* import { eventRegistry } from '@hotmeshio/long-tail';
|
|
@@ -25,6 +33,10 @@ import type { LTEvent, LTEventAdapter } from '../../types';
|
|
|
25
33
|
export declare class SocketIOEventAdapter implements LTEventAdapter {
|
|
26
34
|
private io;
|
|
27
35
|
private httpServer;
|
|
36
|
+
private authenticate;
|
|
37
|
+
constructor(options?: {
|
|
38
|
+
authenticate?: SocketIOAuthenticator;
|
|
39
|
+
});
|
|
28
40
|
/** Attach to an HTTP server. Must be called before connect(). */
|
|
29
41
|
attachServer(server: HttpServer): void;
|
|
30
42
|
connect(): Promise<void>;
|
|
@@ -13,6 +13,9 @@ const logger_1 = require("../logger");
|
|
|
13
13
|
* `connect()` is called. The startup flow handles this automatically
|
|
14
14
|
* when Socket.IO is the active event transport.
|
|
15
15
|
*
|
|
16
|
+
* When an `authenticate` callback is provided, Socket.IO middleware
|
|
17
|
+
* rejects handshakes that do not include a valid `auth.token`.
|
|
18
|
+
*
|
|
16
19
|
* Usage:
|
|
17
20
|
* ```typescript
|
|
18
21
|
* import { eventRegistry } from '@hotmeshio/long-tail';
|
|
@@ -26,9 +29,10 @@ const logger_1 = require("../logger");
|
|
|
26
29
|
* ```
|
|
27
30
|
*/
|
|
28
31
|
class SocketIOEventAdapter {
|
|
29
|
-
constructor() {
|
|
32
|
+
constructor(options) {
|
|
30
33
|
this.io = null;
|
|
31
34
|
this.httpServer = null;
|
|
35
|
+
this.authenticate = options?.authenticate ?? null;
|
|
32
36
|
}
|
|
33
37
|
/** Attach to an HTTP server. Must be called before connect(). */
|
|
34
38
|
attachServer(server) {
|
|
@@ -45,6 +49,25 @@ class SocketIOEventAdapter {
|
|
|
45
49
|
transports: ['polling', 'websocket'],
|
|
46
50
|
allowEIO3: true,
|
|
47
51
|
});
|
|
52
|
+
if (this.authenticate) {
|
|
53
|
+
const verify = this.authenticate;
|
|
54
|
+
this.io.use(async (socket, next) => {
|
|
55
|
+
const token = socket.handshake.auth?.token;
|
|
56
|
+
if (!token) {
|
|
57
|
+
return next(new Error('Authentication required'));
|
|
58
|
+
}
|
|
59
|
+
try {
|
|
60
|
+
const valid = await verify(token);
|
|
61
|
+
if (!valid) {
|
|
62
|
+
return next(new Error('Authentication failed'));
|
|
63
|
+
}
|
|
64
|
+
next();
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
next(new Error('Authentication failed'));
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
}
|
|
48
71
|
this.io.on('connection', (socket) => {
|
|
49
72
|
logger_1.loggerRegistry.info(`[lt-events:socketio] client connected (${socket.id})`);
|
|
50
73
|
socket.on('disconnect', () => {
|
|
@@ -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);
|
package/build/routes/index.js
CHANGED
|
@@ -29,6 +29,7 @@ const bot_accounts_1 = __importDefault(require("./bot-accounts"));
|
|
|
29
29
|
const docs_1 = __importDefault(require("./docs"));
|
|
30
30
|
const workflow_sets_1 = __importDefault(require("./workflow-sets"));
|
|
31
31
|
const knowledge_1 = __importDefault(require("./knowledge"));
|
|
32
|
+
const nats_credentials_1 = __importDefault(require("./nats-credentials"));
|
|
32
33
|
const router = (0, express_1.Router)();
|
|
33
34
|
// Public routes (no auth required — they handle their own auth)
|
|
34
35
|
router.use('/auth', auth_2.default);
|
|
@@ -38,6 +39,7 @@ router.use('/files', files_1.default);
|
|
|
38
39
|
router.use('/settings', settings_1.default);
|
|
39
40
|
// Apply auth to all API routes
|
|
40
41
|
router.use(auth_1.requireAuth);
|
|
42
|
+
router.use('/nats-credentials', nats_credentials_1.default);
|
|
41
43
|
router.use('/tasks', tasks_1.default);
|
|
42
44
|
router.use('/escalations', escalations_1.default);
|
|
43
45
|
router.use('/workflows', workflows_1.default);
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const express_1 = require("express");
|
|
4
|
+
const events_1 = require("../lib/events");
|
|
5
|
+
const nats_1 = require("../lib/events/nats");
|
|
6
|
+
const router = (0, express_1.Router)();
|
|
7
|
+
/**
|
|
8
|
+
* GET /api/nats-credentials
|
|
9
|
+
* Returns NATS WebSocket URL and auth token.
|
|
10
|
+
* Mounted behind requireAuth — only authenticated users receive the token.
|
|
11
|
+
*/
|
|
12
|
+
router.get('/', async (_req, res) => {
|
|
13
|
+
const hasNats = !!events_1.eventRegistry.getAdapter(nats_1.NatsEventAdapter);
|
|
14
|
+
if (!hasNats) {
|
|
15
|
+
return res.json({ natsWsUrl: null, natsToken: null });
|
|
16
|
+
}
|
|
17
|
+
res.json({
|
|
18
|
+
natsWsUrl: process.env.VITE_NATS_WS_URL || process.env.NATS_WS_URL || null,
|
|
19
|
+
natsToken: process.env.NATS_TOKEN || null,
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
exports.default = router;
|
|
@@ -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>;
|