tinybeeai 0.0.0-stage → 0.16.1
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/.railway/railway.ts +83 -0
- package/.railway/tsconfig.json +13 -0
- package/AGENTS.md +102 -0
- package/Dockerfile +108 -0
- package/LICENSE +21 -0
- package/README.md +275 -2
- package/bin/localdost.js +29 -0
- package/bin/tinybeeai.js +28 -0
- package/compose.yml +63 -0
- package/demo/payloads/ci_failure.json +46 -0
- package/demo/payloads/outage.json +18 -0
- package/demo/payloads/pr_comment_edited.json +50 -0
- package/demo/payloads/pr_merged.json +80 -0
- package/demo/payloads/pr_opened.json +69 -0
- package/demo/payloads/pr_synchronize.json +69 -0
- package/demo/payloads/ticket_created.json +138 -0
- package/demo/sample-app/playwright.config.ts +20 -0
- package/demo/sample-app/server.ts +163 -0
- package/demo/sample-app/tests/checkout.spec.ts +13 -0
- package/demo/sample-app/tests/smoke.spec.ts +8 -0
- package/dist/agent/approval-retries.js +59 -0
- package/dist/agent/approval-retries.js.map +1 -0
- package/dist/agent/approvals.js +390 -0
- package/dist/agent/approvals.js.map +1 -0
- package/dist/agent/chat-bridge.js +154 -0
- package/dist/agent/chat-bridge.js.map +1 -0
- package/dist/agent/chat-lead.js +475 -0
- package/dist/agent/chat-lead.js.map +1 -0
- package/dist/agent/chat-loop.js +106 -0
- package/dist/agent/chat-loop.js.map +1 -0
- package/dist/agent/chat-mcp.js +49 -0
- package/dist/agent/chat-mcp.js.map +1 -0
- package/dist/agent/chat-tool-blocks.js +453 -0
- package/dist/agent/chat-tool-blocks.js.map +1 -0
- package/dist/agent/chat-view.js +94 -0
- package/dist/agent/chat-view.js.map +1 -0
- package/dist/agent/chat-views.js +781 -0
- package/dist/agent/chat-views.js.map +1 -0
- package/dist/agent/chat.js +1703 -0
- package/dist/agent/chat.js.map +1 -0
- package/dist/agent/destinations.js +150 -0
- package/dist/agent/destinations.js.map +1 -0
- package/dist/agent/llm-cli.js +451 -0
- package/dist/agent/llm-cli.js.map +1 -0
- package/dist/agent/llm-codex.js +493 -0
- package/dist/agent/llm-codex.js.map +1 -0
- package/dist/agent/llm-openai.js +211 -0
- package/dist/agent/llm-openai.js.map +1 -0
- package/dist/agent/llm.js +1464 -0
- package/dist/agent/llm.js.map +1 -0
- package/dist/agent/memory.js +33 -0
- package/dist/agent/memory.js.map +1 -0
- package/dist/agent/mock-views.js +93 -0
- package/dist/agent/mock-views.js.map +1 -0
- package/dist/agent/model-availability.js +207 -0
- package/dist/agent/model-availability.js.map +1 -0
- package/dist/agent/model-errors.js +188 -0
- package/dist/agent/model-errors.js.map +1 -0
- package/dist/agent/model-guard.js +311 -0
- package/dist/agent/model-guard.js.map +1 -0
- package/dist/agent/prompts.js +374 -0
- package/dist/agent/prompts.js.map +1 -0
- package/dist/agent/qa-lenses/qa-auth.md +32 -0
- package/dist/agent/qa-lenses/qa-check-then-act.md +33 -0
- package/dist/agent/qa-lenses/qa-control-has-no-effect.md +32 -0
- package/dist/agent/qa-lenses/qa-dates.md +31 -0
- package/dist/agent/qa-lenses/qa-double-submit.md +34 -0
- package/dist/agent/qa-lenses/qa-feature-flag.md +29 -0
- package/dist/agent/qa-lenses/qa-migration.md +35 -0
- package/dist/agent/qa-lenses/qa-money.md +38 -0
- package/dist/agent/qa-lenses/qa-response-shape-break.md +33 -0
- package/dist/agent/qa-lenses/qa-validation.md +29 -0
- package/dist/agent/qa-prompts.js +660 -0
- package/dist/agent/qa-prompts.js.map +1 -0
- package/dist/agent/reasoning.js +55 -0
- package/dist/agent/reasoning.js.map +1 -0
- package/dist/agent/redact.js +48 -0
- package/dist/agent/redact.js.map +1 -0
- package/dist/agent/rules.js +927 -0
- package/dist/agent/rules.js.map +1 -0
- package/dist/agent/runs.js +440 -0
- package/dist/agent/runs.js.map +1 -0
- package/dist/agent/send-retry.js +62 -0
- package/dist/agent/send-retry.js.map +1 -0
- package/dist/agent/team-notes.js +288 -0
- package/dist/agent/team-notes.js.map +1 -0
- package/dist/agent/token-meter.js +31 -0
- package/dist/agent/token-meter.js.map +1 -0
- package/dist/agent/triage.js +506 -0
- package/dist/agent/triage.js.map +1 -0
- package/dist/api.js +1047 -0
- package/dist/api.js.map +1 -0
- package/dist/approval-targets.js +107 -0
- package/dist/approval-targets.js.map +1 -0
- package/dist/bee/cloudflared.js +108 -0
- package/dist/bee/cloudflared.js.map +1 -0
- package/dist/bee/health.js +99 -0
- package/dist/bee/health.js.map +1 -0
- package/dist/bee/hive-client.js +75 -0
- package/dist/bee/hive-client.js.map +1 -0
- package/dist/bee/identity.js +39 -0
- package/dist/bee/identity.js.map +1 -0
- package/dist/bee/models.js +510 -0
- package/dist/bee/models.js.map +1 -0
- package/dist/bee/pairing.js +351 -0
- package/dist/bee/pairing.js.map +1 -0
- package/dist/bee/relay-client.js +50 -0
- package/dist/bee/relay-client.js.map +1 -0
- package/dist/bee/routes.js +214 -0
- package/dist/bee/routes.js.map +1 -0
- package/dist/bee/setup-page.js +223 -0
- package/dist/bee/setup-page.js.map +1 -0
- package/dist/bee/state.js +41 -0
- package/dist/bee/state.js.map +1 -0
- package/dist/bee/status.js +117 -0
- package/dist/bee/status.js.map +1 -0
- package/dist/bee/tunnel-manager.js +245 -0
- package/dist/bee/tunnel-manager.js.map +1 -0
- package/dist/bee/updater.js +268 -0
- package/dist/bee/updater.js.map +1 -0
- package/dist/boot.js +41 -0
- package/dist/boot.js.map +1 -0
- package/dist/call/index.js +145 -0
- package/dist/call/index.js.map +1 -0
- package/dist/case-folders.js +294 -0
- package/dist/case-folders.js.map +1 -0
- package/dist/cases.js +554 -0
- package/dist/cases.js.map +1 -0
- package/dist/chat-blocks.js +709 -0
- package/dist/chat-blocks.js.map +1 -0
- package/dist/chat-parse-util.js +38 -0
- package/dist/chat-parse-util.js.map +1 -0
- package/dist/chat-results.js +96 -0
- package/dist/chat-results.js.map +1 -0
- package/dist/chat-stats.js +193 -0
- package/dist/chat-stats.js.map +1 -0
- package/dist/chat-view-specs.js +186 -0
- package/dist/chat-view-specs.js.map +1 -0
- package/dist/cli/doctor-ops.js +361 -0
- package/dist/cli/doctor-ops.js.map +1 -0
- package/dist/cli/doctor.js +289 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/dogfood.js +70 -0
- package/dist/cli/dogfood.js.map +1 -0
- package/dist/cli/env-file.js +34 -0
- package/dist/cli/env-file.js.map +1 -0
- package/dist/cli/eval-chat-cases.js +359 -0
- package/dist/cli/eval-chat-cases.js.map +1 -0
- package/dist/cli/eval-chat-results.js +85 -0
- package/dist/cli/eval-chat-results.js.map +1 -0
- package/dist/cli/eval-chat.js +508 -0
- package/dist/cli/eval-chat.js.map +1 -0
- package/dist/cli/eval-designer.js +67 -0
- package/dist/cli/eval-designer.js.map +1 -0
- package/dist/cli/eval-qa-review.js +284 -0
- package/dist/cli/eval-qa-review.js.map +1 -0
- package/dist/cli/golden-export.js +35 -0
- package/dist/cli/golden-export.js.map +1 -0
- package/dist/cli/index.js +90 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.js +746 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/scan-repo.js +199 -0
- package/dist/cli/scan-repo.js.map +1 -0
- package/dist/cli/seed.js +108 -0
- package/dist/cli/seed.js.map +1 -0
- package/dist/cli/tinybee.js +247 -0
- package/dist/cli/tinybee.js.map +1 -0
- package/dist/config.js +138 -0
- package/dist/config.js.map +1 -0
- package/dist/connect/aivision-local.js +833 -0
- package/dist/connect/aivision-local.js.map +1 -0
- package/dist/connect/aivision-token.js +84 -0
- package/dist/connect/aivision-token.js.map +1 -0
- package/dist/connect/crypto.js +65 -0
- package/dist/connect/crypto.js.map +1 -0
- package/dist/connect/deps.js +110 -0
- package/dist/connect/deps.js.map +1 -0
- package/dist/connect/engines.js +144 -0
- package/dist/connect/engines.js.map +1 -0
- package/dist/connect/github-access.js +74 -0
- package/dist/connect/github-access.js.map +1 -0
- package/dist/connect/github-app.js +129 -0
- package/dist/connect/github-app.js.map +1 -0
- package/dist/connect/index.js +9 -0
- package/dist/connect/index.js.map +1 -0
- package/dist/connect/model-choices.js +201 -0
- package/dist/connect/model-choices.js.map +1 -0
- package/dist/connect/providers.js +900 -0
- package/dist/connect/providers.js.map +1 -0
- package/dist/connect/readiness.js +232 -0
- package/dist/connect/readiness.js.map +1 -0
- package/dist/connect/redact.js +16 -0
- package/dist/connect/redact.js.map +1 -0
- package/dist/connect/registry.js +406 -0
- package/dist/connect/registry.js.map +1 -0
- package/dist/connect/store.js +283 -0
- package/dist/connect/store.js.map +1 -0
- package/dist/connect/tunnel.js +134 -0
- package/dist/connect/tunnel.js.map +1 -0
- package/dist/connect/types.js +8 -0
- package/dist/connect/types.js.map +1 -0
- package/dist/connections/index.js +5 -0
- package/dist/connections/index.js.map +1 -0
- package/dist/connections/manager.js +223 -0
- package/dist/connections/manager.js.map +1 -0
- package/dist/connections/presets.js +264 -0
- package/dist/connections/presets.js.map +1 -0
- package/dist/connections/store.js +132 -0
- package/dist/connections/store.js.map +1 -0
- package/dist/connections/tools.js +206 -0
- package/dist/connections/tools.js.map +1 -0
- package/dist/db-schema.js +355 -0
- package/dist/db-schema.js.map +1 -0
- package/dist/db.js +379 -0
- package/dist/db.js.map +1 -0
- package/dist/delivery.js +49 -0
- package/dist/delivery.js.map +1 -0
- package/dist/deploy-wait.js +701 -0
- package/dist/deploy-wait.js.map +1 -0
- package/dist/disk.js +243 -0
- package/dist/disk.js.map +1 -0
- package/dist/dot-health.js +966 -0
- package/dist/dot-health.js.map +1 -0
- package/dist/dot-remove.js +246 -0
- package/dist/dot-remove.js.map +1 -0
- package/dist/events.js +38 -0
- package/dist/events.js.map +1 -0
- package/dist/evidence-pack.js +423 -0
- package/dist/evidence-pack.js.map +1 -0
- package/dist/flows/answers.js +289 -0
- package/dist/flows/answers.js.map +1 -0
- package/dist/flows/change.js +811 -0
- package/dist/flows/change.js.map +1 -0
- package/dist/flows/checkStatus.js +524 -0
- package/dist/flows/checkStatus.js.map +1 -0
- package/dist/flows/ci.js +236 -0
- package/dist/flows/ci.js.map +1 -0
- package/dist/flows/ciFailure.js +76 -0
- package/dist/flows/ciFailure.js.map +1 -0
- package/dist/flows/common.js +522 -0
- package/dist/flows/common.js.map +1 -0
- package/dist/flows/default-branch.js +29 -0
- package/dist/flows/default-branch.js.map +1 -0
- package/dist/flows/defectDraft.js +447 -0
- package/dist/flows/defectDraft.js.map +1 -0
- package/dist/flows/defects.js +623 -0
- package/dist/flows/defects.js.map +1 -0
- package/dist/flows/digest.js +295 -0
- package/dist/flows/digest.js.map +1 -0
- package/dist/flows/impact.js +82 -0
- package/dist/flows/impact.js.map +1 -0
- package/dist/flows/index.js +23 -0
- package/dist/flows/index.js.map +1 -0
- package/dist/flows/intent-sources.js +72 -0
- package/dist/flows/intent-sources.js.map +1 -0
- package/dist/flows/mergeCases.js +169 -0
- package/dist/flows/mergeCases.js.map +1 -0
- package/dist/flows/nightlyRun.js +82 -0
- package/dist/flows/nightlyRun.js.map +1 -0
- package/dist/flows/outage.js +64 -0
- package/dist/flows/outage.js.map +1 -0
- package/dist/flows/postMerge.js +5 -0
- package/dist/flows/postMerge.js.map +1 -0
- package/dist/flows/prCheck.js +5 -0
- package/dist/flows/prCheck.js.map +1 -0
- package/dist/flows/prTarget.js +66 -0
- package/dist/flows/prTarget.js.map +1 -0
- package/dist/flows/qa.js +363 -0
- package/dist/flows/qa.js.map +1 -0
- package/dist/flows/questions.js +160 -0
- package/dist/flows/questions.js.map +1 -0
- package/dist/flows/recovery.js +64 -0
- package/dist/flows/recovery.js.map +1 -0
- package/dist/flows/rerun.js +50 -0
- package/dist/flows/rerun.js.map +1 -0
- package/dist/flows/testDesign.js +294 -0
- package/dist/flows/testDesign.js.map +1 -0
- package/dist/flows/testDesignJob.js +46 -0
- package/dist/flows/testDesignJob.js.map +1 -0
- package/dist/flows/testRepo.js +228 -0
- package/dist/flows/testRepo.js.map +1 -0
- package/dist/flows/testSavings.js +381 -0
- package/dist/flows/testSavings.js.map +1 -0
- package/dist/flows/testStatus.js +343 -0
- package/dist/flows/testStatus.js.map +1 -0
- package/dist/flows/ticketContext.js +425 -0
- package/dist/flows/ticketContext.js.map +1 -0
- package/dist/flows/ticketReview.js +249 -0
- package/dist/flows/ticketReview.js.map +1 -0
- package/dist/flows/ticks.js +73 -0
- package/dist/flows/ticks.js.map +1 -0
- package/dist/hive/admin.js +122 -0
- package/dist/hive/admin.js.map +1 -0
- package/dist/hive/auth.js +130 -0
- package/dist/hive/auth.js.map +1 -0
- package/dist/hive/billing.js +278 -0
- package/dist/hive/billing.js.map +1 -0
- package/dist/hive/config.js +63 -0
- package/dist/hive/config.js.map +1 -0
- package/dist/hive/db.js +186 -0
- package/dist/hive/db.js.map +1 -0
- package/dist/hive/embed.js +76 -0
- package/dist/hive/embed.js.map +1 -0
- package/dist/hive/errors.js +17 -0
- package/dist/hive/errors.js.map +1 -0
- package/dist/hive/google.js +75 -0
- package/dist/hive/google.js.map +1 -0
- package/dist/hive/index.js +25 -0
- package/dist/hive/index.js.map +1 -0
- package/dist/hive/jwt.js +57 -0
- package/dist/hive/jwt.js.map +1 -0
- package/dist/hive/keys.js +61 -0
- package/dist/hive/keys.js.map +1 -0
- package/dist/hive/mail.js +27 -0
- package/dist/hive/mail.js.map +1 -0
- package/dist/hive/native-push.js +255 -0
- package/dist/hive/native-push.js.map +1 -0
- package/dist/hive/pairing.js +342 -0
- package/dist/hive/pairing.js.map +1 -0
- package/dist/hive/presence.js +121 -0
- package/dist/hive/presence.js.map +1 -0
- package/dist/hive/push.js +185 -0
- package/dist/hive/push.js.map +1 -0
- package/dist/hive/relay.js +205 -0
- package/dist/hive/relay.js.map +1 -0
- package/dist/hive/routes.js +228 -0
- package/dist/hive/routes.js.map +1 -0
- package/dist/hive/server.js +12 -0
- package/dist/hive/server.js.map +1 -0
- package/dist/hive/session.js +28 -0
- package/dist/hive/session.js.map +1 -0
- package/dist/hive/tenants.js +287 -0
- package/dist/hive/tenants.js.map +1 -0
- package/dist/hive/tunnel/cloudflare.js +160 -0
- package/dist/hive/tunnel/cloudflare.js.map +1 -0
- package/dist/hive/tunnel/mock.js +52 -0
- package/dist/hive/tunnel/mock.js.map +1 -0
- package/dist/hive/tunnel/provider.js +19 -0
- package/dist/hive/tunnel/provider.js.map +1 -0
- package/dist/hive/updates.js +61 -0
- package/dist/hive/updates.js.map +1 -0
- package/dist/http-error.js +11 -0
- package/dist/http-error.js.map +1 -0
- package/dist/impact/classify.js +226 -0
- package/dist/impact/classify.js.map +1 -0
- package/dist/impact/find.js +259 -0
- package/dist/impact/find.js.map +1 -0
- package/dist/impact/pr.js +54 -0
- package/dist/impact/pr.js.map +1 -0
- package/dist/impact/store.js +365 -0
- package/dist/impact/store.js.map +1 -0
- package/dist/impact/text.js +158 -0
- package/dist/impact/text.js.map +1 -0
- package/dist/index.js +288 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/adf.js +397 -0
- package/dist/integrations/adf.js.map +1 -0
- package/dist/integrations/bot-marker.js +103 -0
- package/dist/integrations/bot-marker.js.map +1 -0
- package/dist/integrations/github-issues.js +705 -0
- package/dist/integrations/github-issues.js.map +1 -0
- package/dist/integrations/github.js +1284 -0
- package/dist/integrations/github.js.map +1 -0
- package/dist/integrations/issue-create.js +60 -0
- package/dist/integrations/issue-create.js.map +1 -0
- package/dist/integrations/jira.js +279 -0
- package/dist/integrations/jira.js.map +1 -0
- package/dist/integrations/linear.js +273 -0
- package/dist/integrations/linear.js.map +1 -0
- package/dist/integrations/own-identity-warm.js +47 -0
- package/dist/integrations/own-identity-warm.js.map +1 -0
- package/dist/integrations/own-identity.js +39 -0
- package/dist/integrations/own-identity.js.map +1 -0
- package/dist/integrations/status-change.js +42 -0
- package/dist/integrations/status-change.js.map +1 -0
- package/dist/lead-defects.js +202 -0
- package/dist/lead-defects.js.map +1 -0
- package/dist/lead-digest.js +333 -0
- package/dist/lead-digest.js.map +1 -0
- package/dist/lead-release.js +286 -0
- package/dist/lead-release.js.map +1 -0
- package/dist/lead.js +328 -0
- package/dist/lead.js.map +1 -0
- package/dist/legacy-names.js +51 -0
- package/dist/legacy-names.js.map +1 -0
- package/dist/limits.js +44 -0
- package/dist/limits.js.map +1 -0
- package/dist/link-trust.js +224 -0
- package/dist/link-trust.js.map +1 -0
- package/dist/links.js +219 -0
- package/dist/links.js.map +1 -0
- package/dist/loopback.js +35 -0
- package/dist/loopback.js.map +1 -0
- package/dist/model-cap.js +60 -0
- package/dist/model-cap.js.map +1 -0
- package/dist/model-usage.js +173 -0
- package/dist/model-usage.js.map +1 -0
- package/dist/monitor/backfill.js +39 -0
- package/dist/monitor/backfill.js.map +1 -0
- package/dist/monitor/browser-probe.js +198 -0
- package/dist/monitor/browser-probe.js.map +1 -0
- package/dist/monitor/catch-up.js +31 -0
- package/dist/monitor/catch-up.js.map +1 -0
- package/dist/monitor/pollers.js +1606 -0
- package/dist/monitor/pollers.js.map +1 -0
- package/dist/monitor/probes.js +178 -0
- package/dist/monitor/probes.js.map +1 -0
- package/dist/monitor/self-health.js +228 -0
- package/dist/monitor/self-health.js.map +1 -0
- package/dist/monitor/statuspage.js +105 -0
- package/dist/monitor/statuspage.js.map +1 -0
- package/dist/nightly-scheduler.js +127 -0
- package/dist/nightly-scheduler.js.map +1 -0
- package/dist/nightly.js +141 -0
- package/dist/nightly.js.map +1 -0
- package/dist/notify/headline.js +114 -0
- package/dist/notify/headline.js.map +1 -0
- package/dist/notify/push.js +174 -0
- package/dist/notify/push.js.map +1 -0
- package/dist/object-cards.js +585 -0
- package/dist/object-cards.js.map +1 -0
- package/dist/object-links.js +47 -0
- package/dist/object-links.js.map +1 -0
- package/dist/onboarding-checks.js +141 -0
- package/dist/onboarding-checks.js.map +1 -0
- package/dist/onboarding.js +401 -0
- package/dist/onboarding.js.map +1 -0
- package/dist/path-filters.js +62 -0
- package/dist/path-filters.js.map +1 -0
- package/dist/phone/alerts.js +67 -0
- package/dist/phone/alerts.js.map +1 -0
- package/dist/phone/auth.js +240 -0
- package/dist/phone/auth.js.map +1 -0
- package/dist/phone/pairing.js +442 -0
- package/dist/phone/pairing.js.map +1 -0
- package/dist/phone/prefs.js +27 -0
- package/dist/phone/prefs.js.map +1 -0
- package/dist/phone/tailscale.js +161 -0
- package/dist/phone/tailscale.js.map +1 -0
- package/dist/pr-scope.js +441 -0
- package/dist/pr-scope.js.map +1 -0
- package/dist/proc.js +156 -0
- package/dist/proc.js.map +1 -0
- package/dist/profile/cache.js +108 -0
- package/dist/profile/cache.js.map +1 -0
- package/dist/profile/ci.js +216 -0
- package/dist/profile/ci.js.map +1 -0
- package/dist/profile/index.js +8 -0
- package/dist/profile/index.js.map +1 -0
- package/dist/profile/job.js +135 -0
- package/dist/profile/job.js.map +1 -0
- package/dist/profile/queries/go-tags.scm +47 -0
- package/dist/profile/queries/java-tags.scm +25 -0
- package/dist/profile/queries/javascript-tags.scm +104 -0
- package/dist/profile/queries/python-tags.scm +19 -0
- package/dist/profile/queries/typescript-tags.scm +28 -0
- package/dist/profile/scan-thread.js +42 -0
- package/dist/profile/scan-thread.js.map +1 -0
- package/dist/profile/scan-worker.js +16 -0
- package/dist/profile/scan-worker.js.map +1 -0
- package/dist/profile/scan.js +351 -0
- package/dist/profile/scan.js.map +1 -0
- package/dist/profile/stack.js +528 -0
- package/dist/profile/stack.js.map +1 -0
- package/dist/profile/store.js +35 -0
- package/dist/profile/store.js.map +1 -0
- package/dist/profile/tests.js +399 -0
- package/dist/profile/tests.js.map +1 -0
- package/dist/queue.js +350 -0
- package/dist/queue.js.map +1 -0
- package/dist/refs.js +756 -0
- package/dist/refs.js.map +1 -0
- package/dist/release-notes.js +272 -0
- package/dist/release-notes.js.map +1 -0
- package/dist/reports/build.js +243 -0
- package/dist/reports/build.js.map +1 -0
- package/dist/reports/index.js +211 -0
- package/dist/reports/index.js.map +1 -0
- package/dist/reports/store.js +150 -0
- package/dist/reports/store.js.map +1 -0
- package/dist/reports/ticket-titles.js +124 -0
- package/dist/reports/ticket-titles.js.map +1 -0
- package/dist/reports/trace-map.js +1278 -0
- package/dist/reports/trace-map.js.map +1 -0
- package/dist/reports/traceability.js +422 -0
- package/dist/reports/traceability.js.map +1 -0
- package/dist/repos/mirror.js +356 -0
- package/dist/repos/mirror.js.map +1 -0
- package/dist/repos-github.js +108 -0
- package/dist/repos-github.js.map +1 -0
- package/dist/repos.js +891 -0
- package/dist/repos.js.map +1 -0
- package/dist/review/backend-anthropic.js +90 -0
- package/dist/review/backend-anthropic.js.map +1 -0
- package/dist/review/backend-cli.js +248 -0
- package/dist/review/backend-cli.js.map +1 -0
- package/dist/review/backend-codex.js +81 -0
- package/dist/review/backend-codex.js.map +1 -0
- package/dist/review/backend-mock.js +686 -0
- package/dist/review/backend-mock.js.map +1 -0
- package/dist/review/backend-only.js +168 -0
- package/dist/review/backend-only.js.map +1 -0
- package/dist/review/backend.js +105 -0
- package/dist/review/backend.js.map +1 -0
- package/dist/review/baseline/render-v1.js +483 -0
- package/dist/review/baseline/render-v1.js.map +1 -0
- package/dist/review/change-summary.js +197 -0
- package/dist/review/change-summary.js.map +1 -0
- package/dist/review/changelog.js +40 -0
- package/dist/review/changelog.js.map +1 -0
- package/dist/review/check.js +494 -0
- package/dist/review/check.js.map +1 -0
- package/dist/review/checkout.js +185 -0
- package/dist/review/checkout.js.map +1 -0
- package/dist/review/classify.js +178 -0
- package/dist/review/classify.js.map +1 -0
- package/dist/review/coverage.js +347 -0
- package/dist/review/coverage.js.map +1 -0
- package/dist/review/decision-eval.js +121 -0
- package/dist/review/decision-eval.js.map +1 -0
- package/dist/review/deliver.js +104 -0
- package/dist/review/deliver.js.map +1 -0
- package/dist/review/designer-eval.js +280 -0
- package/dist/review/designer-eval.js.map +1 -0
- package/dist/review/dogfood-digest.js +136 -0
- package/dist/review/dogfood-digest.js.map +1 -0
- package/dist/review/dogfood-eval.js +486 -0
- package/dist/review/dogfood-eval.js.map +1 -0
- package/dist/review/environment.js +109 -0
- package/dist/review/environment.js.map +1 -0
- package/dist/review/eval.js +405 -0
- package/dist/review/eval.js.map +1 -0
- package/dist/review/glob.js +110 -0
- package/dist/review/glob.js.map +1 -0
- package/dist/review/golden-export.js +219 -0
- package/dist/review/golden-export.js.map +1 -0
- package/dist/review/impact.js +406 -0
- package/dist/review/impact.js.map +1 -0
- package/dist/review/imports.js +542 -0
- package/dist/review/imports.js.map +1 -0
- package/dist/review/index.js +512 -0
- package/dist/review/index.js.map +1 -0
- package/dist/review/intent.js +128 -0
- package/dist/review/intent.js.map +1 -0
- package/dist/review/lenses.js +167 -0
- package/dist/review/lenses.js.map +1 -0
- package/dist/review/linked-tickets.js +293 -0
- package/dist/review/linked-tickets.js.map +1 -0
- package/dist/review/merge.js +370 -0
- package/dist/review/merge.js.map +1 -0
- package/dist/review/on-demand.js +218 -0
- package/dist/review/on-demand.js.map +1 -0
- package/dist/review/prompt-eval.js +299 -0
- package/dist/review/prompt-eval.js.map +1 -0
- package/dist/review/prompt-variants.js +37 -0
- package/dist/review/prompt-variants.js.map +1 -0
- package/dist/review/readability-eval.js +217 -0
- package/dist/review/readability-eval.js.map +1 -0
- package/dist/review/readability.js +295 -0
- package/dist/review/readability.js.map +1 -0
- package/dist/review/render.js +2409 -0
- package/dist/review/render.js.map +1 -0
- package/dist/review/repo.js +194 -0
- package/dist/review/repo.js.map +1 -0
- package/dist/review/report-plan.js +90 -0
- package/dist/review/report-plan.js.map +1 -0
- package/dist/review/routes.js +195 -0
- package/dist/review/routes.js.map +1 -0
- package/dist/review/run-summary.js +34 -0
- package/dist/review/run-summary.js.map +1 -0
- package/dist/review/run.js +245 -0
- package/dist/review/run.js.map +1 -0
- package/dist/review/scope.js +454 -0
- package/dist/review/scope.js.map +1 -0
- package/dist/review/security.js +432 -0
- package/dist/review/security.js.map +1 -0
- package/dist/review/signals.js +550 -0
- package/dist/review/signals.js.map +1 -0
- package/dist/review/specs.js +150 -0
- package/dist/review/specs.js.map +1 -0
- package/dist/review/ste.js +133 -0
- package/dist/review/ste.js.map +1 -0
- package/dist/review/test-repo-file.js +18 -0
- package/dist/review/test-repo-file.js.map +1 -0
- package/dist/review/test-repo-lines.js +53 -0
- package/dist/review/test-repo-lines.js.map +1 -0
- package/dist/review/ticket-on-demand.js +232 -0
- package/dist/review/ticket-on-demand.js.map +1 -0
- package/dist/review/yaml.js +298 -0
- package/dist/review/yaml.js.map +1 -0
- package/dist/room.js +361 -0
- package/dist/room.js.map +1 -0
- package/dist/routes/activity.js +219 -0
- package/dist/routes/activity.js.map +1 -0
- package/dist/routes/call.js +29 -0
- package/dist/routes/call.js.map +1 -0
- package/dist/routes/cards.js +40 -0
- package/dist/routes/cards.js.map +1 -0
- package/dist/routes/cases.js +133 -0
- package/dist/routes/cases.js.map +1 -0
- package/dist/routes/connect.js +268 -0
- package/dist/routes/connect.js.map +1 -0
- package/dist/routes/connection-presets.js +32 -0
- package/dist/routes/connection-presets.js.map +1 -0
- package/dist/routes/connections.js +177 -0
- package/dist/routes/connections.js.map +1 -0
- package/dist/routes/disk.js +19 -0
- package/dist/routes/disk.js.map +1 -0
- package/dist/routes/docs.js +71 -0
- package/dist/routes/docs.js.map +1 -0
- package/dist/routes/dot-suggest.js +1002 -0
- package/dist/routes/dot-suggest.js.map +1 -0
- package/dist/routes/evidence-pack.js +16 -0
- package/dist/routes/evidence-pack.js.map +1 -0
- package/dist/routes/health.js +121 -0
- package/dist/routes/health.js.map +1 -0
- package/dist/routes/impact.js +48 -0
- package/dist/routes/impact.js.map +1 -0
- package/dist/routes/lead.js +50 -0
- package/dist/routes/lead.js.map +1 -0
- package/dist/routes/links.js +13 -0
- package/dist/routes/links.js.map +1 -0
- package/dist/routes/markdown.js +62 -0
- package/dist/routes/markdown.js.map +1 -0
- package/dist/routes/onboarding.js +47 -0
- package/dist/routes/onboarding.js.map +1 -0
- package/dist/routes/phone.js +231 -0
- package/dist/routes/phone.js.map +1 -0
- package/dist/routes/release-notes.js +30 -0
- package/dist/routes/release-notes.js.map +1 -0
- package/dist/routes/reports.js +102 -0
- package/dist/routes/reports.js.map +1 -0
- package/dist/routes/repos.js +91 -0
- package/dist/routes/repos.js.map +1 -0
- package/dist/routes/review.js +283 -0
- package/dist/routes/review.js.map +1 -0
- package/dist/routes/roles.js +114 -0
- package/dist/routes/roles.js.map +1 -0
- package/dist/routes/room.js +21 -0
- package/dist/routes/room.js.map +1 -0
- package/dist/routes/runner.js +156 -0
- package/dist/routes/runner.js.map +1 -0
- package/dist/routes/runs.js +84 -0
- package/dist/routes/runs.js.map +1 -0
- package/dist/routes/setup.js +18 -0
- package/dist/routes/setup.js.map +1 -0
- package/dist/routes/test-runs.js +220 -0
- package/dist/routes/test-runs.js.map +1 -0
- package/dist/routes/ticket-status.js +17 -0
- package/dist/routes/ticket-status.js.map +1 -0
- package/dist/routes/traceability.js +143 -0
- package/dist/routes/traceability.js.map +1 -0
- package/dist/routes/true.js +142 -0
- package/dist/routes/true.js.map +1 -0
- package/dist/routes/updates.js +70 -0
- package/dist/routes/updates.js.map +1 -0
- package/dist/runner/adapters/index.js +12 -0
- package/dist/runner/adapters/index.js.map +1 -0
- package/dist/runner/adapters/playwright.js +68 -0
- package/dist/runner/adapters/playwright.js.map +1 -0
- package/dist/runner/aivision/cases.js +172 -0
- package/dist/runner/aivision/cases.js.map +1 -0
- package/dist/runner/aivision/cli.js +201 -0
- package/dist/runner/aivision/cli.js.map +1 -0
- package/dist/runner/aivision/index.js +281 -0
- package/dist/runner/aivision/index.js.map +1 -0
- package/dist/runner/aivision/server.js +394 -0
- package/dist/runner/aivision/server.js.map +1 -0
- package/dist/runner/aivision/shared.js +140 -0
- package/dist/runner/aivision/shared.js.map +1 -0
- package/dist/runner/artifact-cap.js +189 -0
- package/dist/runner/artifact-cap.js.map +1 -0
- package/dist/runner/artifacts.js +433 -0
- package/dist/runner/artifacts.js.map +1 -0
- package/dist/runner/command.js +564 -0
- package/dist/runner/command.js.map +1 -0
- package/dist/runner/copyfiles.js +221 -0
- package/dist/runner/copyfiles.js.map +1 -0
- package/dist/runner/engines.js +32 -0
- package/dist/runner/engines.js.map +1 -0
- package/dist/runner/evidence.js +114 -0
- package/dist/runner/evidence.js.map +1 -0
- package/dist/runner/host-env.js +160 -0
- package/dist/runner/host-env.js.map +1 -0
- package/dist/runner/index.js +1221 -0
- package/dist/runner/index.js.map +1 -0
- package/dist/runner/observe.js +603 -0
- package/dist/runner/observe.js.map +1 -0
- package/dist/runner/playwright-json.js +108 -0
- package/dist/runner/playwright-json.js.map +1 -0
- package/dist/runner/pwgen/exec.js +192 -0
- package/dist/runner/pwgen/exec.js.map +1 -0
- package/dist/runner/pwgen/explore.js +111 -0
- package/dist/runner/pwgen/explore.js.map +1 -0
- package/dist/runner/pwgen/index.js +423 -0
- package/dist/runner/pwgen/index.js.map +1 -0
- package/dist/runner/pwgen/propose.js +69 -0
- package/dist/runner/pwgen/propose.js.map +1 -0
- package/dist/runner/pwgen/source.js +632 -0
- package/dist/runner/pwgen/source.js.map +1 -0
- package/dist/runner/setup.js +222 -0
- package/dist/runner/setup.js.map +1 -0
- package/dist/runner/step-reporter.js +107 -0
- package/dist/runner/step-reporter.js.map +1 -0
- package/dist/runner/test-repo.js +326 -0
- package/dist/runner/test-repo.js.map +1 -0
- package/dist/runner/typed-value.js +46 -0
- package/dist/runner/typed-value.js.map +1 -0
- package/dist/runner/verify.js +133 -0
- package/dist/runner/verify.js.map +1 -0
- package/dist/runner/worktree.js +349 -0
- package/dist/runner/worktree.js.map +1 -0
- package/dist/sandbox.js +61 -0
- package/dist/sandbox.js.map +1 -0
- package/dist/server.js +262 -0
- package/dist/server.js.map +1 -0
- package/dist/shadow-week.js +126 -0
- package/dist/shadow-week.js.map +1 -0
- package/dist/shutdown.js +92 -0
- package/dist/shutdown.js.map +1 -0
- package/dist/slack/index.js +645 -0
- package/dist/slack/index.js.map +1 -0
- package/dist/stages/config.js +147 -0
- package/dist/stages/config.js.map +1 -0
- package/dist/stages/index.js +41 -0
- package/dist/stages/index.js.map +1 -0
- package/dist/suites.js +293 -0
- package/dist/suites.js.map +1 -0
- package/dist/target-url.js +116 -0
- package/dist/target-url.js.map +1 -0
- package/dist/test-runs.js +662 -0
- package/dist/test-runs.js.map +1 -0
- package/dist/ticket-keys.js +97 -0
- package/dist/ticket-keys.js.map +1 -0
- package/dist/ticket-supersede.js +105 -0
- package/dist/ticket-supersede.js.map +1 -0
- package/dist/tinybee/ed25519.js +99 -0
- package/dist/tinybee/ed25519.js.map +1 -0
- package/dist/tinybee/models-routes.js +19 -0
- package/dist/tinybee/models-routes.js.map +1 -0
- package/dist/tinybee/pair-payload.js +41 -0
- package/dist/tinybee/pair-payload.js.map +1 -0
- package/dist/tinybee/update-manifest.js +77 -0
- package/dist/tinybee/update-manifest.js.map +1 -0
- package/dist/tinybee/well-known.js +64 -0
- package/dist/tinybee/well-known.js.map +1 -0
- package/dist/tinybee/workflows/activity.js +23 -0
- package/dist/tinybee/workflows/activity.js.map +1 -0
- package/dist/tinybee/workflows/cron.js +210 -0
- package/dist/tinybee/workflows/cron.js.map +1 -0
- package/dist/tinybee/workflows/engine.js +371 -0
- package/dist/tinybee/workflows/engine.js.map +1 -0
- package/dist/tinybee/workflows/from-text.js +203 -0
- package/dist/tinybee/workflows/from-text.js.map +1 -0
- package/dist/tinybee/workflows/routes.js +189 -0
- package/dist/tinybee/workflows/routes.js.map +1 -0
- package/dist/tinybee/workflows/scheduler.js +100 -0
- package/dist/tinybee/workflows/scheduler.js.map +1 -0
- package/dist/tinybee/workflows/skills.js +227 -0
- package/dist/tinybee/workflows/skills.js.map +1 -0
- package/dist/tinybee/workflows/store.js +205 -0
- package/dist/tinybee/workflows/store.js.map +1 -0
- package/dist/tinybee/workflows/types.js +180 -0
- package/dist/tinybee/workflows/types.js.map +1 -0
- package/dist/tinybee/workflows/yaml.js +323 -0
- package/dist/tinybee/workflows/yaml.js.map +1 -0
- package/dist/true/api.js +495 -0
- package/dist/true/api.js.map +1 -0
- package/dist/true/client.js +292 -0
- package/dist/true/client.js.map +1 -0
- package/dist/true/clock.js +36 -0
- package/dist/true/clock.js.map +1 -0
- package/dist/true/events.js +125 -0
- package/dist/true/events.js.map +1 -0
- package/dist/true/hosts.js +98 -0
- package/dist/true/hosts.js.map +1 -0
- package/dist/true/index.js +29 -0
- package/dist/true/index.js.map +1 -0
- package/dist/true/key.js +54 -0
- package/dist/true/key.js.map +1 -0
- package/dist/true/line.js +69 -0
- package/dist/true/line.js.map +1 -0
- package/dist/true/mask.js +31 -0
- package/dist/true/mask.js.map +1 -0
- package/dist/true/names.js +114 -0
- package/dist/true/names.js.map +1 -0
- package/dist/true/outbox.js +233 -0
- package/dist/true/outbox.js.map +1 -0
- package/dist/true/replay.js +164 -0
- package/dist/true/replay.js.map +1 -0
- package/dist/true/settings.js +123 -0
- package/dist/true/settings.js.map +1 -0
- package/dist/true/status.js +189 -0
- package/dist/true/status.js.map +1 -0
- package/dist/true/sync-cases.js +222 -0
- package/dist/true/sync-cases.js.map +1 -0
- package/dist/true/sync-manual.js +295 -0
- package/dist/true/sync-manual.js.map +1 -0
- package/dist/true/sync-runs.js +109 -0
- package/dist/true/sync-runs.js.map +1 -0
- package/dist/true/worker.js +414 -0
- package/dist/true/worker.js.map +1 -0
- package/dist/types.js +32 -0
- package/dist/types.js.map +1 -0
- package/dist/updates/asks.js +38 -0
- package/dist/updates/asks.js.map +1 -0
- package/dist/updates/index.js +835 -0
- package/dist/updates/index.js.map +1 -0
- package/dist/updates/owner.js +24 -0
- package/dist/updates/owner.js.map +1 -0
- package/dist/updates/prefs.js +118 -0
- package/dist/updates/prefs.js.map +1 -0
- package/dist/updates/route.js +78 -0
- package/dist/updates/route.js.map +1 -0
- package/dist/updates/sources.js +345 -0
- package/dist/updates/sources.js.map +1 -0
- package/dist/updates/words.js +452 -0
- package/dist/updates/words.js.map +1 -0
- package/dist/version.js +53 -0
- package/dist/version.js.map +1 -0
- package/dist/view-compute.js +382 -0
- package/dist/view-compute.js.map +1 -0
- package/dist/view-spec.js +894 -0
- package/dist/view-spec.js.map +1 -0
- package/dist/web/apple-touch-icon.png +0 -0
- package/dist/web/assets/ApprovalCard-Br_z5z7G.css +1 -0
- package/dist/web/assets/ApprovalCard-CfGhGFo_.js +3 -0
- package/dist/web/assets/CardFromRef-BaTGmZ9c.js +2 -0
- package/dist/web/assets/CardFromRef-DO7i2uDd.css +1 -0
- package/dist/web/assets/Cases-8l_6UcLh.js +2 -0
- package/dist/web/assets/Cases-CpfED0uB.css +1 -0
- package/dist/web/assets/Chat-BKDiR0qt.js +3 -0
- package/dist/web/assets/Chat-DxjdyYUu.css +1 -0
- package/dist/web/assets/ConfirmDialog-CIMveD-b.js +2 -0
- package/dist/web/assets/ConnectSheet-Cm5vbZdR.js +4 -0
- package/dist/web/assets/Docs-HKGuY0WE.js +2 -0
- package/dist/web/assets/Docs-fodKx8S7.css +1 -0
- package/dist/web/assets/DotDetail-DskS3NWe.js +2 -0
- package/dist/web/assets/DotDetail-OWRSD_1x.css +1 -0
- package/dist/web/assets/DotStage-BZDclfzV.css +1 -0
- package/dist/web/assets/DotStage-CtMNzCN3.js +2 -0
- package/dist/web/assets/Dots-BqCsS34m.js +2 -0
- package/dist/web/assets/EvidencePack-DQ3kCJX4.js +2 -0
- package/dist/web/assets/EvidencePack-DV_9ETsA.css +1 -0
- package/dist/web/assets/FailedDeliveries-1F2kFcs9.js +2 -0
- package/dist/web/assets/FailedDeliveries-DXa2_VvI.css +1 -0
- package/dist/web/assets/Feed-5wiHRTFK.js +2 -0
- package/dist/web/assets/GfmView-C-NYaduC.js +4 -0
- package/dist/web/assets/ImpactList-C-RNuDB0.js +2 -0
- package/dist/web/assets/ImpactList-C612dFdw.css +1 -0
- package/dist/web/assets/Inbox-kc1bKVL_.js +2 -0
- package/dist/web/assets/JoinScreen-C3L4wmP3.js +2 -0
- package/dist/web/assets/JoinScreen-COeAUv5v.css +1 -0
- package/dist/web/assets/LeadDialog-N3Zul9Rw.js +8 -0
- package/dist/web/assets/LeadDialog-xyWjAuAS.css +1 -0
- package/dist/web/assets/ListeningLine-BRFNaczY.js +2 -0
- package/dist/web/assets/ListeningLine-pN8CgyiK.css +1 -0
- package/dist/web/assets/Mascots-pIyGpxtD.js +2 -0
- package/dist/web/assets/ModelChoices-BxO1zyyr.js +2 -0
- package/dist/web/assets/ModelChoices-DQJnVxfs.css +1 -0
- package/dist/web/assets/NewDotDialog-CDPUWmgN.js +2 -0
- package/dist/web/assets/NewDotDialog-DrPPqkSZ.css +1 -0
- package/dist/web/assets/NewTestRunDialog-BQBthVHE.js +2 -0
- package/dist/web/assets/NoBreakNames-Csxdqdt6.js +2 -0
- package/dist/web/assets/Pair-omex_K7H.js +2 -0
- package/dist/web/assets/PushSection-CmqHlE_2.js +2 -0
- package/dist/web/assets/ReleaseNotes-B6VqFewP.js +2 -0
- package/dist/web/assets/ReleaseNotes-DBJUL7Vm.css +1 -0
- package/dist/web/assets/ReportPage-BHS1xWEt.js +162 -0
- package/dist/web/assets/Reports-BEHnDIb1.js +2 -0
- package/dist/web/assets/ReviewChangeDialog-BVSt-cw-.js +2 -0
- package/dist/web/assets/ReviewChangeDialog-BbIlHRx0.css +1 -0
- package/dist/web/assets/Room-BoG_uge4.js +2 -0
- package/dist/web/assets/Room-evAfiW_e.css +1 -0
- package/dist/web/assets/RunActions-ZY7yf1AF.js +2 -0
- package/dist/web/assets/RunDetail-C8St20GQ.css +1 -0
- package/dist/web/assets/RunDetail-qADXjBvd.js +9 -0
- package/dist/web/assets/RunRow-BKEJv8ib.js +2 -0
- package/dist/web/assets/RunnerTry-Dgpp67-s.js +6 -0
- package/dist/web/assets/RunnerTry-DsweWOfO.css +1 -0
- package/dist/web/assets/Settings-fs-QJwNM.js +2 -0
- package/dist/web/assets/Setup-DI6hBEP-.js +2 -0
- package/dist/web/assets/TestRows-wh03T5Li.js +4 -0
- package/dist/web/assets/TestRun-DTOyF-Pv.js +2 -0
- package/dist/web/assets/TestRuns-ggDjm1Q8.js +2 -0
- package/dist/web/assets/TinyBeeAddLaptop-bc3pmh3T.js +2 -0
- package/dist/web/assets/TinyBeeAi-CkyOzhm5.js +2 -0
- package/dist/web/assets/TinyBeeConnections-B2K_P38u.js +2 -0
- package/dist/web/assets/TinyBeeHome-DSpxX5KS.js +3 -0
- package/dist/web/assets/TinyBeePlan-BamiLziu.js +2 -0
- package/dist/web/assets/TinyBeeSignup-vHcz0Wen.js +2 -0
- package/dist/web/assets/TinyBeeSkills-By9RLUse.js +2 -0
- package/dist/web/assets/TinyBeeWorkflow-DeNO7Jsh.js +2 -0
- package/dist/web/assets/TinyBeeWorkflowEditor-B6OGC2OT.js +2 -0
- package/dist/web/assets/TinyBeeWorkflows-BN4-h6lt.js +2 -0
- package/dist/web/assets/Trace-BBCI1aIB.css +1 -0
- package/dist/web/assets/Trace-aF92UWaH.js +2 -0
- package/dist/web/assets/UpdatesSection-CCWEbkue.js +2 -0
- package/dist/web/assets/Welcome-CCcy558Q.js +2 -0
- package/dist/web/assets/activity-C3qilrDm.css +1 -0
- package/dist/web/assets/activity-CBfTSxqw.js +2 -0
- package/dist/web/assets/authedMedia-BTYt_tyu.js +2 -0
- package/dist/web/assets/beeApi-BHW8Tx1s.js +2 -0
- package/dist/web/assets/data-CmXvx3Mj.js +2 -0
- package/dist/web/assets/engines-CfdJODFj.css +1 -0
- package/dist/web/assets/format-BBZ8vFyT.js +2 -0
- package/dist/web/assets/forms-Coc7p2UF.css +1 -0
- package/dist/web/assets/hivePush-DZJDokj7.js +2 -0
- package/dist/web/assets/impactModel-MY1OFuiP.js +2 -0
- package/dist/web/assets/index-B6qKm1NW.js +13 -0
- package/dist/web/assets/index-BvKyT1X7.css +1 -0
- package/dist/web/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
- package/dist/web/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
- package/dist/web/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
- package/dist/web/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
- package/dist/web/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
- package/dist/web/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
- package/dist/web/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
- package/dist/web/assets/lead-BL_P_kri.css +1 -0
- package/dist/web/assets/model-BIQy5IVG.js +2 -0
- package/dist/web/assets/modelsApi-PUSySRQw.js +2 -0
- package/dist/web/assets/newDotModel-BaLLyw57.js +2 -0
- package/dist/web/assets/onboarding-bfKqnM4Z.css +1 -0
- package/dist/web/assets/phone-Rs7FoyG0.css +1 -0
- package/dist/web/assets/phoneApi-BG_1-M-D.js +3 -0
- package/dist/web/assets/releaseModel-EynYMVOC.js +2 -0
- package/dist/web/assets/releaseNotesModel-A1Rtv3cV.js +2 -0
- package/dist/web/assets/reports-BWaA1HhM.js +37 -0
- package/dist/web/assets/reports-DXwdWQsB.css +1 -0
- package/dist/web/assets/router-W6nZsQ33.js +2 -0
- package/dist/web/assets/runs-BY0Owv93.css +1 -0
- package/dist/web/assets/shadowWeekModel-BUUiww09.js +2 -0
- package/dist/web/assets/storage-yvL36AWt.js +2 -0
- package/dist/web/assets/store-IqrqHuFR.js +2 -0
- package/dist/web/assets/testruns-BzIZ0cR0.css +1 -0
- package/dist/web/assets/testruns-DyaqX4ji.js +2 -0
- package/dist/web/assets/true-9Q68cs5b.js +2 -0
- package/dist/web/assets/true-DPGBpoir.css +1 -0
- package/dist/web/assets/ui-DcmhYyYp.js +13 -0
- package/dist/web/assets/ui-DxEDgbIx.css +1 -0
- package/dist/web/assets/usePauseDot-BV60ZVy1.js +2 -0
- package/dist/web/assets/usePauseDot-NrSzMI1C.css +1 -0
- package/dist/web/assets/usePush-Dsm-TjlG.js +2 -0
- package/dist/web/assets/useRefChips-CbafNx59.js +68 -0
- package/dist/web/assets/useRestoreDot-D0B6W82H.js +2 -0
- package/dist/web/assets/view-worker-pyeVAhUT.js +2 -0
- package/dist/web/assets/workflowUi-QYsd3n9J.js +2 -0
- package/dist/web/favicon.png +0 -0
- package/dist/web/icon-192.png +0 -0
- package/dist/web/icon-512.png +0 -0
- package/dist/web/icon-maskable-512.png +0 -0
- package/dist/web/index.html +45 -0
- package/dist/web/manifest.webmanifest +23 -0
- package/dist/web/mascots/argus-attention.svg +7 -0
- package/dist/web/mascots/argus-ok.svg +7 -0
- package/dist/web/mascots/argus-outage.svg +7 -0
- package/dist/web/mascots/argus-running.svg +7 -0
- package/dist/web/mascots/bolt-attention.svg +7 -0
- package/dist/web/mascots/bolt-ok.svg +7 -0
- package/dist/web/mascots/bolt-outage.svg +7 -0
- package/dist/web/mascots/bolt-running.svg +7 -0
- package/dist/web/mascots/echo-attention.svg +7 -0
- package/dist/web/mascots/echo-ok.svg +7 -0
- package/dist/web/mascots/echo-outage.svg +7 -0
- package/dist/web/mascots/echo-running.svg +7 -0
- package/dist/web/mascots/lens-attention.svg +7 -0
- package/dist/web/mascots/lens-ok.svg +7 -0
- package/dist/web/mascots/lens-outage.svg +7 -0
- package/dist/web/mascots/lens-running.svg +7 -0
- package/dist/web/mascots/moss-attention.svg +7 -0
- package/dist/web/mascots/moss-ok.svg +7 -0
- package/dist/web/mascots/moss-outage.svg +7 -0
- package/dist/web/mascots/moss-running.svg +7 -0
- package/dist/web/mascots/nit-attention.svg +7 -0
- package/dist/web/mascots/nit-ok.svg +7 -0
- package/dist/web/mascots/nit-outage.svg +7 -0
- package/dist/web/mascots/nit-running.svg +7 -0
- package/dist/web/mascots/nova-attention.svg +7 -0
- package/dist/web/mascots/nova-ok.svg +7 -0
- package/dist/web/mascots/nova-outage.svg +7 -0
- package/dist/web/mascots/nova-running.svg +7 -0
- package/dist/web/mascots/penn-attention.svg +7 -0
- package/dist/web/mascots/penn-ok.svg +7 -0
- package/dist/web/mascots/penn-outage.svg +7 -0
- package/dist/web/mascots/penn-running.svg +7 -0
- package/dist/web/mascots/pip-attention.svg +7 -0
- package/dist/web/mascots/pip-ok.svg +7 -0
- package/dist/web/mascots/pip-outage.svg +7 -0
- package/dist/web/mascots/pip-running.svg +7 -0
- package/dist/web/mascots/ward-attention.svg +7 -0
- package/dist/web/mascots/ward-ok.svg +7 -0
- package/dist/web/mascots/ward-outage.svg +7 -0
- package/dist/web/mascots/ward-running.svg +7 -0
- package/dist/web/sw.js +98 -0
- package/dist/webhook-seen.js +53 -0
- package/dist/webhook-seen.js.map +1 -0
- package/dist/webhooks.js +625 -0
- package/dist/webhooks.js.map +1 -0
- package/dist/zip.js +63 -0
- package/dist/zip.js.map +1 -0
- package/docs/API-V2.md +532 -0
- package/docs/CHAT-EVAL.md +130 -0
- package/docs/CHAT-UI.md +416 -0
- package/docs/CONNECTIONS.md +89 -0
- package/docs/DATA-MODEL.md +518 -0
- package/docs/DEPLOY.md +577 -0
- package/docs/DOGFOOD-LEDGER.md +81 -0
- package/docs/GITHUB.md +148 -0
- package/docs/INTEGRATION-MODEL.md +200 -0
- package/docs/LEAD-DOT.md +553 -0
- package/docs/LIST-PATTERNS.md +52 -0
- package/docs/MULTI-REPO.md +766 -0
- package/docs/PARITY.md +276 -0
- package/docs/PR-REVIEW-QA.md +1266 -0
- package/docs/PR-REVIEW.md +357 -0
- package/docs/SANDBOX.md +320 -0
- package/docs/SETUP.md +776 -0
- package/docs/SLACK.md +80 -0
- package/docs/STAGES.md +619 -0
- package/docs/TRACE-MAP.md +89 -0
- package/docs/TRACKERS.md +225 -0
- package/docs/VOICE.md +36 -0
- package/docs/tinybee/00-README.md +45 -0
- package/docs/tinybee/01-PRD.md +216 -0
- package/docs/tinybee/02-architecture-pairing.md +199 -0
- package/docs/tinybee/03-local-agent.md +222 -0
- package/docs/tinybee/04-local-setup-ui.md +128 -0
- package/docs/tinybee/05-mobile-app-ux.md +199 -0
- package/docs/tinybee/06-environments-and-delivery.md +148 -0
- package/docs/tinybee/07-coding-agent-handoff.md +116 -0
- package/docs/tinybee/OPEN-QUESTIONS.md +26 -0
- package/docs/tinybee/PROGRESS.md +134 -0
- package/package.json +111 -4
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{B as e,Bt as t,F as n,G as r,H as i,It as a,L as o,N as s,P as c,Tn as l,Vn as u,Wn as d,_ as f,a as p,at as m,d as h,it as g,mn as _,pn as v,z as y}from"./ui-DcmhYyYp.js";import{r as b,t as x}from"./router-W6nZsQ33.js";import{r as ee,t as te}from"./storage-yvL36AWt.js";import{i as S}from"./store-IqrqHuFR.js";import{a as C}from"./data-CmXvx3Mj.js";import{a as w,c as T,i as E,l as D,n as ne,o as re,r as O,t as ie}from"./reports-BWaA1HhM.js";var k=d(u(),1),A=_(),j=`reportsView`,M=(e,t)=>`reports:${e??``}:${t??``}`;function N({value:e,onChange:t}){return(0,A.jsx)(`div`,{className:`segmented lib-view`,role:`radiogroup`,"aria-label":`Layout`,onKeyDown:n=>{if(![`ArrowLeft`,`ArrowRight`,`ArrowUp`,`ArrowDown`].includes(n.key))return;n.preventDefault();let r=e===`list`?`grid`:`list`;t(r),n.currentTarget.querySelector(`[data-v="${r}"]`)?.focus()},children:[{v:`list`,label:`List`},{v:`grid`,label:`Grid`}].map(n=>(0,A.jsx)(`button`,{type:`button`,role:`radio`,"data-v":n.v,"aria-checked":e===n.v,tabIndex:e===n.v?0:-1,className:`segmented__item${e===n.v?` is-selected`:``}`,onClick:()=>t(n.v),children:n.label},n.v))})}function P({label:e}){return(0,A.jsx)(`span`,{className:`lib-chip`,title:e,children:(0,A.jsx)(`span`,{className:`lib-chip__text`,children:e})})}function F({page:e,dotName:t,parentTitle:n}){return(0,A.jsxs)(`span`,{className:`lib-meta`,children:[(0,A.jsx)(f,{icon:(0,A.jsx)(p,{meta:h[e.kind],size:14}),label:O[e.kind],className:`kind kind--${e.kind}`}),t&&(0,A.jsx)(`span`,{children:t}),n&&(0,A.jsxs)(`span`,{children:[`In `,n]}),(0,A.jsxs)(`time`,{dateTime:e.updatedAt,children:[`Updated `,T(e.updatedAt)]})]})}function I({node:e,dotName:t,parentTitle:n,collapsed:r,onToggle:i,flat:a}){let{page:o,depth:s,childCount:c}=e,l=a?0:Math.min(s,4);return(0,A.jsxs)(`li`,{className:`lib-row`,style:{"--depth":l},children:[!a&&c>0&&i?(0,A.jsxs)(`button`,{type:`button`,className:`lib-row__toggle`,"aria-expanded":!r,onClick:i,children:[r?(0,A.jsx)(m,{size:16}):(0,A.jsx)(g,{size:16}),(0,A.jsxs)(`span`,{className:`sr-only`,children:[r?`Show`:`Hide`,` `,c,` `,c===1?`subpage`:`subpages`,` of `,o.title]})]}):(0,A.jsx)(`span`,{className:`lib-row__spacer`,"aria-hidden":`true`}),(0,A.jsxs)(`a`,{className:`lib-row__link`,href:x({name:`report`,id:o.id}),children:[(0,A.jsx)(`span`,{className:`lib-row__title`,children:o.title||`Untitled`}),(0,A.jsx)(F,{page:o,dotName:t,parentTitle:a?n:void 0})]}),!a&&c>0&&r&&(0,A.jsx)(`span`,{className:`lib-row__count num`,children:c})]})}function L({page:e,dotName:t,parentTitle:n,childCount:r}){let i=w(e.markdown);return(0,A.jsx)(`li`,{className:`lib-tile`,children:(0,A.jsxs)(`a`,{className:`lib-tile__link`,href:x({name:`report`,id:e.id}),children:[(0,A.jsx)(f,{icon:(0,A.jsx)(p,{meta:h[e.kind],size:14}),label:O[e.kind],className:`kind kind--${e.kind}`}),(0,A.jsx)(`span`,{className:`lib-tile__title`,children:e.title||`Untitled`}),i?(0,A.jsx)(`span`,{className:`lib-tile__excerpt`,children:i}):(0,A.jsx)(`span`,{className:`lib-tile__excerpt muted`,children:`Empty page`}),(0,A.jsxs)(`span`,{className:`lib-meta`,children:[t&&(0,A.jsx)(`span`,{children:t}),n&&(0,A.jsxs)(`span`,{children:[`In `,n]}),r>0&&(0,A.jsxs)(`span`,{children:[r,` `,r===1?`subpage`:`subpages`]}),(0,A.jsx)(`time`,{dateTime:e.updatedAt,children:T(e.updatedAt)})]})]})})}function R({view:t,since:n}){let r=e(1e3,n);return(0,A.jsxs)(`div`,{role:`status`,"aria-label":`Loading reports`,"aria-busy":`true`,children:[r&&(t===`grid`?(0,A.jsx)(`ul`,{className:`lib-grid`,"aria-hidden":`true`,children:[0,1,2,3,4,5].map(e=>(0,A.jsxs)(`li`,{className:`lib-tile lib-tile--skeleton`,children:[(0,A.jsx)(o,{width:64,height:10}),(0,A.jsx)(o,{width:`70%`,height:14}),(0,A.jsx)(o,{width:`95%`,height:10}),(0,A.jsx)(o,{width:`60%`,height:10})]},e))}):(0,A.jsx)(`ul`,{className:`rows lib-rows`,"aria-hidden":`true`,children:[0,1,2,3,4,5].map(e=>(0,A.jsxs)(`li`,{className:`lib-row`,children:[(0,A.jsx)(`span`,{className:`lib-row__spacer`}),(0,A.jsxs)(`span`,{className:`lib-row__link`,children:[(0,A.jsx)(o,{width:`${40+e*17%35}%`,height:14}),(0,A.jsx)(o,{width:`${25+e*11%20}%`,height:10})]})]},e))})),(0,A.jsx)(y,{since:n,ready:r})]})}function z({dotId:e,q:o}){let u=C(),[d,f]=(0,k.useState)(()=>te(j,`list`)===`grid`?`grid`:`list`),[p,m]=(0,k.useState)(`all`),[h,g]=(0,k.useState)(o??``),[_,y]=(0,k.useState)(new Set),[w,T]=(0,k.useState)(!1),F=(0,k.useRef)(null),[z,B]=(0,k.useState)(o);o!==z&&(B(o),(o??``)!==h.trim()&&g(o??``)),(0,k.useEffect)(()=>{let t=setTimeout(()=>{let t=h.trim()||void 0;t!==(o||void 0)&&b({name:`reports`,dotId:e,q:t},{replace:!0})},250);return()=>clearTimeout(t)},[h,o,e]);let V=S(M(e,o),t=>l.listReports({watchId:e,q:o},t),{refreshOn:[`report`],throttleMs:1e3}),H=(0,k.useMemo)(()=>new Map((u.data??[]).map(e=>[e.id,e.name])),[u.data]),[U,W]=(0,k.useState)(V.data);V.data&&V.data!==U&&W(V.data);let G=V.data??(V.loading?U:void 0),ae=!V.data&&V.loading&&!!U,K=(0,k.useMemo)(()=>G??[],[G]),q=(0,k.useMemo)(()=>new Map(K.map(e=>[e.id,e.title])),[K]),J=(0,k.useMemo)(()=>re(K,p),[K,p]),Y=!!o||p!==`all`,oe=(0,k.useMemo)(()=>E(J),[J]),X=Y?J.map(e=>({page:e,depth:0,childCount:0,ancestors:[]})):D(oe,_),se=(0,k.useMemo)(()=>new Map(E(K).map(e=>[e.page.id,e.childCount])),[K]),Z=!!o||p!==`all`||!!e,Q=()=>{m(`all`),g(``),b({name:`reports`},{replace:!0}),F.current?.focus()},ce=e=>{f(e),ee(j,e)},$=(u.data??[]).filter(e=>!e.archived);return(0,A.jsxs)(`div`,{className:`page lib qd-touch`,children:[(0,A.jsxs)(`header`,{className:`page__header`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`h1`,{className:`page__title`,children:`Reports`}),(0,A.jsx)(`p`,{className:`page__subtitle`,children:`Test plans, readiness reports, incident write-ups, and digests.`})]}),(0,A.jsxs)(`div`,{className:`page__actions`,children:[(0,A.jsx)(`a`,{className:`btn btn--secondary`,href:x({name:`releaseNotes`,dotId:e}),children:`Release notes`}),(0,A.jsx)(v,{variant:`primary`,icon:(0,A.jsx)(a,{size:14}),onClick:()=>T(!0),children:`New report`})]})]}),(0,A.jsxs)(`div`,{className:`lib-toolbar`,role:`search`,children:[(0,A.jsx)(s,{label:`Search reports`,hideLabel:!0,className:`lib-search`,children:(0,A.jsxs)(`span`,{className:`lib-search__wrap`,children:[(0,A.jsx)(t,{size:16,className:`icon lib-search__icon`}),(0,A.jsx)(c,{ref:F,type:`search`,value:h,onChange:e=>g(e.target.value),placeholder:`Search titles and text`,autoComplete:`off`,enterKeyHint:`search`})]})}),(0,A.jsx)(s,{label:`Kind`,hideLabel:!0,className:`lib-filter`,children:(0,A.jsxs)(n,{value:p,onChange:e=>m(e.target.value),children:[(0,A.jsx)(`option`,{value:`all`,children:`All kinds`}),ne.map(e=>(0,A.jsx)(`option`,{value:e,children:O[e]},e))]})}),$.length>0&&(0,A.jsx)(s,{label:`Dot`,hideLabel:!0,className:`lib-filter`,children:(0,A.jsxs)(n,{value:e??``,onChange:e=>b({name:`reports`,dotId:e.target.value||void 0,q:o},{replace:!0}),children:[(0,A.jsx)(`option`,{value:``,children:`All dots`}),$.map(e=>(0,A.jsx)(`option`,{value:e.id,children:e.name},e.id))]})}),(0,A.jsx)(N,{value:d,onChange:ce})]}),Z&&(0,A.jsxs)(`div`,{className:`lib-chips`,"aria-label":`Active filters`,children:[o&&(0,A.jsx)(P,{label:`Text: ${o}`}),p!==`all`&&(0,A.jsx)(P,{label:`Kind: ${O[p]}`}),e&&(0,A.jsx)(P,{label:`Dot: ${H.get(e)??`Unknown dot`}`}),(0,A.jsx)(`button`,{type:`button`,className:`link-btn lib-chips__clear`,onClick:Q,children:`Clear all`})]}),G?(0,A.jsxs)(A.Fragment,{children:[V.error?(0,A.jsx)(i,{compact:!0,title:`Could not refresh reports. Showing the last list.`,error:V.error,onRetry:()=>void V.reload()}):null,X.length===0?Z?(0,A.jsx)(r,{kind:`filtered`,title:`No reports match`,body:o?`Nothing matches "${o}"${p===`all`?``:` in ${O[p].toLowerCase()} pages`}.`:`No pages for these filters.`,action:(0,A.jsx)(v,{onClick:Q,children:`Clear filters`})}):(0,A.jsx)(r,{kind:`first-run`,title:`No reports yet`,body:`The first daily digest shows up here. You can also save any check as a report.`,action:(0,A.jsx)(v,{variant:`primary`,icon:(0,A.jsx)(a,{size:14}),onClick:()=>T(!0),children:`New report`})}):(0,A.jsxs)(A.Fragment,{children:[(0,A.jsxs)(`p`,{className:`lib-count`,role:`status`,children:[ae?`Searching. `:``,X.length===J.length?`${J.length} ${J.length===1?`page`:`pages`}`:`${X.length} of ${J.length} pages shown`]}),d===`list`?(0,A.jsx)(`ul`,{className:`rows lib-rows${!Y&&X.some(e=>e.childCount>0||e.depth>0)?` lib-rows--tree`:``}`,"aria-label":`Reports`,children:X.map(t=>(0,A.jsx)(I,{node:t,flat:Y,dotName:t.page.watchId&&!e?H.get(t.page.watchId):void 0,parentTitle:t.page.parentId?q.get(t.page.parentId):void 0,collapsed:_.has(t.page.id),onToggle:()=>y(e=>{let n=new Set(e);return n.has(t.page.id)?n.delete(t.page.id):n.add(t.page.id),n})},t.page.id))}):(0,A.jsx)(`ul`,{className:`lib-grid`,"aria-label":`Reports`,children:X.map(t=>(0,A.jsx)(L,{page:t.page,dotName:t.page.watchId&&!e?H.get(t.page.watchId):void 0,parentTitle:t.page.parentId?q.get(t.page.parentId):void 0,childCount:se.get(t.page.id)??0},t.page.id))})]})]}):V.loading?(0,A.jsx)(R,{view:d,since:V.startedAt}):(0,A.jsx)(i,{title:`Could not load reports`,error:V.error,onRetry:()=>void V.reload()}),(0,A.jsx)(ie,{open:w,onClose:()=>T(!1),dotId:e,pages:K.map(e=>({id:e.id,title:e.title}))})]})}function B({dotId:e,q:t}){return(0,A.jsx)(z,{dotId:e,q:t})}export{B as default};
|
|
2
|
+
//# sourceMappingURL=Reports-BEHnDIb1.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{H as e,J as t,N as n,P as r,R as i,Tn as a,Vn as o,Wn as s,cn as c,mn as l,pn as u,q as d}from"./ui-DcmhYyYp.js";import{r as f}from"./router-W6nZsQ33.js";import{i as p}from"./store-IqrqHuFR.js";import{y as m}from"./format-BBZ8vFyT.js";var h=s(o(),1),g=l(),_=/^[0-9a-f]{7,40}$/i,v=/^(?!-)(?!.*\.\.)[A-Za-z0-9._/-]{1,200}$/;function y(e){let t=e.trim();if(!t)return{};let n=/^(.+?)\.{2,3}(.+)$/.exec(t);if(n){let[e,t]=[n[1].trim(),n[2].trim()];return!v.test(e)||!v.test(t)?{error:`Use a sha or a branch name on each side of the dots.`}:{target:{base:e,head:t}}}return _.test(t)?{target:{sha:t.toLowerCase()}}:{error:`Use a commit sha (7 to 40 hex characters), or base..head for a range.`}}function b(e){return e?`pr`in e?`Review PR #${e.pr}`:`sha`in e?`Review ${e.sha.slice(0,7)}`:`Review the range`:`Review`}async function x(e,t,n,r=15){for(let i=0;i<r&&n();i++){let n=(await a.feed({dotId:e,limit:10}).catch(()=>[])).find(e=>e.jobId===t);if(n)return n.id;await new Promise(e=>setTimeout(e,400))}}function S({pr:e,checked:t,onPick:n}){return(0,g.jsxs)(`label`,{className:`pr-pick__row${t?` is-selected`:``}`,children:[(0,g.jsx)(`input`,{type:`radio`,name:`review-pr`,value:e.number,checked:t,onChange:n}),(0,g.jsxs)(`span`,{className:`pr-pick__num`,children:[`#`,e.number]}),(0,g.jsxs)(`span`,{className:`pr-pick__main`,children:[(0,g.jsx)(`span`,{className:`pr-pick__title`,children:e.title||`PR #${e.number}`}),(0,g.jsx)(`span`,{className:`pr-pick__meta`,children:[e.author?`@${e.author}`:``,e.updatedAt?`updated ${m(e.updatedAt)}`:``,e.headSha?e.headSha.slice(0,7):``].filter(Boolean).join(`, `)})]}),(0,g.jsx)(c,{tone:e.state===`open`?`running`:`ok`,children:e.state===`open`?`Open`:`Merged`})]})}function C({dot:o,open:s,onClose:c}){let l=d(),m=p(s?`pulls:${o.id}`:null,e=>a.pulls(o.id,e)),[_,v]=(0,h.useState)(null),[C,w]=(0,h.useState)(``),[T,E]=(0,h.useState)(!1),[D,O]=(0,h.useState)(null),[k,A]=(0,h.useState)(!1),j=(0,h.useRef)(!0);(0,h.useEffect)(()=>(j.current=!0,()=>{j.current=!1}),[]);let M=()=>{j.current=!1,c()},N=y(C),P=C.trim()?N.target:_==null?void 0:{pr:_},F=o.repo?`${o.repo.owner}/${o.repo.name}`:``;async function I(e){if(e.preventDefault(),E(!0),P){A(!0),O(null);try{let e=await a.requestReview(o.id,P),t=e.runId??await x(o.id,e.jobId,()=>j.current);if(l.show({tone:`success`,title:e.duplicate?`Already checking this change`:`Check started`,body:t?e.title:`${e.title}. It starts when there is room.`,...t?{}:{action:{label:`See activity`,onClick:()=>f({name:`feed`,dotId:o.id})}}}),!j.current)return;M(),t&&f({name:`run`,id:t})}catch(e){j.current&&O(e)}finally{j.current&&A(!1)}}}let L=m.data??[];return(0,g.jsx)(t,{open:s,onClose:M,title:`Check a PR`,description:`The dot checks it now, the same way it checks changes in ${F||`the repo`} on its own. An open PR gets the PR check and its comment; a merged PR or a commit gets the after-merge check.`,size:`md`,children:(0,g.jsxs)(`form`,{className:`dot-form`,onSubmit:e=>void I(e),noValidate:!0,children:[D!=null&&(0,g.jsx)(e,{compact:!0,error:D,title:`Could not start the check`}),(0,g.jsxs)(`fieldset`,{className:`pr-pick`,"aria-describedby":`pr-pick-hint`,children:[(0,g.jsx)(`legend`,{className:`field__label`,children:`Pull request`}),m.loading?(0,g.jsx)(i,{rows:3,label:`Loading pull requests`}):m.data?L.length===0?(0,g.jsxs)(`p`,{className:`run-muted`,children:[`No open or merged PRs in `,F||`this repo`,`. Use a commit instead.`]}):(0,g.jsx)(`div`,{className:`pr-pick__list`,role:`radiogroup`,"aria-label":`Pull request`,children:L.map(e=>(0,g.jsx)(S,{pr:e,checked:_===e.number&&!C.trim(),onPick:()=>{v(e.number),w(``)}},e.number))}):(0,g.jsx)(e,{compact:!0,error:m.error,title:`Could not load pull requests`,onRetry:()=>void m.reload(),retrying:m.refreshing}),(0,g.jsx)(`p`,{id:`pr-pick-hint`,className:`field__hint`,children:`Open and merged PRs, newest first.`})]}),(0,g.jsx)(n,{label:`Or a commit`,hint:`A commit ID checks that commit against the one before it. base..head checks a range.`,error:T&&C.trim()?N.error??null:null,children:(0,g.jsx)(r,{value:C,onChange:e=>w(e.target.value),placeholder:`abc1234 or abc1234..def5678`,autoComplete:`off`,spellCheck:!1,className:`pr-pick__commit`})}),T&&!P&&!N.error&&(0,g.jsx)(`p`,{className:`field__error`,children:`Pick a PR or enter a commit ID.`}),(0,g.jsxs)(`div`,{className:`dot-form__footer`,children:[(0,g.jsx)(u,{onClick:M,children:`Cancel`}),(0,g.jsx)(u,{type:`submit`,variant:`primary`,loading:k,children:b(P)})]})]})})}export{C as t};
|
|
2
|
+
//# sourceMappingURL=ReviewChangeDialog-BVSt-cw-.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.pr-pick{gap:var(--space-2);border:0;flex-direction:column;min-width:0;margin:0;padding:0;display:flex}.pr-pick>legend{padding:0}.pr-pick__list{border:var(--hairline);border-radius:8px;flex-direction:column;max-height:280px;display:flex;overflow-y:auto}.pr-pick__row{align-items:center;gap:var(--space-2) var(--space-3);min-height:44px;padding:var(--space-2) var(--space-3);cursor:pointer;grid-template-columns:auto auto minmax(0,1fr) auto;display:grid}.pr-pick__row+.pr-pick__row{border-top:var(--hairline)}.pr-pick__row:hover{background:var(--surface-hover)}.pr-pick__row.is-selected{background:var(--surface-selected)}.pr-pick__row:has(input:focus-visible){box-shadow:inset 0 0 0 2px var(--accent-brand);outline:none}.pr-pick__row input{accent-color:var(--accent);margin:0}.pr-pick__num{font-family:var(--font-mono);font-size:var(--text-sm);color:var(--text-2)}.pr-pick__main{flex-direction:column;min-width:0;display:flex}.pr-pick__title{text-overflow:ellipsis;white-space:nowrap;font-size:var(--text-md);overflow:hidden}.pr-pick__meta{text-overflow:ellipsis;white-space:nowrap;font-size:var(--text-xs);color:var(--text-3);overflow:hidden}.pr-pick__commit{font-family:var(--font-mono)}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{D as e,H as t,R as n,Tn as r,Vn as i,W as a,Wn as o,b as s,mn as c,on as l,v as u,vt as d,x as f}from"./ui-DcmhYyYp.js";import{r as p,t as m}from"./router-W6nZsQ33.js";import{i as ee}from"./store-IqrqHuFR.js";import{S as h,r as g,v as _,y as v}from"./format-BBZ8vFyT.js";import{St as y,bt as te,xt as b}from"./index-B6qKm1NW.js";import{t as x}from"./releaseModel-EynYMVOC.js";var S=o(i(),1),C=[{key:`queued`,title:`Queued`,empty:`Nothing waits to start.`},{key:`working`,title:`Working`,empty:`No dot is working now.`},{key:`waiting`,title:`Waits for you`,empty:`Nothing waits for you.`},{key:`done`,title:`Done today`,empty:`Nothing finished today yet.`}];function w(e){let t=Date.parse(e);return Number.isFinite(t)?new Date(t).toLocaleTimeString(void 0,{hour:`2-digit`,minute:`2-digit`}).replace(/\s/g,`\xA0`):``}function T(e){let t={queued:[],working:[],waiting:[],done:[]};for(let n of e)t[n.column]?.push(n);return t.queued.sort((e,t)=>e.at.localeCompare(t.at)),t.working.sort((e,t)=>e.at.localeCompare(t.at)),t.waiting.sort((e,t)=>e.at.localeCompare(t.at)),t.done.sort((e,t)=>t.at.localeCompare(e.at)),t}function ne(e){return g[e.kind]??`Check`}var re=`Waits for the daily AI limit to reset`;function ie(e){return e===`model_cap`?re:e===`deploy_wait`?`Waits for the deploy`:null}function ae(e,t=Date.now()){return e.count&&e.count>1?`Queued ${e.count} times, first ${v(e.at,t)}`:null}function E(e,t=Date.now()){return[ae(e,t),ie(e.held)].filter(e=>!!e)}function oe(e,t=Date.now()){return E(e,t).join(` · `)||null}function se(e,t=Date.now()){switch(e.column){case`queued`:return oe(e,t)??`Queued ${v(e.at,t)}`;case`working`:return j(e,t);case`waiting`:return`${_(e.drafts??1,`draft`)} to review, since ${w(e.at)}`;case`done`:return`${D(e).label} at ${w(e.at)}`}}function D(e){let t=e.result;if(!t)return{label:`Done`,icon:`passed`};let n=h({kind:e.kind,status:t.status,interruptReason:t.interruptReason,verdict:t.outcome?{outcome:t.outcome}:void 0});return{label:n.label,icon:n.icon}}var ce={pr_check:[`PR`,`PRs`],post_merge:[`merge`,`merges`],ticket_review:[`ticket reviewed`,`tickets reviewed`],ci_failure:[`failed build`,`failed builds`],rerun:[`check again`,`checks again`],nightly_run:[`nightly run`,`nightly runs`],outage:[`site down`,`sites down`],recovery:[`site back up`,`sites back up`]};function O(e){let t=[];for(let[n,r]of Object.entries(e.kinds??{})){if(!r)continue;let e=ce[n];t.push(e?`${r} ${r===1?e[0]:e[1]}`:_(r,`check`))}return!t.length&&e.checks>0&&t.push(_(e.checks,`check`)),e.tests?.total&&t.push(`${e.tests.passed}/${e.tests.total} tests passed`),e.bugs>0&&t.push(`${_(e.bugs,`bug`)} found`),t}function k(e){let t=O(e);return t.length?t.join(` · `):`No checks yet`}function A(e,t=Date.now()){return e.deployWait?[`Waits for the ${e.deployWait.environment} deploy, until ${w(e.deployWait.until)} at the latest`]:[e.step,`Started ${v(e.at,t)}`].filter(e=>!!e)}function j(e,t=Date.now()){return A(e,t).join(` · `)}function M(e,t=Date.now()){let n=[];return e.latencyMs!=null&&n.push(`${e.latencyMs.toLocaleString()} ms`),e.checkedAt&&n.push(v(e.checkedAt,t)),n.join(` · `)}function N(e,t=Date.now()){return e?`Last outage: ${v(e,t)}`:`Last outage: none this week`}function P(e,t=Date.now()){return e.probes.some(e=>e.state!==`unknown`)?N(e.lastOutageAt,t):null}function F(e){return e<=0?`Nothing`:_(e,`draft`)}var I=`Nothing running`;function L(e){let t=e.statusReason?.trim();return t&&(e.status===`failing`||e.status===`not_watching`||e.status===`needs_you`&&e.inbox<=0)?t:null}function R(e){let t=e.statusReason?.trim();return t&&e.status!==`healthy`?t:null}function z(e,t){return t>e?`and ${t-e} more`:null}var B=e=>String(e).padStart(2,`0`);function V(e){let t=`${B(e.digestHour)}:00`;return e.digestEvery===`week`?`Brief on Mondays at ${t}`:`Brief every day at ${t}`}var H={up:`Up`,failing:`Failing`,down:`Down`,unknown:`Not checked yet`},U={up:`passed`,failing:`attention`,down:`failed`,unknown:`none`};function W(e){return e.reduce((e,t)=>t.column===`waiting`?e+(t.drafts??1):e,0)}function G(e,t){return e===`waiting`?_(t,`draft`):String(t)}function le(e){return e.dots.length+(e.leads?.length??0)}function ue(e){let t=e.jobs.filter(e=>e.column===`working`).length,n=W(e.jobs),r=[_(le(e),`dot`),`${t} working`];return n>0&&r.push(`${_(n,`draft`)} waiting for you`),r.join(`, `)}function K(e){let t=e.trim();return t&&t.toLowerCase()!==`lead qa`?t:null}var q={failing:0,needs_you:1,not_watching:2,healthy:3},J=c();function de({source:t}){switch(t){case`github-pr`:case`github-issue`:return(0,J.jsx)(e,{brand:`github`,size:14});case`jira`:return(0,J.jsx)(e,{brand:`jira`,size:14});case`linear`:return(0,J.jsx)(e,{brand:`linear`,size:14});case`site`:return(0,J.jsx)(d,{size:14});default:return null}}function Y({refx:e,link:t}){let n=(0,J.jsxs)(J.Fragment,{children:[e.source&&(0,J.jsx)(`span`,{className:`room-ref__icon`,"aria-hidden":`true`,children:(0,J.jsx)(de,{source:e.source})}),(0,J.jsxs)(`span`,{className:`room-ref__text`,children:[e.key&&(0,J.jsx)(`span`,{className:`room-ref__key num`,children:e.key}),e.key&&` `,(0,J.jsx)(`span`,{className:`room-ref__title`,children:e.title})]})]});return t&&e.url?(0,J.jsx)(`a`,{className:`room-ref room-ref--link`,href:e.url,target:`_blank`,rel:`noreferrer noopener`,children:n}):(0,J.jsx)(`span`,{className:`room-ref`,children:n})}function fe({job:e,now:t}){let n=!!e.ref.source;return(0,J.jsxs)(`li`,{className:`room-job`,children:[(0,J.jsx)(Y,{refx:e.ref,link:!0}),(0,J.jsx)(X,{notes:A(e,t),className:`room-job__line`,hung:n}),(0,J.jsx)(`a`,{className:`room-job__open${n?` room-notes--hung`:``}`,href:e.open,children:`See the check`})]})}function pe({job:e,now:t}){let n=E(e,t);return(0,J.jsxs)(`li`,{className:`room-job`,children:[(0,J.jsx)(Y,{refx:e.ref,link:!0}),n.length>0&&(0,J.jsx)(X,{notes:n,className:`room-job__line`,hung:!!e.ref.source})]})}function X({notes:e,className:t,hung:n=!1}){return(0,J.jsx)(`span`,{className:`${t} room-notes${n?` room-notes--hung`:``}`,children:e.map(e=>(0,J.jsx)(`span`,{className:`room-muted`,children:e},e))})}function me({lead:e}){let t=y[e.status];return(0,J.jsxs)(`section`,{className:`room-lead`,"aria-label":`Lead QA: ${e.name}`,children:[(0,J.jsxs)(`div`,{className:`room-lead__who`,children:[(0,J.jsx)(`span`,{className:`room-lead__label`,children:`Lead QA`}),K(e.name)&&(0,J.jsx)(`a`,{className:`room-lead__name`,href:m({name:`dot`,id:e.id}),children:K(e.name)}),(0,J.jsx)(u,{kind:b[e.status],label:t,collapse:`never`})]}),R(e)&&(0,J.jsx)(`p`,{className:`room-lead__reason`,children:R(e)}),(0,J.jsx)(`p`,{className:`room-lead__brief`,children:V(e)}),e.release?(0,J.jsxs)(`p`,{className:`room-lead__release`,children:[(0,J.jsxs)(`span`,{className:`room-lead__answer`,children:[(0,J.jsx)(s,{kind:x[e.release.answer],label:e.release.word,decorative:!0,size:16}),(0,J.jsx)(`span`,{children:e.release.milestone?`Release ${e.release.milestone}: ${e.release.word}`:`Release call: ${e.release.word}`})]}),(0,J.jsx)(`span`,{className:`room-lead__summary`,children:e.release.summary})]}):(0,J.jsx)(`p`,{className:`room-lead__release room-lead__summary`,children:`No release call yet.`}),(0,J.jsx)(`a`,{className:`btn btn--secondary btn--sm room-lead__open`,href:m({name:`dot`,id:e.id}),children:(0,J.jsx)(`span`,{className:`btn__label`,children:`Open the lead`})})]})}function he({dot:e,now:t}){let n=e.away===`paused`?`Paused`:y[e.status],r=e.away===`paused`?`paused`:b[e.status],i=z(e.next.length,e.nextCount),o=`room-dot-${e.id}`,s=[...e.now,...e.next].flatMap(e=>e.details.runId?[e.details.runId]:e.details.jobIds??(e.details.jobId?[e.details.jobId]:[])),c=L(e),l=[...new Set([...e.now,...e.next].flatMap(e=>e.details.stage?[e.details.stage]:[]))];return(0,J.jsxs)(`article`,{className:`room-card`,"aria-labelledby":o,"data-status":e.away??e.status,children:[(0,J.jsxs)(`header`,{className:`room-card__head`,children:[(0,J.jsx)(f,{name:e.avatar,size:32,decorative:!0}),(0,J.jsxs)(`div`,{className:`room-card__who`,children:[(0,J.jsx)(`h2`,{className:`room-card__name`,id:o,children:e.name}),(0,J.jsx)(`p`,{className:`room-card__job`,children:e.job})]}),(0,J.jsx)(u,{kind:r,label:n,collapse:`never`})]}),c&&(0,J.jsx)(`p`,{className:`room-card__reason`,children:c}),c&&e.reasonRun&&(0,J.jsxs)(`div`,{className:`room-card__reason-item`,children:[(0,J.jsx)(Y,{refx:e.reasonRun.ref,link:!0}),(0,J.jsx)(`a`,{className:`room-job__open`,href:e.reasonRun.open,children:`See the check`})]}),(0,J.jsxs)(`dl`,{className:`room-card__rows`,children:[(0,J.jsxs)(`div`,{className:`room-card__row`,children:[(0,J.jsx)(`dt`,{children:`Now`}),(0,J.jsx)(`dd`,{children:e.now.length?(0,J.jsx)(`ul`,{className:`room-jobs`,children:e.now.map(e=>(0,J.jsx)(fe,{job:e,now:t},e.id))}):(0,J.jsx)(`span`,{className:`room-muted`,children:I})})]}),(0,J.jsxs)(`div`,{className:`room-card__row`,children:[(0,J.jsx)(`dt`,{children:`Next`}),(0,J.jsx)(`dd`,{children:e.next.length?(0,J.jsxs)(J.Fragment,{children:[(0,J.jsx)(`ul`,{className:`room-jobs`,children:e.next.map(e=>(0,J.jsx)(pe,{job:e,now:t},e.id))}),i&&(0,J.jsx)(`span`,{className:`room-muted`,children:i})]}):(0,J.jsx)(`span`,{className:`room-muted`,children:`Nothing queued`})})]}),(0,J.jsxs)(`div`,{className:`room-card__row`,children:[(0,J.jsx)(`dt`,{children:`Waits for you`}),(0,J.jsx)(`dd`,{className:e.inbox>0?`room-card__wait`:`room-muted`,children:F(e.inbox)})]}),(0,J.jsxs)(`div`,{className:`room-card__row`,children:[(0,J.jsx)(`dt`,{children:`Today`}),(0,J.jsx)(`dd`,{children:O(e.today).length?(0,J.jsx)(`ul`,{className:`room-today`,"aria-label":k(e.today),children:O(e.today).map(e=>(0,J.jsx)(`li`,{children:e},e))}):k(e.today)})]}),e.probes.length>0&&(0,J.jsxs)(`div`,{className:`room-card__row`,children:[(0,J.jsx)(`dt`,{children:`Sites`}),(0,J.jsxs)(`dd`,{children:[(0,J.jsx)(`ul`,{className:`room-probes`,children:e.probes.map(e=>(0,J.jsxs)(`li`,{className:`room-probe`,children:[(0,J.jsx)(`span`,{className:`room-probe__env`,children:e.env}),(0,J.jsx)(u,{kind:U[e.state],label:H[e.state],collapse:`never`}),(0,J.jsx)(`span`,{className:`room-probe__meta`,children:M(e,t)})]},e.url))}),P(e,t)&&(0,J.jsx)(`span`,{className:`room-muted`,children:P(e,t)})]})]})]}),(0,J.jsxs)(`footer`,{className:`room-card__foot`,children:[(0,J.jsx)(`a`,{className:`btn btn--secondary btn--sm`,href:m({name:`dot`,id:e.id}),"aria-label":`Open ${e.name}`,children:(0,J.jsx)(`span`,{className:`btn__label`,children:`Open`})}),e.inbox>0&&(0,J.jsx)(`a`,{className:`btn btn--secondary btn--sm`,href:m({name:`inbox`}),"aria-label":`Inbox, ${F(e.inbox)} from ${e.name}`,children:(0,J.jsxs)(`span`,{className:`btn__label`,children:[`Inbox `,e.inbox]})}),(0,J.jsx)(a,{className:`room-card__details`,children:(0,J.jsxs)(`dl`,{className:`room-details`,children:[(0,J.jsx)(`dt`,{children:`Dot id`}),(0,J.jsx)(`dd`,{children:(0,J.jsx)(`code`,{children:e.id})}),s.length>0&&(0,J.jsxs)(J.Fragment,{children:[(0,J.jsx)(`dt`,{children:`Runs and jobs`}),(0,J.jsx)(`dd`,{children:s.map(e=>(0,J.jsx)(`code`,{children:e},e))})]}),l.length>0&&(0,J.jsxs)(J.Fragment,{children:[(0,J.jsx)(`dt`,{children:`Stages`}),(0,J.jsx)(`dd`,{children:l.join(`, `)})]}),e.probes.map(e=>(0,J.jsxs)(`div`,{className:`room-details__pair`,children:[(0,J.jsx)(`dt`,{children:e.env}),(0,J.jsxs)(`dd`,{children:[(0,J.jsx)(`code`,{children:e.url}),e.latencyMs!=null&&` ${e.latencyMs} ms`]})]},e.url))]})})]})]})}function Z({job:e,now:t}){let n=e.column===`done`?D(e):null,r=e.column===`waiting`?`Open in the Inbox`:`Open the check`,i=e.column===`queued`?E(e,t):e.column===`working`?A(e,t):[];return(0,J.jsxs)(`li`,{className:`board-card`,children:[(0,J.jsxs)(`div`,{className:`board-card__main`,children:[(0,J.jsxs)(`span`,{className:`board-card__dot`,children:[(0,J.jsx)(f,{name:e.avatar,size:20,decorative:!0}),(0,J.jsx)(`span`,{children:e.dotName}),(0,J.jsx)(`span`,{className:`board-card__kind`,children:ne(e)})]}),(0,J.jsx)(Y,{refx:e.ref,link:!0}),i.length>0?(0,J.jsx)(X,{notes:i,className:`board-card__when`,hung:!!e.ref.source}):(0,J.jsxs)(`span`,{className:`board-card__when${e.ref.source?` room-notes--hung`:``}`,children:[n&&(0,J.jsx)(s,{kind:n.icon,label:n.label,decorative:!0,size:14}),se(e,t)]}),(0,J.jsx)(`a`,{className:`board-card__open`,href:e.open,"aria-label":`${r}: ${e.ref.key?`${e.ref.key} `:``}${e.ref.title}`})]}),(0,J.jsx)(a,{className:`board-card__details`,children:(0,J.jsxs)(`dl`,{className:`room-details`,children:[e.details.runId&&(0,J.jsxs)(J.Fragment,{children:[(0,J.jsx)(`dt`,{children:`Run`}),(0,J.jsx)(`dd`,{children:(0,J.jsx)(`code`,{children:e.details.runId})})]}),(e.details.jobIds?.length??0)>1?(0,J.jsxs)(J.Fragment,{children:[(0,J.jsx)(`dt`,{children:`Jobs`}),(0,J.jsx)(`dd`,{children:e.details.jobIds.map(e=>(0,J.jsx)(`code`,{children:e},e))})]}):e.details.jobId&&(0,J.jsxs)(J.Fragment,{children:[(0,J.jsx)(`dt`,{children:`Job`}),(0,J.jsx)(`dd`,{children:(0,J.jsx)(`code`,{children:e.details.jobId})})]}),e.details.approvalId&&(0,J.jsxs)(J.Fragment,{children:[(0,J.jsx)(`dt`,{children:`Draft`}),(0,J.jsx)(`dd`,{children:(0,J.jsx)(`code`,{children:e.details.approvalId})})]}),e.details.stage&&(0,J.jsxs)(J.Fragment,{children:[(0,J.jsx)(`dt`,{children:`Stage`}),(0,J.jsx)(`dd`,{children:e.details.stage})]}),(0,J.jsx)(`dt`,{children:`Kind`}),(0,J.jsx)(`dd`,{children:(0,J.jsx)(`code`,{children:e.kind})})]})})]})}function ge({room:e,now:t}){let n=T(e.jobs),r=C.find(e=>n[e.key].length>0)?.key??`working`,[i,a]=(0,S.useState)(null),o=i??r,s=t=>G(t,t===`done`?e.doneToday:t===`waiting`?W(e.jobs):n[t].length);return(0,J.jsxs)(`div`,{className:`board`,children:[(0,J.jsx)(`div`,{className:`board__pick`,role:`group`,"aria-label":`Column`,children:C.map(e=>(0,J.jsxs)(`button`,{type:`button`,className:`board__pick-btn${o===e.key?` is-current`:``}`,"aria-pressed":o===e.key,onClick:()=>a(e.key),children:[e.title,` `,(0,J.jsx)(`span`,{className:`num`,children:s(e.key)})]},e.key))}),(0,J.jsx)(`div`,{className:`board__cols`,children:C.map(r=>(0,J.jsxs)(`section`,{className:`board__col`,"data-shown":o===r.key,"aria-labelledby":`board-${r.key}`,children:[(0,J.jsxs)(`h2`,{className:`board__col-head`,id:`board-${r.key}`,children:[(0,J.jsx)(`span`,{children:r.title}),(0,J.jsx)(`span`,{className:`board__count num`,children:s(r.key)})]}),n[r.key].length?(0,J.jsx)(`ul`,{className:`board__list`,children:n[r.key].map(e=>(0,J.jsx)(Z,{job:e,now:t},`${e.column}:${e.id}`))}):(0,J.jsx)(`p`,{className:`board__empty`,children:r.empty}),r.key===`done`&&e.doneToday>n.done.length&&(0,J.jsxs)(`a`,{className:`board__more`,href:m({name:`feed`}),children:[`See all `,e.doneToday,` in Activity`]})]},r.key))})]})}var _e=[{value:`cards`,label:`Cards`},{value:`board`,label:`Board`}];function ve({room:e,tab:t,now:n}){let r=n??(Date.parse(e.builtAt)||0),i=[...e.dots].sort((e,t)=>q[e.status]-q[t.status]);return(0,J.jsxs)(`div`,{className:`page room`,children:[(0,J.jsx)(`header`,{className:`page__header`,children:(0,J.jsxs)(`div`,{children:[(0,J.jsx)(`h1`,{className:`page__title`,children:`Room`}),(0,J.jsx)(`p`,{className:`page__subtitle`,children:ue(e)})]})}),e.leads.map(e=>(0,J.jsx)(me,{lead:e},e.id)),(0,J.jsx)(l,{items:_e,value:t,label:`Room view`,idPrefix:`room`,onChange:e=>p(m(e===`board`?{name:`room`,view:`board`}:{name:`room`}),{replace:!0}),children:t===`board`?(0,J.jsx)(ge,{room:e,now:r}):i.length?(0,J.jsx)(`div`,{className:`room-cards`,children:i.map(e=>(0,J.jsx)(he,{dot:e,now:r},e.id))}):(0,J.jsxs)(`div`,{className:`room-empty`,children:[(0,J.jsx)(`h2`,{children:`No dots yet`}),(0,J.jsx)(`p`,{children:`Each dot shows here with what it works on.`}),(0,J.jsx)(`a`,{className:`btn btn--primary btn--sm`,href:m({name:`dots`,create:!0}),children:(0,J.jsx)(`span`,{className:`btn__label`,children:`Add a dot`})})]})})]})}var Q=`room`;function $(){let e=new Map;return t=>t.type!==`run`||e.get(t.run.id)!==t.run.status&&(e.delete(t.run.id),e.set(t.run.id,t.run.status),e.size>500&&e.delete(e.keys().next().value),!0)}function ye({view:e}){let i=(0,S.useRef)(null);i.current??=$();let a=ee(Q,e=>r.room(e),{refreshOn:[`run`,`approval`,`dot`,`picked_up`],eventFilter:e=>i.current(e),throttleMs:1500});te(Q);let o=e===`board`?`board`:`cards`;return a.loading?(0,J.jsx)(n,{label:`Loading the room`,since:a.startedAt}):a.data?(0,J.jsxs)(J.Fragment,{children:[a.error!=null&&(0,J.jsx)(t,{compact:!0,title:`Could not refresh the room. Showing the last answer.`,error:a.error,onRetry:()=>void a.reload(),retrying:a.refreshing}),(0,J.jsx)(ve,{room:a.data,tab:o})]}):(0,J.jsx)(t,{title:`Could not load the room`,error:a.error,onRetry:()=>void a.reload(),retrying:a.refreshing})}export{ye as default,$ as roomEventFilter,Q as roomKey};
|
|
2
|
+
//# sourceMappingURL=Room-BoG_uge4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.room{container:room/inline-size}.room-lead{gap:var(--space-1) var(--space-3);margin-bottom:var(--space-4);padding:var(--space-3) var(--space-4);background:var(--surface-2);border:var(--hairline);border-radius:var(--radius-md);grid-template-columns:minmax(0,1fr) auto;align-items:start;display:grid}.room-lead__who{align-items:center;gap:var(--space-1) var(--space-2);flex-wrap:wrap;grid-column:1;display:flex}.room-lead__label{color:var(--text-3);font-size:var(--text-sm);font-weight:var(--weight-medium)}.room-lead__name{color:var(--text);font-weight:var(--weight-semibold)}.room-lead__reason,.room-lead__brief,.room-lead__release{font-size:var(--text-md);overflow-wrap:anywhere;grid-column:1;margin:0}.room-lead__reason{color:var(--text-2)}.room-lead__release{gap:var(--space-1) var(--space-2);flex-wrap:wrap;display:flex}.room-lead__answer{align-items:center;gap:var(--space-1);font-weight:var(--weight-medium);display:inline-flex}.room-lead__summary{color:var(--text-2)}.room-lead__open{white-space:nowrap;grid-area:1/2/span 4;align-self:center}.room-cards{gap:var(--space-3);padding-top:var(--space-3);grid-template-columns:repeat(auto-fill,minmax(min(100%,19rem),1fr));align-items:start;display:grid}.room-card{gap:var(--space-3);min-width:0;padding:var(--space-3) var(--space-4);background:var(--surface);border:var(--hairline);border-radius:var(--radius-md);flex-direction:column;display:flex}.room-card__head{align-items:start;gap:var(--space-2);grid-template-columns:auto minmax(0,1fr) auto;display:grid}.room-card__who{min-width:0}.room-card__name{font-size:var(--text-lg);font-weight:var(--weight-semibold);line-height:var(--leading-tight);overflow-wrap:anywhere;margin:0}.room-card__job{color:var(--text-3);font-size:var(--text-sm);overflow-wrap:anywhere;margin:0}.room-card__head .icon-label{white-space:nowrap}.room-card__rows{margin:0;display:grid}.room-card__row{gap:var(--space-2);padding:var(--space-2) 0;font-size:var(--text-md);grid-template-columns:7.5rem minmax(0,1fr);display:grid}.room-card__row+.room-card__row{border-top:var(--hairline)}.room-card__row dt{color:var(--text-3);font-size:var(--text-sm);white-space:nowrap}.room-card__row dd{overflow-wrap:anywhere;min-width:0;margin:0}.room-card__wait{font-weight:var(--weight-semibold)}.room-card__reason{color:var(--text-2);font-size:var(--text-md);overflow-wrap:anywhere;margin:0}.room-card__reason-item{align-items:baseline;gap:0 var(--space-2);min-width:0;font-size:var(--text-sm);flex-wrap:wrap;display:flex}.room-today{margin:0;padding:0;list-style:none;display:grid}.room-card__foot{align-items:center;gap:var(--space-2);flex-wrap:wrap;margin-top:auto;display:flex}.room-card__foot .btn{white-space:nowrap}.room-card__details{flex-basis:100%}.room-muted{color:var(--text-3)}.room-jobs{gap:var(--space-1);margin:0;padding:0;list-style:none;display:grid}.room-job{align-items:baseline;gap:0 var(--space-2);flex-wrap:wrap;min-width:0;display:flex}.room-job__open{color:var(--text-2);font-size:var(--text-sm);text-underline-offset:.15em;white-space:nowrap;text-decoration:underline}.room-job__open:hover{color:var(--text)}.room-ref{align-items:flex-start;gap:var(--space-1);min-width:0;color:var(--text);display:inline-flex}.room-ref--link{text-decoration:none}.room-ref--link:hover .room-ref__title{text-decoration:underline}.room-ref__icon{color:var(--text-2);flex:none;margin-top:.2em;display:inline-flex}.room-ref__text{overflow-wrap:anywhere;min-width:0}.room-ref__key{color:var(--text-2);font-family:var(--font-mono);font-size:var(--text-sm)}.room-probes{gap:var(--space-1);margin:0;padding:0;list-style:none;display:grid}.room-probe{align-items:center;gap:0 var(--space-2);flex-wrap:wrap;display:flex}.room-probe .icon-label{white-space:nowrap}.room-probe__env{min-width:5.5rem;font-weight:var(--weight-medium)}.room-probe__meta{color:var(--text-3);font-size:var(--text-sm);white-space:nowrap;margin-left:auto}.room-probes+.room-muted{margin-top:var(--space-1);font-size:var(--text-sm);display:block}.room-job__line{gap:0 var(--space-2);font-size:var(--text-sm);flex-wrap:wrap;flex-basis:100%;display:flex}.room-details{gap:var(--space-1) var(--space-3);font-size:var(--text-sm);grid-template-columns:auto minmax(0,1fr);margin:0;display:grid}.room-details dt{color:var(--text-3)}.room-details dd{gap:var(--space-1);overflow-wrap:anywhere;flex-wrap:wrap;min-width:0;margin:0;display:flex}.room-details__pair{display:contents}.room-empty{justify-items:start;gap:var(--space-2);padding:var(--space-6) 0;display:grid}.room-empty h2{font-size:var(--text-lg);margin:0}.room-empty p{color:var(--text-2);margin:0}.board{padding-top:var(--space-3)}.board__pick{gap:var(--space-1);margin-bottom:var(--space-3);display:none}.board__pick-btn{padding:var(--space-1) var(--space-3);color:var(--text-2);font:inherit;font-size:var(--text-sm);white-space:nowrap;background:var(--surface);border:var(--hairline);cursor:pointer;border-radius:999px;flex:none}.board__pick-btn.is-current{color:var(--text);font-weight:var(--weight-semibold);background:var(--surface-selected);border-color:var(--border-strong)}.board__cols{gap:var(--space-3);grid-template-columns:repeat(4,minmax(0,1fr));align-items:start;display:grid}.board__col{gap:var(--space-2);min-width:0;padding:var(--space-2);background:var(--surface-2);border:var(--hairline);border-radius:var(--radius-md);display:grid}.board__col-head{justify-content:space-between;align-items:center;gap:0 var(--space-2);padding:var(--space-1) var(--space-1) 0;font-size:var(--text-md);font-weight:var(--weight-semibold);flex-wrap:wrap;margin:0;display:flex}.board__col-head>span{white-space:nowrap}.board__count{color:var(--text-3);font-weight:var(--weight-medium)}.board__list{gap:var(--space-2);margin:0;padding:0;list-style:none;display:grid}.board__empty{padding:var(--space-2) var(--space-1);color:var(--text-3);font-size:var(--text-sm);margin:0}.board__more{padding:0 var(--space-1) var(--space-1);font-size:var(--text-sm)}.board-card{background:var(--surface);border:var(--hairline);border-radius:var(--radius-md);min-width:0;display:grid}.board-card__main{gap:var(--space-1);padding:var(--space-2) var(--space-3);color:var(--text);border-radius:var(--radius-md) var(--radius-md) 0 0;display:grid;position:relative}.board-card:has(.board-card__open:hover){background:var(--surface-hover)}.board-card__open{border-radius:inherit;position:absolute;inset:0}.board-card__open:focus-visible{box-shadow:var(--focus-ring);outline:none}.board-card__main .room-ref--link{z-index:1;position:relative}.board-card__dot{column-gap:var(--space-2);font-size:var(--text-sm);font-weight:var(--weight-medium);grid-template-columns:auto minmax(0,1fr);align-items:center;display:grid}.board-card__dot>:first-child{grid-row:1/span 2;align-self:start}.board-card__dot>span{overflow-wrap:anywhere;min-width:0}.board-card__kind{color:var(--text-3);font-weight:var(--weight-regular);grid-column:2}.board-card__when{align-items:center;gap:var(--space-1);color:var(--text-3);font-size:var(--text-sm);text-wrap:balance;display:inline-flex}.room-job__line.room-notes,.board-card__when.room-notes{gap:0;display:grid}.room-notes>span{text-wrap:balance}.room-notes--hung{padding-left:calc(14px + var(--space-1))}.board-card__details{padding:0 var(--space-3) var(--space-2);font-size:var(--text-sm)}@container room (width<=760px){.board__pick{grid-template-columns:repeat(4,max-content);display:grid}.board__cols{grid-template-columns:minmax(0,1fr)}.board__col[data-shown=false],.board__col-head{display:none}}@container room (width<=520px){.board__pick{grid-template-columns:repeat(2,minmax(0,1fr))}.board__pick-btn{min-width:0}.room-lead{grid-template-columns:minmax(0,1fr)}.room-lead__open{grid-area:auto/1;justify-self:start}.room-card__row{grid-template-columns:6.5rem minmax(0,1fr)}}@container room (width<=340px){.board__pick-btn{padding-inline:var(--space-2);font-size:var(--text-xs)}}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{Cn as e,J as t,Lt as n,Rt as r,Tn as i,Vn as a,Wn as o,en as s,mn as c,nt as l,pn as u,q as d}from"./ui-DcmhYyYp.js";import{r as f,t as p}from"./router-W6nZsQ33.js";import{n as m}from"./store-IqrqHuFR.js";import{w as h}from"./format-BBZ8vFyT.js";var g=o(a(),1),_=c(),v=`localdost:chat-draft`;function y(t){return t instanceof e||t instanceof Error?t.message:`Something went wrong.`}function b({run:e,onChanged:a}){let o=d(),[c,b]=(0,g.useState)(null),[x,S]=(0,g.useState)(!1),C=e.status===`running`,w=e.status===`interrupted`,T=w&&(e.interruptReason===`model_cap`||e.interruptReason===`deploy_wait`);async function E(){b(`rerun`);try{await i.rerun(e.id),o.show({tone:`success`,title:w?`Trying again`:`Checking again`,body:`The new check shows in Activity when it starts.`,action:{label:`Open Activity`,onClick:()=>f(p({name:`feed`,dotId:e.watchId}))}}),m(`feed`),a?.()}catch(e){o.show({tone:`error`,title:w?`Could not try again`:`Could not check again`,body:y(e),action:{label:`Try again`,onClick:()=>void E()}})}finally{b(null)}}async function D(){S(!1),b(`cancel`);try{await i.cancelRun(e.id),o.show({tone:`success`,title:`Check stopped`}),a?.()}catch(e){o.show({tone:`error`,title:`Could not stop this check`,body:y(e)}),a?.()}finally{b(null)}}async function O(){b(`report`);try{let t=await i.saveRunReport(e.id);m(`reports`),o.show({tone:`success`,title:`Saved as a report`,body:t.title,action:{label:`Open report`,onClick:()=>f(p({name:`report`,id:t.id}))}})}catch(e){o.show({tone:`error`,title:`Could not save the report`,body:y(e),action:{label:`Try again`,onClick:()=>void O()}})}finally{b(null)}}function k(){let t=`About run ${e.id} (${h(e)}): `;try{sessionStorage.setItem(v,JSON.stringify({dotId:e.watchId,runId:e.id,text:t}))}catch{}f(p({name:`chat`,dotId:e.watchId}))}return(0,_.jsxs)(`div`,{className:`run-actions`,role:`group`,"aria-label":`Check actions`,children:[C?(0,_.jsx)(u,{variant:`danger`,icon:(0,_.jsx)(s,{size:14}),loading:c===`cancel`,onClick:()=>S(!0),children:`Stop the check`}):!T&&(0,_.jsx)(u,{variant:w?`primary`:`secondary`,icon:(0,_.jsx)(n,{size:14}),loading:c===`rerun`,onClick:()=>void E(),children:w?`Try again`:`Check again`}),e.verdict&&(0,_.jsx)(u,{icon:(0,_.jsx)(r,{size:14}),loading:c===`report`,onClick:()=>void O(),children:`Save as report`}),(0,_.jsx)(u,{icon:(0,_.jsx)(l,{size:14}),onClick:k,children:`Ask about this`}),(0,_.jsx)(t,{open:x,onClose:()=>S(!1),role:`alertdialog`,size:`sm`,title:`Stop this check?`,description:`The check stops now. What it already did stays in the steps, and you can check again later.`,initialFocus:`[data-safe]`,footer:(0,_.jsxs)(_.Fragment,{children:[(0,_.jsx)(u,{"data-safe":!0,onClick:()=>S(!1),children:`Keep checking`}),(0,_.jsx)(u,{variant:`danger`,onClick:()=>void D(),children:`Stop the check`})]})})]})}export{b as n,v as t};
|
|
2
|
+
//# sourceMappingURL=RunActions-ZY7yf1AF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@media (min-width:1100px){.run-layout>.run-panel{grid-row:1/span 16}}.qa-headline{margin-bottom:var(--space-2)}.qa-headline .status{font-size:var(--text-md);font-weight:var(--weight-semibold);color:var(--text)}.qa-summary{margin-bottom:var(--space-3);color:var(--text-2);text-wrap:pretty;overflow-wrap:anywhere;max-width:72ch}.qa-dl dd .status{vertical-align:baseline}.qa-strong{font-weight:var(--weight-semibold)}.qa-quote{quotes:"“" "”"}.qa-block{color:var(--text-2);margin-top:2px;display:block}.qa-stale{margin:0 0 var(--space-3)}.qa-hint{margin-bottom:var(--space-2)}.qa-after{margin-top:var(--space-2)}.qa-nowrap{white-space:nowrap}.qa-rows{border:var(--hairline);border-radius:var(--radius-md);background:var(--surface);margin:0;padding:0;list-style:none;container-type:inline-size}.qa-row{gap:var(--space-3);padding:var(--space-2) var(--space-3);min-width:0;scroll-margin-top:var(--space-4);display:flex}.qa-row+.qa-row{border-top:var(--hairline)}.qa-row:focus-visible{box-shadow:inset 0 0 0 2px var(--accent-brand);outline:none}.qa-rows--dense .qa-row{padding-block:var(--space-1)}.qa-row__main{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.qa-row__meta{align-items:center;gap:var(--space-1) var(--space-2);min-height:20px;font-size:var(--text-sm);flex-wrap:wrap;display:flex}.qa-row__aside{margin-left:auto}.qa-row__dim,.qa-row__area{color:var(--text-3);font-size:var(--text-sm)}.qa-row__area{color:var(--text-2)}.qa-row__title{font-weight:var(--weight-medium);color:var(--text);overflow-wrap:anywhere;text-wrap:pretty}.qa-row__title--plain{font-size:var(--text-md)}.qa-row__text{color:var(--text-2);font-size:var(--text-sm);overflow-wrap:anywhere;text-wrap:pretty}.qa-row__text--strong{color:var(--text);font-size:var(--text-md)}.qa-row__toggle{width:100%;min-height:var(--control-sm);color:inherit;font:inherit;text-align:left;cursor:pointer;border-radius:var(--radius-sm);background:0 0;border:0;padding:2px 0;display:flex}.qa-row__toggle:hover .qa-row__title{color:var(--accent)}.qa-row__toggle:focus-visible{box-shadow:var(--focus-ring);outline:none}.qa-row__chev{margin-left:var(--space-1);vertical-align:-2px;color:var(--text-3);transition:transform var(--dur-fast) var(--ease);display:inline-block}.qa-row__toggle[aria-expanded=true] .qa-row__chev{transform:rotate(180deg)}.qa-row__body{gap:var(--space-2);margin:var(--space-2) 0 var(--space-1);padding:var(--space-2) var(--space-3);border-radius:var(--radius);background:var(--surface-2);font-size:var(--text-sm);flex-direction:column;display:flex}.qa-row__body[hidden]{display:none}.qa-row__actions{gap:var(--space-2);padding-top:var(--space-1);flex-wrap:wrap;display:flex}.qa-kv{gap:var(--space-3);grid-template-columns:96px minmax(0,1fr);display:grid}.qa-kv__k{color:var(--text-3)}.qa-kv__v{overflow-wrap:anywhere;min-width:0;color:var(--text)}.qa-kv__text{color:var(--text-2)}.qa-steps{padding-left:var(--space-5);margin:0}.qa-flows{padding-left:var(--space-5);color:var(--text-2);font-size:var(--text-sm);margin:2px 0 0}.qa-links{align-items:baseline;gap:var(--space-1) var(--space-3);font-size:var(--text-sm);flex-wrap:wrap;display:flex}.qa-links:empty{display:none}.qa-links__item{align-items:baseline;gap:var(--space-1) var(--space-2);flex-wrap:wrap;min-width:0;display:inline-flex}.qa-links__k{color:var(--text-3)}.qa-links__title{color:var(--text-2)}.qa-links__new{color:var(--text-3);font-style:italic}.qa-inline-list{gap:var(--space-1) var(--space-3);flex-wrap:wrap;display:inline-flex}.qa-code,.qa-link{font:inherit;text-align:left;overflow-wrap:anywhere;background:0 0;border:0;padding:0;display:inline;position:relative}.qa-code{font-family:var(--font-mono);font-size:var(--text-xs);color:var(--text-2);cursor:pointer;text-decoration:underline;-webkit-text-decoration-color:color-mix(in srgb, currentColor 35%, transparent);text-decoration-color:color-mix(in srgb, currentColor 35%, transparent);text-underline-offset:2px}.qa-link{color:var(--text);cursor:pointer;text-decoration:underline;-webkit-text-decoration-color:color-mix(in srgb, currentColor 35%, transparent);text-decoration-color:color-mix(in srgb, currentColor 35%, transparent);text-underline-offset:2px}.qa-code:hover,.qa-link:hover{color:var(--accent);text-decoration-color:currentColor}.qa-code:focus-visible,.qa-link:focus-visible{border-radius:var(--radius-sm);box-shadow:var(--focus-ring);outline:none}.qa-code--plain,.qa-code--plain:hover{color:var(--text-2);cursor:auto;text-decoration:none}.qa-code--strong{color:var(--text);font-size:var(--text-sm)}.qa-code__ext{vertical-align:-1px;margin-left:2px}.qa-route{font-size:var(--text-xs);color:var(--text-2)}.qa-id{min-width:20px;color:var(--text-3);font-family:var(--font-mono);font-size:var(--text-xs)}.qa-test__lead{flex:none;justify-content:center;width:20px;padding-top:2px;display:flex}.qa-test__lead>.status{height:20px}.qa-test__pass{color:var(--ok-fg);margin-top:2px}.qa-check{cursor:pointer;align-items:center;height:20px;display:inline-flex;position:relative}.qa-check:before{content:"";position:absolute;inset:-12px -10px}.qa-check input{width:16px;height:16px;accent-color:var(--accent);cursor:pointer;margin:0}.qa-check input:focus-visible{box-shadow:var(--focus-ring);border-radius:var(--radius-sm);outline:none}.qa-test.is-done .qa-row__title{color:var(--text-2)}.qa-row__result{margin-left:auto}.qa-risk.is-dismissed .qa-row__title{color:var(--text-2)}.qa-area__head{justify-content:space-between;align-items:baseline;gap:var(--space-1) var(--space-3);flex-wrap:wrap;display:flex}.qa-details[hidden]{display:none}.qa-outcome{font-size:var(--text-sm);overflow-wrap:anywhere}.qa-outcome--used{color:var(--ok-fg)}.qa-outcome--dropped{color:var(--text-3)}.qa-outcome--open{color:var(--attention-fg)}.qa-errors{color:var(--outage-fg);font-size:var(--text-sm)}.run-patch__ln{min-width:4ch;margin-right:var(--space-2);color:var(--text-3);text-align:right;-webkit-user-select:none;user-select:none;display:inline-block}.qa-flash{animation:qa-flash 2.4s var(--ease)}.run-patch__line.qa-flash{box-shadow:inset 3px 0 0 var(--accent-brand)}@keyframes qa-flash{0%,60%{background-color:var(--surface-selected)}}@media (prefers-reduced-motion:reduce){.qa-flash{background-color:var(--surface-selected);animation:none}.qa-row__chev{transition:none}}@media (max-width:639px){.qa-row__result{margin-left:0}.qa-row{padding-inline:var(--space-2);gap:var(--space-2)}.qa-kv{grid-template-columns:minmax(0,1fr);gap:0}.qa-row__body{padding:var(--space-2)}}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import{B as e,Cn as t,G as n,H as r,I as i,J as a,L as o,Mn as s,N as c,R as l,Tn as u,Vn as d,W as f,Wn as p,_ as m,b as h,cn as g,dn as _,dt as v,f as y,i as b,it as x,mn as S,on as ee,pn as C,q as w,rt as T}from"./ui-DcmhYyYp.js";import{t as E}from"./router-W6nZsQ33.js";import{c as D,i as O,r as k,t as A}from"./store-IqrqHuFR.js";import{S as te,T as ne,b as re,c as ie,d as ae,f as oe,g as se,h as ce,l as le,n as ue,p as j,r as de,t as fe,u as pe,v as M,w as me,x as he,y as ge}from"./format-BBZ8vFyT.js";import{Bt as _e,Xt as ve,a as ye,nn as be,on as xe}from"./index-B6qKm1NW.js";import{n as Se,t as Ce}from"./authedMedia-BTYt_tyu.js";import{E as we,c as Te,l as Ee,o as De}from"./impactModel-MY1OFuiP.js";import{r as N}from"./true-9Q68cs5b.js";import{t as Oe}from"./ImpactList-C-RNuDB0.js";import{n as ke}from"./DotStage-CtMNzCN3.js";import{t as Ae}from"./GfmView-C-NYaduC.js";import{i as je,t as Me}from"./CardFromRef-BaTGmZ9c.js";import{n as Ne}from"./RunActions-ZY7yf1AF.js";/* empty css */import{a as Pe,i as Fe,n as Ie,o as Le,r as Re,s as ze}from"./TestRows-wh03T5Li.js";var P=p(d(),1),F={critical:{label:`Critical`,status:`outage`,rank:0},high:{label:`High`,status:`outage`,rank:1},medium:{label:`Medium`,status:`attention`,rank:2},low:{label:`Low`,status:`paused`,rank:3}},Be={likely:`likely`,possible:`possible`,unlikely:`unlikely`},Ve={confirmed:{label:`Confirmed`,status:`ok`},uncertain:{label:`Uncertain`,status:`attention`},unverified:{label:`Unverified`,status:`paused`},refuted:{label:`Refuted`,status:`paused`}},I={must:{label:`Must`,tone:`accent`,rank:0},should:{label:`Should`,tone:`neutral`,rank:1},could:{label:`Could`,tone:`neutral`,rank:2}},He={e2e:`E2E`,integration:`Integration`,unit:`Unit`,manual:`Manual`,exploratory:`Exploratory`},Ue={narrow:`Narrow`,area:`Area`,broad:`Broad`,full:`Full suite`},We={owner_map:`owner map`,route:`route`,spec_link:`spec link`,component:`component`,path:`path`,codeowners:`CODEOWNERS`,reviewer:`reviewer`},Ge={end_users:`end users`,admins:`admins`,api_consumers:`API consumers`,internal:`internal`,none:`nobody`},L={passed:{label:`Passed`,status:`ok`},failed:{label:`Failed`,status:`outage`},flaky:{label:`Flaky`,status:`attention`},skipped:{label:`Skipped`,status:`paused`},not_run:{label:`Not run`,status:`paused`}},Ke={passed:`passed`,failed:`failed`,timedOut:`failed`,flaky:`flaky`,skipped:`skipped`};function R(e){return`${Math.round(Math.max(0,Math.min(1,e))*100)}%`}function z(e){return(e??``).slice(0,7)}function qe(e){return e.line<=0?`${e.file} (removed)`:`${e.file}:${e.line}${e.lineEnd&&e.lineEnd!==e.line?`-${e.lineEnd}`:``}`}function Je(e,t){return e===t||e.endsWith(`/${t}`)||t.endsWith(`/${e}`)}function Ye(e,t){if(!t.existingTest||!e.report)return;let n=e.report.cases.filter(e=>Je(e.file,t.existingTest));return t.existingTitle?n.find(e=>e.title===t.existingTitle)??n.find(e=>e.title.includes(t.existingTitle)):n.find(e=>e.status===`failed`||e.status===`timedOut`)??n[0]}function Xe(e,t){if(t.result)return{result:t.result,source:t.resultSource??`runner`};let n=Ye(e,t);return n?{result:Ke[n.status],source:`runner`}:void 0}var Ze={spec:`Existing spec`,playwright:`Playwright e2e`,aivision:`AI-Vision`};function Qe(e){return e.resultSource===`runner`?(e.coveredBy??[]).filter(e=>e!==`spec`):[]}function $e(e,t){return e.report?.generated?.find(e=>e.itemId===t.id)}function et(e){return[...e].sort((e,t)=>F[e.severity].rank-F[t.severity].rank||t.confidence-e.confidence)}function tt(e){return[...e].sort((e,t)=>I[e.priority].rank-I[t.priority].rank)}function nt(e){return et(e.risks.filter(e=>e.verifier.status!==`refuted`))}function rt(e,t,n){let r=e.trigger?.repo;if(!r||!t)return;let i=n.file.split(`/`).map(encodeURIComponent).join(`/`),a=n.line>0?`#L${n.line}${n.lineEnd&&n.lineEnd!==n.line?`-L${n.lineEnd}`:``}`:``;return`https://github.com/${encodeURIComponent(r.owner)}/${encodeURIComponent(r.name)}/blob/${encodeURIComponent(t)}/${i}${a}`}function it(e){return`file-${e.replace(/[^A-Za-z0-9_-]/g,`_`)}`}function at(){return typeof window<`u`&&typeof window.matchMedia==`function`&&window.matchMedia(`(prefers-reduced-motion: reduce)`).matches}function B(e){e.classList.remove(`qa-flash`),e.offsetWidth,e.classList.add(`qa-flash`),window.setTimeout(()=>e.classList.remove(`qa-flash`),2400)}function ot(e,t=!1){let n=document.getElementById(it(e.file));if(!(n instanceof HTMLDetailsElement))return!1;if(n.closest(`[hidden]`)&&!t)return window.dispatchEvent(new Event(`localdost:show-all-files`)),window.setTimeout(()=>ot(e,!0),0),!0;for(let e=n.parentElement;e;e=e.parentElement)e instanceof HTMLDetailsElement&&(e.open=!0);n.open=!0;let r=e.line>0?n.querySelector(`[data-line="${e.line}"]`):null;if((r??n).scrollIntoView({block:r?`center`:`start`,behavior:at()?`auto`:`smooth`}),r){B(r);let t=e.lineEnd&&e.lineEnd>e.line?e.lineEnd:e.line;for(let r=e.line+1;r<=t;r++){let e=n.querySelector(`[data-line="${r}"]`);e&&B(e)}}return n.querySelector(`summary`)?.focus({preventScroll:!0}),!0}function V(e){let t=document.getElementById(e);return t?(t instanceof HTMLDetailsElement&&(t.open=!0),t.scrollIntoView({block:`start`,behavior:at()?`auto`:`smooth`}),!t.hasAttribute(`tabindex`)&&!(t instanceof HTMLButtonElement)&&t.setAttribute(`tabindex`,`-1`),t.focus({preventScroll:!0}),B(t),!0):!1}var H=S();function U({id:e,title:t,count:n,actions:r,children:i}){return(0,H.jsxs)(`section`,{className:`run-section run-section--${e}`,"aria-labelledby":`${e}-h`,children:[(0,H.jsxs)(`header`,{className:`run-section__header`,children:[(0,H.jsxs)(`h2`,{id:`${e}-h`,className:`run-section__title`,children:[t,n!=null&&(0,H.jsx)(`span`,{className:`run-section__count num`,children:n})]}),r&&(0,H.jsx)(`div`,{className:`run-section__actions`,children:r})]}),i]})}var st={github:`GitHub`,jira:`Jira`,linear:`Linear`,probe:`Site check`,statuspage:`Site status page`,schedule:`Schedule`,user:`You`};function ct({run:e}){let t=e.trigger;if(!t)return(0,H.jsx)(U,{id:`trigger`,title:`Trigger`,children:(0,H.jsx)(`p`,{className:`run-muted`,children:`Started by a person or a schedule, not by an event.`})});let n=[[`Source`,`${st[t.source]??t.source}, ${t.kind.replace(/_/g,` `)}`]];t.repo&&n.push([`Repository`,`${t.repo.owner}/${t.repo.name}`]),t.pr&&(n.push([`Pull request`,`#${t.pr.number}${t.pr.author?` by ${t.pr.author}`:``}${t.pr.fork?` (fork)`:``}`]),n.push([`Branch`,`${t.pr.headRef} into ${t.pr.baseRef}`]),n.push([`Commit`,(0,H.jsx)(`code`,{children:(t.pr.mergeSha??t.pr.headSha).slice(0,12)},`sha`)])),t.push&&n.push([`Push`,(0,H.jsx)(`code`,{children:`${t.push.ref} ${t.push.after.slice(0,12)}`},`push`)]),t.ticket&&n.push([`Ticket`,`${t.ticket.key} (${t.ticket.tracker})`]),t.ci&&n.push([`Build`,`${t.ci.workflow}: ${t.ci.conclusion}`]),t.probe&&(n.push([`Site check`,(0,H.jsx)(`span`,{className:`run-break`,children:t.probe.url},`probe`)]),n.push([`Site check result`,`${t.probe.status??`no response`}${t.probe.error?`, ${t.probe.error}`:``}, ${M(t.probe.consecutiveFailures,`failure`)} in a row`])),n.push([`Started`,le(e.createdAt)]),e.finishedAt&&n.push([`Finished`,le(e.finishedAt)]);let r=je(t);return(0,H.jsxs)(U,{id:`trigger`,title:`Trigger`,actions:t.url?(0,H.jsxs)(`a`,{className:`btn btn--ghost btn--sm`,href:t.url,target:`_blank`,rel:`noreferrer noopener`,children:[(0,H.jsx)(`span`,{className:`btn__label`,children:`Open source`}),(0,H.jsx)(`span`,{className:`btn__icon`,children:(0,H.jsx)(v,{size:14})})]}):void 0,children:[(0,H.jsx)(`p`,{className:`run-trigger-title`,children:t.title}),r&&(0,H.jsx)(`div`,{className:`run-trigger-card`,children:(0,H.jsx)(Me,{...r,dotId:e.watchId})}),(0,H.jsx)(`dl`,{className:`run-dl`,children:n.map(([e,t])=>(0,H.jsxs)(`div`,{className:`run-dl__row`,children:[(0,H.jsx)(`dt`,{children:e}),(0,H.jsx)(`dd`,{children:t})]},e))})]})}var lt={added:`Added`,modified:`Modified`,removed:`Removed`,renamed:`Renamed`};function ut(e){let t=0;return e.map(e=>{let n=/^@@ -\d+(?:,\d+)? \+(\d+)/.exec(e);return n?(t=Number(n[1]),null):e.startsWith(`-`)||e.startsWith(`\\`)||t===0?null:t++})}function dt({patch:e}){let t=e.split(`
|
|
2
|
+
`),n=ut(t);return(0,H.jsx)(`pre`,{className:`run-patch`,tabIndex:0,"aria-label":`Patch`,children:t.map((e,t)=>{let r=e.startsWith(`@@`)?`hunk`:e.startsWith(`+`)?`add`:e.startsWith(`-`)?`del`:`ctx`,i=n[t];return(0,H.jsxs)(`span`,{className:`run-patch__line run-patch__line--${r}`,"data-line":i??void 0,children:[(0,H.jsx)(`span`,{className:`run-patch__ln`,"aria-hidden":`true`,children:i??``}),e||` `,`
|
|
3
|
+
`]},t)})})}function ft(e,t){if(!t?.length)return[{id:`all`,area:`All files`,files:e}];let n=new Map(e.map(e=>[e.path,e])),r=new Set,i=[];for(let e of t){let t=e.files.filter(e=>n.has(e)&&!r.has(e)).map(e=>n.get(e));t.forEach(e=>r.add(e.path)),t.length&&i.push({id:e.id,area:e.area,files:t})}let a=e.filter(e=>!r.has(e.path));return a.length&&i.push({id:`unmapped`,area:`Other files`,files:a}),i}function pt(e){return e.map(e=>{let t=`diff --git a/${e.path} b/${e.path}\n--- ${e.status===`added`?`/dev/null`:`a/${e.path}`}\n+++ ${e.status===`removed`?`/dev/null`:`b/${e.path}`}`;return e.patch?`${t}\n${e.patch}`:`${t}\n(no patch recorded)`}).join(`
|
|
4
|
+
`)}function mt(e){return e.startsWith(`diff --git`)||e.startsWith(`+++ `)||e.startsWith(`--- `)?`file`:e.startsWith(`@@`)?`hunk`:e.startsWith(`+`)?`add`:e.startsWith(`-`)?`del`:`ctx`}var ht=`localdost:show-all-files`;function gt({f:e}){return(0,H.jsx)(`li`,{children:(0,H.jsxs)(`details`,{className:`run-file`,id:it(e.path),children:[(0,H.jsxs)(`summary`,{className:`run-file__summary`,children:[(0,H.jsx)(x,{size:14,className:`run-file__chev`,"aria-hidden":`true`}),(0,H.jsx)(`span`,{className:`run-file__status run-file__status--${e.status}`,children:lt[e.status]}),(0,H.jsx)(`span`,{className:`run-file__path`,children:(0,H.jsx)(xt,{path:e.path})}),(0,H.jsxs)(`span`,{className:`run-file__delta num`,"aria-label":`${e.additions} added, ${e.deletions} removed`,children:[(0,H.jsxs)(`span`,{className:`run-add`,children:[`+`,e.additions]}),` `,(0,H.jsxs)(`span`,{className:`run-del`,children:[`-`,e.deletions]})]})]}),e.patch?(0,H.jsx)(dt,{patch:e.patch}):(0,H.jsx)(`p`,{className:`run-muted run-file__nopatch`,children:`No patch was recorded for this file.`})]})})}function _t({files:e,summary:t,areas:n,filter:r=null,onFilter:i,sourceUrl:a}){let[o,s]=(0,P.useState)(!1);if((0,P.useEffect)(()=>{if(!r)return;let e=document.getElementById(`files-${r}`);e instanceof HTMLDetailsElement&&(e.open=!0)},[r]),(0,P.useEffect)(()=>{if(!i)return;let e=()=>i(null);return window.addEventListener(ht,e),()=>window.removeEventListener(ht,e)},[i]),!e?.length)return t?(0,H.jsx)(U,{id:`files`,title:`Changed files`,children:(0,H.jsx)(`p`,{className:`run-muted`,children:t})}):null;let c=ft(e,n),l=r?c.find(e=>e.id===r):void 0,u=l?l.files:e,d=e.reduce((e,t)=>e+t.additions,0),f=e.reduce((e,t)=>e+t.deletions,0);return(0,H.jsxs)(U,{id:`files`,title:`Changed files`,count:e.length,actions:(0,H.jsxs)(H.Fragment,{children:[(0,H.jsx)(C,{size:`sm`,variant:`ghost`,"aria-expanded":o,"aria-controls":`files-raw`,onClick:()=>s(e=>!e),children:o?`Hide raw diff`:`Raw diff`}),a&&(0,H.jsxs)(`a`,{className:`btn btn--ghost btn--sm`,href:a,target:`_blank`,rel:`noreferrer noopener`,children:[(0,H.jsx)(`span`,{className:`btn__label`,children:`Open on GitHub`}),(0,H.jsx)(`span`,{className:`btn__icon`,children:(0,H.jsx)(v,{size:14})})]})]}),children:[(0,H.jsxs)(`p`,{className:`run-muted num`,children:[M(e.length,`file`),` in `,M(c.length,`group`),`, `,(0,H.jsxs)(`span`,{className:`run-add`,children:[`+`,d]}),` `,(0,H.jsxs)(`span`,{className:`run-del`,children:[`-`,f]})]}),l&&(0,H.jsxs)(`div`,{className:`run-files__filter`,role:`status`,children:[(0,H.jsxs)(`span`,{children:[`Showing `,(0,H.jsx)(`strong`,{children:l.area}),` only, `,M(l.files.length,`file`),`.`]}),(0,H.jsx)(C,{size:`sm`,variant:`ghost`,onClick:()=>i?.(null),children:`Show all files`})]}),o&&(0,H.jsx)(`pre`,{id:`files-raw`,className:`run-patch run-raw`,tabIndex:0,"aria-label":`Raw diff of ${M(u.length,`file`)}`,children:pt(u).split(`
|
|
5
|
+
`).map((e,t)=>(0,H.jsxs)(`span`,{className:`run-patch__line run-patch__line--${mt(e)}`,children:[e||` `,`
|
|
6
|
+
`]},t))}),(0,H.jsx)(`ul`,{className:`run-groups`,children:c.map(e=>{let t=e.files.reduce((e,t)=>e+t.additions,0),n=e.files.reduce((e,t)=>e+t.deletions,0);return(0,H.jsx)(`li`,{hidden:!!l&&l.id!==e.id,children:(0,H.jsxs)(`details`,{className:`run-group`,id:`files-${e.id}`,children:[(0,H.jsxs)(`summary`,{className:`run-group__summary`,children:[(0,H.jsx)(x,{size:14,className:`run-file__chev`,"aria-hidden":`true`}),(0,H.jsx)(`span`,{className:`run-group__name`,children:e.area}),(0,H.jsx)(`span`,{className:`run-group__meta num`,children:M(e.files.length,`file`)}),(0,H.jsxs)(`span`,{className:`run-file__delta num`,"aria-label":`${t} added, ${n} removed`,children:[(0,H.jsxs)(`span`,{className:`run-add`,children:[`+`,t]}),` `,(0,H.jsxs)(`span`,{className:`run-del`,children:[`-`,n]})]})]}),(0,H.jsx)(`ul`,{className:`run-files`,children:e.files.map(e=>(0,H.jsx)(gt,{f:e},e.path))})]})},e.id)})})]})}var vt={failed:0,timedOut:1,flaky:2,passed:3,skipped:4};function yt({command:e}){let[t,n]=(0,P.useState)(!1),r=ne(e),i=r!==e.trim();return(0,H.jsxs)(`div`,{className:`run-test-command`,children:[(0,H.jsx)(`code`,{className:`run-test-command__short`,children:t||!i?e:r}),i&&(0,H.jsx)(C,{size:`sm`,variant:`ghost`,className:`run-test-command__toggle`,onClick:()=>n(e=>!e),"aria-expanded":t,children:t?`Show short command`:`Show full command`})]})}function bt({run:e}){let t=e.report,[r,i]=(0,P.useState)(!1);if(!t)return(0,H.jsx)(U,{id:`tests`,title:`Tests`,children:(0,H.jsx)(`p`,{className:`run-muted`,children:e.status===`running`?`Results appear here when the tests finish.`:`No automated tests ran for this check.`})});if(t.notRun?.stage===`skipped`){let e=t.notRun.reason.trim().replace(/\.$/,``);return(0,H.jsx)(U,{id:`tests`,title:`Tests`,children:(0,H.jsxs)(`div`,{className:`run-not-run run-not-run--skipped`,role:`status`,children:[(0,H.jsx)(_,{status:`paused`,size:`sm`,showLabel:!0,label:`Tests skipped`}),e&&(0,H.jsxs)(`p`,{children:[e.charAt(0).toUpperCase()+e.slice(1),`.`]})]})})}let a=t.notRun?t.notRun.stage===`verify`?`GitHub could not confirm the code version`:t.notRun.stage===`setup`?`A setup step failed`:t.notRun.stage===`command`?`The test command does not work`:t.notRun.stage===`checkout`?`The tests are not on this version of the code`:`No test report came back`:``,o=t.notRun?(0,H.jsxs)(`div`,{className:`run-not-run`,role:`status`,children:[(0,H.jsx)(_,{status:`attention`,size:`sm`,showLabel:!0,label:`${t.cases.length?`Some tests`:`Tests`} did not run: ${a.toLowerCase()}`}),(0,H.jsx)(`p`,{children:t.notRun.reason}),(0,H.jsx)(`p`,{className:`run-muted`,children:`This is a setup problem. It says nothing about the change. A developer can fix the test settings in Advanced, then you can check again.`})]}):null,s=t.hint?(0,H.jsxs)(`p`,{className:`run-muted`,role:`note`,children:[t.hint,t.hintFiles?` Untracked files: ${t.hintFiles}.`:``]}):null;if(t.notRun&&t.cases.length===0)return(0,H.jsxs)(U,{id:`tests`,title:`Tests`,children:[o,s,(0,H.jsx)(yt,{command:t.command}),t.stdoutTail&&(0,H.jsx)(`pre`,{className:`run-not-run__out`,tabIndex:0,"aria-label":`Command output`,children:t.stdoutTail.replace(/\s+$/,``)})]});let c=[...t.cases].sort((e,t)=>vt[e.status]-vt[t.status]),l=c.filter(e=>e.status!==`passed`),u=r||l.length===0?c:l,d=c.length-u.length;return(0,H.jsxs)(U,{id:`tests`,title:`Tests`,count:c.length,children:[o,s,(0,H.jsxs)(`div`,{className:`run-test-totals num`,"aria-label":`Totals`,children:[(0,H.jsx)(_,{status:`ok`,size:`sm`,showLabel:!0,label:`${t.passed} passed`}),t.failed>0&&(0,H.jsx)(_,{status:`outage`,size:`sm`,showLabel:!0,label:`${t.failed} failed`}),t.flaky>0&&(0,H.jsx)(_,{status:`attention`,size:`sm`,showLabel:!0,label:`${t.flaky} flaky`}),t.skipped>0&&(0,H.jsx)(_,{status:`paused`,size:`sm`,showLabel:!0,label:`${t.skipped} skipped`}),(0,H.jsxs)(`span`,{className:`run-muted`,children:[j(t.durationMs),` in `,t.mode,` mode`,t.interrupted?`, interrupted`:``]})]}),(0,H.jsx)(yt,{command:t.command}),c.length===0?(0,H.jsx)(n,{compact:!0,kind:`zero`,title:`No tests ran`,body:`No automated test matched this change. A developer can check the test settings in Advanced.`}):(0,H.jsx)(`div`,{className:`run-table-scroll`,tabIndex:0,role:`region`,"aria-label":`Test results table`,children:(0,H.jsxs)(`table`,{className:`run-table`,children:[(0,H.jsx)(`thead`,{children:(0,H.jsxs)(`tr`,{children:[(0,H.jsx)(`th`,{scope:`col`,children:`Status`}),(0,H.jsx)(`th`,{scope:`col`,children:`Test`}),(0,H.jsx)(`th`,{scope:`col`,className:`run-table__num`,children:`Duration`}),(0,H.jsx)(`th`,{scope:`col`,className:`run-table__num`,children:`Retries`})]})}),(0,H.jsx)(`tbody`,{children:u.map((e,t)=>{let n=ie[e.status];return(0,H.jsxs)(`tr`,{"data-status":e.status,children:[(0,H.jsx)(`td`,{children:(0,H.jsx)(_,{status:n.status,size:`sm`,showLabel:!0,label:n.label})}),(0,H.jsxs)(`td`,{className:`run-table__test`,children:[(0,H.jsx)(`span`,{className:`run-table__title`,children:e.title}),(0,H.jsx)(`span`,{className:`run-table__file`,children:e.file}),(0,H.jsxs)(`span`,{className:`run-table__meta num`,children:[j(e.durationMs),e.retries>0?`\u00a0\u00b7 ${M(e.retries,`retry`,`retries`)}`:``]}),e.error&&(0,H.jsx)(`pre`,{className:`run-table__error`,children:e.error})]}),(0,H.jsx)(`td`,{className:`run-table__num num`,children:j(e.durationMs)}),(0,H.jsx)(`td`,{className:`run-table__num num`,children:e.retries})]},`${e.file}:${e.title}:${t}`)})})]})}),(d>0||r)&&l.length>0&&(0,H.jsx)(C,{size:`sm`,variant:`ghost`,className:`run-more`,onClick:()=>i(e=>!e),"aria-expanded":r,children:r?`Hide passed tests`:`Show ${M(d,`passed test`)}`})]})}function xt({path:e}){let t=e.split(`/`);return(0,H.jsx)(H.Fragment,{children:t.map((e,n)=>(0,H.jsxs)(P.Fragment,{children:[e,n<t.length-1&&(0,H.jsxs)(H.Fragment,{children:[`/`,(0,H.jsx)(`wbr`,{})]})]},n))})}var St={high:{label:`High`,status:`outage`},medium:{label:`Medium`,status:`attention`},low:{label:`Low`,status:`paused`}};function W({items:e,id:t,title:n}){return e.length?(0,H.jsxs)(`div`,{className:`run-verdict__group`,"aria-labelledby":t,role:`group`,children:[(0,H.jsxs)(`h3`,{id:t,className:`run-subtitle`,children:[n,` `,(0,H.jsx)(`span`,{className:`run-section__count num`,children:e.length})]}),(0,H.jsx)(`ul`,{className:`run-bullets`,children:e.map((e,t)=>(0,H.jsx)(`li`,{children:e},t))})]}):null}var Ct=new Set([`pr_comment`,`ticket_comment`,`check_run`,`slack_post`,`open_pr`,`file_defect`,`issue_create`]),wt=new Set([`pr_comment`,`check_run`,`open_pr`]);function Tt({text:e,dotId:t,className:n}){let[r,i]=(0,P.useState)(!1);return(0,H.jsxs)(`div`,{className:`run-md`,children:[(0,H.jsx)(`button`,{type:`button`,className:`run-md__toggle`,"aria-pressed":r,onClick:()=>i(e=>!e),children:r?`Show preview`:`Show plain text`}),r?(0,H.jsx)(`pre`,{className:`${n??``} run-md__source`,tabIndex:0,"aria-label":`Markdown source`,children:be(e)}):(0,H.jsx)(Ae,{className:n,text:e,dotId:t,demoteHeadings:!0})]})}function Et({verdict:e,dotId:t}){if(!e)return null;let n=[...e.findings].sort((e,t)=>[`high`,`medium`,`low`].indexOf(e.severity)-[`high`,`medium`,`low`].indexOf(t.severity)),r=!n.length&&!e.openQuestions.length&&!e.testIdeas.length&&!e.testsAtRisk.length;return(0,H.jsxs)(U,{id:`verdict`,title:`What the dot found`,children:[e.suspectedCause&&(0,H.jsxs)(`p`,{className:`run-cause`,children:[(0,H.jsx)(`span`,{className:`run-cause__label`,children:`Suspected cause`}),` `,e.suspectedCause]}),n.length>0&&(0,H.jsxs)(`div`,{className:`run-verdict__group`,role:`group`,"aria-labelledby":`v-findings`,children:[(0,H.jsxs)(`h3`,{id:`v-findings`,className:`run-subtitle`,children:[`Findings `,(0,H.jsx)(`span`,{className:`run-section__count num`,children:n.length})]}),(0,H.jsx)(`ul`,{className:`run-findings list-box`,children:n.map((e,t)=>(0,H.jsxs)(`li`,{className:`run-finding`,children:[(0,H.jsx)(m,{icon:(0,H.jsx)(y,{level:e.severity,size:14}),label:St[e.severity].label,className:`run-finding__severity`}),(0,H.jsxs)(`div`,{className:`run-finding__main`,children:[(0,H.jsx)(`p`,{className:`run-finding__title`,children:e.title}),e.detail&&(0,H.jsx)(`p`,{className:`run-finding__detail`,children:e.detail}),e.file&&(0,H.jsx)(`p`,{className:`run-finding__file`,children:(0,H.jsxs)(`code`,{children:[e.file,e.line==null?``:`:${e.line}`]})})]})]},t))})]}),(0,H.jsx)(W,{id:`v-questions`,title:`Open questions`,items:e.openQuestions}),(0,H.jsx)(W,{id:`v-ideas`,title:`To test by hand`,items:e.testIdeas}),(0,H.jsx)(W,{id:`v-risk`,title:`Tests at risk`,items:e.testsAtRisk}),r&&(0,H.jsx)(`p`,{className:`run-muted`,children:`No findings, questions, or things to test by hand.`}),e.summary&&(0,H.jsxs)(`details`,{className:`run-summary`,children:[(0,H.jsx)(`summary`,{children:`Full comment text`}),(0,H.jsx)(Tt,{className:`run-summary__body`,text:e.summary,dotId:t})]})]})}function Dt(e){let t=`${e.added} test ${e.added===1?`case`:`cases`} designed`,n=[e.existing?`${e.existing} already there`:``,e.dropped?`${e.dropped} left out`:``].filter(Boolean).join(`, `);return n?`${t} (${n})`:t}function Ot({run:e}){let t=e.designed;if(!t)return null;let n=E({name:`cases`,dotId:e.watchId,requirement:t.requirement});return(0,H.jsx)(U,{id:`designed`,title:`Test cases`,count:t.added,actions:(0,H.jsx)(`a`,{className:`btn btn--secondary btn--sm`,href:n,children:(0,H.jsx)(`span`,{className:`btn__label`,children:`Open the test cases`})}),children:t.error?(0,H.jsx)(`p`,{className:`run-muted`,children:t.error}):(0,H.jsxs)(`p`,{children:[Dt(t),` for `,t.requirement,`.`,t.added>0?` They wait as drafts. Mark each one ready on the Test cases page.`:``]})})}function kt({run:e,repo:t}){let n=e.impact,i=O(n?De(e.watchId,n.ticket,`all`):null,t=>u.impact(e.watchId,{ticket:n.ticket,state:`all`},t),{refreshOn:[`run`],throttleMs:1500});if(!n)return null;let a=i.data?.items??[],o=i.error&&!i.data,s=E({name:`cases`,dotId:e.watchId,requirement:n.ticket});return(0,H.jsx)(U,{id:`impact`,title:`Existing tests`,count:n.checked,actions:a.length>0?(0,H.jsx)(`a`,{className:`btn btn--secondary btn--sm`,href:s,children:(0,H.jsx)(`span`,{className:`btn__label`,children:`Open the test cases`})}):void 0,children:n.error?(0,H.jsx)(`p`,{className:`run-muted`,children:n.error}):n.checked===0?(0,H.jsxs)(`p`,{className:`run-muted`,children:[`No test the dot already has looks affected by `,n.ticket,`.`]}):o?(0,H.jsx)(r,{compact:!0,title:`Could not load the existing tests check`,error:i.error,onRetry:()=>void i.reload()}):(0,H.jsxs)(H.Fragment,{children:[(0,H.jsx)(`p`,{children:a.length?Te(a,n.leftOut):`${n.checked} existing ${n.checked===1?`test`:`tests`} checked.${Ee(n.leftOut)?` ${Ee(n.leftOut)}`:``}`}),a.length>0&&(0,H.jsx)(Oe,{items:a,repo:t})]})})}function At({run:e,approvals:t,outbox:n}){let r=new Map(t.map(e=>[e.id,e]));return e.actions.length?(0,H.jsx)(U,{id:`actions`,title:`Sent`,count:e.actions.length,children:(0,H.jsx)(`ul`,{className:`run-outward`,children:e.actions.map(({action:t,result:i,approvalId:a},o)=>{let s=a?r.get(a):void 0,c=ue[i],l=n.some(e=>e.action.kind===t.kind&&e.action.target===t.target&&e.action.title===t.title),u=s?s.status===`pending`:i===`pending_approval`,d=s&&s.status!==`pending`?_e[s.status]??s.status:null;return(0,H.jsxs)(`li`,{className:`run-outward__item`,children:[(0,H.jsxs)(`details`,{className:`run-outward__details`,children:[(0,H.jsxs)(`summary`,{className:`run-outward__summary`,children:[(0,H.jsx)(x,{size:14,className:`run-file__chev`,"aria-hidden":`true`}),(0,H.jsxs)(`span`,{className:`run-outward__main`,children:[(0,H.jsx)(`span`,{className:`run-outward__title`,children:t.title}),(0,H.jsxs)(`span`,{className:`run-outward__meta`,children:[fe[t.kind]??t.kind,` to `,(0,H.jsx)(`span`,{className:`run-break`,children:ve(t.target)}),l?`, kept in the demo (nothing left this server)`:``]})]}),(0,H.jsx)(g,{tone:c.tone,children:c.label})]}),Ct.has(t.kind)&&t.body?(0,H.jsx)(`div`,{className:`run-outward__md`,children:(0,H.jsx)(Tt,{className:`run-outward__body`,text:t.body,dotId:wt.has(t.kind)?e.watchId:void 0})}):(0,H.jsx)(`div`,{className:`run-outward__body`,children:be(t.body??``)||`No body.`}),s?.error&&(0,H.jsxs)(`p`,{className:`run-outward__error`,children:[`The last try failed: `,s.error]})]}),u&&(0,H.jsx)(`a`,{className:`run-outward__link`,href:E({name:`inbox`}),children:`Review in Inbox`}),d&&(0,H.jsx)(`span`,{className:`run-outward__decided`,children:d})]},o)})})}):(0,H.jsx)(U,{id:`actions`,title:`Sent`,children:(0,H.jsx)(`p`,{className:`run-muted`,children:e.status===`running`?`Nothing sent yet.`:`This check did not post, comment, or send anything.`})})}var jt={small:`Small`,medium:`Medium`,large:`Large`},Mt={low:`ok`,medium:`attention`,high:`outage`},Nt={low:`Low risk`,medium:`Medium risk`,high:`High risk`};function Pt(e){return e.bugs?{status:`outage`,label:`Bugs found`}:e.testsSkipped?{status:`paused`,label:`Tests skipped`}:e.notRun?{status:`attention`,label:`Tests did not run`}:e.untested?{status:`attention`,label:`Not all tested`}:e.total?{status:`ok`,label:`Tests passed`}:{status:`paused`,label:`Reviewed`}}function Ft({summary:e,filter:t,onFilter:n}){let r=e?.change,i=e?.test;if(!r&&!i)return null;let a=i?Pt(i):null;return(0,H.jsxs)(U,{id:`change`,title:r?`What this change does`:`Test result`,children:[r&&(0,H.jsx)(`p`,{className:`run-change__what`,children:r.whatItDoes}),r&&(0,H.jsxs)(`p`,{className:`run-change__size run-muted num`,children:[jt[r.size],` change: `,M(r.files,`file`),`, `,(0,H.jsxs)(`span`,{className:`run-add`,children:[`+`,r.additions]}),` `,(0,H.jsxs)(`span`,{className:`run-del`,children:[`-`,r.deletions]})]}),r&&r.areas.length>0&&(0,H.jsxs)(H.Fragment,{children:[(0,H.jsx)(`h3`,{id:`change-areas-h`,className:`run-subtitle`,children:`Areas this change touches`}),(0,H.jsx)(`ul`,{className:`run-change__areas`,"aria-labelledby":`change-areas-h`,children:r.areas.map(e=>{let r=t===e.id;return(0,H.jsx)(`li`,{children:(0,H.jsxs)(`button`,{type:`button`,className:`run-chip`,"aria-pressed":r,title:r?`Show all changed files`:`Show only the ${e.area} files`,onClick:()=>n(r?null:e.id),children:[(0,H.jsx)(`span`,{className:`run-chip__name`,children:e.area}),(0,H.jsxs)(`span`,{className:`run-chip__facts`,children:[(0,H.jsxs)(`span`,{className:`run-chip__meta num`,children:[jt[e.size],`, `,M(e.files.length,`file`)]}),(0,H.jsx)(_,{status:Mt[e.risk],size:`sm`,showLabel:!0,label:Nt[e.risk]})]})]})},e.id)})})]}),i&&a&&(0,H.jsxs)(`div`,{className:`run-change__test${r?``:` run-change__test--alone`}`,children:[r&&(0,H.jsx)(`span`,{className:`run-change__label`,children:`Test result`}),(0,H.jsx)(_,{status:a.status,size:`sm`,showLabel:!0,label:a.label}),(0,H.jsx)(`p`,{className:`run-change__line`,children:i.line})]})]})}var G=encodeURIComponent,K={markTested:(e,t,n)=>s(`/runs/${G(e)}/review/tested`,{method:`POST`,body:{testId:t,tested:n}}),notARiskList:(e,t)=>s(`/runs/${G(e)}/review/not-a-risk`,{signal:t}),notARisk:(e,t,n)=>s(`/runs/${G(e)}/review/not-a-risk`,{method:`POST`,body:{riskId:t,note:n}}),undoNotARisk:(e,t)=>s(`/runs/${G(e)}/review/not-a-risk/${G(t)}`,{method:`DELETE`})},It=(0,P.createContext)(null);function q(){let e=(0,P.useContext)(It);if(!e)throw Error(`QA review sections must render inside QaReviewSections`);return e}var Lt={ui_state:`UI state`,public_api:`Public API`,i18n:`i18n`,feature_flag:`Feature flag`,response_shape:`Response shape`,guard_removed:`Guard removed`,error_handling:`Error handling`,selector_drift:`Selector drift`,data_loss:`Data loss`,prompt_injection:`Prompt injection`,security:`Security`,robustness:`Robustness`};function Rt(e){let t=Lt[e];if(t)return t;let n=e.replace(/_/g,` `);return n.charAt(0).toUpperCase()+n.slice(1)}function J(e,t,n=`${t}s`){return`${e.toLocaleString()} ${e===1?t:n}`}function zt(e){return`${(e/1e3).toFixed(+(e<1e4))}\u00a0s`}function Y({path:e}){let t=e.split(`/`);return(0,H.jsx)(H.Fragment,{children:t.map((e,n)=>(0,H.jsxs)(P.Fragment,{children:[e,n<t.length-1&&(0,H.jsxs)(H.Fragment,{children:[`/`,(0,H.jsx)(`wbr`,{})]})]},n))})}function X({codeRef:e,label:t}){let{run:n,qa:r,diffPaths:i}=q(),a=t??qe(e);if(i.has(e.file))return(0,H.jsx)(`button`,{type:`button`,className:`qa-code`,onClick:()=>ot(e),title:`Show ${a} in Changed files`,children:(0,H.jsx)(Y,{path:a})});let o=rt(n,r.head,e);return o?(0,H.jsxs)(`a`,{className:`qa-code`,href:o,target:`_blank`,rel:`noreferrer noopener`,children:[(0,H.jsx)(Y,{path:a}),(0,H.jsx)(v,{size:12,className:`qa-code__ext`,"aria-hidden":`true`}),(0,H.jsx)(`span`,{className:`sr-only`,children:` (opens GitHub)`})]}):(0,H.jsx)(`code`,{className:`qa-code qa-code--plain`,children:(0,H.jsx)(Y,{path:a})})}function Z({note:e}){let t=Ve[e.status];return(0,H.jsx)(_,{status:t.status,size:`sm`,showLabel:!0,label:t.label})}function Bt({note:e}){return(0,H.jsxs)(`div`,{className:`qa-kv`,children:[(0,H.jsx)(`span`,{className:`qa-kv__k`,children:`Verifier`}),(0,H.jsxs)(`span`,{className:`qa-kv__v`,children:[(0,H.jsx)(Z,{note:e}),e.reason?(0,H.jsxs)(`span`,{className:`qa-kv__text`,children:[` `,e.reason]}):null,e.namedTest&&(0,H.jsxs)(`span`,{className:`qa-kv__text`,children:[` `,`Covered by `,(0,H.jsx)(`code`,{children:e.namedTest}),`.`]}),e.missing&&(0,H.jsxs)(`span`,{className:`qa-kv__text`,children:[` Could not see: `,e.missing]}),e.evidence&&(0,H.jsxs)(`span`,{className:`qa-kv__text`,children:[` `,(0,H.jsx)(X,{codeRef:e.evidence})]})]})]})}function Q({k:e,children:t}){return(0,H.jsxs)(`div`,{className:`qa-kv`,children:[(0,H.jsx)(`span`,{className:`qa-kv__k`,children:e}),(0,H.jsx)(`span`,{className:`qa-kv__v`,children:t})]})}function Vt({open:e,onToggle:t,controls:n,children:r}){return(0,H.jsx)(`button`,{type:`button`,className:`qa-row__toggle`,"aria-expanded":e,"aria-controls":n,onClick:t,children:(0,H.jsxs)(`span`,{className:`qa-row__title`,children:[r,(0,H.jsx)(x,{size:14,className:`qa-row__chev`,"aria-hidden":`true`})]})})}function Ht({ids:e}){let{riskTitle:t}=q(),n=e.filter(e=>t(e));return n.length?(0,H.jsxs)(`span`,{className:`qa-links__item`,children:[(0,H.jsx)(`span`,{className:`qa-links__k`,children:n.length===1?`Risk`:`Risks`}),n.map(e=>(0,H.jsx)(`button`,{type:`button`,className:`qa-link`,onClick:()=>V(`risk-${e}`),children:t(e)},e))]}):null}function Ut(e){let t=nt(e),n=t.some(e=>e.verifier.status===`confirmed`&&(e.severity===`critical`||e.severity===`high`));return t.length?{status:n?`outage`:`attention`,text:`${J(t.length,`risk`)} to test before merge`}:{status:`ok`,text:`No risks found in the changed lines`}}function Wt(){let{qa:e,areaName:t}=q(),n=Ut(e),r=e.coverage,i=e.passes.find(e=>e.role===`verifier`),a=[...e.risks,...e.whatToTest,...e.testsAtRisk,...e.testGaps],o={confirmed:0,uncertain:0,unverified:0};for(let e of a)e.verifier.status!==`refuted`&&o[e.verifier.status]++;let s=e.regressionScope.areaIds.map(e=>t(e)).filter(Boolean),c=e.releaseNotesImpact;return(0,H.jsxs)(U,{id:`qa-review`,title:`QA review`,children:[e.staleFor&&(0,H.jsxs)(`p`,{className:`run-banner run-banner--attention qa-stale`,role:`status`,children:[`This review is for commit `,(0,H.jsx)(`code`,{children:z(e.head)}),`. A newer commit `,(0,H.jsx)(`code`,{children:z(e.staleFor)}),` arrived, and its review is running.`]}),(0,H.jsx)(`p`,{className:`qa-headline`,children:(0,H.jsx)(_,{status:n.status,showLabel:!0,label:n.text})}),e.summary&&(0,H.jsx)(`p`,{className:`qa-summary`,children:e.summary}),(0,H.jsxs)(`dl`,{className:`run-dl qa-dl`,children:[(0,H.jsxs)(`div`,{className:`run-dl__row`,children:[(0,H.jsx)(`dt`,{children:`Regression scope`}),(0,H.jsxs)(`dd`,{children:[(0,H.jsx)(`strong`,{className:`qa-strong`,children:Ue[e.regressionScope.level]}),s.length?` (${s.join(`, `)})`:``,e.regressionScope.reason?`. ${e.regressionScope.reason.replace(/\.$/,``)}.`:``]})]}),(0,H.jsxs)(`div`,{className:`run-dl__row`,children:[(0,H.jsx)(`dt`,{children:`Release notes`}),(0,H.jsxs)(`dd`,{children:[c.userVisible?`User-visible, for ${Ge[c.audience]}`:`Not user-visible`,c.breaking?`, breaking`:``,c.note?(0,H.jsxs)(H.Fragment,{children:[`: `,(0,H.jsx)(`q`,{className:`qa-quote`,children:c.note})]}):``]})]}),(0,H.jsxs)(`div`,{className:`run-dl__row`,children:[(0,H.jsx)(`dt`,{children:`Coverage`}),(0,H.jsxs)(`dd`,{children:[r.status===`complete`?(0,H.jsx)(_,{status:`ok`,size:`sm`,showLabel:!0,label:`Complete:`}):(0,H.jsx)(_,{status:`attention`,size:`sm`,showLabel:!0,label:`Incomplete:`}),(0,H.jsxs)(`span`,{className:`num`,children:[` `,r.hunksDelivered,` of `,J(r.hunks,`changed range`),`, `,r.signalsDisposed,` of `,J(r.signalsShown,`signal`)]}),r.status===`incomplete`&&r.missing[0]?(0,H.jsx)(`span`,{className:`qa-block`,children:r.missing[0]}):null]})]}),(0,H.jsxs)(`div`,{className:`run-dl__row`,children:[(0,H.jsx)(`dt`,{children:`Verifier`}),(0,H.jsx)(`dd`,{className:`num`,children:i?`${o.confirmed} confirmed, ${o.uncertain} uncertain${o.unverified?`, ${o.unverified} unverified`:``}, ${e.droppedByVerifier.length} dropped`:`Did not run. Findings are unverified.`})]}),(0,H.jsxs)(`div`,{className:`run-dl__row`,children:[(0,H.jsx)(`dt`,{children:`Commit`}),(0,H.jsxs)(`dd`,{children:[(0,H.jsx)(`code`,{children:z(e.head)}),(0,H.jsxs)(`span`,{className:`num`,children:[` `,J(e.stats.files,`file`),`, +`,e.stats.additions,` -`,e.stats.deletions]})]})]})]})]})}function Gt({item:e,busy:t,onTick:n}){let{run:r,areaName:i}=q(),[a,o]=(0,P.useState)(!1),s=(0,P.useId)(),c=(0,P.useId)(),l=Xe(r,e),u=l?.source===`runner`||l?.source===`ci`,d=l?.source===`ci`?`in CI${e.ciJob?` job ${e.ciJob}`:``}`:`in this run`,f=l?.result===`passed`,p=I[e.priority],h=Ye(r,e),v=i(e.areaId),y=Qe(e),x=e.existingTest?void 0:$e(r,e);return(0,H.jsxs)(`li`,{className:`qa-row qa-test${f?` is-done`:``}`,id:`test-${e.id}`,children:[(0,H.jsx)(`div`,{className:`qa-test__lead`,children:u&&l?l.result===`passed`?(0,H.jsx)(T,{size:16,className:`qa-test__pass`,"aria-label":`Passed ${d}`,role:`img`,"aria-hidden":void 0}):(0,H.jsx)(_,{status:L[l.result].status,size:`sm`,label:`${L[l.result].label} ${d}`}):(0,H.jsxs)(`label`,{className:`qa-check`,htmlFor:c,children:[(0,H.jsx)(`input`,{id:c,type:`checkbox`,checked:f,"aria-busy":t||void 0,onChange:e=>n(e.target.checked)}),(0,H.jsxs)(`span`,{className:`sr-only`,children:[`Mark tested: `,e.scenario]})]})}),(0,H.jsxs)(`div`,{className:`qa-row__main`,children:[(0,H.jsxs)(`div`,{className:`qa-row__meta`,children:[(0,H.jsx)(g,{tone:p.tone,children:p.label}),(0,H.jsx)(g,{children:He[e.type]}),y.map(e=>(0,H.jsx)(m,{icon:(0,H.jsx)(b,{engine:e,size:14}),label:Ze[e],className:`qa-row__engine`},e)),v&&(0,H.jsx)(`span`,{className:`qa-row__area`,children:v}),l&&(0,H.jsx)(`span`,{className:`qa-row__result`,children:(0,H.jsx)(_,{status:L[l.result].status,size:`sm`,showLabel:!0,label:l.source===`manual`?`${L[l.result].label}, marked by hand`:`${L[l.result].label} ${d}`})})]}),(0,H.jsx)(Vt,{open:a,onToggle:()=>o(e=>!e),controls:s,children:e.scenario}),(0,H.jsxs)(`div`,{className:`qa-links`,children:[e.existingTest?(0,H.jsxs)(`span`,{className:`qa-links__item`,children:[(0,H.jsx)(`span`,{className:`qa-links__k`,children:`Existing test`}),h?(0,H.jsx)(`button`,{type:`button`,className:`qa-code`,onClick:()=>V(`tests-h`),title:`Show in Tests`,children:(0,H.jsx)(Y,{path:e.existingTest})}):(0,H.jsx)(`code`,{className:`qa-code qa-code--plain`,children:(0,H.jsx)(Y,{path:e.existingTest})}),e.existingTitle&&(0,H.jsx)(`span`,{className:`qa-links__title`,children:e.existingTitle})]}):x?.status===`kept`?(0,H.jsxs)(`span`,{className:`qa-links__item`,children:[(0,H.jsx)(`span`,{className:`qa-links__k`,children:`Generated spec`}),(0,H.jsx)(`code`,{className:`qa-code qa-code--plain`,children:(0,H.jsx)(Y,{path:x.artifact??x.file})})]}):(0,H.jsx)(`span`,{className:`qa-links__item qa-links__new`,children:`New test`}),(0,H.jsx)(Ht,{ids:e.riskIds})]}),(0,H.jsxs)(`div`,{id:s,className:`qa-row__body`,hidden:!a,children:[e.steps?.length?(0,H.jsx)(Q,{k:`Steps`,children:(0,H.jsx)(`ol`,{className:`qa-steps`,children:e.steps.map((e,t)=>(0,H.jsx)(`li`,{children:e},t))})}):null,e.expected&&(0,H.jsx)(Q,{k:`Expected`,children:e.expected}),e.data&&(0,H.jsx)(Q,{k:`Test data`,children:e.data}),x&&(0,H.jsxs)(Q,{k:`Generated spec`,children:[x.status===`kept`?`Kept`:`Discarded`,x.healed?`, locators repaired once`:``,`. `,x.reason.charAt(0).toUpperCase()+x.reason.slice(1)]}),(0,H.jsx)(Bt,{note:e.verifier})]})]})]})}function Kt(){let{run:e,qa:t}=q(),n=w(),[r,i]=(0,P.useState)(new Set),a=tt(t.whatToTest.filter(e=>e.verifier.status!==`refuted`)),o=a.filter(t=>Xe(e,t)?.result===`passed`).length,s=`run:${e.id}`,c=(e,t)=>{A(s)&&k(s,n=>{if(!n?.verdict?.qa)return n;let r=n.verdict.qa.whatToTest.map(n=>n.id===e?t(n):n);return{...n,verdict:{...n.verdict,qa:{...n.verdict.qa,whatToTest:r}}}})},l=async(t,r)=>{let a=A(s);c(t.id,e=>r?{...e,result:`passed`,resultSource:`manual`}:{...e,result:void 0,resultSource:void 0}),i(e=>new Set(e).add(t.id));try{let{item:n}=await K.markTested(e.id,t.id,r);c(t.id,()=>n)}catch(e){a&&k(s,a),n.show({tone:`error`,title:r?`Could not mark this as tested`:`Could not clear the tick`,body:e instanceof Error?e.message:void 0,action:{label:`Try again`,onClick:()=>void l(t,r)}})}finally{i(e=>{let n=new Set(e);return n.delete(t.id),n})}};return(0,H.jsx)(U,{id:`what-to-test`,title:`What to test`,count:a.length||void 0,actions:a.length?(0,H.jsx)(`span`,{className:`run-muted num`,children:`${o} of ${a.length} tested`}):void 0,children:a.length===0?(0,H.jsx)(`p`,{className:`run-muted`,children:`Nothing specific to test for this change beyond the usual quick tests.`}):(0,H.jsxs)(H.Fragment,{children:[(0,H.jsx)(`p`,{className:`run-muted qa-hint`,children:`Tick each one when you have tested it by hand. Results from this check fill in on their own.`}),(0,H.jsx)(`ul`,{className:`qa-rows`,children:a.map(e=>(0,H.jsx)(Gt,{item:e,busy:r.has(e.id),onTick:t=>void l(e,t)},e.id))})]})})}function qt({risk:e,open:t,onClose:n,onSaved:r}){let[o,s]=(0,P.useState)(``),[l,u]=(0,P.useState)(!1),[d,f]=(0,P.useState)(null),p=async()=>{u(!0),f(null);try{await r(o.trim()),s(``),n()}catch(e){f(e instanceof Error?e.message:`Could not save.`)}finally{u(!1)}};return(0,H.jsx)(a,{open:t,onClose:n,title:`Not a risk`,description:`localdost saves "${e.title}" and the lines it cites as an eval case, so the reviewer can learn from it. The risk stays on this run.`,size:`sm`,footer:(0,H.jsxs)(H.Fragment,{children:[(0,H.jsx)(C,{variant:`ghost`,onClick:n,children:`Cancel`}),(0,H.jsx)(C,{variant:`primary`,loading:l,onClick:()=>void p(),children:`Save as not a risk`})]}),children:(0,H.jsx)(c,{label:`Why is it not a risk?`,hint:`Optional. A sentence helps whoever turns this into a test fixture.`,error:d,children:(0,H.jsx)(i,{rows:3,value:o,onChange:e=>s(e.target.value),maxLength:2e3,"data-autofocus":!0})})})}function Jt({risk:e,dismissed:t,onDismiss:n,onUndo:r}){let{run:i,qa:a,areaName:o}=q(),[s,c]=(0,P.useState)(!1),[l,u]=(0,P.useState)(!1),[d,f]=(0,P.useState)(!1),p=(0,P.useId)(),m=F[e.severity],h=e.evidence[0],g=h?rt(i,a.head,h):void 0,y=a.whatToTest.filter(t=>t.riskIds.includes(e.id)&&t.verifier.status!==`refuted`),b=o(e.areaId);return(0,H.jsxs)(`li`,{className:`qa-row qa-risk${t?` is-dismissed`:``}`,id:`risk-${e.id}`,tabIndex:-1,children:[(0,H.jsxs)(`div`,{className:`qa-row__main`,children:[(0,H.jsxs)(`div`,{className:`qa-row__meta`,children:[(0,H.jsx)(_,{status:m.status,size:`sm`,showLabel:!0,label:m.label}),(0,H.jsx)(`span`,{className:`qa-row__dim`,children:Be[e.likelihood]}),(0,H.jsx)(`span`,{className:`qa-row__dim`,children:Rt(e.kind)}),(0,H.jsx)(`span`,{className:`qa-row__aside`,children:(0,H.jsx)(Z,{note:e.verifier})})]}),(0,H.jsx)(Vt,{open:s,onToggle:()=>c(e=>!e),controls:p,children:e.title}),(0,H.jsxs)(`div`,{className:`qa-links`,children:[h&&(0,H.jsx)(`span`,{className:`qa-links__item`,children:(0,H.jsx)(X,{codeRef:h})}),b&&(0,H.jsx)(`span`,{className:`qa-links__item qa-row__area`,children:b}),t&&(0,H.jsx)(`span`,{className:`qa-links__item qa-row__dim`,children:`You marked this as not a risk`})]}),(0,H.jsxs)(`div`,{id:p,className:`qa-row__body`,hidden:!s,children:[(0,H.jsx)(Q,{k:`Why`,children:e.why}),(0,H.jsx)(Q,{k:`User impact`,children:e.userImpact}),e.evidence.length>1&&(0,H.jsx)(Q,{k:`Evidence`,children:(0,H.jsx)(`span`,{className:`qa-inline-list`,children:e.evidence.map((e,t)=>(0,H.jsx)(X,{codeRef:e},t))})}),(0,H.jsx)(Bt,{note:e.verifier}),e.verifier.severity&&e.verifier.severity!==e.severity&&(0,H.jsxs)(Q,{k:`Severity`,children:[`Lowered by the verifier to `,F[e.verifier.severity].label.toLowerCase(),`.`]}),y.length>0&&(0,H.jsx)(Q,{k:`Test with`,children:(0,H.jsx)(`span`,{className:`qa-inline-list`,children:y.map(e=>(0,H.jsx)(`button`,{type:`button`,className:`qa-link`,onClick:()=>V(`test-${e.id}`),children:e.scenario},e.id))})}),(0,H.jsxs)(Q,{k:`Found by`,children:[e.source?.startsWith(`lens:`)?`The ${e.source.slice(5)} lens`:`The reviewer`,`, `,(0,H.jsx)(`span`,{className:`num`,children:R(e.confidence)}),` `,`confidence`]}),(0,H.jsxs)(`div`,{className:`qa-row__actions`,children:[t?(0,H.jsx)(C,{size:`sm`,variant:`ghost`,loading:d,onClick:async()=>{f(!0);try{await r()}finally{f(!1)}},children:`Undo not a risk`}):(0,H.jsx)(C,{size:`sm`,variant:`secondary`,onClick:()=>u(!0),children:`Not a risk`}),g&&(0,H.jsxs)(`a`,{className:`btn btn--ghost btn--sm`,href:g,target:`_blank`,rel:`noreferrer noopener`,children:[(0,H.jsx)(`span`,{className:`btn__label`,children:`Open on GitHub`}),(0,H.jsx)(`span`,{className:`btn__icon`,children:(0,H.jsx)(v,{size:14})})]})]})]})]}),(0,H.jsx)(qt,{risk:e,open:l,onClose:()=>u(!1),onSaved:n})]})}function Yt(){let{run:e,qa:t}=q(),n=w(),r=nt(t),i=`qa-not-a-risk:${e.id}`,a=O(r.length?i:null,t=>K.notARiskList(e.id,t)),o=new Set(a.data?.riskIds??[]),s=async(t,r)=>{let a=await K.notARisk(e.id,t.id,r||void 0);k(i,{riskIds:a.riskIds}),n.show({tone:`success`,title:`Saved as not a risk`,body:`It is kept as an eval case for the reviewer.`})},c=async t=>{try{let n=await K.undoNotARisk(e.id,t.id);k(i,{riskIds:n.riskIds})}catch(e){n.show({tone:`error`,title:`Could not undo`,body:e instanceof Error?e.message:void 0})}};return(0,H.jsx)(U,{id:`risks`,title:`Risks`,count:r.length||void 0,children:r.length===0?(0,H.jsxs)(`p`,{className:`run-muted`,children:[`No risks in the changed lines. The reviewer checked `,J(t.coverage.hunksDelivered,`changed range`),`.`]}):(0,H.jsx)(`ul`,{className:`qa-rows`,children:r.map(e=>(0,H.jsx)(Jt,{risk:e,dismissed:o.has(e.id),onDismiss:t=>s(e,t),onUndo:()=>c(e)},e.id))})})}function Xt({area:e}){let{diffPaths:t}=q();return(0,H.jsx)(`li`,{className:`qa-row qa-area`,id:`area-${e.id}`,children:(0,H.jsxs)(`div`,{className:`qa-row__main`,children:[(0,H.jsxs)(`div`,{className:`qa-area__head`,children:[(0,H.jsx)(`span`,{className:`qa-row__title qa-row__title--plain`,children:e.area}),(0,H.jsxs)(`span`,{className:`qa-row__dim num`,children:[R(e.confidence),` confidence`]})]}),(0,H.jsxs)(`p`,{className:`qa-row__dim`,children:[`Found by `,e.via.map(e=>We[e]??e).join(`, `)]}),e.userFlows.length>0&&(0,H.jsx)(`ul`,{className:`qa-flows`,children:e.userFlows.map((e,t)=>(0,H.jsx)(`li`,{children:e},t))}),(0,H.jsxs)(`div`,{className:`qa-links`,children:[e.files.map(e=>t.has(e)?(0,H.jsx)(X,{codeRef:{file:e,line:0},label:e},e):(0,H.jsx)(`code`,{className:`qa-code qa-code--plain`,children:(0,H.jsx)(Y,{path:e})},e)),e.routes?.map(e=>(0,H.jsx)(`code`,{className:`qa-route`,children:e},e))]})]})})}function Zt(){let{qa:e}=q();return!e.impactAreas.length&&!e.unmappedFiles.length?null:(0,H.jsxs)(U,{id:`impact`,title:`Impact areas`,count:e.impactAreas.length||void 0,children:[e.impactAreas.length>0&&(0,H.jsx)(`ul`,{className:`qa-rows`,children:[...e.impactAreas].sort((e,t)=>t.confidence-e.confidence).map(e=>(0,H.jsx)(Xt,{area:e},e.id))}),e.unmappedFiles.length>0&&(0,H.jsxs)(`p`,{className:`run-muted qa-after`,children:[`Not mapped to an area: `,(0,H.jsx)(`span`,{className:`run-break`,children:e.unmappedFiles.join(`, `)})]})]})}function Qt(){let{qa:e}=q(),t=e.testsAtRisk.filter(e=>e.verifier.status!==`refuted`);return t.length?(0,H.jsx)(U,{id:`tests-at-risk`,title:`Tests at risk`,count:t.length,children:(0,H.jsx)(`ul`,{className:`qa-rows`,children:t.map(e=>(0,H.jsx)(`li`,{className:`qa-row`,id:`tar-${e.id}`,children:(0,H.jsxs)(`div`,{className:`qa-row__main`,children:[(0,H.jsxs)(`div`,{className:`qa-row__meta`,children:[(0,H.jsx)(`code`,{className:`qa-code qa-code--plain qa-code--strong`,children:(0,H.jsx)(Y,{path:`${e.path}${e.testLine?`:${e.testLine}`:``}`})}),(0,H.jsx)(`span`,{className:`qa-row__aside`,children:(0,H.jsx)(Z,{note:e.verifier})})]}),e.title&&(0,H.jsx)(`p`,{className:`qa-row__title qa-row__title--plain`,children:e.title}),(0,H.jsx)(`p`,{className:`qa-row__text`,children:e.reason}),e.evidence&&(0,H.jsx)(`div`,{className:`qa-links`,children:(0,H.jsxs)(`span`,{className:`qa-links__item`,children:[(0,H.jsx)(`span`,{className:`qa-links__k`,children:`Breaks at`}),(0,H.jsx)(X,{codeRef:e.evidence})]})})]})},e.id))})}):null}function $t(){let{qa:e,areaName:t}=q(),n=e.testGaps.filter(e=>e.verifier.status!==`refuted`);return n.length?(0,H.jsx)(U,{id:`test-gaps`,title:`Test gaps`,count:n.length,children:(0,H.jsx)(`ul`,{className:`qa-rows`,children:n.map(e=>(0,H.jsx)(`li`,{className:`qa-row`,id:`gap-${e.id}`,children:(0,H.jsxs)(`div`,{className:`qa-row__main`,children:[(0,H.jsxs)(`div`,{className:`qa-row__meta`,children:[(0,H.jsx)(g,{children:He[e.type]}),t(e.areaId)&&(0,H.jsx)(`span`,{className:`qa-row__area`,children:t(e.areaId)}),(0,H.jsx)(`span`,{className:`qa-row__aside`,children:(0,H.jsx)(Z,{note:e.verifier})})]}),(0,H.jsx)(`p`,{className:`qa-row__text qa-row__text--strong`,children:e.missing}),e.riskIds.length>0&&(0,H.jsx)(`div`,{className:`qa-links`,children:(0,H.jsx)(Ht,{ids:e.riskIds})})]})},e.id))})}):null}function en(e,t){let n=e.risks.filter(e=>e.signals.includes(t.id));if(n.length)return{text:`Used in ${n.map(e=>`"${e.title}"`).join(`, `)}`,tone:`used`};let r=e.dropped.find(e=>e.signal===t.id);return r?{text:`Dropped: ${r.reason}`,tone:`dropped`}:{text:`No disposition`,tone:`open`}}function tn(){let{qa:e}=q(),[t,n]=(0,P.useState)(!1),r=(0,P.useId)(),i=e.passes.find(e=>e.role===`reviewer`),a=e.passes.find(e=>e.role===`verifier`),o=(e,t)=>e?`${t}: ${e.model}, ${J(e.rounds,`round`)}`:`${t} did not run`,s=[`${J(e.signals.length,`signal`)}, ${e.coverage.signalsDisposed} disposed`,`${e.droppedByVerifier.length} dropped by the verifier`,o(i,`Reviewer`),o(a,`Verifier`)].join(`. `),c=[...e.whatToTest.filter(e=>e.verifier.status===`refuted`).map(e=>({id:e.id,title:e.scenario,reason:e.verifier.reason})),...e.testsAtRisk.filter(e=>e.verifier.status===`refuted`).map(e=>({id:e.id,title:e.path,reason:e.verifier.reason})),...e.testGaps.filter(e=>e.verifier.status===`refuted`).map(e=>({id:e.id,title:e.missing,reason:e.verifier.reason})),...et(e.risks.filter(e=>e.verifier.status===`refuted`)).map(e=>({id:e.id,title:e.title,reason:e.verifier.reason}))].filter(t=>!e.droppedByVerifier.some(e=>e.id===t.id));return(0,H.jsxs)(U,{id:`review-details`,title:`Review details`,actions:(0,H.jsx)(C,{size:`sm`,variant:`ghost`,"aria-expanded":t,"aria-controls":r,onClick:()=>n(e=>!e),children:t?`Hide details`:`Show details`}),children:[(0,H.jsxs)(`p`,{className:`run-muted`,children:[s,`.`]}),(0,H.jsxs)(`div`,{id:r,hidden:!t,className:`qa-details`,children:[(0,H.jsxs)(`h3`,{className:`run-subtitle`,children:[`Signals `,(0,H.jsx)(`span`,{className:`run-section__count num`,children:e.signals.length})]}),e.signals.length===0?(0,H.jsx)(`p`,{className:`run-muted`,children:`No pre-signals fired on this change.`}):(0,H.jsx)(`ul`,{className:`qa-rows qa-rows--dense`,children:e.signals.map(t=>{let n=en(e,t);return(0,H.jsx)(`li`,{className:`qa-row`,children:(0,H.jsxs)(`div`,{className:`qa-row__main`,children:[(0,H.jsxs)(`div`,{className:`qa-row__meta`,children:[(0,H.jsx)(`span`,{className:`qa-id num`,children:t.id}),(0,H.jsx)(`span`,{className:`qa-row__title qa-row__title--plain`,children:Rt(t.kind)}),(0,H.jsxs)(`span`,{className:`qa-row__dim num`,children:[`weight `,t.weight]}),t.lens&&(0,H.jsx)(`span`,{className:`qa-row__dim run-break`,children:t.lens.split(`,`).join(`, `)})]}),(0,H.jsx)(`p`,{className:`qa-row__text`,children:t.detail}),(0,H.jsx)(`div`,{className:`qa-links`,children:(0,H.jsx)(X,{codeRef:{file:t.file,line:t.line,lineEnd:t.lineEnd}})}),(0,H.jsx)(`p`,{className:`qa-outcome qa-outcome--${n.tone}`,children:n.text})]})},t.id)})}),e.droppedByVerifier.length>0&&(0,H.jsxs)(H.Fragment,{children:[(0,H.jsxs)(`h3`,{className:`run-subtitle`,children:[`Dropped by the verifier `,(0,H.jsx)(`span`,{className:`run-section__count num`,children:e.droppedByVerifier.length})]}),(0,H.jsx)(`ul`,{className:`qa-rows qa-rows--dense`,children:e.droppedByVerifier.map(e=>(0,H.jsx)(`li`,{className:`qa-row`,children:(0,H.jsxs)(`div`,{className:`qa-row__main`,children:[(0,H.jsx)(`p`,{className:`qa-row__title qa-row__title--plain`,children:e.title}),(0,H.jsx)(`p`,{className:`qa-row__text`,children:e.reason}),(e.evidence||e.namedTest)&&(0,H.jsxs)(`div`,{className:`qa-links`,children:[e.evidence&&(0,H.jsx)(X,{codeRef:e.evidence}),e.namedTest&&(0,H.jsxs)(`span`,{className:`qa-links__item`,children:[(0,H.jsx)(`span`,{className:`qa-links__k`,children:`Covered by`}),(0,H.jsx)(`code`,{className:`qa-code qa-code--plain`,children:e.namedTest})]})]})]})},e.id))})]}),c.length>0&&(0,H.jsxs)(H.Fragment,{children:[(0,H.jsxs)(`h3`,{className:`run-subtitle`,children:[`Refuted `,(0,H.jsx)(`span`,{className:`run-section__count num`,children:c.length})]}),(0,H.jsx)(`ul`,{className:`qa-rows qa-rows--dense`,children:c.map(e=>(0,H.jsx)(`li`,{className:`qa-row`,children:(0,H.jsxs)(`div`,{className:`qa-row__main`,children:[(0,H.jsx)(`p`,{className:`qa-row__title qa-row__title--plain`,children:e.title}),(0,H.jsx)(`p`,{className:`qa-row__text`,children:e.reason})]})},e.id))})]}),(e.belowFloor.length>0||e.belowThreshold>0)&&(0,H.jsxs)(H.Fragment,{children:[(0,H.jsx)(`h3`,{className:`run-subtitle`,children:`Hidden by thresholds`}),(0,H.jsxs)(`ul`,{className:`run-bullets`,children:[e.belowFloor.map(e=>(0,H.jsxs)(`li`,{children:[e.title,` `,(0,H.jsxs)(`span`,{className:`num run-muted`,children:[`(`,R(e.confidence),` confidence, needs `,R(e.floor),`)`]})]},e.id)),e.belowThreshold>0&&(0,H.jsxs)(`li`,{children:[J(e.belowThreshold,`item`),` below the display threshold for this dot.`]})]})]}),(0,H.jsx)(`h3`,{className:`run-subtitle`,children:`Passes`}),(0,H.jsx)(`ul`,{className:`qa-rows qa-rows--dense`,children:e.passes.map(e=>(0,H.jsx)(`li`,{className:`qa-row`,children:(0,H.jsxs)(`div`,{className:`qa-row__main`,children:[(0,H.jsxs)(`div`,{className:`qa-row__meta`,children:[(0,H.jsx)(`span`,{className:`qa-row__title qa-row__title--plain`,children:e.role===`reviewer`?`Reviewer`:`Verifier`}),(0,H.jsxs)(`span`,{className:`qa-row__dim`,children:[e.backend,`, `,e.model]})]}),(0,H.jsxs)(`p`,{className:`qa-row__text num`,children:[J(e.rounds,`round`),`, `,zt(e.durationMs),e.inputTokens==null?``:`, ${e.inputTokens.toLocaleString()} input and ${(e.outputTokens??0).toLocaleString()} output tokens`]}),e.errors.length>0&&(0,H.jsx)(`ul`,{className:`run-bullets qa-errors`,children:e.errors.map((e,t)=>(0,H.jsx)(`li`,{children:e},t))}),e.filesRead?.length?(0,H.jsxs)(`p`,{className:`qa-row__dim run-break`,children:[`Read: `,e.filesRead.join(`, `)]}):null]})},e.role))}),e.coverage.status===`incomplete`&&(0,H.jsxs)(H.Fragment,{children:[(0,H.jsx)(`h3`,{className:`run-subtitle`,children:`Not reviewed`}),(0,H.jsxs)(`ul`,{className:`run-bullets`,children:[e.coverage.missing.map((e,t)=>(0,H.jsx)(`li`,{children:e},`m${t}`)),e.coverage.undelivered.map(e=>(0,H.jsx)(`li`,{children:(0,H.jsx)(`code`,{children:e})},e))]})]}),e.lenses.length>0&&(0,H.jsxs)(`p`,{className:`run-muted qa-after`,children:[`Lenses used:`,` `,e.lenses.map((e,t)=>(0,H.jsxs)(P.Fragment,{children:[t>0&&`, `,(0,H.jsx)(`span`,{className:`qa-nowrap`,children:e})]},e))]})]})]})}function nn({run:e}){let t=e.verdict?.qa;if(!t)return null;let n=e.diff??e.trigger?.inlineDiff??[],r=new Map(t.impactAreas.map(e=>[e.id,e.area])),i=new Map(t.risks.filter(e=>e.verifier.status!==`refuted`).map(e=>[e.id,e.title])),a={run:e,qa:t,diffPaths:new Set(n.filter(e=>e.patch).map(e=>e.path)),areaName:e=>e?r.get(e):void 0,riskTitle:e=>i.get(e)};return(0,H.jsxs)(It.Provider,{value:a,children:[(0,H.jsx)(Wt,{}),(0,H.jsx)(Kt,{}),(0,H.jsx)(Yt,{}),(0,H.jsx)(Zt,{}),(0,H.jsx)(Qt,{}),(0,H.jsx)($t,{}),(0,H.jsx)(tn,{})]})}var rn={low:{label:`Low risk`,status:`ok`},medium:{label:`Medium risk`,status:`attention`},high:{label:`High risk`,status:`outage`}};function an(e){if(!e)return ce(`deploy_wait`);let t=N(e.until);return`Waiting for the ${e.environment} deploy of this merge. The tests start when it finishes${t?`, or at ${t} at the latest`:``}.`}function on({run:e,onChanged:t}){let n=te(e),r=e.verdict,i=he(e),a=r?Math.round(Math.max(0,Math.min(1,r.confidence))*100):null;return(0,H.jsxs)(`header`,{className:`run-header`,children:[(0,H.jsxs)(`div`,{className:`run-header__eyebrow`,children:[(0,H.jsx)(_,{status:n.status,showLabel:!0,label:n.label}),(0,H.jsx)(ke,{run:e,dotLink:!0,state:n.status,size:24,className:`run-header__who`}),se(e)&&(0,H.jsx)(`span`,{className:`run-header__kind`,children:se(e)})]}),(0,H.jsx)(`h1`,{className:`run-header__title`,children:me(e)}),(0,H.jsx)(we,{dotId:e.watchId,kind:`run`,id:e.id}),(0,H.jsxs)(`dl`,{className:`run-header__facts`,children:[r&&(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`dt`,{className:`sr-only`,children:`Risk`}),(0,H.jsx)(`dd`,{children:(0,H.jsx)(_,{status:rn[r.risk].status,size:`sm`,showLabel:!0,label:rn[r.risk].label})})]}),a!=null&&(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`dt`,{children:`Confidence`}),(0,H.jsxs)(`dd`,{className:`num`,children:[a,`%`]})]}),(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`dt`,{children:`Started`}),(0,H.jsx)(`dd`,{children:(0,H.jsx)(`time`,{dateTime:e.createdAt,title:le(e.createdAt),children:ge(e.createdAt)})})]}),i!=null&&(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`dt`,{children:`Took`}),(0,H.jsx)(`dd`,{className:`num`,children:j(i)})]}),e.evidencePack&&(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`dt`,{children:`Evidence`}),(0,H.jsx)(`dd`,{children:(0,H.jsx)(`a`,{href:E({name:`evidencePack`,id:e.id}),children:`Steps, screenshots and video`})})]}),e.rerunOf&&(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`dt`,{children:`Checked again from`}),(0,H.jsx)(`dd`,{children:(0,H.jsx)(`a`,{href:E({name:`run`,id:e.rerunOf}),children:`the earlier check`})})]})]}),e.status===`interrupted`&&e.interruptReason===`model_cap`&&(0,H.jsxs)(`p`,{className:`run-banner`,role:`status`,"data-model-cap-run":!0,children:[ce(e.interruptReason),e.modelCapResumesAt&&N(e.modelCapResumesAt)?` It starts again at ${N(e.modelCapResumesAt)}.`:``]}),e.status===`interrupted`&&e.interruptReason===`deploy_wait`&&(0,H.jsx)(`p`,{className:`run-banner`,role:`status`,"data-deploy-wait-run":!0,children:an(e.deployWait)}),e.status===`interrupted`&&e.interruptReason!==`model_cap`&&e.interruptReason!==`deploy_wait`&&(0,H.jsxs)(`div`,{className:`run-banner run-banner--attention`,role:`status`,children:[(0,H.jsxs)(`p`,{children:[`This check stopped before it finished. `,ce(e.interruptReason,e.modelUnavailable?.reason,e.modelUnavailable?.kind),re(e.interruptReason,e.modelUnavailable?.kind)?` Try again starts it again.`:``]}),e.interruptReason===`model_unavailable`&&e.modelUnavailable?.reason&&(0,H.jsx)(f,{children:(0,H.jsxs)(`p`,{children:[`From the AI service: `,e.modelUnavailable.reason]})})]}),e.status===`cancelled`&&(0,H.jsxs)(`p`,{className:`run-banner`,role:`status`,children:[`Cancelled`,e.cancelledBy?` by ${e.cancelledBy}`:``,`. Check again starts it again.`]}),e.retryJobId&&e.status!==`running`&&(0,H.jsxs)(`p`,{className:`run-banner`,role:`status`,children:[`Another check is queued. It shows in `,(0,H.jsx)(`a`,{href:E({name:`feed`,dotId:e.watchId}),children:`Activity`}),` when it starts.`]}),(0,H.jsx)(Ne,{run:e,onChanged:t})]})}var sn=2e3,$={steps:[],frames:[],logs:[],droppedLogs:0};function cn(e){let[t,n]=(0,P.useState)({runId:e,live:$}),r=t.runId===e?t.live:$;D(t=>{`runId`in t&&t.runId===e&&n(n=>{let r=n.runId===e?n.live:$,i=r;if(t.type===`run_step`)i={...r,steps:[...r.steps,t.step]};else if(t.type===`run_frame`)i={...r,frames:[...r.frames,t.frame].slice(-300)};else if(t.type===`run_log`){let e=[...r.logs,t.line],n=Math.max(0,e.length-sn);i={...r,logs:n?e.slice(n):e,droppedLogs:r.droppedLogs+n}}return{runId:e,live:i}})},[`run_step`,`run_frame`,`run_log`]);let i=(0,P.useCallback)(()=>n({runId:e,live:$}),[e]);return{...r,reset:i}}function ln(e,t){let n=e=>`${e.at}|${e.label}|${e.test??``}|${e.project??``}`,r=new Set(e.map(n)),i=[...e];for(let e of t){let t=n(e);r.has(t)||(r.add(t),i.push(e))}return i.sort((e,t)=>Date.parse(e.at)-Date.parse(t.at))}function un(e){for(let t=e.parentElement;t&&!t.classList.contains(`run-panel`);t=t.parentElement){let n=getComputedStyle(t).overflowY;if((n===`auto`||n===`scroll`)&&t.scrollHeight>t.clientHeight){t.scrollHeight-t.scrollTop-t.clientHeight<e.offsetHeight*3+120&&(t.scrollTop=t.scrollHeight);return}}}function dn({steps:e,running:t}){let r=(0,P.useRef)(null),i=e.length;return(0,P.useEffect)(()=>{t&&i&&r.current&&un(r.current)},[i,t]),e.length?(0,H.jsxs)(`ol`,{className:`run-steps`,"aria-label":`Steps`,"aria-live":t?`polite`:void 0,children:[e.map((t,n)=>(0,H.jsxs)(`li`,{className:`run-step run-step--${t.status}`,ref:n===e.length-1?r:void 0,children:[(0,H.jsx)(h,{kind:Ie[t.status],label:Re[t.status],size:14}),(0,H.jsxs)(`div`,{className:`run-step__main`,children:[(0,H.jsx)(`p`,{className:`run-step__label`,children:t.label}),t.detail&&(0,H.jsx)(`p`,{className:`run-step__detail`,children:xe(t.detail)})]}),(0,H.jsxs)(`span`,{className:`run-step__end num`,children:[(0,H.jsxs)(`span`,{className:`narrow-hide`,"aria-hidden":`true`,children:[Re[t.status],` · `]}),(0,H.jsx)(`time`,{className:`run-step__time`,dateTime:t.at,children:ae(t.at)})]})]},`${t.at}|${t.label}|${n}`)),t&&(0,H.jsxs)(`li`,{className:`run-step run-step--pending`,"aria-hidden":`true`,children:[(0,H.jsx)(h,{kind:`running`,label:`Working`,size:14,decorative:!0}),(0,H.jsx)(`p`,{className:`run-step__label run-muted`,children:`Working`})]})]}):t?(0,H.jsx)(n,{compact:!0,kind:`zero`,title:`Starting`,body:`Each step shows here as the check works.`}):(0,H.jsx)(n,{compact:!0,kind:`zero`,title:`No steps recorded`,body:`This check finished without writing down its steps.`})}function fn(e){let t=e.replace(/\.(png|jpe?g|webp)$/i,``),n=e=>e.replace(/[-_]+/g,` `).trim(),r=/^a(\d+)-frame-(\d+)(?:-(.+))?$/i.exec(t);if(r)return{test:`Attempt ${Number(r[1])}`,step:r[3]?n(r[3]):`frame ${Number(r[2])}`};let i=/^a(\d+)-(.+)$/i.exec(t);return i?{test:`Attempt ${Number(i[1])}`,step:n(i[2].replace(/-chromium|-firefox|-webkit/gi,``).replace(/-test-failed-\d+$/i,` failed`))}:{test:``,step:n(t)}}function pn(e,t){return(e??[]).filter(e=>e.kind===`screenshot`).map(e=>{let n=pe(e.name,t);return{at:``,...n?{test:n,step:``}:fn(e.name),image:e.url}})}function mn(e,t){let n=new Map,r=new Map,i=e.map(e=>e.kind===`screenshot`?pe(e.name,t):null),a=new Map;for(let e of i)e&&a.set(e,(a.get(e)??0)+1);return e.forEach((e,t)=>{let o=i[t];if(!o)return;let s=(r.get(o)??0)+1;r.set(o,s),n.set(e.name,(a.get(o)??1)>1?`${o} (${s} of ${a.get(o)})`:o)}),n}function hn({frames:e,running:t,onOpenTest:i}){let[s,c]=(0,P.useState)(null),l=s==null?e.length-1:Math.min(s,e.length-1),u=e[l],{src:d,error:p}=Se(u?.image),[m,h]=(0,P.useState)(null),g=s==null,[_,y]=(0,P.useState)(null),[b,x]=(0,P.useState)(!1),[S,ee]=(0,P.useState)(!1);if(!e.length){let e=(0,H.jsx)(f,{children:(0,H.jsx)(`p`,{children:`Local runs stream screenshots only when the server sets LOCALDOST_LIVE_FRAMES=1. API and unit runs have none.`})});return t?(0,H.jsx)(n,{compact:!0,kind:`zero`,title:`No screenshots yet`,body:`Screenshots show here while the browser tests run.`,action:e}):(0,H.jsx)(n,{compact:!0,kind:`zero`,title:`No screenshots`,body:`No screenshots for this check.`,action:e})}let w=[u.test,u.step].filter(Boolean).join(`: `)||`Frame ${l+1}`,T=ze(e),E=`Browser frame ${l+1}: ${w}`,D=!!d&&m!==d;return(0,H.jsxs)(`div`,{className:`run-browser`,children:[(0,H.jsxs)(`figure`,{className:`run-browser__figure`,children:[D?(0,H.jsx)(`button`,{type:`button`,className:`run-browser__stage run-browser__stage--open`,onClick:()=>x(!0),"aria-label":`Open frame ${l+1} at full size`,"aria-haspopup":`dialog`,children:(0,H.jsx)(`img`,{src:d,alt:E,className:`run-browser__img`,onLoad:e=>{let{naturalWidth:t,naturalHeight:n}=e.currentTarget;t&&n&&(t!==_?.w||n!==_?.h)&&y({w:t,h:n})},onError:()=>h(d)})}):(0,H.jsx)(`div`,{className:`run-browser__stage`,children:p||d&&m===d?(0,H.jsx)(r,{compact:!0,error:p??`The frame image did not load. It may have been cleaned up, or the server does not serve /artifacts yet.`,title:`Could not load this screenshot`}):(0,H.jsx)(o,{width:`100%`,height:`100%`,radius:0})}),(0,H.jsxs)(`figcaption`,{className:`run-browser__caption`,children:[(0,H.jsx)(`span`,{className:`run-browser__step`,children:w}),u.at&&(0,H.jsx)(`time`,{className:`num run-muted`,dateTime:u.at,children:ae(u.at)})]})]}),(0,H.jsx)(a,{open:b&&D,onClose:()=>x(!1),title:`Frame ${l+1} of ${e.length}`,description:_?`${w}. Captured at ${_.w} by ${_.h}.`:w,size:`lg`,className:`run-frame-dialog`,footer:d?(0,H.jsxs)(H.Fragment,{children:[(0,H.jsx)(C,{size:`sm`,variant:`secondary`,onClick:()=>ee(e=>!e),"aria-pressed":S,children:S?`Fit to screen`:`Actual size`}),(0,H.jsxs)(`a`,{className:`btn btn--secondary btn--sm`,href:d,target:`_blank`,rel:`noreferrer noopener`,children:[`Open in new tab`,(0,H.jsx)(v,{size:12,className:`run-inline-icon`})]})]}):void 0,children:d&&(0,H.jsx)(`div`,{className:`run-frame-dialog__scroll`,tabIndex:0,role:`region`,"aria-label":`Full size frame`,children:(0,H.jsx)(`img`,{src:d,alt:E,className:`run-frame-dialog__img${S?` run-frame-dialog__img--actual`:``}`,style:_?S?{width:_.w,height:_.h}:{maxWidth:_.w}:void 0})})}),(0,H.jsxs)(`div`,{className:`run-browser__scrub`,children:[(0,H.jsxs)(`span`,{className:`run-browser__scrub-label num`,id:`run-timeline-count`,children:[`Frame `,l+1,` of `,e.length]}),u.rowId&&i&&(0,H.jsx)(C,{size:`sm`,variant:`secondary`,onClick:()=>i(u.rowId),children:`Show test in Steps`}),(0,H.jsx)(C,{size:`sm`,variant:g?`ghost`:`secondary`,onClick:()=>c(null),"aria-pressed":g,children:t?g?`Following live`:`Follow live`:`Latest`})]}),(0,H.jsx)(`ol`,{className:`run-timeline`,"aria-label":`Frames by test`,"aria-describedby":`run-timeline-count`,children:T.map(n=>(0,H.jsxs)(`li`,{className:`run-timeline__seg${n.status?` run-timeline__seg--${n.status}`:``}`,children:[n.rowId&&i?(0,H.jsx)(`button`,{type:`button`,className:`run-timeline__test`,title:`Show ${n.test} in Steps`,"aria-label":`Show ${n.test} in Steps`,onClick:()=>i(n.rowId),children:n.test}):(0,H.jsx)(`span`,{className:`run-timeline__test`,title:n.test,children:n.test}),(0,H.jsx)(`div`,{className:`run-timeline__ticks`,role:`group`,"aria-label":`Frames of ${n.test}`,children:n.frames.map((r,i)=>{let a=n.from+i,o=`Frame ${a+1} of ${e.length}: ${[r.test,r.step].filter(Boolean).join(`: `)||`frame`}`;return(0,H.jsx)(`button`,{type:`button`,className:`run-timeline__tick`,"aria-label":o,"aria-current":a===l?`true`:void 0,title:r.step||void 0,onClick:()=>c(a>=e.length-1&&t?null:a)},a)})})]},n.from))})]})}function gn({lines:e,dropped:t,running:r,source:i}){let a=(0,P.useRef)(null),[o,s]=(0,P.useState)(!1),c=e.length;return(0,P.useLayoutEffect)(()=>{let e=a.current;e&&!o&&(e.scrollTop=e.scrollHeight)},[c,o]),c?(0,H.jsxs)(`div`,{className:`run-terminal`,children:[(0,H.jsxs)(`div`,{className:`run-terminal__bar`,children:[(0,H.jsxs)(`span`,{className:`run-muted num`,children:[M(c,`line`),t?`, ${t.toLocaleString()} older lines dropped`:``,i===`report`?`, last lines from the report`:``]}),(0,H.jsx)(C,{size:`sm`,variant:`secondary`,onClick:()=>s(e=>!e),"aria-pressed":o,children:o?`Resume autoscroll`:`Pause autoscroll`})]}),(0,H.jsx)(`pre`,{ref:a,className:`run-terminal__out`,tabIndex:0,"aria-label":`Terminal output`,onWheel:e=>{e.deltaY<0&&!o&&s(!0)},onScroll:e=>{let t=e.currentTarget;o&&t.scrollHeight-t.scrollTop-t.clientHeight<4&&s(!1)},children:e.join(`
|
|
7
|
+
`)})]}):r?(0,H.jsx)(n,{compact:!0,kind:`zero`,title:`No output yet`,body:`The test output shows here while the tests run.`}):(0,H.jsx)(n,{compact:!0,kind:`zero`,title:`No output`,body:`This check kept no test output.`})}var _n={screenshot:`Screenshot`,trace:`Trace`,video:`Video`,log:`Log`,report:`Report`},vn={trace:`Traces`,video:`Videos`,report:`Reports`,log:`Logs`,screenshot:`Screenshots`},yn=[`trace`,`video`,`report`,`log`,`screenshot`];function bn({artifacts:e,error:t,loading:i,onRetry:a,running:o,cases:s}){let c=w(),[u,d]=(0,P.useState)(null);if(i)return(0,H.jsx)(l,{rows:3,label:`Loading the files`});if(t&&!e)return(0,H.jsx)(r,{compact:!0,error:t,title:`Could not load the files`,onRetry:a});if(!e?.length)return o?(0,H.jsx)(n,{compact:!0,kind:`zero`,title:`No files yet`,body:`Screenshots, traces and videos show here as the check saves them.`}):(0,H.jsx)(n,{compact:!0,kind:`zero`,title:`No files`,body:`This check saved no screenshots, traces or videos.`});let f=e.some(e=>e.kind===`trace`),p=yn.map(t=>({kind:t,items:e.filter(e=>e.kind===t).sort((e,t)=>e.name.localeCompare(t.name))})).filter(e=>e.items.length>0),m=e.filter(e=>!yn.includes(e.kind));m.length&&p.push({kind:m[0].kind,items:m});let h=mn(p.flatMap(e=>e.items),s);return(0,H.jsxs)(`div`,{className:`run-artifacts`,children:[f&&(0,H.jsxs)(`p`,{className:`run-note`,children:[`Open a downloaded `,(0,H.jsx)(`code`,{children:`trace.zip`}),` in`,` `,(0,H.jsxs)(`a`,{href:`https://trace.playwright.dev`,target:`_blank`,rel:`noreferrer noopener`,children:[`trace.playwright.dev`,(0,H.jsx)(v,{size:12,className:`run-inline-icon`})]}),` `,`to step through actions, network, and console. The file stays in your browser.`]}),p.map(e=>(0,H.jsxs)(`section`,{className:`run-artifacts__group`,"aria-labelledby":`art-${e.kind}`,children:[(0,H.jsxs)(`h3`,{id:`art-${e.kind}`,className:`run-artifacts__heading`,children:[vn[e.kind]??e.kind,` `,(0,H.jsx)(`span`,{className:`run-section__count num`,children:e.items.length})]}),(0,H.jsx)(`ul`,{className:`run-artifacts__list`,children:e.items.map(e=>(0,H.jsxs)(`li`,{className:`run-artifact`,children:[(0,H.jsxs)(`div`,{className:`run-artifact__main`,children:[(0,H.jsx)(`span`,{className:`run-artifact__name${h.has(e.name)?` run-artifact__name--title`:``}`,children:h.get(e.name)??e.name}),(0,H.jsxs)(`span`,{className:`run-artifact__meta num`,children:[_n[e.kind]??e.kind,`, `,oe(e.size),h.has(e.name)&&(0,H.jsx)(`span`,{className:`run-artifact__file`,children:e.name})]})]}),(0,H.jsx)(C,{size:`sm`,variant:`ghost`,loading:u===e.name,"aria-label":`Download ${e.name}`,onClick:()=>{d(e.name),Ce(e.url,e.name).catch(t=>c.show({tone:`error`,title:`Could not download ${e.name}`,body:t instanceof Error?t.message:void 0})).finally(()=>d(null))},children:`Download`})]},e.name))})]},e.kind))]})}function xn({run:e,liveOverride:t,initialTab:n=`steps`}){let r=cn(e.id),i=t??r,[a,o]=(0,P.useState)(n),s=e.status===`running`,c=O(`run-artifacts:${e.id}`,t=>u.runArtifacts(e.id,t),{refreshOn:[`run`,`run_frame`],eventFilter:t=>t.type===`run`?t.run.id===e.id&&t.run.status!==`running`:t.type===`run_frame`&&t.runId===e.id,throttleMs:3e3}),l=ln(e.steps??[],i.steps),d=e.report?.cases,f=(0,P.useMemo)(()=>Pe({runId:e.id,steps:l,cases:d,artifacts:c.data}),[e.id,e.steps,i.steps,d,c.data]),p=Le({live:i.frames,rows:f.rows,legacy:pn(c.data,d)}),[m,h]=(0,P.useState)(()=>new Set),[g,v]=(0,P.useState)(null),y=(0,P.useCallback)(e=>h(t=>{let n=new Set(t);return n.delete(e)||n.add(e),n}),[]),b=(0,P.useCallback)(e=>{h(t=>new Set(t).add(e)),v(e),o(`steps`)},[]),x=(0,P.useCallback)(()=>v(null),[]),S=`run-${e.id.replace(/[^a-zA-Z0-9_-]/g,``)}`,C=e.report?.stdoutTail?e.report.stdoutTail.replace(/\s+$/,``).split(`
|
|
8
|
+
`):[],w=i.logs.length?`live`:C.length?`report`:`none`,T=i.logs.length?i.logs:C,E=(T.length?[`steps`,`browser`,`terminal`,`artifacts`]:[`steps`,`browser`,`artifacts`]).includes(a)?a:`steps`;return(0,H.jsxs)(`section`,{className:`run-panel`,"aria-labelledby":`run-panel-h`,children:[(0,H.jsxs)(`header`,{className:`run-panel__header`,children:[(0,H.jsx)(`h2`,{id:`run-panel-h`,className:`run-section__title`,children:`Check steps`}),s&&(0,H.jsx)(_,{status:`running`,size:`sm`,showLabel:!0,label:`Live`})]}),(0,H.jsx)(ee,{label:`Check views`,value:E,onChange:o,idPrefix:S,items:[{value:`steps`,label:`Steps`,count:f.flow.length},{value:`browser`,label:`Browser`,count:p.length},...T.length?[{value:`terminal`,label:`Terminal`}]:[],{value:`artifacts`,label:`Files`,count:c.data?.length}],children:(0,H.jsxs)(`div`,{className:`run-panel__body`,children:[E===`steps`&&(0,H.jsxs)(H.Fragment,{children:[(f.flow.length>0||!f.rows.length)&&(0,H.jsx)(dn,{steps:f.flow,running:s&&!f.rows.length}),(0,H.jsx)(Fe,{idPrefix:S,rows:f.rows,open:m,onToggle:y,jumpTo:g,onJumped:x})]}),E===`browser`&&(0,H.jsx)(hn,{frames:p,running:s,onOpenTest:b}),E===`terminal`&&(0,H.jsx)(gn,{lines:T,dropped:i.droppedLogs,running:s,source:w}),E===`artifacts`&&(0,H.jsx)(bn,{artifacts:c.data,error:c.error,loading:c.loading,onRetry:()=>void c.reload(),running:s,cases:e.report?.cases})]})})]})}function Sn(){return e(1e3)?(0,H.jsxs)(`div`,{className:`run-skeleton`,role:`status`,"aria-busy":`true`,"aria-label":`Loading run`,children:[(0,H.jsx)(o,{width:140,height:14}),(0,H.jsx)(o,{width:`70%`,height:24}),(0,H.jsx)(o,{width:`40%`,height:14}),(0,H.jsxs)(`div`,{className:`run-skeleton__actions`,children:[(0,H.jsx)(o,{width:96,height:32}),(0,H.jsx)(o,{width:128,height:32})]}),(0,H.jsx)(o,{width:`100%`,height:220,radius:8})]}):(0,H.jsx)(`div`,{role:`status`,"aria-busy":`true`,"aria-label":`Loading`})}function Cn({id:e}){let i=`run:${e}`,a=O(i,t=>u.getRun(e,t),{refreshOn:[`approval`,`outbox`],eventFilter:t=>t.type===`approval`?t.approval.runId===e:t.type===`outbox`&&t.item.runId===e,throttleMs:500});D(t=>{let n=A(i);t.type===`run`&&t.run.id===e&&n&&(k(i,e=>({...e,...t.run})),(t.run.status!==n.status||t.run.verdict?.qa?.head!==n.verdict?.qa?.head)&&a.reload())},[`run`]);let o=a.data,[s,c]=(0,P.useState)({id:e,area:null}),l=s.id===e?s.area:null,d=(0,P.useCallback)(t=>c({id:e,area:t}),[e]);if(ye({title:o?`${de[o.kind]??o.kind}${o.dotName?` on ${o.dotName}`:``}`:void 0,back:{href:E(o?{name:`feed`,dotId:o.watchId}:{name:`feed`}),label:`Activity`}}),a.loading)return(0,H.jsx)(`div`,{className:`page page--wide`,children:(0,H.jsx)(Sn,{})});if(!o){let e=a.error instanceof t&&a.error.status===404;return(0,H.jsx)(`div`,{className:`page`,children:e?(0,H.jsx)(n,{kind:`filtered`,title:`Check not found`,body:`It may have been removed, or the link is wrong.`,action:(0,H.jsx)(`a`,{href:E({name:`feed`}),children:`Go to Activity`})}):(0,H.jsx)(r,{error:a.error,title:`Could not load this check`,onRetry:()=>void a.reload(),retrying:a.refreshing})})}let f=o.diff??o.trigger?.inlineDiff,p=o.steps?.find(e=>e.label===`Read the diff`)?.detail,m=e=>{d(e),e&&window.requestAnimationFrame(()=>document.getElementById(`files-h`)?.scrollIntoView({block:`start`,behavior:`smooth`}))},h=o.trigger?.url&&/\/pull\/\d+\/?$/.test(o.trigger.url)?`${o.trigger.url.replace(/\/$/,``)}/files`:void 0;return(0,H.jsxs)(`div`,{className:`page page--wide run-page`,children:[a.error!=null&&(0,H.jsx)(`div`,{className:`run-stale`,role:`status`,children:(0,H.jsx)(r,{compact:!0,error:a.error,title:`Could not refresh. Showing the last version of this check.`,onRetry:()=>void a.reload(),retrying:a.refreshing})}),(0,H.jsx)(on,{run:o,onChanged:()=>void a.reload()}),(0,H.jsxs)(`div`,{className:`run-layout`,children:[(0,H.jsx)(Ft,{summary:o.summary,filter:l,onFilter:m}),(0,H.jsx)(Et,{verdict:o.verdict,dotId:o.kind===`pr_check`||o.kind===`post_merge`?o.watchId:void 0}),(0,H.jsx)(kt,{run:o}),(0,H.jsx)(Ot,{run:o}),(0,H.jsx)(xn,{run:o}),(0,H.jsx)(ct,{run:o}),(0,H.jsx)(nn,{run:o}),(0,H.jsx)(_t,{files:f,summary:p,areas:o.summary?.change?.areas,filter:l,onFilter:d,sourceUrl:h}),(0,H.jsx)(bt,{run:o}),(0,H.jsx)(At,{run:o,approvals:o.approvals??[],outbox:o.outbox??[]})]})]})}export{Cn as default};
|
|
9
|
+
//# sourceMappingURL=RunDetail-qADXjBvd.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{E as e,_ as t,b as n,mn as r,p as i}from"./ui-DcmhYyYp.js";import{t as a}from"./router-W6nZsQ33.js";import{D as o,S as s,a as c,g as l,l as u,r as d,y as f}from"./format-BBZ8vFyT.js";import{n as p}from"./DotStage-CtMNzCN3.js";/* empty css */var m=120;function h(e,t){let n=e.replace(/\s+/g,` `).trim();return n=n.replace(/^(?:merged\s+)?(?:PR|pull request|merge)\s*#?\d+\s*[:\-\u2013\u2014]?\s*/i,``),n=n.replace(/^Push to [^:]+:\s*/i,``),t&&(n=n.replace(RegExp(`^${t.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}\\s*[:\\-\u2013\u2014]?\\s*`,`i`),``)),n=n.replace(/\s*\((?:#\d+|[A-Z][A-Z0-9]{1,9}-\d+)\)\s*$/,``).trim(),n.length>m?`${n.slice(0,117).trimEnd()}...`:n}function g(e,t){if(!e)return;let n=/^(https?:\/\/[^/]+\/[^/]+\/[^/]+)\/(?:compare|actions)\//.exec(e);return n?`${n[1]}/commit/${t}`:void 0}function _(e){let t=e.trigger,n=d[e.kind]??e.kind;if(!t)return{title:n};if(e.kind===`nightly_run`)return{title:(t.title??``).replace(/^Nightly,\s*/i,``).trim()||n};if(t.ticket){let e=t.ticket.tracker,n=e===`github`?`#${t.ticket.key.split(`#`).pop()}`:t.ticket.key,r=t.inlineTicket?.url??(t.url&&!/\/pull\/\d+/.test(t.url)?t.url:void 0),i=h(t.inlineTicket?.title??t.title,t.ticket.key);return{source:e===`github`?`github-issue`:e,refKey:n,title:i,href:r}}let r=t.pr?.mergeSha,i=t.push?.after??(e.kind===`post_merge`?r:void 0)??t.ci?.headSha;return i&&(e.kind===`post_merge`||e.kind===`ci_failure`||!t.pr)?{source:`github-commit`,refKey:i.slice(0,7),title:h(t.title)||n,href:g(t.url,i)??t.url}:t.pr?{source:`github-pr`,refKey:`#${t.pr.number}`,title:h(t.title),href:t.url}:{title:t.title?.trim()||n}}var v=/[,:]?\s*\d+\s*(?:\/|of)\s*\d+\s+tests?(?:\s+passed)?$/i,y=/^all\s+\d+\s+(?:selected\s+)?tests?\s+passed$/i;function b(e,t){let n=e.verdict?.headline?.replace(/\s+/g,` `).trim()??``;if(!n)return``;n=n.replace(/^(?:(?:merged\s+)?PR\s*#?\d+|change|merge|push)\s*:\s*/i,``),n=n.replace(/[.\s]+$/,``),t&&(n=n.replace(v,``).replace(/[,\s]+$/,``),y.test(n)&&(n=``));let r=e.verdict?c[e.verdict.outcome]:void 0;return r&&n.toLowerCase()===r.toLowerCase()&&(n=``),n?n.charAt(0).toUpperCase()+n.slice(1):``}var x=r();function S({run:r,showDot:c=!0,now:d}){let m=s(r),h=_(r),g=o(r),v=b(r,!!g),y=l(r),S=y&&!h.source&&h.title?.toLowerCase().startsWith(y.toLowerCase())?void 0:y,C=!v&&m.status===`paused`,w=g?.replace(/ /g,`\xA0`).replace(/,\u00a0/g,`, `);return(0,x.jsx)(`li`,{className:`run-row-item`,children:(0,x.jsxs)(`div`,{className:`row run-row`,"data-status":m.status,children:[(0,x.jsx)(n,{kind:m.icon,label:m.label,decorative:!0}),(0,x.jsxs)(`span`,{className:`row__main run-row__main`,children:[(0,x.jsxs)(`span`,{className:`row__title run-row__title`,children:[(0,x.jsx)(p,{run:r,showDot:c,state:m.status,className:`run-row__stage`}),(0,x.jsx)(e,{className:`run-row__subject`,...h,href:void 0})]}),(0,x.jsxs)(`a`,{className:`row__meta run-row__meta run-row__link`,href:a({name:`run`,id:r.id}),children:[(0,x.jsx)(`span`,{className:`run-row__outcome run-row__outcome--${m.status}${C?` run-row__outcome--lone`:` narrow-hide`}`,children:m.label}),v&&(0,x.jsx)(`span`,{className:`run-row__what`,children:v}),S&&(0,x.jsx)(t,{icon:(0,x.jsx)(i,{kind:r.kind,size:14}),label:S,className:`run-row__kind`}),w&&(0,x.jsxs)(`span`,{className:`run-row__tests`,children:[(0,x.jsx)(`span`,{className:`run-row__sep`,children:`\xA0· `}),w]})]})]}),(0,x.jsx)(`time`,{className:`run-row__time num`,dateTime:r.createdAt,title:u(r.createdAt),children:f(r.createdAt,d)})]})})}export{S as t};
|
|
2
|
+
//# sourceMappingURL=RunRow-BKEJv8ib.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import{Tn as e,Vn as t,Wn as n,mn as r,pn as i}from"./ui-DcmhYyYp.js";import{a,o,s}from"./router-W6nZsQ33.js";var c=4e3,l={analyst:`Reads each new ticket and writes questions and things to test by hand.`,designer:`Turns the things to test by hand into test cases.`,reviewer:`Reviews each pull request and runs its tests.`,regression:`Runs the tests again after a merge and when CI fails.`,watcher:`Checks your live site and status pages, and reports when it is down.`,guard:`Reports which tickets of a release have passing tests.`},u={analyst:`Skip tickets labeled chore.`,designer:`Cover the empty cart and a failed payment.`,reviewer:`Flag any change under src/payments.`,regression:`Run the quick tests first.`,watcher:`Ignore the staging health check.`,guard:`Count a ticket as tested only when a test passes.`},d={"claude-cli":`Claude subscription`,"codex-cli":`Codex subscription (ChatGPT)`,"claude-token":`Claude subscription token`,anthropic:`Anthropic API key`};function f(e){return e!==`guard`}function p(e,t){let n=new Set(s.filter(t=>m(e)[t].on));return t.find(e=>e.key!==`custom`&&s.every(t=>(e.defaults.stages?.[t]?.on??!1)===n.has(t)))?.label??`Custom`}function m(e={},t={}){let n={};for(let r of s)n[r]={on:e.stages?.[r]?.on??(t.create?!0:f(r)),rules:e.stages?.[r]?.rules??``,model:e.stageModels?.[r]??``};return n}function h(e){return o.find(t=>t.key===e)?.label??e}function g(e){return s.filter(t=>e[t].on)}function _(e,t){if(!t)return e;let n={};for(let r of s)n[r]=typeof t[r]?.on==`boolean`?{...e[r],on:t[r].on}:e[r];return n}function ee(e){let t=g(e);return t.length===s.length?`All six stages are on.`:t.length?`${t.length} of ${s.length} stages are on: ${t.map(h).join(`, `)}.`:`No stage is on. The dot runs no jobs.`}function v(e){return a.filter(t=>!e[t].on)}function y(e){return`stages.${e}.rules`}function te(e){let t={};for(let n of s)e[n].rules.length>4e3&&(t[y(n)]=`Keep the rules under ${c} characters.`);return t}function ne(e){let t=/^stages\.(\w+)\.rules$/.exec(e);if(t&&s.includes(t[1]))return t[1];if(e===`statusPages`||e===`probeIntervalSec`||e.startsWith(`probes.`))return`watcher`}function re(e){let t=/\bstage(?:s|Models)\.(\w+)/.exec(e);if(t&&s.includes(t[1]))return t[1];if(/^review: /.test(e))return`reviewer`}function ie(e){let t={},n={};for(let r of s)t[r]={on:e[r].on,rules:e[r].rules.trim()},e[r].model&&(n[r]=e[r].model);return{stages:t,stageModels:n}}function ae(e){let t={};for(let n of s)t[n]=e[n].model||null;return t}var oe=`02:00`,b=[1,2,3,4,5],se=[`Sunday`,`Monday`,`Tuesday`,`Wednesday`,`Thursday`,`Friday`,`Saturday`],ce=[1,2,3,4,5,6,0],x=e=>se[e]??``,le=/^([01]\d|2[0-3]):([0-5]\d)$/;function S(e){let t=e.nightlyRun;if(!t||typeof t!=`object`)return null;let n=typeof t.time==`string`&&le.test(t.time)?t.time:oe,r=Array.isArray(t.days)?t.days.filter(e=>Number.isInteger(e)&&e>=0&&e<=6):[];return{on:t.on===!0,time:n,days:r.length?[...new Set(r)].sort((e,t)=>e-t):[...b]}}var ue=(e,t)=>e.length===t.length&&e.every((e,n)=>e===t[n]);function de(e){let t=[...new Set(e)].sort((e,t)=>e-t);if(ue(t,[1,2,3,4,5]))return`every weekday`;if(t.length===7)return`every day`;let n=ce.filter(e=>t.includes(e)).map(x);return n.length===1?`every ${n[0]}`:`on ${n.slice(0,-1).join(`, `)} and ${n[n.length-1]}`}function fe(e){return e?.on?`Runs the tests ${de(e.days)} at ${e.time}`:`The tests do not run at night`}function pe(e){if(!Number.isFinite(e)||e===0)return`UTC`;let t=-e,n=Math.abs(t),r=n%60;return`UTC${t>0?`+`:`-`}${Math.floor(n/60)}${r?`:${String(r).padStart(2,`0`)}`:``}`}function me(e,t){let n=e?.trim()??``,r=typeof t==`number`&&Number.isFinite(t)?pe(t):``;return n&&r?r===`UTC`&&/^(?:UTC|Etc\/UTC|GMT)$/.test(n)?`UTC`:`${n}, ${r}`:n||r}var he=/^[A-Za-z_][A-Za-z0-9_]*=/;function C(e){return`The test command runs without a shell, so "${e}" does not work in it. Move install and build steps into Setup steps (runner.setup) and keep only the test command here, for example "npx playwright test --grep @smoke".`}function w(e){let t=e.trim();if(!t)return{ok:!1,error:`The test command is empty.`};let n=[],r=``,i=!1,a=0;for(;a<t.length;){let e=t[a];if(e===`'`){let e=t.indexOf(`'`,a+1);if(e<0)return{ok:!1,error:`The test command has an unclosed single quote.`};r+=t.slice(a+1,e),i=!0,a=e+1;continue}if(e===`"`){let e=a+1,n=!1;for(;e<t.length;){let i=t[e];if(i===`\\`&&e+1<t.length&&(t[e+1]===`"`||t[e+1]===`\\`||t[e+1]===`$`||t[e+1]==="`")){r+=t[e+1],e+=2;continue}if(i===`"`){n=!0;break}if(i==="`"||i===`$`&&t[e+1]===`(`)return{ok:!1,error:C(i==="`"?"`":`$(`)};r+=i,e++}if(!n)return{ok:!1,error:`The test command has an unclosed double quote.`};i=!0,a=e+1;continue}if(e===`\\`){a+1<t.length&&(r+=t[a+1],i=!0),a+=2;continue}if(/\s/.test(e)){i&&n.push(r),r=``,i=!1,a++;continue}let o=t.slice(a,a+2);if(o===`&&`||o===`||`||o===`>>`||o===`$(`)return{ok:!1,error:C(o)};if(e===`|`||e===`;`||e===`&`||e===`<`||e===`>`||e==="`")return{ok:!1,error:C(e)};r+=e,i=!0,a++}i&&n.push(r);let o={};for(;n.length&&he.test(n[0]);){let e=n.shift(),t=e.indexOf(`=`);o[e.slice(0,t)]=e.slice(t+1)}return n.length?{ok:!0,argv:n,env:o}:{ok:!1,error:`The test command sets variables but names no program to run.`}}function ge(e){return e.length<=200&&/^[A-Za-z0-9][A-Za-z0-9._/+-]*$/.test(e)&&!e.includes(`..`)&&!e.endsWith(`/`)&&!e.endsWith(`.lock`)}function _e(e){if(e==null)return null;if(!Array.isArray(e))return`testBranches must be a list of branch names.`;if(e.length>20)return`testBranches may list at most 20 branches.`;for(let t of e){if(typeof t!=`string`)return`testBranches must be a list of branch names.`;let e=t.trim();if(e&&(e.startsWith(`refs/`)||!ge(e)))return`testBranches: "${t.trim().slice(0,60)}" is not a plain branch name (letters, digits, ., _, -, / and +; no refs/heads/ prefix, no wildcards).`}return null}function ve(e){return Array.isArray(e)?[...new Set(e.filter(e=>typeof e==`string`).map(e=>e.trim()).filter(Boolean))]:[]}function ye(e){let t=e.trim();if(!t)return null;let n=t.slice(0,60);if(t.length>200)return`"${n}" is longer than 200 characters.`;if(/[\0\\\n\r]/.test(t))return`"${n}" must not hold backslashes or line breaks.`;if(t.startsWith(`/`)||/^[A-Za-z]:/.test(t)||t.startsWith(`~`))return`"${n}" must be relative to the working folder, for example .env.`;let r=t.split(`/`);return r.includes(`..`)?`"${n}" must stay inside the working folder (no "..").`:r.some(e=>e.toLowerCase()===`.git`)?`"${n}" is inside .git, which is never copied.`:t.endsWith(`/`)||t===`.`||r.every(e=>e===`.`||e===``)?`"${n}" must name a file, not a folder.`:null}function be(e){if(e==null)return null;if(!Array.isArray(e))return`must be a list of relative file paths.`;if(e.length>20)return`may list at most 20 files.`;for(let t of e){if(typeof t!=`string`)return`must be a list of relative file paths.`;let e=ye(t);if(e)return e}return null}function T(e){if(!Array.isArray(e))return[];let t=e.filter(e=>typeof e==`string`).map(e=>e.trim().replace(/^(\.\/)+/,``)).filter(Boolean);return[...new Set(t)]}var xe=`LOCALDOST_TEST_`,Se=/^LOCALDOST_TEST_[A-Z0-9_]+$/;function Ce(e){return typeof e==`string`&&Se.test(e)}function E(e){if(e==null)return null;if(!Array.isArray(e))return`must be a list of variable names.`;if(e.length>20)return`may list at most 20 names.`;let t=e.find(e=>typeof e!=`string`||!!e.trim()&&!Ce(e.trim()));return t===void 0?null:`names must start with ${xe} and use capital letters, digits, and underscores. "${String(t).slice(0,40)}" does not.`}function D(e){return Array.isArray(e)?[...new Set(e.filter(e=>typeof e==`string`).map(e=>e.trim()).filter(Boolean))]:[]}var we=[`command`,`setup`,`passEnv`,`copyFiles`,`image`,`mode`,`workingDirectory`,`workdir`,`trustForks`],Te=`Ask your localdost admin to change test commands.`,Ee=`Ask your localdost admin to change repositories.`,O=3600,De=[`waitForDeploySec`,`deployEnvironment`],Oe=`Ask your localdost admin to change the deploy wait.`;function k(e){return typeof e==`string`&&e.trim()?e.trim():void 0}var ke=e=>`true-state:${e}`,A=`Use your True Platform address, for example https://your-team.katalon.io.`;function Ae(e){let t=e.trim();if(!t)return null;let n;try{n=new URL(t)}catch{return A}return n.protocol!==`https:`||n.username||n.password||n.port&&n.port!==`443`?A:/^([a-z0-9]([a-z0-9-]*[a-z0-9])?\.)+katalon\.io$/i.test(n.hostname)?null:A}function je(e){let t=e.trim();return!t||/^[1-9]\d{0,11}$/.test(t)?null:`The project ID is a whole number, for example 3517762.`}var Me=1e5;function j(e){let t=e.trim();if(!t)return null;let n=Number(t);return/^\d+$/.test(t)&&n>=1&&n<=1e5?null:`Use a whole number of calls from 1 to ${Me.toLocaleString(`en-US`)}, or leave it empty for no cap.`}function M(e){let t=e.trim();return t?Number(t):null}var Ne=()=>({prAuthors:``,prTeam:``,prLinkedLabels:``,prSkipDrafts:!1,prSkipBots:!1}),N=0;function P(e=`http`,t=``){return N+=1,{key:`p${N}`,kind:e,url:t,expectStatus:``,expectText:``,selector:``,steps:``}}var F=e=>e.split(/[\n,]/).map(e=>e.trim()).filter(Boolean),I=e=>e.split(`
|
|
2
|
+
`).map(e=>e.trim()).filter(Boolean);function Pe(e){let t=(e??[]).findIndex(e=>e.role===`app`);return(e??[]).flatMap((e,n)=>e.role===`app`&&n!==t?[{repo:e.repo,runTests:e.runTests!==!1,deployEnvironment:e.deployEnvironment??``,waitForDeploySec:L(e.waitForDeploySec)}]:[])}var L=e=>typeof e==`number`?String(e):``;function Fe(e){let t=e.trim();return/^\d+$/.test(t)?Number(t):void 0}function R(e,t){let n=k(e),r=Fe(t);return{...n?{deployEnvironment:n}:{},...r===void 0?{}:{waitForDeploySec:r}}}var z=(e,t)=>(e.deployEnvironment??``)===(t.deployEnvironment??``)&&e.waitForDeploySec===t.waitForDeploySec;function Ie(e,t){let n=t=>e.storedRepos.find(e=>e.repo===t),r=e=>e.runTests!==(n(e.repo)?.runTests!==!1)||!z(R(e.deployEnvironment,e.waitForDeploySec),n(e.repo)??{}),i=e.storedRepos.findIndex(e=>e.role===`app`),a=R(e.repoDeployEnvironment,e.repoWaitForDeploySec),o=i>=0&&!!t&&!z(a,e.storedRepos[i]);if(e.otherAppRepos.some(r)||o)return e.storedRepos.flatMap((n,r)=>{if(r===i)return t?[t]:[];if(n.role!==`app`)return[n];let{runTests:a,deployEnvironment:o,waitForDeploySec:s,...c}=n,l=e.otherAppRepos.find(e=>e.repo===n.repo);return[{...c,...l&&!l.runTests?{runTests:!1}:{},...l?R(l.deployEnvironment,l.waitForDeploySec):{}}]})}function Le(e={},t={}){let n=e.tracker;return{role:e.role??(t.create?`product-area`:`custom`),name:e.name??``,mascot:e.mascot??`pip`,mission:e.mission??``,notifyWhen:e.notifyWhen??``,mustNot:e.mustNot??``,instructions:e.instructions??``,repo:e.repo?`${e.repo.owner}/${e.repo.name}`:``,defaultBranch:e.repo?.defaultBranch??`main`,pathFilters:(e.repo?.pathFilters??[]).join(`, `),repoRunTests:e.repo?.runTests!==!1,otherAppRepos:Pe(e.repos),repoDeployEnvironment:e.repo?.deployEnvironment??``,repoWaitForDeploySec:L(e.repo?.waitForDeploySec),storedRepos:e.repos??[],testRepoOnPr:e.testRepoOnPr!==!1,testRepoOnMerge:e.testRepoOnMerge!==!1,nightlyOn:S(e)?.on??!1,nightlyTime:S(e)?.time??`02:00`,nightlyDays:S(e)?.days??[...b],nightlySaved:!!e.nightlyRun,...nt(e.repo?.prScope),trackerKind:n?.kind??`none`,jiraBaseUrl:n?.kind===`jira`?n.baseUrl:``,jiraProjectKeys:n?.kind===`jira`?n.projectKeys.join(`, `):``,linearTeamKeys:n?.kind===`linear`?n.teamKeys.join(`, `):``,githubRepos:n?.kind===`github`?(n.repos??[]).join(`, `):``,githubRequirementTypes:n?.kind===`github`?(n.issueTypes?.requirement??[]).join(`, `):``,githubDefectTypes:n?.kind===`github`?(n.issueTypes?.defect??[]).join(`, `):``,githubRequirementLabels:n?.kind===`github`?(n.labels?.requirement??[]).join(`, `):``,githubDefectLabels:n?.kind===`github`?(n.labels?.defect??[]).join(`, `):``,githubIgnoreLabels:n?.kind===`github`?(n.labels?.ignore??[]).join(`, `):``,githubRequireLabels:n?.kind===`github`?(n.labels?.require??[]).join(`, `):``,githubMilestones:n?.kind===`github`?(n.milestones??[]).join(`, `):``,baseUrl:e.baseUrl??``,probes:(e.probes??[]).map(e=>({...P(e.kind??`http`,e.url),expectStatus:e.expectStatus==null?``:String(e.expectStatus),expectText:e.expectText??``,selector:e.selector??``,steps:(e.steps??[]).join(`
|
|
3
|
+
`)})),probeIntervalSec:String(e.probeIntervalSec??300),statusPages:(e.statusPages??[]).join(`
|
|
4
|
+
`),runnerMode:e.runner?.mode??(t.demo?`demo`:`local`),runnerSetup:e.runner?.setup??``,runnerCommand:e.runner?.command??``,runnerWorkdir:e.runner?.workdir??``,runnerCopyFiles:(e.runner?.copyFiles??[]).join(`, `),runnerPassEnv:(e.runner?.passEnv??[]).join(`, `),runnerImage:e.runner?.image??``,smokeGrep:e.runner?.smokeGrep??``,testBranches:(e.testBranches??[]).join(`, `),prTestTarget:e.prTestTarget??`base`,deployEnvironment:e.deployEnvironment??``,waitForDeploySec:e.waitForDeploySec?String(e.waitForDeploySec):``,runnerEngine:e.runner?.engine&&[`auto`,`playwright`,`aivision`,`both`].includes(e.runner.engine)?e.runner.engine:``,runnerVideo:e.runner?.video===`on`?`on`:`retain-on-failure`,visionTests:!!e.runner?.aivision&&e.runner.aivision.enabled!==!1,...e.runner?.aivision?{aivision:e.runner.aivision}:{},slackChannel:e.slackChannel??``,slackUpdates:e.updates?.slack??`channel`,slackUser:e.updates?.slackUser??``,connections:[...e.connections??[]],digestHour:String(e.digestHour??9),dailyModelCap:e.dailyModelCap?String(e.dailyModelCap):``,trueOn:!!e.trueSync?.enabled,trueUrl:e.trueSync?.tenantUrl??``,trueProject:e.trueSync?.projectId?String(e.trueSync.projectId):``,trueSaved:!!e.trueSync,rules:{...e.rules??{}},stages:m(e,{create:t.create}),review:{...e.review??{}},reviewTouched:[],noticeAnswered:!1,runnerKeep:{...e.runner?.trustForks===void 0?{}:{trustForks:e.runner.trustForks},...e.runner?.pwgen?{pwgen:e.runner.pwgen}:{},...e.runner?.workingDirectory===void 0?{}:{workingDirectory:e.runner.workingDirectory}}}}var Re=[`mission`,`notifyWhen`,`mustNot`,`instructions`];function ze(e,t,n){let r=t.defaults,i={...e,role:t.key};for(let e of Re){let t=r[e];typeof t==`string`&&!n.has(e)&&(i[e]=t)}return r.mascot&&!n.has(`mascot`)&&(i.mascot=r.mascot),r.rules&&(i.rules={...r.rules}),i.stages=_(e.stages,r.stages),typeof r.digestHour==`number`&&!n.has(`digestHour`)&&(i.digestHour=String(r.digestHour)),typeof r.probeIntervalSec==`number`&&!n.has(`probeIntervalSec`)&&(i.probeIntervalSec=String(r.probeIntervalSec)),i}function B(e){try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}var V=/^[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+$/,Be=/^@?[A-Za-z0-9](?:[A-Za-z0-9-]{0,38})(?:\[bot\])?$/,Ve=/^@?[A-Za-z0-9](?:[A-Za-z0-9-]{0,38})\/[A-Za-z0-9_.-]{1,100}$/,H=/^[A-Z][A-Z0-9_]*$/,U=50,W=20,He=/^(#?[a-z0-9][a-z0-9._-]{0,79}|[CG][A-Z0-9]{6,})$/,Ue=/^(click|fill|expect)\s+\S/,G={name:60,text:2e3,setup:4e3,notes:4e3},We=`Product notes and the words your team uses. Chat, PR review and ticket review read the first ${G.notes} characters. Do not put passwords or keys here.`;function Ge(e,t={}){let n={},r=e.name.trim();r?r.length>G.name?n.name=`Keep the name under ${G.name} characters.`:t.otherNames?.some(e=>e.trim().toLowerCase()===r.toLowerCase())&&(n.name=`Another dot already has this name.`):n.name=`Give the dot a name.`,e.mission.trim()||(n.mission=`Say what should stay true. The dot reads this before every check.`);for(let t of[`mission`,`notifyWhen`,`mustNot`])!n[t]&&e[t].length>G.text&&(n[t]=`Keep this under ${G.text} characters.`);e.instructions.length>G.notes&&(n.instructions=`Keep this under ${G.notes} characters.`);let i=e.repo.trim();if(i&&!V.test(i)&&(n.repo=`Use owner/name, for example acme/shop.`),i&&!e.defaultBranch.trim()&&(n.defaultBranch=`Name the default branch, usually main.`),Object.assign(n,rt(e)),!i&&it(e)&&(n.repo=`Set the repository. The PR scope applies to its pull requests.`),e.trackerKind===`jira`){e.jiraBaseUrl.trim()?B(e.jiraBaseUrl.trim())||(n.jiraBaseUrl=`Use a full URL, for example https://acme.atlassian.net.`):n.jiraBaseUrl=`Add your Jira site URL.`;let t=F(e.jiraProjectKeys);t.length?t.some(e=>!H.test(e))&&(n.jiraProjectKeys=`Project keys are capital letters and digits, for example SHOP.`):n.jiraProjectKeys=`Add at least one project key, for example SHOP.`}else if(e.trackerKind===`linear`){let t=F(e.linearTeamKeys);t.length?t.some(e=>!H.test(e))&&(n.linearTeamKeys=`Team keys are capital letters and digits, for example ENG.`):n.linearTeamKeys=`Add at least one team key, for example ENG.`}else if(e.trackerKind===`github`){let t=F(e.githubRepos);t.some(e=>!V.test(e))?n.githubRepos=`Use owner/name for each repo, for example acme/shop.`:!t.length&&!i&&(n.githubRepos=`Add the repo whose issues the dot reviews, or set the repository above.`);let r=F(e.githubRequireLabels);(r.length>W||r.some(e=>e.length>U))&&(n.githubRequireLabels=`Use up to ${W} labels, each up to ${U} characters.`)}if(e.baseUrl.trim()&&!B(e.baseUrl.trim())&&(n.baseUrl=`Use a full URL that starts with https://.`),e.probes.forEach((e,t)=>{let r=`probes.${t}`;if(e.url.trim()?B(e.url.trim())||(n[`${r}.url`]=`Use a full URL that starts with https://.`):n[`${r}.url`]=`Add the URL to check.`,e.expectStatus.trim()){let t=Number(e.expectStatus);(!Number.isInteger(t)||t<100||t>599)&&(n[`${r}.expectStatus`]=`Use an HTTP status between 100 and 599.`)}if(e.kind===`browser`){e.selector.trim()||(n[`${r}.selector`]=`A browser site check waits for a selector, for example #app or [data-test=checkout].`);let t=I(e.steps).find(e=>!Ue.test(e));t&&(n[`${r}.steps`]=`Start each step with click, fill, or expect. "${t.slice(0,40)}" does not.`)}}),e.probes.length){let t=Number(e.probeIntervalSec);(!Number.isInteger(t)||t<15||t>86400)&&(n.probeIntervalSec=`Check every 15 seconds to 24 hours (86400).`)}let a=I(e.statusPages).find(e=>!B(e));if(a&&(n.statusPages=`"${a.slice(0,60)}" is not a full URL.`),e.runnerMode!==`demo`&&(e.runnerSetup.length>G.setup&&(n.runnerSetup=`Keep setup steps under ${G.setup} characters.`),e.runnerCommand.trim())){let t=w(e.runnerCommand);t.ok||(n.runnerCommand=t.error)}if(e.runnerMode!==`demo`){let t=E(F(e.runnerPassEnv));t&&(n.runnerPassEnv=`Test login ${t}`)}if(e.runnerMode===`local`){let t=be(T(F(e.runnerCopyFiles)));t&&(n.runnerCopyFiles=/^(may|must)/.test(t)?`Copy files ${t}`:t)}let o=_e(F(e.testBranches));o&&(n.testBranches=o.replace(/^testBranches: /,``)),Object.assign(n,Ke(e)),e.runnerMode!==`demo`&&Object.assign(n,Ye(e)),e.runnerMode===`docker`&&!e.runnerImage.trim()&&(n.runnerImage=`Docker mode needs an image, for example mcr.microsoft.com/playwright:v1.56.0.`);let s=e.slackChannel.trim();s&&!He.test(s)&&(n.slackChannel=`Use a channel name like #releases, or a channel ID like C0123ABCD.`);let c=e.slackUser.trim();e.slackUpdates===`dm`&&!c?n.slackUser=`Direct messages need a Slack member ID, like U0123ABCD.`:c&&!/^[UW][A-Z0-9]{2,20}$/.test(c)&&(n.slackUser=`Use a Slack member ID, like U0123ABCD. Find it in the profile menu.`);let l=Number(e.digestHour);(!Number.isInteger(l)||l<0||l>23)&&(n.digestHour=`Pick an hour from 0 to 23.`);let u=j(e.dailyModelCap);u&&(n.dailyModelCap=u);let d=st(e);n.baseUrl&&delete d.baseUrl,Object.assign(n,d);let f=e.trueUrl.trim();(f||e.trueOn)&&(n.trueUrl=Ae(e.trueUrl)??(e.trueOn&&!f?`Enter your True Platform address, for example https://your-team.katalon.io.`:``)),n.trueUrl||delete n.trueUrl;let p=je(e.trueProject)??(e.trueOn&&!e.trueProject.trim()?`Enter the project ID, for example 3517762.`:null);return p&&(n.trueProject=p),Object.assign(n,te(e.stages)),n}function Ke(e){let t={},n=e.waitForDeploySec.trim(),r=/^\d+$/.test(n)?Number(n):NaN;n&&!(r>=0&&r<=3600)&&(t.waitForDeploySec=`Use a whole number of seconds from 0 to ${O}, or leave it empty for no wait.`);let i=e.deployEnvironment.trim();return i.length>100?t.deployEnvironment=`Use a name of up to 100 characters.`:!t.waitForDeploySec&&r>0&&!i&&(t.deployEnvironment=`Name the environment the merge deploys to, for example qa, or clear the wait.`),t}var K=(e,t)=>e===null?t===`environment`?`repoDeployEnvironment`:`repoWaitForDeploySec`:`deploy:${e}:${t}`,qe=e=>e===`repoDeployEnvironment`||e===`repoWaitForDeploySec`||e.startsWith(`deploy:`),Je=e=>!!(e.repoDeployEnvironment.trim()||e.repoWaitForDeploySec.trim())||e.otherAppRepos.some(e=>!!(e.deployEnvironment.trim()||e.waitForDeploySec.trim())),q=e=>e.otherAppRepos.length>0&&!!e.repo.trim();function Ye(e){let t={};if(!q(e))return t;let n=/^\d+$/.test(e.waitForDeploySec.trim())?Number(e.waitForDeploySec.trim()):0,r=e.deployEnvironment.trim(),i=[{key:null,name:e.repoDeployEnvironment,sec:e.repoWaitForDeploySec},...e.otherAppRepos.map(e=>({key:e.repo,name:e.deployEnvironment,sec:e.waitForDeploySec}))];for(let e of i){let i=e.sec.trim(),a=/^\d+$/.test(i)?Number(i):NaN,o=K(e.key,`seconds`),s=K(e.key,`environment`);i&&!(a>=0&&a<=3600)&&(t[o]=`Use a whole number of seconds from 0 to ${O}, 0 for no wait, or leave it empty to use the dot's.`);let c=e.name.trim();c.length>100?t[s]=`Use a name of up to 100 characters.`:t[o]||(i?a>0:n>0)&&!c&&!r&&(t[s]=`Name the environment this repo deploys to, for example qa, or set its wait to 0.`)}return t}function Xe(e){let t=e.trim();return/^\d+$/.test(t)&&Number(t)>0?Number(t):null}var J=`name,mission,notifyWhen,mustNot,instructions,repo,defaultBranch,prAuthors,prTeam,jiraBaseUrl,jiraProjectKeys,linearTeamKeys,githubRepos,githubRequireLabels,stages.analyst.rules,stages.designer.rules,stages.reviewer.rules,stages.regression.rules,stages.watcher.rules,probes,probeIntervalSec,statusPages,stages.guard.rules,baseUrl,runnerSetup,runnerCommand,runnerImage,runnerPassEnv,runnerCopyFiles,testBranches,deployEnvironment,waitForDeploySec,nightlyTime,nightlyDays,repoDeployEnvironment,repoWaitForDeploySec,dailyModelCap,trueUrl,trueProject,slackChannel,slackUser,digestHour`.split(`,`);function Ze(e){let t=e=>{let t=J.indexOf(e.startsWith(`probes.`)?`probes`:e.startsWith(`deploy:`)?`repoDeployEnvironment`:e);return t<0?J.length:t};return Object.keys(e).sort((e,n)=>t(e)-t(n)||e.localeCompare(n,void 0,{numeric:!0}))}function Qe(e){let t=e.trueUrl.trim(),n=e.trueProject.trim();return!e.trueOn&&!t&&!n?e.trueSaved?{trueSync:null}:{}:{trueSync:{enabled:e.trueOn,...t?{tenantUrl:t}:{},...n?{projectId:Number(n)}:{}}}}function $e(e){let t={...e};return delete t.trueSync,t}function et(e){let t={url:e.url.trim(),kind:e.kind};if(e.expectStatus.trim()&&(t.expectStatus=Number(e.expectStatus)),e.expectText.trim()&&(t.expectText=e.expectText.trim()),e.kind===`browser`){t.selector=e.selector.trim();let n=I(e.steps);n.length&&(t.steps=n)}return t}function tt(e){let t=F(e.githubRepos),n=F(e.githubRequirementTypes),r=F(e.githubDefectTypes),i=F(e.githubRequirementLabels),a=F(e.githubDefectLabels),o=F(e.githubIgnoreLabels),s=F(e.githubRequireLabels),c=F(e.githubMilestones);return{kind:`github`,...t.length?{repos:t}:{},...n.length||r.length?{issueTypes:{...n.length?{requirement:n}:{},...r.length?{defect:r}:{}}}:{},...i.length||a.length||o.length||s.length?{labels:{...i.length?{requirement:i}:{},...a.length?{defect:a}:{},...o.length?{ignore:o}:{},...s.length?{require:s}:{}}}:{},...c.length?{milestones:c}:{}}}function nt(e){return{prAuthors:(e?.authors??[]).join(`, `),prTeam:e?.team??``,prLinkedLabels:(e?.linkedIssueLabels??[]).join(`, `),prSkipDrafts:e?.skipDrafts===!0,prSkipBots:e?.skipBots===!0}}function rt(e){let t={};return F(e.prAuthors).some(e=>!Be.test(e))&&(t.prAuthors=`Use GitHub logins, for example alice, bob.`),e.prTeam.trim()&&!Ve.test(e.prTeam.trim())&&(t.prTeam=`Use org/team, for example acme/web-team.`),t}function it(e){return!!(F(e.prAuthors).length||e.prTeam.trim()||F(e.prLinkedLabels).length||e.prSkipDrafts||e.prSkipBots)}function at(e){return!!(F(e.prAuthors).length||e.prTeam.trim()||F(e.prLinkedLabels).length)}function Y(e){return e.storedRepos.filter(e=>e.role===`test`).map(e=>e.repo)}function ot(e){if(e.repoRunTests||e.otherAppRepos.some(e=>e.runTests))return null;let t=e.otherAppRepos.length?`every app repo`:e.repo.trim()||`the repository`;return Y(e).length&&(e.testRepoOnPr||e.testRepoOnMerge)?`Run tests is off for ${t}, so only the Tests repo runs. The URL, login and runner mode below apply to it. The command and setup are for the app repos.`:`Run tests is off for ${t}. These settings apply when it is on again.`}function st(e){if(!e.nightlyOn||!Y(e).length)return{};let t={};return/^([01]\d|2[0-3]):[0-5]\d$/.test(e.nightlyTime)||(t.nightlyTime=`Pick a time of day, like 02:00.`),e.nightlyDays.length||(t.nightlyDays=`Pick at least one day.`),!e.baseUrl.trim()&&e.runnerMode!==`demo`&&(t.baseUrl=`The nightly test run needs a Base URL, the site the tests run against.`),t}function ct(e){return fe({on:e.nightlyOn,time:e.nightlyTime,days:e.nightlyDays})}function lt(e){return!Y(e).length||!(e.nightlyOn||e.nightlySaved)?{}:{nightlyRun:{on:e.nightlyOn,time:e.nightlyTime,days:[...new Set(e.nightlyDays)].sort((e,t)=>e-t)}}}function ut(e){return D(F(e.runnerPassEnv)).filter(e=>!E([e]))}function dt(e){let t=F(e.prAuthors).map(e=>e.replace(/^@/,``)),n=F(e.prLinkedLabels),r=e.prTeam.trim().replace(/^@/,``),i={...t.length?{authors:t}:{},...r?{team:r}:{},...e.prSkipDrafts?{skipDrafts:!0}:{},...e.prSkipBots?{skipBots:!0}:{},...n.length?{linkedIssueLabels:n}:{}};return Object.keys(i).length?i:void 0}function ft(e){let t=it(e)?`Set here`:`Default`;return at(e)?t:`${t}. Its first look at open PRs waits for your approval.`}function pt(e){let t=[F(e.prAuthors).length?`Authors ${F(e.prAuthors).join(`, `)}`:``,e.prTeam.trim()?`Team ${e.prTeam.trim()}`:``,F(e.prLinkedLabels).length?`Issue labels ${F(e.prLinkedLabels).join(`, `)}`:``,e.prSkipDrafts?`Skip drafts`:``,e.prSkipBots?`Skip bots`:``].filter(Boolean);return t.length?t.join(`. `):null}function X(e){let t=e.repo.trim(),[n,r]=t.split(`/`),i=F(e.pathFilters),a=dt(e),o=e.trackerKind===`jira`?{kind:`jira`,baseUrl:e.jiraBaseUrl.trim().replace(/\/+$/,``),projectKeys:F(e.jiraProjectKeys)}:e.trackerKind===`linear`?{kind:`linear`,teamKeys:F(e.linearTeamKeys)}:e.trackerKind===`github`?tt(e):void 0,s={mode:e.runnerMode,...e.runnerKeep};e.runnerMode!==`demo`&&e.runnerSetup.trim()&&(s.setup=e.runnerSetup.trim()),e.runnerCommand.trim()&&(s.command=e.runnerCommand.trim()),e.runnerMode===`local`&&e.runnerWorkdir.trim()&&(s.workdir=e.runnerWorkdir.trim()),e.runnerMode===`local`&&T(F(e.runnerCopyFiles)).length&&(s.copyFiles=T(F(e.runnerCopyFiles))),e.runnerMode===`docker`&&e.runnerImage.trim()&&(s.image=e.runnerImage.trim()),e.runnerMode!==`demo`&&D(F(e.runnerPassEnv)).length&&(s.passEnv=D(F(e.runnerPassEnv))),e.smokeGrep.trim()&&(s.smokeGrep=e.smokeGrep.trim()),e.runnerEngine&&(s.engine=e.runnerEngine),e.runnerVideo===`on`&&(s.video=`on`),e.aivision?s.aivision=e.visionTests===(e.aivision.enabled!==!1)?e.aivision:{...e.aivision,enabled:e.visionTests}:e.visionTests&&(s.aivision={backend:`server`,enabled:!0});let c=e.slackChannel.trim(),l=e.storedRepos.find(e=>e.role===`app`&&e.repo===t.toLowerCase())?.deployUrlMatch,u=Ie(e,t?{repo:t.toLowerCase(),role:`app`,defaultBranch:e.defaultBranch.trim()||`main`,...i.length?{pathFilters:i}:{},...a?{prScope:a}:{},...e.repoRunTests?{}:{runTests:!1},...R(e.repoDeployEnvironment,e.repoWaitForDeploySec),...l?{deployUrlMatch:l}:{}}:void 0);return{name:e.name.trim(),role:e.role,mascot:e.mascot,mission:e.mission.trim(),notifyWhen:e.notifyWhen.trim(),mustNot:e.mustNot.trim(),instructions:e.instructions.trim(),repo:t?{owner:n,name:r,defaultBranch:e.defaultBranch.trim()||`main`,...i.length?{pathFilters:i}:{},...a?{prScope:a}:{},...e.repoRunTests?{}:{runTests:!1},...R(e.repoDeployEnvironment,e.repoWaitForDeploySec)}:void 0,...u?{repos:u}:{},...Y(e).length?{testRepoOnPr:e.testRepoOnPr,testRepoOnMerge:e.testRepoOnMerge}:{},...lt(e),tracker:o,baseUrl:e.baseUrl.trim()||void 0,probes:e.probes.map(et),probeIntervalSec:Number(e.probeIntervalSec)||300,statusPages:I(e.statusPages),runner:s,testBranches:ve(F(e.testBranches)),prTestTarget:e.prTestTarget,deployEnvironment:k(e.deployEnvironment)??null,waitForDeploySec:Xe(e.waitForDeploySec),slackChannel:c?c.startsWith(`#`)||/^[CG][A-Z0-9]+$/.test(c)?c:`#${c}`:void 0,updates:{slack:e.slackUpdates,...e.slackUser.trim()?{slackUser:e.slackUser.trim()}:{}},connections:[...e.connections],digestHour:Number(e.digestHour),dailyModelCap:M(e.dailyModelCap),...Qe(e),rules:{...e.rules},...ie(e.stages),...e.reviewTouched.length?{review:Object.fromEntries(e.reviewTouched.map(t=>[t,e.review[t]]))}:{},...e.noticeAnswered?{stagesNotice:`dismissed`}:{}}}function mt(e,t){let n={...e};for(let e of we)t?.[e]===void 0?delete n[e]:n[e]=t[e];return n}function ht(e){let t={...e};for(let e of De)delete t[e];return t}function gt(e){let t=X(e);for(let e of[`repo`,`tracker`,`baseUrl`,`slackChannel`])t[e]===void 0&&(t[e]=null);return t.stageModels=ae(e.stages),t}var Z=n(t(),1),Q=r(),_t=1e3;function $(e){let t=Math.max(0,Math.round(e/1e3));return t<60?`${t}\u00a0s`:`${Math.floor(t/60)}\u00a0min ${t%60}\u00a0s`}function vt(e,t){return`${e} ${t}${e===1?``:`s`}`}function yt(e){if(e.status===`error`)return{tone:`error`,title:`Try it could not run`,detail:e.error??`The server stopped the try.`};let t=e.result;if(!t)return{tone:`warn`,title:`Running`,detail:``};let n=t.setupCache===`hit`?` The install came from the cache.`:t.setupCache===`miss`?` The install was saved to the cache for next time.`:``;if(t.outcome===`not_run`)return{tone:`error`,title:`Tests did not run: ${(t.stage===`verify`?`GitHub could not confirm the commit`:t.stage===`setup`?`Setup failed`:t.stage===`command`?`The test command is not valid`:`No test report`).toLowerCase()}`,detail:t.reason??``};let r=[vt(t.passed,`test`)+` passed`,t.failed?`${t.failed} failed`:``,t.flaky?`${t.flaky} flaky`:``,t.skipped?`${t.skipped} skipped`:``].filter(Boolean).join(`, `);return t.outcome===`failed`?{tone:`warn`,title:`The command works, and some tests failed`,detail:`${r} in ${$(t.durationMs)}.${n}`}:t.passed+t.flaky===0?{tone:`warn`,title:`The command works, but no test ran`,detail:`Check the grep or spec filter. ${r} in ${$(t.durationMs)}.${n}`}:{tone:`ok`,title:`The command works`,detail:`${r} in ${$(t.durationMs)}.${n}`}}function bt({getInput:t,pollMs:n=_t,label:r=`Try it`,onResult:a}){let[o,s]=(0,Z.useState)(null),[c,l]=(0,Z.useState)(null),[u,d]=(0,Z.useState)(!1),[f,p]=(0,Z.useState)(()=>Date.now()),m=(0,Z.useRef)(null),h=u||o?.status===`running`,g=(0,Z.useRef)(a);(0,Z.useEffect)(()=>{g.current=a});let _=(0,Z.useRef)(null);(0,Z.useEffect)(()=>{o&&o.status!==`running`&&_.current!==o.id&&(_.current=o.id,g.current?.(o))},[o]),(0,Z.useEffect)(()=>{if(!o||o.status!==`running`)return;let t=new AbortController,r=setTimeout(()=>{e.getRunnerTry(o.id,t.signal).then(e=>{s(e),p(Date.now())}).catch(e=>{t.signal.aborted||(l(e instanceof Error?e.message:String(e)),s(e=>e&&{...e,status:`error`,error:`Lost track of the try.`}))})},n);return()=>{clearTimeout(r),t.abort()}},[o,n]),(0,Z.useEffect)(()=>{let e=m.current;e&&h&&(e.scrollTop=e.scrollHeight)},[o?.lines.length,h]);let ee=async()=>{if(h)return;l(null);let n=t();if(`error`in n){l(n.error);return}d(!0);try{let{id:t}=await e.tryRunner(n);s({id:t,status:`running`,startedAt:new Date().toISOString(),lines:[],dropped:0}),p(Date.now())}catch(e){l(e instanceof Error?e.message:String(e))}finally{d(!1)}},v=o&&o.status!==`running`?yt(o):null,y=o?$(f-Date.parse(o.startedAt)):``;return(0,Q.jsxs)(`div`,{className:`runner-try`,children:[(0,Q.jsxs)(`div`,{className:`runner-try__bar`,children:[(0,Q.jsx)(i,{onClick:ee,loading:h,children:r}),(0,Q.jsx)(`p`,{className:`runner-try__hint`,"aria-live":`polite`,children:h?`Running setup and the test command, ${y} so far. Installs and builds can take a few minutes.`:v?null:`Runs the setup steps and the test command once with these settings. Nothing is saved or posted.`})]}),c&&(0,Q.jsx)(`p`,{className:`runner-try__result runner-try__result--error`,role:`alert`,children:c}),v&&(0,Q.jsxs)(`div`,{className:`runner-try__result runner-try__result--${v.tone}`,role:`status`,children:[(0,Q.jsx)(`p`,{className:`runner-try__title`,children:v.title}),v.detail&&(0,Q.jsx)(`p`,{className:`runner-try__detail`,children:v.detail})]}),o&&o.lines.length>0&&(0,Q.jsxs)(`details`,{className:`runner-try__out`,open:h||v?.tone!==`ok`,children:[(0,Q.jsxs)(`summary`,{children:[`Output`,o.dropped?` (last ${o.lines.length} lines)`:``]}),(0,Q.jsx)(`pre`,{ref:m,tabIndex:0,"aria-label":`Command output`,children:o.lines.join(`
|
|
5
|
+
`)})]})]})}export{Oe as A,g as B,K as C,ht as D,Ge as E,me as F,y as G,h as H,d as I,ee as K,l as L,Te as M,w as N,$e as O,x as P,u as R,pt as S,ot as T,ne as U,p as V,re as W,Ze as _,Le as a,dt as b,Ne as c,qe as d,mt as f,ct as g,P as h,ze as i,Ee as j,ke as k,Je as l,M as m,We as n,X as o,j as p,G as r,gt as s,bt as t,q as u,ut as v,Y as w,ft as x,rt as y,v as z};
|
|
6
|
+
//# sourceMappingURL=RunnerTry-Dgpp67-s.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.settings{gap:var(--space-6);flex-direction:column;display:flex}.settings__group{gap:var(--space-4);flex-direction:column;min-width:0;display:flex}.settings__group-title{font-size:var(--text-sm);font-weight:var(--weight-semibold);color:var(--text-3);text-transform:uppercase;letter-spacing:.04em}.settings .card{min-width:0}.settings__link-row{justify-content:space-between;align-items:center;gap:var(--space-3);min-height:var(--tap);padding:var(--space-3) var(--space-4);border:var(--hairline);border-radius:var(--radius-lg);background:var(--surface);color:var(--text);display:flex}.settings__link-row:hover{background:var(--surface-hover);text-decoration:none}.settings__link-row:focus-visible{box-shadow:var(--focus-ring)}.settings__link-title{font-weight:var(--weight-medium);display:block}.settings__link-help{font-size:var(--text-sm);color:var(--text-3);display:block}.dot-pick{align-items:flex-end;gap:var(--space-3);flex-wrap:wrap;display:flex}.dot-pick__field{flex:220px;max-width:360px}.dot-pick__actions{gap:var(--space-2);flex-wrap:wrap;display:flex}.choice-row{gap:var(--space-2);border:0;flex-wrap:wrap;min-width:0;margin:0;padding:0;display:flex}.choice-row>legend{margin-bottom:var(--space-2);padding:0}.choice-row--stack{flex-direction:column}.choice-row--stack .choice{flex:none}.choice{align-items:flex-start;gap:var(--space-2);min-height:var(--tap);padding:var(--space-2) var(--space-3);border:1px solid var(--border-strong);border-radius:var(--radius-md);background:var(--surface);cursor:pointer;flex:200px;display:flex;position:relative}.choice--compact{padding:var(--space-1) var(--space-4);flex:none;align-items:center}.choice:hover{border-color:var(--text-3)}.choice.is-selected{border-color:var(--text-2);background:var(--surface-selected)}.choice input,.role-opt input,.mascot-opt input,.rule-seg__opt input{opacity:0;pointer-events:none;width:1px;height:1px;margin:0;position:absolute}:is(.choice:has(input:focus-visible),.role-opt:has(input:focus-visible),.mascot-opt:has(input:focus-visible),.rule-seg__opt:has(input:focus-visible)){box-shadow:var(--focus-ring)}.choice__text{flex-direction:column;min-width:0;display:flex}.choice__label{font-weight:var(--weight-medium)}.choice__help{font-size:var(--text-sm);color:var(--text-3)}.check-list{gap:var(--space-1);flex-direction:column;display:flex}.check{align-items:flex-start;gap:var(--space-3);min-height:var(--tap);padding:var(--space-2) 0;cursor:pointer;display:flex}.check input{width:18px;height:18px;accent-color:var(--accent);flex:none;margin:2px 0 0}.check__text{flex-direction:column;min-width:0;display:flex}.check__label{font-weight:var(--weight-medium)}.check__help{font-size:var(--text-sm);color:var(--text-3)}.rules{gap:var(--space-4);flex-direction:column;display:flex}.rules-legend{gap:var(--space-2);padding:var(--space-3);border-radius:var(--radius-md);background:var(--surface-2);font-size:var(--text-sm);grid-template-columns:1fr;margin:0;display:grid}.rules-legend__item{gap:var(--space-3);grid-template-columns:128px 1fr;align-items:baseline;display:grid}.rules-legend dd{color:var(--text-2);margin:0}.rule-chip{font-weight:var(--weight-semibold);white-space:nowrap}.rule-chip--act{color:var(--ok-fg)}.rule-chip--act_when_asked{color:var(--running-fg)}.rule-chip--ask{color:var(--attention-fg)}.rule-chip--hand_off{color:var(--text-2)}.rules__rows{flex-direction:column;display:flex}.rule-row{gap:var(--space-1) var(--space-4);padding:var(--space-3) 0;border:0;border-top:var(--hairline);grid-template-columns:1fr;min-width:0;margin:0;display:grid}.rule-row__title{font-weight:var(--weight-medium)}.rule-row__help{font-size:var(--text-sm);color:var(--text-3)}.rule-row__default{color:var(--text-2)}.rule-row__saving{color:var(--running-fg)}.rule-row__reset{font-size:var(--text-sm);justify-self:start}.rule-seg{margin-top:var(--space-1);border:var(--hairline);border-radius:var(--radius-md);background:var(--surface-2);grid-template-columns:repeat(4,minmax(0,1fr));gap:2px;padding:2px;display:grid}.rule-seg__opt{min-height:var(--tap);padding:0 var(--space-1);border-radius:var(--radius);color:var(--text-2);font-size:var(--text-sm);font-weight:var(--weight-medium);text-align:center;cursor:pointer;justify-content:center;align-items:center;line-height:1.2;display:flex;position:relative}.rule-seg__opt:hover{color:var(--text)}.rule-seg__opt.is-selected{background:var(--segment-selected);color:var(--text);box-shadow:inset 0 0 0 1px var(--segment-selected-ring), var(--shadow-1)}.rule-seg__opt.is-readonly{cursor:default}@media (min-width:720px){.rules-legend{grid-template-columns:1fr 1fr}.rule-row{grid-template-columns:minmax(0,1fr) minmax(320px,400px);align-items:center}.rule-row__label{grid-area:1/1}.rule-row__help{grid-area:2/1}.rule-seg{grid-area:1/2/span 2;margin-top:0}.rule-row__reset{grid-area:3/1}}@media (min-width:900px) and (pointer:fine){.rule-seg__opt{min-height:var(--control)}}.conn-list{margin:0;padding:0;list-style:none}.conn{gap:var(--space-2);padding:var(--space-4);border-top:var(--hairline);flex-direction:column;display:flex}.conn:first-child{border-top:0}.conn__head{justify-content:space-between;align-items:flex-start;gap:var(--space-2) var(--space-4);flex-wrap:wrap;display:flex}.conn__main{flex:260px;min-width:0}.conn__title-row{align-items:center;gap:var(--space-2);flex-wrap:wrap;display:flex}.conn__name{font-weight:var(--weight-semibold);overflow-wrap:anywhere}.conn__target{font-family:var(--font-mono);font-size:var(--text-xs);color:var(--text-3);overflow-wrap:anywhere;margin-top:2px;display:block}.conn__meta{font-size:var(--text-sm);color:var(--text-3)}.conn__warn{color:var(--attention-fg)}.conn__actions{gap:var(--space-1);flex-wrap:wrap;display:flex}.conn__error{padding:var(--space-2) var(--space-3);border-radius:var(--radius);background:var(--outage-bg);color:var(--outage-fg);font-size:var(--text-sm);overflow-wrap:anywhere}.conn__switches{gap:var(--space-3) var(--space-6);flex-wrap:wrap;display:flex}.conn__switches .toggle{flex:240px}.conn__disclosure{align-items:center;gap:var(--space-2);min-height:var(--tap);padding:0 var(--space-2);margin-left:calc(-1 * var(--space-2));border-radius:var(--radius);color:var(--text);font-weight:var(--weight-medium);text-align:left;background:0 0;border:0;align-self:flex-start;display:inline-flex}.conn__disclosure:hover{background:var(--surface-hover)}.conn__tools[hidden]{display:none}.conn__tool-list{flex-direction:column;margin:0;padding:0;list-style:none;display:flex}.conn__tool{padding:var(--space-2) 0;border-top:var(--hairline)}.conn__tool .toggle__label{font-family:var(--font-mono);font-size:var(--text-sm);overflow-wrap:anywhere}.conn__ro{vertical-align:1px}.conn-status{font-size:var(--text-sm);color:var(--text-2);align-items:center;gap:6px;display:inline-flex}.conn-status__dot{border-radius:var(--radius-full);background:var(--paused);width:8px;height:8px}.conn-status--connected .conn-status__dot{background:var(--ok)}.conn-status--error{color:var(--outage-fg)}.conn-status--error .conn-status__dot{background:var(--outage)}.mem-add{align-items:flex-start;gap:var(--space-3);padding:var(--space-4);border-bottom:var(--hairline);flex-wrap:wrap;display:flex}.mem-add__kind{flex:0 180px}.mem-add__text{flex:260px}.mem-add__btn{margin-top:26px}.mem-list{margin:0;padding:0;list-style:none}.mem-row{align-items:flex-start;gap:var(--space-3);padding:var(--space-3) var(--space-4);border-top:var(--hairline);display:flex}.mem-row:first-child{border-top:0}.mem-row__main{flex:1;min-width:0}.mem-row__text{overflow-wrap:anywhere}.mem-row__title{font-weight:var(--weight-semibold);overflow-wrap:anywhere}.mem-row__suite{font-size:var(--text-sm);color:var(--text-2);overflow-wrap:anywhere;margin-top:2px}.mem-row__file{font-family:var(--font-mono);font-size:var(--text-xs);color:var(--text-2)}.mem-row__when{white-space:nowrap}.mem-row__chip{padding:0 var(--space-2);border:var(--hairline);border-radius:var(--radius-full);font-size:var(--text-xs);white-space:nowrap;line-height:1.6}.mem-row__meta{align-items:center;gap:var(--space-1) var(--space-2);margin-top:var(--space-1);font-size:var(--text-sm);color:var(--text-3);flex-wrap:wrap;display:flex}.push,.token,.device-access{gap:var(--space-3);flex-direction:column;display:flex}.device-access .field{max-width:420px}.device-access__text,.settings__note{color:var(--text-2);font-size:var(--text-sm);text-wrap:pretty;max-width:64ch}.push__text{color:var(--text-2);max-width:64ch}.push__steps{margin:var(--space-2) 0 0;padding-left:var(--space-5)}.push__actions,.token__actions{gap:var(--space-2);flex-wrap:wrap;display:flex}.push__error{color:var(--outage-fg);font-size:var(--text-sm)}.token__state{align-items:center;gap:var(--space-2);flex-wrap:wrap;display:flex}.token__warn{font-size:var(--text-sm);color:var(--outage-fg)}.token .field{max-width:420px}.demo-list{margin:0;padding:0;list-style:none}.demo-row{align-items:center;gap:var(--space-2) var(--space-4);padding:var(--space-3) var(--space-4);border-top:var(--hairline);flex-wrap:wrap;display:flex}.demo-row:first-child{border-top:0}.demo-row__main{flex:220px;min-width:0}.demo-row__title{font-weight:var(--weight-medium)}.demo-row__help{font-size:var(--text-sm);color:var(--text-3)}.wd-form{gap:var(--space-6);flex-direction:column;display:flex}.wd-section{gap:var(--space-3);border:0;flex-direction:column;min-width:0;margin:0;padding:0;display:flex}.wd-section__title{margin-bottom:var(--space-1);font-size:var(--text-md);font-weight:var(--weight-semibold);padding:0}.wd-section__hint{margin-top:calc(-1 * var(--space-2));font-size:var(--text-sm);color:var(--text-3)}.wd-section__body{gap:var(--space-4);flex-direction:column;display:flex}.wd-note{font-size:var(--text-sm);color:var(--text-2)}.wd-section .input[readonly]{background:var(--surface-2);color:var(--text-2)}.wd-switches{gap:var(--space-2);border:0;flex-direction:column;min-width:0;margin:0;padding:0;display:flex}.wd-switches>legend{margin-bottom:var(--space-1);padding:0}.wd-switches .toggle__label{overflow-wrap:anywhere}.wd-scope{gap:var(--space-3);flex-direction:column;min-width:0;display:flex}.wd-scope>.wd-section__hint{margin-top:calc(-1 * var(--space-2))}.wd-scope>.wd-section__hint--first{margin-top:0}.wd-grid{gap:var(--space-4);grid-template-columns:repeat(auto-fit,minmax(220px,1fr));display:grid}.wd-narrow{max-width:220px}.wd-deploy-repos{flex-direction:column;min-width:0;display:flex}.wd-deploy-repo{gap:var(--space-3);padding:var(--space-3) 0;border-top:1px solid var(--border);grid-template-columns:minmax(0,1.4fr) minmax(0,1fr) minmax(0,1fr);align-items:start;display:grid}.wd-deploy-repo:first-child{border-top:0;padding-top:0}.wd-deploy-repo__name{overflow-wrap:anywhere;min-width:0;padding-top:calc(var(--space-6) - var(--space-1));font-weight:500}.wd-advanced{min-width:0}.wd-advanced>summary{cursor:pointer;width:-moz-fit-content;width:fit-content;font-size:var(--text-sm);color:var(--text-3)}.wd-advanced>summary:hover{color:var(--text-2)}.wd-advanced[open]>summary{margin-bottom:var(--space-3)}.wd-nightly-line{align-items:flex-start;gap:var(--space-1);flex-direction:column;min-width:0;display:flex}.wd-nightly-line__open,.wd-nightly-line__open .btn__label{white-space:nowrap;max-width:100%}.wd-nightly{gap:var(--space-3);flex-direction:column;min-width:0;display:flex}.wd-days{gap:var(--space-1);border:0;flex-direction:column;min-width:0;margin:0;padding:0;display:flex}.wd-days>legend{margin-bottom:var(--space-1);padding:0}.wd-days__row{border-radius:var(--radius-md);background:var(--surface-2);border:var(--hairline);grid-template-columns:repeat(7,minmax(0,1fr));gap:2px;max-width:420px;padding:2px;display:grid}.wd-day{min-width:0;min-height:var(--control-sm);border-radius:var(--radius);color:var(--text-2);font-size:var(--text-sm);font-weight:var(--weight-medium);white-space:nowrap;background:0 0;border:0;padding:0}.wd-day:hover{color:var(--text)}.wd-day.is-selected{background:var(--accent-soft);color:var(--accent-soft-text);box-shadow:inset 0 0 0 1px var(--accent)}@media (max-width:640px){.wd-deploy-repo{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}.wd-deploy-repo__name{grid-column:1/-1;padding-top:0}}textarea.wd-mono,input.wd-mono{font-family:var(--font-mono)}.wd-env-box{gap:var(--space-2);flex-direction:column;min-width:0;display:flex}.wd-env{border:1px solid var(--border);border-radius:var(--radius);margin:0;padding:0;list-style:none}.wd-env__row{justify-content:space-between;align-items:center;gap:var(--space-1) var(--space-4);padding:var(--space-2) var(--space-3);border-top:var(--hairline);flex-wrap:wrap;display:flex}.wd-env__row:first-child{border-top:0}.wd-env__name{flex-direction:column;min-width:0;display:flex}.wd-env__name code{font-family:var(--font-mono);font-size:var(--text-sm);overflow-wrap:anywhere}.wd-env__as{font-size:var(--text-xs);color:var(--text-3)}.runner-try{gap:var(--space-2);flex-direction:column;min-width:0;display:flex}.runner-try__bar{align-items:center;gap:var(--space-3);flex-wrap:wrap;display:flex}.runner-try__hint{min-width:0;font-size:var(--text-sm);color:var(--text-2);text-wrap:pretty;flex:240px}.runner-try__hint:empty{display:none}.runner-try__result{padding:var(--space-2) var(--space-3);border-radius:var(--radius);font-size:var(--text-sm);border:1px solid var(--border);overflow-wrap:anywhere}.runner-try__result--ok{background:var(--ok-bg);color:var(--ok-fg)}.runner-try__result--warn{background:var(--attention-bg);color:var(--attention-fg)}.runner-try__result--error{background:var(--outage-bg);color:var(--outage-fg)}.runner-try__title{font-weight:var(--weight-semibold)}.runner-try__detail{margin-top:var(--space-0-5)}.runner-try__out summary{cursor:pointer;font-size:var(--text-sm);color:var(--text-2);padding:var(--space-1) 0}.runner-try__out pre{margin-top:var(--space-1);max-height:240px;padding:var(--space-2) var(--space-3);background:var(--surface-2);border:1px solid var(--border);border-radius:var(--radius);font-family:var(--font-mono);font-size:var(--text-xs);line-height:var(--leading);white-space:pre-wrap;overflow-wrap:anywhere;overflow:auto}.runner-try__out pre:focus-visible{box-shadow:var(--focus-ring);outline:none}.role-grid{gap:var(--space-2);grid-template-columns:repeat(auto-fill,minmax(200px,1fr));display:grid}.role-opt{gap:var(--space-1);min-height:var(--tap);padding:var(--space-3);border:1px solid var(--border-strong);border-radius:var(--radius-md);background:var(--surface);cursor:pointer;flex-direction:column;display:flex;position:relative}.role-opt:hover{border-color:var(--text-3)}.role-opt.is-selected{border-color:var(--text-2);background:var(--surface-selected)}.role-opt--skeleton{cursor:default}.role-opt__label{font-weight:var(--weight-semibold)}.role-opt__desc{font-size:var(--text-sm);color:var(--text-2)}.mascot-pick{border:0;min-width:0;margin:0;padding:0}.mascot-pick>legend{margin-bottom:var(--space-2);padding:0}.mascot-pick__opts{gap:var(--space-2);flex-wrap:wrap;display:flex}.mascot-opt{align-items:center;gap:var(--space-1);min-width:72px;padding:var(--space-2) var(--space-3);border:1px solid var(--border-strong);border-radius:var(--radius-md);background:var(--surface);cursor:pointer;flex-direction:column;display:flex;position:relative}.mascot-opt.is-selected{border-color:var(--text-2);background:var(--surface-selected)}.mascot-opt__label{font-size:var(--text-sm);font-weight:var(--weight-medium)}.probe-list{gap:var(--space-3);flex-direction:column;align-items:stretch;display:flex}.probe-list>.btn{align-self:flex-start}.probe{gap:var(--space-3);padding:var(--space-3) var(--space-4) var(--space-4);border:var(--hairline);border-radius:var(--radius-md);background:var(--surface-2);flex-direction:column;min-width:0;margin:0;display:flex}.probe__title{padding:0 var(--space-1);font-size:var(--text-sm);font-weight:var(--weight-semibold)}.probe__head{justify-content:space-between;align-items:center;gap:var(--space-2);flex-wrap:wrap;display:flex}@media (pointer:coarse){.qd-touch .btn,.qd-touch .btn--sm,.wd .btn,.wd .btn--sm{min-height:var(--tap)}}@media (max-width:899px),(pointer:coarse){.qd-touch .btn--sm,.wd .btn--sm,.qd-touch .segmented__item,.qd-touch .link-btn{min-height:var(--tap)}.qd-touch .link-btn{align-items:center;display:inline-flex}}select.wd-engine,select.wd-video{white-space:nowrap;text-overflow:ellipsis}@media (max-width:380px){select.wd-engine{font-size:var(--text-sm)}}.updates{gap:var(--space-5);flex-direction:column;display:flex}.updates__person{gap:var(--space-3);flex-direction:column;min-width:0;display:flex}.updates__person+.updates__person{padding-top:var(--space-5);border-top:var(--hairline)}.updates__head{align-items:baseline;gap:var(--space-2);flex-wrap:wrap;display:flex}.updates__name{font-size:var(--text-md);font-weight:var(--weight-semibold)}.updates__note,.updates__help{font-size:var(--text-sm);color:var(--text-3)}.updates__help{text-wrap:pretty;max-width:64ch}.updates__levels{overflow-x:auto}.updates__levels .segmented__item{white-space:nowrap;flex:none}.updates__quiet{gap:var(--space-3);flex-wrap:wrap;display:flex}.updates__quiet .field{flex:0 160px;min-width:0}.about__version{overflow-wrap:anywhere;margin:0}.about__commit{color:var(--text-3);font-family:var(--font-mono,ui-monospace, monospace)}.shadow-note{justify-content:space-between;align-items:center;gap:var(--space-3);padding:var(--space-3) var(--space-4);margin-bottom:var(--space-4);border:var(--hairline);border-radius:var(--radius-md);background:var(--surface-2);flex-wrap:wrap;display:flex}.shadow-note__text{flex:20rem;min-width:0}.shadow-note__title{font-size:var(--text-md);font-weight:var(--weight-semibold);color:var(--text);margin:0}.shadow-note__body{margin:var(--space-1) 0 0;font-size:var(--text-sm);color:var(--text-2);line-height:var(--leading)}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{An as e,Bn as t,C as n,Cn as r,F as i,G as a,H as o,I as s,It as c,M as l,N as u,Nn as d,O as f,P as p,Pt as m,R as h,S as g,Tn as _,U as v,Vn as y,Wn as b,Y as x,_ as S,a as C,at as w,b as T,cn as E,in as D,kn as O,mn as ee,o as k,pn as A,q as j,sn as M,u as N,ut as te,wn as ne,x as re}from"./ui-DcmhYyYp.js";import{i as ie,r as ae}from"./router-W6nZsQ33.js";import{n as P,r as F,t as I}from"./storage-yvL36AWt.js";import{i as L,n as R,o as oe,r as z,s as se}from"./store-IqrqHuFR.js";import{a as ce,c as le,o as ue,r as de,t as B}from"./data-CmXvx3Mj.js";import{y as fe}from"./format-BBZ8vFyT.js";import{ct as pe,dt as me,fn as he,ft as ge,ht as _e,lt as ve,mn as V,mt as ye,pn as be,pt as H,ut as U}from"./index-B6qKm1NW.js";import{a as W,c as xe,d as Se,g as Ce,h as we,i as Te,l as Ee,m as G,n as K,o as De,r as Oe,t as q,u as ke}from"./phoneApi-BG_1-M-D.js";import{i as Ae}from"./UpdatesSection-CCWEbkue.js";import{i as je,n as Me}from"./ModelChoices-BxO1zyyr.js";import"./RunnerTry-Dgpp67-s.js";import{a as Ne,r as Pe,s as Fe}from"./LeadDialog-N3Zul9Rw.js";import{n as Ie,r as Le,t as Re}from"./shadowWeekModel-BUUiww09.js";import{t as ze}from"./useRestoreDot-D0B6W82H.js";import{t as Be}from"./ConfirmDialog-CIMveD-b.js";import{t as Ve}from"./NewDotDialog-CDPUWmgN.js";import{t as He}from"./PushSection-CmqHlE_2.js";/* empty css */var J=b(y(),1),Y=ee();function Ue(e){return e instanceof Error?e.message:String(e)}function We(e){try{return new URL(e).host}catch{return e}}function Ge({open:e,onClose:t}){let n=L(e?De:null,e=>G.paths(e)),i=L(e?W:null,e=>G.state(e)),[a,o]=(0,J.useState)(Oe),[c,l]=(0,J.useState)(`member`),[d,f]=(0,J.useState)(null),[m,h]=(0,J.useState)(!1),[g,_]=(0,J.useState)(!1),[v,y]=(0,J.useState)(null),[b,S]=(0,J.useState)(null),[C,w]=(0,J.useState)(null),T=typeof location>`u`?``:location.origin,E=Ee(n.data??null,T),D=E.find(e=>`${e.id}:${e.url}`===b)??E[0],O=i.data?.invites??0;(0,J.useEffect)(()=>{if(!e)return;let t=new AbortController;return G.join(t.signal).then(e=>w(e.name)).catch(()=>void 0),()=>t.abort()},[e]);let ee=(0,J.useCallback)(async()=>{h(!0),y(null);try{f(await G.createInvite(a,c)),i.reload()}catch(e){y(Ue(e))}finally{h(!1)}},[a,c]),k=async()=>{_(!0),y(null);try{await G.cancelInvites(),f(null),await i.reload()}catch(e){y(e instanceof r?e.message:Ue(e))}finally{_(!1)}},j=()=>{f(null),y(null),t()},M=d&&D?Se(D.url,d.code):``,N=d&&D?ke({serverName:C??We(D.url),base:D.url,code:d.code,display:d.display,expiresAt:d.expiresAt}):``;return(0,Y.jsx)(x,{open:e,onClose:j,side:`right`,title:`Invite a teammate`,description:`They open the link, type their name and the invite code, and join. No admin key.`,className:`pair-sheet`,footer:(0,Y.jsx)(A,{variant:d?`primary`:`secondary`,onClick:j,children:d?`Done`:`Close`}),children:(0,Y.jsxs)(`div`,{className:`pair invite`,children:[E.length===0?(0,Y.jsxs)(`div`,{className:`pair__nopath`,role:`status`,children:[(0,Y.jsx)(`p`,{children:`Teammates cannot open this address yet. Your admin needs to set a public address.`}),(0,Y.jsx)(`p`,{className:`phone__note`,children:`Set a Public URL, or open localdost on the team address and invite from there.`}),(0,Y.jsx)(`a`,{className:`btn btn--secondary btn--md`,href:`#/setup?connect=publicUrl`,children:(0,Y.jsx)(`span`,{className:`btn__label`,children:`Set a Public URL`})})]}):(0,Y.jsxs)(Y.Fragment,{children:[E.length>1&&(0,Y.jsx)(`div`,{className:`segmented pair__paths`,role:`radiogroup`,"aria-label":`Address the teammate uses`,children:E.map(e=>{let t=`${e.id}:${e.url}`,n=D&&`${D.id}:${D.url}`===t;return(0,Y.jsx)(`button`,{type:`button`,role:`radio`,"aria-checked":!!n,className:`segmented__item${n?` is-selected`:``}`,onClick:()=>S(t),children:e.label},t)})}),(0,Y.jsxs)(`div`,{className:`invite__expiry`,children:[(0,Y.jsx)(`span`,{className:`invite__label`,id:`invite-expiry`,children:d?`Next code expires in`:`Expires in`}),(0,Y.jsx)(`div`,{className:`segmented`,role:`radiogroup`,"aria-labelledby":`invite-expiry`,children:Te.map(e=>(0,Y.jsx)(`button`,{type:`button`,role:`radio`,"aria-checked":a===e.sec,className:`segmented__item${a===e.sec?` is-selected`:``}`,onClick:()=>o(e.sec),children:e.label},e.sec))})]}),(0,Y.jsxs)(`div`,{className:`invite__role`,children:[(0,Y.jsx)(`span`,{className:`invite__label`,id:`invite-role`,children:d?`Next code joins as`:`Joins as`}),(0,Y.jsx)(`div`,{className:`segmented`,role:`radiogroup`,"aria-labelledby":`invite-role`,"data-testid":`invite-role`,children:[`member`,`editor`].map(e=>(0,Y.jsx)(`button`,{type:`button`,role:`radio`,"aria-checked":c===e,className:`segmented__item${c===e?` is-selected`:``}`,onClick:()=>l(e),children:K[e]},e))}),(0,Y.jsx)(`p`,{className:`phone__note invite__role-help`,"data-testid":`invite-role-help`,children:q[c]})]}),(0,Y.jsx)(`div`,{children:(0,Y.jsx)(A,{variant:d?`secondary`:`primary`,loading:m,onClick:()=>void ee(),children:d?`Make another code`:`Make invite code`})})]}),v&&(0,Y.jsx)(`p`,{className:`pair__error`,role:`alert`,children:v}),d&&D&&(0,Y.jsxs)(`div`,{className:`invite__result`,children:[(0,Y.jsxs)(`div`,{className:`pair__code-block`,children:[(0,Y.jsx)(`span`,{className:`pair__code-label`,children:`Invite code`}),(0,Y.jsx)(`span`,{className:`pair__code num`,"data-testid":`invite-code`,"aria-label":`Invite code ${d.display.split(``).join(` `)}`,children:d.display}),(0,Y.jsxs)(`span`,{className:`pair__ttl num`,children:[`Works once. Expires `,xe(d.expiresAt),`.`]}),(0,Y.jsxs)(`span`,{className:`pair__ttl`,"data-testid":`invite-role-shown`,children:[`Joins as `,K[d.role??`member`].toLowerCase(),`.`]})]}),(0,Y.jsx)(u,{label:`Link`,children:(0,Y.jsxs)(`div`,{className:`invite__copy`,children:[(0,Y.jsx)(p,{readOnly:!0,value:M,onFocus:e=>e.currentTarget.select(),"data-testid":`invite-link`}),(0,Y.jsx)(je,{text:M,label:`Copy link`,size:`md`})]})}),(0,Y.jsx)(u,{label:`Message for Slack`,hint:`One code is for one person. Make another for the next teammate.`,children:(0,Y.jsx)(s,{readOnly:!0,rows:7,value:N,onFocus:e=>e.currentTarget.select(),"data-testid":`invite-message`})}),(0,Y.jsx)(`div`,{children:(0,Y.jsx)(je,{text:N,label:`Copy message`,size:`md`})})]}),O>0&&(0,Y.jsxs)(`div`,{className:`invite__open`,"data-testid":`invite-open`,children:[(0,Y.jsxs)(`p`,{className:`phone__note num`,children:[O,` open `,O===1?`invite`:`invites`,`, not used yet.`]}),(0,Y.jsx)(A,{variant:`ghost`,size:`sm`,loading:g,onClick:()=>void k(),children:`Cancel open invites`})]})]})})}function Ke({health:e}){let t=be(e),n=he(e?.commit);return(0,Y.jsx)(M,{title:`About`,description:`The version of the server this app talks to.`,children:t?(0,Y.jsxs)(`p`,{className:`about__version`,children:[(0,Y.jsx)(`strong`,{children:t}),n?(0,Y.jsxs)(`span`,{className:`about__commit`,children:[` · commit `,n]}):null]}):(0,Y.jsx)(`p`,{className:`about__version`,children:`This server does not report its version.`})})}function qe(){let{data:e}=ue();return(0,Y.jsx)(Ke,{health:e})}function Je(){let e=de(),{restore:t,pendingId:n}=ze(),[r,i]=(0,J.useState)(null),a=e.data??[];return(0,Y.jsxs)(M,{as:`section`,"aria-label":`Archived dots`,children:[e.data?a.length===0?(0,Y.jsx)(`p`,{className:`rm-row__text`,children:`No archived dots. A dot you archive waits here until you restore it.`}):(0,Y.jsx)(`ul`,{className:`arch-list list-box`,children:a.map(e=>(0,Y.jsxs)(`li`,{className:`arch-row`,children:[(0,Y.jsx)(T,{kind:`archived`,label:`Archived`,decorative:!0}),(0,Y.jsxs)(`div`,{className:`arch-row__main`,children:[(0,Y.jsx)(`span`,{className:`arch-row__name`,title:e.name,children:e.name}),(0,Y.jsxs)(`span`,{className:`arch-row__meta`,children:[e.archivedAt?`Archived ${fe(e.archivedAt)}`:`Archived`,`. Its history is kept.`]})]}),(0,Y.jsxs)(`div`,{className:`arch-row__actions`,children:[(0,Y.jsx)(A,{variant:`secondary`,loading:n===e.id,"aria-label":`Restore ${e.name}`,onClick:()=>void t(e),children:`Restore`}),(0,Y.jsx)(A,{variant:`danger`,"aria-label":`Delete ${e.name} permanently`,onClick:()=>i(e),children:`Delete permanently`})]})]},e.id))}):e.loading?(0,Y.jsx)(h,{rows:2,label:`Loading archived dots`}):(0,Y.jsx)(o,{compact:!0,title:`Could not load archived dots`,error:e.error,onRetry:()=>void e.reload()}),r&&(0,Y.jsx)(Fe,{open:!0,dot:r,onClose:()=>i(null)})]})}var X={pr_merged:{label:`Merge to main`,help:`Runs the suite against the sample app. One spec fails on a seeded bug.`},pr_opened:{label:`Open a pull request`,help:`Reviews the change for QA, tests it, and drafts the sticky PR comment.`},pr_synchronize:{label:`Push to the pull request`,help:`A new commit on the same PR. The old review is marked out of date.`},pr_comment_edited:{label:`Tick a test in the PR comment`,help:`A tester ticks a What to test item. Run "Open a pull request" first.`},ticket_created:{label:`New ticket`,help:`Reviews a ticket for open questions and things to test by hand.`},outage:{label:`Production outage`,help:`Three failed site checks, a suspected cause and an urgent phone alert.`},ci_failure:{label:`CI failure`,help:`Reads the failed job log and classifies the failure.`}};function Ye({dotId:e,dotName:t}){let n=j(),[r,i]=(0,J.useState)(null),a=async t=>{i(t);try{let r=await _.simulate(t,e);r.ok===!1?n.show({tone:`error`,title:`${X[t].label} did not start`,body:r.reason??`No dot matched the demo payload.`}):n.show({tone:`success`,title:`${X[t].label} sent`,body:r.trigger?.title??`The dot is on it.`,action:{label:`Open Activity`,onClick:()=>ae(e?`#/feed?dot=${encodeURIComponent(e)}`:`#/feed`)}})}catch(e){n.show({tone:`error`,title:`Could not simulate ${X[t].label.toLowerCase()}`,body:e instanceof Error?e.message:void 0})}finally{i(null)}};return(0,Y.jsx)(M,{title:`Demo`,description:t?`Send a fake event to ${t}. Whatever it would post stays here and is not sent.`:`Send a fake event. Whatever it would post stays here and is not sent.`,flush:!0,children:(0,Y.jsx)(`ul`,{className:`demo-list`,children:ne.map(e=>(0,Y.jsxs)(`li`,{className:`demo-row`,children:[(0,Y.jsxs)(`div`,{className:`demo-row__main`,children:[(0,Y.jsx)(`p`,{className:`demo-row__title`,children:X[e].label}),(0,Y.jsx)(`p`,{className:`demo-row__help`,children:X[e].help})]}),(0,Y.jsx)(A,{variant:`secondary`,icon:(0,Y.jsx)(m,{size:14}),loading:r===e,onClick:()=>void a(e),"aria-label":`Simulate ${X[e].label.toLowerCase()}`,children:`Simulate`})]},e))})})}function Xe(){let e=j(),{isAdmin:t}=V(),n=L(t?W:null,e=>G.state(e));if(!t||n.error instanceof r&&n.error.status===403)return null;let a=n.data?.devices??[];if(a.length===0)return null;let o=async(t,r)=>{try{await G.setRole(t.id,r),e.show({tone:`success`,title:`${t.name} is ${r===`editor`?`an editor`:`a member`}`,body:q[r]})}catch(n){e.show({tone:`error`,title:`Could not change the role of ${t.name}`,body:n instanceof Error?n.message:void 0})}await n.reload()};return(0,Y.jsx)(M,{title:`Devices`,description:`What each paired device may do. Pair or revoke a device in Setup.`,children:(0,Y.jsx)(`ul`,{className:`rows phone__devices`,"data-testid":`settings-devices`,children:a.map(e=>(0,Y.jsxs)(`li`,{className:`row phone__device`,children:[(0,Y.jsxs)(`div`,{className:`row__main phone__device-main`,children:[(0,Y.jsx)(`span`,{className:`phone__device-name`,children:e.name}),(0,Y.jsxs)(`span`,{className:`phone__device-meta`,children:[we(e.platform),` · Last seen `,Ce(e.lastSeenAt).toLowerCase()]})]}),(0,Y.jsx)(`div`,{className:`phone__device-actions`,children:(0,Y.jsx)(i,{className:`phone__role`,"aria-label":`Role of ${e.name}`,title:q[e.role??`member`],value:e.role??`member`,onChange:t=>void o(e,t.target.value),options:[`member`,`editor`].map(e=>({value:e,label:K[e]}))})})]},e.id))})})}var Z=`adminToken`,Q=`deviceToken`,Ze=`deviceName`;function Qe(e){d(e),oe.restart(),R(``)}function $e(){let t=V(),n=j(),[i,a]=(0,J.useState)(``),[o,s]=(0,J.useState)(null),[c,l]=(0,J.useState)(!1),d=I(Z,``),f=I(Q,``),m=I(Ze,``),h=e(),g=async e=>{e.preventDefault();let t=i.trim();if(!t){s(`Type your name so what you OK carries it.`);return}l(!0),s(null);try{let e=await G.pairSelf(t);F(Z,O()),F(Ze,e.device.name),P(Q),Qe(e.token),a(``),n.show({tone:`success`,title:`This computer is paired as ${e.device.name}`,body:`Approvals made here carry your name.`})}catch(e){s(e instanceof r||e instanceof Error?e.message:`Could not pair this computer.`)}finally{l(!1)}},_=()=>{F(Q,O()),F(Ze,t.name??m),Qe(d),P(Z),n.show({title:`This computer uses the admin token`})},v=()=>{F(Z,O()),Qe(f),P(Q),n.show({title:`This computer is back to ${m||`your name`}`})};if(!t.ready)return null;if(t.isAdmin&&O()&&!h){if(f)return(0,Y.jsx)(M,{title:`Put your name on what you OK`,description:`What you OK with the admin token shows as admin.`,children:(0,Y.jsxs)(`div`,{className:`device-access`,children:[(0,Y.jsxs)(`p`,{className:`device-access__text`,children:[`This computer is paired as `,(0,Y.jsx)(`strong`,{children:m||`you`}),`. Use it for what you OK so each one carries your name.`]}),(0,Y.jsx)(`div`,{children:(0,Y.jsx)(A,{variant:`primary`,onClick:v,children:`Use ${m||`my name`} when I OK something`})})]})});let e=i.trim()?`Pair this computer as ${i.trim()}`:`Pair this computer`;return(0,Y.jsx)(M,{title:`Put your name on what you OK`,description:`What you OK with the admin token shows as admin. Join this computer under your name and each OK carries it.`,children:(0,Y.jsxs)(`form`,{className:`device-access`,onSubmit:e=>void g(e),noValidate:!0,children:[(0,Y.jsx)(u,{label:`Your name`,hint:`Setup, connections, and new dots still need the admin token. Switch back here any time.`,error:o,children:(0,Y.jsx)(p,{value:i,onChange:e=>a(e.target.value),maxLength:60,autoComplete:`name`,"data-testid":`pair-self-name`})}),(0,Y.jsx)(`div`,{children:(0,Y.jsx)(A,{type:`submit`,variant:`primary`,loading:c,children:e})})]})})}if(!t.isAdmin){let e=t.role===`editor`?`editor`:`member`;return(0,Y.jsx)(M,{title:`Your access`,description:t.name?`Paired as ${t.name}.`:`Signed in with Tailscale.`,children:(0,Y.jsxs)(`div`,{className:`device-access`,children:[(0,Y.jsxs)(`p`,{className:`device-access__text`,children:[(0,Y.jsx)(E,{tone:e===`editor`?`accent`:`neutral`,children:K[e]}),` `,q[e]]}),(0,Y.jsxs)(`p`,{className:`device-access__text`,children:[e===`member`?`Ask your localdost admin to make you an editor. `:``,`Setup, connections, new dots, and removing a dot stay with the admin token.`]}),d&&(0,Y.jsx)(`div`,{children:(0,Y.jsx)(A,{variant:`secondary`,onClick:_,children:`Use the admin token on this computer`})})]})})}return null}var et=/^(.+?) :: (?:\[([^\]]+)\] )?(.+?)(?: \((passed on retry[^()]*)\))?$/i;function tt(e){let t=et.exec(e.trim());if(!t)return null;let[,n,r,i,a=``]=t,o=i.match(/(^|\s)@[\w-]+/g)?.map(e=>e.trim())??[],s=i.replace(/(^|\s)@[\w-]+/g,``).split(` › `).map(e=>e.trim()).filter(Boolean),c=s.pop()??i,l=/passed on retry(?: (\d+))?/i.exec(a);return{file:n,projects:r?[r]:[],suite:s,title:c,tags:o,detail:l?`Passed on retry${l[1]?` ${l[1]}`:``}`:a}}function nt(e){let t=[],n=new Map;for(let r of e){let e=r.kind===`flaky_spec`?tt(r.text):null;if(!e){t.push({kind:`item`,item:r});continue}let i=[e.file,...e.suite,e.title].join(`\0`),a=n.get(i);if(a){a.items.push(r);for(let t of e.projects)a.test.projects.includes(t)||a.test.projects.push(t);continue}let o={kind:`flaky`,items:[r],test:e};n.set(i,o),t.push(o)}return t}var rt=e=>e.charAt(0).toUpperCase()+e.slice(1),$={note:`Note`,flaky_spec:`Flaky test`,env_quirk:`Environment quirk`,convention:`Convention`,decision:`Decision`},it=Object.keys($).map(e=>({value:e,label:$[e]})),at=e=>`memory:${e}`;function ot(e){let t=new Date(e);return Number.isNaN(t.getTime())?``:t.toLocaleDateString(void 0,{month:`short`,day:`numeric`,year:t.getFullYear()===new Date().getFullYear()?void 0:`numeric`})}function st({item:e,onDelete:t}){return(0,Y.jsxs)(`li`,{className:`mem-row`,children:[(0,Y.jsxs)(`div`,{className:`mem-row__main`,children:[(0,Y.jsx)(`p`,{className:`mem-row__text`,children:e.text}),(0,Y.jsxs)(`p`,{className:`mem-row__meta`,children:[(0,Y.jsx)(S,{icon:(0,Y.jsx)(C,{meta:k[e.kind]??k.note,size:14}),label:$[e.kind]??e.kind,className:`mem-row__kind`}),(0,Y.jsx)(`span`,{children:e.source===`agent`?`Learned by the dot`:`Added by you`}),(0,Y.jsx)(`time`,{dateTime:e.createdAt,children:ot(e.createdAt)})]})]}),(0,Y.jsx)(A,{variant:`ghost`,size:`sm`,icon:(0,Y.jsx)(D,{size:14}),onClick:t,"aria-label":`Delete memory: ${e.text.slice(0,60)}`,children:`Delete`})]})}function ct({test:e,items:t,onDelete:n}){let r=t.reduce((e,t)=>e.createdAt>t.createdAt?e:t);return(0,Y.jsxs)(`li`,{className:`mem-row`,children:[(0,Y.jsxs)(`div`,{className:`mem-row__main`,children:[(0,Y.jsx)(`p`,{className:`mem-row__title`,children:e.title}),e.suite.length?(0,Y.jsx)(`p`,{className:`mem-row__suite`,children:e.suite.join(` › `)}):null,(0,Y.jsxs)(`p`,{className:`mem-row__meta`,children:[(0,Y.jsx)(S,{icon:(0,Y.jsx)(C,{meta:k.flaky_spec,size:14}),label:$.flaky_spec,className:`mem-row__kind`}),(0,Y.jsx)(`code`,{className:`mem-row__file`,children:e.file}),[...e.projects].sort().map(e=>(0,Y.jsx)(S,{icon:(0,Y.jsx)(N,{project:e,size:14}),label:rt(e),className:`mem-row__project`},e)),e.tags.map(e=>(0,Y.jsx)(`span`,{className:`mem-row__chip`,children:e},e)),e.detail?(0,Y.jsx)(`span`,{children:e.detail}):null,(0,Y.jsxs)(`span`,{className:`mem-row__when`,children:[`Learned by the dot · `,(0,Y.jsx)(`time`,{dateTime:r.createdAt,children:ot(r.createdAt)})]})]})]}),(0,Y.jsx)(A,{variant:`ghost`,size:`sm`,icon:(0,Y.jsx)(D,{size:14}),onClick:n,"aria-label":`Delete flaky test: ${e.title.slice(0,60)}`,children:`Delete`})]})}function lt({dotId:e,dotName:t}){let n=j(),r=at(e),s=L(r,t=>_.listMemory(e,t)),[c,l]=(0,J.useState)(``),[d,f]=(0,J.useState)(`note`),[m,g]=(0,J.useState)(null),[v,y]=(0,J.useState)(!1),[b,x]=(0,J.useState)(null),[S,C]=(0,J.useState)(!1),w=async t=>{t.preventDefault();let n=c.trim();if(!n){g(`Write what the dot should remember.`);return}if(n.length>1e3){g(`Keep it under 1000 characters.`);return}g(null),y(!0);try{let t=await _.addMemory(e,n,d);z(r,e=>[t,...e??[]]),l(``)}catch(e){g(e instanceof Error?`Could not save: ${e.message}`:`Could not save. Try again.`)}finally{y(!1)}},T=async()=>{if(!b)return;C(!0);let e=new Set(b.map(e=>e.id));z(r,t=>(t??[]).filter(t=>!e.has(t.id)));let t=await Promise.allSettled([...e].map(e=>_.deleteMemory(e))),i=new Set([...e].filter((e,n)=>t[n].status===`rejected`));if(!i.size)x(null);else{let e=t.find(e=>e.status===`rejected`).reason,a=b.filter(e=>i.has(e.id));z(r,e=>[...a,...e??[]]),x(a),n.show({tone:`error`,title:`Could not delete that memory`,body:e instanceof Error?e.message:void 0})}C(!1)},E=s.data;return(0,Y.jsxs)(M,{title:`Memory`,description:`What ${t} keeps in mind on every check. Flaky tests are added on their own.`,flush:!0,children:[(0,Y.jsxs)(`form`,{className:`mem-add`,onSubmit:w,noValidate:!0,children:[(0,Y.jsx)(u,{label:`Kind`,className:`mem-add__kind`,children:(0,Y.jsx)(i,{value:d,onChange:e=>f(e.target.value),options:it})}),(0,Y.jsx)(u,{label:`Remember`,error:m,className:`mem-add__text`,children:(0,Y.jsx)(p,{value:c,onChange:e=>{l(e.target.value),m&&g(null)},placeholder:`Staging resets its data every night at 02:00 UTC`,autoComplete:`off`})}),(0,Y.jsx)(A,{type:`submit`,variant:`secondary`,loading:v,className:`mem-add__btn`,children:`Add`})]}),E?(0,Y.jsxs)(Y.Fragment,{children:[s.error?(0,Y.jsx)(o,{compact:!0,title:`Could not refresh memory. Showing the last list.`,error:s.error,onRetry:()=>void s.reload()}):null,E.length===0?(0,Y.jsx)(a,{kind:`first-run`,compact:!0,title:`Nothing remembered yet`,body:`Notes the dot should remember, such as 'staging resets at 02:00'. Flaky tests are added on their own.`}):(0,Y.jsx)(`ul`,{className:`mem-list list-box`,"aria-label":`Memory of ${t}`,children:nt(E).map(e=>e.kind===`flaky`?(0,Y.jsx)(ct,{test:e.test,items:e.items,onDelete:()=>x(e.items)},e.items[0].id):(0,Y.jsx)(st,{item:e.item,onDelete:()=>x([e.item])},e.item.id))})]}):s.loading?(0,Y.jsx)(h,{rows:3,label:`Loading memory`}):(0,Y.jsx)(o,{compact:!0,title:`Could not load memory`,error:s.error,onRetry:()=>void s.reload()}),(0,Y.jsx)(Be,{open:!!b,title:`Delete this memory?`,body:b?.length?`"${b[0].text.slice(0,140)}" The dot stops using it from the next check.`:``,confirmLabel:`Delete`,busy:S,onConfirm:()=>void T(),onCancel:()=>x(null)})]})}function ut(){return(0,Y.jsx)(`dl`,{className:`rules-legend`,children:me.map(e=>(0,Y.jsxs)(`div`,{className:`rules-legend__item`,children:[(0,Y.jsx)(`dt`,{className:`rule-chip rule-chip--${e}`,children:H[e]}),(0,Y.jsx)(`dd`,{children:ge[e]})]},e))})}function dt({kind:e,value:t,onChange:n,saving:r,readOnly:i}){let a=(0,J.useId)(),o=`${a}-help`,s=_e[e],c=t!==s;return(0,Y.jsxs)(`fieldset`,{className:`rule-row`,"aria-describedby":o,"data-kind":e,children:[(0,Y.jsx)(`legend`,{className:`sr-only`,children:U[e]}),(0,Y.jsx)(`div`,{className:`rule-row__label`,"aria-hidden":`true`,children:(0,Y.jsx)(`span`,{className:`rule-row__title`,children:U[e]})}),(0,Y.jsxs)(`p`,{id:o,className:`rule-row__help`,children:[pe[e],c&&(0,Y.jsxs)(`span`,{className:`rule-row__default`,children:[` Default is `,H[s],`.`]}),r&&(0,Y.jsxs)(`span`,{className:`rule-row__saving`,role:`status`,children:[` `,`Saving`]})]}),(0,Y.jsx)(`div`,{className:`rule-seg`,children:me.map(r=>(0,Y.jsxs)(`label`,{className:`rule-seg__opt${t===r?` is-selected`:``}${i?` is-readonly`:``}`,title:ge[r],children:[(0,Y.jsx)(`input`,{type:`radio`,name:a,value:r,checked:t===r,disabled:i,onChange:()=>{!i&&r!==t&&n(e,r)}}),(0,Y.jsx)(`span`,{className:`rule-seg__text`,children:H[r]})]},r))}),c&&!i&&(0,Y.jsxs)(`button`,{type:`button`,className:`rule-row__reset link-btn`,onClick:()=>n(e,s),children:[`Reset to `,H[s]]})]})}function ft({rules:e,onChange:t,saving:n,readOnly:r}){return(0,Y.jsxs)(`div`,{className:`rules`,children:[(0,Y.jsx)(ut,{}),(0,Y.jsx)(`div`,{className:`rules__rows`,role:`group`,"aria-label":`Rules per action`,children:ve.map(i=>(0,Y.jsx)(dt,{kind:i,value:ye(e,i),onChange:t,saving:!!n?.has(i),readOnly:r},i))})]})}function pt({dot:e,busy:t,onEnd:n}){let r=Re(e);return r?(0,Y.jsxs)(`div`,{className:`shadow-note`,role:`status`,"data-shadow-week":!0,children:[(0,Y.jsxs)(`div`,{className:`shadow-note__text`,children:[(0,Y.jsx)(`p`,{className:`shadow-note__title`,children:Le(r)}),(0,Y.jsx)(`p`,{className:`shadow-note__body`,children:Ie(r)})]}),(0,Y.jsx)(A,{size:`sm`,onClick:n,loading:t,children:`End the first week`})]}):null}function mt(){let n=j(),{state:r}=se(),i=t()||r===`unauthorized`,[a,o]=(0,J.useState)(()=>!!O()),[s,c]=(0,J.useState)(``);return e()&&!i?null:(0,Y.jsx)(M,{title:`Access token`,description:`Needed when the server sets LOCALDOST_TOKEN. Stored only in this browser.`,children:(0,Y.jsxs)(`form`,{className:`token`,onSubmit:e=>{e.preventDefault(),s.trim()&&(d(s),c(``),o(!0),oe.restart(),R(``),n.show({tone:`success`,title:`Token saved for this browser`}))},noValidate:!0,children:[(0,Y.jsxs)(`p`,{className:`token__state`,children:[a?(0,Y.jsx)(E,{tone:`ok`,children:`Token saved`}):(0,Y.jsx)(E,{children:`No token saved`}),r===`unauthorized`&&(0,Y.jsx)(`span`,{className:`token__warn`,children:`The server rejected the current token.`})]}),(0,Y.jsx)(u,{label:a?`Replace token`:`Token`,hint:`Paste the value of LOCALDOST_TOKEN from the server.`,children:(0,Y.jsx)(p,{type:`password`,value:s,onChange:e=>c(e.target.value),autoComplete:`off`,spellCheck:!1})}),(0,Y.jsxs)(`div`,{className:`token__actions`,children:[(0,Y.jsx)(A,{type:`submit`,variant:`primary`,disabled:!s.trim(),children:`Save token`}),a&&(0,Y.jsx)(A,{variant:`ghost`,onClick:()=>{d(``),o(!1),oe.restart(),R(``),n.show({title:`Token removed from this browser`})},children:`Remove token`})]})]})})}var ht=`settingsDot`;function gt(){let e=j();return(0,Y.jsx)(M,{title:`Model`,description:`Verdicts, reviews, and chat replies use the model marked In use.`,children:(0,Y.jsx)(Me,{paidFallback:!0,onSwitched:(t,n)=>{R(B.setup),e.show({title:n,tone:`success`})}})})}function _t({onInvite:e}){let{isAdmin:t}=V(),n=L(t?W:null,e=>G.state(e));if(!t||n.error instanceof r&&n.error.status===403)return null;let i=n.data?.devices.filter(e=>e.viaInvite).length??0;return(0,Y.jsx)(M,{title:`Invite a teammate`,description:`Make an invite code with an expiry. A teammate joins from the server link, with no admin token.`,children:(0,Y.jsxs)(`div`,{className:`invite-card`,children:[(0,Y.jsxs)(`p`,{className:`invite-card__meta num`,children:[i===0?`Nobody has joined by invite yet.`:`${i} ${i===1?`teammate`:`teammates`} joined by invite.`,` `,(0,Y.jsx)(`a`,{href:`#/setup`,children:`Devices in Setup`})]}),(0,Y.jsx)(A,{variant:`primary`,icon:(0,Y.jsx)(c,{size:14}),onClick:e,children:`Invite a teammate`})]})})}function vt({dot:e}){let t=j(),{isAdmin:n,canEdit:r}=V(),[i,a]=(0,J.useState)(new Set),[o,s]=(0,J.useState)(!1),[c,u]=(0,J.useState)(!1),[d,f]=(0,J.useState)(!1),p=t=>z(B.dots,n=>(n??[]).map(n=>n.id===e.id?{...n,...t}:n)),m=async(n,r)=>{let i=p({rules:{...e.rules,[n]:r}});a(e=>new Set(e).add(n));try{let t=await _.setRule(e.id,n,r);p({rules:t.rules})}catch(e){z(B.dots,i),t.show({tone:`error`,title:`Could not change "${U[n]}" to ${H[r]}`,body:e instanceof Error?e.message:void 0,action:{label:`Try again`,onClick:()=>void m(n,r)}})}finally{a(e=>{let t=new Set(e);return t.delete(n),t})}},h=async()=>{f(!0);try{let n=await _.updateDot(e.id,{shadowWeekDays:0});p({rules:n.rules,shadowWeek:n.shadowWeek??null}),t.show({title:`First week ended. PR comments and checks follow your rules again.`,tone:`success`})}catch(e){t.show({tone:`error`,title:`Could not end the first week`,body:e instanceof Error?e.message:void 0})}finally{f(!1)}},g=async n=>{let r=p({paused:n});s(!0);try{await _.updateDot(e.id,{paused:n})}catch(i){z(B.dots,r),t.show({tone:`error`,title:`Could not ${n?`pause`:`resume`} ${e.name}`,body:i instanceof Error?i.message:void 0})}finally{s(!1)}};return(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsx)(M,{title:`Watching`,description:`Pause stops checks, site checks and digests. Items already waiting stay in the Inbox.`,children:(0,Y.jsx)(l,{checked:!e.paused,onChange:e=>void g(!e),label:e.paused?`${e.name} is paused`:`${e.name} is watching`,description:o?`Saving`:e.paused?`Turn on to resume.`:`Turn off to pause.`})}),r?(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsxs)(M,{title:`Rules`,description:`What the dot may do on its own. Changes save right away and apply to the next action.`,children:[(0,Y.jsx)(pt,{dot:e,busy:d,onEnd:()=>void h()}),(0,Y.jsx)(ft,{rules:e.rules,onChange:(e,t)=>void m(e,t),saving:i})]}),(0,Y.jsx)(lt,{dotId:e.id,dotName:e.name}),n?(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsx)(M,{title:`Remove dot`,description:`Archive keeps the history and stops the dot. Delete permanently removes it and everything it holds.`,children:(0,Y.jsxs)(`div`,{className:`rm-row`,children:[(0,Y.jsxs)(`p`,{className:`rm-row__text`,children:[`Removing `,e.name,` drops what waits in the Inbox.`]}),(0,Y.jsx)(A,{variant:`danger`,icon:(0,Y.jsx)(D,{size:14}),onClick:()=>u(!0),children:`Remove dot`})]})}),(0,Y.jsx)(Fe,{open:c,dot:e,onClose:()=>u(!1)})]}):(0,Y.jsx)(`p`,{className:`settings__note`,"data-testid":`admin-note`,children:`Removing and restoring a dot need the admin token.`})]}):(0,Y.jsx)(`p`,{className:`settings__note`,"data-testid":`members-note`,children:`Rules and memory are for editors. Ask your localdost admin to make you one.`})]})}function yt(){let e=ce(),{isAdmin:t,canEdit:r}=V(),s=le(),[l,d]=(0,J.useState)(()=>I(ht,``)),[p,m]=(0,J.useState)({open:!1}),[_,y]=(0,J.useState)(!1),b=ie(),x=b.name===`settings`&&!!b.invite,S=_||x,C=()=>{y(!1),x&&ae(`#/settings`,{replace:!0})},T=(e.data??[]).filter(e=>!e.archived),E=T.find(e=>e.id===l)??T[0],D=e=>{d(e),F(ht,e)};return(0,Y.jsxs)(`div`,{className:`page settings qd-touch`,children:[(0,Y.jsx)(`header`,{className:`page__header`,children:(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`h1`,{className:`page__title`,children:`Settings`}),(0,Y.jsx)(`p`,{className:`page__subtitle`,children:t?`Per-dot rules and memory, connections, and this device.`:r?`Per-dot rules and memory, and this device.`:`Pause a dot, choose your updates, and see this device.`})]})}),(0,Y.jsxs)(`section`,{className:`settings__group`,"aria-labelledby":`settings-dot-title`,children:[(0,Y.jsx)(`h2`,{id:`settings-dot-title`,className:`settings__group-title`,children:`Dot`}),e.data?T.length===0?(0,Y.jsx)(a,{kind:`first-run`,title:`No dots yet`,body:t?`A dot watches a repo, a tracker, and production URLs. Create one to set its rules and memory.`:`A dot watches a repo, a tracker, and production URLs. Ask your localdost admin to create one.`,action:t?(0,Y.jsx)(A,{variant:`primary`,icon:(0,Y.jsx)(c,{size:14}),onClick:()=>m({open:!0}),children:`New dot`}):void 0}):(0,Y.jsxs)(Y.Fragment,{children:[e.error?(0,Y.jsx)(o,{compact:!0,title:`Could not refresh dots. Showing the last list.`,error:e.error,onRetry:()=>void e.reload()}):null,(0,Y.jsxs)(`div`,{className:`dot-pick`,children:[E&&(0,Y.jsx)(re,{name:g(E),state:n(E.status),size:40,decorative:!0}),(0,Y.jsx)(u,{label:`Settings for`,className:`dot-pick__field`,children:(0,Y.jsx)(i,{value:E?.id??``,onChange:e=>D(e.target.value),options:T.map(e=>({value:e.id,label:e.paused?`${e.name} (paused)`:e.name}))})}),(0,Y.jsxs)(`div`,{className:`dot-pick__actions`,children:[E&&r&&!v(e.error)&&(0,Y.jsx)(A,{variant:`secondary`,icon:(0,Y.jsx)(te,{size:14}),onClick:()=>m({open:!0,dot:E}),children:`Edit dot`}),t&&!v(e.error)&&(0,Y.jsx)(A,{variant:`ghost`,icon:(0,Y.jsx)(c,{size:14}),onClick:()=>m({open:!0}),children:`New dot`})]})]}),E&&(0,Y.jsx)(vt,{dot:E},E.id)]}):e.loading?(0,Y.jsx)(h,{rows:4,label:`Loading dots`}):(0,Y.jsx)(o,{title:`Could not load dots`,error:e.error,onRetry:()=>void e.reload()})]}),t&&(0,Y.jsxs)(`section`,{className:`settings__group`,"aria-labelledby":`settings-archived-title`,children:[(0,Y.jsx)(`h2`,{id:`settings-archived-title`,className:`settings__group-title`,children:`Archived dots`}),(0,Y.jsx)(Je,{})]}),(0,Y.jsxs)(`section`,{className:`settings__group`,"aria-labelledby":`settings-workspace-title`,children:[(0,Y.jsx)(`h2`,{id:`settings-workspace-title`,className:`settings__group-title`,children:`Workspace`}),t&&(0,Y.jsx)(gt,{}),(0,Y.jsx)(Ae,{}),(0,Y.jsx)(_t,{onInvite:()=>y(!0)}),(0,Y.jsx)(Xe,{}),t&&(0,Y.jsx)(Ne,{dot:E}),t&&s.data?.demo&&(0,Y.jsx)(Ye,{dotId:E?.id,dotName:E?.name}),t&&(0,Y.jsxs)(`a`,{className:`settings__link-row`,href:`#/setup`,children:[(0,Y.jsxs)(`span`,{children:[(0,Y.jsx)(`span`,{className:`settings__link-title`,children:`Setup`}),(0,Y.jsx)(`span`,{className:`settings__link-help`,children:`Which services are ready, in demo mode, or missing a key.`})]}),(0,Y.jsx)(w,{size:16})]})]}),(0,Y.jsxs)(`section`,{className:`settings__group`,"aria-labelledby":`settings-device-title`,children:[(0,Y.jsx)(`h2`,{id:`settings-device-title`,className:`settings__group-title`,children:`This device`}),(0,Y.jsx)($e,{}),(0,Y.jsx)(He,{}),(0,Y.jsx)(M,{title:`Theme`,description:`Saved in this browser.`,children:(0,Y.jsx)(f,{})}),(0,Y.jsx)(mt,{})]}),(0,Y.jsxs)(`section`,{className:`settings__group`,"aria-labelledby":`settings-about-title`,children:[(0,Y.jsx)(`h2`,{id:`settings-about-title`,className:`settings__group-title`,children:`About`}),(0,Y.jsx)(qe,{})]}),(0,Y.jsx)(Ge,{open:S,onClose:C}),(0,Y.jsx)(Pe,{open:p.open&&!!p.dot,dot:p.dot,onClose:()=>m({open:!1})}),(0,Y.jsx)(Ve,{open:p.open&&!p.dot,onClose:()=>m({open:!1}),onSaved:e=>D(e.id)})]})}function bt(){return(0,Y.jsx)(yt,{})}export{bt as default};
|
|
2
|
+
//# sourceMappingURL=Settings-fs-QJwNM.js.map
|