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,54 @@
|
|
|
1
|
+
// The PR side of the impact check (KAT-304). A ticket review can say an automated spec needs an update. When a PR for
|
|
2
|
+
// that ticket does not change the spec, the PR review lists it under Not tested yet, so nobody merges the ticket's
|
|
3
|
+
// change and leaves the old spec behind.
|
|
4
|
+
import { createHash } from 'node:crypto';
|
|
5
|
+
import { normalizeRef, requirementOf, specMatches } from '../cases.js';
|
|
6
|
+
import { issueRef } from '../integrations/github-issues.js';
|
|
7
|
+
import { linksFor } from '../links.js';
|
|
8
|
+
import { watchRepos } from '../repos.js';
|
|
9
|
+
import { impactRows } from './store.js';
|
|
10
|
+
const MAX_NOTES = 3;
|
|
11
|
+
const MAX_WHY = 140;
|
|
12
|
+
/** The tickets a PR names: the ones it closes or references, as the traceability links hold them. */
|
|
13
|
+
export function ticketsOfPr(watch, ev) {
|
|
14
|
+
const out = new Set();
|
|
15
|
+
if (!ev.pr || !ev.repo)
|
|
16
|
+
return out;
|
|
17
|
+
const pr = issueRef(`${ev.repo.owner}/${ev.repo.name}`, ev.pr.number);
|
|
18
|
+
for (const l of linksFor(pr, watch.id)) {
|
|
19
|
+
if (l.fromRef !== pr || (l.kind !== 'closes' && l.kind !== 'references'))
|
|
20
|
+
continue;
|
|
21
|
+
const ref = normalizeRef(l.toRef);
|
|
22
|
+
if (ref)
|
|
23
|
+
out.add(ref);
|
|
24
|
+
}
|
|
25
|
+
return out;
|
|
26
|
+
}
|
|
27
|
+
const idOf = (impactId) => createHash('sha1').update(`impact:${impactId}`).digest('hex').slice(0, 6);
|
|
28
|
+
/**
|
|
29
|
+
* Specs a ticket of this PR says need an update, that the PR leaves unchanged. At most three, so the Not tested yet list
|
|
30
|
+
* stays short. A spec the PR changes is not listed: the PR is doing what the ticket review asked.
|
|
31
|
+
*/
|
|
32
|
+
export function specNotesForPr(watch, ev, changedPaths) {
|
|
33
|
+
const tickets = ticketsOfPr(watch, ev);
|
|
34
|
+
if (!tickets.size)
|
|
35
|
+
return [];
|
|
36
|
+
const out = [];
|
|
37
|
+
const multi = watchRepos(watch).length > 1;
|
|
38
|
+
for (const r of impactRows(watch.id, { state: 'open' })) {
|
|
39
|
+
if (r.subject !== 'spec' || r.verdict !== 'update' || !r.specPath || !tickets.has(r.ticket))
|
|
40
|
+
continue;
|
|
41
|
+
// The spec of another repo cannot change in this PR, and a path both repos hold is two specs (KAT-316).
|
|
42
|
+
if (multi && r.repo && ev.repo && r.repo !== `${ev.repo.owner}/${ev.repo.name}`.toLowerCase())
|
|
43
|
+
continue;
|
|
44
|
+
if (changedPaths.some((p) => specMatches(r.specPath, p)))
|
|
45
|
+
continue;
|
|
46
|
+
const req = requirementOf(r.ticket, watch);
|
|
47
|
+
const why = (r.note || 'The ticket changes what this test checks.').replace(/\s+/g, ' ').slice(0, MAX_WHY);
|
|
48
|
+
out.push({ id: idOf(r.id), ticket: r.ticket, ...(req.title ? { ticketTitle: req.title } : {}), title: r.title, file: r.specPath, why });
|
|
49
|
+
if (out.length >= MAX_NOTES)
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
return out;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=pr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr.js","sourceRoot":"","sources":["../../src/impact/pr.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
// Impact rows, drafts, and decisions (KAT-304, docs/DATA-MODEL.md section 2.3.1). One row per dot, ticket, and subject
|
|
2
|
+
// (a case or a spec). A row that needs an update holds a draft case version; a row that makes a case obsolete holds an
|
|
3
|
+
// Inbox approval of kind case_retire. Nothing here retires or rewrites a case by itself: a person accepts the draft, or
|
|
4
|
+
// approves the retire in the Inbox.
|
|
5
|
+
import { getCase, normalizeSpecPath, requirementOf, snapshotOf, updateCase, CaseInputError, retireCase } from '../cases.js';
|
|
6
|
+
import { closeApproval } from '../agent/approvals.js';
|
|
7
|
+
import { get, insert, list, remove, update } from '../db.js';
|
|
8
|
+
import { githubWebUrl } from '../integrations/github.js';
|
|
9
|
+
import { watchRepos } from '../repos.js';
|
|
10
|
+
const now = () => new Date().toISOString();
|
|
11
|
+
/** The text of the retire draft in the Inbox. */
|
|
12
|
+
export function retireAction(c, row,
|
|
13
|
+
/** The case revision the review read (KAT-315). Approving refuses when the case changed since. */
|
|
14
|
+
baseRevision) {
|
|
15
|
+
return {
|
|
16
|
+
kind: 'case_retire',
|
|
17
|
+
target: `case:${c.key}`,
|
|
18
|
+
title: `Retire ${c.key}: ${c.title}`.slice(0, 200),
|
|
19
|
+
body: [
|
|
20
|
+
`${row.ticket} removes or replaces what ${c.key} checks, so nobody needs to run it again.`,
|
|
21
|
+
row.ticketLine ? `Line of the ticket: "${row.ticketLine}"` : '',
|
|
22
|
+
row.note,
|
|
23
|
+
'If you approve, the case is retired. Its results stay. If you reject, the case stays as it is.',
|
|
24
|
+
]
|
|
25
|
+
.filter(Boolean)
|
|
26
|
+
.join('\n\n'),
|
|
27
|
+
meta: { caseKey: c.key, impactId: row.id, ticket: row.ticket, ...(baseRevision !== undefined ? { baseRevision } : {}) },
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
// ---------- reading ----------
|
|
31
|
+
/** A case is its id. A spec is its repo and its path: two repos may both hold e2e/coupon.spec.ts (KAT-316). */
|
|
32
|
+
const subjectKey = (r) => r.subject === 'case' ? `case:${r.caseId}` : `spec:${r.repo ?? ''}:${r.specPath}`;
|
|
33
|
+
/**
|
|
34
|
+
* The row as it stands now. An obsolete row follows its Inbox approval: approved means accepted, rejected means
|
|
35
|
+
* rejected, and a draft nobody decided before it expired means expired. An update row keeps its own state.
|
|
36
|
+
*/
|
|
37
|
+
export function resolveRow(row) {
|
|
38
|
+
if (row.state !== 'open' || row.verdict === 'valid')
|
|
39
|
+
return row;
|
|
40
|
+
if (row.subject === 'case' && row.caseId) {
|
|
41
|
+
const c = getCase(row.caseId);
|
|
42
|
+
if (!c)
|
|
43
|
+
return { ...row, state: 'expired' };
|
|
44
|
+
// Someone retired the case by hand: an obsolete row got what it asked for, an update row has nothing left to do.
|
|
45
|
+
if (c.status === 'retired')
|
|
46
|
+
return { ...row, state: row.verdict === 'obsolete' ? 'accepted' : 'expired' };
|
|
47
|
+
}
|
|
48
|
+
if (row.verdict !== 'obsolete' || !row.approvalId)
|
|
49
|
+
return row;
|
|
50
|
+
const a = get('approvals', row.approvalId);
|
|
51
|
+
if (!a)
|
|
52
|
+
return { ...row, state: 'expired' };
|
|
53
|
+
if (a.status === 'executed')
|
|
54
|
+
return { ...row, state: 'accepted' };
|
|
55
|
+
if (a.status === 'rejected')
|
|
56
|
+
return { ...row, state: 'rejected' };
|
|
57
|
+
if (a.status === 'expired' || a.status === 'superseded')
|
|
58
|
+
return { ...row, state: 'expired' };
|
|
59
|
+
if (a.status === 'pending' && a.expiresAt && Date.parse(a.expiresAt) <= Date.now())
|
|
60
|
+
return { ...row, state: 'expired' };
|
|
61
|
+
return row;
|
|
62
|
+
}
|
|
63
|
+
export function impactRows(dotId, f = {}) {
|
|
64
|
+
const where = { dotId };
|
|
65
|
+
if (f.ticket)
|
|
66
|
+
where.ticket = f.ticket;
|
|
67
|
+
if (f.caseId)
|
|
68
|
+
where.caseId = f.caseId;
|
|
69
|
+
const rows = list('case_impacts', where).map(resolveRow);
|
|
70
|
+
const order = { obsolete: 0, update: 1, valid: 2 };
|
|
71
|
+
return rows
|
|
72
|
+
.filter((r) => (f.state === 'open' ? r.state === 'open' : true))
|
|
73
|
+
.sort((a, b) => order[a.verdict] - order[b.verdict] ||
|
|
74
|
+
a.subject.localeCompare(b.subject) ||
|
|
75
|
+
(a.caseKey ?? a.specPath ?? '').localeCompare(b.caseKey ?? b.specPath ?? '', undefined, { numeric: true }));
|
|
76
|
+
}
|
|
77
|
+
/** The link to a spec in the repo that holds it. A row from before the repo was stored falls back to the dot's first repo. */
|
|
78
|
+
function specUrl(w, path, repoId) {
|
|
79
|
+
const all = watchRepos(w);
|
|
80
|
+
const repo = (repoId ? all.find((r) => r.id === repoId.toLowerCase()) : undefined) ?? (repoId ? undefined : (all[0] ?? w.repo));
|
|
81
|
+
const safe = path ? normalizeSpecPath(path) : null;
|
|
82
|
+
if (!repo || !safe)
|
|
83
|
+
return undefined;
|
|
84
|
+
return `${githubWebUrl().replace(/\/$/, '')}/${encodeURIComponent(repo.owner)}/${encodeURIComponent(repo.name)}/blob/${encodeURIComponent(repo.defaultBranch)}/${safe.split('/').map(encodeURIComponent).join('/')}`;
|
|
85
|
+
}
|
|
86
|
+
/** What the latest check of a ticket matched but left out, from the summary stored on its run. Undefined when nothing was. */
|
|
87
|
+
export function leftOutFor(dotId, ticket) {
|
|
88
|
+
const latest = list('runs', { watchId: dotId, kind: 'ticket_review' }, { orderBy: 'createdAt DESC' }).find((r) => r.impact?.ticket === ticket);
|
|
89
|
+
const l = latest?.impact?.leftOut;
|
|
90
|
+
return l && l.cases + l.specs > 0 ? l : undefined;
|
|
91
|
+
}
|
|
92
|
+
/** The rows as the API returns them: with the ticket as a titled reference, the case now, and a link for a spec. */
|
|
93
|
+
export function impactList(w, f = {}) {
|
|
94
|
+
const rows = impactRows(w.id, f);
|
|
95
|
+
const reqs = new Map();
|
|
96
|
+
const items = rows.map((r) => {
|
|
97
|
+
let requirement = reqs.get(r.ticket);
|
|
98
|
+
if (!requirement)
|
|
99
|
+
reqs.set(r.ticket, (requirement = requirementOf(r.ticket, w)));
|
|
100
|
+
const c = r.caseId ? getCase(r.caseId) : undefined;
|
|
101
|
+
const link = r.specPath ? specUrl(w, r.specPath, r.repo) : undefined;
|
|
102
|
+
return { ...r, requirement, ...(c ? { caseStatus: c.status, currentSteps: c.steps ?? [], title: c.title } : {}), ...(link ? { specUrl: link } : {}) };
|
|
103
|
+
});
|
|
104
|
+
const leftOut = f.ticket ? leftOutFor(w.id, f.ticket) : undefined;
|
|
105
|
+
return { items, open: items.filter((i) => i.state === 'open' && i.verdict !== 'valid').length, ...(leftOut ? { leftOut } : {}) };
|
|
106
|
+
}
|
|
107
|
+
/** The cases a person has not decided on yet, for the Needs review mark in test runs. */
|
|
108
|
+
export function needsReviewFlags(dotId) {
|
|
109
|
+
const out = new Map();
|
|
110
|
+
for (const r of impactRows(dotId, { state: 'open' })) {
|
|
111
|
+
if (r.subject !== 'case' || !r.caseId || r.verdict === 'valid' || out.has(r.caseId))
|
|
112
|
+
continue;
|
|
113
|
+
out.set(r.caseId, { impactId: r.id, ticket: r.ticket, verdict: r.verdict });
|
|
114
|
+
}
|
|
115
|
+
return out;
|
|
116
|
+
}
|
|
117
|
+
// ---------- drafts ----------
|
|
118
|
+
function draftOf(impactId) {
|
|
119
|
+
return list('case_versions', { impactId }).find((v) => v.draft === 'draft');
|
|
120
|
+
}
|
|
121
|
+
/** The case version a ticket proposes: the case as it is, with the new steps, linked to the new ticket. */
|
|
122
|
+
function proposedSnapshot(c, steps, ticket) {
|
|
123
|
+
const base = snapshotOf(c);
|
|
124
|
+
return { ...base, steps, requirementRefs: base.requirementRefs.includes(ticket) ? base.requirementRefs : [...base.requirementRefs, ticket] };
|
|
125
|
+
}
|
|
126
|
+
/** Writes the draft version of an update row. The old version stays the case's current one. */
|
|
127
|
+
function writeDraft(c, row, steps, readRevision) {
|
|
128
|
+
const snapshot = proposedSnapshot(c, steps, row.ticket);
|
|
129
|
+
// The revision the review read (KAT-318), not the one the case has now: an edit made while the model answered must
|
|
130
|
+
// make accept refuse. Without a read revision, the case as it is now.
|
|
131
|
+
const base = readRevision ?? c.revision ?? 1;
|
|
132
|
+
const version = base + 1;
|
|
133
|
+
const at = now();
|
|
134
|
+
const have = draftOf(row.id);
|
|
135
|
+
if (have)
|
|
136
|
+
update('case_versions', have.id, { snapshot, version, baseRevision: base, at });
|
|
137
|
+
else
|
|
138
|
+
insert('case_versions', {
|
|
139
|
+
caseId: c.id,
|
|
140
|
+
dotId: c.dotId,
|
|
141
|
+
version,
|
|
142
|
+
snapshot,
|
|
143
|
+
draft: 'draft',
|
|
144
|
+
ticket: row.ticket,
|
|
145
|
+
impactId: row.id,
|
|
146
|
+
baseRevision: base,
|
|
147
|
+
actor: 'ticket review',
|
|
148
|
+
at,
|
|
149
|
+
createdAt: at,
|
|
150
|
+
});
|
|
151
|
+
return version;
|
|
152
|
+
}
|
|
153
|
+
/** The draft of an update row, for the app: the snapshot a person accepts or rejects. */
|
|
154
|
+
export function draftSnapshot(impactId) {
|
|
155
|
+
return draftOf(impactId)?.snapshot;
|
|
156
|
+
}
|
|
157
|
+
/** The row for a candidate, if the ticket was checked against it before. */
|
|
158
|
+
function existingRow(dotId, ticket, cand) {
|
|
159
|
+
const key = subjectKey({ subject: cand.kind, caseId: cand.caseId, specPath: cand.specPath, repo: cand.repo });
|
|
160
|
+
const rows = list('case_impacts', { dotId, ticket });
|
|
161
|
+
const hit = rows.find((r) => subjectKey(r) === key);
|
|
162
|
+
if (hit || cand.kind !== 'spec' || !cand.repo)
|
|
163
|
+
return hit;
|
|
164
|
+
// A spec row from before the repo was stored belongs to the repo of the same path, when only one repo has it.
|
|
165
|
+
return rows.find((r) => r.subject === 'spec' && !r.repo && r.specPath === cand.specPath);
|
|
166
|
+
}
|
|
167
|
+
const flagged = (verdict) => verdict !== 'valid';
|
|
168
|
+
/**
|
|
169
|
+
* Stores what the check decided about one candidate. An accepted row is never reopened. A rejected row stays rejected
|
|
170
|
+
* while the ticket text is the one it was checked against (`hash`, see ticketHash); when the ticket changed, the test
|
|
171
|
+
* is checked again and may get a new draft. A flag that still waits for a person is not replaced by a later "still
|
|
172
|
+
* valid". It retires and rewrites nothing: an update row gets a draft version, and an obsolete row asks the caller
|
|
173
|
+
* (gate=true) to put the retire draft in the Inbox.
|
|
174
|
+
*/
|
|
175
|
+
export function applyDecision(watch, ticket, runId, cand, d, hash) {
|
|
176
|
+
const prev = existingRow(watch.id, ticket, cand);
|
|
177
|
+
const prevNow = prev ? resolveRow(prev) : undefined;
|
|
178
|
+
if (prev && prevNow && flagged(prevNow.verdict)) {
|
|
179
|
+
if (prevNow.state === 'accepted')
|
|
180
|
+
return { row: prevNow, gate: false };
|
|
181
|
+
// A row from before the hash was stored cannot say whether the ticket changed, so its rejection holds.
|
|
182
|
+
if (prevNow.state === 'rejected' && (!prev.ticketHash || !hash || prev.ticketHash === hash))
|
|
183
|
+
return { row: prevNow, gate: false };
|
|
184
|
+
if (prevNow.state === 'open' && (!flagged(d.verdict) || d.verdict === prev.verdict) && !retireDraftStale(prev, d, cand)) {
|
|
185
|
+
const patch = { runId, updatedAt: now(), ...(hash ? { ticketHash: hash } : {}) };
|
|
186
|
+
// The ticket text changed (KAT-327): the line, the note and the proposed steps must say what the new text says.
|
|
187
|
+
const changed = !!hash && !!prev.ticketHash && prev.ticketHash !== hash;
|
|
188
|
+
if (changed && flagged(d.verdict))
|
|
189
|
+
Object.assign(patch, { ticketLine: d.ticketLine ?? null, note: d.note, confidence: d.confidence, changes: d.changes ?? null });
|
|
190
|
+
if (d.verdict === 'update' && prev.subject === 'case' && d.changes) {
|
|
191
|
+
const c = prev.caseId ? getCase(prev.caseId) : undefined;
|
|
192
|
+
if (c)
|
|
193
|
+
Object.assign(patch, {
|
|
194
|
+
changes: d.changes,
|
|
195
|
+
ticketLine: d.ticketLine ?? null,
|
|
196
|
+
note: d.note,
|
|
197
|
+
confidence: d.confidence,
|
|
198
|
+
draftVersion: writeDraft(c, prev, d.changes, cand.revision),
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
update('case_impacts', prev.id, patch);
|
|
202
|
+
return { row: get('case_impacts', prev.id), gate: false };
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
// A new row, or the row of an earlier check that this answer replaces (still valid before, a changed verdict, or
|
|
206
|
+
// an Inbox draft that expired undecided).
|
|
207
|
+
if (prev) {
|
|
208
|
+
const old = draftOf(prev.id);
|
|
209
|
+
if (old)
|
|
210
|
+
remove('case_versions', old.id);
|
|
211
|
+
// The retire draft in the Inbox asked about a verdict that no longer stands: it must not retire the case later (KAT-315).
|
|
212
|
+
if (prev.verdict === 'obsolete' && prev.approvalId)
|
|
213
|
+
supersedeRetire(prev, d.verdict, cand.revision);
|
|
214
|
+
}
|
|
215
|
+
const at = now();
|
|
216
|
+
const fields = {
|
|
217
|
+
dotId: watch.id,
|
|
218
|
+
ticket,
|
|
219
|
+
runId,
|
|
220
|
+
subject: cand.kind,
|
|
221
|
+
caseId: cand.caseId ?? null,
|
|
222
|
+
caseKey: cand.caseKey ?? null,
|
|
223
|
+
specPath: cand.specPath ?? null,
|
|
224
|
+
repo: cand.kind === 'spec' ? (cand.repo ?? null) : null,
|
|
225
|
+
title: cand.title,
|
|
226
|
+
verdict: d.verdict,
|
|
227
|
+
confidence: d.confidence,
|
|
228
|
+
ticketLine: d.ticketLine ?? null,
|
|
229
|
+
note: d.note,
|
|
230
|
+
changes: d.changes ?? null,
|
|
231
|
+
signals: cand.signals,
|
|
232
|
+
state: flagged(d.verdict) ? 'open' : 'none',
|
|
233
|
+
ticketHash: hash ?? null,
|
|
234
|
+
draftVersion: null,
|
|
235
|
+
approvalId: null,
|
|
236
|
+
decidedAt: null,
|
|
237
|
+
decidedBy: null,
|
|
238
|
+
updatedAt: at,
|
|
239
|
+
};
|
|
240
|
+
let row;
|
|
241
|
+
if (prev) {
|
|
242
|
+
update('case_impacts', prev.id, fields);
|
|
243
|
+
row = get('case_impacts', prev.id);
|
|
244
|
+
}
|
|
245
|
+
else
|
|
246
|
+
row = insert('case_impacts', { ...fields, createdAt: at });
|
|
247
|
+
if (d.verdict === 'update' && cand.kind === 'case' && d.changes) {
|
|
248
|
+
const c = getCase(cand.caseId);
|
|
249
|
+
if (c) {
|
|
250
|
+
update('case_impacts', row.id, { draftVersion: writeDraft(c, row, d.changes, cand.revision) });
|
|
251
|
+
row = get('case_impacts', row.id);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
return { row, gate: d.verdict === 'obsolete' };
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* True when the row is obsolete again but its pending retire draft read an older case revision than this check did.
|
|
258
|
+
* That draft would refuse on approval, so the check writes a new one (KAT-315). The same revision keeps the draft.
|
|
259
|
+
*/
|
|
260
|
+
function retireDraftStale(prev, d, cand) {
|
|
261
|
+
if (d.verdict !== 'obsolete' || prev.verdict !== 'obsolete' || prev.subject !== 'case' || !prev.approvalId)
|
|
262
|
+
return false;
|
|
263
|
+
const a = get('approvals', prev.approvalId);
|
|
264
|
+
if (!a || a.status !== 'pending')
|
|
265
|
+
return false;
|
|
266
|
+
const based = a.action.meta?.baseRevision;
|
|
267
|
+
return typeof based === 'number' && cand.revision !== undefined && cand.revision !== based;
|
|
268
|
+
}
|
|
269
|
+
/** Closes the pending retire draft of a row whose verdict changed. A draft that was already decided stays as it is. */
|
|
270
|
+
function supersedeRetire(row, now, revision) {
|
|
271
|
+
const a = get('approvals', row.approvalId);
|
|
272
|
+
if (!a || a.status !== 'pending')
|
|
273
|
+
return;
|
|
274
|
+
const why = now === 'obsolete'
|
|
275
|
+
? `${row.caseKey ?? 'The case'} changed after this draft was written (version ${revision ?? 'newer'}). A newer check of ${row.ticket} still says it is obsolete, so a new draft replaces this one.`
|
|
276
|
+
: now === 'update'
|
|
277
|
+
? `A newer check of ${row.ticket} says ${row.caseKey ?? 'the case'} needs an update, not a retirement.`
|
|
278
|
+
: `A newer check of ${row.ticket} no longer says ${row.caseKey ?? 'the case'} is obsolete.`;
|
|
279
|
+
closeApproval(a, 'superseded', why);
|
|
280
|
+
}
|
|
281
|
+
/** Links the Inbox approval to its obsolete row. Looks the approval up by its meta, since the gate returns only a result. */
|
|
282
|
+
export function attachApproval(row, runId) {
|
|
283
|
+
const a = list('approvals', { watchId: row.dotId, runId })
|
|
284
|
+
.filter((x) => x.action.kind === 'case_retire' && x.action.meta?.impactId === row.id)
|
|
285
|
+
.sort((x, y) => y.createdAt.localeCompare(x.createdAt))[0];
|
|
286
|
+
if (a)
|
|
287
|
+
update('case_impacts', row.id, { approvalId: a.id });
|
|
288
|
+
return get('case_impacts', row.id);
|
|
289
|
+
}
|
|
290
|
+
// ---------- decisions ----------
|
|
291
|
+
export class ImpactDecisionError extends Error {
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* A person accepts a row. An update row writes the draft as the case's next version (the old version stays in its
|
|
295
|
+
* history). A spec row is marked as updated. An obsolete row is decided in the Inbox, not here.
|
|
296
|
+
*/
|
|
297
|
+
export function acceptImpact(row, actor) {
|
|
298
|
+
const cur = resolveRow(row);
|
|
299
|
+
if (cur.state !== 'open')
|
|
300
|
+
throw new ImpactDecisionError(cur.state === 'accepted' || cur.state === 'rejected' ? `This was already ${cur.state}.` : 'This is not waiting for a decision.');
|
|
301
|
+
if (cur.verdict === 'obsolete')
|
|
302
|
+
throw new ImpactDecisionError('Retiring a case is decided in the Inbox. Approve the draft there.');
|
|
303
|
+
if (cur.subject === 'case') {
|
|
304
|
+
const draft = draftOf(cur.id);
|
|
305
|
+
const c = cur.caseId ? getCase(cur.caseId) : undefined;
|
|
306
|
+
if (!draft || !c)
|
|
307
|
+
throw new ImpactDecisionError('The draft or the case is gone.');
|
|
308
|
+
if (c.status === 'retired')
|
|
309
|
+
throw new ImpactDecisionError('This case is retired. Reject the draft instead.');
|
|
310
|
+
// The draft holds the whole case as it was when the ticket was checked. When the case changed since, writing it
|
|
311
|
+
// back would silently undo that edit (KAT-314), so the draft stays and a person decides.
|
|
312
|
+
const based = draft.baseRevision ?? draft.version - 1;
|
|
313
|
+
const current = c.revision ?? 1;
|
|
314
|
+
if (current !== based)
|
|
315
|
+
throw new ImpactDecisionError(`${c.key} changed after this draft was written (the draft is based on version ${based}, the case is now at version ${current}). Nothing was overwritten. Reject this draft, or check the ticket again to get a new one.`);
|
|
316
|
+
try {
|
|
317
|
+
updateCase(c, { title: draft.snapshot.title, steps: draft.snapshot.steps, requirementRefs: draft.snapshot.requirementRefs }, actor ?? 'ticket review');
|
|
318
|
+
}
|
|
319
|
+
catch (err) {
|
|
320
|
+
if (err instanceof CaseInputError)
|
|
321
|
+
throw new ImpactDecisionError(err.message);
|
|
322
|
+
throw err;
|
|
323
|
+
}
|
|
324
|
+
// The case now holds the new version in its history; the draft has done its job.
|
|
325
|
+
remove('case_versions', draft.id);
|
|
326
|
+
}
|
|
327
|
+
update('case_impacts', cur.id, { state: 'accepted', decidedAt: now(), decidedBy: actor ?? null, updatedAt: now() });
|
|
328
|
+
return get('case_impacts', cur.id);
|
|
329
|
+
}
|
|
330
|
+
/** A person rejects a row. The draft stays on record as rejected; the case does not change. */
|
|
331
|
+
export function rejectImpact(row, actor) {
|
|
332
|
+
const cur = resolveRow(row);
|
|
333
|
+
if (cur.state !== 'open')
|
|
334
|
+
throw new ImpactDecisionError(cur.state === 'accepted' || cur.state === 'rejected' ? `This was already ${cur.state}.` : 'This is not waiting for a decision.');
|
|
335
|
+
if (cur.verdict === 'obsolete')
|
|
336
|
+
throw new ImpactDecisionError('Retiring a case is decided in the Inbox. Reject the draft there.');
|
|
337
|
+
const draft = draftOf(cur.id);
|
|
338
|
+
if (draft)
|
|
339
|
+
update('case_versions', draft.id, { draft: 'rejected' });
|
|
340
|
+
update('case_impacts', cur.id, { state: 'rejected', decidedAt: now(), decidedBy: actor ?? null, updatedAt: now() });
|
|
341
|
+
return get('case_impacts', cur.id);
|
|
342
|
+
}
|
|
343
|
+
export function getImpact(dotId, id) {
|
|
344
|
+
const r = get('case_impacts', id);
|
|
345
|
+
return r && r.dotId === dotId ? r : undefined;
|
|
346
|
+
}
|
|
347
|
+
/** Carries out an approved case_retire: the case is retired, its results stay, and the row is accepted. */
|
|
348
|
+
export function executeCaseRetire(action, actor = 'approval') {
|
|
349
|
+
const meta = action.meta ?? {};
|
|
350
|
+
const row = typeof meta.impactId === 'string' ? get('case_impacts', meta.impactId) : undefined;
|
|
351
|
+
const c = row?.caseId ? getCase(row.caseId) : undefined;
|
|
352
|
+
if (!row || !c)
|
|
353
|
+
throw new Error('The case to retire is gone.');
|
|
354
|
+
// A newer check can change the verdict while the draft waits. The case stays then (KAT-315).
|
|
355
|
+
if (row.verdict !== 'obsolete')
|
|
356
|
+
throw new Error(`${c.key} is no longer obsolete: a newer check of ${row.ticket} changed what it says. The case was not retired.`);
|
|
357
|
+
// A person may have edited the case after the review read it. The edit may be why the case is still wanted (KAT-315).
|
|
358
|
+
const based = typeof meta.baseRevision === 'number' ? meta.baseRevision : undefined;
|
|
359
|
+
const current = c.revision ?? 1;
|
|
360
|
+
if (based !== undefined && current !== based)
|
|
361
|
+
throw new Error(`${c.key} changed after this retire draft was written (the draft is based on version ${based}, the case is now at version ${current}). The case was not retired. Reject this draft, or check ${row.ticket} again to get a new one.`);
|
|
362
|
+
retireCase(c, actor);
|
|
363
|
+
update('case_impacts', row.id, { state: 'accepted', decidedAt: now(), decidedBy: actor, updatedAt: now() });
|
|
364
|
+
}
|
|
365
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/impact/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
// Word helpers for the impact check (KAT-304, docs/STAGES.md section 3.1): the words of a ticket and of a test, the
|
|
2
|
+
// lines of a ticket, and the values a line names. Pure functions, no database.
|
|
3
|
+
import { createHash } from 'node:crypto';
|
|
4
|
+
import { normalizeText } from '../flows/testDesign.js';
|
|
5
|
+
/** Words that say nothing about which feature a test or a ticket is about. */
|
|
6
|
+
const COMMON = new Set(('the and for with from that this when then than into onto over under about after before also only just have has had been being are was were will would should must can could may might ' +
|
|
7
|
+
'not but any all each every some more most less other another same such like make makes made allow allows allowed able need needs want wants use uses used using ' +
|
|
8
|
+
'user users customer customers person people someone anyone page pages screen button buttons click clicks clicked press presses enter enters entered type types field fields form forms ' +
|
|
9
|
+
'see sees shown show shows showing display displays displayed open opens close closes check checks test tests tested case cases step steps app application site web ' +
|
|
10
|
+
'new old add adds added get gets got set sets list lists item items name names text link links view views story ticket tickets feature features behavior behaviour ' +
|
|
11
|
+
'please note given when whenever there their they them its our out off one two via per way ' +
|
|
12
|
+
'works working work correctly correct expected expect expects result results state value values').split(/\s+/));
|
|
13
|
+
/** A light plural strip: coupons and coupon are one word. */
|
|
14
|
+
function stem(w) {
|
|
15
|
+
if (w.length > 5 && w.endsWith('ies'))
|
|
16
|
+
return `${w.slice(0, -3)}y`;
|
|
17
|
+
if (w.length > 4 && w.endsWith('es') && /(ch|sh|x|ss)es$/.test(w))
|
|
18
|
+
return w.slice(0, -2);
|
|
19
|
+
if (w.length > 3 && w.endsWith('s') && !w.endsWith('ss'))
|
|
20
|
+
return w.slice(0, -1);
|
|
21
|
+
return w;
|
|
22
|
+
}
|
|
23
|
+
/** The distinct, meaningful words of a text: lower case, no common words, plurals joined. */
|
|
24
|
+
export function wordsOf(text) {
|
|
25
|
+
const out = new Set();
|
|
26
|
+
for (const raw of normalizeText(text).split(' ')) {
|
|
27
|
+
if (raw.length < 3 && !/^\d+$/.test(raw))
|
|
28
|
+
continue;
|
|
29
|
+
if (COMMON.has(raw))
|
|
30
|
+
continue;
|
|
31
|
+
const w = stem(raw);
|
|
32
|
+
if (w.length < 3 && !/^\d+$/.test(w))
|
|
33
|
+
continue;
|
|
34
|
+
if (COMMON.has(w))
|
|
35
|
+
continue;
|
|
36
|
+
out.add(w);
|
|
37
|
+
}
|
|
38
|
+
return [...out];
|
|
39
|
+
}
|
|
40
|
+
/** How many of `a`'s words `b` also holds. */
|
|
41
|
+
export function sharedWords(a, b) {
|
|
42
|
+
return a.filter((w) => b.has(w));
|
|
43
|
+
}
|
|
44
|
+
/** Everything a ticket says, as one text. */
|
|
45
|
+
export function ticketText(t) {
|
|
46
|
+
return [t.title, t.description, t.acceptanceCriteria, (t.labels ?? []).join(' ')].filter(Boolean).join('\n');
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* A hash of what a person decided on: the title, the description, and the acceptance criteria of the ticket. Spacing
|
|
50
|
+
* and line breaks do not count, so a ticket saved again without a change keeps its hash. Labels and status do not count.
|
|
51
|
+
*/
|
|
52
|
+
export function ticketHash(t) {
|
|
53
|
+
const norm = (s) => (s ?? '').replace(/\s+/g, ' ').trim();
|
|
54
|
+
return createHash('sha256')
|
|
55
|
+
.update(JSON.stringify([norm(t.title), norm(t.description), norm(t.acceptanceCriteria)]))
|
|
56
|
+
.digest('hex')
|
|
57
|
+
.slice(0, 32);
|
|
58
|
+
}
|
|
59
|
+
/** "3 more matched and were left out." The empty string when the cap left nothing out. */
|
|
60
|
+
export function leftOutSentence(l) {
|
|
61
|
+
const n = l.cases + l.specs;
|
|
62
|
+
return n > 0 ? `${n} more matched and ${n === 1 ? 'was' : 'were'} left out.` : '';
|
|
63
|
+
}
|
|
64
|
+
const MAX_LINE = 400;
|
|
65
|
+
/**
|
|
66
|
+
* The lines of a ticket: its title, then each line and each sentence of the description and the acceptance criteria,
|
|
67
|
+
* without list markers. A ticket line the model cites must be one of these (or part of one).
|
|
68
|
+
*/
|
|
69
|
+
export function ticketLines(t) {
|
|
70
|
+
const out = [];
|
|
71
|
+
const add = (s) => {
|
|
72
|
+
const line = s
|
|
73
|
+
.replace(/^\s*(?:[-*+]\s+(?:\[[ xX]\]\s*)?|\d+[.)]\s+|#+\s+)/, '')
|
|
74
|
+
.replace(/\s+/g, ' ')
|
|
75
|
+
.trim();
|
|
76
|
+
if (line.length >= 3 && line.length <= MAX_LINE && !out.includes(line))
|
|
77
|
+
out.push(line);
|
|
78
|
+
};
|
|
79
|
+
add(t.title);
|
|
80
|
+
for (const block of [t.description, t.acceptanceCriteria]) {
|
|
81
|
+
for (const raw of (block ?? '').split(/\r?\n/)) {
|
|
82
|
+
// A long line holds several sentences; each is a line of its own. A decimal such as 4.5 is not a sentence end.
|
|
83
|
+
for (const s of raw.split(/(?<=[.!?])\s+(?=[A-Z"'(])/))
|
|
84
|
+
add(s);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return out;
|
|
88
|
+
}
|
|
89
|
+
/** True when `line` is a line of the ticket, ignoring case, punctuation, and spaces. A fragment of a line counts. */
|
|
90
|
+
export function lineInTicket(line, t) {
|
|
91
|
+
const l = normalizeText(line);
|
|
92
|
+
if (l.length < 4)
|
|
93
|
+
return false;
|
|
94
|
+
return normalizeText(ticketText(t)).includes(l);
|
|
95
|
+
}
|
|
96
|
+
/** The line of the ticket text that holds `fragment` in full, else the fragment. */
|
|
97
|
+
export function wholeLine(fragment, t) {
|
|
98
|
+
const f = normalizeText(fragment);
|
|
99
|
+
return ticketLines(t).find((l) => normalizeText(l).includes(f)) ?? fragment.trim();
|
|
100
|
+
}
|
|
101
|
+
/** A line that removes or replaces a behavior. */
|
|
102
|
+
export const REMOVE_CUE = /\b(remov(?:e|es|ed|ing|al)|delet(?:e|es|ed|ing)|drop(?:s|ped|ping)?|retir(?:e|es|ed|ing)|discontinu(?:e|es|ed|ing)|sunset(?:s|ting)?|deprecat\w+|get rid of|goes? away|no longer (?:offer|offered|support|supported|allow|allowed|available|exists?|shown?|needed)|replac(?:e|es|ed|ing)|replaced by)\b/i;
|
|
103
|
+
/** A line that changes a value, a rule, or a message. */
|
|
104
|
+
export const CHANGE_CUE = /\b(chang(?:e|es|ed|ing)|now|instead of|rather than|increas(?:e|es|ed|ing)|decreas(?:e|es|ed|ing)|reduc(?:e|es|ed|ing)|rais(?:e|es|ed|ing)|lower(?:s|ed|ing)?|renam(?:e|es|ed|ing)|updat(?:e|es|ed|ing)|from\s+\S.*\s+to\s+\S|no longer)\b/i;
|
|
105
|
+
/** A number: thousands separators and a decimal fraction stay in it. */
|
|
106
|
+
const NUM = String.raw `(?:\d{1,3}(?:,\d{3})+(?:\.\d+)?|\d+(?:\.\d+)?)`;
|
|
107
|
+
const VALUE = new RegExp(String.raw `"[^"]{1,40}"|(?<![A-Za-z])'[^']{1,40}'(?![A-Za-z])|[$€£]\s?\d[\d,]*(?:\.\d+)?|(?<![A-Za-z0-9.])${NUM}\s?%|(?<![A-Za-z0-9.])${NUM}(?:\s?(?:days?|hours?|minutes?|mins?|seconds?|items?|characters?|chars?|attempts?|times?))?`, 'gi');
|
|
108
|
+
/** The values a text names, in order: money, percents, numbers with a unit, and quoted text. */
|
|
109
|
+
export function valuesIn(text) {
|
|
110
|
+
return [...text.matchAll(VALUE)].map((m) => m[0].trim().replace(/^["']|["']$/g, '')).filter(Boolean);
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* The old and new value a change line names, or null when it names none. Reads "from A to B" and "A instead of B".
|
|
114
|
+
* It never reads a value out of a line that gives no pair, so the check stays a rule and not a guess.
|
|
115
|
+
*/
|
|
116
|
+
export function valuePair(line) {
|
|
117
|
+
const fromTo = /\bfrom\s+(.+?)\s+to\s+(.+?)(?:[.,;:](?=\s|$)|\s+(?:when|if|for|on|in|and|so)\b|$)/i.exec(line);
|
|
118
|
+
if (fromTo) {
|
|
119
|
+
const a = valuesIn(fromTo[1])[0];
|
|
120
|
+
const b = valuesIn(fromTo[2])[0];
|
|
121
|
+
if (a && b && a !== b)
|
|
122
|
+
return { from: a, to: b };
|
|
123
|
+
}
|
|
124
|
+
const instead = /^(.*?)\s+(?:instead of|rather than)\s+(.+)$/i.exec(line);
|
|
125
|
+
if (instead) {
|
|
126
|
+
const nowV = valuesIn(instead[1]).at(-1);
|
|
127
|
+
const oldV = valuesIn(instead[2])[0];
|
|
128
|
+
if (nowV && oldV && nowV !== oldV)
|
|
129
|
+
return { from: oldV, to: nowV };
|
|
130
|
+
}
|
|
131
|
+
// "Replace 10% with 20%".
|
|
132
|
+
const swap = /\breplac(?:e|es|ed|ing)\s+(.+?)\s+with\s+(.+?)(?:[.,;:](?=\s|$)|$)/i.exec(line);
|
|
133
|
+
if (swap) {
|
|
134
|
+
const a = valuesIn(swap[1])[0];
|
|
135
|
+
const b = valuesIn(swap[2])[0];
|
|
136
|
+
if (a && b && a !== b)
|
|
137
|
+
return { from: a, to: b };
|
|
138
|
+
}
|
|
139
|
+
// "not 10%": "SAVE10 now gives 20% off, not 10%."
|
|
140
|
+
const not = /^(.*),\s*not\s+(.+)$/i.exec(line);
|
|
141
|
+
if (not && /\bnow\b/i.test(not[1])) {
|
|
142
|
+
const nowV = valuesIn(not[1]).at(-1);
|
|
143
|
+
const oldV = valuesIn(not[2])[0];
|
|
144
|
+
if (nowV && oldV && nowV !== oldV)
|
|
145
|
+
return { from: oldV, to: nowV };
|
|
146
|
+
}
|
|
147
|
+
return null;
|
|
148
|
+
}
|
|
149
|
+
/** Replaces every occurrence of `from` in `s`, ignoring case. Returns null when `from` is not there. */
|
|
150
|
+
export function replaceValue(s, from, to) {
|
|
151
|
+
const esc = from.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
152
|
+
// A value must stand alone: 10% in "110%" is not 10%.
|
|
153
|
+
const re = new RegExp(`(?<![\\w.]|\\d,)${esc}(?![\\w]|[.,]\\d)`, 'gi');
|
|
154
|
+
if (!re.test(s))
|
|
155
|
+
return null;
|
|
156
|
+
return s.replace(re, to);
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/impact/text.ts"],"names":[],"mappings":"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"}
|