@hotmeshio/long-tail 0.1.0
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/LICENSE +202 -0
- package/README.md +262 -0
- package/build/examples/external-mcp-server/server.d.ts +17 -0
- package/build/examples/external-mcp-server/server.js +116 -0
- package/build/examples/index.d.ts +2 -0
- package/build/examples/index.js +7 -0
- package/build/examples/seed.d.ts +5 -0
- package/build/examples/seed.js +221 -0
- package/build/examples/types/envelopes.d.ts +34 -0
- package/build/examples/types/envelopes.js +8 -0
- package/build/examples/types/index.d.ts +10 -0
- package/build/examples/types/index.js +9 -0
- package/build/examples/types/resolvers.d.ts +27 -0
- package/build/examples/types/resolvers.js +9 -0
- package/build/examples/workers.d.ts +10 -0
- package/build/examples/workers.js +49 -0
- package/build/examples/workflows/basic-echo/activities.d.ts +20 -0
- package/build/examples/workflows/basic-echo/activities.js +55 -0
- package/build/examples/workflows/basic-echo/index.d.ts +14 -0
- package/build/examples/workflows/basic-echo/index.js +66 -0
- package/build/examples/workflows/kitchen-sink/activities.d.ts +40 -0
- package/build/examples/workflows/kitchen-sink/activities.js +46 -0
- package/build/examples/workflows/kitchen-sink/index.d.ts +22 -0
- package/build/examples/workflows/kitchen-sink/index.js +123 -0
- package/build/examples/workflows/review-content/activities.d.ts +10 -0
- package/build/examples/workflows/review-content/activities.js +44 -0
- package/build/examples/workflows/review-content/index.d.ts +10 -0
- package/build/examples/workflows/review-content/index.js +95 -0
- package/build/examples/workflows/review-content/types.d.ts +28 -0
- package/build/examples/workflows/review-content/types.js +2 -0
- package/build/index.d.ts +37 -0
- package/build/index.js +151 -0
- package/build/modules/auth.d.ts +58 -0
- package/build/modules/auth.js +163 -0
- package/build/modules/config.d.ts +19 -0
- package/build/modules/config.js +26 -0
- package/build/modules/defaults.d.ts +58 -0
- package/build/modules/defaults.js +95 -0
- package/build/modules/ltconfig.d.ts +21 -0
- package/build/modules/ltconfig.js +110 -0
- package/build/modules/maintenance.d.ts +18 -0
- package/build/modules/maintenance.js +47 -0
- package/build/routes/auth.d.ts +2 -0
- package/build/routes/auth.js +48 -0
- package/build/routes/bot-accounts.d.ts +2 -0
- package/build/routes/bot-accounts.js +280 -0
- package/build/routes/controlplane.d.ts +2 -0
- package/build/routes/controlplane.js +144 -0
- package/build/routes/dba.d.ts +2 -0
- package/build/routes/dba.js +86 -0
- package/build/routes/delegation.d.ts +2 -0
- package/build/routes/delegation.js +81 -0
- package/build/routes/escalations/bulk.d.ts +2 -0
- package/build/routes/escalations/bulk.js +324 -0
- package/build/routes/escalations/helpers.d.ts +5 -0
- package/build/routes/escalations/helpers.js +48 -0
- package/build/routes/escalations/index.d.ts +2 -0
- package/build/routes/escalations/index.js +20 -0
- package/build/routes/escalations/list.d.ts +2 -0
- package/build/routes/escalations/list.js +140 -0
- package/build/routes/escalations/resolve.d.ts +2 -0
- package/build/routes/escalations/resolve.js +240 -0
- package/build/routes/escalations/single.d.ts +2 -0
- package/build/routes/escalations/single.js +195 -0
- package/build/routes/exports.d.ts +2 -0
- package/build/routes/exports.js +163 -0
- package/build/routes/files.d.ts +2 -0
- package/build/routes/files.js +47 -0
- package/build/routes/index.d.ts +2 -0
- package/build/routes/index.js +52 -0
- package/build/routes/insight.d.ts +2 -0
- package/build/routes/insight.js +58 -0
- package/build/routes/maintenance.d.ts +2 -0
- package/build/routes/maintenance.js +38 -0
- package/build/routes/mcp-runs.d.ts +2 -0
- package/build/routes/mcp-runs.js +85 -0
- package/build/routes/mcp.d.ts +2 -0
- package/build/routes/mcp.js +264 -0
- package/build/routes/namespaces.d.ts +2 -0
- package/build/routes/namespaces.js +71 -0
- package/build/routes/oauth.d.ts +7 -0
- package/build/routes/oauth.js +217 -0
- package/build/routes/resolve.d.ts +9 -0
- package/build/routes/resolve.js +19 -0
- package/build/routes/roles.d.ts +2 -0
- package/build/routes/roles.js +195 -0
- package/build/routes/settings.d.ts +2 -0
- package/build/routes/settings.js +35 -0
- package/build/routes/tasks.d.ts +2 -0
- package/build/routes/tasks.js +133 -0
- package/build/routes/users.d.ts +2 -0
- package/build/routes/users.js +206 -0
- package/build/routes/workflows/config.d.ts +2 -0
- package/build/routes/workflows/config.js +123 -0
- package/build/routes/workflows/discovery.d.ts +2 -0
- package/build/routes/workflows/discovery.js +146 -0
- package/build/routes/workflows/index.d.ts +2 -0
- package/build/routes/workflows/index.js +18 -0
- package/build/routes/workflows/invocation.d.ts +2 -0
- package/build/routes/workflows/invocation.js +162 -0
- package/build/routes/yaml-workflows/crud.d.ts +2 -0
- package/build/routes/yaml-workflows/crud.js +276 -0
- package/build/routes/yaml-workflows/deployment.d.ts +2 -0
- package/build/routes/yaml-workflows/deployment.js +179 -0
- package/build/routes/yaml-workflows/helpers.d.ts +2 -0
- package/build/routes/yaml-workflows/helpers.js +8 -0
- package/build/routes/yaml-workflows/index.d.ts +2 -0
- package/build/routes/yaml-workflows/index.js +21 -0
- package/build/routes/yaml-workflows/versions.d.ts +2 -0
- package/build/routes/yaml-workflows/versions.js +116 -0
- package/build/scripts/process-helpers.d.ts +11 -0
- package/build/scripts/process-helpers.js +59 -0
- package/build/scripts/process.d.ts +18 -0
- package/build/scripts/process.js +191 -0
- package/build/scripts/token.d.ts +13 -0
- package/build/scripts/token.js +42 -0
- package/build/services/auth/bot-api-key.d.ts +32 -0
- package/build/services/auth/bot-api-key.js +112 -0
- package/build/services/auth/delegation.d.ts +20 -0
- package/build/services/auth/delegation.js +53 -0
- package/build/services/auth/service-token.d.ts +23 -0
- package/build/services/auth/service-token.js +105 -0
- package/build/services/config/cache.d.ts +2 -0
- package/build/services/config/cache.js +24 -0
- package/build/services/config/index.d.ts +4 -0
- package/build/services/config/index.js +13 -0
- package/build/services/config/provider.d.ts +2 -0
- package/build/services/config/provider.js +30 -0
- package/build/services/config/read.d.ts +3 -0
- package/build/services/config/read.js +68 -0
- package/build/services/config/sql.d.ts +14 -0
- package/build/services/config/sql.js +58 -0
- package/build/services/config/write.d.ts +5 -0
- package/build/services/config/write.js +61 -0
- package/build/services/controlplane/index.d.ts +47 -0
- package/build/services/controlplane/index.js +124 -0
- package/build/services/controlplane/quorum-bridge.d.ts +15 -0
- package/build/services/controlplane/quorum-bridge.js +62 -0
- package/build/services/controlplane/sql.d.ts +21 -0
- package/build/services/controlplane/sql.js +70 -0
- package/build/services/controlplane/types.d.ts +13 -0
- package/build/services/controlplane/types.js +3 -0
- package/build/services/cron/index.d.ts +46 -0
- package/build/services/cron/index.js +199 -0
- package/build/services/db/index.d.ts +3 -0
- package/build/services/db/index.js +19 -0
- package/build/services/db/migrate.d.ts +1 -0
- package/build/services/db/migrate.js +78 -0
- package/build/services/dba.d.ts +28 -0
- package/build/services/dba.js +32 -0
- package/build/services/escalation/bulk.d.ts +27 -0
- package/build/services/escalation/bulk.js +57 -0
- package/build/services/escalation/crud.d.ts +47 -0
- package/build/services/escalation/crud.js +150 -0
- package/build/services/escalation/index.d.ts +4 -0
- package/build/services/escalation/index.js +20 -0
- package/build/services/escalation/queries.d.ts +37 -0
- package/build/services/escalation/queries.js +163 -0
- package/build/services/escalation/sql.d.ts +21 -0
- package/build/services/escalation/sql.js +135 -0
- package/build/services/escalation/types.d.ts +43 -0
- package/build/services/escalation/types.js +13 -0
- package/build/services/escalation-strategy/default.d.ts +12 -0
- package/build/services/escalation-strategy/default.js +17 -0
- package/build/services/escalation-strategy/index.d.ts +21 -0
- package/build/services/escalation-strategy/index.js +32 -0
- package/build/services/escalation-strategy/mcp.d.ts +13 -0
- package/build/services/escalation-strategy/mcp.js +51 -0
- package/build/services/events/index.d.ts +37 -0
- package/build/services/events/index.js +64 -0
- package/build/services/events/memory.d.ts +27 -0
- package/build/services/events/memory.js +40 -0
- package/build/services/events/nats.d.ts +29 -0
- package/build/services/events/nats.js +50 -0
- package/build/services/events/publish.d.ts +72 -0
- package/build/services/events/publish.js +106 -0
- package/build/services/events/socketio.d.ts +33 -0
- package/build/services/events/socketio.js +70 -0
- package/build/services/export/client.d.ts +2 -0
- package/build/services/export/client.js +16 -0
- package/build/services/export/index.d.ts +39 -0
- package/build/services/export/index.js +158 -0
- package/build/services/export/post-process.d.ts +16 -0
- package/build/services/export/post-process.js +133 -0
- package/build/services/export/types.d.ts +25 -0
- package/build/services/export/types.js +2 -0
- package/build/services/hotmesh-utils.d.ts +61 -0
- package/build/services/hotmesh-utils.js +204 -0
- package/build/services/iam/activity.d.ts +52 -0
- package/build/services/iam/activity.js +59 -0
- package/build/services/iam/bots.d.ts +83 -0
- package/build/services/iam/bots.js +157 -0
- package/build/services/iam/context.d.ts +14 -0
- package/build/services/iam/context.js +61 -0
- package/build/services/iam/credentials.d.ts +42 -0
- package/build/services/iam/credentials.js +86 -0
- package/build/services/iam/envelope.d.ts +10 -0
- package/build/services/iam/envelope.js +32 -0
- package/build/services/iam/ephemeral.d.ts +50 -0
- package/build/services/iam/ephemeral.js +131 -0
- package/build/services/iam/index.d.ts +19 -0
- package/build/services/iam/index.js +37 -0
- package/build/services/iam/principal.d.ts +12 -0
- package/build/services/iam/principal.js +53 -0
- package/build/services/iam/resolve.d.ts +48 -0
- package/build/services/iam/resolve.js +89 -0
- package/build/services/insight/index.d.ts +30 -0
- package/build/services/insight/index.js +81 -0
- package/build/services/insight/prompts.d.ts +4 -0
- package/build/services/insight/prompts.js +15 -0
- package/build/services/interceptor/activities/config.d.ts +21 -0
- package/build/services/interceptor/activities/config.js +26 -0
- package/build/services/interceptor/activities/escalation.d.ts +58 -0
- package/build/services/interceptor/activities/escalation.js +110 -0
- package/build/services/interceptor/activities/index.d.ts +4 -0
- package/build/services/interceptor/activities/index.js +23 -0
- package/build/services/interceptor/activities/task.d.ts +65 -0
- package/build/services/interceptor/activities/task.js +168 -0
- package/build/services/interceptor/activities/workflow.d.ts +26 -0
- package/build/services/interceptor/activities/workflow.js +41 -0
- package/build/services/interceptor/activity-interceptor.d.ts +32 -0
- package/build/services/interceptor/activity-interceptor.js +86 -0
- package/build/services/interceptor/completion.d.ts +16 -0
- package/build/services/interceptor/completion.js +149 -0
- package/build/services/interceptor/context.d.ts +11 -0
- package/build/services/interceptor/context.js +20 -0
- package/build/services/interceptor/escalation.d.ts +26 -0
- package/build/services/interceptor/escalation.js +150 -0
- package/build/services/interceptor/index.d.ts +45 -0
- package/build/services/interceptor/index.js +160 -0
- package/build/services/interceptor/lifecycle.d.ts +44 -0
- package/build/services/interceptor/lifecycle.js +174 -0
- package/build/services/interceptor/state.d.ts +22 -0
- package/build/services/interceptor/state.js +36 -0
- package/build/services/interceptor/types.d.ts +43 -0
- package/build/services/interceptor/types.js +3 -0
- package/build/services/llm/detect.d.ts +16 -0
- package/build/services/llm/detect.js +33 -0
- package/build/services/llm/index.d.ts +34 -0
- package/build/services/llm/index.js +106 -0
- package/build/services/llm/providers/anthropic.d.ts +11 -0
- package/build/services/llm/providers/anthropic.js +85 -0
- package/build/services/llm/providers/openai.d.ts +9 -0
- package/build/services/llm/providers/openai.js +46 -0
- package/build/services/llm/translate.d.ts +66 -0
- package/build/services/llm/translate.js +192 -0
- package/build/services/llm/types.d.ts +64 -0
- package/build/services/llm/types.js +8 -0
- package/build/services/logger/index.d.ts +32 -0
- package/build/services/logger/index.js +69 -0
- package/build/services/logger/pino.d.ts +24 -0
- package/build/services/logger/pino.js +59 -0
- package/build/services/maintenance/index.d.ts +43 -0
- package/build/services/maintenance/index.js +183 -0
- package/build/services/mcp/adapter.d.ts +23 -0
- package/build/services/mcp/adapter.js +119 -0
- package/build/services/mcp/client/connection.d.ts +46 -0
- package/build/services/mcp/client/connection.js +280 -0
- package/build/services/mcp/client/index.d.ts +2 -0
- package/build/services/mcp/client/index.js +16 -0
- package/build/services/mcp/client/tools.d.ts +22 -0
- package/build/services/mcp/client/tools.js +118 -0
- package/build/services/mcp/db-server/index.d.ts +25 -0
- package/build/services/mcp/db-server/index.js +49 -0
- package/build/services/mcp/db-server/schemas.d.ts +52 -0
- package/build/services/mcp/db-server/schemas.js +34 -0
- package/build/services/mcp/db-server/tools.d.ts +5 -0
- package/build/services/mcp/db-server/tools.js +224 -0
- package/build/services/mcp/db.d.ts +26 -0
- package/build/services/mcp/db.js +141 -0
- package/build/services/mcp/index.d.ts +25 -0
- package/build/services/mcp/index.js +47 -0
- package/build/services/mcp/playwright-server/index.d.ts +14 -0
- package/build/services/mcp/playwright-server/index.js +25 -0
- package/build/services/mcp/playwright-server/lifecycle.d.ts +7 -0
- package/build/services/mcp/playwright-server/lifecycle.js +63 -0
- package/build/services/mcp/playwright-server/schemas.d.ts +81 -0
- package/build/services/mcp/playwright-server/schemas.js +48 -0
- package/build/services/mcp/playwright-server/tools.d.ts +2 -0
- package/build/services/mcp/playwright-server/tools.js +224 -0
- package/build/services/mcp/server.d.ts +26 -0
- package/build/services/mcp/server.js +286 -0
- package/build/services/mcp/sql.d.ts +12 -0
- package/build/services/mcp/sql.js +59 -0
- package/build/services/mcp/types.d.ts +17 -0
- package/build/services/mcp/types.js +3 -0
- package/build/services/mcp/vision-server.d.ts +15 -0
- package/build/services/mcp/vision-server.js +214 -0
- package/build/services/mcp/workflow-compiler-server.d.ts +15 -0
- package/build/services/mcp/workflow-compiler-server.js +206 -0
- package/build/services/mcp/workflow-server.d.ts +24 -0
- package/build/services/mcp/workflow-server.js +230 -0
- package/build/services/mcp-runs/enrichment.d.ts +12 -0
- package/build/services/mcp-runs/enrichment.js +39 -0
- package/build/services/mcp-runs/events.d.ts +6 -0
- package/build/services/mcp-runs/events.js +126 -0
- package/build/services/mcp-runs/execution-builder.d.ts +12 -0
- package/build/services/mcp-runs/execution-builder.js +100 -0
- package/build/services/mcp-runs/index.d.ts +4 -0
- package/build/services/mcp-runs/index.js +8 -0
- package/build/services/mcp-runs/queries.d.ts +28 -0
- package/build/services/mcp-runs/queries.js +71 -0
- package/build/services/mcp-runs/sql.d.ts +4 -0
- package/build/services/mcp-runs/sql.js +17 -0
- package/build/services/mcp-runs/types.d.ts +65 -0
- package/build/services/mcp-runs/types.js +2 -0
- package/build/services/namespace/index.d.ts +17 -0
- package/build/services/namespace/index.js +41 -0
- package/build/services/namespace/sql.d.ts +4 -0
- package/build/services/namespace/sql.js +23 -0
- package/build/services/namespace/types.d.ts +11 -0
- package/build/services/namespace/types.js +3 -0
- package/build/services/oauth/crypto.d.ts +19 -0
- package/build/services/oauth/crypto.js +95 -0
- package/build/services/oauth/db.d.ts +20 -0
- package/build/services/oauth/db.js +140 -0
- package/build/services/oauth/index.d.ts +12 -0
- package/build/services/oauth/index.js +77 -0
- package/build/services/oauth/providers/anthropic.d.ts +3 -0
- package/build/services/oauth/providers/anthropic.js +111 -0
- package/build/services/oauth/providers/github.d.ts +3 -0
- package/build/services/oauth/providers/github.js +46 -0
- package/build/services/oauth/providers/google.d.ts +3 -0
- package/build/services/oauth/providers/google.js +44 -0
- package/build/services/oauth/providers/index.d.ts +2 -0
- package/build/services/oauth/providers/index.js +7 -0
- package/build/services/oauth/providers/microsoft.d.ts +3 -0
- package/build/services/oauth/providers/microsoft.js +46 -0
- package/build/services/oauth/providers/mock.d.ts +3 -0
- package/build/services/oauth/providers/mock.js +76 -0
- package/build/services/oauth/providers/registry.d.ts +8 -0
- package/build/services/oauth/providers/registry.js +46 -0
- package/build/services/oauth/providers/types.d.ts +13 -0
- package/build/services/oauth/providers/types.js +2 -0
- package/build/services/oauth/state.d.ts +30 -0
- package/build/services/oauth/state.js +83 -0
- package/build/services/orchestrator/index.d.ts +23 -0
- package/build/services/orchestrator/index.js +156 -0
- package/build/services/orchestrator/types.d.ts +15 -0
- package/build/services/orchestrator/types.js +3 -0
- package/build/services/role/index.d.ts +47 -0
- package/build/services/role/index.js +136 -0
- package/build/services/role/sql.d.ts +14 -0
- package/build/services/role/sql.js +80 -0
- package/build/services/role/types.d.ts +11 -0
- package/build/services/role/types.js +3 -0
- package/build/services/storage/index.d.ts +12 -0
- package/build/services/storage/index.js +31 -0
- package/build/services/storage/local.d.ts +26 -0
- package/build/services/storage/local.js +129 -0
- package/build/services/storage/s3.d.ts +31 -0
- package/build/services/storage/s3.js +180 -0
- package/build/services/storage/types.d.ts +41 -0
- package/build/services/storage/types.js +2 -0
- package/build/services/task/crud.d.ts +21 -0
- package/build/services/task/crud.js +123 -0
- package/build/services/task/index.d.ts +4 -0
- package/build/services/task/index.js +20 -0
- package/build/services/task/process.d.ts +14 -0
- package/build/services/task/process.js +98 -0
- package/build/services/task/resolve.d.ts +12 -0
- package/build/services/task/resolve.js +49 -0
- package/build/services/task/sql.d.ts +19 -0
- package/build/services/task/sql.js +92 -0
- package/build/services/task/types.d.ts +56 -0
- package/build/services/task/types.js +9 -0
- package/build/services/telemetry/honeycomb.d.ts +53 -0
- package/build/services/telemetry/honeycomb.js +79 -0
- package/build/services/telemetry/index.d.ts +46 -0
- package/build/services/telemetry/index.js +68 -0
- package/build/services/user/auth.d.ts +7 -0
- package/build/services/user/auth.js +26 -0
- package/build/services/user/crud.d.ts +19 -0
- package/build/services/user/crud.js +151 -0
- package/build/services/user/index.d.ts +5 -0
- package/build/services/user/index.js +26 -0
- package/build/services/user/rbac.d.ts +15 -0
- package/build/services/user/rbac.js +32 -0
- package/build/services/user/roles.d.ts +7 -0
- package/build/services/user/roles.js +42 -0
- package/build/services/user/sql.d.ts +22 -0
- package/build/services/user/sql.js +45 -0
- package/build/services/user/types.d.ts +23 -0
- package/build/services/user/types.js +4 -0
- package/build/services/workers/registry.d.ts +10 -0
- package/build/services/workers/registry.js +26 -0
- package/build/services/workflow-invocation.d.ts +46 -0
- package/build/services/workflow-invocation.js +184 -0
- package/build/services/yaml-workflow/db-utils.d.ts +25 -0
- package/build/services/yaml-workflow/db-utils.js +93 -0
- package/build/services/yaml-workflow/db.d.ts +27 -0
- package/build/services/yaml-workflow/db.js +196 -0
- package/build/services/yaml-workflow/deployer-helpers.d.ts +13 -0
- package/build/services/yaml-workflow/deployer-helpers.js +133 -0
- package/build/services/yaml-workflow/deployer.d.ts +54 -0
- package/build/services/yaml-workflow/deployer.js +203 -0
- package/build/services/yaml-workflow/generator.d.ts +21 -0
- package/build/services/yaml-workflow/generator.js +117 -0
- package/build/services/yaml-workflow/index.d.ts +4 -0
- package/build/services/yaml-workflow/index.js +20 -0
- package/build/services/yaml-workflow/input-analyzer-helpers.d.ts +48 -0
- package/build/services/yaml-workflow/input-analyzer-helpers.js +183 -0
- package/build/services/yaml-workflow/input-analyzer.d.ts +30 -0
- package/build/services/yaml-workflow/input-analyzer.js +109 -0
- package/build/services/yaml-workflow/pattern-detector/array-source.d.ts +22 -0
- package/build/services/yaml-workflow/pattern-detector/array-source.js +120 -0
- package/build/services/yaml-workflow/pattern-detector/collapse.d.ts +27 -0
- package/build/services/yaml-workflow/pattern-detector/collapse.js +92 -0
- package/build/services/yaml-workflow/pattern-detector/index.d.ts +18 -0
- package/build/services/yaml-workflow/pattern-detector/index.js +22 -0
- package/build/services/yaml-workflow/pattern-detector/run-detection.d.ts +28 -0
- package/build/services/yaml-workflow/pattern-detector/run-detection.js +81 -0
- package/build/services/yaml-workflow/pattern-detector/types.d.ts +29 -0
- package/build/services/yaml-workflow/pattern-detector/types.js +8 -0
- package/build/services/yaml-workflow/pipeline/analyze.d.ts +11 -0
- package/build/services/yaml-workflow/pipeline/analyze.js +64 -0
- package/build/services/yaml-workflow/pipeline/build/dag.d.ts +25 -0
- package/build/services/yaml-workflow/pipeline/build/dag.js +254 -0
- package/build/services/yaml-workflow/pipeline/build/index.d.ts +20 -0
- package/build/services/yaml-workflow/pipeline/build/index.js +115 -0
- package/build/services/yaml-workflow/pipeline/build/iteration.d.ts +25 -0
- package/build/services/yaml-workflow/pipeline/build/iteration.js +231 -0
- package/build/services/yaml-workflow/pipeline/build/metadata.d.ts +15 -0
- package/build/services/yaml-workflow/pipeline/build/metadata.js +126 -0
- package/build/services/yaml-workflow/pipeline/build/transform.d.ts +17 -0
- package/build/services/yaml-workflow/pipeline/build/transform.js +94 -0
- package/build/services/yaml-workflow/pipeline/build/utils.d.ts +22 -0
- package/build/services/yaml-workflow/pipeline/build/utils.js +129 -0
- package/build/services/yaml-workflow/pipeline/build/wiring.d.ts +9 -0
- package/build/services/yaml-workflow/pipeline/build/wiring.js +148 -0
- package/build/services/yaml-workflow/pipeline/compile/index.d.ts +17 -0
- package/build/services/yaml-workflow/pipeline/compile/index.js +64 -0
- package/build/services/yaml-workflow/pipeline/compile/llm-call.d.ts +14 -0
- package/build/services/yaml-workflow/pipeline/compile/llm-call.js +153 -0
- package/build/services/yaml-workflow/pipeline/compile/parse-plan.d.ts +12 -0
- package/build/services/yaml-workflow/pipeline/compile/parse-plan.js +88 -0
- package/build/services/yaml-workflow/pipeline/compile/summarize.d.ts +39 -0
- package/build/services/yaml-workflow/pipeline/compile/summarize.js +174 -0
- package/build/services/yaml-workflow/pipeline/extract-helpers.d.ts +42 -0
- package/build/services/yaml-workflow/pipeline/extract-helpers.js +88 -0
- package/build/services/yaml-workflow/pipeline/extract.d.ts +24 -0
- package/build/services/yaml-workflow/pipeline/extract.js +235 -0
- package/build/services/yaml-workflow/pipeline/prompts.d.ts +15 -0
- package/build/services/yaml-workflow/pipeline/prompts.js +254 -0
- package/build/services/yaml-workflow/pipeline/validate.d.ts +12 -0
- package/build/services/yaml-workflow/pipeline/validate.js +111 -0
- package/build/services/yaml-workflow/sql.d.ts +19 -0
- package/build/services/yaml-workflow/sql.js +83 -0
- package/build/services/yaml-workflow/types.d.ts +223 -0
- package/build/services/yaml-workflow/types.js +8 -0
- package/build/services/yaml-workflow/workers/callbacks.d.ts +17 -0
- package/build/services/yaml-workflow/workers/callbacks.js +194 -0
- package/build/services/yaml-workflow/workers/events.d.ts +7 -0
- package/build/services/yaml-workflow/workers/events.js +49 -0
- package/build/services/yaml-workflow/workers/index.d.ts +4 -0
- package/build/services/yaml-workflow/workers/index.js +15 -0
- package/build/services/yaml-workflow/workers/register.d.ts +15 -0
- package/build/services/yaml-workflow/workers/register.js +233 -0
- package/build/services/yaml-workflow/workers/scope.d.ts +13 -0
- package/build/services/yaml-workflow/workers/scope.js +37 -0
- package/build/start/adapters.d.ts +6 -0
- package/build/start/adapters.js +80 -0
- package/build/start/config.d.ts +10 -0
- package/build/start/config.js +88 -0
- package/build/start/index.d.ts +21 -0
- package/build/start/index.js +87 -0
- package/build/start/server.d.ts +6 -0
- package/build/start/server.js +46 -0
- package/build/start/workers.d.ts +32 -0
- package/build/start/workers.js +144 -0
- package/build/system/activities/claude-code.d.ts +56 -0
- package/build/system/activities/claude-code.js +258 -0
- package/build/system/activities/file-storage.d.ts +31 -0
- package/build/system/activities/file-storage.js +71 -0
- package/build/system/activities/http.d.ts +27 -0
- package/build/system/activities/http.js +56 -0
- package/build/system/activities/oauth.d.ts +39 -0
- package/build/system/activities/oauth.js +33 -0
- package/build/system/activities/triage/cache.d.ts +7 -0
- package/build/system/activities/triage/cache.js +10 -0
- package/build/system/activities/triage/context.d.ts +21 -0
- package/build/system/activities/triage/context.js +92 -0
- package/build/system/activities/triage/discovery.d.ts +25 -0
- package/build/system/activities/triage/discovery.js +170 -0
- package/build/system/activities/triage/index.d.ts +5 -0
- package/build/system/activities/triage/index.js +22 -0
- package/build/system/activities/triage/llm.d.ts +9 -0
- package/build/system/activities/triage/llm.js +34 -0
- package/build/system/activities/triage/tools.d.ts +24 -0
- package/build/system/activities/triage/tools.js +178 -0
- package/build/system/index.d.ts +16 -0
- package/build/system/index.js +100 -0
- package/build/system/mcp-servers/claude-code.d.ts +17 -0
- package/build/system/mcp-servers/claude-code.js +110 -0
- package/build/system/mcp-servers/db-query/index.d.ts +25 -0
- package/build/system/mcp-servers/db-query/index.js +49 -0
- package/build/system/mcp-servers/db-query/schemas.d.ts +52 -0
- package/build/system/mcp-servers/db-query/schemas.js +34 -0
- package/build/system/mcp-servers/db-query/tools.d.ts +5 -0
- package/build/system/mcp-servers/db-query/tools.js +224 -0
- package/build/system/mcp-servers/document-vision.d.ts +15 -0
- package/build/system/mcp-servers/document-vision.js +228 -0
- package/build/system/mcp-servers/file-storage.d.ts +4 -0
- package/build/system/mcp-servers/file-storage.js +101 -0
- package/build/system/mcp-servers/http-fetch.d.ts +4 -0
- package/build/system/mcp-servers/http-fetch.js +100 -0
- package/build/system/mcp-servers/human-queue.d.ts +26 -0
- package/build/system/mcp-servers/human-queue.js +287 -0
- package/build/system/mcp-servers/oauth.d.ts +11 -0
- package/build/system/mcp-servers/oauth.js +100 -0
- package/build/system/mcp-servers/playwright/browser-lifecycle.d.ts +26 -0
- package/build/system/mcp-servers/playwright/browser-lifecycle.js +125 -0
- package/build/system/mcp-servers/playwright/index.d.ts +25 -0
- package/build/system/mcp-servers/playwright/index.js +42 -0
- package/build/system/mcp-servers/playwright/schemas.d.ts +383 -0
- package/build/system/mcp-servers/playwright/schemas.js +87 -0
- package/build/system/mcp-servers/playwright/tools-atomic.d.ts +2 -0
- package/build/system/mcp-servers/playwright/tools-atomic.js +9 -0
- package/build/system/mcp-servers/playwright/tools-navigation.d.ts +2 -0
- package/build/system/mcp-servers/playwright/tools-navigation.js +140 -0
- package/build/system/mcp-servers/playwright/tools-page-interaction.d.ts +2 -0
- package/build/system/mcp-servers/playwright/tools-page-interaction.js +162 -0
- package/build/system/mcp-servers/playwright/tools-run-script.d.ts +2 -0
- package/build/system/mcp-servers/playwright/tools-run-script.js +190 -0
- package/build/system/mcp-servers/playwright/types.d.ts +8 -0
- package/build/system/mcp-servers/playwright/types.js +30 -0
- package/build/system/mcp-servers/playwright-cli/helpers.d.ts +11 -0
- package/build/system/mcp-servers/playwright-cli/helpers.js +20 -0
- package/build/system/mcp-servers/playwright-cli/index.d.ts +4 -0
- package/build/system/mcp-servers/playwright-cli/index.js +15 -0
- package/build/system/mcp-servers/playwright-cli/schemas.d.ts +219 -0
- package/build/system/mcp-servers/playwright-cli/schemas.js +75 -0
- package/build/system/mcp-servers/playwright-cli/tools-auth.d.ts +2 -0
- package/build/system/mcp-servers/playwright-cli/tools-auth.js +183 -0
- package/build/system/mcp-servers/playwright-cli/tools-capture.d.ts +2 -0
- package/build/system/mcp-servers/playwright-cli/tools-capture.js +267 -0
- package/build/system/mcp-servers/prompts.d.ts +4 -0
- package/build/system/mcp-servers/prompts.js +10 -0
- package/build/system/mcp-servers/workflow-compiler.d.ts +15 -0
- package/build/system/mcp-servers/workflow-compiler.js +230 -0
- package/build/system/mcp-servers/workflow.d.ts +24 -0
- package/build/system/mcp-servers/workflow.js +231 -0
- package/build/system/seed/index.d.ts +7 -0
- package/build/system/seed/index.js +36 -0
- package/build/system/seed/server-definitions.d.ts +1460 -0
- package/build/system/seed/server-definitions.js +160 -0
- package/build/system/seed/tool-manifests-browser.d.ts +577 -0
- package/build/system/seed/tool-manifests-browser.js +158 -0
- package/build/system/seed/tool-manifests-data.d.ts +322 -0
- package/build/system/seed/tool-manifests-data.js +173 -0
- package/build/system/seed/tool-manifests-escalation.d.ts +173 -0
- package/build/system/seed/tool-manifests-escalation.js +76 -0
- package/build/system/seed/tool-manifests-workflows.d.ts +211 -0
- package/build/system/seed/tool-manifests-workflows.js +136 -0
- package/build/system/workflows/mcp-deterministic/activities.d.ts +6 -0
- package/build/system/workflows/mcp-deterministic/activities.js +56 -0
- package/build/system/workflows/mcp-deterministic/index.d.ts +9 -0
- package/build/system/workflows/mcp-deterministic/index.js +72 -0
- package/build/system/workflows/mcp-query/activities/caches.d.ts +7 -0
- package/build/system/workflows/mcp-query/activities/caches.js +10 -0
- package/build/system/workflows/mcp-query/activities/discovery.d.ts +31 -0
- package/build/system/workflows/mcp-query/activities/discovery.js +172 -0
- package/build/system/workflows/mcp-query/activities/index.d.ts +4 -0
- package/build/system/workflows/mcp-query/activities/index.js +13 -0
- package/build/system/workflows/mcp-query/activities/llm.d.ts +8 -0
- package/build/system/workflows/mcp-query/activities/llm.js +33 -0
- package/build/system/workflows/mcp-query/activities/tool-executor.d.ts +5 -0
- package/build/system/workflows/mcp-query/activities/tool-executor.js +112 -0
- package/build/system/workflows/mcp-query/activities/tool-loader.d.ts +14 -0
- package/build/system/workflows/mcp-query/activities/tool-loader.js +93 -0
- package/build/system/workflows/mcp-query/index.d.ts +14 -0
- package/build/system/workflows/mcp-query/index.js +227 -0
- package/build/system/workflows/mcp-query/prompts.d.ts +4 -0
- package/build/system/workflows/mcp-query/prompts.js +101 -0
- package/build/system/workflows/mcp-query/strategy-advisors.d.ts +14 -0
- package/build/system/workflows/mcp-query/strategy-advisors.js +109 -0
- package/build/system/workflows/mcp-query/types.d.ts +10 -0
- package/build/system/workflows/mcp-query/types.js +3 -0
- package/build/system/workflows/mcp-query-router/activities.d.ts +6 -0
- package/build/system/workflows/mcp-query-router/activities.js +12 -0
- package/build/system/workflows/mcp-query-router/index.d.ts +13 -0
- package/build/system/workflows/mcp-query-router/index.js +107 -0
- package/build/system/workflows/mcp-query-router/prompts.d.ts +1 -0
- package/build/system/workflows/mcp-query-router/prompts.js +8 -0
- package/build/system/workflows/mcp-triage/index.d.ts +31 -0
- package/build/system/workflows/mcp-triage/index.js +222 -0
- package/build/system/workflows/mcp-triage/prompts.d.ts +7 -0
- package/build/system/workflows/mcp-triage/prompts.js +159 -0
- package/build/system/workflows/mcp-triage/response-builders.d.ts +17 -0
- package/build/system/workflows/mcp-triage/response-builders.js +96 -0
- package/build/system/workflows/mcp-triage/response.d.ts +8 -0
- package/build/system/workflows/mcp-triage/response.js +157 -0
- package/build/system/workflows/mcp-triage/types.d.ts +20 -0
- package/build/system/workflows/mcp-triage/types.js +3 -0
- package/build/system/workflows/mcp-triage-deterministic/activities.d.ts +4 -0
- package/build/system/workflows/mcp-triage-deterministic/activities.js +8 -0
- package/build/system/workflows/mcp-triage-deterministic/index.d.ts +12 -0
- package/build/system/workflows/mcp-triage-deterministic/index.js +83 -0
- package/build/system/workflows/mcp-triage-router/activities.d.ts +9 -0
- package/build/system/workflows/mcp-triage-router/activities.js +15 -0
- package/build/system/workflows/mcp-triage-router/index.d.ts +13 -0
- package/build/system/workflows/mcp-triage-router/index.js +122 -0
- package/build/tsconfig.tsbuildinfo +1 -0
- package/build/types/auth.d.ts +34 -0
- package/build/types/auth.js +2 -0
- package/build/types/config.d.ts +48 -0
- package/build/types/config.js +2 -0
- package/build/types/delegation.d.ts +41 -0
- package/build/types/delegation.js +2 -0
- package/build/types/discovery.d.ts +12 -0
- package/build/types/discovery.js +3 -0
- package/build/types/envelope.d.ts +53 -0
- package/build/types/envelope.js +2 -0
- package/build/types/escalation-strategy.d.ts +37 -0
- package/build/types/escalation-strategy.js +2 -0
- package/build/types/escalation.d.ts +39 -0
- package/build/types/escalation.js +21 -0
- package/build/types/events.d.ts +65 -0
- package/build/types/events.js +2 -0
- package/build/types/export.d.ts +78 -0
- package/build/types/export.js +11 -0
- package/build/types/index.d.ts +21 -0
- package/build/types/index.js +6 -0
- package/build/types/logger.d.ts +26 -0
- package/build/types/logger.js +2 -0
- package/build/types/maintenance.d.ts +24 -0
- package/build/types/maintenance.js +2 -0
- package/build/types/mcp.d.ts +80 -0
- package/build/types/mcp.js +2 -0
- package/build/types/oauth.d.ts +74 -0
- package/build/types/oauth.js +2 -0
- package/build/types/startup.d.ts +110 -0
- package/build/types/startup.js +2 -0
- package/build/types/task.d.ts +39 -0
- package/build/types/task.js +2 -0
- package/build/types/telemetry.d.ts +32 -0
- package/build/types/telemetry.js +2 -0
- package/build/types/tool-context.d.ts +68 -0
- package/build/types/tool-context.js +14 -0
- package/build/types/user.d.ts +18 -0
- package/build/types/user.js +2 -0
- package/build/types/workflow.d.ts +35 -0
- package/build/types/workflow.js +2 -0
- package/build/types/yaml-workflow.d.ts +101 -0
- package/build/types/yaml-workflow.js +5 -0
- package/build/vitest.config.d.ts +2 -0
- package/build/vitest.config.js +32 -0
- package/build/vitest.integration.config.d.ts +2 -0
- package/build/vitest.integration.config.js +25 -0
- package/build/workers/index.d.ts +6 -0
- package/build/workers/index.js +20 -0
- package/dashboard/dist/assets/AdminDashboard-jfacvOC7.js +2 -0
- package/dashboard/dist/assets/AdminDashboard-jfacvOC7.js.map +1 -0
- package/dashboard/dist/assets/AvailableEscalationsPage-BglLDoT8.js +2 -0
- package/dashboard/dist/assets/AvailableEscalationsPage-BglLDoT8.js.map +1 -0
- package/dashboard/dist/assets/BotPicker-D6FYW1Gt.js +2 -0
- package/dashboard/dist/assets/BotPicker-D6FYW1Gt.js.map +1 -0
- package/dashboard/dist/assets/CollapsibleSection-Cxk4wvjT.js +2 -0
- package/dashboard/dist/assets/CollapsibleSection-Cxk4wvjT.js.map +1 -0
- package/dashboard/dist/assets/ConfirmDeleteModal-FSXyKjaB.js +2 -0
- package/dashboard/dist/assets/ConfirmDeleteModal-FSXyKjaB.js.map +1 -0
- package/dashboard/dist/assets/CopyableId-CBdxWfp8.js +2 -0
- package/dashboard/dist/assets/CopyableId-CBdxWfp8.js.map +1 -0
- package/dashboard/dist/assets/CredentialsPage-Ikzsot0w.js +2 -0
- package/dashboard/dist/assets/CredentialsPage-Ikzsot0w.js.map +1 -0
- package/dashboard/dist/assets/CustomDurationPicker-CAninCbl.js +2 -0
- package/dashboard/dist/assets/CustomDurationPicker-CAninCbl.js.map +1 -0
- package/dashboard/dist/assets/DataTable-BDn1WBHS.js +2 -0
- package/dashboard/dist/assets/DataTable-BDn1WBHS.js.map +1 -0
- package/dashboard/dist/assets/EmptyState-2CmV-IaS.js +2 -0
- package/dashboard/dist/assets/EmptyState-2CmV-IaS.js.map +1 -0
- package/dashboard/dist/assets/EscalationsOverview-GXYFPASS.js +2 -0
- package/dashboard/dist/assets/EscalationsOverview-GXYFPASS.js.map +1 -0
- package/dashboard/dist/assets/EventTable-B01oJf6Y.js +2 -0
- package/dashboard/dist/assets/EventTable-B01oJf6Y.js.map +1 -0
- package/dashboard/dist/assets/Field-DuFBAYhu.js +2 -0
- package/dashboard/dist/assets/Field-DuFBAYhu.js.map +1 -0
- package/dashboard/dist/assets/FilterBar-Ck4K4rzu.js +2 -0
- package/dashboard/dist/assets/FilterBar-Ck4K4rzu.js.map +1 -0
- package/dashboard/dist/assets/McpOverview-JkvRcX2e.js +2 -0
- package/dashboard/dist/assets/McpOverview-JkvRcX2e.js.map +1 -0
- package/dashboard/dist/assets/McpQueryDetailPage-CUMqhQdS.js +2 -0
- package/dashboard/dist/assets/McpQueryDetailPage-CUMqhQdS.js.map +1 -0
- package/dashboard/dist/assets/McpQueryPage-DRRhw4nN.js +2 -0
- package/dashboard/dist/assets/McpQueryPage-DRRhw4nN.js.map +1 -0
- package/dashboard/dist/assets/McpRunDetailPage-CmPs5EvE.js +2 -0
- package/dashboard/dist/assets/McpRunDetailPage-CmPs5EvE.js.map +1 -0
- package/dashboard/dist/assets/McpRunsPage-Dl5Y2u6k.js +2 -0
- package/dashboard/dist/assets/McpRunsPage-Dl5Y2u6k.js.map +1 -0
- package/dashboard/dist/assets/Modal-B4rbIVAn.js +2 -0
- package/dashboard/dist/assets/Modal-B4rbIVAn.js.map +1 -0
- package/dashboard/dist/assets/OperatorDashboard-B56il28q.js +2 -0
- package/dashboard/dist/assets/OperatorDashboard-B56il28q.js.map +1 -0
- package/dashboard/dist/assets/PageHeader-CpWFly5S.js +2 -0
- package/dashboard/dist/assets/PageHeader-CpWFly5S.js.map +1 -0
- package/dashboard/dist/assets/PriorityBadge-DfQY9St9.js +2 -0
- package/dashboard/dist/assets/PriorityBadge-DfQY9St9.js.map +1 -0
- package/dashboard/dist/assets/ProcessDetailPage-CMLq4M7D.js +2 -0
- package/dashboard/dist/assets/ProcessDetailPage-CMLq4M7D.js.map +1 -0
- package/dashboard/dist/assets/ProcessesListPage-CZ_HF06v.js +2 -0
- package/dashboard/dist/assets/ProcessesListPage-CZ_HF06v.js.map +1 -0
- package/dashboard/dist/assets/RolePill-BTPa8L-P.js +2 -0
- package/dashboard/dist/assets/RolePill-BTPa8L-P.js.map +1 -0
- package/dashboard/dist/assets/RolesPage-9grZW7yR.js +2 -0
- package/dashboard/dist/assets/RolesPage-9grZW7yR.js.map +1 -0
- package/dashboard/dist/assets/RowActions-Dg-Fsm5O.js +2 -0
- package/dashboard/dist/assets/RowActions-Dg-Fsm5O.js.map +1 -0
- package/dashboard/dist/assets/SimpleMarkdown-CBlvaWP4.js +4 -0
- package/dashboard/dist/assets/SimpleMarkdown-CBlvaWP4.js.map +1 -0
- package/dashboard/dist/assets/StatCard-DlgF0CJC.js +2 -0
- package/dashboard/dist/assets/StatCard-DlgF0CJC.js.map +1 -0
- package/dashboard/dist/assets/StatusBadge-TlC4jiig.js +2 -0
- package/dashboard/dist/assets/StatusBadge-TlC4jiig.js.map +1 -0
- package/dashboard/dist/assets/StickyPagination-F9FZsRy9.js +2 -0
- package/dashboard/dist/assets/StickyPagination-F9FZsRy9.js.map +1 -0
- package/dashboard/dist/assets/SwimlaneTimeline-7SiwATsZ.js +2 -0
- package/dashboard/dist/assets/SwimlaneTimeline-7SiwATsZ.js.map +1 -0
- package/dashboard/dist/assets/TaskDetailPage-CbPVTakt.js +2 -0
- package/dashboard/dist/assets/TaskDetailPage-CbPVTakt.js.map +1 -0
- package/dashboard/dist/assets/TaskQueuePill-awmtb0qw.js +2 -0
- package/dashboard/dist/assets/TaskQueuePill-awmtb0qw.js.map +1 -0
- package/dashboard/dist/assets/TasksListPage-C_QF23c1.js +2 -0
- package/dashboard/dist/assets/TasksListPage-C_QF23c1.js.map +1 -0
- package/dashboard/dist/assets/TimeAgo-UPG6DoH8.js +2 -0
- package/dashboard/dist/assets/TimeAgo-UPG6DoH8.js.map +1 -0
- package/dashboard/dist/assets/TimestampCell-DoWMKg6w.js +2 -0
- package/dashboard/dist/assets/TimestampCell-DoWMKg6w.js.map +1 -0
- package/dashboard/dist/assets/UserName-DaP4YAKr.js +2 -0
- package/dashboard/dist/assets/UserName-DaP4YAKr.js.map +1 -0
- package/dashboard/dist/assets/VersionHistory-Bt7WBr6m.js +5 -0
- package/dashboard/dist/assets/VersionHistory-Bt7WBr6m.js.map +1 -0
- package/dashboard/dist/assets/WorkflowExecutionPage-DjtAQ3hy.js +2 -0
- package/dashboard/dist/assets/WorkflowExecutionPage-DjtAQ3hy.js.map +1 -0
- package/dashboard/dist/assets/WorkflowPill-CCDSVaQj.js +2 -0
- package/dashboard/dist/assets/WorkflowPill-CCDSVaQj.js.map +1 -0
- package/dashboard/dist/assets/WorkflowsDashboard-D8z9uBNB.js +2 -0
- package/dashboard/dist/assets/WorkflowsDashboard-D8z9uBNB.js.map +1 -0
- package/dashboard/dist/assets/WorkflowsOverview-D9OzzQqw.js +2 -0
- package/dashboard/dist/assets/WorkflowsOverview-D9OzzQqw.js.map +1 -0
- package/dashboard/dist/assets/YamlWorkflowDetailPage-DrDvvP62.js +3 -0
- package/dashboard/dist/assets/YamlWorkflowDetailPage-DrDvvP62.js.map +1 -0
- package/dashboard/dist/assets/YamlWorkflowsPage-COqiNCQK.js +2 -0
- package/dashboard/dist/assets/YamlWorkflowsPage-COqiNCQK.js.map +1 -0
- package/dashboard/dist/assets/bots-BkKVMbUW.js +2 -0
- package/dashboard/dist/assets/bots-BkKVMbUW.js.map +1 -0
- package/dashboard/dist/assets/constants-CgaZfe5d.js +2 -0
- package/dashboard/dist/assets/constants-CgaZfe5d.js.map +1 -0
- package/dashboard/dist/assets/escalation-columns-D6aqStaY.js +2 -0
- package/dashboard/dist/assets/escalation-columns-D6aqStaY.js.map +1 -0
- package/dashboard/dist/assets/escalation-qalymbKB.js +2 -0
- package/dashboard/dist/assets/escalation-qalymbKB.js.map +1 -0
- package/dashboard/dist/assets/format-gXZXQ-HJ.js +2 -0
- package/dashboard/dist/assets/format-gXZXQ-HJ.js.map +1 -0
- package/dashboard/dist/assets/helpers-0gSleuzT.js +2 -0
- package/dashboard/dist/assets/helpers-0gSleuzT.js.map +1 -0
- package/dashboard/dist/assets/index-BWvMHed7.js +6 -0
- package/dashboard/dist/assets/index-BWvMHed7.js.map +1 -0
- package/dashboard/dist/assets/index-BaszoPO_.css +1 -0
- package/dashboard/dist/assets/index-Cn2jyj9A.js +2 -0
- package/dashboard/dist/assets/index-Cn2jyj9A.js.map +1 -0
- package/dashboard/dist/assets/index-D8VH6K8B.js +54 -0
- package/dashboard/dist/assets/index-D8VH6K8B.js.map +1 -0
- package/dashboard/dist/assets/index-D9SYwJsi.js +3 -0
- package/dashboard/dist/assets/index-D9SYwJsi.js.map +1 -0
- package/dashboard/dist/assets/index-DTPzZr_X.js +2 -0
- package/dashboard/dist/assets/index-DTPzZr_X.js.map +1 -0
- package/dashboard/dist/assets/index-D_6AB5BE.js +2 -0
- package/dashboard/dist/assets/index-D_6AB5BE.js.map +1 -0
- package/dashboard/dist/assets/index-S9Ks2Lj2.js +2 -0
- package/dashboard/dist/assets/index-S9Ks2Lj2.js.map +1 -0
- package/dashboard/dist/assets/index-X85K5bHC.js +17 -0
- package/dashboard/dist/assets/index-X85K5bHC.js.map +1 -0
- package/dashboard/dist/assets/index-rjmgHlSH.js +2 -0
- package/dashboard/dist/assets/index-rjmgHlSH.js.map +1 -0
- package/dashboard/dist/assets/mcp-blCW6IL7.js +2 -0
- package/dashboard/dist/assets/mcp-blCW6IL7.js.map +1 -0
- package/dashboard/dist/assets/mcp-query-DoAyPbjC.js +2 -0
- package/dashboard/dist/assets/mcp-query-DoAyPbjC.js.map +1 -0
- package/dashboard/dist/assets/mcp-runs-ChPbpvXK.js +2 -0
- package/dashboard/dist/assets/mcp-runs-ChPbpvXK.js.map +1 -0
- package/dashboard/dist/assets/namespaces-BgbaC3ow.js +2 -0
- package/dashboard/dist/assets/namespaces-BgbaC3ow.js.map +1 -0
- package/dashboard/dist/assets/roles-ZNrqqnQl.js +2 -0
- package/dashboard/dist/assets/roles-ZNrqqnQl.js.map +1 -0
- package/dashboard/dist/assets/settings-eBRSE0mQ.js +2 -0
- package/dashboard/dist/assets/settings-eBRSE0mQ.js.map +1 -0
- package/dashboard/dist/assets/tasks-tRqClPns.js +2 -0
- package/dashboard/dist/assets/tasks-tRqClPns.js.map +1 -0
- package/dashboard/dist/assets/useFilterParams-BaXUAkYK.js +2 -0
- package/dashboard/dist/assets/useFilterParams-BaXUAkYK.js.map +1 -0
- package/dashboard/dist/assets/useNatsEvents-Xr43X1fG.js +2 -0
- package/dashboard/dist/assets/useNatsEvents-Xr43X1fG.js.map +1 -0
- package/dashboard/dist/assets/useYamlActivityEvents-BO51u8tm.js +2 -0
- package/dashboard/dist/assets/useYamlActivityEvents-BO51u8tm.js.map +1 -0
- package/dashboard/dist/assets/users-tMvNyOo8.js +2 -0
- package/dashboard/dist/assets/users-tMvNyOo8.js.map +1 -0
- package/dashboard/dist/assets/vendor-icons-ZTAKVwGc.js +292 -0
- package/dashboard/dist/assets/vendor-icons-ZTAKVwGc.js.map +1 -0
- package/dashboard/dist/assets/vendor-query-B2UbickB.js +18 -0
- package/dashboard/dist/assets/vendor-query-B2UbickB.js.map +1 -0
- package/dashboard/dist/assets/vendor-react-Cw8Gy8NJ.js +22 -0
- package/dashboard/dist/assets/vendor-react-Cw8Gy8NJ.js.map +1 -0
- package/dashboard/dist/assets/workflows-Cc4VHcrp.js +2 -0
- package/dashboard/dist/assets/workflows-Cc4VHcrp.js.map +1 -0
- package/dashboard/dist/assets/yaml-workflows-BL4V5CQy.js +2 -0
- package/dashboard/dist/assets/yaml-workflows-BL4V5CQy.js.map +1 -0
- package/dashboard/dist/index.html +20 -0
- package/dashboard/dist/logo512.png +0 -0
- package/package.json +96 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-S9Ks2Lj2.js","sources":["../../src/pages/admin/users/CreateUserModal.tsx","../../src/pages/admin/users/EditUserModal.tsx","../../src/pages/admin/bots/CreateBotModal.tsx","../../src/pages/admin/bots/EditBotModal.tsx","../../src/pages/admin/bots/BotsPage.tsx","../../src/pages/admin/users/UsersPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useCreateUser } from '../../../api/users';\nimport { Modal } from '../../../components/common/modal/Modal';\n\nexport function CreateUserModal({\n open,\n onClose,\n}: {\n open: boolean;\n onClose: () => void;\n}) {\n const createUser = useCreateUser();\n const [form, setForm] = useState({\n external_id: '',\n email: '',\n display_name: '',\n password: '',\n });\n\n const [prevOpen, setPrevOpen] = useState(open);\n if (open !== prevOpen) {\n setPrevOpen(open);\n if (open) setForm({ external_id: '', email: '', display_name: '', password: '' });\n }\n\n const handleCreate = () => {\n if (!form.external_id.trim()) return;\n createUser.mutate(\n {\n external_id: form.external_id.trim(),\n email: form.email.trim() || undefined,\n display_name: form.display_name.trim() || undefined,\n password: form.password || undefined,\n },\n { onSuccess: onClose },\n );\n };\n\n const set = (field: string, value: string) =>\n setForm((f) => ({ ...f, [field]: value }));\n\n return (\n <Modal open={open} onClose={onClose} title=\"Create User\">\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n External ID (required)\n </label>\n <input\n type=\"text\"\n value={form.external_id}\n onChange={(e) => set('external_id', e.target.value)}\n placeholder=\"e.g., john.doe\"\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Display Name\n </label>\n <input\n type=\"text\"\n value={form.display_name}\n onChange={(e) => set('display_name', e.target.value)}\n placeholder=\"John Doe\"\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Email\n </label>\n <input\n type=\"text\"\n value={form.email}\n onChange={(e) => set('email', e.target.value)}\n placeholder=\"john@example.com\"\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Password\n </label>\n <input\n type=\"password\"\n value={form.password}\n onChange={(e) => set('password', e.target.value)}\n placeholder=\"Leave blank for no password\"\n className=\"input text-xs w-full\"\n />\n </div>\n\n {createUser.error && (\n <p className=\"text-xs text-status-error\">{(createUser.error as Error).message}</p>\n )}\n\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={onClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={handleCreate}\n disabled={!form.external_id.trim() || createUser.isPending}\n className=\"btn-primary text-xs\"\n >\n {createUser.isPending ? 'Creating...' : 'Create'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import { useState } from 'react';\nimport { useUpdateUser } from '../../../api/users';\nimport { Modal } from '../../../components/common/modal/Modal';\nimport type { LTUserRecord } from '../../../api/types';\n\nexport function EditUserModal({\n open,\n onClose,\n user,\n}: {\n open: boolean;\n onClose: () => void;\n user: LTUserRecord | null;\n}) {\n const updateUser = useUpdateUser();\n const [form, setForm] = useState({\n display_name: '',\n email: '',\n status: 'active' as string,\n });\n\n const [prevUser, setPrevUser] = useState(user);\n if (user !== prevUser) {\n setPrevUser(user);\n if (user) {\n setForm({\n display_name: user.display_name ?? '',\n email: user.email ?? '',\n status: user.status,\n });\n }\n }\n\n const handleSave = () => {\n if (!user) return;\n updateUser.mutate(\n {\n id: user.id,\n display_name: form.display_name.trim() || undefined,\n email: form.email.trim() || undefined,\n status: form.status,\n },\n { onSuccess: onClose },\n );\n };\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n title={`Edit — ${user?.display_name || user?.external_id || ''}`}\n >\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Display Name\n </label>\n <input\n type=\"text\"\n value={form.display_name}\n onChange={(e) => setForm((f) => ({ ...f, display_name: e.target.value }))}\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Email\n </label>\n <input\n type=\"text\"\n value={form.email}\n onChange={(e) => setForm((f) => ({ ...f, email: e.target.value }))}\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Status\n </label>\n <select\n value={form.status}\n onChange={(e) => setForm((f) => ({ ...f, status: e.target.value }))}\n className=\"select text-xs w-full\"\n >\n <option value=\"active\">Active</option>\n <option value=\"inactive\">Inactive</option>\n <option value=\"suspended\">Suspended</option>\n </select>\n </div>\n\n {updateUser.error && (\n <p className=\"text-xs text-status-error\">{(updateUser.error as Error).message}</p>\n )}\n\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={onClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={handleSave}\n disabled={updateUser.isPending}\n className=\"btn-primary text-xs\"\n >\n {updateUser.isPending ? 'Saving...' : 'Save'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import { useState } from 'react';\nimport { useCreateBot } from '../../../api/bots';\nimport { Modal } from '../../../components/common/modal/Modal';\n\nexport function CreateBotModal({\n open,\n onClose,\n}: {\n open: boolean;\n onClose: () => void;\n}) {\n const createBot = useCreateBot();\n const [form, setForm] = useState({\n name: '',\n display_name: '',\n description: '',\n });\n\n const [prevOpen, setPrevOpen] = useState(open);\n if (open !== prevOpen) {\n setPrevOpen(open);\n if (open) setForm({ name: '', display_name: '', description: '' });\n }\n\n const handleCreate = () => {\n if (!form.name.trim()) return;\n createBot.mutate(\n {\n name: form.name.trim(),\n display_name: form.display_name.trim() || undefined,\n description: form.description.trim() || undefined,\n },\n { onSuccess: onClose },\n );\n };\n\n const set = (field: string, value: string) =>\n setForm((f) => ({ ...f, [field]: value }));\n\n return (\n <Modal open={open} onClose={onClose} title=\"Create Bot\">\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Name (required)\n </label>\n <input\n type=\"text\"\n value={form.name}\n onChange={(e) => set('name', e.target.value.replace(/\\s+/g, '-').toLowerCase())}\n placeholder=\"e.g., ci-bot\"\n className=\"input text-xs w-full font-mono\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Display Name\n </label>\n <input\n type=\"text\"\n value={form.display_name}\n onChange={(e) => set('display_name', e.target.value)}\n placeholder=\"CI Bot\"\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Description\n </label>\n <input\n type=\"text\"\n value={form.description}\n onChange={(e) => set('description', e.target.value)}\n placeholder=\"Runs scheduled workflows\"\n className=\"input text-xs w-full\"\n />\n </div>\n\n {createBot.error && (\n <p className=\"text-xs text-status-error\">{(createBot.error as Error).message}</p>\n )}\n\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={onClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={handleCreate}\n disabled={!form.name.trim() || createBot.isPending}\n className=\"btn-primary text-xs\"\n >\n {createBot.isPending ? 'Creating...' : 'Create'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import { useState } from 'react';\nimport { useUpdateBot } from '../../../api/bots';\nimport { Modal } from '../../../components/common/modal/Modal';\nimport type { BotRecord } from '../../../api/types';\n\nexport function EditBotModal({\n open,\n onClose,\n bot,\n}: {\n open: boolean;\n onClose: () => void;\n bot: BotRecord | null;\n}) {\n const updateBot = useUpdateBot();\n const [form, setForm] = useState({\n display_name: '',\n description: '',\n status: 'active' as string,\n });\n\n const [prevBot, setPrevBot] = useState(bot);\n if (bot !== prevBot) {\n setPrevBot(bot);\n if (bot) {\n setForm({\n display_name: bot.display_name ?? '',\n description: bot.description ?? '',\n status: bot.status,\n });\n }\n }\n\n const handleSave = () => {\n if (!bot) return;\n updateBot.mutate(\n {\n id: bot.id,\n display_name: form.display_name.trim() || undefined,\n description: form.description.trim() || undefined,\n status: form.status,\n },\n { onSuccess: onClose },\n );\n };\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n title={`Edit — ${bot?.display_name || bot?.external_id || ''}`}\n >\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Display Name\n </label>\n <input\n type=\"text\"\n value={form.display_name}\n onChange={(e) => setForm((f) => ({ ...f, display_name: e.target.value }))}\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Description\n </label>\n <input\n type=\"text\"\n value={form.description}\n onChange={(e) => setForm((f) => ({ ...f, description: e.target.value }))}\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Status\n </label>\n <select\n value={form.status}\n onChange={(e) => setForm((f) => ({ ...f, status: e.target.value }))}\n className=\"select text-xs w-full\"\n >\n <option value=\"active\">Active</option>\n <option value=\"inactive\">Inactive</option>\n <option value=\"suspended\">Suspended</option>\n </select>\n </div>\n\n {updateBot.error && (\n <p className=\"text-xs text-status-error\">{(updateBot.error as Error).message}</p>\n )}\n\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={onClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={handleSave}\n disabled={updateBot.isPending}\n className=\"btn-primary text-xs\"\n >\n {updateBot.isPending ? 'Saving...' : 'Save'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import { useState, useMemo } from 'react';\nimport { Pencil, Trash2, Key, Plus, Copy, Check } from 'lucide-react';\nimport {\n useBots,\n useDeleteBot,\n useBotApiKeys,\n useCreateBotApiKey,\n useRevokeBotApiKey,\n useAddBotRole,\n useRemoveBotRole,\n} from '../../../api/bots';\nimport { useRoles } from '../../../api/roles';\nimport { useFilterParams } from '../../../hooks/useFilterParams';\nimport { DataTable, type Column } from '../../../components/common/data/DataTable';\nimport { StickyPagination } from '../../../components/common/data/StickyPagination';\nimport { ConfirmDeleteModal } from '../../../components/common/modal/ConfirmDeleteModal';\nimport { RowAction, RowActionGroup } from '../../../components/common/layout/RowActions';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { RolePill } from '../../../components/common/display/RolePill';\nimport { TimeAgo } from '../../../components/common/display/TimeAgo';\nimport type { BotRecord, BotApiKeyRecord, LTRoleType } from '../../../api/types';\nimport { CreateBotModal } from './CreateBotModal';\nimport { EditBotModal } from './EditBotModal';\n\nconst statusDot: Record<string, string> = {\n active: 'bg-status-success',\n inactive: 'bg-text-tertiary',\n suspended: 'bg-status-error',\n};\n\n// ── Detail Panel (right sidebar) ─────────────────────────────────\n\nfunction BotDetailPanel({ bot }: { bot: BotRecord | null }) {\n if (!bot) {\n return (\n <div className=\"border-l border-surface-border pl-6 pt-4 min-h-[300px]\">\n <p className=\"text-xs text-text-tertiary\">\n Select a bot to manage its API keys and roles.\n </p>\n </div>\n );\n }\n\n return (\n <div className=\"border-l border-surface-border pl-6 pt-4 min-h-[300px] space-y-6\">\n <div>\n <p className=\"text-sm text-text-primary\">{bot.display_name || bot.external_id}</p>\n {bot.description && (\n <p className=\"text-xs text-text-tertiary mt-0.5\">{bot.description}</p>\n )}\n </div>\n\n <ApiKeysSection botId={bot.id} />\n <RolesSection bot={bot} />\n </div>\n );\n}\n\n// ── API Keys Section ─────────────────────────────────────────────\n\nfunction ApiKeysSection({ botId }: { botId: string }) {\n const { data } = useBotApiKeys(botId);\n const createKey = useCreateBotApiKey();\n const revokeKey = useRevokeBotApiKey();\n\n const [newKeyName, setNewKeyName] = useState('');\n const [generatedKey, setGeneratedKey] = useState<string | null>(null);\n const [copied, setCopied] = useState(false);\n const [confirmRevoke, setConfirmRevoke] = useState<BotApiKeyRecord | null>(null);\n\n const keys = data?.keys ?? [];\n\n const handleGenerate = () => {\n if (!newKeyName.trim()) return;\n createKey.mutate(\n { botId, name: newKeyName.trim(), scopes: ['mcp:tool:call'] },\n {\n onSuccess: (result: any) => {\n setGeneratedKey(result.rawKey);\n setNewKeyName('');\n },\n },\n );\n };\n\n const handleCopy = () => {\n if (!generatedKey) return;\n navigator.clipboard.writeText(generatedKey);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n };\n\n const handleRevoke = () => {\n if (!confirmRevoke) return;\n revokeKey.mutate(\n { botId, keyId: confirmRevoke.id },\n { onSuccess: () => setConfirmRevoke(null) },\n );\n };\n\n return (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-3\">\n API Keys\n </p>\n\n {generatedKey && (\n <div className=\"mb-3 p-3 bg-status-success/10 border border-status-success/30 rounded-md\">\n <p className=\"text-[10px] font-semibold text-status-success mb-1\">\n Key generated — copy now, it won't be shown again\n </p>\n <div className=\"flex items-center gap-2\">\n <code className=\"text-[11px] font-mono text-text-primary bg-surface-sunken px-2 py-1 rounded flex-1 overflow-hidden text-ellipsis\">\n {generatedKey}\n </code>\n <button\n onClick={handleCopy}\n className=\"text-text-tertiary hover:text-text-primary shrink-0\"\n title=\"Copy to clipboard\"\n >\n {copied ? <Check className=\"w-3.5 h-3.5 text-status-success\" /> : <Copy className=\"w-3.5 h-3.5\" />}\n </button>\n </div>\n </div>\n )}\n\n {keys.length === 0 ? (\n <p className=\"text-xs text-text-tertiary mb-3\">No API keys.</p>\n ) : (\n <div className=\"space-y-1.5 mb-3\">\n {keys.map((k) => (\n <div\n key={k.id}\n className=\"group/key flex items-center justify-between px-2.5 py-1.5 bg-surface-sunken rounded text-xs\"\n >\n <div className=\"flex items-center gap-2\">\n <Key className=\"w-3 h-3 text-text-tertiary\" />\n <span className=\"text-text-primary font-mono\">{k.name}</span>\n {k.last_used_at && (\n <span className=\"text-[10px] text-text-tertiary\">\n used <TimeAgo date={k.last_used_at} />\n </span>\n )}\n </div>\n <button\n onClick={() => setConfirmRevoke(k)}\n className=\"opacity-0 group-hover/key:opacity-100 transition-opacity text-text-tertiary hover:text-status-error\"\n title=\"Revoke key\"\n >\n <Trash2 className=\"w-3 h-3\" />\n </button>\n </div>\n ))}\n </div>\n )}\n\n <div className=\"flex items-center gap-2\">\n <input\n type=\"text\"\n value={newKeyName}\n onChange={(e) => setNewKeyName(e.target.value)}\n placeholder=\"Key name...\"\n className=\"input text-xs flex-1 font-mono\"\n />\n <button\n onClick={handleGenerate}\n disabled={!newKeyName.trim() || createKey.isPending}\n className=\"btn-primary text-xs inline-flex items-center gap-1\"\n >\n <Plus className=\"w-3 h-3\" />\n {createKey.isPending ? '...' : 'Generate'}\n </button>\n </div>\n {createKey.error && (\n <p className=\"text-[10px] text-status-error mt-1\">{(createKey.error as Error).message}</p>\n )}\n\n <ConfirmDeleteModal\n open={!!confirmRevoke}\n onClose={() => setConfirmRevoke(null)}\n onConfirm={handleRevoke}\n title=\"Revoke API Key\"\n description={\n <>\n Revoke API key{' '}\n <span className=\"font-medium text-text-primary font-mono\">\n {confirmRevoke?.name}\n </span>\n ? This bot will no longer be able to authenticate with this key.\n </>\n }\n isPending={revokeKey.isPending}\n error={revokeKey.error as Error | null}\n />\n </div>\n );\n}\n\n// ── Roles Section ────────────────────────────────────────────────\n\nfunction RolesSection({ bot }: { bot: BotRecord }) {\n const { data: allRolesData } = useRoles();\n const addRole = useAddBotRole();\n const removeRole = useRemoveBotRole();\n const [newRole, setNewRole] = useState('');\n const [newType, setNewType] = useState<LTRoleType>('member');\n\n const allRoles = allRolesData?.roles ?? [];\n const currentRoles = bot.roles ?? [];\n\n const available = useMemo(() => {\n const assigned = new Set(currentRoles.map((r) => r.role));\n return allRoles.filter((r) => !assigned.has(r));\n }, [allRoles, currentRoles]);\n\n const handleAdd = () => {\n if (!newRole.trim()) return;\n addRole.mutate(\n { botId: bot.id, role: newRole.trim(), type: newType },\n { onSuccess: () => { setNewRole(''); setNewType('member'); } },\n );\n };\n\n const handleRemove = (role: string) => {\n removeRole.mutate({ botId: bot.id, role });\n };\n\n return (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-3\">\n Roles\n </p>\n\n {currentRoles.length === 0 ? (\n <p className=\"text-xs text-text-tertiary mb-3\">No roles assigned.</p>\n ) : (\n <div className=\"flex flex-wrap gap-2 mb-3\">\n {currentRoles.map((r) => (\n <span\n key={r.role}\n className=\"inline-flex items-center gap-1.5 px-2.5 py-1 text-xs bg-surface-sunken rounded-full text-text-secondary\"\n >\n <RolePill role={r.role} />\n <span className=\"text-[9px] text-text-tertiary\">{r.type}</span>\n <button\n onClick={() => handleRemove(r.role)}\n className=\"text-text-tertiary hover:text-status-error transition-colors ml-0.5\"\n title={`Remove ${r.role}`}\n >\n ×\n </button>\n </span>\n ))}\n </div>\n )}\n\n {available.length > 0 && (\n <div className=\"flex items-center gap-2\">\n <select\n value={newRole}\n onChange={(e) => setNewRole(e.target.value)}\n className=\"select text-xs font-mono flex-1\"\n >\n <option value=\"\">Select a role...</option>\n {available.map((r) => (\n <option key={r} value={r}>{r}</option>\n ))}\n </select>\n <select\n value={newType}\n onChange={(e) => setNewType(e.target.value as LTRoleType)}\n className=\"select text-xs w-24\"\n >\n <option value=\"member\">member</option>\n <option value=\"admin\">admin</option>\n <option value=\"superadmin\">superadmin</option>\n </select>\n <button\n onClick={handleAdd}\n disabled={!newRole || addRole.isPending}\n className=\"btn-primary text-xs\"\n >\n {addRole.isPending ? '...' : 'Add'}\n </button>\n </div>\n )}\n {addRole.error && (\n <p className=\"text-[10px] text-status-error mt-1\">{(addRole.error as Error).message}</p>\n )}\n </div>\n );\n}\n\n// ── Bots Page ────────────────────────────────────────────────────\n\nexport function BotsPage({ embedded = false }: { embedded?: boolean }) {\n const { pagination } = useFilterParams({ filters: {} });\n const deleteBot = useDeleteBot();\n\n const [showCreate, setShowCreate] = useState(false);\n const [editingBot, setEditingBot] = useState<BotRecord | null>(null);\n const [selectedBot, setSelectedBot] = useState<BotRecord | null>(null);\n const [confirmDelete, setConfirmDelete] = useState<BotRecord | null>(null);\n\n const { data, isLoading } = useBots({\n limit: pagination.pageSize,\n offset: pagination.offset,\n });\n\n const total = data?.total ?? 0;\n const bots = data?.bots ?? [];\n\n const activeBot = useMemo(() => {\n if (!selectedBot) return null;\n return bots.find((b) => b.id === selectedBot.id) ?? selectedBot;\n }, [bots, selectedBot]);\n\n const columns: Column<BotRecord>[] = [\n {\n key: 'display_name',\n label: 'Bot',\n render: (row) => (\n <div className=\"flex items-center gap-2.5\">\n <span\n className={`w-2 h-2 rounded-full shrink-0 ${statusDot[row.status] ?? 'bg-status-pending'}`}\n title={row.status}\n />\n <div>\n <p className=\"text-sm text-text-primary\">\n {row.display_name || row.external_id}\n </p>\n {row.description && (\n <p className=\"text-xs text-text-tertiary\">{row.description}</p>\n )}\n </div>\n </div>\n ),\n },\n {\n key: 'roles',\n label: 'Roles',\n render: (row) => (\n <div className=\"flex gap-1 flex-wrap\">\n {(row.roles ?? []).map((r) => (\n <RolePill key={r.role} role={r.role} />\n ))}\n </div>\n ),\n },\n {\n key: 'created_at',\n label: 'Created',\n render: (row) => <TimeAgo date={row.created_at} />,\n className: 'w-28',\n },\n {\n key: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n <RowAction\n icon={Pencil}\n title=\"Edit bot\"\n onClick={() => setEditingBot(row)}\n />\n <RowAction\n icon={Trash2}\n title=\"Delete bot\"\n onClick={() => setConfirmDelete(row)}\n colorClass=\"text-text-tertiary hover:text-status-error\"\n />\n </RowActionGroup>\n ),\n className: 'w-16 text-right',\n },\n ];\n\n const handleDelete = () => {\n if (!confirmDelete) return;\n deleteBot.mutate(confirmDelete.id, {\n onSuccess: () => {\n setConfirmDelete(null);\n if (selectedBot?.id === confirmDelete.id) setSelectedBot(null);\n },\n });\n };\n\n return (\n <div>\n {embedded ? (\n <div className=\"flex justify-end mb-4\">\n <button onClick={() => setShowCreate(true)} className=\"btn-primary text-xs\">\n Add Bot\n </button>\n </div>\n ) : (\n <PageHeader\n title=\"Service Accounts\"\n actions={\n <button onClick={() => setShowCreate(true)} className=\"btn-primary text-xs\">\n Add Bot\n </button>\n }\n />\n )}\n\n <div className=\"grid grid-cols-1 lg:grid-cols-[1fr_360px] gap-6\">\n <div>\n <DataTable\n columns={columns}\n data={bots}\n keyFn={(row) => row.id}\n isLoading={isLoading}\n emptyMessage=\"No bots yet\"\n onRowClick={(row) => setSelectedBot(row)}\n activeRowKey={activeBot?.id ?? null}\n />\n\n <StickyPagination\n page={pagination.page}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n total={total}\n pageSize={pagination.pageSize}\n onPageSizeChange={pagination.setPageSize}\n />\n </div>\n\n <BotDetailPanel bot={activeBot} />\n </div>\n\n <CreateBotModal open={showCreate} onClose={() => setShowCreate(false)} />\n\n <EditBotModal\n open={!!editingBot}\n onClose={() => setEditingBot(null)}\n bot={editingBot}\n />\n\n <ConfirmDeleteModal\n open={!!confirmDelete}\n onClose={() => setConfirmDelete(null)}\n onConfirm={handleDelete}\n title=\"Delete Bot\"\n description={\n <>\n Delete{' '}\n <span className=\"font-medium text-text-primary\">\n {confirmDelete?.display_name || confirmDelete?.external_id}\n </span>\n ? This will also revoke all API keys. This action cannot be undone.\n </>\n }\n isPending={deleteBot.isPending}\n error={deleteBot.error as Error | null}\n />\n </div>\n );\n}\n","import { useState, useMemo } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport { Pencil, Trash2, User, Bot } from 'lucide-react';\nimport { useUsers, useDeleteUser, useAddUserRole, useRemoveUserRole } from '../../../api/users';\nimport { useRoles } from '../../../api/roles';\nimport { useFilterParams } from '../../../hooks/useFilterParams';\nimport { DataTable, type Column } from '../../../components/common/data/DataTable';\nimport { StickyPagination } from '../../../components/common/data/StickyPagination';\nimport { FilterBar, FilterSelect } from '../../../components/common/data/FilterBar';\nimport { TimeAgo } from '../../../components/common/display/TimeAgo';\nimport { ConfirmDeleteModal } from '../../../components/common/modal/ConfirmDeleteModal';\nimport { RowAction, RowActionGroup } from '../../../components/common/layout/RowActions';\nimport type { LTUserRecord, LTRoleType } from '../../../api/types';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { RolePill } from '../../../components/common/display/RolePill';\nimport { CreateUserModal } from './CreateUserModal';\nimport { EditUserModal } from './EditUserModal';\nimport { BotsPage } from '../bots/BotsPage';\n\nconst statusOptions = [\n { value: 'active', label: 'Active' },\n { value: 'inactive', label: 'Inactive' },\n { value: 'suspended', label: 'Suspended' },\n];\n\nconst statusDot: Record<string, string> = {\n active: 'bg-status-success',\n inactive: 'bg-text-tertiary',\n suspended: 'bg-status-error',\n};\n\n// ── Role Panel (right sidebar) ─────────────────────────────────\n\nfunction RolePanel({ user }: { user: LTUserRecord | null }) {\n const { data: allRolesData } = useRoles();\n const addRole = useAddUserRole();\n const removeRole = useRemoveUserRole();\n const [newRole, setNewRole] = useState('');\n const [newType, setNewType] = useState<LTRoleType>('member');\n\n const allRoles = allRolesData?.roles ?? [];\n const currentRoles = user?.roles ?? [];\n\n const available = useMemo(() => {\n const assigned = new Set(currentRoles.map((r) => r.role));\n return allRoles.filter((r) => !assigned.has(r));\n }, [allRoles, currentRoles]);\n\n const handleAdd = () => {\n if (!user || !newRole.trim()) return;\n addRole.mutate(\n { userId: user.id, role: newRole.trim(), type: newType },\n { onSuccess: () => { setNewRole(''); setNewType('member'); } },\n );\n };\n\n const handleRemove = (role: string) => {\n if (!user) return;\n removeRole.mutate({ userId: user.id, role });\n };\n\n return (\n <div className=\"border-l border-surface-border pl-6 pt-4 min-h-[300px]\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-4\">\n Role Membership\n </p>\n\n {!user ? (\n <p className=\"text-xs text-text-tertiary\">\n Select a user to manage their roles.\n </p>\n ) : (\n <div className=\"space-y-4\">\n <div>\n <p className=\"text-sm text-text-primary\">{user.display_name || user.external_id}</p>\n <p className=\"text-[10px] text-text-tertiary mt-0.5\">Member of:</p>\n </div>\n\n {currentRoles.length === 0 ? (\n <p className=\"text-xs text-text-tertiary\">No roles assigned.</p>\n ) : (\n <div className=\"flex flex-wrap gap-2\">\n {currentRoles.map((r) => (\n <span\n key={r.role}\n className=\"inline-flex items-center gap-1.5 px-2.5 py-1 text-xs bg-surface-sunken rounded-full text-text-secondary\"\n >\n <RolePill role={r.role} />\n <span className=\"text-[9px] text-text-tertiary\">{r.type}</span>\n <button\n onClick={() => handleRemove(r.role)}\n className=\"text-text-tertiary hover:text-status-error transition-colors ml-0.5\"\n title={`Remove ${r.role}`}\n >\n ×\n </button>\n </span>\n ))}\n </div>\n )}\n\n {available.length > 0 && (\n <div className=\"pt-3 border-t border-surface-border\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-2\">\n Add Role\n </p>\n <div className=\"flex items-center gap-2\">\n <select\n value={newRole}\n onChange={(e) => setNewRole(e.target.value)}\n className=\"select text-xs font-mono flex-1\"\n >\n <option value=\"\">Select a role...</option>\n {available.map((r) => (\n <option key={r} value={r}>{r}</option>\n ))}\n </select>\n <select\n value={newType}\n onChange={(e) => setNewType(e.target.value as LTRoleType)}\n className=\"select text-xs w-24\"\n >\n <option value=\"member\">member</option>\n <option value=\"admin\">admin</option>\n <option value=\"superadmin\">superadmin</option>\n </select>\n <button\n onClick={handleAdd}\n disabled={!newRole || addRole.isPending}\n className=\"btn-primary text-xs\"\n >\n {addRole.isPending ? '...' : 'Add'}\n </button>\n </div>\n {addRole.error && (\n <p className=\"text-[10px] text-status-error mt-1\">{(addRole.error as Error).message}</p>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n\n// ── Tab toggle ─────────────────────────────────────────────────\n\ntype AccountTab = 'users' | 'service-accounts';\n\nfunction AccountTabToggle({ active, onChange }: { active: AccountTab; onChange: (t: AccountTab) => void }) {\n const btn = (tab: AccountTab, icon: React.ReactNode, label: string) => (\n <button\n onClick={() => onChange(tab)}\n className={`flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md transition-colors ${\n active === tab\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('users', <User className=\"w-3.5 h-3.5\" />, 'User Accounts')}\n {btn('service-accounts', <Bot className=\"w-3.5 h-3.5\" />, 'Service Accounts')}\n </div>\n );\n}\n\n// ── Accounts Page (wrapper) ────────────────────────────────────\n\nexport function UsersPage() {\n const [searchParams, setSearchParams] = useSearchParams();\n const tabParam = searchParams.get('tab');\n const activeTab: AccountTab = tabParam === 'service-accounts' ? 'service-accounts' : 'users';\n\n const handleTabChange = (tab: AccountTab) => {\n if (tab === 'users') {\n setSearchParams({});\n } else {\n setSearchParams({ tab });\n }\n };\n\n return (\n <div>\n <PageHeader\n title=\"Accounts\"\n actions={<AccountTabToggle active={activeTab} onChange={handleTabChange} />}\n />\n {activeTab === 'users' ? <UserAccountsPanel /> : <BotsPage embedded />}\n </div>\n );\n}\n\n// ── User Accounts Panel ────────────────────────────────────────\n\nfunction UserAccountsPanel() {\n const { filters, setFilter, pagination } = useFilterParams({\n filters: { status: '' },\n });\n const deleteUser = useDeleteUser();\n\n const [showCreate, setShowCreate] = useState(false);\n const [editingUser, setEditingUser] = useState<LTUserRecord | null>(null);\n const [selectedUser, setSelectedUser] = useState<LTUserRecord | null>(null);\n const [confirmDelete, setConfirmDelete] = useState<LTUserRecord | null>(null);\n\n const { data, isLoading } = useUsers({\n status: filters.status || undefined,\n limit: pagination.pageSize,\n offset: pagination.offset,\n });\n\n const total = data?.total ?? 0;\n const users = data?.users ?? [];\n\n // Keep selected user in sync with refreshed data\n const activeUser = useMemo(() => {\n if (!selectedUser) return null;\n return users.find((u) => u.id === selectedUser.id) ?? selectedUser;\n }, [users, selectedUser]);\n\n const columns: Column<LTUserRecord>[] = [\n {\n key: 'display_name',\n label: 'User',\n render: (row) => (\n <div className=\"flex items-center gap-2.5\">\n <span\n className={`w-2 h-2 rounded-full shrink-0 ${statusDot[row.status] ?? 'bg-status-pending'}`}\n title={row.status}\n />\n <div>\n <p className=\"text-sm text-text-primary\">\n {row.display_name || row.external_id}\n </p>\n {row.email && (\n <p className=\"text-xs text-text-tertiary\">{row.email}</p>\n )}\n </div>\n </div>\n ),\n },\n {\n key: 'roles',\n label: 'Roles',\n render: (row) => (\n <div className=\"flex gap-1 flex-wrap\">\n {(row.roles ?? []).map((r) => (\n <RolePill key={r.role} role={r.role} />\n ))}\n </div>\n ),\n },\n {\n key: 'created_at',\n label: 'Created',\n render: (row) => <TimeAgo date={row.created_at} />,\n className: 'w-28',\n },\n {\n key: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n <RowAction\n icon={Pencil}\n title=\"Edit user\"\n onClick={() => setEditingUser(row)}\n />\n <RowAction\n icon={Trash2}\n title=\"Delete user\"\n onClick={() => setConfirmDelete(row)}\n colorClass=\"text-text-tertiary hover:text-status-error\"\n />\n </RowActionGroup>\n ),\n className: 'w-16 text-right',\n },\n ];\n\n const handleDelete = () => {\n if (!confirmDelete) return;\n deleteUser.mutate(confirmDelete.id, {\n onSuccess: () => setConfirmDelete(null),\n });\n };\n\n return (\n <div>\n <div className=\"flex justify-end mb-4\">\n <button onClick={() => setShowCreate(true)} className=\"btn-primary text-xs\">\n Add User\n </button>\n </div>\n\n <FilterBar>\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={statusOptions}\n />\n </FilterBar>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-[1fr_320px] gap-6\">\n {/* Left — users table */}\n <div>\n <DataTable\n columns={columns}\n data={users}\n keyFn={(row) => row.id}\n isLoading={isLoading}\n emptyMessage=\"No users found\"\n onRowClick={(row) => setSelectedUser(row)}\n activeRowKey={activeUser?.id ?? null}\n />\n\n <StickyPagination\n page={pagination.page}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n total={total}\n pageSize={pagination.pageSize}\n onPageSizeChange={pagination.setPageSize}\n />\n </div>\n\n {/* Right — role management panel */}\n <RolePanel user={activeUser} />\n </div>\n\n <CreateUserModal open={showCreate} onClose={() => setShowCreate(false)} />\n\n <EditUserModal\n open={!!editingUser}\n onClose={() => setEditingUser(null)}\n user={editingUser}\n />\n\n <ConfirmDeleteModal\n open={!!confirmDelete}\n onClose={() => setConfirmDelete(null)}\n onConfirm={handleDelete}\n title=\"Delete User\"\n description={\n <>\n Delete{' '}\n <span className=\"font-medium text-text-primary\">\n {confirmDelete?.display_name || confirmDelete?.external_id}\n </span>\n ? This action cannot be undone.\n </>\n }\n isPending={deleteUser.isPending}\n error={deleteUser.error as Error | null}\n />\n </div>\n );\n}\n"],"names":["CreateUserModal","open","onClose","createUser","useCreateUser","form","setForm","useState","prevOpen","setPrevOpen","handleCreate","set","field","value","f","jsx","Modal","jsxs","e","EditUserModal","user","updateUser","useUpdateUser","prevUser","setPrevUser","handleSave","CreateBotModal","createBot","useCreateBot","EditBotModal","bot","updateBot","useUpdateBot","prevBot","setPrevBot","statusDot","BotDetailPanel","ApiKeysSection","RolesSection","botId","data","useBotApiKeys","createKey","useCreateBotApiKey","revokeKey","useRevokeBotApiKey","newKeyName","setNewKeyName","generatedKey","setGeneratedKey","copied","setCopied","confirmRevoke","setConfirmRevoke","keys","handleGenerate","result","handleCopy","handleRevoke","Check","Copy","k","Key","TimeAgo","Trash2","Plus","ConfirmDeleteModal","Fragment","allRolesData","useRoles","addRole","useAddBotRole","removeRole","useRemoveBotRole","newRole","setNewRole","newType","setNewType","allRoles","currentRoles","available","useMemo","assigned","r","handleAdd","handleRemove","role","RolePill","BotsPage","embedded","pagination","useFilterParams","deleteBot","useDeleteBot","showCreate","setShowCreate","editingBot","setEditingBot","selectedBot","setSelectedBot","confirmDelete","setConfirmDelete","isLoading","useBots","total","bots","activeBot","b","columns","row","RowActionGroup","RowAction","Pencil","handleDelete","PageHeader","DataTable","StickyPagination","statusOptions","RolePanel","useAddUserRole","useRemoveUserRole","AccountTabToggle","active","onChange","btn","tab","icon","label","User","Bot","UsersPage","searchParams","setSearchParams","useSearchParams","activeTab","handleTabChange","UserAccountsPanel","filters","setFilter","deleteUser","useDeleteUser","editingUser","setEditingUser","selectedUser","setSelectedUser","useUsers","users","activeUser","FilterBar","FilterSelect","v"],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import{a as x,j as e}from"./vendor-query-B2UbickB.js";import{c as H,i as K,u as M,j as X,b as Z}from"./workflows-Cc4VHcrp.js";import{D as ee}from"./DataTable-BDn1WBHS.js";import{C as te}from"./ConfirmDeleteModal-FSXyKjaB.js";import{F as se,b as I}from"./FilterBar-Ck4K4rzu.js";import{R as re,a as T}from"./RowActions-Dg-Fsm5O.js";import{u as ae}from"./useFilterParams-BaXUAkYK.js";import{P as U}from"./PageHeader-CpWFly5S.js";import{R as ne}from"./RolePill-BTPa8L-P.js";import{T as oe}from"./TaskQueuePill-awmtb0qw.js";import{W as le}from"./WorkflowPill-CCDSVaQj.js";import{q as ie,x as ce,y as ue,U as L,X as B,C as Q,z,d as $}from"./vendor-icons-ZTAKVwGc.js";import{b as V,d as de,e as xe}from"./vendor-react-Cw8Gy8NJ.js";import{u as me}from"./roles-ZNrqqnQl.js";import{B as pe}from"./BotPicker-D6FYW1Gt.js";import"./index-D8VH6K8B.js";import"./EmptyState-2CmV-IaS.js";import"./Modal-B4rbIVAn.js";import"./bots-BkKVMbUW.js";function he(t,r){const o=r.toLowerCase();return t.workflow_type.toLowerCase().includes(o)||(t.description??"").toLowerCase().includes(o)}function Je(){const t=V(),{data:r,isLoading:o}=H(),d=K(),{filters:a,setFilter:l}=ae({filters:{search:"",queue:"",role:"",tier:""}}),[c,w]=x.useState(a.search),[p,y]=x.useState(null);x.useEffect(()=>{if(c===a.search)return;const s=setTimeout(()=>l("search",c),300);return()=>clearTimeout(s)},[c,l,a.search]);const i=r??[],m=x.useMemo(()=>[...new Set(i.map(s=>s.task_queue).filter(Boolean))].sort(),[i]),u=x.useMemo(()=>[...new Set(i.flatMap(s=>s.roles??[]))].sort(),[i]),n=x.useMemo(()=>{let s=i;return a.search&&(s=s.filter(h=>he(h,a.search))),a.queue&&(s=s.filter(h=>h.task_queue===a.queue)),a.role&&(s=s.filter(h=>(h.roles??[]).includes(a.role))),a.tier==="certified"&&(s=s.filter(h=>h.registered)),a.tier==="durable"&&(s=s.filter(h=>!h.registered)),s},[i,a]),N=[{key:"workflow_type",label:"Workflow",render:s=>e.jsxs("div",{className:"min-w-0",children:[e.jsx(le,{type:s.workflow_type}),s.description&&e.jsx("p",{className:"text-[10px] text-text-tertiary mt-0.5 truncate",children:s.description})]})},{key:"task_queue",label:"Queue",render:s=>s.task_queue?e.jsx(oe,{queue:s.task_queue}):e.jsx("span",{className:"text-xs text-text-tertiary",children:"—"}),className:"whitespace-nowrap"},{key:"registered",label:"Tier",render:s=>s.registered?e.jsxs("span",{className:"inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-[10px] font-medium bg-accent/10 text-accent",children:[e.jsx(ie,{className:"w-3 h-3"}),"Certified"]}):e.jsx("span",{className:"inline-flex items-center px-1.5 py-0.5 rounded text-[10px] font-medium bg-surface-sunken text-text-tertiary",children:"Durable"}),className:"whitespace-nowrap"},{key:"roles",label:"Roles",render:s=>s.registered?e.jsxs("div",{className:"flex gap-1 flex-wrap",children:[(s.roles??[]).map(h=>e.jsx(ne,{role:h},h)),(!s.roles||s.roles.length===0)&&e.jsx("span",{className:"text-xs text-text-tertiary",children:"—"})]}):e.jsx("span",{className:"text-xs text-text-tertiary",children:"—"})},{key:"actions",label:"",render:s=>e.jsx(re,{children:s.registered?e.jsx(T,{icon:ce,title:"De-certify workflow",onClick:()=>y(s.workflow_type),colorClass:"text-text-tertiary hover:text-status-warning"}):e.jsx(T,{icon:ue,title:"Certify workflow",onClick:()=>t(`/workflows/registry/new?workflow_type=${encodeURIComponent(s.workflow_type)}&task_queue=${encodeURIComponent(s.task_queue??"")}`),colorClass:"text-text-tertiary hover:text-status-success"})}),className:"w-16 text-right"}],C=()=>{p&&d.mutate(p,{onSuccess:()=>y(null)})},_=s=>{s.registered?t(`/workflows/registry/${encodeURIComponent(s.workflow_type)}`):t(`/workflows/registry/new?workflow_type=${encodeURIComponent(s.workflow_type)}&task_queue=${encodeURIComponent(s.task_queue??"")}`)};return e.jsxs("div",{children:[e.jsx(U,{title:"Workflow Registry",actions:e.jsx("button",{onClick:()=>t("/workflows/registry/new"),className:"btn-primary text-xs",children:"Register Workflow"})}),e.jsxs(se,{children:[e.jsx("input",{type:"text",placeholder:"Search workflow type...",value:c,onChange:s=>w(s.target.value),className:"input text-[11px] py-1 px-2 w-56"}),e.jsx(I,{label:"Queue",value:a.queue,onChange:s=>l("queue",s),options:m.map(s=>({value:s,label:s}))}),e.jsx(I,{label:"Tier",value:a.tier,onChange:s=>l("tier",s),options:[{value:"certified",label:"Certified"},{value:"durable",label:"Durable"}]}),e.jsx(I,{label:"Role",value:a.role,onChange:s=>l("role",s),options:u.map(s=>({value:s,label:s}))})]}),e.jsx(ee,{columns:N,data:n,keyFn:s=>s.workflow_type,onRowClick:_,isLoading:o,emptyMessage:"No workflows found"}),e.jsx(te,{open:!!p,onClose:()=>y(null),onConfirm:C,title:"De-certify Workflow",description:e.jsxs(e.Fragment,{children:["Remove certification from ",e.jsx("span",{className:"font-mono font-medium text-text-primary",children:p}),"? This removes interceptor guarantees, escalation chains, and invocation role constraints. The workflow will continue running as a standard durable workflow."]}),isPending:d.isPending,error:d.error})]})}function fe({steps:t,currentStep:r,onStepClick:o}){return e.jsx("div",{className:"flex items-center justify-center gap-1 pb-4 border-b border-surface-border mb-4",children:t.map((d,a)=>{const l=a<r,c=a===r,w=!!o;return e.jsxs("div",{className:"flex items-center gap-1",children:[a>0&&e.jsx("div",{className:`w-4 h-px ${l?"bg-accent":"bg-surface-border"}`}),e.jsxs("button",{type:"button",onClick:w?()=>o(a):void 0,className:`flex items-center gap-1 ${w?"cursor-pointer":"cursor-default"}`,children:[e.jsx("span",{className:`w-5 h-5 rounded-full text-[10px] font-semibold flex items-center justify-center shrink-0 transition-colors ${c?"bg-accent text-text-inverse":l?"bg-accent-muted text-accent":"bg-surface-sunken text-text-tertiary"} ${w&&!c?"hover:bg-accent-muted hover:text-accent":""}`,children:a+1}),e.jsx("span",{className:`text-[10px] font-semibold uppercase tracking-wider whitespace-nowrap transition-colors ${c?"text-text-primary":"text-text-tertiary"} ${w&&!c?"hover:text-text-primary":""}`,children:d})]})]},d)})})}function S(t){return t.split(",").map(r=>r.trim()).filter(Boolean)}const O={workflow_type:"",description:"",task_queue:"",default_role:"reviewer",invocable:!1,roles:"",invocation_roles:"",consumes:"",envelope_schema:"",resolver_schema:"",cron_schedule:"",execute_as:""};function we(t){return{workflow_type:t.workflow_type,description:t.description??"",task_queue:t.task_queue??"",default_role:t.default_role,invocable:t.invocable,roles:(t.roles??[]).join(", "),invocation_roles:(t.invocation_roles??[]).join(", "),consumes:(t.consumes??[]).join(", "),envelope_schema:t.envelope_schema?JSON.stringify(t.envelope_schema,null,2):"",resolver_schema:t.resolver_schema?JSON.stringify(t.resolver_schema,null,2):"",cron_schedule:t.cron_schedule??"",execute_as:t.execute_as??""}}const F=["Identity","Escalation","Invocation & Schemas"];function P(t){if(!t.trim())return!0;try{return JSON.parse(t),!0}catch{return!1}}function A(t,r){return t===1?!!r.workflow_type.trim():t===3?P(r.envelope_schema)&&P(r.resolver_schema):!0}const b="block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",j="text-[10px] text-text-tertiary mt-2 leading-relaxed",J="input font-mono text-[11px] w-full leading-relaxed tabular-nums";function W({selected:t,onChange:r,single:o,placeholder:d}){const{data:a}=me(),l=(a==null?void 0:a.roles)??[],[c,w]=x.useState(!1),p=x.useRef(null);x.useEffect(()=>{const u=n=>{p.current&&!p.current.contains(n.target)&&w(!1)};return document.addEventListener("mousedown",u),()=>document.removeEventListener("mousedown",u)},[]);const y=u=>{o?(r(t.includes(u)?[]:[u]),w(!1)):r(t.includes(u)?t.filter(n=>n!==u):[...t,u])},i=u=>{r(t.filter(n=>n!==u))},m=d??(o?"Select role...":"Add roles...");return e.jsxs("div",{ref:p,className:"relative",children:[e.jsxs("button",{type:"button",onClick:()=>w(!c),className:"flex flex-wrap items-center gap-1.5 w-full min-h-[34px] px-2 py-1.5 bg-surface-sunken border border-surface-border rounded-md text-left cursor-pointer hover:border-accent/40 transition-colors focus:ring-1 focus:ring-accent focus:outline-none",children:[t.length===0&&e.jsx("span",{className:"text-xs text-text-tertiary",children:m}),t.map(u=>e.jsxs("span",{className:"inline-flex items-center gap-1 px-2 py-0.5 rounded-lg bg-accent/[0.08] text-text-secondary text-[11px]",children:[e.jsx(L,{className:"w-2.5 h-2.5 shrink-0 text-accent/75"}),u,e.jsx("span",{role:"button",onClick:n=>{n.stopPropagation(),i(u)},className:"ml-0.5 hover:text-status-error transition-colors",children:e.jsx(B,{className:"w-2.5 h-2.5"})})]},u)),e.jsx(Q,{className:`w-3.5 h-3.5 ml-auto shrink-0 text-text-tertiary transition-transform ${c?"rotate-180":""}`})]}),c&&e.jsx("div",{className:"absolute z-20 mt-1 w-full bg-white border border-surface-border rounded-md shadow-lg max-h-48 overflow-y-auto",children:l.length===0?e.jsx("p",{className:"px-3 py-2 text-xs text-text-tertiary",children:"No roles defined"}):l.map(u=>{const n=t.includes(u);return e.jsxs("button",{type:"button",onClick:()=>y(u),className:`flex items-center gap-2 w-full px-3 py-1.5 text-left text-xs transition-colors ${n?"bg-accent/[0.06] text-accent":"text-text-primary hover:bg-surface-sunken"}`,children:[e.jsx(L,{className:"w-3 h-3 shrink-0 text-accent/60"}),e.jsx("span",{className:"flex-1",children:u}),n&&e.jsx(z,{className:"w-3 h-3 shrink-0"})]},u)})})]})}function ve({options:t,selected:r,onChange:o,placeholder:d}){const[a,l]=x.useState(!1),c=x.useRef(null);x.useEffect(()=>{const i=m=>{c.current&&!c.current.contains(m.target)&&l(!1)};return document.addEventListener("mousedown",i),()=>document.removeEventListener("mousedown",i)},[]);const w=i=>{o(r.includes(i)?r.filter(m=>m!==i):[...r,i])},p=i=>{o(r.filter(m=>m!==i))},y=d??"Add workflows...";return e.jsxs("div",{ref:c,className:"relative",children:[e.jsxs("button",{type:"button",onClick:()=>l(!a),className:"flex flex-wrap items-center gap-1.5 w-full min-h-[34px] px-2 py-1.5 bg-surface-sunken border border-surface-border rounded-md text-left cursor-pointer hover:border-accent/40 transition-colors focus:ring-1 focus:ring-accent focus:outline-none",children:[r.length===0&&e.jsx("span",{className:"text-xs text-text-tertiary",children:y}),r.map(i=>e.jsxs("span",{className:"inline-flex items-center gap-1 px-2 py-0.5 rounded-lg bg-accent/[0.08] text-text-secondary text-[11px] font-mono",children:[e.jsx($,{className:"w-2.5 h-2.5 shrink-0 text-accent/75"}),i,e.jsx("span",{role:"button",onClick:m=>{m.stopPropagation(),p(i)},className:"ml-0.5 hover:text-status-error transition-colors",children:e.jsx(B,{className:"w-2.5 h-2.5"})})]},i)),e.jsx(Q,{className:`w-3.5 h-3.5 ml-auto shrink-0 text-text-tertiary transition-transform ${a?"rotate-180":""}`})]}),a&&e.jsx("div",{className:"absolute z-20 mt-1 w-full bg-white border border-surface-border rounded-md shadow-lg max-h-48 overflow-y-auto",children:t.length===0?e.jsx("p",{className:"px-3 py-2 text-xs text-text-tertiary",children:"No registered workflows"}):t.map(i=>{const m=r.includes(i);return e.jsxs("button",{type:"button",onClick:()=>w(i),className:`flex items-center gap-2 w-full px-3 py-1.5 text-left text-xs font-mono transition-colors ${m?"bg-accent/[0.06] text-accent":"text-text-primary hover:bg-surface-sunken"}`,children:[e.jsx($,{className:"w-3 h-3 shrink-0 text-accent/60"}),e.jsx("span",{className:"flex-1",children:i}),m&&e.jsx(z,{className:"w-3 h-3 shrink-0"})]},i)})})]})}function R(t){return S(t)}function D(t){return t.join(", ")}function ke({form:t,set:r,editing:o,durableTypes:d=[]}){const a=!o&&d.length>0;return e.jsxs("div",{className:"space-y-5",children:[e.jsxs("div",{children:[e.jsx("label",{className:b,children:"Workflow Type"}),a&&!t.workflow_type?e.jsxs("div",{className:"space-y-2",children:[e.jsx("p",{className:"text-xs text-text-secondary",children:"Select a durable workflow to register as certified:"}),e.jsx("div",{className:"grid gap-1",children:d.map(l=>e.jsx("button",{onClick:()=>r("workflow_type",l),className:"flex items-center gap-2 px-3 py-2 text-left text-xs font-mono rounded-md border border-surface-border hover:border-accent/50 hover:bg-accent/[0.04] transition-colors",children:l},l))}),e.jsxs("div",{className:"flex items-center gap-2 pt-1",children:[e.jsx("span",{className:"text-[10px] text-text-tertiary",children:"or"}),e.jsx("input",{type:"text",onChange:l=>r("workflow_type",l.target.value),placeholder:"Enter a workflow type manually",className:"input font-mono text-xs flex-1"})]})]}):e.jsxs(e.Fragment,{children:[e.jsx("input",{type:"text",value:t.workflow_type,onChange:l=>r("workflow_type",l.target.value),disabled:o,placeholder:"reviewContent",className:"input font-mono text-xs w-full"}),!o&&t.workflow_type&&d.length>0&&e.jsx("button",{onClick:()=>r("workflow_type",""),className:"text-[10px] text-accent hover:underline mt-1",children:"Choose from durable workflows"})]}),e.jsx("p",{className:j,children:"Registering a durable workflow makes it certified — the interceptor wraps every execution so failures escalate instead of throwing."})]}),e.jsxs("div",{children:[e.jsx("label",{className:b,children:"Description"}),e.jsx("input",{type:"text",value:t.description,onChange:l=>r("description",l.target.value),placeholder:"AI-powered content moderation with human escalation",className:"input text-xs w-full"})]}),e.jsxs("div",{children:[e.jsx("label",{className:b,children:"Task Queue"}),e.jsx("input",{type:"text",value:t.task_queue,onChange:l=>r("task_queue",l.target.value),placeholder:"lt-review",className:"input font-mono text-xs w-full"}),e.jsx("p",{className:j,children:"Durable task queue this workflow listens on"})]})]})}function ge({form:t,set:r}){const{data:o}=M(),d=(o??[]).map(a=>a.workflow_type).filter(a=>a!==t.workflow_type);return e.jsxs("div",{className:"space-y-5",children:[e.jsx("p",{className:"text-xs text-text-secondary leading-relaxed",children:"Configure how escalations are routed and who can interact with this workflow."}),e.jsxs("div",{children:[e.jsx("label",{className:b,children:"Default Escalation Role"}),e.jsx(W,{selected:R(t.default_role),onChange:a=>r("default_role",a[0]??""),single:!0,placeholder:"Select escalation role..."}),e.jsx("p",{className:j,children:"When this workflow escalates, assign to users with this role"})]}),e.jsxs("div",{children:[e.jsx("label",{className:b,children:"Escalation Roles"}),e.jsx(W,{selected:R(t.roles),onChange:a=>r("roles",D(a)),placeholder:"Select who can resolve escalations..."}),e.jsx("p",{className:j,children:"Users with any of these roles can claim and resolve escalations from this workflow."})]}),e.jsxs("div",{children:[e.jsx("label",{className:b,children:"Consumes"}),e.jsx(ve,{options:d,selected:R(t.consumes),onChange:a=>r("consumes",D(a)),placeholder:"Select workflow dependencies..."}),e.jsx("p",{className:j,children:"Output from these upstream workflows will be injected into the input envelope for this workflow."})]})]})}function je({form:t,set:r}){return e.jsxs("div",{className:"space-y-5",children:[e.jsx("div",{className:"flex gap-6 pt-1",children:e.jsxs("label",{className:"flex items-center gap-2 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:t.invocable,onChange:o=>r("invocable",o.target.checked),className:"w-4 h-4 rounded border-border accent-accent"}),e.jsx("span",{className:"text-xs text-text-primary font-medium",children:"Invocable"})]})}),e.jsx("p",{className:j,children:"Allow this workflow to be started from the dashboard or API."}),t.invocable&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{children:[e.jsx("label",{className:b,children:"Run As"}),e.jsx(pe,{selected:t.execute_as,onChange:o=>r("execute_as",o)}),e.jsx("p",{className:j,children:"Choose a bot to execute this workflow under its identity and credentials. Default runs as the invoking user."})]}),e.jsxs("div",{children:[e.jsx("label",{className:b,children:"Invocation Roles"}),e.jsx(W,{selected:R(t.invocation_roles),onChange:o=>r("invocation_roles",D(o)),placeholder:"Select who can start this workflow..."}),e.jsx("p",{className:j,children:"Only users with these roles can start this workflow. Leave empty to allow all authenticated users."})]}),e.jsxs("div",{children:[e.jsx("label",{className:b,children:"Envelope Schema"}),e.jsx("textarea",{value:t.envelope_schema,onChange:o=>r("envelope_schema",o.target.value),placeholder:`{
|
|
2
|
+
"data": {
|
|
3
|
+
"contentId": "example-123",
|
|
4
|
+
"content": "Text to review"
|
|
5
|
+
},
|
|
6
|
+
"metadata": {
|
|
7
|
+
"source": "dashboard"
|
|
8
|
+
}
|
|
9
|
+
}`,className:J,rows:8,spellCheck:!1}),e.jsxs("p",{className:j,children:["Pre-fills the JSON editor when invoking this workflow. Should include ",e.jsx("span",{className:"font-mono",children:"data"})," (workflow input) and optional ",e.jsx("span",{className:"font-mono",children:"metadata"})," (context)."]}),t.envelope_schema.trim()&&!P(t.envelope_schema)&&e.jsx("p",{className:"text-[10px] text-status-error mt-1",children:"Invalid JSON"})]})]}),!t.invocable&&e.jsx("div",{className:"py-4 px-4 bg-surface-sunken/50 rounded-md text-center",children:e.jsxs("p",{className:"text-xs text-text-tertiary",children:["Enable ",e.jsx("span",{className:"font-medium text-text-secondary",children:"Invocable"})," above to configure who can start this workflow and set an input template."]})}),e.jsxs("div",{children:[e.jsx("label",{className:b,children:"Resolver Schema"}),e.jsx("textarea",{value:t.resolver_schema,onChange:o=>r("resolver_schema",o.target.value),placeholder:`{
|
|
10
|
+
"approved": true,
|
|
11
|
+
"analysis": {
|
|
12
|
+
"confidence": 0.95,
|
|
13
|
+
"flags": [],
|
|
14
|
+
"summary": "Content meets guidelines"
|
|
15
|
+
}
|
|
16
|
+
}`,className:J,rows:8,spellCheck:!1}),e.jsx("p",{className:j,children:"The shape of data a human or AI provides when resolving an escalation from this workflow. Pre-fills the JSON editor in the escalation resolution form."}),t.resolver_schema.trim()&&!P(t.resolver_schema)&&e.jsx("p",{className:"text-[10px] text-status-error mt-1",children:"Invalid JSON"})]})]})}function Me(){const{workflowType:t}=de(),r=!t,o=V(),{data:d,isLoading:a}=M(),l=X(),c=(d==null?void 0:d.find(f=>f.workflow_type===t))??null,w=new Set(["mcpQuery","mcpDeterministic","mcpQueryRouter","mcpTriage","mcpTriageRouter","mcpTriageDeterministic","insightQuery"]),{data:p}=Z({limit:500}),y=x.useMemo(()=>{const f=new Set((d??[]).map(v=>v.workflow_type));return[...new Set(((p==null?void 0:p.jobs)??[]).map(v=>v.entity))].filter(v=>!f.has(v)&&!w.has(v)).sort()},[d,p]),[i,m]=xe(),u=x.useMemo(()=>{if(!r)return O;const f=i.get("workflow_type")??"",g=i.get("task_queue")??"";return!f&&!g?O:{...O,workflow_type:f,task_queue:g}},[r,i]),[n,N]=x.useState(u),[C,_]=x.useState(""),[s,h]=x.useState(!1),k=parseInt(i.get("step")||"1",10),q=x.useCallback(f=>{m(g=>{const v=new URLSearchParams(g);return v.set("step",String(f)),v},{replace:!1})},[m]);x.useEffect(()=>{if(!s){if(r){N(u),h(!0);return}c&&(N(we(c)),h(!0))}},[c,r,s,u]);const E=(f,g)=>N(v=>({...v,[f]:g})),Y=()=>{if(!n.workflow_type.trim())return;_("");let f=null,g=null;try{n.envelope_schema.trim()&&(f=JSON.parse(n.envelope_schema))}catch{_("Invalid JSON in Envelope Schema");return}try{n.resolver_schema.trim()&&(g=JSON.parse(n.resolver_schema))}catch{_("Invalid JSON in Resolver Schema");return}l.mutate({workflow_type:n.workflow_type.trim(),description:n.description.trim()||null,task_queue:n.task_queue.trim()||null,default_role:n.default_role.trim()||"reviewer",invocable:n.invocable,roles:S(n.roles),invocation_roles:S(n.invocation_roles),consumes:S(n.consumes),envelope_schema:f,resolver_schema:g,cron_schedule:n.cron_schedule.trim()||null,execute_as:n.execute_as.trim()||null},{onSuccess:()=>{o("/workflows/registry")}})};if(a)return 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-60 bg-surface-sunken rounded"})]});if(!r&&!c)return e.jsx("p",{className:"text-sm text-text-secondary",children:"Config not found."});const G=k===F.length;return e.jsxs("div",{children:[e.jsx(U,{title:r?"Register Workflow":(c==null?void 0:c.workflow_type)??""}),e.jsxs("div",{className:"max-w-3xl",children:[e.jsx(fe,{steps:F,currentStep:k-1,onStepClick:f=>q(f+1)}),e.jsxs("div",{className:"min-h-[360px] py-2",children:[k===1&&e.jsx(ke,{form:n,set:E,editing:!!c,durableTypes:y}),k===2&&e.jsx(ge,{form:n,set:E}),k===3&&e.jsx(je,{form:n,set:E})]}),(C||l.error)&&e.jsx("p",{className:"text-xs text-status-error mt-4",children:C||l.error.message}),e.jsxs("div",{className:"flex justify-between items-center pt-4 border-t border-surface-border mt-4",children:[e.jsx("div",{children:k>1&&e.jsx("button",{onClick:()=>q(k-1),className:"btn-secondary text-xs",children:"Back"})}),e.jsxs("div",{className:"flex gap-3",children:[e.jsx("button",{onClick:()=>o("/workflows/registry"),className:"btn-ghost text-xs",children:"Cancel"}),G?e.jsx("button",{onClick:Y,disabled:!A(k,n)||l.isPending,className:"btn-primary text-xs",children:l.isPending?"Saving...":c?"Save":"Create"}):e.jsx("button",{onClick:()=>q(k+1),disabled:!A(k,n),className:"btn-primary text-xs",children:"Next"})]})]})]})]})}export{Me as WorkflowConfigDetailPage,Je as WorkflowConfigsPage};
|
|
17
|
+
//# sourceMappingURL=index-X85K5bHC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-X85K5bHC.js","sources":["../../src/pages/workflows/registry/WorkflowConfigsPage.tsx","../../src/components/common/layout/StepIndicator.tsx","../../src/lib/parse.ts","../../src/pages/workflows/registry/config-form-types.ts","../../src/components/common/form/RolePicker.tsx","../../src/components/common/form/WorkflowPicker.tsx","../../src/pages/workflows/registry/ConfigWizardSteps.tsx","../../src/pages/workflows/registry/WorkflowConfigDetailPage.tsx"],"sourcesContent":["import { useState, useEffect, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport {\n useDiscoveredWorkflows,\n useDeleteWorkflowConfig,\n} from '../../../api/workflows';\nimport { ShieldCheck, ShieldPlus, ShieldOff } from 'lucide-react';\nimport { DataTable, type Column } from '../../../components/common/data/DataTable';\nimport { ConfirmDeleteModal } from '../../../components/common/modal/ConfirmDeleteModal';\nimport { FilterBar, FilterSelect } from '../../../components/common/data/FilterBar';\nimport { RowAction, RowActionGroup } from '../../../components/common/layout/RowActions';\nimport { useFilterParams } from '../../../hooks/useFilterParams';\nimport type { DiscoveredWorkflow } from '../../../api/types';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { RolePill } from '../../../components/common/display/RolePill';\nimport { TaskQueuePill } from '../../../components/common/display/TaskQueuePill';\nimport { WorkflowPill } from '../../../components/common/display/WorkflowPill';\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\nfunction matchesSearch(wf: DiscoveredWorkflow, search: string): boolean {\n const q = search.toLowerCase();\n return (\n wf.workflow_type.toLowerCase().includes(q) ||\n (wf.description ?? '').toLowerCase().includes(q)\n );\n}\n\n// ── Page ──────────────────────────────────────────────────────────────────────\n\nexport function WorkflowConfigsPage() {\n const navigate = useNavigate();\n const { data, isLoading } = useDiscoveredWorkflows();\n const deleteConfig = useDeleteWorkflowConfig();\n const { filters, setFilter } = useFilterParams({\n filters: { search: '', queue: '', role: '', tier: '' },\n });\n\n const [searchInput, setSearchInput] = useState(filters.search);\n const [confirmDelete, setConfirmDelete] = useState<string | null>(null);\n\n // Debounce search input\n useEffect(() => {\n if (searchInput === filters.search) return;\n const timer = setTimeout(() => setFilter('search', searchInput), 300);\n return () => clearTimeout(timer);\n }, [searchInput, setFilter, filters.search]);\n\n const allWorkflows = data ?? [];\n\n // Derive facet options from data\n const queues = useMemo(\n () => [...new Set(allWorkflows.map((w) => w.task_queue).filter(Boolean) as string[])].sort(),\n [allWorkflows],\n );\n const roles = useMemo(\n () => [...new Set(allWorkflows.flatMap((w) => w.roles ?? []))].sort(),\n [allWorkflows],\n );\n\n // Apply client-side filters\n const workflows = useMemo(() => {\n let result = allWorkflows;\n if (filters.search) result = result.filter((w) => matchesSearch(w, filters.search));\n if (filters.queue) result = result.filter((w) => w.task_queue === filters.queue);\n if (filters.role) result = result.filter((w) => (w.roles ?? []).includes(filters.role));\n if (filters.tier === 'certified') result = result.filter((w) => w.registered);\n if (filters.tier === 'durable') result = result.filter((w) => !w.registered);\n return result;\n }, [allWorkflows, filters]);\n\n const columns: Column<DiscoveredWorkflow>[] = [\n {\n key: 'workflow_type',\n label: 'Workflow',\n render: (row) => (\n <div className=\"min-w-0\">\n <WorkflowPill type={row.workflow_type} />\n {row.description && (\n <p className=\"text-[10px] text-text-tertiary mt-0.5 truncate\">{row.description}</p>\n )}\n </div>\n ),\n },\n {\n key: 'task_queue',\n label: 'Queue',\n render: (row) => row.task_queue ? <TaskQueuePill queue={row.task_queue} /> : <span className=\"text-xs text-text-tertiary\">—</span>,\n className: 'whitespace-nowrap',\n },\n {\n key: 'registered',\n label: 'Tier',\n render: (row) => row.registered\n ? <span className=\"inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-[10px] font-medium bg-accent/10 text-accent\"><ShieldCheck className=\"w-3 h-3\" />Certified</span>\n : <span className=\"inline-flex items-center px-1.5 py-0.5 rounded text-[10px] font-medium bg-surface-sunken text-text-tertiary\">Durable</span>,\n className: 'whitespace-nowrap',\n },\n {\n key: 'roles',\n label: 'Roles',\n render: (row) => row.registered ? (\n <div className=\"flex gap-1 flex-wrap\">\n {(row.roles ?? []).map((r) => (\n <RolePill key={r} role={r} />\n ))}\n {(!row.roles || row.roles.length === 0) && <span className=\"text-xs text-text-tertiary\">—</span>}\n </div>\n ) : (\n <span className=\"text-xs text-text-tertiary\">—</span>\n ),\n },\n {\n key: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n {row.registered ? (\n <RowAction\n icon={ShieldOff}\n title=\"De-certify workflow\"\n onClick={() => setConfirmDelete(row.workflow_type)}\n colorClass=\"text-text-tertiary hover:text-status-warning\"\n />\n ) : (\n <RowAction\n icon={ShieldPlus}\n title=\"Certify workflow\"\n onClick={() => navigate(`/workflows/registry/new?workflow_type=${encodeURIComponent(row.workflow_type)}&task_queue=${encodeURIComponent(row.task_queue ?? '')}`)}\n colorClass=\"text-text-tertiary hover:text-status-success\"\n />\n )}\n </RowActionGroup>\n ),\n className: 'w-16 text-right',\n },\n ];\n\n const handleDelete = () => {\n if (!confirmDelete) return;\n deleteConfig.mutate(confirmDelete, {\n onSuccess: () => setConfirmDelete(null),\n });\n };\n\n const handleRowClick = (row: DiscoveredWorkflow) => {\n if (row.registered) {\n navigate(`/workflows/registry/${encodeURIComponent(row.workflow_type)}`);\n } else {\n navigate(`/workflows/registry/new?workflow_type=${encodeURIComponent(row.workflow_type)}&task_queue=${encodeURIComponent(row.task_queue ?? '')}`);\n }\n };\n\n return (\n <div>\n <PageHeader\n title=\"Workflow Registry\"\n actions={\n <button\n onClick={() => navigate('/workflows/registry/new')}\n className=\"btn-primary text-xs\"\n >\n Register Workflow\n </button>\n }\n />\n\n <FilterBar>\n <input\n type=\"text\"\n placeholder=\"Search workflow type...\"\n value={searchInput}\n onChange={(e) => setSearchInput(e.target.value)}\n className=\"input text-[11px] py-1 px-2 w-56\"\n />\n <FilterSelect\n label=\"Queue\"\n value={filters.queue}\n onChange={(v) => setFilter('queue', v)}\n options={queues.map((q) => ({ value: q, label: q }))}\n />\n <FilterSelect\n label=\"Tier\"\n value={filters.tier}\n onChange={(v) => setFilter('tier', v)}\n options={[\n { value: 'certified', label: 'Certified' },\n { value: 'durable', label: 'Durable' },\n ]}\n />\n <FilterSelect\n label=\"Role\"\n value={filters.role}\n onChange={(v) => setFilter('role', v)}\n options={roles.map((r) => ({ value: r, label: r }))}\n />\n </FilterBar>\n\n <DataTable\n columns={columns}\n data={workflows}\n keyFn={(row) => row.workflow_type}\n onRowClick={handleRowClick}\n isLoading={isLoading}\n emptyMessage=\"No workflows found\"\n />\n\n {/* Delete confirmation modal */}\n <ConfirmDeleteModal\n open={!!confirmDelete}\n onClose={() => setConfirmDelete(null)}\n onConfirm={handleDelete}\n title=\"De-certify Workflow\"\n description={<>Remove certification from <span className=\"font-mono font-medium text-text-primary\">{confirmDelete}</span>? This removes interceptor guarantees, escalation chains, and invocation role constraints. The workflow will continue running as a standard durable workflow.</>}\n isPending={deleteConfig.isPending}\n error={deleteConfig.error as Error | null}\n />\n </div>\n );\n}\n","interface StepIndicatorProps {\n steps: string[];\n currentStep: number;\n onStepClick?: (step: number) => void;\n}\n\nexport function StepIndicator({ steps, currentStep, onStepClick }: StepIndicatorProps) {\n return (\n <div className=\"flex items-center justify-center gap-1 pb-4 border-b border-surface-border mb-4\">\n {steps.map((label, i) => {\n const done = i < currentStep;\n const active = i === currentStep;\n const clickable = !!onStepClick;\n return (\n <div key={label} className=\"flex items-center gap-1\">\n {i > 0 && (\n <div className={`w-4 h-px ${done ? 'bg-accent' : 'bg-surface-border'}`} />\n )}\n <button\n type=\"button\"\n onClick={clickable ? () => onStepClick(i) : undefined}\n className={`flex items-center gap-1 ${clickable ? 'cursor-pointer' : 'cursor-default'}`}\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 active\n ? 'bg-accent text-text-inverse'\n : done\n ? 'bg-accent-muted text-accent'\n : 'bg-surface-sunken text-text-tertiary'\n } ${clickable && !active ? 'hover:bg-accent-muted hover:text-accent' : ''}`}\n >\n {i + 1}\n </span>\n <span\n className={`text-[10px] font-semibold uppercase tracking-wider whitespace-nowrap transition-colors ${\n active ? 'text-text-primary' : 'text-text-tertiary'\n } ${clickable && !active ? 'hover:text-text-primary' : ''}`}\n >\n {label}\n </span>\n </button>\n </div>\n );\n })}\n </div>\n );\n}\n","export function splitCsv(s: string): string[] {\n return s\n .split(',')\n .map((v) => v.trim())\n .filter(Boolean);\n}\n\nexport function safeParseJson<T = unknown>(\n json: string,\n): { ok: true; data: T } | { ok: false; error: string } {\n try {\n return { ok: true, data: JSON.parse(json) as T };\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : 'Invalid JSON';\n return { ok: false, error: message };\n }\n}\n","import type { LTWorkflowConfig } from '../../../api/types';\n\nexport interface ConfigFormState {\n workflow_type: string;\n description: string;\n task_queue: string;\n default_role: string;\n invocable: boolean;\n roles: string;\n invocation_roles: string;\n consumes: string;\n envelope_schema: string;\n resolver_schema: string;\n cron_schedule: string;\n execute_as: string;\n}\n\nexport const EMPTY_FORM: ConfigFormState = {\n workflow_type: '',\n description: '',\n task_queue: '',\n default_role: 'reviewer',\n invocable: false,\n roles: '',\n invocation_roles: '',\n consumes: '',\n envelope_schema: '',\n resolver_schema: '',\n cron_schedule: '',\n execute_as: '',\n};\n\nexport function configToForm(c: LTWorkflowConfig): ConfigFormState {\n return {\n workflow_type: c.workflow_type,\n description: c.description ?? '',\n task_queue: c.task_queue ?? '',\n default_role: c.default_role,\n invocable: c.invocable,\n roles: (c.roles ?? []).join(', '),\n invocation_roles: (c.invocation_roles ?? []).join(', '),\n consumes: (c.consumes ?? []).join(', '),\n envelope_schema: c.envelope_schema ? JSON.stringify(c.envelope_schema, null, 2) : '',\n resolver_schema: c.resolver_schema ? JSON.stringify(c.resolver_schema, null, 2) : '',\n cron_schedule: c.cron_schedule ?? '',\n execute_as: c.execute_as ?? '',\n };\n}\n\nexport const STEP_LABELS = ['Identity', 'Escalation', 'Invocation & Schemas'];\n\nexport function jsonValid(v: string): boolean {\n if (!v.trim()) return true;\n try { JSON.parse(v); return true; } catch { return false; }\n}\n\nexport function isStepValid(step: number, form: ConfigFormState): boolean {\n if (step === 1) return !!form.workflow_type.trim();\n if (step === 3) return jsonValid(form.envelope_schema) && jsonValid(form.resolver_schema);\n return true;\n}\n\nexport const labelCls = 'block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1';\nexport const hintCls = 'text-[10px] text-text-tertiary mt-2 leading-relaxed';\nexport const jsonCls = 'input font-mono text-[11px] w-full leading-relaxed tabular-nums';\n\nexport const DEFAULT_ENVELOPE = '{\\n \"data\": {},\\n \"metadata\": {}\\n}';\n","import { useState, useRef, useEffect } from 'react';\nimport { User, X, ChevronDown, Check } from 'lucide-react';\nimport { useRoles } from '../../../api/roles';\n\ninterface RolePickerProps {\n selected: string[];\n onChange: (roles: string[]) => void;\n /** Only allow one selection */\n single?: boolean;\n placeholder?: string;\n}\n\nexport function RolePicker({ selected, onChange, single, placeholder }: RolePickerProps) {\n const { data } = useRoles();\n const allRoles = data?.roles ?? [];\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, []);\n\n const toggle = (role: string) => {\n if (single) {\n onChange(selected.includes(role) ? [] : [role]);\n setOpen(false);\n } else {\n onChange(\n selected.includes(role)\n ? selected.filter((r) => r !== role)\n : [...selected, role],\n );\n }\n };\n\n const remove = (role: string) => {\n onChange(selected.filter((r) => r !== role));\n };\n\n const placeholderText = placeholder ?? (single ? 'Select role...' : 'Add roles...');\n\n return (\n <div ref={ref} className=\"relative\">\n {/* Selected pills + trigger */}\n <button\n type=\"button\"\n onClick={() => setOpen(!open)}\n className=\"flex flex-wrap items-center gap-1.5 w-full min-h-[34px] px-2 py-1.5 bg-surface-sunken border border-surface-border rounded-md text-left cursor-pointer hover:border-accent/40 transition-colors focus:ring-1 focus:ring-accent focus:outline-none\"\n >\n {selected.length === 0 && (\n <span className=\"text-xs text-text-tertiary\">{placeholderText}</span>\n )}\n {selected.map((role) => (\n <span\n key={role}\n className=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-lg bg-accent/[0.08] text-text-secondary text-[11px]\"\n >\n <User className=\"w-2.5 h-2.5 shrink-0 text-accent/75\" />\n {role}\n <span\n role=\"button\"\n onClick={(e) => { e.stopPropagation(); remove(role); }}\n className=\"ml-0.5 hover:text-status-error transition-colors\"\n >\n <X className=\"w-2.5 h-2.5\" />\n </span>\n </span>\n ))}\n <ChevronDown className={`w-3.5 h-3.5 ml-auto shrink-0 text-text-tertiary transition-transform ${open ? 'rotate-180' : ''}`} />\n </button>\n\n {/* Dropdown */}\n {open && (\n <div className=\"absolute z-20 mt-1 w-full bg-white border border-surface-border rounded-md shadow-lg max-h-48 overflow-y-auto\">\n {allRoles.length === 0 ? (\n <p className=\"px-3 py-2 text-xs text-text-tertiary\">No roles defined</p>\n ) : (\n allRoles.map((role) => {\n const isSelected = selected.includes(role);\n return (\n <button\n key={role}\n type=\"button\"\n onClick={() => toggle(role)}\n className={`flex items-center gap-2 w-full px-3 py-1.5 text-left text-xs transition-colors ${\n isSelected\n ? 'bg-accent/[0.06] text-accent'\n : 'text-text-primary hover:bg-surface-sunken'\n }`}\n >\n <User className=\"w-3 h-3 shrink-0 text-accent/60\" />\n <span className=\"flex-1\">{role}</span>\n {isSelected && <Check className=\"w-3 h-3 shrink-0\" />}\n </button>\n );\n })\n )}\n </div>\n )}\n </div>\n );\n}\n","import { useState, useRef, useEffect } from 'react';\nimport { Workflow, X, ChevronDown, Check } from 'lucide-react';\n\ninterface WorkflowPickerProps {\n options: string[];\n selected: string[];\n onChange: (workflows: string[]) => void;\n placeholder?: string;\n}\n\nexport function WorkflowPicker({ options, selected, onChange, placeholder }: WorkflowPickerProps) {\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, []);\n\n const toggle = (wfType: string) => {\n onChange(\n selected.includes(wfType)\n ? selected.filter((t) => t !== wfType)\n : [...selected, wfType],\n );\n };\n\n const remove = (wfType: string) => {\n onChange(selected.filter((t) => t !== wfType));\n };\n\n const placeholderText = placeholder ?? 'Add workflows...';\n\n return (\n <div ref={ref} className=\"relative\">\n <button\n type=\"button\"\n onClick={() => setOpen(!open)}\n className=\"flex flex-wrap items-center gap-1.5 w-full min-h-[34px] px-2 py-1.5 bg-surface-sunken border border-surface-border rounded-md text-left cursor-pointer hover:border-accent/40 transition-colors focus:ring-1 focus:ring-accent focus:outline-none\"\n >\n {selected.length === 0 && (\n <span className=\"text-xs text-text-tertiary\">{placeholderText}</span>\n )}\n {selected.map((wfType) => (\n <span\n key={wfType}\n className=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-lg bg-accent/[0.08] text-text-secondary text-[11px] font-mono\"\n >\n <Workflow className=\"w-2.5 h-2.5 shrink-0 text-accent/75\" />\n {wfType}\n <span\n role=\"button\"\n onClick={(e) => { e.stopPropagation(); remove(wfType); }}\n className=\"ml-0.5 hover:text-status-error transition-colors\"\n >\n <X className=\"w-2.5 h-2.5\" />\n </span>\n </span>\n ))}\n <ChevronDown className={`w-3.5 h-3.5 ml-auto shrink-0 text-text-tertiary transition-transform ${open ? 'rotate-180' : ''}`} />\n </button>\n\n {open && (\n <div className=\"absolute z-20 mt-1 w-full bg-white border border-surface-border rounded-md shadow-lg max-h-48 overflow-y-auto\">\n {options.length === 0 ? (\n <p className=\"px-3 py-2 text-xs text-text-tertiary\">No registered workflows</p>\n ) : (\n options.map((wfType) => {\n const isSelected = selected.includes(wfType);\n return (\n <button\n key={wfType}\n type=\"button\"\n onClick={() => toggle(wfType)}\n className={`flex items-center gap-2 w-full px-3 py-1.5 text-left text-xs font-mono transition-colors ${\n isSelected\n ? 'bg-accent/[0.06] text-accent'\n : 'text-text-primary hover:bg-surface-sunken'\n }`}\n >\n <Workflow className=\"w-3 h-3 shrink-0 text-accent/60\" />\n <span className=\"flex-1\">{wfType}</span>\n {isSelected && <Check className=\"w-3 h-3 shrink-0\" />}\n </button>\n );\n })\n )}\n </div>\n )}\n </div>\n );\n}\n","import { labelCls, hintCls, jsonCls, jsonValid } from './config-form-types';\nimport type { ConfigFormState } from './config-form-types';\nimport { RolePicker } from '../../../components/common/form/RolePicker';\nimport { WorkflowPicker } from '../../../components/common/form/WorkflowPicker';\nimport { BotPicker } from '../../../components/common/form/BotPicker';\nimport { useWorkflowConfigs } from '../../../api/workflows';\nimport { splitCsv } from '../../../lib/parse';\n\ninterface StepProps {\n form: ConfigFormState;\n set: (field: keyof ConfigFormState, value: string | boolean) => void;\n}\n\ninterface BasicsStepProps extends StepProps {\n editing: boolean;\n durableTypes?: string[];\n}\n\n// ── Helpers ────────────────────────────────────────────────────────────────────\n\nfunction csvToArray(csv: string): string[] {\n return splitCsv(csv);\n}\n\nfunction arrayToCsv(arr: string[]): string {\n return arr.join(', ');\n}\n\n// ── Step 1: Identity ────────────────────────────────────────────────────────\n\nexport function BasicsStep({ form, set, editing, durableTypes = [] }: BasicsStepProps) {\n const showPickList = !editing && durableTypes.length > 0;\n\n return (\n <div className=\"space-y-5\">\n <div>\n <label className={labelCls}>Workflow Type</label>\n {showPickList && !form.workflow_type ? (\n <div className=\"space-y-2\">\n <p className=\"text-xs text-text-secondary\">\n Select a durable workflow to register as certified:\n </p>\n <div className=\"grid gap-1\">\n {durableTypes.map((type) => (\n <button\n key={type}\n onClick={() => set('workflow_type', type)}\n className=\"flex items-center gap-2 px-3 py-2 text-left text-xs font-mono rounded-md border border-surface-border hover:border-accent/50 hover:bg-accent/[0.04] transition-colors\"\n >\n {type}\n </button>\n ))}\n </div>\n <div className=\"flex items-center gap-2 pt-1\">\n <span className=\"text-[10px] text-text-tertiary\">or</span>\n <input\n type=\"text\"\n onChange={(e) => set('workflow_type', e.target.value)}\n placeholder=\"Enter a workflow type manually\"\n className=\"input font-mono text-xs flex-1\"\n />\n </div>\n </div>\n ) : (\n <>\n <input\n type=\"text\"\n value={form.workflow_type}\n onChange={(e) => set('workflow_type', e.target.value)}\n disabled={editing}\n placeholder=\"reviewContent\"\n className=\"input font-mono text-xs w-full\"\n />\n {!editing && form.workflow_type && durableTypes.length > 0 && (\n <button\n onClick={() => set('workflow_type', '')}\n className=\"text-[10px] text-accent hover:underline mt-1\"\n >\n Choose from durable workflows\n </button>\n )}\n </>\n )}\n <p className={hintCls}>\n Registering a durable workflow makes it certified — the interceptor wraps every execution so failures escalate instead of throwing.\n </p>\n </div>\n\n <div>\n <label className={labelCls}>Description</label>\n <input\n type=\"text\"\n value={form.description}\n onChange={(e) => set('description', e.target.value)}\n placeholder=\"AI-powered content moderation with human escalation\"\n className=\"input text-xs w-full\"\n />\n </div>\n\n <div>\n <label className={labelCls}>Task Queue</label>\n <input\n type=\"text\"\n value={form.task_queue}\n onChange={(e) => set('task_queue', e.target.value)}\n placeholder=\"lt-review\"\n className=\"input font-mono text-xs w-full\"\n />\n <p className={hintCls}>\n Durable task queue this workflow listens on\n </p>\n </div>\n </div>\n );\n}\n\n// ── Step 2: Escalation ──────────────────────────────────────────────────────\n\nexport function AccessStep({ form, set }: StepProps) {\n const { data: configs } = useWorkflowConfigs();\n const consumesOptions = (configs ?? [])\n .map((c) => c.workflow_type)\n .filter((t) => t !== form.workflow_type);\n\n return (\n <div className=\"space-y-5\">\n <p className=\"text-xs text-text-secondary leading-relaxed\">\n Configure how escalations are routed and who can interact with this workflow.\n </p>\n\n <div>\n <label className={labelCls}>Default Escalation Role</label>\n <RolePicker\n selected={csvToArray(form.default_role)}\n onChange={(roles) => set('default_role', roles[0] ?? '')}\n single\n placeholder=\"Select escalation role...\"\n />\n <p className={hintCls}>\n When this workflow escalates, assign to users with this role\n </p>\n </div>\n\n <div>\n <label className={labelCls}>Escalation Roles</label>\n <RolePicker\n selected={csvToArray(form.roles)}\n onChange={(roles) => set('roles', arrayToCsv(roles))}\n placeholder=\"Select who can resolve escalations...\"\n />\n <p className={hintCls}>\n Users with any of these roles can claim and resolve escalations from this workflow.\n </p>\n </div>\n\n <div>\n <label className={labelCls}>Consumes</label>\n <WorkflowPicker\n options={consumesOptions}\n selected={csvToArray(form.consumes)}\n onChange={(workflows) => set('consumes', arrayToCsv(workflows))}\n placeholder=\"Select workflow dependencies...\"\n />\n <p className={hintCls}>\n Output from these upstream workflows will be injected into the input envelope for this workflow.\n </p>\n </div>\n </div>\n );\n}\n\n// ── Step 3: Invocation & Schemas ────────────────────────────────────────────\n\nexport function SchemasStep({ form, set }: StepProps) {\n return (\n <div className=\"space-y-5\">\n {/* Invocable toggle */}\n <div className=\"flex gap-6 pt-1\">\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={form.invocable}\n onChange={(e) => set('invocable', e.target.checked)}\n className=\"w-4 h-4 rounded border-border accent-accent\"\n />\n <span className=\"text-xs text-text-primary font-medium\">Invocable</span>\n </label>\n </div>\n <p className={hintCls}>\n Allow this workflow to be started from the dashboard or API.\n </p>\n\n {form.invocable && (\n <>\n {/* Run As */}\n <div>\n <label className={labelCls}>Run As</label>\n <BotPicker\n selected={form.execute_as}\n onChange={(botId) => set('execute_as', botId)}\n />\n <p className={hintCls}>\n Choose a bot to execute this workflow under its identity and credentials.\n Default runs as the invoking user.\n </p>\n </div>\n\n {/* Invocation roles */}\n <div>\n <label className={labelCls}>Invocation Roles</label>\n <RolePicker\n selected={csvToArray(form.invocation_roles)}\n onChange={(roles) => set('invocation_roles', arrayToCsv(roles))}\n placeholder=\"Select who can start this workflow...\"\n />\n <p className={hintCls}>\n Only users with these roles can start this workflow.\n Leave empty to allow all authenticated users.\n </p>\n </div>\n\n {/* Envelope schema */}\n <div>\n <label className={labelCls}>Envelope Schema</label>\n <textarea\n value={form.envelope_schema}\n onChange={(e) => set('envelope_schema', e.target.value)}\n placeholder={`{\\n \"data\": {\\n \"contentId\": \"example-123\",\\n \"content\": \"Text to review\"\\n },\\n \"metadata\": {\\n \"source\": \"dashboard\"\\n }\\n}`}\n className={jsonCls}\n rows={8}\n spellCheck={false}\n />\n <p className={hintCls}>\n Pre-fills the JSON editor when invoking this workflow.\n Should include <span className=\"font-mono\">data</span> (workflow input) and optional <span className=\"font-mono\">metadata</span> (context).\n </p>\n {form.envelope_schema.trim() && !jsonValid(form.envelope_schema) && (\n <p className=\"text-[10px] text-status-error mt-1\">Invalid JSON</p>\n )}\n </div>\n </>\n )}\n\n {!form.invocable && (\n <div className=\"py-4 px-4 bg-surface-sunken/50 rounded-md text-center\">\n <p className=\"text-xs text-text-tertiary\">\n Enable <span className=\"font-medium text-text-secondary\">Invocable</span> above to configure who can start this workflow and set an input template.\n </p>\n </div>\n )}\n\n {/* Resolver schema — always available */}\n <div>\n <label className={labelCls}>Resolver Schema</label>\n <textarea\n value={form.resolver_schema}\n onChange={(e) => set('resolver_schema', e.target.value)}\n placeholder={`{\\n \"approved\": true,\\n \"analysis\": {\\n \"confidence\": 0.95,\\n \"flags\": [],\\n \"summary\": \"Content meets guidelines\"\\n }\\n}`}\n className={jsonCls}\n rows={8}\n spellCheck={false}\n />\n <p className={hintCls}>\n The shape of data a human or AI provides when resolving an escalation from this workflow.\n Pre-fills the JSON editor in the escalation resolution form.\n </p>\n {form.resolver_schema.trim() && !jsonValid(form.resolver_schema) && (\n <p className=\"text-[10px] text-status-error mt-1\">Invalid JSON</p>\n )}\n </div>\n </div>\n );\n}\n","import { useState, useEffect, useCallback, useMemo } from 'react';\nimport { useParams, useNavigate, useSearchParams } from 'react-router-dom';\nimport { useWorkflowConfigs, useUpsertWorkflowConfig, useJobs } from '../../../api/workflows';\nimport { StepIndicator } from '../../../components/common/layout/StepIndicator';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { splitCsv } from '../../../lib/parse';\nimport { EMPTY_FORM, configToForm, STEP_LABELS, isStepValid } from './config-form-types';\nimport type { ConfigFormState } from './config-form-types';\nimport { BasicsStep, AccessStep, SchemasStep } from './ConfigWizardSteps';\n\nexport function WorkflowConfigDetailPage() {\n const { workflowType } = useParams<{ workflowType: string }>();\n const isNew = !workflowType;\n const navigate = useNavigate();\n const { data: configs, isLoading } = useWorkflowConfigs();\n const upsert = useUpsertWorkflowConfig();\n\n const editing = configs?.find((c) => c.workflow_type === workflowType) ?? null;\n\n // Fetch known workflow types from jobs to build the pick-list.\n // System workflows (triage, query, routing pipelines) are excluded —\n // they serve the discovery/compilation layer, not user-authored flows.\n const SYSTEM_WORKFLOWS = new Set([\n 'mcpQuery',\n 'mcpDeterministic',\n 'mcpQueryRouter',\n 'mcpTriage',\n 'mcpTriageRouter',\n 'mcpTriageDeterministic',\n 'insightQuery',\n ]);\n const { data: jobsData } = useJobs({ limit: 500 });\n const unregisteredTypes = useMemo(() => {\n const registeredSet = new Set((configs ?? []).map((c) => c.workflow_type));\n const allEntities = new Set((jobsData?.jobs ?? []).map((j) => j.entity));\n return [...allEntities]\n .filter((e) => !registeredSet.has(e) && !SYSTEM_WORKFLOWS.has(e))\n .sort();\n }, [configs, jobsData]);\n\n // Step via URL search param for browser history\n const [searchParams, setSearchParams] = useSearchParams();\n\n // Pre-fill from URL search params when creating new\n const prefillForm = useMemo((): ConfigFormState => {\n if (!isNew) return EMPTY_FORM;\n const prefillType = searchParams.get('workflow_type') ?? '';\n const prefillQueue = searchParams.get('task_queue') ?? '';\n if (!prefillType && !prefillQueue) return EMPTY_FORM;\n return { ...EMPTY_FORM, workflow_type: prefillType, task_queue: prefillQueue };\n }, [isNew, searchParams]);\n\n const [form, setForm] = useState<ConfigFormState>(prefillForm);\n const [schemaError, setSchemaError] = useState('');\n const [initialized, setInitialized] = useState(false);\n const step = parseInt(searchParams.get('step') || '1', 10);\n const setStep = useCallback((s: number) => {\n setSearchParams((prev) => {\n const next = new URLSearchParams(prev);\n next.set('step', String(s));\n return next;\n }, { replace: false });\n }, [setSearchParams]);\n\n\n useEffect(() => {\n if (initialized) return;\n if (isNew) {\n setForm(prefillForm);\n setInitialized(true);\n return;\n }\n if (editing) {\n setForm(configToForm(editing));\n setInitialized(true);\n }\n }, [editing, isNew, initialized, prefillForm]);\n\n const set = (field: keyof ConfigFormState, value: string | boolean) =>\n setForm((f) => ({ ...f, [field]: value }));\n\n // ── Save ────────────────────────────────────────────────────────────────\n\n const handleSave = () => {\n if (!form.workflow_type.trim()) return;\n setSchemaError('');\n\n let envelope_schema: Record<string, unknown> | null = null;\n let resolver_schema: Record<string, unknown> | null = null;\n\n try {\n if (form.envelope_schema.trim()) envelope_schema = JSON.parse(form.envelope_schema);\n } catch {\n setSchemaError('Invalid JSON in Envelope Schema');\n return;\n }\n try {\n if (form.resolver_schema.trim()) resolver_schema = JSON.parse(form.resolver_schema);\n } catch {\n setSchemaError('Invalid JSON in Resolver Schema');\n return;\n }\n\n upsert.mutate(\n {\n workflow_type: form.workflow_type.trim(),\n description: form.description.trim() || null,\n task_queue: form.task_queue.trim() || null,\n default_role: form.default_role.trim() || 'reviewer',\n invocable: form.invocable,\n roles: splitCsv(form.roles),\n invocation_roles: splitCsv(form.invocation_roles),\n consumes: splitCsv(form.consumes),\n envelope_schema,\n resolver_schema,\n cron_schedule: form.cron_schedule.trim() || null,\n execute_as: form.execute_as.trim() || null,\n },\n {\n onSuccess: () => {\n navigate('/workflows/registry');\n },\n },\n );\n };\n\n // ── Loading / Not found ──────────────────────────────────────────────────\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 (!isNew && !editing) {\n return <p className=\"text-sm text-text-secondary\">Config not found.</p>;\n }\n\n // ── Render ──────────────────────────────────────────────────────────────\n\n const isLast = step === STEP_LABELS.length;\n return (\n <div>\n <PageHeader title={isNew ? 'Register Workflow' : editing?.workflow_type ?? ''} />\n\n <div className=\"max-w-3xl\">\n <StepIndicator steps={STEP_LABELS} currentStep={step - 1} onStepClick={(i) => setStep(i + 1)} />\n\n <div className=\"min-h-[360px] py-2\">\n {step === 1 && <BasicsStep form={form} set={set} editing={!!editing} durableTypes={unregisteredTypes} />}\n {step === 2 && <AccessStep form={form} set={set} />}\n {step === 3 && <SchemasStep form={form} set={set} />}\n </div>\n\n {(schemaError || upsert.error) && (\n <p className=\"text-xs text-status-error mt-4\">\n {schemaError || (upsert.error as Error).message}\n </p>\n )}\n\n {/* Navigation */}\n <div className=\"flex justify-between items-center pt-4 border-t border-surface-border mt-4\">\n <div>\n {step > 1 && (\n <button\n onClick={() => setStep(step - 1)}\n className=\"btn-secondary text-xs\"\n >\n Back\n </button>\n )}\n </div>\n <div className=\"flex gap-3\">\n <button onClick={() => navigate('/workflows/registry')} className=\"btn-ghost text-xs\">\n Cancel\n </button>\n {isLast ? (\n <button\n onClick={handleSave}\n disabled={!isStepValid(step, form) || upsert.isPending}\n className=\"btn-primary text-xs\"\n >\n {upsert.isPending ? 'Saving...' : editing ? 'Save' : 'Create'}\n </button>\n ) : (\n <button\n onClick={() => setStep(step + 1)}\n disabled={!isStepValid(step, form)}\n className=\"btn-primary text-xs\"\n >\n Next\n </button>\n )}\n </div>\n </div>\n\n </div>\n </div>\n );\n}\n"],"names":["matchesSearch","wf","search","q","WorkflowConfigsPage","navigate","useNavigate","data","isLoading","useDiscoveredWorkflows","deleteConfig","useDeleteWorkflowConfig","filters","setFilter","useFilterParams","searchInput","setSearchInput","useState","confirmDelete","setConfirmDelete","useEffect","timer","allWorkflows","queues","useMemo","w","roles","workflows","result","columns","row","jsxs","jsx","WorkflowPill","TaskQueuePill","ShieldCheck","r","RolePill","RowActionGroup","RowAction","ShieldOff","ShieldPlus","handleDelete","handleRowClick","PageHeader","FilterBar","e","FilterSelect","v","DataTable","ConfirmDeleteModal","Fragment","StepIndicator","steps","currentStep","onStepClick","label","i","done","active","clickable","splitCsv","s","EMPTY_FORM","configToForm","c","STEP_LABELS","jsonValid","isStepValid","step","form","labelCls","hintCls","jsonCls","RolePicker","selected","onChange","single","placeholder","useRoles","allRoles","open","setOpen","ref","useRef","handler","toggle","role","remove","placeholderText","User","X","ChevronDown","isSelected","Check","WorkflowPicker","options","wfType","t","Workflow","csvToArray","csv","arrayToCsv","arr","BasicsStep","set","editing","durableTypes","showPickList","type","AccessStep","configs","useWorkflowConfigs","consumesOptions","SchemasStep","BotPicker","botId","WorkflowConfigDetailPage","workflowType","useParams","isNew","upsert","useUpsertWorkflowConfig","SYSTEM_WORKFLOWS","jobsData","useJobs","unregisteredTypes","registeredSet","j","searchParams","setSearchParams","useSearchParams","prefillForm","prefillType","prefillQueue","setForm","schemaError","setSchemaError","initialized","setInitialized","setStep","useCallback","prev","next","field","value","f","handleSave","envelope_schema","resolver_schema","isLast"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as p,j as e}from"./vendor-query-B2UbickB.js";import{a as A,b as q,c as U,d as B,u as G,e as W,f as H,g as K}from"./mcp-blCW6IL7.js";import{E as V}from"./EmptyState-2CmV-IaS.js";import{C as Y}from"./ConfirmDeleteModal-FSXyKjaB.js";import{P as T}from"./PageHeader-CpWFly5S.js";import{F as Q,a as X,b as M}from"./FilterBar-Ck4K4rzu.js";import{S as Z}from"./StickyPagination-F9FZsRy9.js";import{u as ee}from"./useFilterParams-BaXUAkYK.js";import{M as z}from"./Modal-B4rbIVAn.js";import{J as te}from"./index-D8VH6K8B.js";import{o as E,K as se,t as re,P as I,u as ne,D as ae,G as oe,l as ie,H as le}from"./vendor-icons-ZTAKVwGc.js";import{L as F}from"./vendor-react-Cw8Gy8NJ.js";import{R as ce,a as k}from"./RowActions-Dg-Fsm5O.js";import{S as de}from"./StatusBadge-TlC4jiig.js";const L={name:"",description:"",transport_type:"stdio",transport_config:"{}",auto_connect:!1};function D(t){return{name:t.name,description:t.description??"",transport_type:t.transport_type,transport_config:JSON.stringify(t.transport_config,null,2),auto_connect:t.auto_connect}}function xe({open:t,onClose:n,editing:s}){const l=A(),o=q(),[r,m]=p.useState(s?D(s):L),[g,h]=p.useState(""),[x,v]=p.useState(s);s!==x&&(v(s),m(s?D(s):L),h(""));const d=()=>{h("");let c;try{c=JSON.parse(r.transport_config)}catch{h("Invalid JSON in transport config");return}if(s)o.mutate({id:s.id,name:r.name.trim(),description:r.description.trim()||void 0,transport_type:r.transport_type,transport_config:c,auto_connect:r.auto_connect},{onSuccess:n});else{if(!r.name.trim())return;l.mutate({name:r.name.trim(),description:r.description.trim()||void 0,transport_type:r.transport_type,transport_config:c,auto_connect:r.auto_connect},{onSuccess:n})}},i=l.isPending||o.isPending,j=l.error||o.error,b=(c,y)=>m(w=>({...w,[c]:y}));return e.jsx(z,{open:t,onClose:n,title:s?`Edit — ${s.name}`:"Register MCP Server",children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Name"}),e.jsx("input",{type:"text",value:r.name,onChange:c=>b("name",c.target.value),placeholder:"e.g., vision-server",className:"input text-xs w-full"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Description"}),e.jsx("input",{type:"text",value:r.description,onChange:c=>b("description",c.target.value),placeholder:"Optional description",className:"input text-xs w-full"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Transport Type"}),e.jsxs("select",{value:r.transport_type,onChange:c=>b("transport_type",c.target.value),className:"select text-xs w-full",children:[e.jsx("option",{value:"stdio",children:"stdio"}),e.jsx("option",{value:"sse",children:"sse"})]})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Transport Config (JSON)"}),e.jsx("textarea",{value:r.transport_config,onChange:c=>b("transport_config",c.target.value),className:"input font-mono text-xs w-full",rows:6,spellCheck:!1}),g&&e.jsx("p",{className:"text-xs text-status-error mt-1",children:g})]}),e.jsxs("label",{className:"flex items-center gap-2 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:r.auto_connect,onChange:c=>b("auto_connect",c.target.checked),className:"w-4 h-4 rounded border-border accent-accent"}),e.jsx("span",{className:"text-xs text-text-primary",children:"Auto-connect on startup"})]}),j&&e.jsx("p",{className:"text-xs text-status-error",children:j.message}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsx("button",{onClick:n,className:"btn-secondary text-xs",children:"Cancel"}),e.jsx("button",{onClick:d,disabled:!r.name.trim()||i,className:"btn-primary text-xs",children:i?"Saving...":s?"Save":"Register"})]})]})})}function ue(t){if(!(t!=null&&t.properties))return{};const n={};for(const[s,l]of Object.entries(t.properties)){const o=l;o.default!==void 0?n[s]=o.default:o.type==="string"?n[s]="":o.type==="number"||o.type==="integer"?n[s]=0:o.type==="boolean"?n[s]=!1:o.type==="object"?n[s]={}:o.type==="array"?n[s]=[]:n[s]=null}return n}function pe({open:t,onClose:n,serverId:s,serverName:l,tool:o}){const r=U(),[m,g]=p.useState(JSON.stringify(ue(o.inputSchema),null,2)),[h,x]=p.useState(""),v=!!r.data||!!r.error,d=()=>{x(""),r.reset();let i;try{i=JSON.parse(m)}catch{x("Invalid JSON");return}r.mutate({serverId:s,toolName:o.name,arguments:i})};return e.jsx(z,{open:t,onClose:n,title:`${l} / ${o.name}`,maxWidth:"max-w-2xl",children:e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsx("p",{className:"text-xs text-text-secondary",children:o.description}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Request"}),e.jsx("textarea",{value:m,onChange:i=>g(i.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}),h&&e.jsx("p",{className:"text-xs text-status-error mt-1",children:h})]}),r.isPending&&e.jsxs("div",{className:"animate-pulse",children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Response"}),e.jsx("div",{className:"h-20 bg-surface-sunken rounded-md"})]}),r.data?e.jsxs("div",{className:"space-y-2",children:[e.jsx(te,{data:r.data,label:"Response"}),(()=>{var c;const i=(c=r.data)==null?void 0:c.result,j=i==null?void 0:i.job_id,b=(i==null?void 0:i.namespace)||"longtail";return j?e.jsxs(F,{to:`/mcp/executions/${encodeURIComponent(j)}?namespace=${encodeURIComponent(b)}`,className:"inline-flex items-center gap-1.5 text-xs text-accent hover:underline",children:[e.jsx(E,{size:12}),"View Execution Details"]}):null})()]}):null,r.error?e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Response"}),(()=>{const i=r.error instanceof Error?r.error.message:"";return i.startsWith("No credential found for provider")?e.jsxs("div",{className:"bg-status-warning/10 border border-status-warning/30 rounded-md px-4 py-3 flex items-start gap-3",children:[e.jsx(se,{size:16,className:"text-status-warning mt-0.5 shrink-0"}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-medium text-text-primary mb-1",children:"Credential required"}),e.jsx("p",{className:"text-xs text-text-secondary mb-2",children:i}),e.jsxs(F,{to:"/credentials",className:"text-xs text-accent hover:underline inline-flex items-center gap-1",children:["Go to Credentials",e.jsx(E,{size:10})]})]})]}):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:i||"Tool call failed"})})})()]}):null,e.jsxs("div",{className:"flex justify-end gap-3 pt-2 border-t border-surface-border",children:[e.jsx("button",{onClick:n,className:"btn-ghost text-xs",children:"Close"}),e.jsx("button",{onClick:d,disabled:r.isPending,className:"btn-primary text-xs disabled:opacity-50 inline-flex items-center gap-1.5",children:r.isPending?"Running...":v?e.jsxs(e.Fragment,{children:[e.jsx(re,{size:12})," Re-run"]}):e.jsxs(e.Fragment,{children:[e.jsx(I,{size:12})," Run"]})})]})]})})}function me(t){var n,s;return!!((n=t.metadata)!=null&&n.builtin)||!!((s=t.transport_config)!=null&&s.builtin)}function fe(t,n){var o;if(!n)return!0;const s=n.toLowerCase();return t.name.toLowerCase().includes(s)||(o=t.description)!=null&&o.toLowerCase().includes(s)||(t.tags??[]).some(r=>r.toLowerCase().includes(s))?!0:(t.tool_manifest??[]).some(r=>{var m;return r.name.toLowerCase().includes(s)||((m=r.description)==null?void 0:m.toLowerCase().includes(s))})}function he(t,n){if(!n)return t;const s=n.toLowerCase();return t.filter(l=>{var o;return l.name.toLowerCase().includes(s)||((o=l.description)==null?void 0:o.toLowerCase().includes(s))})}function ge({serverId:t,credentialProviders:n}){const{data:s}=B(t);if(n.length===0||!s)return null;const l=s.missing.length===0;return e.jsx("span",{className:`inline-block w-2 h-2 rounded-full shrink-0 ${l?"bg-status-success":"bg-status-warning"}`,title:l?"All credentials registered":`Missing: ${s.missing.join(", ")}`})}function je({server:t,expanded:n,onToggle:s,onEdit:l,onDelete:o,onTryTool:r,connect:m,disconnect:g,visibleTools:h}){const x=t.tool_manifest??[],v=me(t);return e.jsxs(e.Fragment,{children:[e.jsxs("tr",{onClick:x.length>0?s:void 0,className:`group/row border-b transition-colors duration-100 ${x.length>0?"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 ${n?"rotate-90":""} ${x.length===0?"opacity-0":"text-text-tertiary"}`,children:e.jsx(ne,{size:14})}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("p",{className:"text-sm text-text-primary font-medium",children:t.name}),(t.tags??[]).length>0&&e.jsx("div",{className:"flex flex-wrap gap-1 mt-0.5",children:t.tags.map(d=>e.jsx("span",{className:"inline-block px-1.5 py-0 text-[9px] font-medium text-text-tertiary bg-surface-sunken rounded",children:d},d))})]})]})}),e.jsx("td",{className:"px-6 py-3.5 w-28",children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(de,{status:t.status}),e.jsx(ge,{serverId:t.id,credentialProviders:t.credential_providers??[]})]})}),e.jsx("td",{className:"px-6 py-3.5 w-28",children:v?null:e.jsxs(ce,{children:[t.status==="connected"?e.jsx(k,{icon:ae,title:"Disconnect server",onClick:()=>g.mutate(t.id)}):e.jsx(k,{icon:oe,title:"Connect server",onClick:()=>m.mutate(t.id),colorClass:"text-text-tertiary hover:text-status-success"}),e.jsx(k,{icon:ie,title:"Edit server",onClick:l}),e.jsx(k,{icon:le,title:"Delete server",onClick:o,colorClass:"text-text-tertiary hover:text-status-error"})]})}),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:x.length})})]}),h.length>0&&e.jsx("tr",{children:e.jsx("td",{colSpan:4,className:"p-0 border-0",children:e.jsx("div",{className:"grid transition-[grid-template-rows] duration-200 ease-in-out",style:{gridTemplateRows:n?"1fr":"0fr"},children:e.jsxs("div",{className:"overflow-hidden",children:[h.map(d=>e.jsxs("div",{onClick:()=>r(d),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",children:d.name}),d.description&&e.jsx("p",{className:"text-[10px] text-text-tertiary mt-0.5 line-clamp-1",children:d.description})]}),e.jsx("div",{className:"w-28 px-6 py-2 shrink-0"}),e.jsx("div",{className:"w-28 px-6 py-2 flex justify-end shrink-0",children:e.jsx("button",{onClick:i=>{i.stopPropagation(),r(d)},className:"opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-accent",title:"Try tool",children:e.jsx(I,{className:"w-[18px] h-[18px]",strokeWidth:1.5})})})]},d.name)),e.jsx("div",{className:"h-1 bg-surface-sunken/20"})]})})})})]})}function Fe(){const{filters:t,setFilter:n,pagination:s}=ee({filters:{status:"",search:"",tag:""}}),{data:l,isLoading:o}=G({status:t.status||void 0,search:t.search||void 0,tags:t.tag||void 0}),r=W(),m=H(),g=K(),[h,x]=p.useState(!1),[v,d]=p.useState(null),[i,j]=p.useState(null),[b,c]=p.useState(new Set),[y,w]=p.useState(null),N=(l==null?void 0:l.servers)??[],P=(l==null?void 0:l.total)??0,J=p.useMemo(()=>{const a=new Set;for(const u of N)for(const f of u.tags??[])a.add(f);return[...a].sort().map(u=>({value:u,label:u}))},[N]),S=p.useMemo(()=>t.search?N.filter(a=>fe(a,t.search)):N,[N,t.search]);p.useEffect(()=>{if(!t.search)return;const a=t.search.toLowerCase(),u=S.filter(f=>(f.tool_manifest??[]).some(C=>{var R;return C.name.toLowerCase().includes(a)||((R=C.description)==null?void 0:R.toLowerCase().includes(a))})).map(f=>f.id);u.length>0&&c(f=>{const _=new Set(f);for(const C of u)_.add(C);return _})},[t.search,S]);const O=a=>{c(u=>{const f=new Set(u);return f.has(a)?f.delete(a):f.add(a),f})},$=()=>{i&&g.mutate(i.id,{onSuccess:()=>j(null)})};return o?e.jsxs("div",{children:[e.jsx(T,{title:"MCP Server Tools"}),e.jsx("div",{className:"animate-pulse space-y-0",children:Array.from({length:5}).map((a,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(T,{title:"MCP Server Tools",actions:e.jsx("button",{onClick:()=>{d(null),x(!0)},className:"btn-primary text-xs",children:"Register Server"})}),e.jsx("p",{className:"text-sm text-text-secondary mb-6 max-w-2xl leading-relaxed",children:"Registered MCP servers and their available tools. Each server exposes tools that can be used by the Pipeline Designer."}),e.jsxs(Q,{children:[e.jsx(X,{label:"Search",value:t.search,onChange:a=>n("search",a),placeholder:"Server or tool name..."}),e.jsx(M,{label:"Tag",value:t.tag,onChange:a=>n("tag",a),options:J}),e.jsx(M,{label:"Status",value:t.status,onChange:a=>n("status",a),options:[{value:"registered",label:"Registered"},{value:"connected",label:"Connected"},{value:"error",label:"Error"},{value:"disconnected",label:"Disconnected"}]})]}),S.length===0?e.jsx(V,{title:"No servers found"}):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 px-6 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary w-28"}),e.jsx("th",{className:"sticky top-[2.75rem] z-10 bg-surface w-12"})]})}),e.jsx("tbody",{children:S.map(a=>e.jsx(je,{server:a,expanded:b.has(a.id),onToggle:()=>O(a.id),onEdit:()=>{d(a),x(!0)},onDelete:()=>j(a),onTryTool:u=>w({serverId:a.id,serverName:a.name,tool:u}),connect:r,disconnect:m,visibleTools:he(a.tool_manifest??[],t.search)},a.id))})]}),e.jsx(Z,{page:s.page,totalPages:s.totalPages(P),onPageChange:s.setPage,total:P,pageSize:s.pageSize,onPageSizeChange:s.setPageSize}),e.jsx(xe,{open:h,onClose:()=>{x(!1),d(null)},editing:v}),e.jsx(Y,{open:!!i,onClose:()=>j(null),onConfirm:$,title:"Delete MCP Server",description:e.jsxs(e.Fragment,{children:["Delete"," ",e.jsx("span",{className:"font-medium text-text-primary",children:i==null?void 0:i.name}),"? This will remove the server registration."]}),isPending:g.isPending,error:g.error}),y&&e.jsx(pe,{open:!!y,onClose:()=>w(null),serverId:y.serverId,serverName:y.serverName,tool:y.tool})]})}export{Fe as McpServersPage};
|
|
2
|
+
//# sourceMappingURL=index-rjmgHlSH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-rjmgHlSH.js","sources":["../../src/pages/mcp/servers/ServerFormModal.tsx","../../src/pages/mcp/TryToolModal.tsx","../../src/pages/mcp/servers/helpers.ts","../../src/pages/mcp/servers/ServerRow.tsx","../../src/pages/mcp/servers/McpServersPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useCreateMcpServer, useUpdateMcpServer } from '../../../api/mcp';\nimport { Modal } from '../../../components/common/modal/Modal';\nimport type { McpServerRecord } from '../../../api/types';\n\n// ── Server Form Modal ─────────────────────────────────────────────────────────\n\ninterface ServerFormState {\n name: string;\n description: string;\n transport_type: string;\n transport_config: string;\n auto_connect: boolean;\n}\n\nconst EMPTY_FORM: ServerFormState = {\n name: '',\n description: '',\n transport_type: 'stdio',\n transport_config: '{}',\n auto_connect: false,\n};\n\nfunction serverToForm(s: McpServerRecord): ServerFormState {\n return {\n name: s.name,\n description: s.description ?? '',\n transport_type: s.transport_type,\n transport_config: JSON.stringify(s.transport_config, null, 2),\n auto_connect: s.auto_connect,\n };\n}\n\nexport function ServerFormModal({\n open,\n onClose,\n editing,\n}: {\n open: boolean;\n onClose: () => void;\n editing: McpServerRecord | null;\n}) {\n const createServer = useCreateMcpServer();\n const updateServer = useUpdateMcpServer();\n const [form, setForm] = useState<ServerFormState>(\n editing ? serverToForm(editing) : EMPTY_FORM,\n );\n const [jsonError, setJsonError] = useState('');\n\n const [prevEditing, setPrevEditing] = useState(editing);\n if (editing !== prevEditing) {\n setPrevEditing(editing);\n setForm(editing ? serverToForm(editing) : EMPTY_FORM);\n setJsonError('');\n }\n\n const handleSave = () => {\n setJsonError('');\n let config: Record<string, unknown>;\n try {\n config = JSON.parse(form.transport_config);\n } catch {\n setJsonError('Invalid JSON in transport config');\n return;\n }\n\n if (editing) {\n updateServer.mutate(\n {\n id: editing.id,\n name: form.name.trim(),\n description: form.description.trim() || undefined,\n transport_type: form.transport_type,\n transport_config: config,\n auto_connect: form.auto_connect,\n },\n { onSuccess: onClose },\n );\n } else {\n if (!form.name.trim()) return;\n createServer.mutate(\n {\n name: form.name.trim(),\n description: form.description.trim() || undefined,\n transport_type: form.transport_type,\n transport_config: config,\n auto_connect: form.auto_connect,\n },\n { onSuccess: onClose },\n );\n }\n };\n\n const isPending = createServer.isPending || updateServer.isPending;\n const error = createServer.error || updateServer.error;\n\n const set = (field: keyof ServerFormState, value: string | boolean) =>\n setForm((f) => ({ ...f, [field]: value }));\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n title={editing ? `Edit — ${editing.name}` : 'Register MCP Server'}\n >\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Name\n </label>\n <input\n type=\"text\"\n value={form.name}\n onChange={(e) => set('name', e.target.value)}\n placeholder=\"e.g., vision-server\"\n className=\"input text-xs w-full\"\n />\n </div>\n\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Description\n </label>\n <input\n type=\"text\"\n value={form.description}\n onChange={(e) => set('description', e.target.value)}\n placeholder=\"Optional description\"\n className=\"input text-xs w-full\"\n />\n </div>\n\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Transport Type\n </label>\n <select\n value={form.transport_type}\n onChange={(e) => set('transport_type', e.target.value)}\n className=\"select text-xs w-full\"\n >\n <option value=\"stdio\">stdio</option>\n <option value=\"sse\">sse</option>\n </select>\n </div>\n\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Transport Config (JSON)\n </label>\n <textarea\n value={form.transport_config}\n onChange={(e) => set('transport_config', e.target.value)}\n className=\"input font-mono text-xs w-full\"\n rows={6}\n spellCheck={false}\n />\n {jsonError && <p className=\"text-xs text-status-error mt-1\">{jsonError}</p>}\n </div>\n\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={form.auto_connect}\n onChange={(e) => set('auto_connect', e.target.checked)}\n className=\"w-4 h-4 rounded border-border accent-accent\"\n />\n <span className=\"text-xs text-text-primary\">Auto-connect on startup</span>\n </label>\n\n {error && (\n <p className=\"text-xs text-status-error\">{(error as Error).message}</p>\n )}\n\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={onClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={handleSave}\n disabled={!form.name.trim() || isPending}\n className=\"btn-primary text-xs\"\n >\n {isPending ? 'Saving...' : editing ? 'Save' : 'Register'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import { useState } from 'react';\nimport { Link } from 'react-router-dom';\nimport { RotateCcw, Play, ExternalLink, KeyRound } from 'lucide-react';\nimport { useCallMcpTool } from '../../api/mcp';\nimport { Modal } from '../../components/common/modal/Modal';\nimport { JsonViewer } from '../../components/common/data/JsonViewer';\nimport type { McpToolManifest } from '../../api/types';\n\ninterface TryToolModalProps {\n open: boolean;\n onClose: () => void;\n serverId: string;\n serverName: string;\n tool: McpToolManifest;\n}\n\nfunction 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 TryToolModal({ open, onClose, serverId, serverName, tool }: TryToolModalProps) {\n const callTool = useCallMcpTool();\n const [argsJson, setArgsJson] = useState(\n JSON.stringify(buildSkeleton(tool.inputSchema), null, 2),\n );\n const [jsonError, setJsonError] = useState('');\n\n const hasResult = !!callTool.data || !!callTool.error;\n\n const handleRun = () => {\n setJsonError('');\n callTool.reset();\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(argsJson);\n } catch {\n setJsonError('Invalid JSON');\n return;\n }\n callTool.mutate({ serverId, toolName: tool.name, arguments: parsed });\n };\n\n return (\n <Modal open={open} onClose={onClose} title={`${serverName} / ${tool.name}`} maxWidth=\"max-w-2xl\">\n <div className=\"flex flex-col gap-4\">\n {/* Tool description */}\n <p className=\"text-xs text-text-secondary\">{tool.description}</p>\n\n {/* Request */}\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Request\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 {/* Response */}\n {callTool.isPending && (\n <div className=\"animate-pulse\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">Response</p>\n <div className=\"h-20 bg-surface-sunken rounded-md\" />\n </div>\n )}\n {callTool.data ? (\n <div className=\"space-y-2\">\n <JsonViewer data={callTool.data as Record<string, unknown>} label=\"Response\" />\n {(() => {\n const res = (callTool.data as any)?.result;\n const jobId = res?.job_id;\n const ns = res?.namespace || 'longtail';\n return jobId ? (\n <Link\n to={`/mcp/executions/${encodeURIComponent(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 ) : null;\n })()}\n </div>\n ) : null}\n {callTool.error ? (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">Response</p>\n {(() => {\n const msg = callTool.error instanceof Error ? callTool.error.message : '';\n const isMissingCred = msg.startsWith('No credential found for provider');\n if (isMissingCred) {\n return (\n <div className=\"bg-status-warning/10 border border-status-warning/30 rounded-md px-4 py-3 flex items-start gap-3\">\n <KeyRound size={16} className=\"text-status-warning mt-0.5 shrink-0\" />\n <div>\n <p className=\"text-sm font-medium text-text-primary mb-1\">Credential required</p>\n <p className=\"text-xs text-text-secondary mb-2\">{msg}</p>\n <Link\n to=\"/credentials\"\n className=\"text-xs text-accent hover:underline inline-flex items-center gap-1\"\n >\n Go to Credentials\n <ExternalLink size={10} />\n </Link>\n </div>\n </div>\n );\n }\n return (\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\">{msg || 'Tool call failed'}</p>\n </div>\n );\n })()}\n </div>\n ) : null}\n\n {/* Actions — pinned at bottom */}\n <div className=\"flex justify-end gap-3 pt-2 border-t border-surface-border\">\n <button\n onClick={onClose}\n className=\"btn-ghost text-xs\"\n >\n Close\n </button>\n <button\n onClick={handleRun}\n disabled={callTool.isPending}\n className=\"btn-primary text-xs disabled:opacity-50 inline-flex items-center gap-1.5\"\n >\n {callTool.isPending ? (\n 'Running...'\n ) : hasResult ? (\n <><RotateCcw size={12} /> Re-run</>\n ) : (\n <><Play size={12} /> Run</>\n )}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import type { McpServerRecord, McpToolManifest } from '../../../api/types';\n\nexport function isBuiltIn(row: McpServerRecord): boolean {\n return !!(row.metadata as Record<string, unknown> | null)?.builtin\n || !!(row.transport_config as Record<string, unknown> | null)?.builtin;\n}\n\n/** Check if a server or any of its tools match the search term */\nexport function matchesSearch(server: McpServerRecord, search: string): boolean {\n if (!search) return true;\n const q = search.toLowerCase();\n if (server.name.toLowerCase().includes(q)) return true;\n if (server.description?.toLowerCase().includes(q)) return true;\n if ((server.tags ?? []).some((t) => t.toLowerCase().includes(q))) return true;\n const tools = (server.tool_manifest ?? []) as McpToolManifest[];\n return tools.some(\n (t) => t.name.toLowerCase().includes(q) || t.description?.toLowerCase().includes(q),\n );\n}\n\n/** Filter tools within a server that match the search term */\nexport function filterTools(tools: McpToolManifest[], search: string): McpToolManifest[] {\n if (!search) return tools;\n const q = search.toLowerCase();\n return tools.filter(\n (t) => t.name.toLowerCase().includes(q) || t.description?.toLowerCase().includes(q),\n );\n}\n","import { ChevronRight, Pencil, Trash2, Plug, Unplug, Play } from 'lucide-react';\nimport { RowAction, RowActionGroup } from '../../../components/common/layout/RowActions';\nimport {\n useConnectMcpServer,\n useDisconnectMcpServer,\n useCredentialStatus,\n} from '../../../api/mcp';\nimport { StatusBadge } from '../../../components/common/display/StatusBadge';\n\nimport type { McpServerRecord, McpToolManifest } from '../../../api/types';\nimport { isBuiltIn } from './helpers';\n\nfunction CredentialDot({ serverId, credentialProviders }: { serverId: string; credentialProviders: string[] }) {\n const { data } = useCredentialStatus(serverId);\n if (credentialProviders.length === 0) return null;\n if (!data) return null;\n const ok = data.missing.length === 0;\n return (\n <span\n className={`inline-block w-2 h-2 rounded-full shrink-0 ${ok ? 'bg-status-success' : 'bg-status-warning'}`}\n title={ok ? 'All credentials registered' : `Missing: ${data.missing.join(', ')}`}\n />\n );\n}\n\nexport function ServerRow({\n server,\n expanded,\n onToggle,\n onEdit,\n onDelete,\n onTryTool,\n connect,\n disconnect,\n visibleTools,\n}: {\n server: McpServerRecord;\n expanded: boolean;\n onToggle: () => void;\n onEdit: () => void;\n onDelete: () => void;\n onTryTool: (tool: McpToolManifest) => void;\n connect: ReturnType<typeof useConnectMcpServer>;\n disconnect: ReturnType<typeof useDisconnectMcpServer>;\n visibleTools: McpToolManifest[];\n}) {\n const allTools = (server.tool_manifest ?? []) as McpToolManifest[];\n const builtin = isBuiltIn(server);\n\n return (\n <>\n {/* Server header row */}\n <tr\n onClick={allTools.length > 0 ? onToggle : undefined}\n className={`group/row border-b transition-colors duration-100 ${\n allTools.length > 0 ? 'cursor-pointer row-hover' : ''\n }`}\n >\n {/* Name + tags */}\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' : ''} ${allTools.length === 0 ? 'opacity-0' : 'text-text-tertiary'}`}>\n <ChevronRight size={14} />\n </span>\n <div className=\"min-w-0\">\n <p className=\"text-sm text-text-primary font-medium\">{server.name}</p>\n {(server.tags ?? []).length > 0 && (\n <div className=\"flex flex-wrap gap-1 mt-0.5\">\n {server.tags.map((tag) => (\n <span\n key={tag}\n className=\"inline-block px-1.5 py-0 text-[9px] font-medium text-text-tertiary bg-surface-sunken rounded\"\n >\n {tag}\n </span>\n ))}\n </div>\n )}\n </div>\n </div>\n </td>\n\n {/* Status */}\n <td className=\"px-6 py-3.5 w-28\">\n <div className=\"flex items-center gap-2\">\n <StatusBadge status={server.status} />\n <CredentialDot serverId={server.id} credentialProviders={server.credential_providers ?? []} />\n </div>\n </td>\n\n {/* Actions */}\n <td className=\"px-6 py-3.5 w-28\">\n {builtin ? null : (\n <RowActionGroup>\n {server.status === 'connected' ? (\n <RowAction\n icon={Unplug}\n title=\"Disconnect server\"\n onClick={() => disconnect.mutate(server.id)}\n />\n ) : (\n <RowAction\n icon={Plug}\n title=\"Connect server\"\n onClick={() => connect.mutate(server.id)}\n colorClass=\"text-text-tertiary hover:text-status-success\"\n />\n )}\n <RowAction\n icon={Pencil}\n title=\"Edit server\"\n onClick={onEdit}\n />\n <RowAction\n icon={Trash2}\n title=\"Delete server\"\n onClick={onDelete}\n colorClass=\"text-text-tertiary hover:text-status-error\"\n />\n </RowActionGroup>\n )}\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 {allTools.length}\n </span>\n </td>\n </tr>\n\n {/* Expanded tool rows — description below name, aligned to outer columns */}\n {visibleTools.length > 0 && (\n <tr>\n <td colSpan={4} 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((tool) => (\n <div\n key={tool.name}\n onClick={() => onTryTool(tool)}\n className=\"group/row flex items-center cursor-pointer hover:bg-surface-hover/50 transition-colors border-b border-surface-border/30\"\n >\n {/* Tool name + description below */}\n <div className=\"flex-1 pl-14 pr-6 py-2 min-w-0\">\n <code className=\"text-xs font-mono text-accent-primary\">{tool.name}</code>\n {tool.description && (\n <p className=\"text-[10px] text-text-tertiary mt-0.5 line-clamp-1\">{tool.description}</p>\n )}\n </div>\n {/* Status — empty for tools */}\n <div className=\"w-28 px-6 py-2 shrink-0\" />\n {/* Try — hover-reveal icon */}\n <div className=\"w-28 px-6 py-2 flex justify-end shrink-0\">\n <button\n onClick={(e) => { e.stopPropagation(); onTryTool(tool); }}\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 </div>\n </div>\n ))}\n <div className=\"h-1 bg-surface-sunken/20\" />\n </div>\n </div>\n </td>\n </tr>\n )}\n </>\n );\n}\n","import { useState, useMemo, useEffect } from 'react';\nimport {\n useMcpServers,\n useConnectMcpServer,\n useDisconnectMcpServer,\n useDeleteMcpServer,\n} from '../../../api/mcp';\nimport { EmptyState } from '../../../components/common/display/EmptyState';\nimport { ConfirmDeleteModal } from '../../../components/common/modal/ConfirmDeleteModal';\nimport type { McpServerRecord, McpToolManifest } from '../../../api/types';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { FilterBar, FilterSelect, FilterInput } from '../../../components/common/data/FilterBar';\nimport { StickyPagination } from '../../../components/common/data/StickyPagination';\nimport { useFilterParams } from '../../../hooks/useFilterParams';\nimport { ServerFormModal } from './ServerFormModal';\nimport { TryToolModal } from '../../mcp/TryToolModal';\nimport { matchesSearch, filterTools } from './helpers';\nimport { ServerRow } from './ServerRow';\n\nexport function McpServersPage() {\n const { filters, setFilter, pagination } = useFilterParams({\n filters: { status: '', search: '', tag: '' },\n });\n\n const { data, isLoading } = useMcpServers({\n status: filters.status || undefined,\n search: filters.search || undefined,\n tags: filters.tag || undefined,\n });\n const connect = useConnectMcpServer();\n const disconnect = useDisconnectMcpServer();\n const deleteServer = useDeleteMcpServer();\n\n const [showForm, setShowForm] = useState(false);\n const [editing, setEditing] = useState<McpServerRecord | null>(null);\n const [confirmDelete, setConfirmDelete] = useState<McpServerRecord | null>(null);\n const [expandedIds, setExpandedIds] = useState<Set<string>>(new Set());\n const [tryTool, setTryTool] = useState<{\n serverId: string;\n serverName: string;\n tool: McpToolManifest;\n } | null>(null);\n\n const servers = data?.servers ?? [];\n const total = data?.total ?? 0;\n\n // Derive unique tags from current result set for the filter dropdown\n const tagOptions = useMemo(() => {\n const allTags = new Set<string>();\n for (const s of servers) {\n for (const t of s.tags ?? []) allTags.add(t);\n }\n return [...allTags].sort().map((t) => ({ value: t, label: t }));\n }, [servers]);\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 // Auto-expand servers whose tools match the search (so results are visible)\n useEffect(() => {\n if (!filters.search) return;\n const q = filters.search.toLowerCase();\n const idsToExpand = filteredServers\n .filter((s) => {\n const tools = (s.tool_manifest ?? []) as McpToolManifest[];\n return tools.some(\n (t) => t.name.toLowerCase().includes(q) || t.description?.toLowerCase().includes(q),\n );\n })\n .map((s) => s.id);\n if (idsToExpand.length > 0) {\n setExpandedIds((prev) => {\n const next = new Set(prev);\n for (const id of idsToExpand) next.add(id);\n return next;\n });\n }\n }, [filters.search, filteredServers]);\n\n const toggleExpand = (id: string) => {\n setExpandedIds((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n };\n\n const handleDelete = () => {\n if (!confirmDelete) return;\n deleteServer.mutate(confirmDelete.id, {\n onSuccess: () => setConfirmDelete(null),\n });\n };\n\n if (isLoading) {\n return (\n <div>\n <PageHeader title=\"MCP Server Tools\" />\n <div className=\"animate-pulse space-y-0\">\n {Array.from({ length: 5 }).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 Server Tools\"\n actions={\n <button\n onClick={() => {\n setEditing(null);\n setShowForm(true);\n }}\n className=\"btn-primary text-xs\"\n >\n Register Server\n </button>\n }\n />\n\n <p className=\"text-sm text-text-secondary mb-6 max-w-2xl leading-relaxed\">\n Registered MCP servers and their available tools. Each server exposes tools that can be used by the Pipeline Designer.\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 <FilterSelect\n label=\"Tag\"\n value={filters.tag}\n onChange={(v) => setFilter('tag', v)}\n options={tagOptions}\n />\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={[\n { value: 'registered', label: 'Registered' },\n { value: 'connected', label: 'Connected' },\n { value: 'error', label: 'Error' },\n { value: 'disconnected', label: 'Disconnected' },\n ]}\n />\n </FilterBar>\n\n {filteredServers.length === 0 ? (\n <EmptyState title=\"No servers found\" />\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 px-6 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary w-28\" />\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.id}\n server={server}\n expanded={expandedIds.has(server.id)}\n onToggle={() => toggleExpand(server.id)}\n onEdit={() => {\n setEditing(server);\n setShowForm(true);\n }}\n onDelete={() => setConfirmDelete(server)}\n onTryTool={(tool) =>\n setTryTool({\n serverId: server.id,\n serverName: server.name,\n tool,\n })\n }\n connect={connect}\n disconnect={disconnect}\n visibleTools={filterTools(\n (server.tool_manifest ?? []) as McpToolManifest[],\n filters.search,\n )}\n />\n ))}\n </tbody>\n </table>\n )}\n\n <StickyPagination\n page={pagination.page}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n total={total}\n pageSize={pagination.pageSize}\n onPageSizeChange={pagination.setPageSize}\n />\n\n {/* Create / Edit modal */}\n <ServerFormModal\n open={showForm}\n onClose={() => {\n setShowForm(false);\n setEditing(null);\n }}\n editing={editing}\n />\n\n {/* Delete confirmation modal */}\n <ConfirmDeleteModal\n open={!!confirmDelete}\n onClose={() => setConfirmDelete(null)}\n onConfirm={handleDelete}\n title=\"Delete MCP Server\"\n description={\n <>\n Delete{' '}\n <span className=\"font-medium text-text-primary\">{confirmDelete?.name}</span>?\n This will remove the server registration.\n </>\n }\n isPending={deleteServer.isPending}\n error={deleteServer.error as Error | null}\n />\n\n {/* Try tool modal */}\n {tryTool && (\n <TryToolModal\n open={!!tryTool}\n onClose={() => setTryTool(null)}\n serverId={tryTool.serverId}\n serverName={tryTool.serverName}\n tool={tryTool.tool}\n />\n )}\n </div>\n );\n}\n"],"names":["EMPTY_FORM","serverToForm","s","ServerFormModal","open","onClose","editing","createServer","useCreateMcpServer","updateServer","useUpdateMcpServer","form","setForm","useState","jsonError","setJsonError","prevEditing","setPrevEditing","handleSave","config","isPending","error","set","field","value","f","jsx","Modal","jsxs","e","buildSkeleton","schema","result","key","prop","p","TryToolModal","serverId","serverName","tool","callTool","useCallMcpTool","argsJson","setArgsJson","hasResult","handleRun","parsed","JsonViewer","res","_a","jobId","ns","Link","ExternalLink","msg","KeyRound","Fragment","RotateCcw","Play","isBuiltIn","row","_b","matchesSearch","server","search","q","t","filterTools","tools","CredentialDot","credentialProviders","data","useCredentialStatus","ok","ServerRow","expanded","onToggle","onEdit","onDelete","onTryTool","connect","disconnect","visibleTools","allTools","builtin","ChevronRight","tag","StatusBadge","RowActionGroup","RowAction","Unplug","Plug","Pencil","Trash2","McpServersPage","filters","setFilter","pagination","useFilterParams","isLoading","useMcpServers","useConnectMcpServer","useDisconnectMcpServer","deleteServer","useDeleteMcpServer","showForm","setShowForm","setEditing","confirmDelete","setConfirmDelete","expandedIds","setExpandedIds","tryTool","setTryTool","servers","total","tagOptions","useMemo","allTags","filteredServers","useEffect","idsToExpand","prev","next","id","toggleExpand","handleDelete","PageHeader","_","i","FilterBar","FilterInput","v","FilterSelect","EmptyState","StickyPagination","ConfirmDeleteModal"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{u as c,b as u,c as n}from"./vendor-query-B2UbickB.js";import{a as t}from"./index-D8VH6K8B.js";function i(e={}){const s=new URLSearchParams;e.status&&s.set("status",e.status),e.search&&s.set("search",e.search),e.tags&&s.set("tags",e.tags);const r=s.toString();return c({queryKey:["mcpServers",e],queryFn:()=>t(`/mcp/servers${r?`?${r}`:""}`)})}function m(){const e=u();return n({mutationFn:s=>t("/mcp/servers",{method:"POST",body:JSON.stringify(s)}),onSuccess:()=>{e.invalidateQueries({queryKey:["mcpServers"]})}})}function y(){const e=u();return n({mutationFn:({id:s,...r})=>t(`/mcp/servers/${s}`,{method:"PUT",body:JSON.stringify(r)}),onSuccess:()=>{e.invalidateQueries({queryKey:["mcpServers"]})}})}function p(){const e=u();return n({mutationFn:s=>t(`/mcp/servers/${s}`,{method:"DELETE"}),onSuccess:()=>{e.invalidateQueries({queryKey:["mcpServers"]})}})}function S(){const e=u();return n({mutationFn:s=>t(`/mcp/servers/${s}/connect`,{method:"POST"}),onSuccess:()=>{e.invalidateQueries({queryKey:["mcpServers"]})}})}function v(){const e=u();return n({mutationFn:s=>t(`/mcp/servers/${s}/disconnect`,{method:"POST"}),onSuccess:()=>{e.invalidateQueries({queryKey:["mcpServers"]})}})}function d(e){return c({queryKey:["mcpCredentialStatus",e],queryFn:()=>t(`/mcp/servers/${e}/credential-status`),enabled:!!e,staleTime:3e4})}function l(){return n({mutationFn:({serverId:e,toolName:s,arguments:r})=>t(`/mcp/servers/${e}/tools/${s}/call`,{method:"POST",body:JSON.stringify({arguments:r})})})}export{m as a,y as b,l as c,d,S as e,v as f,p as g,i as u};
|
|
2
|
+
//# sourceMappingURL=mcp-blCW6IL7.js.map
|