tinybeeai 0.0.0-stage → 0.16.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.railway/railway.ts +83 -0
- package/.railway/tsconfig.json +13 -0
- package/AGENTS.md +102 -0
- package/Dockerfile +108 -0
- package/LICENSE +21 -0
- package/README.md +275 -2
- package/bin/localdost.js +29 -0
- package/bin/tinybeeai.js +28 -0
- package/compose.yml +63 -0
- package/demo/payloads/ci_failure.json +46 -0
- package/demo/payloads/outage.json +18 -0
- package/demo/payloads/pr_comment_edited.json +50 -0
- package/demo/payloads/pr_merged.json +80 -0
- package/demo/payloads/pr_opened.json +69 -0
- package/demo/payloads/pr_synchronize.json +69 -0
- package/demo/payloads/ticket_created.json +138 -0
- package/demo/sample-app/playwright.config.ts +20 -0
- package/demo/sample-app/server.ts +163 -0
- package/demo/sample-app/tests/checkout.spec.ts +13 -0
- package/demo/sample-app/tests/smoke.spec.ts +8 -0
- package/dist/agent/approval-retries.js +59 -0
- package/dist/agent/approval-retries.js.map +1 -0
- package/dist/agent/approvals.js +390 -0
- package/dist/agent/approvals.js.map +1 -0
- package/dist/agent/chat-bridge.js +154 -0
- package/dist/agent/chat-bridge.js.map +1 -0
- package/dist/agent/chat-lead.js +475 -0
- package/dist/agent/chat-lead.js.map +1 -0
- package/dist/agent/chat-loop.js +106 -0
- package/dist/agent/chat-loop.js.map +1 -0
- package/dist/agent/chat-mcp.js +49 -0
- package/dist/agent/chat-mcp.js.map +1 -0
- package/dist/agent/chat-tool-blocks.js +453 -0
- package/dist/agent/chat-tool-blocks.js.map +1 -0
- package/dist/agent/chat-view.js +94 -0
- package/dist/agent/chat-view.js.map +1 -0
- package/dist/agent/chat-views.js +781 -0
- package/dist/agent/chat-views.js.map +1 -0
- package/dist/agent/chat.js +1703 -0
- package/dist/agent/chat.js.map +1 -0
- package/dist/agent/destinations.js +150 -0
- package/dist/agent/destinations.js.map +1 -0
- package/dist/agent/llm-cli.js +451 -0
- package/dist/agent/llm-cli.js.map +1 -0
- package/dist/agent/llm-codex.js +493 -0
- package/dist/agent/llm-codex.js.map +1 -0
- package/dist/agent/llm-openai.js +211 -0
- package/dist/agent/llm-openai.js.map +1 -0
- package/dist/agent/llm.js +1464 -0
- package/dist/agent/llm.js.map +1 -0
- package/dist/agent/memory.js +33 -0
- package/dist/agent/memory.js.map +1 -0
- package/dist/agent/mock-views.js +93 -0
- package/dist/agent/mock-views.js.map +1 -0
- package/dist/agent/model-availability.js +207 -0
- package/dist/agent/model-availability.js.map +1 -0
- package/dist/agent/model-errors.js +188 -0
- package/dist/agent/model-errors.js.map +1 -0
- package/dist/agent/model-guard.js +311 -0
- package/dist/agent/model-guard.js.map +1 -0
- package/dist/agent/prompts.js +374 -0
- package/dist/agent/prompts.js.map +1 -0
- package/dist/agent/qa-lenses/qa-auth.md +32 -0
- package/dist/agent/qa-lenses/qa-check-then-act.md +33 -0
- package/dist/agent/qa-lenses/qa-control-has-no-effect.md +32 -0
- package/dist/agent/qa-lenses/qa-dates.md +31 -0
- package/dist/agent/qa-lenses/qa-double-submit.md +34 -0
- package/dist/agent/qa-lenses/qa-feature-flag.md +29 -0
- package/dist/agent/qa-lenses/qa-migration.md +35 -0
- package/dist/agent/qa-lenses/qa-money.md +38 -0
- package/dist/agent/qa-lenses/qa-response-shape-break.md +33 -0
- package/dist/agent/qa-lenses/qa-validation.md +29 -0
- package/dist/agent/qa-prompts.js +660 -0
- package/dist/agent/qa-prompts.js.map +1 -0
- package/dist/agent/reasoning.js +55 -0
- package/dist/agent/reasoning.js.map +1 -0
- package/dist/agent/redact.js +48 -0
- package/dist/agent/redact.js.map +1 -0
- package/dist/agent/rules.js +927 -0
- package/dist/agent/rules.js.map +1 -0
- package/dist/agent/runs.js +440 -0
- package/dist/agent/runs.js.map +1 -0
- package/dist/agent/send-retry.js +62 -0
- package/dist/agent/send-retry.js.map +1 -0
- package/dist/agent/team-notes.js +288 -0
- package/dist/agent/team-notes.js.map +1 -0
- package/dist/agent/token-meter.js +31 -0
- package/dist/agent/token-meter.js.map +1 -0
- package/dist/agent/triage.js +506 -0
- package/dist/agent/triage.js.map +1 -0
- package/dist/api.js +1047 -0
- package/dist/api.js.map +1 -0
- package/dist/approval-targets.js +107 -0
- package/dist/approval-targets.js.map +1 -0
- package/dist/bee/cloudflared.js +108 -0
- package/dist/bee/cloudflared.js.map +1 -0
- package/dist/bee/health.js +99 -0
- package/dist/bee/health.js.map +1 -0
- package/dist/bee/hive-client.js +75 -0
- package/dist/bee/hive-client.js.map +1 -0
- package/dist/bee/identity.js +39 -0
- package/dist/bee/identity.js.map +1 -0
- package/dist/bee/models.js +510 -0
- package/dist/bee/models.js.map +1 -0
- package/dist/bee/pairing.js +351 -0
- package/dist/bee/pairing.js.map +1 -0
- package/dist/bee/relay-client.js +50 -0
- package/dist/bee/relay-client.js.map +1 -0
- package/dist/bee/routes.js +214 -0
- package/dist/bee/routes.js.map +1 -0
- package/dist/bee/setup-page.js +223 -0
- package/dist/bee/setup-page.js.map +1 -0
- package/dist/bee/state.js +41 -0
- package/dist/bee/state.js.map +1 -0
- package/dist/bee/status.js +117 -0
- package/dist/bee/status.js.map +1 -0
- package/dist/bee/tunnel-manager.js +245 -0
- package/dist/bee/tunnel-manager.js.map +1 -0
- package/dist/bee/updater.js +268 -0
- package/dist/bee/updater.js.map +1 -0
- package/dist/boot.js +41 -0
- package/dist/boot.js.map +1 -0
- package/dist/call/index.js +145 -0
- package/dist/call/index.js.map +1 -0
- package/dist/case-folders.js +294 -0
- package/dist/case-folders.js.map +1 -0
- package/dist/cases.js +554 -0
- package/dist/cases.js.map +1 -0
- package/dist/chat-blocks.js +709 -0
- package/dist/chat-blocks.js.map +1 -0
- package/dist/chat-parse-util.js +38 -0
- package/dist/chat-parse-util.js.map +1 -0
- package/dist/chat-results.js +96 -0
- package/dist/chat-results.js.map +1 -0
- package/dist/chat-stats.js +193 -0
- package/dist/chat-stats.js.map +1 -0
- package/dist/chat-view-specs.js +186 -0
- package/dist/chat-view-specs.js.map +1 -0
- package/dist/cli/doctor-ops.js +361 -0
- package/dist/cli/doctor-ops.js.map +1 -0
- package/dist/cli/doctor.js +289 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/dogfood.js +70 -0
- package/dist/cli/dogfood.js.map +1 -0
- package/dist/cli/env-file.js +34 -0
- package/dist/cli/env-file.js.map +1 -0
- package/dist/cli/eval-chat-cases.js +359 -0
- package/dist/cli/eval-chat-cases.js.map +1 -0
- package/dist/cli/eval-chat-results.js +85 -0
- package/dist/cli/eval-chat-results.js.map +1 -0
- package/dist/cli/eval-chat.js +508 -0
- package/dist/cli/eval-chat.js.map +1 -0
- package/dist/cli/eval-designer.js +67 -0
- package/dist/cli/eval-designer.js.map +1 -0
- package/dist/cli/eval-qa-review.js +284 -0
- package/dist/cli/eval-qa-review.js.map +1 -0
- package/dist/cli/golden-export.js +35 -0
- package/dist/cli/golden-export.js.map +1 -0
- package/dist/cli/index.js +90 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.js +746 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/scan-repo.js +199 -0
- package/dist/cli/scan-repo.js.map +1 -0
- package/dist/cli/seed.js +108 -0
- package/dist/cli/seed.js.map +1 -0
- package/dist/cli/tinybee.js +247 -0
- package/dist/cli/tinybee.js.map +1 -0
- package/dist/config.js +138 -0
- package/dist/config.js.map +1 -0
- package/dist/connect/aivision-local.js +833 -0
- package/dist/connect/aivision-local.js.map +1 -0
- package/dist/connect/aivision-token.js +84 -0
- package/dist/connect/aivision-token.js.map +1 -0
- package/dist/connect/crypto.js +65 -0
- package/dist/connect/crypto.js.map +1 -0
- package/dist/connect/deps.js +110 -0
- package/dist/connect/deps.js.map +1 -0
- package/dist/connect/engines.js +144 -0
- package/dist/connect/engines.js.map +1 -0
- package/dist/connect/github-access.js +74 -0
- package/dist/connect/github-access.js.map +1 -0
- package/dist/connect/github-app.js +129 -0
- package/dist/connect/github-app.js.map +1 -0
- package/dist/connect/index.js +9 -0
- package/dist/connect/index.js.map +1 -0
- package/dist/connect/model-choices.js +201 -0
- package/dist/connect/model-choices.js.map +1 -0
- package/dist/connect/providers.js +900 -0
- package/dist/connect/providers.js.map +1 -0
- package/dist/connect/readiness.js +232 -0
- package/dist/connect/readiness.js.map +1 -0
- package/dist/connect/redact.js +16 -0
- package/dist/connect/redact.js.map +1 -0
- package/dist/connect/registry.js +406 -0
- package/dist/connect/registry.js.map +1 -0
- package/dist/connect/store.js +283 -0
- package/dist/connect/store.js.map +1 -0
- package/dist/connect/tunnel.js +134 -0
- package/dist/connect/tunnel.js.map +1 -0
- package/dist/connect/types.js +8 -0
- package/dist/connect/types.js.map +1 -0
- package/dist/connections/index.js +5 -0
- package/dist/connections/index.js.map +1 -0
- package/dist/connections/manager.js +223 -0
- package/dist/connections/manager.js.map +1 -0
- package/dist/connections/presets.js +264 -0
- package/dist/connections/presets.js.map +1 -0
- package/dist/connections/store.js +132 -0
- package/dist/connections/store.js.map +1 -0
- package/dist/connections/tools.js +206 -0
- package/dist/connections/tools.js.map +1 -0
- package/dist/db-schema.js +355 -0
- package/dist/db-schema.js.map +1 -0
- package/dist/db.js +379 -0
- package/dist/db.js.map +1 -0
- package/dist/delivery.js +49 -0
- package/dist/delivery.js.map +1 -0
- package/dist/deploy-wait.js +701 -0
- package/dist/deploy-wait.js.map +1 -0
- package/dist/disk.js +243 -0
- package/dist/disk.js.map +1 -0
- package/dist/dot-health.js +966 -0
- package/dist/dot-health.js.map +1 -0
- package/dist/dot-remove.js +246 -0
- package/dist/dot-remove.js.map +1 -0
- package/dist/events.js +38 -0
- package/dist/events.js.map +1 -0
- package/dist/evidence-pack.js +423 -0
- package/dist/evidence-pack.js.map +1 -0
- package/dist/flows/answers.js +289 -0
- package/dist/flows/answers.js.map +1 -0
- package/dist/flows/change.js +811 -0
- package/dist/flows/change.js.map +1 -0
- package/dist/flows/checkStatus.js +524 -0
- package/dist/flows/checkStatus.js.map +1 -0
- package/dist/flows/ci.js +236 -0
- package/dist/flows/ci.js.map +1 -0
- package/dist/flows/ciFailure.js +76 -0
- package/dist/flows/ciFailure.js.map +1 -0
- package/dist/flows/common.js +522 -0
- package/dist/flows/common.js.map +1 -0
- package/dist/flows/default-branch.js +29 -0
- package/dist/flows/default-branch.js.map +1 -0
- package/dist/flows/defectDraft.js +447 -0
- package/dist/flows/defectDraft.js.map +1 -0
- package/dist/flows/defects.js +623 -0
- package/dist/flows/defects.js.map +1 -0
- package/dist/flows/digest.js +295 -0
- package/dist/flows/digest.js.map +1 -0
- package/dist/flows/impact.js +82 -0
- package/dist/flows/impact.js.map +1 -0
- package/dist/flows/index.js +23 -0
- package/dist/flows/index.js.map +1 -0
- package/dist/flows/intent-sources.js +72 -0
- package/dist/flows/intent-sources.js.map +1 -0
- package/dist/flows/mergeCases.js +169 -0
- package/dist/flows/mergeCases.js.map +1 -0
- package/dist/flows/nightlyRun.js +82 -0
- package/dist/flows/nightlyRun.js.map +1 -0
- package/dist/flows/outage.js +64 -0
- package/dist/flows/outage.js.map +1 -0
- package/dist/flows/postMerge.js +5 -0
- package/dist/flows/postMerge.js.map +1 -0
- package/dist/flows/prCheck.js +5 -0
- package/dist/flows/prCheck.js.map +1 -0
- package/dist/flows/prTarget.js +66 -0
- package/dist/flows/prTarget.js.map +1 -0
- package/dist/flows/qa.js +363 -0
- package/dist/flows/qa.js.map +1 -0
- package/dist/flows/questions.js +160 -0
- package/dist/flows/questions.js.map +1 -0
- package/dist/flows/recovery.js +64 -0
- package/dist/flows/recovery.js.map +1 -0
- package/dist/flows/rerun.js +50 -0
- package/dist/flows/rerun.js.map +1 -0
- package/dist/flows/testDesign.js +294 -0
- package/dist/flows/testDesign.js.map +1 -0
- package/dist/flows/testDesignJob.js +46 -0
- package/dist/flows/testDesignJob.js.map +1 -0
- package/dist/flows/testRepo.js +228 -0
- package/dist/flows/testRepo.js.map +1 -0
- package/dist/flows/testSavings.js +381 -0
- package/dist/flows/testSavings.js.map +1 -0
- package/dist/flows/testStatus.js +343 -0
- package/dist/flows/testStatus.js.map +1 -0
- package/dist/flows/ticketContext.js +425 -0
- package/dist/flows/ticketContext.js.map +1 -0
- package/dist/flows/ticketReview.js +249 -0
- package/dist/flows/ticketReview.js.map +1 -0
- package/dist/flows/ticks.js +73 -0
- package/dist/flows/ticks.js.map +1 -0
- package/dist/hive/admin.js +122 -0
- package/dist/hive/admin.js.map +1 -0
- package/dist/hive/auth.js +130 -0
- package/dist/hive/auth.js.map +1 -0
- package/dist/hive/billing.js +278 -0
- package/dist/hive/billing.js.map +1 -0
- package/dist/hive/config.js +63 -0
- package/dist/hive/config.js.map +1 -0
- package/dist/hive/db.js +186 -0
- package/dist/hive/db.js.map +1 -0
- package/dist/hive/embed.js +76 -0
- package/dist/hive/embed.js.map +1 -0
- package/dist/hive/errors.js +17 -0
- package/dist/hive/errors.js.map +1 -0
- package/dist/hive/google.js +75 -0
- package/dist/hive/google.js.map +1 -0
- package/dist/hive/index.js +25 -0
- package/dist/hive/index.js.map +1 -0
- package/dist/hive/jwt.js +57 -0
- package/dist/hive/jwt.js.map +1 -0
- package/dist/hive/keys.js +61 -0
- package/dist/hive/keys.js.map +1 -0
- package/dist/hive/mail.js +27 -0
- package/dist/hive/mail.js.map +1 -0
- package/dist/hive/native-push.js +255 -0
- package/dist/hive/native-push.js.map +1 -0
- package/dist/hive/pairing.js +342 -0
- package/dist/hive/pairing.js.map +1 -0
- package/dist/hive/presence.js +121 -0
- package/dist/hive/presence.js.map +1 -0
- package/dist/hive/push.js +185 -0
- package/dist/hive/push.js.map +1 -0
- package/dist/hive/relay.js +205 -0
- package/dist/hive/relay.js.map +1 -0
- package/dist/hive/routes.js +228 -0
- package/dist/hive/routes.js.map +1 -0
- package/dist/hive/server.js +12 -0
- package/dist/hive/server.js.map +1 -0
- package/dist/hive/session.js +28 -0
- package/dist/hive/session.js.map +1 -0
- package/dist/hive/tenants.js +287 -0
- package/dist/hive/tenants.js.map +1 -0
- package/dist/hive/tunnel/cloudflare.js +160 -0
- package/dist/hive/tunnel/cloudflare.js.map +1 -0
- package/dist/hive/tunnel/mock.js +52 -0
- package/dist/hive/tunnel/mock.js.map +1 -0
- package/dist/hive/tunnel/provider.js +19 -0
- package/dist/hive/tunnel/provider.js.map +1 -0
- package/dist/hive/updates.js +61 -0
- package/dist/hive/updates.js.map +1 -0
- package/dist/http-error.js +11 -0
- package/dist/http-error.js.map +1 -0
- package/dist/impact/classify.js +226 -0
- package/dist/impact/classify.js.map +1 -0
- package/dist/impact/find.js +259 -0
- package/dist/impact/find.js.map +1 -0
- package/dist/impact/pr.js +54 -0
- package/dist/impact/pr.js.map +1 -0
- package/dist/impact/store.js +365 -0
- package/dist/impact/store.js.map +1 -0
- package/dist/impact/text.js +158 -0
- package/dist/impact/text.js.map +1 -0
- package/dist/index.js +288 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/adf.js +397 -0
- package/dist/integrations/adf.js.map +1 -0
- package/dist/integrations/bot-marker.js +103 -0
- package/dist/integrations/bot-marker.js.map +1 -0
- package/dist/integrations/github-issues.js +705 -0
- package/dist/integrations/github-issues.js.map +1 -0
- package/dist/integrations/github.js +1284 -0
- package/dist/integrations/github.js.map +1 -0
- package/dist/integrations/issue-create.js +60 -0
- package/dist/integrations/issue-create.js.map +1 -0
- package/dist/integrations/jira.js +279 -0
- package/dist/integrations/jira.js.map +1 -0
- package/dist/integrations/linear.js +273 -0
- package/dist/integrations/linear.js.map +1 -0
- package/dist/integrations/own-identity-warm.js +47 -0
- package/dist/integrations/own-identity-warm.js.map +1 -0
- package/dist/integrations/own-identity.js +39 -0
- package/dist/integrations/own-identity.js.map +1 -0
- package/dist/integrations/status-change.js +42 -0
- package/dist/integrations/status-change.js.map +1 -0
- package/dist/lead-defects.js +202 -0
- package/dist/lead-defects.js.map +1 -0
- package/dist/lead-digest.js +333 -0
- package/dist/lead-digest.js.map +1 -0
- package/dist/lead-release.js +286 -0
- package/dist/lead-release.js.map +1 -0
- package/dist/lead.js +328 -0
- package/dist/lead.js.map +1 -0
- package/dist/legacy-names.js +51 -0
- package/dist/legacy-names.js.map +1 -0
- package/dist/limits.js +44 -0
- package/dist/limits.js.map +1 -0
- package/dist/link-trust.js +224 -0
- package/dist/link-trust.js.map +1 -0
- package/dist/links.js +219 -0
- package/dist/links.js.map +1 -0
- package/dist/loopback.js +35 -0
- package/dist/loopback.js.map +1 -0
- package/dist/model-cap.js +60 -0
- package/dist/model-cap.js.map +1 -0
- package/dist/model-usage.js +173 -0
- package/dist/model-usage.js.map +1 -0
- package/dist/monitor/backfill.js +39 -0
- package/dist/monitor/backfill.js.map +1 -0
- package/dist/monitor/browser-probe.js +198 -0
- package/dist/monitor/browser-probe.js.map +1 -0
- package/dist/monitor/catch-up.js +31 -0
- package/dist/monitor/catch-up.js.map +1 -0
- package/dist/monitor/pollers.js +1606 -0
- package/dist/monitor/pollers.js.map +1 -0
- package/dist/monitor/probes.js +178 -0
- package/dist/monitor/probes.js.map +1 -0
- package/dist/monitor/self-health.js +228 -0
- package/dist/monitor/self-health.js.map +1 -0
- package/dist/monitor/statuspage.js +105 -0
- package/dist/monitor/statuspage.js.map +1 -0
- package/dist/nightly-scheduler.js +127 -0
- package/dist/nightly-scheduler.js.map +1 -0
- package/dist/nightly.js +141 -0
- package/dist/nightly.js.map +1 -0
- package/dist/notify/headline.js +114 -0
- package/dist/notify/headline.js.map +1 -0
- package/dist/notify/push.js +174 -0
- package/dist/notify/push.js.map +1 -0
- package/dist/object-cards.js +585 -0
- package/dist/object-cards.js.map +1 -0
- package/dist/object-links.js +47 -0
- package/dist/object-links.js.map +1 -0
- package/dist/onboarding-checks.js +141 -0
- package/dist/onboarding-checks.js.map +1 -0
- package/dist/onboarding.js +401 -0
- package/dist/onboarding.js.map +1 -0
- package/dist/path-filters.js +62 -0
- package/dist/path-filters.js.map +1 -0
- package/dist/phone/alerts.js +67 -0
- package/dist/phone/alerts.js.map +1 -0
- package/dist/phone/auth.js +240 -0
- package/dist/phone/auth.js.map +1 -0
- package/dist/phone/pairing.js +442 -0
- package/dist/phone/pairing.js.map +1 -0
- package/dist/phone/prefs.js +27 -0
- package/dist/phone/prefs.js.map +1 -0
- package/dist/phone/tailscale.js +161 -0
- package/dist/phone/tailscale.js.map +1 -0
- package/dist/pr-scope.js +441 -0
- package/dist/pr-scope.js.map +1 -0
- package/dist/proc.js +156 -0
- package/dist/proc.js.map +1 -0
- package/dist/profile/cache.js +108 -0
- package/dist/profile/cache.js.map +1 -0
- package/dist/profile/ci.js +216 -0
- package/dist/profile/ci.js.map +1 -0
- package/dist/profile/index.js +8 -0
- package/dist/profile/index.js.map +1 -0
- package/dist/profile/job.js +135 -0
- package/dist/profile/job.js.map +1 -0
- package/dist/profile/queries/go-tags.scm +47 -0
- package/dist/profile/queries/java-tags.scm +25 -0
- package/dist/profile/queries/javascript-tags.scm +104 -0
- package/dist/profile/queries/python-tags.scm +19 -0
- package/dist/profile/queries/typescript-tags.scm +28 -0
- package/dist/profile/scan-thread.js +42 -0
- package/dist/profile/scan-thread.js.map +1 -0
- package/dist/profile/scan-worker.js +16 -0
- package/dist/profile/scan-worker.js.map +1 -0
- package/dist/profile/scan.js +351 -0
- package/dist/profile/scan.js.map +1 -0
- package/dist/profile/stack.js +528 -0
- package/dist/profile/stack.js.map +1 -0
- package/dist/profile/store.js +35 -0
- package/dist/profile/store.js.map +1 -0
- package/dist/profile/tests.js +399 -0
- package/dist/profile/tests.js.map +1 -0
- package/dist/queue.js +350 -0
- package/dist/queue.js.map +1 -0
- package/dist/refs.js +756 -0
- package/dist/refs.js.map +1 -0
- package/dist/release-notes.js +272 -0
- package/dist/release-notes.js.map +1 -0
- package/dist/reports/build.js +243 -0
- package/dist/reports/build.js.map +1 -0
- package/dist/reports/index.js +211 -0
- package/dist/reports/index.js.map +1 -0
- package/dist/reports/store.js +150 -0
- package/dist/reports/store.js.map +1 -0
- package/dist/reports/ticket-titles.js +124 -0
- package/dist/reports/ticket-titles.js.map +1 -0
- package/dist/reports/trace-map.js +1278 -0
- package/dist/reports/trace-map.js.map +1 -0
- package/dist/reports/traceability.js +422 -0
- package/dist/reports/traceability.js.map +1 -0
- package/dist/repos/mirror.js +356 -0
- package/dist/repos/mirror.js.map +1 -0
- package/dist/repos-github.js +108 -0
- package/dist/repos-github.js.map +1 -0
- package/dist/repos.js +891 -0
- package/dist/repos.js.map +1 -0
- package/dist/review/backend-anthropic.js +90 -0
- package/dist/review/backend-anthropic.js.map +1 -0
- package/dist/review/backend-cli.js +248 -0
- package/dist/review/backend-cli.js.map +1 -0
- package/dist/review/backend-codex.js +81 -0
- package/dist/review/backend-codex.js.map +1 -0
- package/dist/review/backend-mock.js +686 -0
- package/dist/review/backend-mock.js.map +1 -0
- package/dist/review/backend-only.js +168 -0
- package/dist/review/backend-only.js.map +1 -0
- package/dist/review/backend.js +105 -0
- package/dist/review/backend.js.map +1 -0
- package/dist/review/baseline/render-v1.js +483 -0
- package/dist/review/baseline/render-v1.js.map +1 -0
- package/dist/review/change-summary.js +197 -0
- package/dist/review/change-summary.js.map +1 -0
- package/dist/review/changelog.js +40 -0
- package/dist/review/changelog.js.map +1 -0
- package/dist/review/check.js +494 -0
- package/dist/review/check.js.map +1 -0
- package/dist/review/checkout.js +185 -0
- package/dist/review/checkout.js.map +1 -0
- package/dist/review/classify.js +178 -0
- package/dist/review/classify.js.map +1 -0
- package/dist/review/coverage.js +347 -0
- package/dist/review/coverage.js.map +1 -0
- package/dist/review/decision-eval.js +121 -0
- package/dist/review/decision-eval.js.map +1 -0
- package/dist/review/deliver.js +104 -0
- package/dist/review/deliver.js.map +1 -0
- package/dist/review/designer-eval.js +280 -0
- package/dist/review/designer-eval.js.map +1 -0
- package/dist/review/dogfood-digest.js +136 -0
- package/dist/review/dogfood-digest.js.map +1 -0
- package/dist/review/dogfood-eval.js +486 -0
- package/dist/review/dogfood-eval.js.map +1 -0
- package/dist/review/environment.js +109 -0
- package/dist/review/environment.js.map +1 -0
- package/dist/review/eval.js +405 -0
- package/dist/review/eval.js.map +1 -0
- package/dist/review/glob.js +110 -0
- package/dist/review/glob.js.map +1 -0
- package/dist/review/golden-export.js +219 -0
- package/dist/review/golden-export.js.map +1 -0
- package/dist/review/impact.js +406 -0
- package/dist/review/impact.js.map +1 -0
- package/dist/review/imports.js +542 -0
- package/dist/review/imports.js.map +1 -0
- package/dist/review/index.js +512 -0
- package/dist/review/index.js.map +1 -0
- package/dist/review/intent.js +128 -0
- package/dist/review/intent.js.map +1 -0
- package/dist/review/lenses.js +167 -0
- package/dist/review/lenses.js.map +1 -0
- package/dist/review/linked-tickets.js +293 -0
- package/dist/review/linked-tickets.js.map +1 -0
- package/dist/review/merge.js +370 -0
- package/dist/review/merge.js.map +1 -0
- package/dist/review/on-demand.js +218 -0
- package/dist/review/on-demand.js.map +1 -0
- package/dist/review/prompt-eval.js +299 -0
- package/dist/review/prompt-eval.js.map +1 -0
- package/dist/review/prompt-variants.js +37 -0
- package/dist/review/prompt-variants.js.map +1 -0
- package/dist/review/readability-eval.js +217 -0
- package/dist/review/readability-eval.js.map +1 -0
- package/dist/review/readability.js +295 -0
- package/dist/review/readability.js.map +1 -0
- package/dist/review/render.js +2409 -0
- package/dist/review/render.js.map +1 -0
- package/dist/review/repo.js +194 -0
- package/dist/review/repo.js.map +1 -0
- package/dist/review/report-plan.js +90 -0
- package/dist/review/report-plan.js.map +1 -0
- package/dist/review/routes.js +195 -0
- package/dist/review/routes.js.map +1 -0
- package/dist/review/run-summary.js +34 -0
- package/dist/review/run-summary.js.map +1 -0
- package/dist/review/run.js +245 -0
- package/dist/review/run.js.map +1 -0
- package/dist/review/scope.js +454 -0
- package/dist/review/scope.js.map +1 -0
- package/dist/review/security.js +432 -0
- package/dist/review/security.js.map +1 -0
- package/dist/review/signals.js +550 -0
- package/dist/review/signals.js.map +1 -0
- package/dist/review/specs.js +150 -0
- package/dist/review/specs.js.map +1 -0
- package/dist/review/ste.js +133 -0
- package/dist/review/ste.js.map +1 -0
- package/dist/review/test-repo-file.js +18 -0
- package/dist/review/test-repo-file.js.map +1 -0
- package/dist/review/test-repo-lines.js +53 -0
- package/dist/review/test-repo-lines.js.map +1 -0
- package/dist/review/ticket-on-demand.js +232 -0
- package/dist/review/ticket-on-demand.js.map +1 -0
- package/dist/review/yaml.js +298 -0
- package/dist/review/yaml.js.map +1 -0
- package/dist/room.js +361 -0
- package/dist/room.js.map +1 -0
- package/dist/routes/activity.js +219 -0
- package/dist/routes/activity.js.map +1 -0
- package/dist/routes/call.js +29 -0
- package/dist/routes/call.js.map +1 -0
- package/dist/routes/cards.js +40 -0
- package/dist/routes/cards.js.map +1 -0
- package/dist/routes/cases.js +133 -0
- package/dist/routes/cases.js.map +1 -0
- package/dist/routes/connect.js +268 -0
- package/dist/routes/connect.js.map +1 -0
- package/dist/routes/connection-presets.js +32 -0
- package/dist/routes/connection-presets.js.map +1 -0
- package/dist/routes/connections.js +177 -0
- package/dist/routes/connections.js.map +1 -0
- package/dist/routes/disk.js +19 -0
- package/dist/routes/disk.js.map +1 -0
- package/dist/routes/docs.js +71 -0
- package/dist/routes/docs.js.map +1 -0
- package/dist/routes/dot-suggest.js +1002 -0
- package/dist/routes/dot-suggest.js.map +1 -0
- package/dist/routes/evidence-pack.js +16 -0
- package/dist/routes/evidence-pack.js.map +1 -0
- package/dist/routes/health.js +121 -0
- package/dist/routes/health.js.map +1 -0
- package/dist/routes/impact.js +48 -0
- package/dist/routes/impact.js.map +1 -0
- package/dist/routes/lead.js +50 -0
- package/dist/routes/lead.js.map +1 -0
- package/dist/routes/links.js +13 -0
- package/dist/routes/links.js.map +1 -0
- package/dist/routes/markdown.js +62 -0
- package/dist/routes/markdown.js.map +1 -0
- package/dist/routes/onboarding.js +47 -0
- package/dist/routes/onboarding.js.map +1 -0
- package/dist/routes/phone.js +231 -0
- package/dist/routes/phone.js.map +1 -0
- package/dist/routes/release-notes.js +30 -0
- package/dist/routes/release-notes.js.map +1 -0
- package/dist/routes/reports.js +102 -0
- package/dist/routes/reports.js.map +1 -0
- package/dist/routes/repos.js +91 -0
- package/dist/routes/repos.js.map +1 -0
- package/dist/routes/review.js +283 -0
- package/dist/routes/review.js.map +1 -0
- package/dist/routes/roles.js +114 -0
- package/dist/routes/roles.js.map +1 -0
- package/dist/routes/room.js +21 -0
- package/dist/routes/room.js.map +1 -0
- package/dist/routes/runner.js +156 -0
- package/dist/routes/runner.js.map +1 -0
- package/dist/routes/runs.js +84 -0
- package/dist/routes/runs.js.map +1 -0
- package/dist/routes/setup.js +18 -0
- package/dist/routes/setup.js.map +1 -0
- package/dist/routes/test-runs.js +220 -0
- package/dist/routes/test-runs.js.map +1 -0
- package/dist/routes/ticket-status.js +17 -0
- package/dist/routes/ticket-status.js.map +1 -0
- package/dist/routes/traceability.js +143 -0
- package/dist/routes/traceability.js.map +1 -0
- package/dist/routes/true.js +142 -0
- package/dist/routes/true.js.map +1 -0
- package/dist/routes/updates.js +70 -0
- package/dist/routes/updates.js.map +1 -0
- package/dist/runner/adapters/index.js +12 -0
- package/dist/runner/adapters/index.js.map +1 -0
- package/dist/runner/adapters/playwright.js +68 -0
- package/dist/runner/adapters/playwright.js.map +1 -0
- package/dist/runner/aivision/cases.js +172 -0
- package/dist/runner/aivision/cases.js.map +1 -0
- package/dist/runner/aivision/cli.js +201 -0
- package/dist/runner/aivision/cli.js.map +1 -0
- package/dist/runner/aivision/index.js +281 -0
- package/dist/runner/aivision/index.js.map +1 -0
- package/dist/runner/aivision/server.js +394 -0
- package/dist/runner/aivision/server.js.map +1 -0
- package/dist/runner/aivision/shared.js +140 -0
- package/dist/runner/aivision/shared.js.map +1 -0
- package/dist/runner/artifact-cap.js +189 -0
- package/dist/runner/artifact-cap.js.map +1 -0
- package/dist/runner/artifacts.js +433 -0
- package/dist/runner/artifacts.js.map +1 -0
- package/dist/runner/command.js +564 -0
- package/dist/runner/command.js.map +1 -0
- package/dist/runner/copyfiles.js +221 -0
- package/dist/runner/copyfiles.js.map +1 -0
- package/dist/runner/engines.js +32 -0
- package/dist/runner/engines.js.map +1 -0
- package/dist/runner/evidence.js +114 -0
- package/dist/runner/evidence.js.map +1 -0
- package/dist/runner/host-env.js +160 -0
- package/dist/runner/host-env.js.map +1 -0
- package/dist/runner/index.js +1221 -0
- package/dist/runner/index.js.map +1 -0
- package/dist/runner/observe.js +603 -0
- package/dist/runner/observe.js.map +1 -0
- package/dist/runner/playwright-json.js +108 -0
- package/dist/runner/playwright-json.js.map +1 -0
- package/dist/runner/pwgen/exec.js +192 -0
- package/dist/runner/pwgen/exec.js.map +1 -0
- package/dist/runner/pwgen/explore.js +111 -0
- package/dist/runner/pwgen/explore.js.map +1 -0
- package/dist/runner/pwgen/index.js +423 -0
- package/dist/runner/pwgen/index.js.map +1 -0
- package/dist/runner/pwgen/propose.js +69 -0
- package/dist/runner/pwgen/propose.js.map +1 -0
- package/dist/runner/pwgen/source.js +632 -0
- package/dist/runner/pwgen/source.js.map +1 -0
- package/dist/runner/setup.js +222 -0
- package/dist/runner/setup.js.map +1 -0
- package/dist/runner/step-reporter.js +107 -0
- package/dist/runner/step-reporter.js.map +1 -0
- package/dist/runner/test-repo.js +326 -0
- package/dist/runner/test-repo.js.map +1 -0
- package/dist/runner/typed-value.js +46 -0
- package/dist/runner/typed-value.js.map +1 -0
- package/dist/runner/verify.js +133 -0
- package/dist/runner/verify.js.map +1 -0
- package/dist/runner/worktree.js +349 -0
- package/dist/runner/worktree.js.map +1 -0
- package/dist/sandbox.js +61 -0
- package/dist/sandbox.js.map +1 -0
- package/dist/server.js +262 -0
- package/dist/server.js.map +1 -0
- package/dist/shadow-week.js +126 -0
- package/dist/shadow-week.js.map +1 -0
- package/dist/shutdown.js +92 -0
- package/dist/shutdown.js.map +1 -0
- package/dist/slack/index.js +645 -0
- package/dist/slack/index.js.map +1 -0
- package/dist/stages/config.js +147 -0
- package/dist/stages/config.js.map +1 -0
- package/dist/stages/index.js +41 -0
- package/dist/stages/index.js.map +1 -0
- package/dist/suites.js +293 -0
- package/dist/suites.js.map +1 -0
- package/dist/target-url.js +116 -0
- package/dist/target-url.js.map +1 -0
- package/dist/test-runs.js +662 -0
- package/dist/test-runs.js.map +1 -0
- package/dist/ticket-keys.js +97 -0
- package/dist/ticket-keys.js.map +1 -0
- package/dist/ticket-supersede.js +105 -0
- package/dist/ticket-supersede.js.map +1 -0
- package/dist/tinybee/ed25519.js +99 -0
- package/dist/tinybee/ed25519.js.map +1 -0
- package/dist/tinybee/models-routes.js +19 -0
- package/dist/tinybee/models-routes.js.map +1 -0
- package/dist/tinybee/pair-payload.js +41 -0
- package/dist/tinybee/pair-payload.js.map +1 -0
- package/dist/tinybee/update-manifest.js +77 -0
- package/dist/tinybee/update-manifest.js.map +1 -0
- package/dist/tinybee/well-known.js +64 -0
- package/dist/tinybee/well-known.js.map +1 -0
- package/dist/tinybee/workflows/activity.js +23 -0
- package/dist/tinybee/workflows/activity.js.map +1 -0
- package/dist/tinybee/workflows/cron.js +210 -0
- package/dist/tinybee/workflows/cron.js.map +1 -0
- package/dist/tinybee/workflows/engine.js +371 -0
- package/dist/tinybee/workflows/engine.js.map +1 -0
- package/dist/tinybee/workflows/from-text.js +203 -0
- package/dist/tinybee/workflows/from-text.js.map +1 -0
- package/dist/tinybee/workflows/routes.js +189 -0
- package/dist/tinybee/workflows/routes.js.map +1 -0
- package/dist/tinybee/workflows/scheduler.js +100 -0
- package/dist/tinybee/workflows/scheduler.js.map +1 -0
- package/dist/tinybee/workflows/skills.js +227 -0
- package/dist/tinybee/workflows/skills.js.map +1 -0
- package/dist/tinybee/workflows/store.js +205 -0
- package/dist/tinybee/workflows/store.js.map +1 -0
- package/dist/tinybee/workflows/types.js +180 -0
- package/dist/tinybee/workflows/types.js.map +1 -0
- package/dist/tinybee/workflows/yaml.js +323 -0
- package/dist/tinybee/workflows/yaml.js.map +1 -0
- package/dist/true/api.js +495 -0
- package/dist/true/api.js.map +1 -0
- package/dist/true/client.js +292 -0
- package/dist/true/client.js.map +1 -0
- package/dist/true/clock.js +36 -0
- package/dist/true/clock.js.map +1 -0
- package/dist/true/events.js +125 -0
- package/dist/true/events.js.map +1 -0
- package/dist/true/hosts.js +98 -0
- package/dist/true/hosts.js.map +1 -0
- package/dist/true/index.js +29 -0
- package/dist/true/index.js.map +1 -0
- package/dist/true/key.js +54 -0
- package/dist/true/key.js.map +1 -0
- package/dist/true/line.js +69 -0
- package/dist/true/line.js.map +1 -0
- package/dist/true/mask.js +31 -0
- package/dist/true/mask.js.map +1 -0
- package/dist/true/names.js +114 -0
- package/dist/true/names.js.map +1 -0
- package/dist/true/outbox.js +233 -0
- package/dist/true/outbox.js.map +1 -0
- package/dist/true/replay.js +164 -0
- package/dist/true/replay.js.map +1 -0
- package/dist/true/settings.js +123 -0
- package/dist/true/settings.js.map +1 -0
- package/dist/true/status.js +189 -0
- package/dist/true/status.js.map +1 -0
- package/dist/true/sync-cases.js +222 -0
- package/dist/true/sync-cases.js.map +1 -0
- package/dist/true/sync-manual.js +295 -0
- package/dist/true/sync-manual.js.map +1 -0
- package/dist/true/sync-runs.js +109 -0
- package/dist/true/sync-runs.js.map +1 -0
- package/dist/true/worker.js +414 -0
- package/dist/true/worker.js.map +1 -0
- package/dist/types.js +32 -0
- package/dist/types.js.map +1 -0
- package/dist/updates/asks.js +38 -0
- package/dist/updates/asks.js.map +1 -0
- package/dist/updates/index.js +835 -0
- package/dist/updates/index.js.map +1 -0
- package/dist/updates/owner.js +24 -0
- package/dist/updates/owner.js.map +1 -0
- package/dist/updates/prefs.js +118 -0
- package/dist/updates/prefs.js.map +1 -0
- package/dist/updates/route.js +78 -0
- package/dist/updates/route.js.map +1 -0
- package/dist/updates/sources.js +345 -0
- package/dist/updates/sources.js.map +1 -0
- package/dist/updates/words.js +452 -0
- package/dist/updates/words.js.map +1 -0
- package/dist/version.js +53 -0
- package/dist/version.js.map +1 -0
- package/dist/view-compute.js +382 -0
- package/dist/view-compute.js.map +1 -0
- package/dist/view-spec.js +894 -0
- package/dist/view-spec.js.map +1 -0
- package/dist/web/apple-touch-icon.png +0 -0
- package/dist/web/assets/ApprovalCard-Br_z5z7G.css +1 -0
- package/dist/web/assets/ApprovalCard-CfGhGFo_.js +3 -0
- package/dist/web/assets/CardFromRef-BaTGmZ9c.js +2 -0
- package/dist/web/assets/CardFromRef-DO7i2uDd.css +1 -0
- package/dist/web/assets/Cases-8l_6UcLh.js +2 -0
- package/dist/web/assets/Cases-CpfED0uB.css +1 -0
- package/dist/web/assets/Chat-BKDiR0qt.js +3 -0
- package/dist/web/assets/Chat-DxjdyYUu.css +1 -0
- package/dist/web/assets/ConfirmDialog-CIMveD-b.js +2 -0
- package/dist/web/assets/ConnectSheet-Cm5vbZdR.js +4 -0
- package/dist/web/assets/Docs-HKGuY0WE.js +2 -0
- package/dist/web/assets/Docs-fodKx8S7.css +1 -0
- package/dist/web/assets/DotDetail-DskS3NWe.js +2 -0
- package/dist/web/assets/DotDetail-OWRSD_1x.css +1 -0
- package/dist/web/assets/DotStage-BZDclfzV.css +1 -0
- package/dist/web/assets/DotStage-CtMNzCN3.js +2 -0
- package/dist/web/assets/Dots-BqCsS34m.js +2 -0
- package/dist/web/assets/EvidencePack-DQ3kCJX4.js +2 -0
- package/dist/web/assets/EvidencePack-DV_9ETsA.css +1 -0
- package/dist/web/assets/FailedDeliveries-1F2kFcs9.js +2 -0
- package/dist/web/assets/FailedDeliveries-DXa2_VvI.css +1 -0
- package/dist/web/assets/Feed-5wiHRTFK.js +2 -0
- package/dist/web/assets/GfmView-C-NYaduC.js +4 -0
- package/dist/web/assets/ImpactList-C-RNuDB0.js +2 -0
- package/dist/web/assets/ImpactList-C612dFdw.css +1 -0
- package/dist/web/assets/Inbox-kc1bKVL_.js +2 -0
- package/dist/web/assets/JoinScreen-C3L4wmP3.js +2 -0
- package/dist/web/assets/JoinScreen-COeAUv5v.css +1 -0
- package/dist/web/assets/LeadDialog-N3Zul9Rw.js +8 -0
- package/dist/web/assets/LeadDialog-xyWjAuAS.css +1 -0
- package/dist/web/assets/ListeningLine-BRFNaczY.js +2 -0
- package/dist/web/assets/ListeningLine-pN8CgyiK.css +1 -0
- package/dist/web/assets/Mascots-pIyGpxtD.js +2 -0
- package/dist/web/assets/ModelChoices-BxO1zyyr.js +2 -0
- package/dist/web/assets/ModelChoices-DQJnVxfs.css +1 -0
- package/dist/web/assets/NewDotDialog-CDPUWmgN.js +2 -0
- package/dist/web/assets/NewDotDialog-DrPPqkSZ.css +1 -0
- package/dist/web/assets/NewTestRunDialog-BQBthVHE.js +2 -0
- package/dist/web/assets/NoBreakNames-Csxdqdt6.js +2 -0
- package/dist/web/assets/Pair-omex_K7H.js +2 -0
- package/dist/web/assets/PushSection-CmqHlE_2.js +2 -0
- package/dist/web/assets/ReleaseNotes-B6VqFewP.js +2 -0
- package/dist/web/assets/ReleaseNotes-DBJUL7Vm.css +1 -0
- package/dist/web/assets/ReportPage-BHS1xWEt.js +162 -0
- package/dist/web/assets/Reports-BEHnDIb1.js +2 -0
- package/dist/web/assets/ReviewChangeDialog-BVSt-cw-.js +2 -0
- package/dist/web/assets/ReviewChangeDialog-BbIlHRx0.css +1 -0
- package/dist/web/assets/Room-BoG_uge4.js +2 -0
- package/dist/web/assets/Room-evAfiW_e.css +1 -0
- package/dist/web/assets/RunActions-ZY7yf1AF.js +2 -0
- package/dist/web/assets/RunDetail-C8St20GQ.css +1 -0
- package/dist/web/assets/RunDetail-qADXjBvd.js +9 -0
- package/dist/web/assets/RunRow-BKEJv8ib.js +2 -0
- package/dist/web/assets/RunnerTry-Dgpp67-s.js +6 -0
- package/dist/web/assets/RunnerTry-DsweWOfO.css +1 -0
- package/dist/web/assets/Settings-fs-QJwNM.js +2 -0
- package/dist/web/assets/Setup-DI6hBEP-.js +2 -0
- package/dist/web/assets/TestRows-wh03T5Li.js +4 -0
- package/dist/web/assets/TestRun-DTOyF-Pv.js +2 -0
- package/dist/web/assets/TestRuns-ggDjm1Q8.js +2 -0
- package/dist/web/assets/TinyBeeAddLaptop-bc3pmh3T.js +2 -0
- package/dist/web/assets/TinyBeeAi-CkyOzhm5.js +2 -0
- package/dist/web/assets/TinyBeeConnections-B2K_P38u.js +2 -0
- package/dist/web/assets/TinyBeeHome-DSpxX5KS.js +3 -0
- package/dist/web/assets/TinyBeePlan-BamiLziu.js +2 -0
- package/dist/web/assets/TinyBeeSignup-vHcz0Wen.js +2 -0
- package/dist/web/assets/TinyBeeSkills-By9RLUse.js +2 -0
- package/dist/web/assets/TinyBeeWorkflow-DeNO7Jsh.js +2 -0
- package/dist/web/assets/TinyBeeWorkflowEditor-B6OGC2OT.js +2 -0
- package/dist/web/assets/TinyBeeWorkflows-BN4-h6lt.js +2 -0
- package/dist/web/assets/Trace-BBCI1aIB.css +1 -0
- package/dist/web/assets/Trace-aF92UWaH.js +2 -0
- package/dist/web/assets/UpdatesSection-CCWEbkue.js +2 -0
- package/dist/web/assets/Welcome-CCcy558Q.js +2 -0
- package/dist/web/assets/activity-C3qilrDm.css +1 -0
- package/dist/web/assets/activity-CBfTSxqw.js +2 -0
- package/dist/web/assets/authedMedia-BTYt_tyu.js +2 -0
- package/dist/web/assets/beeApi-BHW8Tx1s.js +2 -0
- package/dist/web/assets/data-CmXvx3Mj.js +2 -0
- package/dist/web/assets/engines-CfdJODFj.css +1 -0
- package/dist/web/assets/format-BBZ8vFyT.js +2 -0
- package/dist/web/assets/forms-Coc7p2UF.css +1 -0
- package/dist/web/assets/hivePush-DZJDokj7.js +2 -0
- package/dist/web/assets/impactModel-MY1OFuiP.js +2 -0
- package/dist/web/assets/index-B6qKm1NW.js +13 -0
- package/dist/web/assets/index-BvKyT1X7.css +1 -0
- package/dist/web/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
- package/dist/web/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
- package/dist/web/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
- package/dist/web/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
- package/dist/web/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
- package/dist/web/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
- package/dist/web/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
- package/dist/web/assets/lead-BL_P_kri.css +1 -0
- package/dist/web/assets/model-BIQy5IVG.js +2 -0
- package/dist/web/assets/modelsApi-PUSySRQw.js +2 -0
- package/dist/web/assets/newDotModel-BaLLyw57.js +2 -0
- package/dist/web/assets/onboarding-bfKqnM4Z.css +1 -0
- package/dist/web/assets/phone-Rs7FoyG0.css +1 -0
- package/dist/web/assets/phoneApi-BG_1-M-D.js +3 -0
- package/dist/web/assets/releaseModel-EynYMVOC.js +2 -0
- package/dist/web/assets/releaseNotesModel-A1Rtv3cV.js +2 -0
- package/dist/web/assets/reports-BWaA1HhM.js +37 -0
- package/dist/web/assets/reports-DXwdWQsB.css +1 -0
- package/dist/web/assets/router-W6nZsQ33.js +2 -0
- package/dist/web/assets/runs-BY0Owv93.css +1 -0
- package/dist/web/assets/shadowWeekModel-BUUiww09.js +2 -0
- package/dist/web/assets/storage-yvL36AWt.js +2 -0
- package/dist/web/assets/store-IqrqHuFR.js +2 -0
- package/dist/web/assets/testruns-BzIZ0cR0.css +1 -0
- package/dist/web/assets/testruns-DyaqX4ji.js +2 -0
- package/dist/web/assets/true-9Q68cs5b.js +2 -0
- package/dist/web/assets/true-DPGBpoir.css +1 -0
- package/dist/web/assets/ui-DcmhYyYp.js +13 -0
- package/dist/web/assets/ui-DxEDgbIx.css +1 -0
- package/dist/web/assets/usePauseDot-BV60ZVy1.js +2 -0
- package/dist/web/assets/usePauseDot-NrSzMI1C.css +1 -0
- package/dist/web/assets/usePush-Dsm-TjlG.js +2 -0
- package/dist/web/assets/useRefChips-CbafNx59.js +68 -0
- package/dist/web/assets/useRestoreDot-D0B6W82H.js +2 -0
- package/dist/web/assets/view-worker-pyeVAhUT.js +2 -0
- package/dist/web/assets/workflowUi-QYsd3n9J.js +2 -0
- package/dist/web/favicon.png +0 -0
- package/dist/web/icon-192.png +0 -0
- package/dist/web/icon-512.png +0 -0
- package/dist/web/icon-maskable-512.png +0 -0
- package/dist/web/index.html +45 -0
- package/dist/web/manifest.webmanifest +23 -0
- package/dist/web/mascots/argus-attention.svg +7 -0
- package/dist/web/mascots/argus-ok.svg +7 -0
- package/dist/web/mascots/argus-outage.svg +7 -0
- package/dist/web/mascots/argus-running.svg +7 -0
- package/dist/web/mascots/bolt-attention.svg +7 -0
- package/dist/web/mascots/bolt-ok.svg +7 -0
- package/dist/web/mascots/bolt-outage.svg +7 -0
- package/dist/web/mascots/bolt-running.svg +7 -0
- package/dist/web/mascots/echo-attention.svg +7 -0
- package/dist/web/mascots/echo-ok.svg +7 -0
- package/dist/web/mascots/echo-outage.svg +7 -0
- package/dist/web/mascots/echo-running.svg +7 -0
- package/dist/web/mascots/lens-attention.svg +7 -0
- package/dist/web/mascots/lens-ok.svg +7 -0
- package/dist/web/mascots/lens-outage.svg +7 -0
- package/dist/web/mascots/lens-running.svg +7 -0
- package/dist/web/mascots/moss-attention.svg +7 -0
- package/dist/web/mascots/moss-ok.svg +7 -0
- package/dist/web/mascots/moss-outage.svg +7 -0
- package/dist/web/mascots/moss-running.svg +7 -0
- package/dist/web/mascots/nit-attention.svg +7 -0
- package/dist/web/mascots/nit-ok.svg +7 -0
- package/dist/web/mascots/nit-outage.svg +7 -0
- package/dist/web/mascots/nit-running.svg +7 -0
- package/dist/web/mascots/nova-attention.svg +7 -0
- package/dist/web/mascots/nova-ok.svg +7 -0
- package/dist/web/mascots/nova-outage.svg +7 -0
- package/dist/web/mascots/nova-running.svg +7 -0
- package/dist/web/mascots/penn-attention.svg +7 -0
- package/dist/web/mascots/penn-ok.svg +7 -0
- package/dist/web/mascots/penn-outage.svg +7 -0
- package/dist/web/mascots/penn-running.svg +7 -0
- package/dist/web/mascots/pip-attention.svg +7 -0
- package/dist/web/mascots/pip-ok.svg +7 -0
- package/dist/web/mascots/pip-outage.svg +7 -0
- package/dist/web/mascots/pip-running.svg +7 -0
- package/dist/web/mascots/ward-attention.svg +7 -0
- package/dist/web/mascots/ward-ok.svg +7 -0
- package/dist/web/mascots/ward-outage.svg +7 -0
- package/dist/web/mascots/ward-running.svg +7 -0
- package/dist/web/sw.js +98 -0
- package/dist/webhook-seen.js +53 -0
- package/dist/webhook-seen.js.map +1 -0
- package/dist/webhooks.js +625 -0
- package/dist/webhooks.js.map +1 -0
- package/dist/zip.js +63 -0
- package/dist/zip.js.map +1 -0
- package/docs/API-V2.md +532 -0
- package/docs/CHAT-EVAL.md +130 -0
- package/docs/CHAT-UI.md +416 -0
- package/docs/CONNECTIONS.md +89 -0
- package/docs/DATA-MODEL.md +518 -0
- package/docs/DEPLOY.md +577 -0
- package/docs/DOGFOOD-LEDGER.md +81 -0
- package/docs/GITHUB.md +148 -0
- package/docs/INTEGRATION-MODEL.md +200 -0
- package/docs/LEAD-DOT.md +553 -0
- package/docs/LIST-PATTERNS.md +52 -0
- package/docs/MULTI-REPO.md +766 -0
- package/docs/PARITY.md +276 -0
- package/docs/PR-REVIEW-QA.md +1266 -0
- package/docs/PR-REVIEW.md +357 -0
- package/docs/SANDBOX.md +320 -0
- package/docs/SETUP.md +776 -0
- package/docs/SLACK.md +80 -0
- package/docs/STAGES.md +619 -0
- package/docs/TRACE-MAP.md +89 -0
- package/docs/TRACKERS.md +225 -0
- package/docs/VOICE.md +36 -0
- package/docs/tinybee/00-README.md +45 -0
- package/docs/tinybee/01-PRD.md +216 -0
- package/docs/tinybee/02-architecture-pairing.md +199 -0
- package/docs/tinybee/03-local-agent.md +222 -0
- package/docs/tinybee/04-local-setup-ui.md +128 -0
- package/docs/tinybee/05-mobile-app-ux.md +199 -0
- package/docs/tinybee/06-environments-and-delivery.md +148 -0
- package/docs/tinybee/07-coding-agent-handoff.md +116 -0
- package/docs/tinybee/OPEN-QUESTIONS.md +26 -0
- package/docs/tinybee/PROGRESS.md +134 -0
- package/package.json +111 -4
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
# TinyBeeAI — Local Setup UI (Laptop) Specification
|
|
2
|
+
|
|
3
|
+
**Version:** 0.1 (draft) · **Date:** 2026-10-24
|
|
4
|
+
**Companion to:** `03-local-agent.md`, `05-mobile-app-ux.md`
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 1. Purpose and philosophy
|
|
9
|
+
|
|
10
|
+
The laptop UI exists for exactly three moments: **install → pair**, **something is red**, and **recovery**. Everything else lives on the phone. Therefore:
|
|
11
|
+
|
|
12
|
+
- It is a single local web page at `http://localhost:7331/setup`, opened by the installer and the menu bar icon. No native window framework; works in any default browser.
|
|
13
|
+
- One screen at a time, one primary action per screen, large type (a user may be reading it from across the desk while holding their phone).
|
|
14
|
+
- Bilingual toggle (VI/EN) top-right; language follows OS locale by default.
|
|
15
|
+
- Never shows anything the user must copy by hand except the 6-char fallback code.
|
|
16
|
+
|
|
17
|
+
Visual language: warm cream background, dark text, one accent (honey yellow) for the primary action, green/amber/red strictly for status. Generous spacing, 18 px base font, QR ≥ 280 px.
|
|
18
|
+
|
|
19
|
+
## 2. Screen flow
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
[0 Welcome] → [1 Health check] → [2 Pair (QR)] → [3 Connecting…] → [4 Done]
|
|
23
|
+
↑ ↓
|
|
24
|
+
[H Health & Fix] ◄──────────────────────────── [S Status (steady state)]
|
|
25
|
+
↓
|
|
26
|
+
[R Recovery / Advanced]
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## 3. Screens
|
|
30
|
+
|
|
31
|
+
### Screen 0 — Welcome (auto-advances after 2 s unless user hovers)
|
|
32
|
+
- Logo + "Setting up your Bee on **DESKTOP-LAN-01**".
|
|
33
|
+
- Sub: "This takes about a minute. Keep your phone nearby."
|
|
34
|
+
- Button: **Start**. Link: "I don't have the app yet" → shows store QR + short URL.
|
|
35
|
+
|
|
36
|
+
### Screen 1 — Health check
|
|
37
|
+
- Title: "Checking this laptop…"
|
|
38
|
+
- Animated list; each item resolves to ✓ / ! / ✕ with one-line message.
|
|
39
|
+
|
|
40
|
+
| Item | Copy (pass) | Copy (issue) + action |
|
|
41
|
+
|---|---|---|
|
|
42
|
+
| Internet | "Connected" | "No internet — connect to Wi-Fi and retry" [Retry] |
|
|
43
|
+
| TinyBee cloud | "Reachable" | "Can't reach TinyBee. A firewall or VPN may be blocking it." [Learn more] |
|
|
44
|
+
| Memory & disk | "8 GB RAM · 112 GB free" | "Only 3.2 GB RAM — your Bee will work but run slowly." |
|
|
45
|
+
| Power settings | "Laptop stays awake when plugged in" | "Laptop will sleep when lid closes" [Fix this for me] |
|
|
46
|
+
| Plugged in | "On AC power" | "Running on battery — plug in for 24/7 use" |
|
|
47
|
+
| Time & date | "Clock is accurate" | "Clock is off by 6 minutes — this breaks secure login" [Sync now] |
|
|
48
|
+
| AI providers | "Ready (TinyBee relay)" + "Local AI found: Ollama (2 models)" | "No AI provider reachable" |
|
|
49
|
+
|
|
50
|
+
- Footer: **Continue** (enabled if no ✕ blockers), or **Continue anyway** when only ! items remain, with warning text.
|
|
51
|
+
- Detail chevron on each row reveals technical detail and "Copy diagnostics" for support.
|
|
52
|
+
|
|
53
|
+
### Screen 2 — Pair with your phone
|
|
54
|
+
- Large QR (regenerates every 10 min; subtle countdown ring; "Refresh" link).
|
|
55
|
+
- Headline: "Scan with the TinyBee app"
|
|
56
|
+
- Three tiny steps under the QR: "Open the app → tap **Add my laptop** → scan".
|
|
57
|
+
- Divider: "No camera? Enter this code in the app:" — **K7M2PQ** (monospace, large) with [Copy].
|
|
58
|
+
- Laptop name field (pre-filled, editable): "Name this Bee: `Office laptop`".
|
|
59
|
+
- Status strip at bottom: "Waiting for scan…" (pulsing dot). On scan detected → transitions immediately.
|
|
60
|
+
- Edge text: "Nothing is sent until you confirm on your phone."
|
|
61
|
+
|
|
62
|
+
### Screen 3 — Connecting…
|
|
63
|
+
- Stepper with live states, each ≤ 10 s typical:
|
|
64
|
+
1. "Phone confirmed ✓"
|
|
65
|
+
2. "Creating your address · hong.tinybee.app" (spinner → ✓)
|
|
66
|
+
3. "Opening secure tunnel" (spinner → ✓)
|
|
67
|
+
4. "Saying hello to your phone" (spinner → ✓)
|
|
68
|
+
- If a step exceeds 30 s: inline helper "Taking longer than usual… [Retry] [Get help]". Never a raw error string on the main line; technical detail under a chevron.
|
|
69
|
+
|
|
70
|
+
### Screen 4 — Done
|
|
71
|
+
- Big ✓ "Your Bee is online"
|
|
72
|
+
- "Address: **hong.tinybee.app** (only you can open it)"
|
|
73
|
+
- "You can close this window. Your Bee runs in the background — look for the 🐝 icon in the menu bar."
|
|
74
|
+
- Secondary: "Keep this laptop plugged in and don't shut it down. Closing the lid is fine." (shown only if power fix applied; otherwise the warning variant.)
|
|
75
|
+
- Button: **Finish** (closes tab). Small link: "Open status page".
|
|
76
|
+
|
|
77
|
+
### Screen S — Status (steady state; what the menu bar app opens after pairing)
|
|
78
|
+
Card layout, read-only, auto-refreshing:
|
|
79
|
+
- **Header**: 🟢 Online · hong.tinybee.app · Bee v1.2.0 · Uptime 6d 4h
|
|
80
|
+
- **Card: Health** — last check 2 h ago · 7/7 OK · [Run check]
|
|
81
|
+
- **Card: Activity** — "Last run: Parent tuition emails · 3 min ago · OK" · "Runs today: 48 · Approvals waiting: 1 (open the app)"
|
|
82
|
+
- **Card: Connection** — Tunnel: connected (QUIC) · Phone last seen: 10 min ago
|
|
83
|
+
- **Card: Power** — On AC · Stay-awake: enabled
|
|
84
|
+
- Footer links: "Pause all workflows", "Logs folder", "Advanced", "Unpair this laptop".
|
|
85
|
+
|
|
86
|
+
States of the header:
|
|
87
|
+
- 🟢 Online — tunnel up, Hive reachable.
|
|
88
|
+
- 🟡 Local only — workflows running, but tunnel down or plan suspended. Shows reason: "Trial ended — your Bee still works here, but remote access is paused. Upgrade in the app." or "Reconnecting tunnel… (attempt 6)".
|
|
89
|
+
- 🔴 Problem — service degraded; shows top failing check and its fix button.
|
|
90
|
+
- ⚪ Not paired — shows Screen 2.
|
|
91
|
+
|
|
92
|
+
### Screen H — Health & Fix
|
|
93
|
+
Same table as Screen 1 but persistent, with per-row [Fix] / [Retry] and "Copy diagnostics" / "Send to support (opt-in)" at the bottom.
|
|
94
|
+
|
|
95
|
+
### Screen R — Recovery / Advanced (behind a "Show advanced" toggle)
|
|
96
|
+
- Re-pair (shows new QR; warns it replaces phone link).
|
|
97
|
+
- Restart service · Check for updates · Roll back to previous version (shows version & date).
|
|
98
|
+
- Data: folder location · retention · [Export workflows YAML] · [Delete all data].
|
|
99
|
+
- Network: protocol (auto/QUIC/HTTP2) · proxy detected · [Test tunnel].
|
|
100
|
+
- Developer: enable local LAN access to API (off) · log level · open logs.
|
|
101
|
+
- Everything here has a one-line explanation of consequences before confirming.
|
|
102
|
+
|
|
103
|
+
## 4. Menu bar icon states and menu
|
|
104
|
+
|
|
105
|
+
| Icon | State | Tooltip |
|
|
106
|
+
|---|---|---|
|
|
107
|
+
| 🐝 (yellow) | Online | "TinyBee · Online · hong.tinybee.app" |
|
|
108
|
+
| 🐝 (grey) | Local only | "TinyBee · Running locally · remote access paused" |
|
|
109
|
+
| 🐝 (red dot) | Problem | "TinyBee · Needs attention: <top issue>" |
|
|
110
|
+
| 🐝 (outline) | Not paired | "TinyBee · Scan to connect" |
|
|
111
|
+
|
|
112
|
+
Menu: Open status · Pause/Resume workflows · Run health check · Check for updates · Open logs · Quit menu bar app (daemon keeps running).
|
|
113
|
+
|
|
114
|
+
macOS notifications: "Paired with your phone ✓", "Bee is running locally only (tunnel down for 5 min)", "Update installed: v1.2.1", "An approval is waiting in the app".
|
|
115
|
+
|
|
116
|
+
## 5. Copy guidelines
|
|
117
|
+
|
|
118
|
+
- Say "your Bee", never "the daemon/service/agent".
|
|
119
|
+
- Never show "Cloudflare", "tunnel token", "JWT", "Keychain" on a primary line. Technical words only under "Details".
|
|
120
|
+
- Errors: what happened → what it means for you → one thing to do. Example: "Can't reach TinyBee cloud. Your workflows still run here, but your phone can't connect. Check if a VPN is on, then Retry."
|
|
121
|
+
- Vietnamese copy is written natively, not translated literally; tone is friendly-professional ("Bee của bạn đã sẵn sàng").
|
|
122
|
+
|
|
123
|
+
## 6. Accessibility & technical
|
|
124
|
+
|
|
125
|
+
- Keyboard navigable; focus rings; all status conveyed by icon + text + colour (never colour alone).
|
|
126
|
+
- Works on Retina and non-Retina displays, 100–200% scaling.
|
|
127
|
+
- Page served only on `127.0.0.1`; CSRF token on every action; actions require the local socket secret the menu bar app passes in the URL on open (prevents another local user/browser tab from driving it).
|
|
128
|
+
- No external assets (fonts/CSS inline) so the page works fully offline.
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
# TinyBeeAI — Mobile App UI/UX Specification
|
|
2
|
+
|
|
3
|
+
**Version:** 0.1 (draft) · **Date:** 2026-10-24
|
|
4
|
+
**Platforms:** iOS 16+, Android 10+ (single codebase recommended: Flutter or React Native)
|
|
5
|
+
**Companion to:** `01-PRD.md`, `02-architecture-pairing.md`, `03-local-agent.md`
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1. Experience principles
|
|
10
|
+
|
|
11
|
+
1. **The phone is the remote control, the laptop is the engine.** Every screen reflects the Bee's real state; nothing is "stored in the app" except session and preferences.
|
|
12
|
+
2. **Glanceable first, deep second.** Home answers "is it running, what happened, what needs me" in under 3 seconds. Depth is one tap away.
|
|
13
|
+
3. **Plain language over automation jargon.** No "triggers/nodes/webhooks" in primary UI. Users describe what they want; the app shows what the Bee understood.
|
|
14
|
+
4. **Nothing happens behind the user's back.** Sends and writes default to approval. The Activity log is complete and readable.
|
|
15
|
+
5. **Degrade gracefully.** Offline Bee, expired trial, lost connection — all have designed states with a next step, never a blank error.
|
|
16
|
+
|
|
17
|
+
## 2. Information architecture
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
Tab bar (5):
|
|
21
|
+
🏠 Home — status, digest, approvals, quick actions
|
|
22
|
+
💬 Chat — threads with the Bee
|
|
23
|
+
⚡ Workflows — list, skills library, editor, run history
|
|
24
|
+
🔗 Connections — third-party accounts
|
|
25
|
+
⚙️ More — Bee & laptop, notifications, plan & billing, account, help
|
|
26
|
+
|
|
27
|
+
Global:
|
|
28
|
+
• Status pill in top bar on every screen (🟢 Online / 🟡 Local only / 🔴 Offline)
|
|
29
|
+
• Approval badge on Home tab
|
|
30
|
+
• Pull-to-refresh everywhere → live `/events` WS when foregrounded
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## 3. Onboarding & pairing
|
|
34
|
+
|
|
35
|
+
### 3.1 Flow (target ≤ 8 taps)
|
|
36
|
+
```
|
|
37
|
+
Splash → Value carousel (3 cards, skippable)
|
|
38
|
+
→ Sign up (Email OTP | Google | Apple)
|
|
39
|
+
→ Choose your address ("hong" .tinybee.app, availability check, suggestions)
|
|
40
|
+
→ Quick profile (chips, multi-select): I use… [Gmail] [Google Drive/Sheets] [Zalo OA] [Facebook Page] [Other]
|
|
41
|
+
I am… [Business owner] [Freelancer] [Student/Researcher] [Just exploring]
|
|
42
|
+
→ "Now install TinyBee on your laptop" (short URL, 6-char code, "I've installed it → Scan QR")
|
|
43
|
+
→ Scanner (camera) | Enter code
|
|
44
|
+
→ Confirm laptop: "Office laptop (DESKTOP-LAN-01)" + health summary chips → [Connect]
|
|
45
|
+
→ Provisioning (3 steps, animated) → "🟢 Your Bee is online!"
|
|
46
|
+
→ Starter skills (3 cards tailored to chips) → pick one → Connect account → Done → Home
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### 3.2 Screen details
|
|
50
|
+
|
|
51
|
+
**Value carousel** — 3 cards: "Runs 24/7 on your own laptop", "Your data stays with you", "Set up in 2 minutes". Each with a simple illustration (bee + laptop + phone). "Skip" top-right.
|
|
52
|
+
|
|
53
|
+
**Choose your address** — Big input with suffix `.tinybee.app`, live availability (✓ / taken → 3 suggestions), rule hint "letters, numbers, hyphen · 3–20 chars". Note: "You can change this once later."
|
|
54
|
+
|
|
55
|
+
**Install prompt** — Illustration of laptop screen with QR. Text: "On the laptop you want to use, open **tinybee.app/get** and install. When you see a QR code, come back here." Code card: `K7M2PQ` with timer "expires in 9:41 · Refresh". Primary: **Scan QR code**. Secondary: **Enter code instead**. Tertiary: "I'll do this later" → Home in *not-paired* state.
|
|
56
|
+
|
|
57
|
+
**Scanner** — Full-screen camera, framed guide, torch toggle, "Enter code" link. On decode: haptic + immediate transition (no extra tap).
|
|
58
|
+
|
|
59
|
+
**Confirm laptop** — Card: laptop name (editable), OS, RAM, disk, power ✓/!. Warnings as amber chips with "Fix on laptop" hint. If tenant already has a Bee: red card "This will replace 'Old laptop'". Primary: **Connect**.
|
|
60
|
+
|
|
61
|
+
**Provisioning** — Three rows animate: "Creating hong.tinybee.app", "Opening secure tunnel", "Connecting to your laptop". Each ✓ with timing. Over 30 s → "Taking longer than usual…" with Retry; over 90 s → troubleshooting sheet (laptop online? internet?).
|
|
62
|
+
|
|
63
|
+
**Starter skills** — 3 cards chosen by profile chips, e.g. for [Gmail]+[Business owner]: "Flag urgent customer emails", "Morning inbox digest", "Watch a Sheet for missing entries". Each card: name, one-sentence outcome, accounts needed, "~1 min setup". Pick → goes straight to that skill's guided setup (§6.3). "Skip for now" available.
|
|
64
|
+
|
|
65
|
+
## 4. Home
|
|
66
|
+
|
|
67
|
+
### Layout (top → bottom)
|
|
68
|
+
1. **Bee status card** — Bee name, status pill, "Last run 3 min ago · 48 runs today", tiny sparkline of runs/hour. Tapping opens *Bee & laptop*. In degraded states this card expands with cause + action (see §10).
|
|
69
|
+
2. **Needs you** (only if any) — approval cards: avatar/icon, "Bee wants to **send a reply** to Nguyễn Văn A", preview 2 lines, buttons **Approve** · **Edit** · **Deny**; swipe right = approve, left = deny (with undo toast 5 s). Counter "2 more".
|
|
70
|
+
3. **Today's digest** — collapsible sections per workflow: "Parent tuition emails — 3 new, 1 urgent", bullet summaries, each bullet deep-links to the source item in Chat context ("Ask about this"). "Generated 07:00 · Regenerate".
|
|
71
|
+
4. **Quick actions** — horizontal chips: "Ask Bee", "Run a check", "Add workflow", "Connect account".
|
|
72
|
+
5. **Recent activity** — last 5 runs with status dots; "See all" → Activity.
|
|
73
|
+
|
|
74
|
+
Empty state (paired, no workflows): illustration + "Your Bee is ready and bored. Give it something to watch." → [Browse skills] [Describe it in chat].
|
|
75
|
+
|
|
76
|
+
## 5. Chat
|
|
77
|
+
|
|
78
|
+
- Thread list: "New chat" + recent threads (titles auto-generated). Pinned thread "Bee" for general conversation.
|
|
79
|
+
- Message view: streaming responses; markdown; tables render natively; tool activity shown inline as collapsible "🔍 Searched Gmail (3 results)" rows so the user sees what the Bee did.
|
|
80
|
+
- Composer: text, mic (speech-to-text), attach (photo, file, share-sheet from other apps → "Ask Bee about this").
|
|
81
|
+
- Quick replies after a Bee message when relevant: "Draft reply", "Make this a workflow", "Remind me tomorrow".
|
|
82
|
+
- "Make this a workflow": Bee proposes a workflow card (name, trigger, what it checks, actions, permissions) → user edits in guided editor → save. This is the primary creation path for non-technical users.
|
|
83
|
+
- Actions proposed in chat (send, write) always render as an **action card** with Approve/Edit/Deny — identical component to Home approvals.
|
|
84
|
+
- Model picker per thread (Quick / Smart / Local) with a one-line cost hint; default Smart for chat.
|
|
85
|
+
|
|
86
|
+
## 6. Workflows
|
|
87
|
+
|
|
88
|
+
### 6.1 List
|
|
89
|
+
- Segmented control: **Active** · **Paused** · **All**.
|
|
90
|
+
- Row: icon by category, name, trigger summary ("Every 10 min, 7:00–21:00"), last run status dot + relative time, toggle switch.
|
|
91
|
+
- Swipe: Run now · Pause · Duplicate · Delete.
|
|
92
|
+
- FAB: **+ Add** → sheet: "Describe what you want" (chat) | "Start from a skill" | "Advanced: import YAML".
|
|
93
|
+
|
|
94
|
+
### 6.2 Skills library
|
|
95
|
+
- Grid of cards grouped: Inbox & messages · Sheets & documents · Reports & digests · Reminders · Website & monitoring.
|
|
96
|
+
- Card → detail: what it does (3 bullets), example output screenshot, accounts needed, default schedule, "Used by 1.2k Bees" (anonymous counter), **Use this skill**.
|
|
97
|
+
|
|
98
|
+
### 6.3 Guided editor (one screen, sections as cards)
|
|
99
|
+
1. **Name** — editable, emoji picker.
|
|
100
|
+
2. **When** — segmented: *On a schedule* (friendly picker: every N minutes/hours, time window, days; shows next 3 run times) · *When something happens* (events available for connected accounts) · *Only when I ask*.
|
|
101
|
+
3. **Watch** — account + natural filter ("emails mentioning tuition or fee from parents"); the Bee shows the technical query it derived under "Details" (editable).
|
|
102
|
+
4. **Do** — instruction text (what to look for, how to summarise), language of output, output actions as toggles: Notify me (push) · Add to digest · Label/Move · Write to Sheet · Draft reply · Send reply.
|
|
103
|
+
5. **Permissions** — per action: Auto · Ask me · Off, with default badge. Sends default to **Ask me**.
|
|
104
|
+
6. **Limits** — model tier (Quick/Smart/Local), max run time, token budget per run (plain-language estimate: "≈ 0.4₫… / run" or "uses ~1% of monthly budget").
|
|
105
|
+
7. **Test** — **Run a test now** → shows a live run (§6.4) without sending anything (dry-run flag).
|
|
106
|
+
8. Save → toggled Active with confirmation toast "Running every 10 min. Next: 14:50".
|
|
107
|
+
|
|
108
|
+
### 6.4 Run detail
|
|
109
|
+
- Header: workflow, status (OK / Warning / Failed / Needs approval / Cancelled), started, duration, cost (tokens → money estimate).
|
|
110
|
+
- Timeline: Input fetched (count) → Bee reasoning summary (one paragraph, not raw chain-of-thought) → Tool calls (collapsible rows with request summary and result count) → Outputs (push sent, digest appended, sheet updated — each tappable to the artifact) → Approvals (if any).
|
|
111
|
+
- Buttons: **Run again**, **Open workflow**, **Report a problem** (attaches run id only, content excluded unless user opts in).
|
|
112
|
+
|
|
113
|
+
## 7. Connections
|
|
114
|
+
|
|
115
|
+
- List: provider icon, account identifier (e.g. `hong@gmail.com`), status (Connected / Needs re-login / Limited scopes), used by N workflows.
|
|
116
|
+
- Add: provider grid (Gmail · Google Drive/Sheets · Google Calendar · Zalo OA · Facebook Page · Custom API key) → scope explainer sheet: "TinyBee on your laptop will be able to: read your emails, apply labels. It will NOT be able to: send email (unless you enable it later), delete anything." → **Continue to Google** (system browser) → return → ✓ with "stored on your laptop only" note.
|
|
117
|
+
- Detail: scopes, last used, token health, "Test connection", "Remove" (lists affected workflows first).
|
|
118
|
+
|
|
119
|
+
## 8. Activity (reached from Home → See all, and from More)
|
|
120
|
+
|
|
121
|
+
- Filter chips: All · Needs approval · Failed · Sent/wrote something · Workflow picker · Date.
|
|
122
|
+
- Rows grouped by day; tap → Run detail.
|
|
123
|
+
- Search across summaries.
|
|
124
|
+
- Export (CSV) for the selected range; generated by the Bee and downloaded through the tunnel.
|
|
125
|
+
|
|
126
|
+
## 9. More
|
|
127
|
+
|
|
128
|
+
### Bee & laptop
|
|
129
|
+
- Bee name, address, version (update available → **Update now** / auto at night toggle), uptime, laptop name, OS, power status.
|
|
130
|
+
- **Health** — same table as laptop UI; remote **Run check**; fixable items show "Fix on laptop" with instructions (can't change power settings remotely; can trigger time sync and protocol switch).
|
|
131
|
+
- Actions: Pause all workflows · Restart Bee · Roll back update · Re-pair (new laptop) · **Kill switch** (stops all outbound actions immediately; red, confirm) · Unpair.
|
|
132
|
+
- Data & retention: logs 30/60/90 days, chat retention, cache size, **Export workflows (YAML)**, **Wipe laptop data**.
|
|
133
|
+
|
|
134
|
+
### Notifications
|
|
135
|
+
- Master toggle; categories: Approvals (always on unless kill), Urgent findings, Digest (time picker), Bee offline, Updates, Billing.
|
|
136
|
+
- Quiet hours (default 22:00–07:00, approvals still delivered as silent badge).
|
|
137
|
+
- Per-workflow override link.
|
|
138
|
+
|
|
139
|
+
### Plan & billing
|
|
140
|
+
- Plan card: Trial — "17 days left" progress; Standard/Pro with renewal date.
|
|
141
|
+
- Usage meter: bundled tokens used / cap with per-workflow breakdown ("Parent tuition emails 41%"); BYOK shows "Using your own key — no bundled usage".
|
|
142
|
+
- Upgrade sheet: plan compare, local payment methods first (MoMo, ZaloPay, bank QR), card.
|
|
143
|
+
- Clear copy of the rule: "If your plan ends, your Bee keeps running on your laptop. Only remote access and notifications pause."
|
|
144
|
+
- Invoices list.
|
|
145
|
+
|
|
146
|
+
### Account
|
|
147
|
+
- Email, sign-in methods, 2FA, language (VI/EN), change address (once), **Delete account** (3-step: export offered → consequences → type address to confirm).
|
|
148
|
+
|
|
149
|
+
### Help
|
|
150
|
+
- Guided troubleshooting ("Bee is offline", "Can't pair", "Gmail disconnected"), FAQ, contact (in-app chat to support; diagnostics attached only with consent), What's new.
|
|
151
|
+
|
|
152
|
+
## 10. Degraded and edge states (designed, not accidental)
|
|
153
|
+
|
|
154
|
+
| State | Home status card | Behaviour elsewhere |
|
|
155
|
+
|---|---|---|
|
|
156
|
+
| **Bee offline** (no heartbeat 5 min) | 🔴 "Offline since 14:02 · Laptop may be asleep or without internet" → [Troubleshoot] [Notify me when back] | Workflows read-only; chat shows last messages with banner "Your Bee is offline — messages will send when it's back" (queued locally up to 24 h) |
|
|
157
|
+
| **Local only** (plan suspended / tunnel down) | 🟡 "Running locally · remote access paused" + reason + [Upgrade] or [Retry] | Everything read-only from cache; approvals can't be acted on |
|
|
158
|
+
| **Not paired** | ⚪ "No laptop connected" → [Set up a laptop] | Workflows/Connections tabs show explainer |
|
|
159
|
+
| **Bundled tokens exhausted** | 🟡 banner "Monthly AI budget used · workflows paused" → [Top up] [Add my own key] | Run detail shows "Paused: budget" |
|
|
160
|
+
| **Connection needs re-login** | amber card "Gmail needs you to sign in again" → [Reconnect] | Affected workflows show warning badge |
|
|
161
|
+
| **Update available / failed** | info chip / 🔴 with [Roll back] | — |
|
|
162
|
+
| **Phone offline** | top bar "No internet"; cached data with timestamps | Composer disabled with explanation |
|
|
163
|
+
| **Mismatched versions** | "Update the app to use new features" (soft) or hard block if API incompatible | — |
|
|
164
|
+
|
|
165
|
+
## 11. Notification design
|
|
166
|
+
|
|
167
|
+
- Approval: "Bee wants to send a reply to Nguyễn Văn A" — actions **Approve** / **View** (Android actionable; iOS category). Collapse key per approval.
|
|
168
|
+
- Urgent finding: "🔴 Urgent: tuition email from Trần Thị B — 'con em nghỉ…'" → deep link to digest item.
|
|
169
|
+
- Digest: "Your 7:00 report is ready — 3 items, 1 needs you".
|
|
170
|
+
- Offline: one at 5 min; one daily while offline; "Back online ✓" once.
|
|
171
|
+
- Payloads carry no sensitive body text beyond a short summary the Bee chose to include; full content loads from the Bee.
|
|
172
|
+
|
|
173
|
+
## 12. Visual & interaction design
|
|
174
|
+
|
|
175
|
+
- **Palette**: cream background `#FFF8E7`, ink `#1F1B16`, honey accent `#F5B700`, status green `#2E9E5B`, amber `#E0A100`, red `#D64545`. Dark mode: charcoal `#15130F` with same accent.
|
|
176
|
+
- **Type**: system fonts (SF / Roboto) with Dynamic Type; headings 24–28, body 16–17, meta 13.
|
|
177
|
+
- **Components**: one shared *Action card* (approval) used in Home, Chat, Runs; *Status pill*; *Health row*; *Workflow row*; *Run timeline*.
|
|
178
|
+
- **Motion**: subtle; bee icon pulses when Bee is "thinking" during chat; provisioning steps slide-check.
|
|
179
|
+
- **Haptics**: success on pair, approval; warning on deny.
|
|
180
|
+
- **Illustrations**: friendly geometric bee, laptop, phone; no stock photos.
|
|
181
|
+
|
|
182
|
+
## 13. Accessibility & localization
|
|
183
|
+
|
|
184
|
+
- WCAG 2.1 AA contrast; all icons labelled; VoiceOver/TalkBack order follows visual order; approvals operable via buttons, not only swipes.
|
|
185
|
+
- Dynamic type up to 200% without truncating critical text.
|
|
186
|
+
- vi-VN and en-US; numbers, currency (₫/$), dates localized; Vietnamese copy reviewed natively.
|
|
187
|
+
- Right-to-left not required for v1.
|
|
188
|
+
|
|
189
|
+
## 14. Analytics events (privacy-safe)
|
|
190
|
+
|
|
191
|
+
`signup_complete`, `slug_chosen`, `install_prompt_shown`, `qr_scanned`, `pair_success` (+duration), `pair_fail` (+reason code), `first_workflow_created` (+source: chat/skill/yaml), `approval_decided` (+decision), `offline_push_sent`, `trial_upgrade_shown`, `upgrade_complete`, `connection_added` (+provider). No content, no identifiers beyond tenant id hash.
|
|
192
|
+
|
|
193
|
+
## 15. Open UX questions
|
|
194
|
+
|
|
195
|
+
1. Should approvals be editable inline (text field in the card) or always open an editor? Lean: inline for ≤ 3 lines, editor otherwise.
|
|
196
|
+
2. Digest time: one global time, or per-workflow? Lean: global default 07:00 with per-workflow opt-out.
|
|
197
|
+
3. Do we show cost in money or in tokens/percent? Lean: percent of monthly budget with ₫ estimate on tap.
|
|
198
|
+
4. How much "Bee reasoning" to show in run detail — summary only (default) vs. "Show thinking" toggle for Persona C.
|
|
199
|
+
5. Widget/Live Activity (iOS) for Bee status and pending approvals — v1 or v1.5?
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
# TinyBeeAI — Environments, Build & Delivery
|
|
2
|
+
|
|
3
|
+
**Version:** 0.1 (draft) · **Date:** 2026-10-24
|
|
4
|
+
**Companion to:** `01-PRD.md`, `02-architecture-pairing.md`, `07-coding-agent-handoff.md`
|
|
5
|
+
**Reuses:** localdost `docs/DEPLOY.md` (Railway recipe, env vars), `.railway/railway.ts`, `client/` (existing PWA with `manifest.webmanifest` and VAPID web push)
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1. Environments
|
|
10
|
+
|
|
11
|
+
| Env | Where | URL | Purpose |
|
|
12
|
+
|---|---|---|---|
|
|
13
|
+
| **local** | developer / coding-agent machine | `http://localhost:4319` (server + Vite client) | Unit, e2e, demo mode (`LOCALDOST_DEMO=1`, mock LLM) |
|
|
14
|
+
| **dev/staging** | Railway, project `localdost`, one service per component | `https://dots.testllms.com` | Shared build-and-test target. The PWA is served and tested here. Treated as **staging**: may break, data is disposable. |
|
|
15
|
+
| **prod** | Railway (later: separate project) | `https://app.tinybee.app` + `*.tinybee.app` tenants | Not provisioned yet. Nothing in these docs assumes prod exists. |
|
|
16
|
+
|
|
17
|
+
Rule: **every change is verified on `dots.testllms.com` as a PWA before any APK/IPA is cut.** Store builds are a packaging step, not a test step.
|
|
18
|
+
|
|
19
|
+
### 1.1 What runs on Railway at dots.testllms.com
|
|
20
|
+
|
|
21
|
+
Because the laptop Bee is not always available during development, staging hosts **both** halves so the mobile client can be tested end-to-end without a laptop:
|
|
22
|
+
|
|
23
|
+
| Railway service | Role | Notes |
|
|
24
|
+
|---|---|---|
|
|
25
|
+
| `hive` | Hive control plane: auth (email OTP / Google), tenants, pairing, Cloudflare provisioning, push relay, metering, plan state | New service. Node + SQLite (or Postgres plugin once tenants > 1k). Public at `dots.testllms.com/api/hive/*` or its own subdomain `hive.testllms.com` — pick one and record it in `.railway/railway.ts`. |
|
|
26
|
+
| `bee-dev` | A **cloud-hosted Bee**: the localdost server itself, running as if it were tenant `dev`'s laptop | Existing localdost image. Lets the mobile app exercise workflows, chat, approvals, Inbox before the macOS packaging exists. Reached at `dots-dev.testllms.com` via Cloudflare tunnel **or** directly via Railway domain during early dev. |
|
|
27
|
+
| `web` | Serves the mobile client as a PWA (`client/` build) | Can be the same process as `bee-dev` (localdost already serves its client) during early dev; split out once the Hive-aware client diverges from the localdost admin UI. |
|
|
28
|
+
|
|
29
|
+
Decision (2026-10-24): Hive has no subdomain of its own. It is reached through the Bee origin at `dots.testllms.com/api/hive/*` (the `localdost`/`bee-dev` service proxies `/api/hive/*` to the private `hive` service when `TINYBEE_HIVE_URL` is set), so the PWA, the Bee API and Hive share one origin and one cookie jar. `.railway/railway.ts` records this.
|
|
30
|
+
|
|
31
|
+
DNS: `dots.testllms.com` → Cloudflare zone `testllms.com`. Tenant hostnames are **one level under the zone**, `dots-<slug>.testllms.com` in staging (`dots-dev.testllms.com`, `dots-hong.testllms.com`) and `<slug>.tinybee.app` in prod, configured as a pattern in `TINYBEE_TENANT_HOST` (`dots-{slug}.testllms.com`). One level keeps every tenant under Cloudflare's zone certificate (`*.testllms.com`); a second level (`hong.dots.testllms.com`) would need Advanced Certificate Manager.
|
|
32
|
+
|
|
33
|
+
#### Hosting pattern: the same as Superapp
|
|
34
|
+
|
|
35
|
+
Superapp (`~/workspaces/superapp`) is the model: one Railway project in the same workspace, one `web` service, and every public name (`superapp.testllms.com`, `admin.testllms.com`, `testllms.com`) is a **custom domain on that Railway service** with a proxied CNAME in the Cloudflare zone pointing at the Railway domain. The process tells the names apart by the `Host` header (Fastify host constraints; `ADMIN_HOST`). Deploys run from GitHub Actions on push to `main` (`railway up --ci --service web` with a project token in `RAILWAY_TOKEN`), followed by a health check loop on the public URL. TinyBee staging follows that recipe:
|
|
36
|
+
|
|
37
|
+
- Railway project `localdost` (workspace "Huy Dao's Projects", next to `superapp`; decided 2026-10-24, the existing project is reused instead of a new `localdost` one), declared in `.railway/railway.ts`: service `localdost` (the Bee origin, serves the PWA, proxies `/api/hive`; Railway domain `localdost-production.up.railway.app`) and service `hive` (private, `hive.railway.internal:4330`, own volume; `LOCALDOST_ROLE=hive` turns the shared image into the Hive).
|
|
38
|
+
- Custom domain `dots.testllms.com` on service `localdost`; Cloudflare CNAME, proxied. Tenant names `dots-<slug>.testllms.com` are **not** Railway domains: Hive creates them as Cloudflare Tunnel public hostnames (CNAME to `<tunnel>.cfargotunnel.com`), the mock provider only names them.
|
|
39
|
+
- Superapp's admin console already has a `tinybee` tenant that takes events at `POST https://admin.testllms.com/api/_ingest/tinybee` (key in Superapp's `ADMIN_INGEST_KEYS`). Hive can report sign-ups and pairings there later; nothing in Phase 0 to 2 depends on it.
|
|
40
|
+
- `.github/workflows/deploy.yml` (to add once the project exists) mirrors Superapp's: `railway up --ci --service localdost` and `--service hive`, then `curl https://dots.testllms.com/api/hive/health`.
|
|
41
|
+
|
|
42
|
+
### 1.2 Environment variables (additions to localdost `.env.example`)
|
|
43
|
+
|
|
44
|
+
| Var | Service | Meaning |
|
|
45
|
+
|---|---|---|
|
|
46
|
+
| `TINYBEE_ENV` | all | `local` · `staging` · `prod` |
|
|
47
|
+
| `TINYBEE_HIVE_URL` | bee, web | Base URL of a separate Hive. On Railway the private address `http://hive.railway.internal:4330`; the Bee proxies `/api/hive/*` there. Unset with `TINYBEE_ENV=local`: Hive runs inside the localdost process. |
|
|
48
|
+
| `TINYBEE_HOME` | bee | Where `npx tinybeeai install` keeps the Bee's data (default `~/.tinybee`; `--dir` on the command line wins) and, under `bin/`, the cloudflared it downloads when PATH has none (pinned in `src/bee/cloudflared.ts`, SHA256-checked). The command also fills `TINYBEE_ENV=staging`, `TINYBEE_HIVE_URL=https://dots.testllms.com`, `PORT=4319` and `LOG_LEVEL=warn` when the shell leaves them unset. |
|
|
49
|
+
| `TINYBEE_TENANT_HOST` | hive | Tenant hostname pattern with `{slug}`: `dots-{slug}.testllms.com` (staging) / `{slug}.tinybee.app` (prod). `TINYBEE_TENANT_DOMAIN=<domain>` is the short form `{slug}.<domain>`. |
|
|
50
|
+
| `TINYBEE_TUNNEL_PROVIDER` | hive | `cloudflare` or `mock`. Unset: `cloudflare` when the three `CF_*` vars are set, else `mock`. |
|
|
51
|
+
| `HIVE_PORT`, `HIVE_DATA_DIR`, `HIVE_DB` | hive | Standalone Hive port (4330) and storage (`hive.db` in the data dir) |
|
|
52
|
+
| `CF_ACCOUNT_ID`, `CF_ZONE_ID`, `CF_API_TOKEN` | hive | Cloudflare API (token scoped: Tunnel:Edit, DNS:Edit, Access:Edit on the one zone) Set on the Railway `hive` service since 2026-10-25; the service also answers at `localdost.testllms.com` (proxied CNAME) for direct checks. |
|
|
53
|
+
| `HIVE_JWT_PRIVATE_KEY`, `HIVE_JWT_KID` | hive | RS256 signing key for tenant JWTs; JWKS served at `/.well-known/jwks.json` |
|
|
54
|
+
| `HIVE_MAIL_PROVIDER` | hive | How sign-in codes are sent. `console` (default; writes the code to the Hive log, refused when `TINYBEE_ENV=prod`). A real sender is OPEN-QUESTIONS item 4. |
|
|
55
|
+
| `HIVE_GOOGLE_CLIENT_ID` | hive | Google OAuth web client id for "Continue with Google". Unset: the sign-up offers email codes only. |
|
|
56
|
+
| `HIVE_RELAY_ANTHROPIC_KEY`, `HIVE_RELAY_ANTHROPIC_URL` | hive | Provider key for the Hive's own model (Phase 6 relay; never shipped to the Bee) and the provider base URL (default `https://api.anthropic.com`). App-side features only: since Phase A the Bee never routes host work through it (02 section 7). Unset key: the relay answers 503 `relay_unconfigured`. |
|
|
57
|
+
| `HIVE_VAPID_PUBLIC_KEY`, `HIVE_VAPID_PRIVATE_KEY`, `HIVE_VAPID_SUBJECT` | hive | Web push from the Hive (offline / back online, Phase 4). Unset: a key pair is generated into `hive-vapid.json` in the data dir (0600) and kept across restarts. Set them on Railway so a volume reset does not orphan the phones' subscriptions. |
|
|
58
|
+
| `FCM_SERVICE_ACCOUNT_JSON` | hive | Firebase service-account JSON (the whole document) for FCM v1 native push to Android (Phase 7). Unset: Android device tokens are accepted but nothing is sent. |
|
|
59
|
+
| `APNS_KEY_P8`, `APNS_KEY_ID`, `APNS_TEAM_ID`, `APNS_BUNDLE_ID`, `APNS_ENV` | hive | APNs auth key (PEM text), its key id and team id, the app bundle id (default `ai.tinybee.app`) and `production` or `sandbox` (Phase 7). |
|
|
60
|
+
| `HIVE_BEE_UPDATE_PUBKEY`, `HIVE_BEE_UPDATES_DIR` | hive | Public id of the Bee release key (`ed25519:…`); `PUT /api/hive/admin/updates/bee/:channel` refuses a manifest not signed by it. Manifests are kept under the dir (default `<data dir>/updates`). |
|
|
61
|
+
| `TINYBEE_UPDATE_PUBKEY`, `TINYBEE_UPDATE_URL`, `TINYBEE_UPDATE_CHANNEL`, `TINYBEE_UPDATE_APPLY` | bee | The Bee updater: release key (unset: updater off; the pkg postinstall writes it from `release.pub`), manifest URL (default `<hive>/api/hive/updates/bee/<channel>`), `stable` or `beta`, and `auto` (write the apply request when idle; the pkg default) or `off` (stage only, the default elsewhere). |
|
|
62
|
+
| `TINYBEE_ANDROID_PACKAGE`, `TINYBEE_ANDROID_CERT_SHA256`, `TINYBEE_IOS_APP_ID` | web | App Links / Universal Links: `/.well-known/assetlinks.json` needs the package name and the signing certificate fingerprints (comma-separated, `AA:BB:…`), `/.well-known/apple-app-site-association` needs `TEAMID.bundle`. Unset: the files answer 404. |
|
|
63
|
+
| `TINYBEE_DEVICE_KEY_PATH` | bee | Where the Bee stores its Ed25519 key (macOS: encrypted with Keychain-held key; Railway bee-dev: `/data/device.key`) |
|
|
64
|
+
| `TINYBEE_TUNNEL` | bee | `off` never starts `cloudflared` (local dev, tests). Mock tokens (`mock.`) never start it either. |
|
|
65
|
+
| `TINYBEE_BEE_PORT` | hive | Port the tunnel ingress points at on the laptop (default: the localdost port, 4319). |
|
|
66
|
+
| `TINYBEE_TUNNEL_CAP` | hive | Tunnel cap reported by `GET /api/hive/admin/tunnels` (default 50; `ok` turns false above 40). |
|
|
67
|
+
| `HIVE_ADMIN_TOKEN` | hive | Bearer for `/api/hive/admin/*`. Unset: those routes answer 404. Long random string; set per environment. |
|
|
68
|
+
| `TINYBEE_PAIRED` | bee-dev only | `1` pre-pairs the cloud Bee to tenant `dev` at boot so staging never shows a QR |
|
|
69
|
+
|
|
70
|
+
Secrets go in via `railway variable set … --stdin` exactly as `docs/DEPLOY.md` prescribes. Never commit them, never paste them in chat or PR descriptions.
|
|
71
|
+
|
|
72
|
+
## 2. Mobile client: one codebase, three packages
|
|
73
|
+
|
|
74
|
+
The mobile app is **the existing localdost `client/` (Vite + PWA) evolved**, not a second app. Build targets:
|
|
75
|
+
|
|
76
|
+
| Target | How | Used for |
|
|
77
|
+
|---|---|---|
|
|
78
|
+
| **PWA** | `vite build` → served by `web`/`bee-dev` at `dots.testllms.com`; `manifest.webmanifest` + service worker already present | **Primary test surface.** Installable on Android (Chrome) and iOS 16.4+ (Safari "Add to Home Screen"). Web push works on both when installed. |
|
|
79
|
+
| **APK** | Capacitor wrapping the same `dist/` (`npx cap add android`, `npx cap sync`, Gradle `assembleRelease`) | Play Store / sideload testing. Native camera (QR), FCM push, deep link `tinybee://pair`. |
|
|
80
|
+
| **IPA** | Capacitor iOS project (`npx cap add ios`), Xcode archive, TestFlight | App Store / TestFlight. APNs push, Universal Links for `https://dots.testllms.com/pair/*`. |
|
|
81
|
+
|
|
82
|
+
Why Capacitor: it reuses `dist/` byte-for-byte, so a feature verified on the PWA behaves the same in APK/IPA; only plugin shims differ (camera, push, secure storage). Decision is reversible; React Native/Flutter would mean a second client.
|
|
83
|
+
|
|
84
|
+
### 2.1 Capability shims
|
|
85
|
+
|
|
86
|
+
| Capability | PWA | Capacitor (APK/IPA) |
|
|
87
|
+
|---|---|---|
|
|
88
|
+
| QR scan | `BarcodeDetector` API where available, fallback `jsQR` on `getUserMedia` frames | `@capacitor/barcode-scanner` (or `@capacitor-mlkit/barcode-scanning`) |
|
|
89
|
+
| Push | Web Push / VAPID (existing localdost `src/notify`, `data/vapid.json`) | FCM (Android) / APNs (iOS) via `@capacitor/push-notifications`; Hive sends to whichever token type the device registered |
|
|
90
|
+
| Deep link `tinybee://pair?d=…` | `https://dots.testllms.com/pair?d=…` web route (same payload) | Custom scheme + App Links / Universal Links to the same route |
|
|
91
|
+
| Secure session storage | `localStorage` + httpOnly refresh cookie | `@capacitor/preferences` + Keychain/Keystore via `capacitor-secure-storage-plugin` |
|
|
92
|
+
| Biometric unlock (v1.5) | — | `@capacitor-community/biometric-auth` |
|
|
93
|
+
|
|
94
|
+
The client must feature-detect and never hard-fail when a native plugin is absent (it is always absent in the PWA).
|
|
95
|
+
|
|
96
|
+
### 2.2 Versioning
|
|
97
|
+
Single `version` in `package.json` drives: PWA `manifest.webmanifest` version, Capacitor `versionName`/`CFBundleShortVersionString`, and `GET /api/health.version` on the Bee. Build number = CI run number. The Bee advertises `api_versions: ["v1"]`; the client refuses to talk to a Bee whose `api_versions` does not include its own.
|
|
98
|
+
|
|
99
|
+
## 3. Build & release pipeline (GitHub Actions)
|
|
100
|
+
|
|
101
|
+
```
|
|
102
|
+
on push to main / PR:
|
|
103
|
+
lint → test:server → test:client → build → test:e2e (Playwright vs local demo server)
|
|
104
|
+
on push to main:
|
|
105
|
+
deploy staging: railway up --service hive ; railway up --service bee-dev (web served by bee-dev)
|
|
106
|
+
smoke: curl https://dots.testllms.com/api/health ; Playwright smoke suite against staging PWA
|
|
107
|
+
on tag v*:
|
|
108
|
+
android: cap sync android → gradle bundleRelease → upload AAB/APK artifact → Play internal track
|
|
109
|
+
ios: cap sync ios → xcodebuild archive → TestFlight (fastlane pilot)
|
|
110
|
+
bee-macos: package macOS Bee (see 03-local-agent.md §3) → signed + notarized universal .pkg
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Store signing keys (Android keystore, Apple certs/profiles via fastlane match) live in GitHub Actions secrets only.
|
|
114
|
+
|
|
115
|
+
## 4. Test strategy
|
|
116
|
+
|
|
117
|
+
| Layer | Tool | Scope |
|
|
118
|
+
|---|---|---|
|
|
119
|
+
| Unit (server) | `node --test` (existing `test/*.test.ts`) | Hive pairing logic, JWT validation, tunnel provider mock, metering |
|
|
120
|
+
| Unit (client) | Vitest (existing) | Pairing payload parsing, degraded-state reducers, feature detection shims |
|
|
121
|
+
| E2E local | Playwright (existing `scripts/e2e.mjs`) against `LOCALDOST_DEMO=1` + a mocked Hive | Install→QR→pair→first workflow flow, approvals, offline states |
|
|
122
|
+
| **Staging PWA** | Playwright (mobile viewport, iPhone 14 / Pixel 7 emulation) against `https://dots.testllms.com` | The release gate. Same flows as above with real Hive and real Cloudflare provisioning in a `staging-*` tenant namespace that a nightly job deletes. |
|
|
123
|
+
| Manual device | Real Android + iPhone with the installed PWA, then APK/IPA | QR scanning with a real camera, push delivery, background/foreground transitions, Add-to-Home-Screen |
|
|
124
|
+
| Laptop Bee | Manual, one Apple Silicon Mac + one Intel Mac | Installer, pmset/power settings, menu bar app, tunnel reconnect after Wi-Fi change, FileVault/login-screen behaviour |
|
|
125
|
+
|
|
126
|
+
Acceptance for a PR touching pairing or auth: the staging Playwright suite must pass **and** a human must complete one real pair on a phone. Record it in the PR.
|
|
127
|
+
|
|
128
|
+
## 5. Staging hygiene
|
|
129
|
+
|
|
130
|
+
- Tenants created by tests use slugs `test-<run-id>` (also `e2e-`, `pw-`); `.github/workflows/staging-cleanup.yml` runs `scripts/tinybee-staging-cleanup.mjs` nightly, which calls `DELETE /api/hive/admin/tenants?prefix=<p>` for each prefix (the Hive revokes the Cloudflare tunnel and DNS record first, and keeps a tenant whose tunnel could not be revoked so the next run retries). Run it by hand with `HIVE_URL=… HIVE_ADMIN_TOKEN=… node scripts/tinybee-staging-cleanup.mjs --dry-run`.
|
|
131
|
+
- Cloudflare staging tunnels are capped at 50 (`TINYBEE_TUNNEL_CAP`); the cleanup job ends with exit code 2 when `GET /api/hive/admin/tunnels` reports more than 40.
|
|
132
|
+
- The edge Worker (`infra/cf-worker`, see its README) is deployed by `.github/workflows/edge-worker.yml` on pushes to `main` that touch it, or by hand with `wrangler deploy` / `wrangler deploy --env prod`.
|
|
133
|
+
- `bee-dev` data (`/data` volume) may be reset at any time; seed data comes from `LOCALDOST_DEMO=1`.
|
|
134
|
+
- No real Gmail/Drive accounts in staging. Use a dedicated Google Cloud project in *testing* publishing status with allow-listed test users.
|
|
135
|
+
|
|
136
|
+
### 5.1 Native shells, the macOS package and updates (Phase 7)
|
|
137
|
+
|
|
138
|
+
- `native/` is the Capacitor 7 shell (`ai.tinybee.app`, `webDir` the built PWA); `android/` and `ios/` are generated by `cap add` in CI and are not committed. `.github/workflows/native-release.yml` runs on `v*` tags: `web` builds the PWA, `android` (when repo variable `ANDROID_RELEASE=true`) signs an `.aab` with the keystore secrets, `ios` (when `IOS_RELEASE=true`) archives and exports with the certificate and profile secrets. The signing material is OPEN-QUESTIONS 11.
|
|
139
|
+
- The client's native layer (`client/src/native/`) reads `window.Capacitor` and never imports the SDK, so the PWA build is unchanged; inside the shell, Hive push goes through the device token (`POST /api/hive/push/device`) and App Links / Universal Links land on the hash router.
|
|
140
|
+
- `packaging/macos/build-pkg.sh` builds `TinyBee-<version>.pkg`: the server build, a Node runtime and `cloudflared` under `/Library/TinyBeeAI`, the `_tinybee` user, the `ai.tinybee.bee` LaunchDaemon on port 7331 with its env file (`TINYBEE_HIVE_URL`, update channel and key), the `ai.tinybee.updater` daemon and the `ai.tinybee.menubar` agent, `/Applications/TinyBee.app` (menu bar) and the optional "keep the laptop awake" choice. `SIGN_APP`, `SIGN_INSTALLER` and `NOTARY_PROFILE` sign and notarize; without them the package is unsigned for local use.
|
|
141
|
+
- Updates: `node scripts/tinybee-sign-manifest.mjs --key - --channel stable --version <v> --pkg <url> --file <pkg>` writes the signed manifest, which CI uploads with `PUT /api/hive/admin/updates/bee/stable` (admin token). Bees verify it with `TINYBEE_UPDATE_PUBKEY`, stage the package and ask the updater daemon to install it when no workflow is running; the daemon rolls back when `/api/health` stays red. `minVersion` in the manifest blocks older Bees (they report "blocked" instead of updating).
|
|
142
|
+
|
|
143
|
+
## 6. Observability
|
|
144
|
+
|
|
145
|
+
- Health: `GET /api/health` on every service (already exists on localdost); Railway health check path set to it.
|
|
146
|
+
- Logs: structured JSON (`LOG_LEVEL`), Railway log drain → provider of choice. Hive logs contain tenant id and request id, never prompt content.
|
|
147
|
+
- Metrics (staging): pairing success rate, median pair time, tunnel connects/disconnects per tenant, relay tokens per tenant/day, push delivery success by channel (web/FCM/APNs). A simple `/api/hive/metrics` JSON page is enough before a real dashboard.
|
|
148
|
+
- Alerts: Railway deploy failure → Slack; staging `/api/health` failing 3× → Slack; Cloudflare tunnel count threshold → Slack.
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# TinyBeeAI — Coding Agent Handoff
|
|
2
|
+
|
|
3
|
+
**Audience:** the coding agent (Claude Code or similar) implementing TinyBeeAI inside this repository.
|
|
4
|
+
**Author role:** the human owner writes docs and guidance; the coding agent writes code, tests and PRs.
|
|
5
|
+
**Date:** 2026-10-24
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 0. Read in this order, before writing code
|
|
10
|
+
|
|
11
|
+
1. `AGENTS.md` (repo conventions — binding)
|
|
12
|
+
2. `SPEC.md`, `docs/DATA-MODEL.md`, `docs/CONNECTIONS.md`, `docs/DEPLOY.md`, `docs/SETUP.md` (what localdost already is)
|
|
13
|
+
3. `docs/tinybee/00-README.md` → `01-PRD.md` → `02-architecture-pairing.md` → `03-local-agent.md` → `06-environments-and-delivery.md`
|
|
14
|
+
4. `04-local-setup-ui.md` and `05-mobile-app-ux.md` when you reach UI work
|
|
15
|
+
|
|
16
|
+
Then run `npm install && npm run demo` and click through the existing app on `http://localhost:4319`. Do not propose a rewrite of localdost; TinyBee is a layer on top of it (see the term map in `00-README.md`).
|
|
17
|
+
|
|
18
|
+
## 1. Ground rules
|
|
19
|
+
|
|
20
|
+
- **Docs are the spec.** If code must deviate, open a PR that edits the relevant `docs/tinybee/*.md` first (or in the same PR) and explain why in the PR body. Undocumented behaviour is a bug.
|
|
21
|
+
- **Small PRs, one concern each**, every PR green on `npm run lint && npm test`, and e2e when it touches flows. Use conventional commit prefixes (`feat(hive):`, `feat(client):`, `fix(bee):`, `docs(tinybee):`).
|
|
22
|
+
- **Secrets never touch the repo, logs, PR text or chat.** Follow `docs/DEPLOY.md`: Railway secrets via `--stdin`.
|
|
23
|
+
- **Verify on staging PWA (`https://dots.testllms.com`) before marking a feature done.** Attach the Playwright run link and, for pairing/auth changes, a note that a real-phone pair was completed.
|
|
24
|
+
- **No user content in Hive.** Any PR that makes Hive persist workflow bodies, third-party tokens or message content is rejected by design.
|
|
25
|
+
- **Feature flags over branches.** New TinyBee surfaces ship behind `TINYBEE_ENV`/`TINYBEE_FEATURES` flags so the existing localdost behaviour keeps working for current users.
|
|
26
|
+
- **Ask when the docs are silent or contradictory**; do not invent product behaviour. Put the question in the PR or in `docs/tinybee/OPEN-QUESTIONS.md` (create it) and pick the most conservative interpretation meanwhile.
|
|
27
|
+
|
|
28
|
+
## 2. Repository layout to add
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
src/hive/ Hive service (separate entrypoint `src/hive/index.ts`, same toolchain as src/)
|
|
32
|
+
auth/ OTP, Google sign-in, JWT issue/refresh, JWKS
|
|
33
|
+
tenants/ tenant CRUD, slug rules, plan state
|
|
34
|
+
pairing/ /pair/init, /pair/complete, /pair/claim, /pair/status
|
|
35
|
+
tunnel/ TunnelProvider interface + cloudflare.ts + mock.ts
|
|
36
|
+
relay/ model relay + metering
|
|
37
|
+
push/ web-push (reuse src/notify), fcm.ts, apns.ts
|
|
38
|
+
presence/ heartbeat ingest, offline detection
|
|
39
|
+
admin/ internal endpoints (tenant list, cleanup)
|
|
40
|
+
src/bee/ TinyBee additions to the localdost server
|
|
41
|
+
identity.ts Ed25519 device key, storage abstraction (Keychain-wrapped on macOS, plain file on Linux/Railway)
|
|
42
|
+
hive-client.ts heartbeat, long-poll channel, push requests, relay client
|
|
43
|
+
tunnel-manager.ts cloudflared child process supervision
|
|
44
|
+
pairing.ts QR payload, local pairing state machine
|
|
45
|
+
health/ health checks (03-local-agent.md §4)
|
|
46
|
+
api/v1/ the mobile-facing API surface (03-local-agent.md §8), mapped onto existing localdost routes where they already exist
|
|
47
|
+
client/src/tinybee/ mobile client surfaces (onboarding, pairing, Home, degraded states) — reuse existing components
|
|
48
|
+
client/src/platform/ capability shims: qr.ts, push.ts, storage.ts (web vs capacitor)
|
|
49
|
+
capacitor/ Capacitor config and native projects (generated; commit config, not build outputs)
|
|
50
|
+
bee-installer/ macOS packaging (.pkg, launchd, menu bar)
|
|
51
|
+
test/hive/*.test.ts, test/bee/*.test.ts, e2e/tinybee/*.spec.ts
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## 3. Delivery phases and acceptance criteria
|
|
55
|
+
|
|
56
|
+
Work strictly in order; each phase ends with a staging deploy and a short demo recording (GIF or 30-s video) in the PR.
|
|
57
|
+
|
|
58
|
+
### Phase 0 — Scaffolding (1 PR)
|
|
59
|
+
- `src/hive/index.ts` boots, serves `/api/hive/health` and `/.well-known/jwks.json`.
|
|
60
|
+
- `TunnelProvider` interface + `mock.ts`; `cloudflare.ts` stubbed with TODOs.
|
|
61
|
+
- Railway service `hive` declared in `.railway/railway.ts`; deployed to staging.
|
|
62
|
+
- **Done when:** `curl https://dots.testllms.com/api/hive/health` returns version + env.
|
|
63
|
+
|
|
64
|
+
### Phase 1 — Identity & tenants
|
|
65
|
+
- Email OTP sign-up/sign-in; Google sign-in; JWT (RS256) issue/refresh; tenant create with slug validation and availability check.
|
|
66
|
+
- Client: Splash → sign-up → choose address screens (05 §3) as a PWA route `/onboarding`.
|
|
67
|
+
- **Done when:** a new user can sign up on the staging PWA and sees "Install TinyBee on your laptop" with a 6-char code; Playwright covers happy path + taken slug + expired OTP.
|
|
68
|
+
|
|
69
|
+
### Phase 2 — Pairing with mock tunnel
|
|
70
|
+
- Bee side: device key, QR payload (`02 §4.3`), `/setup` page screens 0–4 (04 §3) served by the localdost server at `localhost:7331/setup` (make port configurable; keep 4319 default for localdost).
|
|
71
|
+
- Hive side: `/pair/*` endpoints, nonce/code TTLs, replace-existing-Bee flow.
|
|
72
|
+
- Client: scanner (PWA `BarcodeDetector`/jsQR), enter-code fallback, confirm-laptop, provisioning screens.
|
|
73
|
+
- Use **mock** tunnel provider: Hive returns a fake hostname that maps straight to `bee-dev` on Railway.
|
|
74
|
+
- **Done when:** on staging, phone scans a QR rendered by `bee-dev`'s `/setup` page (opened in a desktop browser) and reaches "Your Bee is online"; `GET https://dots-dev.testllms.com/api/v1/health` succeeds with the tenant JWT; failure table in `02 §4.5` has a test per row.
|
|
75
|
+
|
|
76
|
+
### Phase 3 — Real Cloudflare tunnel + edge auth
|
|
77
|
+
- `cloudflare.ts`: create tunnel, configure ingress, DNS CNAME, revoke; idempotent by name.
|
|
78
|
+
- Edge auth Worker (in `infra/cf-worker/`) validating JWT + slug↔tenant; deploy via Wrangler from CI.
|
|
79
|
+
- Bee `tunnel-manager.ts` runs bundled `cloudflared` with the token; reconnect/backoff; status in health.
|
|
80
|
+
- Staging tenant cleanup job (06 §5).
|
|
81
|
+
- **Done when:** a fresh `test-<id>` tenant gets `dots-test-<id>.testllms.com`, unauthenticated request → 401 at edge, authenticated → Bee; nightly cleanup removes it.
|
|
82
|
+
|
|
83
|
+
### Phase 4 — Mobile core on the existing localdost capabilities
|
|
84
|
+
- Home (status card, Needs-you approvals mapped to localdost Inbox, digest, recent activity), Chat (existing chat with action cards), Workflows list mapping dots/Watches, Connections mapping existing integrations, degraded states (05 §10).
|
|
85
|
+
- Presence: heartbeat + offline push.
|
|
86
|
+
- **Done when:** every row of `05 §10` is reachable in Playwright by faking Bee state; a demo video shows approve-from-phone of a localdost Inbox item through the tunnel.
|
|
87
|
+
|
|
88
|
+
### Phase 5 — Guided workflow editor & skills
|
|
89
|
+
- `POST /workflows/from-text` producing the YAML in `03 §6.1`; guided editor (05 §6.3); skills library seeded with 5 role presets from localdost plus 3 consumer skills (Gmail digest, Sheet watch, URL monitor).
|
|
90
|
+
- Permission scopes `auto|ask|deny` mapped onto the existing rule gate.
|
|
91
|
+
- **Done when:** a non-technical tester creates a working workflow from the phone in < 2 minutes on staging.
|
|
92
|
+
|
|
93
|
+
### Phase 6 — Billing, relay, metering
|
|
94
|
+
- Plan state, 30-day trial, token metering through relay, soft stop, BYOK bypass, "local only" suspension behaviour (Bee keeps running).
|
|
95
|
+
- Payment gateway in **test mode only** on staging.
|
|
96
|
+
- **Done when:** trial expiry on a test tenant flips the Bee to 🟡 Local only within 5 minutes and upgrade in test mode restores it.
|
|
97
|
+
|
|
98
|
+
### Phase 7 — Native packaging
|
|
99
|
+
- Capacitor Android/iOS projects; FCM/APNs push path in Hive; deep links; store metadata.
|
|
100
|
+
- macOS Bee installer (signed + notarized `.pkg`), LaunchDaemon plist, menu bar app, pmset step, auto-update manifest (03 §3, §12).
|
|
101
|
+
- **Done when:** APK and TestFlight builds pass the same Playwright-equivalent manual checklist; a Mac pairs with a real phone over mobile data, and survives lid-close on AC and a reboot.
|
|
102
|
+
|
|
103
|
+
## 4. Definition of Done (every PR)
|
|
104
|
+
|
|
105
|
+
- [ ] Lint, unit, e2e pass in CI.
|
|
106
|
+
- [ ] Staging deploy succeeded and `/api/hive/health` + `/api/health` are green.
|
|
107
|
+
- [ ] Feature verified on the **staging PWA**; link to Playwright run in PR.
|
|
108
|
+
- [ ] Docs updated (`docs/tinybee/*` and localdost docs if behaviour changed).
|
|
109
|
+
- [ ] No secrets, no user content in Hive, no new network egress from the Bee beyond Hive, Cloudflare, configured providers.
|
|
110
|
+
- [ ] `CHANGELOG.md` entry under *Unreleased*.
|
|
111
|
+
|
|
112
|
+
## 5. How to report back
|
|
113
|
+
|
|
114
|
+
End every work session with a short note in the PR or in `docs/tinybee/PROGRESS.md` (create it):
|
|
115
|
+
- what was completed (link PRs), what is verified on staging, what is blocked and why, which open question needs the owner's decision.
|
|
116
|
+
Keep it under 15 lines. The owner reads this, not the diff.
|