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.
Files changed (460) hide show
  1. package/.adal/skills/stripe-best-practices/SKILL.md +42 -0
  2. package/.adal/skills/stripe-best-practices/references/billing.md +36 -0
  3. package/.adal/skills/stripe-best-practices/references/connect.md +48 -0
  4. package/.adal/skills/stripe-best-practices/references/payments.md +79 -0
  5. package/.adal/skills/stripe-best-practices/references/security.md +109 -0
  6. package/.adal/skills/stripe-best-practices/references/treasury.md +16 -0
  7. package/.adal/skills/stripe-projects/SKILL.md +139 -0
  8. package/.adal/skills/upgrade-stripe/SKILL.md +185 -0
  9. package/.agents/skills/stripe-best-practices/SKILL.md +42 -0
  10. package/.agents/skills/stripe-best-practices/references/billing.md +36 -0
  11. package/.agents/skills/stripe-best-practices/references/connect.md +48 -0
  12. package/.agents/skills/stripe-best-practices/references/payments.md +79 -0
  13. package/.agents/skills/stripe-best-practices/references/security.md +109 -0
  14. package/.agents/skills/stripe-best-practices/references/treasury.md +16 -0
  15. package/.agents/skills/stripe-projects/SKILL.md +139 -0
  16. package/.agents/skills/upgrade-stripe/SKILL.md +185 -0
  17. package/.augment/skills/stripe-best-practices/SKILL.md +42 -0
  18. package/.augment/skills/stripe-best-practices/references/billing.md +36 -0
  19. package/.augment/skills/stripe-best-practices/references/connect.md +48 -0
  20. package/.augment/skills/stripe-best-practices/references/payments.md +79 -0
  21. package/.augment/skills/stripe-best-practices/references/security.md +109 -0
  22. package/.augment/skills/stripe-best-practices/references/treasury.md +16 -0
  23. package/.augment/skills/stripe-projects/SKILL.md +139 -0
  24. package/.augment/skills/upgrade-stripe/SKILL.md +185 -0
  25. package/.bob/skills/stripe-best-practices/SKILL.md +42 -0
  26. package/.bob/skills/stripe-best-practices/references/billing.md +36 -0
  27. package/.bob/skills/stripe-best-practices/references/connect.md +48 -0
  28. package/.bob/skills/stripe-best-practices/references/payments.md +79 -0
  29. package/.bob/skills/stripe-best-practices/references/security.md +109 -0
  30. package/.bob/skills/stripe-best-practices/references/treasury.md +16 -0
  31. package/.bob/skills/stripe-projects/SKILL.md +139 -0
  32. package/.bob/skills/upgrade-stripe/SKILL.md +185 -0
  33. package/.claude/settings.local.json +7 -0
  34. package/.claude/skills/stripe-best-practices/SKILL.md +42 -0
  35. package/.claude/skills/stripe-best-practices/references/billing.md +36 -0
  36. package/.claude/skills/stripe-best-practices/references/connect.md +48 -0
  37. package/.claude/skills/stripe-best-practices/references/payments.md +79 -0
  38. package/.claude/skills/stripe-best-practices/references/security.md +109 -0
  39. package/.claude/skills/stripe-best-practices/references/treasury.md +16 -0
  40. package/.claude/skills/stripe-projects/SKILL.md +139 -0
  41. package/.claude/skills/upgrade-stripe/SKILL.md +185 -0
  42. package/.codebuddy/skills/stripe-best-practices/SKILL.md +42 -0
  43. package/.codebuddy/skills/stripe-best-practices/references/billing.md +36 -0
  44. package/.codebuddy/skills/stripe-best-practices/references/connect.md +48 -0
  45. package/.codebuddy/skills/stripe-best-practices/references/payments.md +79 -0
  46. package/.codebuddy/skills/stripe-best-practices/references/security.md +109 -0
  47. package/.codebuddy/skills/stripe-best-practices/references/treasury.md +16 -0
  48. package/.codebuddy/skills/stripe-projects/SKILL.md +139 -0
  49. package/.codebuddy/skills/upgrade-stripe/SKILL.md +185 -0
  50. package/.commandcode/skills/stripe-best-practices/SKILL.md +42 -0
  51. package/.commandcode/skills/stripe-best-practices/references/billing.md +36 -0
  52. package/.commandcode/skills/stripe-best-practices/references/connect.md +48 -0
  53. package/.commandcode/skills/stripe-best-practices/references/payments.md +79 -0
  54. package/.commandcode/skills/stripe-best-practices/references/security.md +109 -0
  55. package/.commandcode/skills/stripe-best-practices/references/treasury.md +16 -0
  56. package/.commandcode/skills/stripe-projects/SKILL.md +139 -0
  57. package/.commandcode/skills/upgrade-stripe/SKILL.md +185 -0
  58. package/.continue/skills/stripe-best-practices/SKILL.md +42 -0
  59. package/.continue/skills/stripe-best-practices/references/billing.md +36 -0
  60. package/.continue/skills/stripe-best-practices/references/connect.md +48 -0
  61. package/.continue/skills/stripe-best-practices/references/payments.md +79 -0
  62. package/.continue/skills/stripe-best-practices/references/security.md +109 -0
  63. package/.continue/skills/stripe-best-practices/references/treasury.md +16 -0
  64. package/.continue/skills/stripe-projects/SKILL.md +139 -0
  65. package/.continue/skills/upgrade-stripe/SKILL.md +185 -0
  66. package/.cortex/skills/stripe-best-practices/SKILL.md +42 -0
  67. package/.cortex/skills/stripe-best-practices/references/billing.md +36 -0
  68. package/.cortex/skills/stripe-best-practices/references/connect.md +48 -0
  69. package/.cortex/skills/stripe-best-practices/references/payments.md +79 -0
  70. package/.cortex/skills/stripe-best-practices/references/security.md +109 -0
  71. package/.cortex/skills/stripe-best-practices/references/treasury.md +16 -0
  72. package/.cortex/skills/stripe-projects/SKILL.md +139 -0
  73. package/.cortex/skills/upgrade-stripe/SKILL.md +185 -0
  74. package/.crush/skills/stripe-best-practices/SKILL.md +42 -0
  75. package/.crush/skills/stripe-best-practices/references/billing.md +36 -0
  76. package/.crush/skills/stripe-best-practices/references/connect.md +48 -0
  77. package/.crush/skills/stripe-best-practices/references/payments.md +79 -0
  78. package/.crush/skills/stripe-best-practices/references/security.md +109 -0
  79. package/.crush/skills/stripe-best-practices/references/treasury.md +16 -0
  80. package/.crush/skills/stripe-projects/SKILL.md +139 -0
  81. package/.crush/skills/upgrade-stripe/SKILL.md +185 -0
  82. package/.env.example +20 -0
  83. package/.factory/skills/stripe-best-practices/SKILL.md +42 -0
  84. package/.factory/skills/stripe-best-practices/references/billing.md +36 -0
  85. package/.factory/skills/stripe-best-practices/references/connect.md +48 -0
  86. package/.factory/skills/stripe-best-practices/references/payments.md +79 -0
  87. package/.factory/skills/stripe-best-practices/references/security.md +109 -0
  88. package/.factory/skills/stripe-best-practices/references/treasury.md +16 -0
  89. package/.factory/skills/stripe-projects/SKILL.md +139 -0
  90. package/.factory/skills/upgrade-stripe/SKILL.md +185 -0
  91. package/.goose/skills/stripe-best-practices/SKILL.md +42 -0
  92. package/.goose/skills/stripe-best-practices/references/billing.md +36 -0
  93. package/.goose/skills/stripe-best-practices/references/connect.md +48 -0
  94. package/.goose/skills/stripe-best-practices/references/payments.md +79 -0
  95. package/.goose/skills/stripe-best-practices/references/security.md +109 -0
  96. package/.goose/skills/stripe-best-practices/references/treasury.md +16 -0
  97. package/.goose/skills/stripe-projects/SKILL.md +139 -0
  98. package/.goose/skills/upgrade-stripe/SKILL.md +185 -0
  99. package/.iflow/skills/stripe-best-practices/SKILL.md +42 -0
  100. package/.iflow/skills/stripe-best-practices/references/billing.md +36 -0
  101. package/.iflow/skills/stripe-best-practices/references/connect.md +48 -0
  102. package/.iflow/skills/stripe-best-practices/references/payments.md +79 -0
  103. package/.iflow/skills/stripe-best-practices/references/security.md +109 -0
  104. package/.iflow/skills/stripe-best-practices/references/treasury.md +16 -0
  105. package/.iflow/skills/stripe-projects/SKILL.md +139 -0
  106. package/.iflow/skills/upgrade-stripe/SKILL.md +185 -0
  107. package/.junie/skills/stripe-best-practices/SKILL.md +42 -0
  108. package/.junie/skills/stripe-best-practices/references/billing.md +36 -0
  109. package/.junie/skills/stripe-best-practices/references/connect.md +48 -0
  110. package/.junie/skills/stripe-best-practices/references/payments.md +79 -0
  111. package/.junie/skills/stripe-best-practices/references/security.md +109 -0
  112. package/.junie/skills/stripe-best-practices/references/treasury.md +16 -0
  113. package/.junie/skills/stripe-projects/SKILL.md +139 -0
  114. package/.junie/skills/upgrade-stripe/SKILL.md +185 -0
  115. package/.kilocode/skills/stripe-best-practices/SKILL.md +42 -0
  116. package/.kilocode/skills/stripe-best-practices/references/billing.md +36 -0
  117. package/.kilocode/skills/stripe-best-practices/references/connect.md +48 -0
  118. package/.kilocode/skills/stripe-best-practices/references/payments.md +79 -0
  119. package/.kilocode/skills/stripe-best-practices/references/security.md +109 -0
  120. package/.kilocode/skills/stripe-best-practices/references/treasury.md +16 -0
  121. package/.kilocode/skills/stripe-projects/SKILL.md +139 -0
  122. package/.kilocode/skills/upgrade-stripe/SKILL.md +185 -0
  123. package/.kiro/skills/stripe-best-practices/SKILL.md +42 -0
  124. package/.kiro/skills/stripe-best-practices/references/billing.md +36 -0
  125. package/.kiro/skills/stripe-best-practices/references/connect.md +48 -0
  126. package/.kiro/skills/stripe-best-practices/references/payments.md +79 -0
  127. package/.kiro/skills/stripe-best-practices/references/security.md +109 -0
  128. package/.kiro/skills/stripe-best-practices/references/treasury.md +16 -0
  129. package/.kiro/skills/stripe-projects/SKILL.md +139 -0
  130. package/.kiro/skills/upgrade-stripe/SKILL.md +185 -0
  131. package/.kode/skills/stripe-best-practices/SKILL.md +42 -0
  132. package/.kode/skills/stripe-best-practices/references/billing.md +36 -0
  133. package/.kode/skills/stripe-best-practices/references/connect.md +48 -0
  134. package/.kode/skills/stripe-best-practices/references/payments.md +79 -0
  135. package/.kode/skills/stripe-best-practices/references/security.md +109 -0
  136. package/.kode/skills/stripe-best-practices/references/treasury.md +16 -0
  137. package/.kode/skills/stripe-projects/SKILL.md +139 -0
  138. package/.kode/skills/upgrade-stripe/SKILL.md +185 -0
  139. package/.mcpjam/skills/stripe-best-practices/SKILL.md +42 -0
  140. package/.mcpjam/skills/stripe-best-practices/references/billing.md +36 -0
  141. package/.mcpjam/skills/stripe-best-practices/references/connect.md +48 -0
  142. package/.mcpjam/skills/stripe-best-practices/references/payments.md +79 -0
  143. package/.mcpjam/skills/stripe-best-practices/references/security.md +109 -0
  144. package/.mcpjam/skills/stripe-best-practices/references/treasury.md +16 -0
  145. package/.mcpjam/skills/stripe-projects/SKILL.md +139 -0
  146. package/.mcpjam/skills/upgrade-stripe/SKILL.md +185 -0
  147. package/.mux/skills/stripe-best-practices/SKILL.md +42 -0
  148. package/.mux/skills/stripe-best-practices/references/billing.md +36 -0
  149. package/.mux/skills/stripe-best-practices/references/connect.md +48 -0
  150. package/.mux/skills/stripe-best-practices/references/payments.md +79 -0
  151. package/.mux/skills/stripe-best-practices/references/security.md +109 -0
  152. package/.mux/skills/stripe-best-practices/references/treasury.md +16 -0
  153. package/.mux/skills/stripe-projects/SKILL.md +139 -0
  154. package/.mux/skills/upgrade-stripe/SKILL.md +185 -0
  155. package/.neovate/skills/stripe-best-practices/SKILL.md +42 -0
  156. package/.neovate/skills/stripe-best-practices/references/billing.md +36 -0
  157. package/.neovate/skills/stripe-best-practices/references/connect.md +48 -0
  158. package/.neovate/skills/stripe-best-practices/references/payments.md +79 -0
  159. package/.neovate/skills/stripe-best-practices/references/security.md +109 -0
  160. package/.neovate/skills/stripe-best-practices/references/treasury.md +16 -0
  161. package/.neovate/skills/stripe-projects/SKILL.md +139 -0
  162. package/.neovate/skills/upgrade-stripe/SKILL.md +185 -0
  163. package/.nixpacksignore +14 -0
  164. package/.openhands/skills/stripe-best-practices/SKILL.md +42 -0
  165. package/.openhands/skills/stripe-best-practices/references/billing.md +36 -0
  166. package/.openhands/skills/stripe-best-practices/references/connect.md +48 -0
  167. package/.openhands/skills/stripe-best-practices/references/payments.md +79 -0
  168. package/.openhands/skills/stripe-best-practices/references/security.md +109 -0
  169. package/.openhands/skills/stripe-best-practices/references/treasury.md +16 -0
  170. package/.openhands/skills/stripe-projects/SKILL.md +139 -0
  171. package/.openhands/skills/upgrade-stripe/SKILL.md +185 -0
  172. package/.pi/skills/stripe-best-practices/SKILL.md +42 -0
  173. package/.pi/skills/stripe-best-practices/references/billing.md +36 -0
  174. package/.pi/skills/stripe-best-practices/references/connect.md +48 -0
  175. package/.pi/skills/stripe-best-practices/references/payments.md +79 -0
  176. package/.pi/skills/stripe-best-practices/references/security.md +109 -0
  177. package/.pi/skills/stripe-best-practices/references/treasury.md +16 -0
  178. package/.pi/skills/stripe-projects/SKILL.md +139 -0
  179. package/.pi/skills/upgrade-stripe/SKILL.md +185 -0
  180. package/.pochi/skills/stripe-best-practices/SKILL.md +42 -0
  181. package/.pochi/skills/stripe-best-practices/references/billing.md +36 -0
  182. package/.pochi/skills/stripe-best-practices/references/connect.md +48 -0
  183. package/.pochi/skills/stripe-best-practices/references/payments.md +79 -0
  184. package/.pochi/skills/stripe-best-practices/references/security.md +109 -0
  185. package/.pochi/skills/stripe-best-practices/references/treasury.md +16 -0
  186. package/.pochi/skills/stripe-projects/SKILL.md +139 -0
  187. package/.pochi/skills/upgrade-stripe/SKILL.md +185 -0
  188. package/.qoder/skills/stripe-best-practices/SKILL.md +42 -0
  189. package/.qoder/skills/stripe-best-practices/references/billing.md +36 -0
  190. package/.qoder/skills/stripe-best-practices/references/connect.md +48 -0
  191. package/.qoder/skills/stripe-best-practices/references/payments.md +79 -0
  192. package/.qoder/skills/stripe-best-practices/references/security.md +109 -0
  193. package/.qoder/skills/stripe-best-practices/references/treasury.md +16 -0
  194. package/.qoder/skills/stripe-projects/SKILL.md +139 -0
  195. package/.qoder/skills/upgrade-stripe/SKILL.md +185 -0
  196. package/.qwen/skills/stripe-best-practices/SKILL.md +42 -0
  197. package/.qwen/skills/stripe-best-practices/references/billing.md +36 -0
  198. package/.qwen/skills/stripe-best-practices/references/connect.md +48 -0
  199. package/.qwen/skills/stripe-best-practices/references/payments.md +79 -0
  200. package/.qwen/skills/stripe-best-practices/references/security.md +109 -0
  201. package/.qwen/skills/stripe-best-practices/references/treasury.md +16 -0
  202. package/.qwen/skills/stripe-projects/SKILL.md +139 -0
  203. package/.qwen/skills/upgrade-stripe/SKILL.md +185 -0
  204. package/.roo/skills/stripe-best-practices/SKILL.md +42 -0
  205. package/.roo/skills/stripe-best-practices/references/billing.md +36 -0
  206. package/.roo/skills/stripe-best-practices/references/connect.md +48 -0
  207. package/.roo/skills/stripe-best-practices/references/payments.md +79 -0
  208. package/.roo/skills/stripe-best-practices/references/security.md +109 -0
  209. package/.roo/skills/stripe-best-practices/references/treasury.md +16 -0
  210. package/.roo/skills/stripe-projects/SKILL.md +139 -0
  211. package/.roo/skills/upgrade-stripe/SKILL.md +185 -0
  212. package/.trae/skills/stripe-best-practices/SKILL.md +42 -0
  213. package/.trae/skills/stripe-best-practices/references/billing.md +36 -0
  214. package/.trae/skills/stripe-best-practices/references/connect.md +48 -0
  215. package/.trae/skills/stripe-best-practices/references/payments.md +79 -0
  216. package/.trae/skills/stripe-best-practices/references/security.md +109 -0
  217. package/.trae/skills/stripe-best-practices/references/treasury.md +16 -0
  218. package/.trae/skills/stripe-projects/SKILL.md +139 -0
  219. package/.trae/skills/upgrade-stripe/SKILL.md +185 -0
  220. package/.vibe/skills/stripe-best-practices/SKILL.md +42 -0
  221. package/.vibe/skills/stripe-best-practices/references/billing.md +36 -0
  222. package/.vibe/skills/stripe-best-practices/references/connect.md +48 -0
  223. package/.vibe/skills/stripe-best-practices/references/payments.md +79 -0
  224. package/.vibe/skills/stripe-best-practices/references/security.md +109 -0
  225. package/.vibe/skills/stripe-best-practices/references/treasury.md +16 -0
  226. package/.vibe/skills/stripe-projects/SKILL.md +139 -0
  227. package/.vibe/skills/upgrade-stripe/SKILL.md +185 -0
  228. package/.windsurf/skills/stripe-best-practices/SKILL.md +42 -0
  229. package/.windsurf/skills/stripe-best-practices/references/billing.md +36 -0
  230. package/.windsurf/skills/stripe-best-practices/references/connect.md +48 -0
  231. package/.windsurf/skills/stripe-best-practices/references/payments.md +79 -0
  232. package/.windsurf/skills/stripe-best-practices/references/security.md +109 -0
  233. package/.windsurf/skills/stripe-best-practices/references/treasury.md +16 -0
  234. package/.windsurf/skills/stripe-projects/SKILL.md +139 -0
  235. package/.windsurf/skills/upgrade-stripe/SKILL.md +185 -0
  236. package/.zencoder/skills/stripe-best-practices/SKILL.md +42 -0
  237. package/.zencoder/skills/stripe-best-practices/references/billing.md +36 -0
  238. package/.zencoder/skills/stripe-best-practices/references/connect.md +48 -0
  239. package/.zencoder/skills/stripe-best-practices/references/payments.md +79 -0
  240. package/.zencoder/skills/stripe-best-practices/references/security.md +109 -0
  241. package/.zencoder/skills/stripe-best-practices/references/treasury.md +16 -0
  242. package/.zencoder/skills/stripe-projects/SKILL.md +139 -0
  243. package/.zencoder/skills/upgrade-stripe/SKILL.md +185 -0
  244. package/AUDIT.md +95 -0
  245. package/BLOCKERS.md +0 -0
  246. package/COOLIFY.md +51 -0
  247. package/MCP_SETUP.md +23 -0
  248. package/PRODUCTION_CHECKLIST.md +246 -0
  249. package/README.md +47 -0
  250. package/ROADMAP.md +91 -0
  251. package/docs/superpowers/plans/2026-05-11-availsync-frontend-sales-flow.md +2445 -0
  252. package/frontend/.env.example +2 -0
  253. package/frontend/app/admin/layout.tsx +13 -0
  254. package/frontend/app/admin/page.tsx +747 -0
  255. package/frontend/app/app/activity/page.tsx +257 -0
  256. package/frontend/app/app/agents/[agentId]/page.tsx +21 -0
  257. package/frontend/app/app/agents/page.tsx +1155 -0
  258. package/frontend/app/app/audit/page.tsx +225 -0
  259. package/frontend/app/app/availability/page.tsx +840 -0
  260. package/frontend/app/app/holds/page.tsx +262 -0
  261. package/frontend/app/app/layout.tsx +19 -0
  262. package/frontend/app/app/onboarding/page.tsx +10 -0
  263. package/frontend/app/app/onboarding/verify/page.tsx +309 -0
  264. package/frontend/app/app/page.tsx +508 -0
  265. package/frontend/app/app/settings/page.tsx +399 -0
  266. package/frontend/app/app/work/page.tsx +426 -0
  267. package/frontend/app/changelog/page.tsx +93 -0
  268. package/frontend/app/checkout/page.tsx +25 -0
  269. package/frontend/app/docs/api/page.tsx +157 -0
  270. package/frontend/app/docs/page.tsx +296 -0
  271. package/frontend/app/docs/pilot/page.tsx +127 -0
  272. package/frontend/app/docs/quickstart/page.tsx +318 -0
  273. package/frontend/app/docs/reliability/page.tsx +78 -0
  274. package/frontend/app/docs/sdk/node/page.tsx +166 -0
  275. package/frontend/app/globals.css +57 -0
  276. package/frontend/app/icon.png +0 -0
  277. package/frontend/app/layout.tsx +87 -0
  278. package/frontend/app/login/page.tsx +14 -0
  279. package/frontend/app/page.tsx +47 -0
  280. package/frontend/app/pricing/page.tsx +66 -0
  281. package/frontend/app/privacy/page.tsx +52 -0
  282. package/frontend/app/robots.ts +26 -0
  283. package/frontend/app/security/page.tsx +74 -0
  284. package/frontend/app/signup/page.tsx +14 -0
  285. package/frontend/app/sitemap.ts +14 -0
  286. package/frontend/app/terms/page.tsx +51 -0
  287. package/frontend/components/brand/AvailsyncLogo.tsx +56 -0
  288. package/frontend/components/checkout/CheckoutClient.tsx +100 -0
  289. package/frontend/components/dashboard/AgentForm.tsx +59 -0
  290. package/frontend/components/dashboard/AppShell.tsx +291 -0
  291. package/frontend/components/dashboard/AvailabilityChecker.tsx +117 -0
  292. package/frontend/components/dashboard/AvailabilityWindowForm.tsx +40 -0
  293. package/frontend/components/dashboard/HoldForm.tsx +133 -0
  294. package/frontend/components/dashboard/MetricCard.tsx +10 -0
  295. package/frontend/components/login/LoginForm.tsx +95 -0
  296. package/frontend/components/marketing/AgentCoordinationStory.tsx +1530 -0
  297. package/frontend/components/marketing/Faq.tsx +41 -0
  298. package/frontend/components/marketing/Hero.tsx +73 -0
  299. package/frontend/components/marketing/HowItWorks.tsx +28 -0
  300. package/frontend/components/marketing/ObserveModeTeaser.tsx +41 -0
  301. package/frontend/components/marketing/PricingTeaser.tsx +23 -0
  302. package/frontend/components/marketing/ProblemSolution.tsx +36 -0
  303. package/frontend/components/marketing/SiteFooter.tsx +59 -0
  304. package/frontend/components/marketing/SiteHeader.tsx +45 -0
  305. package/frontend/components/marketing/UseCases.tsx +27 -0
  306. package/frontend/components/onboarding/OnboardingClient.tsx +278 -0
  307. package/frontend/components/pricing/PricingCards.tsx +65 -0
  308. package/frontend/components/privacy/CookieConsent.tsx +230 -0
  309. package/frontend/components/privacy/CookieSettingsButton.tsx +15 -0
  310. package/frontend/components/seo/JsonLd.tsx +10 -0
  311. package/frontend/components/signup/SignupForm.tsx +55 -0
  312. package/frontend/components/ui/Badge.tsx +23 -0
  313. package/frontend/components/ui/Button.tsx +37 -0
  314. package/frontend/components/ui/Card.tsx +11 -0
  315. package/frontend/components/ui/ConfirmDialog.tsx +77 -0
  316. package/frontend/components/ui/EmptyState.tsx +24 -0
  317. package/frontend/components/ui/Input.tsx +14 -0
  318. package/frontend/components/ui/KeyDisplay.tsx +49 -0
  319. package/frontend/components/ui/Select.tsx +14 -0
  320. package/frontend/components/ui/Skeleton.tsx +24 -0
  321. package/frontend/components/ui/Tabs.tsx +19 -0
  322. package/frontend/components/ui/Textarea.tsx +14 -0
  323. package/frontend/components/ui/Toast.tsx +78 -0
  324. package/frontend/components/waitlist/WaitlistDialog.tsx +128 -0
  325. package/frontend/lib/api.ts +1282 -0
  326. package/frontend/lib/billing.ts +6 -0
  327. package/frontend/lib/cookieConsent.ts +113 -0
  328. package/frontend/lib/format.ts +16 -0
  329. package/frontend/lib/plans.ts +62 -0
  330. package/frontend/lib/schemas.ts +108 -0
  331. package/frontend/lib/seo.ts +376 -0
  332. package/frontend/lib/setupGuides.ts +630 -0
  333. package/frontend/lib/storage.ts +30 -0
  334. package/frontend/next-env.d.ts +6 -0
  335. package/frontend/next.config.mjs +13 -0
  336. package/frontend/package-lock.json +14409 -0
  337. package/frontend/package.json +41 -0
  338. package/frontend/playwright.config.ts +20 -0
  339. package/frontend/postcss.config.mjs +8 -0
  340. package/frontend/public/.gitkeep +0 -0
  341. package/frontend/public/brand/availsync-logo-board.png +0 -0
  342. package/frontend/public/brand/availsync-logo-dark.png +0 -0
  343. package/frontend/public/brand/availsync-mark-dark.png +0 -0
  344. package/frontend/public/brand/availsync-wordmark-dark.png +0 -0
  345. package/frontend/public/marketing/hero-agent-coordination.png +0 -0
  346. package/frontend/tailwind.config.ts +53 -0
  347. package/frontend/tests/smoke.spec.ts +89 -0
  348. package/frontend/tsconfig.json +23 -0
  349. package/jest.config.js +7 -0
  350. package/nixpacks.toml +11 -0
  351. package/package.json +53 -0
  352. package/packages/mcp/LICENSE +21 -0
  353. package/packages/mcp/README.md +60 -0
  354. package/packages/mcp/jest.config.cjs +8 -0
  355. package/packages/mcp/package.json +54 -0
  356. package/packages/mcp/src/helpers.ts +38 -0
  357. package/packages/mcp/src/index.test.ts +60 -0
  358. package/packages/mcp/src/index.ts +387 -0
  359. package/packages/mcp/tsconfig.json +20 -0
  360. package/packages/mcp/tsconfig.test.json +12 -0
  361. package/packages/node/LICENSE +21 -0
  362. package/packages/node/README.md +120 -0
  363. package/packages/node/jest.config.cjs +8 -0
  364. package/packages/node/package.json +46 -0
  365. package/packages/node/src/index.test.ts +360 -0
  366. package/packages/node/src/index.ts +402 -0
  367. package/packages/node/tsconfig.json +20 -0
  368. package/packages/node/tsconfig.test.json +12 -0
  369. package/plan.md +923 -0
  370. package/skills/stripe-best-practices/SKILL.md +42 -0
  371. package/skills/stripe-best-practices/references/billing.md +36 -0
  372. package/skills/stripe-best-practices/references/connect.md +48 -0
  373. package/skills/stripe-best-practices/references/payments.md +79 -0
  374. package/skills/stripe-best-practices/references/security.md +109 -0
  375. package/skills/stripe-best-practices/references/treasury.md +16 -0
  376. package/skills/stripe-projects/SKILL.md +139 -0
  377. package/skills/upgrade-stripe/SKILL.md +185 -0
  378. package/skills-lock.json +20 -0
  379. package/src/core/availability.ts +178 -0
  380. package/src/core/conflict.ts +209 -0
  381. package/src/core/work.ts +490 -0
  382. package/src/db/client.ts +17 -0
  383. package/src/db/migrations/001_init.sql +88 -0
  384. package/src/db/migrations/002_stripe.sql +2 -0
  385. package/src/db/migrations/003_workspace_auth.sql +19 -0
  386. package/src/db/migrations/004_agent_mcp_status.sql +2 -0
  387. package/src/db/migrations/005_hold_event_actor.sql +4 -0
  388. package/src/db/migrations/006_agent_activity.sql +35 -0
  389. package/src/db/migrations/007_work_coordination.sql +60 -0
  390. package/src/db/migrations/008_work_claim_leases.sql +20 -0
  391. package/src/db/migrations/009_billing_subscription_state.sql +23 -0
  392. package/src/db/migrations/010_agent_api_key_prefix.sql +10 -0
  393. package/src/db/migrations/011_org_verified_and_work_event_retention.sql +11 -0
  394. package/src/db/migrations/012_agent_enforcement_mode.sql +12 -0
  395. package/src/db/migrations/013_support_tickets.sql +21 -0
  396. package/src/db/migrations/014_paid_plan_waitlist.sql +23 -0
  397. package/src/db/migrations/015_agent_last_seen.sql +2 -0
  398. package/src/db/migrations.ts +164 -0
  399. package/src/db/run-migrations.ts +13 -0
  400. package/src/index.ts +183 -0
  401. package/src/lib/activity.ts +137 -0
  402. package/src/lib/apiKeys.ts +32 -0
  403. package/src/lib/appInfo.ts +26 -0
  404. package/src/lib/billingConfig.ts +3 -0
  405. package/src/lib/env.ts +75 -0
  406. package/src/lib/logger.ts +8 -0
  407. package/src/lib/plans.ts +204 -0
  408. package/src/mcp/server.js +5 -0
  409. package/src/mcp/server.ts +350 -0
  410. package/src/middleware/auth.ts +342 -0
  411. package/src/middleware/requestId.ts +16 -0
  412. package/src/routes/account.ts +168 -0
  413. package/src/routes/activity.ts +126 -0
  414. package/src/routes/admin.ts +514 -0
  415. package/src/routes/audit.ts +68 -0
  416. package/src/routes/auth.ts +203 -0
  417. package/src/routes/availability.ts +325 -0
  418. package/src/routes/billing.ts +406 -0
  419. package/src/routes/conflicts.ts +131 -0
  420. package/src/routes/holds.ts +437 -0
  421. package/src/routes/mcp.ts +57 -0
  422. package/src/routes/metrics.ts +39 -0
  423. package/src/routes/onboarding.ts +273 -0
  424. package/src/routes/orgs.ts +981 -0
  425. package/src/routes/preferences.ts +132 -0
  426. package/src/routes/session.ts +16 -0
  427. package/src/routes/support.ts +77 -0
  428. package/src/routes/value.ts +186 -0
  429. package/src/routes/waitlist.ts +63 -0
  430. package/src/routes/work.ts +1578 -0
  431. package/src/server.ts +36 -0
  432. package/src/types/index.ts +109 -0
  433. package/tests/integration/activity.route.test.ts +103 -0
  434. package/tests/integration/admin.route.test.ts +143 -0
  435. package/tests/integration/agent-keys.route.test.ts +237 -0
  436. package/tests/integration/availability.route.test.ts +125 -0
  437. package/tests/integration/billing.route.test.ts +393 -0
  438. package/tests/integration/conflicts.route.test.ts +131 -0
  439. package/tests/integration/flows.test.ts +154 -0
  440. package/tests/integration/helpers.ts +134 -0
  441. package/tests/integration/holds.route.test.ts +185 -0
  442. package/tests/integration/metrics.route.test.ts +100 -0
  443. package/tests/integration/onboarding.verify.route.test.ts +163 -0
  444. package/tests/integration/preferences.route.test.ts +53 -0
  445. package/tests/integration/session.route.test.ts +97 -0
  446. package/tests/integration/system.route.test.ts +92 -0
  447. package/tests/integration/value.route.test.ts +235 -0
  448. package/tests/integration/work.route.test.ts +745 -0
  449. package/tests/setup.ts +4 -0
  450. package/tests/smoke.sh +62 -0
  451. package/tests/unit/auth.test.ts +114 -0
  452. package/tests/unit/availability.test.ts +149 -0
  453. package/tests/unit/conflict.test.ts +118 -0
  454. package/tests/unit/env.test.ts +69 -0
  455. package/tests/unit/migrations.test.ts +135 -0
  456. package/tests/unit/request-id.test.ts +37 -0
  457. package/tmp-mobile-agents.png +0 -0
  458. package/tmp-next-mobile.err.log +10 -0
  459. package/tmp-next-mobile.log +5 -0
  460. 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
+ }