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,6 @@
1
+ export function billingUpgradesEnabled() {
2
+ return process.env.NEXT_PUBLIC_BILLING_UPGRADES_ENABLED === 'true';
3
+ }
4
+
5
+ export const PAID_PLAN_WAITLIST_HREF =
6
+ '/pricing#waitlist';
@@ -0,0 +1,113 @@
1
+ 'use client';
2
+
3
+ export const COOKIE_CONSENT_VERSION = 1;
4
+ export const COOKIE_CONSENT_NAME = 'availsync_cookie_consent';
5
+ const SIX_MONTHS_SECONDS = 60 * 60 * 24 * 183;
6
+
7
+ export type OptionalConsentCategory = 'analytics' | 'marketing';
8
+
9
+ export type CookieConsent = {
10
+ version: number;
11
+ decided_at: string;
12
+ categories: {
13
+ necessary: true;
14
+ analytics: boolean;
15
+ marketing: boolean;
16
+ };
17
+ };
18
+
19
+ const CONSENT_CHANGED_EVENT = 'availsync:cookie-consent-changed';
20
+ export const OPEN_COOKIE_SETTINGS_EVENT = 'availsync:open-cookie-settings';
21
+
22
+ function canUseDocument() {
23
+ return typeof document !== 'undefined';
24
+ }
25
+
26
+ function consentCookieAttributes() {
27
+ const secure = typeof window !== 'undefined' && window.location.protocol === 'https:' ? '; Secure' : '';
28
+ return `Path=/; Max-Age=${SIX_MONTHS_SECONDS}; SameSite=Lax${secure}`;
29
+ }
30
+
31
+ function createConsent(analytics: boolean, marketing: boolean): CookieConsent {
32
+ return {
33
+ version: COOKIE_CONSENT_VERSION,
34
+ decided_at: new Date().toISOString(),
35
+ categories: {
36
+ necessary: true,
37
+ analytics,
38
+ marketing,
39
+ },
40
+ };
41
+ }
42
+
43
+ export function getCookieConsent(): CookieConsent | null {
44
+ if (!canUseDocument()) return null;
45
+
46
+ const prefix = `${COOKIE_CONSENT_NAME}=`;
47
+ const raw = document.cookie
48
+ .split(';')
49
+ .map((value) => value.trim())
50
+ .find((value) => value.startsWith(prefix));
51
+
52
+ if (!raw) return null;
53
+
54
+ try {
55
+ const parsed = JSON.parse(decodeURIComponent(raw.slice(prefix.length))) as CookieConsent;
56
+ if (parsed.version !== COOKIE_CONSENT_VERSION) return null;
57
+ if (parsed.categories?.necessary !== true) return null;
58
+ return parsed;
59
+ } catch {
60
+ return null;
61
+ }
62
+ }
63
+
64
+ export function setCookieConsent(input: {
65
+ analytics: boolean;
66
+ marketing: boolean;
67
+ }): CookieConsent {
68
+ const consent = createConsent(input.analytics, input.marketing);
69
+
70
+ if (canUseDocument()) {
71
+ document.cookie = `${COOKIE_CONSENT_NAME}=${encodeURIComponent(JSON.stringify(consent))}; ${consentCookieAttributes()}`;
72
+ window.dispatchEvent(new CustomEvent(CONSENT_CHANGED_EVENT, { detail: consent }));
73
+ }
74
+
75
+ return consent;
76
+ }
77
+
78
+ export function clearCookieConsent() {
79
+ if (!canUseDocument()) return;
80
+ document.cookie = `${COOKIE_CONSENT_NAME}=; Path=/; Max-Age=0; SameSite=Lax`;
81
+ window.dispatchEvent(new CustomEvent(CONSENT_CHANGED_EVENT, { detail: null }));
82
+ }
83
+
84
+ export function hasConsent(category: OptionalConsentCategory): boolean {
85
+ return getCookieConsent()?.categories[category] === true;
86
+ }
87
+
88
+ export function subscribeCookieConsent(
89
+ listener: (consent: CookieConsent | null) => void,
90
+ ): () => void {
91
+ if (typeof window === 'undefined') return () => {};
92
+
93
+ const handler = (event: Event) => {
94
+ listener((event as CustomEvent<CookieConsent | null>).detail ?? getCookieConsent());
95
+ };
96
+
97
+ window.addEventListener(CONSENT_CHANGED_EVENT, handler);
98
+ return () => window.removeEventListener(CONSENT_CHANGED_EVENT, handler);
99
+ }
100
+
101
+ export function runWhenConsent(
102
+ category: OptionalConsentCategory,
103
+ callback: () => void,
104
+ ): () => void {
105
+ if (hasConsent(category)) {
106
+ callback();
107
+ return () => {};
108
+ }
109
+
110
+ return subscribeCookieConsent((consent) => {
111
+ if (consent?.categories[category]) callback();
112
+ });
113
+ }
@@ -0,0 +1,16 @@
1
+ export function toLocalInputValue(date: Date): string {
2
+ const offset = date.getTimezoneOffset();
3
+ const local = new Date(date.getTime() - offset * 60_000);
4
+ return local.toISOString().slice(0, 16);
5
+ }
6
+
7
+ export function fromLocalInputValue(value: string): string {
8
+ return new Date(value).toISOString();
9
+ }
10
+
11
+ export function formatDateTime(value: string): string {
12
+ return new Intl.DateTimeFormat(undefined, {
13
+ dateStyle: 'medium',
14
+ timeStyle: 'short',
15
+ }).format(new Date(value));
16
+ }
@@ -0,0 +1,62 @@
1
+ export const plans = [
2
+ {
3
+ id: 'free',
4
+ name: 'Free',
5
+ price: '$0',
6
+ period: '',
7
+ description: 'For testing Availsync with up to 3 agents.',
8
+ cta: 'Start free',
9
+ href: '/signup?plan=free',
10
+ agentLimit: '3 agents',
11
+ limits: {
12
+ agents: 3,
13
+ protectedResources: 2,
14
+ activeWorkClaims: 1,
15
+ apiCallsMonth: 1000,
16
+ activityRetentionDays: 7,
17
+ },
18
+ features: ['3 agents', '2 protected resources', '1 active work claim', 'Node SDK alpha', 'Observe-only pilot mode', '1,000 API calls/month', '7-day pilot history target'],
19
+ },
20
+ {
21
+ id: 'individual',
22
+ name: 'Individual',
23
+ price: '$10',
24
+ period: '/mo',
25
+ description: 'For solo operators running multiple AI or coding agents.',
26
+ cta: 'Start individual',
27
+ href: '/checkout?plan=individual',
28
+ agentLimit: '15 agents',
29
+ limits: {
30
+ agents: 15,
31
+ protectedResources: 10,
32
+ activeWorkClaims: 5,
33
+ apiCallsMonth: 25000,
34
+ activityRetentionDays: 30,
35
+ },
36
+ features: ['15 agents', '10 protected resources', '5 active work claims', 'Node SDK alpha', 'Observe-only pilot mode', '25,000 API calls/month', '30-day pilot history target'],
37
+ },
38
+ {
39
+ id: 'team',
40
+ name: 'Team',
41
+ price: '$25',
42
+ period: '/mo',
43
+ description: 'For larger agent fleets. Single workspace user for now; multi-user invites are coming later.',
44
+ cta: 'Start team',
45
+ href: '/checkout?plan=team',
46
+ agentLimit: 'Unlimited agents',
47
+ limits: {
48
+ agents: null,
49
+ protectedResources: 100,
50
+ activeWorkClaims: 25,
51
+ apiCallsMonth: 250000,
52
+ activityRetentionDays: 90,
53
+ },
54
+ features: ['Unlimited agents', '100 protected resources', '25 active work claims', 'Single workspace user for now', 'Node SDK alpha', 'Observe-only pilot mode', '250,000 API calls/month', '90-day pilot history target'],
55
+ },
56
+ ] as const;
57
+
58
+ export type PlanId = (typeof plans)[number]['id'];
59
+
60
+ export function findPlan(planId: string) {
61
+ return plans.find((plan) => plan.id === planId) ?? plans[0];
62
+ }
@@ -0,0 +1,108 @@
1
+ import { z } from 'zod';
2
+
3
+ export const agentTypeSchema = z.enum(['external_meeting', 'internal', 'focus', 'generic']);
4
+
5
+ export const orgSchema = z.object({
6
+ id: z.string().uuid(),
7
+ name: z.string(),
8
+ plan: z.enum(['free', 'individual', 'team']),
9
+ agent_limit: z.number(),
10
+ verified_at: z.string().nullable().optional(),
11
+ created_at: z.string(),
12
+ });
13
+
14
+ export const agentSchema = z.object({
15
+ id: z.string().uuid(),
16
+ org_id: z.string().uuid(),
17
+ name: z.string(),
18
+ agent_type: agentTypeSchema,
19
+ priority: z.number(),
20
+ enforcement_mode: z.enum(['enforce', 'observe']).default('enforce'),
21
+ last_seen_at: z.string().nullable().optional(),
22
+ mcp_last_seen_at: z.string().nullable().optional(),
23
+ mcp_client_name: z.string().nullable().optional(),
24
+ last_used_at: z.string().nullable().optional(),
25
+ last_activity_at: z.string().nullable().optional(),
26
+ last_error_at: z.string().nullable().optional(),
27
+ last_error_code: z.string().nullable().optional(),
28
+ created_at: z.string(),
29
+ });
30
+
31
+ export const holdSchema = z.object({
32
+ id: z.string().uuid(),
33
+ agent_id: z.string().uuid(),
34
+ org_id: z.string().uuid(),
35
+ start_at: z.string(),
36
+ end_at: z.string(),
37
+ reason: z.string().nullable().optional(),
38
+ status: z.enum(['confirmed', 'superseded', 'released']),
39
+ booked_by_agent_id: z.string().uuid().nullable().optional(),
40
+ metadata: z.record(z.string(), z.unknown()).nullable().optional(),
41
+ created_at: z.string(),
42
+ });
43
+
44
+ export const slotSchema = z.object({
45
+ start: z.string(),
46
+ end: z.string(),
47
+ confidence: z.number(),
48
+ competing_holds_count: z.number(),
49
+ });
50
+
51
+ export const availabilityWindowSchema = z.object({
52
+ id: z.string().uuid(),
53
+ agent_id: z.string().uuid(),
54
+ start_at: z.string(),
55
+ end_at: z.string(),
56
+ window_type: z.enum(['available', 'focus', 'blocked']),
57
+ recurrence: z.string().nullable().optional(),
58
+ });
59
+
60
+ export const workResourceSchema = z.object({
61
+ id: z.string().uuid().nullable().optional(),
62
+ org_id: z.string().uuid().optional(),
63
+ resource_type: z.enum(['project', 'repo']),
64
+ resource_key: z.string(),
65
+ label: z.string(),
66
+ active_claims_count: z.number().optional(),
67
+ last_claim_at: z.string().nullable().optional(),
68
+ created_at: z.string().optional(),
69
+ });
70
+
71
+ export const workClaimSchema = z.object({
72
+ id: z.string().uuid(),
73
+ org_id: z.string().uuid(),
74
+ agent_id: z.string().uuid(),
75
+ agent_name: z.string().nullable().optional(),
76
+ resource_id: z.string().uuid(),
77
+ resource_type: z.enum(['project', 'repo']).optional(),
78
+ resource_key: z.string().optional(),
79
+ resource_label: z.string().nullable().optional(),
80
+ start_at: z.string(),
81
+ end_at: z.string(),
82
+ expires_at: z.string(),
83
+ last_renewed_at: z.string(),
84
+ renewal_count: z.number(),
85
+ seconds_until_expiry: z.number().nullable().optional(),
86
+ status: z.enum(['active', 'superseded', 'released', 'expired', 'blocked']),
87
+ reason: z.string().nullable().optional(),
88
+ metadata: z.record(z.string(), z.unknown()).nullable().optional(),
89
+ created_at: z.string(),
90
+ });
91
+
92
+ export const workspaceUserSchema = z.object({
93
+ id: z.string().uuid(),
94
+ org_id: z.string().uuid(),
95
+ email: z.string().email(),
96
+ role: z.enum(['owner', 'admin']).optional(),
97
+ created_at: z.string(),
98
+ });
99
+
100
+ export type AgentType = z.infer<typeof agentTypeSchema>;
101
+ export type Org = z.infer<typeof orgSchema>;
102
+ export type Agent = z.infer<typeof agentSchema>;
103
+ export type Hold = z.infer<typeof holdSchema>;
104
+ export type Slot = z.infer<typeof slotSchema>;
105
+ export type AvailabilityWindow = z.infer<typeof availabilityWindowSchema>;
106
+ export type WorkResource = z.infer<typeof workResourceSchema>;
107
+ export type WorkClaim = z.infer<typeof workClaimSchema>;
108
+ export type WorkspaceUser = z.infer<typeof workspaceUserSchema>;
@@ -0,0 +1,376 @@
1
+ import { plans } from '@/lib/plans';
2
+ import { billingUpgradesEnabled } from '@/lib/billing';
3
+
4
+ export const siteUrl = (
5
+ process.env.NEXT_PUBLIC_APP_URL ||
6
+ process.env.APP_URL ||
7
+ 'https://availsync.dev'
8
+ ).replace(/\/$/, '');
9
+
10
+ export const siteName = 'Availsync';
11
+
12
+ export const siteDescription =
13
+ 'Availsync gives AI and coding agents one shared place to claim repos and projects before they edit, deploy, schedule work, or run automations.';
14
+
15
+ export const defaultOgImage = `${siteUrl}/marketing/hero-agent-coordination.png`;
16
+
17
+ export const publicRoutes = [
18
+ {
19
+ path: '/',
20
+ changeFrequency: 'weekly',
21
+ priority: 1,
22
+ },
23
+ {
24
+ path: '/pricing',
25
+ changeFrequency: 'weekly',
26
+ priority: 0.8,
27
+ },
28
+ {
29
+ path: '/docs',
30
+ changeFrequency: 'monthly',
31
+ priority: 0.7,
32
+ },
33
+ {
34
+ path: '/docs/quickstart',
35
+ changeFrequency: 'weekly',
36
+ priority: 0.9,
37
+ },
38
+ {
39
+ path: '/docs/sdk/node',
40
+ changeFrequency: 'weekly',
41
+ priority: 0.85,
42
+ },
43
+ {
44
+ path: '/docs/api',
45
+ changeFrequency: 'weekly',
46
+ priority: 0.8,
47
+ },
48
+ {
49
+ path: '/docs/pilot',
50
+ changeFrequency: 'weekly',
51
+ priority: 0.85,
52
+ },
53
+ {
54
+ path: '/docs/reliability',
55
+ changeFrequency: 'monthly',
56
+ priority: 0.7,
57
+ },
58
+ {
59
+ path: '/security',
60
+ changeFrequency: 'monthly',
61
+ priority: 0.5,
62
+ },
63
+ {
64
+ path: '/privacy',
65
+ changeFrequency: 'monthly',
66
+ priority: 0.4,
67
+ },
68
+ {
69
+ path: '/terms',
70
+ changeFrequency: 'monthly',
71
+ priority: 0.4,
72
+ },
73
+ {
74
+ path: '/changelog',
75
+ changeFrequency: 'weekly',
76
+ priority: 0.55,
77
+ },
78
+ ] as const;
79
+
80
+ export const faqSchemaItems = [
81
+ {
82
+ question: 'Is Availsync a calendar app?',
83
+ answer:
84
+ 'No. Availsync is a coordination API for agents. It protects repos and projects first, and also supports availability holds for scheduling use cases.',
85
+ },
86
+ {
87
+ question: 'Does Availsync run my agents?',
88
+ answer:
89
+ 'No. Your agents still run in Codex, Claude, Cursor, MCP, cron, or your server. Availsync is the coordination check they call before acting.',
90
+ },
91
+ {
92
+ question: 'Is Availsync the same as a policy enforcement tool like Sift or PolicyLayer?',
93
+ answer:
94
+ 'No. Policy tools control what your agents are allowed to do. They sit between an agent and a tool call and ask: is this permitted?\n\nAvailsync controls when your agents can act. It asks: is this window, repo, or resource already claimed by another agent?\n\nAn agent can have full permission to deploy via a policy tool and still be blocked by Availsync because another agent owns that deploy window. They solve different problems and work well together.',
95
+ },
96
+ {
97
+ question: 'Does it stop agents automatically?',
98
+ answer:
99
+ 'Only agents that call Availsync can be coordinated. Availsync returns proceed, skip_run, or observe-mode decisions; your agent or SDK wrapper must respect that response.',
100
+ },
101
+ {
102
+ question: 'Can coding agents use it?',
103
+ answer:
104
+ 'Yes. Codex, Claude, Cursor, MCP clients, cron jobs, and server automations can call Availsync before they touch a repo or project.',
105
+ },
106
+ {
107
+ question: 'Can Availsync prevent stale context between agents?',
108
+ answer:
109
+ 'Yes for the same resource when repo-level claims are used. Availsync does not automatically infer dependencies between different project keys yet.',
110
+ },
111
+ {
112
+ question: 'Do API keys appear again?',
113
+ answer:
114
+ 'No. The raw key is never shown as text again. During creation you can copy it once, then store it in your agent or server environment.',
115
+ },
116
+ {
117
+ question: 'What happens when two agents want the same resource?',
118
+ answer:
119
+ 'Availsync applies explicit priority rules, agent type hierarchy, agent priority, then first-created order. The blocked agent gets a clear skip_run response.',
120
+ },
121
+ {
122
+ question: 'What if an agent crashes before releasing its claim?',
123
+ answer:
124
+ 'Availsync uses leases, not permanent locks. Every work claim has an expiry time, so a crashed agent cannot hold a repo or project forever.\n\nLong-running agents should extend the lease while they work and release it when they finish. The Node SDK withClaim helper does this cleanup in a finally path when a real claim exists.\n\nIf the agent crashes or disappears, the claim expires automatically and other agents can claim the resource again after the lease window.',
125
+ },
126
+ {
127
+ question: 'What happens if Availsync is unavailable?',
128
+ answer:
129
+ 'The SDK and MCP package surface the failure. In enforce mode, the recommended production policy is fail-closed; see the Reliability docs for details.',
130
+ },
131
+ ];
132
+
133
+ export function organizationSchema() {
134
+ return {
135
+ '@type': 'Organization',
136
+ '@id': `${siteUrl}/#organization`,
137
+ name: siteName,
138
+ url: siteUrl,
139
+ sameAs: [],
140
+ };
141
+ }
142
+
143
+ export function websiteSchema() {
144
+ return {
145
+ '@type': 'WebSite',
146
+ '@id': `${siteUrl}/#website`,
147
+ url: siteUrl,
148
+ name: siteName,
149
+ description: siteDescription,
150
+ publisher: { '@id': `${siteUrl}/#organization` },
151
+ inLanguage: 'en',
152
+ };
153
+ }
154
+
155
+ export function softwareApplicationSchema() {
156
+ return {
157
+ '@type': 'SoftwareApplication',
158
+ '@id': `${siteUrl}/#software`,
159
+ name: siteName,
160
+ applicationCategory: 'BusinessApplication',
161
+ operatingSystem: 'Web',
162
+ url: siteUrl,
163
+ image: defaultOgImage,
164
+ description: siteDescription,
165
+ featureList: [
166
+ 'AI and coding agent coordination',
167
+ 'Repo and project claim guardrails',
168
+ 'Observe mode before enforcement',
169
+ 'Proceed and skip_run runtime decisions',
170
+ 'Automation pre-flight checks',
171
+ 'Secondary availability and scheduling conflict previews',
172
+ 'MCP and REST integration flows',
173
+ 'Audit and activity logs for agent actions',
174
+ 'Plan limits and API key management',
175
+ ],
176
+ offers: plans.map((plan) => ({
177
+ '@type': 'Offer',
178
+ name: `${plan.name} plan`,
179
+ price: plan.id !== 'free' && !billingUpgradesEnabled() ? '0' : plan.price.replace('$', '') || '0',
180
+ priceCurrency: 'USD',
181
+ url: plan.id !== 'free' && !billingUpgradesEnabled() ? `${siteUrl}/pricing#waitlist` : `${siteUrl}${plan.href}`,
182
+ availability: plan.id !== 'free' && !billingUpgradesEnabled()
183
+ ? 'https://schema.org/PreOrder'
184
+ : 'https://schema.org/InStock',
185
+ description: plan.description,
186
+ })),
187
+ provider: { '@id': `${siteUrl}/#organization` },
188
+ };
189
+ }
190
+
191
+ export function faqPageSchema() {
192
+ return {
193
+ '@type': 'FAQPage',
194
+ '@id': `${siteUrl}/#faq`,
195
+ mainEntity: faqSchemaItems.map((item) => ({
196
+ '@type': 'Question',
197
+ name: item.question,
198
+ acceptedAnswer: {
199
+ '@type': 'Answer',
200
+ text: item.answer,
201
+ },
202
+ })),
203
+ };
204
+ }
205
+
206
+ export function homePageSchema() {
207
+ return {
208
+ '@context': 'https://schema.org',
209
+ '@graph': [
210
+ organizationSchema(),
211
+ websiteSchema(),
212
+ softwareApplicationSchema(),
213
+ faqPageSchema(),
214
+ {
215
+ '@type': 'WebPage',
216
+ '@id': `${siteUrl}/#webpage`,
217
+ url: siteUrl,
218
+ name: 'Availsync - Coding-agent coordination guardrails',
219
+ description: siteDescription,
220
+ isPartOf: { '@id': `${siteUrl}/#website` },
221
+ about: { '@id': `${siteUrl}/#software` },
222
+ primaryImageOfPage: {
223
+ '@type': 'ImageObject',
224
+ url: defaultOgImage,
225
+ },
226
+ },
227
+ ],
228
+ };
229
+ }
230
+
231
+ export function pricingPageSchema() {
232
+ return {
233
+ '@context': 'https://schema.org',
234
+ '@graph': [
235
+ organizationSchema(),
236
+ softwareApplicationSchema(),
237
+ {
238
+ '@type': 'WebPage',
239
+ '@id': `${siteUrl}/pricing#webpage`,
240
+ url: `${siteUrl}/pricing`,
241
+ name: 'Availsync pricing',
242
+ description:
243
+ 'Availsync pricing, including a free plan and waitlist-only Individual and Team plans for coding-agent coordination, protected resources, and API activity.',
244
+ isPartOf: { '@id': `${siteUrl}/#website` },
245
+ },
246
+ ],
247
+ };
248
+ }
249
+
250
+ export function docsPageSchema() {
251
+ return {
252
+ '@context': 'https://schema.org',
253
+ '@graph': [
254
+ organizationSchema(),
255
+ websiteSchema(),
256
+ {
257
+ '@type': 'TechArticle',
258
+ '@id': `${siteUrl}/docs#article`,
259
+ headline: 'Availsync API docs',
260
+ description:
261
+ 'Documentation for using Availsync as the shared work-claim, resource-lock, and conflict-preview layer before AI and coding agents act.',
262
+ url: `${siteUrl}/docs`,
263
+ author: { '@id': `${siteUrl}/#organization` },
264
+ publisher: { '@id': `${siteUrl}/#organization` },
265
+ },
266
+ ],
267
+ };
268
+ }
269
+
270
+ export function quickstartPageSchema() {
271
+ return {
272
+ '@context': 'https://schema.org',
273
+ '@graph': [
274
+ organizationSchema(),
275
+ websiteSchema(),
276
+ {
277
+ '@type': 'HowTo',
278
+ '@id': `${siteUrl}/docs/quickstart#howto`,
279
+ name: 'Connect an AI or coding agent to Availsync',
280
+ description:
281
+ 'Set up Availsync so coding agents can check, claim, extend, and release work slots before acting on a repo or project.',
282
+ totalTime: 'PT10M',
283
+ step: [
284
+ {
285
+ '@type': 'HowToStep',
286
+ name: 'Run dashboard setup test',
287
+ text: 'Validate the agent setup from the Availsync dashboard without exposing the raw API key.',
288
+ },
289
+ {
290
+ '@type': 'HowToStep',
291
+ name: 'Copy MCP or REST config',
292
+ text: 'Store the agent id and generated API key in the MCP, coding-agent, cron, or server environment.',
293
+ },
294
+ {
295
+ '@type': 'HowToStep',
296
+ name: 'Check and claim a work slot',
297
+ text: 'Call the automation guardrail endpoint before the agent starts work on a repo or project.',
298
+ },
299
+ {
300
+ '@type': 'HowToStep',
301
+ name: 'Extend and release',
302
+ text: 'Extend the lease while the agent is still working and release it when the run finishes.',
303
+ },
304
+ {
305
+ '@type': 'HowToStep',
306
+ name: 'Verify Activity',
307
+ text: 'Confirm heartbeat, work checks, claims, extensions, and releases in the Activity log.',
308
+ },
309
+ ],
310
+ },
311
+ ],
312
+ };
313
+ }
314
+
315
+ export function sdkNodePageSchema() {
316
+ return {
317
+ '@context': 'https://schema.org',
318
+ '@graph': [
319
+ organizationSchema(),
320
+ websiteSchema(),
321
+ {
322
+ '@type': 'TechArticle',
323
+ '@id': `${siteUrl}/docs/sdk/node#article`,
324
+ headline: 'Availsync Node SDK',
325
+ description:
326
+ 'Install and use @availsync/node to guard coding-agent automations with repo claims, observe mode, skip_run handling, extend, and finish.',
327
+ url: `${siteUrl}/docs/sdk/node`,
328
+ author: { '@id': `${siteUrl}/#organization` },
329
+ publisher: { '@id': `${siteUrl}/#organization` },
330
+ },
331
+ ],
332
+ };
333
+ }
334
+
335
+ export function pilotPageSchema() {
336
+ return {
337
+ '@context': 'https://schema.org',
338
+ '@graph': [
339
+ organizationSchema(),
340
+ websiteSchema(),
341
+ {
342
+ '@type': 'HowTo',
343
+ '@id': `${siteUrl}/docs/pilot#howto`,
344
+ name: 'Pilot Availsync in 10 minutes',
345
+ description:
346
+ 'A self-serve pilot flow for verifying Availsync, installing the Node SDK, running observe mode, and confirming real agent traffic.',
347
+ totalTime: 'PT10M',
348
+ step: [
349
+ { '@type': 'HowToStep', name: 'Start free', text: 'Create a workspace and first agent.' },
350
+ { '@type': 'HowToStep', name: 'Run verification', text: 'Use the dashboard verification to see a real conflict resolved.' },
351
+ { '@type': 'HowToStep', name: 'Install SDK', text: 'Install @availsync/node@alpha in the automation project.' },
352
+ { '@type': 'HowToStep', name: 'Use observe mode', text: 'Run without blocking and measure what Availsync would have stopped.' },
353
+ { '@type': 'HowToStep', name: 'Confirm value', text: 'Review Activity and Overview for real agent traffic and blocked or would-have-blocked runs.' },
354
+ ],
355
+ },
356
+ ],
357
+ };
358
+ }
359
+
360
+ export function webPageSchema(path: string, name: string, description: string) {
361
+ return {
362
+ '@context': 'https://schema.org',
363
+ '@graph': [
364
+ organizationSchema(),
365
+ websiteSchema(),
366
+ {
367
+ '@type': 'WebPage',
368
+ '@id': `${siteUrl}${path}#webpage`,
369
+ url: `${siteUrl}${path}`,
370
+ name,
371
+ description,
372
+ isPartOf: { '@id': `${siteUrl}/#website` },
373
+ },
374
+ ],
375
+ };
376
+ }