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,128 @@
|
|
|
1
|
+
// Intent awareness (dogfood ledger: "A defect for behavior the PR says it changes on purpose"). The PR body, the
|
|
2
|
+
// linked ticket and the repo docs state decisions ("decided", "by design", "behavior change", "intended"). A
|
|
3
|
+
// finding that matches such a statement is a behavior change for the team to confirm, never a bug, a risk to
|
|
4
|
+
// test, or a defect. Pure functions: the flow collects the texts (src/flows/intent-sources.ts).
|
|
5
|
+
const MARKER = /\b(?:decided|decision|by design|behaviou?r change[sd]?|changes? (?:the )?behaviou?r|intended|intentional(?:ly)?|on purpose|deliberate(?:ly)?|as designed|expected behaviou?r|breaking change|fail[- ]closed|now (?:refuses?|rejects?|requires?|skips?|blocks?)|(?:is|are|stays?) (?:off|disabled) by default|no longer)\b/i;
|
|
6
|
+
const STOP = new Set('a an the and or but not no nor of to in on at by for from with without into onto over under than then this that these those it its is are was were be been being has have had do does did can could will would should may might must now when while if else so such any all each every some only also just more most less few one two out up down off our we you they them their there here what which who whom how why where after before about again same other own very too new old get gets got make makes made via per pr prs change changes changed'.split(' '));
|
|
7
|
+
/** Lowercase content words, with a light stem so "refused", "refuses" and "refuse" meet. */
|
|
8
|
+
export function contentWords(text) {
|
|
9
|
+
const out = new Set();
|
|
10
|
+
for (const raw of text.toLowerCase().split(/[^a-z0-9]+/)) {
|
|
11
|
+
if (raw.length < 3 || STOP.has(raw) || /^\d+$/.test(raw))
|
|
12
|
+
continue;
|
|
13
|
+
out.add(raw.replace(/(?:ing|ed|es|s)$/, '').replace(/e$/, '') || raw);
|
|
14
|
+
}
|
|
15
|
+
return out;
|
|
16
|
+
}
|
|
17
|
+
/** Sentences (and list items) of a text, without Markdown noise. */
|
|
18
|
+
function sentences(text) {
|
|
19
|
+
return text
|
|
20
|
+
.replace(/\r\n?/g, '\n')
|
|
21
|
+
.replace(/<!--[\s\S]*?-->/g, ' ')
|
|
22
|
+
.split(/\n\s*[-*+]\s+|\n{2,}|(?<=[.!?])\s+(?=[A-Z(])|\n(?=#)/)
|
|
23
|
+
.map((s) => s
|
|
24
|
+
.replace(/^[#>\s*-]+/, '')
|
|
25
|
+
.replace(/\s+/g, ' ')
|
|
26
|
+
.trim())
|
|
27
|
+
.filter((s) => s.length >= 12 && s.length <= 600);
|
|
28
|
+
}
|
|
29
|
+
/** The statements of intent in the PR body, the linked tickets and the docs. */
|
|
30
|
+
export function intentStatements(sources) {
|
|
31
|
+
const out = [];
|
|
32
|
+
const seen = new Set();
|
|
33
|
+
for (const s of sources) {
|
|
34
|
+
for (const text of sentences(s.text ?? '')) {
|
|
35
|
+
if (!MARKER.test(text) || seen.has(text.toLowerCase()))
|
|
36
|
+
continue;
|
|
37
|
+
seen.add(text.toLowerCase());
|
|
38
|
+
out.push({ source: s.source, ref: s.ref, text: text.length > 300 ? `${text.slice(0, 297)}...` : text });
|
|
39
|
+
if (out.length >= 40)
|
|
40
|
+
return out;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return out;
|
|
44
|
+
}
|
|
45
|
+
// What happens, in the words of a decision or of a result. "neg": the thing is gone, refused, blocked or does
|
|
46
|
+
// not happen. "pos": it is there, shown, accepted or happens. The first of either in a text is the one that counts.
|
|
47
|
+
const NEG = /\b(?:no longer|cannot|can't|can not|(?:do|does|did)(?:n't| not)|never|not (?:run|shown|visible|displayed|present|sent|posted|allowed|created|accepted|available|enabled|started|available)|fail(?:s|ed)?[- ]closed|refus\w*|reject\w*|den(?:y|ies|ied)|block\w*|disabl\w*|remov\w*|drop(?:s|ped)?|delet\w*|hidden|hides?|hid|absent|missing|gone|lose[s]?|lost|skip\w*|stop(?:s|ped)?|off by default|off|requires?|required|40[13])\b/i;
|
|
48
|
+
const POS = /\b(?:add(?:s|ed)?|enabl\w*|show(?:s|n|ed)?|display\w*|visible|present|appears?|post(?:s|ed)?|sends?|sent|runs?|ran|allow\w*|accept\w*|keeps?|kept|still|on by default|creates?|created|returns?|200)\b/i;
|
|
49
|
+
/** The first thing a text says happens or does not happen, or null when it says neither. */
|
|
50
|
+
function polarityOf(text) {
|
|
51
|
+
if (!text)
|
|
52
|
+
return null;
|
|
53
|
+
const n = NEG.exec(text);
|
|
54
|
+
const p = POS.exec(text);
|
|
55
|
+
if (n && (!p || n.index <= p.index))
|
|
56
|
+
return 'neg';
|
|
57
|
+
return p ? 'pos' : null;
|
|
58
|
+
}
|
|
59
|
+
/** Words that only label a sentence as a decision; they name neither the thing nor what happens to it. */
|
|
60
|
+
const LABEL = /\b(?:decided|decision|by design|behaviou?r change[sd]?|changes? (?:the )?behaviou?r|intended|intentional(?:ly)?|on purpose|deliberate(?:ly)?|as designed|expected behaviou?r|breaking change)\b/gi;
|
|
61
|
+
const PREPOSITION = /\b(?:without|with|from|for|of|in|on|at|by|to|when|while|if|unless|because|so|that|which|via|into|onto|over|under|after|before)\b/i;
|
|
62
|
+
/** Verbs that link a subject to what happens to it ("the fallback stays off"); they are not part of the subject. */
|
|
63
|
+
const LINKING_TAIL = /(?:\s+\b(?:is|are|was|were|be|been|stays?|stayed|remains?|remained|gets?|got|will|would|should|now|just|also|then)\b)+\s*$/i;
|
|
64
|
+
/** The subject of a decision sentence and what it says happens to it, or null when it names no behavior. */
|
|
65
|
+
function parseDecision(text) {
|
|
66
|
+
const t = text
|
|
67
|
+
.replace(LABEL, ' ')
|
|
68
|
+
.replace(/^[\s:,;-]+/, '')
|
|
69
|
+
.replace(/\s+/g, ' ')
|
|
70
|
+
.trim();
|
|
71
|
+
const n = NEG.exec(t);
|
|
72
|
+
const p = POS.exec(t);
|
|
73
|
+
const first = n && (!p || n.index <= p.index) ? n : p;
|
|
74
|
+
if (!first)
|
|
75
|
+
return null;
|
|
76
|
+
const polarity = first === n ? 'neg' : 'pos';
|
|
77
|
+
// The subject comes before the verb ("Discount banner removed ..."); "remove the discount banner" has it after.
|
|
78
|
+
let phrase = t.slice(0, first.index).replace(LINKING_TAIL, '');
|
|
79
|
+
if (!contentWords(phrase).size)
|
|
80
|
+
phrase = t.slice(first.index + first[0].length);
|
|
81
|
+
const subject = [...contentWords(phrase)].filter((w) => w !== 'default');
|
|
82
|
+
const noun = [...contentWords(phrase.split(PREPOSITION)[0] ?? '')].filter((w) => w !== 'default');
|
|
83
|
+
const head = noun.at(-1) ?? subject.at(-1);
|
|
84
|
+
return head ? { subject, head, polarity } : null;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* The statement a finding matches, or null. A match needs both parts (KAT-310):
|
|
88
|
+
* - the subject: the decision's thing (its head noun and at least half of its words) is what the finding is about, and
|
|
89
|
+
* - the changed behavior: what the finding's actual result says happens agrees with what the decision says now happens.
|
|
90
|
+
* "Webhooks without a secret are refused" meets "Behavior change: webhooks without a secret are now refused with 401".
|
|
91
|
+
* "The cart total shows the wrong discount" does not meet "Discount banner removed from the cart": it is about the
|
|
92
|
+
* total, not the banner, and it says something is shown where the decision says it is gone. A failed test whose
|
|
93
|
+
* received value contradicts the decision is a bug, and so is a failed test with no result to compare.
|
|
94
|
+
*/
|
|
95
|
+
export function matchIntent(f, statements) {
|
|
96
|
+
if (!statements.length)
|
|
97
|
+
return null;
|
|
98
|
+
const title = contentWords(f.title);
|
|
99
|
+
const all = contentWords(`${f.title} ${f.actual ?? ''} ${f.expected ?? ''} ${f.why ?? ''}`);
|
|
100
|
+
// The result: what actually happens. A review risk without a stated result is read from its title, which names the
|
|
101
|
+
// behavior; a reproduced failure's title names the expectation, so it says nothing about the result.
|
|
102
|
+
const result = polarityOf(f.actual) ?? (f.reproduced ? null : polarityOf(f.title));
|
|
103
|
+
if (!result)
|
|
104
|
+
return null;
|
|
105
|
+
let best = null;
|
|
106
|
+
for (const s of statements) {
|
|
107
|
+
const d = parseDecision(s.text);
|
|
108
|
+
if (!d || d.polarity !== result || !all.has(d.head))
|
|
109
|
+
continue;
|
|
110
|
+
const covered = d.subject.filter((w) => all.has(w)).length;
|
|
111
|
+
if (covered * 2 < d.subject.length || !d.subject.some((w) => title.has(w)))
|
|
112
|
+
continue;
|
|
113
|
+
const score = covered * 2 + d.subject.filter((w) => title.has(w)).length;
|
|
114
|
+
if (!best || score > best.score)
|
|
115
|
+
best = { s, score };
|
|
116
|
+
}
|
|
117
|
+
return best?.s ?? null;
|
|
118
|
+
}
|
|
119
|
+
const SOURCE_WORD = { pr_body: 'The PR description', ticket: 'Ticket', docs: 'The docs' };
|
|
120
|
+
/** "The PR description says", "Ticket KAT-210 says", "The docs (docs/SECURITY.md) say". */
|
|
121
|
+
export function intentWhere(s) {
|
|
122
|
+
if (s.source === 'ticket')
|
|
123
|
+
return `Ticket ${s.ref} says`;
|
|
124
|
+
if (s.source === 'docs')
|
|
125
|
+
return `${SOURCE_WORD.docs} (${s.ref}) say`;
|
|
126
|
+
return `${SOURCE_WORD.pr_body} says`;
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=intent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intent.js","sourceRoot":"","sources":["../../src/review/intent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
// Portions adapted from OpenQodex (https://github.com/openqodex/openqodex),
|
|
2
|
+
// Copyright 2026 The OpenQodex Authors, licensed under the Apache License 2.0
|
|
3
|
+
// (LICENSES/Apache-2.0.txt). Source: packages/core/src/lenses.ts (Markdown lens
|
|
4
|
+
// files with YAML frontmatter, confidence floors, most specific first, at most 4
|
|
5
|
+
// bodies per brief) at 549d330.
|
|
6
|
+
// Changed by localdost in 2026: lenses match per changed line so every signal has a
|
|
7
|
+
// citation, carry a signal kind and a severity hint, may match removed text or a file
|
|
8
|
+
// class, and the body adds a "What to test" section.
|
|
9
|
+
import { readdirSync, readFileSync, existsSync } from 'node:fs';
|
|
10
|
+
import { join } from 'node:path';
|
|
11
|
+
import { ROOT } from '../config.js';
|
|
12
|
+
import { anyGlob } from './glob.js';
|
|
13
|
+
import { parseYaml, splitFrontmatter } from './yaml.js';
|
|
14
|
+
/** Source folder in a checkout; dist/agent/qa-lenses when the build copies the files there (Docker runtime). */
|
|
15
|
+
export const DEFAULT_LENS_DIR = [join(ROOT, 'src', 'agent', 'qa-lenses'), join(ROOT, 'dist', 'agent', 'qa-lenses')].find((d) => existsSync(d)) ?? join(ROOT, 'src', 'agent', 'qa-lenses');
|
|
16
|
+
export const MAX_LENS_BODIES = 4;
|
|
17
|
+
const KINDS = new Set([
|
|
18
|
+
'tests_untouched',
|
|
19
|
+
'uncovered_lines',
|
|
20
|
+
'test_disabled',
|
|
21
|
+
'assertion_removed',
|
|
22
|
+
'test_config_changed',
|
|
23
|
+
'selector_drift',
|
|
24
|
+
'route_changed',
|
|
25
|
+
'response_shape',
|
|
26
|
+
'money',
|
|
27
|
+
'auth',
|
|
28
|
+
'dates',
|
|
29
|
+
'concurrency',
|
|
30
|
+
'migration',
|
|
31
|
+
'feature_flag',
|
|
32
|
+
'config_env',
|
|
33
|
+
'public_api',
|
|
34
|
+
'validation_changed',
|
|
35
|
+
'guard_removed',
|
|
36
|
+
'ui_state',
|
|
37
|
+
'i18n_text',
|
|
38
|
+
'dependency_bump',
|
|
39
|
+
'large_change',
|
|
40
|
+
'attacker_choice',
|
|
41
|
+
'path_safety',
|
|
42
|
+
'delete_in_flight',
|
|
43
|
+
'caller_access',
|
|
44
|
+
'changed_contract',
|
|
45
|
+
'temp_cleanup',
|
|
46
|
+
'time_dependent_test',
|
|
47
|
+
'open_status',
|
|
48
|
+
]);
|
|
49
|
+
const SEVERITY_WEIGHT = { critical: 3, high: 3, medium: 2, low: 1 };
|
|
50
|
+
function str(v) {
|
|
51
|
+
return typeof v === 'string' ? v : typeof v === 'number' ? String(v) : undefined;
|
|
52
|
+
}
|
|
53
|
+
function strList(v) {
|
|
54
|
+
if (Array.isArray(v))
|
|
55
|
+
return v.map((x) => str(x)).filter((x) => !!x);
|
|
56
|
+
const s = str(v);
|
|
57
|
+
return s ? [s] : [];
|
|
58
|
+
}
|
|
59
|
+
function regex(src, flags, what, file) {
|
|
60
|
+
if (!src)
|
|
61
|
+
return undefined;
|
|
62
|
+
try {
|
|
63
|
+
return new RegExp(src, flags.replace(/[^imsu]/g, ''));
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
throw new Error(`${file}: ${what} is not a valid regex: ${err.message}`, { cause: err });
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/** Removes HTML comments (license notices) so they never reach a prompt. */
|
|
70
|
+
export function stripHtmlComments(text) {
|
|
71
|
+
return text
|
|
72
|
+
.replace(/<!--[\s\S]*?-->/g, '')
|
|
73
|
+
.replace(/\n{3,}/g, '\n\n')
|
|
74
|
+
.trim();
|
|
75
|
+
}
|
|
76
|
+
export function parseLens(text, path = '(inline)') {
|
|
77
|
+
const { frontmatter, body } = splitFrontmatter(text);
|
|
78
|
+
if (frontmatter === null)
|
|
79
|
+
throw new Error(`${path}: lens has no YAML frontmatter`);
|
|
80
|
+
const fm = parseYaml(frontmatter);
|
|
81
|
+
if (!fm || typeof fm !== 'object' || Array.isArray(fm))
|
|
82
|
+
throw new Error(`${path}: frontmatter is not a map`);
|
|
83
|
+
const name = str(fm.name);
|
|
84
|
+
if (!name || !/^[a-z0-9][a-z0-9-]*$/.test(name))
|
|
85
|
+
throw new Error(`${path}: name must be kebab-case`);
|
|
86
|
+
const kind = str(fm.kind);
|
|
87
|
+
if (!kind || !KINDS.has(kind))
|
|
88
|
+
throw new Error(`${path}: kind "${kind ?? ''}" is not a signal kind`);
|
|
89
|
+
const triggers = (fm.triggers && typeof fm.triggers === 'object' && !Array.isArray(fm.triggers) ? fm.triggers : {});
|
|
90
|
+
const flags = str(triggers.line_flags) ?? '';
|
|
91
|
+
const severityHint = (str(fm.severity_hint) ?? 'medium');
|
|
92
|
+
if (!(severityHint in SEVERITY_WEIGHT))
|
|
93
|
+
throw new Error(`${path}: severity_hint must be critical, high, medium or low`);
|
|
94
|
+
const floor = typeof fm.confidence_floor === 'number' ? fm.confidence_floor : 0.6;
|
|
95
|
+
if (floor < 0 || floor > 1)
|
|
96
|
+
throw new Error(`${path}: confidence_floor must be between 0 and 1`);
|
|
97
|
+
const lens = {
|
|
98
|
+
name,
|
|
99
|
+
kind,
|
|
100
|
+
description: str(fm.description) ?? '',
|
|
101
|
+
files: strList(triggers.files),
|
|
102
|
+
lineRegex: regex(str(triggers.line_regex), flags, 'line_regex', path),
|
|
103
|
+
removedRegex: regex(str(triggers.removed_regex), flags, 'removed_regex', path),
|
|
104
|
+
classes: strList(triggers.classes),
|
|
105
|
+
floor,
|
|
106
|
+
severityHint,
|
|
107
|
+
weight: typeof fm.weight === 'number' ? fm.weight : SEVERITY_WEIGHT[severityHint],
|
|
108
|
+
skipComments: fm.skip_comments !== false,
|
|
109
|
+
body: stripHtmlComments(body),
|
|
110
|
+
path,
|
|
111
|
+
};
|
|
112
|
+
if (!lens.lineRegex && !lens.removedRegex && !lens.classes.length)
|
|
113
|
+
throw new Error(`${path}: lens needs line_regex, removed_regex or classes`);
|
|
114
|
+
return lens;
|
|
115
|
+
}
|
|
116
|
+
const loaded = new Map();
|
|
117
|
+
/** Loads every *.md lens in a folder, sorted by name. Cached per folder. Throws on a broken lens. */
|
|
118
|
+
export function loadLenses(dir = DEFAULT_LENS_DIR) {
|
|
119
|
+
const hit = loaded.get(dir);
|
|
120
|
+
if (hit)
|
|
121
|
+
return hit;
|
|
122
|
+
if (!existsSync(dir)) {
|
|
123
|
+
loaded.set(dir, []);
|
|
124
|
+
return [];
|
|
125
|
+
}
|
|
126
|
+
const out = readdirSync(dir)
|
|
127
|
+
.filter((f) => f.endsWith('.md') && !f.startsWith('_') && f.toLowerCase() !== 'readme.md')
|
|
128
|
+
.sort()
|
|
129
|
+
.map((f) => parseLens(readFileSync(join(dir, f), 'utf8'), join(dir, f)));
|
|
130
|
+
const names = new Set();
|
|
131
|
+
for (const l of out) {
|
|
132
|
+
if (names.has(l.name))
|
|
133
|
+
throw new Error(`Duplicate lens name ${l.name} in ${dir}`);
|
|
134
|
+
names.add(l.name);
|
|
135
|
+
}
|
|
136
|
+
loaded.set(dir, out);
|
|
137
|
+
return out;
|
|
138
|
+
}
|
|
139
|
+
export function lensReadsFile(lens, path) {
|
|
140
|
+
return !lens.files.length || anyGlob(path, lens.files);
|
|
141
|
+
}
|
|
142
|
+
/** Lines that hold only a comment, in the common languages. */
|
|
143
|
+
export function isCommentOnly(text) {
|
|
144
|
+
const t = text.trim();
|
|
145
|
+
return /^(\/\/|\/\*|\*(?!\*?\s*[=;])|\*\/|#(?!include|!|\[)|--(?!-)|<!--|;;)/.test(t);
|
|
146
|
+
}
|
|
147
|
+
/** A glob is specific when it names more than an extension (`src/billing/**` versus `**\/*.ts`). */
|
|
148
|
+
function specificity(lens) {
|
|
149
|
+
if (!lens.files.length)
|
|
150
|
+
return 0;
|
|
151
|
+
const specific = lens.files.filter((g) => !/^\*\*\/\*\.[\w{},]+$/.test(g) && !/^\*\.[\w{},]+$/.test(g)).length;
|
|
152
|
+
return specific / lens.files.length;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Picks the lens bodies for the prompt: lenses with at least one shown signal, most
|
|
156
|
+
* specific first, then heavier, then more hits, then by name. At most MAX_LENS_BODIES.
|
|
157
|
+
*/
|
|
158
|
+
export function selectLenses(lenses, hits, max = MAX_LENS_BODIES) {
|
|
159
|
+
return lenses
|
|
160
|
+
.filter((l) => (hits.get(l.name) ?? 0) > 0)
|
|
161
|
+
.sort((a, b) => specificity(b) - specificity(a) || b.weight - a.weight || (hits.get(b.name) ?? 0) - (hits.get(a.name) ?? 0) || (a.name < b.name ? -1 : 1))
|
|
162
|
+
.slice(0, max);
|
|
163
|
+
}
|
|
164
|
+
export function toPromptLens(l) {
|
|
165
|
+
return { name: l.name, description: l.description, floor: l.floor, body: l.body };
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=lenses.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lenses.js","sourceRoot":"","sources":["../../src/review/lenses.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
// KAT-388: the PR review reads the tickets the PR links. Until now the reviewer saw the PR body and nothing else, so a
|
|
2
|
+
// change that missed half of a ticket's acceptance criteria looked complete. This module finds the linked tickets the way
|
|
3
|
+
// the merge flow does (closing keywords and references recorded in the links table), adds the cross-repo refs of the PR
|
|
4
|
+
// text and the branch name ("katalon-studio/product#123"), reads each ticket through the dot's tracker or the GitHub
|
|
5
|
+
// client, and cuts every field so the block stays small. Every read is best effort: a ticket that cannot be read is
|
|
6
|
+
// listed under Details and the review runs without it.
|
|
7
|
+
//
|
|
8
|
+
// The ticket text is untrusted data. It reaches the prompt only inside a fence (renderLinkedTickets in
|
|
9
|
+
// src/agent/qa-prompts.ts) and the comment shows the ticket's key, its title and short quotes of the criteria.
|
|
10
|
+
import { get } from '../db.js';
|
|
11
|
+
import { githubMode } from '../integrations/github.js';
|
|
12
|
+
import { GithubHttpError, NotAnIssueError, issueAcceptanceCriteria, issueApi, issueRef, parseIssueRef, trackerRepos } from '../integrations/github-issues.js';
|
|
13
|
+
import { jiraFor } from '../integrations/jira.js';
|
|
14
|
+
import { teamIds } from '../lead.js';
|
|
15
|
+
import { linearFor } from '../integrations/linear.js';
|
|
16
|
+
import { linksFor, parseClosingRefs, parseMentionedRefs, prTextOf } from '../links.js';
|
|
17
|
+
import { watchRepos } from '../repos.js';
|
|
18
|
+
/** Tickets one review reads. */
|
|
19
|
+
export const MAX_LINKED_TICKETS = 3;
|
|
20
|
+
/** Criteria of one ticket the reviewer sees. */
|
|
21
|
+
export const MAX_CRITERIA = 12;
|
|
22
|
+
export const MAX_CRITERION_CHARS = 200;
|
|
23
|
+
export const MAX_TITLE_CHARS = 160;
|
|
24
|
+
export const MAX_BODY_CHARS = 2000;
|
|
25
|
+
const MAX_LABELS = 8;
|
|
26
|
+
const READ_TIMEOUT_MS = 8000;
|
|
27
|
+
// ---------- discovery ----------
|
|
28
|
+
/** `owner/name#N` in a branch name: the owner may follow a slash ("feat/katalon-studio/product#123"). */
|
|
29
|
+
const BRANCH_REF = /(?:^|\/)([\w.-]+)\/([\w.-]+)#(\d+)(?![\w/])/g;
|
|
30
|
+
/** Issue refs a branch name holds, lower case "owner/name#N". A bare number in a branch is no ref: it could be anything. */
|
|
31
|
+
export function branchRefs(branch) {
|
|
32
|
+
const out = new Set();
|
|
33
|
+
for (const m of (branch ?? '').matchAll(BRANCH_REF))
|
|
34
|
+
out.add(issueRef(`${m[1]}/${m[2]}`, m[3]));
|
|
35
|
+
return [...out];
|
|
36
|
+
}
|
|
37
|
+
/** A GitHub ref stays lower case; a Jira or Linear key is upper case. */
|
|
38
|
+
function normalize(ref) {
|
|
39
|
+
const gh = parseIssueRef(ref);
|
|
40
|
+
return gh ? issueRef(gh.full, gh.number) : ref.trim().toUpperCase();
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Whether a repo's issues may be read because the PR text or branch names them. The PR author writes both, so a name
|
|
44
|
+
* alone must not pick any repo the token can read: the repo has to be a repo of the dot or a repo of its GitHub tracker.
|
|
45
|
+
* Sharing an owner with the PR is not enough, since an owner may hold repos that are private to other teams. A closing
|
|
46
|
+
* keyword is written by the same author, so it gets the same check (KAT-388).
|
|
47
|
+
*/
|
|
48
|
+
function mentionInScope(watch, ev, ref) {
|
|
49
|
+
const gh = parseIssueRef(ref);
|
|
50
|
+
if (!gh)
|
|
51
|
+
return false;
|
|
52
|
+
const full = gh.full.toLowerCase();
|
|
53
|
+
if (trackerRepos(watch).includes(full) || watchRepos(watch).some((r) => r.id.toLowerCase() === full))
|
|
54
|
+
return true;
|
|
55
|
+
// A dot in a team also reads the tickets of its lead's trackers (KAT-405): PR Reviewer has no tracker of its own, and its PRs name
|
|
56
|
+
// katalon-studio/product tickets. The repo must still be a tracker repo of a member, never any repo the PR text names.
|
|
57
|
+
return teamIds(watch.id)
|
|
58
|
+
.filter((id) => id !== watch.id)
|
|
59
|
+
.some((id) => {
|
|
60
|
+
const m = get('watches', id);
|
|
61
|
+
return !!m && trackerRepos(m).includes(full);
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* The tickets a PR links, most certain first, at most three: what it closes (keywords in the title and body, the
|
|
66
|
+
* Development sidebar), what it references (ticket keys, issues), then issues the text or the branch only mentions.
|
|
67
|
+
* Reads no network: the links table already holds the closes and references of recordPrLinks. A fork PR links none.
|
|
68
|
+
*/
|
|
69
|
+
export function linkedRefs(watch, ev) {
|
|
70
|
+
if (!ev.pr || !ev.repo)
|
|
71
|
+
return [];
|
|
72
|
+
// A fork PR is written by someone outside the repo. Its text could name any ticket the dot's token can read, and the
|
|
73
|
+
// review would then print that ticket's title and criteria in a public comment. A fork PR reads no ticket (KAT-388).
|
|
74
|
+
if (ev.pr.fork)
|
|
75
|
+
return [];
|
|
76
|
+
const full = `${ev.repo.owner}/${ev.repo.name}`;
|
|
77
|
+
const pr = issueRef(full, ev.pr.number);
|
|
78
|
+
const out = new Map();
|
|
79
|
+
// A Jira or Linear key has no repo and is the dot's own tracker; a GitHub issue of any kind must be in scope.
|
|
80
|
+
const add = (ref, via) => {
|
|
81
|
+
const r = normalize(ref);
|
|
82
|
+
if (!r || r.toLowerCase() === pr || out.has(r))
|
|
83
|
+
return;
|
|
84
|
+
if (parseIssueRef(r) && !mentionInScope(watch, ev, r))
|
|
85
|
+
return;
|
|
86
|
+
out.set(r, via);
|
|
87
|
+
};
|
|
88
|
+
const stored = linksFor(pr, watch.id).filter((l) => l.fromRef === pr);
|
|
89
|
+
for (const l of stored)
|
|
90
|
+
if (l.kind === 'closes')
|
|
91
|
+
add(l.toRef, 'closes');
|
|
92
|
+
for (const ref of parseClosingRefs(prTextOf(ev), full))
|
|
93
|
+
add(ref, 'closes');
|
|
94
|
+
for (const l of stored)
|
|
95
|
+
if (l.kind === 'references')
|
|
96
|
+
add(l.toRef, 'references');
|
|
97
|
+
for (const ref of parseMentionedRefs(prTextOf(ev)))
|
|
98
|
+
add(ref, 'mention');
|
|
99
|
+
for (const ref of branchRefs(ev.pr.headRef))
|
|
100
|
+
add(ref, 'mention');
|
|
101
|
+
return [...out].map(([ref, via]) => ({ ref, via })).slice(0, MAX_LINKED_TICKETS);
|
|
102
|
+
}
|
|
103
|
+
// ---------- criteria ----------
|
|
104
|
+
const BULLET = /^\s*(?:[-*+]|\d+[.)])\s+(?:\[[ xX]\]\s*)?/;
|
|
105
|
+
/**
|
|
106
|
+
* The criteria of an "Acceptance criteria" section as one line each: a list item is one criterion, an indented line
|
|
107
|
+
* continues the item above it, and a text with no list items gives one criterion per line. At most twelve, each cut.
|
|
108
|
+
*/
|
|
109
|
+
export function splitCriteria(text) {
|
|
110
|
+
const lines = (text ?? '')
|
|
111
|
+
.split(/\r?\n/)
|
|
112
|
+
.map((l) => l.replace(/\s+$/, ''))
|
|
113
|
+
.filter((l) => l.trim() && !/^\s*#{1,6}\s/.test(l) && l.trim() !== '_No response_');
|
|
114
|
+
const items = [];
|
|
115
|
+
const listed = lines.some((l) => BULLET.test(l));
|
|
116
|
+
for (const l of lines) {
|
|
117
|
+
if (!listed || BULLET.test(l))
|
|
118
|
+
items.push(l.replace(BULLET, '').trim());
|
|
119
|
+
else if (items.length)
|
|
120
|
+
items[items.length - 1] += ` ${l.trim()}`;
|
|
121
|
+
}
|
|
122
|
+
return items
|
|
123
|
+
.map((i) => i.replace(/\s+/g, ' ').trim())
|
|
124
|
+
.filter(Boolean)
|
|
125
|
+
.slice(0, MAX_CRITERIA)
|
|
126
|
+
.map((i) => cut(i, MAX_CRITERION_CHARS));
|
|
127
|
+
}
|
|
128
|
+
function cut(text, max) {
|
|
129
|
+
const t = text.replace(/\s+/g, ' ').trim();
|
|
130
|
+
return t.length > max ? `${t.slice(0, max - 1).trimEnd()}…` : t;
|
|
131
|
+
}
|
|
132
|
+
const CRITERIA_HEADING = /^\s*(?:#{1,6}\s*)?(?:\*\*)?(?:acceptance criteria|criteria|definition of done)\b[^\n]*$/i;
|
|
133
|
+
/** The description with the criteria section's lines and its heading left out, so the reviewer reads each criterion once. */
|
|
134
|
+
function bodyWithout(description, criteria) {
|
|
135
|
+
if (!criteria)
|
|
136
|
+
return description;
|
|
137
|
+
const drop = new Set(criteria
|
|
138
|
+
.split(/\r?\n/)
|
|
139
|
+
.map((l) => l.trim())
|
|
140
|
+
.filter(Boolean));
|
|
141
|
+
return description
|
|
142
|
+
.split(/\r?\n/)
|
|
143
|
+
.filter((l) => !drop.has(l.trim()) && !CRITERIA_HEADING.test(l))
|
|
144
|
+
.join('\n');
|
|
145
|
+
}
|
|
146
|
+
/** Cuts a description to its limit and keeps the line breaks, so a list stays a list. */
|
|
147
|
+
function cutBlock(text, max) {
|
|
148
|
+
const t = text
|
|
149
|
+
.replace(/\r\n?/g, '\n')
|
|
150
|
+
.replace(/[ \t]+\n/g, '\n')
|
|
151
|
+
.replace(/\n{3,}/g, '\n\n')
|
|
152
|
+
.trim();
|
|
153
|
+
return t.length > max ? `${t.slice(0, max - 1).trimEnd()}…` : t;
|
|
154
|
+
}
|
|
155
|
+
/** Turns what a tracker returned into the reviewer's view of a ticket. */
|
|
156
|
+
export function toLinkedTicket(ref, t) {
|
|
157
|
+
const description = String(t.description ?? '');
|
|
158
|
+
const ac = t.acceptanceCriteria ?? (parseIssueRef(ref) ? issueAcceptanceCriteria(description) : undefined);
|
|
159
|
+
const criteria = splitCriteria(ac).map((text, i) => ({ id: `AC${i + 1}`, text }));
|
|
160
|
+
return {
|
|
161
|
+
ref,
|
|
162
|
+
title: cut(String(t.title ?? ''), MAX_TITLE_CHARS) || ref,
|
|
163
|
+
...(t.url ? { url: t.url } : {}),
|
|
164
|
+
...(t.state ? { state: t.state } : {}),
|
|
165
|
+
...((t.issueType ?? t.type) ? { type: String(t.issueType ?? t.type) } : {}),
|
|
166
|
+
labels: (t.labels ?? []).map((l) => cut(String(l), 50)).slice(0, MAX_LABELS),
|
|
167
|
+
...(t.milestone ? { milestone: cut(t.milestone, 80) } : {}),
|
|
168
|
+
body: cutBlock(bodyWithout(description, ac), MAX_BODY_CHARS),
|
|
169
|
+
criteria,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
// ---------- reading ----------
|
|
173
|
+
function isDemo(watch, ref) {
|
|
174
|
+
if (parseIssueRef(ref))
|
|
175
|
+
return githubMode() === 'demo';
|
|
176
|
+
const client = watch.tracker?.kind === 'linear' ? linearFor(watch) : jiraFor(watch);
|
|
177
|
+
return client.mode === 'demo';
|
|
178
|
+
}
|
|
179
|
+
/** The default reader: a GitHub issue through the GitHub client, a Jira or Linear key through the dot's tracker. */
|
|
180
|
+
export const readTicket = async (watch, ref) => {
|
|
181
|
+
const gh = parseIssueRef(ref);
|
|
182
|
+
if (gh)
|
|
183
|
+
return issueApi(gh.full).getIssue(gh.number);
|
|
184
|
+
return watch.tracker?.kind === 'linear' ? linearFor(watch).getIssue(ref) : jiraFor(watch).getIssue(ref);
|
|
185
|
+
};
|
|
186
|
+
/** The read failed because the number is no issue this token can see: 404, 410, or a pull request. */
|
|
187
|
+
function namesNoIssue(err) {
|
|
188
|
+
return err instanceof NotAnIssueError || (err instanceof GithubHttpError && (err.status === 404 || err.status === 410));
|
|
189
|
+
}
|
|
190
|
+
/** One short reason in plain words. Never the text of the error: a tracker's answer can hold anything. */
|
|
191
|
+
export function reasonOf(err) {
|
|
192
|
+
if (err instanceof NotAnIssueError)
|
|
193
|
+
return 'it is a pull request, not a ticket';
|
|
194
|
+
if (err instanceof GithubHttpError) {
|
|
195
|
+
if (err.status === 404 || err.status === 410)
|
|
196
|
+
return 'the ticket is gone, or this token cannot see it';
|
|
197
|
+
if (err.status === 401 || err.status === 403)
|
|
198
|
+
return 'the token has no access to it';
|
|
199
|
+
return `GitHub answered ${err.status}`;
|
|
200
|
+
}
|
|
201
|
+
if (err instanceof Error && err.message === 'timeout')
|
|
202
|
+
return 'the tracker did not answer in time';
|
|
203
|
+
return 'the tracker did not answer';
|
|
204
|
+
}
|
|
205
|
+
async function withTimeout(p) {
|
|
206
|
+
let timer;
|
|
207
|
+
try {
|
|
208
|
+
return await Promise.race([
|
|
209
|
+
p,
|
|
210
|
+
new Promise((_, reject) => {
|
|
211
|
+
timer = setTimeout(() => reject(new Error('timeout')), READ_TIMEOUT_MS);
|
|
212
|
+
timer.unref?.();
|
|
213
|
+
}),
|
|
214
|
+
]);
|
|
215
|
+
}
|
|
216
|
+
finally {
|
|
217
|
+
if (timer)
|
|
218
|
+
clearTimeout(timer);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Reads the tickets of a PR event. Never throws. A mention that names no readable ticket (a typo, a private repo, a pull
|
|
223
|
+
* request) is a word, not a link, and is left out without a note. A closed or referenced ticket that cannot be read is
|
|
224
|
+
* listed in `notRead`. With no tracker connected (demo mode) nothing is read and nothing is said.
|
|
225
|
+
*/
|
|
226
|
+
export async function readLinkedTickets(watch, ev, o = {}) {
|
|
227
|
+
const refs = linkedRefs(watch, ev);
|
|
228
|
+
const result = { tickets: [], notRead: [] };
|
|
229
|
+
if (!refs.length)
|
|
230
|
+
return result;
|
|
231
|
+
const read = o.read ?? readTicket;
|
|
232
|
+
const settled = await Promise.all(refs.map(async ({ ref, via }) => {
|
|
233
|
+
try {
|
|
234
|
+
if (!o.read && isDemo(watch, ref))
|
|
235
|
+
return null;
|
|
236
|
+
return { ref, ticket: toLinkedTicket(ref, await withTimeout(read(watch, ref))) };
|
|
237
|
+
}
|
|
238
|
+
catch (err) {
|
|
239
|
+
if (via === 'mention' && namesNoIssue(err))
|
|
240
|
+
return null;
|
|
241
|
+
return { ref, notRead: reasonOf(err) };
|
|
242
|
+
}
|
|
243
|
+
}));
|
|
244
|
+
for (const s of settled) {
|
|
245
|
+
if (!s)
|
|
246
|
+
continue;
|
|
247
|
+
if (s.ticket)
|
|
248
|
+
result.tickets.push(s.ticket);
|
|
249
|
+
else
|
|
250
|
+
result.notRead.push({ ref: s.ref, reason: s.notRead ?? 'the tracker did not answer' });
|
|
251
|
+
}
|
|
252
|
+
return result;
|
|
253
|
+
}
|
|
254
|
+
// ---------- what the review record keeps ----------
|
|
255
|
+
/** The slim record of a ticket the comment shows: no description, only the key, the title chip and what the tracker says. */
|
|
256
|
+
export function noteOf(t) {
|
|
257
|
+
return {
|
|
258
|
+
ref: t.ref,
|
|
259
|
+
title: t.title,
|
|
260
|
+
...(t.url ? { url: t.url } : {}),
|
|
261
|
+
...(t.state ? { state: t.state } : {}),
|
|
262
|
+
...(t.labels.length ? { labels: t.labels } : {}),
|
|
263
|
+
...(t.milestone ? { milestone: t.milestone } : {}),
|
|
264
|
+
criteria: t.criteria.length,
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* The criteria the reviewer named as not touched, with the ticket's own words. An id that is no criterion of a read ticket
|
|
269
|
+
* is dropped (the script check already sends it back), and a criterion is listed once.
|
|
270
|
+
*/
|
|
271
|
+
export function criteriaNotCovered(tickets, named) {
|
|
272
|
+
const out = [];
|
|
273
|
+
const seen = new Set();
|
|
274
|
+
for (const n of named ?? []) {
|
|
275
|
+
const t = tickets.find((x) => x.ref.toLowerCase() === normalize(n.ticket).toLowerCase());
|
|
276
|
+
const c = t?.criteria.find((x) => x.id.toUpperCase() === n.id.toUpperCase());
|
|
277
|
+
if (!t || !c || seen.has(`${t.ref}|${c.id}`))
|
|
278
|
+
continue;
|
|
279
|
+
seen.add(`${t.ref}|${c.id}`);
|
|
280
|
+
out.push({ ticket: t.ref, id: c.id, text: c.text });
|
|
281
|
+
}
|
|
282
|
+
return out;
|
|
283
|
+
}
|
|
284
|
+
export function checkInfoOf(tickets) {
|
|
285
|
+
if (!tickets.length)
|
|
286
|
+
return undefined;
|
|
287
|
+
return {
|
|
288
|
+
criteria: Object.fromEntries(tickets.map((t) => [t.ref.toLowerCase(), t.criteria.map((c) => c.id)])),
|
|
289
|
+
// The title is not in the bank: the comment shows it in the chip, and a summary that repeats a PR title that equals the ticket title would be cut.
|
|
290
|
+
text: tickets.map((t) => [t.body, ...t.criteria.map((c) => c.text)].join('\n')).join('\n\n'),
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
//# sourceMappingURL=linked-tickets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linked-tickets.js","sourceRoot":"","sources":["../../src/review/linked-tickets.ts"],"names":[],"mappings":"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"}
|