availsync 0.1.0
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/.adal/skills/stripe-best-practices/SKILL.md +42 -0
- package/.adal/skills/stripe-best-practices/references/billing.md +36 -0
- package/.adal/skills/stripe-best-practices/references/connect.md +48 -0
- package/.adal/skills/stripe-best-practices/references/payments.md +79 -0
- package/.adal/skills/stripe-best-practices/references/security.md +109 -0
- package/.adal/skills/stripe-best-practices/references/treasury.md +16 -0
- package/.adal/skills/stripe-projects/SKILL.md +139 -0
- package/.adal/skills/upgrade-stripe/SKILL.md +185 -0
- package/.agents/skills/stripe-best-practices/SKILL.md +42 -0
- package/.agents/skills/stripe-best-practices/references/billing.md +36 -0
- package/.agents/skills/stripe-best-practices/references/connect.md +48 -0
- package/.agents/skills/stripe-best-practices/references/payments.md +79 -0
- package/.agents/skills/stripe-best-practices/references/security.md +109 -0
- package/.agents/skills/stripe-best-practices/references/treasury.md +16 -0
- package/.agents/skills/stripe-projects/SKILL.md +139 -0
- package/.agents/skills/upgrade-stripe/SKILL.md +185 -0
- package/.augment/skills/stripe-best-practices/SKILL.md +42 -0
- package/.augment/skills/stripe-best-practices/references/billing.md +36 -0
- package/.augment/skills/stripe-best-practices/references/connect.md +48 -0
- package/.augment/skills/stripe-best-practices/references/payments.md +79 -0
- package/.augment/skills/stripe-best-practices/references/security.md +109 -0
- package/.augment/skills/stripe-best-practices/references/treasury.md +16 -0
- package/.augment/skills/stripe-projects/SKILL.md +139 -0
- package/.augment/skills/upgrade-stripe/SKILL.md +185 -0
- package/.bob/skills/stripe-best-practices/SKILL.md +42 -0
- package/.bob/skills/stripe-best-practices/references/billing.md +36 -0
- package/.bob/skills/stripe-best-practices/references/connect.md +48 -0
- package/.bob/skills/stripe-best-practices/references/payments.md +79 -0
- package/.bob/skills/stripe-best-practices/references/security.md +109 -0
- package/.bob/skills/stripe-best-practices/references/treasury.md +16 -0
- package/.bob/skills/stripe-projects/SKILL.md +139 -0
- package/.bob/skills/upgrade-stripe/SKILL.md +185 -0
- package/.claude/settings.local.json +7 -0
- package/.claude/skills/stripe-best-practices/SKILL.md +42 -0
- package/.claude/skills/stripe-best-practices/references/billing.md +36 -0
- package/.claude/skills/stripe-best-practices/references/connect.md +48 -0
- package/.claude/skills/stripe-best-practices/references/payments.md +79 -0
- package/.claude/skills/stripe-best-practices/references/security.md +109 -0
- package/.claude/skills/stripe-best-practices/references/treasury.md +16 -0
- package/.claude/skills/stripe-projects/SKILL.md +139 -0
- package/.claude/skills/upgrade-stripe/SKILL.md +185 -0
- package/.codebuddy/skills/stripe-best-practices/SKILL.md +42 -0
- package/.codebuddy/skills/stripe-best-practices/references/billing.md +36 -0
- package/.codebuddy/skills/stripe-best-practices/references/connect.md +48 -0
- package/.codebuddy/skills/stripe-best-practices/references/payments.md +79 -0
- package/.codebuddy/skills/stripe-best-practices/references/security.md +109 -0
- package/.codebuddy/skills/stripe-best-practices/references/treasury.md +16 -0
- package/.codebuddy/skills/stripe-projects/SKILL.md +139 -0
- package/.codebuddy/skills/upgrade-stripe/SKILL.md +185 -0
- package/.commandcode/skills/stripe-best-practices/SKILL.md +42 -0
- package/.commandcode/skills/stripe-best-practices/references/billing.md +36 -0
- package/.commandcode/skills/stripe-best-practices/references/connect.md +48 -0
- package/.commandcode/skills/stripe-best-practices/references/payments.md +79 -0
- package/.commandcode/skills/stripe-best-practices/references/security.md +109 -0
- package/.commandcode/skills/stripe-best-practices/references/treasury.md +16 -0
- package/.commandcode/skills/stripe-projects/SKILL.md +139 -0
- package/.commandcode/skills/upgrade-stripe/SKILL.md +185 -0
- package/.continue/skills/stripe-best-practices/SKILL.md +42 -0
- package/.continue/skills/stripe-best-practices/references/billing.md +36 -0
- package/.continue/skills/stripe-best-practices/references/connect.md +48 -0
- package/.continue/skills/stripe-best-practices/references/payments.md +79 -0
- package/.continue/skills/stripe-best-practices/references/security.md +109 -0
- package/.continue/skills/stripe-best-practices/references/treasury.md +16 -0
- package/.continue/skills/stripe-projects/SKILL.md +139 -0
- package/.continue/skills/upgrade-stripe/SKILL.md +185 -0
- package/.cortex/skills/stripe-best-practices/SKILL.md +42 -0
- package/.cortex/skills/stripe-best-practices/references/billing.md +36 -0
- package/.cortex/skills/stripe-best-practices/references/connect.md +48 -0
- package/.cortex/skills/stripe-best-practices/references/payments.md +79 -0
- package/.cortex/skills/stripe-best-practices/references/security.md +109 -0
- package/.cortex/skills/stripe-best-practices/references/treasury.md +16 -0
- package/.cortex/skills/stripe-projects/SKILL.md +139 -0
- package/.cortex/skills/upgrade-stripe/SKILL.md +185 -0
- package/.crush/skills/stripe-best-practices/SKILL.md +42 -0
- package/.crush/skills/stripe-best-practices/references/billing.md +36 -0
- package/.crush/skills/stripe-best-practices/references/connect.md +48 -0
- package/.crush/skills/stripe-best-practices/references/payments.md +79 -0
- package/.crush/skills/stripe-best-practices/references/security.md +109 -0
- package/.crush/skills/stripe-best-practices/references/treasury.md +16 -0
- package/.crush/skills/stripe-projects/SKILL.md +139 -0
- package/.crush/skills/upgrade-stripe/SKILL.md +185 -0
- package/.env.example +20 -0
- package/.factory/skills/stripe-best-practices/SKILL.md +42 -0
- package/.factory/skills/stripe-best-practices/references/billing.md +36 -0
- package/.factory/skills/stripe-best-practices/references/connect.md +48 -0
- package/.factory/skills/stripe-best-practices/references/payments.md +79 -0
- package/.factory/skills/stripe-best-practices/references/security.md +109 -0
- package/.factory/skills/stripe-best-practices/references/treasury.md +16 -0
- package/.factory/skills/stripe-projects/SKILL.md +139 -0
- package/.factory/skills/upgrade-stripe/SKILL.md +185 -0
- package/.goose/skills/stripe-best-practices/SKILL.md +42 -0
- package/.goose/skills/stripe-best-practices/references/billing.md +36 -0
- package/.goose/skills/stripe-best-practices/references/connect.md +48 -0
- package/.goose/skills/stripe-best-practices/references/payments.md +79 -0
- package/.goose/skills/stripe-best-practices/references/security.md +109 -0
- package/.goose/skills/stripe-best-practices/references/treasury.md +16 -0
- package/.goose/skills/stripe-projects/SKILL.md +139 -0
- package/.goose/skills/upgrade-stripe/SKILL.md +185 -0
- package/.iflow/skills/stripe-best-practices/SKILL.md +42 -0
- package/.iflow/skills/stripe-best-practices/references/billing.md +36 -0
- package/.iflow/skills/stripe-best-practices/references/connect.md +48 -0
- package/.iflow/skills/stripe-best-practices/references/payments.md +79 -0
- package/.iflow/skills/stripe-best-practices/references/security.md +109 -0
- package/.iflow/skills/stripe-best-practices/references/treasury.md +16 -0
- package/.iflow/skills/stripe-projects/SKILL.md +139 -0
- package/.iflow/skills/upgrade-stripe/SKILL.md +185 -0
- package/.junie/skills/stripe-best-practices/SKILL.md +42 -0
- package/.junie/skills/stripe-best-practices/references/billing.md +36 -0
- package/.junie/skills/stripe-best-practices/references/connect.md +48 -0
- package/.junie/skills/stripe-best-practices/references/payments.md +79 -0
- package/.junie/skills/stripe-best-practices/references/security.md +109 -0
- package/.junie/skills/stripe-best-practices/references/treasury.md +16 -0
- package/.junie/skills/stripe-projects/SKILL.md +139 -0
- package/.junie/skills/upgrade-stripe/SKILL.md +185 -0
- package/.kilocode/skills/stripe-best-practices/SKILL.md +42 -0
- package/.kilocode/skills/stripe-best-practices/references/billing.md +36 -0
- package/.kilocode/skills/stripe-best-practices/references/connect.md +48 -0
- package/.kilocode/skills/stripe-best-practices/references/payments.md +79 -0
- package/.kilocode/skills/stripe-best-practices/references/security.md +109 -0
- package/.kilocode/skills/stripe-best-practices/references/treasury.md +16 -0
- package/.kilocode/skills/stripe-projects/SKILL.md +139 -0
- package/.kilocode/skills/upgrade-stripe/SKILL.md +185 -0
- package/.kiro/skills/stripe-best-practices/SKILL.md +42 -0
- package/.kiro/skills/stripe-best-practices/references/billing.md +36 -0
- package/.kiro/skills/stripe-best-practices/references/connect.md +48 -0
- package/.kiro/skills/stripe-best-practices/references/payments.md +79 -0
- package/.kiro/skills/stripe-best-practices/references/security.md +109 -0
- package/.kiro/skills/stripe-best-practices/references/treasury.md +16 -0
- package/.kiro/skills/stripe-projects/SKILL.md +139 -0
- package/.kiro/skills/upgrade-stripe/SKILL.md +185 -0
- package/.kode/skills/stripe-best-practices/SKILL.md +42 -0
- package/.kode/skills/stripe-best-practices/references/billing.md +36 -0
- package/.kode/skills/stripe-best-practices/references/connect.md +48 -0
- package/.kode/skills/stripe-best-practices/references/payments.md +79 -0
- package/.kode/skills/stripe-best-practices/references/security.md +109 -0
- package/.kode/skills/stripe-best-practices/references/treasury.md +16 -0
- package/.kode/skills/stripe-projects/SKILL.md +139 -0
- package/.kode/skills/upgrade-stripe/SKILL.md +185 -0
- package/.mcpjam/skills/stripe-best-practices/SKILL.md +42 -0
- package/.mcpjam/skills/stripe-best-practices/references/billing.md +36 -0
- package/.mcpjam/skills/stripe-best-practices/references/connect.md +48 -0
- package/.mcpjam/skills/stripe-best-practices/references/payments.md +79 -0
- package/.mcpjam/skills/stripe-best-practices/references/security.md +109 -0
- package/.mcpjam/skills/stripe-best-practices/references/treasury.md +16 -0
- package/.mcpjam/skills/stripe-projects/SKILL.md +139 -0
- package/.mcpjam/skills/upgrade-stripe/SKILL.md +185 -0
- package/.mux/skills/stripe-best-practices/SKILL.md +42 -0
- package/.mux/skills/stripe-best-practices/references/billing.md +36 -0
- package/.mux/skills/stripe-best-practices/references/connect.md +48 -0
- package/.mux/skills/stripe-best-practices/references/payments.md +79 -0
- package/.mux/skills/stripe-best-practices/references/security.md +109 -0
- package/.mux/skills/stripe-best-practices/references/treasury.md +16 -0
- package/.mux/skills/stripe-projects/SKILL.md +139 -0
- package/.mux/skills/upgrade-stripe/SKILL.md +185 -0
- package/.neovate/skills/stripe-best-practices/SKILL.md +42 -0
- package/.neovate/skills/stripe-best-practices/references/billing.md +36 -0
- package/.neovate/skills/stripe-best-practices/references/connect.md +48 -0
- package/.neovate/skills/stripe-best-practices/references/payments.md +79 -0
- package/.neovate/skills/stripe-best-practices/references/security.md +109 -0
- package/.neovate/skills/stripe-best-practices/references/treasury.md +16 -0
- package/.neovate/skills/stripe-projects/SKILL.md +139 -0
- package/.neovate/skills/upgrade-stripe/SKILL.md +185 -0
- package/.nixpacksignore +14 -0
- package/.openhands/skills/stripe-best-practices/SKILL.md +42 -0
- package/.openhands/skills/stripe-best-practices/references/billing.md +36 -0
- package/.openhands/skills/stripe-best-practices/references/connect.md +48 -0
- package/.openhands/skills/stripe-best-practices/references/payments.md +79 -0
- package/.openhands/skills/stripe-best-practices/references/security.md +109 -0
- package/.openhands/skills/stripe-best-practices/references/treasury.md +16 -0
- package/.openhands/skills/stripe-projects/SKILL.md +139 -0
- package/.openhands/skills/upgrade-stripe/SKILL.md +185 -0
- package/.pi/skills/stripe-best-practices/SKILL.md +42 -0
- package/.pi/skills/stripe-best-practices/references/billing.md +36 -0
- package/.pi/skills/stripe-best-practices/references/connect.md +48 -0
- package/.pi/skills/stripe-best-practices/references/payments.md +79 -0
- package/.pi/skills/stripe-best-practices/references/security.md +109 -0
- package/.pi/skills/stripe-best-practices/references/treasury.md +16 -0
- package/.pi/skills/stripe-projects/SKILL.md +139 -0
- package/.pi/skills/upgrade-stripe/SKILL.md +185 -0
- package/.pochi/skills/stripe-best-practices/SKILL.md +42 -0
- package/.pochi/skills/stripe-best-practices/references/billing.md +36 -0
- package/.pochi/skills/stripe-best-practices/references/connect.md +48 -0
- package/.pochi/skills/stripe-best-practices/references/payments.md +79 -0
- package/.pochi/skills/stripe-best-practices/references/security.md +109 -0
- package/.pochi/skills/stripe-best-practices/references/treasury.md +16 -0
- package/.pochi/skills/stripe-projects/SKILL.md +139 -0
- package/.pochi/skills/upgrade-stripe/SKILL.md +185 -0
- package/.qoder/skills/stripe-best-practices/SKILL.md +42 -0
- package/.qoder/skills/stripe-best-practices/references/billing.md +36 -0
- package/.qoder/skills/stripe-best-practices/references/connect.md +48 -0
- package/.qoder/skills/stripe-best-practices/references/payments.md +79 -0
- package/.qoder/skills/stripe-best-practices/references/security.md +109 -0
- package/.qoder/skills/stripe-best-practices/references/treasury.md +16 -0
- package/.qoder/skills/stripe-projects/SKILL.md +139 -0
- package/.qoder/skills/upgrade-stripe/SKILL.md +185 -0
- package/.qwen/skills/stripe-best-practices/SKILL.md +42 -0
- package/.qwen/skills/stripe-best-practices/references/billing.md +36 -0
- package/.qwen/skills/stripe-best-practices/references/connect.md +48 -0
- package/.qwen/skills/stripe-best-practices/references/payments.md +79 -0
- package/.qwen/skills/stripe-best-practices/references/security.md +109 -0
- package/.qwen/skills/stripe-best-practices/references/treasury.md +16 -0
- package/.qwen/skills/stripe-projects/SKILL.md +139 -0
- package/.qwen/skills/upgrade-stripe/SKILL.md +185 -0
- package/.roo/skills/stripe-best-practices/SKILL.md +42 -0
- package/.roo/skills/stripe-best-practices/references/billing.md +36 -0
- package/.roo/skills/stripe-best-practices/references/connect.md +48 -0
- package/.roo/skills/stripe-best-practices/references/payments.md +79 -0
- package/.roo/skills/stripe-best-practices/references/security.md +109 -0
- package/.roo/skills/stripe-best-practices/references/treasury.md +16 -0
- package/.roo/skills/stripe-projects/SKILL.md +139 -0
- package/.roo/skills/upgrade-stripe/SKILL.md +185 -0
- package/.trae/skills/stripe-best-practices/SKILL.md +42 -0
- package/.trae/skills/stripe-best-practices/references/billing.md +36 -0
- package/.trae/skills/stripe-best-practices/references/connect.md +48 -0
- package/.trae/skills/stripe-best-practices/references/payments.md +79 -0
- package/.trae/skills/stripe-best-practices/references/security.md +109 -0
- package/.trae/skills/stripe-best-practices/references/treasury.md +16 -0
- package/.trae/skills/stripe-projects/SKILL.md +139 -0
- package/.trae/skills/upgrade-stripe/SKILL.md +185 -0
- package/.vibe/skills/stripe-best-practices/SKILL.md +42 -0
- package/.vibe/skills/stripe-best-practices/references/billing.md +36 -0
- package/.vibe/skills/stripe-best-practices/references/connect.md +48 -0
- package/.vibe/skills/stripe-best-practices/references/payments.md +79 -0
- package/.vibe/skills/stripe-best-practices/references/security.md +109 -0
- package/.vibe/skills/stripe-best-practices/references/treasury.md +16 -0
- package/.vibe/skills/stripe-projects/SKILL.md +139 -0
- package/.vibe/skills/upgrade-stripe/SKILL.md +185 -0
- package/.windsurf/skills/stripe-best-practices/SKILL.md +42 -0
- package/.windsurf/skills/stripe-best-practices/references/billing.md +36 -0
- package/.windsurf/skills/stripe-best-practices/references/connect.md +48 -0
- package/.windsurf/skills/stripe-best-practices/references/payments.md +79 -0
- package/.windsurf/skills/stripe-best-practices/references/security.md +109 -0
- package/.windsurf/skills/stripe-best-practices/references/treasury.md +16 -0
- package/.windsurf/skills/stripe-projects/SKILL.md +139 -0
- package/.windsurf/skills/upgrade-stripe/SKILL.md +185 -0
- package/.zencoder/skills/stripe-best-practices/SKILL.md +42 -0
- package/.zencoder/skills/stripe-best-practices/references/billing.md +36 -0
- package/.zencoder/skills/stripe-best-practices/references/connect.md +48 -0
- package/.zencoder/skills/stripe-best-practices/references/payments.md +79 -0
- package/.zencoder/skills/stripe-best-practices/references/security.md +109 -0
- package/.zencoder/skills/stripe-best-practices/references/treasury.md +16 -0
- package/.zencoder/skills/stripe-projects/SKILL.md +139 -0
- package/.zencoder/skills/upgrade-stripe/SKILL.md +185 -0
- package/AUDIT.md +95 -0
- package/BLOCKERS.md +0 -0
- package/COOLIFY.md +51 -0
- package/MCP_SETUP.md +23 -0
- package/PRODUCTION_CHECKLIST.md +246 -0
- package/README.md +47 -0
- package/ROADMAP.md +91 -0
- package/docs/superpowers/plans/2026-05-11-availsync-frontend-sales-flow.md +2445 -0
- package/frontend/.env.example +2 -0
- package/frontend/app/admin/layout.tsx +13 -0
- package/frontend/app/admin/page.tsx +747 -0
- package/frontend/app/app/activity/page.tsx +257 -0
- package/frontend/app/app/agents/[agentId]/page.tsx +21 -0
- package/frontend/app/app/agents/page.tsx +1155 -0
- package/frontend/app/app/audit/page.tsx +225 -0
- package/frontend/app/app/availability/page.tsx +840 -0
- package/frontend/app/app/holds/page.tsx +262 -0
- package/frontend/app/app/layout.tsx +19 -0
- package/frontend/app/app/onboarding/page.tsx +10 -0
- package/frontend/app/app/onboarding/verify/page.tsx +309 -0
- package/frontend/app/app/page.tsx +508 -0
- package/frontend/app/app/settings/page.tsx +399 -0
- package/frontend/app/app/work/page.tsx +426 -0
- package/frontend/app/changelog/page.tsx +93 -0
- package/frontend/app/checkout/page.tsx +25 -0
- package/frontend/app/docs/api/page.tsx +157 -0
- package/frontend/app/docs/page.tsx +296 -0
- package/frontend/app/docs/pilot/page.tsx +127 -0
- package/frontend/app/docs/quickstart/page.tsx +318 -0
- package/frontend/app/docs/reliability/page.tsx +78 -0
- package/frontend/app/docs/sdk/node/page.tsx +166 -0
- package/frontend/app/globals.css +57 -0
- package/frontend/app/icon.png +0 -0
- package/frontend/app/layout.tsx +87 -0
- package/frontend/app/login/page.tsx +14 -0
- package/frontend/app/page.tsx +47 -0
- package/frontend/app/pricing/page.tsx +66 -0
- package/frontend/app/privacy/page.tsx +52 -0
- package/frontend/app/robots.ts +26 -0
- package/frontend/app/security/page.tsx +74 -0
- package/frontend/app/signup/page.tsx +14 -0
- package/frontend/app/sitemap.ts +14 -0
- package/frontend/app/terms/page.tsx +51 -0
- package/frontend/components/brand/AvailsyncLogo.tsx +56 -0
- package/frontend/components/checkout/CheckoutClient.tsx +100 -0
- package/frontend/components/dashboard/AgentForm.tsx +59 -0
- package/frontend/components/dashboard/AppShell.tsx +291 -0
- package/frontend/components/dashboard/AvailabilityChecker.tsx +117 -0
- package/frontend/components/dashboard/AvailabilityWindowForm.tsx +40 -0
- package/frontend/components/dashboard/HoldForm.tsx +133 -0
- package/frontend/components/dashboard/MetricCard.tsx +10 -0
- package/frontend/components/login/LoginForm.tsx +95 -0
- package/frontend/components/marketing/AgentCoordinationStory.tsx +1530 -0
- package/frontend/components/marketing/Faq.tsx +41 -0
- package/frontend/components/marketing/Hero.tsx +73 -0
- package/frontend/components/marketing/HowItWorks.tsx +28 -0
- package/frontend/components/marketing/ObserveModeTeaser.tsx +41 -0
- package/frontend/components/marketing/PricingTeaser.tsx +23 -0
- package/frontend/components/marketing/ProblemSolution.tsx +36 -0
- package/frontend/components/marketing/SiteFooter.tsx +59 -0
- package/frontend/components/marketing/SiteHeader.tsx +45 -0
- package/frontend/components/marketing/UseCases.tsx +27 -0
- package/frontend/components/onboarding/OnboardingClient.tsx +278 -0
- package/frontend/components/pricing/PricingCards.tsx +65 -0
- package/frontend/components/privacy/CookieConsent.tsx +230 -0
- package/frontend/components/privacy/CookieSettingsButton.tsx +15 -0
- package/frontend/components/seo/JsonLd.tsx +10 -0
- package/frontend/components/signup/SignupForm.tsx +55 -0
- package/frontend/components/ui/Badge.tsx +23 -0
- package/frontend/components/ui/Button.tsx +37 -0
- package/frontend/components/ui/Card.tsx +11 -0
- package/frontend/components/ui/ConfirmDialog.tsx +77 -0
- package/frontend/components/ui/EmptyState.tsx +24 -0
- package/frontend/components/ui/Input.tsx +14 -0
- package/frontend/components/ui/KeyDisplay.tsx +49 -0
- package/frontend/components/ui/Select.tsx +14 -0
- package/frontend/components/ui/Skeleton.tsx +24 -0
- package/frontend/components/ui/Tabs.tsx +19 -0
- package/frontend/components/ui/Textarea.tsx +14 -0
- package/frontend/components/ui/Toast.tsx +78 -0
- package/frontend/components/waitlist/WaitlistDialog.tsx +128 -0
- package/frontend/lib/api.ts +1282 -0
- package/frontend/lib/billing.ts +6 -0
- package/frontend/lib/cookieConsent.ts +113 -0
- package/frontend/lib/format.ts +16 -0
- package/frontend/lib/plans.ts +62 -0
- package/frontend/lib/schemas.ts +108 -0
- package/frontend/lib/seo.ts +376 -0
- package/frontend/lib/setupGuides.ts +630 -0
- package/frontend/lib/storage.ts +30 -0
- package/frontend/next-env.d.ts +6 -0
- package/frontend/next.config.mjs +13 -0
- package/frontend/package-lock.json +14409 -0
- package/frontend/package.json +41 -0
- package/frontend/playwright.config.ts +20 -0
- package/frontend/postcss.config.mjs +8 -0
- package/frontend/public/.gitkeep +0 -0
- package/frontend/public/brand/availsync-logo-board.png +0 -0
- package/frontend/public/brand/availsync-logo-dark.png +0 -0
- package/frontend/public/brand/availsync-mark-dark.png +0 -0
- package/frontend/public/brand/availsync-wordmark-dark.png +0 -0
- package/frontend/public/marketing/hero-agent-coordination.png +0 -0
- package/frontend/tailwind.config.ts +53 -0
- package/frontend/tests/smoke.spec.ts +89 -0
- package/frontend/tsconfig.json +23 -0
- package/jest.config.js +7 -0
- package/nixpacks.toml +11 -0
- package/package.json +53 -0
- package/packages/mcp/LICENSE +21 -0
- package/packages/mcp/README.md +60 -0
- package/packages/mcp/jest.config.cjs +8 -0
- package/packages/mcp/package.json +54 -0
- package/packages/mcp/src/helpers.ts +38 -0
- package/packages/mcp/src/index.test.ts +60 -0
- package/packages/mcp/src/index.ts +387 -0
- package/packages/mcp/tsconfig.json +20 -0
- package/packages/mcp/tsconfig.test.json +12 -0
- package/packages/node/LICENSE +21 -0
- package/packages/node/README.md +120 -0
- package/packages/node/jest.config.cjs +8 -0
- package/packages/node/package.json +46 -0
- package/packages/node/src/index.test.ts +360 -0
- package/packages/node/src/index.ts +402 -0
- package/packages/node/tsconfig.json +20 -0
- package/packages/node/tsconfig.test.json +12 -0
- package/plan.md +923 -0
- package/skills/stripe-best-practices/SKILL.md +42 -0
- package/skills/stripe-best-practices/references/billing.md +36 -0
- package/skills/stripe-best-practices/references/connect.md +48 -0
- package/skills/stripe-best-practices/references/payments.md +79 -0
- package/skills/stripe-best-practices/references/security.md +109 -0
- package/skills/stripe-best-practices/references/treasury.md +16 -0
- package/skills/stripe-projects/SKILL.md +139 -0
- package/skills/upgrade-stripe/SKILL.md +185 -0
- package/skills-lock.json +20 -0
- package/src/core/availability.ts +178 -0
- package/src/core/conflict.ts +209 -0
- package/src/core/work.ts +490 -0
- package/src/db/client.ts +17 -0
- package/src/db/migrations/001_init.sql +88 -0
- package/src/db/migrations/002_stripe.sql +2 -0
- package/src/db/migrations/003_workspace_auth.sql +19 -0
- package/src/db/migrations/004_agent_mcp_status.sql +2 -0
- package/src/db/migrations/005_hold_event_actor.sql +4 -0
- package/src/db/migrations/006_agent_activity.sql +35 -0
- package/src/db/migrations/007_work_coordination.sql +60 -0
- package/src/db/migrations/008_work_claim_leases.sql +20 -0
- package/src/db/migrations/009_billing_subscription_state.sql +23 -0
- package/src/db/migrations/010_agent_api_key_prefix.sql +10 -0
- package/src/db/migrations/011_org_verified_and_work_event_retention.sql +11 -0
- package/src/db/migrations/012_agent_enforcement_mode.sql +12 -0
- package/src/db/migrations/013_support_tickets.sql +21 -0
- package/src/db/migrations/014_paid_plan_waitlist.sql +23 -0
- package/src/db/migrations/015_agent_last_seen.sql +2 -0
- package/src/db/migrations.ts +164 -0
- package/src/db/run-migrations.ts +13 -0
- package/src/index.ts +183 -0
- package/src/lib/activity.ts +137 -0
- package/src/lib/apiKeys.ts +32 -0
- package/src/lib/appInfo.ts +26 -0
- package/src/lib/billingConfig.ts +3 -0
- package/src/lib/env.ts +75 -0
- package/src/lib/logger.ts +8 -0
- package/src/lib/plans.ts +204 -0
- package/src/mcp/server.js +5 -0
- package/src/mcp/server.ts +350 -0
- package/src/middleware/auth.ts +342 -0
- package/src/middleware/requestId.ts +16 -0
- package/src/routes/account.ts +168 -0
- package/src/routes/activity.ts +126 -0
- package/src/routes/admin.ts +514 -0
- package/src/routes/audit.ts +68 -0
- package/src/routes/auth.ts +203 -0
- package/src/routes/availability.ts +325 -0
- package/src/routes/billing.ts +406 -0
- package/src/routes/conflicts.ts +131 -0
- package/src/routes/holds.ts +437 -0
- package/src/routes/mcp.ts +57 -0
- package/src/routes/metrics.ts +39 -0
- package/src/routes/onboarding.ts +273 -0
- package/src/routes/orgs.ts +981 -0
- package/src/routes/preferences.ts +132 -0
- package/src/routes/session.ts +16 -0
- package/src/routes/support.ts +77 -0
- package/src/routes/value.ts +186 -0
- package/src/routes/waitlist.ts +63 -0
- package/src/routes/work.ts +1578 -0
- package/src/server.ts +36 -0
- package/src/types/index.ts +109 -0
- package/tests/integration/activity.route.test.ts +103 -0
- package/tests/integration/admin.route.test.ts +143 -0
- package/tests/integration/agent-keys.route.test.ts +237 -0
- package/tests/integration/availability.route.test.ts +125 -0
- package/tests/integration/billing.route.test.ts +393 -0
- package/tests/integration/conflicts.route.test.ts +131 -0
- package/tests/integration/flows.test.ts +154 -0
- package/tests/integration/helpers.ts +134 -0
- package/tests/integration/holds.route.test.ts +185 -0
- package/tests/integration/metrics.route.test.ts +100 -0
- package/tests/integration/onboarding.verify.route.test.ts +163 -0
- package/tests/integration/preferences.route.test.ts +53 -0
- package/tests/integration/session.route.test.ts +97 -0
- package/tests/integration/system.route.test.ts +92 -0
- package/tests/integration/value.route.test.ts +235 -0
- package/tests/integration/work.route.test.ts +745 -0
- package/tests/setup.ts +4 -0
- package/tests/smoke.sh +62 -0
- package/tests/unit/auth.test.ts +114 -0
- package/tests/unit/availability.test.ts +149 -0
- package/tests/unit/conflict.test.ts +118 -0
- package/tests/unit/env.test.ts +69 -0
- package/tests/unit/migrations.test.ts +135 -0
- package/tests/unit/request-id.test.ts +37 -0
- package/tmp-mobile-agents.png +0 -0
- package/tmp-next-mobile.err.log +10 -0
- package/tmp-next-mobile.log +5 -0
- package/tsconfig.json +16 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { faqSchemaItems } from '@/lib/seo';
|
|
2
|
+
import { Plus } from 'lucide-react';
|
|
3
|
+
|
|
4
|
+
export function Faq() {
|
|
5
|
+
return (
|
|
6
|
+
<section className="bg-bg">
|
|
7
|
+
<div className="mx-auto grid max-w-6xl gap-8 px-4 py-20 lg:grid-cols-[0.72fr_1.28fr]">
|
|
8
|
+
<div>
|
|
9
|
+
<p className="text-label uppercase text-text-tertiary">FAQ</p>
|
|
10
|
+
<h2 className="mt-3 text-3xl font-semibold text-text-primary">Questions buyers ask</h2>
|
|
11
|
+
<p className="mt-4 max-w-sm text-body leading-6 text-text-secondary">
|
|
12
|
+
Short answers for teams comparing Availsync with agent frameworks, policy tools,
|
|
13
|
+
calendars, and homegrown locks.
|
|
14
|
+
</p>
|
|
15
|
+
</div>
|
|
16
|
+
<div className="space-y-3">
|
|
17
|
+
{faqSchemaItems.map(({ question, answer }) => (
|
|
18
|
+
<details
|
|
19
|
+
className="group rounded border border-border bg-surface transition-colors open:border-border-focus open:bg-surface-raised"
|
|
20
|
+
key={question}
|
|
21
|
+
>
|
|
22
|
+
<summary className="flex cursor-pointer list-none items-start justify-between gap-4 px-5 py-4 text-heading font-semibold text-text-primary marker:hidden">
|
|
23
|
+
<span>{question}</span>
|
|
24
|
+
<span className="mt-0.5 flex h-7 w-7 shrink-0 items-center justify-center rounded border border-border bg-bg text-text-tertiary transition-transform group-open:rotate-45 group-open:text-accent">
|
|
25
|
+
<Plus className="h-4 w-4" />
|
|
26
|
+
</span>
|
|
27
|
+
</summary>
|
|
28
|
+
<div className="px-5 pb-5 pt-0">
|
|
29
|
+
{answer.split('\n\n').map((paragraph) => (
|
|
30
|
+
<p className="mt-3 text-body leading-6 text-text-secondary first:mt-0" key={paragraph}>
|
|
31
|
+
{paragraph}
|
|
32
|
+
</p>
|
|
33
|
+
))}
|
|
34
|
+
</div>
|
|
35
|
+
</details>
|
|
36
|
+
))}
|
|
37
|
+
</div>
|
|
38
|
+
</div>
|
|
39
|
+
</section>
|
|
40
|
+
);
|
|
41
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { ArrowRight, RadioTower, ShieldCheck } from 'lucide-react';
|
|
2
|
+
import { Button } from '@/components/ui/Button';
|
|
3
|
+
|
|
4
|
+
export function Hero() {
|
|
5
|
+
return (
|
|
6
|
+
<section className="relative overflow-hidden border-b border-border bg-bg">
|
|
7
|
+
<img
|
|
8
|
+
alt=""
|
|
9
|
+
aria-hidden="true"
|
|
10
|
+
className="absolute inset-0 h-full w-full object-cover opacity-70 saturate-90"
|
|
11
|
+
src="/marketing/hero-agent-coordination.png"
|
|
12
|
+
/>
|
|
13
|
+
<div className="absolute inset-0 bg-bg/70" />
|
|
14
|
+
<div className="absolute inset-0 bg-[radial-gradient(circle_at_72%_35%,rgba(94,106,210,0.18),transparent_34%),linear-gradient(90deg,rgba(15,15,15,0.98)_0%,rgba(15,15,15,0.84)_45%,rgba(15,15,15,0.58)_100%)]" />
|
|
15
|
+
<div className="relative mx-auto grid min-h-[640px] max-w-6xl items-center gap-8 px-4 py-10 md:grid-cols-[0.86fr_1.14fr] md:py-12">
|
|
16
|
+
<div className="relative z-10">
|
|
17
|
+
<p className="mb-4 inline-flex items-center gap-2 rounded border border-border bg-surface px-3 py-2 text-label font-medium uppercase text-text-secondary">
|
|
18
|
+
<ShieldCheck className="h-4 w-4" />
|
|
19
|
+
Built for AI and coding agents
|
|
20
|
+
</p>
|
|
21
|
+
<h1 className="max-w-3xl text-5xl font-semibold leading-tight text-text-primary md:text-6xl">
|
|
22
|
+
Give your coding agents one place to coordinate
|
|
23
|
+
</h1>
|
|
24
|
+
<p className="mt-6 max-w-xl text-heading leading-7 text-text-secondary">
|
|
25
|
+
Availsync gives Codex, Claude, Cursor, MCP clients, and server automations one shared place to claim a repo or project before they edit, deploy, or schedule work.
|
|
26
|
+
</p>
|
|
27
|
+
<p className="mt-4 max-w-xl text-body leading-6 text-text-primary">
|
|
28
|
+
Every integrated agent checks in before it acts.
|
|
29
|
+
</p>
|
|
30
|
+
<div className="mt-8 flex flex-col gap-3 sm:flex-row">
|
|
31
|
+
<Button href="/signup">
|
|
32
|
+
Start free <ArrowRight className="h-4 w-4" />
|
|
33
|
+
</Button>
|
|
34
|
+
<Button href="/docs/sdk/node" variant="secondary">
|
|
35
|
+
Read SDK docs
|
|
36
|
+
</Button>
|
|
37
|
+
</div>
|
|
38
|
+
<p className="mt-5 text-body text-text-tertiary">Free plan includes 3 agents. No card required.</p>
|
|
39
|
+
<p className="mt-1 text-body text-text-secondary">Paid plans are waitlist-only during the private pilot.</p>
|
|
40
|
+
</div>
|
|
41
|
+
<div className="relative z-10 md:-mr-8">
|
|
42
|
+
<div className="rounded border border-border/90 bg-surface/95 p-5 shadow-[0_28px_90px_rgba(0,0,0,0.55),inset_0_0_0_1px_rgba(255,255,255,0.04)] backdrop-blur-sm">
|
|
43
|
+
<div className="flex items-center justify-between border-b border-border pb-3">
|
|
44
|
+
<div>
|
|
45
|
+
<p className="text-label uppercase text-text-tertiary">Repo guardrail active</p>
|
|
46
|
+
<p className="mt-1 text-title font-semibold text-text-primary">Deploy Agent claimed owner/repo</p>
|
|
47
|
+
</div>
|
|
48
|
+
<span className="flex h-8 w-8 items-center justify-center rounded bg-accent/15 text-accent">
|
|
49
|
+
<RadioTower className="h-4 w-4" />
|
|
50
|
+
</span>
|
|
51
|
+
</div>
|
|
52
|
+
<div className="mt-4 grid gap-2">
|
|
53
|
+
{[
|
|
54
|
+
['repo', 'proceed', 'Deploy Agent'],
|
|
55
|
+
['repo', 'skip_run', 'Refactor Agent'],
|
|
56
|
+
['docs', 'proceed', 'Docs Agent'],
|
|
57
|
+
].map(([scope, action, label]) => (
|
|
58
|
+
<div className="grid grid-cols-[76px_1fr_auto] items-center gap-3 rounded border border-border bg-bg px-4 py-3 text-body" key={`${scope}-${label}`}>
|
|
59
|
+
<span className="font-mono text-text-primary">{scope}</span>
|
|
60
|
+
<span className="text-text-secondary">{label}</span>
|
|
61
|
+
<span className="rounded bg-surface-raised px-2 py-1 font-mono text-[11px] text-text-secondary">{action}</span>
|
|
62
|
+
</div>
|
|
63
|
+
))}
|
|
64
|
+
</div>
|
|
65
|
+
<p className="mt-4 text-body text-text-tertiary">
|
|
66
|
+
Overlapping agents skip cleanly before stale context turns into conflicting edits.
|
|
67
|
+
</p>
|
|
68
|
+
</div>
|
|
69
|
+
</div>
|
|
70
|
+
</div>
|
|
71
|
+
</section>
|
|
72
|
+
);
|
|
73
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
const steps = [
|
|
2
|
+
['Create agents', 'Add each coding agent, AI tool, or assistant with its own priority and API key.'],
|
|
3
|
+
['Choose resource scope', 'Use repo-level locks by default, then split into projects only when work streams are independent.'],
|
|
4
|
+
[
|
|
5
|
+
'Claim before work',
|
|
6
|
+
'Agents call run/start, extend the lease while working, and release it when the run finishes.',
|
|
7
|
+
],
|
|
8
|
+
];
|
|
9
|
+
|
|
10
|
+
export function HowItWorks() {
|
|
11
|
+
return (
|
|
12
|
+
<section className="border-b border-border bg-surface">
|
|
13
|
+
<div className="mx-auto max-w-6xl px-4 py-20">
|
|
14
|
+
<p className="text-label uppercase text-text-tertiary">Workflow</p>
|
|
15
|
+
<h2 className="mt-3 text-3xl font-semibold text-text-primary">How it works</h2>
|
|
16
|
+
<div className="mt-8 grid gap-4 md:grid-cols-3">
|
|
17
|
+
{steps.map(([title, body], index) => (
|
|
18
|
+
<div className="rounded border border-border bg-bg p-5" key={title}>
|
|
19
|
+
<p className="font-mono text-[11px] text-accent">0{index + 1}</p>
|
|
20
|
+
<h3 className="mt-3 text-title font-semibold text-text-primary">{title}</h3>
|
|
21
|
+
<p className="mt-3 text-body leading-6 text-text-secondary">{body}</p>
|
|
22
|
+
</div>
|
|
23
|
+
))}
|
|
24
|
+
</div>
|
|
25
|
+
</div>
|
|
26
|
+
</section>
|
|
27
|
+
);
|
|
28
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Button } from '@/components/ui/Button';
|
|
2
|
+
|
|
3
|
+
export function ObserveModeTeaser() {
|
|
4
|
+
return (
|
|
5
|
+
<section className="border-b border-border bg-bg">
|
|
6
|
+
<div className="mx-auto grid max-w-6xl gap-6 px-4 py-16 lg:grid-cols-[0.9fr_1.1fr]">
|
|
7
|
+
<div>
|
|
8
|
+
<p className="text-label uppercase text-text-tertiary">Pilot safely</p>
|
|
9
|
+
<h2 className="mt-3 text-3xl font-semibold text-text-primary">
|
|
10
|
+
Start in observe mode.
|
|
11
|
+
</h2>
|
|
12
|
+
<p className="mt-4 text-heading leading-7 text-text-secondary">
|
|
13
|
+
Availsync will not block your agents yet. It records what it would have stopped,
|
|
14
|
+
so you can measure value before enforcing.
|
|
15
|
+
</p>
|
|
16
|
+
<div className="mt-6">
|
|
17
|
+
<Button href="/docs/pilot" variant="secondary">
|
|
18
|
+
Pilot in 10 minutes
|
|
19
|
+
</Button>
|
|
20
|
+
</div>
|
|
21
|
+
</div>
|
|
22
|
+
<div className="grid gap-3 md:grid-cols-2">
|
|
23
|
+
<div className="rounded border border-border bg-surface p-5">
|
|
24
|
+
<p className="text-label uppercase text-text-tertiary">Observe</p>
|
|
25
|
+
<h3 className="mt-2 text-title font-semibold text-text-primary">Measure first</h3>
|
|
26
|
+
<p className="mt-3 text-body leading-6 text-text-secondary">
|
|
27
|
+
Agents continue running. Activity shows which runs would have received skip_run.
|
|
28
|
+
</p>
|
|
29
|
+
</div>
|
|
30
|
+
<div className="rounded border border-border bg-surface p-5">
|
|
31
|
+
<p className="text-label uppercase text-text-tertiary">Enforce</p>
|
|
32
|
+
<h3 className="mt-2 text-title font-semibold text-text-primary">Protect later</h3>
|
|
33
|
+
<p className="mt-3 text-body leading-6 text-text-secondary">
|
|
34
|
+
Once the signal is useful, switch selected agents to enforce and block overlapping claims.
|
|
35
|
+
</p>
|
|
36
|
+
</div>
|
|
37
|
+
</div>
|
|
38
|
+
</div>
|
|
39
|
+
</section>
|
|
40
|
+
);
|
|
41
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Button } from '@/components/ui/Button';
|
|
2
|
+
|
|
3
|
+
export function PricingTeaser() {
|
|
4
|
+
return (
|
|
5
|
+
<section className="border-b border-border bg-surface text-text-primary">
|
|
6
|
+
<div className="mx-auto flex max-w-6xl flex-col items-start justify-between gap-6 px-4 py-16 md:flex-row md:items-center">
|
|
7
|
+
<div>
|
|
8
|
+
<h2 className="text-3xl font-semibold">Start with 3 agents for free.</h2>
|
|
9
|
+
<p className="mt-3 max-w-2xl text-body leading-6 text-text-secondary">
|
|
10
|
+
Paid tiers are waitlist-only during the private pilot. Start free, run verification,
|
|
11
|
+
and join the waitlist when you need more agents or protected resources.
|
|
12
|
+
</p>
|
|
13
|
+
</div>
|
|
14
|
+
<div className="flex flex-wrap gap-3">
|
|
15
|
+
<Button href="/signup">Start free</Button>
|
|
16
|
+
<Button href="/docs/sdk/node" variant="secondary">
|
|
17
|
+
Read SDK docs
|
|
18
|
+
</Button>
|
|
19
|
+
</div>
|
|
20
|
+
</div>
|
|
21
|
+
</section>
|
|
22
|
+
);
|
|
23
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export function ProblemSolution() {
|
|
2
|
+
return (
|
|
3
|
+
<section className="border-b border-border bg-bg">
|
|
4
|
+
<div className="mx-auto grid max-w-6xl gap-10 px-4 py-20 md:grid-cols-[0.9fr_1.1fr]">
|
|
5
|
+
<div>
|
|
6
|
+
<p className="text-label uppercase text-text-tertiary">The failure mode</p>
|
|
7
|
+
<h2 className="mt-3 max-w-lg text-3xl font-semibold text-text-primary">
|
|
8
|
+
Your agents can read stale context and edit the same repo.
|
|
9
|
+
</h2>
|
|
10
|
+
<p className="mt-4 text-heading leading-7 text-text-secondary">
|
|
11
|
+
One agent improves the homepage while another changes the product catalog it depends
|
|
12
|
+
on. Without a shared resource claim, both runs look safe locally and conflict later.
|
|
13
|
+
</p>
|
|
14
|
+
</div>
|
|
15
|
+
<div className="rounded border border-border bg-surface p-5">
|
|
16
|
+
<p className="text-label uppercase text-text-tertiary">Decision layer</p>
|
|
17
|
+
<h2 className="mt-3 text-3xl font-semibold text-text-primary">
|
|
18
|
+
Availsync arbitrates before the agent starts work.
|
|
19
|
+
</h2>
|
|
20
|
+
<div className="mt-6 grid gap-3">
|
|
21
|
+
{[
|
|
22
|
+
['Resource claims', 'Protect a repo or project so only the right agent works there at once.'],
|
|
23
|
+
['Priority rules', 'Let deploys, migrations, reviews, and customer-facing work win deterministically.'],
|
|
24
|
+
['Runtime history', 'See checks, claims, blocked runs, extensions, releases, and actors later.'],
|
|
25
|
+
].map(([title, body]) => (
|
|
26
|
+
<div className="rounded border border-border bg-bg p-4" key={title}>
|
|
27
|
+
<p className="text-heading font-medium text-text-primary">{title}</p>
|
|
28
|
+
<p className="mt-1 text-body text-text-secondary">{body}</p>
|
|
29
|
+
</div>
|
|
30
|
+
))}
|
|
31
|
+
</div>
|
|
32
|
+
</div>
|
|
33
|
+
</div>
|
|
34
|
+
</section>
|
|
35
|
+
);
|
|
36
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { AvailsyncLogo } from '@/components/brand/AvailsyncLogo';
|
|
2
|
+
import { CookieSettingsButton } from '@/components/privacy/CookieSettingsButton';
|
|
3
|
+
|
|
4
|
+
export function SiteFooter() {
|
|
5
|
+
return (
|
|
6
|
+
<footer className="border-t border-border bg-bg text-text-primary">
|
|
7
|
+
<div className="mx-auto grid max-w-6xl gap-6 px-4 py-10 md:grid-cols-4">
|
|
8
|
+
<div>
|
|
9
|
+
<AvailsyncLogo />
|
|
10
|
+
<p className="mt-2 text-body text-text-secondary">Coordination layer for AI and coding agents.</p>
|
|
11
|
+
</div>
|
|
12
|
+
<div className="text-body text-text-secondary">
|
|
13
|
+
<p className="font-semibold text-text-primary">Product</p>
|
|
14
|
+
<a className="mt-2 block" href="/pricing">
|
|
15
|
+
Pricing
|
|
16
|
+
</a>
|
|
17
|
+
<a className="mt-2 block" href="/docs">
|
|
18
|
+
Docs
|
|
19
|
+
</a>
|
|
20
|
+
<a className="mt-2 block" href="/docs/pilot">
|
|
21
|
+
Pilot guide
|
|
22
|
+
</a>
|
|
23
|
+
<a className="mt-2 block" href="/docs/sdk/node">
|
|
24
|
+
Node SDK
|
|
25
|
+
</a>
|
|
26
|
+
<a className="mt-2 block" href="/docs/api">
|
|
27
|
+
API reference
|
|
28
|
+
</a>
|
|
29
|
+
<a className="mt-2 block" href="/signup">
|
|
30
|
+
Start free
|
|
31
|
+
</a>
|
|
32
|
+
</div>
|
|
33
|
+
<div className="text-body text-text-secondary">
|
|
34
|
+
<p className="font-semibold text-text-primary">Company</p>
|
|
35
|
+
<a className="mt-2 block" href="/changelog">
|
|
36
|
+
Changelog
|
|
37
|
+
</a>
|
|
38
|
+
<a className="mt-2 block" href="/privacy">
|
|
39
|
+
Privacy
|
|
40
|
+
</a>
|
|
41
|
+
<CookieSettingsButton className="mt-2 block text-left text-text-secondary transition hover:text-text-primary" />
|
|
42
|
+
<a className="mt-2 block" href="/terms">
|
|
43
|
+
Terms
|
|
44
|
+
</a>
|
|
45
|
+
</div>
|
|
46
|
+
<div className="text-body text-text-secondary">
|
|
47
|
+
<p className="font-semibold text-text-primary">Trust</p>
|
|
48
|
+
<a className="mt-2 block" href="/security">
|
|
49
|
+
Security
|
|
50
|
+
</a>
|
|
51
|
+
<a className="mt-2 block" href="/docs/reliability">
|
|
52
|
+
Reliability
|
|
53
|
+
</a>
|
|
54
|
+
<p className="mt-2">API keys are hashed. Runtime events store metadata, not raw request bodies.</p>
|
|
55
|
+
</div>
|
|
56
|
+
</div>
|
|
57
|
+
</footer>
|
|
58
|
+
);
|
|
59
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { useEffect, useState } from 'react';
|
|
4
|
+
import { Button } from '@/components/ui/Button';
|
|
5
|
+
import { AvailsyncLogo } from '@/components/brand/AvailsyncLogo';
|
|
6
|
+
import { loadSession, type StoredSession } from '@/lib/storage';
|
|
7
|
+
|
|
8
|
+
export function SiteHeader() {
|
|
9
|
+
const [session, setSession] = useState<StoredSession | null>(null);
|
|
10
|
+
|
|
11
|
+
useEffect(() => {
|
|
12
|
+
setSession(loadSession());
|
|
13
|
+
}, []);
|
|
14
|
+
|
|
15
|
+
return (
|
|
16
|
+
<header className="sticky top-0 z-40 border-b border-border bg-bg/95 backdrop-blur">
|
|
17
|
+
<div className="mx-auto flex max-w-6xl items-center justify-between px-4 py-4">
|
|
18
|
+
<a className="text-text-primary" href="/">
|
|
19
|
+
<AvailsyncLogo glow />
|
|
20
|
+
</a>
|
|
21
|
+
<nav className="hidden items-center gap-6 text-body text-text-secondary md:flex">
|
|
22
|
+
<a className="transition hover:text-text-primary" href="/pricing">Pricing</a>
|
|
23
|
+
<a className="transition hover:text-text-primary" href="/docs">Docs</a>
|
|
24
|
+
<a className="transition hover:text-text-primary" href="/docs/sdk/node">SDK</a>
|
|
25
|
+
<a className="transition hover:text-text-primary" href="/docs/quickstart">Quickstart</a>
|
|
26
|
+
</nav>
|
|
27
|
+
{session ? (
|
|
28
|
+
<div className="flex items-center gap-3">
|
|
29
|
+
<span className="hidden max-w-48 truncate text-body text-text-tertiary sm:block">
|
|
30
|
+
{session.email}
|
|
31
|
+
</span>
|
|
32
|
+
<Button href="/app">Dashboard</Button>
|
|
33
|
+
</div>
|
|
34
|
+
) : (
|
|
35
|
+
<div className="flex items-center gap-2">
|
|
36
|
+
<Button href="/login" variant="ghost">
|
|
37
|
+
Sign in
|
|
38
|
+
</Button>
|
|
39
|
+
<Button href="/signup">Start free</Button>
|
|
40
|
+
</div>
|
|
41
|
+
)}
|
|
42
|
+
</div>
|
|
43
|
+
</header>
|
|
44
|
+
);
|
|
45
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
const cases = [
|
|
2
|
+
['Coding agents', 'Claim a repo before Codex, Claude, Cursor, or MCP-based agents edit files. Block overlapping runs with skip_run.'],
|
|
3
|
+
['Server automations', 'Let cron jobs, CI workers, and scheduled scripts claim the same resources your agents use.'],
|
|
4
|
+
['Deploy and review windows', 'Give deploys, migrations, review passes, and customer-impacting work deterministic priority.'],
|
|
5
|
+
['Scheduling agents', 'Secondary flow: coordinate availability, holds, and meeting-time conflicts before agents book downstream systems.'],
|
|
6
|
+
];
|
|
7
|
+
|
|
8
|
+
export function UseCases() {
|
|
9
|
+
return (
|
|
10
|
+
<section className="border-b border-border bg-bg">
|
|
11
|
+
<div className="mx-auto max-w-6xl px-4 py-20">
|
|
12
|
+
<p className="text-label uppercase text-text-tertiary">Use cases</p>
|
|
13
|
+
<h2 className="mt-3 text-3xl font-semibold text-text-primary">
|
|
14
|
+
Built for multi-agent coordination
|
|
15
|
+
</h2>
|
|
16
|
+
<div className="mt-8 grid gap-4 md:grid-cols-2 lg:grid-cols-4">
|
|
17
|
+
{cases.map(([title, body]) => (
|
|
18
|
+
<div className="rounded border border-border bg-surface p-5" key={title}>
|
|
19
|
+
<h3 className="text-title font-semibold text-text-primary">{title}</h3>
|
|
20
|
+
<p className="mt-3 text-body leading-6 text-text-secondary">{body}</p>
|
|
21
|
+
</div>
|
|
22
|
+
))}
|
|
23
|
+
</div>
|
|
24
|
+
</div>
|
|
25
|
+
</section>
|
|
26
|
+
);
|
|
27
|
+
}
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { useState } from 'react';
|
|
4
|
+
import { useRouter } from 'next/navigation';
|
|
5
|
+
import { signupWorkspace, createAvailabilityWindow } from '@/lib/api';
|
|
6
|
+
import { saveSession } from '@/lib/storage';
|
|
7
|
+
import { type AgentType } from '@/lib/schemas';
|
|
8
|
+
import { Copy, Check, ArrowRight, Eye, EyeOff } from 'lucide-react';
|
|
9
|
+
|
|
10
|
+
export function OnboardingClient() {
|
|
11
|
+
const router = useRouter();
|
|
12
|
+
const [step, setStep] = useState(1);
|
|
13
|
+
const [workspaceName, setWorkspaceName] = useState('');
|
|
14
|
+
const [email, setEmail] = useState('');
|
|
15
|
+
const [password, setPassword] = useState('');
|
|
16
|
+
const [agentName, setAgentName] = useState('');
|
|
17
|
+
const [agentType, setAgentType] = useState<AgentType>('generic');
|
|
18
|
+
const [priority, setPriority] = useState(0);
|
|
19
|
+
const [apiKey, setApiKey] = useState('');
|
|
20
|
+
const [agentId, setAgentId] = useState('');
|
|
21
|
+
const [error, setError] = useState('');
|
|
22
|
+
const [setupWarning, setSetupWarning] = useState('');
|
|
23
|
+
const [copied, setCopied] = useState(false);
|
|
24
|
+
const [showKey, setShowKey] = useState(false);
|
|
25
|
+
const [savedKey, setSavedKey] = useState(false);
|
|
26
|
+
const [loading, setLoading] = useState(false);
|
|
27
|
+
|
|
28
|
+
const handleSignup = async () => {
|
|
29
|
+
if (!workspaceName.trim() || !email.trim() || password.length < 8 || !agentName.trim()) return;
|
|
30
|
+
setLoading(true);
|
|
31
|
+
setError('');
|
|
32
|
+
setSetupWarning('');
|
|
33
|
+
try {
|
|
34
|
+
const result = await signupWorkspace({
|
|
35
|
+
workspace_name: workspaceName.trim(),
|
|
36
|
+
email: email.trim(),
|
|
37
|
+
password,
|
|
38
|
+
agent: {
|
|
39
|
+
name: agentName.trim(),
|
|
40
|
+
agent_type: agentType,
|
|
41
|
+
priority,
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
saveSession({
|
|
46
|
+
orgId: result.org.id,
|
|
47
|
+
userId: result.user.id,
|
|
48
|
+
email: result.user.email,
|
|
49
|
+
});
|
|
50
|
+
setApiKey(result.apiKey);
|
|
51
|
+
setAgentId(result.agent.id);
|
|
52
|
+
setStep(2);
|
|
53
|
+
|
|
54
|
+
try {
|
|
55
|
+
const tomorrow = new Date(Date.now() + 86400000);
|
|
56
|
+
tomorrow.setHours(9, 0, 0, 0);
|
|
57
|
+
const tomorrowEnd = new Date(tomorrow);
|
|
58
|
+
tomorrowEnd.setHours(17, 0, 0, 0);
|
|
59
|
+
|
|
60
|
+
await createAvailabilityWindow({
|
|
61
|
+
agent_id: result.agent.id,
|
|
62
|
+
start_at: tomorrow.toISOString(),
|
|
63
|
+
end_at: tomorrowEnd.toISOString(),
|
|
64
|
+
window_type: 'available',
|
|
65
|
+
});
|
|
66
|
+
} catch {
|
|
67
|
+
setSetupWarning('Workspace created. The optional demo availability window was not created, but your agent key is ready.');
|
|
68
|
+
}
|
|
69
|
+
} catch (err) {
|
|
70
|
+
setError((err as Error).message);
|
|
71
|
+
} finally {
|
|
72
|
+
setLoading(false);
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
const handleCopy = () => {
|
|
77
|
+
navigator.clipboard.writeText(apiKey);
|
|
78
|
+
setCopied(true);
|
|
79
|
+
setSavedKey(true);
|
|
80
|
+
setTimeout(() => setCopied(false), 2000);
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
const handleCopyAgentId = () => {
|
|
84
|
+
navigator.clipboard.writeText(agentId);
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
return (
|
|
88
|
+
<div className="min-h-screen bg-bg flex items-center justify-center p-6">
|
|
89
|
+
<div className="w-full max-w-md">
|
|
90
|
+
<div className="flex items-center gap-2 mb-8">
|
|
91
|
+
{[1, 2].map((s) => (
|
|
92
|
+
<div key={s} className="flex items-center gap-2">
|
|
93
|
+
<div
|
|
94
|
+
className={`w-6 h-6 rounded-full flex items-center justify-center text-[11px] font-medium ${
|
|
95
|
+
s <= step
|
|
96
|
+
? 'bg-accent text-white'
|
|
97
|
+
: 'bg-surface border border-border text-text-tertiary'
|
|
98
|
+
}`}
|
|
99
|
+
>
|
|
100
|
+
{s < step ? <Check className="h-3 w-3" /> : s}
|
|
101
|
+
</div>
|
|
102
|
+
{s < 2 && <div className={`w-8 h-px ${s < step ? 'bg-accent' : 'bg-border'}`} />}
|
|
103
|
+
</div>
|
|
104
|
+
))}
|
|
105
|
+
</div>
|
|
106
|
+
|
|
107
|
+
{step === 1 && (
|
|
108
|
+
<div>
|
|
109
|
+
<h1 className="text-title font-semibold text-text-primary mb-2">Create your agent workspace</h1>
|
|
110
|
+
<p className="text-body text-text-secondary mb-6">
|
|
111
|
+
Set up dashboard access and generate the first runtime key for a coding or automation agent.
|
|
112
|
+
</p>
|
|
113
|
+
<div className="space-y-4">
|
|
114
|
+
<div>
|
|
115
|
+
<label className="block text-label uppercase text-text-tertiary mb-1">Workspace</label>
|
|
116
|
+
<input
|
|
117
|
+
value={workspaceName}
|
|
118
|
+
onChange={(e) => setWorkspaceName(e.target.value)}
|
|
119
|
+
placeholder="Acme Engineering"
|
|
120
|
+
className="w-full rounded bg-surface border border-border px-3 py-2.5 text-body text-text-primary outline-none focus:border-border-focus"
|
|
121
|
+
autoFocus
|
|
122
|
+
/>
|
|
123
|
+
</div>
|
|
124
|
+
<div>
|
|
125
|
+
<label className="block text-label uppercase text-text-tertiary mb-1">Email</label>
|
|
126
|
+
<input
|
|
127
|
+
value={email}
|
|
128
|
+
onChange={(e) => setEmail(e.target.value)}
|
|
129
|
+
type="email"
|
|
130
|
+
placeholder="you@company.com"
|
|
131
|
+
className="w-full rounded bg-surface border border-border px-3 py-2.5 text-body text-text-primary outline-none focus:border-border-focus"
|
|
132
|
+
/>
|
|
133
|
+
</div>
|
|
134
|
+
<div>
|
|
135
|
+
<label className="block text-label uppercase text-text-tertiary mb-1">Password</label>
|
|
136
|
+
<input
|
|
137
|
+
value={password}
|
|
138
|
+
onChange={(e) => setPassword(e.target.value)}
|
|
139
|
+
type="password"
|
|
140
|
+
minLength={8}
|
|
141
|
+
placeholder="Minimum 8 characters"
|
|
142
|
+
className="w-full rounded bg-surface border border-border px-3 py-2.5 text-body text-text-primary outline-none focus:border-border-focus"
|
|
143
|
+
/>
|
|
144
|
+
</div>
|
|
145
|
+
<div>
|
|
146
|
+
<label className="block text-label uppercase text-text-tertiary mb-1">First agent</label>
|
|
147
|
+
<input
|
|
148
|
+
value={agentName}
|
|
149
|
+
onChange={(e) => setAgentName(e.target.value)}
|
|
150
|
+
placeholder="deploy_agent"
|
|
151
|
+
className="w-full rounded bg-surface border border-border px-3 py-2.5 text-body text-text-primary outline-none focus:border-border-focus"
|
|
152
|
+
/>
|
|
153
|
+
</div>
|
|
154
|
+
<div className="grid grid-cols-2 gap-3">
|
|
155
|
+
<div>
|
|
156
|
+
<label className="block text-label uppercase text-text-tertiary mb-1">Type</label>
|
|
157
|
+
<select
|
|
158
|
+
value={agentType}
|
|
159
|
+
onChange={(e) => setAgentType(e.target.value as AgentType)}
|
|
160
|
+
className="w-full rounded bg-surface border border-border px-3 py-2.5 text-body text-text-primary outline-none focus:border-border-focus"
|
|
161
|
+
>
|
|
162
|
+
<option value="generic">Coding / generic</option>
|
|
163
|
+
<option value="external_meeting">External meeting</option>
|
|
164
|
+
<option value="internal">Internal</option>
|
|
165
|
+
<option value="focus">Focus</option>
|
|
166
|
+
</select>
|
|
167
|
+
</div>
|
|
168
|
+
<div>
|
|
169
|
+
<label className="block text-label uppercase text-text-tertiary mb-1">Priority</label>
|
|
170
|
+
<input
|
|
171
|
+
type="number"
|
|
172
|
+
value={priority}
|
|
173
|
+
onChange={(e) => setPriority(Number(e.target.value))}
|
|
174
|
+
className="w-full rounded bg-surface border border-border px-3 py-2.5 text-body text-text-primary outline-none focus:border-border-focus"
|
|
175
|
+
/>
|
|
176
|
+
</div>
|
|
177
|
+
</div>
|
|
178
|
+
</div>
|
|
179
|
+
{error && <p className="text-body text-error mt-3">{error}</p>}
|
|
180
|
+
<button
|
|
181
|
+
onClick={handleSignup}
|
|
182
|
+
disabled={loading || !workspaceName.trim() || !email.trim() || password.length < 8 || !agentName.trim()}
|
|
183
|
+
className="w-full mt-6 rounded bg-accent text-white py-2.5 text-body font-medium hover:bg-accent-hover transition-colors disabled:opacity-40 active:scale-[0.98]"
|
|
184
|
+
>
|
|
185
|
+
{loading ? 'Creating...' : 'Create workspace'}
|
|
186
|
+
</button>
|
|
187
|
+
</div>
|
|
188
|
+
)}
|
|
189
|
+
|
|
190
|
+
{step === 2 && (
|
|
191
|
+
<div>
|
|
192
|
+
<h1 className="text-title font-semibold text-text-primary mb-2">Agent runtime key</h1>
|
|
193
|
+
<p className="text-body text-text-secondary mb-4">
|
|
194
|
+
Use this key in your coding agent or server environment. Dashboard access uses your email
|
|
195
|
+
and password.
|
|
196
|
+
</p>
|
|
197
|
+
{setupWarning && (
|
|
198
|
+
<div className="mb-4 rounded border border-warning/30 bg-warning/10 p-3 text-body text-warning">
|
|
199
|
+
{setupWarning}
|
|
200
|
+
</div>
|
|
201
|
+
)}
|
|
202
|
+
<div className="rounded bg-surface border border-warning/30 p-4 mb-4">
|
|
203
|
+
<p className="text-body font-medium text-warning mb-3">
|
|
204
|
+
Copy now - you will not see this key again
|
|
205
|
+
</p>
|
|
206
|
+
<div className="mb-3 flex items-center gap-2 rounded bg-bg p-3">
|
|
207
|
+
<input
|
|
208
|
+
readOnly
|
|
209
|
+
type={showKey ? 'text' : 'password'}
|
|
210
|
+
value={apiKey}
|
|
211
|
+
className="min-w-0 flex-1 bg-transparent font-mono text-[12px] text-text-secondary outline-none"
|
|
212
|
+
/>
|
|
213
|
+
<button
|
|
214
|
+
onClick={() => setShowKey((value) => !value)}
|
|
215
|
+
className="shrink-0 text-text-tertiary hover:text-text-secondary"
|
|
216
|
+
title={showKey ? 'Hide API key' : 'Reveal API key'}
|
|
217
|
+
>
|
|
218
|
+
{showKey ? <EyeOff className="h-3.5 w-3.5" /> : <Eye className="h-3.5 w-3.5" />}
|
|
219
|
+
</button>
|
|
220
|
+
</div>
|
|
221
|
+
<div className="flex flex-wrap items-center gap-3">
|
|
222
|
+
<button
|
|
223
|
+
onClick={handleCopy}
|
|
224
|
+
className="flex items-center gap-1.5 text-body text-accent hover:text-accent-hover"
|
|
225
|
+
>
|
|
226
|
+
{copied ? <Check className="h-3.5 w-3.5" /> : <Copy className="h-3.5 w-3.5" />}
|
|
227
|
+
{copied ? 'Copied' : 'Copy to clipboard'}
|
|
228
|
+
</button>
|
|
229
|
+
<label className="flex items-center gap-2 text-body text-text-secondary">
|
|
230
|
+
<input
|
|
231
|
+
type="checkbox"
|
|
232
|
+
checked={savedKey}
|
|
233
|
+
onChange={(event) => setSavedKey(event.target.checked)}
|
|
234
|
+
className="h-4 w-4 accent-accent"
|
|
235
|
+
/>
|
|
236
|
+
I saved this key
|
|
237
|
+
</label>
|
|
238
|
+
</div>
|
|
239
|
+
</div>
|
|
240
|
+
<div className="rounded border border-border bg-surface p-3 mb-6">
|
|
241
|
+
<label className="block text-label uppercase text-text-tertiary mb-1">Agent ID</label>
|
|
242
|
+
<div className="flex items-center gap-2">
|
|
243
|
+
<div className="font-mono text-[12px] text-text-secondary break-all">{agentId}</div>
|
|
244
|
+
<button
|
|
245
|
+
onClick={handleCopyAgentId}
|
|
246
|
+
className="text-text-tertiary hover:text-text-secondary"
|
|
247
|
+
title="Copy agent ID"
|
|
248
|
+
>
|
|
249
|
+
<Copy className="h-3.5 w-3.5" />
|
|
250
|
+
</button>
|
|
251
|
+
</div>
|
|
252
|
+
</div>
|
|
253
|
+
<button
|
|
254
|
+
onClick={() => router.push(`/app/agents?connect=${agentId}`)}
|
|
255
|
+
disabled={!savedKey}
|
|
256
|
+
className="w-full flex items-center justify-center gap-2 rounded bg-accent text-white py-2.5 text-body font-medium hover:bg-accent-hover transition-colors active:scale-[0.98]"
|
|
257
|
+
>
|
|
258
|
+
Set up first agent
|
|
259
|
+
<ArrowRight className="h-3.5 w-3.5" />
|
|
260
|
+
</button>
|
|
261
|
+
<button
|
|
262
|
+
onClick={() => router.push('/app/agents')}
|
|
263
|
+
className="mt-3 w-full rounded border border-border bg-surface py-2.5 text-body font-medium text-text-secondary transition-colors hover:text-text-primary active:scale-[0.98]"
|
|
264
|
+
>
|
|
265
|
+
Create second agent to run verification
|
|
266
|
+
</button>
|
|
267
|
+
<button
|
|
268
|
+
onClick={() => router.push('/app')}
|
|
269
|
+
className="mt-3 w-full rounded border border-transparent py-2.5 text-body font-medium text-text-tertiary transition-colors hover:text-text-primary active:scale-[0.98]"
|
|
270
|
+
>
|
|
271
|
+
Go to dashboard
|
|
272
|
+
</button>
|
|
273
|
+
</div>
|
|
274
|
+
)}
|
|
275
|
+
</div>
|
|
276
|
+
</div>
|
|
277
|
+
);
|
|
278
|
+
}
|