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,221 @@
|
|
|
1
|
+
// runner.copyFiles (KAT-293): files of the dot's working folder that a run in a temporary worktree needs but git does
|
|
2
|
+
// not carry, such as `.env`. They are copied into the worktree before the setup steps.
|
|
3
|
+
//
|
|
4
|
+
// The paths are the owner's setting, but the folder and the worktree are not trusted to be what they look like:
|
|
5
|
+
// - a path is relative and has no `..` (copyFileError, command.ts);
|
|
6
|
+
// - the real path of the source (symlinks resolved) must be inside the real working folder, so a symlink that leads
|
|
7
|
+
// out of the folder is never followed and nothing outside it is read;
|
|
8
|
+
// - the worktree is a checkout of a commit, so it can hold a symlink where a folder is expected, the folders from the
|
|
9
|
+
// worktree root down to the working sub folder (apps/web) included. The copy walks every folder from the root,
|
|
10
|
+
// refuses a symlink on the way, checks with realpath that the destination folder stays inside the root, and opens
|
|
11
|
+
// the file with O_NOFOLLOW, so nothing is written outside the worktree;
|
|
12
|
+
// - the source is opened once (O_NOFOLLOW, O_NONBLOCK so a named pipe cannot block) and its type and size are read from that open file, so a swap after the
|
|
13
|
+
// check cannot change what is copied. The destination is written through its own open file the same way;
|
|
14
|
+
// - only regular files are copied, up to 1 MB. The notes never print file contents.
|
|
15
|
+
// A missing file is skipped with a note; nothing here throws.
|
|
16
|
+
import { closeSync, constants, fchmodSync, fstatSync, ftruncateSync, lstatSync, mkdirSync, openSync, readSync, realpathSync, statSync, writeSync, } from 'node:fs';
|
|
17
|
+
import path from 'node:path';
|
|
18
|
+
import { runTracked } from '../proc.js';
|
|
19
|
+
import { cleanCopyFiles, copyFileError } from './command.js';
|
|
20
|
+
/** The largest file that is copied. A dotfile with settings is far below it; anything bigger is not a dotfile. */
|
|
21
|
+
const MAX_BYTES = 1024 * 1024;
|
|
22
|
+
/** True when `child` is `parent` or below it. Both are real absolute paths. */
|
|
23
|
+
function isInside(child, parent) {
|
|
24
|
+
const rel = path.relative(parent, child);
|
|
25
|
+
return rel === '' || (!rel.startsWith('..') && !path.isAbsolute(rel));
|
|
26
|
+
}
|
|
27
|
+
/** Makes the folders of `relDir` under `root` one at a time and fails on a symlink or a file on the way. */
|
|
28
|
+
function ensureDir(root, relDir) {
|
|
29
|
+
let cur = root;
|
|
30
|
+
for (const seg of relDir.split(path.sep).filter((s) => s && s !== '.')) {
|
|
31
|
+
cur = path.join(cur, seg);
|
|
32
|
+
let st;
|
|
33
|
+
try {
|
|
34
|
+
st = lstatSync(cur);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
mkdirSync(cur);
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
if (st.isSymbolicLink())
|
|
41
|
+
return `the worktree has a symlink at ${path.relative(root, cur)}`;
|
|
42
|
+
if (!st.isDirectory())
|
|
43
|
+
return `the worktree has a file where the folder ${path.relative(root, cur)} should be`;
|
|
44
|
+
}
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
/** Reads the whole open file `fd` (`size` bytes at most MAX_BYTES). */
|
|
48
|
+
function readAll(fd, size) {
|
|
49
|
+
const buf = Buffer.alloc(size);
|
|
50
|
+
let got = 0;
|
|
51
|
+
while (got < size) {
|
|
52
|
+
const n = readSync(fd, buf, got, size - got, got);
|
|
53
|
+
if (n <= 0)
|
|
54
|
+
break;
|
|
55
|
+
got += n;
|
|
56
|
+
}
|
|
57
|
+
return buf.subarray(0, got);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Copies `files` (relative to `from`, the working folder) to the same places under `to` (the worktree's working
|
|
61
|
+
* folder, which is `root` or a sub folder of it). `root` is the worktree root: nothing is written outside it. Never throws.
|
|
62
|
+
*/
|
|
63
|
+
export function copyFilesIntoWorktree(o) {
|
|
64
|
+
const out = { copied: [], notes: [] };
|
|
65
|
+
const files = cleanCopyFiles([...o.files]);
|
|
66
|
+
if (!files.length)
|
|
67
|
+
return out;
|
|
68
|
+
let realFrom;
|
|
69
|
+
let realRoot;
|
|
70
|
+
let relTo;
|
|
71
|
+
try {
|
|
72
|
+
realFrom = realpathSync(o.from);
|
|
73
|
+
realRoot = realpathSync(o.root);
|
|
74
|
+
// The worktree's folder as the path below the root, taken from the names (not resolved), so every folder on it is checked below.
|
|
75
|
+
relTo = path.relative(path.resolve(o.root), path.resolve(o.to));
|
|
76
|
+
if (relTo.startsWith('..') || path.isAbsolute(relTo))
|
|
77
|
+
throw new Error('outside');
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
out.notes.push('copyFiles: the working folder or the worktree could not be read, so no file was copied.');
|
|
81
|
+
return out;
|
|
82
|
+
}
|
|
83
|
+
for (const rel of files) {
|
|
84
|
+
const skip = (why) => out.notes.push(`copyFiles: ${rel} ${why}, skipped.`);
|
|
85
|
+
const bad = copyFileError(rel);
|
|
86
|
+
if (bad) {
|
|
87
|
+
skip(`is not a usable path (${bad.replace(/^"[^"]*" /, '')})`);
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
const src = path.join(realFrom, rel);
|
|
91
|
+
let real;
|
|
92
|
+
try {
|
|
93
|
+
// Resolves every symlink on the way, a dangling one included (that one is missing).
|
|
94
|
+
real = realpathSync(src);
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
skip('is not in the working folder');
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
if (!isInside(real, realFrom)) {
|
|
101
|
+
skip('leads outside the working folder through a symlink and was not followed');
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
let srcFd;
|
|
105
|
+
let destFd;
|
|
106
|
+
try {
|
|
107
|
+
// The type and size come from the open file, so they are the ones of the bytes that are copied.
|
|
108
|
+
srcFd = openSync(real, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
|
|
109
|
+
const st = fstatSync(srcFd);
|
|
110
|
+
if (!st.isFile()) {
|
|
111
|
+
skip('is not a regular file');
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
if (st.size > MAX_BYTES) {
|
|
115
|
+
skip('is larger than 1 MB');
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
const pathStat = statSync(real);
|
|
119
|
+
if (pathStat.ino !== st.ino || pathStat.dev !== st.dev) {
|
|
120
|
+
skip('changed while it was read');
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
// Every folder from the worktree root down, the working sub folder included: none may be a symlink.
|
|
124
|
+
const destRel = path.join(relTo, rel);
|
|
125
|
+
const blocked = ensureDir(realRoot, path.dirname(destRel));
|
|
126
|
+
if (blocked) {
|
|
127
|
+
skip(blocked);
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
const dir = path.join(realRoot, path.dirname(destRel));
|
|
131
|
+
if (!isInside(realpathSync(dir), realRoot)) {
|
|
132
|
+
skip('would be written outside the worktree');
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
const dest = path.join(dir, path.basename(destRel));
|
|
136
|
+
let existing;
|
|
137
|
+
try {
|
|
138
|
+
existing = lstatSync(dest);
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
existing = undefined;
|
|
142
|
+
}
|
|
143
|
+
if (existing && !existing.isFile()) {
|
|
144
|
+
skip('would replace a symlink or a folder of the worktree');
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
// O_NOFOLLOW: a symlink at the file is an error, never followed. The file is emptied only after it is known to be a regular one.
|
|
148
|
+
destFd = openSync(dest, constants.O_WRONLY | constants.O_CREAT | constants.O_NOFOLLOW | constants.O_NONBLOCK, 0o600);
|
|
149
|
+
if (!fstatSync(destFd).isFile()) {
|
|
150
|
+
skip('would replace a symlink or a folder of the worktree');
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
ftruncateSync(destFd, 0);
|
|
154
|
+
const data = readAll(srcFd, st.size);
|
|
155
|
+
let written = 0;
|
|
156
|
+
while (written < data.length)
|
|
157
|
+
written += writeSync(destFd, data, written, data.length - written);
|
|
158
|
+
fchmodSync(destFd, st.mode & 0o777);
|
|
159
|
+
out.copied.push(rel);
|
|
160
|
+
out.notes.push(`copyFiles: copied ${rel} into the worktree.`);
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
skip('could not be copied');
|
|
164
|
+
}
|
|
165
|
+
finally {
|
|
166
|
+
if (srcFd !== undefined)
|
|
167
|
+
closeSync(srcFd);
|
|
168
|
+
if (destFd !== undefined)
|
|
169
|
+
closeSync(destFd);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
return out;
|
|
173
|
+
}
|
|
174
|
+
/** Dotfiles that say nothing about a failed run. */
|
|
175
|
+
const NOISE = new Set(['.DS_Store', '.gitkeep', '.gitignore', '.gitattributes', '.keep', '.directory', '.localized']);
|
|
176
|
+
/**
|
|
177
|
+
* The untracked dotfiles of the working folder `dir` (ignored ones included, such as `.env`) that are not in
|
|
178
|
+
* `listed`, at most `max`, as paths relative to `dir`. A folder that is entirely untracked counts as one entry and
|
|
179
|
+
* is not looked into, so `node_modules/` and build folders do not bury the answer. Never throws; [] on any error.
|
|
180
|
+
*/
|
|
181
|
+
export async function untrackedDotfiles(dir, listed, max = 5) {
|
|
182
|
+
try {
|
|
183
|
+
const r = await runTracked('git', ['ls-files', '-z', '--others', '--directory'], {
|
|
184
|
+
cwd: dir,
|
|
185
|
+
timeoutMs: 15_000,
|
|
186
|
+
maxBuffer: 500_000,
|
|
187
|
+
env: { ...process.env, GIT_OPTIONAL_LOCKS: '0' },
|
|
188
|
+
});
|
|
189
|
+
if (r.code !== 0)
|
|
190
|
+
return { files: [], more: 0 };
|
|
191
|
+
const have = new Set(cleanCopyFiles([...listed]));
|
|
192
|
+
const found = r.stdout
|
|
193
|
+
.split('\0')
|
|
194
|
+
.filter((f) => f && !f.endsWith('/'))
|
|
195
|
+
.filter((f) => {
|
|
196
|
+
const base = path.posix.basename(f);
|
|
197
|
+
return base.startsWith('.') && !NOISE.has(base) && !base.startsWith('.localdost-run-') && !have.has(f);
|
|
198
|
+
})
|
|
199
|
+
.sort();
|
|
200
|
+
return { files: found.slice(0, max), more: Math.max(0, found.length - max) };
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
return { files: [], more: 0 };
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* The sentence that names copyFiles when a worktree run failed and the working folder holds untracked dotfiles that were not copied.
|
|
208
|
+
* It is posted in PR comments, so it holds no file name: those describe the owner's local secret layout (see copyFilesHintFiles).
|
|
209
|
+
*/
|
|
210
|
+
export function copyFilesHint(found) {
|
|
211
|
+
if (!found.files.length)
|
|
212
|
+
return undefined;
|
|
213
|
+
return "The run happened in a clean worktree, and the working folder has untracked files that were not copied into it. If the tests need them, list them in Copy files in the dot's Test runner settings (runner.copyFiles).";
|
|
214
|
+
}
|
|
215
|
+
/** The names behind copyFilesHint, for the local run page only. Never put them in a PR comment or a ticket. */
|
|
216
|
+
export function copyFilesHintFiles(found) {
|
|
217
|
+
if (!found.files.length)
|
|
218
|
+
return undefined;
|
|
219
|
+
return found.files.join(', ') + (found.more ? ` and ${found.more} more` : '');
|
|
220
|
+
}
|
|
221
|
+
//# sourceMappingURL=copyfiles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copyfiles.js","sourceRoot":"","sources":["../../src/runner/copyfiles.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
const RANK = { failed: 4, flaky: 3, passed: 2, skipped: 1, not_run: 0 };
|
|
2
|
+
function resultOf(cases) {
|
|
3
|
+
if (cases.some((c) => c.status === 'failed' || c.status === 'timedOut'))
|
|
4
|
+
return 'failed';
|
|
5
|
+
if (cases.some((c) => c.status === 'flaky'))
|
|
6
|
+
return 'flaky';
|
|
7
|
+
if (cases.some((c) => c.status === 'passed'))
|
|
8
|
+
return 'passed';
|
|
9
|
+
if (cases.length && cases.every((c) => c.status === 'skipped'))
|
|
10
|
+
return 'skipped';
|
|
11
|
+
return 'not_run';
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Folds one engine's result into an item: the worse result wins when another engine already set
|
|
15
|
+
* one in this run, and the engine joins coveredBy. Skipped cases count for nothing, unless
|
|
16
|
+
* skippedResult is set and nothing else set a result.
|
|
17
|
+
*/
|
|
18
|
+
export function withEngineResult(t, engine, cases, opts = {}) {
|
|
19
|
+
const counted = cases.filter((c) => c.status !== 'skipped');
|
|
20
|
+
if (!counted.length) {
|
|
21
|
+
// AI-Vision has always reported an all-skipped item as skipped; a discarded generated spec sets nothing.
|
|
22
|
+
if (opts.skippedResult && cases.length && !(t.resultSource === 'runner' && t.result))
|
|
23
|
+
return { ...t, result: 'skipped', resultSource: 'runner' };
|
|
24
|
+
return t;
|
|
25
|
+
}
|
|
26
|
+
const result = resultOf(counted);
|
|
27
|
+
const prior = t.resultSource === 'runner' && t.coveredBy?.length ? t.result : undefined;
|
|
28
|
+
const merged = prior && RANK[prior] > RANK[result] ? prior : result;
|
|
29
|
+
const coveredBy = [...new Set([...(t.resultSource === 'runner' ? (t.coveredBy ?? []) : []), engine])];
|
|
30
|
+
return { ...t, result: merged, resultSource: 'runner', coveredBy };
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=engines.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engines.js","sourceRoot":"","sources":["../../src/runner/engines.ts"],"names":[],"mappings":"AAKA,MAAM,IAAI,GAAuD,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;AAE5H,SAAS,QAAQ,CAAC,KAAuB;IACvC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC;QAAE,OAAO,QAAQ,CAAC;IACzF,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IAC5D,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC9D,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IACjF,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,CAAc,EAAE,MAAgB,EAAE,KAAuB,EAAE,OAAoC,EAAE;IAChI,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;IAC5D,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACpB,yGAAyG;QACzG,IAAI,IAAI,CAAC,aAAa,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,CAAC;YAAE,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC;QACjJ,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAE,CAAC;IAClC,MAAM,KAAK,GAAG,CAAC,CAAC,YAAY,KAAK,QAAQ,IAAI,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IACxF,MAAM,MAAM,GAAG,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;IACpE,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IACtG,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AACrE,CAAC"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
// Per-test evidence: which screenshots, video, and trace each test of a Playwright run left in the run's
|
|
2
|
+
// artifacts. The names come from the same rule saveOutputs copies the files by (artifacts.outputArtifactName),
|
|
3
|
+
// so the report can name a file before the copy happens.
|
|
4
|
+
//
|
|
5
|
+
// The JSON report comes from the repo's own test code, so a path in it can name any file on the machine.
|
|
6
|
+
// Only a regular file whose real path lies inside the run's test-results folder is ever named here.
|
|
7
|
+
import { lstatSync, realpathSync } from 'node:fs';
|
|
8
|
+
import path from 'node:path';
|
|
9
|
+
import { outputArtifactName } from './artifacts.js';
|
|
10
|
+
import { reportTests } from './playwright-json.js';
|
|
11
|
+
/** Most screenshots one test lists; a long test keeps its first ones. */
|
|
12
|
+
export const MAX_SHOTS_PER_TEST = 40;
|
|
13
|
+
/**
|
|
14
|
+
* A test title with the project prefix and the separator style removed, so the step reporter's
|
|
15
|
+
* "describe > title" and the JSON report's "[project] describe › title" compare equal.
|
|
16
|
+
*/
|
|
17
|
+
export function normTitle(title) {
|
|
18
|
+
return title
|
|
19
|
+
.replace(/^\[[^\]]+\]\s*/, '')
|
|
20
|
+
.split(/\s+[›>]\s+/)
|
|
21
|
+
.map((s) => s.trim())
|
|
22
|
+
.join(' > ');
|
|
23
|
+
}
|
|
24
|
+
/** The file a report path names inside `<outDir>/test-results`, as written lexically, or undefined when it is not one of ours. */
|
|
25
|
+
export function outputFile(p, outDir) {
|
|
26
|
+
const results = path.join(outDir, 'test-results');
|
|
27
|
+
let root;
|
|
28
|
+
try {
|
|
29
|
+
root = realpathSync(results);
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
const candidates = [path.isAbsolute(p) ? p : path.join(outDir, p)];
|
|
35
|
+
// Docker writes /out/test-results/...; the same folder is outDir on the host.
|
|
36
|
+
const m = /(?:^|\/)test-results\/(.+)$/.exec(p.replace(/\\/g, '/'));
|
|
37
|
+
if (m)
|
|
38
|
+
candidates.push(path.join(results, m[1]));
|
|
39
|
+
for (const c of candidates) {
|
|
40
|
+
try {
|
|
41
|
+
const lexical = path.resolve(c);
|
|
42
|
+
const rel = path.relative(path.resolve(results), lexical);
|
|
43
|
+
if (!rel || rel.startsWith('..') || path.isAbsolute(rel))
|
|
44
|
+
continue;
|
|
45
|
+
const real = realpathSync(lexical);
|
|
46
|
+
const inside = path.relative(root, real);
|
|
47
|
+
if (!inside || inside.startsWith('..') || path.isAbsolute(inside) || !lstatSync(real).isFile())
|
|
48
|
+
continue;
|
|
49
|
+
return lexical;
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
/* not there */
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* The evidence of every test of a Playwright JSON report, in the order of reportTests() (and so of the parsed
|
|
59
|
+
* cases). A test with a failing attempt shows that attempt; otherwise its last one. Undefined for a test that
|
|
60
|
+
* left nothing.
|
|
61
|
+
*/
|
|
62
|
+
export function collectEvidence(report, o) {
|
|
63
|
+
if (!report || typeof report !== 'object')
|
|
64
|
+
return [];
|
|
65
|
+
const results = path.join(o.outDir, 'test-results');
|
|
66
|
+
const nameOf = (file) => o.storedName?.(file) ?? outputArtifactName(o.prefix, results, file);
|
|
67
|
+
return reportTests(report).map((t) => {
|
|
68
|
+
const attempts = (Array.isArray(t.test.results) ? t.test.results : []);
|
|
69
|
+
if (!attempts.length)
|
|
70
|
+
return undefined;
|
|
71
|
+
const pick = [...attempts].reverse().find((r) => r.status !== 'passed' && r.status !== 'skipped') ?? attempts[attempts.length - 1];
|
|
72
|
+
const retry = Number(pick.retry) || 0;
|
|
73
|
+
const key = normTitle(t.title);
|
|
74
|
+
const screenshots = [];
|
|
75
|
+
const seen = new Set();
|
|
76
|
+
const add = (name, step) => {
|
|
77
|
+
if (seen.has(name) || screenshots.length >= MAX_SHOTS_PER_TEST)
|
|
78
|
+
return;
|
|
79
|
+
seen.add(name);
|
|
80
|
+
screenshots.push(step ? { name, step } : { name });
|
|
81
|
+
};
|
|
82
|
+
for (const s of o.shots ?? []) {
|
|
83
|
+
if (s.retry === retry && normTitle(s.title) === key && (!s.project || !t.project || s.project === t.project))
|
|
84
|
+
add(s.name, s.step);
|
|
85
|
+
}
|
|
86
|
+
let video;
|
|
87
|
+
let trace;
|
|
88
|
+
const files = (Array.isArray(pick.attachments) ? pick.attachments : []);
|
|
89
|
+
for (const a of files) {
|
|
90
|
+
if (typeof a?.path !== 'string')
|
|
91
|
+
continue;
|
|
92
|
+
const type = String(a.contentType ?? '');
|
|
93
|
+
const isImage = type.startsWith('image/');
|
|
94
|
+
const isVideo = a.name === 'video' && type.startsWith('video/');
|
|
95
|
+
const isTrace = a.name === 'trace';
|
|
96
|
+
if (!isImage && !isVideo && !isTrace)
|
|
97
|
+
continue;
|
|
98
|
+
const file = outputFile(a.path, o.outDir);
|
|
99
|
+
if (!file)
|
|
100
|
+
continue;
|
|
101
|
+
const name = nameOf(file);
|
|
102
|
+
if (isVideo)
|
|
103
|
+
video = name;
|
|
104
|
+
else if (isTrace)
|
|
105
|
+
trace = name;
|
|
106
|
+
else
|
|
107
|
+
add(name, a.name === 'screenshot' ? 'End of test' : String(a.name ?? ''));
|
|
108
|
+
}
|
|
109
|
+
if (!screenshots.length && !video && !trace)
|
|
110
|
+
return undefined;
|
|
111
|
+
return { screenshots, ...(video ? { video } : {}), ...(trace ? { trace } : {}) };
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=evidence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence.js","sourceRoot":"","sources":["../../src/runner/evidence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
// The host environment a test process may see (KAT-361). A local run and its setup steps get the server's
|
|
2
|
+
// environment minus every credential the server itself holds, plus the test login the dot names in
|
|
3
|
+
// runner.passEnv. A Docker run gets no host variables at all, only the passEnv ones. This file is the one
|
|
4
|
+
// place that lists what is held back, and test/runner-env.test.ts runs a real child process against it.
|
|
5
|
+
import { PRESETS } from '../connections/presets.js';
|
|
6
|
+
import { listConnections } from '../connections/store.js';
|
|
7
|
+
import { list } from '../db.js';
|
|
8
|
+
import { isPassEnvName, passEnvTarget } from './command.js';
|
|
9
|
+
/**
|
|
10
|
+
* Names that look like a credential. A match stays out of the test process. This is a net for names nobody
|
|
11
|
+
* listed; the names the server reads are in SERVER_CREDENTIALS, and a connection's header variable is added
|
|
12
|
+
* by connectionHeaderNames().
|
|
13
|
+
*/
|
|
14
|
+
export const CREDENTIAL_ENV = /TOKEN|SECRET|PASSWORD|PRIVATE|API_KEY|_KEY$|_HEADERS$|COOKIE|^AWS_|^GITHUB_|^JIRA_|^LINEAR_|^ANTHROPIC_|^NTFY_|^OPENAI_|^SLACK_|^ELEVENLABS_|^LOCALDOST_/i;
|
|
15
|
+
/**
|
|
16
|
+
* The model and integration credentials the localdost server reads from its own environment. Each one is held back
|
|
17
|
+
* by name, so a rename of the pattern above cannot let one through. A name the server starts reading and the
|
|
18
|
+
* pattern misses fails the drift check in test/runner-env.test.ts.
|
|
19
|
+
*/
|
|
20
|
+
export const SERVER_CREDENTIALS = [
|
|
21
|
+
// Server access and stored secrets.
|
|
22
|
+
'LOCALDOST_TOKEN',
|
|
23
|
+
'LOCALDOST_SECRET_KEY',
|
|
24
|
+
// Model accounts.
|
|
25
|
+
'ANTHROPIC_API_KEY',
|
|
26
|
+
'CLAUDE_CODE_OAUTH_TOKEN',
|
|
27
|
+
'OPENAI_API_KEY',
|
|
28
|
+
// GitHub.
|
|
29
|
+
'GITHUB_TOKEN',
|
|
30
|
+
'GITHUB_APP_ID',
|
|
31
|
+
'GITHUB_PRIVATE_KEY',
|
|
32
|
+
'GITHUB_WEBHOOK_SECRET',
|
|
33
|
+
// Trackers, Slack, phone push.
|
|
34
|
+
'JIRA_EMAIL',
|
|
35
|
+
'JIRA_API_TOKEN',
|
|
36
|
+
'JIRA_WEBHOOK_SECRET',
|
|
37
|
+
'LINEAR_API_KEY',
|
|
38
|
+
'LINEAR_WEBHOOK_SECRET',
|
|
39
|
+
'SLACK_BOT_TOKEN',
|
|
40
|
+
'SLACK_APP_TOKEN',
|
|
41
|
+
'NTFY_TOKEN',
|
|
42
|
+
'VAPID_PRIVATE_KEY',
|
|
43
|
+
// TinyBee: where the laptop's device key lives.
|
|
44
|
+
'TINYBEE_DEVICE_KEY_PATH',
|
|
45
|
+
'TINYBEE_STATE_PATH',
|
|
46
|
+
'HIVE_ADMIN_TOKEN',
|
|
47
|
+
'HIVE_JWT_PRIVATE_KEY',
|
|
48
|
+
'HIVE_VAPID_PRIVATE_KEY',
|
|
49
|
+
'CF_API_TOKEN',
|
|
50
|
+
// AI-Vision, Midscene, and the Katalon MCP connection.
|
|
51
|
+
'AIVISION_INTERNAL_TOKEN',
|
|
52
|
+
'VEESAN_SESSION_COOKIE',
|
|
53
|
+
'VEESAN_USER',
|
|
54
|
+
'VEESAN_PASSWORD',
|
|
55
|
+
'MIDSCENE_MODEL_API_KEY',
|
|
56
|
+
'KATALON_MCP_HEADERS',
|
|
57
|
+
// The True Platform sync (KAT-406): the API key, or the path of the file that holds it. Both stay on the server.
|
|
58
|
+
'LOCALDOST_KATALON_API_KEY',
|
|
59
|
+
'LOCALDOST_KATALON_API_KEY_FILE',
|
|
60
|
+
];
|
|
61
|
+
/** The localdost server's own listen address. A test project that reads PORT would start its app on the port of localdost (KAT-97). */
|
|
62
|
+
const SERVER_ENV = new Set(['PORT', 'HOST']);
|
|
63
|
+
/**
|
|
64
|
+
* Env var names that hold request headers for an MCP connection: the one every preset names (headersEnv) and
|
|
65
|
+
* the one each saved connection names (headersSecretRef). The value is JSON with a bearer token in it, so no name
|
|
66
|
+
* pattern is enough: a person may call it anything.
|
|
67
|
+
*/
|
|
68
|
+
export function connectionHeaderNames() {
|
|
69
|
+
const out = new Set();
|
|
70
|
+
for (const p of PRESETS)
|
|
71
|
+
if (p.headersEnv)
|
|
72
|
+
out.add(p.headersEnv);
|
|
73
|
+
try {
|
|
74
|
+
for (const c of listConnections())
|
|
75
|
+
if (c.headersSecretRef)
|
|
76
|
+
out.add(c.headersSecretRef);
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
/* no connection table yet: the presets above still hold */
|
|
80
|
+
}
|
|
81
|
+
return out;
|
|
82
|
+
}
|
|
83
|
+
/** The variables the AI-Vision server backend reads when a dot names none of its own (src/runner/aivision/server.ts). */
|
|
84
|
+
const AIVISION_AUTH_DEFAULTS = ['AIVISION_INTERNAL_TOKEN', 'VEESAN_SESSION_COOKIE', 'VEESAN_USER', 'VEESAN_PASSWORD'];
|
|
85
|
+
/**
|
|
86
|
+
* The AI-Vision sign-in variables of the server: the default names, and each name a dot gives in runner.aivision as
|
|
87
|
+
* tokenEnv, cookieEnv, userEnv or passwordEnv. The server reads them from its own environment to sign in to the
|
|
88
|
+
* AI-Vision server, and a dot may call them anything under AIVISION_ or VEESAN_, so no name pattern is enough.
|
|
89
|
+
* Archived dots count: the variable is still on the host.
|
|
90
|
+
*/
|
|
91
|
+
export function aivisionAuthNames() {
|
|
92
|
+
const out = new Set(AIVISION_AUTH_DEFAULTS);
|
|
93
|
+
try {
|
|
94
|
+
for (const w of list('watches')) {
|
|
95
|
+
const o = w.runner?.aivision;
|
|
96
|
+
if (!o)
|
|
97
|
+
continue;
|
|
98
|
+
for (const name of [o.tokenEnv, o.cookieEnv, o.userEnv, o.passwordEnv])
|
|
99
|
+
if (typeof name === 'string' && name.trim())
|
|
100
|
+
out.add(name.trim());
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
/* no dots table yet: the default names above still hold */
|
|
105
|
+
}
|
|
106
|
+
return out;
|
|
107
|
+
}
|
|
108
|
+
/** The names held back by exact match: the server's credentials, every connection's header variable, and the AI-Vision sign-in variables. */
|
|
109
|
+
export function heldBackNames() {
|
|
110
|
+
return new Set([...SERVER_CREDENTIALS, ...connectionHeaderNames(), ...aivisionAuthNames()]);
|
|
111
|
+
}
|
|
112
|
+
/** True when a test process must not see this variable. `held` defaults to heldBackNames(). */
|
|
113
|
+
export function isCredentialName(name, held = heldBackNames()) {
|
|
114
|
+
return CREDENTIAL_ENV.test(name) || held.has(name);
|
|
115
|
+
}
|
|
116
|
+
/** The host environment minus anything that holds a credential, and minus the server's PORT and HOST. */
|
|
117
|
+
export function hostVars(env = process.env) {
|
|
118
|
+
const held = heldBackNames();
|
|
119
|
+
const out = {};
|
|
120
|
+
for (const [k, v] of Object.entries(env))
|
|
121
|
+
if (v !== undefined && !isCredentialName(k, held) && !SERVER_ENV.has(k))
|
|
122
|
+
out[k] = v;
|
|
123
|
+
return out;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* The test login a dot passes on: each name in runner.passEnv that is set on the host, under the name the test sees
|
|
127
|
+
* (`LOCALDOST_TEST_USER` becomes `TEST_USER`). Added after hostVars(), which holds back every LOCALDOST_ name. A name that does not
|
|
128
|
+
* start with LOCALDOST_TEST_ is dropped here as well as at save, so a row edited by hand cannot forward GITHUB_TOKEN.
|
|
129
|
+
*/
|
|
130
|
+
export function passEnvVars(names, env = process.env) {
|
|
131
|
+
const out = {};
|
|
132
|
+
for (const name of names ?? []) {
|
|
133
|
+
const v = isPassEnvName(name) ? env[name] : undefined;
|
|
134
|
+
if (v !== undefined && v !== '')
|
|
135
|
+
out[passEnvTarget(name)] = v;
|
|
136
|
+
}
|
|
137
|
+
return out;
|
|
138
|
+
}
|
|
139
|
+
/** A name that says the value is a user or an email: `TEST_USER`, `TEST_ADMIN_EMAIL`. Not a secret, unless the name also says password, token or key. */
|
|
140
|
+
const IDENTIFIER_NAME = /(?:^|_)(?:USER|USERNAME|EMAIL)(?:_|$)/;
|
|
141
|
+
const SECRET_NAME = /PASS|SECRET|TOKEN|KEY|CREDENTIAL|(?:^|_)(?:PWD|PIN|OTP)(?:_|$)/;
|
|
142
|
+
/**
|
|
143
|
+
* Masks the values of the test login in text a person or a PR comment may read. Playwright's call log of a failed fill()
|
|
144
|
+
* prints the value it typed, so a password would reach the run page and a comment through the error text. A value of
|
|
145
|
+
* fewer than 4 characters is left alone: masking it would damage every line. The value of a user or email variable is
|
|
146
|
+
* left alone as well: a user called `admin` would turn every `/admin/users` in an error line into `[redacted]/users`, and a
|
|
147
|
+
* user name is no secret. Any other name is masked, so an odd name stays safe.
|
|
148
|
+
*/
|
|
149
|
+
export function valueMasker(vars) {
|
|
150
|
+
const masked = Object.entries(vars).filter(([name]) => !(IDENTIFIER_NAME.test(name.toUpperCase()) && !SECRET_NAME.test(name.toUpperCase())));
|
|
151
|
+
const secrets = [...new Set(masked.map(([, v]) => v))].filter((v) => v.length >= 4).sort((a, b) => b.length - a.length);
|
|
152
|
+
if (!secrets.length)
|
|
153
|
+
return (text) => text;
|
|
154
|
+
return (text) => secrets.reduce((acc, v) => acc.split(v).join('[redacted]'), text);
|
|
155
|
+
}
|
|
156
|
+
/** The dot form's view of runner.passEnv: each valid name, what the test sees it as, and whether the host has it set. Never a value. */
|
|
157
|
+
export function passEnvStatus(names, env = process.env) {
|
|
158
|
+
return names.filter(isPassEnvName).map((name) => ({ name, as: passEnvTarget(name), set: !!env[name] }));
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=host-env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-env.js","sourceRoot":"","sources":["../../src/runner/host-env.ts"],"names":[],"mappings":"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"}
|