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,326 @@
|
|
|
1
|
+
// The Tests repo of a dot (docs/MULTI-REPO.md section 3, KAT-86): which ref of it runs against an app change, its checkout, and the
|
|
2
|
+
// runner settings a run of it uses.
|
|
3
|
+
//
|
|
4
|
+
// The ref is chosen by the first rule that applies:
|
|
5
|
+
// 1. the PR description holds a line `localdost-tests-ref: <branch>` and the Tests repo has that branch (a PR run of a repo's own PR
|
|
6
|
+
// only: the description of a fork PR is written by someone outside the team, so it never picks code);
|
|
7
|
+
// 2. the repo's ref is `match_branch` and the Tests repo has a branch named like the app PR's branch (same exception for forks);
|
|
8
|
+
// 3. the repo's ref is `{ fixed }`: that branch or tag;
|
|
9
|
+
// 4. the default branch of the Tests repo.
|
|
10
|
+
// A merge run uses rules 3 and 4: the branch of a merged PR is a branch of the past.
|
|
11
|
+
//
|
|
12
|
+
// The checkout goes through a cache in the data folder, <data>/test-repos/<owner>__<name>: a git folder with no files of its own that
|
|
13
|
+
// holds the objects of every commit fetched so far. A run fetches its commit by sha (GitHub confirmed the sha, never the event), adds a
|
|
14
|
+
// worktree of it under <data>/worktrees, and checks that the worktree is on that sha before anything runs. The worktree is removed
|
|
15
|
+
// when the run ends and swept at boot with the app worktrees (src/runner/worktree.ts).
|
|
16
|
+
import { existsSync, mkdirSync } from 'node:fs';
|
|
17
|
+
import path from 'node:path';
|
|
18
|
+
import { config, log } from '../config.js';
|
|
19
|
+
import { redact } from '../agent/redact.js';
|
|
20
|
+
import { GitTimeoutError, GithubUnreachableError } from '../integrations/github.js';
|
|
21
|
+
import { isSafeBranchName } from './command.js';
|
|
22
|
+
import { hasAdapter } from './adapters/index.js';
|
|
23
|
+
import { TMP_REF_PREFIX, gitIn, holdWorktree, realish, refId, releaseWorktree, removeOwnWorktree, safeId, scrubReason, worktreesDir, } from './worktree.js';
|
|
24
|
+
/** A TestRefSource over the GitHub client of the Tests repo, or null when that client cannot read refs (no GitHub connection). */
|
|
25
|
+
export function refSourceOf(gh) {
|
|
26
|
+
const refSha = gh.refSha;
|
|
27
|
+
if (!refSha)
|
|
28
|
+
return null;
|
|
29
|
+
return { refSha: (kind, name) => refSha.call(gh, kind, name), defaultBranch: () => gh.defaultBranchName() };
|
|
30
|
+
}
|
|
31
|
+
const DIRECTIVE = /^[ \t]*localdost-tests-ref[ \t]*:[ \t]*(.*?)[ \t]*$/im;
|
|
32
|
+
/**
|
|
33
|
+
* The branch a PR description names with a line `localdost-tests-ref: <branch>` (the first such line; backticks and quotes around the
|
|
34
|
+
* name are dropped). `invalid` holds the text of a line whose value is no plain branch name, so the caller can say it was ignored.
|
|
35
|
+
*/
|
|
36
|
+
export function testsRefDirective(body) {
|
|
37
|
+
const m = DIRECTIVE.exec(body ?? '');
|
|
38
|
+
if (!m)
|
|
39
|
+
return {};
|
|
40
|
+
const value = m[1].replace(/^[`'"]+|[`'"]+$/g, '').trim();
|
|
41
|
+
if (!value)
|
|
42
|
+
return {};
|
|
43
|
+
return isSafeBranchName(value) ? { branch: value } : { invalid: value.slice(0, 60) };
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* A sentence for a read of the Tests repo that failed. The Tests repo often sits under another owner than the app repos (the App may
|
|
47
|
+
* be installed on one and not the other), so the sentence names the owner and says what to do. The text of a transport error is cut.
|
|
48
|
+
*/
|
|
49
|
+
export function unreadableTestRepoReason(err, repo) {
|
|
50
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
51
|
+
const status = typeof err?.status === 'number' ? err.status : undefined;
|
|
52
|
+
const fromText = /\bHTTP (\d{3})\b/.exec(message)?.[1];
|
|
53
|
+
const code = status ?? (fromText ? Number(fromText) : undefined);
|
|
54
|
+
const where = repo ? `${repo.owner}/${repo.name}` : 'the Tests repo';
|
|
55
|
+
const head = 'The Tests repo could not be read: ';
|
|
56
|
+
if (/not installed/i.test(message))
|
|
57
|
+
return `${head}the GitHub App is not installed on ${repo ? repo.owner : 'the owner of the Tests repo'}. Install it there or use a token with access.`;
|
|
58
|
+
// A 403 that GitHub sends for a spent rate limit or a secondary limit is no refusal: the credentials are fine and the next read works.
|
|
59
|
+
// GithubUnreachableError carries a 403 only for that case (isOutageStatus), and an HTTP error carries it with a Retry-After header or the words.
|
|
60
|
+
const retryAfter = err?.retryAfter;
|
|
61
|
+
if (code === 429 || (code === 403 && (err instanceof GithubUnreachableError || !!retryAfter || /rate limit|abuse|secondary|throttl/i.test(message))))
|
|
62
|
+
return `${head}GitHub is throttling requests for ${where} (HTTP ${code}). Access is fine; localdost retries on the next run.`;
|
|
63
|
+
if (code === 401)
|
|
64
|
+
return `${head}GitHub refused the credentials of the dot (HTTP 401). Check the GitHub token or App key, and that it can read ${where}.`;
|
|
65
|
+
if (code === 403)
|
|
66
|
+
return `${head}GitHub denied access to ${where} (HTTP 403). Give the GitHub App or token read access to it.`;
|
|
67
|
+
if (err instanceof GithubUnreachableError || (code !== undefined && code >= 500))
|
|
68
|
+
return `${head}GitHub did not answer (${redact(message).replace(/\s+/g, ' ').slice(0, 120)}). localdost could not tell which commit of the Tests repo to run.`;
|
|
69
|
+
return `${head}${redact(message).replace(/\s+/g, ' ').slice(0, 160)}. Check that the GitHub connection can read ${where}.`;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* The ref of the Tests repo a run uses, by the rules at the top of this file. Never throws: a ref that does not exist, and any read of
|
|
73
|
+
* the Tests repo that fails (the App is not installed on its owner, 401, 403, 5xx, no network), come back as a sentence, so the app
|
|
74
|
+
* repo's review and tests go on and the Tests repo shows as not run.
|
|
75
|
+
*/
|
|
76
|
+
export async function resolveTestRef(o) {
|
|
77
|
+
try {
|
|
78
|
+
return await pickTestRef(o);
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
return { ok: false, reason: unreadableTestRepoReason(err, o.repo) };
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
async function pickTestRef(o) {
|
|
85
|
+
const { source } = o;
|
|
86
|
+
const own = o.task === 'pr_check' && !o.fork;
|
|
87
|
+
let note;
|
|
88
|
+
const found = (ref, rule, sha) => ({
|
|
89
|
+
ok: true,
|
|
90
|
+
ref: { ref, rule, sha, ...(note ? { note } : {}) },
|
|
91
|
+
});
|
|
92
|
+
if (own) {
|
|
93
|
+
const asked = testsRefDirective(o.prBody);
|
|
94
|
+
if (asked.invalid)
|
|
95
|
+
note = `The line "localdost-tests-ref: ${asked.invalid}" in the PR description is not a branch name, so it was ignored.`;
|
|
96
|
+
if (asked.branch) {
|
|
97
|
+
const sha = await source.refSha('branch', asked.branch);
|
|
98
|
+
if (sha)
|
|
99
|
+
return found(asked.branch, 'directive', sha);
|
|
100
|
+
note = `The PR description asks for the branch ${asked.branch} of the Tests repo, which has no such branch, so another ref stands in.`;
|
|
101
|
+
}
|
|
102
|
+
if (o.config?.ref === 'match_branch' && o.prHeadRef && isSafeBranchName(o.prHeadRef)) {
|
|
103
|
+
const sha = await source.refSha('branch', o.prHeadRef);
|
|
104
|
+
if (sha)
|
|
105
|
+
return found(o.prHeadRef, 'match_branch', sha);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
const want = o.config?.ref;
|
|
109
|
+
if (want && typeof want === 'object' && typeof want.fixed === 'string') {
|
|
110
|
+
const name = want.fixed.trim();
|
|
111
|
+
if (!isSafeBranchName(name))
|
|
112
|
+
return { ok: false, reason: `The fixed ref "${name.slice(0, 60)}" of the Tests repo is not a branch or tag name.` };
|
|
113
|
+
const sha = (await source.refSha('branch', name)) ?? (await source.refSha('tag', name));
|
|
114
|
+
if (!sha)
|
|
115
|
+
return { ok: false, reason: `The Tests repo has no branch or tag ${name}, which the dot's settings name as its fixed ref.` };
|
|
116
|
+
return found(name, 'fixed', sha);
|
|
117
|
+
}
|
|
118
|
+
let branch = o.defaultBranch;
|
|
119
|
+
try {
|
|
120
|
+
branch = (await source.defaultBranch()) || branch;
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
/* the configured default stands in; reading the ref below fails the same way when GitHub is out of reach */
|
|
124
|
+
}
|
|
125
|
+
if (!isSafeBranchName(branch))
|
|
126
|
+
return { ok: false, reason: 'The default branch of the Tests repo is not a safe branch name.' };
|
|
127
|
+
const sha = await source.refSha('branch', branch);
|
|
128
|
+
if (!sha)
|
|
129
|
+
return { ok: false, reason: `The Tests repo has no branch ${branch}.` };
|
|
130
|
+
return found(branch, 'default', sha);
|
|
131
|
+
}
|
|
132
|
+
// ---------- the settings a run of a Tests repo uses ----------
|
|
133
|
+
/**
|
|
134
|
+
* The runner settings of a run. An app repo run uses the dot's own. A Tests repo run keeps the dot's mode, image and video, and takes the
|
|
135
|
+
* rest from the Tests repo: its command, its setup (the app repo's build steps never run for it), its folder, and its test login (its own
|
|
136
|
+
* list, else the dot's). No working folder is used and no file is copied: the checkout is the one made for the commit.
|
|
137
|
+
*/
|
|
138
|
+
export function effectiveRunner(spec) {
|
|
139
|
+
const base = spec.watch.runner;
|
|
140
|
+
const tr = spec.testRepo;
|
|
141
|
+
if (!tr)
|
|
142
|
+
return base;
|
|
143
|
+
const { workdir: _workdir, setup: _setup, command: _command, workingDirectory: _dir, copyFiles: _copy, passEnv: _pass, trustForks: _trust, ...keep } = base;
|
|
144
|
+
const c = tr.config;
|
|
145
|
+
// A fork PR's page is controlled by the fork author: no variable of this machine goes with the run, whatever the settings name.
|
|
146
|
+
const login = tr.fork ? [] : testLoginNames(tr, base.passEnv);
|
|
147
|
+
return {
|
|
148
|
+
...keep,
|
|
149
|
+
...(c.command?.trim() ? { command: c.command.trim() } : {}),
|
|
150
|
+
...(c.setup?.trim() ? { setup: c.setup } : {}),
|
|
151
|
+
...(c.dir?.trim() ? { workingDirectory: c.dir.trim() } : {}),
|
|
152
|
+
...(login.length ? { passEnv: login } : {}),
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
/** The names of the test login a Tests repo run would get: its own list, else the dot's. */
|
|
156
|
+
export function testLoginNames(tr, dotPassEnv) {
|
|
157
|
+
return [...(tr.config.passEnv?.length ? tr.config.passEnv : (dotPassEnv ?? []))];
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Why a Tests repo run must not start, or null. A framework with no adapter, and the fork rule: a fork never gets the host
|
|
161
|
+
* environment. Outside Docker the run never starts for a fork. In Docker it starts only when no test login would cross into the
|
|
162
|
+
* container, because the page under test is the fork's preview and its author controls it; a run with a login missing would fail
|
|
163
|
+
* on the login and read as a product failure, so it is refused with a sentence instead.
|
|
164
|
+
*/
|
|
165
|
+
export function testRepoRefusal(tr, mode, dotPassEnv) {
|
|
166
|
+
if (!hasAdapter(tr.config.framework))
|
|
167
|
+
return `The Tests repo uses ${tr.config.framework}, which localdost cannot run yet. Only Playwright suites run today.`;
|
|
168
|
+
if (!tr.fork)
|
|
169
|
+
return null;
|
|
170
|
+
if (mode !== 'docker')
|
|
171
|
+
return 'The Tests repo did not run: the pull request comes from a fork, and a Tests repo runs for a fork only in Docker mode, where no variable of this machine crosses over. No test count is shown.';
|
|
172
|
+
if (testLoginNames(tr, dotPassEnv).length)
|
|
173
|
+
return 'The Tests repo did not run: the pull request comes from a fork, and the Tests repo signs in with a test login. localdost never hands a test login to a page that a fork author controls. No test count is shown.';
|
|
174
|
+
return null;
|
|
175
|
+
}
|
|
176
|
+
// ---------- the checkout ----------
|
|
177
|
+
const FULL_SHA = /^(?:[0-9a-f]{40}|[0-9a-f]{64})$/;
|
|
178
|
+
// Git allows one shallow fetch at a time into a repo (.git/shallow.lock), and two runs of one Tests repo share one cache folder: two PR
|
|
179
|
+
// checks, a PR check and a merge, or two dots on one Tests repo. Every git command that writes to a cache runs behind a per-cache
|
|
180
|
+
// queue in this process, so the second run waits for the first instead of failing on the lock.
|
|
181
|
+
const cacheQueues = new Map();
|
|
182
|
+
/** Runs `fn` after every earlier call for the same cache folder has finished, whether it succeeded or not. */
|
|
183
|
+
export function withCacheLock(cache, fn) {
|
|
184
|
+
const before = cacheQueues.get(cache) ?? Promise.resolve();
|
|
185
|
+
const result = before.then(fn, fn);
|
|
186
|
+
const tail = result.catch(() => undefined);
|
|
187
|
+
cacheQueues.set(cache, tail);
|
|
188
|
+
void tail.then(() => {
|
|
189
|
+
if (cacheQueues.get(cache) === tail)
|
|
190
|
+
cacheQueues.delete(cache);
|
|
191
|
+
});
|
|
192
|
+
return result;
|
|
193
|
+
}
|
|
194
|
+
/** How long one fetch of a Tests repo commit may take before it is stopped and its run is marked not run. */
|
|
195
|
+
export const TEST_REPO_FETCH_TIMEOUT_SEC = 180;
|
|
196
|
+
/** Time the fetch gets to stop by itself after its limit, before the run stops waiting for it and lets the cache go. */
|
|
197
|
+
const FETCH_STOP_GRACE_MS = 5000;
|
|
198
|
+
/** The limit of one fetch in ms: LOCALDOST_TEST_REPO_FETCH_TIMEOUT_SEC when it is a number above 0, else 180 s. */
|
|
199
|
+
export function testRepoFetchTimeoutMs() {
|
|
200
|
+
const n = Number(process.env.LOCALDOST_TEST_REPO_FETCH_TIMEOUT_SEC);
|
|
201
|
+
return (Number.isFinite(n) && n > 0 ? n : TEST_REPO_FETCH_TIMEOUT_SEC) * 1000;
|
|
202
|
+
}
|
|
203
|
+
class FetchTimeout extends Error {
|
|
204
|
+
}
|
|
205
|
+
/** Settles with `p`, or rejects with FetchTimeout after `ms`. A late failure of `p` is dropped. */
|
|
206
|
+
function withTimeout(p, ms) {
|
|
207
|
+
return new Promise((resolve, reject) => {
|
|
208
|
+
const timer = setTimeout(() => reject(new FetchTimeout()), ms);
|
|
209
|
+
p.then((v) => {
|
|
210
|
+
clearTimeout(timer);
|
|
211
|
+
resolve(v);
|
|
212
|
+
}, (e) => {
|
|
213
|
+
clearTimeout(timer);
|
|
214
|
+
reject(e);
|
|
215
|
+
});
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
const sayLimit = (ms) => {
|
|
219
|
+
const s = Math.max(1, Math.round(ms / 1000));
|
|
220
|
+
return s >= 60 && s % 60 === 0 ? `${s / 60} min` : `${s} s`;
|
|
221
|
+
};
|
|
222
|
+
/** The cache folder of a Tests repo: <data>/test-repos/<owner>__<name>, lower case. */
|
|
223
|
+
export function testRepoCacheDir(repo, dataDir = config.dataDir) {
|
|
224
|
+
return path.join(realish(dataDir), 'test-repos', safeId(`${repo.owner}__${repo.name}`.toLowerCase()));
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Makes a worktree of the Tests repo at `sha` and checks that it is on that commit. The commit comes from GitHub (resolveTestRef),
|
|
228
|
+
* never from an event. A failure is a plain sentence and leaves no worktree and no private ref behind.
|
|
229
|
+
*/
|
|
230
|
+
export async function checkoutTestRepo(o) {
|
|
231
|
+
const name = `${o.repo.owner}/${o.repo.name}`;
|
|
232
|
+
const sha = o.sha.trim().toLowerCase();
|
|
233
|
+
const short = sha.slice(0, 7);
|
|
234
|
+
const fail = (why) => ({
|
|
235
|
+
ok: false,
|
|
236
|
+
reason: scrubReason(`The tests of ${name} did not run for ${short}: ${why} No test count is shown for it.`),
|
|
237
|
+
});
|
|
238
|
+
if (!FULL_SHA.test(sha))
|
|
239
|
+
return fail('the commit is not given in full.');
|
|
240
|
+
const gh = o.gh;
|
|
241
|
+
const fetchCommit = gh.fetchCommit;
|
|
242
|
+
if (!fetchCommit)
|
|
243
|
+
return fail('GitHub is not connected, so the commit could not be fetched.');
|
|
244
|
+
const gone = () => o.cancelled?.() === true;
|
|
245
|
+
const run = (cwd, args, timeoutMs) => gone() ? Promise.resolve({ code: null, signal: null, stdout: '', stderr: '', timedOut: false }) : gitIn(cwd, args, timeoutMs, o.runId);
|
|
246
|
+
const cache = testRepoCacheDir(o.repo, o.dataDir);
|
|
247
|
+
const parent = worktreesDir(o.dataDir);
|
|
248
|
+
const root = path.join(parent, safeId(o.id));
|
|
249
|
+
const tmpRef = `${TMP_REF_PREFIX}${refId(o.id)}`;
|
|
250
|
+
let added = false;
|
|
251
|
+
let cleaned = false;
|
|
252
|
+
let limit = 0;
|
|
253
|
+
// The steps of a cleanup, for a caller that already holds the cache lock.
|
|
254
|
+
const cleanupHeld = async () => {
|
|
255
|
+
if (cleaned)
|
|
256
|
+
return;
|
|
257
|
+
cleaned = true;
|
|
258
|
+
if (added)
|
|
259
|
+
await gitIn(cache, ['worktree', 'remove', '--force', root], 30_000, o.runId).catch(() => undefined);
|
|
260
|
+
removeOwnWorktree(cache, root);
|
|
261
|
+
await gitIn(cache, ['update-ref', '-d', tmpRef], 30_000, o.runId).catch(() => undefined);
|
|
262
|
+
releaseWorktree(root);
|
|
263
|
+
};
|
|
264
|
+
const cleanup = () => withCacheLock(cache, cleanupHeld);
|
|
265
|
+
const make = async () => {
|
|
266
|
+
try {
|
|
267
|
+
mkdirSync(cache, { recursive: true });
|
|
268
|
+
// A git folder with no files of its own: it keeps objects, and every checkout is a worktree of it.
|
|
269
|
+
if (!existsSync(path.join(cache, '.git'))) {
|
|
270
|
+
const init = await run(cache, ['init', '-q']);
|
|
271
|
+
if (init.code !== 0)
|
|
272
|
+
return fail(gone() ? 'the run was cancelled.' : 'the cache folder for the Tests repo could not be made.');
|
|
273
|
+
}
|
|
274
|
+
// A run that was cancelled while it waited for the cache lock, or while the cache was made, starts no network fetch.
|
|
275
|
+
if (gone()) {
|
|
276
|
+
await cleanupHeld();
|
|
277
|
+
return fail('the run was cancelled.');
|
|
278
|
+
}
|
|
279
|
+
// The cache lock is held through this fetch, so a fetch that never ends would block every run of the same Tests repo.
|
|
280
|
+
limit = o.fetchTimeoutMs ?? testRepoFetchTimeoutMs();
|
|
281
|
+
await withTimeout(fetchCommit.call(gh, cache, sha, tmpRef, limit), limit + (o.fetchGraceMs ?? FETCH_STOP_GRACE_MS));
|
|
282
|
+
if (gone()) {
|
|
283
|
+
await cleanupHeld();
|
|
284
|
+
return fail('the run was cancelled.');
|
|
285
|
+
}
|
|
286
|
+
const have = await run(cache, ['rev-parse', '--verify', '--quiet', `${sha}^{commit}`], 10_000);
|
|
287
|
+
if (have.code !== 0)
|
|
288
|
+
return fail('GitHub did not give that commit.');
|
|
289
|
+
mkdirSync(parent, { recursive: true });
|
|
290
|
+
// Entries of worktrees that were removed by hand or by a crash are dropped, and an entry at this very path is ours.
|
|
291
|
+
await run(cache, ['worktree', 'prune'], 30_000);
|
|
292
|
+
removeOwnWorktree(cache, root);
|
|
293
|
+
holdWorktree(root, cache);
|
|
294
|
+
added = true;
|
|
295
|
+
// Hooks of the repo (post-checkout) do not run for a checkout localdost makes.
|
|
296
|
+
const add = await run(cache, ['-c', 'core.hooksPath=/dev/null', 'worktree', 'add', '--detach', '--quiet', root, sha], 120_000);
|
|
297
|
+
if (add.code !== 0) {
|
|
298
|
+
if (!gone())
|
|
299
|
+
log.warn(`test repo: git worktree add failed: ${redact(add.stderr.trim().split('\n').pop() ?? '')}`);
|
|
300
|
+
await cleanupHeld();
|
|
301
|
+
return fail(gone() ? 'the run was cancelled.' : add.timedOut ? 'creating the worktree timed out.' : 'a worktree could not be made.');
|
|
302
|
+
}
|
|
303
|
+
// The count is shown only when the checkout is on the commit that was resolved.
|
|
304
|
+
const head = await run(root, ['rev-parse', 'HEAD'], 10_000);
|
|
305
|
+
const at = head.code === 0 ? head.stdout.trim().toLowerCase() : '';
|
|
306
|
+
if (at !== sha) {
|
|
307
|
+
await cleanupHeld();
|
|
308
|
+
return fail(`the checkout is on ${at ? at.slice(0, 7) : 'no commit'}, not on ${short}.`);
|
|
309
|
+
}
|
|
310
|
+
return { ok: true, worktree: { dir: root, root, sha, cleanup } };
|
|
311
|
+
}
|
|
312
|
+
catch (err) {
|
|
313
|
+
await cleanupHeld();
|
|
314
|
+
// The network is the caller's to retry (GithubUnreachableError); any other failure is a sentence.
|
|
315
|
+
if (err instanceof GithubUnreachableError)
|
|
316
|
+
throw err;
|
|
317
|
+
if (err instanceof FetchTimeout || err instanceof GitTimeoutError)
|
|
318
|
+
return fail(`GitHub did not give the commit within ${sayLimit(limit)}, so the fetch was stopped.`);
|
|
319
|
+
return fail(`the commit could not be fetched (${redact(err instanceof Error ? err.message : String(err))
|
|
320
|
+
.replace(/\s+/g, ' ')
|
|
321
|
+
.slice(0, 160)}).`);
|
|
322
|
+
}
|
|
323
|
+
};
|
|
324
|
+
return withCacheLock(cache, make);
|
|
325
|
+
}
|
|
326
|
+
//# sourceMappingURL=test-repo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-repo.js","sourceRoot":"","sources":["../../src/runner/test-repo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// What a test typed, and where its name shows up (KAT-392). Playwright titles a typed step with the value itself: `Fill "<value>"`,
|
|
2
|
+
// `Type "<text>"`, `Press "a"` for one key of a password typed key by key. The step reporter streams those titles, the live frames carry
|
|
3
|
+
// them as the label of each screenshot, and a failed fill prints the value in the call log of the error. The value can be any secret the
|
|
4
|
+
// test types, so it is hidden where the label is stored and again where the evidence pack is built.
|
|
5
|
+
const MASK = '[redacted]';
|
|
6
|
+
/** A value already hidden stays as it is, so a second pass changes nothing. */
|
|
7
|
+
const NOT_MASKED = '(?!\\s*\\[redacted\\])';
|
|
8
|
+
/**
|
|
9
|
+
* A typed value and its closing quote. The closing quote is the one that ends the title or comes before the locator the call ran on, so a quote
|
|
10
|
+
* inside the value is part of the value. A title with no closing quote at all (a value cut off) is hidden to its end. A quote that is followed by
|
|
11
|
+
* more words is no typed step: `Fill "Company name" field shows the wrong error` is a sentence, and it stays as written.
|
|
12
|
+
*/
|
|
13
|
+
const VALUE = '(?:[^\\r\\n]*?"(?=\\s*(?:$|(?:getBy\\w+|locator|frameLocator)\\())|(?![^\\r\\n]*")[^\\r\\n]*)';
|
|
14
|
+
/** Title forms: `Fill "x"`, `Fill "x" getByLabel('Password')`, and one key `Press "s"`. The verb starts the title, or follows a `: ` or `› ` of a title path. */
|
|
15
|
+
const TITLE_RULES = [
|
|
16
|
+
[new RegExp(`(^[ \\t]*(?:[-*]\\s+)?|[:\u203a>]\\s+)(Fill|Type|Insert|Press sequentially)(\\s+)"${NOT_MASKED}${VALUE}`, 'gm'), `$1$2$3"${MASK}"`],
|
|
17
|
+
[
|
|
18
|
+
new RegExp(`(^[ \\t]*(?:[-*]\\s+)?|[:\u203a>]\\s+)(Press|Key down|Key up)(\\s+)"${NOT_MASKED}[^"\\r\\n]"(?=\\s*(?:$|(?:getBy\\w+|locator|frameLocator)\\())`, 'gm'),
|
|
19
|
+
`$1$2$3"${MASK}"`,
|
|
20
|
+
],
|
|
21
|
+
];
|
|
22
|
+
const QUOTED = '(?:"(?:\\\\.|[^"\\\\\\r\\n])*"|\'(?:\\\\.|[^\'\\\\\\r\\n])*\'|`(?:\\\\.|[^`\\\\\\r\\n])*`)';
|
|
23
|
+
/**
|
|
24
|
+
* Call forms, as a call log or a code frame prints them. In order:
|
|
25
|
+
* - the call log of a failed fill, ` fill("ab"cd")`: Playwright prints the value as it is, so a quote in it is not escaped, and the value runs to the last `")` of the line;
|
|
26
|
+
* - two arguments, `page.fill('#pw', 'hunter2')`: the second one is the value, the selector stays;
|
|
27
|
+
* - one argument, `locator.type('x')`, `pressSequentially(`x`)`.
|
|
28
|
+
*/
|
|
29
|
+
const CALL_RULES = [
|
|
30
|
+
[new RegExp(`^(\\s*(?:-\\s+)?(?:fill|type|pressSequentially|insertText)\\(\\s*)"${NOT_MASKED}[^\\r\\n]*"(\\)\\s*)$`, 'gm'), `$1"${MASK}"$2`],
|
|
31
|
+
[new RegExp(`\\b((?:fill|type)\\(\\s*${QUOTED}\\s*,\\s*)(["'\`])${NOT_MASKED}(?:\\\\.|(?!\\2)[^\\\\\\r\\n])*\\2`, 'g'), `$1$2${MASK}$2`],
|
|
32
|
+
[
|
|
33
|
+
new RegExp(`\\b(fill|type|pressSequentially|insertText)(\\(\\s*)(["'\`])${NOT_MASKED}(?:\\\\.|(?!\\3)[^\\\\\\r\\n])*\\3(?!\\s*,\\s*["'\`])`, 'g'),
|
|
34
|
+
`$1$2$3${MASK}$3`,
|
|
35
|
+
],
|
|
36
|
+
];
|
|
37
|
+
/** The rules the evidence pack scrub runs next to its own. */
|
|
38
|
+
export const TYPED_VALUE_RULES = [...TITLE_RULES, ...CALL_RULES];
|
|
39
|
+
/** The text with every value a test typed replaced by `[redacted]`: `Fill "s3cret" getByLabel('Password')` reads `Fill "[redacted]" getByLabel('Password')`. */
|
|
40
|
+
export function hideTypedValue(text) {
|
|
41
|
+
let out = text;
|
|
42
|
+
for (const [re, to] of TYPED_VALUE_RULES)
|
|
43
|
+
out = out.replace(re, to);
|
|
44
|
+
return out;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=typed-value.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typed-value.js","sourceRoot":"","sources":["../../src/runner/typed-value.ts"],"names":[],"mappings":"AAAA,oIAAoI;AACpI,yIAAyI;AACzI,yIAAyI;AACzI,oGAAoG;AAEpG,MAAM,IAAI,GAAG,YAAY,CAAC;AAC1B,+EAA+E;AAC/E,MAAM,UAAU,GAAG,wBAAwB,CAAC;AAC5C;;;;GAIG;AACH,MAAM,KAAK,GAAG,+FAA+F,CAAC;AAE9G,iKAAiK;AACjK,MAAM,WAAW,GAAuB;IACtC,CAAC,IAAI,MAAM,CAAC,qFAAqF,UAAU,GAAG,KAAK,EAAE,EAAE,IAAI,CAAC,EAAE,UAAU,IAAI,GAAG,CAAC;IAChJ;QACE,IAAI,MAAM,CACR,uEAAuE,UAAU,gEAAgE,EACjJ,IAAI,CACL;QACD,UAAU,IAAI,GAAG;KAClB;CACF,CAAC;AAEF,MAAM,MAAM,GAAG,4FAA4F,CAAC;AAE5G;;;;;GAKG;AACH,MAAM,UAAU,GAAuB;IACrC,CAAC,IAAI,MAAM,CAAC,sEAAsE,UAAU,uBAAuB,EAAE,IAAI,CAAC,EAAE,MAAM,IAAI,KAAK,CAAC;IAC5I,CAAC,IAAI,MAAM,CAAC,2BAA2B,MAAM,qBAAqB,UAAU,oCAAoC,EAAE,GAAG,CAAC,EAAE,OAAO,IAAI,IAAI,CAAC;IACxI;QACE,IAAI,MAAM,CAAC,+DAA+D,UAAU,uDAAuD,EAAE,GAAG,CAAC;QACjJ,SAAS,IAAI,IAAI;KAClB;CACF,CAAC;AAEF,8DAA8D;AAC9D,MAAM,CAAC,MAAM,iBAAiB,GAAuB,CAAC,GAAG,WAAW,EAAE,GAAG,UAAU,CAAC,CAAC;AAErF,gKAAgK;AAChK,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,IAAI,GAAG,GAAG,IAAI,CAAC;IACf,KAAK,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,iBAAiB;QAAE,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACpE,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
// Checks a commit with GitHub before the runner checks it out and runs its code (KAT-291, KAT-284).
|
|
2
|
+
//
|
|
3
|
+
// A webhook can be forged while GITHUB_WEBHOOK_SECRET is unset, so the event's own claims (a `fork`
|
|
4
|
+
// flag, the branch it names) are not enough to decide that code is safe to run on this machine.
|
|
5
|
+
// Two cases are confirmed against what GitHub says:
|
|
6
|
+
// - a PR check: the PR's head is this commit, and the head lives in the base repo (not a fork);
|
|
7
|
+
// - a merge or push run: the commit is contained in the repo's default branch, as GitHub reports it.
|
|
8
|
+
// Anything else, including an API error or no token, means nothing is checked out and nothing runs.
|
|
9
|
+
//
|
|
10
|
+
// Every path that checks out and runs code uses these rules: a fresh clone goes through `verifyCommit`, and a
|
|
11
|
+
// worktree of the dot's working folder (worktree.ts) calls `judgePullHead`, `readPullHead` and `defaultBranchOf`
|
|
12
|
+
// for the same two decisions. They differ only in how containment is proven: a clone asks GitHub to compare the
|
|
13
|
+
// commit with the default branch, a worktree asks git for the ancestry of the fetched default branch.
|
|
14
|
+
import { cleanTestBranches, isSafeBranchName } from './command.js';
|
|
15
|
+
/** A full commit id. A short sha or a ref name is not accepted where git gets a commit. */
|
|
16
|
+
export function isFullSha(s) {
|
|
17
|
+
return /^[0-9a-f]{40}$/i.test(s);
|
|
18
|
+
}
|
|
19
|
+
/** A branch name that is safe as a git argument: it starts with a letter or digit, so it is never an option. */
|
|
20
|
+
export function isSafeRef(s) {
|
|
21
|
+
return isSafeBranchName(s);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* The one rule for a merge or push (KAT-292): the commit is checked against the default branch of the repository as
|
|
25
|
+
* GitHub reports it, unless the event names a branch that the dot lists in `testBranches`. A branch the event names
|
|
26
|
+
* that is not listed never decides anything. `defaultBranch` comes from GitHub (defaultBranchOf), never from the event.
|
|
27
|
+
*/
|
|
28
|
+
export function pickMergeBranch(defaultBranch, named, testBranches) {
|
|
29
|
+
const n = (named ?? '').trim();
|
|
30
|
+
if (!n || n === defaultBranch)
|
|
31
|
+
return { branch: defaultBranch, listed: false };
|
|
32
|
+
if (isSafeRef(n) && cleanTestBranches(testBranches).includes(n))
|
|
33
|
+
return { branch: n, listed: true };
|
|
34
|
+
return { branch: defaultBranch, listed: false, unlisted: n };
|
|
35
|
+
}
|
|
36
|
+
/** One sentence for a refusal about a commit of an unlisted branch, naming the setting that lists it. */
|
|
37
|
+
export function unlistedBranchNote(branch, defaultBranch) {
|
|
38
|
+
return `It was sent for branch ${branch.slice(0, 80)}, which is not the default branch (${defaultBranch}) and is not listed in the dot's Test branches setting (testBranches), so only the default branch is tested. Add ${branch.slice(0, 80)} to Test branches under Test runner to test it.`;
|
|
39
|
+
}
|
|
40
|
+
const no = (reason) => ({ ok: false, reason });
|
|
41
|
+
const why = (err) => (err instanceof Error ? err.message : String(err)).replace(/\s+/g, ' ').slice(0, 200);
|
|
42
|
+
const fullName = (repo) => `${repo.owner}/${repo.name}`;
|
|
43
|
+
/** Reads the head of PR `number` from GitHub. Never throws. */
|
|
44
|
+
export async function readPullHead(gh, repo, number) {
|
|
45
|
+
const unread = `PR #${number} of ${fullName(repo)} could not be checked with GitHub (no GitHub token, or the request failed), so its code was not checked out or run.`;
|
|
46
|
+
if (gh.mode === 'demo')
|
|
47
|
+
return { ok: false, reason: unread };
|
|
48
|
+
let pull;
|
|
49
|
+
try {
|
|
50
|
+
pull = await gh.getPull(number);
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
return { ok: false, reason: unread, detail: why(err) };
|
|
54
|
+
}
|
|
55
|
+
if (!pull)
|
|
56
|
+
return {
|
|
57
|
+
ok: false,
|
|
58
|
+
reason: `GitHub has no PR #${number} in ${fullName(repo)}, so PR #${number} could not be checked with GitHub and its code was not checked out or run.`,
|
|
59
|
+
};
|
|
60
|
+
const head = pull.payload?.head;
|
|
61
|
+
const sha = typeof head?.sha === 'string' ? head.sha : '';
|
|
62
|
+
const headRepo = typeof head?.repo?.full_name === 'string' && head.repo.full_name ? head.repo.full_name : null;
|
|
63
|
+
return { ok: true, head: { sha, headRepo } };
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* The one rule for a PR: its head on GitHub is `sha`, and the head lives in `repo` itself. A deleted head
|
|
67
|
+
* repository is treated as a fork. Case does not matter in a sha or a repository name.
|
|
68
|
+
*/
|
|
69
|
+
export function judgePullHead(head, repo, number, sha) {
|
|
70
|
+
const full = fullName(repo);
|
|
71
|
+
const headSha = head.sha.trim().toLowerCase();
|
|
72
|
+
if (headSha !== sha.trim().toLowerCase())
|
|
73
|
+
return no(`GitHub reports another head commit for PR #${number}: the head of PR #${number} is ${headSha ? headSha.slice(0, 12) : 'unknown'}, not ${sha.slice(0, 12)}, so it was not checked out or run.`);
|
|
74
|
+
if (!head.headRepo || head.headRepo.toLowerCase() !== full.toLowerCase())
|
|
75
|
+
return no(`PR #${number} does not come from this repository (${full}): its head is in ${head.headRepo || 'a fork that no longer exists'}, so its code was not checked out or run.`);
|
|
76
|
+
return { ok: true };
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* The default branch of `repo` as GitHub reports it, and not the branch an event names. Never throws.
|
|
80
|
+
* `detail` carries the error text for a caller that may show it.
|
|
81
|
+
*/
|
|
82
|
+
export async function defaultBranchOf(gh, repo, sha) {
|
|
83
|
+
const full = fullName(repo);
|
|
84
|
+
let branch;
|
|
85
|
+
try {
|
|
86
|
+
branch = await gh.defaultBranchName();
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
return { ok: false, reason: `GitHub could not report the default branch of ${full}, so ${sha.slice(0, 12)} was not checked out or run.`, detail: why(err) };
|
|
90
|
+
}
|
|
91
|
+
if (!isSafeRef(branch))
|
|
92
|
+
return {
|
|
93
|
+
ok: false,
|
|
94
|
+
reason: `GitHub reported a default branch of ${full} that is not a safe branch name, so ${sha.slice(0, 12)} was not checked out or run.`,
|
|
95
|
+
};
|
|
96
|
+
return { ok: true, branch };
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Confirms with GitHub that `sha` may be cloned and run for `repo`. Never throws: a failure is a
|
|
100
|
+
* refusal with a plain reason, because the run must not go ahead on a commit nobody confirmed.
|
|
101
|
+
*/
|
|
102
|
+
export async function verifyCommit(gh, repo, sha, target) {
|
|
103
|
+
const full = fullName(repo);
|
|
104
|
+
if (!isFullSha(sha))
|
|
105
|
+
return no(`The commit "${sha.slice(0, 60)}" is not a full 40 character sha, so it was not checked out.`);
|
|
106
|
+
if (gh.mode === 'demo')
|
|
107
|
+
return no(`GitHub is not connected (no token), so ${sha.slice(0, 12)} of ${full} could not be confirmed and was not checked out.`);
|
|
108
|
+
if (target.kind === 'pr') {
|
|
109
|
+
const pull = await readPullHead(gh, repo, target.number);
|
|
110
|
+
if (!pull.ok)
|
|
111
|
+
return no(pull.detail ? `${pull.reason} (${pull.detail})` : pull.reason);
|
|
112
|
+
return judgePullHead(pull.head, repo, target.number, sha);
|
|
113
|
+
}
|
|
114
|
+
const def = await defaultBranchOf(gh, repo, sha);
|
|
115
|
+
if (!def.ok)
|
|
116
|
+
return no(def.detail ? `${def.reason} (${def.detail})` : def.reason);
|
|
117
|
+
const picked = pickMergeBranch(def.branch, target.named, target.testBranches);
|
|
118
|
+
const branch = picked.branch;
|
|
119
|
+
try {
|
|
120
|
+
// refs/heads/ pins the branch: a bare name could also resolve to a tag of the same name, which anyone with write access can create.
|
|
121
|
+
const status = await gh.compareStatus(`refs/heads/${branch}`, sha);
|
|
122
|
+
// base...head: head "behind" or "identical" to the branch is contained in it.
|
|
123
|
+
if (status === 'behind' || status === 'identical')
|
|
124
|
+
return { ok: true };
|
|
125
|
+
const where = picked.listed ? `the test branch ${branch}` : `the default branch (${branch})`;
|
|
126
|
+
const note = picked.unlisted ? ` ${unlistedBranchNote(picked.unlisted, branch)}` : '';
|
|
127
|
+
return no(`${sha.slice(0, 12)} is not on ${where} of ${full} (GitHub compare: ${status}), so it was not checked out or run.${note}`);
|
|
128
|
+
}
|
|
129
|
+
catch (err) {
|
|
130
|
+
return no(`GitHub could not compare ${sha.slice(0, 12)} with ${branch} of ${full} (${why(err)}), so it was not checked out or run.`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=verify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/runner/verify.ts"],"names":[],"mappings":"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"}
|