@hotmeshio/long-tail 0.1.4 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/build/examples/seed.js +1 -1
- package/build/examples/workflows/basic-echo/activities.d.ts +2 -2
- package/build/examples/workflows/basic-echo/activities.js +7 -7
- package/build/examples/workflows/basic-echo/index.js +1 -1
- package/build/examples/workflows/kitchen-sink/index.js +2 -2
- package/build/index.d.ts +11 -10
- package/build/index.js +13 -12
- package/build/lib/db/index.d.ts +18 -0
- package/build/{services → lib}/db/index.js +9 -0
- package/build/{services → lib}/db/migrate.js +3 -3
- package/build/{services → lib}/telemetry/honeycomb.d.ts +2 -2
- package/build/{services → lib}/telemetry/honeycomb.js +2 -2
- package/build/modules/defaults.d.ts +2 -0
- package/build/modules/defaults.js +3 -1
- package/build/routes/controlplane.js +1 -1
- package/build/routes/dba.js +4 -0
- package/build/routes/docs.d.ts +2 -0
- package/build/routes/docs.js +87 -0
- package/build/routes/escalations/bulk.js +120 -202
- package/build/routes/escalations/resolve.js +1 -1
- package/build/routes/escalations/single.js +1 -1
- package/build/routes/files.js +1 -1
- package/build/routes/index.js +2 -0
- package/build/routes/insight.js +2 -1
- package/build/routes/mcp.js +3 -2
- package/build/routes/oauth.js +1 -1
- package/build/routes/settings.js +4 -4
- package/build/routes/workflows/discovery.js +3 -3
- package/build/routes/workflows/invocation.js +1 -1
- package/build/routes/yaml-workflows/crud.js +1 -1
- package/build/routes/yaml-workflows/deployment.js +25 -0
- package/build/services/auth/bot-api-key.js +1 -1
- package/build/services/auth/index.d.ts +4 -0
- package/build/services/auth/index.js +17 -0
- package/build/services/auth/service-token.js +1 -1
- package/build/services/config/provider.js +1 -1
- package/build/services/config/read.js +1 -1
- package/build/services/config/write.js +1 -1
- package/build/services/controlplane/index.js +3 -4
- package/build/services/controlplane/quorum-bridge.js +2 -2
- package/build/services/cron/index.js +4 -5
- package/build/services/dba.d.ts +4 -0
- package/build/services/dba.js +3 -6
- package/build/services/escalation/bulk.js +1 -1
- package/build/services/escalation/crud.js +1 -1
- package/build/services/escalation/queries.js +1 -1
- package/build/services/export/client.js +2 -5
- package/build/services/export/index.js +14 -2
- package/build/services/hotmesh-utils.js +1 -1
- package/build/services/iam/bots.js +6 -12
- package/build/services/iam/context.d.ts +1 -1
- package/build/services/iam/context.js +5 -5
- package/build/services/iam/credentials.js +1 -1
- package/build/services/iam/ephemeral.js +8 -15
- package/build/services/iam/principal.js +3 -10
- package/build/services/iam/resolve.js +1 -1
- package/build/services/iam/sql.d.ts +10 -0
- package/build/services/iam/sql.js +42 -0
- package/build/services/insight/index.d.ts +1 -0
- package/build/services/insight/index.js +4 -6
- package/build/services/interceptor/activities/escalation.js +1 -1
- package/build/services/interceptor/activities/task.js +9 -6
- package/build/services/interceptor/activities/workflow.js +4 -5
- package/build/services/interceptor/activity-interceptor.d.ts +1 -1
- package/build/services/interceptor/activity-interceptor.js +5 -5
- package/build/services/interceptor/completion.js +1 -1
- package/build/services/interceptor/escalation.js +1 -1
- package/build/services/interceptor/index.js +4 -4
- package/build/services/interceptor/lifecycle.js +1 -1
- package/build/services/maintenance/index.js +4 -5
- package/build/services/mcp/adapter.js +1 -16
- package/build/services/mcp/client/connection.d.ts +1 -1
- package/build/services/mcp/client/connection.js +2 -2
- package/build/services/mcp/client/tools.js +1 -1
- package/build/services/mcp/db-server/index.js +1 -1
- package/build/services/mcp/db-server/tools.js +17 -4
- package/build/services/mcp/db.js +1 -1
- package/build/services/mcp/playwright-server/index.js +1 -1
- package/build/services/mcp/playwright-server/lifecycle.js +1 -1
- package/build/services/mcp/playwright-server/schemas.d.ts +2 -2
- package/build/services/mcp/playwright-server/tools.js +1 -1
- package/build/services/mcp/server.js +1 -1
- package/build/services/mcp/sql.d.ts +6 -0
- package/build/services/mcp/sql.js +34 -1
- package/build/services/mcp/workflow-compiler-server.js +1 -1
- package/build/services/mcp/workflow-server.js +1 -1
- package/build/services/mcp-runs/execution-builder.js +8 -6
- package/build/services/mcp-runs/queries.js +2 -2
- package/build/services/mcp-runs/sql.d.ts +4 -1
- package/build/services/mcp-runs/sql.js +23 -2
- package/build/services/namespace/index.js +1 -1
- package/build/services/oauth/db.js +9 -37
- package/build/services/oauth/index.js +1 -1
- package/build/services/oauth/providers/registry.js +1 -1
- package/build/services/oauth/sql.d.ts +7 -0
- package/build/services/oauth/sql.js +32 -0
- package/build/services/orchestrator/index.js +3 -3
- package/build/services/role/index.js +1 -1
- package/build/services/task/crud.js +1 -1
- package/build/services/task/process.js +1 -1
- package/build/services/task/resolve.js +1 -1
- package/build/services/user/auth.js +1 -1
- package/build/services/user/crud.js +1 -1
- package/build/services/user/rbac.js +1 -1
- package/build/services/user/roles.js +1 -1
- package/build/services/user/sql.d.ts +2 -0
- package/build/services/user/sql.js +3 -1
- package/build/services/yaml-workflow/db-utils.js +1 -1
- package/build/services/yaml-workflow/db.js +1 -1
- package/build/services/yaml-workflow/deployer-helpers.js +1 -1
- package/build/services/yaml-workflow/deployer.js +4 -4
- package/build/services/yaml-workflow/generator.js +1 -1
- package/build/services/yaml-workflow/input-analyzer-helpers.d.ts +6 -0
- package/build/services/yaml-workflow/input-analyzer-helpers.js +36 -7
- package/build/services/yaml-workflow/input-analyzer.js +16 -3
- package/build/services/yaml-workflow/pipeline/analyze.js +1 -1
- package/build/services/yaml-workflow/pipeline/build/dag.js +10 -5
- package/build/services/yaml-workflow/pipeline/compile/llm-call.js +1 -1
- package/build/services/yaml-workflow/pipeline/extract.js +5 -3
- package/build/services/yaml-workflow/pipeline/index.d.ts +5 -0
- package/build/services/yaml-workflow/pipeline/index.js +22 -0
- package/build/services/yaml-workflow/pipeline/validate.js +2 -2
- package/build/services/yaml-workflow/workers/callbacks.js +1 -1
- package/build/services/yaml-workflow/workers/events.js +2 -2
- package/build/services/yaml-workflow/workers/register.js +8 -8
- package/build/start/adapters.js +7 -7
- package/build/start/index.js +4 -4
- package/build/start/server.js +1 -1
- package/build/start/workers.d.ts +1 -2
- package/build/start/workers.js +8 -7
- package/build/system/activities/claude-code.js +1 -1
- package/build/system/activities/file-storage.js +1 -1
- package/build/system/activities/knowledge.d.ts +58 -0
- package/build/system/activities/knowledge.js +128 -0
- package/build/system/activities/sql.d.ts +9 -0
- package/build/system/activities/sql.js +41 -0
- package/build/system/activities/triage/context.js +1 -1
- package/build/system/activities/triage/discovery.d.ts +2 -14
- package/build/system/activities/triage/discovery.js +5 -161
- package/build/system/activities/triage/llm.d.ts +1 -8
- package/build/system/activities/triage/llm.js +2 -28
- package/build/system/activities/triage/tools.d.ts +1 -17
- package/build/system/activities/triage/tools.js +8 -167
- package/build/system/index.js +5 -4
- package/build/system/mcp-servers/admin/escalations.d.ts +5 -0
- package/build/system/mcp-servers/admin/escalations.js +149 -0
- package/build/system/mcp-servers/admin/index.d.ts +31 -0
- package/build/system/mcp-servers/admin/index.js +80 -0
- package/build/system/mcp-servers/admin/maintenance.d.ts +5 -0
- package/build/system/mcp-servers/admin/maintenance.js +58 -0
- package/build/system/mcp-servers/admin/mcp-servers.d.ts +5 -0
- package/build/system/mcp-servers/admin/mcp-servers.js +146 -0
- package/build/system/mcp-servers/admin/schemas.d.ts +411 -0
- package/build/system/mcp-servers/admin/schemas.js +177 -0
- package/build/system/mcp-servers/admin/tasks.d.ts +5 -0
- package/build/system/mcp-servers/admin/tasks.js +112 -0
- package/build/system/mcp-servers/admin/users.d.ts +5 -0
- package/build/system/mcp-servers/admin/users.js +167 -0
- package/build/system/mcp-servers/admin/workflow-config.d.ts +9 -0
- package/build/system/mcp-servers/admin/workflow-config.js +118 -0
- package/build/system/mcp-servers/admin/workflows.d.ts +6 -0
- package/build/system/mcp-servers/admin/workflows.js +138 -0
- package/build/system/mcp-servers/admin/yaml-workflows.d.ts +8 -0
- package/build/system/mcp-servers/admin/yaml-workflows.js +237 -0
- package/build/system/mcp-servers/claude-code.js +1 -1
- package/build/system/mcp-servers/db-query/index.js +1 -1
- package/build/system/mcp-servers/db-query/tools.js +17 -4
- package/build/system/mcp-servers/docs.d.ts +5 -0
- package/build/system/mcp-servers/docs.js +147 -0
- package/build/system/mcp-servers/file-storage.js +1 -1
- package/build/system/mcp-servers/http-fetch.js +1 -1
- package/build/system/mcp-servers/human-queue.js +1 -1
- package/build/system/mcp-servers/knowledge.d.ts +4 -0
- package/build/system/mcp-servers/knowledge.js +137 -0
- package/build/system/mcp-servers/oauth.js +1 -1
- package/build/system/mcp-servers/playwright/browser-lifecycle.js +1 -1
- package/build/system/mcp-servers/playwright/index.js +1 -1
- package/build/system/mcp-servers/playwright/schemas.d.ts +19 -8
- package/build/system/mcp-servers/playwright/schemas.js +3 -0
- package/build/system/mcp-servers/playwright/tools-navigation.js +22 -9
- package/build/system/mcp-servers/playwright/tools-run-script.js +20 -3
- package/build/system/mcp-servers/playwright/vision-helper.d.ts +12 -0
- package/build/system/mcp-servers/playwright/vision-helper.js +81 -0
- package/build/system/mcp-servers/playwright-cli/helpers.js +2 -2
- package/build/system/mcp-servers/playwright-cli/index.js +1 -1
- package/build/system/mcp-servers/playwright-cli/schemas.d.ts +28 -28
- package/build/system/mcp-servers/playwright-cli/schemas.js +1 -1
- package/build/system/mcp-servers/playwright-cli/tools-auth.js +1 -1
- package/build/system/mcp-servers/playwright-cli/tools-capture.js +4 -2
- package/build/system/mcp-servers/translation.d.ts +14 -0
- package/build/system/mcp-servers/translation.js +130 -0
- package/build/system/mcp-servers/vision-prompts.d.ts +2 -0
- package/build/system/mcp-servers/vision-prompts.js +9 -0
- package/build/system/mcp-servers/{document-vision.d.ts → vision.d.ts} +3 -4
- package/build/system/mcp-servers/vision.js +221 -0
- package/build/system/mcp-servers/workflow-compiler.js +1 -1
- package/build/system/mcp-servers/workflow.js +1 -1
- package/build/system/seed/index.js +13 -2
- package/build/system/seed/server-definitions.d.ts +1954 -322
- package/build/system/seed/server-definitions.js +65 -34
- package/build/system/seed/tool-manifests-admin.d.ts +1645 -0
- package/build/system/seed/tool-manifests-admin.js +45 -0
- package/build/system/seed/tool-manifests-browser.d.ts +1 -1
- package/build/system/seed/tool-manifests-browser.js +3 -3
- package/build/system/seed/tool-manifests-data.d.ts +62 -21
- package/build/system/seed/tool-manifests-data.js +55 -17
- package/build/system/seed/tool-manifests-knowledge.d.ts +171 -0
- package/build/system/seed/tool-manifests-knowledge.js +94 -0
- package/build/system/workflows/mcp-deterministic/index.js +1 -1
- package/build/system/workflows/mcp-query/activities/discovery.d.ts +2 -20
- package/build/system/workflows/mcp-query/activities/discovery.js +5 -163
- package/build/system/workflows/mcp-query/activities/llm.d.ts +1 -7
- package/build/system/workflows/mcp-query/activities/llm.js +2 -27
- package/build/system/workflows/mcp-query/activities/tool-executor.d.ts +0 -4
- package/build/system/workflows/mcp-query/activities/tool-executor.js +2 -106
- package/build/system/workflows/mcp-query/activities/tool-loader.d.ts +0 -9
- package/build/system/workflows/mcp-query/activities/tool-loader.js +2 -87
- package/build/system/workflows/mcp-query/index.js +55 -5
- package/build/system/workflows/mcp-query/prompts.d.ts +1 -2
- package/build/system/workflows/mcp-query/prompts.js +5 -32
- package/build/system/workflows/mcp-query/strategy-advisors.d.ts +3 -14
- package/build/system/workflows/mcp-query/strategy-advisors.js +4 -107
- package/build/system/workflows/mcp-query/types.d.ts +2 -10
- package/build/system/workflows/mcp-query/types.js +0 -1
- package/build/system/workflows/mcp-query-router/index.js +1 -1
- package/build/system/workflows/mcp-triage/index.d.ts +2 -2
- package/build/system/workflows/mcp-triage/index.js +39 -7
- package/build/system/workflows/mcp-triage/prompts.js +7 -14
- package/build/system/workflows/mcp-triage-deterministic/index.js +1 -1
- package/build/system/workflows/mcp-triage-router/index.js +1 -1
- package/build/system/workflows/shared/discovery.d.ts +35 -0
- package/build/system/workflows/shared/discovery.js +175 -0
- package/build/system/workflows/shared/index.d.ts +7 -0
- package/build/system/workflows/shared/index.js +18 -0
- package/build/system/workflows/shared/llm-caller.d.ts +8 -0
- package/build/system/workflows/shared/llm-caller.js +31 -0
- package/build/system/workflows/shared/prompts.d.ts +2 -0
- package/build/system/workflows/shared/prompts.js +32 -0
- package/build/system/workflows/shared/strategy-advisors.d.ts +14 -0
- package/build/system/workflows/shared/strategy-advisors.js +109 -0
- package/build/system/workflows/shared/tool-executor.d.ts +11 -0
- package/build/system/workflows/shared/tool-executor.js +111 -0
- package/build/system/workflows/shared/tool-loader.d.ts +19 -0
- package/build/system/workflows/shared/tool-loader.js +94 -0
- package/build/system/workflows/shared/types.d.ts +9 -0
- package/build/system/workflows/shared/types.js +2 -0
- package/build/system/workflows/tool-result-guard.d.ts +14 -0
- package/build/system/workflows/tool-result-guard.js +78 -0
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/user.d.ts +2 -0
- package/build/vitest.config.d.ts +1 -1
- package/build/vitest.integration.config.d.ts +1 -1
- package/build/workers/index.js +2 -8
- package/dashboard/dist/assets/AdminDashboard-CTyAMUJR.js +2 -0
- package/dashboard/dist/assets/AdminDashboard-CTyAMUJR.js.map +1 -0
- package/dashboard/dist/assets/AvailableEscalationsPage-BMXV3Q4l.js +2 -0
- package/dashboard/dist/assets/AvailableEscalationsPage-BMXV3Q4l.js.map +1 -0
- package/dashboard/dist/assets/BotPicker-C51nKFEu.js +2 -0
- package/dashboard/dist/assets/{BotPicker-D6FYW1Gt.js.map → BotPicker-C51nKFEu.js.map} +1 -1
- package/dashboard/dist/assets/CollapsibleSection-BSyfd8uL.js +2 -0
- package/dashboard/dist/assets/{CollapsibleSection-Cxk4wvjT.js.map → CollapsibleSection-BSyfd8uL.js.map} +1 -1
- package/dashboard/dist/assets/ConfirmDeleteModal-CBdhia5T.js +2 -0
- package/dashboard/dist/assets/{ConfirmDeleteModal-FSXyKjaB.js.map → ConfirmDeleteModal-CBdhia5T.js.map} +1 -1
- package/dashboard/dist/assets/CopyableId-dGlewBCS.js +2 -0
- package/dashboard/dist/assets/{CopyableId-CBdxWfp8.js.map → CopyableId-dGlewBCS.js.map} +1 -1
- package/dashboard/dist/assets/CredentialsPage-CoBNFSAu.js +2 -0
- package/dashboard/dist/assets/{CredentialsPage-Ikzsot0w.js.map → CredentialsPage-CoBNFSAu.js.map} +1 -1
- package/dashboard/dist/assets/CustomDurationPicker-BataWFj8.js +2 -0
- package/dashboard/dist/assets/{CustomDurationPicker-CAninCbl.js.map → CustomDurationPicker-BataWFj8.js.map} +1 -1
- package/dashboard/dist/assets/DataTable-B3uf5CCo.js +2 -0
- package/dashboard/dist/assets/DataTable-B3uf5CCo.js.map +1 -0
- package/dashboard/dist/assets/ElapsedCell-G5oSwTpT.js +2 -0
- package/dashboard/dist/assets/ElapsedCell-G5oSwTpT.js.map +1 -0
- package/dashboard/dist/assets/EmptyState-BChBJNGS.js +2 -0
- package/dashboard/dist/assets/{EmptyState-2CmV-IaS.js.map → EmptyState-BChBJNGS.js.map} +1 -1
- package/dashboard/dist/assets/EscalationsOverview-CxUv8xjG.js +2 -0
- package/dashboard/dist/assets/{EscalationsOverview-GXYFPASS.js.map → EscalationsOverview-CxUv8xjG.js.map} +1 -1
- package/dashboard/dist/assets/EventTable-CVt8B0BZ.js +2 -0
- package/dashboard/dist/assets/{EventTable-B01oJf6Y.js.map → EventTable-CVt8B0BZ.js.map} +1 -1
- package/dashboard/dist/assets/FilterBar-CShf0oe7.js +2 -0
- package/dashboard/dist/assets/{FilterBar-Ck4K4rzu.js.map → FilterBar-CShf0oe7.js.map} +1 -1
- package/dashboard/dist/assets/McpOverview-CbaZRnJl.js +2 -0
- package/dashboard/dist/assets/{McpOverview-JkvRcX2e.js.map → McpOverview-CbaZRnJl.js.map} +1 -1
- package/dashboard/dist/assets/McpQueryDetailPage-CGoR9XK6.js +5 -0
- package/dashboard/dist/assets/McpQueryDetailPage-CGoR9XK6.js.map +1 -0
- package/dashboard/dist/assets/McpQueryPage-BjXoYQuU.js +2 -0
- package/dashboard/dist/assets/McpQueryPage-BjXoYQuU.js.map +1 -0
- package/dashboard/dist/assets/McpRunDetailPage-DLkA5Aar.js +2 -0
- package/dashboard/dist/assets/McpRunDetailPage-DLkA5Aar.js.map +1 -0
- package/dashboard/dist/assets/McpRunsPage-DCh9n11D.js +2 -0
- package/dashboard/dist/assets/McpRunsPage-DCh9n11D.js.map +1 -0
- package/dashboard/dist/assets/Modal-CI5RBPOQ.js +2 -0
- package/dashboard/dist/assets/{Modal-B4rbIVAn.js.map → Modal-CI5RBPOQ.js.map} +1 -1
- package/dashboard/dist/assets/OperatorDashboard-Dc80suXd.js +2 -0
- package/dashboard/dist/assets/OperatorDashboard-Dc80suXd.js.map +1 -0
- package/dashboard/dist/assets/PageHeader-SMD9qtOO.js +2 -0
- package/dashboard/dist/assets/PageHeader-SMD9qtOO.js.map +1 -0
- package/dashboard/dist/assets/PageHeaderWithStats-TikLQsTp.js +2 -0
- package/dashboard/dist/assets/PageHeaderWithStats-TikLQsTp.js.map +1 -0
- package/dashboard/dist/assets/PriorityBadge-CQ0EsLTA.js +2 -0
- package/dashboard/dist/assets/{PriorityBadge-DfQY9St9.js.map → PriorityBadge-CQ0EsLTA.js.map} +1 -1
- package/dashboard/dist/assets/ProcessDetailPage-B2GKuGzk.js +2 -0
- package/dashboard/dist/assets/ProcessDetailPage-B2GKuGzk.js.map +1 -0
- package/dashboard/dist/assets/ProcessesListPage-CTjI3Wn6.js +2 -0
- package/dashboard/dist/assets/ProcessesListPage-CTjI3Wn6.js.map +1 -0
- package/dashboard/dist/assets/RefreshButton-BcQDObrv.js +2 -0
- package/dashboard/dist/assets/RefreshButton-BcQDObrv.js.map +1 -0
- package/dashboard/dist/assets/RolePill-Crj4TH5p.js +2 -0
- package/dashboard/dist/assets/{RolePill-BTPa8L-P.js.map → RolePill-Crj4TH5p.js.map} +1 -1
- package/dashboard/dist/assets/RolesPage-C_RInUwS.js +2 -0
- package/dashboard/dist/assets/RolesPage-C_RInUwS.js.map +1 -0
- package/dashboard/dist/assets/RowActions-Cp5HyK_w.js +2 -0
- package/dashboard/dist/assets/{RowActions-Dg-Fsm5O.js.map → RowActions-Cp5HyK_w.js.map} +1 -1
- package/dashboard/dist/assets/RunAsSelector-BhyWtofX.js +2 -0
- package/dashboard/dist/assets/RunAsSelector-BhyWtofX.js.map +1 -0
- package/dashboard/dist/assets/StatCard-BKZLSgNV.js +2 -0
- package/dashboard/dist/assets/{StatCard-DlgF0CJC.js.map → StatCard-BKZLSgNV.js.map} +1 -1
- package/dashboard/dist/assets/StatusBadge-BYNGGZK5.js +2 -0
- package/dashboard/dist/assets/StatusBadge-BYNGGZK5.js.map +1 -0
- package/dashboard/dist/assets/StickyPagination-CTosgiU2.js +2 -0
- package/dashboard/dist/assets/{StickyPagination-F9FZsRy9.js.map → StickyPagination-CTosgiU2.js.map} +1 -1
- package/dashboard/dist/assets/SwimlaneTimeline-ylG5Ps1s.js +2 -0
- package/dashboard/dist/assets/SwimlaneTimeline-ylG5Ps1s.js.map +1 -0
- package/dashboard/dist/assets/TaskDetailPage-C9pDGdD2.js +2 -0
- package/dashboard/dist/assets/TaskDetailPage-C9pDGdD2.js.map +1 -0
- package/dashboard/dist/assets/TaskQueuePill-BtJbZTT0.js +2 -0
- package/dashboard/dist/assets/{TaskQueuePill-awmtb0qw.js.map → TaskQueuePill-BtJbZTT0.js.map} +1 -1
- package/dashboard/dist/assets/TasksListPage-DtFLUEhg.js +2 -0
- package/dashboard/dist/assets/{TasksListPage-C_QF23c1.js.map → TasksListPage-DtFLUEhg.js.map} +1 -1
- package/dashboard/dist/assets/TimeAgo-WuM6xImZ.js +2 -0
- package/dashboard/dist/assets/TimeAgo-WuM6xImZ.js.map +1 -0
- package/dashboard/dist/assets/TimestampCell-IVL_-Upy.js +2 -0
- package/dashboard/dist/assets/TimestampCell-IVL_-Upy.js.map +1 -0
- package/dashboard/dist/assets/UserName-DU9qeg13.js +2 -0
- package/dashboard/dist/assets/{UserName-DaP4YAKr.js.map → UserName-DU9qeg13.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowExecutionPage-DOocX81f.js +2 -0
- package/dashboard/dist/assets/WorkflowExecutionPage-DOocX81f.js.map +1 -0
- package/dashboard/dist/assets/WorkflowPill-Diw8iWBP.js +2 -0
- package/dashboard/dist/assets/WorkflowPill-Diw8iWBP.js.map +1 -0
- package/dashboard/dist/assets/WorkflowsDashboard-DDtUIrTy.js +2 -0
- package/dashboard/dist/assets/WorkflowsDashboard-DDtUIrTy.js.map +1 -0
- package/dashboard/dist/assets/WorkflowsOverview-CPuvA4t3.js +2 -0
- package/dashboard/dist/assets/{WorkflowsOverview-D9OzzQqw.js.map → WorkflowsOverview-CPuvA4t3.js.map} +1 -1
- package/dashboard/dist/assets/YamlWorkflowsPage-DlwwkluN.js +2 -0
- package/dashboard/dist/assets/YamlWorkflowsPage-DlwwkluN.js.map +1 -0
- package/dashboard/dist/assets/{bots-BkKVMbUW.js → bots-BPiZXf2h.js} +2 -2
- package/dashboard/dist/assets/{bots-BkKVMbUW.js.map → bots-BPiZXf2h.js.map} +1 -1
- package/dashboard/dist/assets/constants-BHkpVaqx.js +2 -0
- package/dashboard/dist/assets/constants-BHkpVaqx.js.map +1 -0
- package/dashboard/dist/assets/escalation-DTY_OKRh.js +2 -0
- package/dashboard/dist/assets/escalation-DTY_OKRh.js.map +1 -0
- package/dashboard/dist/assets/escalation-columns-C91fHSkp.js +2 -0
- package/dashboard/dist/assets/{escalation-columns-D6aqStaY.js.map → escalation-columns-C91fHSkp.js.map} +1 -1
- package/dashboard/dist/assets/helpers-DBUZ9pnG.js +2 -0
- package/dashboard/dist/assets/helpers-DBUZ9pnG.js.map +1 -0
- package/dashboard/dist/assets/index-BOeA-gfK.js +17 -0
- package/dashboard/dist/assets/{index-X85K5bHC.js.map → index-BOeA-gfK.js.map} +1 -1
- package/dashboard/dist/assets/index-BZ6K_kmL.js +3 -0
- package/dashboard/dist/assets/index-BZ6K_kmL.js.map +1 -0
- package/dashboard/dist/assets/index-Bpm0yeoi.js +2 -0
- package/dashboard/dist/assets/index-Bpm0yeoi.js.map +1 -0
- package/dashboard/dist/assets/index-BtOwLI0K.js +2 -0
- package/dashboard/dist/assets/{index-DTPzZr_X.js.map → index-BtOwLI0K.js.map} +1 -1
- package/dashboard/dist/assets/index-CBF3ZvRZ.js +6 -0
- package/dashboard/dist/assets/index-CBF3ZvRZ.js.map +1 -0
- package/dashboard/dist/assets/index-CDWOfCmi.js +2 -0
- package/dashboard/dist/assets/index-CDWOfCmi.js.map +1 -0
- package/dashboard/dist/assets/index-Ce6sL__n.js +2 -0
- package/dashboard/dist/assets/index-Ce6sL__n.js.map +1 -0
- package/dashboard/dist/assets/index-DSzSoku1.js +283 -0
- package/dashboard/dist/assets/index-DSzSoku1.js.map +1 -0
- package/dashboard/dist/assets/index-D_qEAYrg.js +2 -0
- package/dashboard/dist/assets/index-D_qEAYrg.js.map +1 -0
- package/dashboard/dist/assets/index-gCy9XX3W.css +1 -0
- package/dashboard/dist/assets/mcp-BzVpaaKF.js +2 -0
- package/dashboard/dist/assets/{mcp-blCW6IL7.js.map → mcp-BzVpaaKF.js.map} +1 -1
- package/dashboard/dist/assets/mcp-query-wTuxTTCV.js +2 -0
- package/dashboard/dist/assets/mcp-query-wTuxTTCV.js.map +1 -0
- package/dashboard/dist/assets/{mcp-runs-ChPbpvXK.js → mcp-runs-DmXYJD19.js} +2 -2
- package/dashboard/dist/assets/{mcp-runs-ChPbpvXK.js.map → mcp-runs-DmXYJD19.js.map} +1 -1
- package/dashboard/dist/assets/namespaces-DoGa7jc7.js +2 -0
- package/dashboard/dist/assets/{namespaces-BgbaC3ow.js.map → namespaces-DoGa7jc7.js.map} +1 -1
- package/dashboard/dist/assets/{roles-ZNrqqnQl.js → roles-wCdQ2Z7k.js} +2 -2
- package/dashboard/dist/assets/{roles-ZNrqqnQl.js.map → roles-wCdQ2Z7k.js.map} +1 -1
- package/dashboard/dist/assets/settings-DDe_L7JT.js +2 -0
- package/dashboard/dist/assets/{settings-eBRSE0mQ.js.map → settings-DDe_L7JT.js.map} +1 -1
- package/dashboard/dist/assets/tasks-3Hih8Bt7.js +2 -0
- package/dashboard/dist/assets/{tasks-tRqClPns.js.map → tasks-3Hih8Bt7.js.map} +1 -1
- package/dashboard/dist/assets/{useFilterParams-BaXUAkYK.js → useFilterParams-BUyLHcx_.js} +2 -2
- package/dashboard/dist/assets/{useFilterParams-BaXUAkYK.js.map → useFilterParams-BUyLHcx_.js.map} +1 -1
- package/dashboard/dist/assets/{useNatsEvents-Xr43X1fG.js → useNatsEvents-DeGKHFTX.js} +2 -2
- package/dashboard/dist/assets/{useNatsEvents-Xr43X1fG.js.map → useNatsEvents-DeGKHFTX.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-BO51u8tm.js → useYamlActivityEvents-B5dHec6Y.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-BO51u8tm.js.map → useYamlActivityEvents-B5dHec6Y.js.map} +1 -1
- package/dashboard/dist/assets/{users-tMvNyOo8.js → users-BTagPmGW.js} +2 -2
- package/dashboard/dist/assets/{users-tMvNyOo8.js.map → users-BTagPmGW.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-ZTAKVwGc.js → vendor-icons-DCLlGYO9.js} +112 -57
- package/dashboard/dist/assets/vendor-icons-DCLlGYO9.js.map +1 -0
- package/dashboard/dist/assets/vendor-query-DLp59M9_.js +35 -0
- package/dashboard/dist/assets/vendor-query-DLp59M9_.js.map +1 -0
- package/dashboard/dist/assets/vendor-react-Co3Y8ikm.js +26 -0
- package/dashboard/dist/assets/vendor-react-Co3Y8ikm.js.map +1 -0
- package/dashboard/dist/assets/{workflows-Cc4VHcrp.js → workflows-B20dR3NE.js} +2 -2
- package/dashboard/dist/assets/{workflows-Cc4VHcrp.js.map → workflows-B20dR3NE.js.map} +1 -1
- package/dashboard/dist/assets/yaml-workflows-CaLPMQha.js +2 -0
- package/dashboard/dist/assets/yaml-workflows-CaLPMQha.js.map +1 -0
- package/dashboard/dist/index.html +5 -5
- package/docs/api/dba.md +81 -0
- package/docs/api/escalations.md +575 -0
- package/docs/api/exports.md +170 -0
- package/docs/api/maintenance.md +93 -0
- package/docs/api/mcp-runs.md +128 -0
- package/docs/api/mcp-servers.md +195 -0
- package/docs/api/namespaces.md +48 -0
- package/docs/api/roles.md +390 -0
- package/docs/api/service-accounts.md +188 -0
- package/docs/api/settings.md +33 -0
- package/docs/api/tasks.md +167 -0
- package/docs/api/users.md +180 -0
- package/docs/api/workflows.md +616 -0
- package/docs/api/yaml-workflows.md +312 -0
- package/docs/architecture.md +221 -0
- package/docs/auth.md +181 -0
- package/docs/cloud.md +272 -0
- package/docs/compilation.md +136 -0
- package/docs/contributing.md +56 -0
- package/docs/dashboard.md +145 -0
- package/docs/data.md +478 -0
- package/docs/escalation-strategies.md +264 -0
- package/docs/events.md +251 -0
- package/docs/iam.md +222 -0
- package/docs/img/01-login.png +0 -0
- package/docs/img/02-dashboard-home.png +0 -0
- package/docs/img/03-processes-list.png +0 -0
- package/docs/img/04-escalations-list.png +0 -0
- package/docs/img/05-mcp-servers.png +0 -0
- package/docs/img/06-mcp-pipelines.png +0 -0
- package/docs/img/07-workflows-list.png +0 -0
- package/docs/img/compilation/01-query-submit.png +0 -0
- package/docs/img/compilation/02-mcp-servers.png +0 -0
- package/docs/img/compilation/03-query-completed.png +0 -0
- package/docs/img/compilation/04-wizard-original.png +0 -0
- package/docs/img/compilation/05-wizard-timeline.png +0 -0
- package/docs/img/compilation/06-wizard-profile.png +0 -0
- package/docs/img/compilation/07-wizard-deploy.png +0 -0
- package/docs/img/compilation/08-wizard-test-modal.png +0 -0
- package/docs/img/compilation/09-wizard-test-compare.png +0 -0
- package/docs/img/compilation/10-wizard-verify.png +0 -0
- package/docs/logging.md +110 -0
- package/docs/maintenance.md +221 -0
- package/docs/mcp.md +715 -0
- package/docs/oauth-and-delegation.md +469 -0
- package/docs/telemetry.md +144 -0
- package/docs/workflows.md +695 -0
- package/lib/db/schemas/015_knowledge.sql +23 -0
- package/package.json +8 -9
- package/build/services/db/index.d.ts +0 -3
- package/build/services/mcp/vision-server.d.ts +0 -15
- package/build/services/mcp/vision-server.js +0 -214
- package/build/system/mcp-servers/document-vision.js +0 -228
- package/build/system/mcp-servers/prompts.d.ts +0 -4
- package/build/system/mcp-servers/prompts.js +0 -10
- package/dashboard/dist/assets/AdminDashboard-jfacvOC7.js +0 -2
- package/dashboard/dist/assets/AdminDashboard-jfacvOC7.js.map +0 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-BglLDoT8.js +0 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-BglLDoT8.js.map +0 -1
- package/dashboard/dist/assets/BotPicker-D6FYW1Gt.js +0 -2
- package/dashboard/dist/assets/CollapsibleSection-Cxk4wvjT.js +0 -2
- package/dashboard/dist/assets/ConfirmDeleteModal-FSXyKjaB.js +0 -2
- package/dashboard/dist/assets/CopyableId-CBdxWfp8.js +0 -2
- package/dashboard/dist/assets/CredentialsPage-Ikzsot0w.js +0 -2
- package/dashboard/dist/assets/CustomDurationPicker-CAninCbl.js +0 -2
- package/dashboard/dist/assets/DataTable-BDn1WBHS.js +0 -2
- package/dashboard/dist/assets/DataTable-BDn1WBHS.js.map +0 -1
- package/dashboard/dist/assets/EmptyState-2CmV-IaS.js +0 -2
- package/dashboard/dist/assets/EscalationsOverview-GXYFPASS.js +0 -2
- package/dashboard/dist/assets/EventTable-B01oJf6Y.js +0 -2
- package/dashboard/dist/assets/Field-DuFBAYhu.js +0 -2
- package/dashboard/dist/assets/Field-DuFBAYhu.js.map +0 -1
- package/dashboard/dist/assets/FilterBar-Ck4K4rzu.js +0 -2
- package/dashboard/dist/assets/McpOverview-JkvRcX2e.js +0 -2
- package/dashboard/dist/assets/McpQueryDetailPage-CUMqhQdS.js +0 -2
- package/dashboard/dist/assets/McpQueryDetailPage-CUMqhQdS.js.map +0 -1
- package/dashboard/dist/assets/McpQueryPage-DRRhw4nN.js +0 -2
- package/dashboard/dist/assets/McpQueryPage-DRRhw4nN.js.map +0 -1
- package/dashboard/dist/assets/McpRunDetailPage-CmPs5EvE.js +0 -2
- package/dashboard/dist/assets/McpRunDetailPage-CmPs5EvE.js.map +0 -1
- package/dashboard/dist/assets/McpRunsPage-Dl5Y2u6k.js +0 -2
- package/dashboard/dist/assets/McpRunsPage-Dl5Y2u6k.js.map +0 -1
- package/dashboard/dist/assets/Modal-B4rbIVAn.js +0 -2
- package/dashboard/dist/assets/OperatorDashboard-B56il28q.js +0 -2
- package/dashboard/dist/assets/OperatorDashboard-B56il28q.js.map +0 -1
- package/dashboard/dist/assets/PageHeader-CpWFly5S.js +0 -2
- package/dashboard/dist/assets/PageHeader-CpWFly5S.js.map +0 -1
- package/dashboard/dist/assets/PriorityBadge-DfQY9St9.js +0 -2
- package/dashboard/dist/assets/ProcessDetailPage-CMLq4M7D.js +0 -2
- package/dashboard/dist/assets/ProcessDetailPage-CMLq4M7D.js.map +0 -1
- package/dashboard/dist/assets/ProcessesListPage-CZ_HF06v.js +0 -2
- package/dashboard/dist/assets/ProcessesListPage-CZ_HF06v.js.map +0 -1
- package/dashboard/dist/assets/RolePill-BTPa8L-P.js +0 -2
- package/dashboard/dist/assets/RolesPage-9grZW7yR.js +0 -2
- package/dashboard/dist/assets/RolesPage-9grZW7yR.js.map +0 -1
- package/dashboard/dist/assets/RowActions-Dg-Fsm5O.js +0 -2
- package/dashboard/dist/assets/SimpleMarkdown-CBlvaWP4.js +0 -4
- package/dashboard/dist/assets/SimpleMarkdown-CBlvaWP4.js.map +0 -1
- package/dashboard/dist/assets/StatCard-DlgF0CJC.js +0 -2
- package/dashboard/dist/assets/StatusBadge-TlC4jiig.js +0 -2
- package/dashboard/dist/assets/StatusBadge-TlC4jiig.js.map +0 -1
- package/dashboard/dist/assets/StickyPagination-F9FZsRy9.js +0 -2
- package/dashboard/dist/assets/SwimlaneTimeline-7SiwATsZ.js +0 -2
- package/dashboard/dist/assets/SwimlaneTimeline-7SiwATsZ.js.map +0 -1
- package/dashboard/dist/assets/TaskDetailPage-CbPVTakt.js +0 -2
- package/dashboard/dist/assets/TaskDetailPage-CbPVTakt.js.map +0 -1
- package/dashboard/dist/assets/TaskQueuePill-awmtb0qw.js +0 -2
- package/dashboard/dist/assets/TasksListPage-C_QF23c1.js +0 -2
- package/dashboard/dist/assets/TimeAgo-UPG6DoH8.js +0 -2
- package/dashboard/dist/assets/TimeAgo-UPG6DoH8.js.map +0 -1
- package/dashboard/dist/assets/TimestampCell-DoWMKg6w.js +0 -2
- package/dashboard/dist/assets/TimestampCell-DoWMKg6w.js.map +0 -1
- package/dashboard/dist/assets/UserName-DaP4YAKr.js +0 -2
- package/dashboard/dist/assets/VersionHistory-Bt7WBr6m.js +0 -5
- package/dashboard/dist/assets/VersionHistory-Bt7WBr6m.js.map +0 -1
- package/dashboard/dist/assets/WorkflowExecutionPage-DjtAQ3hy.js +0 -2
- package/dashboard/dist/assets/WorkflowExecutionPage-DjtAQ3hy.js.map +0 -1
- package/dashboard/dist/assets/WorkflowPill-CCDSVaQj.js +0 -2
- package/dashboard/dist/assets/WorkflowPill-CCDSVaQj.js.map +0 -1
- package/dashboard/dist/assets/WorkflowsDashboard-D8z9uBNB.js +0 -2
- package/dashboard/dist/assets/WorkflowsDashboard-D8z9uBNB.js.map +0 -1
- package/dashboard/dist/assets/WorkflowsOverview-D9OzzQqw.js +0 -2
- package/dashboard/dist/assets/YamlWorkflowDetailPage-DrDvvP62.js +0 -3
- package/dashboard/dist/assets/YamlWorkflowDetailPage-DrDvvP62.js.map +0 -1
- package/dashboard/dist/assets/YamlWorkflowsPage-COqiNCQK.js +0 -2
- package/dashboard/dist/assets/YamlWorkflowsPage-COqiNCQK.js.map +0 -1
- package/dashboard/dist/assets/constants-CgaZfe5d.js +0 -2
- package/dashboard/dist/assets/constants-CgaZfe5d.js.map +0 -1
- package/dashboard/dist/assets/escalation-columns-D6aqStaY.js +0 -2
- package/dashboard/dist/assets/escalation-qalymbKB.js +0 -2
- package/dashboard/dist/assets/escalation-qalymbKB.js.map +0 -1
- package/dashboard/dist/assets/format-gXZXQ-HJ.js +0 -2
- package/dashboard/dist/assets/format-gXZXQ-HJ.js.map +0 -1
- package/dashboard/dist/assets/helpers-0gSleuzT.js +0 -2
- package/dashboard/dist/assets/helpers-0gSleuzT.js.map +0 -1
- package/dashboard/dist/assets/index-BWvMHed7.js +0 -6
- package/dashboard/dist/assets/index-BWvMHed7.js.map +0 -1
- package/dashboard/dist/assets/index-BaszoPO_.css +0 -1
- package/dashboard/dist/assets/index-Cn2jyj9A.js +0 -2
- package/dashboard/dist/assets/index-Cn2jyj9A.js.map +0 -1
- package/dashboard/dist/assets/index-D8VH6K8B.js +0 -54
- package/dashboard/dist/assets/index-D8VH6K8B.js.map +0 -1
- package/dashboard/dist/assets/index-D9SYwJsi.js +0 -3
- package/dashboard/dist/assets/index-D9SYwJsi.js.map +0 -1
- package/dashboard/dist/assets/index-DTPzZr_X.js +0 -2
- package/dashboard/dist/assets/index-D_6AB5BE.js +0 -2
- package/dashboard/dist/assets/index-D_6AB5BE.js.map +0 -1
- package/dashboard/dist/assets/index-S9Ks2Lj2.js +0 -2
- package/dashboard/dist/assets/index-S9Ks2Lj2.js.map +0 -1
- package/dashboard/dist/assets/index-X85K5bHC.js +0 -17
- package/dashboard/dist/assets/index-rjmgHlSH.js +0 -2
- package/dashboard/dist/assets/index-rjmgHlSH.js.map +0 -1
- package/dashboard/dist/assets/mcp-blCW6IL7.js +0 -2
- package/dashboard/dist/assets/mcp-query-DoAyPbjC.js +0 -2
- package/dashboard/dist/assets/mcp-query-DoAyPbjC.js.map +0 -1
- package/dashboard/dist/assets/namespaces-BgbaC3ow.js +0 -2
- package/dashboard/dist/assets/settings-eBRSE0mQ.js +0 -2
- package/dashboard/dist/assets/tasks-tRqClPns.js +0 -2
- package/dashboard/dist/assets/vendor-icons-ZTAKVwGc.js.map +0 -1
- package/dashboard/dist/assets/vendor-query-B2UbickB.js +0 -18
- package/dashboard/dist/assets/vendor-query-B2UbickB.js.map +0 -1
- package/dashboard/dist/assets/vendor-react-Cw8Gy8NJ.js +0 -22
- package/dashboard/dist/assets/vendor-react-Cw8Gy8NJ.js.map +0 -1
- package/dashboard/dist/assets/yaml-workflows-BL4V5CQy.js +0 -2
- package/dashboard/dist/assets/yaml-workflows-BL4V5CQy.js.map +0 -1
- /package/build/{services → lib}/db/migrate.d.ts +0 -0
- /package/build/{services → lib}/events/index.d.ts +0 -0
- /package/build/{services → lib}/events/index.js +0 -0
- /package/build/{services → lib}/events/memory.d.ts +0 -0
- /package/build/{services → lib}/events/memory.js +0 -0
- /package/build/{services → lib}/events/nats.d.ts +0 -0
- /package/build/{services → lib}/events/nats.js +0 -0
- /package/build/{services → lib}/events/publish.d.ts +0 -0
- /package/build/{services → lib}/events/publish.js +0 -0
- /package/build/{services → lib}/events/socketio.d.ts +0 -0
- /package/build/{services → lib}/events/socketio.js +0 -0
- /package/build/{services → lib}/logger/index.d.ts +0 -0
- /package/build/{services → lib}/logger/index.js +0 -0
- /package/build/{services → lib}/logger/pino.d.ts +0 -0
- /package/build/{services → lib}/logger/pino.js +0 -0
- /package/build/{services → lib}/storage/index.d.ts +0 -0
- /package/build/{services → lib}/storage/index.js +0 -0
- /package/build/{services → lib}/storage/local.d.ts +0 -0
- /package/build/{services → lib}/storage/local.js +0 -0
- /package/build/{services → lib}/storage/s3.d.ts +0 -0
- /package/build/{services → lib}/storage/s3.js +0 -0
- /package/build/{services → lib}/storage/types.d.ts +0 -0
- /package/build/{services → lib}/storage/types.js +0 -0
- /package/build/{services → lib}/telemetry/index.d.ts +0 -0
- /package/build/{services → lib}/telemetry/index.js +0 -0
- /package/{services → lib}/db/README.md +0 -0
- /package/{services → lib}/db/schemas/001_schema.sql +0 -0
- /package/{services → lib}/db/schemas/002_seed.sql +0 -0
- /package/{services → lib}/db/schemas/003_workflow_discovery.sql +0 -0
- /package/{services → lib}/db/schemas/004_query_router.sql +0 -0
- /package/{services → lib}/db/schemas/005_triage_router.sql +0 -0
- /package/{services → lib}/db/schemas/006_oauth.sql +0 -0
- /package/{services → lib}/db/schemas/007_security.sql +0 -0
- /package/{services → lib}/db/schemas/008_bot_accounts.sql +0 -0
- /package/{services → lib}/db/schemas/009_audit_trail.sql +0 -0
- /package/{services → lib}/db/schemas/010_credential_providers.sql +0 -0
- /package/{services → lib}/db/schemas/011_system_workflow_configs.sql +0 -0
- /package/{services → lib}/db/schemas/012_drop_modality.sql +0 -0
- /package/{services → lib}/db/schemas/013_execute_as.sql +0 -0
- /package/{services → lib}/db/schemas/014_ephemeral_credentials.sql +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"YamlWorkflowDetailPage-DrDvvP62.js","sources":["../../src/pages/workflows/yaml-workflow-detail/PipelineStrip.tsx","../../src/pages/workflows/yaml-workflow-detail/InvokeResultView.tsx","../../src/pages/workflows/yaml-workflow-detail/InvokeSection.tsx","../../src/pages/workflows/yaml-workflow-detail/YamlWorkflowDetailPage.tsx"],"sourcesContent":["import { Link } from 'react-router-dom';\nimport { JsonViewer } from '../../../components/common/data/JsonViewer';\nimport type { ActivityManifestEntry } from '../../../api/types/yaml-workflows';\nimport { sourceLabel, sourceColor } from './helpers';\n\nexport function PipelineStrip({ activities, selectedIdx, onSelect }: {\n activities: ActivityManifestEntry[]; selectedIdx: number; onSelect: (i: number) => void;\n}) {\n return (\n <div className=\"flex items-center gap-1 overflow-x-auto pb-2\">\n {activities.map((a, idx) => {\n const isSelected = idx === selectedIdx;\n return (\n <div key={a.activity_id} className=\"flex items-center shrink-0\">\n {idx > 0 && (\n <div className=\"w-4 h-px bg-surface-border mx-0.5\" />\n )}\n <button\n type=\"button\"\n onClick={() => onSelect(idx)}\n className=\"flex items-center gap-1.5 cursor-pointer\"\n >\n <span\n className={`w-5 h-5 rounded-full text-[10px] font-semibold flex items-center justify-center shrink-0 transition-colors ${\n isSelected\n ? 'bg-accent text-text-inverse'\n : 'bg-surface-sunken text-text-tertiary hover:bg-accent-muted hover:text-accent'\n }`}\n >\n {idx + 1}\n </span>\n <span\n className={`text-[10px] font-semibold uppercase tracking-wider whitespace-nowrap transition-colors ${\n isSelected ? 'text-text-primary' : 'text-text-tertiary hover:text-text-primary'\n }`}\n >\n {a.title}\n </span>\n </button>\n </div>\n );\n })}\n </div>\n );\n}\n\nexport function StepDetail({ activity }: { activity: ActivityManifestEntry }) {\n const hasInputs = Object.keys(activity.input_mappings).length > 0;\n const hasOutputs = activity.output_fields.length > 0;\n const isLlm = activity.tool_source === 'llm';\n\n const serverId = activity.mcp_server_id || (activity.tool_source === 'db' ? 'db' : '');\n const toolDisplay = !isLlm && activity.mcp_tool_name\n ? `${serverId}/${activity.mcp_tool_name}`\n : null;\n const toolIsLinkable = !isLlm && activity.mcp_tool_name && serverId;\n\n return (\n <div className=\"pt-2 space-y-6\">\n {/* Header */}\n <div className=\"flex items-center gap-3\">\n <h4 className=\"text-base font-medium text-text-primary\">{activity.title}</h4>\n <span className={`text-[10px] px-2 py-0.5 rounded-full font-medium ${sourceColor(activity.tool_source)}`}>\n {sourceLabel(activity.tool_source)}\n </span>\n </div>\n\n {/* Identity */}\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-x-10 gap-y-4\">\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">Mapped Workflow Topic</p>\n <p className=\"text-sm font-mono text-text-primary\">{activity.topic}</p>\n </div>\n {toolDisplay && (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">Tool</p>\n {toolIsLinkable ? (\n <Link\n to={`/mcp/servers?search=${encodeURIComponent(activity.mcp_tool_name!)}`}\n className=\"text-sm font-mono text-accent hover:underline\"\n >\n {toolDisplay}\n </Link>\n ) : (\n <p className=\"text-sm font-mono text-text-primary\">{toolDisplay}</p>\n )}\n </div>\n )}\n {isLlm && (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">Model</p>\n <p className=\"text-sm font-mono text-text-primary\">{activity.model || 'gpt-4o-mini'}</p>\n </div>\n )}\n </div>\n\n {/* Input -> Output */}\n {(hasInputs || hasOutputs) && (\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-x-6 gap-y-0\">\n {hasInputs && (\n <div className=\"border border-surface-border rounded-md p-4\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-2\">Inputs</p>\n <div className=\"space-y-1.5\">\n {Object.entries(activity.input_mappings).map(([k, v]) => (\n <p key={k} className=\"text-xs font-mono text-text-secondary leading-relaxed\">\n <span className=\"text-text-primary\">{k}</span>\n <span className=\"text-text-tertiary mx-1.5\">←</span>\n <span className=\"text-accent\">{v}</span>\n </p>\n ))}\n </div>\n </div>\n )}\n\n {hasOutputs && (\n <div className=\"border border-surface-border rounded-md p-4\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-2\">Outputs</p>\n <div className=\"space-y-1.5\">\n {activity.output_fields.map((f) => (\n <p key={f} className=\"text-xs font-mono text-text-secondary leading-relaxed\">{f}</p>\n ))}\n </div>\n </div>\n )}\n </div>\n )}\n\n {/* Tool Arguments -- captured from the original execution */}\n {!isLlm && activity.tool_arguments && Object.keys(activity.tool_arguments).length > 0 && (\n <JsonViewer data={activity.tool_arguments} label=\"Default Arguments\" variant=\"panel\" />\n )}\n\n {/* LLM Prompt -- special treatment */}\n {isLlm && activity.prompt_template && (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-2\">Prompt Template</p>\n <pre className=\"p-4 bg-surface-sunken rounded-lg text-xs font-mono text-text-secondary whitespace-pre-wrap leading-relaxed max-h-64 overflow-y-auto\">\n {activity.prompt_template}\n </pre>\n </div>\n )}\n </div>\n );\n}\n","import { Link } from 'react-router-dom';\nimport { Collapsible } from '../../../components/common/layout/Collapsible';\nimport { JsonViewer } from '../../../components/common/data/JsonViewer';\nimport { metadataLabels, formatMetadataValue } from './helpers';\n\nexport function InvokeResultView({ result, showMetadata, onToggleMetadata, traceUrl, namespace }: {\n result: Record<string, unknown>; showMetadata: boolean;\n onToggleMetadata: () => void; traceUrl?: string | null; namespace?: string;\n}) {\n const raw = (result as any)?.result ?? result;\n const jobId = (result as any)?.job_id as string | undefined;\n const hasEnvelope = raw?.metadata && raw?.data;\n const displayData = hasEnvelope ? raw.data : raw;\n return (\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">Result</span>\n <div className=\"flex items-center gap-3\">\n {jobId && (\n <Link\n to={`/mcp/executions/${encodeURIComponent(jobId)}?namespace=${encodeURIComponent(namespace || 'longtail')}`}\n className=\"text-[10px] text-accent hover:underline\"\n >\n View Execution Details\n </Link>\n )}\n {hasEnvelope && (\n <button type=\"button\" onClick={onToggleMetadata} className=\"text-[10px] text-accent hover:underline\">\n {showMetadata ? 'Hide metadata' : 'Show metadata'}\n </button>\n )}\n </div>\n </div>\n <Collapsible open={showMetadata && !!hasEnvelope}>\n <div className=\"bg-surface-raised border border-surface-border rounded-md p-3 mb-2\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-2\">Metadata</p>\n <div className=\"grid grid-cols-2 gap-x-6 gap-y-2\">\n {hasEnvelope && Object.entries(raw.metadata as Record<string, unknown>)\n .sort((a, b) => {\n const order = Object.keys(metadataLabels);\n return (order.indexOf(a[0]) === -1 ? 99 : order.indexOf(a[0])) - (order.indexOf(b[0]) === -1 ? 99 : order.indexOf(b[0]));\n })\n .map(([key, val]) => (\n <div key={key}>\n <p className=\"text-[10px] text-text-tertiary\">{metadataLabels[key] ?? key}</p>\n {key === 'trc' && traceUrl && val ? (\n <a href={traceUrl.replace('{traceId}', String(val))} target=\"_blank\" rel=\"noopener noreferrer\"\n className=\"text-xs font-mono text-accent hover:underline truncate block\" title={String(val)}>\n {String(val)}\n </a>\n ) : (\n <p className=\"text-xs font-mono text-text-primary truncate\" title={String(val ?? '')}>\n {formatMetadataValue(key, val)}\n </p>\n )}\n </div>\n ))}\n </div>\n </div>\n </Collapsible>\n <JsonViewer data={displayData} label=\"Data\" />\n </div>\n );\n}\n","import { useState } from 'react';\nimport { Play } from 'lucide-react';\nimport { SectionLabel } from '../../../components/common/layout/SectionLabel';\nimport { CollapsibleSection } from '../../../components/common/layout/CollapsibleSection';\nimport { InvokeResultView } from './InvokeResultView';\nimport { inferFieldType } from './helpers';\nimport type { InputFieldMeta } from '../../../api/types';\n\nexport function InvokeSection({\n wf,\n inputSchema,\n invokeFields,\n setInvokeFields,\n invokeJson,\n setInvokeJson,\n invokeJsonMode,\n setInvokeJsonMode,\n invokeResult,\n setInvokeResult,\n showMetadata,\n setShowMetadata,\n invokeMutation,\n inputFieldMeta,\n settings,\n onInvoke,\n isCollapsed,\n onToggle,\n}: {\n wf: any;\n inputSchema: any;\n invokeFields: Record<string, any>;\n setInvokeFields: (v: Record<string, any>) => void;\n invokeJson: string;\n setInvokeJson: (v: string) => void;\n invokeJsonMode: boolean;\n setInvokeJsonMode: (v: boolean) => void;\n invokeResult: Record<string, unknown> | null;\n setInvokeResult: (v: Record<string, unknown> | null) => void;\n showMetadata: boolean;\n setShowMetadata: (v: boolean) => void;\n invokeMutation: any;\n settings: any;\n inputFieldMeta?: InputFieldMeta[];\n onInvoke: () => void;\n isCollapsed: boolean;\n onToggle: (key: string) => void;\n}) {\n const inputProps = (inputSchema as any)?.properties || {};\n const allKeys = Object.keys(inputProps);\n const hasFieldMeta = inputFieldMeta && inputFieldMeta.length > 0;\n\n // When field meta is available, show only dynamic fields by default\n const [showFixedFields, setShowFixedFields] = useState(false);\n const dynamicKeys = hasFieldMeta\n ? inputFieldMeta.filter(f => f.classification === 'dynamic').map(f => f.key)\n : allKeys;\n const fixedKeys = hasFieldMeta\n ? inputFieldMeta.filter(f => f.classification === 'fixed').map(f => f.key)\n : [];\n const inputKeys = showFixedFields ? [...dynamicKeys, ...fixedKeys] : dynamicKeys;\n\n const updateField = (key: string, value: any, type: string) => {\n let parsed = value;\n if (type === 'number' || type === 'integer') parsed = value === '' ? 0 : Number(value);\n else if (type === 'boolean') parsed = value === 'true' || value === true;\n const updated = { ...invokeFields, [key]: parsed };\n setInvokeFields(updated);\n setInvokeJson(JSON.stringify(updated, null, 2));\n };\n\n return (\n <CollapsibleSection sectionKey=\"invoke\" title=\"Invoke / Try\" isCollapsed={isCollapsed} onToggle={onToggle} >\n <div className=\"space-y-4\">\n {/* Input form */}\n {!invokeResult && (\n <form className=\"space-y-4\" onSubmit={(e) => { e.preventDefault(); onInvoke(); }}>\n <div className=\"flex items-center justify-between\">\n <SectionLabel>Input</SectionLabel>\n <div className=\"flex items-center gap-3\">\n {hasFieldMeta && fixedKeys.length > 0 && !invokeJsonMode && (\n <button type=\"button\" onClick={() => setShowFixedFields(!showFixedFields)}\n className=\"text-[10px] text-text-tertiary hover:text-text-primary\">\n {showFixedFields ? `Hide ${fixedKeys.length} fixed` : `Show ${fixedKeys.length} fixed`}\n </button>\n )}\n <button type=\"button\" onClick={() => {\n if (!invokeJsonMode) setInvokeJson(JSON.stringify(invokeFields, null, 2));\n else { try { setInvokeFields(JSON.parse(invokeJson)); } catch { /* keep */ } }\n setInvokeJsonMode(!invokeJsonMode);\n }} className=\"text-[10px] text-accent hover:underline\">\n {invokeJsonMode ? 'Form view' : 'JSON view'}\n </button>\n </div>\n </div>\n\n {invokeJsonMode ? (\n <textarea value={invokeJson} onChange={(e) => setInvokeJson(e.target.value)}\n className=\"input font-mono text-[11px] w-full leading-relaxed\"\n rows={8} spellCheck={false} />\n ) : inputKeys.length > 0 ? (\n <div className=\"space-y-3\">\n {inputKeys.map((key) => {\n const prop = inputProps[key] as any;\n const fieldType = inferFieldType(prop);\n const desc = prop?.description as string | undefined;\n const jsonValue = typeof invokeFields[key] === 'string'\n ? invokeFields[key]\n : JSON.stringify(invokeFields[key] ?? (fieldType === 'array' ? [] : {}), null, 2);\n const textareaRows = Math.min(20, Math.max(4, (jsonValue?.split?.('\\n')?.length ?? 4)));\n return (\n <div key={key}>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n {key}<span className=\"ml-2 font-normal normal-case\">{fieldType}</span>\n {hasFieldMeta && fixedKeys.includes(key) && (\n <span className=\"ml-2 px-1 py-0.5 text-[8px] bg-surface-sunken rounded\">fixed</span>\n )}\n </label>\n {desc && (\n <p className=\"text-[10px] text-text-tertiary mb-1\">{desc}</p>\n )}\n {fieldType === 'boolean' ? (\n <select value={String(invokeFields[key] ?? false)} onChange={(e) => updateField(key, e.target.value, fieldType)}\n className=\"select text-xs w-full\">\n <option value=\"true\">true</option><option value=\"false\">false</option>\n </select>\n ) : fieldType === 'object' || fieldType === 'array' ? (\n <textarea\n value={jsonValue}\n onChange={(e) => { try { updateField(key, JSON.parse(e.target.value), fieldType); } catch { setInvokeFields({ ...invokeFields, [key]: e.target.value }); } }}\n className=\"input font-mono text-[11px] w-full leading-relaxed\"\n rows={textareaRows} spellCheck={false} />\n ) : (\n <input type={fieldType === 'number' || fieldType === 'integer' ? 'number' : 'text'}\n value={invokeFields[key] ?? ''} onChange={(e) => updateField(key, e.target.value, fieldType)}\n className=\"input text-xs w-full\" />\n )}\n </div>\n );\n })}\n </div>\n ) : (\n <p className=\"text-xs text-text-tertiary\">No input schema defined. Switch to JSON view to provide custom input.</p>\n )}\n\n {invokeMutation.error && !invokeResult && (\n <p className=\"text-xs text-status-error\">{invokeMutation.error.message}</p>\n )}\n\n <button type=\"submit\" disabled={invokeMutation.isPending} className=\"btn-primary text-xs\">\n {invokeMutation.isPending ? (\n <span className=\"flex items-center gap-2\">\n <span className=\"inline-block w-3 h-3 border-2 border-text-inverse border-t-transparent rounded-full animate-spin\" />\n Running...\n </span>\n ) : (\n <span className=\"flex items-center gap-1.5\">\n <Play className=\"w-3 h-3\" fill=\"currentColor\" />\n Invoke\n </span>\n )}\n </button>\n </form>\n )}\n\n {/* Result */}\n {invokeResult && (\n <div className=\"space-y-4\">\n <InvokeResultView\n result={invokeResult}\n showMetadata={showMetadata}\n onToggleMetadata={() => setShowMetadata(!showMetadata)}\n traceUrl={settings?.telemetry?.traceUrl}\n namespace={wf.app_id}\n />\n <button\n onClick={() => { setInvokeResult(null); invokeMutation.reset(); }}\n className=\"text-xs text-accent hover:underline\"\n >\n Run again\n </button>\n </div>\n )}\n </div>\n </CollapsibleSection>\n );\n}\n","import { useState, useEffect, useRef } from 'react';\nimport { useParams, Link, useSearchParams } from 'react-router-dom';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { Play } from 'lucide-react';\nimport { TagInput } from '../../../components/common/form/TagInput';\nimport {\n useYamlWorkflow,\n useDeployYamlWorkflow,\n useActivateYamlWorkflow,\n useInvokeYamlWorkflow,\n useArchiveYamlWorkflow,\n useDeleteYamlWorkflow,\n useRegenerateYamlWorkflow,\n useUpdateYamlWorkflow,\n useYamlWorkflowVersions,\n useYamlWorkflowVersion,\n} from '../../../api/yaml-workflows';\nimport { StatusBadge } from '../../../components/common/display/StatusBadge';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { Field } from '../../../components/common/data/Field';\nimport { CollapsibleSection } from '../../../components/common/layout/CollapsibleSection';\nimport { useSettings } from '../../../api/settings';\nimport { buildSkeleton } from './helpers';\nimport type { Section } from './helpers';\nimport { PipelineStrip, StepDetail } from './PipelineStrip';\nimport { LifecycleSidebar } from './LifecycleSidebar';\nimport { InvokeSection } from './InvokeSection';\nimport { ConfigurationSection } from './ConfigurationSection';\nimport { VersionHistory } from './VersionHistory';\n\n// Status values (draft, deployed, active, archived) are passed directly\n// to StatusBadge which handles styling and labels natively.\n\nexport function YamlWorkflowDetailPage() {\n const { id } = useParams<{ id: string }>();\n const [searchParams, setSearchParams] = useSearchParams();\n const queryClient = useQueryClient();\n const { data: wf, isLoading, refetch } = useYamlWorkflow(id!);\n const { data: settings } = useSettings();\n const deployMutation = useDeployYamlWorkflow();\n const activateMutation = useActivateYamlWorkflow();\n const invokeMutation = useInvokeYamlWorkflow();\n const archiveMutation = useArchiveYamlWorkflow();\n const deleteMutation = useDeleteYamlWorkflow();\n const regenerateMutation = useRegenerateYamlWorkflow();\n const updateMutation = useUpdateYamlWorkflow();\n const [invokeFields, setInvokeFields] = useState<Record<string, any>>({});\n const [invokeJsonMode, setInvokeJsonMode] = useState(false);\n const [invokeJson, setInvokeJson] = useState('{}');\n const [invokeResult, setInvokeResult] = useState<Record<string, unknown> | null>(null);\n const [showMetadata, setShowMetadata] = useState(false);\n const [openSection, setOpenSection] = useState<Section | null>('tools');\n const [selectedStep, setSelectedStep] = useState(0);\n\n // ── Version browsing ──────────────────────────────────────────\n const versionParam = searchParams.get('version');\n const viewingVersion = versionParam ? parseInt(versionParam, 10) : null;\n const isViewingHistory = viewingVersion !== null && wf && viewingVersion !== wf.content_version;\n const { data: versionsData } = useYamlWorkflowVersions(id!);\n const { data: versionSnapshot } = useYamlWorkflowVersion(id!, isViewingHistory ? viewingVersion : null);\n\n // Resolved data: use version snapshot if viewing history, otherwise current\n const resolvedManifest = isViewingHistory && versionSnapshot ? versionSnapshot.activity_manifest : wf?.activity_manifest;\n const resolvedInputSchema = isViewingHistory && versionSnapshot ? versionSnapshot.input_schema : wf?.input_schema;\n const resolvedOutputSchema = isViewingHistory && versionSnapshot ? versionSnapshot.output_schema : wf?.output_schema;\n const resolvedYaml = isViewingHistory && versionSnapshot ? versionSnapshot.yaml_content : wf?.yaml_content;\n\n // ── Configuration editing state ─────────────────────────────\n const [yamlDraft, setYamlDraft] = useState('');\n const [inputSchemaDraft, setInputSchemaDraft] = useState('');\n const [outputSchemaDraft, setOutputSchemaDraft] = useState('');\n const [inputFieldMetaDraft, setInputFieldMetaDraft] = useState<import('../../../api/types').InputFieldMeta[]>([]);\n const [configEditing, setConfigEditing] = useState(false);\n const yamlTextareaRef = useRef<HTMLTextAreaElement>(null);\n\n useEffect(() => {\n if (wf?.yaml_content) setYamlDraft(wf.yaml_content);\n if (wf?.input_schema) setInputSchemaDraft(JSON.stringify(wf.input_schema, null, 2));\n if (wf?.output_schema) setOutputSchemaDraft(JSON.stringify(wf.output_schema, null, 2));\n if (wf?.input_field_meta) setInputFieldMetaDraft(wf.input_field_meta);\n }, [wf?.id, wf?.yaml_content, wf?.input_schema, wf?.output_schema, wf?.input_field_meta]);\n\n useEffect(() => {\n if (wf?.input_schema) {\n const skeleton = buildSkeleton(wf.input_schema);\n setInvokeFields(skeleton);\n setInvokeJson(JSON.stringify(skeleton, null, 2));\n }\n }, [wf?.id]); // eslint-disable-line react-hooks/exhaustive-deps\n\n if (isLoading) {\n return (\n <div className=\"animate-pulse space-y-4\">\n <div className=\"h-8 bg-surface-sunken rounded w-48\" />\n <div className=\"h-60 bg-surface-sunken rounded\" />\n </div>\n );\n }\n\n if (!wf) {\n return <p className=\"text-sm text-text-secondary\">Workflow server not found.</p>;\n }\n\n const workerActivities = (resolvedManifest ?? wf.activity_manifest).filter((a) => a.type === 'worker');\n const lifecycleError =\n deployMutation.error?.message || activateMutation.error?.message ||\n archiveMutation.error?.message || deleteMutation.error?.message ||\n regenerateMutation.error?.message;\n const lifecyclePending =\n deployMutation.isPending || activateMutation.isPending ||\n archiveMutation.isPending || deleteMutation.isPending ||\n regenerateMutation.isPending;\n\n const handleDeploy = async () => { await deployMutation.mutateAsync(wf.id); refetch(); };\n\n const handleArchive = async () => {\n if (!confirm('Archive this workflow server? It will no longer accept invocations.')) return;\n await archiveMutation.mutateAsync(wf.id); refetch();\n };\n const handleDelete = async () => {\n if (!confirm('Delete this workflow server permanently?')) return;\n await deleteMutation.mutateAsync(wf.id);\n };\n const handleRegenerate = async () => {\n if (!confirm('Re-generate from the source execution? This will overwrite the current definition.')) return;\n await regenerateMutation.mutateAsync({ id: wf.id }); refetch();\n };\n const handleSaveConfig = async () => {\n let inputSchema: Record<string, unknown> | undefined;\n let outputSchema: Record<string, unknown> | undefined;\n try { inputSchema = JSON.parse(inputSchemaDraft); } catch { /* keep current */ }\n try { outputSchema = JSON.parse(outputSchemaDraft); } catch { /* keep current */ }\n await updateMutation.mutateAsync({\n id: wf.id,\n yaml_content: yamlDraft,\n ...(inputSchema ? { input_schema: inputSchema } : {}),\n ...(outputSchema ? { output_schema: outputSchema } : {}),\n });\n setConfigEditing(false);\n refetch();\n };\n const handleCancelEdit = () => {\n setYamlDraft(wf.yaml_content);\n setInputSchemaDraft(JSON.stringify(wf.input_schema, null, 2));\n setOutputSchemaDraft(JSON.stringify(wf.output_schema, null, 2));\n setConfigEditing(false);\n };\n const handleInvoke = async () => {\n setInvokeResult(null);\n try {\n const data = invokeJsonMode ? JSON.parse(invokeJson) : invokeFields;\n const result = await invokeMutation.mutateAsync({ id: wf.id, data, sync: true });\n setInvokeResult(result);\n } catch (err: any) {\n setInvokeResult({ error: err.message });\n }\n };\n\n const isActive = wf.status === 'active' || wf.status === 'deployed';\n const canEditConfig = wf.status !== 'archived' && !isViewingHistory;\n const showInvoke = isActive && !isViewingHistory;\n const toggleSection = (key: string) => setOpenSection(openSection === key ? null : key as Section);\n\n return (\n <div>\n <PageHeader\n title=\"Workflow Tool\"\n actions={\n wf.status === 'draft' && !isViewingHistory ? (\n <button\n onClick={handleDeploy}\n disabled={lifecyclePending}\n className=\"group flex items-center gap-2 text-left\"\n >\n <span className=\"flex items-center justify-center w-5 h-5 rounded-full bg-accent/10 text-accent shrink-0\">\n <svg className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9.663 17h4.674M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z\" />\n </svg>\n </span>\n <span className=\"text-xs text-text-secondary group-hover:text-text-primary transition-colors\">\n <span className=\"inline-flex items-center px-2 py-0.5 rounded bg-accent/10 text-accent font-medium group-hover:bg-accent/20 transition-colors mr-1\">Deploy</span>\n {' '}to register <span className=\"font-mono font-medium text-text-primary\">{wf.app_id}/{wf.graph_topic}</span> as an MCP Workflow Tool.\n </span>\n </button>\n ) : undefined\n }\n />\n\n {/* History banner */}\n {isViewingHistory && (\n <div className=\"mb-6 px-4 py-3 rounded-md bg-purple-500/10 border border-purple-500/20 flex items-center justify-between\">\n <p className=\"text-xs text-text-primary\">\n Viewing version <span className=\"font-mono font-medium\">{viewingVersion}</span>\n {versionSnapshot?.change_summary && (\n <span className=\"text-text-tertiary ml-2\">— {versionSnapshot.change_summary}</span>\n )}\n <span className=\"ml-2 text-text-tertiary\">(read-only)</span>\n </p>\n <button\n onClick={() => { const next = new URLSearchParams(searchParams); next.delete('version'); setSearchParams(next); }}\n className=\"text-xs text-accent hover:underline\"\n >\n Back to current\n </button>\n </div>\n )}\n\n <div className=\"grid grid-cols-1 lg:grid-cols-[1fr_220px] gap-12\">\n {/* ── Left: main content ─────────────────────────── */}\n <div>\n {/* Header card */}\n <div className=\"bg-surface-raised border border-surface-border rounded-md p-5 mb-8\">\n <div className=\"flex items-center gap-4 mb-4\">\n <h2 className=\"text-lg font-medium text-text-primary font-mono truncate flex-1\">{wf.name}</h2>\n <StatusBadge status={wf.status} />\n {isActive && !isViewingHistory && (\n <button\n type=\"button\"\n onClick={() => setOpenSection('invoke')}\n className=\"flex items-center gap-1.5 px-3 py-1.5 rounded-md bg-emerald-500/10 text-emerald-600 border border-emerald-500/20 text-xs font-medium hover:bg-emerald-500/20 transition-colors\"\n >\n <Play className=\"w-3 h-3\" />\n Invoke\n </button>\n )}\n </div>\n\n {wf.description && <p className=\"text-xs text-text-secondary mb-4\">{wf.description}</p>}\n\n <div className=\"grid grid-cols-2 sm:grid-cols-4 gap-y-3 gap-x-8\">\n <Field label=\"Tool Server\" value={<span className=\"font-mono text-xs\">{wf.app_id}</span>} />\n <Field label=\"Pipeline Tool\" value={<span className=\"font-mono text-xs\">{wf.graph_topic}</span>} />\n <Field label=\"Version\" value={\n <span className=\"font-mono text-xs\">\n {wf.app_version}\n {versionsData && versionsData.total > 1 && (\n <span className=\"text-text-tertiary ml-1\">(v{wf.content_version})</span>\n )}\n </span>\n } />\n <Field label=\"Tool Calls\" value={<span className=\"text-xs\">{workerActivities.length}</span>} />\n {wf.source_workflow_id && (\n <>\n <Field label=\"Compiled From Workflow\" value={\n <Link to={`/workflows/executions/${wf.source_workflow_id}`} className=\"font-mono text-xs text-accent hover:underline\">\n {wf.source_workflow_id}\n </Link>\n } />\n <Field label=\"\" value={\n <Link to={`/mcp/queries/${wf.source_workflow_id}`} className=\"text-xs text-accent hover:underline\">\n Open in Compilation Wizard\n </Link>\n } />\n </>\n )}\n <Field label=\"Invocations\" value={\n <Link to={`/mcp/executions?entity=${encodeURIComponent(wf.graph_topic)}&namespace=${encodeURIComponent(wf.app_id)}`} className=\"text-xs text-accent hover:underline\">\n View runs\n </Link>\n } />\n <Field label=\"Created\" value={<span className=\"text-xs\">{new Date(wf.created_at).toLocaleString()}</span>} />\n </div>\n\n {/* Tags */}\n <div className=\"mt-4 pt-4 border-t border-surface-border\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-2\">Tags</p>\n {wf.status !== 'archived' ? (\n <TagInput\n tags={wf.tags ?? []}\n onChange={(next) => {\n // Optimistically update the cache so the UI reflects instantly\n queryClient.setQueryData(['yamlWorkflows', wf.id], { ...wf, tags: next });\n updateMutation.mutate({ id: wf.id, tags: next });\n }}\n placeholder=\"Add tags for tool discovery...\"\n />\n ) : (\n <div className=\"flex flex-wrap gap-1.5\">\n {(wf.tags ?? []).length > 0 ? (\n (wf.tags ?? []).map((tag) => (\n <span key={tag} className=\"inline-flex items-center px-2 py-0.5 rounded-full bg-accent/10 text-accent text-[11px] font-medium\">\n {tag}\n </span>\n ))\n ) : (\n <span className=\"text-xs text-text-tertiary\">No tags</span>\n )}\n </div>\n )}\n </div>\n </div>\n\n {/* ── Collapsible sections ─────────────────────── */}\n <div className=\"space-y-6\">\n\n {/* ── Invoke / Try ────────────────────────────── */}\n {showInvoke && (\n <InvokeSection\n wf={wf}\n inputSchema={resolvedInputSchema}\n invokeFields={invokeFields}\n setInvokeFields={setInvokeFields}\n invokeJson={invokeJson}\n setInvokeJson={setInvokeJson}\n invokeJsonMode={invokeJsonMode}\n setInvokeJsonMode={setInvokeJsonMode}\n invokeResult={invokeResult}\n setInvokeResult={setInvokeResult}\n showMetadata={showMetadata}\n setShowMetadata={setShowMetadata}\n invokeMutation={invokeMutation}\n inputFieldMeta={wf.input_field_meta}\n settings={settings}\n onInvoke={handleInvoke}\n isCollapsed={openSection !== 'invoke'}\n onToggle={toggleSection}\n />\n )}\n\n {/* ── Tools ──────────────────────────────────── */}\n <CollapsibleSection sectionKey=\"tools\" title=\"Tools\" isCollapsed={openSection !== 'tools'} onToggle={toggleSection} >\n <div className=\"space-y-4\">\n <PipelineStrip\n activities={workerActivities}\n selectedIdx={selectedStep}\n onSelect={setSelectedStep}\n />\n\n {workerActivities[selectedStep] && (\n <StepDetail activity={workerActivities[selectedStep]} />\n )}\n </div>\n </CollapsibleSection>\n\n {/* ── Config ─────────────────────────────────── */}\n <ConfigurationSection\n wf={wf}\n resolvedInputSchema={resolvedInputSchema}\n resolvedOutputSchema={resolvedOutputSchema}\n resolvedYaml={resolvedYaml}\n configEditing={configEditing}\n setConfigEditing={setConfigEditing}\n canEditConfig={canEditConfig}\n yamlDraft={yamlDraft}\n setYamlDraft={setYamlDraft}\n inputSchemaDraft={inputSchemaDraft}\n setInputSchemaDraft={setInputSchemaDraft}\n outputSchemaDraft={outputSchemaDraft}\n setOutputSchemaDraft={setOutputSchemaDraft}\n inputFieldMetaDraft={inputFieldMetaDraft}\n setInputFieldMetaDraft={setInputFieldMetaDraft}\n onSave={handleSaveConfig}\n onCancel={handleCancelEdit}\n updateMutation={updateMutation}\n yamlTextareaRef={yamlTextareaRef}\n isCollapsed={openSection !== 'config'}\n onToggle={toggleSection}\n />\n\n </div>\n </div>\n\n {/* ── Right sidebar: lifecycle ────────────────────── */}\n <div className=\"lg:border-l lg:border-surface-border lg:pl-8 space-y-8\">\n <LifecycleSidebar\n status={wf.status}\n sourceWorkflowId={wf.source_workflow_id}\n contentVersion={wf.content_version}\n deployedContentVersion={wf.deployed_content_version}\n onDeploy={handleDeploy}\n\n onArchive={handleArchive}\n onDelete={handleDelete}\n onRegenerate={handleRegenerate}\n isPending={lifecyclePending}\n error={lifecycleError}\n />\n\n {/* Version history */}\n {versionsData && versionsData.versions.length > 1 && (\n <VersionHistory\n versionsData={versionsData}\n searchParams={searchParams}\n setSearchParams={setSearchParams}\n currentVersion={wf.content_version}\n viewingVersion={viewingVersion}\n />\n )}\n </div>\n </div>\n </div>\n );\n}\n"],"names":["PipelineStrip","activities","selectedIdx","onSelect","jsx","a","idx","isSelected","jsxs","StepDetail","activity","hasInputs","hasOutputs","isLlm","serverId","toolDisplay","toolIsLinkable","sourceColor","sourceLabel","Link","k","v","f","JsonViewer","InvokeResultView","result","showMetadata","onToggleMetadata","traceUrl","namespace","raw","jobId","hasEnvelope","displayData","Collapsible","b","order","metadataLabels","key","val","formatMetadataValue","InvokeSection","wf","inputSchema","invokeFields","setInvokeFields","invokeJson","setInvokeJson","invokeJsonMode","setInvokeJsonMode","invokeResult","setInvokeResult","setShowMetadata","invokeMutation","inputFieldMeta","settings","onInvoke","isCollapsed","onToggle","inputProps","allKeys","hasFieldMeta","showFixedFields","setShowFixedFields","useState","dynamicKeys","fixedKeys","inputKeys","updateField","value","type","parsed","updated","CollapsibleSection","e","SectionLabel","prop","fieldType","inferFieldType","desc","jsonValue","textareaRows","_b","_a","Play","YamlWorkflowDetailPage","id","useParams","searchParams","setSearchParams","useSearchParams","queryClient","useQueryClient","isLoading","refetch","useYamlWorkflow","useSettings","deployMutation","useDeployYamlWorkflow","activateMutation","useActivateYamlWorkflow","useInvokeYamlWorkflow","archiveMutation","useArchiveYamlWorkflow","deleteMutation","useDeleteYamlWorkflow","regenerateMutation","useRegenerateYamlWorkflow","updateMutation","useUpdateYamlWorkflow","openSection","setOpenSection","selectedStep","setSelectedStep","versionParam","viewingVersion","isViewingHistory","versionsData","useYamlWorkflowVersions","versionSnapshot","useYamlWorkflowVersion","resolvedManifest","resolvedInputSchema","resolvedOutputSchema","resolvedYaml","yamlDraft","setYamlDraft","inputSchemaDraft","setInputSchemaDraft","outputSchemaDraft","setOutputSchemaDraft","inputFieldMetaDraft","setInputFieldMetaDraft","configEditing","setConfigEditing","yamlTextareaRef","useRef","useEffect","skeleton","buildSkeleton","workerActivities","lifecycleError","_c","_d","_e","lifecyclePending","handleDeploy","handleArchive","handleDelete","handleRegenerate","handleSaveConfig","outputSchema","handleCancelEdit","handleInvoke","data","err","isActive","canEditConfig","showInvoke","toggleSection","PageHeader","next","StatusBadge","Field","Fragment","TagInput","tag","ConfigurationSection","LifecycleSidebar","VersionHistory"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as x,j as e}from"./vendor-query-B2UbickB.js";import{l as _,u as T}from"./yaml-workflows-BL4V5CQy.js";import{u as I}from"./useFilterParams-BaXUAkYK.js";import{S as C}from"./StatusBadge-TlC4jiig.js";import{P as v}from"./PageHeader-CpWFly5S.js";import{F as L,a as P,b as N}from"./FilterBar-Ck4K4rzu.js";import{E}from"./EmptyState-2CmV-IaS.js";import{M as R}from"./Modal-B4rbIVAn.js";import{u as $}from"./useYamlActivityEvents-BO51u8tm.js";import{b as w}from"./helpers-0gSleuzT.js";import{o as M,t as A,P as S,u as O}from"./vendor-icons-ZTAKVwGc.js";import{L as z,b as J}from"./vendor-react-Cw8Gy8NJ.js";import"./index-D8VH6K8B.js";const k={mcp:{border:"border-blue-500",text:"text-blue-500",icon:"MCP"},db:{border:"border-blue-500",text:"text-blue-500",icon:"DB"},llm:{border:"border-violet-500",text:"text-violet-500",icon:"LLM"},transform:{border:"border-emerald-500",text:"text-emerald-500",icon:"Map"}};function W({steps:o,manifest:a,isComplete:r}){const s=a.filter(t=>t.type==="worker"),c=s.length,n=s.map(t=>{const i=o.find(h=>h.activityId===t.activity_id),d=t.tool_source||"mcp",p=k[d]||k.mcp;return{activityId:t.activity_id,title:t.title||t.mcp_tool_name||t.activity_id,toolName:t.mcp_tool_name,colors:p,status:(i==null?void 0:i.status)||"pending",error:i==null?void 0:i.error}});return e.jsxs("div",{children:[e.jsx("p",{className:"text-xs text-text-secondary mb-4",children:r?`All ${c} steps completed`:`Running step ${n.filter(t=>t.status==="completed").length+1} of ${c}...`}),e.jsx("div",{className:"space-y-0",children:n.map((t,i)=>{const d=i===n.length-1;return e.jsxs("div",{className:"flex items-stretch gap-3",children:[e.jsxs("div",{className:"flex flex-col items-center w-5 shrink-0",children:[e.jsx("span",{className:`w-3 h-3 rounded-full shrink-0 border-2 transition-colors ${t.status==="completed"?"bg-status-success border-status-success":t.status==="running"?`${t.colors.border} bg-transparent animate-pulse`:t.status==="failed"?"bg-status-error border-status-error":"bg-surface-sunken border-surface-border"}`}),!d&&e.jsx("span",{className:`w-px flex-1 transition-colors ${t.status==="completed"?"bg-status-success/30":"bg-surface-border"}`})]}),e.jsxs("div",{className:`pb-4 ${d?"pb-0":""}`,children:[e.jsx("p",{className:`text-xs font-medium ${t.status==="running"?"text-text-primary":t.status==="completed"?"text-text-secondary":t.status==="failed"?"text-status-error":"text-text-tertiary"}`,children:t.title}),e.jsxs("div",{className:"flex items-center gap-2 mt-0.5",children:[e.jsx("span",{className:`text-[9px] font-mono px-1 py-0.5 rounded border ${t.colors.border} ${t.colors.text} bg-transparent`,children:t.colors.icon}),t.toolName&&e.jsx("span",{className:"text-[10px] text-text-tertiary font-mono",children:t.toolName})]}),t.error&&e.jsx("p",{className:"text-[10px] text-status-error mt-1",children:t.error})]})]},t.activityId)})})]})}function F({open:o,onClose:a,workflow:r}){const s=_(),[c,n]=x.useState(()=>JSON.stringify(w(r.input_schema),null,2)),[t,i]=x.useState(""),[d,p]=x.useState(null),[h,m]=x.useState(null),{steps:g,isComplete:j}=$(d);x.useEffect(()=>{o&&(p(null),m(null),i(""),s.reset(),n(JSON.stringify(w(r.input_schema),null,2)))},[o,r.id]),x.useEffect(()=>{if(j&&d){const b=d,y=setTimeout(()=>{m({jobId:b,data:null}),p(null)},800);return()=>clearTimeout(y)}},[j,d]);const l=async()=>{i(""),m(null);let b;try{b=JSON.parse(c)}catch{i("Invalid JSON");return}try{const y=await s.mutateAsync({id:r.id,data:b,sync:!1});y.job_id&&p(y.job_id)}catch{}},u=!!d,f=r.app_id||"longtail";return e.jsx(R,{open:o,onClose:()=>{u||a()},title:u?"Executing...":`Try ${r.graph_topic}`,maxWidth:"max-w-lg",children:u?e.jsx(W,{steps:g,manifest:r.activity_manifest,isComplete:j}):h?e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("svg",{className:"w-4 h-4 text-status-success",viewBox:"0 0 16 16",fill:"currentColor",children:e.jsx("path",{d:"M8 1a7 7 0 110 14A7 7 0 018 1zm3.36 4.65a.5.5 0 00-.72 0L7 9.29 5.36 7.65a.5.5 0 10-.72.7l2 2a.5.5 0 00.72 0l4-4a.5.5 0 000-.7z"})}),e.jsx("p",{className:"text-xs font-medium text-status-success",children:"Workflow completed"})]}),e.jsxs(z,{to:`/mcp/executions/${encodeURIComponent(h.jobId)}?namespace=${encodeURIComponent(f)}`,className:"inline-flex items-center gap-1.5 text-xs text-accent hover:underline",children:[e.jsx(M,{size:12}),"View execution details"]}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2 border-t border-surface-border",children:[e.jsx("button",{onClick:a,className:"btn-ghost text-xs",children:"Close"}),e.jsxs("button",{onClick:()=>{m(null)},className:"btn-primary text-xs inline-flex items-center gap-1.5",children:[e.jsx(A,{size:12})," Run again"]})]})]}):e.jsxs("div",{className:"flex flex-col gap-4",children:[r.description&&e.jsx("p",{className:"text-xs text-text-secondary",children:r.description}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Input"}),e.jsx("textarea",{value:c,onChange:b=>n(b.target.value),className:"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-2 font-mono text-xs text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary",rows:8,spellCheck:!1}),t&&e.jsx("p",{className:"text-xs text-status-error mt-1",children:t})]}),s.isError&&e.jsx("div",{className:"bg-status-error/10 border border-status-error/20 rounded-md px-3 py-2",children:e.jsx("p",{className:"text-xs text-status-error",children:s.error instanceof Error?s.error.message:"Invocation failed"})}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2 border-t border-surface-border",children:[e.jsx("button",{onClick:a,className:"btn-ghost text-xs",children:"Close"}),e.jsx("button",{onClick:l,disabled:s.isPending,className:"btn-primary text-xs disabled:opacity-50 inline-flex items-center gap-1.5",children:s.isPending?"Starting...":e.jsxs(e.Fragment,{children:[e.jsx(S,{size:12})," Run"]})})]})]})})}function B(o){const a=new Map;for(const r of o){const s=a.get(r.app_id)??[];s.push(r),a.set(r.app_id,s)}return[...a.entries()].map(([r,s])=>{const c={active:0,deployed:1,draft:2,archived:3},n=s.reduce((i,d)=>(c[d.status]??9)<(c[i]??9)?d.status:i,s[0].status),t=s.reduce((i,d)=>d.updated_at>i?d.updated_at:i,s[0].updated_at);return{appId:r,workflows:s,toolCount:s.length,status:n,updatedAt:t}})}function D(o,a){if(!a)return!0;const r=a.toLowerCase();return o.appId.toLowerCase().includes(r)?!0:o.workflows.some(s=>{var c,n;return s.graph_topic.toLowerCase().includes(r)||((c=s.name)==null?void 0:c.toLowerCase().includes(r))||((n=s.description)==null?void 0:n.toLowerCase().includes(r))})}function q(o,a){if(!a)return o;const r=a.toLowerCase();return o.filter(s=>{var c,n;return s.graph_topic.toLowerCase().includes(r)||((c=s.name)==null?void 0:c.toLowerCase().includes(r))||((n=s.description)==null?void 0:n.toLowerCase().includes(r))})}function U({wf:o,onClick:a,onTry:r}){const s=o.status==="active";return e.jsxs("div",{onClick:a,className:"group/row flex items-center cursor-pointer hover:bg-surface-hover/50 transition-colors border-b border-surface-border/30",children:[e.jsxs("div",{className:"flex-1 pl-14 pr-6 py-2 min-w-0",children:[e.jsx("code",{className:"text-xs font-mono text-accent-primary truncate block",children:o.graph_topic}),o.description&&e.jsx("p",{className:"text-[10px] text-text-tertiary mt-0.5 line-clamp-1",children:o.description})]}),e.jsx("div",{className:"w-28 px-6 py-2 whitespace-nowrap shrink-0",children:e.jsx(C,{status:o.status})}),e.jsx("div",{className:"w-12 px-3 py-2 flex justify-end shrink-0",children:s&&e.jsx("button",{onClick:c=>{c.stopPropagation(),r()},className:"opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-accent",title:"Try tool",children:e.jsx(S,{className:"w-[18px] h-[18px]",strokeWidth:1.5})})})]})}function Y({server:o,expanded:a,onToggle:r,onToolClick:s,onTryTool:c,visibleTools:n}){return e.jsxs(e.Fragment,{children:[e.jsxs("tr",{onClick:r,className:"group/row border-b transition-colors duration-100 cursor-pointer row-hover",children:[e.jsx("td",{className:"px-6 py-3.5",children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:`transition-transform duration-150 ${a?"rotate-90":""} text-text-tertiary`,children:e.jsx(O,{size:14})}),e.jsx("p",{className:"text-sm text-text-primary font-medium font-mono",children:o.appId})]})}),e.jsx("td",{className:"px-6 py-3.5 w-28 whitespace-nowrap",children:e.jsx(C,{status:o.status})}),e.jsx("td",{className:"w-12 text-center",children:e.jsx("span",{className:"inline-flex items-center justify-center w-5 h-5 rounded-full border border-accent/30 text-[10px] font-medium text-accent",children:o.toolCount})})]}),e.jsx("tr",{children:e.jsx("td",{colSpan:5,className:"p-0 border-0",children:e.jsx("div",{className:"grid transition-[grid-template-rows] duration-200 ease-in-out",style:{gridTemplateRows:a?"1fr":"0fr"},children:e.jsxs("div",{className:"overflow-hidden",children:[n.map(t=>e.jsx(U,{wf:t,onClick:()=>s(t),onTry:()=>c(t)},t.id)),e.jsx("div",{className:"h-1 bg-surface-sunken/20"})]})})})})]})}function ne(){const o=J(),{filters:a,setFilter:r}=I({filters:{status:"",server:"",search:""}}),{data:s,isLoading:c}=T({status:a.status||void 0,app_id:a.server||void 0,search:a.search||void 0,limit:200,offset:0}),n=(s==null?void 0:s.workflows)??[],t=x.useMemo(()=>B(n),[n]),i=x.useMemo(()=>[...new Set(n.map(u=>u.app_id))].sort().map(u=>({value:u,label:u})),[n]),d=x.useMemo(()=>a.search?t.filter(l=>D(l,a.search)):t,[t,a.search]),[p,h]=x.useState(new Set),[m,g]=x.useState(null),j=l=>{h(u=>{const f=new Set(u);return f.has(l)?f.delete(l):f.add(l),f})};return c?e.jsxs("div",{children:[e.jsx(v,{title:"MCP Pipeline Tools"}),e.jsx("div",{className:"animate-pulse space-y-0",children:Array.from({length:4}).map((l,u)=>e.jsx("div",{className:"h-14 border-b last:border-b-0 px-6 flex items-center",children:e.jsx("div",{className:"h-3 bg-surface-sunken rounded w-full"})},u))})]}):e.jsxs("div",{children:[e.jsx(v,{title:"MCP Pipeline Tools",actions:e.jsx("button",{onClick:()=>o("/mcp/queries"),className:"btn-primary text-xs",children:"Design Pipeline"})}),e.jsx("p",{className:"text-sm text-text-secondary mb-6 max-w-2xl leading-relaxed",children:"Compiled from successful triage runs. Each workflow is a deterministic tool."}),e.jsxs(L,{children:[e.jsx(P,{label:"Search",value:a.search,onChange:l=>r("search",l),placeholder:"Server or tool name…"}),i.length>1&&e.jsx(N,{label:"Server",value:a.server,onChange:l=>r("server",l),options:i}),e.jsx(N,{label:"Status",value:a.status,onChange:l=>r("status",l),options:[{value:"draft",label:"Draft"},{value:"deployed",label:"Deployed"},{value:"active",label:"Active"},{value:"archived",label:"Archived"}]})]}),d.length===0?e.jsx(E,{title:"No pipelines yet",description:"Use the Pipeline Designer to create your first MCP pipeline."}):e.jsxs("table",{className:"w-full",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b",children:[e.jsx("th",{className:"sticky top-[2.75rem] z-10 bg-surface px-6 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Server / Tool"}),e.jsx("th",{className:"sticky top-[2.75rem] z-10 bg-surface px-6 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary w-28",children:"Status"}),e.jsx("th",{className:"sticky top-[2.75rem] z-10 bg-surface w-12"})]})}),e.jsx("tbody",{children:d.map(l=>e.jsx(Y,{server:l,expanded:p.has(l.appId),onToggle:()=>j(l.appId),onToolClick:u=>o(u.source_workflow_id?`/mcp/queries/${u.source_workflow_id}`:`/mcp/workflows/${u.id}`),onTryTool:u=>g(u),visibleTools:q(l.workflows,a.search)},l.appId))})]}),m&&e.jsx(F,{open:!!m,onClose:()=>g(null),workflow:m})]})}export{ne as YamlWorkflowsPage};
|
|
2
|
-
//# sourceMappingURL=YamlWorkflowsPage-COqiNCQK.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"YamlWorkflowsPage-COqiNCQK.js","sources":["../../src/pages/workflows/yaml-workflow-detail/TryWorkflowModal.tsx","../../src/pages/workflows/yaml-helpers.ts","../../src/pages/workflows/YamlWorkflowsPage.tsx"],"sourcesContent":["import { useState, useEffect } from 'react';\nimport { Link } from 'react-router-dom';\nimport { Play, RotateCcw, ExternalLink } from 'lucide-react';\n\nimport { Modal } from '../../../components/common/modal/Modal';\nimport { useInvokeYamlWorkflow } from '../../../api/yaml-workflows';\nimport { useYamlActivityEvents } from '../../../hooks/useYamlActivityEvents';\nimport type { LTYamlWorkflowRecord, ActivityManifestEntry } from '../../../api/types';\nimport { buildSkeleton } from './helpers';\n\n// ── Tool source colors (matches TestPanel pattern) ───────────────────────────\n\nconst TOOL_SOURCE_COLORS: Record<string, { border: string; text: string; icon: string }> = {\n mcp: { border: 'border-blue-500', text: 'text-blue-500', icon: 'MCP' },\n db: { border: 'border-blue-500', text: 'text-blue-500', icon: 'DB' },\n llm: { border: 'border-violet-500', text: 'text-violet-500', icon: 'LLM' },\n transform: { border: 'border-emerald-500', text: 'text-emerald-500', icon: 'Map' },\n};\n\n// ── Live timeline ────────────────────────────────────────────────────────────\n\nfunction LiveTimeline({\n steps,\n manifest,\n isComplete,\n}: {\n steps: import('../../../hooks/useYamlActivityEvents').ActivityStep[];\n manifest: ActivityManifestEntry[];\n isComplete: boolean;\n}) {\n const workerActivities = manifest.filter((a) => a.type === 'worker');\n const totalSteps = workerActivities.length;\n\n const merged = workerActivities.map((a) => {\n const live = steps.find((s) => s.activityId === a.activity_id);\n const source = a.tool_source || 'mcp';\n const colors = TOOL_SOURCE_COLORS[source] || TOOL_SOURCE_COLORS.mcp;\n return {\n activityId: a.activity_id,\n title: a.title || a.mcp_tool_name || a.activity_id,\n toolName: a.mcp_tool_name,\n colors,\n status: live?.status || 'pending' as const,\n error: live?.error,\n };\n });\n\n return (\n <div>\n <p className=\"text-xs text-text-secondary mb-4\">\n {isComplete\n ? `All ${totalSteps} steps completed`\n : `Running step ${merged.filter((s) => s.status === 'completed').length + 1} of ${totalSteps}...`}\n </p>\n <div className=\"space-y-0\">\n {merged.map((step, idx) => {\n const isLast = idx === merged.length - 1;\n return (\n <div key={step.activityId} className=\"flex items-stretch gap-3\">\n <div className=\"flex flex-col items-center w-5 shrink-0\">\n <span className={`w-3 h-3 rounded-full shrink-0 border-2 transition-colors ${\n step.status === 'completed' ? 'bg-status-success border-status-success'\n : step.status === 'running' ? `${step.colors.border} bg-transparent animate-pulse`\n : step.status === 'failed' ? 'bg-status-error border-status-error'\n : 'bg-surface-sunken border-surface-border'\n }`} />\n {!isLast && (\n <span className={`w-px flex-1 transition-colors ${\n step.status === 'completed' ? 'bg-status-success/30' : 'bg-surface-border'\n }`} />\n )}\n </div>\n <div className={`pb-4 ${isLast ? 'pb-0' : ''}`}>\n <p className={`text-xs font-medium ${\n step.status === 'running' ? 'text-text-primary'\n : step.status === 'completed' ? 'text-text-secondary'\n : step.status === 'failed' ? 'text-status-error'\n : 'text-text-tertiary'\n }`}>\n {step.title}\n </p>\n <div className=\"flex items-center gap-2 mt-0.5\">\n <span className={`text-[9px] font-mono px-1 py-0.5 rounded border ${step.colors.border} ${step.colors.text} bg-transparent`}>\n {step.colors.icon}\n </span>\n {step.toolName && (\n <span className=\"text-[10px] text-text-tertiary font-mono\">{step.toolName}</span>\n )}\n </div>\n {step.error && (\n <p className=\"text-[10px] text-status-error mt-1\">{step.error}</p>\n )}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\n// ── Modal ────────────────────────────────────────────────────────────────────\n\ninterface TryWorkflowModalProps {\n open: boolean;\n onClose: () => void;\n workflow: LTYamlWorkflowRecord;\n}\n\nexport function TryWorkflowModal({ open, onClose, workflow }: TryWorkflowModalProps) {\n const invokeMutation = useInvokeYamlWorkflow();\n const [argsJson, setArgsJson] = useState(() =>\n JSON.stringify(buildSkeleton(workflow.input_schema), null, 2),\n );\n const [jsonError, setJsonError] = useState('');\n const [activeJobId, setActiveJobId] = useState<string | null>(null);\n const [completedResult, setCompletedResult] = useState<{ jobId: string; data: unknown } | null>(null);\n const { steps, isComplete } = useYamlActivityEvents(activeJobId);\n\n // Reset state when modal opens with a new workflow\n useEffect(() => {\n if (open) {\n setActiveJobId(null);\n setCompletedResult(null);\n setJsonError('');\n invokeMutation.reset();\n setArgsJson(JSON.stringify(buildSkeleton(workflow.input_schema), null, 2));\n }\n }, [open, workflow.id]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // When job completes, transition from timeline to result view\n useEffect(() => {\n if (isComplete && activeJobId) {\n const jobId = activeJobId;\n const timer = setTimeout(() => {\n setCompletedResult({ jobId, data: null });\n setActiveJobId(null);\n }, 800);\n return () => clearTimeout(timer);\n }\n }, [isComplete, activeJobId]);\n\n const handleRun = async () => {\n setJsonError('');\n setCompletedResult(null);\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(argsJson);\n } catch {\n setJsonError('Invalid JSON');\n return;\n }\n try {\n const result = await invokeMutation.mutateAsync({ id: workflow.id, data: parsed, sync: false });\n if (result.job_id) {\n setActiveJobId(result.job_id);\n }\n } catch { /* error shown in modal */ }\n };\n\n const isRunning = !!activeJobId;\n const ns = workflow.app_id || 'longtail';\n\n return (\n <Modal\n open={open}\n onClose={() => { if (!isRunning) onClose(); }}\n title={isRunning ? 'Executing...' : `Try ${workflow.graph_topic}`}\n maxWidth=\"max-w-lg\"\n >\n {isRunning ? (\n /* ── Live timeline ── */\n <LiveTimeline\n steps={steps}\n manifest={workflow.activity_manifest}\n isComplete={isComplete}\n />\n ) : completedResult ? (\n /* ── Completed result ── */\n <div className=\"space-y-4\">\n <div className=\"flex items-center gap-2\">\n <svg className=\"w-4 h-4 text-status-success\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M8 1a7 7 0 110 14A7 7 0 018 1zm3.36 4.65a.5.5 0 00-.72 0L7 9.29 5.36 7.65a.5.5 0 10-.72.7l2 2a.5.5 0 00.72 0l4-4a.5.5 0 000-.7z\" />\n </svg>\n <p className=\"text-xs font-medium text-status-success\">Workflow completed</p>\n </div>\n\n <Link\n to={`/mcp/executions/${encodeURIComponent(completedResult.jobId)}?namespace=${encodeURIComponent(ns)}`}\n className=\"inline-flex items-center gap-1.5 text-xs text-accent hover:underline\"\n >\n <ExternalLink size={12} />\n View execution details\n </Link>\n\n <div className=\"flex justify-end gap-3 pt-2 border-t border-surface-border\">\n <button onClick={onClose} className=\"btn-ghost text-xs\">Close</button>\n <button\n onClick={() => { setCompletedResult(null); }}\n className=\"btn-primary text-xs inline-flex items-center gap-1.5\"\n >\n <RotateCcw size={12} /> Run again\n </button>\n </div>\n </div>\n ) : (\n /* ── Input form ── */\n <div className=\"flex flex-col gap-4\">\n {workflow.description && (\n <p className=\"text-xs text-text-secondary\">{workflow.description}</p>\n )}\n\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Input\n </label>\n <textarea\n value={argsJson}\n onChange={(e) => setArgsJson(e.target.value)}\n className=\"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-2 font-mono text-xs text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary\"\n rows={8}\n spellCheck={false}\n />\n {jsonError && <p className=\"text-xs text-status-error mt-1\">{jsonError}</p>}\n </div>\n\n {invokeMutation.isError && (\n <div className=\"bg-status-error/10 border border-status-error/20 rounded-md px-3 py-2\">\n <p className=\"text-xs text-status-error\">\n {invokeMutation.error instanceof Error ? invokeMutation.error.message : 'Invocation failed'}\n </p>\n </div>\n )}\n\n <div className=\"flex justify-end gap-3 pt-2 border-t border-surface-border\">\n <button onClick={onClose} className=\"btn-ghost text-xs\">Close</button>\n <button\n onClick={handleRun}\n disabled={invokeMutation.isPending}\n className=\"btn-primary text-xs disabled:opacity-50 inline-flex items-center gap-1.5\"\n >\n {invokeMutation.isPending ? 'Starting...' : <><Play size={12} /> Run</>}\n </button>\n </div>\n </div>\n )}\n </Modal>\n );\n}\n","import type { LTYamlWorkflowRecord } from '../../api/types';\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\nexport interface ProcessServer {\n appId: string;\n workflows: LTYamlWorkflowRecord[];\n toolCount: number;\n status: string;\n updatedAt: string;\n}\n\n// ── Grouping & filtering helpers ──────────────────────────────────────────────\n\nexport function groupByAppId(workflows: LTYamlWorkflowRecord[]): ProcessServer[] {\n const map = new Map<string, LTYamlWorkflowRecord[]>();\n for (const wf of workflows) {\n const list = map.get(wf.app_id) ?? [];\n list.push(wf);\n map.set(wf.app_id, list);\n }\n\n return [...map.entries()].map(([appId, wfs]) => {\n const statusPriority: Record<string, number> = { active: 0, deployed: 1, draft: 2, archived: 3 };\n const bestStatus = wfs.reduce(\n (best, wf) => ((statusPriority[wf.status] ?? 9) < (statusPriority[best] ?? 9) ? wf.status : best),\n wfs[0].status,\n );\n const latest = wfs.reduce((max, wf) => (wf.updated_at > max ? wf.updated_at : max), wfs[0].updated_at);\n\n return {\n appId,\n workflows: wfs,\n toolCount: wfs.length,\n status: bestStatus,\n updatedAt: latest,\n };\n });\n}\n\n/** Client-side search: match server name or any tool's graph_topic/description */\nexport function matchesSearch(server: ProcessServer, search: string): boolean {\n if (!search) return true;\n const q = search.toLowerCase();\n if (server.appId.toLowerCase().includes(q)) return true;\n return server.workflows.some(\n (wf) =>\n wf.graph_topic.toLowerCase().includes(q) ||\n wf.name?.toLowerCase().includes(q) ||\n wf.description?.toLowerCase().includes(q),\n );\n}\n\n/** Filter tools within a server that match the search term */\nexport function filterTools(workflows: LTYamlWorkflowRecord[], search: string): LTYamlWorkflowRecord[] {\n if (!search) return workflows;\n const q = search.toLowerCase();\n return workflows.filter(\n (wf) =>\n wf.graph_topic.toLowerCase().includes(q) ||\n wf.name?.toLowerCase().includes(q) ||\n wf.description?.toLowerCase().includes(q),\n );\n}\n","import { useState, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { ChevronRight, Play } from 'lucide-react';\nimport { useYamlWorkflows } from '../../api/yaml-workflows';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { StatusBadge } from '../../components/common/display/StatusBadge';\n\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { FilterBar, FilterSelect, FilterInput } from '../../components/common/data/FilterBar';\nimport { EmptyState } from '../../components/common/display/EmptyState';\nimport { TryWorkflowModal } from './yaml-workflow-detail/TryWorkflowModal';\nimport { groupByAppId, matchesSearch, filterTools, type ProcessServer } from './yaml-helpers';\nimport type { LTYamlWorkflowRecord } from '../../api/types';\n\n// ── Tool row (individual workflow inside expanded server) ─────────────────────\n\nfunction ToolRow({ wf, onClick, onTry }: { wf: LTYamlWorkflowRecord; onClick: () => void; onTry: () => void }) {\n const canTry = wf.status === 'active';\n\n return (\n <div onClick={onClick} className=\"group/row flex items-center cursor-pointer hover:bg-surface-hover/50 transition-colors border-b border-surface-border/30\">\n {/* Tool name — indented to align under server name */}\n <div className=\"flex-1 pl-14 pr-6 py-2 min-w-0\">\n <code className=\"text-xs font-mono text-accent-primary truncate block\">{wf.graph_topic}</code>\n {wf.description && (\n <p className=\"text-[10px] text-text-tertiary mt-0.5 line-clamp-1\">{wf.description}</p>\n )}\n </div>\n {/* Status */}\n <div className=\"w-28 px-6 py-2 whitespace-nowrap shrink-0\">\n <StatusBadge status={wf.status} />\n </div>\n {/* Try — hover-reveal icon */}\n <div className=\"w-12 px-3 py-2 flex justify-end shrink-0\">\n {canTry && (\n <button\n onClick={(e) => { e.stopPropagation(); onTry(); }}\n className=\"opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-accent\"\n title=\"Try tool\"\n >\n <Play className=\"w-[18px] h-[18px]\" strokeWidth={1.5} />\n </button>\n )}\n </div>\n </div>\n );\n}\n\n// ── Server row (expandable namespace) ────────────────────────────────────────\n\nfunction ServerRow({\n server,\n expanded,\n onToggle,\n onToolClick,\n onTryTool,\n visibleTools,\n}: {\n server: ProcessServer;\n expanded: boolean;\n onToggle: () => void;\n onToolClick: (wf: LTYamlWorkflowRecord) => void;\n onTryTool: (wf: LTYamlWorkflowRecord) => void;\n visibleTools: LTYamlWorkflowRecord[];\n}) {\n return (\n <>\n <tr\n onClick={onToggle}\n className=\"group/row border-b transition-colors duration-100 cursor-pointer row-hover\"\n >\n {/* Name + badge + timestamp */}\n <td className=\"px-6 py-3.5\">\n <div className=\"flex items-center gap-2\">\n <span className={`transition-transform duration-150 ${expanded ? 'rotate-90' : ''} text-text-tertiary`}>\n <ChevronRight size={14} />\n </span>\n <p className=\"text-sm text-text-primary font-medium font-mono\">{server.appId}</p>\n </div>\n </td>\n\n {/* Status */}\n <td className=\"px-6 py-3.5 w-28 whitespace-nowrap\">\n <StatusBadge status={server.status} />\n </td>\n\n {/* Tool count badge — aligned with child row hover icons */}\n <td className=\"w-12 text-center\">\n <span className=\"inline-flex items-center justify-center w-5 h-5 rounded-full border border-accent/30 text-[10px] font-medium text-accent\">\n {server.toolCount}\n </span>\n </td>\n </tr>\n\n {/* Expanded tool rows — no sub-header, aligned to outer columns */}\n <tr>\n <td colSpan={5} className=\"p-0 border-0\">\n <div\n className=\"grid transition-[grid-template-rows] duration-200 ease-in-out\"\n style={{ gridTemplateRows: expanded ? '1fr' : '0fr' }}\n >\n <div className=\"overflow-hidden\">\n {visibleTools.map((wf) => (\n <ToolRow key={wf.id} wf={wf} onClick={() => onToolClick(wf)} onTry={() => onTryTool(wf)} />\n ))}\n <div className=\"h-1 bg-surface-sunken/20\" />\n </div>\n </div>\n </td>\n </tr>\n </>\n );\n}\n\n// ── Page ──────────────────────────────────────────────────────────────────────\n\nexport function YamlWorkflowsPage() {\n const navigate = useNavigate();\n const { filters, setFilter } = useFilterParams({\n filters: { status: '', server: '', search: '' },\n });\n\n // Fetch a larger page to get all workflows for grouping\n const { data, isLoading } = useYamlWorkflows({\n status: (filters.status || undefined) as any,\n app_id: filters.server || undefined,\n search: filters.search || undefined,\n limit: 200,\n offset: 0,\n });\n\n const workflows = data?.workflows ?? [];\n\n const servers = useMemo(() => groupByAppId(workflows), [workflows]);\n\n // Build server options from unfiltered results; re-derive when status/search change\n const serverOptions = useMemo(() => {\n const ids = [...new Set(workflows.map((wf) => wf.app_id))].sort();\n return ids.map((id) => ({ value: id, label: id }));\n }, [workflows]);\n\n // Client-side search filtering for tool-level matches within expanded rows\n const filteredServers = useMemo(() => {\n if (!filters.search) return servers;\n return servers.filter((s) => matchesSearch(s, filters.search));\n }, [servers, filters.search]);\n\n const [expandedIds, setExpandedIds] = useState<Set<string>>(new Set());\n const [tryWorkflow, setTryWorkflow] = useState<LTYamlWorkflowRecord | null>(null);\n\n const toggleExpand = (appId: string) => {\n setExpandedIds((prev) => {\n const next = new Set(prev);\n if (next.has(appId)) next.delete(appId);\n else next.add(appId);\n return next;\n });\n };\n\n if (isLoading) {\n return (\n <div>\n <PageHeader title=\"MCP Pipeline Tools\" />\n <div className=\"animate-pulse space-y-0\">\n {Array.from({ length: 4 }).map((_, i) => (\n <div key={i} className=\"h-14 border-b last:border-b-0 px-6 flex items-center\">\n <div className=\"h-3 bg-surface-sunken rounded w-full\" />\n </div>\n ))}\n </div>\n </div>\n );\n }\n\n return (\n <div>\n <PageHeader\n title=\"MCP Pipeline Tools\"\n actions={\n <button onClick={() => navigate('/mcp/queries')} className=\"btn-primary text-xs\">\n Design Pipeline\n </button>\n }\n />\n\n <p className=\"text-sm text-text-secondary mb-6 max-w-2xl leading-relaxed\">\n Compiled from successful triage runs. Each workflow is a deterministic tool.\n </p>\n\n <FilterBar>\n <FilterInput\n label=\"Search\"\n value={filters.search}\n onChange={(v) => setFilter('search', v)}\n placeholder=\"Server or tool name…\"\n />\n {serverOptions.length > 1 && (\n <FilterSelect\n label=\"Server\"\n value={filters.server}\n onChange={(v) => setFilter('server', v)}\n options={serverOptions}\n />\n )}\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={[\n { value: 'draft', label: 'Draft' },\n { value: 'deployed', label: 'Deployed' },\n { value: 'active', label: 'Active' },\n { value: 'archived', label: 'Archived' },\n ]}\n />\n </FilterBar>\n\n {filteredServers.length === 0 ? (\n <EmptyState title=\"No pipelines yet\" description=\"Use the Pipeline Designer to create your first MCP pipeline.\" />\n ) : (\n <table className=\"w-full\">\n <thead>\n <tr className=\"border-b\">\n <th className=\"sticky top-[2.75rem] z-10 bg-surface px-6 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Server / Tool\n </th>\n <th className=\"sticky top-[2.75rem] z-10 bg-surface px-6 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary w-28\">\n Status\n </th>\n <th className=\"sticky top-[2.75rem] z-10 bg-surface w-12\" />\n </tr>\n </thead>\n <tbody>\n {filteredServers.map((server) => (\n <ServerRow\n key={server.appId}\n server={server}\n expanded={expandedIds.has(server.appId)}\n onToggle={() => toggleExpand(server.appId)}\n onToolClick={(wf) => navigate(\n wf.source_workflow_id\n ? `/mcp/queries/${wf.source_workflow_id}`\n : `/mcp/workflows/${wf.id}`\n )}\n onTryTool={(wf) => setTryWorkflow(wf)}\n visibleTools={filterTools(server.workflows, filters.search)}\n />\n ))}\n </tbody>\n </table>\n )}\n\n {tryWorkflow && (\n <TryWorkflowModal\n open={!!tryWorkflow}\n onClose={() => setTryWorkflow(null)}\n workflow={tryWorkflow}\n />\n )}\n </div>\n );\n}\n"],"names":["TOOL_SOURCE_COLORS","LiveTimeline","steps","manifest","isComplete","workerActivities","a","totalSteps","merged","live","s","source","colors","jsx","step","idx","isLast","jsxs","TryWorkflowModal","open","onClose","workflow","invokeMutation","useInvokeYamlWorkflow","argsJson","setArgsJson","useState","buildSkeleton","jsonError","setJsonError","activeJobId","setActiveJobId","completedResult","setCompletedResult","useYamlActivityEvents","useEffect","jobId","timer","handleRun","parsed","result","isRunning","ns","Modal","Link","ExternalLink","RotateCcw","e","Fragment","Play","groupByAppId","workflows","map","wf","list","appId","wfs","statusPriority","bestStatus","best","latest","max","matchesSearch","server","search","q","_a","_b","filterTools","ToolRow","onClick","onTry","canTry","StatusBadge","ServerRow","expanded","onToggle","onToolClick","onTryTool","visibleTools","ChevronRight","YamlWorkflowsPage","navigate","useNavigate","filters","setFilter","useFilterParams","data","isLoading","useYamlWorkflows","servers","useMemo","serverOptions","id","filteredServers","expandedIds","setExpandedIds","tryWorkflow","setTryWorkflow","toggleExpand","prev","next","PageHeader","_","i","FilterBar","FilterInput","v","FilterSelect","EmptyState"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e=[15,30,60,240];function r(a){if(a<60)return`${a} min`;const l=a/60;return Number.isInteger(l)?l===1?"1 hour":`${l} hours`:`${a} min`}const u=[{value:"1",label:"P1 — Critical"},{value:"2",label:"P2 — High"},{value:"3",label:"P3 — Normal"},{value:"4",label:"P4 — Low"}],s=[{value:"1 hour",label:"1 hour"},{value:"1 day",label:"1 day"},{value:"3 days",label:"3 days"},{value:"7 days",label:"7 days"},{value:"30 days",label:"30 days"},{value:"90 days",label:"90 days"}];export{e as D,u as P,s as R,r as f};
|
|
2
|
-
//# sourceMappingURL=constants-CgaZfe5d.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"constants-CgaZfe5d.js","sources":["../../src/lib/constants.ts"],"sourcesContent":["/** Fallback claim durations (minutes) when settings haven't loaded yet. */\nexport const DEFAULT_CLAIM_DURATIONS = [15, 30, 60, 240];\n\n/** Format a duration in minutes to a human-readable label. */\nexport function formatClaimDuration(minutes: number): string {\n if (minutes < 60) return `${minutes} min`;\n const hours = minutes / 60;\n if (Number.isInteger(hours)) return hours === 1 ? '1 hour' : `${hours} hours`;\n return `${minutes} min`;\n}\n\nexport const PRIORITY_OPTIONS = [\n { value: '1', label: 'P1 — Critical' },\n { value: '2', label: 'P2 — High' },\n { value: '3', label: 'P3 — Normal' },\n { value: '4', label: 'P4 — Low' },\n] as const;\n\nexport const RETENTION_PERIOD_OPTIONS = [\n { value: '1 hour', label: '1 hour' },\n { value: '1 day', label: '1 day' },\n { value: '3 days', label: '3 days' },\n { value: '7 days', label: '7 days' },\n { value: '30 days', label: '30 days' },\n { value: '90 days', label: '90 days' },\n] as const;\n"],"names":["DEFAULT_CLAIM_DURATIONS","formatClaimDuration","minutes","hours","PRIORITY_OPTIONS","RETENTION_PERIOD_OPTIONS"],"mappings":"AACO,MAAMA,EAA0B,CAAC,GAAI,GAAI,GAAI,GAAG,EAGhD,SAASC,EAAoBC,EAAyB,CAC3D,GAAIA,EAAU,GAAI,MAAO,GAAGA,CAAO,OACnC,MAAMC,EAAQD,EAAU,GACxB,OAAI,OAAO,UAAUC,CAAK,EAAUA,IAAU,EAAI,SAAW,GAAGA,CAAK,SAC9D,GAAGD,CAAO,MACnB,CAEO,MAAME,EAAmB,CAC9B,CAAE,MAAO,IAAK,MAAO,eAAA,EACrB,CAAE,MAAO,IAAK,MAAO,WAAA,EACrB,CAAE,MAAO,IAAK,MAAO,aAAA,EACrB,CAAE,MAAO,IAAK,MAAO,UAAA,CACvB,EAEaC,EAA2B,CACtC,CAAE,MAAO,SAAU,MAAO,QAAA,EAC1B,CAAE,MAAO,QAAS,MAAO,OAAA,EACzB,CAAE,MAAO,SAAU,MAAO,QAAA,EAC1B,CAAE,MAAO,SAAU,MAAO,QAAA,EAC1B,CAAE,MAAO,UAAW,MAAO,SAAA,EAC3B,CAAE,MAAO,UAAW,MAAO,SAAA,CAC7B"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{j as s}from"./vendor-query-B2UbickB.js";import{F as c,b as l}from"./FilterBar-Ck4K4rzu.js";import{P as x}from"./PriorityBadge-DfQY9St9.js";import{R as m}from"./RolePill-BTPa8L-P.js";import{W as p}from"./WorkflowPill-CCDSVaQj.js";import{T as u}from"./TimestampCell-DoWMKg6w.js";import{C as d,i as y,a as h}from"./escalation-qalymbKB.js";import{o as j,p as v,B as b,j as r}from"./vendor-icons-ZTAKVwGc.js";import{L as f}from"./vendor-react-Cw8Gy8NJ.js";function k({row:e}){if(y(e)){const t=e.status==="resolved"?"text-status-success":"text-text-tertiary";return s.jsx(b,{className:`w-3 h-3 shrink-0 ${t}`})}return e.status==="resolved"?s.jsx(r,{className:"w-2.5 h-2.5 shrink-0 fill-status-success text-status-success"}):e.status==="cancelled"?s.jsx(r,{className:"w-2.5 h-2.5 shrink-0 fill-status-error text-status-error"}):h(e)?s.jsx(r,{className:"w-2.5 h-2.5 shrink-0 fill-status-warning text-status-warning"}):s.jsx(r,{className:"w-2.5 h-2.5 shrink-0 fill-status-active text-status-active"})}const L=[{key:"description",label:"Summary",render:e=>s.jsxs("div",{className:"flex items-start gap-2 overflow-hidden",children:[s.jsx("span",{className:"mt-1 shrink-0",children:s.jsx(k,{row:e})}),s.jsxs("div",{className:"min-w-0 overflow-hidden",children:[s.jsx("p",{className:"text-xs text-text-primary truncate",children:e.description||e.type}),s.jsxs("div",{className:"flex items-center gap-2 mt-0.5",children:[s.jsx(p,{type:e.type}),e.subtype&&e.subtype!==e.type&&s.jsx("span",{className:"text-[10px] text-text-tertiary whitespace-nowrap",children:e.subtype})]})]})]}),className:"max-w-0"},{key:"task_id",label:"Task",render:e=>e.task_id?s.jsxs(f,{to:`/workflows/tasks/detail/${e.task_id}`,onClick:t=>t.stopPropagation(),className:"group/task inline-flex items-center gap-1 text-xs font-mono text-text-secondary hover:text-accent transition-colors",children:[e.task_id.slice(0,12),"…",s.jsx(j,{size:10,className:"opacity-0 group-hover/task:opacity-100 transition-opacity"})]}):s.jsx("span",{className:"text-xs text-text-tertiary",children:"—"}),className:"w-36 whitespace-nowrap"},{key:"role",label:"Role",render:e=>s.jsx(m,{role:e.role}),className:"w-28"},{key:"priority",label:"Priority",render:e=>s.jsx(x,{priority:e.priority}),className:"w-20",sortable:!0},{key:"created_at",label:"Created",render:e=>s.jsx(u,{date:e.created_at}),className:"w-40",sortable:!0}],I={key:"expires",label:s.jsx(v,{className:"w-3.5 h-3.5 text-text-tertiary"}),render:e=>e.assigned_until?s.jsx(d,{until:e.assigned_until}):s.jsx("span",{className:"text-xs text-text-tertiary",children:"—"}),className:"w-10"},N=[{value:"1",label:"P1"},{value:"2",label:"P2"},{value:"3",label:"P3"},{value:"4",label:"P4"}],C=[{value:"available",label:"Available"},{value:"claimed",label:"Claimed"},{value:"resolved",label:"Resolved"}];function A({filters:e,setFilter:t,roles:i,types:n,showStatus:o=!1}){return s.jsxs(c,{children:[o&&s.jsx(l,{label:"Status",value:e.status??"",onChange:a=>t("status",a),options:C}),s.jsx(l,{label:"Role",value:e.role,onChange:a=>t("role",a),options:i.map(a=>({value:a,label:a}))}),s.jsx(l,{label:"Type",value:e.type,onChange:a=>t("type",a),options:n.map(a=>({value:a,label:a}))}),s.jsx(l,{label:"Priority",value:e.priority,onChange:a=>t("priority",a),options:N})]})}export{L as E,I as T,A as a};
|
|
2
|
-
//# sourceMappingURL=escalation-columns-D6aqStaY.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as o,j as s}from"./vendor-query-B2UbickB.js";import{a as i}from"./format-gXZXQ-HJ.js";const n=[{maxMs:0,color:"text-status-error"},{maxMs:300*1e3,color:"text-status-error"},{maxMs:900*1e3,color:"text-status-warning"},{maxMs:1/0,color:"text-accent"}];function c(t){if(t<=0)return n[0].color;for(const e of n)if(t<e.maxMs)return e.color;return n[n.length-1].color}function u({until:t}){const[e,r]=o.useState(()=>new Date(t).getTime()-Date.now());return o.useEffect(()=>{const a=setInterval(()=>{r(new Date(t).getTime()-Date.now())},1e3);return()=>clearInterval(a)},[t]),s.jsx("span",{className:`text-xs font-mono ${c(e)}`,children:i(e)})}function f(t){return!!(t.assigned_to&&t.assigned_until&&new Date(t.assigned_until)>new Date)}function x(t){return!t.workflow_type}export{u as C,f as a,x as i};
|
|
2
|
-
//# sourceMappingURL=escalation-qalymbKB.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"escalation-qalymbKB.js","sources":["../../src/components/common/display/CountdownTimer.tsx","../../src/lib/escalation.ts"],"sourcesContent":["import { useState, useEffect } from 'react';\nimport { formatRemaining } from '../../../lib/format';\n\n/** Countdown thresholds in milliseconds with corresponding color classes. */\nconst COUNTDOWN_THRESHOLDS = [\n { maxMs: 0, color: 'text-status-error' }, // expired\n { maxMs: 5 * 60 * 1000, color: 'text-status-error' }, // < 5 min — red\n { maxMs: 15 * 60 * 1000, color: 'text-status-warning' }, // < 15 min — orange\n { maxMs: Infinity, color: 'text-accent' }, // plenty of time — blue\n] as const;\n\nfunction countdownColor(remainingMs: number): string {\n if (remainingMs <= 0) return COUNTDOWN_THRESHOLDS[0].color;\n for (const t of COUNTDOWN_THRESHOLDS) {\n if (remainingMs < t.maxMs) return t.color;\n }\n return COUNTDOWN_THRESHOLDS[COUNTDOWN_THRESHOLDS.length - 1].color;\n}\n\nexport function CountdownTimer({ until }: { until: string }) {\n const [remaining, setRemaining] = useState(() => new Date(until).getTime() - Date.now());\n\n useEffect(() => {\n const interval = setInterval(() => {\n setRemaining(new Date(until).getTime() - Date.now());\n }, 1000);\n return () => clearInterval(interval);\n }, [until]);\n\n return (\n <span className={`text-xs font-mono ${countdownColor(remaining)}`}>\n {formatRemaining(remaining)}\n </span>\n );\n}\n","import type { LTEscalationRecord } from '../api/types';\n\nexport function isEffectivelyClaimed(esc: LTEscalationRecord): boolean {\n return !!(\n esc.assigned_to &&\n esc.assigned_until &&\n new Date(esc.assigned_until) > new Date()\n );\n}\n\n/** An ACK escalation has no associated workflow — it's a notification, not a task. */\nexport function isAckEscalation(esc: LTEscalationRecord): boolean {\n return !esc.workflow_type;\n}\n\nexport function isAvailable(esc: LTEscalationRecord): boolean {\n return (\n esc.status === 'pending' &&\n (!esc.assigned_to ||\n !esc.assigned_until ||\n new Date(esc.assigned_until) <= new Date())\n );\n}\n"],"names":["COUNTDOWN_THRESHOLDS","countdownColor","remainingMs","t","CountdownTimer","until","remaining","setRemaining","useState","useEffect","interval","jsx","formatRemaining","isEffectivelyClaimed","esc","isAckEscalation"],"mappings":"+FAIA,MAAMA,EAAuB,CAC3B,CAAE,MAAO,EAAgB,MAAO,mBAAA,EAChC,CAAE,MAAO,IAAS,IAAO,MAAO,mBAAA,EAChC,CAAE,MAAO,IAAU,IAAM,MAAO,qBAAA,EAChC,CAAE,MAAO,IAAiB,MAAO,aAAA,CACnC,EAEA,SAASC,EAAeC,EAA6B,CACnD,GAAIA,GAAe,EAAG,OAAOF,EAAqB,CAAC,EAAE,MACrD,UAAWG,KAAKH,EACd,GAAIE,EAAcC,EAAE,MAAO,OAAOA,EAAE,MAEtC,OAAOH,EAAqBA,EAAqB,OAAS,CAAC,EAAE,KAC/D,CAEO,SAASI,EAAe,CAAE,MAAAC,GAA4B,CAC3D,KAAM,CAACC,EAAWC,CAAY,EAAIC,EAAAA,SAAS,IAAM,IAAI,KAAKH,CAAK,EAAE,QAAA,EAAY,KAAK,KAAK,EAEvFI,OAAAA,EAAAA,UAAU,IAAM,CACd,MAAMC,EAAW,YAAY,IAAM,CACjCH,EAAa,IAAI,KAAKF,CAAK,EAAE,UAAY,KAAK,KAAK,CACrD,EAAG,GAAI,EACP,MAAO,IAAM,cAAcK,CAAQ,CACrC,EAAG,CAACL,CAAK,CAAC,EAGRM,EAAAA,IAAC,OAAA,CAAK,UAAW,qBAAqBV,EAAeK,CAAS,CAAC,GAC5D,SAAAM,EAAgBN,CAAS,CAAA,CAC5B,CAEJ,CChCO,SAASO,EAAqBC,EAAkC,CACrE,MAAO,CAAC,EACNA,EAAI,aACJA,EAAI,gBACJ,IAAI,KAAKA,EAAI,cAAc,EAAI,IAAI,KAEvC,CAGO,SAASC,EAAgBD,EAAkC,CAChE,MAAO,CAACA,EAAI,aACd"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
function u(t){const n=Date.now(),o=new Date(t).getTime(),r=n-o;if(r<0)return"just now";const e=Math.floor(r/1e3);if(e<60)return`${e}s ago`;const a=Math.floor(e/60);if(a<60)return`${a}m ago`;const f=Math.floor(a/60);if(f<24)return`${f}h ago`;const i=Math.floor(f/24);return i<30?`${i}d ago`:new Date(t).toLocaleDateString()}function s(t){if(t<=0)return"Expired";const n=Math.floor(t/1e3),o=Math.floor(n/60),r=Math.floor(o/60);return r>0?`${r}h ${o%60}m`:o>0?`${o}m ${n%60}s`:`${n}s`}function c(t){return t==null?"--":t<1e3?`${t}ms`:t<6e4?`${(t/1e3).toFixed(1)}s`:`${(t/6e4).toFixed(1)}m`}function h(t){return t?new Date(t).toLocaleString():"--"}export{s as a,h as b,u as c,c as f};
|
|
2
|
-
//# sourceMappingURL=format-gXZXQ-HJ.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"format-gXZXQ-HJ.js","sources":["../../src/lib/format.ts"],"sourcesContent":["export function formatTimeAgo(dateStr: string): string {\n const now = Date.now();\n const then = new Date(dateStr).getTime();\n const diff = now - then;\n\n if (diff < 0) return 'just now';\n\n const seconds = Math.floor(diff / 1000);\n if (seconds < 60) return `${seconds}s ago`;\n\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes}m ago`;\n\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ago`;\n\n const days = Math.floor(hours / 24);\n if (days < 30) return `${days}d ago`;\n\n return new Date(dateStr).toLocaleDateString();\n}\n\nexport function formatRemaining(ms: number): string {\n if (ms <= 0) return 'Expired';\n\n const seconds = Math.floor(ms / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n\n if (hours > 0) {\n return `${hours}h ${minutes % 60}m`;\n }\n if (minutes > 0) {\n return `${minutes}m ${seconds % 60}s`;\n }\n return `${seconds}s`;\n}\n\nexport function formatDuration(ms: number | null | undefined): string {\n if (ms === null || ms === undefined) return '--';\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60_000) return `${(ms / 1000).toFixed(1)}s`;\n return `${(ms / 60_000).toFixed(1)}m`;\n}\n\nexport function formatDateTime(iso: string | null): string {\n if (!iso) return '--';\n return new Date(iso).toLocaleString();\n}\n"],"names":["formatTimeAgo","dateStr","now","then","diff","seconds","minutes","hours","days","formatRemaining","ms","formatDuration","formatDateTime","iso"],"mappings":"AAAO,SAASA,EAAcC,EAAyB,CACrD,MAAMC,EAAM,KAAK,IAAA,EACXC,EAAO,IAAI,KAAKF,CAAO,EAAE,QAAA,EACzBG,EAAOF,EAAMC,EAEnB,GAAIC,EAAO,EAAG,MAAO,WAErB,MAAMC,EAAU,KAAK,MAAMD,EAAO,GAAI,EACtC,GAAIC,EAAU,GAAI,MAAO,GAAGA,CAAO,QAEnC,MAAMC,EAAU,KAAK,MAAMD,EAAU,EAAE,EACvC,GAAIC,EAAU,GAAI,MAAO,GAAGA,CAAO,QAEnC,MAAMC,EAAQ,KAAK,MAAMD,EAAU,EAAE,EACrC,GAAIC,EAAQ,GAAI,MAAO,GAAGA,CAAK,QAE/B,MAAMC,EAAO,KAAK,MAAMD,EAAQ,EAAE,EAClC,OAAIC,EAAO,GAAW,GAAGA,CAAI,QAEtB,IAAI,KAAKP,CAAO,EAAE,mBAAA,CAC3B,CAEO,SAASQ,EAAgBC,EAAoB,CAClD,GAAIA,GAAM,EAAG,MAAO,UAEpB,MAAML,EAAU,KAAK,MAAMK,EAAK,GAAI,EAC9BJ,EAAU,KAAK,MAAMD,EAAU,EAAE,EACjCE,EAAQ,KAAK,MAAMD,EAAU,EAAE,EAErC,OAAIC,EAAQ,EACH,GAAGA,CAAK,KAAKD,EAAU,EAAE,IAE9BA,EAAU,EACL,GAAGA,CAAO,KAAKD,EAAU,EAAE,IAE7B,GAAGA,CAAO,GACnB,CAEO,SAASM,EAAeD,EAAuC,CACpE,OAAIA,GAAO,KAAiC,KACxCA,EAAK,IAAa,GAAGA,CAAE,KACvBA,EAAK,IAAe,IAAIA,EAAK,KAAM,QAAQ,CAAC,CAAC,IAC1C,IAAIA,EAAK,KAAQ,QAAQ,CAAC,CAAC,GACpC,CAEO,SAASE,EAAeC,EAA4B,CACzD,OAAKA,EACE,IAAI,KAAKA,CAAG,EAAE,eAAA,EADJ,IAEnB"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
function c(e){if(!(e!=null&&e.properties))return{};const t={};for(const[n,i]of Object.entries(e.properties)){const r=i;r.default!==void 0?t[n]=r.default:r.type==="string"?t[n]="":r.type==="number"||r.type==="integer"?t[n]=0:r.type==="boolean"?t[n]=!1:r.type==="object"?t[n]={}:r.type==="array"?t[n]=[]:t[n]=null}return t}function d(e){return e&&e.type||"string"}const l={app:"MCP Workflow Server",tpc:"MCP Workflow Tool",vrs:"Version",ngn:"Engine ID",jid:"Job ID",gid:"Run ID",aid:"Activity ID",ts:"Time Series",jc:"Created",ju:"Updated",trc:"Trace ID",js:"Job Status"},f={0:"Completed",1:"Pending",2:"Error"};function a(e){const t=e.match(/^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})\.(\d+)$/);if(!t)return e;const[,n,i,r,o,s,p,u]=t;return`${n}-${i}-${r} ${o}:${s}:${p}.${u}`}function b(e,t){return e==="js"&&typeof t=="number"?f[t]??`Unknown (${t})`:(e==="jc"||e==="ju")&&typeof t=="string"?a(t):String(t??"")}function y(e){return e==="llm"?"LLM":e==="db"?"DB":"MCP"}function m(e){return e==="llm"?"bg-purple-500/10 text-purple-400 border-purple-500/20":"bg-accent-primary/10 text-accent border-accent-primary/20"}export{m as a,c as b,b as f,d as i,l as m,y as s};
|
|
2
|
-
//# sourceMappingURL=helpers-0gSleuzT.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"helpers-0gSleuzT.js","sources":["../../src/pages/workflows/yaml-workflow-detail/helpers.ts"],"sourcesContent":["export type Section = 'invoke' | 'tools' | 'config';\n\nexport function buildSkeleton(schema: Record<string, any>): Record<string, any> {\n if (!schema?.properties) return {};\n const result: Record<string, any> = {};\n for (const [key, prop] of Object.entries(schema.properties)) {\n const p = prop as any;\n if (p.default !== undefined) result[key] = p.default;\n else if (p.type === 'string') result[key] = '';\n else if (p.type === 'number' || p.type === 'integer') result[key] = 0;\n else if (p.type === 'boolean') result[key] = false;\n else if (p.type === 'object') result[key] = {};\n else if (p.type === 'array') result[key] = [];\n else result[key] = null;\n }\n return result;\n}\n\nexport function inferFieldType(schemaProp: any): string {\n if (!schemaProp) return 'string';\n return schemaProp.type || 'string';\n}\n\nexport const metadataLabels: Record<string, string> = {\n app: 'MCP Workflow Server', tpc: 'MCP Workflow Tool', vrs: 'Version', ngn: 'Engine ID',\n jid: 'Job ID', gid: 'Run ID', aid: 'Activity ID', ts: 'Time Series',\n jc: 'Created', ju: 'Updated', trc: 'Trace ID', js: 'Job Status',\n};\n\nexport const jobStatusLabels: Record<number, string> = { 0: 'Completed', 1: 'Pending', 2: 'Error' };\n\nexport function parseCompactTimestamp(val: string): string {\n const match = val.match(/^(\\d{4})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})\\.(\\d+)$/);\n if (!match) return val;\n const [, y, mo, d, h, mi, s, ms] = match;\n return `${y}-${mo}-${d} ${h}:${mi}:${s}.${ms}`;\n}\n\nexport function formatMetadataValue(key: string, value: unknown): string {\n if (key === 'js' && typeof value === 'number') return jobStatusLabels[value] ?? `Unknown (${value})`;\n if ((key === 'jc' || key === 'ju') && typeof value === 'string') return parseCompactTimestamp(value);\n return String(value ?? '');\n}\n\nexport function sourceLabel(s: string | undefined) {\n if (s === 'llm') return 'LLM';\n if (s === 'db') return 'DB';\n return 'MCP';\n}\n\nexport function sourceColor(s: string | undefined) {\n if (s === 'llm') return 'bg-purple-500/10 text-purple-400 border-purple-500/20';\n return 'bg-accent-primary/10 text-accent border-accent-primary/20';\n}\n"],"names":["buildSkeleton","schema","result","key","prop","p","inferFieldType","schemaProp","metadataLabels","jobStatusLabels","parseCompactTimestamp","val","match","y","mo","d","h","mi","s","ms","formatMetadataValue","value","sourceLabel","sourceColor"],"mappings":"AAEO,SAASA,EAAcC,EAAkD,CAC9E,GAAI,EAACA,GAAA,MAAAA,EAAQ,YAAY,MAAO,CAAA,EAChC,MAAMC,EAA8B,CAAA,EACpC,SAAW,CAACC,EAAKC,CAAI,IAAK,OAAO,QAAQH,EAAO,UAAU,EAAG,CAC3D,MAAMI,EAAID,EACNC,EAAE,UAAY,OAAWH,EAAOC,CAAG,EAAIE,EAAE,QACpCA,EAAE,OAAS,SAAUH,EAAOC,CAAG,EAAI,GACnCE,EAAE,OAAS,UAAYA,EAAE,OAAS,UAAWH,EAAOC,CAAG,EAAI,EAC3DE,EAAE,OAAS,UAAWH,EAAOC,CAAG,EAAI,GACpCE,EAAE,OAAS,SAAUH,EAAOC,CAAG,EAAI,CAAA,EACnCE,EAAE,OAAS,QAASH,EAAOC,CAAG,EAAI,CAAA,EACtCD,EAAOC,CAAG,EAAI,IACrB,CACA,OAAOD,CACT,CAEO,SAASI,EAAeC,EAAyB,CACtD,OAAKA,GACEA,EAAW,MAAQ,QAC5B,CAEO,MAAMC,EAAyC,CACpD,IAAK,sBAAuB,IAAK,oBAAqB,IAAK,UAAW,IAAK,YAC3E,IAAK,SAAU,IAAK,SAAU,IAAK,cAAe,GAAI,cACtD,GAAI,UAAW,GAAI,UAAW,IAAK,WAAY,GAAI,YACrD,EAEaC,EAA0C,CAAE,EAAG,YAAa,EAAG,UAAW,EAAG,OAAA,EAEnF,SAASC,EAAsBC,EAAqB,CACzD,MAAMC,EAAQD,EAAI,MAAM,qDAAqD,EAC7E,GAAI,CAACC,EAAO,OAAOD,EACnB,KAAM,CAAA,CAAGE,EAAGC,EAAIC,EAAGC,EAAGC,EAAIC,EAAGC,CAAE,EAAIP,EACnC,MAAO,GAAGC,CAAC,IAAIC,CAAE,IAAIC,CAAC,IAAIC,CAAC,IAAIC,CAAE,IAAIC,CAAC,IAAIC,CAAE,EAC9C,CAEO,SAASC,EAAoBjB,EAAakB,EAAwB,CACvE,OAAIlB,IAAQ,MAAQ,OAAOkB,GAAU,SAAiBZ,EAAgBY,CAAK,GAAK,YAAYA,CAAK,KAC5FlB,IAAQ,MAAQA,IAAQ,OAAS,OAAOkB,GAAU,SAAiBX,EAAsBW,CAAK,EAC5F,OAAOA,GAAS,EAAE,CAC3B,CAEO,SAASC,EAAYJ,EAAuB,CACjD,OAAIA,IAAM,MAAc,MACpBA,IAAM,KAAa,KAChB,KACT,CAEO,SAASK,EAAYL,EAAuB,CACjD,OAAIA,IAAM,MAAc,wDACjB,2DACT"}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import{j as e,a as h}from"./vendor-query-B2UbickB.js";import{u as L,c as $,d as q,e as B,f as z,b as H}from"./workflows-Cc4VHcrp.js";import{P as U}from"./PageHeader-CpWFly5S.js";import{S as C,f as W}from"./index-D8VH6K8B.js";import{D as V}from"./DataTable-BDn1WBHS.js";import{B as G}from"./BotPicker-D6FYW1Gt.js";import{T as K}from"./TimeAgo-UPG6DoH8.js";import{S as Q}from"./StatusBadge-TlC4jiig.js";import{q as X,d as Y,r as T,s as Z,P as ee,p as te}from"./vendor-icons-ZTAKVwGc.js";import{L as se,e as ae,b as D}from"./vendor-react-Cw8Gy8NJ.js";import"./EmptyState-2CmV-IaS.js";import"./bots-BkKVMbUW.js";import"./format-gXZXQ-HJ.js";function R({children:t,className:n=""}){return e.jsx("span",{className:`px-2 py-0.5 text-[10px] bg-surface-sunken rounded-full text-text-secondary ${n}`,children:t})}const P=`{
|
|
2
|
-
"data": {},
|
|
3
|
-
"metadata": {}
|
|
4
|
-
}`;function ne(t){return typeof t=="boolean"?"boolean":typeof t=="number"?"number":Array.isArray(t)?"array":t!==null&&typeof t=="object"?"object":"string"}function I(t){if(!t)return[];const n=t.data;return!n||typeof n!="object"?[]:Object.entries(n).map(([i,o])=>({key:i,type:ne(o),defaultValue:o}))}function J(t){return{...t}}function F(t,n){return JSON.stringify({data:t,metadata:n},null,2)}const re={"* * * * *":"Every minute","*/5 * * * *":"Every 5 minutes","*/15 * * * *":"Every 15 minutes","*/30 * * * *":"Every 30 minutes","0 * * * *":"Every hour","0 */2 * * *":"Every 2 hours","0 */6 * * *":"Every 6 hours","0 */12 * * *":"Every 12 hours","0 0 * * *":"Daily at midnight","0 9 * * *":"Daily at 9 AM","0 9 * * 1-5":"Weekdays at 9 AM","0 0 * * 0":"Weekly (Sunday midnight)","0 0 1 * *":"Monthly (1st at midnight)","0 2 * * *":"Daily at 2 AM"};function A(t){return re[t]??""}const oe=[["*/15 * * * *","Every 15 min"],["0 * * * *","Every hour"],["0 */6 * * *","Every 6 hours"],["0 9 * * *","Daily 9 AM"],["0 9 * * 1-5","Weekdays 9 AM"],["0 0 * * 0","Weekly (Sun)"]];function le(t){const n=t==null?void 0:t.data;if(!n||typeof n!="object"||Array.isArray(n))return null;const i=Object.entries(n);return i.length===0||!i.every(([,s])=>typeof s=="string"||typeof s=="number"||typeof s=="boolean"||s===null)?null:i.map(([s,l])=>({key:s,value:l===null?"":String(l),type:l===null?"string":typeof l}))}const ce=[{key:"workflow_id",label:"Workflow ID",render:t=>e.jsx("span",{className:"font-mono text-[11px] text-text-secondary",children:t.workflow_id.length>40?`${t.workflow_id.slice(0,40)}...`:t.workflow_id})},{key:"status",label:"Status",render:t=>e.jsx(Q,{status:t.status}),className:"w-28"},{key:"created_at",label:"Started",render:t=>e.jsx(K,{date:t.created_at}),className:"w-32"}];function ie({configs:t,selectedType:n,onSelect:i,certifiedTypes:o}){return e.jsxs("div",{children:[e.jsx(C,{className:"mb-6",children:"Select Workflow"}),e.jsx("div",{children:t.map(s=>{const l=n===s.workflow_type,u=o.has(s.workflow_type);return e.jsxs("button",{onClick:()=>i(s),className:`w-full text-left py-4 border-b border-surface-border transition-colors duration-150 ${l?"border-l-2 border-l-accent pl-4":"pl-0 hover:text-text-primary"}`,children:[e.jsxs("div",{className:"flex items-center gap-2",children:[u?e.jsx(X,{className:"w-3.5 h-3.5 shrink-0 text-status-success"}):e.jsx(Y,{className:"w-3.5 h-3.5 shrink-0 text-accent/75"}),e.jsx("p",{className:`text-sm font-mono ${l?"font-medium text-accent":"text-text-secondary"}`,children:s.workflow_type}),s.execute_as&&e.jsxs("span",{className:"inline-flex items-center gap-0.5 px-1.5 py-0.5 text-[9px] bg-accent/10 text-accent rounded",children:[e.jsx(T,{className:"w-2.5 h-2.5"}),s.execute_as]})]}),s.description&&e.jsx("p",{className:"text-[11px] text-text-tertiary mt-1 leading-relaxed",children:s.description}),e.jsx("p",{className:"text-[10px] text-text-tertiary mt-1 opacity-60",children:s.task_queue})]},s.workflow_type)})})]})}function xe({selectedConfig:t,isJsonMode:n,hasFormView:i,jsonInput:o,formFields:s,dataFields:l,onJsonChange:u,onToggleMode:N,onUpdateFormField:f,onSetFormFields:y}){return e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-baseline justify-between mb-2",children:[e.jsx("label",{className:"block text-xs text-text-secondary",children:"Envelope"}),e.jsxs("div",{className:"flex items-center gap-3",children:[i&&e.jsx("button",{type:"button",onClick:N,className:"text-[10px] text-accent hover:underline",children:n?"Form view":"JSON view"}),t.envelope_schema?e.jsx("span",{className:"text-[10px] text-accent",children:"Pre-filled from workflow config"}):e.jsx("span",{className:"text-[10px] text-status-warning",children:"No template"})]})]}),!t.envelope_schema&&e.jsx("div",{className:"bg-surface-sunken border border-surface-border rounded px-4 py-3 mb-3",children:e.jsxs("p",{className:"text-xs text-text-secondary leading-relaxed",children:["This workflow has no input template. Edit the JSON directly below, or register it as a ",e.jsx(se,{to:"/workflows/registry/new",className:"text-status-success hover:underline",children:"certified workflow"})," in the Workflow Registry for pre-filled fields and form-based input."]})}),n||!i?e.jsx("textarea",{value:o,onChange:c=>u(c.target.value),className:"input font-mono text-xs",rows:12,spellCheck:!1}):e.jsx("div",{className:"space-y-3",children:l.map(({key:c,type:m})=>{var b,k;const x=s[c],j=typeof x=="string"?x:JSON.stringify(x??(m==="array"?[]:{}),null,2),g=Math.min(20,Math.max(4,((k=(b=j==null?void 0:j.split)==null?void 0:b.call(j,`
|
|
5
|
-
`))==null?void 0:k.length)??4));return e.jsxs("div",{children:[e.jsxs("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:[c,e.jsx("span",{className:"ml-2 font-normal normal-case",children:m})]}),m==="boolean"?e.jsxs("select",{value:String(x??!1),onChange:w=>f(c,w.target.value,m),className:"select text-xs w-full",children:[e.jsx("option",{value:"true",children:"true"}),e.jsx("option",{value:"false",children:"false"})]}):m==="object"||m==="array"?e.jsx("textarea",{value:j,onChange:w=>{try{f(c,JSON.parse(w.target.value),m)}catch{y({...s,[c]:w.target.value})}},className:"input font-mono text-[11px] w-full leading-relaxed",rows:g,spellCheck:!1}):e.jsx("input",{type:m==="number"?"number":"text",value:String(x??""),onChange:w=>f(c,w.target.value,m),className:"input text-xs w-full"})]},c)})}),e.jsxs("p",{className:"text-[10px] text-text-tertiary mt-1.5",children:["The envelope wraps your workflow input. ",e.jsx("code",{className:"text-accent/80",children:"data"})," holds workflow-specific fields; ",e.jsx("code",{className:"text-accent/80",children:"metadata"})," is optional context."]})]})}function de({mode:t,onChange:n}){const i=(o,s,l)=>e.jsxs("button",{onClick:()=>n(o),className:`flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md transition-colors ${t===o?"bg-accent/10 text-accent font-medium":"text-text-tertiary hover:text-text-secondary hover:bg-surface-hover"}`,children:[s,l]});return e.jsxs("div",{className:"flex gap-1 p-0.5 bg-surface-sunken rounded-lg w-fit",children:[i("now",e.jsx(ee,{className:"w-3.5 h-3.5"}),"Start Now"),i("schedule",e.jsx(te,{className:"w-3.5 h-3.5"}),"Schedule")]})}function ue({config:t,overrideBot:n,onOverrideChange:i,showOverride:o}){const{user:s}=W(),l=n||t.execute_as;return e.jsxs("div",{className:"bg-surface-sunken rounded-lg px-4 py-3 space-y-2",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"text-[10px] text-text-tertiary uppercase tracking-wider font-medium",children:"Running as"}),l&&!n&&e.jsx("span",{className:"text-[9px] text-text-tertiary",children:"configured default"}),n&&e.jsx("span",{className:"text-[9px] text-accent",children:"admin override"})]}),e.jsx("div",{className:"flex items-center gap-1.5",children:l?e.jsxs(e.Fragment,{children:[e.jsx(T,{className:"w-3.5 h-3.5 text-accent/70"}),e.jsx("span",{className:"text-xs text-text-primary font-mono",children:l})]}):e.jsxs(e.Fragment,{children:[e.jsx(Z,{className:"w-3.5 h-3.5 text-text-tertiary"}),e.jsx("span",{className:"text-xs text-text-primary",children:(s==null?void 0:s.displayName)||(s==null?void 0:s.username)||"you"})]})}),o&&i&&e.jsxs("div",{className:"pt-1 border-t border-surface-border",children:[e.jsx("label",{className:"text-[10px] text-text-tertiary mb-1 block",children:"Override identity"}),e.jsx(G,{selected:n??"",onChange:i,placeholder:t.execute_as?`Default: ${t.execute_as}`:"Invoking user (default)"})]})]})}function me({selected:t,activeTypes:n}){const i=D(),o=z(),[s,l]=h.useState(""),[u,N]=h.useState(""),[f,y]=h.useState(""),[c,m]=h.useState("json"),x=h.useMemo(()=>t!=null&&t.envelope_schema?JSON.stringify(t.envelope_schema,null,2):P,[t==null?void 0:t.envelope_schema]),j=u!==x,g=h.useMemo(()=>{try{return JSON.parse(u)}catch{return null}},[u]),b=h.useMemo(()=>g?le(g):null,[g]);h.useEffect(()=>{l(t.cron_schedule??""),N(t.envelope_schema?JSON.stringify(t.envelope_schema,null,2):P),y(""),m("json"),o.reset()},[t.workflow_type]);const{data:k,isLoading:w}=H({entity:t.workflow_type,limit:10}),p=()=>{let a;try{a=JSON.parse(u)}catch{y("Invalid JSON in envelope");return}y(""),o.mutate({config:t,cron_schedule:s.trim()||null,envelope_schema:a})},S=()=>{l(""),o.mutate({config:t,cron_schedule:null})},O=()=>{N(x),y("")},E=(a,r)=>{if(!g)return;const d={...g.data??{}},v=d[a];typeof v=="number"?d[a]=r===""?0:Number(r):typeof v=="boolean"?d[a]=r==="true":d[a]=r,N(JSON.stringify({...g,data:d},null,2))};return e.jsxs("div",{className:"space-y-8",children:[e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(C,{children:t.workflow_type}),t.cron_schedule&&e.jsx(R,{className:n.has(t.workflow_type)?"bg-status-success/10 text-status-success":"bg-surface-sunken text-text-tertiary",children:n.has(t.workflow_type)?"active":"inactive"})]}),t.description&&e.jsx("p",{className:"text-xs text-text-tertiary mt-2 leading-relaxed",children:t.description})]}),e.jsx("div",{className:"bg-surface-sunken rounded-lg px-4 py-3",children:e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"text-[10px] text-text-tertiary uppercase tracking-wider font-medium mr-2",children:"Cron runs as"}),e.jsx(T,{className:"w-3.5 h-3.5 text-accent/70"}),e.jsx("span",{className:"text-xs text-text-primary font-mono",children:t.execute_as??"lt-system"}),!t.execute_as&&e.jsx("span",{className:"text-[9px] text-text-tertiary ml-1",children:"system bot"})]})}),e.jsxs("div",{children:[e.jsx(C,{className:"mb-3",children:"Schedule"}),e.jsxs("div",{className:"flex gap-3 items-start",children:[e.jsxs("div",{className:"flex-1",children:[e.jsx("input",{type:"text",value:s,onChange:a=>{l(a.target.value),o.reset()},placeholder:"0 */6 * * *",className:"input font-mono text-sm w-full"}),s.trim()&&A(s.trim())&&e.jsx("p",{className:"text-xs text-text-secondary mt-1.5",children:A(s.trim())})]}),e.jsx("button",{onClick:p,disabled:o.isPending,className:"btn-primary text-xs shrink-0",children:o.isPending?"Saving...":"Save"}),t.cron_schedule&&e.jsx("button",{onClick:S,disabled:o.isPending,className:"btn-ghost text-xs text-status-error shrink-0",children:"Clear"})]}),o.isSuccess&&e.jsx("p",{className:"text-[10px] text-status-success mt-2",children:"Schedule updated"}),o.error&&e.jsx("p",{className:"text-[10px] text-status-error mt-2",children:o.error.message})]}),e.jsxs("div",{className:"bg-surface-sunken rounded-lg p-4",children:[e.jsx(C,{className:"mb-2",children:"Common Patterns"}),e.jsx("div",{className:"grid grid-cols-2 sm:grid-cols-3 gap-x-6 gap-y-1.5",children:oe.map(([a,r])=>e.jsxs("button",{type:"button",onClick:()=>{l(a),o.reset()},className:"flex items-center gap-2 text-left py-0.5 group",children:[e.jsx("code",{className:"font-mono text-[11px] text-accent group-hover:text-accent-hover",children:a}),e.jsx("span",{className:"text-[10px] text-text-tertiary",children:r})]},a))})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-baseline justify-between mb-2",children:[e.jsx(C,{children:"Cron Envelope"}),e.jsxs("div",{className:"flex items-center gap-3",children:[j&&e.jsx("button",{type:"button",onClick:O,className:"text-[10px] text-status-warning hover:text-status-warning/80 transition-colors",children:"Reset to default"}),b&&e.jsxs("div",{className:"flex rounded overflow-hidden border border-surface-border",children:[e.jsx("button",{type:"button",onClick:()=>m("form"),className:`px-2 py-0.5 text-[10px] transition-colors ${c==="form"?"bg-accent/10 text-accent":"text-text-tertiary hover:text-text-secondary"}`,children:"Form"}),e.jsx("button",{type:"button",onClick:()=>m("json"),className:`px-2 py-0.5 text-[10px] transition-colors ${c==="json"?"bg-accent/10 text-accent":"text-text-tertiary hover:text-text-secondary"}`,children:"JSON"})]})]})]}),e.jsx("p",{className:"text-[10px] text-text-tertiary mb-3",children:"This envelope is sent as the workflow input on each cron invocation."}),c==="form"&&b?e.jsx("div",{className:"space-y-3",children:b.map(({key:a,value:r,type:d})=>e.jsxs("div",{children:[e.jsx("label",{className:"block text-[11px] text-text-secondary mb-1 font-mono",children:a}),d==="boolean"?e.jsxs("select",{value:r,onChange:v=>E(a,v.target.value),className:"input text-xs w-full",children:[e.jsx("option",{value:"true",children:"true"}),e.jsx("option",{value:"false",children:"false"})]}):e.jsx("input",{type:d==="number"?"number":"text",value:r,onChange:v=>E(a,v.target.value),className:"input text-xs font-mono w-full"})]},a))}):e.jsx("textarea",{value:u,onChange:a=>{N(a.target.value),y("")},className:"input font-mono text-xs w-full",rows:10,spellCheck:!1}),f&&e.jsx("p",{className:"text-[10px] text-status-error mt-2",children:f}),j&&e.jsx("p",{className:"text-[10px] text-accent mt-1.5",children:"Envelope has been customized. Changes will be saved with the schedule."})]}),e.jsxs("div",{children:[e.jsx(C,{className:"mb-3",children:"Recent Executions"}),e.jsx(V,{columns:ce,data:(k==null?void 0:k.jobs)??[],keyFn:a=>a.workflow_id,onRowClick:a=>i(`/workflows/executions/${a.workflow_id}`),isLoading:w,emptyMessage:"No executions yet"})]})]})}function pe({selected:t,executionsPath:n}){const i=D(),{isSuperAdmin:o,hasRoleType:s}=W(),l=o||s("admin"),u=B(),[N,f]=h.useState(P),[y,c]=h.useState(""),[m,x]=h.useState({}),[j,g]=h.useState(!1),[b,k]=h.useState(""),w=h.useMemo(()=>I(t.envelope_schema??null),[t.envelope_schema]),p=w.length>0,S=h.useMemo(()=>{if(!t.envelope_schema)return{};const r=t.envelope_schema.metadata;return r&&typeof r=="object"?r:{}},[t.envelope_schema]);h.useEffect(()=>{var v;c(""),u.reset();const r=sessionStorage.getItem("lt:invoke:prefill");if(r){sessionStorage.removeItem("lt:invoke:prefill"),f(r);try{const _=JSON.parse(r),M=(_==null?void 0:_.data)??_;M&&typeof M=="object"&&x(J(M))}catch{}g(!0),k("");return}const d=t.envelope_schema?JSON.stringify(t.envelope_schema,null,2):P;f(d),(v=t.envelope_schema)!=null&&v.data&&typeof t.envelope_schema.data=="object"?x(J(t.envelope_schema.data)):x({}),g(!I(t.envelope_schema??null).length),k("")},[t.workflow_type]);const O=()=>{if(j)try{const r=JSON.parse(N);r.data&&typeof r.data=="object"&&x(J(r.data))}catch{}else f(F(m,S));g(!j)},E=(r,d,v)=>{let _=d;v==="number"?_=d===""?0:Number(d):v==="boolean"&&(_=d==="true"||d===!0);const M={...m,[r]:_};x(M),f(F(M,S))},a=async()=>{c("");let r;try{r=JSON.parse(N)}catch{c("Invalid JSON");return}const{data:d,metadata:v}=r;if(!d||typeof d!="object"){c('Envelope must include a "data" object');return}try{await u.mutateAsync({workflowType:t.workflow_type,data:d,metadata:v??void 0,...b?{execute_as:b}:{}}),i(n)}catch{}};return e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(C,{children:t.workflow_type}),e.jsx("div",{className:"flex gap-2",children:t.roles.map(r=>e.jsx(R,{children:r},r))})]}),t.description&&e.jsx("p",{className:"text-sm text-text-secondary mt-2 leading-relaxed",children:t.description})]}),e.jsx(ue,{config:t,overrideBot:b,onOverrideChange:k,showOverride:l}),e.jsx(xe,{selectedConfig:t,isJsonMode:j,hasFormView:p,jsonInput:N,formFields:m,dataFields:w,onJsonChange:r=>{f(r),c("")},onToggleMode:O,onUpdateFormField:E,onSetFormFields:x}),y&&e.jsx("p",{className:"text-xs text-status-error",children:y}),u.error&&e.jsx("p",{className:"text-xs text-status-error",children:u.error.message}),u.isSuccess&&e.jsx("p",{className:"text-xs text-status-success",children:"Workflow started"}),e.jsx("button",{onClick:a,disabled:u.isPending,className:"btn-primary",children:u.isPending?"Starting...":"Start Workflow"})]})}function he({tier:t}){const[n,i]=ae(),{data:o,isLoading:s}=L(),{data:l,isLoading:u}=$(),{data:N}=q(),f=n.get("mode")||"now",y=n.get("type")??"",c=o??[],m=h.useMemo(()=>new Set(c.filter(p=>p.invocable).map(p=>p.workflow_type)),[c]),x=h.useMemo(()=>{const p=c.filter(a=>a.invocable),S=new Set(c.map(a=>a.workflow_type)),E=(l??[]).filter(a=>a.active&&!S.has(a.workflow_type)).map(a=>({workflow_type:a.workflow_type,task_queue:a.task_queue??"",invocable:!0,description:null,default_role:"reviewer",roles:[],invocation_roles:[],consumes:[],envelope_schema:null,resolver_schema:null,cron_schedule:null,execute_as:null}));return[...p,...E]},[c,l]),j=x.find(p=>p.workflow_type===y),g=new Set((N??[]).filter(p=>p.active).map(p=>p.workflow_type)),b="/workflows/executions";h.useEffect(()=>{x.length===1&&!n.get("type")&&i({type:x[0].workflow_type,mode:f},{replace:!0})},[x.length]);const k=p=>{const S={mode:p};y&&(S.type=y),i(S,{replace:!0})},w=p=>{i({type:p.workflow_type,mode:f},{replace:!0})};return s||u?e.jsxs("div",{className:"animate-pulse space-y-4",children:[e.jsx("div",{className:"h-8 bg-surface-sunken rounded w-48"}),e.jsx("div",{className:"h-40 bg-surface-sunken rounded"})]}):e.jsxs("div",{children:[e.jsx(U,{title:"Invoke Workflow",actions:e.jsx(de,{mode:f,onChange:k})}),x.length===0?e.jsxs("div",{className:"py-16 text-center",children:[e.jsx("p",{className:"text-sm text-text-primary mb-1",children:"No invocable workflows"}),e.jsx("p",{className:"text-xs text-text-tertiary",children:"Mark workflows as invocable in the registry, or start the server with examples enabled."})]}):e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-3 gap-12",children:[e.jsx(ie,{configs:x,selectedType:y,onSelect:w,certifiedTypes:m}),e.jsx("div",{className:"lg:col-span-2",children:y&&j?f==="now"?e.jsx(pe,{selected:j,executionsPath:b}):e.jsx(me,{selected:j,activeTypes:g}):e.jsx("div",{className:"py-16 text-center",children:e.jsx("p",{className:"text-sm text-text-tertiary",children:"Select a workflow to begin"})})})]})]})}function Me(){return e.jsx(he,{tier:"durable"})}export{Me as DurableInvokePage,he as StartWorkflowPage};
|
|
6
|
-
//# sourceMappingURL=index-BWvMHed7.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-BWvMHed7.js","sources":["../../src/components/common/display/Pill.tsx","../../src/pages/workflows/start/helpers.ts","../../src/pages/workflows/cron/helpers.tsx","../../src/pages/workflows/start/WorkflowSelector.tsx","../../src/pages/workflows/start/EnvelopeEditor.tsx","../../src/pages/workflows/start/StartWorkflowPage.tsx","../../src/pages/workflows/start/DurableInvokePage.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\ninterface PillProps {\n children: ReactNode;\n className?: string;\n}\n\nexport function Pill({ children, className = '' }: PillProps) {\n return (\n <span className={`px-2 py-0.5 text-[10px] bg-surface-sunken rounded-full text-text-secondary ${className}`}>\n {children}\n </span>\n );\n}\n","export const DEFAULT_ENVELOPE = '{\\n \"data\": {},\\n \"metadata\": {}\\n}';\n\n/** Infer a simple field type from a value. */\nexport function inferTypeFromValue(value: unknown): string {\n if (typeof value === 'boolean') return 'boolean';\n if (typeof value === 'number') return 'number';\n if (Array.isArray(value)) return 'array';\n if (value !== null && typeof value === 'object') return 'object';\n return 'string';\n}\n\n/** Extract the data keys from an envelope_schema and their inferred types. */\nexport function extractDataFields(\n schema: Record<string, unknown> | null,\n): { key: string; type: string; defaultValue: unknown }[] {\n if (!schema) return [];\n const data = schema.data;\n if (!data || typeof data !== 'object') return [];\n return Object.entries(data as Record<string, unknown>).map(([key, value]) => ({\n key,\n type: inferTypeFromValue(value),\n defaultValue: value,\n }));\n}\n\n/** Build form field values from data object. */\nexport function dataToFields(data: Record<string, unknown>): Record<string, unknown> {\n return { ...data };\n}\n\n/** Build full envelope JSON string from form fields + metadata. */\nexport function fieldsToJson(\n fields: Record<string, unknown>,\n metadata: Record<string, unknown>,\n): string {\n return JSON.stringify({ data: fields, metadata }, null, 2);\n}\n","import type { LTJob } from '../../../api/types';\nimport type { Column } from '../../../components/common/data/DataTable';\nimport { TimeAgo } from '../../../components/common/display/TimeAgo';\nimport { StatusBadge } from '../../../components/common/display/StatusBadge';\n\n// -- Cron descriptions -------------------------------------------------------\n\nconst CRON_DESCRIPTIONS: Record<string, string> = {\n '* * * * *': 'Every minute',\n '*/5 * * * *': 'Every 5 minutes',\n '*/15 * * * *': 'Every 15 minutes',\n '*/30 * * * *': 'Every 30 minutes',\n '0 * * * *': 'Every hour',\n '0 */2 * * *': 'Every 2 hours',\n '0 */6 * * *': 'Every 6 hours',\n '0 */12 * * *': 'Every 12 hours',\n '0 0 * * *': 'Daily at midnight',\n '0 9 * * *': 'Daily at 9 AM',\n '0 9 * * 1-5': 'Weekdays at 9 AM',\n '0 0 * * 0': 'Weekly (Sunday midnight)',\n '0 0 1 * *': 'Monthly (1st at midnight)',\n '0 2 * * *': 'Daily at 2 AM',\n};\n\nexport function describeCron(expr: string): string {\n return CRON_DESCRIPTIONS[expr] ?? '';\n}\n\nexport const COMMON_PATTERNS: [string, string][] = [\n ['*/15 * * * *', 'Every 15 min'],\n ['0 * * * *', 'Every hour'],\n ['0 */6 * * *', 'Every 6 hours'],\n ['0 9 * * *', 'Daily 9 AM'],\n ['0 9 * * 1-5', 'Weekdays 9 AM'],\n ['0 0 * * 0', 'Weekly (Sun)'],\n];\n\nexport const DEFAULT_ENVELOPE = '{\\n \"data\": {},\\n \"metadata\": {}\\n}';\n\n// -- Envelope helpers ---------------------------------------------------------\n\n/** Extract simple string/number/boolean keys from `data` for form view. */\nexport function extractFormFields(\n envelope: Record<string, unknown>,\n): { key: string; value: string; type: string }[] | null {\n const data = envelope?.data;\n if (!data || typeof data !== 'object' || Array.isArray(data)) return null;\n const entries = Object.entries(data as Record<string, unknown>);\n if (entries.length === 0) return null;\n // Only show form if all values are scalar\n const allScalar = entries.every(\n ([, v]) => typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean' || v === null,\n );\n if (!allScalar) return null;\n return entries.map(([key, value]) => ({\n key,\n value: value === null ? '' : String(value),\n type: value === null ? 'string' : typeof value,\n }));\n}\n\n// -- Recent jobs table columns ------------------------------------------------\n\nexport const jobColumns: Column<LTJob>[] = [\n {\n key: 'workflow_id',\n label: 'Workflow ID',\n render: (row) => (\n <span className=\"font-mono text-[11px] text-text-secondary\">\n {row.workflow_id.length > 40\n ? `${row.workflow_id.slice(0, 40)}...`\n : row.workflow_id}\n </span>\n ),\n },\n {\n key: 'status',\n label: 'Status',\n render: (row) => <StatusBadge status={row.status} />,\n className: 'w-28',\n },\n {\n key: 'created_at',\n label: 'Started',\n render: (row) => <TimeAgo date={row.created_at} />,\n className: 'w-32',\n },\n];\n","import { Bot, ShieldCheck, Workflow } from 'lucide-react';\nimport { SectionLabel } from '../../../components/common/layout/SectionLabel';\nimport type { LTWorkflowConfig } from '../../../api/types';\n\nexport function WorkflowSelector({\n configs,\n selectedType,\n onSelect,\n certifiedTypes,\n}: {\n configs: LTWorkflowConfig[];\n selectedType: string;\n onSelect: (config: LTWorkflowConfig) => void;\n certifiedTypes: Set<string>;\n}) {\n return (\n <div>\n <SectionLabel className=\"mb-6\">Select Workflow</SectionLabel>\n <div>\n {configs.map((config) => {\n const isSelected = selectedType === config.workflow_type;\n const isCertified = certifiedTypes.has(config.workflow_type);\n return (\n <button\n key={config.workflow_type}\n onClick={() => onSelect(config)}\n className={`w-full text-left py-4 border-b border-surface-border transition-colors duration-150 ${\n isSelected\n ? 'border-l-2 border-l-accent pl-4'\n : 'pl-0 hover:text-text-primary'\n }`}\n >\n <div className=\"flex items-center gap-2\">\n {isCertified\n ? <ShieldCheck className=\"w-3.5 h-3.5 shrink-0 text-status-success\" />\n : <Workflow className=\"w-3.5 h-3.5 shrink-0 text-accent/75\" />}\n <p className={`text-sm font-mono ${isSelected ? 'font-medium text-accent' : 'text-text-secondary'}`}>\n {config.workflow_type}\n </p>\n {config.execute_as && (\n <span className=\"inline-flex items-center gap-0.5 px-1.5 py-0.5 text-[9px] bg-accent/10 text-accent rounded\">\n <Bot className=\"w-2.5 h-2.5\" />\n {config.execute_as}\n </span>\n )}\n </div>\n {config.description && (\n <p className=\"text-[11px] text-text-tertiary mt-1 leading-relaxed\">\n {config.description}\n </p>\n )}\n <p className=\"text-[10px] text-text-tertiary mt-1 opacity-60\">\n {config.task_queue}\n </p>\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n","import { Link } from 'react-router-dom';\nimport type { LTWorkflowConfig } from '../../../api/types';\n\ninterface DataField {\n key: string;\n type: string;\n defaultValue: unknown;\n}\n\nexport function EnvelopeEditor({\n selectedConfig,\n isJsonMode,\n hasFormView,\n jsonInput,\n formFields,\n dataFields,\n onJsonChange,\n onToggleMode,\n onUpdateFormField,\n onSetFormFields,\n}: {\n selectedConfig: LTWorkflowConfig;\n isJsonMode: boolean;\n hasFormView: boolean;\n jsonInput: string;\n formFields: Record<string, unknown>;\n dataFields: DataField[];\n onJsonChange: (value: string) => void;\n onToggleMode: () => void;\n onUpdateFormField: (key: string, value: unknown, type: string) => void;\n onSetFormFields: (fields: Record<string, unknown>) => void;\n}) {\n return (\n <div>\n <div className=\"flex items-baseline justify-between mb-2\">\n <label className=\"block text-xs text-text-secondary\">\n Envelope\n </label>\n <div className=\"flex items-center gap-3\">\n {hasFormView && (\n <button\n type=\"button\"\n onClick={onToggleMode}\n className=\"text-[10px] text-accent hover:underline\"\n >\n {isJsonMode ? 'Form view' : 'JSON view'}\n </button>\n )}\n {selectedConfig.envelope_schema ? (\n <span className=\"text-[10px] text-accent\">\n Pre-filled from workflow config\n </span>\n ) : (\n <span className=\"text-[10px] text-status-warning\">\n No template\n </span>\n )}\n </div>\n </div>\n\n {!selectedConfig.envelope_schema && (\n <div className=\"bg-surface-sunken border border-surface-border rounded px-4 py-3 mb-3\">\n <p className=\"text-xs text-text-secondary leading-relaxed\">\n This workflow has no input template. Edit the JSON directly below, or register it as a <Link to=\"/workflows/registry/new\" className=\"text-status-success hover:underline\">certified workflow</Link> in the Workflow Registry for pre-filled fields and form-based input.\n </p>\n </div>\n )}\n\n {isJsonMode || !hasFormView ? (\n /* JSON view */\n <textarea\n value={jsonInput}\n onChange={(e) => onJsonChange(e.target.value)}\n className=\"input font-mono text-xs\"\n rows={12}\n spellCheck={false}\n />\n ) : (\n /* Form view */\n <div className=\"space-y-3\">\n {dataFields.map(({ key, type }) => {\n const value = formFields[key];\n const jsonValue =\n typeof value === 'string'\n ? value\n : JSON.stringify(\n value ?? (type === 'array' ? [] : {}),\n null,\n 2,\n );\n const textareaRows = Math.min(\n 20,\n Math.max(4, (jsonValue?.split?.('\\n')?.length ?? 4)),\n );\n return (\n <div key={key}>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n {key}\n <span className=\"ml-2 font-normal normal-case\">\n {type}\n </span>\n </label>\n {type === 'boolean' ? (\n <select\n value={String(value ?? false)}\n onChange={(e) =>\n onUpdateFormField(key, e.target.value, type)\n }\n className=\"select text-xs w-full\"\n >\n <option value=\"true\">true</option>\n <option value=\"false\">false</option>\n </select>\n ) : type === 'object' || type === 'array' ? (\n <textarea\n value={jsonValue}\n onChange={(e) => {\n try {\n onUpdateFormField(\n key,\n JSON.parse(e.target.value),\n type,\n );\n } catch {\n // Keep raw text without syncing to JSON\n onSetFormFields({\n ...formFields,\n [key]: e.target.value,\n });\n }\n }}\n className=\"input font-mono text-[11px] w-full leading-relaxed\"\n rows={textareaRows}\n spellCheck={false}\n />\n ) : (\n <input\n type={type === 'number' ? 'number' : 'text'}\n value={String(value ?? '')}\n onChange={(e) =>\n onUpdateFormField(key, e.target.value, type)\n }\n className=\"input text-xs w-full\"\n />\n )}\n </div>\n );\n })}\n </div>\n )}\n <p className=\"text-[10px] text-text-tertiary mt-1.5\">\n The envelope wraps your workflow input. <code className=\"text-accent/80\">data</code> holds workflow-specific fields; <code className=\"text-accent/80\">metadata</code> is optional context.\n </p>\n </div>\n );\n}\n","import { useState, useEffect, useMemo } from 'react';\nimport { useNavigate, useSearchParams } from 'react-router-dom';\nimport { Play, Clock, Bot, UserCircle } from 'lucide-react';\nimport { useWorkflowConfigs, useDiscoveredWorkflows, useInvokeWorkflow, useCronStatus, useSetCronSchedule, useJobs } from '../../../api/workflows';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { SectionLabel } from '../../../components/common/layout/SectionLabel';\nimport { Pill } from '../../../components/common/display/Pill';\nimport { DataTable } from '../../../components/common/data/DataTable';\nimport { BotPicker } from '../../../components/common/form/BotPicker';\nimport { useAuth } from '../../../hooks/useAuth';\nimport type { LTWorkflowConfig } from '../../../api/types';\nimport {\n DEFAULT_ENVELOPE,\n extractDataFields,\n dataToFields,\n fieldsToJson,\n} from './helpers';\nimport { describeCron, COMMON_PATTERNS, extractFormFields, jobColumns } from '../cron/helpers';\nimport { WorkflowSelector } from './WorkflowSelector';\nimport { EnvelopeEditor } from './EnvelopeEditor';\n\nexport type InvokeTier = 'certified' | 'durable';\ntype Mode = 'now' | 'schedule';\n\n// ── Mode toggle ─────────────────────────────────────────────────────────────\n\nfunction ModeToggle({ mode, onChange }: { mode: Mode; onChange: (m: Mode) => void }) {\n const btn = (m: Mode, icon: React.ReactNode, label: string) => (\n <button\n onClick={() => onChange(m)}\n className={`flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md transition-colors ${\n mode === m\n ? 'bg-accent/10 text-accent font-medium'\n : 'text-text-tertiary hover:text-text-secondary hover:bg-surface-hover'\n }`}\n >\n {icon}\n {label}\n </button>\n );\n\n return (\n <div className=\"flex gap-1 p-0.5 bg-surface-sunken rounded-lg w-fit\">\n {btn('now', <Play className=\"w-3.5 h-3.5\" />, 'Start Now')}\n {btn('schedule', <Clock className=\"w-3.5 h-3.5\" />, 'Schedule')}\n </div>\n );\n}\n\n// ── Identity summary ────────────────────────────────────────────────────────\n\nfunction IdentitySummary({\n config,\n overrideBot,\n onOverrideChange,\n showOverride,\n}: {\n config: LTWorkflowConfig;\n overrideBot?: string;\n onOverrideChange?: (botExternalId: string) => void;\n showOverride?: boolean;\n}) {\n const { user } = useAuth();\n const effectiveBot = overrideBot || config.execute_as;\n\n return (\n <div className=\"bg-surface-sunken rounded-lg px-4 py-3 space-y-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-[10px] text-text-tertiary uppercase tracking-wider font-medium\">Running as</span>\n {effectiveBot && !overrideBot && (\n <span className=\"text-[9px] text-text-tertiary\">configured default</span>\n )}\n {overrideBot && (\n <span className=\"text-[9px] text-accent\">admin override</span>\n )}\n </div>\n <div className=\"flex items-center gap-1.5\">\n {effectiveBot ? (\n <>\n <Bot className=\"w-3.5 h-3.5 text-accent/70\" />\n <span className=\"text-xs text-text-primary font-mono\">{effectiveBot}</span>\n </>\n ) : (\n <>\n <UserCircle className=\"w-3.5 h-3.5 text-text-tertiary\" />\n <span className=\"text-xs text-text-primary\">\n {user?.displayName || user?.username || 'you'}\n </span>\n </>\n )}\n </div>\n {showOverride && onOverrideChange && (\n <div className=\"pt-1 border-t border-surface-border\">\n <label className=\"text-[10px] text-text-tertiary mb-1 block\">Override identity</label>\n <BotPicker\n selected={overrideBot ?? ''}\n onChange={onOverrideChange}\n placeholder={config.execute_as ? `Default: ${config.execute_as}` : 'Invoking user (default)'}\n />\n </div>\n )}\n </div>\n );\n}\n\n// ── Schedule panel ──────────────────────────────────────────────────────────\n\nfunction SchedulePanel({\n selected,\n activeTypes,\n}: {\n selected: LTWorkflowConfig;\n activeTypes: Set<string>;\n}) {\n const navigate = useNavigate();\n const setCron = useSetCronSchedule();\n\n const [cronInput, setCronInput] = useState('');\n const [envelopeInput, setEnvelopeInput] = useState('');\n const [envelopeError, setEnvelopeError] = useState('');\n const [viewMode, setViewMode] = useState<'json' | 'form'>('json');\n\n const defaultEnvelope = useMemo(() => {\n if (!selected?.envelope_schema) return DEFAULT_ENVELOPE;\n return JSON.stringify(selected.envelope_schema, null, 2);\n }, [selected?.envelope_schema]);\n\n const isEnvelopeModified = envelopeInput !== defaultEnvelope;\n\n const parsedEnvelope = useMemo(() => {\n try {\n return JSON.parse(envelopeInput) as Record<string, unknown>;\n } catch {\n return null;\n }\n }, [envelopeInput]);\n\n const formFields = useMemo(\n () => (parsedEnvelope ? extractFormFields(parsedEnvelope) : null),\n [parsedEnvelope],\n );\n\n useEffect(() => {\n setCronInput(selected.cron_schedule ?? '');\n setEnvelopeInput(\n selected.envelope_schema\n ? JSON.stringify(selected.envelope_schema, null, 2)\n : DEFAULT_ENVELOPE,\n );\n setEnvelopeError('');\n setViewMode('json');\n setCron.reset();\n }, [selected.workflow_type]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const { data: jobsData, isLoading: jobsLoading } = useJobs({\n entity: selected.workflow_type,\n limit: 10,\n });\n\n const handleSave = () => {\n let envelopeSchema: Record<string, unknown> | undefined;\n try {\n envelopeSchema = JSON.parse(envelopeInput);\n } catch {\n setEnvelopeError('Invalid JSON in envelope');\n return;\n }\n setEnvelopeError('');\n setCron.mutate({\n config: selected,\n cron_schedule: cronInput.trim() || null,\n envelope_schema: envelopeSchema,\n });\n };\n\n const handleClear = () => {\n setCronInput('');\n setCron.mutate({ config: selected, cron_schedule: null });\n };\n\n const handleResetEnvelope = () => {\n setEnvelopeInput(defaultEnvelope);\n setEnvelopeError('');\n };\n\n const handleFormFieldChange = (key: string, value: string) => {\n if (!parsedEnvelope) return;\n const data = { ...((parsedEnvelope.data as Record<string, unknown>) ?? {}) };\n const original = data[key];\n if (typeof original === 'number') data[key] = value === '' ? 0 : Number(value);\n else if (typeof original === 'boolean') data[key] = value === 'true';\n else data[key] = value;\n setEnvelopeInput(JSON.stringify({ ...parsedEnvelope, data }, null, 2));\n };\n\n return (\n <div className=\"space-y-8\">\n {/* Header */}\n <div>\n <div className=\"flex items-center gap-3\">\n <SectionLabel>{selected.workflow_type}</SectionLabel>\n {selected.cron_schedule && (\n <Pill className={activeTypes.has(selected.workflow_type)\n ? 'bg-status-success/10 text-status-success'\n : 'bg-surface-sunken text-text-tertiary'\n }>\n {activeTypes.has(selected.workflow_type) ? 'active' : 'inactive'}\n </Pill>\n )}\n </div>\n {selected.description && (\n <p className=\"text-xs text-text-tertiary mt-2 leading-relaxed\">\n {selected.description}\n </p>\n )}\n </div>\n\n {/* Cron execution identity */}\n <div className=\"bg-surface-sunken rounded-lg px-4 py-3\">\n <div className=\"flex items-center gap-1.5\">\n <span className=\"text-[10px] text-text-tertiary uppercase tracking-wider font-medium mr-2\">Cron runs as</span>\n <Bot className=\"w-3.5 h-3.5 text-accent/70\" />\n <span className=\"text-xs text-text-primary font-mono\">\n {selected.execute_as ?? 'lt-system'}\n </span>\n {!selected.execute_as && (\n <span className=\"text-[9px] text-text-tertiary ml-1\">system bot</span>\n )}\n </div>\n </div>\n\n {/* Cron editor */}\n <div>\n <SectionLabel className=\"mb-3\">Schedule</SectionLabel>\n <div className=\"flex gap-3 items-start\">\n <div className=\"flex-1\">\n <input\n type=\"text\"\n value={cronInput}\n onChange={(e) => { setCronInput(e.target.value); setCron.reset(); }}\n placeholder=\"0 */6 * * *\"\n className=\"input font-mono text-sm w-full\"\n />\n {cronInput.trim() && describeCron(cronInput.trim()) && (\n <p className=\"text-xs text-text-secondary mt-1.5\">\n {describeCron(cronInput.trim())}\n </p>\n )}\n </div>\n <button onClick={handleSave} disabled={setCron.isPending} className=\"btn-primary text-xs shrink-0\">\n {setCron.isPending ? 'Saving...' : 'Save'}\n </button>\n {selected.cron_schedule && (\n <button onClick={handleClear} disabled={setCron.isPending} className=\"btn-ghost text-xs text-status-error shrink-0\">\n Clear\n </button>\n )}\n </div>\n {setCron.isSuccess && <p className=\"text-[10px] text-status-success mt-2\">Schedule updated</p>}\n {setCron.error && <p className=\"text-[10px] text-status-error mt-2\">{setCron.error.message}</p>}\n </div>\n\n {/* Common patterns */}\n <div className=\"bg-surface-sunken rounded-lg p-4\">\n <SectionLabel className=\"mb-2\">Common Patterns</SectionLabel>\n <div className=\"grid grid-cols-2 sm:grid-cols-3 gap-x-6 gap-y-1.5\">\n {COMMON_PATTERNS.map(([expr, desc]) => (\n <button\n key={expr}\n type=\"button\"\n onClick={() => { setCronInput(expr); setCron.reset(); }}\n className=\"flex items-center gap-2 text-left py-0.5 group\"\n >\n <code className=\"font-mono text-[11px] text-accent group-hover:text-accent-hover\">{expr}</code>\n <span className=\"text-[10px] text-text-tertiary\">{desc}</span>\n </button>\n ))}\n </div>\n </div>\n\n {/* Cron Envelope editor */}\n <div>\n <div className=\"flex items-baseline justify-between mb-2\">\n <SectionLabel>Cron Envelope</SectionLabel>\n <div className=\"flex items-center gap-3\">\n {isEnvelopeModified && (\n <button type=\"button\" onClick={handleResetEnvelope} className=\"text-[10px] text-status-warning hover:text-status-warning/80 transition-colors\">\n Reset to default\n </button>\n )}\n {formFields && (\n <div className=\"flex rounded overflow-hidden border border-surface-border\">\n <button type=\"button\" onClick={() => setViewMode('form')} className={`px-2 py-0.5 text-[10px] transition-colors ${viewMode === 'form' ? 'bg-accent/10 text-accent' : 'text-text-tertiary hover:text-text-secondary'}`}>Form</button>\n <button type=\"button\" onClick={() => setViewMode('json')} className={`px-2 py-0.5 text-[10px] transition-colors ${viewMode === 'json' ? 'bg-accent/10 text-accent' : 'text-text-tertiary hover:text-text-secondary'}`}>JSON</button>\n </div>\n )}\n </div>\n </div>\n <p className=\"text-[10px] text-text-tertiary mb-3\">\n This envelope is sent as the workflow input on each cron invocation.\n </p>\n\n {viewMode === 'form' && formFields ? (\n <div className=\"space-y-3\">\n {formFields.map(({ key, value, type }) => (\n <div key={key}>\n <label className=\"block text-[11px] text-text-secondary mb-1 font-mono\">{key}</label>\n {type === 'boolean' ? (\n <select value={value} onChange={(e) => handleFormFieldChange(key, e.target.value)} className=\"input text-xs w-full\">\n <option value=\"true\">true</option>\n <option value=\"false\">false</option>\n </select>\n ) : (\n <input type={type === 'number' ? 'number' : 'text'} value={value} onChange={(e) => handleFormFieldChange(key, e.target.value)} className=\"input text-xs font-mono w-full\" />\n )}\n </div>\n ))}\n </div>\n ) : (\n <textarea\n value={envelopeInput}\n onChange={(e) => { setEnvelopeInput(e.target.value); setEnvelopeError(''); }}\n className=\"input font-mono text-xs w-full\"\n rows={10}\n spellCheck={false}\n />\n )}\n\n {envelopeError && <p className=\"text-[10px] text-status-error mt-2\">{envelopeError}</p>}\n {isEnvelopeModified && <p className=\"text-[10px] text-accent mt-1.5\">Envelope has been customized. Changes will be saved with the schedule.</p>}\n </div>\n\n {/* Recent executions */}\n <div>\n <SectionLabel className=\"mb-3\">Recent Executions</SectionLabel>\n <DataTable\n columns={jobColumns}\n data={jobsData?.jobs ?? []}\n keyFn={(row) => row.workflow_id}\n onRowClick={(row) => navigate(`/workflows/executions/${row.workflow_id}`)}\n isLoading={jobsLoading}\n emptyMessage=\"No executions yet\"\n />\n </div>\n </div>\n );\n}\n\n// ── Start Now panel ─────────────────────────────────────────────────────────\n\nfunction StartNowPanel({ selected, executionsPath }: { selected: LTWorkflowConfig; executionsPath: string }) {\n const navigate = useNavigate();\n const { isSuperAdmin, hasRoleType } = useAuth();\n const isAdmin = isSuperAdmin || hasRoleType('admin');\n const invokeMutation = useInvokeWorkflow();\n const [jsonInput, setJsonInput] = useState(DEFAULT_ENVELOPE);\n const [parseError, setParseError] = useState('');\n const [formFields, setFormFields] = useState<Record<string, unknown>>({});\n const [isJsonMode, setIsJsonMode] = useState(false);\n const [overrideBot, setOverrideBot] = useState('');\n\n const dataFields = useMemo(\n () => extractDataFields(selected.envelope_schema ?? null),\n [selected.envelope_schema],\n );\n const hasFormView = dataFields.length > 0;\n\n const schemaMetadata = useMemo(() => {\n if (!selected.envelope_schema) return {};\n const md = selected.envelope_schema.metadata;\n return md && typeof md === 'object' ? (md as Record<string, unknown>) : {};\n }, [selected.envelope_schema]);\n\n useEffect(() => {\n setParseError('');\n invokeMutation.reset();\n\n // Check for prefilled input from restart (sessionStorage)\n const prefill = sessionStorage.getItem('lt:invoke:prefill');\n if (prefill) {\n sessionStorage.removeItem('lt:invoke:prefill');\n setJsonInput(prefill);\n try {\n const parsed = JSON.parse(prefill);\n const data = parsed?.data ?? parsed;\n if (data && typeof data === 'object') setFormFields(dataToFields(data));\n } catch { /* use as-is */ }\n setIsJsonMode(true);\n setOverrideBot('');\n return;\n }\n\n const json = selected.envelope_schema\n ? JSON.stringify(selected.envelope_schema, null, 2)\n : DEFAULT_ENVELOPE;\n setJsonInput(json);\n if (selected.envelope_schema?.data && typeof selected.envelope_schema.data === 'object') {\n setFormFields(dataToFields(selected.envelope_schema.data as Record<string, unknown>));\n } else {\n setFormFields({});\n }\n setIsJsonMode(!extractDataFields(selected.envelope_schema ?? null).length);\n setOverrideBot('');\n }, [selected.workflow_type]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const handleToggleMode = () => {\n if (isJsonMode) {\n try {\n const parsed = JSON.parse(jsonInput);\n if (parsed.data && typeof parsed.data === 'object') setFormFields(dataToFields(parsed.data));\n } catch { /* keep existing */ }\n } else {\n setJsonInput(fieldsToJson(formFields, schemaMetadata));\n }\n setIsJsonMode(!isJsonMode);\n };\n\n const updateFormField = (key: string, value: unknown, type: string) => {\n let parsed = value;\n if (type === 'number') parsed = value === '' ? 0 : Number(value);\n else if (type === 'boolean') parsed = value === 'true' || value === true;\n const updated = { ...formFields, [key]: parsed };\n setFormFields(updated);\n setJsonInput(fieldsToJson(updated, schemaMetadata));\n };\n\n const handleInvoke = async () => {\n setParseError('');\n let envelope: Record<string, unknown>;\n try {\n envelope = JSON.parse(jsonInput);\n } catch {\n setParseError('Invalid JSON');\n return;\n }\n const { data, metadata } = envelope;\n if (!data || typeof data !== 'object') {\n setParseError('Envelope must include a \"data\" object');\n return;\n }\n try {\n await invokeMutation.mutateAsync({\n workflowType: selected.workflow_type,\n data: data as Record<string, unknown>,\n metadata: (metadata as Record<string, unknown>) ?? undefined,\n ...(overrideBot ? { execute_as: overrideBot } : {}),\n });\n navigate(executionsPath);\n } catch { /* error via mutation */ }\n };\n\n return (\n <div className=\"space-y-6\">\n <div>\n <div className=\"flex items-center justify-between\">\n <SectionLabel>{selected.workflow_type}</SectionLabel>\n <div className=\"flex gap-2\">\n {selected.roles.map((r) => (\n <Pill key={r}>{r}</Pill>\n ))}\n </div>\n </div>\n {selected.description && (\n <p className=\"text-sm text-text-secondary mt-2 leading-relaxed\">\n {selected.description}\n </p>\n )}\n </div>\n\n <IdentitySummary\n config={selected}\n overrideBot={overrideBot}\n onOverrideChange={setOverrideBot}\n showOverride={isAdmin}\n />\n\n <EnvelopeEditor\n selectedConfig={selected}\n isJsonMode={isJsonMode}\n hasFormView={hasFormView}\n jsonInput={jsonInput}\n formFields={formFields}\n dataFields={dataFields}\n onJsonChange={(v) => { setJsonInput(v); setParseError(''); }}\n onToggleMode={handleToggleMode}\n onUpdateFormField={updateFormField}\n onSetFormFields={setFormFields}\n />\n\n {parseError && <p className=\"text-xs text-status-error\">{parseError}</p>}\n {invokeMutation.error && <p className=\"text-xs text-status-error\">{invokeMutation.error.message}</p>}\n {invokeMutation.isSuccess && <p className=\"text-xs text-status-success\">Workflow started</p>}\n\n <button onClick={handleInvoke} disabled={invokeMutation.isPending} className=\"btn-primary\">\n {invokeMutation.isPending ? 'Starting...' : 'Start Workflow'}\n </button>\n </div>\n );\n}\n\n// ── Page ────────────────────────────────────────────────────────────────────\n\nexport function StartWorkflowPage({ tier: _tier }: { tier?: InvokeTier }) {\n const [searchParams, setSearchParams] = useSearchParams();\n const { data: configsData, isLoading } = useWorkflowConfigs();\n const { data: discoveredData, isLoading: discoveredLoading } = useDiscoveredWorkflows();\n const { data: cronEntries } = useCronStatus();\n\n const mode = (searchParams.get('mode') as Mode) || 'now';\n const selectedType = searchParams.get('type') ?? '';\n\n const configs: LTWorkflowConfig[] = configsData ?? [];\n\n // Certified = has config with invocable: true\n const certifiedTypes = useMemo(\n () => new Set(configs.filter((c) => c.invocable).map((c) => c.workflow_type)),\n [configs],\n );\n\n // Build unified workflow list: certified configs + active durable workers\n const invocableConfigs = useMemo(() => {\n const certified = configs.filter((c) => c.invocable);\n const registeredTypes = new Set(configs.map((c) => c.workflow_type));\n const discovered = discoveredData ?? [];\n const durable = discovered\n .filter((dw) => dw.active && !registeredTypes.has(dw.workflow_type))\n .map((dw) => ({\n workflow_type: dw.workflow_type,\n task_queue: dw.task_queue ?? '',\n invocable: true,\n description: null,\n default_role: 'reviewer',\n roles: [],\n invocation_roles: [],\n consumes: [],\n envelope_schema: null,\n resolver_schema: null,\n cron_schedule: null,\n execute_as: null,\n } satisfies LTWorkflowConfig));\n return [...certified, ...durable];\n }, [configs, discoveredData]);\n\n const selectedConfig = invocableConfigs.find((c) => c.workflow_type === selectedType);\n\n const activeTypes = new Set(\n (cronEntries ?? []).filter((e) => e.active).map((e) => e.workflow_type),\n );\n\n const executionsPath = '/workflows/executions';\n\n // Auto-select first workflow if only one exists\n useEffect(() => {\n if (invocableConfigs.length === 1 && !searchParams.get('type')) {\n setSearchParams({ type: invocableConfigs[0].workflow_type, mode }, { replace: true });\n }\n }, [invocableConfigs.length]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const setMode = (m: Mode) => {\n const params: Record<string, string> = { mode: m };\n if (selectedType) params.type = selectedType;\n setSearchParams(params, { replace: true });\n };\n\n const handleSelect = (config: LTWorkflowConfig) => {\n setSearchParams({ type: config.workflow_type, mode }, { replace: true });\n };\n\n if (isLoading || discoveredLoading) {\n return (\n <div className=\"animate-pulse space-y-4\">\n <div className=\"h-8 bg-surface-sunken rounded w-48\" />\n <div className=\"h-40 bg-surface-sunken rounded\" />\n </div>\n );\n }\n\n return (\n <div>\n <PageHeader\n title=\"Invoke Workflow\"\n actions={<ModeToggle mode={mode} onChange={setMode} />}\n />\n\n {invocableConfigs.length === 0 ? (\n <div className=\"py-16 text-center\">\n <p className=\"text-sm text-text-primary mb-1\">No invocable workflows</p>\n <p className=\"text-xs text-text-tertiary\">Mark workflows as invocable in the registry, or start the server with examples enabled.</p>\n </div>\n ) : (\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-12\">\n <WorkflowSelector\n configs={invocableConfigs}\n selectedType={selectedType}\n onSelect={handleSelect}\n certifiedTypes={certifiedTypes}\n />\n\n <div className=\"lg:col-span-2\">\n {selectedType && selectedConfig ? (\n mode === 'now' ? (\n <StartNowPanel selected={selectedConfig} executionsPath={executionsPath} />\n ) : (\n <SchedulePanel selected={selectedConfig} activeTypes={activeTypes} />\n )\n ) : (\n <div className=\"py-16 text-center\">\n <p className=\"text-sm text-text-tertiary\">\n Select a workflow to begin\n </p>\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n );\n}\n","import { StartWorkflowPage } from './StartWorkflowPage';\n\nexport function DurableInvokePage() {\n return <StartWorkflowPage tier=\"durable\" />;\n}\n"],"names":["Pill","children","className","DEFAULT_ENVELOPE","inferTypeFromValue","value","extractDataFields","schema","data","key","dataToFields","fieldsToJson","fields","metadata","CRON_DESCRIPTIONS","describeCron","expr","COMMON_PATTERNS","extractFormFields","envelope","entries","v","jobColumns","row","jsx","StatusBadge","TimeAgo","WorkflowSelector","configs","selectedType","onSelect","certifiedTypes","SectionLabel","config","isSelected","isCertified","jsxs","ShieldCheck","Workflow","Bot","EnvelopeEditor","selectedConfig","isJsonMode","hasFormView","jsonInput","formFields","dataFields","onJsonChange","onToggleMode","onUpdateFormField","onSetFormFields","Link","e","type","jsonValue","textareaRows","_b","_a","ModeToggle","mode","onChange","btn","m","icon","label","Play","Clock","IdentitySummary","overrideBot","onOverrideChange","showOverride","user","useAuth","effectiveBot","Fragment","UserCircle","BotPicker","SchedulePanel","selected","activeTypes","navigate","useNavigate","setCron","useSetCronSchedule","cronInput","setCronInput","useState","envelopeInput","setEnvelopeInput","envelopeError","setEnvelopeError","viewMode","setViewMode","defaultEnvelope","useMemo","isEnvelopeModified","parsedEnvelope","useEffect","jobsData","jobsLoading","useJobs","handleSave","envelopeSchema","handleClear","handleResetEnvelope","handleFormFieldChange","original","desc","DataTable","StartNowPanel","executionsPath","isSuperAdmin","hasRoleType","isAdmin","invokeMutation","useInvokeWorkflow","setJsonInput","parseError","setParseError","setFormFields","setIsJsonMode","setOverrideBot","schemaMetadata","md","prefill","parsed","json","handleToggleMode","updateFormField","updated","handleInvoke","StartWorkflowPage","_tier","searchParams","setSearchParams","useSearchParams","configsData","isLoading","useWorkflowConfigs","discoveredData","discoveredLoading","useDiscoveredWorkflows","cronEntries","useCronStatus","c","invocableConfigs","certified","registeredTypes","durable","dw","setMode","params","handleSelect","PageHeader","DurableInvokePage"],"mappings":"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"}
|