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,87 @@
1
+ import type { Metadata, Viewport } from 'next';
2
+ import { GeistSans } from 'geist/font/sans';
3
+ import { GeistMono } from 'geist/font/mono';
4
+ import { CookieConsent } from '@/components/privacy/CookieConsent';
5
+ import { defaultOgImage, siteDescription, siteName, siteUrl } from '@/lib/seo';
6
+ import './globals.css';
7
+
8
+ export const metadata: Metadata = {
9
+ metadataBase: new URL(siteUrl),
10
+ applicationName: siteName,
11
+ title: {
12
+ default: 'Availsync - Coordinate coding agents before they act',
13
+ template: `%s | ${siteName}`,
14
+ },
15
+ description: siteDescription,
16
+ keywords: [
17
+ 'AI agent coordination',
18
+ 'coding agent guardrails',
19
+ 'repo lock API',
20
+ 'agent work claim API',
21
+ 'agent pre-flight checks',
22
+ 'observe mode',
23
+ 'skip_run',
24
+ 'MCP server',
25
+ 'agent activity log',
26
+ 'availability API',
27
+ 'conflict preview API',
28
+ ],
29
+ authors: [{ name: siteName, url: siteUrl }],
30
+ creator: siteName,
31
+ publisher: siteName,
32
+ alternates: {
33
+ canonical: '/',
34
+ },
35
+ openGraph: {
36
+ type: 'website',
37
+ locale: 'en_US',
38
+ url: siteUrl,
39
+ siteName,
40
+ title: 'Availsync - Coordinate coding agents before they act',
41
+ description: siteDescription,
42
+ images: [
43
+ {
44
+ url: defaultOgImage,
45
+ width: 1200,
46
+ height: 630,
47
+ alt: 'Availsync agent coordination dashboard',
48
+ },
49
+ ],
50
+ },
51
+ twitter: {
52
+ card: 'summary_large_image',
53
+ title: 'Availsync - Coordinate coding agents before they act',
54
+ description: siteDescription,
55
+ images: [defaultOgImage],
56
+ },
57
+ robots: {
58
+ index: true,
59
+ follow: true,
60
+ googleBot: {
61
+ index: true,
62
+ follow: true,
63
+ 'max-image-preview': 'large',
64
+ 'max-snippet': -1,
65
+ 'max-video-preview': -1,
66
+ },
67
+ },
68
+ };
69
+
70
+ export const viewport: Viewport = {
71
+ width: 'device-width',
72
+ initialScale: 1,
73
+ maximumScale: 5,
74
+ userScalable: true,
75
+ themeColor: '#0b0b0c',
76
+ };
77
+
78
+ export default function RootLayout({ children }: { children: React.ReactNode }) {
79
+ return (
80
+ <html lang="en" className={`${GeistSans.variable} ${GeistMono.variable}`}>
81
+ <body className="font-sans">
82
+ {children}
83
+ <CookieConsent />
84
+ </body>
85
+ </html>
86
+ );
87
+ }
@@ -0,0 +1,14 @@
1
+ import type { Metadata } from 'next';
2
+ import { LoginForm } from '@/components/login/LoginForm';
3
+
4
+ export const metadata: Metadata = {
5
+ title: 'Login',
6
+ robots: {
7
+ index: false,
8
+ follow: false,
9
+ },
10
+ };
11
+
12
+ export default function LoginPage() {
13
+ return <LoginForm />;
14
+ }
@@ -0,0 +1,47 @@
1
+ import type { Metadata } from 'next';
2
+ import { AgentCoordinationStory } from '@/components/marketing/AgentCoordinationStory';
3
+ import { Faq } from '@/components/marketing/Faq';
4
+ import { Hero } from '@/components/marketing/Hero';
5
+ import { HowItWorks } from '@/components/marketing/HowItWorks';
6
+ import { ObserveModeTeaser } from '@/components/marketing/ObserveModeTeaser';
7
+ import { PricingTeaser } from '@/components/marketing/PricingTeaser';
8
+ import { ProblemSolution } from '@/components/marketing/ProblemSolution';
9
+ import { SiteFooter } from '@/components/marketing/SiteFooter';
10
+ import { SiteHeader } from '@/components/marketing/SiteHeader';
11
+ import { UseCases } from '@/components/marketing/UseCases';
12
+ import { JsonLd } from '@/components/seo/JsonLd';
13
+ import { defaultOgImage, homePageSchema, siteDescription, siteUrl } from '@/lib/seo';
14
+
15
+ export const metadata: Metadata = {
16
+ title: 'Give coding agents one place to coordinate',
17
+ description: siteDescription,
18
+ alternates: {
19
+ canonical: '/',
20
+ },
21
+ openGraph: {
22
+ url: siteUrl,
23
+ title: 'Give coding agents one place to coordinate',
24
+ description: siteDescription,
25
+ images: [defaultOgImage],
26
+ },
27
+ };
28
+
29
+ export default function HomePage() {
30
+ return (
31
+ <>
32
+ <JsonLd data={homePageSchema()} />
33
+ <SiteHeader />
34
+ <main>
35
+ <Hero />
36
+ <AgentCoordinationStory />
37
+ <ProblemSolution />
38
+ <HowItWorks />
39
+ <ObserveModeTeaser />
40
+ <UseCases />
41
+ <PricingTeaser />
42
+ <Faq />
43
+ </main>
44
+ <SiteFooter />
45
+ </>
46
+ );
47
+ }
@@ -0,0 +1,66 @@
1
+ import type { Metadata } from 'next';
2
+ import { SiteFooter } from '@/components/marketing/SiteFooter';
3
+ import { SiteHeader } from '@/components/marketing/SiteHeader';
4
+ import { PricingCards } from '@/components/pricing/PricingCards';
5
+ import { JsonLd } from '@/components/seo/JsonLd';
6
+ import { pricingPageSchema } from '@/lib/seo';
7
+
8
+ export const metadata: Metadata = {
9
+ title: 'Pricing',
10
+ description:
11
+ 'Availsync pricing for AI-agent coordination. Start free now; paid individual and team plans are waitlist-only during the private pilot.',
12
+ alternates: {
13
+ canonical: '/pricing',
14
+ },
15
+ };
16
+
17
+ export default function PricingPage() {
18
+ return (
19
+ <>
20
+ <JsonLd data={pricingPageSchema()} />
21
+ <SiteHeader />
22
+ <main className="min-h-screen bg-bg">
23
+ <section className="mx-auto max-w-6xl px-4 py-20">
24
+ <p className="text-label uppercase text-text-tertiary">Pricing</p>
25
+ <h1 className="mt-3 max-w-3xl text-5xl font-semibold text-text-primary">
26
+ Simple pricing for coding-agent coordination.
27
+ </h1>
28
+ <p className="mt-5 max-w-2xl text-heading leading-7 text-text-secondary">
29
+ Start free today. Paid Individual and Team plans are temporarily waitlist-only while
30
+ early pilots validate repo guardrails, Node SDK flows, observe-only data, and conflict
31
+ resolution across automations.
32
+ </p>
33
+ <div className="mt-6 grid gap-3 text-body text-text-secondary sm:grid-cols-3">
34
+ <div className="rounded border border-border bg-surface p-3">Free includes 3 agents and no card required.</div>
35
+ <div className="rounded border border-border bg-surface p-3">Paid tiers add more agents, resources, active claims, and history.</div>
36
+ <div className="rounded border border-border bg-surface p-3">Node SDK alpha and observe mode are available on every plan.</div>
37
+ </div>
38
+ <div className="mt-10">
39
+ <PricingCards />
40
+ </div>
41
+ <section className="mt-12 rounded border border-border bg-surface p-6">
42
+ <p className="text-label uppercase text-text-tertiary">Usage limits</p>
43
+ <h2 className="mt-2 text-3xl font-semibold text-text-primary">How limits are counted</h2>
44
+ <div className="mt-5 grid gap-3 text-body leading-6 text-text-secondary md:grid-cols-3">
45
+ <div className="rounded border border-border bg-bg p-4">
46
+ <strong className="text-text-primary">Protected resources</strong> are unique
47
+ resource pairs like <code>repo:owner/name</code> or <code>project:homepage</code>.
48
+ Releasing a claim does not remove the saved resource.
49
+ </div>
50
+ <div className="rounded border border-border bg-bg p-4">
51
+ <strong className="text-text-primary">Active work claims</strong> are leases that
52
+ are still active and not expired. Expired, released, and superseded claims do not
53
+ count as active.
54
+ </div>
55
+ <div className="rounded border border-border bg-bg p-4">
56
+ <strong className="text-text-primary">Free plan example</strong>: you can create 3
57
+ agents, but only 1 agent can hold an active repo/project claim at a time.
58
+ </div>
59
+ </div>
60
+ </section>
61
+ </section>
62
+ </main>
63
+ <SiteFooter />
64
+ </>
65
+ );
66
+ }
@@ -0,0 +1,52 @@
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: 'Privacy',
9
+ description: 'Pragmatic v1 privacy notes for Availsync account data, agent metadata, billing data, and activity logs.',
10
+ alternates: {
11
+ canonical: '/privacy',
12
+ },
13
+ };
14
+
15
+ const sections = [
16
+ ['Account data', 'We collect the information needed to create and operate your workspace, including email address, workspace name, password hash, plan, and session records.'],
17
+ ['Agent and activity metadata', 'We store agent names, ids, preferences, work resources, claims, audit events, and runtime activity metadata so the dashboard can show setup, value, errors, and governance history.'],
18
+ ['Billing data', 'Paid upgrades are currently waitlist-only. If paid billing is enabled for your workspace later, Stripe handles payment details. Availsync stores billing identifiers, plan, subscription status, billing email, and period dates, not full card numbers.'],
19
+ ['Cookies and sessions', 'The dashboard uses necessary session cookies for login and security. Availsync also stores your cookie preference in a necessary consent cookie named availsync_cookie_consent. Optional analytics and marketing categories are available in the preference UI, but Availsync does not load third-party analytics, ad pixels, or marketing cookies by default. Agent API keys are separate runtime credentials and are not browser login sessions.'],
20
+ ['Retention', 'Activity history limits shown during the alpha should be treated as pilot retention targets while the product matures. Operational records may remain available long enough for debugging, support, billing, fraud prevention, or legal obligations.'],
21
+ ['Account deletion', 'You can delete your workspace from Settings > Account. Deletion removes workspace users, agents, sessions, activity and audit data, work resources, claims, support tickets, matching waitlist rows by workspace/user/email, and related workspace records. If paid billing is enabled for your workspace, active Stripe subscriptions are canceled as part of deletion. There is no recovery window promised for this v1 flow.'],
22
+ ['Sharing', 'We do not sell personal data. We may share data with infrastructure providers needed to host, secure, bill, and operate Availsync.'],
23
+ ];
24
+
25
+ export default function PrivacyPage() {
26
+ return (
27
+ <>
28
+ <JsonLd data={webPageSchema('/privacy', 'Availsync privacy', metadata.description as string)} />
29
+ <SiteHeader />
30
+ <main className="min-h-screen bg-bg">
31
+ <section className="mx-auto max-w-4xl px-4 py-16">
32
+ <p className="text-label uppercase text-text-tertiary">Privacy</p>
33
+ <h1 className="mt-3 text-5xl font-semibold text-text-primary">Pragmatic v1 privacy policy.</h1>
34
+ <p className="mt-5 text-heading leading-7 text-text-secondary">
35
+ This page explains what Availsync needs to run the product. It is intended for early
36
+ self-serve pilots and should be reviewed professionally before enterprise procurement.
37
+ </p>
38
+ <div className="mt-10 grid gap-4">
39
+ {sections.map(([title, body]) => (
40
+ <div className="rounded border border-border bg-surface p-5" key={title}>
41
+ <h2 className="text-heading font-semibold text-text-primary">{title}</h2>
42
+ <p className="mt-2 text-body leading-6 text-text-secondary">{body}</p>
43
+ </div>
44
+ ))}
45
+ </div>
46
+ <p className="mt-8 text-body leading-6 text-text-tertiary">Last updated: May 14, 2026.</p>
47
+ </section>
48
+ </main>
49
+ <SiteFooter />
50
+ </>
51
+ );
52
+ }
@@ -0,0 +1,26 @@
1
+ import type { MetadataRoute } from 'next';
2
+ import { siteUrl } from '@/lib/seo';
3
+
4
+ export default function robots(): MetadataRoute.Robots {
5
+ return {
6
+ rules: [
7
+ {
8
+ userAgent: '*',
9
+ allow: '/',
10
+ disallow: [
11
+ '/admin',
12
+ '/admin/',
13
+ '/app',
14
+ '/app/',
15
+ '/checkout',
16
+ '/login',
17
+ '/signup',
18
+ '/api/',
19
+ '/v1/',
20
+ ],
21
+ },
22
+ ],
23
+ sitemap: `${siteUrl}/sitemap.xml`,
24
+ host: siteUrl,
25
+ };
26
+ }
@@ -0,0 +1,74 @@
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: 'Security',
9
+ description:
10
+ 'How Availsync handles agent API keys, metadata-only activity logs, observe mode, and guarded automation traffic.',
11
+ alternates: {
12
+ canonical: '/security',
13
+ },
14
+ };
15
+
16
+ const sections = [
17
+ {
18
+ title: 'Agent API keys',
19
+ body:
20
+ 'Agent API keys are one-time runtime secrets. Availsync shows the raw key only after creation or rotation, then stores only hashed verification material. Store keys in MCP, CI, server, or automation environment variables, not in prompts, repos, or browser-visible code.',
21
+ },
22
+ {
23
+ title: 'Runtime activity data',
24
+ body:
25
+ 'Activity logs are metadata-first: endpoint/tool name, status, latency, agent, client name, error code, and optional reported token usage. Availsync does not store raw API keys, auth headers, cookies, passwords, or full request bodies by default.',
26
+ },
27
+ {
28
+ title: 'Observe vs enforce',
29
+ body:
30
+ 'Observe mode lets a pilot run without blocking downstream work. It creates no active lease and records what Availsync would have blocked. Enforce mode creates real work claims and returns skip_run when another active claim owns the same repo or project.',
31
+ },
32
+ {
33
+ title: 'Work claims',
34
+ body:
35
+ 'Work claims are scoped to org, resource type, and resource key. Repo-level resources are the safest default. Project-level resources allow parallel work only when streams are independent.',
36
+ },
37
+ {
38
+ title: 'What Availsync does not claim yet',
39
+ body:
40
+ 'Availsync does not yet provide SSO, SOC 2 certification, automatic dependency inference between separate resources, hosted calendar-provider sync, or enterprise audit exports. These are roadmap items, not current guarantees.',
41
+ },
42
+ ];
43
+
44
+ export default function SecurityPage() {
45
+ return (
46
+ <>
47
+ <JsonLd data={webPageSchema('/security', 'Availsync security', metadata.description as string)} />
48
+ <SiteHeader />
49
+ <main className="min-h-screen bg-bg">
50
+ <section className="mx-auto max-w-4xl px-4 py-16">
51
+ <p className="text-label uppercase text-text-tertiary">Security</p>
52
+ <h1 className="mt-3 text-5xl font-semibold text-text-primary">Security model for agent guardrails.</h1>
53
+ <p className="mt-5 text-heading leading-7 text-text-secondary">
54
+ Availsync is built around scoped agent identities, one-time API keys, metadata-only
55
+ runtime logging, and explicit observe/enforce modes.
56
+ </p>
57
+ <div className="mt-10 grid gap-4">
58
+ {sections.map((section) => (
59
+ <div className="rounded border border-border bg-surface p-5" key={section.title}>
60
+ <h2 className="text-heading font-semibold text-text-primary">{section.title}</h2>
61
+ <p className="mt-2 text-body leading-6 text-text-secondary">{section.body}</p>
62
+ </div>
63
+ ))}
64
+ </div>
65
+ <p className="mt-8 text-body leading-6 text-text-tertiary">
66
+ To report a security issue, use Contact support from the dashboard, or open a support
67
+ ticket and mark it as security-related. Do not include API keys in the first message.
68
+ </p>
69
+ </section>
70
+ </main>
71
+ <SiteFooter />
72
+ </>
73
+ );
74
+ }
@@ -0,0 +1,14 @@
1
+ import type { Metadata } from 'next';
2
+ import { redirect } from 'next/navigation';
3
+
4
+ export const metadata: Metadata = {
5
+ title: 'Signup',
6
+ robots: {
7
+ index: false,
8
+ follow: false,
9
+ },
10
+ };
11
+
12
+ export default function SignupPage() {
13
+ redirect('/app/onboarding');
14
+ }
@@ -0,0 +1,14 @@
1
+ import type { MetadataRoute } from 'next';
2
+ import { defaultOgImage, publicRoutes, siteUrl } from '@/lib/seo';
3
+
4
+ export default function sitemap(): MetadataRoute.Sitemap {
5
+ const lastModified = new Date();
6
+
7
+ return publicRoutes.map((route) => ({
8
+ url: `${siteUrl}${route.path === '/' ? '' : route.path}`,
9
+ lastModified,
10
+ changeFrequency: route.changeFrequency,
11
+ priority: route.priority,
12
+ images: route.path === '/' ? [defaultOgImage] : undefined,
13
+ }));
14
+ }
@@ -0,0 +1,51 @@
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: 'Terms',
9
+ description: 'Pragmatic v1 terms for using Availsync, including alpha SDK expectations, billing, acceptable use, and no-warranty terms.',
10
+ alternates: {
11
+ canonical: '/terms',
12
+ },
13
+ };
14
+
15
+ const sections = [
16
+ ['Use of Availsync', 'You may use Availsync to coordinate agents, automations, work claims, availability holds, and related dashboard workflows for lawful purposes. You are responsible for your agents and downstream systems.'],
17
+ ['Alpha SDK', 'The Node SDK is currently published as an alpha. APIs are intended to remain stable during pilots, but alpha packages may change before a stable release. Pin versions for production tests.'],
18
+ ['Accounts and API keys', 'You are responsible for workspace credentials and agent API keys. Raw agent keys are one-time secrets and should be rotated if exposed.'],
19
+ ['Plans and billing', 'Free plans remain usable within plan limits. Paid plans are currently waitlist-only during the private pilot. When paid upgrades are enabled, billing is handled through Stripe.'],
20
+ ['Acceptable use', 'Do not use Availsync to attack systems, exfiltrate secrets, bypass access controls, overload the service, or coordinate unlawful automation.'],
21
+ ['No warranty', 'Availsync is provided as-is for early pilots. It is a guardrail layer, not a guarantee that downstream agents, repos, calendars, or deployment systems cannot fail.'],
22
+ ];
23
+
24
+ export default function TermsPage() {
25
+ return (
26
+ <>
27
+ <JsonLd data={webPageSchema('/terms', 'Availsync terms', metadata.description as string)} />
28
+ <SiteHeader />
29
+ <main className="min-h-screen bg-bg">
30
+ <section className="mx-auto max-w-4xl px-4 py-16">
31
+ <p className="text-label uppercase text-text-tertiary">Terms</p>
32
+ <h1 className="mt-3 text-5xl font-semibold text-text-primary">Pragmatic v1 terms.</h1>
33
+ <p className="mt-5 text-heading leading-7 text-text-secondary">
34
+ These terms are written for early self-serve pilots. They are not a replacement for
35
+ later legal review before large enterprise deals.
36
+ </p>
37
+ <div className="mt-10 grid gap-4">
38
+ {sections.map(([title, body]) => (
39
+ <div className="rounded border border-border bg-surface p-5" key={title}>
40
+ <h2 className="text-heading font-semibold text-text-primary">{title}</h2>
41
+ <p className="mt-2 text-body leading-6 text-text-secondary">{body}</p>
42
+ </div>
43
+ ))}
44
+ </div>
45
+ <p className="mt-8 text-body leading-6 text-text-tertiary">Last updated: May 13, 2026.</p>
46
+ </section>
47
+ </main>
48
+ <SiteFooter />
49
+ </>
50
+ );
51
+ }
@@ -0,0 +1,56 @@
1
+ import { twMerge } from 'tailwind-merge';
2
+
3
+ type LogoMarkProps = {
4
+ className?: string;
5
+ glow?: boolean;
6
+ };
7
+
8
+ export function AvailsyncMark({ className, glow = false }: LogoMarkProps) {
9
+ return (
10
+ <span
11
+ className={twMerge(
12
+ 'relative inline-flex h-8 w-8 shrink-0 overflow-hidden rounded border border-border bg-[#070a12] shadow-[inset_0_0_0_1px_rgba(255,255,255,0.04)]',
13
+ glow && 'shadow-[0_0_28px_rgba(94,106,210,0.26),inset_0_0_0_1px_rgba(255,255,255,0.05)]',
14
+ className,
15
+ )}
16
+ >
17
+ <img
18
+ alt=""
19
+ aria-hidden="true"
20
+ className="h-full w-full object-cover"
21
+ draggable={false}
22
+ src="/brand/availsync-mark-dark.png"
23
+ />
24
+ </span>
25
+ );
26
+ }
27
+
28
+ type LogoProps = {
29
+ className?: string;
30
+ markClassName?: string;
31
+ wordmarkClassName?: string;
32
+ compact?: boolean;
33
+ glow?: boolean;
34
+ };
35
+
36
+ export function AvailsyncLogo({
37
+ className,
38
+ markClassName,
39
+ wordmarkClassName,
40
+ compact = false,
41
+ glow = false,
42
+ }: LogoProps) {
43
+ return (
44
+ <span className={twMerge('inline-flex items-center gap-2.5 align-middle', className)}>
45
+ <AvailsyncMark className={twMerge('h-8 w-8', markClassName)} glow={glow} />
46
+ {!compact && (
47
+ <img
48
+ alt="Availsync"
49
+ className={twMerge('h-[22px] w-auto object-contain sm:h-6', wordmarkClassName)}
50
+ draggable={false}
51
+ src="/brand/availsync-wordmark-dark.png"
52
+ />
53
+ )}
54
+ </span>
55
+ );
56
+ }
@@ -0,0 +1,100 @@
1
+ 'use client';
2
+
3
+ import { useEffect, useState } from 'react';
4
+ import { useSearchParams } from 'next/navigation';
5
+ import { createCheckout } from '@/lib/api';
6
+ import { billingUpgradesEnabled } from '@/lib/billing';
7
+ import { loadSession } from '@/lib/storage';
8
+ import { WaitlistDialog } from '@/components/waitlist/WaitlistDialog';
9
+
10
+ export function CheckoutClient() {
11
+ const searchParams = useSearchParams();
12
+ const plan = searchParams.get('plan') === 'team' ? 'team' : 'individual';
13
+ const [message, setMessage] = useState('');
14
+ const [loading, setLoading] = useState(true);
15
+ const [waitlistOpen, setWaitlistOpen] = useState(false);
16
+ const upgradesEnabled = billingUpgradesEnabled();
17
+
18
+ useEffect(() => {
19
+ if (!upgradesEnabled) {
20
+ setMessage('Paid upgrades are currently waitlist-only.');
21
+ setLoading(false);
22
+ return;
23
+ }
24
+
25
+ const session = loadSession();
26
+ if (!session) {
27
+ setMessage('Please sign in first to upgrade your plan.');
28
+ setLoading(false);
29
+ return;
30
+ }
31
+
32
+ createCheckout({ plan, org_id: session.orgId })
33
+ .then((response) => {
34
+ if (response.url) {
35
+ window.location.href = response.url;
36
+ } else {
37
+ setMessage('Billing is not configured for this environment.');
38
+ setLoading(false);
39
+ }
40
+ })
41
+ .catch((err) => {
42
+ setMessage(err instanceof Error ? err.message : 'Billing is not configured.');
43
+ setLoading(false);
44
+ });
45
+ }, [plan, upgradesEnabled]);
46
+
47
+ return (
48
+ <div className="min-h-screen bg-bg flex items-center justify-center p-6">
49
+ <div className="text-center">
50
+ {loading ? (
51
+ <p className="text-body text-text-secondary">Redirecting to checkout...</p>
52
+ ) : (
53
+ <div>
54
+ <p className="text-body text-text-secondary mb-4">{message}</p>
55
+ {!upgradesEnabled && (
56
+ <>
57
+ <button
58
+ onClick={() => setWaitlistOpen(true)}
59
+ className="text-body text-accent hover:text-accent-hover"
60
+ >
61
+ Join waitlist
62
+ </button>
63
+ <span className="text-text-tertiary mx-2">or</span>
64
+ <a
65
+ href="/signup"
66
+ className="text-body text-accent hover:text-accent-hover"
67
+ >
68
+ Start free
69
+ </a>
70
+ </>
71
+ )}
72
+ {upgradesEnabled && (
73
+ <>
74
+ <a
75
+ href="/login"
76
+ className="text-body text-accent hover:text-accent-hover"
77
+ >
78
+ Sign in
79
+ </a>
80
+ <span className="text-text-tertiary mx-2">or</span>
81
+ <a
82
+ href="/app/onboarding"
83
+ className="text-body text-accent hover:text-accent-hover"
84
+ >
85
+ Create workspace
86
+ </a>
87
+ </>
88
+ )}
89
+ </div>
90
+ )}
91
+ </div>
92
+ <WaitlistDialog
93
+ open={waitlistOpen}
94
+ plan={plan}
95
+ source="checkout"
96
+ onClose={() => setWaitlistOpen(false)}
97
+ />
98
+ </div>
99
+ );
100
+ }
@@ -0,0 +1,59 @@
1
+ 'use client';
2
+
3
+ import { type AgentType } from '@/lib/schemas';
4
+ import { Input } from '@/components/ui/Input';
5
+ import { Select } from '@/components/ui/Select';
6
+
7
+ type AgentFormProps = {
8
+ name: string;
9
+ agentType: AgentType;
10
+ priority: number;
11
+ onNameChange: (value: string) => void;
12
+ onAgentTypeChange: (value: AgentType) => void;
13
+ onPriorityChange: (value: number) => void;
14
+ };
15
+
16
+ export function AgentForm({
17
+ name,
18
+ agentType,
19
+ priority,
20
+ onNameChange,
21
+ onAgentTypeChange,
22
+ onPriorityChange,
23
+ }: AgentFormProps) {
24
+ return (
25
+ <>
26
+ <label className="text-sm font-semibold" htmlFor="agent-name">
27
+ Agent name
28
+ </label>
29
+ <Input
30
+ id="agent-name"
31
+ required
32
+ value={name}
33
+ onChange={(event) => onNameChange(event.target.value)}
34
+ />
35
+ <label className="text-sm font-semibold" htmlFor="agent-type">
36
+ Agent type
37
+ </label>
38
+ <Select
39
+ id="agent-type"
40
+ value={agentType}
41
+ onChange={(event) => onAgentTypeChange(event.target.value as AgentType)}
42
+ >
43
+ <option value="external_meeting">Sales or external meeting bot</option>
44
+ <option value="internal">Internal assistant</option>
45
+ <option value="focus">Focus blocker</option>
46
+ <option value="generic">Generic agent</option>
47
+ </Select>
48
+ <label className="text-sm font-semibold" htmlFor="agent-priority">
49
+ Priority
50
+ </label>
51
+ <Input
52
+ id="agent-priority"
53
+ type="number"
54
+ value={priority}
55
+ onChange={(event) => onPriorityChange(Number(event.target.value))}
56
+ />
57
+ </>
58
+ );
59
+ }