tinybeeai 0.0.0-stage β 0.16.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.railway/railway.ts +83 -0
- package/.railway/tsconfig.json +13 -0
- package/AGENTS.md +102 -0
- package/Dockerfile +108 -0
- package/LICENSE +21 -0
- package/README.md +275 -2
- package/bin/localdost.js +29 -0
- package/bin/tinybeeai.js +28 -0
- package/compose.yml +63 -0
- package/demo/payloads/ci_failure.json +46 -0
- package/demo/payloads/outage.json +18 -0
- package/demo/payloads/pr_comment_edited.json +50 -0
- package/demo/payloads/pr_merged.json +80 -0
- package/demo/payloads/pr_opened.json +69 -0
- package/demo/payloads/pr_synchronize.json +69 -0
- package/demo/payloads/ticket_created.json +138 -0
- package/demo/sample-app/playwright.config.ts +20 -0
- package/demo/sample-app/server.ts +163 -0
- package/demo/sample-app/tests/checkout.spec.ts +13 -0
- package/demo/sample-app/tests/smoke.spec.ts +8 -0
- package/dist/agent/approval-retries.js +59 -0
- package/dist/agent/approval-retries.js.map +1 -0
- package/dist/agent/approvals.js +390 -0
- package/dist/agent/approvals.js.map +1 -0
- package/dist/agent/chat-bridge.js +154 -0
- package/dist/agent/chat-bridge.js.map +1 -0
- package/dist/agent/chat-lead.js +475 -0
- package/dist/agent/chat-lead.js.map +1 -0
- package/dist/agent/chat-loop.js +106 -0
- package/dist/agent/chat-loop.js.map +1 -0
- package/dist/agent/chat-mcp.js +49 -0
- package/dist/agent/chat-mcp.js.map +1 -0
- package/dist/agent/chat-tool-blocks.js +453 -0
- package/dist/agent/chat-tool-blocks.js.map +1 -0
- package/dist/agent/chat-view.js +94 -0
- package/dist/agent/chat-view.js.map +1 -0
- package/dist/agent/chat-views.js +781 -0
- package/dist/agent/chat-views.js.map +1 -0
- package/dist/agent/chat.js +1703 -0
- package/dist/agent/chat.js.map +1 -0
- package/dist/agent/destinations.js +150 -0
- package/dist/agent/destinations.js.map +1 -0
- package/dist/agent/llm-cli.js +451 -0
- package/dist/agent/llm-cli.js.map +1 -0
- package/dist/agent/llm-codex.js +493 -0
- package/dist/agent/llm-codex.js.map +1 -0
- package/dist/agent/llm-openai.js +211 -0
- package/dist/agent/llm-openai.js.map +1 -0
- package/dist/agent/llm.js +1464 -0
- package/dist/agent/llm.js.map +1 -0
- package/dist/agent/memory.js +33 -0
- package/dist/agent/memory.js.map +1 -0
- package/dist/agent/mock-views.js +93 -0
- package/dist/agent/mock-views.js.map +1 -0
- package/dist/agent/model-availability.js +207 -0
- package/dist/agent/model-availability.js.map +1 -0
- package/dist/agent/model-errors.js +188 -0
- package/dist/agent/model-errors.js.map +1 -0
- package/dist/agent/model-guard.js +311 -0
- package/dist/agent/model-guard.js.map +1 -0
- package/dist/agent/prompts.js +374 -0
- package/dist/agent/prompts.js.map +1 -0
- package/dist/agent/qa-lenses/qa-auth.md +32 -0
- package/dist/agent/qa-lenses/qa-check-then-act.md +33 -0
- package/dist/agent/qa-lenses/qa-control-has-no-effect.md +32 -0
- package/dist/agent/qa-lenses/qa-dates.md +31 -0
- package/dist/agent/qa-lenses/qa-double-submit.md +34 -0
- package/dist/agent/qa-lenses/qa-feature-flag.md +29 -0
- package/dist/agent/qa-lenses/qa-migration.md +35 -0
- package/dist/agent/qa-lenses/qa-money.md +38 -0
- package/dist/agent/qa-lenses/qa-response-shape-break.md +33 -0
- package/dist/agent/qa-lenses/qa-validation.md +29 -0
- package/dist/agent/qa-prompts.js +660 -0
- package/dist/agent/qa-prompts.js.map +1 -0
- package/dist/agent/reasoning.js +55 -0
- package/dist/agent/reasoning.js.map +1 -0
- package/dist/agent/redact.js +48 -0
- package/dist/agent/redact.js.map +1 -0
- package/dist/agent/rules.js +927 -0
- package/dist/agent/rules.js.map +1 -0
- package/dist/agent/runs.js +440 -0
- package/dist/agent/runs.js.map +1 -0
- package/dist/agent/send-retry.js +62 -0
- package/dist/agent/send-retry.js.map +1 -0
- package/dist/agent/team-notes.js +288 -0
- package/dist/agent/team-notes.js.map +1 -0
- package/dist/agent/token-meter.js +31 -0
- package/dist/agent/token-meter.js.map +1 -0
- package/dist/agent/triage.js +506 -0
- package/dist/agent/triage.js.map +1 -0
- package/dist/api.js +1047 -0
- package/dist/api.js.map +1 -0
- package/dist/approval-targets.js +107 -0
- package/dist/approval-targets.js.map +1 -0
- package/dist/bee/cloudflared.js +108 -0
- package/dist/bee/cloudflared.js.map +1 -0
- package/dist/bee/health.js +99 -0
- package/dist/bee/health.js.map +1 -0
- package/dist/bee/hive-client.js +75 -0
- package/dist/bee/hive-client.js.map +1 -0
- package/dist/bee/identity.js +39 -0
- package/dist/bee/identity.js.map +1 -0
- package/dist/bee/models.js +510 -0
- package/dist/bee/models.js.map +1 -0
- package/dist/bee/pairing.js +351 -0
- package/dist/bee/pairing.js.map +1 -0
- package/dist/bee/relay-client.js +50 -0
- package/dist/bee/relay-client.js.map +1 -0
- package/dist/bee/routes.js +214 -0
- package/dist/bee/routes.js.map +1 -0
- package/dist/bee/setup-page.js +223 -0
- package/dist/bee/setup-page.js.map +1 -0
- package/dist/bee/state.js +41 -0
- package/dist/bee/state.js.map +1 -0
- package/dist/bee/status.js +117 -0
- package/dist/bee/status.js.map +1 -0
- package/dist/bee/tunnel-manager.js +245 -0
- package/dist/bee/tunnel-manager.js.map +1 -0
- package/dist/bee/updater.js +268 -0
- package/dist/bee/updater.js.map +1 -0
- package/dist/boot.js +41 -0
- package/dist/boot.js.map +1 -0
- package/dist/call/index.js +145 -0
- package/dist/call/index.js.map +1 -0
- package/dist/case-folders.js +294 -0
- package/dist/case-folders.js.map +1 -0
- package/dist/cases.js +554 -0
- package/dist/cases.js.map +1 -0
- package/dist/chat-blocks.js +709 -0
- package/dist/chat-blocks.js.map +1 -0
- package/dist/chat-parse-util.js +38 -0
- package/dist/chat-parse-util.js.map +1 -0
- package/dist/chat-results.js +96 -0
- package/dist/chat-results.js.map +1 -0
- package/dist/chat-stats.js +193 -0
- package/dist/chat-stats.js.map +1 -0
- package/dist/chat-view-specs.js +186 -0
- package/dist/chat-view-specs.js.map +1 -0
- package/dist/cli/doctor-ops.js +361 -0
- package/dist/cli/doctor-ops.js.map +1 -0
- package/dist/cli/doctor.js +289 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/dogfood.js +70 -0
- package/dist/cli/dogfood.js.map +1 -0
- package/dist/cli/env-file.js +34 -0
- package/dist/cli/env-file.js.map +1 -0
- package/dist/cli/eval-chat-cases.js +359 -0
- package/dist/cli/eval-chat-cases.js.map +1 -0
- package/dist/cli/eval-chat-results.js +85 -0
- package/dist/cli/eval-chat-results.js.map +1 -0
- package/dist/cli/eval-chat.js +508 -0
- package/dist/cli/eval-chat.js.map +1 -0
- package/dist/cli/eval-designer.js +67 -0
- package/dist/cli/eval-designer.js.map +1 -0
- package/dist/cli/eval-qa-review.js +284 -0
- package/dist/cli/eval-qa-review.js.map +1 -0
- package/dist/cli/golden-export.js +35 -0
- package/dist/cli/golden-export.js.map +1 -0
- package/dist/cli/index.js +90 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.js +746 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/scan-repo.js +199 -0
- package/dist/cli/scan-repo.js.map +1 -0
- package/dist/cli/seed.js +108 -0
- package/dist/cli/seed.js.map +1 -0
- package/dist/cli/tinybee.js +247 -0
- package/dist/cli/tinybee.js.map +1 -0
- package/dist/config.js +138 -0
- package/dist/config.js.map +1 -0
- package/dist/connect/aivision-local.js +833 -0
- package/dist/connect/aivision-local.js.map +1 -0
- package/dist/connect/aivision-token.js +84 -0
- package/dist/connect/aivision-token.js.map +1 -0
- package/dist/connect/crypto.js +65 -0
- package/dist/connect/crypto.js.map +1 -0
- package/dist/connect/deps.js +110 -0
- package/dist/connect/deps.js.map +1 -0
- package/dist/connect/engines.js +144 -0
- package/dist/connect/engines.js.map +1 -0
- package/dist/connect/github-access.js +74 -0
- package/dist/connect/github-access.js.map +1 -0
- package/dist/connect/github-app.js +129 -0
- package/dist/connect/github-app.js.map +1 -0
- package/dist/connect/index.js +9 -0
- package/dist/connect/index.js.map +1 -0
- package/dist/connect/model-choices.js +201 -0
- package/dist/connect/model-choices.js.map +1 -0
- package/dist/connect/providers.js +900 -0
- package/dist/connect/providers.js.map +1 -0
- package/dist/connect/readiness.js +232 -0
- package/dist/connect/readiness.js.map +1 -0
- package/dist/connect/redact.js +16 -0
- package/dist/connect/redact.js.map +1 -0
- package/dist/connect/registry.js +406 -0
- package/dist/connect/registry.js.map +1 -0
- package/dist/connect/store.js +283 -0
- package/dist/connect/store.js.map +1 -0
- package/dist/connect/tunnel.js +134 -0
- package/dist/connect/tunnel.js.map +1 -0
- package/dist/connect/types.js +8 -0
- package/dist/connect/types.js.map +1 -0
- package/dist/connections/index.js +5 -0
- package/dist/connections/index.js.map +1 -0
- package/dist/connections/manager.js +223 -0
- package/dist/connections/manager.js.map +1 -0
- package/dist/connections/presets.js +264 -0
- package/dist/connections/presets.js.map +1 -0
- package/dist/connections/store.js +132 -0
- package/dist/connections/store.js.map +1 -0
- package/dist/connections/tools.js +206 -0
- package/dist/connections/tools.js.map +1 -0
- package/dist/db-schema.js +355 -0
- package/dist/db-schema.js.map +1 -0
- package/dist/db.js +379 -0
- package/dist/db.js.map +1 -0
- package/dist/delivery.js +49 -0
- package/dist/delivery.js.map +1 -0
- package/dist/deploy-wait.js +701 -0
- package/dist/deploy-wait.js.map +1 -0
- package/dist/disk.js +243 -0
- package/dist/disk.js.map +1 -0
- package/dist/dot-health.js +966 -0
- package/dist/dot-health.js.map +1 -0
- package/dist/dot-remove.js +246 -0
- package/dist/dot-remove.js.map +1 -0
- package/dist/events.js +38 -0
- package/dist/events.js.map +1 -0
- package/dist/evidence-pack.js +423 -0
- package/dist/evidence-pack.js.map +1 -0
- package/dist/flows/answers.js +289 -0
- package/dist/flows/answers.js.map +1 -0
- package/dist/flows/change.js +811 -0
- package/dist/flows/change.js.map +1 -0
- package/dist/flows/checkStatus.js +524 -0
- package/dist/flows/checkStatus.js.map +1 -0
- package/dist/flows/ci.js +236 -0
- package/dist/flows/ci.js.map +1 -0
- package/dist/flows/ciFailure.js +76 -0
- package/dist/flows/ciFailure.js.map +1 -0
- package/dist/flows/common.js +522 -0
- package/dist/flows/common.js.map +1 -0
- package/dist/flows/default-branch.js +29 -0
- package/dist/flows/default-branch.js.map +1 -0
- package/dist/flows/defectDraft.js +447 -0
- package/dist/flows/defectDraft.js.map +1 -0
- package/dist/flows/defects.js +623 -0
- package/dist/flows/defects.js.map +1 -0
- package/dist/flows/digest.js +295 -0
- package/dist/flows/digest.js.map +1 -0
- package/dist/flows/impact.js +82 -0
- package/dist/flows/impact.js.map +1 -0
- package/dist/flows/index.js +23 -0
- package/dist/flows/index.js.map +1 -0
- package/dist/flows/intent-sources.js +72 -0
- package/dist/flows/intent-sources.js.map +1 -0
- package/dist/flows/mergeCases.js +169 -0
- package/dist/flows/mergeCases.js.map +1 -0
- package/dist/flows/nightlyRun.js +82 -0
- package/dist/flows/nightlyRun.js.map +1 -0
- package/dist/flows/outage.js +64 -0
- package/dist/flows/outage.js.map +1 -0
- package/dist/flows/postMerge.js +5 -0
- package/dist/flows/postMerge.js.map +1 -0
- package/dist/flows/prCheck.js +5 -0
- package/dist/flows/prCheck.js.map +1 -0
- package/dist/flows/prTarget.js +66 -0
- package/dist/flows/prTarget.js.map +1 -0
- package/dist/flows/qa.js +363 -0
- package/dist/flows/qa.js.map +1 -0
- package/dist/flows/questions.js +160 -0
- package/dist/flows/questions.js.map +1 -0
- package/dist/flows/recovery.js +64 -0
- package/dist/flows/recovery.js.map +1 -0
- package/dist/flows/rerun.js +50 -0
- package/dist/flows/rerun.js.map +1 -0
- package/dist/flows/testDesign.js +294 -0
- package/dist/flows/testDesign.js.map +1 -0
- package/dist/flows/testDesignJob.js +46 -0
- package/dist/flows/testDesignJob.js.map +1 -0
- package/dist/flows/testRepo.js +228 -0
- package/dist/flows/testRepo.js.map +1 -0
- package/dist/flows/testSavings.js +381 -0
- package/dist/flows/testSavings.js.map +1 -0
- package/dist/flows/testStatus.js +343 -0
- package/dist/flows/testStatus.js.map +1 -0
- package/dist/flows/ticketContext.js +425 -0
- package/dist/flows/ticketContext.js.map +1 -0
- package/dist/flows/ticketReview.js +249 -0
- package/dist/flows/ticketReview.js.map +1 -0
- package/dist/flows/ticks.js +73 -0
- package/dist/flows/ticks.js.map +1 -0
- package/dist/hive/admin.js +122 -0
- package/dist/hive/admin.js.map +1 -0
- package/dist/hive/auth.js +130 -0
- package/dist/hive/auth.js.map +1 -0
- package/dist/hive/billing.js +278 -0
- package/dist/hive/billing.js.map +1 -0
- package/dist/hive/config.js +63 -0
- package/dist/hive/config.js.map +1 -0
- package/dist/hive/db.js +186 -0
- package/dist/hive/db.js.map +1 -0
- package/dist/hive/embed.js +76 -0
- package/dist/hive/embed.js.map +1 -0
- package/dist/hive/errors.js +17 -0
- package/dist/hive/errors.js.map +1 -0
- package/dist/hive/google.js +75 -0
- package/dist/hive/google.js.map +1 -0
- package/dist/hive/index.js +25 -0
- package/dist/hive/index.js.map +1 -0
- package/dist/hive/jwt.js +57 -0
- package/dist/hive/jwt.js.map +1 -0
- package/dist/hive/keys.js +61 -0
- package/dist/hive/keys.js.map +1 -0
- package/dist/hive/mail.js +27 -0
- package/dist/hive/mail.js.map +1 -0
- package/dist/hive/native-push.js +255 -0
- package/dist/hive/native-push.js.map +1 -0
- package/dist/hive/pairing.js +342 -0
- package/dist/hive/pairing.js.map +1 -0
- package/dist/hive/presence.js +121 -0
- package/dist/hive/presence.js.map +1 -0
- package/dist/hive/push.js +185 -0
- package/dist/hive/push.js.map +1 -0
- package/dist/hive/relay.js +205 -0
- package/dist/hive/relay.js.map +1 -0
- package/dist/hive/routes.js +228 -0
- package/dist/hive/routes.js.map +1 -0
- package/dist/hive/server.js +12 -0
- package/dist/hive/server.js.map +1 -0
- package/dist/hive/session.js +28 -0
- package/dist/hive/session.js.map +1 -0
- package/dist/hive/tenants.js +287 -0
- package/dist/hive/tenants.js.map +1 -0
- package/dist/hive/tunnel/cloudflare.js +160 -0
- package/dist/hive/tunnel/cloudflare.js.map +1 -0
- package/dist/hive/tunnel/mock.js +52 -0
- package/dist/hive/tunnel/mock.js.map +1 -0
- package/dist/hive/tunnel/provider.js +19 -0
- package/dist/hive/tunnel/provider.js.map +1 -0
- package/dist/hive/updates.js +61 -0
- package/dist/hive/updates.js.map +1 -0
- package/dist/http-error.js +11 -0
- package/dist/http-error.js.map +1 -0
- package/dist/impact/classify.js +226 -0
- package/dist/impact/classify.js.map +1 -0
- package/dist/impact/find.js +259 -0
- package/dist/impact/find.js.map +1 -0
- package/dist/impact/pr.js +54 -0
- package/dist/impact/pr.js.map +1 -0
- package/dist/impact/store.js +365 -0
- package/dist/impact/store.js.map +1 -0
- package/dist/impact/text.js +158 -0
- package/dist/impact/text.js.map +1 -0
- package/dist/index.js +288 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/adf.js +397 -0
- package/dist/integrations/adf.js.map +1 -0
- package/dist/integrations/bot-marker.js +103 -0
- package/dist/integrations/bot-marker.js.map +1 -0
- package/dist/integrations/github-issues.js +705 -0
- package/dist/integrations/github-issues.js.map +1 -0
- package/dist/integrations/github.js +1284 -0
- package/dist/integrations/github.js.map +1 -0
- package/dist/integrations/issue-create.js +60 -0
- package/dist/integrations/issue-create.js.map +1 -0
- package/dist/integrations/jira.js +279 -0
- package/dist/integrations/jira.js.map +1 -0
- package/dist/integrations/linear.js +273 -0
- package/dist/integrations/linear.js.map +1 -0
- package/dist/integrations/own-identity-warm.js +47 -0
- package/dist/integrations/own-identity-warm.js.map +1 -0
- package/dist/integrations/own-identity.js +39 -0
- package/dist/integrations/own-identity.js.map +1 -0
- package/dist/integrations/status-change.js +42 -0
- package/dist/integrations/status-change.js.map +1 -0
- package/dist/lead-defects.js +202 -0
- package/dist/lead-defects.js.map +1 -0
- package/dist/lead-digest.js +333 -0
- package/dist/lead-digest.js.map +1 -0
- package/dist/lead-release.js +286 -0
- package/dist/lead-release.js.map +1 -0
- package/dist/lead.js +328 -0
- package/dist/lead.js.map +1 -0
- package/dist/legacy-names.js +51 -0
- package/dist/legacy-names.js.map +1 -0
- package/dist/limits.js +44 -0
- package/dist/limits.js.map +1 -0
- package/dist/link-trust.js +224 -0
- package/dist/link-trust.js.map +1 -0
- package/dist/links.js +219 -0
- package/dist/links.js.map +1 -0
- package/dist/loopback.js +35 -0
- package/dist/loopback.js.map +1 -0
- package/dist/model-cap.js +60 -0
- package/dist/model-cap.js.map +1 -0
- package/dist/model-usage.js +173 -0
- package/dist/model-usage.js.map +1 -0
- package/dist/monitor/backfill.js +39 -0
- package/dist/monitor/backfill.js.map +1 -0
- package/dist/monitor/browser-probe.js +198 -0
- package/dist/monitor/browser-probe.js.map +1 -0
- package/dist/monitor/catch-up.js +31 -0
- package/dist/monitor/catch-up.js.map +1 -0
- package/dist/monitor/pollers.js +1606 -0
- package/dist/monitor/pollers.js.map +1 -0
- package/dist/monitor/probes.js +178 -0
- package/dist/monitor/probes.js.map +1 -0
- package/dist/monitor/self-health.js +228 -0
- package/dist/monitor/self-health.js.map +1 -0
- package/dist/monitor/statuspage.js +105 -0
- package/dist/monitor/statuspage.js.map +1 -0
- package/dist/nightly-scheduler.js +127 -0
- package/dist/nightly-scheduler.js.map +1 -0
- package/dist/nightly.js +141 -0
- package/dist/nightly.js.map +1 -0
- package/dist/notify/headline.js +114 -0
- package/dist/notify/headline.js.map +1 -0
- package/dist/notify/push.js +174 -0
- package/dist/notify/push.js.map +1 -0
- package/dist/object-cards.js +585 -0
- package/dist/object-cards.js.map +1 -0
- package/dist/object-links.js +47 -0
- package/dist/object-links.js.map +1 -0
- package/dist/onboarding-checks.js +141 -0
- package/dist/onboarding-checks.js.map +1 -0
- package/dist/onboarding.js +401 -0
- package/dist/onboarding.js.map +1 -0
- package/dist/path-filters.js +62 -0
- package/dist/path-filters.js.map +1 -0
- package/dist/phone/alerts.js +67 -0
- package/dist/phone/alerts.js.map +1 -0
- package/dist/phone/auth.js +240 -0
- package/dist/phone/auth.js.map +1 -0
- package/dist/phone/pairing.js +442 -0
- package/dist/phone/pairing.js.map +1 -0
- package/dist/phone/prefs.js +27 -0
- package/dist/phone/prefs.js.map +1 -0
- package/dist/phone/tailscale.js +161 -0
- package/dist/phone/tailscale.js.map +1 -0
- package/dist/pr-scope.js +441 -0
- package/dist/pr-scope.js.map +1 -0
- package/dist/proc.js +156 -0
- package/dist/proc.js.map +1 -0
- package/dist/profile/cache.js +108 -0
- package/dist/profile/cache.js.map +1 -0
- package/dist/profile/ci.js +216 -0
- package/dist/profile/ci.js.map +1 -0
- package/dist/profile/index.js +8 -0
- package/dist/profile/index.js.map +1 -0
- package/dist/profile/job.js +135 -0
- package/dist/profile/job.js.map +1 -0
- package/dist/profile/queries/go-tags.scm +47 -0
- package/dist/profile/queries/java-tags.scm +25 -0
- package/dist/profile/queries/javascript-tags.scm +104 -0
- package/dist/profile/queries/python-tags.scm +19 -0
- package/dist/profile/queries/typescript-tags.scm +28 -0
- package/dist/profile/scan-thread.js +42 -0
- package/dist/profile/scan-thread.js.map +1 -0
- package/dist/profile/scan-worker.js +16 -0
- package/dist/profile/scan-worker.js.map +1 -0
- package/dist/profile/scan.js +351 -0
- package/dist/profile/scan.js.map +1 -0
- package/dist/profile/stack.js +528 -0
- package/dist/profile/stack.js.map +1 -0
- package/dist/profile/store.js +35 -0
- package/dist/profile/store.js.map +1 -0
- package/dist/profile/tests.js +399 -0
- package/dist/profile/tests.js.map +1 -0
- package/dist/queue.js +350 -0
- package/dist/queue.js.map +1 -0
- package/dist/refs.js +756 -0
- package/dist/refs.js.map +1 -0
- package/dist/release-notes.js +272 -0
- package/dist/release-notes.js.map +1 -0
- package/dist/reports/build.js +243 -0
- package/dist/reports/build.js.map +1 -0
- package/dist/reports/index.js +211 -0
- package/dist/reports/index.js.map +1 -0
- package/dist/reports/store.js +150 -0
- package/dist/reports/store.js.map +1 -0
- package/dist/reports/ticket-titles.js +124 -0
- package/dist/reports/ticket-titles.js.map +1 -0
- package/dist/reports/trace-map.js +1278 -0
- package/dist/reports/trace-map.js.map +1 -0
- package/dist/reports/traceability.js +422 -0
- package/dist/reports/traceability.js.map +1 -0
- package/dist/repos/mirror.js +356 -0
- package/dist/repos/mirror.js.map +1 -0
- package/dist/repos-github.js +108 -0
- package/dist/repos-github.js.map +1 -0
- package/dist/repos.js +891 -0
- package/dist/repos.js.map +1 -0
- package/dist/review/backend-anthropic.js +90 -0
- package/dist/review/backend-anthropic.js.map +1 -0
- package/dist/review/backend-cli.js +248 -0
- package/dist/review/backend-cli.js.map +1 -0
- package/dist/review/backend-codex.js +81 -0
- package/dist/review/backend-codex.js.map +1 -0
- package/dist/review/backend-mock.js +686 -0
- package/dist/review/backend-mock.js.map +1 -0
- package/dist/review/backend-only.js +168 -0
- package/dist/review/backend-only.js.map +1 -0
- package/dist/review/backend.js +105 -0
- package/dist/review/backend.js.map +1 -0
- package/dist/review/baseline/render-v1.js +483 -0
- package/dist/review/baseline/render-v1.js.map +1 -0
- package/dist/review/change-summary.js +197 -0
- package/dist/review/change-summary.js.map +1 -0
- package/dist/review/changelog.js +40 -0
- package/dist/review/changelog.js.map +1 -0
- package/dist/review/check.js +494 -0
- package/dist/review/check.js.map +1 -0
- package/dist/review/checkout.js +185 -0
- package/dist/review/checkout.js.map +1 -0
- package/dist/review/classify.js +178 -0
- package/dist/review/classify.js.map +1 -0
- package/dist/review/coverage.js +347 -0
- package/dist/review/coverage.js.map +1 -0
- package/dist/review/decision-eval.js +121 -0
- package/dist/review/decision-eval.js.map +1 -0
- package/dist/review/deliver.js +104 -0
- package/dist/review/deliver.js.map +1 -0
- package/dist/review/designer-eval.js +280 -0
- package/dist/review/designer-eval.js.map +1 -0
- package/dist/review/dogfood-digest.js +136 -0
- package/dist/review/dogfood-digest.js.map +1 -0
- package/dist/review/dogfood-eval.js +486 -0
- package/dist/review/dogfood-eval.js.map +1 -0
- package/dist/review/environment.js +109 -0
- package/dist/review/environment.js.map +1 -0
- package/dist/review/eval.js +405 -0
- package/dist/review/eval.js.map +1 -0
- package/dist/review/glob.js +110 -0
- package/dist/review/glob.js.map +1 -0
- package/dist/review/golden-export.js +219 -0
- package/dist/review/golden-export.js.map +1 -0
- package/dist/review/impact.js +406 -0
- package/dist/review/impact.js.map +1 -0
- package/dist/review/imports.js +542 -0
- package/dist/review/imports.js.map +1 -0
- package/dist/review/index.js +512 -0
- package/dist/review/index.js.map +1 -0
- package/dist/review/intent.js +128 -0
- package/dist/review/intent.js.map +1 -0
- package/dist/review/lenses.js +167 -0
- package/dist/review/lenses.js.map +1 -0
- package/dist/review/linked-tickets.js +293 -0
- package/dist/review/linked-tickets.js.map +1 -0
- package/dist/review/merge.js +370 -0
- package/dist/review/merge.js.map +1 -0
- package/dist/review/on-demand.js +218 -0
- package/dist/review/on-demand.js.map +1 -0
- package/dist/review/prompt-eval.js +299 -0
- package/dist/review/prompt-eval.js.map +1 -0
- package/dist/review/prompt-variants.js +37 -0
- package/dist/review/prompt-variants.js.map +1 -0
- package/dist/review/readability-eval.js +217 -0
- package/dist/review/readability-eval.js.map +1 -0
- package/dist/review/readability.js +295 -0
- package/dist/review/readability.js.map +1 -0
- package/dist/review/render.js +2409 -0
- package/dist/review/render.js.map +1 -0
- package/dist/review/repo.js +194 -0
- package/dist/review/repo.js.map +1 -0
- package/dist/review/report-plan.js +90 -0
- package/dist/review/report-plan.js.map +1 -0
- package/dist/review/routes.js +195 -0
- package/dist/review/routes.js.map +1 -0
- package/dist/review/run-summary.js +34 -0
- package/dist/review/run-summary.js.map +1 -0
- package/dist/review/run.js +245 -0
- package/dist/review/run.js.map +1 -0
- package/dist/review/scope.js +454 -0
- package/dist/review/scope.js.map +1 -0
- package/dist/review/security.js +432 -0
- package/dist/review/security.js.map +1 -0
- package/dist/review/signals.js +550 -0
- package/dist/review/signals.js.map +1 -0
- package/dist/review/specs.js +150 -0
- package/dist/review/specs.js.map +1 -0
- package/dist/review/ste.js +133 -0
- package/dist/review/ste.js.map +1 -0
- package/dist/review/test-repo-file.js +18 -0
- package/dist/review/test-repo-file.js.map +1 -0
- package/dist/review/test-repo-lines.js +53 -0
- package/dist/review/test-repo-lines.js.map +1 -0
- package/dist/review/ticket-on-demand.js +232 -0
- package/dist/review/ticket-on-demand.js.map +1 -0
- package/dist/review/yaml.js +298 -0
- package/dist/review/yaml.js.map +1 -0
- package/dist/room.js +361 -0
- package/dist/room.js.map +1 -0
- package/dist/routes/activity.js +219 -0
- package/dist/routes/activity.js.map +1 -0
- package/dist/routes/call.js +29 -0
- package/dist/routes/call.js.map +1 -0
- package/dist/routes/cards.js +40 -0
- package/dist/routes/cards.js.map +1 -0
- package/dist/routes/cases.js +133 -0
- package/dist/routes/cases.js.map +1 -0
- package/dist/routes/connect.js +268 -0
- package/dist/routes/connect.js.map +1 -0
- package/dist/routes/connection-presets.js +32 -0
- package/dist/routes/connection-presets.js.map +1 -0
- package/dist/routes/connections.js +177 -0
- package/dist/routes/connections.js.map +1 -0
- package/dist/routes/disk.js +19 -0
- package/dist/routes/disk.js.map +1 -0
- package/dist/routes/docs.js +71 -0
- package/dist/routes/docs.js.map +1 -0
- package/dist/routes/dot-suggest.js +1002 -0
- package/dist/routes/dot-suggest.js.map +1 -0
- package/dist/routes/evidence-pack.js +16 -0
- package/dist/routes/evidence-pack.js.map +1 -0
- package/dist/routes/health.js +121 -0
- package/dist/routes/health.js.map +1 -0
- package/dist/routes/impact.js +48 -0
- package/dist/routes/impact.js.map +1 -0
- package/dist/routes/lead.js +50 -0
- package/dist/routes/lead.js.map +1 -0
- package/dist/routes/links.js +13 -0
- package/dist/routes/links.js.map +1 -0
- package/dist/routes/markdown.js +62 -0
- package/dist/routes/markdown.js.map +1 -0
- package/dist/routes/onboarding.js +47 -0
- package/dist/routes/onboarding.js.map +1 -0
- package/dist/routes/phone.js +231 -0
- package/dist/routes/phone.js.map +1 -0
- package/dist/routes/release-notes.js +30 -0
- package/dist/routes/release-notes.js.map +1 -0
- package/dist/routes/reports.js +102 -0
- package/dist/routes/reports.js.map +1 -0
- package/dist/routes/repos.js +91 -0
- package/dist/routes/repos.js.map +1 -0
- package/dist/routes/review.js +283 -0
- package/dist/routes/review.js.map +1 -0
- package/dist/routes/roles.js +114 -0
- package/dist/routes/roles.js.map +1 -0
- package/dist/routes/room.js +21 -0
- package/dist/routes/room.js.map +1 -0
- package/dist/routes/runner.js +156 -0
- package/dist/routes/runner.js.map +1 -0
- package/dist/routes/runs.js +84 -0
- package/dist/routes/runs.js.map +1 -0
- package/dist/routes/setup.js +18 -0
- package/dist/routes/setup.js.map +1 -0
- package/dist/routes/test-runs.js +220 -0
- package/dist/routes/test-runs.js.map +1 -0
- package/dist/routes/ticket-status.js +17 -0
- package/dist/routes/ticket-status.js.map +1 -0
- package/dist/routes/traceability.js +143 -0
- package/dist/routes/traceability.js.map +1 -0
- package/dist/routes/true.js +142 -0
- package/dist/routes/true.js.map +1 -0
- package/dist/routes/updates.js +70 -0
- package/dist/routes/updates.js.map +1 -0
- package/dist/runner/adapters/index.js +12 -0
- package/dist/runner/adapters/index.js.map +1 -0
- package/dist/runner/adapters/playwright.js +68 -0
- package/dist/runner/adapters/playwright.js.map +1 -0
- package/dist/runner/aivision/cases.js +172 -0
- package/dist/runner/aivision/cases.js.map +1 -0
- package/dist/runner/aivision/cli.js +201 -0
- package/dist/runner/aivision/cli.js.map +1 -0
- package/dist/runner/aivision/index.js +281 -0
- package/dist/runner/aivision/index.js.map +1 -0
- package/dist/runner/aivision/server.js +394 -0
- package/dist/runner/aivision/server.js.map +1 -0
- package/dist/runner/aivision/shared.js +140 -0
- package/dist/runner/aivision/shared.js.map +1 -0
- package/dist/runner/artifact-cap.js +189 -0
- package/dist/runner/artifact-cap.js.map +1 -0
- package/dist/runner/artifacts.js +433 -0
- package/dist/runner/artifacts.js.map +1 -0
- package/dist/runner/command.js +564 -0
- package/dist/runner/command.js.map +1 -0
- package/dist/runner/copyfiles.js +221 -0
- package/dist/runner/copyfiles.js.map +1 -0
- package/dist/runner/engines.js +32 -0
- package/dist/runner/engines.js.map +1 -0
- package/dist/runner/evidence.js +114 -0
- package/dist/runner/evidence.js.map +1 -0
- package/dist/runner/host-env.js +160 -0
- package/dist/runner/host-env.js.map +1 -0
- package/dist/runner/index.js +1221 -0
- package/dist/runner/index.js.map +1 -0
- package/dist/runner/observe.js +603 -0
- package/dist/runner/observe.js.map +1 -0
- package/dist/runner/playwright-json.js +108 -0
- package/dist/runner/playwright-json.js.map +1 -0
- package/dist/runner/pwgen/exec.js +192 -0
- package/dist/runner/pwgen/exec.js.map +1 -0
- package/dist/runner/pwgen/explore.js +111 -0
- package/dist/runner/pwgen/explore.js.map +1 -0
- package/dist/runner/pwgen/index.js +423 -0
- package/dist/runner/pwgen/index.js.map +1 -0
- package/dist/runner/pwgen/propose.js +69 -0
- package/dist/runner/pwgen/propose.js.map +1 -0
- package/dist/runner/pwgen/source.js +632 -0
- package/dist/runner/pwgen/source.js.map +1 -0
- package/dist/runner/setup.js +222 -0
- package/dist/runner/setup.js.map +1 -0
- package/dist/runner/step-reporter.js +107 -0
- package/dist/runner/step-reporter.js.map +1 -0
- package/dist/runner/test-repo.js +326 -0
- package/dist/runner/test-repo.js.map +1 -0
- package/dist/runner/typed-value.js +46 -0
- package/dist/runner/typed-value.js.map +1 -0
- package/dist/runner/verify.js +133 -0
- package/dist/runner/verify.js.map +1 -0
- package/dist/runner/worktree.js +349 -0
- package/dist/runner/worktree.js.map +1 -0
- package/dist/sandbox.js +61 -0
- package/dist/sandbox.js.map +1 -0
- package/dist/server.js +262 -0
- package/dist/server.js.map +1 -0
- package/dist/shadow-week.js +126 -0
- package/dist/shadow-week.js.map +1 -0
- package/dist/shutdown.js +92 -0
- package/dist/shutdown.js.map +1 -0
- package/dist/slack/index.js +645 -0
- package/dist/slack/index.js.map +1 -0
- package/dist/stages/config.js +147 -0
- package/dist/stages/config.js.map +1 -0
- package/dist/stages/index.js +41 -0
- package/dist/stages/index.js.map +1 -0
- package/dist/suites.js +293 -0
- package/dist/suites.js.map +1 -0
- package/dist/target-url.js +116 -0
- package/dist/target-url.js.map +1 -0
- package/dist/test-runs.js +662 -0
- package/dist/test-runs.js.map +1 -0
- package/dist/ticket-keys.js +97 -0
- package/dist/ticket-keys.js.map +1 -0
- package/dist/ticket-supersede.js +105 -0
- package/dist/ticket-supersede.js.map +1 -0
- package/dist/tinybee/ed25519.js +99 -0
- package/dist/tinybee/ed25519.js.map +1 -0
- package/dist/tinybee/models-routes.js +19 -0
- package/dist/tinybee/models-routes.js.map +1 -0
- package/dist/tinybee/pair-payload.js +41 -0
- package/dist/tinybee/pair-payload.js.map +1 -0
- package/dist/tinybee/update-manifest.js +77 -0
- package/dist/tinybee/update-manifest.js.map +1 -0
- package/dist/tinybee/well-known.js +64 -0
- package/dist/tinybee/well-known.js.map +1 -0
- package/dist/tinybee/workflows/activity.js +23 -0
- package/dist/tinybee/workflows/activity.js.map +1 -0
- package/dist/tinybee/workflows/cron.js +210 -0
- package/dist/tinybee/workflows/cron.js.map +1 -0
- package/dist/tinybee/workflows/engine.js +371 -0
- package/dist/tinybee/workflows/engine.js.map +1 -0
- package/dist/tinybee/workflows/from-text.js +203 -0
- package/dist/tinybee/workflows/from-text.js.map +1 -0
- package/dist/tinybee/workflows/routes.js +189 -0
- package/dist/tinybee/workflows/routes.js.map +1 -0
- package/dist/tinybee/workflows/scheduler.js +100 -0
- package/dist/tinybee/workflows/scheduler.js.map +1 -0
- package/dist/tinybee/workflows/skills.js +227 -0
- package/dist/tinybee/workflows/skills.js.map +1 -0
- package/dist/tinybee/workflows/store.js +205 -0
- package/dist/tinybee/workflows/store.js.map +1 -0
- package/dist/tinybee/workflows/types.js +180 -0
- package/dist/tinybee/workflows/types.js.map +1 -0
- package/dist/tinybee/workflows/yaml.js +323 -0
- package/dist/tinybee/workflows/yaml.js.map +1 -0
- package/dist/true/api.js +495 -0
- package/dist/true/api.js.map +1 -0
- package/dist/true/client.js +292 -0
- package/dist/true/client.js.map +1 -0
- package/dist/true/clock.js +36 -0
- package/dist/true/clock.js.map +1 -0
- package/dist/true/events.js +125 -0
- package/dist/true/events.js.map +1 -0
- package/dist/true/hosts.js +98 -0
- package/dist/true/hosts.js.map +1 -0
- package/dist/true/index.js +29 -0
- package/dist/true/index.js.map +1 -0
- package/dist/true/key.js +54 -0
- package/dist/true/key.js.map +1 -0
- package/dist/true/line.js +69 -0
- package/dist/true/line.js.map +1 -0
- package/dist/true/mask.js +31 -0
- package/dist/true/mask.js.map +1 -0
- package/dist/true/names.js +114 -0
- package/dist/true/names.js.map +1 -0
- package/dist/true/outbox.js +233 -0
- package/dist/true/outbox.js.map +1 -0
- package/dist/true/replay.js +164 -0
- package/dist/true/replay.js.map +1 -0
- package/dist/true/settings.js +123 -0
- package/dist/true/settings.js.map +1 -0
- package/dist/true/status.js +189 -0
- package/dist/true/status.js.map +1 -0
- package/dist/true/sync-cases.js +222 -0
- package/dist/true/sync-cases.js.map +1 -0
- package/dist/true/sync-manual.js +295 -0
- package/dist/true/sync-manual.js.map +1 -0
- package/dist/true/sync-runs.js +109 -0
- package/dist/true/sync-runs.js.map +1 -0
- package/dist/true/worker.js +414 -0
- package/dist/true/worker.js.map +1 -0
- package/dist/types.js +32 -0
- package/dist/types.js.map +1 -0
- package/dist/updates/asks.js +38 -0
- package/dist/updates/asks.js.map +1 -0
- package/dist/updates/index.js +835 -0
- package/dist/updates/index.js.map +1 -0
- package/dist/updates/owner.js +24 -0
- package/dist/updates/owner.js.map +1 -0
- package/dist/updates/prefs.js +118 -0
- package/dist/updates/prefs.js.map +1 -0
- package/dist/updates/route.js +78 -0
- package/dist/updates/route.js.map +1 -0
- package/dist/updates/sources.js +345 -0
- package/dist/updates/sources.js.map +1 -0
- package/dist/updates/words.js +452 -0
- package/dist/updates/words.js.map +1 -0
- package/dist/version.js +53 -0
- package/dist/version.js.map +1 -0
- package/dist/view-compute.js +382 -0
- package/dist/view-compute.js.map +1 -0
- package/dist/view-spec.js +894 -0
- package/dist/view-spec.js.map +1 -0
- package/dist/web/apple-touch-icon.png +0 -0
- package/dist/web/assets/ApprovalCard-Br_z5z7G.css +1 -0
- package/dist/web/assets/ApprovalCard-CfGhGFo_.js +3 -0
- package/dist/web/assets/CardFromRef-BaTGmZ9c.js +2 -0
- package/dist/web/assets/CardFromRef-DO7i2uDd.css +1 -0
- package/dist/web/assets/Cases-8l_6UcLh.js +2 -0
- package/dist/web/assets/Cases-CpfED0uB.css +1 -0
- package/dist/web/assets/Chat-BKDiR0qt.js +3 -0
- package/dist/web/assets/Chat-DxjdyYUu.css +1 -0
- package/dist/web/assets/ConfirmDialog-CIMveD-b.js +2 -0
- package/dist/web/assets/ConnectSheet-Cm5vbZdR.js +4 -0
- package/dist/web/assets/Docs-HKGuY0WE.js +2 -0
- package/dist/web/assets/Docs-fodKx8S7.css +1 -0
- package/dist/web/assets/DotDetail-DskS3NWe.js +2 -0
- package/dist/web/assets/DotDetail-OWRSD_1x.css +1 -0
- package/dist/web/assets/DotStage-BZDclfzV.css +1 -0
- package/dist/web/assets/DotStage-CtMNzCN3.js +2 -0
- package/dist/web/assets/Dots-BqCsS34m.js +2 -0
- package/dist/web/assets/EvidencePack-DQ3kCJX4.js +2 -0
- package/dist/web/assets/EvidencePack-DV_9ETsA.css +1 -0
- package/dist/web/assets/FailedDeliveries-1F2kFcs9.js +2 -0
- package/dist/web/assets/FailedDeliveries-DXa2_VvI.css +1 -0
- package/dist/web/assets/Feed-5wiHRTFK.js +2 -0
- package/dist/web/assets/GfmView-C-NYaduC.js +4 -0
- package/dist/web/assets/ImpactList-C-RNuDB0.js +2 -0
- package/dist/web/assets/ImpactList-C612dFdw.css +1 -0
- package/dist/web/assets/Inbox-kc1bKVL_.js +2 -0
- package/dist/web/assets/JoinScreen-C3L4wmP3.js +2 -0
- package/dist/web/assets/JoinScreen-COeAUv5v.css +1 -0
- package/dist/web/assets/LeadDialog-N3Zul9Rw.js +8 -0
- package/dist/web/assets/LeadDialog-xyWjAuAS.css +1 -0
- package/dist/web/assets/ListeningLine-BRFNaczY.js +2 -0
- package/dist/web/assets/ListeningLine-pN8CgyiK.css +1 -0
- package/dist/web/assets/Mascots-pIyGpxtD.js +2 -0
- package/dist/web/assets/ModelChoices-BxO1zyyr.js +2 -0
- package/dist/web/assets/ModelChoices-DQJnVxfs.css +1 -0
- package/dist/web/assets/NewDotDialog-CDPUWmgN.js +2 -0
- package/dist/web/assets/NewDotDialog-DrPPqkSZ.css +1 -0
- package/dist/web/assets/NewTestRunDialog-BQBthVHE.js +2 -0
- package/dist/web/assets/NoBreakNames-Csxdqdt6.js +2 -0
- package/dist/web/assets/Pair-omex_K7H.js +2 -0
- package/dist/web/assets/PushSection-CmqHlE_2.js +2 -0
- package/dist/web/assets/ReleaseNotes-B6VqFewP.js +2 -0
- package/dist/web/assets/ReleaseNotes-DBJUL7Vm.css +1 -0
- package/dist/web/assets/ReportPage-BHS1xWEt.js +162 -0
- package/dist/web/assets/Reports-BEHnDIb1.js +2 -0
- package/dist/web/assets/ReviewChangeDialog-BVSt-cw-.js +2 -0
- package/dist/web/assets/ReviewChangeDialog-BbIlHRx0.css +1 -0
- package/dist/web/assets/Room-BoG_uge4.js +2 -0
- package/dist/web/assets/Room-evAfiW_e.css +1 -0
- package/dist/web/assets/RunActions-ZY7yf1AF.js +2 -0
- package/dist/web/assets/RunDetail-C8St20GQ.css +1 -0
- package/dist/web/assets/RunDetail-qADXjBvd.js +9 -0
- package/dist/web/assets/RunRow-BKEJv8ib.js +2 -0
- package/dist/web/assets/RunnerTry-Dgpp67-s.js +6 -0
- package/dist/web/assets/RunnerTry-DsweWOfO.css +1 -0
- package/dist/web/assets/Settings-fs-QJwNM.js +2 -0
- package/dist/web/assets/Setup-DI6hBEP-.js +2 -0
- package/dist/web/assets/TestRows-wh03T5Li.js +4 -0
- package/dist/web/assets/TestRun-DTOyF-Pv.js +2 -0
- package/dist/web/assets/TestRuns-ggDjm1Q8.js +2 -0
- package/dist/web/assets/TinyBeeAddLaptop-bc3pmh3T.js +2 -0
- package/dist/web/assets/TinyBeeAi-CkyOzhm5.js +2 -0
- package/dist/web/assets/TinyBeeConnections-B2K_P38u.js +2 -0
- package/dist/web/assets/TinyBeeHome-DSpxX5KS.js +3 -0
- package/dist/web/assets/TinyBeePlan-BamiLziu.js +2 -0
- package/dist/web/assets/TinyBeeSignup-vHcz0Wen.js +2 -0
- package/dist/web/assets/TinyBeeSkills-By9RLUse.js +2 -0
- package/dist/web/assets/TinyBeeWorkflow-DeNO7Jsh.js +2 -0
- package/dist/web/assets/TinyBeeWorkflowEditor-B6OGC2OT.js +2 -0
- package/dist/web/assets/TinyBeeWorkflows-BN4-h6lt.js +2 -0
- package/dist/web/assets/Trace-BBCI1aIB.css +1 -0
- package/dist/web/assets/Trace-aF92UWaH.js +2 -0
- package/dist/web/assets/UpdatesSection-CCWEbkue.js +2 -0
- package/dist/web/assets/Welcome-CCcy558Q.js +2 -0
- package/dist/web/assets/activity-C3qilrDm.css +1 -0
- package/dist/web/assets/activity-CBfTSxqw.js +2 -0
- package/dist/web/assets/authedMedia-BTYt_tyu.js +2 -0
- package/dist/web/assets/beeApi-BHW8Tx1s.js +2 -0
- package/dist/web/assets/data-CmXvx3Mj.js +2 -0
- package/dist/web/assets/engines-CfdJODFj.css +1 -0
- package/dist/web/assets/format-BBZ8vFyT.js +2 -0
- package/dist/web/assets/forms-Coc7p2UF.css +1 -0
- package/dist/web/assets/hivePush-DZJDokj7.js +2 -0
- package/dist/web/assets/impactModel-MY1OFuiP.js +2 -0
- package/dist/web/assets/index-B6qKm1NW.js +13 -0
- package/dist/web/assets/index-BvKyT1X7.css +1 -0
- package/dist/web/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
- package/dist/web/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
- package/dist/web/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
- package/dist/web/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
- package/dist/web/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
- package/dist/web/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
- package/dist/web/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
- package/dist/web/assets/lead-BL_P_kri.css +1 -0
- package/dist/web/assets/model-BIQy5IVG.js +2 -0
- package/dist/web/assets/modelsApi-PUSySRQw.js +2 -0
- package/dist/web/assets/newDotModel-BaLLyw57.js +2 -0
- package/dist/web/assets/onboarding-bfKqnM4Z.css +1 -0
- package/dist/web/assets/phone-Rs7FoyG0.css +1 -0
- package/dist/web/assets/phoneApi-BG_1-M-D.js +3 -0
- package/dist/web/assets/releaseModel-EynYMVOC.js +2 -0
- package/dist/web/assets/releaseNotesModel-A1Rtv3cV.js +2 -0
- package/dist/web/assets/reports-BWaA1HhM.js +37 -0
- package/dist/web/assets/reports-DXwdWQsB.css +1 -0
- package/dist/web/assets/router-W6nZsQ33.js +2 -0
- package/dist/web/assets/runs-BY0Owv93.css +1 -0
- package/dist/web/assets/shadowWeekModel-BUUiww09.js +2 -0
- package/dist/web/assets/storage-yvL36AWt.js +2 -0
- package/dist/web/assets/store-IqrqHuFR.js +2 -0
- package/dist/web/assets/testruns-BzIZ0cR0.css +1 -0
- package/dist/web/assets/testruns-DyaqX4ji.js +2 -0
- package/dist/web/assets/true-9Q68cs5b.js +2 -0
- package/dist/web/assets/true-DPGBpoir.css +1 -0
- package/dist/web/assets/ui-DcmhYyYp.js +13 -0
- package/dist/web/assets/ui-DxEDgbIx.css +1 -0
- package/dist/web/assets/usePauseDot-BV60ZVy1.js +2 -0
- package/dist/web/assets/usePauseDot-NrSzMI1C.css +1 -0
- package/dist/web/assets/usePush-Dsm-TjlG.js +2 -0
- package/dist/web/assets/useRefChips-CbafNx59.js +68 -0
- package/dist/web/assets/useRestoreDot-D0B6W82H.js +2 -0
- package/dist/web/assets/view-worker-pyeVAhUT.js +2 -0
- package/dist/web/assets/workflowUi-QYsd3n9J.js +2 -0
- package/dist/web/favicon.png +0 -0
- package/dist/web/icon-192.png +0 -0
- package/dist/web/icon-512.png +0 -0
- package/dist/web/icon-maskable-512.png +0 -0
- package/dist/web/index.html +45 -0
- package/dist/web/manifest.webmanifest +23 -0
- package/dist/web/mascots/argus-attention.svg +7 -0
- package/dist/web/mascots/argus-ok.svg +7 -0
- package/dist/web/mascots/argus-outage.svg +7 -0
- package/dist/web/mascots/argus-running.svg +7 -0
- package/dist/web/mascots/bolt-attention.svg +7 -0
- package/dist/web/mascots/bolt-ok.svg +7 -0
- package/dist/web/mascots/bolt-outage.svg +7 -0
- package/dist/web/mascots/bolt-running.svg +7 -0
- package/dist/web/mascots/echo-attention.svg +7 -0
- package/dist/web/mascots/echo-ok.svg +7 -0
- package/dist/web/mascots/echo-outage.svg +7 -0
- package/dist/web/mascots/echo-running.svg +7 -0
- package/dist/web/mascots/lens-attention.svg +7 -0
- package/dist/web/mascots/lens-ok.svg +7 -0
- package/dist/web/mascots/lens-outage.svg +7 -0
- package/dist/web/mascots/lens-running.svg +7 -0
- package/dist/web/mascots/moss-attention.svg +7 -0
- package/dist/web/mascots/moss-ok.svg +7 -0
- package/dist/web/mascots/moss-outage.svg +7 -0
- package/dist/web/mascots/moss-running.svg +7 -0
- package/dist/web/mascots/nit-attention.svg +7 -0
- package/dist/web/mascots/nit-ok.svg +7 -0
- package/dist/web/mascots/nit-outage.svg +7 -0
- package/dist/web/mascots/nit-running.svg +7 -0
- package/dist/web/mascots/nova-attention.svg +7 -0
- package/dist/web/mascots/nova-ok.svg +7 -0
- package/dist/web/mascots/nova-outage.svg +7 -0
- package/dist/web/mascots/nova-running.svg +7 -0
- package/dist/web/mascots/penn-attention.svg +7 -0
- package/dist/web/mascots/penn-ok.svg +7 -0
- package/dist/web/mascots/penn-outage.svg +7 -0
- package/dist/web/mascots/penn-running.svg +7 -0
- package/dist/web/mascots/pip-attention.svg +7 -0
- package/dist/web/mascots/pip-ok.svg +7 -0
- package/dist/web/mascots/pip-outage.svg +7 -0
- package/dist/web/mascots/pip-running.svg +7 -0
- package/dist/web/mascots/ward-attention.svg +7 -0
- package/dist/web/mascots/ward-ok.svg +7 -0
- package/dist/web/mascots/ward-outage.svg +7 -0
- package/dist/web/mascots/ward-running.svg +7 -0
- package/dist/web/sw.js +98 -0
- package/dist/webhook-seen.js +53 -0
- package/dist/webhook-seen.js.map +1 -0
- package/dist/webhooks.js +625 -0
- package/dist/webhooks.js.map +1 -0
- package/dist/zip.js +63 -0
- package/dist/zip.js.map +1 -0
- package/docs/API-V2.md +532 -0
- package/docs/CHAT-EVAL.md +130 -0
- package/docs/CHAT-UI.md +416 -0
- package/docs/CONNECTIONS.md +89 -0
- package/docs/DATA-MODEL.md +518 -0
- package/docs/DEPLOY.md +577 -0
- package/docs/DOGFOOD-LEDGER.md +81 -0
- package/docs/GITHUB.md +148 -0
- package/docs/INTEGRATION-MODEL.md +200 -0
- package/docs/LEAD-DOT.md +553 -0
- package/docs/LIST-PATTERNS.md +52 -0
- package/docs/MULTI-REPO.md +766 -0
- package/docs/PARITY.md +276 -0
- package/docs/PR-REVIEW-QA.md +1266 -0
- package/docs/PR-REVIEW.md +357 -0
- package/docs/SANDBOX.md +320 -0
- package/docs/SETUP.md +776 -0
- package/docs/SLACK.md +80 -0
- package/docs/STAGES.md +619 -0
- package/docs/TRACE-MAP.md +89 -0
- package/docs/TRACKERS.md +225 -0
- package/docs/VOICE.md +36 -0
- package/docs/tinybee/00-README.md +45 -0
- package/docs/tinybee/01-PRD.md +216 -0
- package/docs/tinybee/02-architecture-pairing.md +199 -0
- package/docs/tinybee/03-local-agent.md +222 -0
- package/docs/tinybee/04-local-setup-ui.md +128 -0
- package/docs/tinybee/05-mobile-app-ux.md +199 -0
- package/docs/tinybee/06-environments-and-delivery.md +148 -0
- package/docs/tinybee/07-coding-agent-handoff.md +116 -0
- package/docs/tinybee/OPEN-QUESTIONS.md +26 -0
- package/docs/tinybee/PROGRESS.md +134 -0
- package/package.json +111 -4
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{B as e,Cn as t,F as n,G as r,H as i,J as a,L as o,Lt as s,M as c,Nt as l,R as u,Tn as d,Vn as f,Wn as p,Y as m,cn as h,mn as g,pn as _,q as v}from"./ui-DcmhYyYp.js";import{i as y,r as b}from"./router-W6nZsQ33.js";import{i as x,n as S,r as C}from"./store-IqrqHuFR.js";import{c as w,l as T,t as E}from"./data-CmXvx3Mj.js";import{a as D,f as O,g as k,h as ee,m as A,n as te,o as ne,p as re,t as j}from"./phoneApi-BG_1-M-D.js";import{A as ie,C as ae,E as oe,F as se,I as ce,P as le,T as ue,d as de,f as fe,l as pe,p as M,s as me,v as N,y as he}from"./ModelChoices-BxO1zyyr.js";/* empty css *//* empty css */import{n as ge,t as _e}from"./ConnectSheet-Cm5vbZdR.js";var P=p(f(),1),F=g(),ve={connect:`Connect`,test:`Test`,edit:`Edit`,disconnect:`Disconnect`,details:`Details`,retry:`Retry`};function ye({status:e,onOpen:t,onChanged:n,onRefresh:r,refreshing:i}){let a=he(e.services),o=e.services.filter(e=>[`connected`,`env`].includes(N(e))).length,c=e.services.filter(e=>N(e)===`error`).length;return(0,F.jsxs)(`div`,{className:`cx`,children:[(0,F.jsxs)(`section`,{className:`cx-head`,"aria-labelledby":`cx-head-title`,children:[(0,F.jsxs)(`div`,{className:`cx-head__text`,children:[(0,F.jsxs)(`h2`,{id:`cx-head-title`,className:`cx-head__title`,children:[(0,F.jsxs)(`span`,{children:[(0,F.jsxs)(`span`,{className:`num`,children:[o,` of `,e.services.length]}),` `,`connected`]}),e.demo&&(0,F.jsx)(h,{tone:`accent`,children:`Demo mode`})]}),(0,F.jsx)(`p`,{className:`cx-head__body`,children:c>0?`${c===1?`One connection is`:`${c} connections are`} failing. Fix ${c===1?`it`:`them`} first.`:e.demo?`Nothing is posted until you connect the service. You can still read every result here.`:`Connect a service here. Keys are encrypted on this server and never shown again.`})]}),r&&(0,F.jsx)(_,{variant:`secondary`,icon:(0,F.jsx)(s,{size:14}),loading:i,onClick:r,children:`Check again`})]}),e.services.length===0?(0,F.jsx)(`p`,{className:`cx-none`,children:`The server reported no services.`}):a.map(e=>(0,F.jsxs)(`section`,{className:`cx-group`,"aria-labelledby":`cx-group-${e.id}`,children:[(0,F.jsxs)(`h3`,{id:`cx-group-${e.id}`,className:`cx-group__title`,children:[e.title,` `,(0,F.jsx)(`span`,{className:`cx-group__count num`,children:e.items.length})]}),(0,F.jsx)(`ul`,{className:`rows cx-list`,children:e.items.map(e=>(0,F.jsx)(be,{status:e,onOpen:t,onChanged:n},e.key))})]},e.id))]})}function be({status:e,onOpen:t,onChanged:n}){let r=N(e),i=ue(e),[a,o]=(0,P.useState)(null),[s,c]=(0,P.useState)(!1),[l,u]=(0,P.useState)(!1),d=async()=>{c(!0),o(null);try{o(await fe.test(e.key))}catch(e){o({ok:!1,message:M(e)})}finally{c(!1)}},f=r=>{r===`test`?d():r===`retry`?d().then(()=>n(null,``)):r===`disconnect`?u(!0):t(e)};return(0,F.jsxs)(`li`,{className:`cx-row cx-row--${r}`,"data-service":e.key,children:[(0,F.jsx)(me,{provider:e.key,method:e.method}),(0,F.jsxs)(`div`,{className:`cx-row__main`,children:[(0,F.jsxs)(`div`,{className:`cx-row__head`,children:[(0,F.jsx)(`span`,{className:`cx-row__name`,children:e.label}),(0,F.jsx)(pe,{state:r})]}),(0,F.jsx)(`p`,{className:`cx-row__detail`,children:oe(e)}),(s||a)&&(0,F.jsx)(de,{result:a,pending:s})]}),(0,F.jsx)(`div`,{className:`cx-row__actions`,children:i.map((t,n)=>(0,F.jsxs)(_,{size:`sm`,variant:n===0&&(r===`error`||t===`connect`&&e.key===`model`)?`primary`:t===`disconnect`?`ghost`:`secondary`,className:t===`disconnect`?`cx-row__disconnect`:void 0,loading:(t===`test`||t===`retry`)&&s,onClick:()=>f(t),children:[ve[t],(0,F.jsxs)(`span`,{className:`sr-only`,children:[` `,e.label]})]},t))}),i.includes(`disconnect`)&&(0,F.jsx)(ge,{status:e,open:l,onCancel:()=>u(!1),onDone:t=>n(t,`${e.label} disconnected.`)})]})}function xe(){let e=T(),t=v(),[n,r]=(0,P.useState)(!1),a=async(e,n)=>{r(!0);try{let r=await d.saveTestEngines(e);C(E.engines,()=>r),t.show({title:n,tone:`success`})}catch(e){t.show({title:`Could not save the default.`,body:M(e),tone:`error`,persistent:!0})}finally{r(!1)}};return(0,F.jsxs)(`section`,{className:`eng`,"aria-labelledby":`eng-title`,children:[(0,F.jsxs)(`header`,{className:`eng-head`,children:[(0,F.jsx)(`h2`,{id:`eng-title`,className:`eng-head__title`,children:`Test engines`}),(0,F.jsx)(`p`,{className:`eng-head__body`,children:`These engines write and run new tests, for the things to test that no existing test covers. A dot uses the default below until you pick another engine on the dot. Your existing Playwright specs always run through each dot's test command.`})]}),e.data?(0,F.jsxs)(F.Fragment,{children:[e.error!=null&&(0,F.jsx)(i,{compact:!0,title:`Could not refresh the engines. Showing the last check.`,error:e.error,onRetry:()=>void e.reload()}),(0,F.jsx)(`ul`,{className:`rows eng-list`,children:e.data.engines.map(t=>(0,F.jsx)(Se,{row:t,view:e.data,disabled:n,onToggle:n=>void a(se(e.data,t.key,n),`${t.label} ${n?`added to`:`removed from`} the default.`)},t.key))}),(0,F.jsxs)(`div`,{className:`eng-foot`,children:[(0,F.jsxs)(`p`,{className:`eng-foot__default`,children:[(0,F.jsx)(`span`,{className:`eng-foot__k`,children:`Workspace default`}),` `,(0,F.jsx)(`strong`,{children:ie(e.data)})]}),(0,F.jsx)(`p`,{className:`eng-foot__note`,children:ce(e.data)}),(e.data.source===`saved`||e.data.source===`unset`)&&(0,F.jsx)(_,{size:`sm`,variant:`secondary`,loading:n,onClick:()=>void a({auto:!0},`The default now follows which engines are ready.`),children:`Choose automatically`})]})]}):e.loading?(0,F.jsx)(u,{rows:2,label:`Loading test engines`}):(0,F.jsx)(i,{title:`Could not load the test engines`,error:e.error,onRetry:()=>void e.reload()})]})}function Se({row:e,view:t,disabled:n,onToggle:r}){let i=le(t,e.key),a=e.state===`ready`;return(0,F.jsxs)(`li`,{className:`eng-row eng-row--${e.state}`,"data-engine":e.key,children:[(0,F.jsxs)(`div`,{className:`eng-row__main`,children:[(0,F.jsxs)(`div`,{className:`eng-row__head`,children:[(0,F.jsx)(`span`,{className:`eng-row__name`,children:e.label}),(0,F.jsxs)(`span`,{className:`cx-state cx-state--${a?`connected`:`missing`}`,children:[(0,F.jsx)(`span`,{className:`cx-state__dot`,"aria-hidden":`true`}),a?`Ready`:`Not ready`]})]}),(0,F.jsx)(`p`,{className:`eng-row__runs`,children:e.runs}),(0,F.jsx)(`p`,{className:`eng-row__detail`,children:e.detail})]}),(0,F.jsx)(`div`,{className:`eng-row__toggle`,role:`group`,"aria-label":`${e.label} default`,children:(0,F.jsx)(c,{checked:e.defaultOn,onChange:r,label:`Default`,disabled:n||!!i,...i?{disabledReason:i}:{}})})]})}function Ce({rows:t=9}){let n=e(1e3);return(0,F.jsx)(`div`,{role:`status`,"aria-label":`Loading setup status`,"aria-busy":`true`,children:n&&(0,F.jsx)(`ul`,{className:`rows cx-list`,"aria-hidden":`true`,children:Array.from({length:t},(e,t)=>(0,F.jsxs)(`li`,{className:`cx-row`,children:[(0,F.jsx)(o,{width:32,height:32,radius:8}),(0,F.jsxs)(`div`,{className:`cx-row__main`,children:[(0,F.jsx)(o,{width:`${20+t*13%20}%`,height:14}),(0,F.jsx)(o,{width:`${45+t*17%30}%`,height:10,style:{display:`block`,marginTop:8}})]}),(0,F.jsx)(o,{width:76,height:28,radius:6})]},t))})})}var I=(e=>(e[e.Border=-1]=`Border`,e[e.Data=0]=`Data`,e[e.Function=1]=`Function`,e[e.Position=2]=`Position`,e[e.Timing=3]=`Timing`,e[e.Alignment=4]=`Alignment`,e))(I||{}),we=[0,1],L=[1,0],R=[2,3],z=[3,2],Te={L:we,M:L,Q:R,H:z},Ee=/^\d*$/,De=/^[A-Z0-9 $%*+./:-]*$/,B=`0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:`,V=1,H=40,U=3,Oe=3,W=40,ke=10,G=[[-1,7,10,15,20,26,18,20,24,30,18,20,24,26,30,22,24,28,30,28,28,28,28,30,30,26,28,30,30,30,30,30,30,30,30,30,30,30,30,30,30],[-1,10,16,26,18,24,16,18,22,22,26,30,22,22,24,24,28,28,26,26,26,26,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28],[-1,13,22,18,26,18,24,18,22,20,24,28,26,24,20,30,24,28,28,26,30,28,30,30,30,30,28,30,30,30,30,30,30,30,30,30,30,30,30,30,30],[-1,17,28,22,16,22,28,26,26,24,28,24,28,22,24,24,30,28,28,26,28,30,24,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30]],K=[[-1,1,1,1,1,1,2,2,2,2,4,4,4,4,4,6,6,6,6,7,8,8,9,9,10,12,12,12,13,14,15,16,17,18,19,19,20,21,22,24,25],[-1,1,1,1,2,2,4,4,4,5,5,5,8,9,9,10,10,11,13,14,16,17,17,18,20,21,23,25,26,28,29,31,33,35,37,38,40,43,45,47,49],[-1,1,1,2,2,4,4,6,6,8,8,8,10,12,16,12,17,16,18,21,20,23,23,25,27,29,34,34,35,38,40,43,45,48,51,53,56,59,62,65,68],[-1,1,1,2,4,4,4,5,6,8,8,11,11,16,16,18,16,19,21,25,25,25,34,30,32,35,37,40,42,45,48,51,54,57,60,63,66,70,74,77,81]],Ae=class{constructor(e,t,n,r){if(this.version=e,this.ecc=t,e<V||e>H)throw RangeError(`Version value out of range`);if(r<-1||r>7)throw RangeError(`Mask value out of range`);this.size=e*4+17;let i=Array.from({length:this.size}).fill(!1);for(let e=0;e<this.size;e++)this.modules.push(i.slice()),this.types.push(i.map(()=>0));this.drawFunctionPatterns();let a=this.addEccAndInterleave(n);if(this.drawCodewords(a),r===-1){let e=1e9;for(let t=0;t<8;t++){this.applyMask(t),this.drawFormatBits(t);let n=this.getPenaltyScore();n<e&&(r=t,e=n),this.applyMask(t)}}this.mask=r,this.applyMask(r),this.drawFormatBits(r)}size;mask;modules=[];types=[];getModule(e,t){return e>=0&&e<this.size&&t>=0&&t<this.size&&this.modules[t][e]}drawFunctionPatterns(){for(let e=0;e<this.size;e++)this.setFunctionModule(6,e,e%2==0,I.Timing),this.setFunctionModule(e,6,e%2==0,I.Timing);this.drawFinderPattern(3,3),this.drawFinderPattern(this.size-4,3),this.drawFinderPattern(3,this.size-4);let e=this.getAlignmentPatternPositions(),t=e.length;for(let n=0;n<t;n++)for(let r=0;r<t;r++)n===0&&r===0||n===0&&r===t-1||n===t-1&&r===0||this.drawAlignmentPattern(e[n],e[r]);this.drawFormatBits(0),this.drawVersion()}drawFormatBits(e){let t=this.ecc[1]<<3|e,n=t;for(let e=0;e<10;e++)n=n<<1^(n>>>9)*1335;let r=(t<<10|n)^21522;for(let e=0;e<=5;e++)this.setFunctionModule(8,e,J(r,e));this.setFunctionModule(8,7,J(r,6)),this.setFunctionModule(8,8,J(r,7)),this.setFunctionModule(7,8,J(r,8));for(let e=9;e<15;e++)this.setFunctionModule(14-e,8,J(r,e));for(let e=0;e<8;e++)this.setFunctionModule(this.size-1-e,8,J(r,e));for(let e=8;e<15;e++)this.setFunctionModule(8,this.size-15+e,J(r,e));this.setFunctionModule(8,this.size-8,!0)}drawVersion(){if(this.version<7)return;let e=this.version;for(let t=0;t<12;t++)e=e<<1^(e>>>11)*7973;let t=this.version<<12|e;for(let e=0;e<18;e++){let n=J(t,e),r=this.size-11+e%3,i=Math.floor(e/3);this.setFunctionModule(r,i,n),this.setFunctionModule(i,r,n)}}drawFinderPattern(e,t){for(let n=-4;n<=4;n++)for(let r=-4;r<=4;r++){let i=Math.max(Math.abs(r),Math.abs(n)),a=e+r,o=t+n;a>=0&&a<this.size&&o>=0&&o<this.size&&this.setFunctionModule(a,o,i!==2&&i!==4,I.Position)}}drawAlignmentPattern(e,t){for(let n=-2;n<=2;n++)for(let r=-2;r<=2;r++)this.setFunctionModule(e+r,t+n,Math.max(Math.abs(r),Math.abs(n))!==1,I.Alignment)}setFunctionModule(e,t,n,r=I.Function){this.modules[t][e]=n,this.types[t][e]=r}addEccAndInterleave(e){let t=this.version,n=this.ecc;if(e.length!==Z(t,n))throw RangeError(`Invalid argument`);let r=K[n[0]][t],i=G[n[0]][t],a=Math.floor(X(t)/8),o=r-a%r,s=Math.floor(a/r),c=[],l=Ue(i);for(let t=0,n=0;t<r;t++){let r=e.slice(n,n+s-i+(t<o?0:1));n+=r.length;let a=We(r,l);t<o&&r.push(0),c.push(r.concat(a))}let u=[];for(let e=0;e<c[0].length;e++)c.forEach((t,n)=>{(e!==s-i||n>=o)&&u.push(t[e])});return u}drawCodewords(e){if(e.length!==Math.floor(X(this.version)/8))throw RangeError(`Invalid argument`);let t=0;for(let n=this.size-1;n>=1;n-=2){n===6&&(n=5);for(let r=0;r<this.size;r++)for(let i=0;i<2;i++){let a=n-i,o=n+1&2?r:this.size-1-r;!this.types[o][a]&&t<e.length*8&&(this.modules[o][a]=J(e[t>>>3],7-(t&7)),t++)}}}applyMask(e){if(e<0||e>7)throw RangeError(`Mask value out of range`);for(let t=0;t<this.size;t++)for(let n=0;n<this.size;n++){let r;switch(e){case 0:r=(n+t)%2==0;break;case 1:r=t%2==0;break;case 2:r=n%3==0;break;case 3:r=(n+t)%3==0;break;case 4:r=(Math.floor(n/3)+Math.floor(t/2))%2==0;break;case 5:r=n*t%2+n*t%3==0;break;case 6:r=(n*t%2+n*t%3)%2==0;break;case 7:r=((n+t)%2+n*t%3)%2==0;break;default:throw Error(`Unreachable`)}!this.types[t][n]&&r&&(this.modules[t][n]=!this.modules[t][n])}}getPenaltyScore(){let e=0;for(let t=0;t<this.size;t++){let n=!1,r=0,i=[0,0,0,0,0,0,0];for(let a=0;a<this.size;a++)this.modules[t][a]===n?(r++,r===5?e+=U:r>5&&e++):(this.finderPenaltyAddHistory(r,i),n||(e+=this.finderPenaltyCountPatterns(i)*W),n=this.modules[t][a],r=1);e+=this.finderPenaltyTerminateAndCount(n,r,i)*W}for(let t=0;t<this.size;t++){let n=!1,r=0,i=[0,0,0,0,0,0,0];for(let a=0;a<this.size;a++)this.modules[a][t]===n?(r++,r===5?e+=U:r>5&&e++):(this.finderPenaltyAddHistory(r,i),n||(e+=this.finderPenaltyCountPatterns(i)*W),n=this.modules[a][t],r=1);e+=this.finderPenaltyTerminateAndCount(n,r,i)*W}for(let t=0;t<this.size-1;t++)for(let n=0;n<this.size-1;n++){let r=this.modules[t][n];r===this.modules[t][n+1]&&r===this.modules[t+1][n]&&r===this.modules[t+1][n+1]&&(e+=Oe)}let t=0;for(let e of this.modules)t=e.reduce((e,t)=>e+ +!!t,t);let n=this.size*this.size,r=Math.ceil(Math.abs(t*20-n*10)/n)-1;return e+=r*ke,e}getAlignmentPatternPositions(){if(this.version===1)return[];{let e=Math.floor(this.version/7)+2,t=this.version===32?26:Math.ceil((this.version*4+4)/(e*2-2))*2,n=[6];for(let r=this.size-7;n.length<e;r-=t)n.splice(1,0,r);return n}}finderPenaltyCountPatterns(e){let t=e[1],n=t>0&&e[2]===t&&e[3]===t*3&&e[4]===t&&e[5]===t;return(n&&e[0]>=t*4&&e[6]>=t?1:0)+(n&&e[6]>=t*4&&e[0]>=t?1:0)}finderPenaltyTerminateAndCount(e,t,n){return e&&(this.finderPenaltyAddHistory(t,n),t=0),t+=this.size,this.finderPenaltyAddHistory(t,n),this.finderPenaltyCountPatterns(n)}finderPenaltyAddHistory(e,t){t[0]===0&&(e+=this.size),t.pop(),t.unshift(e)}};function q(e,t,n){if(t<0||t>31||e>>>t)throw RangeError(`Value out of range`);for(let r=t-1;r>=0;r--)n.push(e>>>r&1)}function J(e,t){return!!(e>>>t&1)}var Y=class{constructor(e,t,n){if(this.mode=e,this.numChars=t,this.bitData=n,t<0)throw RangeError(`Invalid argument`);this.bitData=n.slice()}getData(){return this.bitData.slice()}},je=[1,10,12,14],Me=[2,9,11,13],Ne=[4,8,16,16];function Pe(e,t){return e[Math.floor((t+7)/17)+1]}function Fe(e){let t=[];for(let n of e)q(n,8,t);return new Y(Ne,e.length,t)}function Ie(e){if(!ze(e))throw RangeError(`String contains non-numeric characters`);let t=[];for(let n=0;n<e.length;){let r=Math.min(e.length-n,3);q(Number.parseInt(e.substring(n,n+r),10),r*3+1,t),n+=r}return new Y(je,e.length,t)}function Le(e){if(!Be(e))throw RangeError(`String contains unencodable characters in alphanumeric mode`);let t=[],n=0;for(;n+2<=e.length;n+=2){let r=B.indexOf(e.charAt(n))*45;r+=B.indexOf(e.charAt(n+1)),q(r,11,t)}return n<e.length&&q(B.indexOf(e.charAt(n)),6,t),new Y(Me,e.length,t)}function Re(e){return e===``?[]:ze(e)?[Ie(e)]:Be(e)?[Le(e)]:[Fe(He(e))]}function ze(e){return Ee.test(e)}function Be(e){return De.test(e)}function Ve(e,t){let n=0;for(let r of e){let e=Pe(r.mode,t);if(r.numChars>=1<<e)return 1/0;n+=4+e+r.bitData.length}return n}function He(e){e=encodeURI(e);let t=[];for(let n=0;n<e.length;n++)e.charAt(n)===`%`?(t.push(Number.parseInt(e.substring(n+1,n+3),16)),n+=2):t.push(e.charCodeAt(n));return t}function X(e){if(e<V||e>H)throw RangeError(`Version number out of range`);let t=(16*e+128)*e+64;if(e>=2){let n=Math.floor(e/7)+2;t-=(25*n-10)*n-55,e>=7&&(t-=36)}return t}function Z(e,t){return Math.floor(X(e)/8)-G[t[0]][e]*K[t[0]][e]}function Ue(e){if(e<1||e>255)throw RangeError(`Degree out of range`);let t=[];for(let n=0;n<e-1;n++)t.push(0);t.push(1);let n=1;for(let r=0;r<e;r++){for(let e=0;e<t.length;e++)t[e]=Q(t[e],n),e+1<t.length&&(t[e]^=t[e+1]);n=Q(n,2)}return t}function We(e,t){let n=t.map(e=>0);for(let r of e){let e=r^n.shift();n.push(0),t.forEach((t,r)=>n[r]^=Q(t,e))}return n}function Q(e,t){if(e>>>8||t>>>8)throw RangeError(`Byte out of range`);let n=0;for(let r=7;r>=0;r--)n=n<<1^(n>>>7)*285,n^=(t>>>r&1)*e;return n}function Ge(e,t,n=1,r=40,i=-1,a=!0){if(!(V<=n&&n<=r&&r<=H)||i<-1||i>7)throw RangeError(`Invalid value`);let o,s;for(o=n;;o++){let n=Z(o,t)*8,i=Ve(e,o);if(i<=n){s=i;break}if(o>=r)throw RangeError(`Data too long`)}for(let e of[L,R,z])a&&s<=Z(o,e)*8&&(t=e);let c=[];for(let t of e){q(t.mode[0],4,c),q(t.numChars,Pe(t.mode,o),c);for(let e of t.getData())c.push(e)}let l=Z(o,t)*8;q(0,Math.min(4,l-c.length),c),q(0,(8-c.length%8)%8,c);for(let e=236;c.length<l;e^=253)q(e,8,c);let u=Array.from({length:Math.ceil(c.length/8)},()=>0);return c.forEach((e,t)=>u[t>>>3]|=e<<7-(t&7)),new Ae(o,t,u,i)}function Ke(e,t){let{ecc:n=`L`,boostEcc:r=!1,minVersion:i=1,maxVersion:a=40,maskPattern:o=-1,border:s=1}=t||{},c=typeof e==`string`?Re(e):Array.isArray(e)?[Fe(e)]:void 0;if(!c)throw Error(`uqr only supports encoding string and binary data, but got: ${typeof e}`);let l=Ge(c,Te[n],i,a,o,r),u=qe({version:l.version,maskPattern:l.mask,size:l.size,data:l.modules,types:l.types},s);return t?.invert&&(u.data=u.data.map(e=>e.map(e=>!e))),t?.onEncoded?.(u),u}function qe(e,t=1){if(!t)return e;let{size:n}=e,r=n+t*2;e.size=r,e.data.forEach(e=>{for(let n=0;n<t;n++)e.unshift(!1),e.push(!1)});for(let n=0;n<t;n++)e.data.unshift(Array.from({length:r},e=>!1)),e.data.push(Array.from({length:r},e=>!1));let i=I.Border;e.types.forEach(e=>{for(let n=0;n<t;n++)e.unshift(i),e.push(i)});for(let n=0;n<t;n++)e.types.unshift(Array.from({length:r},e=>i)),e.types.push(Array.from({length:r},e=>i));return e}function Je(e){let t=Ke(e,{ecc:`M`,border:2}),n=``;for(let e=0;e<t.size;e++){let r=t.data[e];for(let i=0;i<t.size;i++)r[i]&&(n+=`M${i} ${e}h1v1h-1z`)}return{size:t.size,d:n}}function Ye({text:e,label:t,px:n=220}){let{size:r,d:i}=(0,P.useMemo)(()=>Je(e),[e]);return(0,F.jsxs)(`svg`,{className:`qr`,role:`img`,"aria-label":t,viewBox:`0 0 ${r} ${r}`,width:n,height:n,shapeRendering:`crispEdges`,"data-testid":`pair-qr`,children:[(0,F.jsx)(`rect`,{width:r,height:r,fill:`#ffffff`}),(0,F.jsx)(`path`,{d:i,fill:`#111111`})]})}var Xe=[{kind:`bugs`,label:`Bugs found`,description:`A run finds failing tests or high-risk findings.`},{kind:`outages`,label:`Outages`,description:`The site check says the site is down.`},{kind:`drafts`,label:`Drafts waiting`,description:`A comment or post waits for your approval.`}];function $(e){return e instanceof Error?e.message:String(e)}function Ze(){let e=v(),o=x(D,e=>A.state(e)),s=x(ne,e=>A.paths(e)),[d,f]=(0,P.useState)(!1),[p,m]=(0,P.useState)(null),[g,y]=(0,P.useState)(!1),b=o.error instanceof t&&o.error.status===403,S=async(t,n)=>{try{await A.setRole(t.id,n),e.show({tone:`success`,title:`${t.name} is ${n===`editor`?`an editor`:`a member`}`,body:j[n]})}catch(n){e.show({tone:`error`,title:`Could not change the role of ${t.name}`,body:$(n)})}await o.reload()},C=async()=>{y(!0);try{let{tailscale:t}=await A.serveTailscale();e.show({tone:`success`,title:`Served over Tailscale`,body:t.servedUrl??void 0}),await s.reload()}catch(t){e.show({tone:`error`,title:`Could not serve over Tailscale`,body:$(t),persistent:!0})}finally{y(!1)}},w=async(t,n)=>{try{await A.savePrefs(t),await o.reload(),e.show({tone:`success`,title:n})}catch(t){e.show({tone:`error`,title:`Could not save`,body:$(t)})}};if(b)return(0,F.jsxs)(`section`,{className:`phone`,"aria-labelledby":`phone-title`,children:[(0,F.jsx)(`h2`,{id:`phone-title`,className:`phone__title`,children:`Phone`}),(0,F.jsx)(`p`,{className:`phone__note`,children:`Ask your localdost admin to pair a device or change its role.`})]});let T=o.data,E=s.data?.tailscale;return(0,F.jsxs)(`section`,{className:`phone`,"aria-labelledby":`phone-title`,children:[(0,F.jsxs)(`header`,{className:`phone__head`,children:[(0,F.jsxs)(`div`,{className:`phone__head-text`,children:[(0,F.jsx)(`h2`,{id:`phone-title`,className:`phone__title`,children:`Phone`}),(0,F.jsx)(`p`,{className:`phone__note`,children:`Approve drafts, read runs, and chat from your phone. Pair it once with a code; each phone gets its own key.`})]}),(0,F.jsx)(_,{variant:`primary`,icon:(0,F.jsx)(l,{size:14}),onClick:()=>f(!0),children:`Pair a phone`})]}),(0,F.jsxs)(`div`,{className:`phone__block`,children:[(0,F.jsxs)(`h3`,{className:`phone__sub`,children:[`Paired devices `,T&&(0,F.jsx)(`span`,{className:`num phone__count`,children:T.devices.length})]}),!T&&o.loading&&(0,F.jsx)(u,{rows:2}),!T&&!!o.error&&(0,F.jsx)(i,{compact:!0,title:`Could not load devices`,error:o.error,onRetry:()=>void o.reload()}),T&&T.devices.length===0&&(0,F.jsx)(r,{kind:`first-run`,compact:!0,title:`No devices yet`,body:`Add a phone to get alerts and OK things from it, or invite a teammate.`}),T&&T.devices.length>0&&(0,F.jsx)(`ul`,{className:`rows phone__devices`,"data-testid":`paired-devices`,children:T.devices.map(e=>(0,F.jsxs)(`li`,{className:`row phone__device`,children:[(0,F.jsx)(`span`,{className:`phone__device-icon`,"aria-hidden":`true`,children:(0,F.jsx)(l,{size:16})}),(0,F.jsxs)(`div`,{className:`row__main phone__device-main`,children:[(0,F.jsx)(`span`,{className:`phone__device-name`,children:e.name}),(0,F.jsxs)(`span`,{className:`phone__device-meta`,children:[ee(e.platform),` Β· Paired `,new Date(e.pairedAt).toLocaleDateString(),` Β· Last seen `,k(e.lastSeenAt).toLowerCase()]})]}),(0,F.jsxs)(`div`,{className:`phone__device-actions`,children:[(0,F.jsx)(n,{className:`phone__role`,"aria-label":`Role of ${e.name}`,title:j[e.role??`member`],value:e.role??`member`,onChange:t=>void S(e,t.target.value),options:[`member`,`editor`].map(e=>({value:e,label:te[e]}))}),(0,F.jsx)(_,{variant:`secondary`,size:`sm`,onClick:()=>m(e),"aria-label":`Revoke ${e.name}`,children:`Revoke`})]})]},e.id))})]}),(0,F.jsxs)(`div`,{className:`phone__block`,children:[(0,F.jsx)(`h3`,{className:`phone__sub`,children:`How the phone connects`}),!s.data&&s.loading&&(0,F.jsx)(u,{rows:3}),!s.data&&!!s.error&&(0,F.jsx)(i,{compact:!0,title:`Could not check connection paths`,error:s.error,onRetry:()=>void s.reload()}),s.data&&(0,F.jsxs)(`ul`,{className:`rows phone__paths`,children:[(0,F.jsxs)(`li`,{className:`row phone__path`,children:[(0,F.jsxs)(`div`,{className:`row__main`,children:[(0,F.jsxs)(`span`,{className:`phone__path-name`,children:[`Tailscale `,E?.servedUrl?(0,F.jsx)(h,{tone:`ok`,children:`Serving`}):E?.running?(0,F.jsx)(h,{children:`Running`}):null]}),(0,F.jsx)(`span`,{className:`phone__path-detail`,children:E?.servedUrl?E.servedUrl:E?.running?`Running as ${E.dnsName??`this machine`}. Serve localdost on port ${s.data.port} to reach it from your phone.`:E?.installed?E.error??`Installed, but tailscaled is not running.`:E?.disabled?`Detection is off on this server.`:`Not found on this computer. Install Tailscale on the computer and the phone for a private HTTPS address.`}),E?.conflict&&(0,F.jsx)(`span`,{className:`phone__path-warn`,children:E.conflict})]}),E?.running&&!E.servedUrl&&!E.conflict&&(0,F.jsx)(_,{variant:`secondary`,size:`sm`,loading:g,onClick:()=>void C(),children:`Serve over Tailscale`})]}),(0,F.jsx)(`li`,{className:`row phone__path`,children:(0,F.jsxs)(`div`,{className:`row__main`,children:[(0,F.jsxs)(`span`,{className:`phone__path-name`,children:[`Cloudflare tunnel `,s.data.tunnel.url?(0,F.jsx)(h,{tone:`ok`,children:`On`}):null]}),(0,F.jsx)(`span`,{className:`phone__path-detail`,children:s.data.tunnel.url??`A public HTTPS address. Set it up under Public URL above.`})]})}),(0,F.jsx)(`li`,{className:`row phone__path`,children:(0,F.jsxs)(`div`,{className:`row__main`,children:[(0,F.jsxs)(`span`,{className:`phone__path-name`,children:[`Same Wi-Fi `,s.data.lan.reachable?(0,F.jsx)(h,{tone:`ok`,children:`On`}):null]}),(0,F.jsx)(`span`,{className:`phone__path-detail`,children:s.data.lan.reachable?`${s.data.lan.urls.join(`, `)}. ${s.data.lan.note}`:s.data.lan.note})]})})]}),T&&E?.running&&E.login&&(0,F.jsx)(`div`,{className:`phone__trust`,children:(0,F.jsx)(c,{checked:T.prefs.trustTailscale,onChange:e=>void w({trustTailscale:e},e?`Your Tailscale login is trusted`:`Tailscale login trust is off`),label:`Trust my Tailscale login (${E.login})`,description:`Your own devices on the tailnet open localdost without pairing. Pairing and revoking still need this computer.`})})]}),T&&(0,F.jsxs)(`div`,{className:`phone__block`,children:[(0,F.jsx)(`h3`,{className:`phone__sub`,children:`Phone alerts`}),(0,F.jsx)(`div`,{className:`phone__alerts`,children:Xe.map(e=>(0,F.jsx)(c,{checked:T.prefs.alerts[e.kind],onChange:t=>void w({alerts:{[e.kind]:t}},`${e.label} alerts ${t?`on`:`off`}`),label:e.label,description:e.description},e.kind))}),T.audit.length>0&&(0,F.jsxs)(`details`,{className:`phone__audit`,children:[(0,F.jsx)(`summary`,{children:`Pairing activity`}),(0,F.jsx)(`ul`,{children:T.audit.slice(0,10).map(e=>(0,F.jsxs)(`li`,{children:[(0,F.jsx)(`span`,{className:`num`,children:new Date(e.createdAt).toLocaleString()}),` `,Qe(e.action),e.deviceName?`: ${e.deviceName}`:``,` `,(0,F.jsxs)(`span`,{className:`phone__audit-actor`,children:[`by `,e.actor]})]},e.id))})]})]}),(0,F.jsx)(et,{open:d,paths:s.data??null,knownIds:T?.devices.map(e=>e.id)??[],onClose:()=>{f(!1),o.reload()},onServe:()=>void C(),serving:g}),(0,F.jsx)(a,{open:!!p,onClose:()=>m(null),role:`alertdialog`,title:`Revoke ${p?.name??`this phone`}?`,description:`The phone loses access at once. Its notifications stop. Pair it again to bring it back.`,initialFocus:`[data-cancel]`,size:`sm`,footer:(0,F.jsxs)(F.Fragment,{children:[(0,F.jsx)(_,{variant:`secondary`,"data-cancel":!0,onClick:()=>m(null),children:`Cancel`}),(0,F.jsx)(_,{variant:`danger`,onClick:async()=>{let t=p;if(m(null),t){try{await A.revoke(t.id),e.show({tone:`success`,title:`${t.name} revoked`})}catch(t){e.show({tone:`error`,title:`Could not revoke`,body:$(t)})}await o.reload()}},children:`Revoke`})]})})]})}function Qe(e){return{code_created:`Invite code made`,code_cancelled:`Invite code cancelled`,invite_created:`Invite code made`,invites_cancelled:`Invite codes cancelled`,paired:`Paired`,pair_failed:`Wrong code`,codes_burned:`Codes cancelled after many wrong tries`,revoked:`Revoked`,renamed:`Renamed`,role_changed:`Role changed`,trust_changed:`Tailscale trust changed`}[e]??e}function $e(e){let[t,n]=(0,P.useState)(()=>Date.now());return(0,P.useEffect)(()=>{if(!e)return;let t=setInterval(()=>n(Date.now()),1e3);return()=>clearInterval(t)},[e]),e?Math.max(0,Math.round((Date.parse(e)-t)/1e3)):0}function et({open:e,paths:t,knownIds:n,onClose:r,onServe:i,serving:a}){let[o,s]=(0,P.useState)(null),[c,l]=(0,P.useState)(null),[d,f]=(0,P.useState)(!1),[p,h]=(0,P.useState)(null),[g,v]=(0,P.useState)(null),y=(0,P.useRef)(n),b=$e(o?.expiresAt??null),x=typeof location>`u`?``:location.origin,S=re(t,x),C=S.find(e=>`${e.id}:${e.url}`===g)??S[0],w=(0,P.useCallback)(async()=>{f(!0),l(null);try{s(await A.createCode())}catch(e){l($(e))}finally{f(!1)}},[]);(0,P.useEffect)(()=>{if(!e)return;y.current=n;let t=setTimeout(()=>{h(null),w()},0);return()=>clearTimeout(t)},[e]),(0,P.useEffect)(()=>{if(!e||!o||p)return;let t=setInterval(()=>{A.state().then(e=>{let t=e.devices.find(e=>!y.current.includes(e.id));t&&(h(t),s(null))}).catch(()=>{})},2e3);return()=>clearInterval(t)},[e,o,p]);let T=()=>{o&&!p&&A.cancelCode().catch(()=>{}),s(null),r()},E=!!o&&b===0,D=Math.floor(b/60),k=String(b%60).padStart(2,`0`);return(0,F.jsx)(m,{open:e,onClose:T,side:`right`,title:`Pair a phone`,description:`Scan the code with the phone camera, or open the address on the phone and type the code.`,className:`pair-sheet`,footer:(0,F.jsx)(_,{variant:p?`primary`:`secondary`,onClick:T,children:p?`Done`:`Cancel`}),children:p?(0,F.jsxs)(`div`,{className:`pair-done`,role:`status`,children:[(0,F.jsxs)(`p`,{className:`pair-done__title`,children:[p.name,` is paired.`]}),(0,F.jsx)(`p`,{className:`pair-done__body`,children:`It shows up under Paired devices as a member. Change its role or revoke it there any time.`})]}):(0,F.jsxs)(`div`,{className:`pair`,children:[S.length>1&&(0,F.jsx)(`div`,{className:`segmented pair__paths`,role:`radiogroup`,"aria-label":`Address the phone uses`,children:S.map(e=>{let t=`${e.id}:${e.url}`,n=C&&`${C.id}:${C.url}`===t;return(0,F.jsx)(`button`,{type:`button`,role:`radio`,"aria-checked":!!n,className:`segmented__item${n?` is-selected`:``}`,onClick:()=>v(t),children:e.label},t)})}),S.length===0&&(0,F.jsxs)(`div`,{className:`pair__nopath`,role:`status`,children:[(0,F.jsx)(`p`,{children:`No address a phone can reach yet. This page is open on localhost.`}),t?.tailscale.running&&!t.tailscale.servedUrl&&!t.tailscale.conflict?(0,F.jsx)(_,{variant:`primary`,loading:a,onClick:i,children:`Serve over Tailscale`}):(0,F.jsx)(`p`,{className:`phone__note`,children:`Set up Tailscale, a Cloudflare tunnel (Public URL), or same Wi-Fi access first. You can still type the code on a phone that can reach this server.`})]}),c&&(0,F.jsx)(`p`,{className:`pair__error`,role:`alert`,children:c}),o&&!E&&(0,F.jsxs)(F.Fragment,{children:[C&&(0,F.jsx)(`div`,{className:`pair__qr`,children:(0,F.jsx)(Ye,{text:O(C.url,o.code),label:`QR code that opens ${C.url} with the invite code`})}),(0,F.jsxs)(`div`,{className:`pair__code-block`,children:[(0,F.jsx)(`span`,{className:`pair__code-label`,children:`Invite code`}),(0,F.jsx)(`span`,{className:`pair__code num`,"data-testid":`pair-code`,"aria-label":`Invite code ${o.display.split(``).join(` `)}`,children:o.display}),(0,F.jsxs)(`span`,{className:`pair__ttl num`,"aria-live":`off`,children:[`Expires in `,D,`:`,k,`. Works once.`]})]}),C&&(0,F.jsxs)(`p`,{className:`pair__addr`,children:[C.label,`: `,(0,F.jsx)(`span`,{className:`pair__url`,children:C.url}),(0,F.jsx)(`span`,{className:`pair__addr-note`,children:C.note})]}),(0,F.jsxs)(`ol`,{className:`pair__steps`,children:[(0,F.jsx)(`li`,{children:`Scan the QR code with the phone camera, or open the address and go to Pair this phone.`}),(0,F.jsx)(`li`,{children:`Tap Pair this phone. The phone keeps its own key.`}),(0,F.jsx)(`li`,{children:`On iPhone, add localdost to the Home Screen to get notifications.`})]})]}),E&&(0,F.jsxs)(`div`,{className:`pair__expired`,role:`status`,children:[(0,F.jsx)(`p`,{children:`This code expired.`}),(0,F.jsx)(_,{variant:`primary`,loading:d,onClick:()=>void w(),children:`New code`})]}),!o&&!c&&d&&(0,F.jsx)(u,{rows:3})]})})}var tt={model:`Model`,github:`GitHub`,linear:`Linear`,jira:`Jira`,slack:`Slack`,push:`Push`,publicUrl:`Public URL`,sandbox:`Docker runner`,voice:`Voice`,aivision:`AI-Vision`};function nt(){return y(),typeof location>`u`?``:location.hash}function rt(){let{data:e,error:t,loading:n,refreshing:r,reload:a}=w(),o=e,s=v(),c=nt(),l=ae(c),u=l.connect,[d,f]=(0,P.useState)(null),[p,m]=(0,P.useState)(!1),h=(0,P.useRef)(null),g=(0,P.useCallback)(()=>{h.current?.abort();let e=new AbortController;h.current=e,m(!0),fe.detect(e.signal).then(e=>f(e)).catch(()=>{e.signal.aborted||f(null)}).finally(()=>{h.current===e&&m(!1)})},[]),_=(0,P.useRef)(!1);(0,P.useEffect)(()=>{u&&!_.current&&(_.current=!0,g())},[u,g]),(0,P.useEffect)(()=>()=>h.current?.abort(),[]),(0,P.useEffect)(()=>{l.connected?(s.show({title:`${tt[l.connected]} connected.`,tone:`success`}),S(E.setup),b(`#/setup?connect=${l.connected}`,{replace:!0})):l.error&&(s.show({title:`Could not finish connecting.`,body:l.error,tone:`error`,persistent:!0}),b(u?`#/setup?connect=${u}`:`#/setup`,{replace:!0}))},[l.connected,l.error]);let y=e=>b(`#/setup?connect=${e.key}`,{replace:!0}),x=()=>b(`#/setup`,{replace:!0}),T=(e,t,n=`success`)=>{e&&C(E.setup,t=>t&&{...t,services:t.services.map(t=>t.key===e.key?{...t,...e}:t)}),S(E.setup),t&&s.show({title:t,tone:n})},D=o&&u?o.services.find(e=>e.key===u)??null:null,[O,k]=(0,P.useState)(null);return D&&D!==O&&k(D),(0,F.jsxs)(`div`,{className:`page qd-touch`,children:[(0,F.jsx)(`header`,{className:`page__header`,children:(0,F.jsxs)(`div`,{children:[(0,F.jsx)(`h1`,{className:`page__title`,children:`Setup`}),(0,F.jsx)(`p`,{className:`page__subtitle`,children:`Connect localdost to your model, code host, trackers, and chat.`})]})}),o?(0,F.jsxs)(F.Fragment,{children:[t?(0,F.jsx)(i,{compact:!0,title:`Could not refresh setup. Showing the last check.`,error:t,onRetry:()=>void a()}):null,(0,F.jsx)(ye,{status:o,onOpen:y,onChanged:T,onRefresh:()=>void a(),refreshing:r}),(0,F.jsx)(_e,{status:D??O,open:!!D,onClose:x,detected:d,detecting:p,onRedetect:()=>{g(),S(E.setup)},onChanged:T})]}):n?(0,F.jsx)(Ce,{}):(0,F.jsx)(i,{title:`Could not load setup status`,error:t,onRetry:()=>void a()}),(0,F.jsx)(xe,{}),(0,F.jsx)(Ze,{})]})}export{rt as default};
|
|
2
|
+
//# sourceMappingURL=Setup-DI6hBEP-.js.map
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{H as e,J as t,L as n,Vn as r,Wn as i,_ as a,b as o,dt as s,it as c,m as l,mn as u,pn as d,q as f,u as p}from"./ui-DcmhYyYp.js";import{E as m,O as h,_ as g,d as _,f as v,p as y}from"./format-BBZ8vFyT.js";import{on as b}from"./index-B6qKm1NW.js";import{n as x,t as S}from"./authedMedia-BTYt_tyu.js";var C=i(r(),1),w={passed:`passed`,failed:`failed`,skipped:`skipped`,"timed out":`timedOut`},T=/^Test (passed|failed|skipped|timed out): /,E=/^Test started: /;function D(e,t){let n=2166136261;for(let r of`${e}\u0000${t}`)n=Math.imul(n^r.codePointAt(0),16777619)>>>0;return`test-${n.toString(36)}`}function O(e,t){return`/artifacts/${encodeURIComponent(e)}/${encodeURIComponent(t)}`}function k(e){if(!e.detail)return;if(!e.test)return e.detail;let[t=``,...n]=e.detail.split(`
|
|
2
|
+
`);return(t===e.test?n.join(`
|
|
3
|
+
`):e.detail).trim()||void 0}function A(e){let t=[],n=[];for(let r of e.steps){if(!r.test){t.push(r);continue}let e=m(r.test),i=r.project??``,a=n.find(t=>t.key===e&&t.project===i);a||n.push(a={key:e,project:i,title:r.test,steps:[]}),a.steps.push(r)}let r=new Map((e.artifacts??[]).map(e=>[e.name,e])),i=t=>{let n=r.get(t);return{name:t,url:n?.url??O(e.runId,t),...n?{size:n.size}:{}}},a=[],o=new Set,s=new Map,c=(e,t)=>{let n=D(e,t),r=(s.get(n)??0)+1;return s.set(n,r),r>1?`${n}-${r}`:n},l=e=>e.filter(e=>!E.test(e.label)&&!T.test(e.label));if(e.cases?.length){for(let t of e.cases){let e=m(t.title),r=h(t.title),s=n.filter(t=>t.key===e&&!o.has(t)),u=(r?s.find(e=>e.project===r)??s.find(e=>!e.project):s[0])??void 0;u&&o.add(u);let d=r||u?.project||``,f=t.evidence;a.push({id:c(d,e),key:e,project:d,title:g(t.title),status:t.status,durationMs:t.durationMs,...t.error?{error:t.error}:{},steps:u?l(u.steps):[],shots:(f?.screenshots??[]).map(e=>({...i(e.name),step:e.step??``})),...f?.video?{video:i(f.video)}:{},...f?.trace?{trace:i(f.trace)}:{}})}return{flow:t,rows:a}}for(let e of n){let t=[...e.steps].reverse().find(e=>T.test(e.label)),n=t?w[T.exec(t.label)[1]]??`running`:`running`,r=t&&(n===`failed`||n===`timedOut`)?k(t):void 0;a.push({id:c(e.project,e.key),key:e.key,project:e.project,title:g(e.title),status:n,...r?{error:r}:{},steps:l(e.steps),shots:[]})}return{flow:t,rows:a}}function j(e){let t=(t,n)=>{let r=e.rows.filter(e=>e.key===m(t));return n?r.find(e=>e.project===n)??r.find(e=>!e.project):r[0]};return e.live.length?e.live.map(e=>{let n=t(e.test,e.project);return{image:e.image,test:n?.title??e.test,step:e.step,at:e.at,...n?{rowId:n.id,status:n.status}:{}}}):e.rows.some(e=>e.shots.length)?e.rows.flatMap(e=>e.shots.map(t=>({image:t.url,test:e.title,step:t.step,at:``,rowId:e.id,status:e.status}))):e.legacy.map(e=>({image:e.image,test:e.test,step:e.step,at:e.at}))}function M(e){let t=[];return e.forEach((e,n)=>{let r=t[t.length-1];if(r&&r.test===e.test&&r.rowId===e.rowId){r.frames.push(e);return}t.push({test:e.test,...e.rowId?{rowId:e.rowId}:{},...e.status?{status:e.status}:{},from:n,frames:[e]})}),t}var N=u(),P={running:{label:`Running`,status:`running`},passed:{label:`Passed`,status:`ok`},failed:{label:`Failed`,status:`outage`},timedOut:{label:`Timed out`,status:`outage`},flaky:{label:`Flaky`,status:`attention`},skipped:{label:`Skipped`,status:`paused`}},F={info:`info`,ok:`passed`,warn:`attention`,error:`failed`},I={info:`Info`,ok:`Done`,warn:`Warning`,error:`Error`};function L({file:t,title:r}){let{src:i,error:a}=x(t.url);return a?(0,N.jsx)(e,{compact:!0,error:a,title:`Could not load this video`}):i?(0,N.jsx)(`video`,{className:`run-video`,controls:!0,muted:!0,playsInline:!0,preload:`metadata`,src:i,"aria-label":`Video of ${r}`}):(0,N.jsx)(n,{width:`100%`,height:`var(--tap)`})}function R({shot:e,index:t,total:r,title:i,onOpen:a}){let{src:o,error:s}=x(e.url),c=e.step||`Screenshot ${t+1}`;return(0,N.jsxs)(`li`,{className:`run-shot`,children:[(0,N.jsx)(`button`,{type:`button`,className:`run-shot__open`,onClick:()=>a(e),"aria-label":`Open screenshot ${t+1} of ${r} from ${i}: ${c}`,"aria-haspopup":`dialog`,children:o?(0,N.jsx)(`img`,{className:`run-shot__img`,src:o,alt:``}):s?(0,N.jsx)(`span`,{className:`run-shot__missing`,children:`Not loaded`}):(0,N.jsx)(n,{width:`100%`,height:`100%`,radius:0})}),(0,N.jsx)(`span`,{className:`run-shot__step`,title:c,children:c})]})}function z({shot:e,title:n,onClose:r}){let{src:i}=x(e?.url);return(0,N.jsx)(t,{open:!!e&&!!i,onClose:r,title:n,description:e?.step||`Screenshot`,size:`lg`,className:`run-frame-dialog`,footer:i?(0,N.jsxs)(`a`,{className:`btn btn--secondary btn--sm`,href:i,target:`_blank`,rel:`noreferrer noopener`,children:[`Open in new tab`,(0,N.jsx)(s,{size:12,className:`run-inline-icon`})]}):void 0,children:i&&(0,N.jsx)(`div`,{className:`run-frame-dialog__scroll`,tabIndex:0,role:`region`,"aria-label":`Full size screenshot`,children:(0,N.jsx)(`img`,{src:i,alt:`${n}: ${e?.step||`screenshot`}`,className:`run-frame-dialog__img`})})})}function B({file:e,title:t}){let n=f(),[r,i]=(0,C.useState)(!1);return(0,N.jsxs)(`div`,{className:`run-test__trace`,children:[(0,N.jsx)(d,{size:`sm`,variant:`secondary`,loading:r,"aria-label":`Download trace of ${t}`,onClick:()=>{i(!0),S(e.url,e.name).catch(t=>n.show({tone:`error`,title:`Could not download ${e.name}`,body:t instanceof Error?t.message:void 0})).finally(()=>i(!1))},children:`Download trace`}),(0,N.jsxs)(`a`,{className:`run-test__trace-link`,href:`https://trace.playwright.dev`,target:`_blank`,rel:`noreferrer noopener`,children:[`Open trace viewer`,(0,N.jsx)(s,{size:12,className:`run-inline-icon`})]}),e.size!=null&&(0,N.jsx)(`span`,{className:`run-muted num`,children:v(e.size)})]})}function V({row:e,id:t}){let[n,r]=(0,C.useState)(null),i=!e.error&&!e.video&&!e.shots.length&&!e.trace&&!e.steps.length;return(0,N.jsxs)(`div`,{id:t,className:`run-test__body`,children:[e.error&&(0,N.jsx)(`p`,{className:`run-test__error`,children:b(e.error)}),e.video&&(0,N.jsxs)(`section`,{className:`run-test__section`,"aria-label":`Video of ${e.title}`,children:[(0,N.jsx)(`h4`,{className:`run-test__label`,children:`Video`}),(0,N.jsx)(L,{file:e.video,title:e.title})]}),e.shots.length>0&&(0,N.jsxs)(`section`,{className:`run-test__section`,"aria-label":`Screenshots of ${e.title}`,children:[(0,N.jsxs)(`h4`,{className:`run-test__label`,children:[`Screenshots `,(0,N.jsx)(`span`,{className:`run-section__count num`,children:e.shots.length})]}),(0,N.jsx)(`ul`,{className:`run-shots`,children:e.shots.map((t,n)=>(0,N.jsx)(R,{shot:t,index:n,total:e.shots.length,title:e.title,onOpen:r},t.name))}),(0,N.jsx)(z,{shot:n,title:e.title,onClose:()=>r(null)})]}),e.trace&&(0,N.jsxs)(`section`,{className:`run-test__section`,"aria-label":`Trace of ${e.title}`,children:[(0,N.jsx)(`h4`,{className:`run-test__label`,children:`Trace`}),(0,N.jsx)(B,{file:e.trace,title:e.title})]}),e.steps.length>0&&(0,N.jsxs)(`section`,{className:`run-test__section`,"aria-label":`Steps of ${e.title}`,children:[(0,N.jsxs)(`h4`,{className:`run-test__label`,children:[`Steps `,(0,N.jsx)(`span`,{className:`run-section__count num`,children:e.steps.length})]}),(0,N.jsx)(`ol`,{className:`run-steps run-steps--nested`,children:e.steps.map((e,t)=>{let n=k(e);return(0,N.jsxs)(`li`,{className:`run-step run-step--${e.status}`,children:[(0,N.jsx)(o,{kind:F[e.status],label:I[e.status],size:14}),(0,N.jsxs)(`div`,{className:`run-step__main`,children:[(0,N.jsx)(`p`,{className:`run-step__label`,children:e.label}),n&&(0,N.jsx)(`p`,{className:`run-step__detail`,children:b(n)})]}),(0,N.jsxs)(`span`,{className:`run-step__end num`,children:[(0,N.jsxs)(`span`,{className:`narrow-hide`,"aria-hidden":`true`,children:[I[e.status],` Β· `]}),(0,N.jsx)(`time`,{className:`run-step__time`,dateTime:e.at,children:_(e.at)})]})]},`${e.at}|${e.label}|${t}`)})})]}),i&&(0,N.jsx)(`p`,{className:`run-muted run-test__none`,children:`No screenshots, video, or trace for this test.`})]})}function H({idPrefix:e,rows:t,open:n,onToggle:r,jumpTo:i,onJumped:s}){let u=(0,C.useRef)(new Map);if((0,C.useEffect)(()=>{if(!i)return;let e=u.current.get(i);e&&(e.scrollIntoView?.({block:`nearest`}),e.focus({preventScroll:!0})),s?.()},[i,s]),!t.length)return null;let d=new Set(t.map(e=>e.project).filter(Boolean)).size>1;return(0,N.jsxs)(`section`,{className:`run-tests`,"aria-labelledby":`${e}-tests`,children:[(0,N.jsxs)(`h3`,{id:`${e}-tests`,className:`run-artifacts__heading`,children:[`Tests `,(0,N.jsx)(`span`,{className:`run-section__count num`,children:t.length})]}),(0,N.jsx)(`ul`,{className:`run-test-list`,children:t.map(t=>{let i=n.has(t.id),s=d?t.project:``,f=t.durationMs==null?``:y(t.durationMs),m=`${e}-${t.id}-body`,h=P[t.status];return(0,N.jsxs)(`li`,{id:`${e}-${t.id}`,className:`run-test run-test--${t.status}${i?` run-test--open`:``}`,children:[(0,N.jsxs)(`button`,{type:`button`,className:`run-test__toggle`,"aria-expanded":i,"aria-controls":i?m:void 0,ref:e=>{e?u.current.set(t.id,e):u.current.delete(t.id)},onClick:()=>r(t.id),children:[(0,N.jsx)(o,{kind:t.status,label:h.label,decorative:!0}),(0,N.jsx)(`span`,{className:`run-test__title`,title:t.title,children:t.title}),(0,N.jsxs)(`span`,{className:`run-test__meta num`,children:[(0,N.jsxs)(`span`,{className:`run-test__state narrow-hide`,children:[h.label,s||f?` Β· `:``]}),s&&(0,N.jsx)(a,{icon:(0,N.jsx)(p,{project:s,size:14}),label:l(s),tooltip:!1}),s&&f?` Β· `:``,f]}),(0,N.jsx)(c,{size:14,className:`run-test__chevron`,"aria-hidden":`true`})]}),i&&(0,N.jsx)(V,{row:t,id:m})]},t.id)})})]})}export{A as a,H as i,F as n,j as o,I as r,M as s,P as t};
|
|
4
|
+
//# sourceMappingURL=TestRows-wh03T5Li.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{E as e,En as t,F as n,H as r,I as i,Lt as a,N as o,P as s,R as c,Tn as l,Vn as u,Wn as d,Y as f,mn as p,pn as m,q as h}from"./ui-DcmhYyYp.js";import{r as g,t as _}from"./router-W6nZsQ33.js";import{i as v,n as y,r as b}from"./store-IqrqHuFR.js";import{l as x,y as S}from"./format-BBZ8vFyT.js";import{a as C}from"./index-B6qKm1NW.js";import{_ as w,a as T,d as E,f as D,g as O,h as k,i as A,l as j,m as M,n as N,o as P,r as F,t as I,v as L,y as R}from"./model-BIQy5IVG.js";import{E as z,r as B,w as V}from"./impactModel-MY1OFuiP.js";import{t as H}from"./testruns-DyaqX4ji.js";var U=d(u(),1),W=p(),G=e=>e instanceof Error?e.message:`Something went wrong.`;function K({index:e,value:t,onChange:n}){return(0,W.jsx)(`div`,{className:`segmented tr-step__toggle`,role:`group`,"aria-label":`Step ${e+1} result`,children:[`passed`,`failed`].map(e=>(0,W.jsx)(`button`,{type:`button`,className:`segmented__item${t===e?` is-selected`:``}`,"aria-pressed":t===e,onClick:()=>n(t===e?void 0:e),children:(0,W.jsx)(A,{state:e,fold:`always`})},e))})}function q({item:e,onSaved:t}){let r=h(),[a,c]=(0,U.useState)(()=>e.steps.map(()=>({actual:``}))),[u,d]=(0,U.useState)(``),[f,p]=(0,U.useState)(``),[g,_]=(0,U.useState)(``),[v,y]=(0,U.useState)(``),b=w(a.map(e=>e.result)),x=u||b||``,S=(e,t)=>c(n=>n.map((n,r)=>r===e?{...n,...t}:n)),C=async n=>{if(!x){r.show({title:`Pick a result first`,body:`Mark the steps, or choose a result for the test case.`,tone:`error`});return}y(n?`next`:`one`);try{let i=await l.addRunResult(e.dotId,e.testRunId,e.id,{result:x,steps:a.flatMap((e,t)=>e.result?[{index:t,result:e.result,...e.actual.trim()?{actual:e.actual.trim()}:{}}]:[]),...f.trim()?{notes:f.trim()}:{},...g.trim()?{defects:g.split(/[\s,]+/).filter(Boolean).map(e=>({ref:e}))}:{}});r.show({title:`${E[x]} saved on ${e.key}`,tone:`success`}),await t(i,n)}catch(e){r.show({title:`Could not save the result`,body:G(e),tone:`error`})}finally{y(``)}};return(0,W.jsxs)(`form`,{className:`tr-work`,"aria-label":`Result of ${e.key}`,onSubmit:e=>{e.preventDefault(),C(!0)},children:[e.steps.length===0?(0,W.jsx)(`p`,{className:`muted`,children:`This case has no steps. Choose the result below.`}):(0,W.jsx)(`ol`,{className:`tr-steps`,children:e.steps.map((e,t)=>(0,W.jsxs)(`li`,{className:`tr-step`,children:[(0,W.jsxs)(`div`,{className:`tr-step__head`,children:[(0,W.jsx)(`span`,{className:`tr-step__n num`,children:t+1}),(0,W.jsxs)(`div`,{className:`tr-step__text`,children:[(0,W.jsx)(`p`,{children:e.action}),e.expected&&(0,W.jsxs)(`p`,{className:`tr-step__expected`,children:[(0,W.jsx)(`span`,{className:`muted`,children:`Expected: `}),e.expected]})]}),(0,W.jsx)(K,{index:t,value:a[t]?.result,onChange:e=>S(t,{result:e})})]}),a[t]?.result===`failed`&&(0,W.jsx)(o,{label:`Actual result ${t+1}`,className:`tr-step__actual`,children:(0,W.jsx)(i,{rows:2,value:a[t].actual,onChange:e=>S(t,{actual:e.target.value})})})]},t))}),(0,W.jsxs)(`div`,{className:`tr-work__row`,children:[(0,W.jsx)(o,{label:`Result`,hint:b&&!u?`From the steps you marked.`:void 0,className:`tr-work__result`,children:(0,W.jsxs)(n,{value:x,onChange:e=>d(e.target.value),children:[(0,W.jsx)(`option`,{value:``,children:`Choose`}),P.map(e=>(0,W.jsx)(`option`,{value:e,children:E[e]},e))]})}),(0,W.jsx)(o,{label:`Defects`,hint:`Keys such as SHOP-12.`,className:`tr-work__defects`,children:(0,W.jsx)(s,{value:g,onChange:e=>_(e.target.value)})})]}),(0,W.jsx)(o,{label:`Notes`,children:(0,W.jsx)(i,{rows:2,value:f,onChange:e=>p(e.target.value)})}),(0,W.jsxs)(`div`,{className:`case-actions`,children:[(0,W.jsx)(m,{type:`submit`,variant:`primary`,loading:v===`next`,children:`Save and next`}),(0,W.jsx)(m,{onClick:()=>void C(!1),loading:v===`one`,children:`Save result`})]})]})}function J({r:n,steps:r,repo:i}){let a=(n.steps??[]).filter(e=>e.result!==`passed`||e.actual),o=n.dotRunId??n.runId;return(0,W.jsxs)(`li`,{className:`case-result`,children:[(0,W.jsxs)(`div`,{className:`case-result__head`,children:[(0,W.jsx)(A,{state:n.result,fold:`always`}),(0,W.jsxs)(`span`,{className:`muted num`,children:[`Attempt `,n.attempt??1]}),o?(0,W.jsx)(e,{source:`run`,title:`The dot's check`,href:`#/runs/${encodeURIComponent(o)}`}):n.executedBy&&(0,W.jsx)(`span`,{className:`muted truncate`,children:n.executedBy}),(0,W.jsx)(`time`,{className:`case-result__at muted`,dateTime:n.at,title:x(n.at),children:S(n.at)})]}),n.notes&&(0,W.jsx)(`p`,{className:`case-result__notes`,children:n.notes}),a.length>0&&(0,W.jsx)(`ul`,{className:`tr-step-results`,"aria-label":`Step results`,children:a.map(e=>(0,W.jsxs)(`li`,{children:[(0,W.jsx)(A,{state:e.result,fold:`always`}),(0,W.jsxs)(`span`,{className:`truncate`,children:[`Step `,e.index+1,r[e.index]?`: ${r[e.index].action}`:``]}),e.actual&&(0,W.jsxs)(`p`,{className:`tr-step-results__actual`,children:[`Actual: `,e.actual]})]},e.index))}),(n.defects??[]).length>0&&(0,W.jsx)(`div`,{className:`cases-chips cases-chips--wrap`,children:(n.defects??[]).map(t=>(0,W.jsx)(e,{...V({ref:t.ref},i),source:`defect`},`${t.ref}-${t.stepIndex??``}`))}),o&&n.evidence.length>0&&(0,W.jsx)(`ul`,{className:`case-evidence`,"aria-label":`Evidence`,children:n.evidence.map(e=>(0,W.jsx)(`li`,{children:(0,W.jsx)(`a`,{href:t(o,e),target:`_blank`,rel:`noreferrer`,children:e.split(`/`).pop()})},e))})]})}function Y({run:e,itemId:t,repo:n,onClose:i,onNext:o}){let s=h(),u=t?O(e.dotId,e.id,t):null,d=v(u,n=>l.runItem(e.dotId,e.id,t,n),{refreshOn:[`run`],throttleMs:1500}),p=d.data,[g,_]=(0,U.useState)(!1),x=e.source===`manual`,S=x&&e.status!==`done`&&e.status!==`cancelled`,C=p&&p.state!==`untested`&&p.state!==`retest`,w=()=>{y(L(e.dotId,e.id)),y(R(e.dotId))},T=(e,t)=>{u&&b(u,e),w(),t&&o(e)},E=async()=>{if(p){_(!0);try{let t=await l.retestItem(e.dotId,e.id,p.id);u&&b(u,t),w(),s.show({title:`${p.key} is open for attempt ${t.attempt}`,tone:`success`})}catch(e){s.show({title:`Could not retest`,body:G(e),tone:`error`})}finally{_(!1)}}},D=p?`${p.key} ${p.title}`:`Run item`;return(0,W.jsxs)(f,{open:!!t,onClose:i,side:`right`,title:D,description:`Run item`,hideDescription:!0,className:`case-drawer tr-item`,children:[d.error&&!p?(0,W.jsx)(r,{compact:!0,title:`Could not load this item`,error:d.error,onRetry:()=>void d.reload()}):null,!p&&!d.error?(0,W.jsx)(c,{label:`Loading the item`}):null,p&&(0,W.jsxs)(W.Fragment,{children:[(0,W.jsxs)(`dl`,{className:`case-meta`,children:[(0,W.jsxs)(`div`,{children:[(0,W.jsx)(`dt`,{children:`State`}),(0,W.jsx)(`dd`,{children:(0,W.jsx)(A,{state:p.state,fold:`always`})})]}),(0,W.jsxs)(`div`,{children:[(0,W.jsx)(`dt`,{children:`Attempt`}),(0,W.jsx)(`dd`,{className:`num`,children:p.attempt})]}),(0,W.jsxs)(`div`,{children:[(0,W.jsx)(`dt`,{children:`Test case version`}),(0,W.jsx)(`dd`,{className:`num`,children:p.caseVersion})]}),p.assignee&&(0,W.jsxs)(`div`,{children:[(0,W.jsx)(`dt`,{children:`Assignee`}),(0,W.jsx)(`dd`,{children:p.assignee})]}),p.specPath&&(0,W.jsxs)(`div`,{className:`case-meta__wide`,children:[(0,W.jsx)(`dt`,{children:`Spec file`}),(0,W.jsx)(`dd`,{className:`num`,children:p.specPath})]})]}),p.needsReview&&(0,W.jsxs)(`p`,{className:`tr-note`,children:[(0,W.jsx)(B,{flag:p.needsReview,fold:`always`}),` `,p.needsReview.ticket,` `,p.needsReview.verdict===`update`?`changes this test case. A new version waits for your OK on the`:`makes this test case obsolete. Archiving it waits for your OK on the`,` `,(0,W.jsx)(`a`,{href:`#/cases?dot=${encodeURIComponent(p.dotId)}&req=${encodeURIComponent(p.needsReview.ticket)}`,children:`Test cases page`}),`.`]}),p.newerVersion&&(0,W.jsxs)(`p`,{className:`tr-note`,children:[`The test case changed after this test run started. This test run keeps version `,p.caseVersion,`.`]}),!x&&(0,W.jsx)(`p`,{className:`tr-note`,children:`Automated: the dot filled in this result, so it is read only. Open its check for the steps, screenshots and trace.`}),S&&C&&(0,W.jsx)(`div`,{className:`case-actions`,children:(0,W.jsx)(m,{icon:(0,W.jsx)(a,{size:14}),onClick:()=>void E(),loading:g,children:`Retest`})}),S&&!C?(0,W.jsxs)(`section`,{className:`case-sec`,children:[(0,W.jsx)(`h3`,{className:`case-sec__title`,children:p.attempt>1?`Attempt ${p.attempt}`:`Steps`}),(0,W.jsx)(q,{item:p,onSaved:T},`${p.id}:${p.attempt}`)]}):p.steps.length>0&&(0,W.jsxs)(`section`,{className:`case-sec`,children:[(0,W.jsxs)(`h3`,{className:`case-sec__title`,children:[`Steps `,(0,W.jsx)(`span`,{className:`case-sec__count num`,children:p.steps.length})]}),(0,W.jsx)(`ol`,{className:`case-steps-view`,children:p.steps.map((e,t)=>(0,W.jsxs)(`li`,{children:[(0,W.jsx)(`p`,{children:e.action}),e.expected&&(0,W.jsxs)(`p`,{className:`case-steps-view__expected`,children:[(0,W.jsx)(`span`,{className:`muted`,children:`Expected: `}),e.expected]})]},t))})]}),(0,W.jsxs)(`section`,{className:`case-sec`,children:[(0,W.jsxs)(`h3`,{className:`case-sec__title`,children:[`Results `,(0,W.jsx)(`span`,{className:`case-sec__count num`,children:p.results.length})]}),p.results.length===0?(0,W.jsx)(`p`,{className:`muted`,children:`No result yet.`}):(0,W.jsx)(`ul`,{className:`case-results`,children:p.results.map(e=>(0,W.jsx)(J,{r:e,steps:p.steps,repo:n},e.id))})]})]})]})}var X=e=>e instanceof Error?e.message:`Something went wrong.`,Z=[`untested`,`retest`];function Q({item:e,route:t,selected:n}){let r=e.latest,i=r?r.source===`run`?`The dot`:r.executedBy:void 0;return(0,W.jsx)(`li`,{className:`tr-item-row mark-cq${n?` is-selected`:``}`,children:(0,W.jsxs)(`a`,{className:`tr-item-row__link`,href:_({...t,item:e.id}),"aria-current":n||void 0,children:[(0,W.jsx)(`span`,{className:`tr-item-row__n num muted`,children:e.position}),(0,W.jsx)(`span`,{className:`tr-item-row__state`,children:(0,W.jsx)(A,{state:e.state})}),(0,W.jsx)(`span`,{className:`tr-item-row__key num`,children:e.key}),(0,W.jsx)(`span`,{className:`tr-item-row__title truncate`,title:e.title,children:e.title}),e.needsReview&&(0,W.jsx)(B,{flag:e.needsReview,fold:`always`}),e.attempt>1&&(0,W.jsxs)(`span`,{className:`tr-item-row__attempt muted num`,children:[`Attempt `,e.attempt]}),(0,W.jsx)(`span`,{className:`tr-item-row__by muted`,children:r?(0,W.jsxs)(W.Fragment,{children:[i&&(0,W.jsx)(`span`,{className:`truncate`,children:i}),(0,W.jsx)(`time`,{dateTime:r.at,title:x(r.at),children:S(r.at)})]}):null})]})})}function $({route:t}){let i=h(),{dot:a,dotId:s}=H(t.dotId),u=s?L(s,t.id):null,d=v(u,e=>l.testRun(s,t.id,e),{refreshOn:[`run`],throttleMs:1500}),[f,p]=(0,U.useState)(null),x=d.data,S=a?.repo?`${a.repo.owner}/${a.repo.name}`:void 0,w=F.includes(t.state??``)?t.state:void 0;C({title:x?.name,back:{href:_({name:`testRuns`,dotId:s}),label:`Test runs`}});let O=(e,n=!0)=>g({...t,dotId:s,...e},{replace:n}),A=async e=>{if(x){p(e);try{let t=await l.updateTestRun(x.dotId,x.id,{status:e});u&&b(u,e=>e&&{...e,...t,items:e.items}),y(R(x.dotId))}catch(e){i.show({title:`Could not change the test run`,body:X(e),tone:`error`})}finally{p(null)}}};if(!s)return(0,W.jsx)(c,{label:`Loading the test run`});if(d.error&&!x)return(0,W.jsx)(r,{title:`Could not load the test run`,error:d.error,onRetry:()=>void d.reload()});if(!x)return(0,W.jsx)(c,{label:`Loading the test run`});let P=w?x.items.filter(e=>e.state===w):x.items,B=x.source===`manual`,V=x.status===`open`||x.status===`in_progress`;return(0,W.jsxs)(`div`,{className:`page test-run`,children:[(0,W.jsxs)(`header`,{className:`page__header`,children:[(0,W.jsxs)(`div`,{className:`test-run__head`,children:[(0,W.jsx)(`h1`,{className:`page__title`,children:x.name}),(0,W.jsxs)(`div`,{className:`tr-context mark-cq`,children:[(0,W.jsx)(j,{status:x.status,fold:`always`}),(0,W.jsx)(D,{source:x.source,fold:`always`}),x.environment&&(0,W.jsx)(N,{environment:x.environment,fold:`always`}),x.config&&(0,W.jsx)(I,{config:x.config,fold:`always`}),x.buildSha&&(0,W.jsx)(`span`,{className:`tr-context__sha num`,title:`Build ${x.buildSha}`,children:x.buildSha.slice(0,7)}),x.assignee&&(0,W.jsx)(`span`,{className:`muted`,children:x.assignee}),x.planName&&(0,W.jsxs)(`span`,{className:`muted`,children:[`Plan `,x.planName]}),x.suiteName&&(0,W.jsxs)(`span`,{className:`muted`,children:[`Suite `,x.suiteName]}),x.dotRunId&&(0,W.jsx)(e,{source:`run`,title:`The dot's check`,href:_({name:`run`,id:x.dotRunId})})]})]}),B&&(0,W.jsx)(`div`,{className:`page__actions`,children:V?(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(m,{variant:`primary`,loading:f===`done`,onClick:()=>void A(`done`),children:`Mark done`}),(0,W.jsx)(m,{variant:`ghost`,loading:f===`cancelled`,onClick:()=>void A(`cancelled`),children:`Cancel test run`})]}):(0,W.jsx)(m,{loading:f===`in_progress`,onClick:()=>void A(`in_progress`),children:`Reopen`})})]}),(0,W.jsx)(z,{dotId:x.dotId,kind:`test_run`,id:x.id}),(0,W.jsxs)(`div`,{className:`tr-summary`,children:[(0,W.jsx)(T,{progress:x.progress}),(0,W.jsx)(`p`,{className:`tr-summary__words`,role:`status`,children:k(x.progress)})]}),(0,W.jsx)(`div`,{className:`cases-filters`,role:`group`,"aria-label":`Filters`,children:(0,W.jsx)(o,{label:`State`,className:`cases-filter`,children:(0,W.jsxs)(n,{value:w??``,onChange:e=>O({state:e.target.value||void 0,item:void 0}),children:[(0,W.jsx)(`option`,{value:``,children:`All items (${x.progress.total})`}),F.map(e=>(0,W.jsx)(`option`,{value:e,children:`${E[e]} (${x.progress[e]})`},e))]})})}),P.length===0?(0,W.jsx)(`p`,{className:`muted tr-empty`,children:`No items in this state.`}):(0,W.jsx)(`ul`,{className:`tr-items`,"aria-label":`Run items`,style:{"--tr-key-w":M(P)},children:P.map(e=>(0,W.jsx)(Q,{item:e,route:{...t,dotId:s},selected:t.item===e.id},e.id))}),(0,W.jsx)(Y,{run:x,itemId:t.item,repo:S,onClose:()=>O({item:void 0},!1),onNext:e=>{let t=[...x.items.filter(t=>t.position>e.position),...x.items.filter(t=>t.position<e.position)].find(t=>Z.includes(t.state)&&t.id!==e.id);t?O({item:t.id},!1):(O({item:void 0},!1),i.show({title:`Every item has a result`,body:`Mark the test run done when you are finished.`,tone:`success`}))}})]})}function ee({route:e}){return(0,W.jsx)($,{route:e})}export{ee as default};
|
|
2
|
+
//# sourceMappingURL=TestRun-DTOyF-Pv.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{F as e,G as t,H as n,It as r,N as i,R as a,Tn as o,mn as s,pn as c}from"./ui-DcmhYyYp.js";import{r as l,t as u}from"./router-W6nZsQ33.js";import{i as d}from"./store-IqrqHuFR.js";import{l as f,y as p}from"./format-BBZ8vFyT.js";import{t as m}from"./NewTestRunDialog-BQBthVHE.js";import{a as h,c as g,f as _,l as v,n as y,p as b,s as x,t as S,u as C,y as w}from"./model-BIQy5IVG.js";import{t as T}from"./testruns-DyaqX4ji.js";var E=s(),D=(e,t,n)=>`${w(e)}${t}:${n}`;function O({t:e}){let t=e.progress,n=e.planName?`Plan ${e.planName}`:e.suiteName?`Suite ${e.suiteName}`:``;return(0,E.jsx)(`li`,{className:`tr-row mark-cq`,children:(0,E.jsxs)(`a`,{className:`tr-row__link`,href:u({name:`testRun`,id:e.id,dotId:e.dotId}),children:[(0,E.jsx)(`span`,{className:`tr-row__status`,children:(0,E.jsx)(v,{status:e.status})}),(0,E.jsxs)(`span`,{className:`tr-row__main`,children:[(0,E.jsx)(`span`,{className:`tr-row__name truncate`,title:e.name,children:e.name}),(0,E.jsxs)(`span`,{className:`tr-row__meta`,children:[(0,E.jsx)(_,{source:e.source}),n&&(0,E.jsx)(`span`,{className:`tr-row__from truncate`,children:n}),e.assignee&&(0,E.jsx)(`span`,{className:`tr-row__from truncate`,children:e.assignee})]})]}),(0,E.jsxs)(`span`,{className:`tr-row__progress`,children:[(0,E.jsx)(h,{progress:t}),(0,E.jsxs)(`span`,{className:`tr-row__count num`,children:[b(t),`/`,t.total]})]}),(0,E.jsxs)(`span`,{className:`tr-row__ctx`,children:[e.environment&&(0,E.jsx)(y,{environment:e.environment}),e.config&&(0,E.jsx)(S,{config:e.config})]}),(0,E.jsx)(`time`,{className:`tr-row__at muted`,dateTime:e.updatedAt,title:f(e.updatedAt),children:p(e.updatedAt)})]})})}function k({route:s}){let{live:u,dotId:f,loading:p}=T(s.dotId),h=s.status??``,_=s.source??``,v=d(f?D(f,h,_):null,e=>o.testRuns(f,{status:h,source:_},e),{refreshOn:[`run`],throttleMs:1500}),y=e=>l({name:`testRuns`,dotId:f,status:h,source:_,...e},{replace:!0}),b=v.data,S=!!(h||_);return(0,E.jsxs)(`div`,{className:`page test-runs`,children:[(0,E.jsxs)(`header`,{className:`page__header`,children:[(0,E.jsxs)(`div`,{children:[(0,E.jsx)(`h1`,{className:`page__title`,children:`Test runs`}),(0,E.jsx)(`p`,{className:`page__subtitle`,children:`Planned passes over test cases. Manual ones are worked by a person; automated ones are filled in by a dot check.`})]}),f&&(0,E.jsx)(`div`,{className:`page__actions`,children:(0,E.jsx)(c,{variant:`primary`,icon:(0,E.jsx)(r,{size:14}),onClick:()=>y({create:!0}),children:`New test run`})})]}),u.length===0&&!p?(0,E.jsx)(t,{kind:`first-run`,title:`No test runs yet`,body:`A test run needs test cases, and those live in a dot. Create a dot first.`,action:(0,E.jsx)(`a`,{href:`#/dots?new=1`,children:`New dot`})}):(0,E.jsxs)(E.Fragment,{children:[(0,E.jsxs)(`div`,{className:`cases-filters`,role:`group`,"aria-label":`Filters`,children:[u.length>1&&(0,E.jsx)(i,{label:`Dot`,className:`cases-filter`,children:(0,E.jsx)(e,{value:f??``,onChange:e=>y({dotId:e.target.value,status:``,source:``}),children:u.map(e=>(0,E.jsx)(`option`,{value:e.id,children:e.name},e.id))})}),(0,E.jsx)(i,{label:`Status`,className:`cases-filter`,children:(0,E.jsxs)(e,{value:h,onChange:e=>y({status:e.target.value}),children:[(0,E.jsx)(`option`,{value:``,children:`All statuses`}),x.map(e=>(0,E.jsx)(`option`,{value:e,children:g[e]},e))]})}),(0,E.jsx)(i,{label:`Source`,className:`cases-filter`,children:(0,E.jsxs)(e,{value:_,onChange:e=>y({source:e.target.value}),children:[(0,E.jsx)(`option`,{value:``,children:`Manual and automated`}),(0,E.jsx)(`option`,{value:`manual`,children:C.manual}),(0,E.jsx)(`option`,{value:`automated`,children:C.automated})]})})]}),v.error&&!b?(0,E.jsx)(n,{title:`Could not load the test runs`,error:v.error,onRetry:()=>void v.reload()}):null,!b&&!v.error?(0,E.jsx)(a,{label:`Loading test runs`,since:v.startedAt}):null,b&&(b.length===0?S?(0,E.jsx)(t,{kind:`filtered`,title:`No test runs match`,body:`Change a filter to see more.`,action:(0,E.jsx)(c,{onClick:()=>y({status:``,source:``}),children:`Clear filters`})}):(0,E.jsx)(t,{kind:`first-run`,title:`No test runs yet`,body:`Start one from a suite, a plan or a folder of test cases.`,action:(0,E.jsx)(c,{onClick:()=>y({create:!0}),children:`New test run`})}):(0,E.jsx)(`ul`,{className:`tr-list`,"aria-label":`Test runs`,children:b.map(e=>(0,E.jsx)(O,{t:e},e.id))})),f&&(0,E.jsx)(m,{dotId:f,open:!!s.create,onClose:()=>y({create:void 0})})]})]})}function A({route:e}){return(0,E.jsx)(k,{route:e})}export{A as default};
|
|
2
|
+
//# sourceMappingURL=TestRuns-ggDjm1Q8.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{H as e,N as t,P as n,R as r,Vn as i,Wn as a,mn as o,pn as s}from"./ui-DcmhYyYp.js";import{f as c,l,u}from"./index-B6qKm1NW.js";var d=a(i(),1);function f(e){let t=atob(e.replace(/-/g,`+`).replace(/_/g,`/`)+`=`.repeat((4-e.length%4)%4)),n=Uint8Array.from(t,e=>e.charCodeAt(0));return new TextDecoder().decode(n)}function p(e){let t=e.trim(),n=t;if(t.startsWith(`tinybee://pair`)){let e=t.slice(t.indexOf(`?`)+1);n=new URLSearchParams(e).get(`d`)??``}if(/^[A-Za-z0-9_-]{20,}$/.test(n))try{let e=JSON.parse(f(n));if(e.v!==1||typeof e.nonce!=`string`||typeof e.pub!=`string`||typeof e.host!=`string`||typeof e.sig!=`string`)return;let t=e.hc&&typeof e.hc==`object`?e.hc:{ok:!0};return{v:1,nonce:e.nonce,pub:e.pub,host:e.host,hc:t,sig:e.sig,...typeof e.lan==`string`?{lan:e.lan}:{}}}catch{return}}var m=o(),h=9e4;function g(e){return e instanceof Error?e.message:String(e)}function _({hc:e}){let t=[];return e.ram_gb!==void 0&&t.push({ok:e.ram_gb>=8,text:`${e.ram_gb} GB memory`}),e.disk_free_gb!==void 0&&t.push({ok:e.disk_free_gb>=5,text:`${e.disk_free_gb} GB free disk`}),e.power_ok!==void 0&&t.push({ok:e.power_ok,text:e.power_ok?`Plugged in or charged`:`Battery is low: plug it in`}),t.push({ok:(e.providers?.length??0)>0,text:e.providers?.length?`AI: ${e.providers.join(`, `)}`:`No AI provider key yet (you can add one later)`}),(0,m.jsx)(`ul`,{className:`addlaptop__health`,"data-testid":`addlaptop-health`,children:t.map(e=>(0,m.jsxs)(`li`,{className:e.ok?`is-ok`:`is-warn`,children:[e.ok?`β`:`!`,` `,e.text]},e.text))})}function v({onText:e}){let t=(0,d.useRef)(null),n=window.BarcodeDetector,r=!!n&&!!navigator.mediaDevices?.getUserMedia,[i,a]=(0,d.useState)(r?`starting`:`unsupported`);return(0,d.useEffect)(()=>{if(!n||!navigator.mediaDevices?.getUserMedia)return;let r,i,o=!1,s=new n({formats:[`qr_code`]});return(async()=>{try{r=await navigator.mediaDevices.getUserMedia({video:{facingMode:`environment`}})}catch{a(`denied`);return}if(o||!t.current)return;t.current.srcObject=r,await t.current.play().catch(()=>void 0),a(`on`);let n=async()=>{if(!o&&t.current){try{let n=(await s.detect(t.current)).find(e=>e.rawValue.startsWith(`tinybee://pair`));if(n){e(n.rawValue);return}}catch{}i=setTimeout(()=>void n(),300)}};n()})(),()=>{o=!0,i&&clearTimeout(i),r?.getTracks().forEach(e=>e.stop())}},[e,n]),i===`unsupported`?(0,m.jsx)(`p`,{className:`signup__muted`,children:`This browser cannot scan here. Paste the code from the laptop below.`}):i===`denied`?(0,m.jsx)(`p`,{className:`signup__muted`,children:`Camera access was refused. Paste the code from the laptop below.`}):(0,m.jsxs)(`div`,{className:`addlaptop__camera`,"data-testid":`addlaptop-camera`,children:[(0,m.jsx)(`video`,{ref:t,muted:!0,playsInline:!0}),i===`starting`&&(0,m.jsx)(`span`,{children:`Starting cameraβ¦`})]})}function y({pending:e,bee:r,initialText:i,onPayload:a,onPending:o}){let[c,l]=(0,d.useState)(i??``),[u,f]=(0,d.useState)(null),h=(0,d.useCallback)(e=>{let t=p(e.trim());if(!t){f(`That is not a TinyBee pairing code. Copy the whole text under the QR on the laptop.`);return}f(null),a(t)},[a]);return(0,m.jsxs)(`div`,{className:`signup__form`,children:[e&&(0,m.jsxs)(`div`,{className:`addlaptop__pending`,"data-testid":`addlaptop-pending`,children:[(0,m.jsxs)(`p`,{children:[(0,m.jsx)(`strong`,{children:e.host}),` typed your install code and is waiting.`]}),(0,m.jsxs)(s,{variant:`primary`,onClick:()=>o(e),children:[`Confirm `,e.host]})]}),r&&(0,m.jsxs)(`p`,{className:`signup__muted`,"data-testid":`addlaptop-current`,children:[`This account already has `,(0,m.jsx)(`strong`,{children:r.name}),` (`,r.online?`online`:`offline`,`). Adding another laptop replaces it.`]}),(0,m.jsx)(`p`,{className:`signup__muted`,children:`On your laptop, open TinyBee setup and show the QR. Then point this camera at it.`}),(0,m.jsx)(v,{onText:h}),(0,m.jsx)(t,{label:`Or paste the code from the laptop`,error:u,children:(0,m.jsx)(n,{value:c,onChange:e=>l(e.target.value),placeholder:`tinybee://pair?d=β¦`,autoComplete:`off`,autoCapitalize:`none`,autoCorrect:`off`,spellCheck:!1,"data-testid":`addlaptop-paste`})}),(0,m.jsx)(s,{variant:`secondary`,onClick:()=>h(c),disabled:!c.trim(),children:`Use this code`})]})}function b({s:e,onBound:t,onBack:n}){let[r,i]=(0,d.useState)(!1),[a,o]=(0,d.useState)(null),[c,f]=(0,d.useState)(e.existing),p=async()=>{i(!0),o(null);try{t((await u.pairComplete(e.nonce,{replace:!!c})).bee)}catch(e){e instanceof l&&e.code===`bee_exists`?(f(e.extra.bee),o(null)):o(g(e))}finally{i(!1)}};return(0,m.jsxs)(`div`,{className:`signup__form`,"data-testid":`addlaptop-confirm`,children:[(0,m.jsx)(`h2`,{className:`page__title`,"data-testid":`addlaptop-host`,children:e.host}),(0,m.jsx)(_,{hc:e.hc}),c&&(0,m.jsxs)(`p`,{className:`addlaptop__replace`,"data-testid":`addlaptop-replace`,children:[(0,m.jsx)(`strong`,{children:c.name}),` is already connected to this account. Connecting `,e.host,` replaces it; the old laptop stops working for this account.`]}),a&&(0,m.jsx)(`p`,{className:`field__error`,children:a}),(0,m.jsx)(s,{variant:`primary`,size:`lg`,block:!0,loading:r,onClick:()=>void p(),children:c?`Replace with ${e.host}`:`Connect ${e.host}`}),(0,m.jsx)(s,{variant:`ghost`,onClick:n,disabled:r,children:`Scan another`})]})}function x({d:t}){let[n,i]=(0,d.useState)({kind:`loading`}),[a,o]=(0,d.useState)(0),f=t?t.startsWith(`tinybee://`)?t:`tinybee://pair?d=${t}`:void 0;(0,d.useEffect)(()=>{let e=new AbortController;return(async()=>{try{if(!c()){i({kind:`signin`});return}let t=await u.me().catch(e=>{if(e instanceof l&&e.status===401)return null;throw e});if(!t||!t.tenant){i({kind:`signin`});return}let n=await u.bee(e.signal),r=n.bee&&(n.bee.status===`provisioning`||n.bee.status===`online`)?n.bee:null,a=f?p(f):void 0;a?i({kind:`confirm`,nonce:a.nonce,host:a.host,hc:a.hc,existing:r}):r?.online?i({kind:`online`,bee:r}):r?.status===`provisioning`?i({kind:`provisioning`,bee:r,since:Date.now()}):i({kind:`scan`,pending:n.pending,bee:r})}catch(e){if(e instanceof DOMException&&e.name===`AbortError`)return;i({kind:`error`,error:e})}})(),()=>e.abort()},[a]),(0,d.useEffect)(()=>{if(n.kind!==`provisioning`)return;let e=n.since,t=!1,r=setInterval(()=>{u.bee().then(n=>{!t&&n.bee&&(n.bee.online?i({kind:`online`,bee:n.bee}):n.bee.status!==`provisioning`&&n.bee.status!==`online`?i({kind:`scan`,pending:n.pending,bee:null}):Date.now()-e>h?i({kind:`error`,error:Error(`The laptop has not checked in yet. Is it online? Open TinyBee setup on it and try again.`)}):i({kind:`provisioning`,bee:n.bee,since:e}))}).catch(()=>void 0)},2e3);return()=>{t=!0,clearInterval(r)}},[n.kind===`provisioning`?n.since:null]);let g=()=>{i({kind:`loading`}),o(e=>e+1)};if(n.kind===`loading`)return(0,m.jsx)(r,{rows:4,delayMs:300,label:`Loading TinyBee`});if(n.kind===`error`)return(0,m.jsx)(e,{title:`Could not add the laptop`,error:n.error,onRetry:g});if(n.kind===`signin`)return(0,m.jsxs)(`div`,{className:`page signup qd-touch`,children:[(0,m.jsx)(`h1`,{className:`page__title`,children:`Sign in first`}),(0,m.jsx)(`p`,{className:`signup__muted`,children:`Adding a laptop needs your TinyBee account and address.`}),(0,m.jsx)(s,{variant:`primary`,onClick:()=>window.location.hash=`#/signup`,children:`Go to sign-up`})]});let v=n.kind===`scan`?`Scan the QR on the laptop.`:n.kind===`confirm`?`Is this your laptop?`:n.kind===`provisioning`?`Setting up its private addressβ¦`:`Your laptop is connected.`;return(0,m.jsxs)(`div`,{className:`page signup qd-touch`,children:[(0,m.jsx)(`header`,{className:`page__header`,children:(0,m.jsxs)(`div`,{children:[(0,m.jsx)(`h1`,{className:`page__title`,children:`Add laptop`}),(0,m.jsx)(`p`,{className:`page__subtitle`,children:v})]})}),n.kind===`scan`&&(0,m.jsx)(y,{pending:n.pending,bee:n.bee,initialText:f,onPayload:e=>i({kind:`confirm`,nonce:e.nonce,host:e.host,hc:e.hc,existing:n.bee}),onPending:e=>i({kind:`confirm`,nonce:e.nonce,host:e.host,hc:e.hc,existing:n.bee})}),n.kind===`confirm`&&(0,m.jsx)(b,{s:n,onBound:e=>i({kind:`provisioning`,bee:e,since:Date.now()}),onBack:g}),n.kind===`provisioning`&&(0,m.jsxs)(`div`,{className:`signup__form`,"data-testid":`addlaptop-provisioning`,"aria-live":`polite`,children:[(0,m.jsx)(r,{rows:2,label:`Provisioning`}),(0,m.jsxs)(`p`,{className:`signup__muted`,children:[(0,m.jsx)(`strong`,{children:n.bee.name}),` will answer at `,(0,m.jsxs)(`code`,{children:[`https://`,n.bee.hostname]}),`. Waiting for its first check-in.`]})]}),n.kind===`online`&&(0,m.jsxs)(`div`,{className:`signup__form`,"data-testid":`addlaptop-online`,children:[(0,m.jsxs)(`p`,{className:`addlaptop__online`,children:[`β `,(0,m.jsx)(`strong`,{children:n.bee.name}),` is online`]}),(0,m.jsxs)(`p`,{className:`signup__muted`,children:[`Address: `,(0,m.jsxs)(`code`,{"data-testid":`addlaptop-hostname`,children:[`https://`,n.bee.hostname]})]}),(0,m.jsx)(_,{hc:n.bee.hc}),(0,m.jsx)(s,{variant:`secondary`,onClick:()=>i({kind:`scan`,pending:null,bee:n.bee}),children:`Replace with another laptop`})]})]})}export{x as default};
|
|
2
|
+
//# sourceMappingURL=TinyBeeAddLaptop-bc3pmh3T.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{F as e,G as t,H as n,I as r,Lt as i,N as a,P as o,R as s,Vn as c,Wn as l,Y as u,at as d,mn as f,pn as p,q as m,rt as h}from"./ui-DcmhYyYp.js";import{i as g,r as _}from"./store-IqrqHuFR.js";import{s as v}from"./index-B6qKm1NW.js";import{t as y}from"./beeApi-BHW8Tx1s.js";import{n as b,r as x,t as S}from"./modelsApi-PUSySRQw.js";var C=l(c(),1),w=f(),T={claude:`M12 3v4M12 17v4M3 12h4M17 12h4M5.6 5.6l2.9 2.9M15.5 15.5l2.9 2.9M5.6 18.4l2.9-2.9M15.5 8.5l2.9-2.9`,openai:`M12 4a4 4 0 0 1 3.5 2M12 20a4 4 0 0 1-3.5-2M5 8.5a4 4 0 0 1 4-1.5M19 15.5a4 4 0 0 1-4 1.5M19 8.5a4 4 0 0 0-4-1.5M5 15.5a4 4 0 0 0 4 1.5M9 10.5v3l3 1.7 3-1.7v-3L12 8.8z`,anthropic:`M5 19 11 5h2l6 14M8.2 14h7.6`,gemini:`M12 3c0 5 4 9 9 9-5 0-9 4-9 9 0-5-4-9-9-9 5 0 9-4 9-9z`,ollama:`M8 4v5M16 4v5M7 9h10v6a5 5 0 0 1-10 0zM10 13h.01M14 13h.01M11 16h2`,lmstudio:`M9 3h6M10 3v6l-5 9a2 2 0 0 0 2 3h10a2 2 0 0 0 2-3l-5-9V3`,custom:`M9 3v5M15 3v5M6 8h12v3a6 6 0 0 1-12 0zM12 17v4`};function E({brand:e,size:t=32}){return(0,w.jsx)(`span`,{className:`brand-mark brand-mark--${e}`,style:{width:t,height:t},"aria-hidden":`true`,children:(0,w.jsx)(`svg`,{viewBox:`0 0 24 24`,width:t*.6,height:t*.6,fill:`none`,stroke:`currentColor`,strokeWidth:1.8,strokeLinecap:`round`,strokeLinejoin:`round`,children:(0,w.jsx)(`path`,{d:T[e]})})})}var D=[`cheap`,`strong`,`local`],O={install:`Install on the laptop`,login:`Sign in on the laptop`,key:`Add a key`,server:`Start it on the laptop`,model:`Pick a model`,endpoint:`Add an endpoint`};function k(){let{status:e}=v(),r=g(e.canAct?S:null,e=>x.scan(e)),a=m(),[o,c]=(0,C.useState)(null),[l,u]=(0,C.useState)(!1),[f,T]=(0,C.useState)(!1),k=async(e,t)=>{T(!0);try{let n=await x.change(e);return _(S,n),t&&a.show({title:t}),!0}catch(e){return a.show({title:`Could not change that`,body:e instanceof Error?e.message:void 0,tone:`error`}),!1}finally{T(!1)}};if(!e.canAct)return(0,w.jsx)(`div`,{className:`page ai`,children:(0,w.jsx)(t,{kind:`zero`,title:`Your Bee is not reachable`,body:`The laptop scans itself for AI backends. Open this again when the Bee is online.`})});if(r.error&&!r.data){let e=r.error;return(0,w.jsx)(`div`,{className:`page ai`,children:(0,w.jsx)(n,{error:e,kind:e instanceof y&&e.status===403?`blocked`:void 0,title:`Could not read the laptop's AI backends`,onRetry:()=>void r.reload()})})}let M=r.data;if(!M)return(0,w.jsx)(`div`,{className:`page ai`,children:(0,w.jsx)(s,{rows:4})});let N=M.backends.filter(e=>e.ready),P=o?M.backends.find(e=>e.id===o):void 0;return(0,w.jsxs)(`div`,{className:`page ai`,"data-testid":`ai-page`,children:[(0,w.jsxs)(`section`,{className:`ai__active${M.active?``:` ai__active--none`}`,"data-testid":`ai-active`,children:[M.active?(0,w.jsxs)(w.Fragment,{children:[(0,w.jsx)(E,{brand:M.backends.find(e=>e.id===M.active.id)?.brand??`custom`,size:40}),(0,w.jsxs)(`div`,{className:`ai__active-text`,children:[(0,w.jsx)(`h2`,{className:`ai__h`,children:M.active.label}),(0,w.jsx)(`p`,{className:`ai__meta`,children:M.active.model?`${M.active.model} Β· in use on this laptop`:`In use on this laptop`})]})]}):(0,w.jsxs)(`div`,{className:`ai__active-text`,children:[(0,w.jsx)(`h2`,{className:`ai__h`,children:`No AI backend picked yet`}),(0,w.jsx)(`p`,{className:`ai__meta`,children:N.length?`Pick one below. Your workflows read with it on the laptop.`:`Sign in to a CLI, add a key, or start Ollama on the laptop, then pick it here.`})]}),(0,w.jsx)(`button`,{type:`button`,className:`ai__rescan`,onClick:()=>void r.reload(),"aria-label":`Scan the laptop again`,disabled:r.loading,children:(0,w.jsx)(i,{})})]}),M.envOverride&&(0,w.jsxs)(`p`,{className:`ai__note`,role:`status`,children:[M.envOverride.name,`=`,M.envOverride.value,` is set in the laptop's environment, so the pick is read-only here.`]}),(0,w.jsxs)(`section`,{className:`ai__section`,"aria-labelledby":`ai-found`,children:[(0,w.jsx)(`h3`,{id:`ai-found`,className:`ai__section-h`,children:`On this laptop`}),(0,w.jsx)(`ul`,{className:`ai__list`,children:M.backends.map(e=>(0,w.jsx)(`li`,{children:(0,w.jsxs)(`button`,{type:`button`,className:`ai__item${e.active?` is-active`:``}${e.ready?``:` is-dim`}`,onClick:()=>c(e.id),"data-testid":`ai-backend-${e.id}`,children:[(0,w.jsx)(E,{brand:e.brand,size:32}),(0,w.jsxs)(`span`,{className:`ai__item-text`,children:[(0,w.jsxs)(`span`,{className:`ai__item-title`,children:[e.label,e.active&&(0,w.jsxs)(`span`,{className:`ai__chip ai__chip--on`,children:[(0,w.jsx)(h,{}),` in use`]}),!e.active&&e.ready&&(0,w.jsx)(`span`,{className:`ai__chip`,children:`ready`}),!e.ready&&e.needs&&(0,w.jsx)(`span`,{className:`ai__chip ai__chip--off`,children:O[e.needs]})]}),(0,w.jsx)(`span`,{className:`ai__item-detail`,children:e.detail}),e.tiers.length>0&&(0,w.jsx)(`span`,{className:`ai__item-tiers`,children:e.tiers.map(e=>b[e].title).join(` Β· `)})]}),(0,w.jsx)(d,{className:`ai__item-chevron`})]})},e.id))})]}),(0,w.jsxs)(`section`,{className:`ai__section`,"aria-labelledby":`ai-tiers`,children:[(0,w.jsxs)(`div`,{className:`ai__section-head`,children:[(0,w.jsx)(`h3`,{id:`ai-tiers`,className:`ai__section-h`,children:`Workflow tiers`}),(0,w.jsx)(p,{size:`sm`,variant:`ghost`,onClick:()=>u(!0),disabled:!N.length,"data-testid":`ai-tiers-edit`,children:`Change`})]}),(0,w.jsx)(`ul`,{className:`ai__tiers`,children:D.map(e=>{let t=M.tiers[e],n=t?M.backends.find(e=>e.id===t.id):void 0;return(0,w.jsxs)(`li`,{className:`ai__tier`,"data-testid":`ai-tier-${e}`,children:[(0,w.jsx)(`span`,{className:`ai__tier-name`,children:b[e].title}),(0,w.jsx)(`span`,{className:`ai__tier-value`,children:n?`${n.label}${t?.model?` Β· ${t.model}`:``}`:M.active?`${M.active.label} (default)`:`Rules only until a backend is picked`})]},e)})}),(0,w.jsx)(`p`,{className:`ai__fine`,children:`A workflow asks for a tier. Unmapped tiers use the backend in use.`})]}),(0,w.jsx)(`p`,{className:`ai__fine ai__fine--rule`,children:`Keys and prompts stay on the laptop. The app only relays what you tap here; Dots never runs your workflows on its own AI.`}),P&&(0,w.jsx)(A,{backend:P,scan:M,busy:f,onClose:()=>c(null),apply:async(e,t)=>{await k(e,t)&&c(null)}}),l&&(0,w.jsx)(j,{scan:M,busy:f,onClose:()=>u(!1),apply:k})]})}function A({backend:t,scan:n,busy:i,onClose:s,apply:c}){let[l,d]=(0,C.useState)(t.model??``),[f,m]=(0,C.useState)(``),[h,g]=(0,C.useState)(t.baseURL??``),[_,v]=(0,C.useState)(t.extraBody??``),[y,b]=(0,C.useState)(!1),x=!!n.envOverride,S=t.kind!==`cli`&&t.id!==`anthropic`,T=t.id===`anthropic`?`anthropic`:t.id===`openai`?`openai`:t.id===`gemini`?`gemini`:void 0,E=t.models?.length?t.models.map(e=>({value:e,label:e})):void 0,D=async e=>{let n={};T&&f.trim()&&(n.keys={[T]:f.trim()}),t.id===`custom`?(n.custom={baseURL:h.trim(),model:l.trim(),extraBody:_.trim()||null},f.trim()&&(n.custom.apiKey=f.trim())):(t.id===`ollama`||t.id===`lmstudio`)&&h.trim()&&h.trim()!==t.baseURL&&(n.servers={[t.id]:h.trim()}),S&&l.trim()&&t.id!==`custom`&&(n.model={id:t.id,model:l.trim()}),e&&(n.active=l.trim()&&t.id!==`custom`?{id:t.id,model:l.trim()}:{id:t.id}),await c(n,e?`${t.label} is in use`:`Saved`)},O=!x&&(t.ready||t.kind===`key`&&(t.keySaved||f.trim())&&(!S||l.trim())||t.id===`custom`&&h.trim()&&l.trim()),k=null;return(t.needs===`install`||t.needs===`login`||t.needs===`server`)&&(k=(0,w.jsxs)(`p`,{className:`ai__sheet-help`,children:[t.id===`claude-cli`&&(t.needs===`install`?`On the laptop: install Claude Code, then run claude and sign in with your subscription.`:`On the laptop, run claude and sign in. Then scan again.`),t.id===`codex-cli`&&(t.needs===`install`?`On the laptop: install the Codex CLI, then run codex login with your ChatGPT account.`:`On the laptop, run codex login. Then scan again.`),t.id===`ollama`&&`On the laptop: install Ollama, run ollama pull with a model (for example llama3.2), and it shows up here.`,t.id===`lmstudio`&&`On the laptop: open LM Studio, load a model and start its local server. Then scan again.`]})),(0,w.jsx)(u,{open:!0,onClose:s,title:t.label,description:t.detail,footer:(0,w.jsxs)(`div`,{className:`ai__sheet-actions`,children:[(T||t.id===`custom`||S)&&(0,w.jsx)(p,{variant:`secondary`,onClick:()=>void D(!1),disabled:i,children:`Save`}),(0,w.jsx)(p,{variant:`primary`,onClick:()=>void D(!0),loading:i,disabled:!O,"data-testid":`ai-use`,children:t.active?`In use`:`Use this`})]}),children:(0,w.jsxs)(`div`,{className:`ai__sheet`,children:[k,T&&(0,w.jsx)(a,{label:t.keySaved?`Replace the saved key`:`API key`,hint:`Saved encrypted on the laptop. Never sent to Dots.`,children:(0,w.jsxs)(`div`,{className:`ai__key-row`,children:[(0,w.jsx)(o,{type:y?`text`:`password`,autoComplete:`off`,spellCheck:!1,value:f,onChange:e=>m(e.target.value),placeholder:t.keySaved?`Leave empty to keep it`:t.id===`anthropic`?`sk-ant-β¦`:t.id===`openai`?`sk-β¦`:`AIzaβ¦`,"data-testid":`ai-key`}),(0,w.jsx)(p,{size:`sm`,variant:`ghost`,onClick:()=>b(e=>!e),children:y?`Hide`:`Show`})]})}),(t.id===`ollama`||t.id===`lmstudio`)&&(0,w.jsx)(a,{label:`Address`,hint:`Change it only when the server listens somewhere else.`,children:(0,w.jsx)(o,{inputMode:`url`,value:h,onChange:e=>g(e.target.value)})}),t.id===`custom`&&(0,w.jsxs)(w.Fragment,{children:[(0,w.jsx)(a,{label:`Base URL`,hint:`Up to and including /v1, for example https://openrouter.ai/api/v1 or http://127.0.0.1:8000/v1.`,required:!0,children:(0,w.jsx)(o,{inputMode:`url`,value:h,onChange:e=>g(e.target.value),placeholder:`https://β¦/v1`,"data-testid":`ai-custom-url`})}),(0,w.jsx)(a,{label:`API key`,hint:t.keySaved?`One is saved. Leave empty to keep it.`:`Only if the server wants one.`,children:(0,w.jsx)(o,{type:y?`text`:`password`,autoComplete:`off`,spellCheck:!1,value:f,onChange:e=>m(e.target.value),"data-testid":`ai-key`})})]}),S&&(0,w.jsx)(a,{label:`Model`,hint:E?`${E.length} on the server`:`The model name the server expects.`,required:!0,children:E?(0,w.jsx)(e,{value:l,onChange:e=>d(e.target.value),options:[{value:``,label:`Pick a model`},...E],"data-testid":`ai-model`}):(0,w.jsx)(o,{value:l,onChange:e=>d(e.target.value),placeholder:t.id===`openai`?`gpt-5`:t.id===`gemini`?`gemini-3-flash`:`model name`,"data-testid":`ai-model`})}),t.id===`custom`&&(0,w.jsx)(a,{label:`Extra body (JSON, optional)`,hint:`Merged into every request, for example {"temperature": 0.2}.`,children:(0,w.jsx)(r,{rows:2,value:_,onChange:e=>v(e.target.value),spellCheck:!1})}),t.kind===`cli`&&t.ready&&(0,w.jsx)(`p`,{className:`ai__sheet-help`,children:`Uses the subscription signed in on the laptop. No key to add.`})]})})}function j({scan:t,busy:n,onClose:r,apply:i}){let o=t.backends.filter(e=>e.ready),[s,c]=(0,C.useState)({cheap:t.tiers.cheap?.id??``,strong:t.tiers.strong?.id??``,local:t.tiers.local?.id??``}),l=[{value:``,label:t.active?`Default (${t.active.label})`:`Default`},...o.map(e=>({value:e.id,label:`${e.label}${e.model?` Β· ${e.model}`:``}`}))],d=async()=>{let e={};for(let t of D)e[t]=s[t]?{id:s[t]}:null;await i({tiers:e},`Tiers saved`)&&r()};return(0,w.jsx)(u,{open:!0,onClose:r,title:`Workflow tiers`,description:`Each workflow asks for a tier. Map the tiers to the backends this laptop has.`,footer:(0,w.jsx)(p,{variant:`primary`,onClick:()=>void d(),loading:n,"data-testid":`ai-tiers-save`,children:`Save`}),children:(0,w.jsx)(`div`,{className:`ai__sheet`,children:D.map(t=>(0,w.jsx)(a,{label:b[t].title,hint:b[t].text,children:(0,w.jsx)(e,{value:s[t],onChange:e=>c(n=>({...n,[t]:e.target.value})),options:l,"data-testid":`ai-tier-pick-${t}`})},t))})})}export{k as default};
|
|
2
|
+
//# sourceMappingURL=TinyBeeAi-CkyOzhm5.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{G as e,Vn as t,Wn as n,mn as r}from"./ui-DcmhYyYp.js";import{o as i}from"./data-CmXvx3Mj.js";import{s as a}from"./index-B6qKm1NW.js";var o=n(t(),1),s=r();function c({fix:t}){let n=i(),{status:r}=a(),c=n.data?.tinybee?.connections??[],l=n.data?.tinybee?.budget,u=(0,o.useRef)(null);return(0,o.useEffect)(()=>{u.current?.scrollIntoView({block:`center`}),u.current?.focus()},[t]),(0,s.jsxs)(`div`,{className:`page connections`,children:[l&&(0,s.jsxs)(`section`,{className:`home__card${l.state===`exhausted`&&!l.ownKey?` home__card--warn`:``}`,"data-testid":`connections-budget`,children:[(0,s.jsxs)(`p`,{children:[(0,s.jsx)(`strong`,{children:`AI budget`}),` Β· `,l.ownKey?`using your own key`:`${Math.round(l.used*100)}% of this month used`,l.resetsAt&&!l.ownKey?` Β· resets ${new Date(l.resetsAt).toLocaleDateString()}`:``]}),!l.ownKey&&(0,s.jsxs)(`div`,{className:`home__status-actions`,children:[(0,s.jsx)(`a`,{className:`btn btn--sm btn--secondary`,href:`#/plan?pick=topup`,children:`Top up`}),(0,s.jsx)(`a`,{className:`btn btn--sm btn--primary`,href:`#/ai`,children:`Use my laptop's AI`})]})]}),c.length===0?(0,s.jsx)(e,{kind:`first-run`,title:`No connections yet`,body:r.canAct?`Connect Gmail, Slack or GitHub on the laptop and they show up here.`:`Connections appear once your Bee is reachable.`,action:(0,s.jsx)(`a`,{className:`btn btn--primary`,href:`#/setup`,children:`Open setup`})}):(0,s.jsx)(`ul`,{className:`connections__list`,children:c.map(e=>{let n=e.state!==`ok`;return(0,s.jsxs)(`li`,{ref:e.id===t?u:void 0,tabIndex:e.id===t?-1:void 0,className:`connections__item${n?` is-bad`:``}${e.id===t?` is-fix`:``}`,"data-testid":`connection-${e.id}`,children:[(0,s.jsxs)(`div`,{className:`connections__text`,children:[(0,s.jsx)(`strong`,{children:e.label}),(0,s.jsx)(`span`,{className:`connections__state`,children:e.state===`ok`?`Connected`:e.state===`reauth`?`${e.label} needs you to sign in again`:e.reason??`Not working`})]}),n&&(0,s.jsx)(`a`,{className:`btn btn--sm btn--primary`,href:`#/setup?provider=${encodeURIComponent(e.provider)}`,children:`Reconnect`})]},e.id)})})]})}export{c as default};
|
|
2
|
+
//# sourceMappingURL=TinyBeeConnections-B2K_P38u.js.map
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/hivePush-DZJDokj7.js","assets/index-B6qKm1NW.js","assets/ui-DcmhYyYp.js","assets/storage-yvL36AWt.js","assets/ui-DxEDgbIx.css","assets/router-W6nZsQ33.js","assets/store-IqrqHuFR.js","assets/data-CmXvx3Mj.js","assets/format-BBZ8vFyT.js","assets/index-BvKyT1X7.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{G as e,H as t,R as n,Tn as r,Vn as i,Wn as a,mn as o,pn as s,q as c}from"./ui-DcmhYyYp.js";import{r as l}from"./router-W6nZsQ33.js";import{i as u}from"./store-IqrqHuFR.js";import{a as d,s as f}from"./data-CmXvx3Mj.js";import{Ut as p,hn as m,p as h,s as g}from"./index-B6qKm1NW.js";import{t as _}from"./ApprovalCard-CfGhGFo_.js";import{t as v}from"./RunActions-ZY7yf1AF.js";import{t as y}from"./RunRow-BKEJv8ib.js";/* empty css */import{r as b,t as x}from"./modelsApi-PUSySRQw.js";var S=a(i(),1),C=o(),w=5;function T(e){try{sessionStorage.setItem(v,JSON.stringify({text:e}))}catch{}l({name:`chat`})}function E(){let i=g(),a=f(),o=d(),c=u(`home:recent`,e=>r.feed({limit:w},e),{refreshOn:[`run`],throttleMs:1e3}),l=(a.data??[]).filter(e=>p(e)===`pending`),m=e=>o.data?.find(t=>t.id===e)?.name,{status:h,notices:v}=i,S=v.filter(e=>e.kind===`connection`),E=v.find(e=>e.kind===`updateFailed`||e.kind===`updateAvailable`),k=u(h.canAct?x:null,e=>b.scan(e)),A=h.canAct&&k.data!==void 0&&!k.data.active;return(0,C.jsxs)(`div`,{className:`page home`,children:[(0,C.jsx)(D,{tb:i}),A&&(0,C.jsxs)(`section`,{className:`home__card home__card--nudge`,"data-testid":`home-ai-nudge`,children:[(0,C.jsx)(`p`,{className:`home__card-title`,children:`No AI on the laptop yet`}),(0,C.jsx)(`p`,{className:`home__card-text`,children:`Workflows need one. The Bee looked for Claude Code, Codex, Ollama, LM Studio and API keys on the laptop; pick what to use.`}),(0,C.jsx)(`a`,{className:`btn btn--sm btn--primary`,href:`#/ai`,children:`Pick an AI backend`})]}),S.map(e=>(0,C.jsxs)(`section`,{className:`home__card home__card--warn`,role:`alert`,"data-testid":`home-connection`,children:[(0,C.jsx)(`p`,{className:`home__card-text`,children:e.text}),e.action&&(0,C.jsx)(`a`,{className:`btn btn--sm btn--primary`,href:e.action.href,children:e.action.label})]},e.text)),E&&(0,C.jsxs)(`section`,{className:`home__card${E.tone===`error`?` home__card--bad`:``}`,"data-testid":`home-${E.kind}`,children:[(0,C.jsx)(`p`,{className:`home__card-text`,children:E.text}),E.action&&(0,C.jsx)(s,{size:`sm`,variant:E.tone===`error`?`primary`:`secondary`,onClick:()=>void 0,children:E.action.label})]}),(0,C.jsxs)(`section`,{className:`home__section`,"aria-labelledby":`home-needs`,children:[(0,C.jsxs)(`h2`,{id:`home-needs`,className:`home__h`,children:[`Needs you`,l.length?` Β· ${l.length}`:``]}),a.error&&!a.data?(0,C.jsx)(t,{error:a.error,onRetry:a.reload,compact:!0}):a.data?l.length===0?(0,C.jsx)(`p`,{className:`home__quiet`,children:`Nothing waiting for you.`}):(0,C.jsxs)(`div`,{className:`home__needs`,children:[l.slice(0,3).map(e=>(0,C.jsx)(_,{approval:e,dotName:m(e.watchId),variant:`inline`,stale:h.kind===`phoneOffline`},e.id)),l.length>3&&(0,C.jsxs)(`a`,{href:`#/inbox`,children:[`See all `,l.length,` in the Inbox`]})]}):(0,C.jsx)(n,{rows:1})]}),(0,C.jsxs)(`section`,{className:`home__section`,"aria-labelledby":`home-digest`,children:[(0,C.jsx)(`h2`,{id:`home-digest`,className:`home__h`,children:`Today`}),(0,C.jsx)(O,{runs:c.data})]}),(0,C.jsxs)(`section`,{className:`home__section`,"aria-labelledby":`home-actions`,children:[(0,C.jsx)(`h2`,{id:`home-actions`,className:`home__h`,children:`Quick actions`}),(0,C.jsxs)(`div`,{className:`home__chips`,role:`group`,"aria-label":`Quick actions`,children:[(0,C.jsx)(`button`,{type:`button`,className:`chip`,onClick:()=>T(`Summarize today`),children:`Summarize today`}),(0,C.jsx)(`button`,{type:`button`,className:`chip`,onClick:()=>T(`What is waiting for me?`),children:`What is waiting?`}),(0,C.jsx)(`a`,{className:`chip`,href:`#/workflows`,children:`Run a workflow`}),(0,C.jsx)(`a`,{className:`chip`,href:`#/connections`,children:`Add a connection`})]})]}),(0,C.jsxs)(`section`,{className:`home__section`,"aria-labelledby":`home-recent`,children:[(0,C.jsx)(`h2`,{id:`home-recent`,className:`home__h`,children:`Recent activity`}),c.error&&!c.data?(0,C.jsx)(t,{error:c.error,onRetry:c.reload,compact:!0}):c.data?c.data.length===0?(0,C.jsx)(e,{kind:`zero`,title:`Your Bee is ready and bored`,body:`Ask it something in Chat, or set up a workflow so it has a job.`,compact:!0}):(0,C.jsxs)(C.Fragment,{children:[(0,C.jsx)(`ul`,{className:`runs`,children:c.data.slice(0,w).map(e=>(0,C.jsx)(y,{run:e,showDot:!0},e.id))}),(0,C.jsx)(`a`,{className:`home__more`,href:`#/feed`,children:`All activity`})]}):(0,C.jsx)(n,{rows:3})]})]})}function D({tb:e}){let{status:t,bee:r,loading:i,reload:a}=e,o=c(),[l,u]=(0,S.useState)(null);if(i)return(0,C.jsx)(n,{rows:2});let d=async()=>{u(`retry`);try{await a()}finally{u(null)}},f=async()=>{u(`notify`);try{let{enableHivePush:e}=await m(async()=>{let{enableHivePush:e}=await import(`./hivePush-DZJDokj7.js`);return{enableHivePush:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9])),t=await e();o.show({title:t===`subscribed`?`You will get a notice when it is back`:t===`denied`?`Notifications are blocked for this site`:`Notifications are not available here`})}catch(e){o.show({title:`Could not turn on notifications`,body:e instanceof Error?e.message:void 0,tone:`error`})}finally{u(null)}},p=t.kind===`online`&&r,g=t.kind===`offline`||t.kind===`local`||t.kind===`unpaired`;return(0,C.jsxs)(`section`,{className:`home__status home__status--${t.kind}`,"aria-live":`polite`,"data-testid":`home-status`,"data-kind":t.kind,children:[(0,C.jsxs)(`div`,{className:`home__status-head`,children:[(0,C.jsx)(`span`,{className:`home__status-dot`,"aria-hidden":`true`}),(0,C.jsx)(`h2`,{className:`home__status-label`,children:t.label}),p&&r.lastSeenAt&&(0,C.jsxs)(`span`,{className:`home__status-seen num`,children:[`seen `,h(r.lastSeenAt)]})]}),(0,C.jsx)(`p`,{className:`home__status-text`,children:p?(0,C.jsxs)(C.Fragment,{children:[(0,C.jsx)(`strong`,{children:r.name}),r.hostname?(0,C.jsxs)(`span`,{className:`home__status-host`,children:[` Β· `,r.hostname]}):null]}):t.text}),t.kind===`provisioning`&&r&&!r.hostname&&(0,C.jsx)(`p`,{className:`home__status-meta`,children:`Remote address being set up.`}),g&&(0,C.jsxs)(`div`,{className:`home__status-actions`,children:[t.kind===`offline`&&(0,C.jsxs)(C.Fragment,{children:[(0,C.jsx)(`a`,{className:`btn btn--sm btn--secondary`,href:`#/docs`,children:`Troubleshoot`}),(0,C.jsx)(s,{size:`sm`,variant:`primary`,onClick:f,loading:l===`notify`,children:`Notify me when back`})]}),t.kind===`local`&&(0,C.jsxs)(C.Fragment,{children:[(0,C.jsx)(`a`,{className:`btn btn--sm btn--secondary`,href:`#/plan`,children:`Upgrade`}),(0,C.jsx)(s,{size:`sm`,variant:`primary`,onClick:d,loading:l===`retry`,children:`Retry`})]}),t.kind===`unpaired`&&(0,C.jsx)(`a`,{className:`btn btn--sm btn--primary`,href:`#/add-laptop`,children:`Set up a laptop`})]})]})}function O({runs:e}){if(!e)return(0,C.jsx)(n,{rows:1});let t=new Date().toDateString(),r=e.filter(e=>new Date(e.createdAt).toDateString()===t);if(r.length===0)return(0,C.jsx)(`p`,{className:`home__quiet`,children:`Nothing ran yet today.`});let i=r.filter(e=>e.status===`done`).length,a=r.filter(e=>e.status===`failed`).length;return(0,C.jsxs)(`p`,{className:`home__digest num`,children:[r.length,` `,r.length===1?`run`:`runs`,` today`,i?` Β· ${i} done`:``,a?` Β· ${a} failed`:``]})}export{T as askBee,E as default};
|
|
3
|
+
//# sourceMappingURL=TinyBeeHome-DSpxX5KS.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{H as e,R as t,Vn as n,Wn as r,Y as i,mn as a,pn as o,q as s}from"./ui-DcmhYyYp.js";import{r as c}from"./router-W6nZsQ33.js";import{i as l}from"./store-IqrqHuFR.js";import{l as u,o as d,u as f}from"./index-B6qKm1NW.js";var p=r(n(),1),m=a(),h=`hive:billing`,g=e=>e>=1e6?`${(e/1e6).toFixed(e%1e6?1:0)}M`:e>=1e3?`${Math.round(e/1e3)}k`:String(e),_=e=>`${e.toLocaleString(`vi-VN`)} β«`,v=e=>new Date(e).toLocaleDateString(void 0,{day:`numeric`,month:`short`});function y(e){return e.status===`suspended`?e.suspendedReason===`unpaid`?`Payment due Β· remote access paused`:`Trial ended Β· remote access paused`:e.plan.id===`trial`?e.daysLeft===1?`1 day left`:`${e.daysLeft} days left`:`Renews ${v(e.periodEndsAt)}`}function b({pick:n}){let r=l(h,e=>f.billing(e)),a=l(`hive:invoices`,e=>f.invoices(e).then(e=>e.invoices)),b=d(),x=s(),[S,C]=(0,p.useState)(n??null),[w,T]=(0,p.useState)(null),[E,D]=(0,p.useState)(n);n!==E&&(D(n),n&&C(n));function O(){C(null),n&&c({name:`plan`},{replace:!0})}async function k(e){let t=r.data;if(t){T(e);try{let n=await f.checkout(e===`topup`?{kind:`topup`}:{kind:`plan`,plan:e});if(n.payUrl){window.location.assign(n.payUrl);return}n.invoice.provider===`mock`&&await f.mockComplete(n.invoice.id),await Promise.all([r.reload(),a.reload(),b.reload()]),x.show({tone:`success`,title:e===`topup`?`Added ${g(t.topup.tokens)} tokens.`:`You are on ${e===`pro`?`Pro`:`Standard`}. Remote access is back.`}),O()}catch(e){x.show({tone:`error`,title:e instanceof u?e.message:`Payment did not go through.`})}finally{T(null)}}}if(r.error&&!r.data)return(0,m.jsx)(e,{error:r.error,onRetry:()=>void r.reload()});if(!r.data)return(0,m.jsx)(t,{rows:5,label:`Loading your plan`});let A=r.data,j=A.status===`suspended`,M=Math.round(A.budget.used*100),N=A.providers.includes(`mock`),P=A.providers.length>0;return(0,m.jsxs)(`div`,{className:`page plan`,children:[(0,m.jsxs)(`section`,{className:`home__card plan__card${j?` home__card--warn`:``}`,"data-testid":`plan-card`,"data-status":A.status,"data-plan":A.plan.id,children:[(0,m.jsxs)(`p`,{className:`plan__name`,children:[(0,m.jsx)(`strong`,{children:A.plan.name}),` Β· `,y(A)]}),(0,m.jsx)(`p`,{className:`home__status-meta`,children:A.plan.blurb}),(0,m.jsxs)(`div`,{className:`home__status-actions`,children:[(A.plan.id!==`pro`||j)&&(0,m.jsx)(o,{size:`sm`,variant:`primary`,onClick:()=>C(A.plan.id===`standard`&&!j?`pro`:`standard`),"data-testid":`plan-upgrade`,children:j?`Upgrade to continue`:A.plan.id===`trial`?`Upgrade`:`Go Pro`}),!j&&(0,m.jsx)(o,{size:`sm`,variant:`secondary`,onClick:()=>C(`topup`),"data-testid":`plan-topup`,children:`Top up`})]})]}),(0,m.jsxs)(`section`,{className:`home__card`,"data-testid":`plan-usage`,children:[(0,m.jsxs)(`p`,{children:[(0,m.jsx)(`strong`,{children:`Bundled AI`}),` Β· `,g(A.budget.usedTokens),` of `,g(A.budget.capTokens),` tokens Β· resets `,v(A.budget.resetsAt)]}),(0,m.jsx)(`div`,{className:`plan__meter`,role:`progressbar`,"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":M,"aria-label":`Bundled AI used`,children:(0,m.jsx)(`span`,{className:`plan__meter-fill plan__meter-fill--${A.budget.state}`,style:{width:`${M}%`}})}),A.budget.state===`exhausted`&&(0,m.jsx)(`p`,{className:`plan__warn`,children:`Used up for this month Β· workflows that need the model wait for a top-up or your own key.`}),A.topupTokens>0&&(0,m.jsxs)(`p`,{className:`home__status-meta`,children:[`Includes `,g(A.topupTokens),` top-up tokens.`]}),A.breakdown.length>0&&(0,m.jsx)(`ul`,{className:`plan__breakdown`,children:A.breakdown.map(e=>(0,m.jsxs)(`li`,{children:[(0,m.jsx)(`span`,{children:e.source}),(0,m.jsxs)(`span`,{className:`num`,children:[g(e.inputTokens+e.outputTokens),` Β· `,e.calls,` `,e.calls===1?`call`:`calls`]})]},e.source))}),(0,m.jsxs)(`p`,{className:`home__status-meta`,children:[`This covers the app's own features. Workflows on your laptop use `,(0,m.jsx)(`a`,{href:`#/ai`,children:`the AI you picked there`}),` and never wait for it.`]})]}),(0,m.jsx)(`p`,{className:`plan__rule`,"data-testid":`plan-rule`,children:A.rule}),(0,m.jsxs)(`section`,{className:`home__card`,"data-testid":`plan-invoices`,children:[(0,m.jsx)(`p`,{children:(0,m.jsx)(`strong`,{children:`Payments`})}),!a.data||a.data.length===0?(0,m.jsx)(`p`,{className:`home__status-meta`,children:a.data?`No payments yet.`:`Loadingβ¦`}):(0,m.jsx)(`ul`,{className:`plan__invoices`,children:a.data.map(e=>(0,m.jsxs)(`li`,{"data-status":e.status,children:[(0,m.jsxs)(`span`,{children:[e.kind===`topup`?`Top-up ${g(e.tokens??0)}`:`${e.plan===`pro`?`Pro`:`Standard`} Β· 1 month`,` Β· `,v(e.createdAt)]}),(0,m.jsxs)(`span`,{className:`num`,children:[_(e.amount),` Β· `,e.status]})]},e.id))})]}),(0,m.jsxs)(i,{open:S!==null,onClose:O,title:S===`topup`?`Top up`:`Choose a plan`,description:S===`topup`?`${g(A.topup.tokens)} bundled tokens, used before the month's bundle resets.`:A.rule,children:[S===`topup`?(0,m.jsx)(`div`,{className:`plan__choices`,children:(0,m.jsxs)(`div`,{className:`plan__choice is-picked`,"data-testid":`plan-choice-topup`,children:[(0,m.jsxs)(`p`,{children:[(0,m.jsxs)(`strong`,{children:[g(A.topup.tokens),` tokens`]}),` Β· `,_(A.topup.priceVnd),` (~US$`,A.topup.priceUsd,`)`]}),(0,m.jsx)(o,{variant:`primary`,block:!0,loading:w===`topup`,disabled:!P,onClick:()=>void k(`topup`),"data-testid":`plan-pay-topup`,children:N?`Pay (test mode)`:`Pay`})]})}):(0,m.jsx)(`div`,{className:`plan__choices`,children:A.plans.map(e=>(0,m.jsxs)(`div`,{className:`plan__choice${S===e.id?` is-picked`:``}`,"data-testid":`plan-choice-${e.id}`,children:[(0,m.jsxs)(`p`,{children:[(0,m.jsx)(`strong`,{children:e.name}),` Β· `,_(e.priceVnd),`/month (~US$`,e.priceUsd,`)`]}),(0,m.jsxs)(`p`,{className:`home__status-meta`,children:[e.workflows===null?`Unlimited workflows`:`${e.workflows} workflows`,` Β· `,g(e.tokens),` tokens a month`]}),(0,m.jsx)(o,{variant:S===e.id?`primary`:`secondary`,block:!0,loading:w===e.id,disabled:!P||A.plan.id===e.id&&!j,onClick:()=>void k(e.id),"data-testid":`plan-pay-${e.id}`,children:A.plan.id===e.id&&!j?`Current plan`:N?`Pay ${_(e.priceVnd)} (test mode)`:`Pay ${_(e.priceVnd)}`})]},e.id))}),!P&&(0,m.jsx)(`p`,{className:`plan__warn`,children:`Payments are not set up on this TinyBee yet.`})]})]})}export{h as BILLING_KEY,b as default,g as fmtTokens,_ as fmtVnd,y as planLine};
|
|
2
|
+
//# sourceMappingURL=TinyBeePlan-BamiLziu.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{H as e,N as t,P as n,R as r,Vn as i,Wn as a,mn as o,pn as s,q as c}from"./ui-DcmhYyYp.js";import{d as l,f as u,l as d,u as f}from"./index-B6qKm1NW.js";var p=a(i(),1),m=`https://accounts.google.com/gsi/client`,h;function g(){let e=window.google?.accounts?.id;return e?Promise.resolve(e):(h??=new Promise((e,t)=>{let n=document.createElement(`script`);n.src=m,n.async=!0,n.onload=()=>{let n=window.google?.accounts?.id;n?e(n):t(Error(`Google sign-in did not load.`))},n.onerror=()=>{h=void 0,t(Error(`Google sign-in could not be loaded.`))},document.head.appendChild(n)}),h)}var _=o(),v=[{key:`signin`,label:`Sign in`},{key:`install`,label:`Install`}],y={email:`signin`,code:`signin`,install:`install`},b=`npx tinybeeai install`,x=`Letters, numbers and hyphens, 3 to 20 characters.`;function S(e){return e instanceof Error?e.message:String(e)}function C({current:e}){let t=y[e],n=v.findIndex(e=>e.key===t);return(0,_.jsx)(`ol`,{className:`signup__steps`,"aria-label":`Sign-up steps`,children:v.map((e,r)=>(0,_.jsxs)(`li`,{"aria-current":e.key===t?`step`:void 0,className:r<n?`is-done`:void 0,children:[r+1,`. `,e.label]},e.key))})}function w({clientId:e,onSignedIn:t}){let n=(0,p.useRef)(null),[r,i]=(0,p.useState)(null),[a,o]=(0,p.useState)(!1),s=(0,p.useRef)(t);return(0,p.useEffect)(()=>{s.current=t},[t]),(0,p.useEffect)(()=>{let t=!0;return g().then(r=>{t&&n.current&&(r.initialize({client_id:e,ux_mode:`popup`,itp_support:!0,auto_select:!1,callback:e=>{o(!0),i(null),f.google(e.credential).then(e=>s.current(e)).catch(e=>i(S(e))).finally(()=>o(!1))}}),r.renderButton(n.current,{theme:`outline`,size:`large`,text:`continue_with`,shape:`pill`,width:n.current.clientWidth||320}))}).catch(e=>{t&&i(e instanceof Error?e.message:`Google sign-in could not be loaded.`)}),()=>{t=!1}},[e]),(0,_.jsxs)(`div`,{className:`signup__google`,"data-testid":`signup-google`,"aria-busy":a,children:[(0,_.jsx)(`div`,{ref:n,className:`signup__google-host`}),r&&(0,_.jsx)(`p`,{className:`field__error`,role:`alert`,children:r}),(0,_.jsx)(`p`,{className:`signup__or`,"aria-hidden":`true`,children:(0,_.jsx)(`span`,{children:`or`})})]})}function T({onSent:e,google:r,onSignedIn:i}){let[a,o]=(0,p.useState)(``),[c,l]=(0,p.useState)(!1),[u,d]=(0,p.useState)(null),m=async t=>{t.preventDefault();let n=a.trim();if(!n){d(`Type your email address.`);return}l(!0),d(null);try{let t=await f.otpStart(n);e(t.email,t.devCode)}catch(e){d(S(e))}finally{l(!1)}};return(0,_.jsxs)(`form`,{className:`signup__form`,onSubmit:e=>void m(e),noValidate:!0,children:[r&&(0,_.jsx)(w,{clientId:r,onSignedIn:i}),(0,_.jsx)(`p`,{className:`signup__muted`,children:`We send a 6-digit code to your email. No password to remember.`}),(0,_.jsx)(t,{label:`Email`,error:u,required:!0,children:(0,_.jsx)(n,{type:`email`,value:a,onChange:e=>o(e.target.value),autoComplete:`email`,inputMode:`email`,autoCapitalize:`none`,autoCorrect:`off`,spellCheck:!1,placeholder:`you@company.com`,"data-testid":`signup-email`})}),(0,_.jsx)(s,{type:`submit`,variant:`primary`,size:`lg`,block:!0,loading:c,children:`Send code`}),(0,_.jsxs)(`p`,{className:`signup__muted signup__alt`,children:[`Joining a team's dots with an invite code? `,(0,_.jsx)(`a`,{href:`#/join`,children:`Use the code`})]})]})}function E({email:e,devCode:r,onSignedIn:i,onBack:a}){let o=c(),[l,u]=(0,p.useState)(``),[d,m]=(0,p.useState)(!1),[h,g]=(0,p.useState)(!1),[v,y]=(0,p.useState)(r),[b,x]=(0,p.useState)(null),C=async t=>{t.preventDefault();let n=l.replace(/\D/g,``);if(n.length!==6){x(`Type the 6 digits from the email.`);return}m(!0),x(null);try{i(await f.otpVerify(e,n))}catch(e){x(S(e)),u(``)}finally{m(!1)}},w=async()=>{g(!0),x(null);try{let t=await f.otpStart(e);y(t.devCode),u(``),o.show({title:`New code sent`,body:`Check ${e}.`})}catch(e){x(S(e))}finally{g(!1)}};return(0,_.jsxs)(`form`,{className:`signup__form`,onSubmit:e=>void C(e),noValidate:!0,children:[(0,_.jsxs)(`p`,{className:`signup__muted`,children:[`We sent a code to `,(0,_.jsx)(`strong`,{children:e}),`. It works for 10 minutes.`]}),(0,_.jsx)(t,{label:`6-digit code`,error:b,required:!0,children:(0,_.jsx)(n,{value:l,onChange:e=>u(e.target.value.replace(/\D/g,``).slice(0,6)),autoComplete:`one-time-code`,inputMode:`numeric`,pattern:`[0-9]*`,maxLength:6,className:`signup__code`,"data-testid":`signup-code`,autoFocus:!0})}),v&&(0,_.jsxs)(`p`,{className:`signup__dev`,"data-testid":`signup-dev-code`,children:[`Local server: your code is `,(0,_.jsx)(`code`,{children:v}),`.`]}),(0,_.jsx)(s,{type:`submit`,variant:`primary`,size:`lg`,block:!0,loading:d,children:`Continue`}),(0,_.jsxs)(`div`,{className:`signup__row`,children:[(0,_.jsx)(s,{variant:`ghost`,onClick:a,disabled:d,children:`Use another email`}),(0,_.jsx)(s,{variant:`ghost`,onClick:()=>void w(),loading:h,disabled:d,children:`Send a new code`})]})]})}function D({tenant:e,onRenamed:r,onClose:i}){let[a,o]=(0,p.useState)(e.slug),[c,l]=(0,p.useState)(null),[u,m]=(0,p.useState)(!1),[h,g]=(0,p.useState)(null),[v,y]=(0,p.useState)([]),b=(0,p.useRef)(void 0);(0,p.useEffect)(()=>{let t=a.trim();if(!t||t===e.slug)return;let n=new AbortController;return clearTimeout(b.current),b.current=setTimeout(()=>{f.availability(t,n.signal).then(e=>l({for:t,result:e})).catch(e=>{e instanceof DOMException&&e.name===`AbortError`||l({for:t,error:S(e)})})},300),()=>{clearTimeout(b.current),n.abort()}},[a,e.slug]);let C=a.trim().toLowerCase()===e.slug,w=c?.for===a.trim()?c:null,T=C||w?.result?.available===!0,E=async e=>{if(e.preventDefault(),C)return i();m(!0),g(null),y([]);try{r((await f.renameTenant(a.trim())).tenant),i()}catch(e){g(S(e)),e instanceof d&&Array.isArray(e.extra?.suggestions)&&y(e.extra.suggestions)}finally{m(!1)}},D=w?.error?w.error:w?.result?w.result.available?`Available`:w.result.message??`That address is taken.`:void 0,O=w?.result?.suggestions?.length?w.result.suggestions:v;return(0,_.jsxs)(`form`,{className:`signup__rename`,onSubmit:e=>void E(e),noValidate:!0,children:[(0,_.jsx)(t,{label:`Address`,hint:x,error:h,required:!0,children:(0,_.jsx)(n,{value:a,onChange:e=>o(e.target.value.toLowerCase()),autoComplete:`off`,autoCapitalize:`none`,autoCorrect:`off`,spellCheck:!1,maxLength:24,"data-testid":`signup-slug`})}),(0,_.jsx)(`p`,{className:`signup__check${D?T?` signup__check--ok`:` signup__check--no`:``}`,role:`status`,"data-testid":`signup-availability`,children:D??` `}),O.length>0&&(0,_.jsxs)(`div`,{className:`signup__suggest`,"data-testid":`signup-suggestions`,children:[(0,_.jsx)(`span`,{children:`Free:`}),O.map(e=>(0,_.jsx)(s,{size:`sm`,onClick:()=>o(e),children:e},e))]}),(0,_.jsxs)(`div`,{className:`signup__row`,children:[(0,_.jsx)(s,{type:`submit`,variant:`primary`,loading:u,disabled:!T,children:`Use this address`}),(0,_.jsx)(s,{variant:`ghost`,onClick:i,children:`Keep it`})]}),e.slugChosen&&(0,_.jsx)(`p`,{className:`signup__muted`,children:`This is the one change the address gets.`})]})}function O(e){let[t,n]=(0,p.useState)(()=>e?Math.max(0,Math.round((Date.parse(e)-Date.now())/1e3)):0);return(0,p.useEffect)(()=>{if(!e)return;let t=()=>n(Math.max(0,Math.round((Date.parse(e)-Date.now())/1e3)));t();let r=setInterval(t,1e3);return()=>clearInterval(r)},[e]),t}function k({tenant:e,installCode:t,onCode:n,onTenant:r,onSignOut:i}){let a=c(),[o,l]=(0,p.useState)(!1),[u,d]=(0,p.useState)(!1),[m,h]=(0,p.useState)(null),g=O(t?.expiresAt),v=!!t&&g<=0;(0,p.useEffect)(()=>{let e=!1,t,n=async()=>{try{let t=await f.pairPending();if(e)return;if(t.pending){location.hash=`#/add-laptop`;return}}catch{}e||(t=setTimeout(n,3e3))};return t=setTimeout(n,3e3),()=>{e=!0,clearTimeout(t)}},[]);let y=async()=>{l(!0),h(null);try{n((await f.refreshInstallCode()).installCode)}catch(e){h(S(e))}finally{l(!1)}},x=async()=>{if(t)try{await navigator.clipboard.writeText(t.code),a.show({title:`Code copied`})}catch{a.show({title:`Could not copy`,body:`Select the code and copy it by hand.`,tone:`error`})}},C=String(Math.floor(g/60)).padStart(1,`0`),w=String(g%60).padStart(2,`0`);return(0,_.jsxs)(`div`,{className:`signup__install`,children:[(0,_.jsxs)(`p`,{className:`signup__muted`,children:[`Your address:`,` `,(0,_.jsxs)(`span`,{className:`signup__address`,"data-testid":`signup-hostname`,children:[`https://`,(0,_.jsx)(`strong`,{children:e.hostname})]}),e.canRenameSlug&&!u&&(0,_.jsxs)(_.Fragment,{children:[` `,(0,_.jsx)(`button`,{type:`button`,className:`signup__link`,onClick:()=>d(!0),children:`Change it`})]})]}),u&&(0,_.jsx)(D,{tenant:e,onRenamed:r,onClose:()=>d(!1)}),(0,_.jsx)(`h2`,{className:`page__title`,"data-testid":`signup-install-title`,children:`Now install TinyBee on your laptop`}),(0,_.jsxs)(`ol`,{className:`signup__how`,children:[(0,_.jsxs)(`li`,{children:[`On your Mac, open Terminal and run `,(0,_.jsx)(`code`,{"data-testid":`signup-install-command`,children:b}),`.`]}),(0,_.jsx)(`li`,{children:`When it asks for the code, type the 6 characters below.`}),(0,_.jsxs)(`li`,{children:[`This page moves on by itself so you can confirm the laptop. Or scan the QR it shows: `,(0,_.jsx)(`a`,{href:`#/add-laptop`,children:`Add laptop`}),`.`]})]}),t?(0,_.jsxs)(_.Fragment,{children:[(0,_.jsx)(`div`,{className:`signup__install-code${v?` is-expired`:``}`,"aria-label":`Install code`,"data-testid":`signup-install-code`,children:t.code}),(0,_.jsx)(`p`,{className:`signup__timer${v?` is-expired`:``}`,role:`status`,"aria-live":`polite`,children:v?`This code has expired. Make a new one.`:`Works for ${C}:${w}`})]}):(0,_.jsx)(`p`,{className:`signup__timer`,role:`status`,children:`No live code. Make one to continue.`}),m&&(0,_.jsx)(`p`,{className:`field__error`,children:m}),(0,_.jsxs)(`div`,{className:`signup__row`,children:[(0,_.jsx)(s,{onClick:()=>void x(),disabled:!t||v,children:`Copy code`}),(0,_.jsx)(s,{variant:v||!t?`primary`:`secondary`,onClick:()=>void y(),loading:o,children:`New code`})]}),(0,_.jsx)(s,{variant:`ghost`,onClick:i,children:`Sign out of TinyBee`})]})}function A(){let[t,n]=(0,p.useState)({kind:`loading`}),[i,a]=(0,p.useState)(`email`),[o,s]=(0,p.useState)(``),[c,m]=(0,p.useState)(void 0),[h,g]=(0,p.useState)(null),[v,y]=(0,p.useState)(null),[b,x]=(0,p.useState)(0),[S,w]=(0,p.useState)(void 0);if((0,p.useEffect)(()=>{let e=new AbortController;return(async()=>{try{let t=await f.providers(e.signal);w(t.google?t.googleClientId:void 0);let r=u();if(!r){n({kind:`ok`,session:null,tenant:null,installCode:null}),a(`email`);return}let i=await f.me().catch(e=>{if(e instanceof d&&e.status===401)return null;throw e});if(!i){n({kind:`ok`,session:null,tenant:null,installCode:null}),a(`email`);return}if(!i.tenant){await f.signOut().catch(()=>void 0),n({kind:`ok`,session:null,tenant:null,installCode:null}),a(`email`);return}let o=await f.tenantMe();s(i.user.email),g(o.tenant),y(o.installCode),n({kind:`ok`,session:r,tenant:o.tenant,installCode:o.installCode}),a(`install`)}catch(e){if(e instanceof DOMException&&e.name===`AbortError`)return;n({kind:`error`,error:e})}})(),()=>e.abort()},[b]),(0,p.useEffect)(()=>l(()=>{!u()&&i!==`email`&&i!==`code`&&(g(null),y(null),a(`email`))}),[i]),t.kind===`loading`)return(0,_.jsx)(r,{rows:4,delayMs:300,label:`Loading TinyBee`});if(t.kind===`error`)return(0,_.jsx)(e,{title:`TinyBee is not available`,error:t.error,kind:t.error instanceof d&&t.error.code===`hive_off`?`blocked`:void 0,onRetry:()=>{n({kind:`loading`}),x(e=>e+1)}});let D=e=>{g(e.tenant),f.tenantMe().then(e=>{g(e.tenant),y(e.installCode)}).catch(()=>y(null)),a(`install`)},O=async()=>{await f.signOut(),g(null),y(null),a(`email`)};return(0,_.jsxs)(`div`,{className:`page signup qd-touch`,children:[(0,_.jsx)(`header`,{className:`page__header`,children:(0,_.jsxs)(`div`,{children:[(0,_.jsx)(`h1`,{className:`page__title`,children:i===`install`?`Almost there`:`Get TinyBee`}),(0,_.jsx)(`p`,{className:`page__subtitle`,children:i===`install`?`One step left on the laptop.`:`Sign in, then install the agent on your laptop.`})]})}),(0,_.jsx)(C,{current:i}),i===`email`&&(0,_.jsx)(T,{google:S,onSignedIn:e=>{s(e.user.email),D(e)},onSent:(e,t)=>{s(e),m(t),a(`code`)}}),i===`code`&&(0,_.jsx)(E,{email:o,devCode:c,onBack:()=>a(`email`),onSignedIn:D}),i===`install`&&h&&(0,_.jsx)(k,{tenant:h,installCode:v,onCode:y,onTenant:g,onSignOut:()=>void O()})]})}export{b as INSTALL_COMMAND,A as default};
|
|
2
|
+
//# sourceMappingURL=TinyBeeSignup-vHcz0Wen.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{H as e,R as t,Vn as n,Wn as r,Y as i,mn as a,pn as o}from"./ui-DcmhYyYp.js";import{r as s}from"./router-W6nZsQ33.js";import{i as c}from"./store-IqrqHuFR.js";import"./index-B6qKm1NW.js";import{i as l}from"./beeApi-BHW8Tx1s.js";var u=r(n(),1),d=a(),f={gmail:`Gmail`,drive:`Google Drive`,sheets:`Google Sheets`,web:`The web`};function p({skill:n}){let r=c(`tb:skills`,e=>l.skills(e).then(e=>e.groups)),[a,p]=(0,u.useState)(null),m=a??(n&&r.data?r.data.flatMap(e=>e.skills).find(e=>e.key===n)??null:null);function h(){p(null),n&&s({name:`skills`},{replace:!0})}return r.error&&!r.data?(0,d.jsx)(e,{error:r.error,onRetry:()=>void r.reload()}):r.data?(0,d.jsxs)(`div`,{className:`page skills`,children:[r.data.map(e=>(0,d.jsxs)(`section`,{className:`skills__group`,children:[(0,d.jsx)(`h2`,{className:`skills__h`,children:e.name}),(0,d.jsx)(`div`,{className:`skills__grid`,children:e.skills.map(e=>(0,d.jsxs)(`button`,{type:`button`,className:`skills__card`,onClick:()=>p(e),"data-testid":`skill-card`,"data-skill":e.key,children:[(0,d.jsx)(`span`,{className:`skills__emoji`,"aria-hidden":`true`,children:e.emoji}),(0,d.jsx)(`span`,{className:`skills__title`,children:e.title}),(0,d.jsx)(`span`,{className:`skills__summary`,children:e.summary})]},e.key))})]},e.name)),(0,d.jsx)(i,{open:!!m,onClose:h,title:m?`${m.emoji} ${m.title}`:`Skill`,description:m?.summary,footer:m&&(0,d.jsx)(o,{variant:`primary`,onClick:()=>s({name:`workflowNew`,skill:m.key}),"data-testid":`skill-use`,children:`Use this skill`}),children:m&&(0,d.jsxs)(`div`,{className:`skills__detail`,children:[(0,d.jsx)(`ul`,{className:`skills__bullets`,children:m.bullets.map(e=>(0,d.jsx)(`li`,{children:e},e))}),(0,d.jsxs)(`dl`,{className:`skills__facts`,children:[(0,d.jsx)(`dt`,{children:`Accounts needed`}),(0,d.jsx)(`dd`,{children:m.accounts.length?m.accounts.map(e=>f[e]??e).join(`, `):`None`}),(0,d.jsx)(`dt`,{children:`Default schedule`}),(0,d.jsx)(`dd`,{children:m.schedule})]})]})})]}):(0,d.jsx)(t,{rows:6,label:`Loading skills`})}export{p as default};
|
|
2
|
+
//# sourceMappingURL=TinyBeeSkills-By9RLUse.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{G as e,H as t,J as n,M as r,Pt as i,R as a,Vn as o,W as s,Wn as c,Y as l,in as u,mn as d,pn as f,q as p,ut as m}from"./ui-DcmhYyYp.js";import{r as h}from"./router-W6nZsQ33.js";import{i as g}from"./store-IqrqHuFR.js";import{y as _}from"./format-BBZ8vFyT.js";import"./index-B6qKm1NW.js";import{i as v}from"./beeApi-BHW8Tx1s.js";import{a as y,n as b,o as x,r as S,t as C}from"./workflowUi-QYsd3n9J.js";var w=c(o(),1),T=d();function E({id:o,run:c}){let{readOnly:l,why:d}=x(),E=g(`tb:workflow:${o}`,e=>v.workflow(o,e),{refreshOn:[`run`],throttleMs:1500}),O=p(),[k,A]=(0,w.useState)(!1),[j,M]=(0,w.useState)(null);async function N(e,t,n){M(e);try{await t(),await E.reload(),n&&O.show({title:n,tone:`success`})}catch(t){O.show({title:`Could not ${e.toLowerCase()}`,body:t instanceof Error?t.message:void 0,tone:`error`})}finally{M(null)}}if(E.error&&!E.data)return(0,T.jsx)(t,{error:E.error,onRetry:()=>void E.reload()});if(!E.data)return(0,T.jsx)(a,{rows:5,label:`Loading workflow`});let P=E.data.workflow,F=P.enabled&&P.nextRuns[0]?`Next: ${y(P.nextRuns[0])}`:P.enabled?``:`Paused`;return(0,T.jsxs)(`div`,{className:`page workflow`,children:[l&&(0,T.jsx)(S,{why:d}),(0,T.jsxs)(`header`,{className:`workflow__head`,children:[(0,T.jsx)(`span`,{className:`workflow__emoji`,"aria-hidden":`true`,children:P.emoji??`π`}),(0,T.jsxs)(`div`,{className:`workflow__text`,children:[(0,T.jsx)(`h1`,{className:`workflow__name`,"data-testid":`wf-detail-name`,children:P.name}),(0,T.jsxs)(`p`,{className:`workflow__meta`,children:[P.triggerSummary,F?` Β· ${F}`:``]})]}),(0,T.jsx)(r,{checked:P.enabled,onChange:e=>void N(`Change it`,()=>v.toggle(P.id,e),e?`${P.name} is on`:`${P.name} is paused`),label:`On`,disabled:l,disabledReason:d})]}),(0,T.jsxs)(`div`,{className:`workflow__actions`,children:[(0,T.jsx)(f,{variant:`primary`,icon:(0,T.jsx)(i,{}),loading:j===`Run it`,disabled:l,onClick:()=>void N(`Run it`,()=>v.run(P.id),`Running now`),"data-testid":`wf-run`,children:`Run now`}),(0,T.jsx)(f,{icon:(0,T.jsx)(m,{}),onClick:()=>h({name:`workflow`,id:P.id,edit:!0}),"data-testid":`wf-edit`,children:`Edit`}),(0,T.jsx)(f,{loading:j===`Duplicate it`,disabled:l,onClick:()=>void N(`Duplicate it`,async()=>{let{workflow:e}=await v.duplicate(P.id);O.show({title:`${e.name} created, paused`,tone:`success`}),h({name:`workflow`,id:e.id})}),"data-testid":`wf-duplicate`,children:`Duplicate`}),(0,T.jsx)(f,{variant:`danger`,icon:(0,T.jsx)(u,{}),disabled:l,onClick:()=>A(!0),"data-testid":`wf-delete`,children:`Delete`})]}),(0,T.jsxs)(`section`,{className:`workflow__runs`,children:[(0,T.jsx)(`h2`,{className:`home__h`,children:`Recent runs`}),E.data.runs.length===0?(0,T.jsx)(e,{kind:`zero`,title:`No runs yet`,body:P.trigger.type===`manual`?`Tap Run now to start one.`:`The first run shows up here.`,compact:!0}):(0,T.jsx)(`ul`,{className:`wf-list`,"data-testid":`run-list`,children:E.data.runs.map(e=>(0,T.jsx)(`li`,{className:`wf-row`,children:(0,T.jsxs)(`a`,{href:`#/workflows/${encodeURIComponent(P.id)}?run=${encodeURIComponent(e.id)}`,className:`wf-row__main`,"data-testid":`run-row`,children:[(0,T.jsx)(b,{outcome:e.outcome}),(0,T.jsxs)(`span`,{className:`wf-row__text`,children:[(0,T.jsx)(`span`,{className:`wf-row__name`,children:C[e.outcome]}),(0,T.jsxs)(`span`,{className:`wf-row__meta`,children:[_(e.createdAt),` Β· `,e.title]})]})]})},e.id))})]}),E.data.notes.length>0&&(0,T.jsxs)(`section`,{children:[(0,T.jsx)(`h2`,{className:`home__h`,children:`Notes the Bee kept`}),(0,T.jsx)(`ul`,{className:`workflow__notes`,children:E.data.notes.map(e=>(0,T.jsxs)(`li`,{children:[(0,T.jsx)(`span`,{className:`wf-row__meta`,children:_(e.at)}),` `,e.text]},e.at))})]}),(0,T.jsx)(s,{summary:`Advanced: the YAML behind this`,children:(0,T.jsx)(`pre`,{className:`wf-editor__yaml`,"data-testid":`wf-yaml`,children:E.data.yaml})}),(0,T.jsx)(n,{open:k,onClose:()=>A(!1),role:`alertdialog`,title:`Delete ${P.name}?`,description:`Its runs and digest entries go with it. This cannot be undone.`,initialFocus:`[data-cancel]`,footer:(0,T.jsxs)(T.Fragment,{children:[(0,T.jsx)(f,{onClick:()=>A(!1),"data-cancel":!0,children:`Keep it`}),(0,T.jsx)(f,{variant:`danger`,loading:j===`Delete it`,onClick:()=>void N(`Delete it`,async()=>{await v.remove(P.id),A(!1),O.show({title:`${P.name} deleted`,tone:`success`}),h({name:`workflows`},{replace:!0})}),"data-testid":`wf-delete-confirm`,children:`Delete`})]})}),(0,T.jsx)(D,{workflowId:P.id,runId:c,readOnly:l,onRerun:()=>void N(`Run it`,()=>v.run(P.id),`Running now`)})]})}function D({workflowId:e,runId:n,readOnly:r,onRerun:o}){let s=g(n?`tb:run:${n}`:null,e=>v.runDetail(n,e).then(e=>e.run),{refreshOn:[`run`],throttleMs:1e3}),c=()=>h({name:`workflow`,id:e},{replace:!0}),u=s.data,d=u?u.status===`running`?`running`:u.status===`cancelled`?`cancelled`:u.status===`done`?u.steps.some(e=>e.status===`warn`)?`warn`:`ok`:`failed`:void 0,p=u?.finishedAt?Math.max(1,Math.round((new Date(u.finishedAt).getTime()-new Date(u.createdAt).getTime())/1e3)):null;return(0,T.jsx)(l,{open:!!n,onClose:c,title:d?`${C[d]}`:`Run`,description:u?`Started ${_(u.createdAt)}${p?`, took ${p} s`:``}${u.trigger?.title?` Β· ${u.trigger.title}`:``}`:`Loading`,footer:(0,T.jsxs)(T.Fragment,{children:[(0,T.jsx)(f,{variant:`primary`,icon:(0,T.jsx)(i,{}),disabled:r,onClick:o,children:`Run again`}),(0,T.jsx)(f,{onClick:c,children:`Close`})]}),children:s.error&&!u?(0,T.jsx)(t,{error:s.error,onRetry:()=>void s.reload(),compact:!0}):u?(0,T.jsxs)(`div`,{className:`run`,"data-testid":`run-sheet`,children:[d&&(0,T.jsx)(b,{outcome:d}),(0,T.jsx)(`ol`,{className:`run__timeline`,children:u.steps.map((e,t)=>(0,T.jsxs)(`li`,{className:`run__step run__step--${e.status}`,children:[(0,T.jsx)(`span`,{className:`run__step-label`,children:e.label}),e.detail&&(0,T.jsx)(`span`,{className:`run__step-detail`,children:e.detail}),(0,T.jsx)(`span`,{className:`run__step-at`,children:y(e.at)})]},t))}),u.digest.length>0&&(0,T.jsxs)(`section`,{children:[(0,T.jsx)(`h3`,{className:`home__h`,children:`What it told you`}),(0,T.jsx)(`ul`,{className:`run__digest`,children:u.digest.map(e=>(0,T.jsx)(`li`,{children:e.text},e.id))})]}),u.actions.length>0&&(0,T.jsxs)(`section`,{children:[(0,T.jsx)(`h3`,{className:`home__h`,children:`Actions`}),(0,T.jsx)(`ul`,{className:`run__digest`,children:u.actions.map((e,t)=>(0,T.jsxs)(`li`,{children:[e.action.title??e.action.kind,` Β· `,e.result.decision]},t))})]}),u.notes.length>0&&(0,T.jsxs)(`section`,{children:[(0,T.jsx)(`h3`,{className:`home__h`,children:`Notes`}),(0,T.jsx)(`ul`,{className:`run__digest`,children:u.notes.map(e=>(0,T.jsx)(`li`,{children:e.text},e.at))})]})]}):(0,T.jsx)(a,{rows:4,label:`Loading run`})})}export{D as RunSheet,E as default};
|
|
2
|
+
//# sourceMappingURL=TinyBeeWorkflow-DeNO7Jsh.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{F as e,H as t,I as n,M as r,N as i,P as a,Pt as o,R as s,Vn as c,W as l,Wn as u,in as d,mn as f,pn as p,q as m,sn as h}from"./ui-DcmhYyYp.js";import{r as ee}from"./router-W6nZsQ33.js";import"./index-B6qKm1NW.js";import{i as g,n as _,o as v,r as te,s as ne,t as re}from"./beeApi-BHW8Tx1s.js";import{a as y,i as ie,o as b}from"./workflowUi-QYsd3n9J.js";var x=u(c(),1),S=[0,1,2,3,4,5,6],C=[1,2,3,4,5],w=[`Sun`,`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`],T=[5,10,15,30],E=[1,2,3,4,6,12],D=(e,t)=>e.length===t.length&&[...e].sort().join()===[...t].sort().join();function O(e){let t=[...new Set(e)].sort((e,t)=>e-t);return t.length===0||t.length===7?`*`:t.every((e,n)=>n===0||e===t[n-1]+1)&&t.length>1?`${t[0]}-${t[t.length-1]}`:t.join(`,`)}function k(e,t){if(e<=0&&t>=24)return`*`;let n=Math.max(e,Math.min(23,t-1));return e===n?String(e):`${e}-${n}`}function A(e){switch(e.mode){case`minutes`:return`*/${e.n} ${k(e.from,e.to)} * * ${O(e.days)}`;case`hours`:{let t=k(e.from,e.to);return`0 ${t===`*`?`*/${e.n}`:`${t}/${e.n}`} * * ${O(e.days)}`}case`daily`:return`${e.minute} ${e.hour} * * ${O(e.days)}`;case`custom`:return e.cron}}function j(e){if(e===`*`)return S;let t=new Set;for(let n of e.split(`,`)){let e=/^(\d)(?:-(\d))?$/.exec(n);if(!e)return null;let r=Number(e[1]),i=e[2]?Number(e[2]):r;if(r>6||i>6||i<r)return null;for(let e=r;e<=i;e++)t.add(e===7?0:e)}return[...t].sort((e,t)=>e-t)}function M(e){if(e===`*`)return{from:0,to:24};let t=/^(\d{1,2})(?:-(\d{1,2}))?$/.exec(e);if(!t)return null;let n=Number(t[1]),r=t[2]?Number(t[2]):n;return n>23||r>23||r<n?null:{from:n,to:r+1}}function N(e){let t=e.trim().split(/\s+/),n={mode:`custom`,cron:e};if(t.length!==5||t[2]!==`*`||t[3]!==`*`)return n;let[r,i,,,a]=t,o=j(a);if(!o)return n;let s=/^\*\/(\d+)$/.exec(r);if(s){let e=M(i);return e?{mode:`minutes`,n:Number(s[1]),...e,days:o}:n}if(r===`0`){let e=/^(\*|\d{1,2}-\d{1,2}|\d{1,2})\/(\d+)$/.exec(i);if(e){let t=M(e[1]);return t?{mode:`hours`,n:Number(e[2]),...t,days:o}:n}}return/^\d{1,2}$/.test(r)&&/^\d{1,2}$/.test(i)&&Number(r)<60&&Number(i)<24?{mode:`daily`,hour:Number(i),minute:Number(r),days:o}:n}var P={mode:`daily`,hour:8,minute:0,days:S};function F(e){return e.length===0||D(e,S)}var I=f(),L=[`π`,`π¬`,`π·οΈ`,`π`,`π`,`βοΈ`,`β°`,`π`,`π`,`π`],R=[{value:`gmail/message.new`,label:`A new email arrives`},{value:`drive/file.changed`,label:`A Drive file changes`},{value:`sheets/row.added`,label:`A row is added to a sheet`}],z=[{value:`gmail`,label:`Gmail`},{value:`drive`,label:`Google Drive`},{value:`sheets`,label:`Google Sheets`},{value:`web`,label:`A web page`}],B={gmail:`A Gmail search, for example: newer_than:1d from:parent`,drive:`A folder or file name`,sheets:`A sheet name, optionally with a tab: Fees 2026!Sheet1`,web:`The page address`},V=[{action:`notify.push`,label:`Notify me`,hint:`A push on this phone.`},{action:`digest.append`,label:`Add to the daily digest`,hint:`Quietly, read it when you like.`},{action:`gmail.label`,label:`Label the email`,hint:`Needs your OK unless set to Auto.`,template:!0},{action:`gmail.draft`,label:`Draft a reply`,hint:`Saved as a draft, never sent on its own.`},{action:`gmail.send`,label:`Send an email`,hint:`Always asks first.`},{action:`sheets.append`,label:`Write a row to a sheet`,hint:`Appends to the sheet it watches.`,template:!0},{action:`memory.note`,label:`Remember a note`,hint:`The Bee keeps it for next time.`}],ae=[{value:`always`,label:`Every run`},{value:`match`,label:`Only when something matters`},{value:`error`,label:`Only when it fails`}],H=[{value:`cheap`,label:`Quick`,hint:`Fast and cheap. Fine for sorting and summaries.`},{value:`strong`,label:`Smart`,hint:`Slower, costs more. For judgment calls and writing.`},{value:`local`,label:`Local`,hint:`Runs on the laptop only, nothing leaves it.`}],oe=[30,60,120,300,600].map(e=>({value:String(e),label:e<60?`${e} seconds`:`${e/60} minute${e>=120?`s`:``}`})),se=[5e3,2e4,5e4,1e5].map(e=>({value:String(e),label:`${e/1e3}k tokens`})),ce=[{value:``,label:`Same as the input`},{value:`en`,label:`English`},{value:`vi`,label:`Vietnamese`}];function U(){return{id:``,name:``,emoji:`π`,enabled:!0,trigger:{type:`schedule`,cron:A(P)},inputs:[],agent:{model_tier:`cheap`,instructions:``,tools:[],permissions:{}},outputs:[{on:`always`,action:`notify.push`}],limits:{..._}}}function W(e){let[t,n]=(0,x.useState)(0);return(0,I.jsx)(G,{...e,retry:()=>n(e=>e+1)},`${e.id??``}|${e.skill??``}|${e.text??``}|${t}`)}function G({id:e,text:n,skill:r,retry:i}){let[a,o]=(0,x.useState)(null),[c,l]=(0,x.useState)(null);return(0,x.useEffect)(()=>{let t=!0;return(async()=>{if(e)return{def:(await g.workflow(e)).workflow};if(r){let e=(await g.skill(r)).skill;return{def:{...e.workflow,id:``,skill:e.key}}}if(n){let e=await g.fromText(n);return{def:{...e.workflow,id:``},summary:e.summary}}return{def:U()}})().then(e=>t&&o(e),e=>t&&l(e instanceof Error?e:Error(String(e)))),()=>{t=!1}},[e,n,r]),c?(0,I.jsx)(t,{error:c,title:n?`Could not draft it`:`Could not open it`,onRetry:i}):a?(0,I.jsx)(K,{initial:a.def,summary:a.summary,existing:!!e}):(0,I.jsx)(s,{rows:6,label:n?`Drafting your workflow`:`Loading`})}function K({initial:t,summary:s,existing:c}){let{readOnly:u,why:f}=b(),_=m(),[y,S]=(0,x.useState)(t),[C,w]=(0,x.useState)(()=>N(t.trigger.cron??A(P))),[T,E]=(0,x.useState)(null),[D,O]=(0,x.useState)(!1),[k,j]=(0,x.useState)(!1),[M,F]=(0,x.useState)(null),[U,W]=(0,x.useState)(null),G=y.trigger.type===`schedule`?U:null,K=(0,x.useRef)(t.id),J=e=>S(t=>({...t,...e})),Y=(0,x.useMemo)(()=>ne(y),[y]),X=e=>T&&T.field===e?T.message:void 0,le=e=>{w(e),S(t=>({...t,trigger:{...t.trigger,type:`schedule`,cron:A(e)}}))};(0,x.useEffect)(()=>{if(y.trigger.type!==`schedule`||!y.trigger.cron)return;let e=new AbortController,t=setTimeout(()=>{g.validate({...y,name:y.name||`Untitled`,agent:{...y.agent,instructions:y.agent.instructions||`x`}},e.signal).then(W,()=>void 0)},400);return()=>{clearTimeout(t),e.abort()}},[y]);function ue(){return{...y,agent:{...y.agent,tools:Y}}}function Z(e){e instanceof re&&e.field?(E({field:e.field,message:e.message}),document.querySelector(`[data-field="${CSS.escape(e.field)}"]`)?.scrollIntoView?.({block:`center`})):_.show({title:`Could not save`,body:e instanceof Error?e.message:void 0,tone:`error`})}async function Q(){E(null);let e=ue(),t=K.current?await g.update(K.current,e):await g.create(e);return K.current=t.workflow.id,t.workflow}async function de(e){e.preventDefault(),O(!0);try{let e=await Q();_.show({title:ie(e),tone:`success`}),ee({name:`workflow`,id:e.id},{replace:!c})}catch(e){Z(e)}finally{O(!1)}}async function fe(){j(!0),F(null);try{let e=await Q(),{run:t}=await g.run(e.id,!0);F(t.steps)}catch(e){Z(e)}finally{j(!1)}}let pe=(e,t)=>J({outputs:t?[...y.outputs.filter(t=>t.action!==e),{on:e===`notify.push`?`match`:`always`,action:e}]:y.outputs.filter(t=>t.action!==e)}),$=(e,t)=>J({outputs:y.outputs.map(n=>n.action===e?{...n,...t}:n)});return(0,I.jsxs)(`form`,{className:`page wf-editor`,onSubmit:de,noValidate:!0,"data-testid":`workflow-editor`,children:[u&&(0,I.jsxs)(`p`,{className:`banner banner--warn workflows__readonly`,role:`status`,"data-testid":`workflows-readonly`,children:[f,` You can edit, but not save, until then.`]}),s&&(0,I.jsxs)(`p`,{className:`wf-editor__summary`,"data-testid":`draft-summary`,children:[`Here is what I understood: `,s,` Check it and change anything.`]}),(0,I.jsxs)(h,{title:`Name`,className:`wf-editor__card`,children:[(0,I.jsx)(`div`,{className:`wf-editor__emoji`,role:`radiogroup`,"aria-label":`Icon`,children:L.map(e=>(0,I.jsx)(`button`,{type:`button`,role:`radio`,"aria-checked":y.emoji===e,className:`wf-editor__emoji-btn${y.emoji===e?` is-on`:``}`,onClick:()=>J({emoji:e}),children:e},e))}),(0,I.jsx)(`div`,{"data-field":`name`,children:(0,I.jsx)(i,{label:`What to call it`,error:X(`name`),required:!0,children:(0,I.jsx)(a,{value:y.name,onChange:e=>J({name:e.target.value}),placeholder:`Morning fee emails`,maxLength:80,"data-testid":`wf-name`})})})]}),(0,I.jsxs)(h,{title:`When`,className:`wf-editor__card`,"data-field":`trigger`,children:[(0,I.jsx)(`div`,{className:`wf-editor__choice`,role:`radiogroup`,"aria-label":`When it runs`,children:[[`schedule`,`On a schedule`],[`event`,`When something happens`],[`manual`,`Only when I ask`]].map(([e,t])=>(0,I.jsx)(`button`,{type:`button`,role:`radio`,"aria-checked":y.trigger.type===e,className:`chip${y.trigger.type===e?` is-on`:``}`,"data-testid":`wf-trigger-${e}`,onClick:()=>J({trigger:e===`schedule`?{type:e,cron:A(C)}:e===`event`?{type:e,event:y.trigger.event??R[0].value}:{type:e}}),children:t},e))}),y.trigger.type===`schedule`&&(0,I.jsx)(q,{value:C,onChange:le,error:X(`trigger.cron`),nextRuns:G?.ok?G.nextRuns:void 0,summary:G?.ok?G.triggerSummary:void 0}),y.trigger.type===`event`&&(0,I.jsx)(i,{label:`Which event`,error:X(`trigger.event`),children:(0,I.jsx)(e,{value:y.trigger.event??``,onChange:e=>J({trigger:{type:`event`,event:e.target.value}}),options:R,"data-testid":`wf-event`})}),y.trigger.type===`manual`&&(0,I.jsx)(`p`,{className:`wf-editor__hint`,children:`Nothing runs on its own. Tap βRun nowβ on the workflow whenever you like.`})]}),(0,I.jsxs)(h,{title:`Watch`,description:`Where the Bee looks each run.`,className:`wf-editor__card`,"data-field":`inputs`,children:[y.inputs.map((t,n)=>(0,I.jsxs)(`div`,{className:`wf-editor__input`,"data-testid":`wf-input`,children:[(0,I.jsx)(i,{label:`Account`,hideLabel:!0,children:(0,I.jsx)(e,{value:t.connection,options:z,onChange:e=>J({inputs:y.inputs.map((t,r)=>r===n?{...t,connection:e.target.value}:t)}),"aria-label":`Account`})}),(0,I.jsx)(i,{label:`What to look at`,hideLabel:!0,error:X(`inputs.${n}.query`),children:(0,I.jsx)(a,{value:t.query,placeholder:B[t.connection]??`What to look at`,onChange:e=>J({inputs:y.inputs.map((t,r)=>r===n?{...t,query:e.target.value}:t)}),"aria-label":`What to look at`})}),(0,I.jsx)(p,{variant:`ghost`,size:`sm`,"aria-label":`Remove this source`,onClick:()=>J({inputs:y.inputs.filter((e,t)=>t!==n)}),icon:(0,I.jsx)(d,{})})]},n)),X(`inputs`)&&(0,I.jsx)(`p`,{className:`field__error`,children:X(`inputs`)}),(0,I.jsx)(p,{size:`sm`,onClick:()=>J({inputs:[...y.inputs,{connection:`gmail`,query:``}]}),"data-testid":`wf-add-input`,children:`Add a source`})]}),(0,I.jsxs)(h,{title:`Do`,className:`wf-editor__card`,children:[(0,I.jsx)(`div`,{"data-field":`agent.instructions`,children:(0,I.jsx)(i,{label:`What the Bee should do`,hint:`Say it like you would to a helper. The Bee reads what it watches, then follows this.`,error:X(`agent.instructions`),required:!0,children:(0,I.jsx)(n,{value:y.agent.instructions,onChange:e=>J({agent:{...y.agent,instructions:e.target.value}}),rows:4,"data-testid":`wf-instructions`})})}),(0,I.jsx)(i,{label:`Answer in`,children:(0,I.jsx)(e,{value:y.agent.output_language??``,options:ce,onChange:e=>J({agent:{...y.agent,output_language:e.target.value||void 0}})})}),(0,I.jsxs)(`fieldset`,{className:`wf-editor__outputs`,"data-field":`outputs`,children:[(0,I.jsx)(`legend`,{children:`Then`}),V.map(t=>{let n=y.outputs.find(e=>e.action===t.action);return(0,I.jsxs)(`div`,{className:`wf-editor__output`,children:[(0,I.jsx)(r,{checked:!!n,onChange:e=>pe(t.action,e),label:t.label,description:t.hint}),n&&(0,I.jsxs)(`div`,{className:`wf-editor__output-opts`,children:[(0,I.jsx)(i,{label:`When`,hideLabel:!0,children:(0,I.jsx)(e,{value:n.on,options:ae,onChange:e=>$(t.action,{on:e.target.value}),"aria-label":`${t.label}: when`})}),t.template&&(0,I.jsx)(i,{label:`Details`,hideLabel:!0,children:(0,I.jsx)(a,{value:n.template??``,placeholder:t.action===`gmail.label`?`Label name`:`Columns, for example: {{date}}, {{summary}}`,onChange:e=>$(t.action,{template:e.target.value}),"aria-label":`${t.label}: details`})})]})]},t.action)}),X(`outputs`)&&(0,I.jsx)(`p`,{className:`field__error`,children:X(`outputs`)})]})]}),(0,I.jsxs)(h,{title:`On its own`,description:`What the Bee may do without asking. Reading is always fine; writing and sending ask unless you say otherwise.`,className:`wf-editor__card`,"data-field":`agent.permissions`,children:[Y.length===0&&(0,I.jsx)(`p`,{className:`wf-editor__hint`,children:`Add a source or an action above and the choices appear here.`}),Y.map(e=>{let t=te.find(t=>t.name===e),n=v(e),r=y.agent.permissions[e]??n;return(0,I.jsxs)(`div`,{className:`wf-editor__perm`,"data-testid":`wf-perm`,"data-tool":e,children:[(0,I.jsx)(`span`,{className:`wf-editor__perm-label`,children:t?.label??e}),(0,I.jsx)(`div`,{className:`wf-editor__choice`,role:`radiogroup`,"aria-label":t?.label??e,children:[[`auto`,`Auto`],[`ask`,`Ask me`],[`deny`,`Off`]].map(([t,i])=>(0,I.jsxs)(`button`,{type:`button`,role:`radio`,"aria-checked":r===t,className:`chip chip--sm${r===t?` is-on`:``}`,onClick:()=>J({agent:{...y.agent,permissions:{...y.agent.permissions,[e]:t}}}),children:[i,t===n?(0,I.jsx)(`span`,{className:`wf-editor__default`,children:` Β· default`}):null]},t))})]},e)})]}),(0,I.jsxs)(h,{title:`Limits`,className:`wf-editor__card`,"data-field":`limits`,children:[(0,I.jsx)(`div`,{className:`wf-editor__choice`,role:`radiogroup`,"aria-label":`Model`,children:H.map(e=>(0,I.jsx)(`button`,{type:`button`,role:`radio`,"aria-checked":y.agent.model_tier===e.value,className:`chip${y.agent.model_tier===e.value?` is-on`:``}`,onClick:()=>J({agent:{...y.agent,model_tier:e.value}}),title:e.hint,children:e.label},e.value))}),(0,I.jsx)(`p`,{className:`wf-editor__hint`,children:H.find(e=>e.value===y.agent.model_tier)?.hint}),(0,I.jsxs)(`div`,{className:`wf-editor__row`,children:[(0,I.jsx)(i,{label:`Stop after`,children:(0,I.jsx)(e,{value:String(y.limits.max_runtime_s),options:oe,onChange:e=>J({limits:{...y.limits,max_runtime_s:Number(e.target.value)}})})}),(0,I.jsx)(i,{label:`Budget per run`,hint:`Roughly how much the Bee may read and write. 20k is a long email thread.`,children:(0,I.jsx)(e,{value:String(y.limits.max_tokens),options:se,onChange:e=>J({limits:{...y.limits,max_tokens:Number(e.target.value)}})})})]})]}),(0,I.jsxs)(h,{title:`Test`,description:`Runs it once right now without sending or writing anything, and shows what it would have done.`,className:`wf-editor__card`,children:[(0,I.jsx)(p,{onClick:()=>void fe(),loading:k,disabled:u,icon:(0,I.jsx)(o,{}),"data-testid":`wf-test`,children:`Run a test now`}),M&&(0,I.jsx)(`ol`,{className:`run__timeline`,"data-testid":`wf-test-steps`,children:M.map((e,t)=>(0,I.jsxs)(`li`,{className:`run__step run__step--${e.status}`,children:[(0,I.jsx)(`span`,{className:`run__step-label`,children:e.label}),e.detail&&(0,I.jsx)(`span`,{className:`run__step-detail`,children:e.detail})]},t))})]}),(0,I.jsxs)(`div`,{className:`wf-editor__save`,children:[(0,I.jsx)(r,{checked:y.enabled,onChange:e=>J({enabled:e}),label:`On`,description:y.enabled?`Runs as set above.`:`Saved, but it will not run until you turn it on.`}),(0,I.jsx)(p,{type:`submit`,variant:`primary`,size:`lg`,loading:D,disabled:u,"data-testid":`wf-save`,children:c?`Save changes`:`Save workflow`})]}),(0,I.jsx)(l,{summary:`Advanced: the YAML behind this`,children:(0,I.jsx)(`pre`,{className:`wf-editor__yaml`,children:G?.ok?G.yaml:`β¦`})})]})}function q({value:t,onChange:n,error:r,nextRuns:o,summary:s}){let c=[[`minutes`,`Every few minutes`],[`hours`,`Every few hours`],[`daily`,`Once a day`],[`custom`,`Custom (cron)`]],l=t.mode===`custom`?S:t.days,u=e=>t.mode!==`custom`&&n({...t,days:e}),d=Array.from({length:24},(e,t)=>({value:String(t),label:`${t}:00`}));return(0,I.jsxs)(`div`,{className:`wf-editor__schedule`,"data-testid":`wf-schedule`,children:[(0,I.jsx)(i,{label:`How often`,children:(0,I.jsx)(e,{value:t.mode,options:c.map(([e,t])=>({value:e,label:t})),"data-testid":`wf-schedule-mode`,onChange:e=>{let r=e.target.value;n(r===`minutes`?{mode:`minutes`,n:10,from:7,to:21,days:l}:r===`hours`?{mode:`hours`,n:1,from:7,to:21,days:l}:r===`daily`?{mode:`daily`,hour:8,minute:0,days:l}:{mode:`custom`,cron:A(t)})}})}),(t.mode===`minutes`||t.mode===`hours`)&&(0,I.jsxs)(`div`,{className:`wf-editor__row`,children:[(0,I.jsx)(i,{label:`Every`,children:(0,I.jsx)(e,{value:String(t.n),options:(t.mode===`minutes`?T:E).map(e=>({value:String(e),label:`${e} ${t.mode===`minutes`?`min`:e===1?`hour`:`hours`}`})),onChange:e=>n({...t,n:Number(e.target.value)})})}),(0,I.jsx)(i,{label:`From`,children:(0,I.jsx)(e,{value:String(t.from),options:d,onChange:e=>n({...t,from:Number(e.target.value)})})}),(0,I.jsx)(i,{label:`To`,children:(0,I.jsx)(e,{value:String(t.to),options:d,onChange:e=>n({...t,to:Number(e.target.value)})})})]}),t.mode===`daily`&&(0,I.jsx)(`div`,{className:`wf-editor__row`,children:(0,I.jsx)(i,{label:`At`,children:(0,I.jsx)(a,{type:`time`,value:`${String(t.hour).padStart(2,`0`)}:${String(t.minute).padStart(2,`0`)}`,onChange:e=>{let[r,i]=e.target.value.split(`:`).map(Number);Number.isFinite(r)&&Number.isFinite(i)&&n({...t,hour:r,minute:i})},"data-testid":`wf-schedule-time`})})}),t.mode===`custom`&&(0,I.jsx)(i,{label:`Cron expression`,hint:`Five fields: minute hour day month weekday.`,error:r,children:(0,I.jsx)(a,{value:t.cron,onChange:e=>n({mode:`custom`,cron:e.target.value}),spellCheck:!1,"data-testid":`wf-schedule-cron`})}),t.mode!==`custom`&&(0,I.jsxs)(`div`,{className:`wf-editor__days`,children:[(0,I.jsx)(`div`,{className:`wf-editor__choice`,role:`group`,"aria-label":`Days`,children:S.map(e=>(0,I.jsx)(`button`,{type:`button`,"aria-pressed":l.includes(e),className:`chip chip--sm${l.includes(e)?` is-on`:``}`,onClick:()=>u(l.includes(e)?l.filter(t=>t!==e):[...l,e].sort()),children:w[e]},e))}),(0,I.jsxs)(`div`,{className:`wf-editor__choice`,children:[(0,I.jsx)(p,{size:`sm`,variant:`ghost`,onClick:()=>u(S),disabled:F(l),children:`Every day`}),(0,I.jsx)(p,{size:`sm`,variant:`ghost`,onClick:()=>u(C),children:`Weekdays`})]}),r&&(0,I.jsx)(`p`,{className:`field__error`,children:r})]}),(0,I.jsxs)(`p`,{className:`wf-editor__next`,"data-testid":`wf-next-runs`,"aria-live":`polite`,children:[s?`${s}.`:``,` `,o&&o.length?`Next: ${o.slice(0,3).map(e=>y(e)).join(`, `)}`:``]})]})}export{L as EMOJI_PRESETS,q as SchedulePicker,U as blankWorkflow,W as default};
|
|
2
|
+
//# sourceMappingURL=TinyBeeWorkflowEditor-B6OGC2OT.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{G as e,H as t,I as n,It as r,M as i,N as a,R as o,Vn as s,Wn as c,Y as l,mn as u,on as d,pn as f,q as p}from"./ui-DcmhYyYp.js";import{r as m}from"./router-W6nZsQ33.js";import{i as h}from"./store-IqrqHuFR.js";import{y as g}from"./format-BBZ8vFyT.js";import"./index-B6qKm1NW.js";import{i as _}from"./beeApi-BHW8Tx1s.js";import{n as v,o as y,r as b}from"./workflowUi-QYsd3n9J.js";var x=c(s(),1),S=u(),C=`tb:workflows`;function w(){let{readOnly:n,why:a}=y(),[s,c]=(0,x.useState)(`active`),[l,u]=(0,x.useState)(!1),w=h(C,e=>_.workflows(e).then(e=>e.workflows),{refreshOn:[`run`],throttleMs:2e3}),E=p(),D=w.data??[],O=s===`all`?D:D.filter(e=>e.enabled===(s===`active`)),k=[{value:`active`,label:`Active`,count:D.filter(e=>e.enabled).length},{value:`paused`,label:`Paused`,count:D.filter(e=>!e.enabled).length},{value:`all`,label:`All`,count:D.length}];async function A(e,t){try{await _.toggle(e.id,t),await w.reload(),E.show({title:t?`${e.name} is on`:`${e.name} is paused`,tone:`success`})}catch(e){E.show({title:`Could not change it`,body:e instanceof Error?e.message:void 0,tone:`error`})}}return(0,S.jsxs)(`div`,{className:`page workflows`,children:[n&&(0,S.jsx)(b,{why:a}),(0,S.jsx)(d,{items:k,value:s,onChange:c,label:`Workflows`,idPrefix:`wf-tabs`,children:w.error&&!w.data?(0,S.jsx)(t,{error:w.error,onRetry:()=>void w.reload()}):w.loading&&!w.data?(0,S.jsx)(o,{rows:4,label:`Loading workflows`}):D.length===0?(0,S.jsx)(e,{kind:`first-run`,title:`No workflows yet`,body:n?`The editor opens once your Bee can act.`:`Workflows are jobs your Bee runs on a schedule or on a trigger. Describe one in a sentence, or start from a skill.`,action:n?void 0:(0,S.jsxs)(`div`,{className:`workflows__empty-actions`,children:[(0,S.jsx)(f,{variant:`primary`,onClick:()=>u(!0),children:`Describe one`}),(0,S.jsx)(f,{variant:`secondary`,onClick:()=>m({name:`skills`}),children:`Browse skills`})]})}):O.length===0?(0,S.jsx)(e,{kind:`filtered`,title:s===`active`?`Nothing active`:`Nothing paused`,compact:!0,action:(0,S.jsx)(f,{onClick:()=>c(`all`),children:`Show all`})}):(0,S.jsx)(`ul`,{className:`wf-list`,"data-testid":`workflow-list`,children:O.map(e=>(0,S.jsxs)(`li`,{className:`wf-row`,"data-testid":`workflow-row`,"data-enabled":e.enabled,children:[(0,S.jsxs)(`a`,{href:`#/workflows/${encodeURIComponent(e.id)}`,className:`wf-row__main`,children:[(0,S.jsx)(`span`,{className:`wf-row__emoji`,"aria-hidden":`true`,children:e.emoji??`π`}),(0,S.jsxs)(`span`,{className:`wf-row__text`,children:[(0,S.jsx)(`span`,{className:`wf-row__name`,children:e.name}),(0,S.jsx)(`span`,{className:`wf-row__meta`,children:e.triggerSummary}),(0,S.jsx)(`span`,{className:`wf-row__meta`,children:e.lastRun?(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(v,{outcome:e.lastRun.outcome}),` `,g(e.lastRun.at)]}):`Never ran`})]})]}),(0,S.jsx)(`div`,{className:`wf-row__switch`,children:(0,S.jsx)(i,{checked:e.enabled,onChange:t=>void A(e,t),label:`${e.name} on`,disabled:n,disabledReason:a})})]},e.id))})}),!n&&(0,S.jsxs)(f,{variant:`primary`,size:`lg`,className:`workflows__fab`,onClick:()=>u(!0),"data-testid":`workflow-add`,children:[(0,S.jsx)(r,{}),` New workflow`]}),(0,S.jsx)(T,{open:l,onClose:()=>u(!1)})]})}function T({open:e,onClose:t}){let[r,i]=(0,x.useState)(``),[o,s]=(0,x.useState)(``),[c,u]=(0,x.useState)(!1),[d,h]=(0,x.useState)(!1),[g,v]=(0,x.useState)(null),y=p();function b(e){e.preventDefault(),r.trim()&&(t(),m({name:`workflowNew`,text:r.trim()}))}async function C(e){if(e.preventDefault(),o.trim()){h(!0),v(null);try{let{workflow:e}=await _.create({yaml:o});t(),y.show({title:`${e.name} imported`,tone:`success`}),m({name:`workflow`,id:e.id})}catch(e){v(e instanceof Error?e.message:`Could not import it.`)}finally{h(!1)}}}return(0,S.jsxs)(l,{open:e,onClose:t,title:`Add a workflow`,description:`Say what you want in a sentence, pick a skill, or paste YAML.`,hideDescription:!0,children:[(0,S.jsxs)(`form`,{onSubmit:b,className:`workflows__add`,children:[(0,S.jsx)(a,{label:`Describe what you want`,hint:`For example: every morning at 8, tell me which emails from parents mention fees.`,children:(0,S.jsx)(n,{value:r,onChange:e=>i(e.target.value),rows:3,"data-testid":`add-text`})}),(0,S.jsx)(f,{type:`submit`,variant:`primary`,disabled:!r.trim(),"data-testid":`add-describe`,children:`Continue`})]}),(0,S.jsx)(f,{variant:`secondary`,onClick:()=>(t(),m({name:`skills`})),"data-testid":`add-skill`,children:`Start from a skill`}),c?(0,S.jsxs)(`form`,{onSubmit:C,className:`workflows__add`,children:[(0,S.jsx)(a,{label:`Workflow YAML`,error:g,children:(0,S.jsx)(n,{value:o,onChange:e=>s(e.target.value),rows:8,spellCheck:!1,"data-testid":`add-yaml`})}),(0,S.jsx)(f,{type:`submit`,variant:`secondary`,disabled:d||!o.trim(),"data-testid":`add-import`,children:d?`Importingβ¦`:`Import`})]}):(0,S.jsx)(f,{variant:`ghost`,onClick:()=>u(!0),children:`Advanced: import YAML`})]})}export{T as AddWorkflowSheet,C as WORKFLOWS_KEY,w as default};
|
|
2
|
+
//# sourceMappingURL=TinyBeeWorkflows-BN4-h6lt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.trace{max-width:1120px}.trace a.btn{text-decoration:none}.trace a.btn[aria-disabled=true]{pointer-events:none;opacity:.5}.trace-filters{gap:var(--space-3);margin-bottom:var(--space-3);flex-wrap:wrap;display:flex}.trace-filter{flex:0 200px;min-width:140px}.trace-summary{margin:0 0 var(--space-3);font-size:var(--text-md);font-weight:var(--weight-semibold);color:var(--text);overflow-wrap:anywhere}.trace-wrap{background:var(--surface);border:var(--hairline);border-radius:var(--radius-md);overflow-x:auto}.trace-table{border-collapse:collapse;width:100%;min-width:640px;font-size:var(--text-sm)}.trace-table th{padding:var(--space-2) var(--space-3);background:var(--surface-2);border-bottom:var(--hairline);color:var(--text-2);font-size:var(--text-xs);font-weight:var(--weight-semibold);text-align:left;white-space:nowrap;position:sticky;top:0}.trace-table td{height:var(--row-compact);padding:var(--space-1) var(--space-3);border-bottom:var(--hairline);vertical-align:middle;color:var(--text)}.trace-table tbody tr{cursor:pointer}.trace-table tbody tr:last-child td{border-bottom:0}.trace-table tbody tr:hover{background:var(--surface-hover)}.trace-table tbody tr.is-selected{background:var(--surface-selected)}.trace-num{white-space:nowrap;text-align:right!important}.trace-type,.trace-prs{white-space:nowrap;color:var(--text-2)}.trace-prs__list{align-items:flex-start;gap:var(--space-1);flex-direction:column;display:flex}.trace-prs .ref-chip{max-width:calc(var(--space-12) * 5)}.trace-defects{white-space:nowrap;color:var(--text-2)}.trace-defects--open{color:var(--outage-fg);font-weight:var(--weight-medium)}.trace-issue{width:100%;min-width:16rem;max-width:0}.trace-issue .ref-chip{width:-moz-fit-content;width:fit-content;max-width:100%;display:flex;overflow:hidden}.trace-drawer{--inspector-w:480px}.trace-sum{gap:var(--space-2);margin-bottom:var(--space-4);flex-direction:column;display:flex}.trace-meta{gap:var(--space-1) var(--space-4);font-size:var(--text-sm);flex-wrap:wrap;margin:0;display:flex}.trace-meta dt{color:var(--text-3);display:inline}.trace-meta dt:after{content:": "}.trace-meta dd{color:var(--text);margin:0;display:inline}.trace-why{padding-left:var(--space-4);color:var(--text-2);font-size:var(--text-sm);margin:0}.trace-sec{padding-top:var(--space-3);margin-top:var(--space-3);border-top:var(--hairline)}.trace-sec__title{align-items:center;gap:var(--space-2);margin:0 0 var(--space-2);font-size:var(--text-sm);font-weight:var(--weight-semibold);color:var(--text);display:flex}.trace-sec__count{color:var(--text-3);font-weight:var(--weight-regular)}.trace-sec__foot{margin:var(--space-2) 0 0;font-size:var(--text-sm)}.trace-sec p{font-size:var(--text-sm);margin:0}.trace-md{font-size:var(--text-sm);overflow-wrap:anywhere}.trace-list{font-size:var(--text-sm);margin:0;padding:0;list-style:none}.trace-list li{align-items:baseline;gap:var(--space-2);padding:var(--space-1) 0;border-bottom:var(--hairline);display:flex}.trace-list li:last-child{border-bottom:0}.trace-list .ref-chip{flex:0 auto}.trace-list__main{overflow-wrap:anywhere;flex:1;min-width:0}.trace-list__aside{color:var(--text-3);flex:none}.trace-result{min-width:56px;font-size:var(--text-xs);font-weight:var(--weight-semibold);color:var(--text-2);flex:none}.trace-result--passed{color:var(--ok-fg)}.trace-result--failed{color:var(--outage-fg)}@media (max-width:899px){.trace-filter{flex:140px}}.tmap-bar{align-items:flex-end;gap:var(--space-3);margin-bottom:var(--space-3);flex-wrap:wrap;display:flex}.tmap-statuses,.tmap-depth{gap:var(--space-1);flex-wrap:wrap;display:flex}.tmap-statuses{flex:560px;container-type:inline-size}@container (width<=279px){.tmap-chip .status__label{clip:rect(0, 0, 0, 0);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}}.tmap-chip{align-items:center;gap:var(--space-2);min-height:var(--control-sm);padding:0 var(--space-3);border:var(--hairline);border-radius:var(--radius-full);background:var(--surface);color:var(--text);font-size:var(--text-sm);display:inline-flex}.tmap-chip:hover{background:var(--surface-hover)}.tmap-chip.is-on{border-color:var(--text-2);background:var(--surface-selected)}.tmap-chip__count{color:var(--text-3);font-family:var(--font-mono);font-variant-numeric:tabular-nums}.tmap-chip,.tmap-bar .btn,.tcan-controls .btn{white-space:nowrap}.tmap-bar .btn__label,.tcan-controls .btn__label{white-space:nowrap;display:block;overflow:visible}.tmap-search{flex:0 220px;min-width:160px}.tmap-note{margin:0 0 var(--space-3);color:var(--text-2);font-size:var(--text-sm)}.tmap-canvas{padding:var(--space-4);background:var(--bg);border:var(--hairline);border-radius:var(--radius-md);overflow:auto}.tmap-tree,.tmap-kids{margin:0;padding:0;list-style:none}.tmap-item{align-items:flex-start;display:flex}.tmap-kids{gap:var(--space-2);padding-left:var(--space-6);flex-direction:column;display:flex;position:relative}.tmap-kids>.tmap-item{position:relative}.tmap-kids>.tmap-item:before{content:"";left:calc(-1 * var(--space-3));width:var(--space-3);border-top:var(--hairline);position:absolute;top:15px}.tmap-kids>.tmap-item:after{content:"";left:calc(-1 * var(--space-3));top:calc(-1 * var(--space-2));bottom:calc(-1 * var(--space-2));border-left:var(--hairline);position:absolute}.tmap-kids>.tmap-item:first-child:after{top:15px}.tmap-kids>.tmap-item:last-child:after{height:calc(15px + var(--space-2));bottom:auto}.tmap-kids>.tmap-item:first-child:last-child:after{display:none}.tmap-item>.tmap-kids:before{content:"";width:var(--space-3);border-top:var(--hairline);position:absolute;top:15px;left:0}.tmap-node{background:var(--surface);border:var(--hairline);border-radius:var(--radius-md);max-width:360px;box-shadow:var(--shadow-1);flex:none;align-items:center;display:flex}.tmap-node.is-selected{background:var(--surface-selected)}.tmap-item--root>.tmap-node,.tmap-item--app>.tmap-node{background:var(--surface-2)}.tmap-toggle{width:24px;height:30px;color:var(--text-3);background:0 0;border:0;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}.tmap-toggle svg{transition:transform var(--dur-fast) var(--ease)}.tmap-toggle.is-open svg{transform:rotate(90deg)}.tmap-toggle:hover:not(:disabled){color:var(--text)}.tmap-toggle:disabled{color:var(--text-disabled);cursor:not-allowed}.tmap-toggle--leaf{width:12px}.tmap-open{align-items:center;gap:var(--space-2);min-width:0;min-height:30px;padding:var(--space-1) var(--space-3) var(--space-1) 0;color:var(--text);font-size:var(--text-sm);text-align:left;background:0 0;border:0;display:flex}.tmap-open:hover .tmap-name{text-decoration:underline}.tmap-kind{color:var(--text-3);font-size:var(--text-xs);flex:none}.tmap-name{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-weight:var(--weight-medium);overflow:hidden}.tmap-counts{gap:var(--space-2);color:var(--text-3);font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:var(--text-xs);white-space:nowrap;flex:none;display:inline-flex}.tmap-counts__bugs{color:var(--outage-fg);font-weight:var(--weight-medium)}.tmap-thumb{width:40px;height:26px}.thumb{box-sizing:border-box;border-radius:var(--radius-sm);flex:none;display:block;position:relative;overflow:hidden}.thumb__ph{color:var(--text-3);justify-content:center;align-items:center;display:flex;position:absolute;inset:0}.thumb__img{box-sizing:border-box;object-fit:cover;object-position:top;border:var(--hairline);border-radius:inherit;opacity:0;width:100%;height:100%;transition:opacity .15s ease-out;display:block;position:absolute;inset:0}.thumb.is-ready .thumb__img{opacity:1}@media (prefers-reduced-motion:reduce){.thumb__img{transition:none}}@media (max-width:639px){.tmap-canvas{padding:var(--space-2)}.tmap-item{flex-direction:column;align-items:stretch}.tmap-kids{padding-left:var(--space-4);margin-top:var(--space-1);gap:var(--space-1)}.tmap-item>.tmap-kids:before{display:none}.tmap-kids>.tmap-item:before{left:calc(-1 * var(--space-2));width:var(--space-2)}.tmap-kids>.tmap-item:after{left:calc(-1 * var(--space-2))}.tmap-node{flex-wrap:wrap;max-width:none}.tmap-node .tcan-dots{padding:0 var(--space-2) var(--space-1) var(--space-6);flex-basis:100%}.tmap-node .tmap-open{flex-wrap:wrap;row-gap:0}.tmap-node .tmap-name{white-space:normal;overflow-wrap:anywhere}.tmap-search{flex:100%}}.tcan{background:var(--bg);border:var(--hairline);border-radius:var(--radius-md);height:clamp(420px,68vh,860px);position:relative;overflow:hidden}.tcan-viewport{touch-action:none;cursor:grab;-webkit-user-select:none;user-select:none;outline:none;position:absolute;inset:0;overflow:hidden}.tcan-viewport:active{cursor:grabbing}.tcan-viewport:focus-visible{box-shadow:inset 0 0 0 2px var(--accent-brand)}.tcan-layer{transform-origin:0 0;will-change:transform;position:absolute;top:0;left:0}.tcan-edges{pointer-events:none;max-width:none;position:absolute;top:0;left:0;overflow:visible}.tcan-edges path{fill:none;stroke:var(--border-strong);stroke-width:1.5px}.tcan-nodes{width:1px;height:1px;margin:0;padding:0;list-style:none;position:absolute;top:0;left:0;overflow:visible}.tcan-node{box-sizing:border-box;background:var(--surface);border:var(--hairline);border-radius:var(--radius-md);box-shadow:var(--shadow-1);flex-direction:column;justify-content:center;display:flex;position:absolute;top:0;left:0}.tcan-node--root,.tcan-node--app{background:var(--surface-2)}.tcan-node.is-selected{background:var(--surface-selected);border-color:var(--border-strong)}.tcan-row{align-items:flex-start;min-width:0;display:flex}.tcan-row .tmap-toggle{height:24px;margin-top:var(--space-2)}.tcan-open{align-items:flex-start;gap:var(--space-2);min-width:0;padding:var(--space-2) var(--space-2) var(--space-1) 0;flex:1;display:flex}.tcan-thumbbox{flex:none;width:72px;height:45px;display:block}.tcan-thumb{width:72px;height:45px}.tcan-text{gap:var(--space-0-5);flex-direction:column;flex:1;min-width:0;display:flex}.tcan-line{align-items:center;gap:var(--space-2);white-space:nowrap;min-width:0;min-height:15px;display:flex}.tcan-line>.status,.tcan-line>.tmap-kind,.tcan-line>.tmap-counts{white-space:nowrap;flex:none}.tcan-line .status__label{white-space:nowrap}.tcan-node--gap{border-style:dashed;border-color:var(--border-strong);box-shadow:none}.tcan-dots{align-items:center;gap:var(--space-1);min-width:0;min-height:24px;padding:0 var(--space-2) var(--space-1) var(--space-6);white-space:nowrap;display:flex}.tmap-node .tcan-dots{padding:0 var(--space-2) 0 0}.trace-sum .tcan-dots{padding:0}.tcan-dots__none,.tcan-dots__more{color:var(--text-3);font-size:var(--text-xs)}.tcan-dots__more{font-family:var(--font-mono)}.tcan-avatar{border-radius:var(--radius-full);background:0 0;border:0;flex:none;justify-content:center;align-items:center;width:24px;height:24px;padding:0;display:inline-flex}.tcan-avatar:hover{background:var(--surface-hover)}.tcan-live{align-items:center;gap:var(--space-1);min-width:0;max-width:156px;height:20px;padding:0 var(--space-2);border-radius:var(--radius-full);background:var(--running-bg);color:var(--running-fg);font-size:var(--text-xs);font-weight:var(--weight-medium);white-space:nowrap;margin-left:auto;text-decoration:none;display:inline-flex}.tcan-live:hover{text-decoration:underline}.tcan-live__label{text-overflow:ellipsis;min-width:0;overflow:hidden}.tcan-live__dot{border-radius:var(--radius-full);background:var(--running);width:6px;height:6px;animation:tcan-pulse 1.4s var(--ease) infinite;flex:none}@keyframes tcan-pulse{50%{opacity:.35}}@media (prefers-reduced-motion:reduce){.tcan-live__dot{animation:none}}.tcan-controls{top:var(--space-2);right:var(--space-2);z-index:1;align-items:center;gap:var(--space-1);padding:var(--space-1);background:var(--surface);border:var(--hairline);border-radius:var(--radius-md);box-shadow:var(--shadow-1);display:flex;position:absolute}.tcan-zoom{min-width:5ch;color:var(--text-2);font-family:var(--font-mono);font-size:var(--text-xs);text-align:center;white-space:nowrap}.tcan-help{left:var(--space-2);bottom:var(--space-2);max-width:calc(100% - 168px - var(--space-6));padding:var(--space-0-5) var(--space-2);background:var(--surface);border-radius:var(--radius-sm);color:var(--text-3);font-size:var(--text-xs);pointer-events:none;margin:0;position:absolute}.tcan-mini{right:var(--space-2);bottom:var(--space-2);background:var(--surface);border:var(--hairline);border-radius:var(--radius-md);box-shadow:var(--shadow-1);cursor:pointer;touch-action:none;position:absolute;overflow:hidden}.tcan-mini svg{display:block}.tcan-mini__node{fill:var(--border-strong)}.tcan-mini__node--covered{fill:var(--ok)}.tcan-mini__node--partly{fill:var(--attention)}.tcan-mini__node--failing{fill:var(--outage)}.tcan-mini__view{fill:none;stroke:var(--accent-brand);stroke-width:1.5px}@media (max-width:899px){.tmap-chip,.tmap-bar .btn,.tcan-controls .btn{font-size:var(--text-xs)}}.theat-bar{margin-bottom:var(--space-3)}.theat-table{min-width:720px}.theat-table td.theat-td{padding:2px}.theat-table tbody tr{cursor:default}.theat-table tbody tr:hover{background:0 0}.theat-table tbody th.theat-name{padding:var(--space-1) var(--space-3) var(--space-1) var(--space-1);border-bottom:var(--hairline);color:var(--text);font-size:var(--text-sm);font-weight:var(--weight-medium);background:0 0;position:static}.theat-table tbody tr:last-child th.theat-name{border-bottom:0}.theat-table tbody tr.theat-page th.theat-name{padding-left:var(--space-6);font-weight:var(--weight-regular)}.theat-name__in{align-items:center;gap:var(--space-2);max-width:280px;display:flex}.theat-label{text-overflow:ellipsis;min-width:0;overflow:hidden}.theat-cell{--heat:var(--paused);width:100%;min-height:var(--row-compact);padding:0 var(--space-3);border-radius:var(--radius-sm);background:var(--surface);color:var(--text);font-family:var(--font-mono);font-size:var(--text-sm);font-variant-numeric:tabular-nums;border:0;justify-content:flex-end;align-items:center;display:flex}.theat-cell:hover{box-shadow:inset 0 0 0 1px var(--border-strong)}.theat-cell--ok{--heat:var(--ok)}.theat-cell--outage{--heat:var(--outage)}.theat-cell--attention{--heat:var(--attention)}.theat-cell--accent{--heat:var(--running)}.theat-cell--l0{color:var(--text-3)}.theat-cell--l1{background:color-mix(in oklab, var(--heat) 12%, var(--surface))}.theat-cell--l2{background:color-mix(in oklab, var(--heat) 22%, var(--surface))}.theat-cell--l3{background:color-mix(in oklab, var(--heat) 32%, var(--surface))}.theat-cell--l4{background:color-mix(in oklab, var(--heat) 44%, var(--surface));font-weight:var(--weight-semibold)}.tmap-filter{margin:0 0 var(--space-2);font-size:var(--text-sm)}.tmap-test{align-items:flex-start!important}.tmap-test__title{display:block}.tmap-test__file{color:var(--text-3);font-size:var(--text-xs);overflow-wrap:anywhere;display:block}.tmap-url{overflow-wrap:anywhere}.tmap-err{color:var(--outage-fg);font-size:var(--text-xs);overflow-wrap:anywhere;margin-top:2px;display:block}.tmap-repro{margin:var(--space-1) 0 0;padding-left:var(--space-4);color:var(--text-2);font-size:var(--text-xs)}.tmap-shots{gap:var(--space-2);grid-template-columns:repeat(auto-fill,minmax(128px,1fr));margin:0;padding:0;list-style:none;display:grid}.tmap-shot{border-radius:var(--radius-sm);cursor:zoom-in;background:0 0;border:0;width:100%;padding:0;display:block}.tmap-shot__img{aspect-ratio:16/10;width:100%}.tmap-shot__cap{color:var(--text-3);font-size:var(--text-xs);overflow-wrap:anywhere;margin-top:2px;display:block}.tmap-full{border:var(--hairline);border-radius:var(--radius-sm);max-width:100%;height:auto;display:block}.tmap-skill-actions{gap:var(--space-2);margin-bottom:var(--space-2);flex-wrap:wrap;display:flex}.tmap-skill{padding:var(--space-3);background:var(--surface-2);border:var(--hairline);border-radius:var(--radius-sm);max-height:60vh;font-family:var(--font-mono);font-size:var(--text-xs);white-space:pre-wrap;overflow-wrap:anywhere;color:var(--text);margin:0;overflow:auto}.trace-table .trace-status{white-space:nowrap;width:1%}.trace-frac{font-family:var(--font-mono);font-size:var(--text-xs);font-variant-numeric:tabular-nums;grid-template-columns:4ch auto 4ch;column-gap:.4ch;display:inline-grid}.trace-frac>:first-child{text-align:right}.trace-frac>:last-child{text-align:left}.trace-frac__sep{color:var(--text-3)}.trace-sum .ref-chip{align-self:flex-start}.tcan-mini__node--needs_tests{fill:none;stroke:var(--attention)}.tcan-mini__node--not_run{fill:var(--paused)}.tmap-gaps{margin:0 0 var(--space-3)}.tmap-gaps__act{white-space:nowrap}.tmap-shot__result{white-space:nowrap;display:block}.tmap-shot__test{color:var(--text-2);display:block}.tmap-node--gap{border-style:dashed;border-color:var(--border-strong);box-shadow:none}.tmap-st{align-items:center;gap:var(--space-1);white-space:nowrap;display:inline-flex}.tmap-st__icon{flex:none;display:inline-flex}.tmap-st__icon svg{display:block}.tmap-st__icon--covered{color:var(--ok-fg)}.tmap-st__icon--partly{color:var(--attention-fg)}.tmap-st__icon--failing{color:var(--outage-fg)}.tmap-st__icon--needs_tests{color:var(--attention-fg)}.tmap-st__icon--not_run{color:var(--paused-fg)}.tmap-st--needs_tests .status__label{color:var(--attention-fg)}.tmap-lead,.tmap-row{align-items:center;gap:var(--space-3);min-width:0;margin-bottom:var(--space-2);display:flex}.tmap-row__filters{white-space:nowrap;flex:none}.tmap-row__count{font-family:var(--font-mono)}.tmap-bar--sheet{flex-direction:column;align-items:stretch;margin:0}.tmap-bar--sheet .tmap-search,.tmap-bar--sheet .trace-filter{flex:none;min-width:0}.tmap-bar--sheet .tmap-statuses{flex:none;width:100%}.tmap-dot{flex:0 200px}.tcrumbs{scrollbar-width:none;min-width:0;overflow-x:auto}.tcrumbs ol{white-space:nowrap;align-items:center;margin:0;padding:0;list-style:none;display:flex}.tcrumbs li{align-items:center;min-width:0;display:inline-flex}.tcrumbs li+li:before{content:"/";padding:0 var(--space-2);color:var(--text-3)}.tcrumbs__go,.tcrumbs__here{text-overflow:ellipsis;white-space:nowrap;max-width:24ch;font-size:var(--text-sm);overflow:hidden}.tcrumbs__go{padding:var(--space-1) 0;color:var(--accent);cursor:pointer;background:0 0;border:0}.tcrumbs__go:hover{text-decoration:underline}.tcrumbs__here{color:var(--text);font-weight:var(--weight-semibold)}.tmap-shown{color:var(--text-3);font-family:var(--font-mono);font-size:var(--text-xs);white-space:nowrap;flex:none;margin-left:auto}.theat-details{white-space:nowrap;flex:none}.tmap-more{min-height:30px;padding:0 var(--space-3);border:1px dashed var(--border-strong);border-radius:var(--radius-md);color:var(--text-2);font-size:var(--text-sm);white-space:nowrap;background:0 0}.tcan{container-type:inline-size}.tcan-group{fill:var(--surface-2);stroke:var(--border);stroke-width:1px}.tcan-details{width:28px;height:28px;margin:var(--space-1) var(--space-1) 0 0;border-radius:var(--radius-sm);color:var(--text-3);background:0 0;border:0;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}.tcan-details:hover{background:var(--surface-hover);color:var(--text)}.tcan-node--more{border-style:dashed;border-color:var(--border-strong);background:var(--surface);box-shadow:none;justify-content:stretch}.tcan-more{width:100%;height:100%;color:var(--text-2);font-size:var(--text-sm);font-weight:var(--weight-medium);white-space:nowrap;background:0 0;border:0;flex:1}.tcan-more:hover{background:var(--surface-hover)}.tcan-btn .btn__icon{display:none}@container (width<=559px){.tcan-btn .btn__icon{display:inline-flex}.tcan-btn__word,.tcan-help{clip:rect(0, 0, 0, 0);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}.tcan-controls{left:var(--space-2);right:auto}}@media (max-width:639px){.tcan{height:calc(100dvh - 260px);min-height:420px}.tcan-mini svg{width:120px;height:80px}}.theat-map{background:var(--surface);border:var(--hairline);border-radius:var(--radius-md);height:clamp(360px,62vh,640px);position:relative;overflow:hidden}.theat-head{box-sizing:border-box;padding:0 var(--space-2);background:var(--surface-2);color:var(--text-2);font-size:var(--text-xs);font-weight:var(--weight-semibold);text-align:left;border:0;align-items:center;display:flex;position:absolute}.theat-head:hover{color:var(--text);text-decoration:underline}.theat-head__name{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.theat-tile{--tile:var(--paused);--mix:18%;box-sizing:border-box;border:2px solid var(--surface);border-radius:var(--radius-md);background:color-mix(in oklab, var(--tile) var(--mix), var(--surface));color:var(--text);text-align:left;cursor:pointer;padding:0;position:absolute;overflow:hidden;container-type:size}.theat-tile:hover{background:color-mix(in oklab, var(--tile) calc(var(--mix) + 10%), var(--surface))}.theat-tile:focus-visible{box-shadow:inset 0 0 0 2px var(--accent-brand);outline:none}.theat-tile--covered{--tile:var(--ok)}.theat-tile--partly{--tile:var(--attention)}.theat-tile--failing{--tile:var(--outage);--mix:34%}.theat-tile--needs_tests{--tile:var(--attention)}.theat-tile--not_run{--tile:var(--paused)}.theat-tile--gap{--mix:46%;outline:1.5px dashed var(--text-2);outline-offset:-5px;background-clip:padding-box}.theat-tile--gap .theat-tile__name{font-weight:var(--weight-bold,700)}.theat-tile--more{--tile:var(--paused);--mix:8%}.theat-tile__in{min-width:0;height:100%;padding:var(--space-2);box-sizing:border-box;flex-direction:column;gap:2px;display:flex}.theat-tile__head{align-items:center;gap:var(--space-1);min-width:0;display:flex}.theat-tile__name{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:var(--text-sm);font-weight:var(--weight-semibold);overflow:hidden}.theat-tile__count,.theat-tile__gaps,.theat-tile__word{text-overflow:ellipsis;white-space:nowrap;font-size:var(--text-xs);overflow:hidden}.theat-tile__count,.theat-tile__gaps{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--text-2)}.theat-tile__word{color:var(--text-2);margin-top:auto}@container (width<=139px){.theat-tile__word,.theat-tile__gaps{display:none}}@container (height<=79px){.theat-tile__word,.theat-tile__gaps{display:none}}@container (height<=47px){.theat-tile__count{display:none}}@container (width<=63px){.theat-tile__name,.theat-tile__count{display:none}.theat-tile__in{padding:var(--space-1)}}.theat-legend{align-items:center;gap:var(--space-2) var(--space-4);margin:var(--space-2) 0 0;font-size:var(--text-xs);flex-wrap:wrap;padding:0;list-style:none;display:flex}.theat-legend__item{align-items:center;gap:var(--space-1);white-space:nowrap;display:inline-flex}.theat-legend__swatch{background:color-mix(in oklab, var(--tile,var(--paused)) var(--mix,18%), var(--surface));border-radius:var(--radius-sm);cursor:default;border:0;width:14px;height:14px;display:inline-block;position:static}.theat-legend__swatch.theat-tile--gap{outline-offset:0}.theat-legend__size{color:var(--text-3);white-space:nowrap;margin-left:auto}.theat .tmap-bar .segmented__item{white-space:nowrap}@media (max-width:639px){.theat-map{height:calc(100dvh - 300px);min-height:380px}.trace--views .page__subtitle{display:none}.tcan-controls{gap:2px}}
|