@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,3 @@
|
|
|
1
|
+
import{a as p,j as e}from"./vendor-query-B2UbickB.js";import{J as $,C as fe,f as je,o as ge,c as be,d as Ne,p as ye}from"./index-D8VH6K8B.js";import{a as ve}from"./roles-ZNrqqnQl.js";import{P as we}from"./PageHeader-CpWFly5S.js";import{C as K}from"./CollapsibleSection-Cxk4wvjT.js";import{C as ae,i as ke,a as Ce}from"./escalation-qalymbKB.js";import{u as _e}from"./workflows-Cc4VHcrp.js";import{u as Se}from"./settings-eBRSE0mQ.js";import{e as Te}from"./useNatsEvents-Xr43X1fG.js";import{S as H}from"./SimpleMarkdown-CBlvaWP4.js";import{L as re,d as Ee,b as Re,u as Ae}from"./vendor-react-Cw8Gy8NJ.js";import{U as ne}from"./UserName-DaP4YAKr.js";import{u as Pe,C as Ie}from"./CustomDurationPicker-CAninCbl.js";import{S as Me}from"./StatusBadge-TlC4jiig.js";import{R as De}from"./RolePill-BTPa8L-P.js";import{T as Z}from"./TimeAgo-UPG6DoH8.js";import{C as R}from"./CopyableId-CBdxWfp8.js";import{B as Be,U as Oe,K as ee}from"./vendor-icons-ZTAKVwGc.js";import"./format-gXZXQ-HJ.js";import"./users-tMvNyOo8.js";import"./constants-CgaZfe5d.js";function q({children:t}){return e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1.5",children:t})}function Je({payload:t,isTerminal:a,resolverPayload:r,onRetryTriage:l,isRetrying:s}){const n=t.title,m=t.summary,d=t.diagnosis,o=t.tool_calls_made,u=t.result,i=r==null?void 0:r._lt,v=(i==null?void 0:i.triaged)===!0,N=i==null?void 0:i.triageWorkflowId,f=a&&v,[j,g]=p.useState(!1);return f?e.jsxs("div",{className:"rounded-md border border-status-success/30 bg-surface-raised",children:[e.jsxs("div",{className:"flex items-center justify-between px-4 py-3 border-b border-surface-border",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("svg",{className:"w-4 h-4 text-status-success shrink-0",viewBox:"0 0 16 16",fill:"currentColor",children:e.jsx("path",{d:"M8 1a7 7 0 110 14A7 7 0 018 1zm3.36 4.65a.5.5 0 00-.72 0L7 9.29 5.36 7.65a.5.5 0 10-.72.7l2 2a.5.5 0 00.72 0l4-4a.5.5 0 000-.7z"})}),e.jsx("span",{className:"text-xs font-medium text-status-success",children:"Resolved by AI Triage"})]}),typeof o=="number"&&e.jsxs("span",{className:"text-[10px] font-mono px-2 py-0.5 rounded-full bg-status-success/10 text-status-success",children:[o," tool calls used"]})]}),e.jsxs("div",{className:"px-4 py-4 space-y-4",children:[n&&e.jsx("p",{className:"text-sm font-medium text-text-primary",children:n}),d&&e.jsxs("div",{children:[e.jsx(q,{children:"Triage diagnosis"}),e.jsx("div",{className:"text-xs text-text-primary leading-relaxed",children:e.jsx(H,{content:d})})]}),e.jsx("div",{className:"flex items-center gap-3",children:N&&e.jsx(re,{to:`/workflows/executions/${N}`,className:"text-[10px] text-accent hover:underline",children:"View triage execution"})})]})]}):e.jsxs("div",{className:"rounded-md border border-status-warning/30 bg-surface-raised",children:[e.jsxs("div",{className:"flex items-center justify-between px-4 py-3 border-b border-surface-border",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("svg",{className:"w-4 h-4 text-status-warning shrink-0",viewBox:"0 0 16 16",fill:"currentColor",children:e.jsx("path",{d:"M8 1a7 7 0 110 14A7 7 0 018 1zm0 3a.75.75 0 00-.75.75v3.5a.75.75 0 001.5 0v-3.5A.75.75 0 008 4zm0 7a.75.75 0 100-1.5.75.75 0 000 1.5z"})}),e.jsx("span",{className:"text-xs font-medium text-status-warning",children:"Tool Rounds Exhausted"})]}),typeof o=="number"&&e.jsxs("span",{className:"text-[10px] font-mono px-2 py-0.5 rounded-full bg-status-warning/10 text-status-warning",children:[o," tool calls used"]})]}),e.jsxs("div",{className:"px-4 py-4 space-y-4",children:[n&&e.jsx("p",{className:"text-sm font-medium text-text-primary",children:n}),m&&e.jsxs("div",{children:[e.jsx(q,{children:"What happened"}),e.jsx("div",{className:"text-xs text-text-secondary leading-relaxed",children:e.jsx(H,{content:m})})]}),d&&e.jsxs("div",{children:[e.jsx(q,{children:"What went wrong"}),e.jsx("div",{className:"text-xs text-text-primary leading-relaxed",children:e.jsx(H,{content:d})})]}),u!=null&&e.jsxs("div",{children:[e.jsxs("button",{onClick:()=>g(!j),className:"flex items-center gap-1 text-[10px] font-semibold uppercase tracking-widest text-text-tertiary hover:text-text-secondary transition-colors",children:[e.jsx("svg",{className:`w-3 h-3 transition-transform ${j?"rotate-90":""}`,viewBox:"0 0 12 12",fill:"currentColor",children:e.jsx("path",{d:"M4.5 2l4 4-4 4"})}),"Partial results"]}),j&&e.jsx("div",{className:"mt-2",children:e.jsx($,{data:u,defaultMode:"tree"})})]}),l&&!a&&e.jsx("div",{className:"pt-2",children:e.jsxs("button",{onClick:l,disabled:s,className:"inline-flex items-center gap-2 px-4 py-2 text-xs font-medium bg-accent text-text-inverse rounded-md hover:bg-accent/90 disabled:opacity-50 disabled:cursor-not-allowed transition-colors",children:[e.jsx("svg",{className:"w-3.5 h-3.5",viewBox:"0 0 14 14",fill:"currentColor",children:e.jsx("path",{d:"M7 1a6 6 0 100 12A6 6 0 007 1zm2.5 6.5l-3.5 2V5.5l3.5 2z"})}),s?"Sending to triage...":"Retry with AI Triage"]})})]})]})}function Le({triage:t,payload:a}){const r=t.confidence??0,l=r>=.8?"text-status-success":r>=.5?"text-status-pending":"text-status-error",s=ze(t.originalData,a);return e.jsxs("div",{className:"space-y-5",children:[t.diagnosis&&e.jsx("p",{className:"text-sm text-text-primary leading-relaxed",children:t.diagnosis}),e.jsxs("div",{className:"flex flex-wrap items-center gap-3 text-xs text-text-tertiary",children:[t.tool_calls_made!=null&&e.jsxs("span",{children:[t.tool_calls_made," tool call",t.tool_calls_made!==1?"s":""]}),t.tool_calls_made!=null&&e.jsx("span",{className:"text-text-quaternary",children:"·"}),e.jsxs("span",{className:`font-medium ${l}`,children:[Math.round(r*100),"% confidence"]})]}),t.actions_taken&&t.actions_taken.length>0&&e.jsx("div",{className:"flex flex-wrap gap-1.5",children:t.actions_taken.map((n,m)=>e.jsxs("span",{className:`inline-flex items-center gap-1.5 px-2 py-0.5 text-[11px]
|
|
2
|
+
text-text-secondary`,children:[e.jsx("svg",{className:"w-3 h-3 text-status-success shrink-0",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2.5,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M5 13l4 4L19 7"})}),n]},m))}),t.recommendation&&e.jsx("p",{className:"text-[11px] text-text-tertiary italic",children:t.recommendation}),s.length>0&&e.jsx("div",{className:"space-y-4 pt-2",children:s.map(n=>e.jsx(Fe,{diff:n},n.key))})]})}function ze(t,a){if(!t)return[];const r=[];for(const l of Object.keys(t)){if(l.startsWith("_"))continue;const s=t[l],n=a[l];n!==void 0&&JSON.stringify(s)!==JSON.stringify(n)&&r.push({key:l,label:l.replace(/[_-]/g," "),original:s,corrected:n})}return r}function Fe({diff:t}){const a=te(t.original),r=te(t.corrected);return a!==null&&r!==null?e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-x-8 gap-y-3",children:[e.jsxs("div",{children:[e.jsxs("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:[t.label," ",e.jsx("span",{className:"normal-case font-normal",children:"(original)"})]}),e.jsx("p",{className:"text-sm text-text-tertiary leading-relaxed line-through decoration-text-tertiary/30",children:a})]}),e.jsxs("div",{children:[e.jsxs("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:[t.label," ",e.jsx("span",{className:"normal-case font-normal text-status-success",children:"(corrected)"})]}),e.jsx("p",{className:"text-sm text-text-primary leading-relaxed",children:r})]})]}):e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{children:[e.jsxs("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:[t.label," ",e.jsx("span",{className:"normal-case font-normal",children:"(original)"})]}),e.jsx("pre",{className:"text-xs text-text-tertiary font-mono whitespace-pre-wrap leading-relaxed",children:typeof t.original=="object"?JSON.stringify(t.original,null,2):String(t.original)})]}),e.jsxs("div",{children:[e.jsxs("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:[t.label," ",e.jsx("span",{className:"normal-case font-normal text-status-success",children:"(corrected)"})]}),e.jsx("pre",{className:"text-xs text-text-primary font-mono whitespace-pre-wrap leading-relaxed",children:typeof t.corrected=="object"?JSON.stringify(t.corrected,null,2):String(t.corrected)})]})]})}function te(t){return t==null?"null":typeof t=="string"?t:typeof t=="number"||typeof t=="boolean"?String(t):null}function We(t){const{mode:a,activeView:r,onActiveViewChange:l,onClaim:s,claimPending:n,workflowType:m,json:d,onResolve:o,resolvePending:u,resolveError:i,requestTriage:v,triageNotes:N,currentRole:f,escalationTargets:j,onEscalate:g,escalatePending:k,escalateError:C,onRelease:B,releasePending:A,assignedTo:T,assignedUntil:P}=t,F=Pe(),[O,J]=p.useState("30"),[W,V]=p.useState(0),[y,I]=p.useState(""),[M,L]=p.useState(""),_=O==="custom",z=p.useCallback(x=>V(x),[]);if(a==="terminal")return null;const E=()=>{const x=_?W:parseInt(O);!x||x<=0||s(x)},U=()=>{if(I(""),v){const D={_lt:{needsTriage:!0}};N.trim()&&(D.notes=N.trim()),o(D);return}let x;try{x=JSON.parse(d)}catch{I("Invalid JSON");return}o(x)},w=x=>`text-xs transition-colors ${x?"text-accent font-medium":"text-text-tertiary hover:text-accent"}`;return e.jsxs("div",{className:"sticky h-[80px] bg-surface/95 backdrop-blur-sm border-t border-surface-border -mx-10 px-10 pt-3 pb-5 z-10",style:{bottom:"calc(var(--feed-height, 0px) - 8px)"},"data-testid":"escalation-action-bar",children:[a==="available"&&e.jsxs("div",{"data-testid":"claim-bar",children:[e.jsxs("div",{className:"flex items-center gap-4 mb-2",children:[F.map(x=>e.jsx("button",{onClick:()=>{J(x.value),V(0)},className:w(!_&&O===x.value),children:x.label},x.value)),e.jsx("button",{onClick:()=>J("custom"),className:w(_),children:"Other"})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"flex-1"}),_&&e.jsx(Ie,{onChange:z,compact:!0,autoFocus:!0}),e.jsx("button",{onClick:E,disabled:n||_&&W<=0,className:"btn-primary text-xs",children:n?"Claiming...":"Claim"})]})]}),a==="claimed_by_other"&&e.jsxs("div",{className:"flex items-center gap-4","data-testid":"claimed-other-bar",children:[e.jsxs("p",{className:"text-sm text-text-secondary",children:["Claimed by ",e.jsx("span",{className:"font-medium text-text-primary",children:T?e.jsx(ne,{userId:T}):"unknown"})]}),P&&e.jsx(ae,{until:P})]}),a==="claimed_by_me"&&e.jsxs("div",{"data-testid":"action-bar",children:[e.jsxs("div",{className:"flex items-center gap-4 mb-2",children:[e.jsx("button",{onClick:()=>l("resolve"),className:w(r==="resolve"),children:m?"Resolve":"Acknowledge"}),j.length>0&&e.jsx("button",{onClick:()=>l("escalate"),className:w(r==="escalate"),children:"Escalate"}),e.jsx("button",{onClick:()=>l("release"),className:`text-xs transition-colors ${r==="release"?"text-status-error font-medium":"text-text-tertiary hover:text-status-error"}`,children:"Release"})]}),r==="resolve"&&(m?e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsx("div",{className:"flex-1"}),y&&e.jsx("span",{className:"text-xs text-status-error",children:y}),i&&e.jsx("span",{className:"text-xs text-status-error",children:i.message}),e.jsx("button",{onClick:U,disabled:u,className:"btn-primary text-xs",children:u?"Submitting...":v?"Send to Triage":"Submit"})]}):e.jsxs("div",{className:"flex items-center",children:[e.jsx("span",{className:"text-xs text-text-secondary",children:"Notification — acknowledge to resolve"}),e.jsx("div",{className:"flex-1"}),i&&e.jsx("span",{className:"text-xs text-status-error mr-3",children:i.message}),e.jsx("button",{onClick:()=>o({acknowledged:!0}),disabled:u,className:"btn-primary text-xs",children:u?"Acknowledging...":"Acknowledge"})]})),r==="escalate"&&e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsxs("span",{className:"text-xs text-text-secondary",children:["From ",e.jsx("span",{className:"font-medium text-text-primary",children:f})," to"]}),e.jsxs("select",{value:M,onChange:x=>L(x.target.value),className:"select text-xs","data-testid":"escalate-select",children:[e.jsx("option",{value:"",children:"Select role..."}),j.map(x=>e.jsx("option",{value:x,children:x},x))]}),e.jsx("div",{className:"flex-1"}),C&&e.jsx("span",{className:"text-xs text-status-error",children:C.message}),e.jsx("button",{onClick:()=>g(M),disabled:!M||k,className:"btn-primary text-xs",children:k?"Escalating...":"Escalate"})]}),r==="release"&&e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("span",{className:"text-xs text-text-secondary",children:"Release back to pool?"}),e.jsx("div",{className:"flex-1"}),e.jsx("button",{onClick:()=>l("resolve"),className:"btn-secondary text-xs",children:"Cancel"}),e.jsx("button",{onClick:B,disabled:A,className:"btn-primary text-xs bg-status-error hover:bg-status-error/80",children:A?"Releasing...":"Yes, Release"})]})]})]})}function Ve({esc:t,claimedByMe:a,claimed:r,isTerminal:l,traceUrl:s}){const[n,m]=p.useState(!1),d=ke(t);return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex items-center gap-3 mb-2",children:[d&&e.jsx(Be,{className:"w-5 h-5 text-text-tertiary shrink-0"}),e.jsxs("p",{className:"text-[1.5rem] leading-snug font-light text-text-secondary",children:[t.type,t.subtype?` / ${t.subtype}`:""]})]}),t.description&&e.jsx("p",{className:"text-sm leading-relaxed text-text-tertiary mb-4",children:t.description}),e.jsxs("div",{className:"flex flex-wrap items-end gap-x-6 gap-y-3 mt-4 mb-2",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1.5",children:"Status"}),e.jsx("span",{className:"mb-1 inline-block",children:e.jsx(Me,{status:t.status})})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1.5",children:"Role"}),e.jsx(De,{role:t.role,size:"md"})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1.5",children:"Created"}),e.jsx("span",{className:"inline-flex items-center mb-1 text-xs text-text-secondary",children:e.jsx(Z,{date:t.created_at})})]}),t.assigned_to&&e.jsxs("div",{children:[e.jsx("p",{className:"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1.5",children:"Claimed by"}),e.jsxs("span",{className:"inline-flex items-center gap-1.5 text-xs font-medium text-text-primary",children:[e.jsx(Oe,{className:"w-3 h-3 shrink-0 text-accent/75"}),e.jsx(ne,{userId:t.assigned_to})]})]}),r&&!l&&t.assigned_until&&e.jsxs("div",{children:[e.jsx("p",{className:"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1.5",children:"Time left"}),e.jsx("span",{className:"inline-flex items-center h-5",children:e.jsx(ae,{until:t.assigned_until})})]}),t.resolved_at&&e.jsxs("div",{children:[e.jsx("p",{className:"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1.5",children:"Resolved"}),e.jsx("span",{className:"inline-flex items-center h-5 text-xs text-text-secondary",children:e.jsx(Z,{date:t.resolved_at})})]}),e.jsx("div",{children:e.jsxs("button",{onClick:()=>m(!n),className:"inline-flex items-center gap-1 h-5 text-xs text-text-tertiary hover:text-accent transition-colors",children:["Details",e.jsx("svg",{className:`w-3 h-3 transition-transform duration-200 ${n?"rotate-180":""}`,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M19 9l-7 7-7-7"})})]})})]}),e.jsx(fe,{open:n,children:e.jsxs("div",{className:"mt-4 bg-surface-raised border border-surface-border rounded-md p-4 flex flex-wrap gap-x-8 gap-y-4",children:[e.jsxs("div",{className:"text-left",children:[e.jsx("span",{className:"text-[11px] font-medium text-text-secondary uppercase tracking-wide",children:"Priority"}),e.jsxs("p",{className:"text-[12px] text-text-primary mt-0.5",children:["P",t.priority]})]}),e.jsx(R,{label:"Escalation ID",value:t.id}),t.task_id&&e.jsx(R,{label:"Task",value:t.task_id,href:`/workflows/tasks/detail/${t.task_id}`}),e.jsx(R,{label:"Workflow",value:t.workflow_type}),e.jsx(R,{label:"Workflow ID",value:t.workflow_id}),e.jsx(R,{label:"Task Queue",value:t.task_queue}),t.origin_id&&t.origin_id!==t.workflow_id&&e.jsx(R,{label:"Origin",value:t.origin_id}),t.trace_id&&e.jsx(R,{label:"Trace",value:t.trace_id,href:s?s.replace("{traceId}",t.trace_id):void 0,external:!0})]})})]})}function $e({value:t,onChange:a}){const[r,l]=p.useState({}),[s,n]=p.useState({}),[m,d]=p.useState(null),[o,u]=p.useState(!1);p.useEffect(()=>{try{const f=JSON.parse(t);if(typeof f=="object"&&f!==null&&!Array.isArray(f)){const j={},g={};for(const[k,C]of Object.entries(f))k.startsWith("_")?g[k]=C:j[k]=C;l(j),n(g),d(g._form_schema&&typeof g._form_schema=="object"?g._form_schema:null),u(!1)}}catch{u(!0)}},[t]);const i=p.useCallback(f=>{l(f),a(JSON.stringify({...f,...s},null,2))},[s,a]),v=p.useCallback((f,j)=>{i({...r,[f]:j})},[r,i]);if(o)return e.jsx("p",{className:"text-xs text-status-error",children:"Unable to parse resolver data as form. Use the JSON editor below."});const N=Object.entries(r);return N.length===0?e.jsx("p",{className:"text-xs text-text-tertiary italic",children:"No resolver fields defined."}):e.jsx("div",{className:"space-y-4",children:N.map(([f,j])=>e.jsx(ie,{fieldKey:f,value:j,onChange:g=>v(f,g),schema:m},f))})}function ie({fieldKey:t,value:a,onChange:r,schema:l}){var m;const s=t.replace(/[_-]/g," "),n=(m=l==null?void 0:l.properties)==null?void 0:m[t];if(typeof a=="boolean")return e.jsxs("label",{className:"flex items-center gap-2 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:a,onChange:d=>r(d.target.checked),className:"w-3.5 h-3.5 rounded accent-accent"}),e.jsx("span",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:s})]});if(typeof a=="number")return e.jsxs("div",{children:[e.jsx(S,{children:s}),e.jsx("input",{type:"number",value:a,onChange:d=>r(parseFloat(d.target.value)||0),step:"any",className:"input text-sm w-full mt-1"})]});if(typeof a=="string"){const d=(n==null?void 0:n.format)==="password",o=n==null?void 0:n.enum,u=n==null?void 0:n.description;return o!=null&&o.length?e.jsxs("div",{children:[e.jsx(S,{children:s}),u&&e.jsx("p",{className:"text-[10px] text-text-tertiary mt-0.5",children:u}),e.jsx("select",{value:a,onChange:i=>r(i.target.value),className:"input text-sm w-full mt-1",children:o.map(i=>e.jsx("option",{value:i,children:i},i))})]}):d?e.jsxs("div",{children:[e.jsx(S,{children:s}),u&&e.jsx("p",{className:"text-[10px] text-text-tertiary mt-0.5",children:u}),e.jsx("input",{type:"password",value:a,onChange:i=>r(i.target.value),className:"input text-sm w-full mt-1",autoComplete:"off"})]}):a.length>80?e.jsxs("div",{children:[e.jsx(S,{children:s}),u&&e.jsx("p",{className:"text-[10px] text-text-tertiary mt-0.5",children:u}),e.jsx("textarea",{value:a,onChange:i=>r(i.target.value),className:"input text-sm w-full mt-1 leading-relaxed",rows:Math.min(6,Math.ceil(a.length/60))})]}):e.jsxs("div",{children:[e.jsx(S,{children:s}),u&&e.jsx("p",{className:"text-[10px] text-text-tertiary mt-0.5",children:u}),e.jsx("input",{type:"text",value:a,onChange:i=>r(i.target.value),className:"input text-sm w-full mt-1"})]})}if(a===null)return e.jsxs("div",{children:[e.jsx(S,{children:s}),e.jsx("p",{className:"text-xs text-text-tertiary italic mt-1",children:"null"})]});if(Array.isArray(a))return e.jsxs("div",{children:[e.jsx(S,{children:s}),e.jsx("div",{className:"flex flex-wrap gap-1.5 mt-1",children:a.map((d,o)=>e.jsx("span",{className:"px-2 py-0.5 text-[11px] font-mono bg-surface-sunken rounded text-text-secondary",children:String(d)},o))})]});if(typeof a=="object"){const d=Object.entries(a);return e.jsxs("div",{children:[e.jsx(S,{children:s}),e.jsx("div",{className:"ml-4 mt-2 pl-4 border-l border-accent-faint space-y-3",children:d.map(([o,u])=>e.jsx(ie,{fieldKey:o,value:u,onChange:i=>r({...a,[o]:i})},o))})]})}return null}function S({children:t}){return e.jsx("label",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:t})}function Ue({json:t,onJsonChange:a,requestTriage:r,onRequestTriageChange:l,triageNotes:s,onTriageNotesChange:n}){const[m,d]=p.useState("form");return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex items-center justify-between mb-3",children:[r?e.jsxs("button",{onClick:()=>l(!1),className:"group flex items-center gap-2 text-left","data-testid":"triage-cancel",children:[e.jsx("span",{className:"flex items-center justify-center w-5 h-5 rounded-full bg-accent/10 text-accent shrink-0",children:e.jsx("svg",{className:"w-3 h-3",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M6 18L18 6M6 6l12 12"})})}),e.jsxs("span",{className:"text-xs text-text-secondary group-hover:text-text-primary transition-colors",children:["AI Triage active."," ",e.jsx("span",{className:"text-accent group-hover:underline",children:"Cancel"})]})]}):e.jsxs("button",{onClick:()=>l(!0),className:"group flex items-center gap-2.5 text-left my-4","data-testid":"triage-callout",children:[e.jsx("span",{className:"flex items-center justify-center w-6 h-6 rounded-full bg-accent/10 text-accent shrink-0 animate-[triage-glow_6s_ease-in-out_infinite]",children:e.jsx("svg",{className:"w-3.5 h-3.5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M9.663 17h4.674M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"})})}),e.jsxs("span",{className:"text-[13px] text-text-secondary group-hover:text-text-primary transition-colors",children:["This form doesn't capture the issue?"," ",e.jsx("span",{className:"text-accent group-hover:underline",children:"Request AI Triage"})]})]}),!r&&e.jsx("button",{onClick:()=>d(m==="form"?"json":"form"),className:"text-[10px] text-text-tertiary hover:text-accent transition-colors",children:m==="form"?"Raw JSON":"Form"})]}),e.jsxs("div",{className:"relative min-h-[200px]",children:[e.jsx("div",{className:r?"pointer-events-none select-none":"",children:m==="form"?e.jsx($e,{value:t,onChange:a}):e.jsx("textarea",{value:t,onChange:o=>a(o.target.value),className:"input font-mono text-xs w-full",rows:8,spellCheck:!1,"data-testid":"resolve-json"})}),r&&e.jsxs("div",{className:"absolute inset-0 z-10 flex flex-col bg-surface/90 backdrop-blur-[2px] rounded-md border border-accent/20 p-5","data-testid":"triage-overlay",children:[e.jsx("p",{className:"text-xs text-text-secondary mb-3 leading-relaxed",children:"The resolution form will not be submitted. Describe the issue so AI triage can diagnose and fix it using available tools. The corrected result will come back as a new escalation for your review."}),e.jsx("textarea",{value:s,onChange:o=>n(o.target.value),placeholder:"e.g. Content is in Spanish — needs translation to English before review...",className:"input text-xs w-full flex-1 min-h-[80px] resize-none",autoFocus:!0,"data-testid":"triage-notes"})]})]})]})}function se(t){if(!t)return null;try{return JSON.parse(t)}catch{return t}}function Ke(t){if(!t)return!1;try{const a=JSON.parse(t);return!!(a&&typeof a=="object"&&a._triage)}catch{return!1}}function pt(){var G,Q,X;const{id:t}=Ee(),{user:a}=je(),r=Re(),l=Ae(),{data:s,isLoading:n}=ge(t);Te(t);const m=be(),d=Ne(),o=ye(),{data:u}=ve((s==null?void 0:s.role)??""),{data:i}=_e(),{data:v}=Se(),N=i==null?void 0:i.find(h=>h.workflow_type===(s==null?void 0:s.workflow_type)),f=((G=v==null?void 0:v.telemetry)==null?void 0:G.traceUrl)??null,j=((Q=l.state)==null?void 0:Q.from)??"/escalations/available",[g,k]=p.useState("resolve"),[C,B]=p.useState("{}"),[A,T]=p.useState({context:!1}),P=h=>T(c=>({...c,[h]:!c[h]})),[F,O]=p.useState(!1),[J,W]=p.useState(""),V=(N==null?void 0:N.resolver_schema)??null,y=((X=s==null?void 0:s.metadata)==null?void 0:X.form_schema)??null,I=y??V;p.useEffect(()=>{if(y){const h={_form_schema:y},c=y.properties;if(c&&typeof c=="object")for(const[ue,pe]of Object.entries(c)){const he=pe;h[ue]=he.default??""}B(JSON.stringify(h,null,2))}else B(I?JSON.stringify(I,null,2):"{}")},[I,y]);const M=Ke(s==null?void 0:s.escalation_payload),L=(s==null?void 0:s.subtype)==="rounds_exhausted",_=(s==null?void 0:s.subtype)==="wait_for_human";if(p.useEffect(()=>{(M||L)&&T(h=>({...h,context:!0})),_&&y&&T(h=>({...h,context:!0,resolver:!1}))},[M,L,_,y]),n)return e.jsxs("div",{className:"animate-pulse space-y-8",children:[e.jsx("div",{className:"h-8 bg-surface-sunken rounded w-64"}),e.jsx("div",{className:"h-32 bg-surface-sunken rounded w-full"})]});if(!s)return e.jsx("p",{className:"text-sm text-text-secondary",children:"Escalation not found."});const z=Ce(s),E=z&&s.assigned_to===(a==null?void 0:a.userId),U=z&&!E,w=s.status==="resolved"||s.status==="cancelled",x=se(s.escalation_payload),D=se(s.resolver_payload),b=typeof x=="object"&&x!==null&&!Array.isArray(x)?x:null,Y=b==null?void 0:b._triage,le=w?"terminal":E?"claimed_by_me":U?"claimed_by_other":"available",oe=h=>{m.mutate({id:s.id,durationMinutes:h}),T({context:!0,triage:!0,resolver:!1})},ce=async h=>{const c=await d.mutateAsync({id:s.id,resolverPayload:h});c!=null&&c.signaled&&(c!=null&&c.workflowId)?r(`/workflows/executions/${c.workflowId}`):c!=null&&c.triage&&(c!=null&&c.workflowId)?r(`/workflows/executions/${c.workflowId}`):r(j)},de=async h=>{h&&(await o.mutateAsync({id:s.id,targetRole:h}),r(j))},xe=async()=>{E||await m.mutateAsync({id:s.id,durationMinutes:30});const h=(b==null?void 0:b.diagnosis)||s.description||"",c=await d.mutateAsync({id:s.id,resolverPayload:{_lt:{needsTriage:!0},notes:h}});c!=null&&c.triage&&(c!=null&&c.workflowId)?r(`/workflows/executions/${c.workflowId}`):r(j)},me=async()=>{await m.mutateAsync({id:s.id,durationMinutes:0}),r(j)};return e.jsxs("div",{className:"min-h-[calc(100vh-9rem)] flex flex-col",children:[e.jsx(we,{title:"Escalation"}),e.jsx(Ve,{esc:s,claimedByMe:E,claimed:z,isTerminal:w,traceUrl:f}),L&&b&&e.jsx("div",{className:"mt-8",children:e.jsx(Je,{payload:b,isTerminal:w,resolverPayload:D,onRetryTriage:xe,isRetrying:m.isPending||d.isPending})}),(b==null?void 0:b.category)==="missing_credential"&&e.jsxs("div",{className:"mt-8 bg-status-warning/10 border border-status-warning/30 rounded-md px-5 py-4 flex items-start gap-3",children:[e.jsx(ee,{size:20,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:"Missing Credential"}),e.jsxs("p",{className:"text-xs text-text-secondary mb-3",children:["This workflow requires a ",e.jsx("span",{className:"font-medium capitalize",children:String(b.provider)})," credential to continue. Register one and then resolve this escalation to retry."]}),e.jsxs(re,{to:"/credentials",className:"btn-primary text-xs inline-flex items-center gap-1.5",children:[e.jsx(ee,{size:12}),"Go to Credentials"]})]})]}),e.jsxs("div",{className:"mt-8 space-y-6",children:[e.jsx(K,{title:"Input / Output",sectionKey:"context",isCollapsed:A.context??!0,onToggle:P,contentClassName:"mt-4 ml-9",children:e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[s.envelope&&e.jsx("div",{children:e.jsx($,{data:s.envelope,label:"Input Envelope"})}),x!=null&&e.jsx("div",{children:e.jsx($,{data:x,label:"Escalation Context"})})]}),D!=null&&e.jsx("div",{className:"max-w-xl",children:e.jsx($,{data:D,label:"Resolver Payload"})})]})}),Y&&b&&e.jsx(K,{title:"AI Triage",sectionKey:"triage",isCollapsed:!!A.triage,onToggle:P,contentClassName:"mt-4 ml-9",children:e.jsx(Le,{triage:Y,payload:b})}),!w&&E&&g==="resolve"&&(s.workflow_type||y)&&e.jsx(K,{title:"Submit Your Resolution",sectionKey:"resolver",isCollapsed:!!A.resolver,onToggle:P,contentClassName:"mt-4 ml-9",children:e.jsx(Ue,{json:C,onJsonChange:B,requestTriage:F,onRequestTriageChange:O,triageNotes:J,onTriageNotesChange:W})})]}),e.jsx("div",{className:"flex-1"}),e.jsx(We,{mode:le,activeView:g,onActiveViewChange:k,onClaim:oe,claimPending:m.isPending,workflowType:s.workflow_type,json:C,onResolve:ce,resolvePending:d.isPending,resolveError:d.error,requestTriage:F,triageNotes:J,currentRole:s.role,escalationTargets:(u==null?void 0:u.targets)??[],onEscalate:de,escalatePending:o.isPending,escalateError:o.error,onRelease:me,releasePending:m.isPending,assignedTo:s.assigned_to,assignedUntil:s.assigned_until})]})}export{pt as EscalationDetailPage};
|
|
3
|
+
//# sourceMappingURL=index-D9SYwJsi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-D9SYwJsi.js","sources":["../../src/components/escalation/RoundsExhaustedContext.tsx","../../src/components/escalation/TriageContext.tsx","../../src/pages/operator/escalation-detail/EscalationActionBar.tsx","../../src/pages/operator/escalation-detail/EscalationHero.tsx","../../src/components/escalation/ResolverForm.tsx","../../src/pages/operator/escalation-detail/ResolverSection.tsx","../../src/pages/operator/escalation-detail/EscalationDetailPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { Link } from 'react-router-dom';\n\nimport { JsonViewer } from '../common/data/JsonViewer';\nimport { SimpleMarkdown } from '../common/display/SimpleMarkdown';\n\ninterface RoundsExhaustedContextProps {\n payload: Record<string, unknown>;\n isTerminal?: boolean;\n resolverPayload?: Record<string, unknown> | null;\n onRetryTriage?: () => void;\n isRetrying?: boolean;\n}\n\nfunction SectionLabel({ children }: { children: React.ReactNode }) {\n return (\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1.5\">{children}</p>\n );\n}\n\nexport function RoundsExhaustedContext({ payload, isTerminal, resolverPayload, onRetryTriage, isRetrying }: RoundsExhaustedContextProps) {\n const title = payload.title as string | undefined;\n const summary = payload.summary as string | undefined;\n const diagnosis = payload.diagnosis as string | undefined;\n const toolCalls = payload.tool_calls_made as number | undefined;\n const result = payload.result as Record<string, unknown> | null | undefined;\n\n // Detect triage resolution\n const ltMeta = resolverPayload?._lt as Record<string, unknown> | undefined;\n const wasTriaged = ltMeta?.triaged === true;\n const triageWorkflowId = ltMeta?.triageWorkflowId as string | undefined;\n const isResolvedByTriage = isTerminal && wasTriaged;\n\n const [showResult, setShowResult] = useState(false);\n\n // Resolved by triage — show success state\n if (isResolvedByTriage) {\n return (\n <div className=\"rounded-md border border-status-success/30 bg-surface-raised\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-surface-border\">\n <div className=\"flex items-center gap-2\">\n <svg className=\"w-4 h-4 text-status-success shrink-0\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M8 1a7 7 0 110 14A7 7 0 018 1zm3.36 4.65a.5.5 0 00-.72 0L7 9.29 5.36 7.65a.5.5 0 10-.72.7l2 2a.5.5 0 00.72 0l4-4a.5.5 0 000-.7z\" />\n </svg>\n <span className=\"text-xs font-medium text-status-success\">Resolved by AI Triage</span>\n </div>\n {typeof toolCalls === 'number' && (\n <span className=\"text-[10px] font-mono px-2 py-0.5 rounded-full bg-status-success/10 text-status-success\">\n {toolCalls} tool calls used\n </span>\n )}\n </div>\n\n {/* Body */}\n <div className=\"px-4 py-4 space-y-4\">\n {title && (\n <p className=\"text-sm font-medium text-text-primary\">{title}</p>\n )}\n\n {diagnosis && (\n <div>\n <SectionLabel>Triage diagnosis</SectionLabel>\n <div className=\"text-xs text-text-primary leading-relaxed\">\n <SimpleMarkdown content={diagnosis} />\n </div>\n </div>\n )}\n\n <div className=\"flex items-center gap-3\">\n {triageWorkflowId && (\n <Link\n to={`/workflows/executions/${triageWorkflowId}`}\n className=\"text-[10px] text-accent hover:underline\"\n >\n View triage execution\n </Link>\n )}\n </div>\n </div>\n </div>\n );\n }\n\n // Default: warning state\n return (\n <div className=\"rounded-md border border-status-warning/30 bg-surface-raised\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-surface-border\">\n <div className=\"flex items-center gap-2\">\n <svg className=\"w-4 h-4 text-status-warning shrink-0\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M8 1a7 7 0 110 14A7 7 0 018 1zm0 3a.75.75 0 00-.75.75v3.5a.75.75 0 001.5 0v-3.5A.75.75 0 008 4zm0 7a.75.75 0 100-1.5.75.75 0 000 1.5z\" />\n </svg>\n <span className=\"text-xs font-medium text-status-warning\">Tool Rounds Exhausted</span>\n </div>\n {typeof toolCalls === 'number' && (\n <span className=\"text-[10px] font-mono px-2 py-0.5 rounded-full bg-status-warning/10 text-status-warning\">\n {toolCalls} tool calls used\n </span>\n )}\n </div>\n\n {/* Body */}\n <div className=\"px-4 py-4 space-y-4\">\n {title && (\n <p className=\"text-sm font-medium text-text-primary\">{title}</p>\n )}\n\n {summary && (\n <div>\n <SectionLabel>What happened</SectionLabel>\n <div className=\"text-xs text-text-secondary leading-relaxed\">\n <SimpleMarkdown content={summary} />\n </div>\n </div>\n )}\n\n {diagnosis && (\n <div>\n <SectionLabel>What went wrong</SectionLabel>\n <div className=\"text-xs text-text-primary leading-relaxed\">\n <SimpleMarkdown content={diagnosis} />\n </div>\n </div>\n )}\n\n {result != null && (\n <div>\n <button\n onClick={() => setShowResult(!showResult)}\n className=\"flex items-center gap-1 text-[10px] font-semibold uppercase tracking-widest text-text-tertiary hover:text-text-secondary transition-colors\"\n >\n <svg className={`w-3 h-3 transition-transform ${showResult ? 'rotate-90' : ''}`} viewBox=\"0 0 12 12\" fill=\"currentColor\">\n <path d=\"M4.5 2l4 4-4 4\" />\n </svg>\n Partial results\n </button>\n {showResult && (\n <div className=\"mt-2\">\n <JsonViewer data={result} defaultMode=\"tree\" />\n </div>\n )}\n </div>\n )}\n\n {onRetryTriage && !isTerminal && (\n <div className=\"pt-2\">\n <button\n onClick={onRetryTriage}\n disabled={isRetrying}\n className=\"inline-flex items-center gap-2 px-4 py-2 text-xs font-medium bg-accent text-text-inverse rounded-md hover:bg-accent/90 disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n >\n <svg className=\"w-3.5 h-3.5\" viewBox=\"0 0 14 14\" fill=\"currentColor\">\n <path d=\"M7 1a6 6 0 100 12A6 6 0 007 1zm2.5 6.5l-3.5 2V5.5l3.5 2z\" />\n </svg>\n {isRetrying ? 'Sending to triage...' : 'Retry with AI Triage'}\n </button>\n </div>\n )}\n </div>\n </div>\n );\n}\n","interface TriageData {\n diagnosis?: string;\n actions_taken?: string[];\n tool_calls_made?: number;\n confidence?: number;\n recommendation?: string;\n correctedData?: Record<string, unknown>;\n originalData?: Record<string, unknown>;\n}\n\ntype Diff = { key: string; label: string; original: unknown; corrected: unknown };\n\n/**\n * Renders a triage summary when escalation payload contains `_triage`.\n *\n * Fully generic — no knowledge of workflow types or field semantics.\n * Diffs `_triage.originalData` against the payload to detect changes.\n * Follows the unboxed section pattern used throughout the dashboard.\n */\nexport function TriageContext({ triage, payload }: {\n triage: TriageData;\n payload: Record<string, unknown>;\n}) {\n const confidence = triage.confidence ?? 0;\n const confidenceColor =\n confidence >= 0.8 ? 'text-status-success' :\n confidence >= 0.5 ? 'text-status-pending' :\n 'text-status-error';\n\n // Generic diff: compare originalData fields to current payload\n const diffs = computeDiffs(triage.originalData, payload);\n\n return (\n <div className=\"space-y-5\">\n {/* Diagnosis + metadata — unboxed, natural flow */}\n {triage.diagnosis && (\n <p className=\"text-sm text-text-primary leading-relaxed\">\n {triage.diagnosis}\n </p>\n )}\n\n <div className=\"flex flex-wrap items-center gap-3 text-xs text-text-tertiary\">\n {triage.tool_calls_made != null && (\n <span>{triage.tool_calls_made} tool call{triage.tool_calls_made !== 1 ? 's' : ''}</span>\n )}\n {triage.tool_calls_made != null && <span className=\"text-text-quaternary\">·</span>}\n <span className={`font-medium ${confidenceColor}`}>\n {Math.round(confidence * 100)}% confidence\n </span>\n </div>\n\n {triage.actions_taken && triage.actions_taken.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5\">\n {triage.actions_taken.map((action, i) => (\n <span\n key={i}\n className=\"inline-flex items-center gap-1.5 px-2 py-0.5 text-[11px]\n text-text-secondary\"\n >\n <svg className=\"w-3 h-3 text-status-success shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 13l4 4L19 7\" />\n </svg>\n {action}\n </span>\n ))}\n </div>\n )}\n\n {triage.recommendation && (\n <p className=\"text-[11px] text-text-tertiary italic\">\n {triage.recommendation}\n </p>\n )}\n\n {/* Generic before/after diffs — separated by subtle dividers */}\n {diffs.length > 0 && (\n <div className=\"space-y-4 pt-2\">\n {diffs.map((diff) => (\n <DiffRow key={diff.key} diff={diff} />\n ))}\n </div>\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Generic diff computation\n// ---------------------------------------------------------------------------\n\nfunction computeDiffs(\n original: Record<string, unknown> | undefined,\n current: Record<string, unknown>,\n): Diff[] {\n if (!original) return [];\n\n const diffs: Diff[] = [];\n for (const key of Object.keys(original)) {\n if (key.startsWith('_')) continue;\n const origVal = original[key];\n const currVal = current[key];\n if (currVal === undefined) continue;\n\n if (JSON.stringify(origVal) !== JSON.stringify(currVal)) {\n diffs.push({\n key,\n label: key.replace(/[_-]/g, ' '),\n original: origVal,\n corrected: currVal,\n });\n }\n }\n return diffs;\n}\n\n// ---------------------------------------------------------------------------\n// Diff row — clean, unboxed before/after\n// ---------------------------------------------------------------------------\n\nfunction DiffRow({ diff }: { diff: Diff }) {\n const origStr = renderValue(diff.original);\n const corrStr = renderValue(diff.corrected);\n\n // Both are primitives — side by side with subtle separator\n if (origStr !== null && corrStr !== null) {\n return (\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-x-8 gap-y-3\">\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n {diff.label} <span className=\"normal-case font-normal\">(original)</span>\n </p>\n <p className=\"text-sm text-text-tertiary leading-relaxed line-through decoration-text-tertiary/30\">\n {origStr}\n </p>\n </div>\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n {diff.label} <span className=\"normal-case font-normal text-status-success\">(corrected)</span>\n </p>\n <p className=\"text-sm text-text-primary leading-relaxed\">\n {corrStr}\n </p>\n </div>\n </div>\n );\n }\n\n // Complex values — stacked\n return (\n <div className=\"space-y-3\">\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n {diff.label} <span className=\"normal-case font-normal\">(original)</span>\n </p>\n <pre className=\"text-xs text-text-tertiary font-mono whitespace-pre-wrap leading-relaxed\">\n {typeof diff.original === 'object' ? JSON.stringify(diff.original, null, 2) : String(diff.original)}\n </pre>\n </div>\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n {diff.label} <span className=\"normal-case font-normal text-status-success\">(corrected)</span>\n </p>\n <pre className=\"text-xs text-text-primary font-mono whitespace-pre-wrap leading-relaxed\">\n {typeof diff.corrected === 'object' ? JSON.stringify(diff.corrected, null, 2) : String(diff.corrected)}\n </pre>\n </div>\n </div>\n );\n}\n\n/** Render a value as a string if it's a primitive, null otherwise */\nfunction renderValue(val: unknown): string | null {\n if (val === null || val === undefined) return 'null';\n if (typeof val === 'string') return val;\n if (typeof val === 'number' || typeof val === 'boolean') return String(val);\n return null;\n}\n","import { useState, useCallback } from 'react';\nimport { CountdownTimer } from '../../../components/common/display/CountdownTimer';\nimport { UserName } from '../../../components/common/display/UserName';\nimport { CustomDurationPicker } from '../../../components/common/form/CustomDurationPicker';\nimport { useClaimDurations } from '../../../hooks/useClaimDurations';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type ActionBarMode =\n | 'available' // unclaimed — show claim controls\n | 'claimed_by_me' // I own it — show resolve/escalate/release\n | 'claimed_by_other'// someone else has it\n | 'terminal'; // resolved or cancelled — nothing to do\n\nexport type ActiveView = 'resolve' | 'escalate' | 'release';\n\nexport interface EscalationActionBarProps {\n mode: ActionBarMode;\n // Active view (controlled by parent)\n activeView: ActiveView;\n onActiveViewChange: (view: ActiveView) => void;\n // Claim\n onClaim: (minutes: number) => void;\n claimPending: boolean;\n // Resolve — JSON lives in viewport, bar reads it for submit\n workflowType: string | null;\n json: string;\n onResolve: (payload: Record<string, unknown>) => void;\n resolvePending: boolean;\n resolveError: Error | null;\n // Triage (controlled by parent — callout + overlay render in page body)\n requestTriage: boolean;\n triageNotes: string;\n // Escalate\n currentRole: string;\n escalationTargets: string[];\n onEscalate: (role: string) => void;\n escalatePending: boolean;\n escalateError: Error | null;\n // Release\n onRelease: () => void;\n releasePending: boolean;\n // Other user\n assignedTo?: string | null;\n assignedUntil?: string | null;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function EscalationActionBar(props: EscalationActionBarProps) {\n const {\n mode, activeView, onActiveViewChange,\n onClaim, claimPending,\n workflowType, json, onResolve, resolvePending, resolveError,\n requestTriage, triageNotes,\n currentRole, escalationTargets, onEscalate, escalatePending, escalateError,\n onRelease, releasePending,\n assignedTo, assignedUntil,\n } = props;\n\n const claimDurations = useClaimDurations();\n const [duration, setDuration] = useState('30');\n const [customMinutes, setCustomMinutes] = useState(0);\n const [parseError, setParseError] = useState('');\n const [escalateTarget, setEscalateTarget] = useState('');\n\n const isCustom = duration === 'custom';\n const onCustomChange = useCallback((m: number) => setCustomMinutes(m), []);\n\n if (mode === 'terminal') return null;\n\n const handleClaim = () => {\n const minutes = isCustom ? customMinutes : parseInt(duration);\n if (!minutes || minutes <= 0) return;\n onClaim(minutes);\n };\n\n const handleSubmitResolve = () => {\n setParseError('');\n\n // When triage is requested, ignore the form payload entirely.\n // Only the triage flag and notes matter — the form data (e.g.\n // approved: true) must NOT leak through, as it would confuse\n // the triage workflow into thinking the issue is already resolved.\n if (requestTriage) {\n const payload: Record<string, unknown> = {\n _lt: { needsTriage: true },\n };\n if (triageNotes.trim()) payload.notes = triageNotes.trim();\n onResolve(payload);\n return;\n }\n\n let payload: Record<string, unknown>;\n try {\n payload = JSON.parse(json);\n } catch {\n setParseError('Invalid JSON');\n return;\n }\n onResolve(payload);\n };\n\n const tabClass = (active: boolean) =>\n `text-xs transition-colors ${active ? 'text-accent font-medium' : 'text-text-tertiary hover:text-accent'}`;\n\n return (\n <div className=\"sticky h-[80px] bg-surface/95 backdrop-blur-sm border-t border-surface-border -mx-10 px-10 pt-3 pb-5 z-10\" style={{ bottom: 'calc(var(--feed-height, 0px) - 8px)' }} data-testid=\"escalation-action-bar\">\n\n {/* ── Available: claim ── */}\n {mode === 'available' && (\n <div data-testid=\"claim-bar\">\n {/* Duration tab row */}\n <div className=\"flex items-center gap-4 mb-2\">\n {claimDurations.map((opt) => (\n <button\n key={opt.value}\n onClick={() => { setDuration(opt.value); setCustomMinutes(0); }}\n className={tabClass(!isCustom && duration === opt.value)}\n >\n {opt.label}\n </button>\n ))}\n <button\n onClick={() => setDuration('custom')}\n className={tabClass(isCustom)}\n >\n Other\n </button>\n </div>\n {/* Action row — right-aligned */}\n <div className=\"flex items-center gap-3\">\n <div className=\"flex-1\" />\n {isCustom && (\n <CustomDurationPicker onChange={onCustomChange} compact autoFocus />\n )}\n <button\n onClick={handleClaim}\n disabled={claimPending || (isCustom && customMinutes <= 0)}\n className=\"btn-primary text-xs\"\n >\n {claimPending ? 'Claiming...' : 'Claim'}\n </button>\n </div>\n </div>\n )}\n\n {/* ── Claimed by other ── */}\n {mode === 'claimed_by_other' && (\n <div className=\"flex items-center gap-4\" data-testid=\"claimed-other-bar\">\n <p className=\"text-sm text-text-secondary\">\n Claimed by <span className=\"font-medium text-text-primary\">{assignedTo ? <UserName userId={assignedTo} /> : 'unknown'}</span>\n </p>\n {assignedUntil && <CountdownTimer until={assignedUntil} />}\n </div>\n )}\n\n {/* ── Claimed by me ── */}\n {mode === 'claimed_by_me' && (\n <div data-testid=\"action-bar\">\n {/* Tab row */}\n <div className=\"flex items-center gap-4 mb-2\">\n <button\n onClick={() => onActiveViewChange('resolve')}\n className={tabClass(activeView === 'resolve')}\n >\n {workflowType ? 'Resolve' : 'Acknowledge'}\n </button>\n {escalationTargets.length > 0 && (\n <button\n onClick={() => onActiveViewChange('escalate')}\n className={tabClass(activeView === 'escalate')}\n >\n Escalate\n </button>\n )}\n <button\n onClick={() => onActiveViewChange('release')}\n className={`text-xs transition-colors ${activeView === 'release' ? 'text-status-error font-medium' : 'text-text-tertiary hover:text-status-error'}`}\n >\n Release\n </button>\n </div>\n\n {/* ── Resolve controls ── */}\n {activeView === 'resolve' && (\n workflowType ? (\n <div className=\"flex items-center gap-4\">\n <div className=\"flex-1\" />\n\n {parseError && <span className=\"text-xs text-status-error\">{parseError}</span>}\n {resolveError && <span className=\"text-xs text-status-error\">{resolveError.message}</span>}\n\n <button\n onClick={handleSubmitResolve}\n disabled={resolvePending}\n className=\"btn-primary text-xs\"\n >\n {resolvePending ? 'Submitting...' : requestTriage ? 'Send to Triage' : 'Submit'}\n </button>\n </div>\n ) : (\n <div className=\"flex items-center\">\n <span className=\"text-xs text-text-secondary\">Notification — acknowledge to resolve</span>\n <div className=\"flex-1\" />\n {resolveError && <span className=\"text-xs text-status-error mr-3\">{resolveError.message}</span>}\n <button\n onClick={() => onResolve({ acknowledged: true })}\n disabled={resolvePending}\n className=\"btn-primary text-xs\"\n >\n {resolvePending ? 'Acknowledging...' : 'Acknowledge'}\n </button>\n </div>\n )\n )}\n\n {/* ── Escalate controls ── */}\n {activeView === 'escalate' && (\n <div className=\"flex items-center gap-3\">\n <span className=\"text-xs text-text-secondary\">\n From <span className=\"font-medium text-text-primary\">{currentRole}</span> to\n </span>\n <select\n value={escalateTarget}\n onChange={(e) => setEscalateTarget(e.target.value)}\n className=\"select text-xs\"\n data-testid=\"escalate-select\"\n >\n <option value=\"\">Select role...</option>\n {escalationTargets.map((role) => (\n <option key={role} value={role}>{role}</option>\n ))}\n </select>\n <div className=\"flex-1\" />\n {escalateError && <span className=\"text-xs text-status-error\">{escalateError.message}</span>}\n <button\n onClick={() => onEscalate(escalateTarget)}\n disabled={!escalateTarget || escalatePending}\n className=\"btn-primary text-xs\"\n >\n {escalatePending ? 'Escalating...' : 'Escalate'}\n </button>\n </div>\n )}\n\n {/* ── Release controls ── */}\n {activeView === 'release' && (\n <div className=\"flex items-center gap-3\">\n <span className=\"text-xs text-text-secondary\">Release back to pool?</span>\n <div className=\"flex-1\" />\n <button onClick={() => onActiveViewChange('resolve')} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={onRelease}\n disabled={releasePending}\n className=\"btn-primary text-xs bg-status-error hover:bg-status-error/80\"\n >\n {releasePending ? 'Releasing...' : 'Yes, Release'}\n </button>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n","import { useState } from 'react';\nimport { Bell, User } from 'lucide-react';\nimport { StatusBadge } from '../../../components/common/display/StatusBadge';\nimport { RolePill } from '../../../components/common/display/RolePill';\nimport { CountdownTimer } from '../../../components/common/display/CountdownTimer';\nimport { Collapsible } from '../../../components/common/layout/Collapsible';\nimport { TimeAgo } from '../../../components/common/display/TimeAgo';\nimport { CopyableId } from '../../../components/common/display/CopyableId';\nimport { UserName } from '../../../components/common/display/UserName';\nimport { isAckEscalation } from '../../../lib/escalation';\nimport type { LTEscalationRecord } from '../../../api/types';\n\nexport function EscalationHero({\n esc,\n claimedByMe: _claimedByMe,\n claimed,\n isTerminal,\n traceUrl,\n}: {\n esc: LTEscalationRecord;\n claimedByMe: boolean;\n claimed: boolean;\n isTerminal: boolean;\n traceUrl: string | null;\n}) {\n const [showDetails, setShowDetails] = useState(false);\n const isAck = isAckEscalation(esc);\n\n return (\n <>\n {/* Title */}\n <div className=\"flex items-center gap-3 mb-2\">\n {isAck && <Bell className=\"w-5 h-5 text-text-tertiary shrink-0\" />}\n <p className=\"text-[1.5rem] leading-snug font-light text-text-secondary\">\n {esc.type}{esc.subtype ? ` / ${esc.subtype}` : ''}\n </p>\n </div>\n\n {/* Description */}\n {esc.description && (\n <p className=\"text-sm leading-relaxed text-text-tertiary mb-4\">\n {esc.description}\n </p>\n )}\n\n {/* Meta bar — labeled sections, baseline-aligned values */}\n <div className=\"flex flex-wrap items-end gap-x-6 gap-y-3 mt-4 mb-2\">\n {/* Status */}\n <div>\n <p className=\"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1.5\">Status</p>\n <span className=\"mb-1 inline-block\"><StatusBadge status={esc.status} /></span>\n </div>\n\n {/* Role */}\n <div>\n <p className=\"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1.5\">Role</p>\n <RolePill role={esc.role} size=\"md\" />\n </div>\n\n {/* Created */}\n <div>\n <p className=\"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1.5\">Created</p>\n <span className=\"inline-flex items-center mb-1 text-xs text-text-secondary\">\n <TimeAgo date={esc.created_at} />\n </span>\n </div>\n\n {/* Claimed by */}\n {esc.assigned_to && (\n <div>\n <p className=\"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1.5\">Claimed by</p>\n <span className=\"inline-flex items-center gap-1.5 text-xs font-medium text-text-primary\">\n <User className=\"w-3 h-3 shrink-0 text-accent/75\" />\n <UserName userId={esc.assigned_to} />\n </span>\n </div>\n )}\n\n {/* Time left */}\n {claimed && !isTerminal && esc.assigned_until && (\n <div>\n <p className=\"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1.5\">Time left</p>\n <span className=\"inline-flex items-center h-5\"><CountdownTimer until={esc.assigned_until} /></span>\n </div>\n )}\n\n {/* Resolved */}\n {esc.resolved_at && (\n <div>\n <p className=\"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1.5\">Resolved</p>\n <span className=\"inline-flex items-center h-5 text-xs text-text-secondary\">\n <TimeAgo date={esc.resolved_at} />\n </span>\n </div>\n )}\n\n {/* Details toggle */}\n <div>\n <button\n onClick={() => setShowDetails(!showDetails)}\n className=\"inline-flex items-center gap-1 h-5 text-xs text-text-tertiary hover:text-accent transition-colors\"\n >\n Details\n <svg\n className={`w-3 h-3 transition-transform duration-200 ${showDetails ? 'rotate-180' : ''}`}\n fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n </div>\n </div>\n\n <Collapsible open={showDetails}>\n <div className=\"mt-4 bg-surface-raised border border-surface-border rounded-md p-4 flex flex-wrap gap-x-8 gap-y-4\">\n <div className=\"text-left\">\n <span className=\"text-[11px] font-medium text-text-secondary uppercase tracking-wide\">Priority</span>\n <p className=\"text-[12px] text-text-primary mt-0.5\">P{esc.priority}</p>\n </div>\n <CopyableId label=\"Escalation ID\" value={esc.id} />\n {esc.task_id && (\n <CopyableId label=\"Task\" value={esc.task_id} href={`/workflows/tasks/detail/${esc.task_id}`} />\n )}\n <CopyableId label=\"Workflow\" value={esc.workflow_type} />\n <CopyableId label=\"Workflow ID\" value={esc.workflow_id} />\n <CopyableId label=\"Task Queue\" value={esc.task_queue} />\n {esc.origin_id && esc.origin_id !== esc.workflow_id && (\n <CopyableId label=\"Origin\" value={esc.origin_id} />\n )}\n {esc.trace_id && (\n <CopyableId\n label=\"Trace\"\n value={esc.trace_id}\n href={traceUrl ? traceUrl.replace('{traceId}', esc.trace_id) : undefined}\n external\n />\n )}\n </div>\n </Collapsible>\n </>\n );\n}\n","import { useState, useEffect, useCallback } from 'react';\n\ntype JsonValue = string | number | boolean | null | JsonValue[] | { [key: string]: JsonValue };\n\n/**\n * Renders a JSON object as an editable form with typed inputs.\n *\n * - Strings → text input (textarea if > 80 chars)\n * - Booleans → toggle switch\n * - Numbers → number input\n * - Null → disabled placeholder\n * - Objects → nested section\n * - Arrays of strings → tag display\n * - Keys starting with `_` → hidden (preserved in output)\n *\n * Calls `onChange` with the full JSON string on every edit.\n */\nexport function ResolverForm({ value, onChange }: {\n value: string;\n onChange: (json: string) => void;\n}) {\n const [data, setData] = useState<Record<string, JsonValue>>({});\n const [hidden, setHidden] = useState<Record<string, JsonValue>>({});\n const [formSchema, setFormSchema] = useState<Record<string, any> | null>(null);\n const [parseError, setParseError] = useState(false);\n\n // Parse incoming JSON\n useEffect(() => {\n try {\n const parsed = JSON.parse(value);\n if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {\n const visible: Record<string, JsonValue> = {};\n const internal: Record<string, JsonValue> = {};\n for (const [k, v] of Object.entries(parsed)) {\n if (k.startsWith('_')) {\n internal[k] = v as JsonValue;\n } else {\n visible[k] = v as JsonValue;\n }\n }\n setData(visible);\n setHidden(internal);\n setFormSchema(\n internal._form_schema && typeof internal._form_schema === 'object'\n ? internal._form_schema as Record<string, any>\n : null,\n );\n setParseError(false);\n }\n } catch {\n setParseError(true);\n }\n }, [value]);\n\n const emitChange = useCallback((updated: Record<string, JsonValue>) => {\n setData(updated);\n onChange(JSON.stringify({ ...updated, ...hidden }, null, 2));\n }, [hidden, onChange]);\n\n const updateField = useCallback((key: string, val: JsonValue) => {\n emitChange({ ...data, [key]: val });\n }, [data, emitChange]);\n\n if (parseError) {\n return (\n <p className=\"text-xs text-status-error\">\n Unable to parse resolver data as form. Use the JSON editor below.\n </p>\n );\n }\n\n const entries = Object.entries(data);\n if (entries.length === 0) {\n return (\n <p className=\"text-xs text-text-tertiary italic\">\n No resolver fields defined.\n </p>\n );\n }\n\n return (\n <div className=\"space-y-4\">\n {entries.map(([key, val]) => (\n <FieldRow\n key={key}\n fieldKey={key}\n value={val}\n onChange={(v) => updateField(key, v)}\n schema={formSchema}\n />\n ))}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Field row — renders appropriate input per type\n// ---------------------------------------------------------------------------\n\nfunction FieldRow({ fieldKey, value, onChange, schema }: {\n fieldKey: string;\n value: JsonValue;\n onChange: (v: JsonValue) => void;\n schema?: Record<string, any> | null;\n}) {\n const label = fieldKey.replace(/[_-]/g, ' ');\n const fieldSchema = schema?.properties?.[fieldKey] as Record<string, any> | undefined;\n\n // Boolean → checkbox\n if (typeof value === 'boolean') {\n return (\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={value}\n onChange={(e) => onChange(e.target.checked)}\n className=\"w-3.5 h-3.5 rounded accent-accent\"\n />\n <span className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n {label}\n </span>\n </label>\n );\n }\n\n // Number\n if (typeof value === 'number') {\n return (\n <div>\n <FieldLabel>{label}</FieldLabel>\n <input\n type=\"number\"\n value={value}\n onChange={(e) => onChange(parseFloat(e.target.value) || 0)}\n step=\"any\"\n className=\"input text-sm w-full mt-1\"\n />\n </div>\n );\n }\n\n // String\n if (typeof value === 'string') {\n const isPassword = fieldSchema?.format === 'password';\n const enumValues = fieldSchema?.enum as string[] | undefined;\n const helperText = fieldSchema?.description as string | undefined;\n\n if (enumValues?.length) {\n return (\n <div>\n <FieldLabel>{label}</FieldLabel>\n {helperText && <p className=\"text-[10px] text-text-tertiary mt-0.5\">{helperText}</p>}\n <select\n value={value}\n onChange={(e) => onChange(e.target.value)}\n className=\"input text-sm w-full mt-1\"\n >\n {enumValues.map((opt) => (\n <option key={opt} value={opt}>{opt}</option>\n ))}\n </select>\n </div>\n );\n }\n\n if (isPassword) {\n return (\n <div>\n <FieldLabel>{label}</FieldLabel>\n {helperText && <p className=\"text-[10px] text-text-tertiary mt-0.5\">{helperText}</p>}\n <input\n type=\"password\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n className=\"input text-sm w-full mt-1\"\n autoComplete=\"off\"\n />\n </div>\n );\n }\n\n if (value.length > 80) {\n return (\n <div>\n <FieldLabel>{label}</FieldLabel>\n {helperText && <p className=\"text-[10px] text-text-tertiary mt-0.5\">{helperText}</p>}\n <textarea\n value={value}\n onChange={(e) => onChange(e.target.value)}\n className=\"input text-sm w-full mt-1 leading-relaxed\"\n rows={Math.min(6, Math.ceil(value.length / 60))}\n />\n </div>\n );\n }\n return (\n <div>\n <FieldLabel>{label}</FieldLabel>\n {helperText && <p className=\"text-[10px] text-text-tertiary mt-0.5\">{helperText}</p>}\n <input\n type=\"text\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n className=\"input text-sm w-full mt-1\"\n />\n </div>\n );\n }\n\n // Null\n if (value === null) {\n return (\n <div>\n <FieldLabel>{label}</FieldLabel>\n <p className=\"text-xs text-text-tertiary italic mt-1\">null</p>\n </div>\n );\n }\n\n // Array of primitives\n if (Array.isArray(value)) {\n return (\n <div>\n <FieldLabel>{label}</FieldLabel>\n <div className=\"flex flex-wrap gap-1.5 mt-1\">\n {value.map((item, i) => (\n <span\n key={i}\n className=\"px-2 py-0.5 text-[11px] font-mono bg-surface-sunken rounded text-text-secondary\"\n >\n {String(item)}\n </span>\n ))}\n </div>\n </div>\n );\n }\n\n // Nested object → recursive\n if (typeof value === 'object') {\n const entries = Object.entries(value);\n return (\n <div>\n <FieldLabel>{label}</FieldLabel>\n <div className=\"ml-4 mt-2 pl-4 border-l border-accent-faint space-y-3\">\n {entries.map(([k, v]) => (\n <FieldRow\n key={k}\n fieldKey={k}\n value={v}\n onChange={(updated) => onChange({ ...value, [k]: updated })}\n />\n ))}\n </div>\n </div>\n );\n }\n\n return null;\n}\n\nfunction FieldLabel({ children }: { children: React.ReactNode }) {\n return (\n <label className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n {children}\n </label>\n );\n}\n","import { useState } from 'react';\nimport { ResolverForm } from '../../../components/escalation/ResolverForm';\n\nexport function ResolverSection({\n json,\n onJsonChange,\n requestTriage,\n onRequestTriageChange,\n triageNotes,\n onTriageNotesChange,\n}: {\n json: string;\n onJsonChange: (v: string) => void;\n requestTriage: boolean;\n onRequestTriageChange: (v: boolean) => void;\n triageNotes: string;\n onTriageNotesChange: (v: string) => void;\n}) {\n const [resolverView, setResolverView] = useState<'form' | 'json'>('form');\n\n return (\n <>\n {/* Toolbar row: form/JSON toggle + triage callout */}\n <div className=\"flex items-center justify-between mb-3\">\n {requestTriage ? (\n <button\n onClick={() => onRequestTriageChange(false)}\n className=\"group flex items-center gap-2 text-left\"\n data-testid=\"triage-cancel\"\n >\n <span className=\"flex items-center justify-center w-5 h-5 rounded-full bg-accent/10 text-accent shrink-0\">\n <svg className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </span>\n <span className=\"text-xs text-text-secondary group-hover:text-text-primary transition-colors\">\n AI Triage active.{' '}\n <span className=\"text-accent group-hover:underline\">Cancel</span>\n </span>\n </button>\n ) : (\n <button\n onClick={() => onRequestTriageChange(true)}\n className=\"group flex items-center gap-2.5 text-left my-4\"\n data-testid=\"triage-callout\"\n >\n <span className=\"flex items-center justify-center w-6 h-6 rounded-full bg-accent/10 text-accent shrink-0 animate-[triage-glow_6s_ease-in-out_infinite]\">\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9.663 17h4.674M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z\" />\n </svg>\n </span>\n <span className=\"text-[13px] text-text-secondary group-hover:text-text-primary transition-colors\">\n This form doesn't capture the issue?{' '}\n <span className=\"text-accent group-hover:underline\">Request AI Triage</span>\n </span>\n </button>\n )}\n\n {!requestTriage && (\n <button\n onClick={() => setResolverView(resolverView === 'form' ? 'json' : 'form')}\n className=\"text-[10px] text-text-tertiary hover:text-accent transition-colors\"\n >\n {resolverView === 'form' ? 'Raw JSON' : 'Form'}\n </button>\n )}\n </div>\n\n <div className=\"relative min-h-[200px]\">\n {/* Form controls */}\n <div className={requestTriage ? 'pointer-events-none select-none' : ''}>\n {resolverView === 'form' ? (\n <ResolverForm value={json} onChange={onJsonChange} />\n ) : (\n <textarea\n value={json}\n onChange={(e) => onJsonChange(e.target.value)}\n className=\"input font-mono text-xs w-full\"\n rows={8}\n spellCheck={false}\n data-testid=\"resolve-json\"\n />\n )}\n </div>\n\n {/* Triage overlay — occludes the form when AI Triage is checked */}\n {requestTriage && (\n <div\n className=\"absolute inset-0 z-10 flex flex-col bg-surface/90 backdrop-blur-[2px] rounded-md border border-accent/20 p-5\"\n data-testid=\"triage-overlay\"\n >\n <p className=\"text-xs text-text-secondary mb-3 leading-relaxed\">\n The resolution form will not be submitted. Describe the issue\n so AI triage can diagnose and fix it using available tools.\n The corrected result will come back as a new escalation for\n your review.\n </p>\n <textarea\n value={triageNotes}\n onChange={(e) => onTriageNotesChange(e.target.value)}\n placeholder=\"e.g. Content is in Spanish — needs translation to English before review...\"\n className=\"input text-xs w-full flex-1 min-h-[80px] resize-none\"\n autoFocus\n data-testid=\"triage-notes\"\n />\n </div>\n )}\n </div>\n </>\n );\n}\n","import { useState, useEffect } from 'react';\nimport { useParams, useNavigate, useLocation, Link } from 'react-router-dom';\nimport { KeyRound } from 'lucide-react';\nimport { useAuth } from '../../../hooks/useAuth';\nimport {\n useEscalation,\n useClaimEscalation,\n useResolveEscalation,\n useEscalateToRole,\n} from '../../../api/escalations';\nimport { useEscalationTargets } from '../../../api/roles';\nimport { JsonViewer } from '../../../components/common/data/JsonViewer';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { CollapsibleSection } from '../../../components/common/layout/CollapsibleSection';\nimport { isEffectivelyClaimed } from '../../../lib/escalation';\nimport { useWorkflowConfigs } from '../../../api/workflows';\nimport { useSettings } from '../../../api/settings';\nimport { useEscalationDetailEvents } from '../../../hooks/useNatsEvents';\nimport { RoundsExhaustedContext } from '../../../components/escalation/RoundsExhaustedContext';\nimport { TriageContext } from '../../../components/escalation/TriageContext';\nimport { EscalationActionBar } from './EscalationActionBar';\nimport { EscalationHero } from './EscalationHero';\nimport { ResolverSection } from './ResolverSection';\nimport type { ActionBarMode, ActiveView } from './EscalationActionBar';\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction safeParse(value: string | null | undefined): unknown {\n if (!value) return null;\n try {\n return JSON.parse(value);\n } catch {\n return value;\n }\n}\n\nfunction hasTriageData(payload: string | null | undefined): boolean {\n if (!payload) return false;\n try {\n const p = JSON.parse(payload);\n return !!(p && typeof p === 'object' && p._triage);\n } catch { return false; }\n}\n\n// ---------------------------------------------------------------------------\n// Main page\n// ---------------------------------------------------------------------------\n\nexport function EscalationDetailPage() {\n const { id } = useParams<{ id: string }>();\n const { user } = useAuth();\n const navigate = useNavigate();\n const location = useLocation();\n const { data: esc, isLoading } = useEscalation(id!);\n useEscalationDetailEvents(id);\n const claim = useClaimEscalation();\n const resolve = useResolveEscalation();\n const escalate = useEscalateToRole();\n const { data: escalationTargets } = useEscalationTargets(esc?.role ?? '');\n const { data: workflowConfigs } = useWorkflowConfigs();\n const { data: settings } = useSettings();\n\n const wfConfig = workflowConfigs?.find((c) => c.workflow_type === esc?.workflow_type);\n const traceUrl = settings?.telemetry?.traceUrl ?? null;\n const returnPath = (location.state as { from?: string } | null)?.from ?? '/escalations/available';\n const [activeView, setActiveView] = useState<ActiveView>('resolve');\n const [json, setJson] = useState('{}');\n\n // Section collapse state\n const [collapsed, setCollapsed] = useState<Record<string, boolean>>({ context: false });\n const toggleSection = (key: string) =>\n setCollapsed((prev) => ({ ...prev, [key]: !prev[key] }));\n\n const [requestTriage, setRequestTriage] = useState(false);\n const [triageNotes, setTriageNotes] = useState('');\n const resolverSchema = wfConfig?.resolver_schema ?? null;\n const metadataFormSchema = (esc?.metadata as any)?.form_schema ?? null;\n const effectiveSchema = metadataFormSchema ?? resolverSchema;\n useEffect(() => {\n if (metadataFormSchema) {\n // waitFor escalation: build initial form from form_schema and include _form_schema for ResolverForm\n const initial: Record<string, any> = { _form_schema: metadataFormSchema };\n const props = metadataFormSchema.properties;\n if (props && typeof props === 'object') {\n for (const [key, def] of Object.entries(props)) {\n const fieldDef = def as Record<string, any>;\n initial[key] = fieldDef.default ?? '';\n }\n }\n setJson(JSON.stringify(initial, null, 2));\n } else {\n setJson(effectiveSchema ? JSON.stringify(effectiveSchema, null, 2) : '{}');\n }\n }, [effectiveSchema, metadataFormSchema]);\n\n // When triage or rounds-exhausted data is present, collapse Input/Output so structured context is central\n const hasTriage = hasTriageData(esc?.escalation_payload);\n const isRoundsExhausted = esc?.subtype === 'rounds_exhausted';\n const isWaitForHuman = esc?.subtype === 'wait_for_human';\n useEffect(() => {\n if (hasTriage || isRoundsExhausted) {\n setCollapsed((prev) => ({ ...prev, context: true }));\n }\n // waitFor escalations: auto-expand resolver, collapse context\n if (isWaitForHuman && metadataFormSchema) {\n setCollapsed((prev) => ({ ...prev, context: true, resolver: false }));\n }\n }, [hasTriage, isRoundsExhausted, isWaitForHuman, metadataFormSchema]);\n\n if (isLoading) {\n return (\n <div className=\"animate-pulse space-y-8\">\n <div className=\"h-8 bg-surface-sunken rounded w-64\" />\n <div className=\"h-32 bg-surface-sunken rounded w-full\" />\n </div>\n );\n }\n\n if (!esc) {\n return <p className=\"text-sm text-text-secondary\">Escalation not found.</p>;\n }\n\n const claimed = isEffectivelyClaimed(esc);\n const claimedByMe = claimed && esc.assigned_to === user?.userId;\n const claimedByOther = claimed && !claimedByMe;\n const isTerminal = esc.status === 'resolved' || esc.status === 'cancelled';\n\n const escalationPayload = safeParse(esc.escalation_payload);\n const resolverPayload = safeParse(esc.resolver_payload);\n\n // Detect triage context in escalation payload\n const payloadObj = (typeof escalationPayload === 'object' && escalationPayload !== null && !Array.isArray(escalationPayload))\n ? escalationPayload as Record<string, unknown>\n : null;\n const triageData = payloadObj?._triage as Record<string, unknown> | undefined;\n\n // Derive action bar mode\n const actionBarMode: ActionBarMode = isTerminal\n ? 'terminal'\n : claimedByMe\n ? 'claimed_by_me'\n : claimedByOther\n ? 'claimed_by_other'\n : 'available';\n\n const handleClaim = (durationMinutes: number) => {\n claim.mutate({ id: esc.id, durationMinutes });\n setCollapsed({ context: true, triage: true, resolver: false });\n };\n\n const handleResolve = async (payload: Record<string, unknown>) => {\n const result = await resolve.mutateAsync({ id: esc.id, resolverPayload: payload }) as any;\n if (result?.signaled && result?.workflowId) {\n navigate(`/workflows/executions/${result.workflowId}`);\n } else if (result?.triage && result?.workflowId) {\n navigate(`/workflows/executions/${result.workflowId}`);\n } else {\n navigate(returnPath);\n }\n };\n\n const handleEscalate = async (targetRole: string) => {\n if (!targetRole) return;\n await escalate.mutateAsync({ id: esc.id, targetRole });\n navigate(returnPath);\n };\n\n const handleRetryTriage = async () => {\n if (!claimedByMe) {\n await claim.mutateAsync({ id: esc.id, durationMinutes: 30 });\n }\n const diagnosis = (payloadObj?.diagnosis as string) || esc.description || '';\n const result = await resolve.mutateAsync({\n id: esc.id,\n resolverPayload: { _lt: { needsTriage: true }, notes: diagnosis },\n }) as any;\n if (result?.triage && result?.workflowId) {\n navigate(`/workflows/executions/${result.workflowId}`);\n } else {\n navigate(returnPath);\n }\n };\n\n const handleRelease = async () => {\n await claim.mutateAsync({ id: esc.id, durationMinutes: 0 });\n navigate(returnPath);\n };\n\n return (\n <div className=\"min-h-[calc(100vh-9rem)] flex flex-col\">\n <PageHeader title=\"Escalation\" />\n\n <EscalationHero\n esc={esc}\n claimedByMe={claimedByMe}\n claimed={claimed}\n isTerminal={isTerminal}\n traceUrl={traceUrl}\n />\n\n {/* Rounds-exhausted structured context */}\n {isRoundsExhausted && payloadObj && (\n <div className=\"mt-8\">\n <RoundsExhaustedContext\n payload={payloadObj}\n isTerminal={isTerminal}\n resolverPayload={resolverPayload as Record<string, unknown> | null}\n onRetryTriage={handleRetryTriage}\n isRetrying={claim.isPending || resolve.isPending}\n />\n </div>\n )}\n\n {/* Missing credential context */}\n {payloadObj?.category === 'missing_credential' && (\n <div className=\"mt-8 bg-status-warning/10 border border-status-warning/30 rounded-md px-5 py-4 flex items-start gap-3\">\n <KeyRound size={20} className=\"text-status-warning mt-0.5 shrink-0\" />\n <div>\n <p className=\"text-sm font-medium text-text-primary mb-1\">Missing Credential</p>\n <p className=\"text-xs text-text-secondary mb-3\">\n This workflow requires a <span className=\"font-medium capitalize\">{String(payloadObj.provider)}</span> credential\n to continue. Register one and then resolve this escalation to retry.\n </p>\n <Link\n to=\"/credentials\"\n className=\"btn-primary text-xs inline-flex items-center gap-1.5\"\n >\n <KeyRound size={12} />\n Go to Credentials\n </Link>\n </div>\n </div>\n )}\n\n {/* Collapsible sections */}\n <div className=\"mt-8 space-y-6\">\n\n {/* Input/Output */}\n <CollapsibleSection\n title=\"Input / Output\"\n sectionKey=\"context\"\n isCollapsed={collapsed.context ?? true}\n onToggle={toggleSection}\n contentClassName=\"mt-4 ml-9\"\n >\n <div className=\"space-y-6\">\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n {esc.envelope && (\n <div>\n <JsonViewer data={esc.envelope} label=\"Input Envelope\" />\n </div>\n )}\n {escalationPayload != null && (\n <div>\n <JsonViewer data={escalationPayload} label=\"Escalation Context\" />\n </div>\n )}\n </div>\n\n {resolverPayload != null && (\n <div className=\"max-w-xl\">\n <JsonViewer data={resolverPayload} label=\"Resolver Payload\" />\n </div>\n )}\n </div>\n </CollapsibleSection>\n\n {/* Triage context — only when present */}\n {triageData && payloadObj && (\n <CollapsibleSection\n title=\"AI Triage\"\n sectionKey=\"triage\"\n isCollapsed={!!collapsed.triage}\n onToggle={toggleSection}\n contentClassName=\"mt-4 ml-9\"\n >\n <TriageContext triage={triageData} payload={payloadObj} />\n </CollapsibleSection>\n )}\n\n {/* Resolver form — when claimed and resolving */}\n {!isTerminal && claimedByMe && activeView === 'resolve' && (esc.workflow_type || metadataFormSchema) && (\n <CollapsibleSection\n title=\"Submit Your Resolution\"\n sectionKey=\"resolver\"\n isCollapsed={!!collapsed.resolver}\n onToggle={toggleSection}\n contentClassName=\"mt-4 ml-9\"\n >\n <ResolverSection\n json={json}\n onJsonChange={setJson}\n requestTriage={requestTriage}\n onRequestTriageChange={setRequestTriage}\n triageNotes={triageNotes}\n onTriageNotesChange={setTriageNotes}\n />\n </CollapsibleSection>\n )}\n </div>\n\n <div className=\"flex-1\" />\n\n <EscalationActionBar\n mode={actionBarMode}\n activeView={activeView}\n onActiveViewChange={setActiveView}\n onClaim={handleClaim}\n claimPending={claim.isPending}\n workflowType={esc.workflow_type}\n json={json}\n onResolve={handleResolve}\n resolvePending={resolve.isPending}\n resolveError={resolve.error as Error | null}\n requestTriage={requestTriage}\n triageNotes={triageNotes}\n currentRole={esc.role}\n escalationTargets={escalationTargets?.targets ?? []}\n onEscalate={handleEscalate}\n escalatePending={escalate.isPending}\n escalateError={escalate.error as Error | null}\n onRelease={handleRelease}\n releasePending={claim.isPending}\n assignedTo={esc.assigned_to}\n assignedUntil={esc.assigned_until}\n />\n </div>\n );\n}\n"],"names":["SectionLabel","children","jsx","RoundsExhaustedContext","payload","isTerminal","resolverPayload","onRetryTriage","isRetrying","title","summary","diagnosis","toolCalls","result","ltMeta","wasTriaged","triageWorkflowId","isResolvedByTriage","showResult","setShowResult","useState","jsxs","SimpleMarkdown","Link","JsonViewer","TriageContext","triage","confidence","confidenceColor","diffs","computeDiffs","action","i","diff","DiffRow","original","current","key","origVal","currVal","origStr","renderValue","corrStr","val","EscalationActionBar","props","mode","activeView","onActiveViewChange","onClaim","claimPending","workflowType","json","onResolve","resolvePending","resolveError","requestTriage","triageNotes","currentRole","escalationTargets","onEscalate","escalatePending","escalateError","onRelease","releasePending","assignedTo","assignedUntil","claimDurations","useClaimDurations","duration","setDuration","customMinutes","setCustomMinutes","parseError","setParseError","escalateTarget","setEscalateTarget","isCustom","onCustomChange","useCallback","m","handleClaim","minutes","handleSubmitResolve","tabClass","active","opt","CustomDurationPicker","UserName","CountdownTimer","e","role","EscalationHero","esc","_claimedByMe","claimed","traceUrl","showDetails","setShowDetails","isAck","isAckEscalation","Fragment","Bell","StatusBadge","RolePill","TimeAgo","User","Collapsible","CopyableId","ResolverForm","value","onChange","data","setData","hidden","setHidden","formSchema","setFormSchema","useEffect","parsed","visible","internal","v","emitChange","updated","updateField","entries","FieldRow","fieldKey","schema","label","fieldSchema","_a","FieldLabel","isPassword","enumValues","helperText","item","k","ResolverSection","onJsonChange","onRequestTriageChange","onTriageNotesChange","resolverView","setResolverView","safeParse","hasTriageData","p","EscalationDetailPage","id","useParams","user","useAuth","navigate","useNavigate","location","useLocation","isLoading","useEscalation","useEscalationDetailEvents","claim","useClaimEscalation","resolve","useResolveEscalation","escalate","useEscalateToRole","useEscalationTargets","workflowConfigs","useWorkflowConfigs","settings","useSettings","wfConfig","c","returnPath","_b","setActiveView","setJson","collapsed","setCollapsed","toggleSection","prev","setRequestTriage","setTriageNotes","resolverSchema","metadataFormSchema","_c","effectiveSchema","initial","def","fieldDef","hasTriage","isRoundsExhausted","isWaitForHuman","isEffectivelyClaimed","claimedByMe","claimedByOther","escalationPayload","payloadObj","triageData","actionBarMode","durationMinutes","handleResolve","handleEscalate","targetRole","handleRetryTriage","handleRelease","PageHeader","KeyRound","CollapsibleSection"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as n,j as t}from"./vendor-query-B2UbickB.js";import{h}from"./workflows-Cc4VHcrp.js";import{D as g}from"./DataTable-BDn1WBHS.js";import{F as y,b as j}from"./FilterBar-Ck4K4rzu.js";import{R as q,a as u}from"./RowActions-Dg-Fsm5O.js";import{u as C}from"./useFilterParams-BaXUAkYK.js";import{P as R}from"./PageHeader-CpWFly5S.js";import{T as b}from"./TaskQueuePill-awmtb0qw.js";import{W as v}from"./WorkflowPill-CCDSVaQj.js";import{q as _,v as N,w as I}from"./vendor-icons-ZTAKVwGc.js";import{b as P}from"./vendor-react-Cw8Gy8NJ.js";import"./index-D8VH6K8B.js";import"./EmptyState-2CmV-IaS.js";function G(){const r=P(),{data:c,isLoading:m}=h(),{filters:s,setFilter:i}=C({filters:{search:"",queue:""}}),[a,p]=n.useState(s.search);n.useEffect(()=>{if(a===s.search)return;const e=setTimeout(()=>i("search",a),300);return()=>clearTimeout(e)},[a,i,s.search]);const o=c??[],f=n.useMemo(()=>[...new Set(o.map(e=>e.task_queue).filter(Boolean))].sort(),[o]),k=n.useMemo(()=>{let e=o;if(s.search){const l=s.search.toLowerCase();e=e.filter(w=>w.name.toLowerCase().includes(l))}return s.queue&&(e=e.filter(l=>l.task_queue===s.queue)),e},[o,s]),d=[{key:"name",label:"Workflow",render:e=>t.jsx(v,{type:e.name})},{key:"task_queue",label:"Queue",render:e=>t.jsx(b,{queue:e.task_queue}),className:"whitespace-nowrap"},{key:"registered",label:"Status",render:e=>e.registered?t.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:[t.jsx(_,{className:"w-3 h-3"}),"Certified"]}):t.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:"actions",label:"",render:e=>t.jsx(q,{children:e.registered?t.jsx(u,{icon:N,title:"View config",onClick:()=>r(`/workflows/registry/${encodeURIComponent(e.name)}`)}):t.jsx(u,{icon:I,title:"Register workflow",onClick:()=>r(`/workflows/registry/new?workflow_type=${encodeURIComponent(e.name)}&task_queue=${encodeURIComponent(e.task_queue)}`)})}),className:"w-16 text-right"}],x=e=>{e.registered?r(`/workflows/registry/${encodeURIComponent(e.name)}`):r(`/workflows/registry/new?workflow_type=${encodeURIComponent(e.name)}&task_queue=${encodeURIComponent(e.task_queue)}`)};return t.jsxs("div",{children:[t.jsx(R,{title:"Workers"}),t.jsxs(y,{children:[t.jsx("input",{type:"text",placeholder:"Search workers...",value:a,onChange:e=>p(e.target.value),className:"input text-[11px] py-1 px-2 w-56"}),t.jsx(j,{label:"Queue",value:s.queue,onChange:e=>i("queue",e),options:f.map(e=>({value:e,label:e}))})]}),t.jsx(g,{columns:d,data:k,keyFn:e=>e.name,onRowClick:x,isLoading:m,emptyMessage:"No active workers"})]})}export{G as WorkersPage};
|
|
2
|
+
//# sourceMappingURL=index-DTPzZr_X.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-DTPzZr_X.js","sources":["../../src/pages/workflows/workers/WorkersPage.tsx"],"sourcesContent":["import { useState, useEffect, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { Plus, Eye, ShieldCheck } from 'lucide-react';\nimport { useActiveWorkers } from '../../../api/workflows';\nimport { DataTable, type Column } from '../../../components/common/data/DataTable';\nimport { FilterBar, FilterSelect } from '../../../components/common/data/FilterBar';\nimport { RowAction, RowActionGroup } from '../../../components/common/layout/RowActions';\nimport { useFilterParams } from '../../../hooks/useFilterParams';\nimport type { ActiveWorker } from '../../../api/types';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { TaskQueuePill } from '../../../components/common/display/TaskQueuePill';\nimport { WorkflowPill } from '../../../components/common/display/WorkflowPill';\n\n// ── Page ──────────────────────────────────────────────────────────────────────\n\nexport function WorkersPage() {\n const navigate = useNavigate();\n const { data, isLoading } = useActiveWorkers();\n const { filters, setFilter } = useFilterParams({\n filters: { search: '', queue: '' },\n });\n\n const [searchInput, setSearchInput] = useState(filters.search);\n\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 allWorkers = data ?? [];\n\n const queues = useMemo(\n () => [...new Set(allWorkers.map((w) => w.task_queue).filter(Boolean))].sort(),\n [allWorkers],\n );\n\n const workers = useMemo(() => {\n let result = allWorkers;\n if (filters.search) {\n const q = filters.search.toLowerCase();\n result = result.filter((w) => w.name.toLowerCase().includes(q));\n }\n if (filters.queue) result = result.filter((w) => w.task_queue === filters.queue);\n return result;\n }, [allWorkers, filters]);\n\n const columns: Column<ActiveWorker>[] = [\n {\n key: 'name',\n label: 'Workflow',\n render: (row) => <WorkflowPill type={row.name} />,\n },\n {\n key: 'task_queue',\n label: 'Queue',\n render: (row) => <TaskQueuePill queue={row.task_queue} />,\n className: 'whitespace-nowrap',\n },\n {\n key: 'registered',\n label: 'Status',\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: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n {row.registered ? (\n <RowAction\n icon={Eye}\n title=\"View config\"\n onClick={() => navigate(`/workflows/registry/${encodeURIComponent(row.name)}`)}\n />\n ) : (\n <RowAction\n icon={Plus}\n title=\"Register workflow\"\n onClick={() => navigate(`/workflows/registry/new?workflow_type=${encodeURIComponent(row.name)}&task_queue=${encodeURIComponent(row.task_queue)}`)}\n />\n )}\n </RowActionGroup>\n ),\n className: 'w-16 text-right',\n },\n ];\n\n const handleRowClick = (row: ActiveWorker) => {\n if (row.registered) {\n navigate(`/workflows/registry/${encodeURIComponent(row.name)}`);\n } else {\n navigate(`/workflows/registry/new?workflow_type=${encodeURIComponent(row.name)}&task_queue=${encodeURIComponent(row.task_queue)}`);\n }\n };\n\n return (\n <div>\n <PageHeader title=\"Workers\" />\n\n <FilterBar>\n <input\n type=\"text\"\n placeholder=\"Search workers...\"\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 </FilterBar>\n\n <DataTable\n columns={columns}\n data={workers}\n keyFn={(row) => row.name}\n onRowClick={handleRowClick}\n isLoading={isLoading}\n emptyMessage=\"No active workers\"\n />\n </div>\n );\n}\n"],"names":["WorkersPage","navigate","useNavigate","data","isLoading","useActiveWorkers","filters","setFilter","useFilterParams","searchInput","setSearchInput","useState","useEffect","timer","allWorkers","queues","useMemo","w","workers","result","q","columns","row","WorkflowPill","TaskQueuePill","jsxs","jsx","ShieldCheck","RowActionGroup","RowAction","Eye","Plus","handleRowClick","PageHeader","FilterBar","FilterSelect","v","DataTable"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{c as N,u as k,b as C,a,j as e}from"./vendor-query-B2UbickB.js";import{P}from"./PageHeader-CpWFly5S.js";import{a as g,S as v}from"./index-D8VH6K8B.js";import{M as S}from"./Modal-B4rbIVAn.js";import{R as w}from"./constants-CgaZfe5d.js";import{D as E}from"./DataTable-BDn1WBHS.js";import"./vendor-react-Cw8Gy8NJ.js";import"./vendor-icons-ZTAKVwGc.js";import"./EmptyState-2CmV-IaS.js";function T(){return k({queryKey:["maintenance"],queryFn:()=>g("/config/maintenance")})}function R(){const t=C();return N({mutationFn:c=>g("/config/maintenance",{method:"PUT",body:JSON.stringify(c)}),onSuccess:()=>{t.invalidateQueries({queryKey:["maintenance"]})}})}function J(){return N({mutationFn:t=>g("/dba/prune",{method:"POST",body:JSON.stringify(t)})})}function M(){const t=J(),[c,l]=a.useState("7 days"),[u,m]=a.useState(!0),[i,p]=a.useState(!0),[x,h]=a.useState(!1),[d,j]=a.useState(!1),[r,b]=a.useState(null),[f,o]=a.useState(!1),y=!u&&!i&&!x&&!d,s=()=>{b(null),t.mutate({expire:c,jobs:u,streams:i,attributes:x,pruneTransient:d},{onSuccess:n=>{b(n),o(!1)}})};return e.jsxs("section",{className:"pb-10 mb-10 border-b border-surface-border",children:[e.jsxs("div",{className:"flex items-center justify-between mb-4",children:[e.jsxs("div",{children:[e.jsx(v,{children:"Manual Prune"}),e.jsx("p",{className:"text-xs text-text-secondary mt-1",children:"Immediately prune expired jobs, streams, and execution artifacts."})]}),e.jsx("button",{onClick:()=>o(!0),disabled:y||t.isPending,className:"btn-primary text-xs shrink-0",children:t.isPending?"Pruning...":"Prune Now"})]}),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:"Retention Period"}),e.jsx("select",{value:c,onChange:n=>l(n.target.value),className:"select text-xs w-48",children:w.map(n=>e.jsx("option",{value:n.value,children:n.label},n.value))})]}),e.jsxs("div",{className:"flex flex-wrap gap-6",children:[e.jsxs("label",{className:"flex items-center gap-2 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:u,onChange:n=>m(n.target.checked),className:"w-4 h-4 rounded border-border accent-accent"}),e.jsxs("div",{children:[e.jsx("span",{className:"text-xs text-text-primary",children:"Delete expired jobs"}),e.jsx("p",{className:"text-[10px] text-text-tertiary",children:"Hard-delete job rows past retention"})]})]}),e.jsxs("label",{className:"flex items-center gap-2 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:i,onChange:n=>p(n.target.checked),className:"w-4 h-4 rounded border-border accent-accent"}),e.jsxs("div",{children:[e.jsx("span",{className:"text-xs text-text-primary",children:"Delete expired streams"}),e.jsx("p",{className:"text-[10px] text-text-tertiary",children:"Hard-delete stream messages past retention"})]})]}),e.jsxs("label",{className:"flex items-center gap-2 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:x,onChange:n=>h(n.target.checked),className:"w-4 h-4 rounded border-border accent-accent"}),e.jsxs("div",{children:[e.jsx("span",{className:"text-xs text-text-primary",children:"Strip execution artifacts"}),e.jsx("p",{className:"text-[10px] text-text-tertiary",children:"Remove execution details, keep export data"})]})]}),e.jsxs("label",{className:"flex items-center gap-2 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:d,onChange:n=>j(n.target.checked),className:"w-4 h-4 rounded border-border accent-accent"}),e.jsxs("div",{children:[e.jsx("span",{className:"text-xs text-text-primary",children:"Delete transient jobs"}),e.jsx("p",{className:"text-[10px] text-text-tertiary",children:"Jobs without an entity (orphaned)"})]})]})]}),r&&e.jsxs("div",{className:"bg-surface-sunken rounded-md px-4 py-3",children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-2",children:"Prune Results"}),e.jsxs("div",{className:"grid grid-cols-2 sm:grid-cols-4 gap-3",children:[r.jobs!==void 0&&e.jsxs("div",{children:[e.jsx("p",{className:"text-lg font-light text-text-primary",children:r.jobs}),e.jsx("p",{className:"text-[10px] text-text-tertiary",children:"Jobs deleted"})]}),r.streams!==void 0&&e.jsxs("div",{children:[e.jsx("p",{className:"text-lg font-light text-text-primary",children:r.streams}),e.jsx("p",{className:"text-[10px] text-text-tertiary",children:"Streams deleted"})]}),r.attributes!==void 0&&e.jsxs("div",{children:[e.jsx("p",{className:"text-lg font-light text-text-primary",children:r.attributes}),e.jsx("p",{className:"text-[10px] text-text-tertiary",children:"Artifacts stripped"})]}),r.transient!==void 0&&e.jsxs("div",{children:[e.jsx("p",{className:"text-lg font-light text-text-primary",children:r.transient}),e.jsx("p",{className:"text-[10px] text-text-tertiary",children:"Transient deleted"})]})]})]}),t.error&&e.jsx("p",{className:"text-xs text-status-error",children:t.error.message})]}),e.jsx(S,{open:f,onClose:()=>o(!1),title:"Confirm Prune",children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("p",{className:"text-sm text-text-secondary",children:["This will permanently delete data older than"," ",e.jsx("span",{className:"font-medium text-text-primary",children:c}),". This action cannot be undone."]}),e.jsxs("ul",{className:"text-xs text-text-secondary space-y-1 list-disc list-inside",children:[u&&e.jsx("li",{children:"Delete expired jobs"}),i&&e.jsx("li",{children:"Delete expired streams"}),x&&e.jsx("li",{children:"Strip execution artifacts"}),d&&e.jsx("li",{children:"Delete transient (entity-less) jobs"})]}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsx("button",{onClick:()=>o(!1),className:"btn-secondary text-xs",children:"Cancel"}),e.jsx("button",{onClick:s,className:"bg-status-error text-white px-3 py-1.5 rounded-md text-xs hover:opacity-90 transition-opacity",disabled:t.isPending,children:t.isPending?"Pruning...":"Confirm Prune"})]})]})})]})}function O(){var o,y;const{data:t,isLoading:c}=T(),l=R(),[u,m]=a.useState(!1),[i,p]=a.useState(""),[x,h]=a.useState(""),[d,j]=a.useState(""),r=()=>{t!=null&&t.config?(p(t.config.schedule),h(JSON.stringify(t.config.rules,null,2))):(p("0 2 * * *"),h("[]")),j(""),m(!0)},b=()=>{j("");let s;try{if(s=JSON.parse(x),!Array.isArray(s))throw new Error("Rules must be an array")}catch(n){j(n.message||"Invalid JSON");return}l.mutate({schedule:i,rules:s},{onSuccess:()=>m(!1)})},f=[{key:"target",label:"Target",render:s=>e.jsx("span",{className:"px-2 py-0.5 text-[10px] bg-surface-sunken rounded-full font-mono",children:s.target})},{key:"action",label:"Action",render:s=>e.jsx("span",{className:`text-xs font-medium ${s.action==="delete"?"text-status-error":"text-text-secondary"}`,children:s.action})},{key:"olderThan",label:"Older Than",render:s=>e.jsx("span",{className:"text-xs text-text-secondary",children:s.olderThan})},{key:"filter",label:"Filter",render:s=>{const n=[];return s.hasEntity===!0&&n.push("entity jobs"),s.hasEntity===!1&&n.push("transient"),s.pruned&&n.push("already pruned"),e.jsx("span",{className:"text-xs text-text-tertiary",children:n.length>0?n.join(", "):"—"})}}];return e.jsxs("section",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-4",children:[e.jsxs("div",{children:[e.jsx(v,{children:"Cron Prune"}),e.jsx("p",{className:"text-xs text-text-secondary mt-1",children:"Automated pruning runs on a cron schedule. Rules execute sequentially each cycle."})]}),e.jsx("button",{onClick:r,className:"btn-primary text-xs shrink-0",children:"Edit Rules"})]}),c?e.jsx("div",{className:"animate-pulse h-20 bg-surface-sunken rounded"}):e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-6",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Schedule"}),e.jsx("p",{className:"text-sm font-mono text-text-primary mt-1",children:((o=t==null?void 0:t.config)==null?void 0:o.schedule)??"—"})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Status"}),e.jsx("p",{className:"text-sm mt-1",children:t!=null&&t.active?e.jsx("span",{className:"text-status-success",children:"Active"}):e.jsx("span",{className:"text-text-tertiary",children:"Inactive"})})]})]}),((y=t==null?void 0:t.config)==null?void 0:y.rules)&&t.config.rules.length>0&&e.jsx(E,{columns:f,data:t.config.rules,keyFn:s=>`${s.target}-${s.action}-${s.olderThan}`,emptyMessage:"No rules configured"})]}),e.jsx(S,{open:u,onClose:()=>m(!1),title:"Edit Maintenance Config",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:"Cron Schedule"}),e.jsx("input",{type:"text",value:i,onChange:s=>p(s.target.value),placeholder:"0 2 * * *",className:"input text-xs font-mono w-full"}),e.jsx("p",{className:"text-[10px] text-text-tertiary mt-1",children:'Standard cron expression (e.g., "0 2 * * *" = daily at 2 AM)'})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Rules (JSON)"}),e.jsx("textarea",{value:x,onChange:s=>h(s.target.value),className:"input font-mono text-xs w-full",rows:12,spellCheck:!1}),d&&e.jsx("p",{className:"text-xs text-status-error mt-1",children:d}),e.jsxs("p",{className:"text-[10px] text-text-tertiary mt-1",children:["Each rule: ","{",' target: "streams"|"jobs", action: "delete"|"prune", olderThan: "7 days", hasEntity?: bool, pruned?: bool ',"}"]})]}),l.error&&e.jsx("p",{className:"text-xs text-status-error",children:l.error.message}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsx("button",{onClick:()=>m(!1),className:"btn-secondary text-xs",children:"Cancel"}),e.jsx("button",{onClick:b,disabled:!i.trim()||l.isPending,className:"btn-primary text-xs",children:l.isPending?"Saving...":"Save & Restart"})]})]})})]})}function L(){return e.jsxs("div",{children:[e.jsx(P,{title:"DB Maintenance"}),e.jsx(M,{}),e.jsx(O,{})]})}export{L as MaintenancePage};
|
|
2
|
+
//# sourceMappingURL=index-D_6AB5BE.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-D_6AB5BE.js","sources":["../../src/api/maintenance.ts","../../src/pages/admin/maintenance/PruneSection.tsx","../../src/pages/admin/maintenance/ScheduledMaintenanceSection.tsx","../../src/pages/admin/maintenance/MaintenancePage.tsx"],"sourcesContent":["import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { apiFetch } from './client';\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\nexport interface MaintenanceRule {\n target: 'streams' | 'jobs';\n action: 'delete' | 'prune';\n olderThan: string;\n hasEntity?: boolean;\n pruned?: boolean;\n}\n\nexport interface MaintenanceConfig {\n schedule: string;\n rules: MaintenanceRule[];\n}\n\nexport interface PruneOptions {\n expire?: string;\n jobs?: boolean;\n streams?: boolean;\n attributes?: boolean;\n entities?: string[];\n pruneTransient?: boolean;\n keepHmark?: boolean;\n}\n\nexport interface PruneResult {\n jobs?: number;\n streams?: number;\n attributes?: number;\n transient?: number;\n marked?: number;\n}\n\n// ── Maintenance config ────────────────────────────────────────────────────────\n\nexport function useMaintenanceConfig() {\n return useQuery<{ config: MaintenanceConfig; active: boolean }>({\n queryKey: ['maintenance'],\n queryFn: () => apiFetch('/config/maintenance'),\n });\n}\n\nexport function useUpdateMaintenanceConfig() {\n const queryClient = useQueryClient();\n return useMutation<\n { config: MaintenanceConfig; restarted: boolean },\n Error,\n MaintenanceConfig\n >({\n mutationFn: (config) =>\n apiFetch('/config/maintenance', {\n method: 'PUT',\n body: JSON.stringify(config),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['maintenance'] });\n },\n });\n}\n\n// ── DBA operations ────────────────────────────────────────────────────────────\n\nexport function usePrune() {\n return useMutation<PruneResult, Error, PruneOptions>({\n mutationFn: (options) =>\n apiFetch('/dba/prune', {\n method: 'POST',\n body: JSON.stringify(options),\n }),\n });\n}\n\nexport function useDeploy() {\n return useMutation<{ ok: boolean }, Error, void>({\n mutationFn: () =>\n apiFetch('/dba/deploy', { method: 'POST' }),\n });\n}\n","import { useState } from 'react';\nimport {\n usePrune,\n type PruneResult,\n} from '../../../api/maintenance';\nimport { Modal } from '../../../components/common/modal/Modal';\nimport { SectionLabel } from '../../../components/common/layout/SectionLabel';\nimport { RETENTION_PERIOD_OPTIONS } from '../../../lib/constants';\n\nexport function PruneSection() {\n const prune = usePrune();\n const [expire, setExpire] = useState('7 days');\n const [pruneJobs, setPruneJobs] = useState(true);\n const [pruneStreams, setPruneStreams] = useState(true);\n const [stripAttributes, setStripAttributes] = useState(false);\n const [pruneTransient, setPruneTransient] = useState(false);\n const [result, setResult] = useState<PruneResult | null>(null);\n const [showConfirm, setShowConfirm] = useState(false);\n\n const nothingSelected = !pruneJobs && !pruneStreams && !stripAttributes && !pruneTransient;\n\n const handlePrune = () => {\n setResult(null);\n prune.mutate(\n {\n expire,\n jobs: pruneJobs,\n streams: pruneStreams,\n attributes: stripAttributes,\n pruneTransient,\n },\n {\n onSuccess: (data) => {\n setResult(data);\n setShowConfirm(false);\n },\n },\n );\n };\n\n return (\n <section className=\"pb-10 mb-10 border-b border-surface-border\">\n {/* Header row */}\n <div className=\"flex items-center justify-between mb-4\">\n <div>\n <SectionLabel>Manual Prune</SectionLabel>\n <p className=\"text-xs text-text-secondary mt-1\">\n Immediately prune expired jobs, streams, and execution artifacts.\n </p>\n </div>\n <button\n onClick={() => setShowConfirm(true)}\n disabled={nothingSelected || prune.isPending}\n className=\"btn-primary text-xs shrink-0\"\n >\n {prune.isPending ? 'Pruning...' : 'Prune Now'}\n </button>\n </div>\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 Retention Period\n </label>\n <select\n value={expire}\n onChange={(e) => setExpire(e.target.value)}\n className=\"select text-xs w-48\"\n >\n {RETENTION_PERIOD_OPTIONS.map((opt) => (\n <option key={opt.value} value={opt.value}>{opt.label}</option>\n ))}\n </select>\n </div>\n\n <div className=\"flex flex-wrap gap-6\">\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={pruneJobs}\n onChange={(e) => setPruneJobs(e.target.checked)}\n className=\"w-4 h-4 rounded border-border accent-accent\"\n />\n <div>\n <span className=\"text-xs text-text-primary\">Delete expired jobs</span>\n <p className=\"text-[10px] text-text-tertiary\">Hard-delete job rows past retention</p>\n </div>\n </label>\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={pruneStreams}\n onChange={(e) => setPruneStreams(e.target.checked)}\n className=\"w-4 h-4 rounded border-border accent-accent\"\n />\n <div>\n <span className=\"text-xs text-text-primary\">Delete expired streams</span>\n <p className=\"text-[10px] text-text-tertiary\">Hard-delete stream messages past retention</p>\n </div>\n </label>\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={stripAttributes}\n onChange={(e) => setStripAttributes(e.target.checked)}\n className=\"w-4 h-4 rounded border-border accent-accent\"\n />\n <div>\n <span className=\"text-xs text-text-primary\">Strip execution artifacts</span>\n <p className=\"text-[10px] text-text-tertiary\">Remove execution details, keep export data</p>\n </div>\n </label>\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={pruneTransient}\n onChange={(e) => setPruneTransient(e.target.checked)}\n className=\"w-4 h-4 rounded border-border accent-accent\"\n />\n <div>\n <span className=\"text-xs text-text-primary\">Delete transient jobs</span>\n <p className=\"text-[10px] text-text-tertiary\">Jobs without an entity (orphaned)</p>\n </div>\n </label>\n </div>\n\n {result && (\n <div className=\"bg-surface-sunken rounded-md px-4 py-3\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-2\">\n Prune Results\n </p>\n <div className=\"grid grid-cols-2 sm:grid-cols-4 gap-3\">\n {result.jobs !== undefined && (\n <div>\n <p className=\"text-lg font-light text-text-primary\">{result.jobs}</p>\n <p className=\"text-[10px] text-text-tertiary\">Jobs deleted</p>\n </div>\n )}\n {result.streams !== undefined && (\n <div>\n <p className=\"text-lg font-light text-text-primary\">{result.streams}</p>\n <p className=\"text-[10px] text-text-tertiary\">Streams deleted</p>\n </div>\n )}\n {result.attributes !== undefined && (\n <div>\n <p className=\"text-lg font-light text-text-primary\">{result.attributes}</p>\n <p className=\"text-[10px] text-text-tertiary\">Artifacts stripped</p>\n </div>\n )}\n {result.transient !== undefined && (\n <div>\n <p className=\"text-lg font-light text-text-primary\">{result.transient}</p>\n <p className=\"text-[10px] text-text-tertiary\">Transient deleted</p>\n </div>\n )}\n </div>\n </div>\n )}\n\n {prune.error && (\n <p className=\"text-xs text-status-error\">{(prune.error as Error).message}</p>\n )}\n </div>\n\n {/* Confirm prune modal */}\n <Modal open={showConfirm} onClose={() => setShowConfirm(false)} title=\"Confirm Prune\">\n <div className=\"space-y-4\">\n <p className=\"text-sm text-text-secondary\">\n This will permanently delete data older than{' '}\n <span className=\"font-medium text-text-primary\">{expire}</span>.\n This action cannot be undone.\n </p>\n <ul className=\"text-xs text-text-secondary space-y-1 list-disc list-inside\">\n {pruneJobs && <li>Delete expired jobs</li>}\n {pruneStreams && <li>Delete expired streams</li>}\n {stripAttributes && <li>Strip execution artifacts</li>}\n {pruneTransient && <li>Delete transient (entity-less) jobs</li>}\n </ul>\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={() => setShowConfirm(false)} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={handlePrune}\n className=\"bg-status-error text-white px-3 py-1.5 rounded-md text-xs hover:opacity-90 transition-opacity\"\n disabled={prune.isPending}\n >\n {prune.isPending ? 'Pruning...' : 'Confirm Prune'}\n </button>\n </div>\n </div>\n </Modal>\n </section>\n );\n}\n","import { useState } from 'react';\nimport {\n useMaintenanceConfig,\n useUpdateMaintenanceConfig,\n type MaintenanceRule,\n} from '../../../api/maintenance';\nimport { Modal } from '../../../components/common/modal/Modal';\nimport { SectionLabel } from '../../../components/common/layout/SectionLabel';\nimport { DataTable, type Column } from '../../../components/common/data/DataTable';\n\nexport function ScheduledMaintenanceSection() {\n const { data, isLoading } = useMaintenanceConfig();\n const updateConfig = useUpdateMaintenanceConfig();\n\n const [showEdit, setShowEdit] = useState(false);\n const [schedule, setSchedule] = useState('');\n const [rulesJson, setRulesJson] = useState('');\n const [jsonError, setJsonError] = useState('');\n\n const openEdit = () => {\n if (data?.config) {\n setSchedule(data.config.schedule);\n setRulesJson(JSON.stringify(data.config.rules, null, 2));\n } else {\n setSchedule('0 2 * * *');\n setRulesJson('[]');\n }\n setJsonError('');\n setShowEdit(true);\n };\n\n const handleSave = () => {\n setJsonError('');\n let rules: MaintenanceRule[];\n try {\n rules = JSON.parse(rulesJson);\n if (!Array.isArray(rules)) throw new Error('Rules must be an array');\n } catch (e: any) {\n setJsonError(e.message || 'Invalid JSON');\n return;\n }\n updateConfig.mutate(\n { schedule, rules },\n { onSuccess: () => setShowEdit(false) },\n );\n };\n\n const ruleColumns: Column<MaintenanceRule>[] = [\n {\n key: 'target',\n label: 'Target',\n render: (row) => (\n <span className=\"px-2 py-0.5 text-[10px] bg-surface-sunken rounded-full font-mono\">\n {row.target}\n </span>\n ),\n },\n {\n key: 'action',\n label: 'Action',\n render: (row) => (\n <span className={`text-xs font-medium ${row.action === 'delete' ? 'text-status-error' : 'text-text-secondary'}`}>\n {row.action}\n </span>\n ),\n },\n {\n key: 'olderThan',\n label: 'Older Than',\n render: (row) => <span className=\"text-xs text-text-secondary\">{row.olderThan}</span>,\n },\n {\n key: 'filter',\n label: 'Filter',\n render: (row) => {\n const parts: string[] = [];\n if (row.hasEntity === true) parts.push('entity jobs');\n if (row.hasEntity === false) parts.push('transient');\n if (row.pruned) parts.push('already pruned');\n return (\n <span className=\"text-xs text-text-tertiary\">\n {parts.length > 0 ? parts.join(', ') : '\\u2014'}\n </span>\n );\n },\n },\n ];\n\n return (\n <section>\n {/* Header row */}\n <div className=\"flex items-center justify-between mb-4\">\n <div>\n <SectionLabel>Cron Prune</SectionLabel>\n <p className=\"text-xs text-text-secondary mt-1\">\n Automated pruning runs on a cron schedule. Rules execute sequentially each cycle.\n </p>\n </div>\n <button onClick={openEdit} className=\"btn-primary text-xs shrink-0\">\n Edit Rules\n </button>\n </div>\n\n {isLoading ? (\n <div className=\"animate-pulse h-20 bg-surface-sunken rounded\" />\n ) : (\n <div className=\"space-y-4\">\n <div className=\"flex items-center gap-6\">\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Schedule\n </p>\n <p className=\"text-sm font-mono text-text-primary mt-1\">\n {data?.config?.schedule ?? '\\u2014'}\n </p>\n </div>\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Status\n </p>\n <p className=\"text-sm mt-1\">\n {data?.active ? (\n <span className=\"text-status-success\">Active</span>\n ) : (\n <span className=\"text-text-tertiary\">Inactive</span>\n )}\n </p>\n </div>\n </div>\n\n {data?.config?.rules && data.config.rules.length > 0 && (\n <DataTable\n columns={ruleColumns}\n data={data.config.rules}\n keyFn={(row) => `${row.target}-${row.action}-${row.olderThan}`}\n emptyMessage=\"No rules configured\"\n />\n )}\n </div>\n )}\n\n {/* Edit maintenance config modal */}\n <Modal open={showEdit} onClose={() => setShowEdit(false)} title=\"Edit Maintenance Config\">\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 Cron Schedule\n </label>\n <input\n type=\"text\"\n value={schedule}\n onChange={(e) => setSchedule(e.target.value)}\n placeholder=\"0 2 * * *\"\n className=\"input text-xs font-mono w-full\"\n />\n <p className=\"text-[10px] text-text-tertiary mt-1\">\n Standard cron expression (e.g., \"0 2 * * *\" = daily at 2 AM)\n </p>\n </div>\n\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Rules (JSON)\n </label>\n <textarea\n value={rulesJson}\n onChange={(e) => setRulesJson(e.target.value)}\n className=\"input font-mono text-xs w-full\"\n rows={12}\n spellCheck={false}\n />\n {jsonError && <p className=\"text-xs text-status-error mt-1\">{jsonError}</p>}\n <p className=\"text-[10px] text-text-tertiary mt-1\">\n Each rule: {'{'} target: \"streams\"|\"jobs\", action: \"delete\"|\"prune\", olderThan: \"7 days\", hasEntity?: bool, pruned?: bool {'}'}\n </p>\n </div>\n\n {updateConfig.error && (\n <p className=\"text-xs text-status-error\">{(updateConfig.error as Error).message}</p>\n )}\n\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={() => setShowEdit(false)} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={handleSave}\n disabled={!schedule.trim() || updateConfig.isPending}\n className=\"btn-primary text-xs\"\n >\n {updateConfig.isPending ? 'Saving...' : 'Save & Restart'}\n </button>\n </div>\n </div>\n </Modal>\n </section>\n );\n}\n","import { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { PruneSection } from './PruneSection';\nimport { ScheduledMaintenanceSection } from './ScheduledMaintenanceSection';\n\nexport function MaintenancePage() {\n return (\n <div>\n <PageHeader title=\"DB Maintenance\" />\n <PruneSection />\n <ScheduledMaintenanceSection />\n </div>\n );\n}\n"],"names":["useMaintenanceConfig","useQuery","apiFetch","useUpdateMaintenanceConfig","queryClient","useQueryClient","useMutation","config","usePrune","options","PruneSection","prune","expire","setExpire","useState","pruneJobs","setPruneJobs","pruneStreams","setPruneStreams","stripAttributes","setStripAttributes","pruneTransient","setPruneTransient","result","setResult","showConfirm","setShowConfirm","nothingSelected","handlePrune","data","jsxs","jsx","SectionLabel","e","RETENTION_PERIOD_OPTIONS","opt","Modal","ScheduledMaintenanceSection","isLoading","updateConfig","showEdit","setShowEdit","schedule","setSchedule","rulesJson","setRulesJson","jsonError","setJsonError","openEdit","handleSave","rules","ruleColumns","row","parts","_a","_b","DataTable","MaintenancePage","PageHeader"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as x,j as e}from"./vendor-query-B2UbickB.js";import{b as I,c as M,d as F,u as E,e as z,f as $}from"./users-tMvNyOo8.js";import{u as R}from"./roles-ZNrqqnQl.js";import{u as A}from"./useFilterParams-BaXUAkYK.js";import{D as B}from"./DataTable-BDn1WBHS.js";import{S as U}from"./StickyPagination-F9FZsRy9.js";import{F as O,b as G}from"./FilterBar-Ck4K4rzu.js";import{T as w}from"./TimeAgo-UPG6DoH8.js";import{C as S}from"./ConfirmDeleteModal-FSXyKjaB.js";import{R as D,a as b}from"./RowActions-Dg-Fsm5O.js";import{P as K}from"./PageHeader-CpWFly5S.js";import{R as N}from"./RolePill-BTPa8L-P.js";import{M as k}from"./Modal-B4rbIVAn.js";import{a as L,b as q,c as H,u as J,d as Q,e as V,f as W,g as X,h as Y}from"./bots-BkKVMbUW.js";import{l as T,H as _,z as Z,J as ee,N as te,w as se,U as ae,r as ne}from"./vendor-icons-ZTAKVwGc.js";import{e as ie}from"./vendor-react-Cw8Gy8NJ.js";import"./index-D8VH6K8B.js";import"./EmptyState-2CmV-IaS.js";import"./format-gXZXQ-HJ.js";function le({open:a,onClose:l}){const t=I(),[n,i]=x.useState({external_id:"",email:"",display_name:"",password:""}),[o,p]=x.useState(a);a!==o&&(p(a),a&&i({external_id:"",email:"",display_name:"",password:""}));const m=()=>{n.external_id.trim()&&t.mutate({external_id:n.external_id.trim(),email:n.email.trim()||void 0,display_name:n.display_name.trim()||void 0,password:n.password||void 0},{onSuccess:l})},d=(s,r)=>i(h=>({...h,[s]:r}));return e.jsx(k,{open:a,onClose:l,title:"Create User",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:"External ID (required)"}),e.jsx("input",{type:"text",value:n.external_id,onChange:s=>d("external_id",s.target.value),placeholder:"e.g., john.doe",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:"Display Name"}),e.jsx("input",{type:"text",value:n.display_name,onChange:s=>d("display_name",s.target.value),placeholder:"John Doe",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:"Email"}),e.jsx("input",{type:"text",value:n.email,onChange:s=>d("email",s.target.value),placeholder:"john@example.com",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:"Password"}),e.jsx("input",{type:"password",value:n.password,onChange:s=>d("password",s.target.value),placeholder:"Leave blank for no password",className:"input text-xs w-full"})]}),t.error&&e.jsx("p",{className:"text-xs text-status-error",children:t.error.message}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsx("button",{onClick:l,className:"btn-secondary text-xs",children:"Cancel"}),e.jsx("button",{onClick:m,disabled:!n.external_id.trim()||t.isPending,className:"btn-primary text-xs",children:t.isPending?"Creating...":"Create"})]})]})})}function re({open:a,onClose:l,user:t}){const n=M(),[i,o]=x.useState({display_name:"",email:"",status:"active"}),[p,m]=x.useState(t);t!==p&&(m(t),t&&o({display_name:t.display_name??"",email:t.email??"",status:t.status}));const d=()=>{t&&n.mutate({id:t.id,display_name:i.display_name.trim()||void 0,email:i.email.trim()||void 0,status:i.status},{onSuccess:l})};return e.jsx(k,{open:a,onClose:l,title:`Edit — ${(t==null?void 0:t.display_name)||(t==null?void 0:t.external_id)||""}`,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:"Display Name"}),e.jsx("input",{type:"text",value:i.display_name,onChange:s=>o(r=>({...r,display_name:s.target.value})),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:"Email"}),e.jsx("input",{type:"text",value:i.email,onChange:s=>o(r=>({...r,email:s.target.value})),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:"Status"}),e.jsxs("select",{value:i.status,onChange:s=>o(r=>({...r,status:s.target.value})),className:"select text-xs w-full",children:[e.jsx("option",{value:"active",children:"Active"}),e.jsx("option",{value:"inactive",children:"Inactive"}),e.jsx("option",{value:"suspended",children:"Suspended"})]})]}),n.error&&e.jsx("p",{className:"text-xs text-status-error",children:n.error.message}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsx("button",{onClick:l,className:"btn-secondary text-xs",children:"Cancel"}),e.jsx("button",{onClick:d,disabled:n.isPending,className:"btn-primary text-xs",children:n.isPending?"Saving...":"Save"})]})]})})}function ce({open:a,onClose:l}){const t=L(),[n,i]=x.useState({name:"",display_name:"",description:""}),[o,p]=x.useState(a);a!==o&&(p(a),a&&i({name:"",display_name:"",description:""}));const m=()=>{n.name.trim()&&t.mutate({name:n.name.trim(),display_name:n.display_name.trim()||void 0,description:n.description.trim()||void 0},{onSuccess:l})},d=(s,r)=>i(h=>({...h,[s]:r}));return e.jsx(k,{open:a,onClose:l,title:"Create Bot",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 (required)"}),e.jsx("input",{type:"text",value:n.name,onChange:s=>d("name",s.target.value.replace(/\s+/g,"-").toLowerCase()),placeholder:"e.g., ci-bot",className:"input text-xs w-full font-mono"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Display Name"}),e.jsx("input",{type:"text",value:n.display_name,onChange:s=>d("display_name",s.target.value),placeholder:"CI Bot",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:n.description,onChange:s=>d("description",s.target.value),placeholder:"Runs scheduled workflows",className:"input text-xs w-full"})]}),t.error&&e.jsx("p",{className:"text-xs text-status-error",children:t.error.message}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsx("button",{onClick:l,className:"btn-secondary text-xs",children:"Cancel"}),e.jsx("button",{onClick:m,disabled:!n.name.trim()||t.isPending,className:"btn-primary text-xs",children:t.isPending?"Creating...":"Create"})]})]})})}function oe({open:a,onClose:l,bot:t}){const n=q(),[i,o]=x.useState({display_name:"",description:"",status:"active"}),[p,m]=x.useState(t);t!==p&&(m(t),t&&o({display_name:t.display_name??"",description:t.description??"",status:t.status}));const d=()=>{t&&n.mutate({id:t.id,display_name:i.display_name.trim()||void 0,description:i.description.trim()||void 0,status:i.status},{onSuccess:l})};return e.jsx(k,{open:a,onClose:l,title:`Edit — ${(t==null?void 0:t.display_name)||(t==null?void 0:t.external_id)||""}`,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:"Display Name"}),e.jsx("input",{type:"text",value:i.display_name,onChange:s=>o(r=>({...r,display_name:s.target.value})),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:i.description,onChange:s=>o(r=>({...r,description:s.target.value})),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:"Status"}),e.jsxs("select",{value:i.status,onChange:s=>o(r=>({...r,status:s.target.value})),className:"select text-xs w-full",children:[e.jsx("option",{value:"active",children:"Active"}),e.jsx("option",{value:"inactive",children:"Inactive"}),e.jsx("option",{value:"suspended",children:"Suspended"})]})]}),n.error&&e.jsx("p",{className:"text-xs text-status-error",children:n.error.message}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsx("button",{onClick:l,className:"btn-secondary text-xs",children:"Cancel"}),e.jsx("button",{onClick:d,disabled:n.isPending,className:"btn-primary text-xs",children:n.isPending?"Saving...":"Save"})]})]})})}const de={active:"bg-status-success",inactive:"bg-text-tertiary",suspended:"bg-status-error"};function xe({bot:a}){return a?e.jsxs("div",{className:"border-l border-surface-border pl-6 pt-4 min-h-[300px] space-y-6",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-text-primary",children:a.display_name||a.external_id}),a.description&&e.jsx("p",{className:"text-xs text-text-tertiary mt-0.5",children:a.description})]}),e.jsx(me,{botId:a.id}),e.jsx(pe,{bot:a})]}):e.jsx("div",{className:"border-l border-surface-border pl-6 pt-4 min-h-[300px]",children:e.jsx("p",{className:"text-xs text-text-tertiary",children:"Select a bot to manage its API keys and roles."})})}function me({botId:a}){const{data:l}=Q(a),t=V(),n=W(),[i,o]=x.useState(""),[p,m]=x.useState(null),[d,s]=x.useState(!1),[r,h]=x.useState(null),v=(l==null?void 0:l.keys)??[],c=()=>{i.trim()&&t.mutate({botId:a,name:i.trim(),scopes:["mcp:tool:call"]},{onSuccess:y=>{m(y.rawKey),o("")}})},g=()=>{p&&(navigator.clipboard.writeText(p),s(!0),setTimeout(()=>s(!1),2e3))},f=()=>{r&&n.mutate({botId:a,keyId:r.id},{onSuccess:()=>h(null)})};return e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-3",children:"API Keys"}),p&&e.jsxs("div",{className:"mb-3 p-3 bg-status-success/10 border border-status-success/30 rounded-md",children:[e.jsx("p",{className:"text-[10px] font-semibold text-status-success mb-1",children:"Key generated — copy now, it won't be shown again"}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("code",{className:"text-[11px] font-mono text-text-primary bg-surface-sunken px-2 py-1 rounded flex-1 overflow-hidden text-ellipsis",children:p}),e.jsx("button",{onClick:g,className:"text-text-tertiary hover:text-text-primary shrink-0",title:"Copy to clipboard",children:d?e.jsx(Z,{className:"w-3.5 h-3.5 text-status-success"}):e.jsx(ee,{className:"w-3.5 h-3.5"})})]})]}),v.length===0?e.jsx("p",{className:"text-xs text-text-tertiary mb-3",children:"No API keys."}):e.jsx("div",{className:"space-y-1.5 mb-3",children:v.map(y=>e.jsxs("div",{className:"group/key flex items-center justify-between px-2.5 py-1.5 bg-surface-sunken rounded text-xs",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(te,{className:"w-3 h-3 text-text-tertiary"}),e.jsx("span",{className:"text-text-primary font-mono",children:y.name}),y.last_used_at&&e.jsxs("span",{className:"text-[10px] text-text-tertiary",children:["used ",e.jsx(w,{date:y.last_used_at})]})]}),e.jsx("button",{onClick:()=>h(y),className:"opacity-0 group-hover/key:opacity-100 transition-opacity text-text-tertiary hover:text-status-error",title:"Revoke key",children:e.jsx(_,{className:"w-3 h-3"})})]},y.id))}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("input",{type:"text",value:i,onChange:y=>o(y.target.value),placeholder:"Key name...",className:"input text-xs flex-1 font-mono"}),e.jsxs("button",{onClick:c,disabled:!i.trim()||t.isPending,className:"btn-primary text-xs inline-flex items-center gap-1",children:[e.jsx(se,{className:"w-3 h-3"}),t.isPending?"...":"Generate"]})]}),t.error&&e.jsx("p",{className:"text-[10px] text-status-error mt-1",children:t.error.message}),e.jsx(S,{open:!!r,onClose:()=>h(null),onConfirm:f,title:"Revoke API Key",description:e.jsxs(e.Fragment,{children:["Revoke API key"," ",e.jsx("span",{className:"font-medium text-text-primary font-mono",children:r==null?void 0:r.name}),"? This bot will no longer be able to authenticate with this key."]}),isPending:n.isPending,error:n.error})]})}function pe({bot:a}){const{data:l}=R(),t=X(),n=Y(),[i,o]=x.useState(""),[p,m]=x.useState("member"),d=(l==null?void 0:l.roles)??[],s=a.roles??[],r=x.useMemo(()=>{const c=new Set(s.map(g=>g.role));return d.filter(g=>!c.has(g))},[d,s]),h=()=>{i.trim()&&t.mutate({botId:a.id,role:i.trim(),type:p},{onSuccess:()=>{o(""),m("member")}})},v=c=>{n.mutate({botId:a.id,role:c})};return e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-3",children:"Roles"}),s.length===0?e.jsx("p",{className:"text-xs text-text-tertiary mb-3",children:"No roles assigned."}):e.jsx("div",{className:"flex flex-wrap gap-2 mb-3",children:s.map(c=>e.jsxs("span",{className:"inline-flex items-center gap-1.5 px-2.5 py-1 text-xs bg-surface-sunken rounded-full text-text-secondary",children:[e.jsx(N,{role:c.role}),e.jsx("span",{className:"text-[9px] text-text-tertiary",children:c.type}),e.jsx("button",{onClick:()=>v(c.role),className:"text-text-tertiary hover:text-status-error transition-colors ml-0.5",title:`Remove ${c.role}`,children:"×"})]},c.role))}),r.length>0&&e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("select",{value:i,onChange:c=>o(c.target.value),className:"select text-xs font-mono flex-1",children:[e.jsx("option",{value:"",children:"Select a role..."}),r.map(c=>e.jsx("option",{value:c,children:c},c))]}),e.jsxs("select",{value:p,onChange:c=>m(c.target.value),className:"select text-xs w-24",children:[e.jsx("option",{value:"member",children:"member"}),e.jsx("option",{value:"admin",children:"admin"}),e.jsx("option",{value:"superadmin",children:"superadmin"})]}),e.jsx("button",{onClick:h,disabled:!i||t.isPending,className:"btn-primary text-xs",children:t.isPending?"...":"Add"})]}),t.error&&e.jsx("p",{className:"text-[10px] text-status-error mt-1",children:t.error.message})]})}function ue({embedded:a=!1}){const{pagination:l}=A({filters:{}}),t=H(),[n,i]=x.useState(!1),[o,p]=x.useState(null),[m,d]=x.useState(null),[s,r]=x.useState(null),{data:h,isLoading:v}=J({limit:l.pageSize,offset:l.offset}),c=(h==null?void 0:h.total)??0,g=(h==null?void 0:h.bots)??[],f=x.useMemo(()=>m?g.find(j=>j.id===m.id)??m:null,[g,m]),y=[{key:"display_name",label:"Bot",render:j=>e.jsxs("div",{className:"flex items-center gap-2.5",children:[e.jsx("span",{className:`w-2 h-2 rounded-full shrink-0 ${de[j.status]??"bg-status-pending"}`,title:j.status}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-text-primary",children:j.display_name||j.external_id}),j.description&&e.jsx("p",{className:"text-xs text-text-tertiary",children:j.description})]})]})},{key:"roles",label:"Roles",render:j=>e.jsx("div",{className:"flex gap-1 flex-wrap",children:(j.roles??[]).map(u=>e.jsx(N,{role:u.role},u.role))})},{key:"created_at",label:"Created",render:j=>e.jsx(w,{date:j.created_at}),className:"w-28"},{key:"actions",label:"",render:j=>e.jsxs(D,{children:[e.jsx(b,{icon:T,title:"Edit bot",onClick:()=>p(j)}),e.jsx(b,{icon:_,title:"Delete bot",onClick:()=>r(j),colorClass:"text-text-tertiary hover:text-status-error"})]}),className:"w-16 text-right"}],C=()=>{s&&t.mutate(s.id,{onSuccess:()=>{r(null),(m==null?void 0:m.id)===s.id&&d(null)}})};return e.jsxs("div",{children:[a?e.jsx("div",{className:"flex justify-end mb-4",children:e.jsx("button",{onClick:()=>i(!0),className:"btn-primary text-xs",children:"Add Bot"})}):e.jsx(K,{title:"Service Accounts",actions:e.jsx("button",{onClick:()=>i(!0),className:"btn-primary text-xs",children:"Add Bot"})}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-[1fr_360px] gap-6",children:[e.jsxs("div",{children:[e.jsx(B,{columns:y,data:g,keyFn:j=>j.id,isLoading:v,emptyMessage:"No bots yet",onRowClick:j=>d(j),activeRowKey:(f==null?void 0:f.id)??null}),e.jsx(U,{page:l.page,totalPages:l.totalPages(c),onPageChange:l.setPage,total:c,pageSize:l.pageSize,onPageSizeChange:l.setPageSize})]}),e.jsx(xe,{bot:f})]}),e.jsx(ce,{open:n,onClose:()=>i(!1)}),e.jsx(oe,{open:!!o,onClose:()=>p(null),bot:o}),e.jsx(S,{open:!!s,onClose:()=>r(null),onConfirm:C,title:"Delete Bot",description:e.jsxs(e.Fragment,{children:["Delete"," ",e.jsx("span",{className:"font-medium text-text-primary",children:(s==null?void 0:s.display_name)||(s==null?void 0:s.external_id)}),"? This will also revoke all API keys. This action cannot be undone."]}),isPending:t.isPending,error:t.error})]})}const he=[{value:"active",label:"Active"},{value:"inactive",label:"Inactive"},{value:"suspended",label:"Suspended"}],je={active:"bg-status-success",inactive:"bg-text-tertiary",suspended:"bg-status-error"};function ge({user:a}){const{data:l}=R(),t=z(),n=$(),[i,o]=x.useState(""),[p,m]=x.useState("member"),d=(l==null?void 0:l.roles)??[],s=(a==null?void 0:a.roles)??[],r=x.useMemo(()=>{const c=new Set(s.map(g=>g.role));return d.filter(g=>!c.has(g))},[d,s]),h=()=>{!a||!i.trim()||t.mutate({userId:a.id,role:i.trim(),type:p},{onSuccess:()=>{o(""),m("member")}})},v=c=>{a&&n.mutate({userId:a.id,role:c})};return e.jsxs("div",{className:"border-l border-surface-border pl-6 pt-4 min-h-[300px]",children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-4",children:"Role Membership"}),a?e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-text-primary",children:a.display_name||a.external_id}),e.jsx("p",{className:"text-[10px] text-text-tertiary mt-0.5",children:"Member of:"})]}),s.length===0?e.jsx("p",{className:"text-xs text-text-tertiary",children:"No roles assigned."}):e.jsx("div",{className:"flex flex-wrap gap-2",children:s.map(c=>e.jsxs("span",{className:"inline-flex items-center gap-1.5 px-2.5 py-1 text-xs bg-surface-sunken rounded-full text-text-secondary",children:[e.jsx(N,{role:c.role}),e.jsx("span",{className:"text-[9px] text-text-tertiary",children:c.type}),e.jsx("button",{onClick:()=>v(c.role),className:"text-text-tertiary hover:text-status-error transition-colors ml-0.5",title:`Remove ${c.role}`,children:"×"})]},c.role))}),r.length>0&&e.jsxs("div",{className:"pt-3 border-t border-surface-border",children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-2",children:"Add Role"}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("select",{value:i,onChange:c=>o(c.target.value),className:"select text-xs font-mono flex-1",children:[e.jsx("option",{value:"",children:"Select a role..."}),r.map(c=>e.jsx("option",{value:c,children:c},c))]}),e.jsxs("select",{value:p,onChange:c=>m(c.target.value),className:"select text-xs w-24",children:[e.jsx("option",{value:"member",children:"member"}),e.jsx("option",{value:"admin",children:"admin"}),e.jsx("option",{value:"superadmin",children:"superadmin"})]}),e.jsx("button",{onClick:h,disabled:!i||t.isPending,className:"btn-primary text-xs",children:t.isPending?"...":"Add"})]}),t.error&&e.jsx("p",{className:"text-[10px] text-status-error mt-1",children:t.error.message})]})]}):e.jsx("p",{className:"text-xs text-text-tertiary",children:"Select a user to manage their roles."})]})}function ye({active:a,onChange:l}){const t=(n,i,o)=>e.jsxs("button",{onClick:()=>l(n),className:`flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md transition-colors ${a===n?"bg-accent/10 text-accent font-medium":"text-text-tertiary hover:text-text-secondary hover:bg-surface-hover"}`,children:[i,o]});return e.jsxs("div",{className:"flex gap-1 p-0.5 bg-surface-sunken rounded-lg w-fit",children:[t("users",e.jsx(ae,{className:"w-3.5 h-3.5"}),"User Accounts"),t("service-accounts",e.jsx(ne,{className:"w-3.5 h-3.5"}),"Service Accounts")]})}function Ee(){const[a,l]=ie(),n=a.get("tab")==="service-accounts"?"service-accounts":"users",i=o=>{l(o==="users"?{}:{tab:o})};return e.jsxs("div",{children:[e.jsx(K,{title:"Accounts",actions:e.jsx(ye,{active:n,onChange:i})}),n==="users"?e.jsx(ve,{}):e.jsx(ue,{embedded:!0})]})}function ve(){const{filters:a,setFilter:l,pagination:t}=A({filters:{status:""}}),n=F(),[i,o]=x.useState(!1),[p,m]=x.useState(null),[d,s]=x.useState(null),[r,h]=x.useState(null),{data:v,isLoading:c}=E({status:a.status||void 0,limit:t.pageSize,offset:t.offset}),g=(v==null?void 0:v.total)??0,f=(v==null?void 0:v.users)??[],y=x.useMemo(()=>d?f.find(u=>u.id===d.id)??d:null,[f,d]),C=[{key:"display_name",label:"User",render:u=>e.jsxs("div",{className:"flex items-center gap-2.5",children:[e.jsx("span",{className:`w-2 h-2 rounded-full shrink-0 ${je[u.status]??"bg-status-pending"}`,title:u.status}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-text-primary",children:u.display_name||u.external_id}),u.email&&e.jsx("p",{className:"text-xs text-text-tertiary",children:u.email})]})]})},{key:"roles",label:"Roles",render:u=>e.jsx("div",{className:"flex gap-1 flex-wrap",children:(u.roles??[]).map(P=>e.jsx(N,{role:P.role},P.role))})},{key:"created_at",label:"Created",render:u=>e.jsx(w,{date:u.created_at}),className:"w-28"},{key:"actions",label:"",render:u=>e.jsxs(D,{children:[e.jsx(b,{icon:T,title:"Edit user",onClick:()=>m(u)}),e.jsx(b,{icon:_,title:"Delete user",onClick:()=>h(u),colorClass:"text-text-tertiary hover:text-status-error"})]}),className:"w-16 text-right"}],j=()=>{r&&n.mutate(r.id,{onSuccess:()=>h(null)})};return e.jsxs("div",{children:[e.jsx("div",{className:"flex justify-end mb-4",children:e.jsx("button",{onClick:()=>o(!0),className:"btn-primary text-xs",children:"Add User"})}),e.jsx(O,{children:e.jsx(G,{label:"Status",value:a.status,onChange:u=>l("status",u),options:he})}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-[1fr_320px] gap-6",children:[e.jsxs("div",{children:[e.jsx(B,{columns:C,data:f,keyFn:u=>u.id,isLoading:c,emptyMessage:"No users found",onRowClick:u=>s(u),activeRowKey:(y==null?void 0:y.id)??null}),e.jsx(U,{page:t.page,totalPages:t.totalPages(g),onPageChange:t.setPage,total:g,pageSize:t.pageSize,onPageSizeChange:t.setPageSize})]}),e.jsx(ge,{user:y})]}),e.jsx(le,{open:i,onClose:()=>o(!1)}),e.jsx(re,{open:!!p,onClose:()=>m(null),user:p}),e.jsx(S,{open:!!r,onClose:()=>h(null),onConfirm:j,title:"Delete User",description:e.jsxs(e.Fragment,{children:["Delete"," ",e.jsx("span",{className:"font-medium text-text-primary",children:(r==null?void 0:r.display_name)||(r==null?void 0:r.external_id)}),"? This action cannot be undone."]}),isPending:n.isPending,error:n.error})]})}export{Ee as UsersPage};
|
|
2
|
+
//# sourceMappingURL=index-S9Ks2Lj2.js.map
|