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,426 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { useEffect, useMemo, useState } from 'react';
|
|
4
|
+
import { CheckCircle2, Play, RefreshCw, ShieldCheck, Trash2 } from 'lucide-react';
|
|
5
|
+
import { Badge } from '@/components/ui/Badge';
|
|
6
|
+
import { Button } from '@/components/ui/Button';
|
|
7
|
+
import { Input } from '@/components/ui/Input';
|
|
8
|
+
import { Select } from '@/components/ui/Select';
|
|
9
|
+
import { checkWork, claimWork, extendWorkClaim, listAgents, listWorkClaims, listWorkResources, releaseWorkClaim, restoreSession } from '@/lib/api';
|
|
10
|
+
import { billingUpgradesEnabled } from '@/lib/billing';
|
|
11
|
+
import type { Agent, WorkClaim, WorkResource } from '@/lib/schemas';
|
|
12
|
+
|
|
13
|
+
function formatTime(value: string) {
|
|
14
|
+
return new Intl.DateTimeFormat('da-DK', {
|
|
15
|
+
dateStyle: 'short',
|
|
16
|
+
timeStyle: 'short',
|
|
17
|
+
}).format(new Date(value));
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function statusVariant(status: string): 'success' | 'warning' | 'error' | 'neutral' | 'accent' {
|
|
21
|
+
if (status === 'available') return 'success';
|
|
22
|
+
if (status === 'would_win') return 'accent';
|
|
23
|
+
if (status === 'would_lose' || status === 'blocked') return 'error';
|
|
24
|
+
if (status === 'active') return 'success';
|
|
25
|
+
if (status === 'superseded') return 'warning';
|
|
26
|
+
return 'neutral';
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function isExpiringSoon(claim: WorkClaim) {
|
|
30
|
+
const seconds = claim.seconds_until_expiry ?? Math.floor((new Date(claim.expires_at).getTime() - Date.now()) / 1000);
|
|
31
|
+
return seconds > 0 && seconds < 10 * 60;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export default function WorkCoordinationPage() {
|
|
35
|
+
const [orgId, setOrgId] = useState('');
|
|
36
|
+
const [agents, setAgents] = useState<Agent[]>([]);
|
|
37
|
+
const [resources, setResources] = useState<WorkResource[]>([]);
|
|
38
|
+
const [claims, setClaims] = useState<WorkClaim[]>([]);
|
|
39
|
+
const [releasedClaims, setReleasedClaims] = useState<WorkClaim[]>([]);
|
|
40
|
+
const [loading, setLoading] = useState(true);
|
|
41
|
+
const [busy, setBusy] = useState(false);
|
|
42
|
+
const [result, setResult] = useState<{
|
|
43
|
+
status: 'available' | 'would_win' | 'would_lose';
|
|
44
|
+
explanation: string;
|
|
45
|
+
suggested_retry_at: string | null;
|
|
46
|
+
} | null>(null);
|
|
47
|
+
const [error, setError] = useState('');
|
|
48
|
+
const [planLimit, setPlanLimit] = useState<{ message: string; upgrade_plan: string | null } | null>(null);
|
|
49
|
+
const [form, setForm] = useState({
|
|
50
|
+
agent_id: '',
|
|
51
|
+
resource_type: 'repo' as 'project' | 'repo',
|
|
52
|
+
resource_key: 'arkilstsko/availsync',
|
|
53
|
+
label: 'Availsync repo',
|
|
54
|
+
duration_minutes: 45,
|
|
55
|
+
reason: 'coding-agent work slot',
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
const selectedAgent = useMemo(
|
|
59
|
+
() => agents.find((agent) => agent.id === form.agent_id),
|
|
60
|
+
[agents, form.agent_id],
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
async function refresh(currentOrgId = orgId) {
|
|
64
|
+
if (!currentOrgId) return;
|
|
65
|
+
const [agentRows, resourceRows, activeRows, releasedRows] = await Promise.all([
|
|
66
|
+
listAgents(currentOrgId),
|
|
67
|
+
listWorkResources(),
|
|
68
|
+
listWorkClaims({ status: 'active', limit: 100 }),
|
|
69
|
+
listWorkClaims({ status: 'released', limit: 25 }),
|
|
70
|
+
]);
|
|
71
|
+
setAgents(agentRows);
|
|
72
|
+
setResources(resourceRows);
|
|
73
|
+
setClaims(activeRows);
|
|
74
|
+
setReleasedClaims(releasedRows);
|
|
75
|
+
setForm((current) => ({
|
|
76
|
+
...current,
|
|
77
|
+
agent_id: current.agent_id || agentRows[0]?.id || '',
|
|
78
|
+
}));
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
useEffect(() => {
|
|
82
|
+
restoreSession()
|
|
83
|
+
.then(async (session) => {
|
|
84
|
+
setOrgId(session.org.id);
|
|
85
|
+
await refresh(session.org.id);
|
|
86
|
+
})
|
|
87
|
+
.catch(() => {
|
|
88
|
+
window.location.href = '/login';
|
|
89
|
+
})
|
|
90
|
+
.finally(() => setLoading(false));
|
|
91
|
+
}, []);
|
|
92
|
+
|
|
93
|
+
async function runCheck() {
|
|
94
|
+
setBusy(true);
|
|
95
|
+
setError('');
|
|
96
|
+
setPlanLimit(null);
|
|
97
|
+
try {
|
|
98
|
+
const response = await checkWork(form);
|
|
99
|
+
setResult({
|
|
100
|
+
status: response.status,
|
|
101
|
+
explanation: response.explanation,
|
|
102
|
+
suggested_retry_at: response.suggested_retry_at,
|
|
103
|
+
});
|
|
104
|
+
await refresh();
|
|
105
|
+
} catch (err) {
|
|
106
|
+
capturePlanLimit(err);
|
|
107
|
+
setError((err as Error).message);
|
|
108
|
+
} finally {
|
|
109
|
+
setBusy(false);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
async function runClaim() {
|
|
114
|
+
setBusy(true);
|
|
115
|
+
setError('');
|
|
116
|
+
setPlanLimit(null);
|
|
117
|
+
try {
|
|
118
|
+
const response = await claimWork(form);
|
|
119
|
+
setResult({
|
|
120
|
+
status: response.status,
|
|
121
|
+
explanation:
|
|
122
|
+
response.status === 'would_win'
|
|
123
|
+
? 'Claim created and lower-priority work was superseded.'
|
|
124
|
+
: 'Claim created. This agent may start work.',
|
|
125
|
+
suggested_retry_at: null,
|
|
126
|
+
});
|
|
127
|
+
await refresh();
|
|
128
|
+
} catch (err) {
|
|
129
|
+
capturePlanLimit(err);
|
|
130
|
+
setError((err as Error).message);
|
|
131
|
+
await refresh();
|
|
132
|
+
} finally {
|
|
133
|
+
setBusy(false);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
async function releaseClaim(claimId: string) {
|
|
138
|
+
setBusy(true);
|
|
139
|
+
setError('');
|
|
140
|
+
setPlanLimit(null);
|
|
141
|
+
try {
|
|
142
|
+
await releaseWorkClaim(claimId);
|
|
143
|
+
await refresh();
|
|
144
|
+
} catch (err) {
|
|
145
|
+
capturePlanLimit(err);
|
|
146
|
+
setError((err as Error).message);
|
|
147
|
+
} finally {
|
|
148
|
+
setBusy(false);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
async function extendClaim(claimId: string) {
|
|
153
|
+
setBusy(true);
|
|
154
|
+
setError('');
|
|
155
|
+
setPlanLimit(null);
|
|
156
|
+
try {
|
|
157
|
+
await extendWorkClaim({ claimId, duration_minutes: 45 });
|
|
158
|
+
await refresh();
|
|
159
|
+
} catch (err) {
|
|
160
|
+
capturePlanLimit(err);
|
|
161
|
+
setError((err as Error).message);
|
|
162
|
+
} finally {
|
|
163
|
+
setBusy(false);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
function capturePlanLimit(err: unknown) {
|
|
168
|
+
const body = (err as { body?: { error?: string; message?: string; upgrade_plan?: string | null } }).body;
|
|
169
|
+
if (body?.error === 'plan_limit_reached') {
|
|
170
|
+
setPlanLimit({ message: body.message || (err as Error).message, upgrade_plan: body.upgrade_plan ?? null });
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
return (
|
|
175
|
+
<div className="w-full max-w-none p-4 sm:p-6">
|
|
176
|
+
<div className="mb-6">
|
|
177
|
+
<h1 className="text-title font-semibold text-text-primary">Work Coordination</h1>
|
|
178
|
+
<p className="mt-1 max-w-2xl text-body text-text-secondary">
|
|
179
|
+
Stop coding agents from acting on the same selected resource at the same time. Agents check, claim, work, then release.
|
|
180
|
+
</p>
|
|
181
|
+
</div>
|
|
182
|
+
|
|
183
|
+
<div className="grid grid-cols-1 gap-4 xl:grid-cols-[440px_1fr]">
|
|
184
|
+
<section className="rounded border border-border bg-surface p-4">
|
|
185
|
+
<div className="mb-4 flex items-center gap-2">
|
|
186
|
+
<ShieldCheck className="h-4 w-4 text-accent" />
|
|
187
|
+
<h2 className="text-heading font-medium text-text-primary">Test work claim</h2>
|
|
188
|
+
</div>
|
|
189
|
+
|
|
190
|
+
<div className="mb-4 rounded border border-border bg-bg p-3 text-body leading-6 text-text-secondary">
|
|
191
|
+
Use repo-level when agents may touch shared files or context. Project-level allows
|
|
192
|
+
parallel work only for independent streams.
|
|
193
|
+
</div>
|
|
194
|
+
|
|
195
|
+
<div className="space-y-3">
|
|
196
|
+
<label className="block">
|
|
197
|
+
<span className="mb-1 block text-label uppercase text-text-tertiary">Agent</span>
|
|
198
|
+
<Select
|
|
199
|
+
value={form.agent_id}
|
|
200
|
+
onChange={(event) => setForm({ ...form, agent_id: event.target.value })}
|
|
201
|
+
>
|
|
202
|
+
{agents.map((agent) => (
|
|
203
|
+
<option key={agent.id} value={agent.id}>
|
|
204
|
+
{agent.name} · priority {agent.priority}
|
|
205
|
+
</option>
|
|
206
|
+
))}
|
|
207
|
+
</Select>
|
|
208
|
+
</label>
|
|
209
|
+
|
|
210
|
+
<div className="grid grid-cols-1 gap-2 sm:grid-cols-[120px_1fr]">
|
|
211
|
+
<label className="block">
|
|
212
|
+
<span className="mb-1 block text-label uppercase text-text-tertiary">Type</span>
|
|
213
|
+
<Select
|
|
214
|
+
value={form.resource_type}
|
|
215
|
+
onChange={(event) => setForm({ ...form, resource_type: event.target.value as 'project' | 'repo' })}
|
|
216
|
+
>
|
|
217
|
+
<option value="repo">Repo · safest</option>
|
|
218
|
+
<option value="project">Project · advanced</option>
|
|
219
|
+
</Select>
|
|
220
|
+
<p className="mt-1 text-label text-text-tertiary">
|
|
221
|
+
{form.resource_type === 'repo'
|
|
222
|
+
? 'Safest: one active agent per repo.'
|
|
223
|
+
: 'Advanced: allows parallel work for independent streams.'}
|
|
224
|
+
</p>
|
|
225
|
+
</label>
|
|
226
|
+
<label className="block">
|
|
227
|
+
<span className="mb-1 block text-label uppercase text-text-tertiary">Resource key</span>
|
|
228
|
+
<Input
|
|
229
|
+
value={form.resource_key}
|
|
230
|
+
onChange={(event) => setForm({ ...form, resource_key: event.target.value })}
|
|
231
|
+
placeholder="owner/repo"
|
|
232
|
+
/>
|
|
233
|
+
</label>
|
|
234
|
+
</div>
|
|
235
|
+
|
|
236
|
+
<label className="block">
|
|
237
|
+
<span className="mb-1 block text-label uppercase text-text-tertiary">Label</span>
|
|
238
|
+
<Input
|
|
239
|
+
value={form.label}
|
|
240
|
+
onChange={(event) => setForm({ ...form, label: event.target.value })}
|
|
241
|
+
placeholder="Availsync repo"
|
|
242
|
+
/>
|
|
243
|
+
</label>
|
|
244
|
+
|
|
245
|
+
<div className="grid grid-cols-1 gap-2 sm:grid-cols-[120px_1fr]">
|
|
246
|
+
<label className="block">
|
|
247
|
+
<span className="mb-1 block text-label uppercase text-text-tertiary">Minutes</span>
|
|
248
|
+
<Input
|
|
249
|
+
type="number"
|
|
250
|
+
min={1}
|
|
251
|
+
max={1440}
|
|
252
|
+
value={form.duration_minutes}
|
|
253
|
+
onChange={(event) => setForm({ ...form, duration_minutes: Number(event.target.value) })}
|
|
254
|
+
/>
|
|
255
|
+
</label>
|
|
256
|
+
<label className="block">
|
|
257
|
+
<span className="mb-1 block text-label uppercase text-text-tertiary">Reason</span>
|
|
258
|
+
<Input
|
|
259
|
+
value={form.reason}
|
|
260
|
+
onChange={(event) => setForm({ ...form, reason: event.target.value })}
|
|
261
|
+
/>
|
|
262
|
+
</label>
|
|
263
|
+
</div>
|
|
264
|
+
|
|
265
|
+
<div className="flex gap-2 pt-1">
|
|
266
|
+
<Button type="button" variant="secondary" disabled={busy || !form.agent_id} onClick={runCheck}>
|
|
267
|
+
<CheckCircle2 className="h-4 w-4" />
|
|
268
|
+
Check
|
|
269
|
+
</Button>
|
|
270
|
+
<Button type="button" disabled={busy || !form.agent_id} onClick={runClaim}>
|
|
271
|
+
<Play className="h-4 w-4" />
|
|
272
|
+
Claim
|
|
273
|
+
</Button>
|
|
274
|
+
</div>
|
|
275
|
+
</div>
|
|
276
|
+
|
|
277
|
+
{result && (
|
|
278
|
+
<div className="mt-4 rounded border border-border bg-bg p-3">
|
|
279
|
+
<Badge variant={statusVariant(result.status)}>{result.status.replace('_', ' ')}</Badge>
|
|
280
|
+
<p className="mt-2 text-body text-text-secondary">{result.explanation}</p>
|
|
281
|
+
{result.suggested_retry_at && (
|
|
282
|
+
<p className="mt-1 text-label text-text-tertiary">
|
|
283
|
+
Retry after {formatTime(result.suggested_retry_at)}
|
|
284
|
+
</p>
|
|
285
|
+
)}
|
|
286
|
+
</div>
|
|
287
|
+
)}
|
|
288
|
+
|
|
289
|
+
{error && (
|
|
290
|
+
<div className="mt-4 rounded border border-error/30 bg-error/10 p-3 text-body text-error">
|
|
291
|
+
{error}
|
|
292
|
+
{planLimit?.upgrade_plan && (
|
|
293
|
+
<a
|
|
294
|
+
className="mt-2 block text-accent hover:text-accent-hover"
|
|
295
|
+
href={billingUpgradesEnabled() ? `/checkout?plan=${planLimit.upgrade_plan}` : '/app/settings?tab=billing'}
|
|
296
|
+
>
|
|
297
|
+
{billingUpgradesEnabled() ? `Upgrade to ${planLimit.upgrade_plan}` : 'Join paid plan waitlist'}
|
|
298
|
+
</a>
|
|
299
|
+
)}
|
|
300
|
+
</div>
|
|
301
|
+
)}
|
|
302
|
+
</section>
|
|
303
|
+
|
|
304
|
+
<div className="space-y-4">
|
|
305
|
+
<section className="rounded border border-border bg-surface">
|
|
306
|
+
<div className="border-b border-border px-4 py-3">
|
|
307
|
+
<h2 className="text-heading font-medium text-text-primary">Active work claims</h2>
|
|
308
|
+
</div>
|
|
309
|
+
{loading || claims.length === 0 ? (
|
|
310
|
+
<p className="p-4 text-body text-text-tertiary">
|
|
311
|
+
{loading ? 'Loading claims...' : 'No active work claims.'}
|
|
312
|
+
</p>
|
|
313
|
+
) : (
|
|
314
|
+
<div className="overflow-x-auto dark-scroll">
|
|
315
|
+
<table className="w-full min-w-[920px]">
|
|
316
|
+
<thead>
|
|
317
|
+
<tr className="border-b border-border text-label uppercase text-text-tertiary">
|
|
318
|
+
<th className="px-4 py-2 text-left font-medium">Resource</th>
|
|
319
|
+
<th className="px-4 py-2 text-left font-medium">Agent</th>
|
|
320
|
+
<th className="px-4 py-2 text-left font-medium">Until</th>
|
|
321
|
+
<th className="px-4 py-2 text-left font-medium">Lease</th>
|
|
322
|
+
<th className="px-4 py-2 text-left font-medium">Status</th>
|
|
323
|
+
<th className="px-4 py-2 text-right font-medium">Action</th>
|
|
324
|
+
</tr>
|
|
325
|
+
</thead>
|
|
326
|
+
<tbody>
|
|
327
|
+
{claims.map((claim) => (
|
|
328
|
+
<tr key={claim.id} className={`border-b border-border last:border-b-0 ${isExpiringSoon(claim) ? 'bg-warning/5' : ''}`}>
|
|
329
|
+
<td className="px-4 py-2">
|
|
330
|
+
<div className="text-body text-text-primary">{claim.resource_label || claim.resource_key}</div>
|
|
331
|
+
<div className="font-mono text-label text-text-tertiary">{claim.resource_key}</div>
|
|
332
|
+
</td>
|
|
333
|
+
<td className="px-4 py-2 text-body text-text-secondary">
|
|
334
|
+
{claim.agent_name || selectedAgent?.name || claim.agent_id.slice(0, 8)}
|
|
335
|
+
</td>
|
|
336
|
+
<td className="px-4 py-2 text-body text-text-secondary">{formatTime(claim.end_at)}</td>
|
|
337
|
+
<td className="px-4 py-2">
|
|
338
|
+
<div className="text-body text-text-secondary">
|
|
339
|
+
Expires {formatTime(claim.expires_at)}
|
|
340
|
+
</div>
|
|
341
|
+
<div className={isExpiringSoon(claim) ? 'text-label text-warning' : 'text-label text-text-tertiary'}>
|
|
342
|
+
renewed {claim.renewal_count}x · last {formatTime(claim.last_renewed_at)}
|
|
343
|
+
</div>
|
|
344
|
+
</td>
|
|
345
|
+
<td className="px-4 py-2">
|
|
346
|
+
<Badge variant={statusVariant(claim.status)}>{claim.status}</Badge>
|
|
347
|
+
</td>
|
|
348
|
+
<td className="px-4 py-2 text-right">
|
|
349
|
+
<button
|
|
350
|
+
type="button"
|
|
351
|
+
onClick={() => extendClaim(claim.id)}
|
|
352
|
+
disabled={busy}
|
|
353
|
+
className="mr-1 inline-flex h-8 w-8 items-center justify-center rounded text-text-tertiary hover:bg-surface-raised hover:text-text-primary disabled:opacity-50"
|
|
354
|
+
title="Extend 45 minutes"
|
|
355
|
+
>
|
|
356
|
+
<RefreshCw className="h-4 w-4" />
|
|
357
|
+
</button>
|
|
358
|
+
<button
|
|
359
|
+
type="button"
|
|
360
|
+
onClick={() => releaseClaim(claim.id)}
|
|
361
|
+
disabled={busy}
|
|
362
|
+
className="inline-flex h-8 w-8 items-center justify-center rounded text-text-tertiary hover:bg-surface-raised hover:text-text-primary disabled:opacity-50"
|
|
363
|
+
title="Release"
|
|
364
|
+
>
|
|
365
|
+
<Trash2 className="h-4 w-4" />
|
|
366
|
+
</button>
|
|
367
|
+
</td>
|
|
368
|
+
</tr>
|
|
369
|
+
))}
|
|
370
|
+
</tbody>
|
|
371
|
+
</table>
|
|
372
|
+
</div>
|
|
373
|
+
)}
|
|
374
|
+
</section>
|
|
375
|
+
|
|
376
|
+
<div className="grid grid-cols-1 lg:grid-cols-2 gap-4">
|
|
377
|
+
<section className="rounded border border-border bg-surface">
|
|
378
|
+
<div className="border-b border-border px-4 py-3">
|
|
379
|
+
<h2 className="text-heading font-medium text-text-primary">Protected resources</h2>
|
|
380
|
+
</div>
|
|
381
|
+
{resources.length === 0 ? (
|
|
382
|
+
<p className="p-4 text-body text-text-tertiary">Create a claim to register the first resource.</p>
|
|
383
|
+
) : (
|
|
384
|
+
<div className="divide-y divide-border">
|
|
385
|
+
{resources.map((resource) => (
|
|
386
|
+
<div key={resource.id || resource.resource_key} className="px-4 py-3">
|
|
387
|
+
<div className="flex items-center justify-between gap-3">
|
|
388
|
+
<div>
|
|
389
|
+
<div className="text-body text-text-primary">{resource.label}</div>
|
|
390
|
+
<div className="font-mono text-label text-text-tertiary">{resource.resource_key}</div>
|
|
391
|
+
</div>
|
|
392
|
+
<Badge variant={(resource.active_claims_count ?? 0) > 0 ? 'success' : 'neutral'}>
|
|
393
|
+
{resource.active_claims_count ?? 0} active
|
|
394
|
+
</Badge>
|
|
395
|
+
</div>
|
|
396
|
+
</div>
|
|
397
|
+
))}
|
|
398
|
+
</div>
|
|
399
|
+
)}
|
|
400
|
+
</section>
|
|
401
|
+
|
|
402
|
+
<section className="rounded border border-border bg-surface">
|
|
403
|
+
<div className="border-b border-border px-4 py-3">
|
|
404
|
+
<h2 className="text-heading font-medium text-text-primary">Recently released</h2>
|
|
405
|
+
</div>
|
|
406
|
+
{releasedClaims.length === 0 ? (
|
|
407
|
+
<p className="p-4 text-body text-text-tertiary">Released work slots will appear here.</p>
|
|
408
|
+
) : (
|
|
409
|
+
<div className="divide-y divide-border">
|
|
410
|
+
{releasedClaims.map((claim) => (
|
|
411
|
+
<div key={claim.id} className="px-4 py-3">
|
|
412
|
+
<div className="text-body text-text-primary">{claim.resource_label || claim.resource_key}</div>
|
|
413
|
+
<div className="text-label text-text-tertiary">
|
|
414
|
+
{claim.agent_name || claim.agent_id.slice(0, 8)} · released · {formatTime(claim.created_at)}
|
|
415
|
+
</div>
|
|
416
|
+
</div>
|
|
417
|
+
))}
|
|
418
|
+
</div>
|
|
419
|
+
)}
|
|
420
|
+
</section>
|
|
421
|
+
</div>
|
|
422
|
+
</div>
|
|
423
|
+
</div>
|
|
424
|
+
</div>
|
|
425
|
+
);
|
|
426
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import type { Metadata } from 'next';
|
|
2
|
+
import { SiteHeader } from '@/components/marketing/SiteHeader';
|
|
3
|
+
import { SiteFooter } from '@/components/marketing/SiteFooter';
|
|
4
|
+
import { JsonLd } from '@/components/seo/JsonLd';
|
|
5
|
+
import { webPageSchema } from '@/lib/seo';
|
|
6
|
+
|
|
7
|
+
export const metadata: Metadata = {
|
|
8
|
+
title: 'Changelog',
|
|
9
|
+
description: 'Availsync product changelog for Node SDK alpha, observe mode, onboarding verification, and work guardrails.',
|
|
10
|
+
alternates: {
|
|
11
|
+
canonical: '/changelog',
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
const entries = [
|
|
16
|
+
{
|
|
17
|
+
date: '2026-05-14',
|
|
18
|
+
title: 'Paid plan waitlist',
|
|
19
|
+
items: [
|
|
20
|
+
'Paid Individual and Team plans are waitlist-only during the private pilot.',
|
|
21
|
+
'Checkout stays behind a billing-upgrades flag so paid plans can be enabled quickly later.',
|
|
22
|
+
'Free workspaces remain available for verification, SDK tests, and observe-mode pilots.',
|
|
23
|
+
],
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
date: '2026-05-13',
|
|
27
|
+
title: 'Node SDK alpha',
|
|
28
|
+
items: [
|
|
29
|
+
'@availsync/node@alpha published for guarded repo automations.',
|
|
30
|
+
'withClaim helper wraps start, extend, finish, skip_run, and observe-mode metadata.',
|
|
31
|
+
'SDK docs and pilot guide added for first self-serve integrations.',
|
|
32
|
+
],
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
date: '2026-05-13',
|
|
36
|
+
title: 'Observe-only pilot mode',
|
|
37
|
+
items: [
|
|
38
|
+
'Agents can run in enforce or observe mode.',
|
|
39
|
+
'Observe mode records would-have-blocked runs without creating active leases.',
|
|
40
|
+
'Overview value metrics separate real prevented conflicts from shadow-only signals.',
|
|
41
|
+
],
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
date: '2026-05-13',
|
|
45
|
+
title: 'Onboarding verification',
|
|
46
|
+
items: [
|
|
47
|
+
'Dashboard verification shows Availsync resolving a real conflict between two agents.',
|
|
48
|
+
'Verification marks the workspace as verified and cleans up temporary resources.',
|
|
49
|
+
'Activity and audit records distinguish setup traffic from production traffic.',
|
|
50
|
+
],
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
date: '2026-05-12',
|
|
54
|
+
title: 'Work guardrails',
|
|
55
|
+
items: [
|
|
56
|
+
'Repo and project work claims protect resources before coding agents act.',
|
|
57
|
+
'Runtime APIs support start, extend, finish, idempotency, and clean skip_run responses.',
|
|
58
|
+
'Agent connection, activity, billing, admin, and health views added around the core guardrail flow.',
|
|
59
|
+
],
|
|
60
|
+
},
|
|
61
|
+
];
|
|
62
|
+
|
|
63
|
+
export default function ChangelogPage() {
|
|
64
|
+
return (
|
|
65
|
+
<>
|
|
66
|
+
<JsonLd data={webPageSchema('/changelog', 'Availsync changelog', metadata.description as string)} />
|
|
67
|
+
<SiteHeader />
|
|
68
|
+
<main className="min-h-screen bg-bg">
|
|
69
|
+
<section className="mx-auto max-w-4xl px-4 py-16">
|
|
70
|
+
<p className="text-label uppercase text-text-tertiary">Changelog</p>
|
|
71
|
+
<h1 className="mt-3 text-5xl font-semibold text-text-primary">Product updates.</h1>
|
|
72
|
+
<p className="mt-5 text-heading leading-7 text-text-secondary">
|
|
73
|
+
The current focus is first-pilot readiness for coding-agent repo guardrails.
|
|
74
|
+
</p>
|
|
75
|
+
<div className="mt-10 space-y-5">
|
|
76
|
+
{entries.map((entry) => (
|
|
77
|
+
<article className="rounded border border-border bg-surface p-5" key={`${entry.date}-${entry.title}`}>
|
|
78
|
+
<p className="font-mono text-sm text-text-tertiary">{entry.date}</p>
|
|
79
|
+
<h2 className="mt-2 text-heading font-semibold text-text-primary">{entry.title}</h2>
|
|
80
|
+
<ul className="mt-3 space-y-2 text-body leading-6 text-text-secondary">
|
|
81
|
+
{entry.items.map((item) => (
|
|
82
|
+
<li key={item}>- {item}</li>
|
|
83
|
+
))}
|
|
84
|
+
</ul>
|
|
85
|
+
</article>
|
|
86
|
+
))}
|
|
87
|
+
</div>
|
|
88
|
+
</section>
|
|
89
|
+
</main>
|
|
90
|
+
<SiteFooter />
|
|
91
|
+
</>
|
|
92
|
+
);
|
|
93
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Metadata } from 'next';
|
|
2
|
+
import { Suspense } from 'react';
|
|
3
|
+
import { SiteHeader } from '@/components/marketing/SiteHeader';
|
|
4
|
+
import { CheckoutClient } from '@/components/checkout/CheckoutClient';
|
|
5
|
+
|
|
6
|
+
export const metadata: Metadata = {
|
|
7
|
+
title: 'Checkout',
|
|
8
|
+
robots: {
|
|
9
|
+
index: false,
|
|
10
|
+
follow: false,
|
|
11
|
+
},
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export default function CheckoutPage() {
|
|
15
|
+
return (
|
|
16
|
+
<>
|
|
17
|
+
<SiteHeader />
|
|
18
|
+
<main className="bg-bg">
|
|
19
|
+
<Suspense fallback={<p className="mx-auto max-w-xl px-4 py-20 text-text-secondary">Loading checkout...</p>}>
|
|
20
|
+
<CheckoutClient />
|
|
21
|
+
</Suspense>
|
|
22
|
+
</main>
|
|
23
|
+
</>
|
|
24
|
+
);
|
|
25
|
+
}
|