@hotmeshio/long-tail 0.1.12 → 0.1.14
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/README.md +1 -1
- package/build/api/files.d.ts +13 -0
- package/build/api/files.js +44 -0
- package/build/api/mcp-runs.d.ts +2 -0
- package/build/api/mcp-runs.js +2 -0
- package/build/api/workflow-sets.d.ts +11 -0
- package/build/api/workflow-sets.js +62 -0
- package/build/api/yaml-workflows.d.ts +9 -0
- package/build/api/yaml-workflows.js +40 -11
- package/build/examples/seed.js +50 -0
- package/build/lib/db/schemas/001_schema.sql +281 -106
- package/build/lib/db/schemas/002_seed.sql +56 -39
- package/build/lib/storage/local.d.ts +15 -0
- package/build/lib/storage/local.js +63 -0
- package/build/lib/storage/mime.d.ts +4 -0
- package/build/lib/storage/mime.js +31 -0
- package/build/lib/storage/s3.d.ts +16 -0
- package/build/lib/storage/s3.js +70 -0
- package/build/lib/storage/types.d.ts +18 -0
- package/build/modules/utils.d.ts +73 -0
- package/build/modules/utils.js +84 -0
- package/build/routes/file-browser.d.ts +2 -0
- package/build/routes/file-browser.js +112 -0
- package/build/routes/files.js +25 -17
- package/build/routes/index.js +2 -0
- package/build/routes/mcp-runs.js +2 -0
- package/build/routes/workflow-sets.js +9 -0
- package/build/routes/yaml-workflows/deployment.js +8 -0
- package/build/services/insight/index.d.ts +13 -0
- package/build/services/insight/index.js +4 -7
- package/build/services/insight/prompts.d.ts +1 -1
- package/build/services/insight/prompts.js +1 -1
- package/build/services/mcp/server.js +31 -0
- package/build/services/mcp-runs/queries.d.ts +2 -0
- package/build/services/mcp-runs/queries.js +11 -1
- package/build/services/mcp-runs/sql.d.ts +1 -1
- package/build/services/mcp-runs/sql.js +2 -2
- package/build/services/workflow-sets/db.d.ts +1 -0
- package/build/services/workflow-sets/db.js +6 -0
- package/build/services/workflow-sets/index.d.ts +1 -1
- package/build/services/workflow-sets/index.js +2 -1
- package/build/services/workflow-sets/sql.d.ts +1 -0
- package/build/services/workflow-sets/sql.js +6 -1
- package/build/services/yaml-workflow/db.d.ts +12 -0
- package/build/services/yaml-workflow/db.js +18 -0
- package/build/services/yaml-workflow/generator.js +4 -4
- package/build/services/yaml-workflow/pipeline/build/index.d.ts +2 -1
- package/build/services/yaml-workflow/pipeline/build/index.js +3 -2
- package/build/services/yaml-workflow/pipeline/build/utils.d.ts +0 -2
- package/build/services/yaml-workflow/pipeline/build/utils.js +0 -8
- package/build/services/yaml-workflow/sql.d.ts +2 -1
- package/build/services/yaml-workflow/sql.js +10 -3
- package/build/system/activities/schema-exchange.d.ts +50 -0
- package/build/system/activities/schema-exchange.js +210 -0
- package/build/system/activities/sql.d.ts +1 -1
- package/build/system/activities/sql.js +12 -1
- package/build/system/index.js +1 -0
- package/build/system/mcp-servers/human-queue.js +31 -0
- package/build/system/mcp-servers/knowledge.js +35 -6
- package/build/system/mcp-servers/schema-exchange.d.ts +4 -0
- package/build/system/mcp-servers/schema-exchange.js +93 -0
- package/build/system/seed/server-definitions.d.ts +112 -1
- package/build/system/seed/server-definitions.js +37 -0
- package/build/system/seed/tool-manifests-data.d.ts +87 -0
- package/build/system/seed/tool-manifests-data.js +37 -1
- package/build/system/seed/tool-manifests-knowledge.d.ts +9 -1
- package/build/system/seed/tool-manifests-knowledge.js +6 -5
- package/build/system/workflows/mcp-workflow-builder/prompts.d.ts +1 -1
- package/build/system/workflows/mcp-workflow-builder/prompts.js +21 -20
- package/build/system/workflows/mcp-workflow-planner/activities/persist.d.ts +1 -1
- package/build/system/workflows/mcp-workflow-planner/activities/persist.js +3 -3
- package/build/system/workflows/mcp-workflow-planner/index.js +39 -5
- package/build/system/workflows/mcp-workflow-planner/prompts.d.ts +1 -1
- package/build/system/workflows/mcp-workflow-planner/prompts.js +3 -3
- package/build/tsconfig.tsbuildinfo +1 -1
- package/dashboard/dist/assets/{AdminDashboard-DUrSBQOl.js → AdminDashboard-Cngijp4Q.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-DUrSBQOl.js.map → AdminDashboard-Cngijp4Q.js.map} +1 -1
- package/dashboard/dist/assets/{AvailableEscalationsPage-Dbd1qUK_.js → AvailableEscalationsPage-CpBfGV1h.js} +2 -2
- package/dashboard/dist/assets/{AvailableEscalationsPage-Dbd1qUK_.js.map → AvailableEscalationsPage-CpBfGV1h.js.map} +1 -1
- package/dashboard/dist/assets/{BotPicker-Cg5iNEkm.js → BotPicker-B8Uvw9Si.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-Cg5iNEkm.js.map → BotPicker-B8Uvw9Si.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-Kd9UIyeU.js → CollapsibleSection-DiFPuWOY.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-Kd9UIyeU.js.map → CollapsibleSection-DiFPuWOY.js.map} +1 -1
- package/dashboard/dist/assets/{ConfirmDeleteModal-DZMgmlof.js → ConfirmDeleteModal-CpXG9uyu.js} +2 -2
- package/dashboard/dist/assets/{ConfirmDeleteModal-DZMgmlof.js.map → ConfirmDeleteModal-CpXG9uyu.js.map} +1 -1
- package/dashboard/dist/assets/{CopyableId-cPFTRm8q.js → CopyableId-DKsTR9lK.js} +2 -2
- package/dashboard/dist/assets/{CopyableId-cPFTRm8q.js.map → CopyableId-DKsTR9lK.js.map} +1 -1
- package/dashboard/dist/assets/CredentialsPage-DlS7Kf40.js +2 -0
- package/dashboard/dist/assets/{CredentialsPage-DJablIbs.js.map → CredentialsPage-DlS7Kf40.js.map} +1 -1
- package/dashboard/dist/assets/{CustomDurationPicker-NgIP6YDW.js → CustomDurationPicker-B-9eW3pm.js} +2 -2
- package/dashboard/dist/assets/{CustomDurationPicker-NgIP6YDW.js.map → CustomDurationPicker-B-9eW3pm.js.map} +1 -1
- package/dashboard/dist/assets/{DataTable-CTRhTAfT.js → DataTable-DkOokbtL.js} +2 -2
- package/dashboard/dist/assets/{DataTable-CTRhTAfT.js.map → DataTable-DkOokbtL.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-HcSJ_MMs.js → ElapsedCell-DVtHqM-5.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-HcSJ_MMs.js.map → ElapsedCell-DVtHqM-5.js.map} +1 -1
- package/dashboard/dist/assets/{EmptyState-joNbd4gg.js → EmptyState-C7KIMIbE.js} +2 -2
- package/dashboard/dist/assets/{EmptyState-joNbd4gg.js.map → EmptyState-C7KIMIbE.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-DpXDnQux.js → EscalationsOverview-BMKBlkPx.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-DpXDnQux.js.map → EscalationsOverview-BMKBlkPx.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-CYem3v8n.js → EventTable-BYZ5OVdQ.js} +2 -2
- package/dashboard/dist/assets/{EventTable-CYem3v8n.js.map → EventTable-BYZ5OVdQ.js.map} +1 -1
- package/dashboard/dist/assets/{FilterBar-BiO8SOzc.js → FilterBar-C5r3n6YO.js} +2 -2
- package/dashboard/dist/assets/{FilterBar-BiO8SOzc.js.map → FilterBar-C5r3n6YO.js.map} +1 -1
- package/dashboard/dist/assets/{ListToolbar-6yRDh2e9.js → ListToolbar-BGUajIsW.js} +2 -2
- package/dashboard/dist/assets/{ListToolbar-6yRDh2e9.js.map → ListToolbar-BGUajIsW.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-CUgSxkQe.js → McpOverview-B_kJYHea.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-CUgSxkQe.js.map → McpOverview-B_kJYHea.js.map} +1 -1
- package/dashboard/dist/assets/McpQueryDetailPage-Czsmovqw.js +5 -0
- package/dashboard/dist/assets/McpQueryDetailPage-Czsmovqw.js.map +1 -0
- package/dashboard/dist/assets/McpQueryPage-BgAq_bQg.js +2 -0
- package/dashboard/dist/assets/{McpQueryPage-lV6kfDG5.js.map → McpQueryPage-BgAq_bQg.js.map} +1 -1
- package/dashboard/dist/assets/McpRunDetailPage-B8c0OszR.js +2 -0
- package/dashboard/dist/assets/McpRunDetailPage-B8c0OszR.js.map +1 -0
- package/dashboard/dist/assets/McpRunsPage-BY8C6k78.js +2 -0
- package/dashboard/dist/assets/McpRunsPage-BY8C6k78.js.map +1 -0
- package/dashboard/dist/assets/{Modal-BuTvD0pz.js → Modal-E1yRnCeW.js} +2 -2
- package/dashboard/dist/assets/{Modal-BuTvD0pz.js.map → Modal-E1yRnCeW.js.map} +1 -1
- package/dashboard/dist/assets/OperatorDashboard-C8MSTzey.js +2 -0
- package/dashboard/dist/assets/{OperatorDashboard-C9SSV96T.js.map → OperatorDashboard-C8MSTzey.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeader-BcTVF9ul.js → PageHeader-Cm5HBQF_.js} +2 -2
- package/dashboard/dist/assets/{PageHeader-BcTVF9ul.js.map → PageHeader-Cm5HBQF_.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeaderWithStats-BI7JG5x6.js → PageHeaderWithStats-CNmWJFSN.js} +2 -2
- package/dashboard/dist/assets/{PageHeaderWithStats-BI7JG5x6.js.map → PageHeaderWithStats-CNmWJFSN.js.map} +1 -1
- package/dashboard/dist/assets/{PriorityBadge-DqVaOU65.js → PriorityBadge-HSI4RVhs.js} +2 -2
- package/dashboard/dist/assets/{PriorityBadge-DqVaOU65.js.map → PriorityBadge-HSI4RVhs.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessDetailPage-hFMhf9qa.js → ProcessDetailPage-Dln8622H.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-hFMhf9qa.js.map → ProcessDetailPage-Dln8622H.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessesListPage-ByVoBCQ3.js → ProcessesListPage-bIsd9N_h.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-ByVoBCQ3.js.map → ProcessesListPage-bIsd9N_h.js.map} +1 -1
- package/dashboard/dist/assets/{RolePill-D9ZIkYiu.js → RolePill-BVUp2bF0.js} +2 -2
- package/dashboard/dist/assets/{RolePill-D9ZIkYiu.js.map → RolePill-BVUp2bF0.js.map} +1 -1
- package/dashboard/dist/assets/RolesPage-kH-Njt25.js +2 -0
- package/dashboard/dist/assets/{RolesPage-SMedMuqa.js.map → RolesPage-kH-Njt25.js.map} +1 -1
- package/dashboard/dist/assets/{RowActions-yDhwwDbU.js → RowActions-DbUJPfaW.js} +2 -2
- package/dashboard/dist/assets/{RowActions-yDhwwDbU.js.map → RowActions-DbUJPfaW.js.map} +1 -1
- package/dashboard/dist/assets/{StatCard-BrBnQFxh.js → StatCard-Bs3JbyAz.js} +2 -2
- package/dashboard/dist/assets/{StatCard-BrBnQFxh.js.map → StatCard-Bs3JbyAz.js.map} +1 -1
- package/dashboard/dist/assets/{StatusBadge-xgb-lZku.js → StatusBadge-CakDdsCw.js} +2 -2
- package/dashboard/dist/assets/{StatusBadge-xgb-lZku.js.map → StatusBadge-CakDdsCw.js.map} +1 -1
- package/dashboard/dist/assets/{StepIndicator-B9ps2SvM.js → StepIndicator-Cd_SG_yA.js} +2 -2
- package/dashboard/dist/assets/{StepIndicator-B9ps2SvM.js.map → StepIndicator-Cd_SG_yA.js.map} +1 -1
- package/dashboard/dist/assets/{StickyPagination-DTIjBKN3.js → StickyPagination-Bz0C18nC.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-DTIjBKN3.js.map → StickyPagination-Bz0C18nC.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-RK4Yu66z.js → SwimlaneTimeline-Cfe-xQRX.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-RK4Yu66z.js.map → SwimlaneTimeline-Cfe-xQRX.js.map} +1 -1
- package/dashboard/dist/assets/{TagInput-CdNUuqk4.js → TagInput-ClFhXG-U.js} +2 -2
- package/dashboard/dist/assets/{TagInput-CdNUuqk4.js.map → TagInput-ClFhXG-U.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-C-nzaNea.js → TaskDetailPage-SuMBdARt.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-C-nzaNea.js.map → TaskDetailPage-SuMBdARt.js.map} +1 -1
- package/dashboard/dist/assets/{TaskQueuePill-Lvr2-NzS.js → TaskQueuePill-lJR1JW_W.js} +2 -2
- package/dashboard/dist/assets/{TaskQueuePill-Lvr2-NzS.js.map → TaskQueuePill-lJR1JW_W.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-DSUmD84y.js → TasksListPage-Dkq1Vtbt.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-DSUmD84y.js.map → TasksListPage-Dkq1Vtbt.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-BZdLdrIh.js → TimeAgo-DgfDZ1pl.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-BZdLdrIh.js.map → TimeAgo-DgfDZ1pl.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-QX_0i5FK.js → TimestampCell-MpHZ1hMD.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-QX_0i5FK.js.map → TimestampCell-MpHZ1hMD.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-DyZMXcBm.js → UserName-DqsosA4B.js} +2 -2
- package/dashboard/dist/assets/{UserName-DyZMXcBm.js.map → UserName-DqsosA4B.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowExecutionPage-DjVxfZaF.js → WorkflowExecutionPage-CVlg38C3.js} +2 -2
- package/dashboard/dist/assets/{WorkflowExecutionPage-DjVxfZaF.js.map → WorkflowExecutionPage-CVlg38C3.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowPill-CRpZhjGR.js +2 -0
- package/dashboard/dist/assets/WorkflowPill-CRpZhjGR.js.map +1 -0
- package/dashboard/dist/assets/{WorkflowsDashboard-DZjuiFZ0.js → WorkflowsDashboard-Ugzbs8mV.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsDashboard-DZjuiFZ0.js.map → WorkflowsDashboard-Ugzbs8mV.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsOverview-CLnLRpOu.js → WorkflowsOverview-CIp_lTNl.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-CLnLRpOu.js.map → WorkflowsOverview-CIp_lTNl.js.map} +1 -1
- package/dashboard/dist/assets/YamlWorkflowsPage-BICF0fRO.js +2 -0
- package/dashboard/dist/assets/YamlWorkflowsPage-BICF0fRO.js.map +1 -0
- package/dashboard/dist/assets/{bots-DIM6lBoY.js → bots-DPfUpVqI.js} +2 -2
- package/dashboard/dist/assets/{bots-DIM6lBoY.js.map → bots-DPfUpVqI.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-JOTuOqjq.js → escalation-RrCDbMC3.js} +2 -2
- package/dashboard/dist/assets/{escalation-JOTuOqjq.js.map → escalation-RrCDbMC3.js.map} +1 -1
- package/dashboard/dist/assets/escalation-columns-CDGa9wsD.js +2 -0
- package/dashboard/dist/assets/{escalation-columns-Cyg58nkg.js.map → escalation-columns-CDGa9wsD.js.map} +1 -1
- package/dashboard/dist/assets/{helpers-B1BDxBZd.js → helpers-ZSKqdkdS.js} +2 -2
- package/dashboard/dist/assets/{helpers-B1BDxBZd.js.map → helpers-ZSKqdkdS.js.map} +1 -1
- package/dashboard/dist/assets/helpers-rMEcLwKs.js +2 -0
- package/dashboard/dist/assets/helpers-rMEcLwKs.js.map +1 -0
- package/dashboard/dist/assets/{index-DDYFpi4l.js → index-ABcJHHlN.js} +2 -2
- package/dashboard/dist/assets/{index-DDYFpi4l.js.map → index-ABcJHHlN.js.map} +1 -1
- package/dashboard/dist/assets/{index-D1wVX50Z.js → index-B91h_jZ0.js} +2 -2
- package/dashboard/dist/assets/{index-D1wVX50Z.js.map → index-B91h_jZ0.js.map} +1 -1
- package/dashboard/dist/assets/{index-BcR6PfpY.js → index-BbI2dzhJ.js} +2 -2
- package/dashboard/dist/assets/{index-BcR6PfpY.js.map → index-BbI2dzhJ.js.map} +1 -1
- package/dashboard/dist/assets/{index-BizfauqT.js → index-BmVCyB6C.js} +4 -4
- package/dashboard/dist/assets/{index-BizfauqT.js.map → index-BmVCyB6C.js.map} +1 -1
- package/dashboard/dist/assets/index-C1E5GTs9.js +2 -0
- package/dashboard/dist/assets/index-C1E5GTs9.js.map +1 -0
- package/dashboard/dist/assets/{index-Cf60K3x9.js → index-C90ZPzXk.js} +2 -2
- package/dashboard/dist/assets/{index-Cf60K3x9.js.map → index-C90ZPzXk.js.map} +1 -1
- package/dashboard/dist/assets/{index-BYZX9tOb.js → index-Cmgrk7PQ.js} +58 -58
- package/dashboard/dist/assets/index-Cmgrk7PQ.js.map +1 -0
- package/dashboard/dist/assets/{index-Ds0JoXS2.js → index-DNytWfSZ.js} +2 -2
- package/dashboard/dist/assets/{index-Ds0JoXS2.js.map → index-DNytWfSZ.js.map} +1 -1
- package/dashboard/dist/assets/index-DX6zxr6t.js +2 -0
- package/dashboard/dist/assets/{index-Cg5nfiYX.js.map → index-DX6zxr6t.js.map} +1 -1
- package/dashboard/dist/assets/index-DeX-ezqf.css +1 -0
- package/dashboard/dist/assets/index-K40Qw1tk.js +2 -0
- package/dashboard/dist/assets/{index-Di12t56M.js.map → index-K40Qw1tk.js.map} +1 -1
- package/dashboard/dist/assets/{index-BUK3qR-1.js → index-lCyNr5Xk.js} +2 -2
- package/dashboard/dist/assets/{index-BUK3qR-1.js.map → index-lCyNr5Xk.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-B_xbczAt.js → mcp-CNE44TSp.js} +2 -2
- package/dashboard/dist/assets/{mcp-B_xbczAt.js.map → mcp-CNE44TSp.js.map} +1 -1
- package/dashboard/dist/assets/mcp-query-RQX0uN-5.js +2 -0
- package/dashboard/dist/assets/mcp-query-RQX0uN-5.js.map +1 -0
- package/dashboard/dist/assets/mcp-runs-0w40bdz-.js +2 -0
- package/dashboard/dist/assets/mcp-runs-0w40bdz-.js.map +1 -0
- package/dashboard/dist/assets/{namespaces-C3WtdO_9.js → namespaces-BbmdXuPp.js} +2 -2
- package/dashboard/dist/assets/{namespaces-C3WtdO_9.js.map → namespaces-BbmdXuPp.js.map} +1 -1
- package/dashboard/dist/assets/{roles-BDAsPpZG.js → roles-DoHYlhWH.js} +2 -2
- package/dashboard/dist/assets/{roles-BDAsPpZG.js.map → roles-DoHYlhWH.js.map} +1 -1
- package/dashboard/dist/assets/{settings-Ife_UwAp.js → settings-BAiJiCHS.js} +2 -2
- package/dashboard/dist/assets/{settings-Ife_UwAp.js.map → settings-BAiJiCHS.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-BquNDHDI.js → tasks-CvroqHtm.js} +2 -2
- package/dashboard/dist/assets/{tasks-BquNDHDI.js.map → tasks-CvroqHtm.js.map} +1 -1
- package/dashboard/dist/assets/{useEventHooks-anv_B2Yy.js → useEventHooks-BHMbzR_y.js} +2 -2
- package/dashboard/dist/assets/{useEventHooks-anv_B2Yy.js.map → useEventHooks-BHMbzR_y.js.map} +1 -1
- package/dashboard/dist/assets/useFilterParams-CGRYFw_A.js +2 -0
- package/dashboard/dist/assets/useFilterParams-CGRYFw_A.js.map +1 -0
- package/dashboard/dist/assets/useYamlActivityEvents-D56KV14X.js +2 -0
- package/dashboard/dist/assets/useYamlActivityEvents-D56KV14X.js.map +1 -0
- package/dashboard/dist/assets/{users-CFcxB4v6.js → users-CxIMy_xw.js} +2 -2
- package/dashboard/dist/assets/{users-CFcxB4v6.js.map → users-CxIMy_xw.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-T4r2DSPD.js → vendor-icons-AFGxSeQS.js} +132 -82
- package/dashboard/dist/assets/vendor-icons-AFGxSeQS.js.map +1 -0
- package/dashboard/dist/assets/{workflows-CeRci9z3.js → workflows-yR9yais7.js} +2 -2
- package/dashboard/dist/assets/{workflows-CeRci9z3.js.map → workflows-yR9yais7.js.map} +1 -1
- package/dashboard/dist/assets/yaml-workflows-QVF2MZ0l.js +2 -0
- package/dashboard/dist/assets/yaml-workflows-QVF2MZ0l.js.map +1 -0
- package/dashboard/dist/index.html +3 -3
- package/docs/schema-exchange.md +173 -0
- package/docs/self-test.md +106 -0
- package/package.json +4 -2
- package/build/lib/db/schemas/003_workflow_discovery.sql +0 -39
- package/build/lib/db/schemas/004_query_router.sql +0 -38
- package/build/lib/db/schemas/004_workflow_sets.sql +0 -29
- package/build/lib/db/schemas/005_triage_router.sql +0 -37
- package/build/lib/db/schemas/005_unique_graph_topic.sql +0 -7
- package/build/lib/db/schemas/006_oauth.sql +0 -50
- package/build/lib/db/schemas/007_security.sql +0 -27
- package/build/lib/db/schemas/008_bot_accounts.sql +0 -30
- package/build/lib/db/schemas/009_audit_trail.sql +0 -7
- package/build/lib/db/schemas/010_credential_providers.sql +0 -4
- package/build/lib/db/schemas/011_system_workflow_configs.sql +0 -37
- package/build/lib/db/schemas/012_drop_modality.sql +0 -6
- package/build/lib/db/schemas/013_execute_as.sql +0 -9
- package/build/lib/db/schemas/014_ephemeral_credentials.sql +0 -16
- package/build/lib/db/schemas/015_knowledge.sql +0 -23
- package/build/lib/db/schemas/016_streamable_http.sql +0 -7
- package/dashboard/dist/assets/CredentialsPage-DJablIbs.js +0 -2
- package/dashboard/dist/assets/McpQueryDetailPage-BWbinTM_.js +0 -5
- package/dashboard/dist/assets/McpQueryDetailPage-BWbinTM_.js.map +0 -1
- package/dashboard/dist/assets/McpQueryPage-lV6kfDG5.js +0 -2
- package/dashboard/dist/assets/McpRunDetailPage-D6gaxH3_.js +0 -2
- package/dashboard/dist/assets/McpRunDetailPage-D6gaxH3_.js.map +0 -1
- package/dashboard/dist/assets/McpRunsPage-DKvTklh9.js +0 -2
- package/dashboard/dist/assets/McpRunsPage-DKvTklh9.js.map +0 -1
- package/dashboard/dist/assets/OperatorDashboard-C9SSV96T.js +0 -2
- package/dashboard/dist/assets/RolesPage-SMedMuqa.js +0 -2
- package/dashboard/dist/assets/WorkflowPill-CZqGslD6.js +0 -2
- package/dashboard/dist/assets/WorkflowPill-CZqGslD6.js.map +0 -1
- package/dashboard/dist/assets/YamlWorkflowsPage-VjdhnLmO.js +0 -2
- package/dashboard/dist/assets/YamlWorkflowsPage-VjdhnLmO.js.map +0 -1
- package/dashboard/dist/assets/escalation-columns-Cyg58nkg.js +0 -2
- package/dashboard/dist/assets/helpers-BCix9c_m.js +0 -2
- package/dashboard/dist/assets/helpers-BCix9c_m.js.map +0 -1
- package/dashboard/dist/assets/index-BYZX9tOb.js.map +0 -1
- package/dashboard/dist/assets/index-Cg5nfiYX.js +0 -2
- package/dashboard/dist/assets/index-DcIKW-cZ.css +0 -1
- package/dashboard/dist/assets/index-Di12t56M.js +0 -2
- package/dashboard/dist/assets/mcp-query-B8-P_QoG.js +0 -2
- package/dashboard/dist/assets/mcp-query-B8-P_QoG.js.map +0 -1
- package/dashboard/dist/assets/mcp-runs-CWeZinoF.js +0 -2
- package/dashboard/dist/assets/mcp-runs-CWeZinoF.js.map +0 -1
- package/dashboard/dist/assets/useFilterParams-BUyLHcx_.js +0 -2
- package/dashboard/dist/assets/useFilterParams-BUyLHcx_.js.map +0 -1
- package/dashboard/dist/assets/useYamlActivityEvents-DN-PTgVx.js +0 -2
- package/dashboard/dist/assets/useYamlActivityEvents-DN-PTgVx.js.map +0 -1
- package/dashboard/dist/assets/vendor-icons-T4r2DSPD.js.map +0 -1
- package/dashboard/dist/assets/yaml-workflows-DLwd2BOX.js +0 -2
- package/dashboard/dist/assets/yaml-workflows-DLwd2BOX.js.map +0 -1
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# The Self-Test: Long Tail Wraps Its Own API
|
|
2
|
+
|
|
3
|
+
## The Tool That Wanted to Extend Itself
|
|
4
|
+
|
|
5
|
+
Long Tail ships with a schema-exchange tool — a baseline capability for exchanging data with any external service under schema enforcement. The tool validates requests before sending and responses after receiving. It doesn't know HTTP from Playwright. It knows endpoints, schemas, and whether the data matched.
|
|
6
|
+
|
|
7
|
+
This is the story of what happened when someone pointed that tool at Long Tail's own API.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## The Starting Point
|
|
12
|
+
|
|
13
|
+
Long Tail has a REST API. It has endpoints for authentication, for listing registered MCP servers, for querying compiled workflows. Every deployment uses these endpoints — the dashboard calls them, integrations call them, crons call them.
|
|
14
|
+
|
|
15
|
+
But nobody had ever formalized what those endpoints return. The shapes were implicit — TypeScript interfaces in the codebase, but nothing the runtime could assert against. If a deployment changed a response shape, you found out when the dashboard broke. Or when a customer's integration broke. Or, worst case, you didn't find out at all because the consumer silently swallowed the new shape and produced wrong results downstream.
|
|
16
|
+
|
|
17
|
+
The schema-exchange tool exists precisely for this problem. It doesn't care whether the endpoint is Epic's FHIR server or Long Tail's own API. The principle is the same: endpoint + schema + validated exchange.
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Wrapping the API
|
|
22
|
+
|
|
23
|
+
An engineer opens Plan Mode in the dashboard and pastes three endpoint specifications:
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
Long Tail API (base: http://localhost:3000/api)
|
|
27
|
+
|
|
28
|
+
POST /auth/login
|
|
29
|
+
Request: { username: string, password: string }
|
|
30
|
+
Response: { token: string, user: { id: string, external_id: string, display_name: string, roles: [{ role: string, type: string }] } }
|
|
31
|
+
|
|
32
|
+
GET /mcp/servers (requires Bearer token)
|
|
33
|
+
Response: { servers: [{ id: string, name: string, description: string, tags: string[], status: string, tool_manifest: [{ name: string, description: string }] }] }
|
|
34
|
+
|
|
35
|
+
GET /yaml-workflows (requires Bearer token)
|
|
36
|
+
Response: { workflows: [{ id: string, name: string, app_id: string, status: string, graph_topic: string, tags: string[] }], total: number }
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
The planner decomposes this into three leaf workflows. The builder discovers the `exchange` tool in the inventory, reads the compile hints, and constructs each workflow as a trigger → exchange → output DAG with embedded schemas.
|
|
40
|
+
|
|
41
|
+
All three deploy under a server namespace: `longtailapi`.
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## What the Compiled Tools Do
|
|
46
|
+
|
|
47
|
+
**`login`** — Takes a username and password. Validates the request body (both strings, both required) against the request schema before sending. Calls POST /auth/login. Validates the response (must have `token` string and `user` object with required fields). Returns the token and user profile.
|
|
48
|
+
|
|
49
|
+
If someone changes the login response — adds a field, removes `display_name`, changes `roles` from an array to a string — the schema validation catches it. `validated: false`, with a human-readable error explaining exactly what changed.
|
|
50
|
+
|
|
51
|
+
**`list_servers`** — Takes a bearer token. Calls GET /mcp/servers. Validates the response (must be an object with a `servers` array, each server must have `id`, `name`, `tags`). Returns the server list.
|
|
52
|
+
|
|
53
|
+
This tool can answer the question: "does the schema-exchange server exist?" If `long-tail-schema-exchange` isn't in the returned list, the tool that's asking the question knows its own infrastructure is broken. The snake eating its own tail.
|
|
54
|
+
|
|
55
|
+
**`list_workflows`** — Takes a bearer token. Calls GET /yaml-workflows. Validates the response (must be an object with `workflows` array and `total` number). Returns the compiled tool inventory.
|
|
56
|
+
|
|
57
|
+
This tool can check whether the `longtailapi` tools themselves are deployed and active. It can verify that the very workflows it belongs to are in the list. Self-referential validation — the compiled tool confirms its own existence.
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## The Composition: Self-Health-Check
|
|
62
|
+
|
|
63
|
+
The three leaf tools compose into a single workflow: `self_health_check`.
|
|
64
|
+
|
|
65
|
+
1. **Login** — authenticate with a service account
|
|
66
|
+
2. **List servers** — verify all expected MCP servers are registered
|
|
67
|
+
3. **List workflows** — verify all expected compiled tools are deployed
|
|
68
|
+
|
|
69
|
+
Each step validates its response schema. If any step fails validation, the workflow knows exactly what changed — not "the API is down" but "the `servers` response is missing the `tags` field on server objects."
|
|
70
|
+
|
|
71
|
+
Schedule it on cron. Every midnight, the platform checks its own API surface against the schemas it captured when the tools were compiled. Schema drift is caught within 24 hours, automatically, without a human looking at anything.
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Why This Matters
|
|
76
|
+
|
|
77
|
+
This isn't a testing framework. It's the same schema-exchange primitive that wraps Epic's FHIR endpoints or Stripe's payment API or any other external service. The fact that it can wrap Long Tail's own API is a proof point, not a special case.
|
|
78
|
+
|
|
79
|
+
The proof point is:
|
|
80
|
+
|
|
81
|
+
1. **Any API surface can be formalized as compiled tools.** Paste the endpoint specs. Get schema-validated, cron-testable tools. No MCP server to hand-write. No integration code. The schema is the integration.
|
|
82
|
+
|
|
83
|
+
2. **Schema drift detection is automatic.** The response_schema embedded in each compiled tool is the contract. When the contract breaks, the tool reports exactly what changed. Not "500 error" — the actual structural diff.
|
|
84
|
+
|
|
85
|
+
3. **The tools compose.** Login → use token → check servers → check workflows. Each step is independently testable, independently schedulable, independently versionable. But together they form a health check that validates the entire platform surface.
|
|
86
|
+
|
|
87
|
+
4. **The platform can extend itself.** The schema-exchange tool is a baseline capability. The compiled API tools are built from it. The health check composes them. Every layer uses the same machinery. New endpoints are absorbed the same way — paste, compile, deploy, schedule.
|
|
88
|
+
|
|
89
|
+
This is the starting point the Epic story describes: "The engineering team registers a custom MCP server that wraps the FHIR endpoints their referral workflows need." Except here, the engineering team is us, the FHIR endpoints are our own API, and the custom MCP server assembled itself from pasted specs and a schema-exchange primitive.
|
|
90
|
+
|
|
91
|
+
The SOPs come next. But the plumbing works.
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## The Integration Test
|
|
96
|
+
|
|
97
|
+
The file `tests/integration/schema-exchange.test.ts` proves this end-to-end:
|
|
98
|
+
|
|
99
|
+
1. Calls `exchange` to login (POST /auth/login with request + response schema)
|
|
100
|
+
2. Calls `exchange` to list servers (GET /mcp/servers with response schema)
|
|
101
|
+
3. Asserts the schema-exchange server exists in the response
|
|
102
|
+
4. Calls `exchange` to list workflows (GET /yaml-workflows with response schema)
|
|
103
|
+
5. Deliberately uses a wrong schema to prove drift detection
|
|
104
|
+
6. Deliberately sends a malformed request to prove pre-send rejection
|
|
105
|
+
|
|
106
|
+
If any assertion fails, the schema-exchange tool isn't doing its job. If they all pass, the platform can wrap any API — including its own.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hotmeshio/long-tail",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.14",
|
|
4
4
|
"description": "Long Tail Workflows — Durable AI workflows with human-in-the-loop escalation. Powered by PostgreSQL.",
|
|
5
5
|
"main": "./build/index.js",
|
|
6
6
|
"types": "./build/index.d.ts",
|
|
@@ -61,12 +61,14 @@
|
|
|
61
61
|
"dependencies": {
|
|
62
62
|
"@anthropic-ai/sdk": "^0.92.0",
|
|
63
63
|
"@aws-sdk/client-s3": "^3.1017.0",
|
|
64
|
-
"@
|
|
64
|
+
"@aws-sdk/s3-request-presigner": "^3.1045.0",
|
|
65
|
+
"@hotmeshio/hotmesh": "^0.14.7",
|
|
65
66
|
"@modelcontextprotocol/sdk": "^1.27.1",
|
|
66
67
|
"@opentelemetry/exporter-trace-otlp-proto": "^0.215.0",
|
|
67
68
|
"@opentelemetry/resources": "^2.5.1",
|
|
68
69
|
"@opentelemetry/sdk-node": "^0.215.0",
|
|
69
70
|
"@opentelemetry/semantic-conventions": "^1.39.0",
|
|
71
|
+
"ajv": "^8.20.0",
|
|
70
72
|
"arctic": "^3.7.0",
|
|
71
73
|
"bcryptjs": "^2.4.3",
|
|
72
74
|
"express": "^5.1.0",
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
-- Workflow discovery: full-text search, original prompt, and category.
|
|
2
|
-
|
|
3
|
-
-- Original prompt that spawned this workflow (richest semantic signal)
|
|
4
|
-
ALTER TABLE lt_yaml_workflows ADD COLUMN IF NOT EXISTS original_prompt TEXT;
|
|
5
|
-
|
|
6
|
-
-- Capability category derived from tool usage patterns
|
|
7
|
-
ALTER TABLE lt_yaml_workflows ADD COLUMN IF NOT EXISTS category TEXT;
|
|
8
|
-
|
|
9
|
-
-- Full-text search vector, auto-maintained by trigger
|
|
10
|
-
ALTER TABLE lt_yaml_workflows ADD COLUMN IF NOT EXISTS search_vector TSVECTOR;
|
|
11
|
-
|
|
12
|
-
-- GIN index on search_vector for fast full-text search
|
|
13
|
-
CREATE INDEX IF NOT EXISTS idx_lt_yaml_workflows_search
|
|
14
|
-
ON lt_yaml_workflows USING GIN (search_vector);
|
|
15
|
-
|
|
16
|
-
-- Index on category for filtered queries
|
|
17
|
-
CREATE INDEX IF NOT EXISTS idx_lt_yaml_workflows_category
|
|
18
|
-
ON lt_yaml_workflows (category) WHERE category IS NOT NULL;
|
|
19
|
-
|
|
20
|
-
-- Trigger: rebuild search_vector from name, description, tags, original_prompt, category
|
|
21
|
-
CREATE OR REPLACE FUNCTION lt_yaml_workflows_search_vector_update()
|
|
22
|
-
RETURNS TRIGGER AS $$
|
|
23
|
-
BEGIN
|
|
24
|
-
NEW.search_vector :=
|
|
25
|
-
setweight(to_tsvector('english', coalesce(NEW.name, '')), 'A') ||
|
|
26
|
-
setweight(to_tsvector('english', coalesce(NEW.original_prompt, '')), 'A') ||
|
|
27
|
-
setweight(to_tsvector('english', coalesce(NEW.description, '')), 'B') ||
|
|
28
|
-
setweight(to_tsvector('english', coalesce(NEW.category, '')), 'C') ||
|
|
29
|
-
setweight(to_tsvector('english', coalesce(array_to_string(NEW.tags, ' '), '')), 'C');
|
|
30
|
-
RETURN NEW;
|
|
31
|
-
END;
|
|
32
|
-
$$ LANGUAGE plpgsql;
|
|
33
|
-
|
|
34
|
-
CREATE OR REPLACE TRIGGER trg_lt_yaml_workflows_search_vector
|
|
35
|
-
BEFORE INSERT OR UPDATE ON lt_yaml_workflows
|
|
36
|
-
FOR EACH ROW EXECUTE FUNCTION lt_yaml_workflows_search_vector_update();
|
|
37
|
-
|
|
38
|
-
-- Backfill search_vector for existing rows
|
|
39
|
-
UPDATE lt_yaml_workflows SET updated_at = NOW();
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
-- Split mcpQuery into router + dynamic + deterministic workflows.
|
|
2
|
-
-- mcpQueryRouter is the new entry point (orchestrator).
|
|
3
|
-
-- mcpQuery becomes dynamic-only (leaf).
|
|
4
|
-
-- mcpDeterministic invokes compiled YAML workflows (leaf).
|
|
5
|
-
|
|
6
|
-
-- Update existing mcpQuery: no longer directly invocable (called via router)
|
|
7
|
-
UPDATE lt_config_workflows
|
|
8
|
-
SET invocable = false,
|
|
9
|
-
description = 'Dynamic MCP tool orchestration — LLM agentic loop with raw MCP tools'
|
|
10
|
-
WHERE workflow_type = 'mcpQuery';
|
|
11
|
-
|
|
12
|
-
-- Add mcpQueryRouter (orchestrator — the new entry point)
|
|
13
|
-
INSERT INTO lt_config_workflows
|
|
14
|
-
(workflow_type, task_queue, default_role, invocable, description, tool_tags, envelope_schema)
|
|
15
|
-
VALUES
|
|
16
|
-
('mcpQueryRouter', 'long-tail-system', 'engineer', true,
|
|
17
|
-
'Do anything with tools — browser automation, file operations, HTTP requests, database queries, document processing, and more',
|
|
18
|
-
'{}',
|
|
19
|
-
'{"data": {"prompt": "Describe what you want to accomplish using available tools..."}, "metadata": {"source": "dashboard"}}'::jsonb)
|
|
20
|
-
ON CONFLICT (workflow_type) DO NOTHING;
|
|
21
|
-
|
|
22
|
-
-- Add mcpDeterministic (leaf — invokes compiled YAML workflows)
|
|
23
|
-
INSERT INTO lt_config_workflows
|
|
24
|
-
(workflow_type, task_queue, default_role, invocable, description, tool_tags)
|
|
25
|
-
VALUES
|
|
26
|
-
('mcpDeterministic', 'long-tail-system', 'engineer', false,
|
|
27
|
-
'Deterministic execution — invokes matched compiled YAML workflows with extracted inputs',
|
|
28
|
-
'{}')
|
|
29
|
-
ON CONFLICT (workflow_type) DO NOTHING;
|
|
30
|
-
|
|
31
|
-
-- Assign roles
|
|
32
|
-
INSERT INTO lt_config_roles (workflow_type, role)
|
|
33
|
-
SELECT 'mcpQueryRouter', unnest(ARRAY['reviewer', 'engineer', 'admin'])
|
|
34
|
-
ON CONFLICT (workflow_type, role) DO NOTHING;
|
|
35
|
-
|
|
36
|
-
INSERT INTO lt_config_roles (workflow_type, role)
|
|
37
|
-
SELECT 'mcpDeterministic', unnest(ARRAY['reviewer', 'engineer', 'admin'])
|
|
38
|
-
ON CONFLICT (workflow_type, role) DO NOTHING;
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
-- Workflow sets: groups of related workflows produced by plan mode.
|
|
2
|
-
|
|
3
|
-
CREATE TABLE IF NOT EXISTS lt_workflow_sets (
|
|
4
|
-
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
5
|
-
name TEXT UNIQUE NOT NULL,
|
|
6
|
-
description TEXT,
|
|
7
|
-
specification TEXT NOT NULL,
|
|
8
|
-
plan JSONB NOT NULL DEFAULT '[]'::JSONB,
|
|
9
|
-
namespaces TEXT[] NOT NULL DEFAULT '{}',
|
|
10
|
-
status TEXT NOT NULL DEFAULT 'planning'
|
|
11
|
-
CHECK (status IN ('planning','planned','building','deploying','completed','failed')),
|
|
12
|
-
source_workflow_id TEXT,
|
|
13
|
-
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
14
|
-
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
15
|
-
);
|
|
16
|
-
|
|
17
|
-
CREATE OR REPLACE TRIGGER trg_lt_workflow_sets_updated_at
|
|
18
|
-
BEFORE UPDATE ON lt_workflow_sets
|
|
19
|
-
FOR EACH ROW EXECUTE FUNCTION lt_set_updated_at();
|
|
20
|
-
|
|
21
|
-
-- Extend lt_yaml_workflows with set membership columns
|
|
22
|
-
ALTER TABLE lt_yaml_workflows ADD COLUMN IF NOT EXISTS set_id UUID
|
|
23
|
-
REFERENCES lt_workflow_sets(id) ON DELETE SET NULL;
|
|
24
|
-
ALTER TABLE lt_yaml_workflows ADD COLUMN IF NOT EXISTS set_role TEXT
|
|
25
|
-
CHECK (set_role IN ('leaf', 'composition', 'router'));
|
|
26
|
-
ALTER TABLE lt_yaml_workflows ADD COLUMN IF NOT EXISTS set_build_order INTEGER;
|
|
27
|
-
|
|
28
|
-
CREATE INDEX IF NOT EXISTS idx_lt_yaml_workflows_set_id
|
|
29
|
-
ON lt_yaml_workflows (set_id) WHERE set_id IS NOT NULL;
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
-- Split mcpTriage into router + dynamic + deterministic workflows.
|
|
2
|
-
-- mcpTriageRouter is the new entry point (orchestrator).
|
|
3
|
-
-- mcpTriage becomes dynamic-only (leaf).
|
|
4
|
-
-- mcpTriageDeterministic invokes compiled YAML workflows (leaf).
|
|
5
|
-
|
|
6
|
-
-- Update existing mcpTriage: no longer directly invocable (called via router)
|
|
7
|
-
UPDATE lt_config_workflows
|
|
8
|
-
SET invocable = false,
|
|
9
|
-
description = 'Dynamic MCP triage — LLM agentic loop for escalation remediation'
|
|
10
|
-
WHERE workflow_type = 'mcpTriage';
|
|
11
|
-
|
|
12
|
-
-- Add mcpTriageRouter (orchestrator — the new entry point for triage)
|
|
13
|
-
INSERT INTO lt_config_workflows
|
|
14
|
-
(workflow_type, task_queue, default_role, invocable, description, tool_tags)
|
|
15
|
-
VALUES
|
|
16
|
-
('mcpTriageRouter', 'long-tail-system', 'engineer', false,
|
|
17
|
-
'Triage router — discovers compiled workflows for remediation, routes to deterministic or dynamic triage',
|
|
18
|
-
'{}')
|
|
19
|
-
ON CONFLICT (workflow_type) DO NOTHING;
|
|
20
|
-
|
|
21
|
-
-- Add mcpTriageDeterministic (leaf — invokes compiled triage workflows)
|
|
22
|
-
INSERT INTO lt_config_workflows
|
|
23
|
-
(workflow_type, task_queue, default_role, invocable, description, tool_tags)
|
|
24
|
-
VALUES
|
|
25
|
-
('mcpTriageDeterministic', 'long-tail-system', 'engineer', false,
|
|
26
|
-
'Deterministic triage — invokes matched compiled workflows for escalation remediation',
|
|
27
|
-
'{}')
|
|
28
|
-
ON CONFLICT (workflow_type) DO NOTHING;
|
|
29
|
-
|
|
30
|
-
-- Assign roles
|
|
31
|
-
INSERT INTO lt_config_roles (workflow_type, role)
|
|
32
|
-
SELECT 'mcpTriageRouter', unnest(ARRAY['reviewer', 'engineer', 'admin'])
|
|
33
|
-
ON CONFLICT (workflow_type, role) DO NOTHING;
|
|
34
|
-
|
|
35
|
-
INSERT INTO lt_config_roles (workflow_type, role)
|
|
36
|
-
SELECT 'mcpTriageDeterministic', unnest(ARRAY['reviewer', 'engineer', 'admin'])
|
|
37
|
-
ON CONFLICT (workflow_type, role) DO NOTHING;
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
-- Enforce unique graph_topic per app_id for non-archived workflows.
|
|
2
|
-
-- Two active/deployed/draft workflows in the same namespace must not
|
|
3
|
-
-- share a subscribes topic — deploying them would cause routing collisions.
|
|
4
|
-
|
|
5
|
-
CREATE UNIQUE INDEX IF NOT EXISTS idx_lt_yaml_workflows_app_topic_unique
|
|
6
|
-
ON lt_yaml_workflows (app_id, graph_topic)
|
|
7
|
-
WHERE status != 'archived';
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
-- ── OAuth token storage ─────────────────────────────────────────────────────
|
|
2
|
-
-- Encrypted per-user, per-provider OAuth tokens for identity and resource OAuth.
|
|
3
|
-
|
|
4
|
-
CREATE TABLE IF NOT EXISTS lt_oauth_tokens (
|
|
5
|
-
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
6
|
-
user_id UUID NOT NULL REFERENCES lt_users(id) ON DELETE CASCADE,
|
|
7
|
-
provider TEXT NOT NULL,
|
|
8
|
-
label TEXT NOT NULL DEFAULT 'default',
|
|
9
|
-
access_token_enc TEXT NOT NULL,
|
|
10
|
-
refresh_token_enc TEXT,
|
|
11
|
-
token_type TEXT NOT NULL DEFAULT 'bearer',
|
|
12
|
-
scopes TEXT[] NOT NULL DEFAULT '{}',
|
|
13
|
-
expires_at TIMESTAMPTZ,
|
|
14
|
-
provider_user_id TEXT NOT NULL,
|
|
15
|
-
provider_email TEXT,
|
|
16
|
-
metadata JSONB,
|
|
17
|
-
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
18
|
-
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
19
|
-
UNIQUE (user_id, provider, label)
|
|
20
|
-
);
|
|
21
|
-
|
|
22
|
-
-- Migration: add label column for multiple credentials per provider per user.
|
|
23
|
-
-- Existing rows get 'default'. The unique constraint moves from (user_id, provider)
|
|
24
|
-
-- to (user_id, provider, label).
|
|
25
|
-
ALTER TABLE lt_oauth_tokens ADD COLUMN IF NOT EXISTS label TEXT NOT NULL DEFAULT 'default';
|
|
26
|
-
|
|
27
|
-
-- Drop old unique constraint if it exists (safe no-op if already migrated)
|
|
28
|
-
DO $$ BEGIN
|
|
29
|
-
ALTER TABLE lt_oauth_tokens DROP CONSTRAINT IF EXISTS lt_oauth_tokens_user_id_provider_key;
|
|
30
|
-
EXCEPTION WHEN undefined_object THEN NULL;
|
|
31
|
-
END $$;
|
|
32
|
-
|
|
33
|
-
-- Create the new composite unique constraint (idempotent via IF NOT EXISTS on index)
|
|
34
|
-
CREATE UNIQUE INDEX IF NOT EXISTS lt_oauth_tokens_user_id_provider_label_key
|
|
35
|
-
ON lt_oauth_tokens (user_id, provider, label);
|
|
36
|
-
|
|
37
|
-
CREATE INDEX IF NOT EXISTS idx_lt_oauth_tokens_provider
|
|
38
|
-
ON lt_oauth_tokens (provider, user_id);
|
|
39
|
-
|
|
40
|
-
CREATE OR REPLACE TRIGGER trg_lt_oauth_tokens_updated_at
|
|
41
|
-
BEFORE UPDATE ON lt_oauth_tokens
|
|
42
|
-
FOR EACH ROW EXECUTE FUNCTION lt_set_updated_at();
|
|
43
|
-
|
|
44
|
-
-- ── Identity link columns on lt_users ──────────────────────────────────────
|
|
45
|
-
ALTER TABLE lt_users ADD COLUMN IF NOT EXISTS oauth_provider TEXT;
|
|
46
|
-
ALTER TABLE lt_users ADD COLUMN IF NOT EXISTS oauth_provider_id TEXT;
|
|
47
|
-
|
|
48
|
-
CREATE INDEX IF NOT EXISTS idx_lt_users_oauth
|
|
49
|
-
ON lt_users (oauth_provider, oauth_provider_id)
|
|
50
|
-
WHERE oauth_provider IS NOT NULL;
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
-- ── Service tokens for external MCP servers ─────────────────────────────────
|
|
2
|
-
CREATE TABLE IF NOT EXISTS lt_service_tokens (
|
|
3
|
-
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
4
|
-
name TEXT UNIQUE NOT NULL,
|
|
5
|
-
token_hash TEXT NOT NULL,
|
|
6
|
-
server_id UUID REFERENCES lt_mcp_servers(id) ON DELETE CASCADE,
|
|
7
|
-
scopes TEXT[] NOT NULL DEFAULT '{}',
|
|
8
|
-
expires_at TIMESTAMPTZ,
|
|
9
|
-
last_used_at TIMESTAMPTZ,
|
|
10
|
-
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
11
|
-
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
12
|
-
);
|
|
13
|
-
|
|
14
|
-
CREATE INDEX IF NOT EXISTS idx_lt_service_tokens_server
|
|
15
|
-
ON lt_service_tokens (server_id);
|
|
16
|
-
|
|
17
|
-
CREATE OR REPLACE TRIGGER trg_lt_service_tokens_updated_at
|
|
18
|
-
BEFORE UPDATE ON lt_service_tokens
|
|
19
|
-
FOR EACH ROW EXECUTE FUNCTION lt_set_updated_at();
|
|
20
|
-
|
|
21
|
-
-- ── Audit: who initiated escalations ────────────────────────────────────────
|
|
22
|
-
ALTER TABLE lt_escalations ADD COLUMN IF NOT EXISTS created_by UUID REFERENCES lt_users(id);
|
|
23
|
-
CREATE INDEX IF NOT EXISTS idx_lt_escalations_created_by
|
|
24
|
-
ON lt_escalations (created_by) WHERE created_by IS NOT NULL;
|
|
25
|
-
|
|
26
|
-
-- ── Scope declarations for MCP servers ──────────────────────────────────────
|
|
27
|
-
ALTER TABLE lt_mcp_servers ADD COLUMN IF NOT EXISTS required_scopes TEXT[] NOT NULL DEFAULT '{}';
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
-- 008_bot_accounts.sql
|
|
2
|
-
-- Bot/service account support for universal IAM.
|
|
3
|
-
-- Bots live in lt_users (account_type = 'bot') and authenticate via API keys.
|
|
4
|
-
|
|
5
|
-
-- Add account_type column to lt_users to distinguish human vs bot accounts.
|
|
6
|
-
ALTER TABLE lt_users ADD COLUMN IF NOT EXISTS account_type TEXT NOT NULL DEFAULT 'user';
|
|
7
|
-
|
|
8
|
-
-- Apply check constraint (idempotent: skip if already exists).
|
|
9
|
-
DO $$ BEGIN
|
|
10
|
-
ALTER TABLE lt_users ADD CONSTRAINT lt_users_account_type_check
|
|
11
|
-
CHECK (account_type IN ('user', 'bot'));
|
|
12
|
-
EXCEPTION
|
|
13
|
-
WHEN duplicate_object THEN NULL;
|
|
14
|
-
END $$;
|
|
15
|
-
|
|
16
|
-
-- Bot API keys — similar to lt_service_tokens but scoped to a user (bot) account.
|
|
17
|
-
CREATE TABLE IF NOT EXISTS lt_bot_api_keys (
|
|
18
|
-
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
19
|
-
name TEXT NOT NULL,
|
|
20
|
-
user_id UUID NOT NULL REFERENCES lt_users(id) ON DELETE CASCADE,
|
|
21
|
-
key_hash TEXT NOT NULL,
|
|
22
|
-
scopes TEXT[] NOT NULL DEFAULT '{}',
|
|
23
|
-
expires_at TIMESTAMPTZ,
|
|
24
|
-
last_used_at TIMESTAMPTZ,
|
|
25
|
-
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
26
|
-
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
27
|
-
UNIQUE (user_id, name)
|
|
28
|
-
);
|
|
29
|
-
|
|
30
|
-
CREATE INDEX IF NOT EXISTS idx_bot_api_keys_user_id ON lt_bot_api_keys (user_id);
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
-- 009_audit_trail.sql
|
|
2
|
-
-- Add IAM audit columns to lt_tasks for identity traceability.
|
|
3
|
-
|
|
4
|
-
ALTER TABLE lt_tasks ADD COLUMN IF NOT EXISTS initiated_by UUID REFERENCES lt_users(id) ON DELETE SET NULL;
|
|
5
|
-
ALTER TABLE lt_tasks ADD COLUMN IF NOT EXISTS principal_type TEXT DEFAULT 'user';
|
|
6
|
-
|
|
7
|
-
CREATE INDEX IF NOT EXISTS idx_lt_tasks_initiated_by ON lt_tasks (initiated_by) WHERE initiated_by IS NOT NULL;
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
-- Ensure all system leaf workflows have config entries.
|
|
2
|
-
-- Migrations 004/005 tried to UPDATE these but they were never seeded —
|
|
3
|
-
-- the interceptor needs config entries to wrap workflows with lifecycle events.
|
|
4
|
-
|
|
5
|
-
INSERT INTO lt_config_workflows
|
|
6
|
-
(workflow_type, task_queue, default_role, invocable, description, tool_tags)
|
|
7
|
-
VALUES
|
|
8
|
-
('mcpQuery', 'long-tail-system', 'engineer', false,
|
|
9
|
-
'Dynamic MCP tool orchestration — LLM agentic loop with raw MCP tools',
|
|
10
|
-
'{}'),
|
|
11
|
-
('mcpTriage', 'long-tail-system', 'engineer', false,
|
|
12
|
-
'Dynamic MCP triage — LLM agentic loop for escalation remediation',
|
|
13
|
-
'{}'),
|
|
14
|
-
('mcpWorkflowBuilder', 'long-tail-system', 'engineer', false,
|
|
15
|
-
'Direct pipeline builder — LLM constructs DAG from tool schemas',
|
|
16
|
-
'{}'),
|
|
17
|
-
('mcpWorkflowPlanner', 'long-tail-system', 'engineer', false,
|
|
18
|
-
'Plan mode — decomposes specifications into multi-workflow sets',
|
|
19
|
-
'{}')
|
|
20
|
-
ON CONFLICT (workflow_type) DO NOTHING;
|
|
21
|
-
|
|
22
|
-
-- Assign roles
|
|
23
|
-
INSERT INTO lt_config_roles (workflow_type, role)
|
|
24
|
-
SELECT 'mcpQuery', unnest(ARRAY['reviewer', 'engineer', 'admin'])
|
|
25
|
-
ON CONFLICT (workflow_type, role) DO NOTHING;
|
|
26
|
-
|
|
27
|
-
INSERT INTO lt_config_roles (workflow_type, role)
|
|
28
|
-
SELECT 'mcpTriage', unnest(ARRAY['reviewer', 'engineer', 'admin'])
|
|
29
|
-
ON CONFLICT (workflow_type, role) DO NOTHING;
|
|
30
|
-
|
|
31
|
-
INSERT INTO lt_config_roles (workflow_type, role)
|
|
32
|
-
SELECT 'mcpWorkflowBuilder', unnest(ARRAY['reviewer', 'engineer', 'admin'])
|
|
33
|
-
ON CONFLICT (workflow_type, role) DO NOTHING;
|
|
34
|
-
|
|
35
|
-
INSERT INTO lt_config_roles (workflow_type, role)
|
|
36
|
-
SELECT 'mcpWorkflowPlanner', unnest(ARRAY['reviewer', 'engineer', 'admin'])
|
|
37
|
-
ON CONFLICT (workflow_type, role) DO NOTHING;
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
-- Remove delivery modality — the concept was never used for actual routing.
|
|
2
|
-
-- Alpha cleanup: drop from config, escalations, and tasks tables.
|
|
3
|
-
|
|
4
|
-
ALTER TABLE lt_config_workflows DROP COLUMN IF EXISTS default_modality;
|
|
5
|
-
ALTER TABLE lt_escalations DROP COLUMN IF EXISTS modality;
|
|
6
|
-
ALTER TABLE lt_tasks DROP COLUMN IF EXISTS modality;
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
-- Add execute_as to workflow configs: proxy invocation identity.
|
|
2
|
-
-- When set, workflows run as the named bot instead of the invoking user.
|
|
3
|
-
|
|
4
|
-
ALTER TABLE lt_config_workflows ADD COLUMN IF NOT EXISTS execute_as TEXT;
|
|
5
|
-
|
|
6
|
-
-- Add executing_as to tasks: records the actual executing principal
|
|
7
|
-
-- (may differ from initiated_by when proxy invocation is used).
|
|
8
|
-
|
|
9
|
-
ALTER TABLE lt_tasks ADD COLUMN IF NOT EXISTS executing_as TEXT;
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
-- Ephemeral credential store for sensitive fields in waitFor signal payloads.
|
|
2
|
-
-- Supports max_uses (0 = unlimited) and TTL-based expiry.
|
|
3
|
-
|
|
4
|
-
CREATE TABLE IF NOT EXISTS lt_ephemeral_credentials (
|
|
5
|
-
token UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
6
|
-
value BYTEA NOT NULL,
|
|
7
|
-
label TEXT,
|
|
8
|
-
max_uses INTEGER NOT NULL DEFAULT 0,
|
|
9
|
-
use_count INTEGER NOT NULL DEFAULT 0,
|
|
10
|
-
expires_at TIMESTAMPTZ,
|
|
11
|
-
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
12
|
-
);
|
|
13
|
-
|
|
14
|
-
CREATE INDEX IF NOT EXISTS idx_lt_ephemeral_expiry
|
|
15
|
-
ON lt_ephemeral_credentials (expires_at)
|
|
16
|
-
WHERE expires_at IS NOT NULL;
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
-- Long Tail Knowledge Store
|
|
2
|
-
-- Persistent JSONB memory for autonomous agents. Each entry lives in a domain
|
|
3
|
-
-- (lightweight namespace) and is keyed by a human-readable string.
|
|
4
|
-
|
|
5
|
-
CREATE TABLE IF NOT EXISTS lt_knowledge (
|
|
6
|
-
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
7
|
-
domain TEXT NOT NULL,
|
|
8
|
-
key TEXT NOT NULL,
|
|
9
|
-
data JSONB NOT NULL DEFAULT '{}',
|
|
10
|
-
tags TEXT[] NOT NULL DEFAULT '{}',
|
|
11
|
-
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
12
|
-
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
13
|
-
UNIQUE(domain, key)
|
|
14
|
-
);
|
|
15
|
-
|
|
16
|
-
CREATE INDEX IF NOT EXISTS idx_lt_knowledge_domain ON lt_knowledge (domain);
|
|
17
|
-
CREATE INDEX IF NOT EXISTS idx_lt_knowledge_tags ON lt_knowledge USING GIN (tags);
|
|
18
|
-
CREATE INDEX IF NOT EXISTS idx_lt_knowledge_data ON lt_knowledge USING GIN (data);
|
|
19
|
-
|
|
20
|
-
DROP TRIGGER IF EXISTS lt_knowledge_updated_at ON lt_knowledge;
|
|
21
|
-
CREATE TRIGGER lt_knowledge_updated_at
|
|
22
|
-
BEFORE UPDATE ON lt_knowledge
|
|
23
|
-
FOR EACH ROW EXECUTE FUNCTION lt_set_updated_at();
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
-- Allow 'streamable-http' as a transport type for MCP servers
|
|
2
|
-
ALTER TABLE lt_mcp_servers
|
|
3
|
-
DROP CONSTRAINT IF EXISTS lt_mcp_servers_transport_type_check;
|
|
4
|
-
|
|
5
|
-
ALTER TABLE lt_mcp_servers
|
|
6
|
-
ADD CONSTRAINT lt_mcp_servers_transport_type_check
|
|
7
|
-
CHECK (transport_type IN ('stdio', 'sse', 'streamable-http'));
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{A as v,B as C,j as e,O as c,z as P}from"./index-BYZX9tOb.js";import{a as n}from"./vendor-query-DLp59M9_.js";import{P as D}from"./PageHeader-BcTVF9ul.js";import{T as E}from"./TimeAgo-BZdLdrIh.js";import{C as j}from"./ConfirmDeleteModal-DZMgmlof.js";import{a9 as V,C as y,ac as k,j as A}from"./vendor-icons-T4r2DSPD.js";import"./vendor-react-Co3Y8ikm.js";import"./Modal-BuTvD0pz.js";const d={anthropic:{name:"Anthropic",helpText:'Run "claude setup-token" for an OAuth token, or use an API key from console.anthropic.com.',placeholder:"sk-ant-oat01-... or sk-ant-api03-..."},openai:{name:"OpenAI",helpText:"Create an API key at platform.openai.com/api-keys.",placeholder:"sk-..."}};function z(){var m,p;const{data:r,isLoading:u}=v(),i=C(),[a,l]=n.useState(null),[b,N]=n.useState(!1),[t,g]=n.useState("anthropic"),o=(r==null?void 0:r.connections)??[],x=()=>{a&&i.mutate({provider:a.provider,label:a.label},{onSuccess:()=>l(null)})},h=s=>`/api/auth/oauth/connect/${s}?token=${encodeURIComponent(P()||"")}&returnTo=/credentials`;return e.jsxDEV("div",{children:[e.jsxDEV(D,{title:"Credentials",actions:e.jsxDEV("button",{onClick:()=>N(s=>!s),className:"btn-primary text-xs inline-flex items-center gap-1.5",children:[e.jsxDEV(V,{className:"w-3.5 h-3.5"},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:57,columnNumber:13},this),"Add Credential"]},void 0,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:53,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:50,columnNumber:7},this),e.jsxDEV("p",{className:"text-sm text-text-secondary mb-6",children:"Manage credentials used by tools when invoked on your behalf. Each credential is encrypted at rest and resolved automatically during tool execution."},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:63,columnNumber:7},this),b&&e.jsxDEV("div",{className:"mb-6 p-4 bg-surface-raised border border-surface-border rounded-md space-y-3",children:[e.jsxDEV("div",{className:"flex items-center gap-3",children:[e.jsxDEV("label",{className:"text-xs text-text-secondary font-medium",children:"Provider"},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:72,columnNumber:13},this),e.jsxDEV("div",{className:"relative",children:[e.jsxDEV("select",{value:t,onChange:s=>g(s.target.value),className:"input text-xs pr-7 appearance-none",children:Object.entries(d).map(([s,f])=>e.jsxDEV("option",{value:s,children:f.name},s,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:80,columnNumber:19},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:74,columnNumber:15},this),e.jsxDEV(y,{className:"absolute right-2 top-1/2 -translate-y-1/2 w-3 h-3 text-text-tertiary pointer-events-none"},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:83,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:73,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:71,columnNumber:11},this),e.jsxDEV("p",{className:"text-xs text-text-tertiary",children:(m=d[t])==null?void 0:m.helpText},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:86,columnNumber:11},this),e.jsxDEV("a",{href:h(t),className:"btn-primary text-xs inline-flex items-center gap-1.5",children:[e.jsxDEV(c,{provider:t,className:"w-3.5 h-3.5"},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:93,columnNumber:13},this),"Connect ",(p=d[t])==null?void 0:p.name]},void 0,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:89,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:70,columnNumber:9},this),u?e.jsxDEV("div",{className:"animate-pulse space-y-3",children:[1,2].map(s=>e.jsxDEV("div",{className:"h-16 bg-surface-sunken rounded"},s,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:103,columnNumber:13},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:101,columnNumber:9},this):o.length===0?e.jsxDEV("div",{className:"text-center py-16 text-text-tertiary",children:[e.jsxDEV(k,{className:"w-10 h-10 mx-auto mb-3 opacity-40"},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:108,columnNumber:11},this),e.jsxDEV("p",{className:"text-sm",children:"No credentials registered."},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:109,columnNumber:11},this),e.jsxDEV("p",{className:"text-xs mt-1",children:"Add a credential to enable tool authentication."},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:110,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:107,columnNumber:9},this):e.jsxDEV("div",{className:"space-y-2",children:o.map(s=>e.jsxDEV("div",{className:"group/row flex items-center gap-4 px-4 py-3 bg-surface-raised border border-surface-border rounded-md",children:[e.jsxDEV(c,{provider:s.provider,className:"w-6 h-6 shrink-0"},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:119,columnNumber:15},this),e.jsxDEV("div",{className:"flex-1 min-w-0",children:[e.jsxDEV("div",{className:"flex items-center gap-2",children:[e.jsxDEV("span",{className:"text-sm text-text-primary font-medium capitalize",children:s.provider},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:123,columnNumber:19},this),s.label!=="default"&&e.jsxDEV("span",{className:"text-[10px] px-1.5 py-0.5 bg-surface-sunken rounded text-text-tertiary",children:s.label},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:127,columnNumber:21},this),s.credential_type&&e.jsxDEV("span",{className:"text-[10px] px-1.5 py-0.5 bg-accent-faint rounded text-accent",children:s.credential_type},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:132,columnNumber:21},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:122,columnNumber:17},this),e.jsxDEV("div",{className:"flex items-center gap-3 mt-0.5",children:[s.email&&e.jsxDEV("span",{className:"text-xs text-text-tertiary",children:s.email},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:139,columnNumber:21},this),s.expires_at&&e.jsxDEV("span",{className:"text-xs text-text-tertiary",children:["Expires ",e.jsxDEV(E,{date:s.expires_at},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:143,columnNumber:31},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:142,columnNumber:21},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:137,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:121,columnNumber:15},this),e.jsxDEV("button",{onClick:()=>l({provider:s.provider,label:s.label}),className:"opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-status-error",title:"Revoke credential",children:e.jsxDEV(A,{className:"w-4 h-4"},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:154,columnNumber:17},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:149,columnNumber:15},this)]},`${s.provider}-${s.label}`,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:115,columnNumber:13},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:113,columnNumber:9},this),e.jsxDEV(j,{open:!!a,onClose:()=>l(null),onConfirm:x,title:"Revoke Credential",description:e.jsxDEV(e.Fragment,{children:["Revoke the"," ",e.jsxDEV("span",{className:"font-medium text-text-primary capitalize",children:a==null?void 0:a.provider},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:169,columnNumber:13},this),(a==null?void 0:a.label)!=="default"&&e.jsxDEV(e.Fragment,{children:[" (",a==null?void 0:a.label,")"]},void 0,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:173,columnNumber:15},this)," ","credential? Tools will no longer be able to use this credential."]},void 0,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:167,columnNumber:11},this),isPending:i.isPending,error:i.error},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:161,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:49,columnNumber:5},this)}export{z as CredentialsPage};
|
|
2
|
-
//# sourceMappingURL=CredentialsPage-DJablIbs.js.map
|