vibedoc 1.0.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 (201) hide show
  1. package/.next/BUILD_ID +1 -0
  2. package/.next/app-build-manifest.json +92 -0
  3. package/.next/app-path-routes-manifest.json +1 -0
  4. package/.next/build-manifest.json +32 -0
  5. package/.next/package.json +1 -0
  6. package/.next/prerender-manifest.js +1 -0
  7. package/.next/prerender-manifest.json +1 -0
  8. package/.next/react-loadable-manifest.json +282 -0
  9. package/.next/required-server-files.json +1 -0
  10. package/.next/routes-manifest.json +1 -0
  11. package/.next/server/app/(app)/activity/page.js +1 -0
  12. package/.next/server/app/(app)/activity/page.js.nft.json +1 -0
  13. package/.next/server/app/(app)/activity/page_client-reference-manifest.js +1 -0
  14. package/.next/server/app/(app)/board/page.js +2 -0
  15. package/.next/server/app/(app)/board/page.js.nft.json +1 -0
  16. package/.next/server/app/(app)/board/page_client-reference-manifest.js +1 -0
  17. package/.next/server/app/(app)/docs/page.js +2 -0
  18. package/.next/server/app/(app)/docs/page.js.nft.json +1 -0
  19. package/.next/server/app/(app)/docs/page_client-reference-manifest.js +1 -0
  20. package/.next/server/app/(app)/memory/page.js +7 -0
  21. package/.next/server/app/(app)/memory/page.js.nft.json +1 -0
  22. package/.next/server/app/(app)/memory/page_client-reference-manifest.js +1 -0
  23. package/.next/server/app/(app)/settings/page.js +21 -0
  24. package/.next/server/app/(app)/settings/page.js.nft.json +1 -0
  25. package/.next/server/app/(app)/settings/page_client-reference-manifest.js +1 -0
  26. package/.next/server/app/(app)/setup/page.js +1 -0
  27. package/.next/server/app/(app)/setup/page.js.nft.json +1 -0
  28. package/.next/server/app/(app)/setup/page_client-reference-manifest.js +1 -0
  29. package/.next/server/app/_not-found/page.js +1 -0
  30. package/.next/server/app/_not-found/page.js.nft.json +1 -0
  31. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -0
  32. package/.next/server/app/_not-found.html +1 -0
  33. package/.next/server/app/_not-found.meta +6 -0
  34. package/.next/server/app/_not-found.rsc +9 -0
  35. package/.next/server/app/activity.html +1 -0
  36. package/.next/server/app/activity.meta +5 -0
  37. package/.next/server/app/activity.rsc +13 -0
  38. package/.next/server/app/api/activity/route.js +1 -0
  39. package/.next/server/app/api/activity/route.js.nft.json +1 -0
  40. package/.next/server/app/api/backlinks/route.js +1 -0
  41. package/.next/server/app/api/backlinks/route.js.nft.json +1 -0
  42. package/.next/server/app/api/context/route.js +1 -0
  43. package/.next/server/app/api/context/route.js.nft.json +1 -0
  44. package/.next/server/app/api/decisions/route.js +1 -0
  45. package/.next/server/app/api/decisions/route.js.nft.json +1 -0
  46. package/.next/server/app/api/docs/route.js +1 -0
  47. package/.next/server/app/api/docs/route.js.nft.json +1 -0
  48. package/.next/server/app/api/events/route.js +3 -0
  49. package/.next/server/app/api/events/route.js.nft.json +1 -0
  50. package/.next/server/app/api/mcp/route.js +103 -0
  51. package/.next/server/app/api/mcp/route.js.nft.json +1 -0
  52. package/.next/server/app/api/memory/route.js +1 -0
  53. package/.next/server/app/api/memory/route.js.nft.json +1 -0
  54. package/.next/server/app/api/projects/route.js +1 -0
  55. package/.next/server/app/api/projects/route.js.nft.json +1 -0
  56. package/.next/server/app/api/projects.body +1 -0
  57. package/.next/server/app/api/projects.meta +1 -0
  58. package/.next/server/app/api/settings/route.js +1 -0
  59. package/.next/server/app/api/settings/route.js.nft.json +1 -0
  60. package/.next/server/app/api/setup/generate/route.js +130 -0
  61. package/.next/server/app/api/setup/generate/route.js.nft.json +1 -0
  62. package/.next/server/app/api/setup/write/route.js +1 -0
  63. package/.next/server/app/api/setup/write/route.js.nft.json +1 -0
  64. package/.next/server/app/api/summary/route.js +1 -0
  65. package/.next/server/app/api/summary/route.js.nft.json +1 -0
  66. package/.next/server/app/api/tasks/route.js +1 -0
  67. package/.next/server/app/api/tasks/route.js.nft.json +1 -0
  68. package/.next/server/app/board.html +1 -0
  69. package/.next/server/app/board.meta +5 -0
  70. package/.next/server/app/board.rsc +13 -0
  71. package/.next/server/app/docs.html +1 -0
  72. package/.next/server/app/docs.meta +5 -0
  73. package/.next/server/app/docs.rsc +13 -0
  74. package/.next/server/app/index.html +1 -0
  75. package/.next/server/app/index.meta +6 -0
  76. package/.next/server/app/index.rsc +6 -0
  77. package/.next/server/app/memory.html +1 -0
  78. package/.next/server/app/memory.meta +5 -0
  79. package/.next/server/app/memory.rsc +13 -0
  80. package/.next/server/app/page.js +1 -0
  81. package/.next/server/app/page.js.nft.json +1 -0
  82. package/.next/server/app/page_client-reference-manifest.js +1 -0
  83. package/.next/server/app/settings.html +1 -0
  84. package/.next/server/app/settings.meta +5 -0
  85. package/.next/server/app/settings.rsc +13 -0
  86. package/.next/server/app/setup.html +1 -0
  87. package/.next/server/app/setup.meta +5 -0
  88. package/.next/server/app/setup.rsc +13 -0
  89. package/.next/server/app-paths-manifest.json +24 -0
  90. package/.next/server/chunks/191.js +91 -0
  91. package/.next/server/chunks/357.js +2 -0
  92. package/.next/server/chunks/486.js +12 -0
  93. package/.next/server/chunks/491.js +2 -0
  94. package/.next/server/chunks/778.js +9 -0
  95. package/.next/server/chunks/80.js +60 -0
  96. package/.next/server/chunks/900.js +6 -0
  97. package/.next/server/chunks/945.js +20 -0
  98. package/.next/server/chunks/font-manifest.json +1 -0
  99. package/.next/server/font-manifest.json +1 -0
  100. package/.next/server/functions-config-manifest.json +1 -0
  101. package/.next/server/interception-route-rewrite-manifest.js +1 -0
  102. package/.next/server/middleware-build-manifest.js +1 -0
  103. package/.next/server/middleware-manifest.json +6 -0
  104. package/.next/server/middleware-react-loadable-manifest.js +1 -0
  105. package/.next/server/next-font-manifest.js +1 -0
  106. package/.next/server/next-font-manifest.json +1 -0
  107. package/.next/server/pages/404.html +1 -0
  108. package/.next/server/pages/500.html +1 -0
  109. package/.next/server/pages/_app.js +1 -0
  110. package/.next/server/pages/_app.js.nft.json +1 -0
  111. package/.next/server/pages/_document.js +1 -0
  112. package/.next/server/pages/_document.js.nft.json +1 -0
  113. package/.next/server/pages/_error.js +1 -0
  114. package/.next/server/pages/_error.js.nft.json +1 -0
  115. package/.next/server/pages-manifest.json +1 -0
  116. package/.next/server/server-reference-manifest.js +1 -0
  117. package/.next/server/server-reference-manifest.json +1 -0
  118. package/.next/server/webpack-runtime.js +1 -0
  119. package/.next/static/chunks/1088.464d783cc5eea9de.js +1 -0
  120. package/.next/static/chunks/1222.e874d92bfc1bc6c7.js +1 -0
  121. package/.next/static/chunks/1347.3e7d2ed21b663e48.js +1 -0
  122. package/.next/static/chunks/1433.2f2e32dffc1c27c8.js +1 -0
  123. package/.next/static/chunks/1472.5e71f95e6296fd63.js +36 -0
  124. package/.next/static/chunks/1594.09677134642da9ff.js +93 -0
  125. package/.next/static/chunks/1638.2e37b49b302bcb6a.js +174 -0
  126. package/.next/static/chunks/2244.cf7a2544ebeb1e19.js +82 -0
  127. package/.next/static/chunks/228-e44243a26f6475e2.js +9 -0
  128. package/.next/static/chunks/2306.509ed7c364442601.js +2 -0
  129. package/.next/static/chunks/2412.949844de7f2bbdc3.js +262 -0
  130. package/.next/static/chunks/2565.eb3605e7c90e3c7e.js +131 -0
  131. package/.next/static/chunks/2591.56cbda5d4e6e2943.js +56 -0
  132. package/.next/static/chunks/2597.ba1681ae114a4aa7.js +29 -0
  133. package/.next/static/chunks/2647.011471b532619487.js +59 -0
  134. package/.next/static/chunks/2794.65caa79043b402f7.js +1 -0
  135. package/.next/static/chunks/2861.4fff66e909869a6d.js +148 -0
  136. package/.next/static/chunks/2894.5a2b6bbc2c48843d.js +43 -0
  137. package/.next/static/chunks/3795.50eafedfcd5f01d6.js +24 -0
  138. package/.next/static/chunks/3904.54baab606637ae6e.js +1 -0
  139. package/.next/static/chunks/4236.17567db90ef651b7.js +1 -0
  140. package/.next/static/chunks/4316-6345e1b4bb694a29.js +1 -0
  141. package/.next/static/chunks/490-ed8ba8bf24ab2f3d.js +1 -0
  142. package/.next/static/chunks/4982.9f5dde29b741d6dd.js +63 -0
  143. package/.next/static/chunks/5083.ffcecc2fefa6de50.js +55 -0
  144. package/.next/static/chunks/5218.35990037cf2fd97c.js +155 -0
  145. package/.next/static/chunks/5340.5ddd859da4765a69.js +1 -0
  146. package/.next/static/chunks/5453.47f6d134b08a854e.js +4 -0
  147. package/.next/static/chunks/5808.d42ab07c5de599fd.js +1 -0
  148. package/.next/static/chunks/6429.08e2027051a6966c.js +1 -0
  149. package/.next/static/chunks/6482.03215b09c8639bc2.js +7 -0
  150. package/.next/static/chunks/6842-aed3c9b445ee77d1.js +2 -0
  151. package/.next/static/chunks/6864.4be1f9d162073932.js +1 -0
  152. package/.next/static/chunks/6886.f44c1de05dae9abc.js +1 -0
  153. package/.next/static/chunks/68bc8b64.37fd49721fa7b320.js +136 -0
  154. package/.next/static/chunks/6bded0d7-aec80afe2d60204d.js +1 -0
  155. package/.next/static/chunks/7123.fdc5241f4c912578.js +62 -0
  156. package/.next/static/chunks/7235.d4cff43d3f970540.js +1 -0
  157. package/.next/static/chunks/7241.499111c9d51ab606.js +1 -0
  158. package/.next/static/chunks/7251.17e3ab4cd5935b2e.js +166 -0
  159. package/.next/static/chunks/7283.d294d5aebfe1c65f.js +215 -0
  160. package/.next/static/chunks/7292.0dfaab300ca1050a.js +1 -0
  161. package/.next/static/chunks/7527.0ccae900ac492b8c.js +1 -0
  162. package/.next/static/chunks/7697-812a5639d661760b.js +1 -0
  163. package/.next/static/chunks/7722.d7a4456b068af3c0.js +24 -0
  164. package/.next/static/chunks/7725-63beec2ffb219859.js +16 -0
  165. package/.next/static/chunks/8130.609cf9a280803973.js +1 -0
  166. package/.next/static/chunks/8338.2415ec79a5f31092.js +1 -0
  167. package/.next/static/chunks/845-0e3438196b5ef62c.js +1 -0
  168. package/.next/static/chunks/8836.71b3f39cb9a95d62.js +5 -0
  169. package/.next/static/chunks/942c9eea.2013b980eeaebb14.js +53 -0
  170. package/.next/static/chunks/94c12b52-436125ce5f9c910a.js +1 -0
  171. package/.next/static/chunks/9528.4d4672f83c5035ab.js +1 -0
  172. package/.next/static/chunks/9580.942737df82878943.js +1 -0
  173. package/.next/static/chunks/9672.cb194a5bbad5f696.js +1 -0
  174. package/.next/static/chunks/app/(app)/activity/page-91b9d738c33e19b5.js +1 -0
  175. package/.next/static/chunks/app/(app)/board/page-33f5e3998a8445ca.js +1 -0
  176. package/.next/static/chunks/app/(app)/docs/page-17670ed46c3594e6.js +1 -0
  177. package/.next/static/chunks/app/(app)/layout-34b4046ccf919d3f.js +1 -0
  178. package/.next/static/chunks/app/(app)/memory/page-b3aa8c5e028caf75.js +1 -0
  179. package/.next/static/chunks/app/(app)/settings/page-f264516b9005f933.js +16 -0
  180. package/.next/static/chunks/app/(app)/setup/page-9fd82b10016eca64.js +16 -0
  181. package/.next/static/chunks/app/_not-found/page-73e8eefca2388c5f.js +1 -0
  182. package/.next/static/chunks/app/layout-7054561bfe7eec9c.js +1 -0
  183. package/.next/static/chunks/app/page-f71834a10930be30.js +1 -0
  184. package/.next/static/chunks/b09b44eb.fa180e586fdf600b.js +1 -0
  185. package/.next/static/chunks/ea0025a9.12db9045daafb0c1.js +1 -0
  186. package/.next/static/chunks/efcceb14.8fc58c5c4428a08e.js +1 -0
  187. package/.next/static/chunks/framework-20afca218c33ed8b.js +33 -0
  188. package/.next/static/chunks/main-6224705d81e790a3.js +1 -0
  189. package/.next/static/chunks/main-app-02ed5dd91baaafdc.js +1 -0
  190. package/.next/static/chunks/pages/_app-db7a259df1c8778b.js +1 -0
  191. package/.next/static/chunks/pages/_error-76163253f7e717d4.js +1 -0
  192. package/.next/static/chunks/polyfills-78c92fac7aa8fdd8.js +1 -0
  193. package/.next/static/chunks/webpack-648d3cb0a281bce5.js +1 -0
  194. package/.next/static/css/615004f0fff77145.css +5 -0
  195. package/.next/static/r-2w-yCd6mM7TOOETgGaA/_buildManifest.js +1 -0
  196. package/.next/static/r-2w-yCd6mM7TOOETgGaA/_ssgManifest.js +1 -0
  197. package/README.md +160 -0
  198. package/bin/vibedoc.js +54 -0
  199. package/next.config.js +7 -0
  200. package/package.json +80 -0
  201. package/ws-server.js +12 -0
@@ -0,0 +1,5 @@
1
+ @import url("https://fonts.googleapis.com/css2?family=DM+Serif+Display:ital@0;1&family=DM+Mono:wght@300;400;500&family=DM+Sans:ital,opsz,wght@0,9..40,300;0,9..40,400;0,9..40,500;1,9..40,300&display=swap");*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }
2
+
3
+ /*
4
+ ! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com
5
+ */*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:var(--font-sans),system-ui,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:var(--font-mono),monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root{--sidebar-background:0 0% 98%;--sidebar-foreground:240 5.3% 26.1%;--sidebar-primary:240 5.9% 10%;--sidebar-primary-foreground:0 0% 98%;--sidebar-accent:240 4.8% 95.9%;--sidebar-accent-foreground:240 5.9% 10%;--sidebar-border:220 13% 91%;--sidebar-ring:217.2 91.2% 59.8%}.dark{--sidebar-background:240 5.9% 10%;--sidebar-foreground:240 4.8% 95.9%;--sidebar-primary:224.3 76.3% 48%;--sidebar-primary-foreground:0 0% 100%;--sidebar-accent:240 3.7% 15.9%;--sidebar-accent-foreground:240 4.8% 95.9%;--sidebar-border:240 3.7% 15.9%;--sidebar-ring:217.2 91.2% 59.8%}.\!container{width:100%!important}.container{width:100%}@media (min-width:640px){.\!container{max-width:640px!important}.container{max-width:640px}}@media (min-width:768px){.\!container{max-width:768px!important}.container{max-width:768px}}@media (min-width:1024px){.\!container{max-width:1024px!important}.container{max-width:1024px}}@media (min-width:1280px){.\!container{max-width:1280px!important}.container{max-width:1280px}}@media (min-width:1536px){.\!container{max-width:1536px!important}.container{max-width:1536px}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.inset-x-0{left:0;right:0}.inset-y-0{top:0;bottom:0}.bottom-0{bottom:0}.bottom-8{bottom:2rem}.left-0{left:0}.left-0\.5{left:.125rem}.left-1{left:.25rem}.left-1\/2{left:50%}.left-2{left:.5rem}.left-4{left:1rem}.left-6{left:1.5rem}.left-\[50\%\]{left:50%}.right-0{right:0}.right-1{right:.25rem}.right-3{right:.75rem}.right-4{right:1rem}.top-0{top:0}.top-0\.5{top:.125rem}.top-1{top:.25rem}.top-1\.5{top:.375rem}.top-1\/2{top:50%}.top-20{top:5rem}.top-3\.5{top:.875rem}.top-4{top:1rem}.top-\[50\%\]{top:50%}.z-10{z-index:10}.z-20{z-index:20}.z-40{z-index:40}.z-50{z-index:50}.-mx-1{margin-left:-.25rem;margin-right:-.25rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-3\.5{margin-left:.875rem;margin-right:.875rem}.mx-auto{margin-left:auto;margin-right:auto}.my-1{margin-top:.25rem;margin-bottom:.25rem}.-ml-1{margin-left:-.25rem}.mb-0\.5{margin-bottom:.125rem}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.ml-3{margin-left:.75rem}.ml-auto{margin-left:auto}.mr-2{margin-right:.5rem}.mr-3{margin-right:.75rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-4{margin-top:1rem}.block{display:block}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.aspect-square{aspect-ratio:1/1}.size-4{width:1rem;height:1rem}.h-1{height:.25rem}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-12{height:3rem}.h-16{height:4rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-32{height:8rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\[1px\]{height:1px}.h-full{height:100%}.h-px{height:1px}.h-svh{height:100svh}.max-h-64{max-height:16rem}.max-h-72{max-height:18rem}.max-h-\[420px\]{max-height:420px}.max-h-\[50vh\]{max-height:50vh}.max-h-\[70vh\]{max-height:70vh}.max-h-\[calc\(50vh-44px\)\]{max-height:calc(50vh - 44px)}.max-h-\[calc\(70vh-44px\)\]{max-height:calc(70vh - 44px)}.max-h-\[var\(--radix-dropdown-menu-content-available-height\)\]{max-height:var(--radix-dropdown-menu-content-available-height)}.min-h-0{min-height:0}.min-h-\[60px\]{min-height:60px}.min-h-screen{min-height:100vh}.min-h-svh{min-height:100svh}.w-1{width:.25rem}.w-1\.5{width:.375rem}.w-10{width:2.5rem}.w-11{width:2.75rem}.w-12{width:3rem}.w-16{width:4rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-3\/4{width:75%}.w-32{width:8rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-72{width:18rem}.w-8{width:2rem}.w-80{width:20rem}.w-9{width:2.25rem}.w-\[--sidebar-width\]{width:var(--sidebar-width)}.w-\[1px\]{width:1px}.w-\[420px\]{width:420px}.w-auto{width:auto}.w-full{width:100%}.w-px{width:1px}.min-w-0{min-width:0}.min-w-5{min-width:1.25rem}.min-w-\[8rem\]{min-width:8rem}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-\[--skeleton-width\]{max-width:var(--skeleton-width)}.max-w-\[200px\]{max-width:200px}.max-w-\[40\%\]{max-width:40%}.max-w-\[60px\]{max-width:60px}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.origin-\[--radix-dropdown-menu-content-transform-origin\]{transform-origin:var(--radix-dropdown-menu-content-transform-origin)}.origin-\[--radix-tooltip-content-transform-origin\]{transform-origin:var(--radix-tooltip-content-transform-origin)}.origin-bottom-right{transform-origin:bottom right}.origin-top-right{transform-origin:top right}.-translate-x-1\/2{--tw-translate-x:-50%}.-translate-x-1\/2,.-translate-x-px{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-x-px{--tw-translate-x:-1px}.-translate-y-1\/2{--tw-translate-y:-50%}.-translate-y-1\/2,.translate-x-\[-50\%\]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-\[-50\%\]{--tw-translate-x:-50%}.translate-x-px{--tw-translate-x:1px}.translate-x-px,.translate-y-\[-50\%\]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-\[-50\%\]{--tw-translate-y:-50%}.scale-110{--tw-scale-x:1.1;--tw-scale-y:1.1}.scale-110,.scale-95{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-95{--tw-scale-x:.95;--tw-scale-y:.95}@keyframes fadeIn{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.animate-fade-in{animation:fadeIn .3s ease}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes pulseDot{0%,to{opacity:.4;transform:scale(.8)}50%{opacity:1;transform:scale(1.1)}}.animate-pulse-dot{animation:pulseDot 2s ease-in-out infinite}@keyframes spin{to{transform:rotate(1turn)}}.animate-spin{animation:spin 1s linear infinite}.cursor-default{cursor:default}.cursor-grabbing{cursor:grabbing}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize-none{resize:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0{gap:0}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem * var(--tw-space-y-reverse))}.divide-x>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(1px * var(--tw-divide-x-reverse));border-left-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-border>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(34 34 46/var(--tw-divide-opacity,1))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.truncate{overflow:hidden;text-overflow:ellipsis}.truncate,.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-\[inherit\]{border-radius:inherit}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-sm{border-radius:.125rem}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-0{border-width:0}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-accent{--tw-border-opacity:1;border-color:rgb(124 106 247/var(--tw-border-opacity,1))}.border-accent\/20{border-color:rgba(124,106,247,.2)}.border-accent\/30{border-color:rgba(124,106,247,.3)}.border-amber\/30{border-color:hsla(24,90%,69%,.3)}.border-amber\/40{border-color:hsla(24,90%,69%,.4)}.border-border{--tw-border-opacity:1;border-color:rgb(34 34 46/var(--tw-border-opacity,1))}.border-border\/50{border-color:rgba(34,34,46,.5)}.border-border2{--tw-border-opacity:1;border-color:rgb(45 45 61/var(--tw-border-opacity,1))}.border-danger\/30{border-color:hsla(0,90%,69%,.3)}.border-danger\/40{border-color:hsla(0,90%,69%,.4)}.border-sidebar-border{border-color:hsl(var(--sidebar-border))}.border-slate-200{--tw-border-opacity:1;border-color:rgb(226 232 240/var(--tw-border-opacity,1))}.border-teal\/30{border-color:rgba(79,216,180,.3)}.border-teal\/40{border-color:rgba(79,216,180,.4)}.border-transparent{border-color:transparent}.border-l-transparent{border-left-color:transparent}.border-t-accent{--tw-border-opacity:1;border-top-color:rgb(124 106 247/var(--tw-border-opacity,1))}.border-t-transparent{border-top-color:transparent}.bg-\[\#282c34\]{--tw-bg-opacity:1;background-color:rgb(40 44 52/var(--tw-bg-opacity,1))}.bg-accent{--tw-bg-opacity:1;background-color:rgb(124 106 247/var(--tw-bg-opacity,1))}.bg-accent\/10{background-color:rgba(124,106,247,.1)}.bg-accent\/20{background-color:rgba(124,106,247,.2)}.bg-accent\/5{background-color:rgba(124,106,247,.05)}.bg-amber\/5{background-color:hsla(24,90%,69%,.05)}.bg-bg{--tw-bg-opacity:1;background-color:rgb(10 10 15/var(--tw-bg-opacity,1))}.bg-black\/60{background-color:rgba(0,0,0,.6)}.bg-black\/80{background-color:rgba(0,0,0,.8)}.bg-blue-500{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity,1))}.bg-border{--tw-bg-opacity:1;background-color:rgb(34 34 46/var(--tw-bg-opacity,1))}.bg-border2{--tw-bg-opacity:1;background-color:rgb(45 45 61/var(--tw-bg-opacity,1))}.bg-danger\/5{background-color:hsla(0,90%,69%,.05)}.bg-green-500{--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity,1))}.bg-green-500\/10{background-color:rgba(34,197,94,.1)}.bg-green-500\/20{background-color:rgba(34,197,94,.2)}.bg-muted\/20{background-color:hsla(240,9%,46%,.2)}.bg-orange-500{--tw-bg-opacity:1;background-color:rgb(249 115 22/var(--tw-bg-opacity,1))}.bg-purple-500{--tw-bg-opacity:1;background-color:rgb(168 85 247/var(--tw-bg-opacity,1))}.bg-red-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity,1))}.bg-sidebar{background-color:hsl(var(--sidebar-background))}.bg-sidebar-border{background-color:hsl(var(--sidebar-border))}.bg-slate-100{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity,1))}.bg-slate-200{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity,1))}.bg-slate-900{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity,1))}.bg-surface{--tw-bg-opacity:1;background-color:rgb(17 17 24/var(--tw-bg-opacity,1))}.bg-surface\/80{background-color:rgba(17,17,24,.8)}.bg-surface\/95{background-color:rgba(17,17,24,.95)}.bg-surface2{--tw-bg-opacity:1;background-color:rgb(22 22 31/var(--tw-bg-opacity,1))}.bg-teal{--tw-bg-opacity:1;background-color:rgb(79 216 180/var(--tw-bg-opacity,1))}.bg-teal\/5{background-color:rgba(79,216,180,.05)}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.from-accent{--tw-gradient-from:#7c6af7 var(--tw-gradient-from-position);--tw-gradient-to:rgba(124,106,247,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.to-teal{--tw-gradient-to:#4fd8b4 var(--tw-gradient-to-position)}.fill-current{fill:currentColor}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-\[1px\]{padding:1px}.px-0{padding-left:0;padding-right:0}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0{padding-top:0;padding-bottom:0}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pl-5{padding-left:1.25rem}.pl-7{padding-left:1.75rem}.pl-8{padding-left:2rem}.pr-1{padding-right:.25rem}.pr-2{padding-right:.5rem}.pr-4{padding-right:1rem}.pt-1{padding-top:.25rem}.text-left{text-align:left}.text-center{text-align:center}.font-display{font-family:var(--font-display),serif}.font-mono{font-family:var(--font-mono),monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-\[9px\]{font-size:9px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.tracking-tight{letter-spacing:-.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.text-accent{--tw-text-opacity:1;color:rgb(124 106 247/var(--tw-text-opacity,1))}.text-accent\/70{color:rgba(124,106,247,.7)}.text-accent\/80{color:rgba(124,106,247,.8)}.text-amber{--tw-text-opacity:1;color:rgb(247 162 106/var(--tw-text-opacity,1))}.text-danger{--tw-text-opacity:1;color:rgb(247 106 106/var(--tw-text-opacity,1))}.text-green-400{--tw-text-opacity:1;color:rgb(74 222 128/var(--tw-text-opacity,1))}.text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity,1))}.text-muted{--tw-text-opacity:1;color:rgb(107 107 128/var(--tw-text-opacity,1))}.text-muted\/30{color:hsla(240,9%,46%,.3)}.text-muted\/50{color:hsla(240,9%,46%,.5)}.text-muted\/60{color:hsla(240,9%,46%,.6)}.text-muted\/70{color:hsla(240,9%,46%,.7)}.text-red-400{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.text-sidebar-foreground{color:hsl(var(--sidebar-foreground))}.text-sidebar-foreground\/70{color:hsl(var(--sidebar-foreground)/.7)}.text-slate-50{--tw-text-opacity:1;color:rgb(248 250 252/var(--tw-text-opacity,1))}.text-slate-500{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity,1))}.text-slate-900{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity,1))}.text-slate-950{--tw-text-opacity:1;color:rgb(2 6 23/var(--tw-text-opacity,1))}.text-teal{--tw-text-opacity:1;color:rgb(79 216 180/var(--tw-text-opacity,1))}.text-txt{--tw-text-opacity:1;color:rgb(232 232 240/var(--tw-text-opacity,1))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.text-yellow-400{--tw-text-opacity:1;color:rgb(250 204 21/var(--tw-text-opacity,1))}.line-through{text-decoration-line:line-through}.underline-offset-4{text-underline-offset:4px}.opacity-0{opacity:0}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,.25);--tw-shadow-colored:0 25px 50px -12px var(--tw-shadow-color)}.shadow-2xl,.shadow-\[0_0_0_1px_hsl\(var\(--sidebar-border\)\)\]{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_0_1px_hsl\(var\(--sidebar-border\)\)\]{--tw-shadow:0 0 0 1px hsl(var(--sidebar-border));--tw-shadow-colored:0 0 0 1px var(--tw-shadow-color)}.shadow-\[0_0_6px_\#4fd8b4\]{--tw-shadow:0 0 6px #4fd8b4;--tw-shadow-colored:0 0 6px var(--tw-shadow-color)}.shadow-\[0_0_6px_\#4fd8b4\],.shadow-lg{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.shadow-md,.shadow-none{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-none{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000}.shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.shadow-sm,.shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-1,.ring-2{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-accent\/50{--tw-ring-color:rgba(124,106,247,.5)}.ring-sidebar-ring{--tw-ring-color:hsl(var(--sidebar-ring))}.ring-white{--tw-ring-opacity:1;--tw-ring-color:rgb(255 255 255/var(--tw-ring-opacity,1))}.ring-offset-2{--tw-ring-offset-width:2px}.ring-offset-bg{--tw-ring-offset-color:#0a0a0f}.ring-offset-white{--tw-ring-offset-color:#fff}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-sm{--tw-backdrop-blur:blur(4px);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[left\2c right\2c width\]{transition-property:left,right,width;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[margin\2c opacity\]{transition-property:margin,opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[width\2c height\2c padding\]{transition-property:width,height,padding;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[width\]{transition-property:width;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-500{transition-duration:.5s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-linear{transition-timing-function:linear}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}:root{--font-sans:"DM Sans";--font-mono:"DM Mono";--font-display:"DM Serif Display"}*{box-sizing:border-box}body{background:#0a0a0f;color:#e8e8f0;font-family:DM Sans,system-ui,sans-serif;-webkit-font-smoothing:antialiased}::-webkit-scrollbar{width:4px;height:4px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:#2d2d3d;border-radius:2px}::-webkit-scrollbar-thumb:hover{background:#44445a}.prose-dark h1{font-family:"DM Serif Display",serif;font-size:1.6rem;color:#e8e8f0;margin-bottom:1rem}.prose-dark h2{font-size:1.1rem;font-weight:600;color:#9490c8;margin:1.5rem 0 .5rem;border-bottom:1px solid #22222e;padding-bottom:.25rem}.prose-dark h3{font-size:.95rem;font-weight:600;color:#7c6af7;margin:1rem 0 .4rem}.prose-dark p{font-size:.9rem;color:#b0b0c8;line-height:1.7;margin-bottom:.75rem}.prose-dark ol,.prose-dark ul{padding-left:1.25rem;margin-bottom:.75rem}.prose-dark li{font-size:.875rem;color:#b0b0c8;line-height:1.7;margin-bottom:.2rem}.prose-dark code{font-family:DM Mono,monospace;font-size:.8rem;background:#16161f;border:1px solid #22222e;padding:1px 5px;border-radius:4px;color:#4fd8b4}.prose-dark pre{background:#0d0d14;border:1px solid #22222e;border-radius:8px;padding:1rem;overflow-x:auto;margin-bottom:1rem}.prose-dark pre code{background:none;border:none;padding:0;color:#c8c8e8;font-size:.8rem}.prose-dark table{width:100%;border-collapse:collapse;margin-bottom:1rem;font-size:.8rem}.prose-dark th{text-align:left;padding:6px 10px;border-bottom:1px solid #2d2d3d;color:#6b6b80;font-weight:500;font-family:DM Mono,monospace;text-transform:uppercase;font-size:10px;letter-spacing:.06em}.prose-dark td{padding:6px 10px;border-bottom:1px solid #16161f;color:#b0b0c8}.prose-dark blockquote{border-left:2px solid #7c6af7;padding-left:1rem;margin:1rem 0;color:#6b6b80;font-style:italic}.prose-dark a{color:#7c6af7;text-decoration:none}.prose-dark a:hover{text-decoration:underline}.prose-dark strong{color:#e8e8f0;font-weight:600}.prose-dark hr{border:none;border-top:1px solid #22222e;margin:1.5rem 0}@keyframes collapsible-down{0%{height:0;opacity:0}to{height:var(--radix-collapsible-content-height);opacity:1}}@keyframes collapsible-up{0%{height:var(--radix-collapsible-content-height);opacity:1}to{height:0;opacity:0}}.animate-collapsible-down{animation:collapsible-down .18s ease-out}.animate-collapsible-up{animation:collapsible-up .15s ease-in}.mermaid{margin:1rem 0;text-align:center}.mermaid svg{max-width:100%;height:auto;border-radius:8px}.file\:border-0::file-selector-button{border-width:0}.file\:bg-transparent::file-selector-button{background-color:transparent}.file\:text-sm::file-selector-button{font-size:.875rem;line-height:1.25rem}.file\:font-medium::file-selector-button{font-weight:500}.file\:text-slate-950::file-selector-button{--tw-text-opacity:1;color:rgb(2 6 23/var(--tw-text-opacity,1))}.placeholder\:text-muted::-moz-placeholder{--tw-text-opacity:1;color:rgb(107 107 128/var(--tw-text-opacity,1))}.placeholder\:text-muted::placeholder{--tw-text-opacity:1;color:rgb(107 107 128/var(--tw-text-opacity,1))}.placeholder\:text-slate-500::-moz-placeholder{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity,1))}.placeholder\:text-slate-500::placeholder{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity,1))}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:-inset-2:after{content:var(--tw-content);inset:-.5rem}.after\:inset-y-0:after{content:var(--tw-content);top:0;bottom:0}.after\:left-1\/2:after{content:var(--tw-content);left:50%}.after\:w-\[2px\]:after{content:var(--tw-content);width:2px}.first\:border-0:first-child{border-width:0}.hover\:scale-105:hover{--tw-scale-x:1.05;--tw-scale-y:1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:border-accent\/30:hover{border-color:rgba(124,106,247,.3)}.hover\:border-accent\/50:hover{border-color:rgba(124,106,247,.5)}.hover\:border-border2:hover{--tw-border-opacity:1;border-color:rgb(45 45 61/var(--tw-border-opacity,1))}.hover\:bg-accent\/10:hover{background-color:rgba(124,106,247,.1)}.hover\:bg-accent\/30:hover{background-color:rgba(124,106,247,.3)}.hover\:bg-accent\/5:hover{background-color:rgba(124,106,247,.05)}.hover\:bg-accent\/90:hover{background-color:rgba(124,106,247,.9)}.hover\:bg-red-500\/10:hover{background-color:rgba(239,68,68,.1)}.hover\:bg-red-500\/80:hover{background-color:rgba(239,68,68,.8)}.hover\:bg-red-500\/90:hover{background-color:rgba(239,68,68,.9)}.hover\:bg-sidebar-accent:hover{background-color:hsl(var(--sidebar-accent))}.hover\:bg-slate-100:hover{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity,1))}.hover\:bg-slate-100\/80:hover{background-color:rgba(241,245,249,.8)}.hover\:bg-slate-900\/80:hover{background-color:rgba(15,23,42,.8)}.hover\:bg-slate-900\/90:hover{background-color:rgba(15,23,42,.9)}.hover\:bg-surface2:hover{--tw-bg-opacity:1;background-color:rgb(22 22 31/var(--tw-bg-opacity,1))}.hover\:bg-surface2\/80:hover{background-color:rgba(22,22,31,.8)}.hover\:text-accent:hover{--tw-text-opacity:1;color:rgb(124 106 247/var(--tw-text-opacity,1))}.hover\:text-accent\/80:hover{color:rgba(124,106,247,.8)}.hover\:text-muted:hover{--tw-text-opacity:1;color:rgb(107 107 128/var(--tw-text-opacity,1))}.hover\:text-red-400:hover{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.hover\:text-sidebar-accent-foreground:hover{color:hsl(var(--sidebar-accent-foreground))}.hover\:text-slate-900:hover{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity,1))}.hover\:text-txt:hover{--tw-text-opacity:1;color:rgb(232 232 240/var(--tw-text-opacity,1))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.hover\:shadow-\[0_0_0_1px_hsl\(var\(--sidebar-accent\)\)\]:hover{--tw-shadow:0 0 0 1px hsl(var(--sidebar-accent));--tw-shadow-colored:0 0 0 1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.hover\:after\:bg-sidebar-border:hover:after{content:var(--tw-content);background-color:hsl(var(--sidebar-border))}.focus\:border-border:focus{--tw-border-opacity:1;border-color:rgb(34 34 46/var(--tw-border-opacity,1))}.focus\:bg-slate-100:focus{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity,1))}.focus\:bg-surface2:focus{--tw-bg-opacity:1;background-color:rgb(22 22 31/var(--tw-bg-opacity,1))}.focus\:text-red-400:focus{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.focus\:text-slate-900:focus{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity,1))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-accent\/50:focus{--tw-ring-color:rgba(124,106,247,.5)}.focus\:ring-slate-950:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(2 6 23/var(--tw-ring-opacity,1))}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-0:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-visible\:ring-sidebar-ring:focus-visible{--tw-ring-color:hsl(var(--sidebar-ring))}.focus-visible\:ring-slate-950:focus-visible{--tw-ring-opacity:1;--tw-ring-color:rgb(2 6 23/var(--tw-ring-opacity,1))}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px}.active\:bg-sidebar-accent:active{background-color:hsl(var(--sidebar-accent))}.active\:text-sidebar-accent-foreground:active{color:hsl(var(--sidebar-accent-foreground))}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.group\/menu-item:focus-within .group-focus-within\/menu-item\:opacity-100{opacity:1}.group:hover .group-hover\:pointer-events-auto{pointer-events:auto}.group:hover .group-hover\:scale-100{--tw-scale-x:1;--tw-scale-y:1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group\/menu-item:hover .group-hover\/menu-item\:opacity-100{opacity:1}.group:hover .group-hover\:opacity-0{opacity:0}.group:hover .group-hover\:opacity-100{opacity:1}.peer\/menu-button:hover~.peer-hover\/menu-button\:text-sidebar-accent-foreground{color:hsl(var(--sidebar-accent-foreground))}.has-\[\[data-variant\=inset\]\]\:bg-sidebar:has([data-variant=inset]){background-color:hsl(var(--sidebar-background))}.group\/menu-item:has([data-sidebar=menu-action]) .group-has-\[\[data-sidebar\=menu-action\]\]\/menu-item\:pr-8{padding-right:2rem}.aria-disabled\:pointer-events-none[aria-disabled=true]{pointer-events:none}.aria-disabled\:opacity-50[aria-disabled=true]{opacity:.5}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[active\=true\]\:bg-sidebar-accent[data-active=true]{background-color:hsl(var(--sidebar-accent))}.data-\[state\=active\]\:bg-white[data-state=active]{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.data-\[state\=open\]\:bg-slate-100[data-state=open]{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity,1))}.data-\[active\=true\]\:font-medium[data-active=true]{font-weight:500}.data-\[active\=true\]\:text-sidebar-accent-foreground[data-active=true]{color:hsl(var(--sidebar-accent-foreground))}.data-\[state\=active\]\:text-slate-950[data-state=active]{--tw-text-opacity:1;color:rgb(2 6 23/var(--tw-text-opacity,1))}.data-\[state\=open\]\:text-slate-500[data-state=open]{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity,1))}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[state\=open\]\:opacity-100[data-state=open]{opacity:1}.data-\[state\=active\]\:shadow-sm[data-state=active]{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.data-\[state\=closed\]\:duration-300[data-state=closed]{transition-duration:.3s}.data-\[state\=open\]\:duration-500[data-state=open]{transition-duration:.5s}.data-\[state\=open\]\:hover\:bg-sidebar-accent:hover[data-state=open]{background-color:hsl(var(--sidebar-accent))}.data-\[state\=open\]\:hover\:text-sidebar-accent-foreground:hover[data-state=open]{color:hsl(var(--sidebar-accent-foreground))}.group[data-collapsible=offcanvas] .group-data-\[collapsible\=offcanvas\]\:left-\[calc\(var\(--sidebar-width\)\*-1\)\]{left:calc(var(--sidebar-width) * -1)}.group[data-collapsible=offcanvas] .group-data-\[collapsible\=offcanvas\]\:right-\[calc\(var\(--sidebar-width\)\*-1\)\]{right:calc(var(--sidebar-width) * -1)}.group[data-side=left] .group-data-\[side\=left\]\:-right-4{right:-1rem}.group[data-side=right] .group-data-\[side\=right\]\:left-0{left:0}.group[data-collapsible=icon] .group-data-\[collapsible\=icon\]\:-mt-8{margin-top:-2rem}.group\/folder[data-state=open] .group-data-\[state\=open\]\/folder\:block{display:block}.group[data-collapsible=icon] .group-data-\[collapsible\=icon\]\:hidden,.group\/folder[data-state=open] .group-data-\[state\=open\]\/folder\:hidden{display:none}.group[data-collapsible=icon] .group-data-\[collapsible\=icon\]\:\!size-8{width:2rem!important;height:2rem!important}.group[data-collapsible=icon] .group-data-\[collapsible\=icon\]\:w-\[--sidebar-width-icon\]{width:var(--sidebar-width-icon)}.group[data-collapsible=icon] .group-data-\[collapsible\=icon\]\:w-\[calc\(var\(--sidebar-width-icon\)_\+_theme\(spacing\.4\)\)\]{width:calc(var(--sidebar-width-icon) + 1rem)}.group[data-collapsible=icon] .group-data-\[collapsible\=icon\]\:w-\[calc\(var\(--sidebar-width-icon\)_\+_theme\(spacing\.4\)_\+2px\)\]{width:calc(var(--sidebar-width-icon) + 1rem + 2px)}.group[data-collapsible=offcanvas] .group-data-\[collapsible\=offcanvas\]\:w-0{width:0}.group[data-collapsible=offcanvas] .group-data-\[collapsible\=offcanvas\]\:translate-x-0{--tw-translate-x:0px}.group[data-collapsible=offcanvas] .group-data-\[collapsible\=offcanvas\]\:translate-x-0,.group[data-side=right] .group-data-\[side\=right\]\:rotate-180{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group[data-side=right] .group-data-\[side\=right\]\:rotate-180{--tw-rotate:180deg}.group\/folder[data-state=open] .group-data-\[state\=open\]\/folder\:rotate-90{--tw-rotate:90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group[data-collapsible=icon] .group-data-\[collapsible\=icon\]\:overflow-hidden{overflow:hidden}.group[data-variant=floating] .group-data-\[variant\=floating\]\:rounded-lg{border-radius:.5rem}.group[data-variant=floating] .group-data-\[variant\=floating\]\:border{border-width:1px}.group[data-side=left] .group-data-\[side\=left\]\:border-r{border-right-width:1px}.group[data-side=right] .group-data-\[side\=right\]\:border-l{border-left-width:1px}.group[data-variant=floating] .group-data-\[variant\=floating\]\:border-sidebar-border{border-color:hsl(var(--sidebar-border))}.group[data-collapsible=icon] .group-data-\[collapsible\=icon\]\:\!p-0{padding:0!important}.group[data-collapsible=icon] .group-data-\[collapsible\=icon\]\:\!p-2{padding:.5rem!important}.group[data-collapsible=icon] .group-data-\[collapsible\=icon\]\:opacity-0{opacity:0}.group[data-variant=floating] .group-data-\[variant\=floating\]\:shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group[data-collapsible=offcanvas] .group-data-\[collapsible\=offcanvas\]\:after\:left-full:after{content:var(--tw-content);left:100%}.group[data-collapsible=offcanvas] .group-data-\[collapsible\=offcanvas\]\:hover\:bg-sidebar:hover{background-color:hsl(var(--sidebar-background))}.peer\/menu-button[data-size=default]~.peer-data-\[size\=default\]\/menu-button\:top-1\.5{top:.375rem}.peer\/menu-button[data-size=lg]~.peer-data-\[size\=lg\]\/menu-button\:top-2\.5{top:.625rem}.peer\/menu-button[data-size=sm]~.peer-data-\[size\=sm\]\/menu-button\:top-1{top:.25rem}.peer\/menu-button[data-active=true]~.peer-data-\[active\=true\]\/menu-button\:text-sidebar-accent-foreground{color:hsl(var(--sidebar-accent-foreground))}.dark\:border-slate-800:is(.dark *){--tw-border-opacity:1;border-color:rgb(30 41 59/var(--tw-border-opacity,1))}.dark\:bg-red-900:is(.dark *){--tw-bg-opacity:1;background-color:rgb(127 29 29/var(--tw-bg-opacity,1))}.dark\:bg-slate-50:is(.dark *){--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity,1))}.dark\:bg-slate-800:is(.dark *){--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity,1))}.dark\:bg-slate-950:is(.dark *){--tw-bg-opacity:1;background-color:rgb(2 6 23/var(--tw-bg-opacity,1))}.dark\:text-slate-400:is(.dark *){--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity,1))}.dark\:text-slate-50:is(.dark *){--tw-text-opacity:1;color:rgb(248 250 252/var(--tw-text-opacity,1))}.dark\:text-slate-900:is(.dark *){--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity,1))}.dark\:ring-offset-slate-950:is(.dark *){--tw-ring-offset-color:#020617}.dark\:file\:text-slate-50:is(.dark *)::file-selector-button{--tw-text-opacity:1;color:rgb(248 250 252/var(--tw-text-opacity,1))}.dark\:placeholder\:text-slate-400:is(.dark *)::-moz-placeholder{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity,1))}.dark\:placeholder\:text-slate-400:is(.dark *)::placeholder{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity,1))}.dark\:hover\:bg-red-900\/80:hover:is(.dark *){background-color:rgba(127,29,29,.8)}.dark\:hover\:bg-red-900\/90:hover:is(.dark *){background-color:rgba(127,29,29,.9)}.dark\:hover\:bg-slate-50\/80:hover:is(.dark *){background-color:rgba(248,250,252,.8)}.dark\:hover\:bg-slate-50\/90:hover:is(.dark *){background-color:rgba(248,250,252,.9)}.dark\:hover\:bg-slate-800:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity,1))}.dark\:hover\:bg-slate-800\/80:hover:is(.dark *){background-color:rgba(30,41,59,.8)}.dark\:hover\:text-slate-50:hover:is(.dark *){--tw-text-opacity:1;color:rgb(248 250 252/var(--tw-text-opacity,1))}.dark\:focus\:bg-slate-800:focus:is(.dark *){--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity,1))}.dark\:focus\:text-slate-50:focus:is(.dark *){--tw-text-opacity:1;color:rgb(248 250 252/var(--tw-text-opacity,1))}.dark\:focus\:ring-slate-300:focus:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgb(203 213 225/var(--tw-ring-opacity,1))}.dark\:focus-visible\:ring-slate-300:focus-visible:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgb(203 213 225/var(--tw-ring-opacity,1))}.dark\:data-\[state\=active\]\:bg-slate-950[data-state=active]:is(.dark *){--tw-bg-opacity:1;background-color:rgb(2 6 23/var(--tw-bg-opacity,1))}.dark\:data-\[state\=open\]\:bg-slate-800[data-state=open]:is(.dark *){--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity,1))}.dark\:data-\[state\=active\]\:text-slate-50[data-state=active]:is(.dark *){--tw-text-opacity:1;color:rgb(248 250 252/var(--tw-text-opacity,1))}.dark\:data-\[state\=open\]\:text-slate-400[data-state=open]:is(.dark *){--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity,1))}@media (min-width:640px){.sm\:flex{display:flex}.sm\:max-w-sm{max-width:24rem}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:justify-end{justify-content:flex-end}.sm\:space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.sm\:rounded-lg{border-radius:.5rem}.sm\:text-left{text-align:left}}@media (min-width:768px){.md\:block{display:block}.md\:flex{display:flex}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:text-sm{font-size:.875rem;line-height:1.25rem}.md\:opacity-0{opacity:0}.after\:md\:hidden:after{content:var(--tw-content);display:none}.peer[data-variant=inset]~.md\:peer-data-\[variant\=inset\]\:m-2{margin:.5rem}.peer[data-state=collapsed][data-variant=inset]~.md\:peer-data-\[state\=collapsed\]\:peer-data-\[variant\=inset\]\:ml-2{margin-left:.5rem}.peer[data-variant=inset]~.md\:peer-data-\[variant\=inset\]\:ml-0{margin-left:0}.peer[data-variant=inset]~.md\:peer-data-\[variant\=inset\]\:rounded-xl{border-radius:.75rem}.peer[data-variant=inset]~.md\:peer-data-\[variant\=inset\]\:shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}}@media (min-width:1280px){.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}.\[\&\>button\]\:hidden>button{display:none}.\[\&\>span\:last-child\]\:truncate>span:last-child{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.\[\&\>svg\]\:size-4>svg{width:1rem;height:1rem}.\[\&\>svg\]\:shrink-0>svg{flex-shrink:0}.\[\&\>svg\]\:text-sidebar-accent-foreground>svg{color:hsl(var(--sidebar-accent-foreground))}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-4 svg{width:1rem;height:1rem}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}[data-side=left][data-collapsible=offcanvas] .\[\[data-side\=left\]\[data-collapsible\=offcanvas\]_\&\]\:-right-2{right:-.5rem}[data-side=left][data-state=collapsed] .\[\[data-side\=left\]\[data-state\=collapsed\]_\&\]\:cursor-e-resize{cursor:e-resize}[data-side=left] .\[\[data-side\=left\]_\&\]\:cursor-w-resize{cursor:w-resize}[data-side=right][data-collapsible=offcanvas] .\[\[data-side\=right\]\[data-collapsible\=offcanvas\]_\&\]\:-left-2{left:-.5rem}[data-side=right][data-state=collapsed] .\[\[data-side\=right\]\[data-state\=collapsed\]_\&\]\:cursor-w-resize{cursor:w-resize}[data-side=right] .\[\[data-side\=right\]_\&\]\:cursor-e-resize{cursor:e-resize}
@@ -0,0 +1 @@
1
+ self.__BUILD_MANIFEST={__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},"/_error":["static/chunks/pages/_error-76163253f7e717d4.js"],sortedPages:["/_app","/_error"]},self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();
@@ -0,0 +1 @@
1
+ self.__SSG_MANIFEST=new Set([]);self.__SSG_MANIFEST_CB&&self.__SSG_MANIFEST_CB()
package/README.md ADDED
@@ -0,0 +1,160 @@
1
+ # VibeDoc
2
+
3
+ **Local-first project intelligence for AI-assisted development.**
4
+
5
+ A Next.js app that is both your kanban board and your AI agent's MCP server.
6
+ When your AI moves a task, you see it in the browser — live.
7
+
8
+ ```
9
+ http://localhost:3000 ← your browser (kanban, docs, activity, memory)
10
+ http://localhost:3000/api/mcp ← AI agent connects here via MCP
11
+ ```
12
+
13
+ ---
14
+
15
+ ## Quick start
16
+
17
+ ```bash
18
+ # 1. Clone / copy this folder next to your project
19
+ cd vibedoc-app
20
+ npm install
21
+
22
+ # 2. Point at your project
23
+ cp .env.example .env.local
24
+ # Edit VIBEDOC_ROOT to your project path
25
+
26
+ # 3. Start
27
+ npm run dev
28
+ # → http://localhost:3000
29
+ ```
30
+
31
+ ---
32
+
33
+ ## Connect your AI agent
34
+
35
+ ### Claude Code (`~/.claude/claude_desktop_config.json`)
36
+ ```json
37
+ {
38
+ "mcpServers": {
39
+ "vibedoc": {
40
+ "url": "http://localhost:3000/api/mcp"
41
+ }
42
+ }
43
+ }
44
+ ```
45
+
46
+ ### Cursor (`.cursor/mcp.json` in project root)
47
+ ```json
48
+ {
49
+ "mcpServers": {
50
+ "vibedoc": {
51
+ "url": "http://localhost:3000/api/mcp"
52
+ }
53
+ }
54
+ }
55
+ ```
56
+
57
+ ### Windsurf (`~/.codeium/windsurf/mcp_config.json`)
58
+ ```json
59
+ {
60
+ "mcpServers": {
61
+ "vibedoc": {
62
+ "url": "http://localhost:3000/api/mcp"
63
+ }
64
+ }
65
+ }
66
+ ```
67
+
68
+ ---
69
+
70
+ ## What the AI can do
71
+
72
+ | Tool | Effect |
73
+ |------|--------|
74
+ | `vibedoc_read_memory` | Reads MEMORY.md. Also triggers "session start" in activity feed. |
75
+ | `vibedoc_get_status` | Board snapshot — active tasks, blockers, doc count |
76
+ | `vibedoc_list_tasks` | Full kanban board |
77
+ | `vibedoc_get_task` | Read a specific task with scope + criteria |
78
+ | `vibedoc_update_task` | Move task status → **you see it live in browser** |
79
+ | `vibedoc_read_doc` | Load any doc: `"CLAUDE"`, `"HLD"`, `"user-service/API"` |
80
+ | `vibedoc_list_docs` | Discover all docs by section |
81
+ | `vibedoc_search_docs` | Full-text search across all docs |
82
+ | `vibedoc_log_decision` | Write a new ADR → appears in docs immediately |
83
+ | `vibedoc_update_memory` | Write end-of-session summary → updates Memory tab |
84
+
85
+ ---
86
+
87
+ ## Recommended CLAUDE.md snippet
88
+
89
+ ```markdown
90
+ ## Session protocol
91
+
92
+ **Start of session:**
93
+ 1. Call `vibedoc_read_memory` — read handoff from last session
94
+ 2. Call `vibedoc_get_status` — check what's active and blocked
95
+
96
+ **Before working on a task:**
97
+ - Call `vibedoc_get_task <id>` — read full spec and acceptance criteria
98
+ - Call `vibedoc_update_task <id> in-progress`
99
+
100
+ **When making architectural decisions:**
101
+ - Call `vibedoc_log_decision` — record it as an ADR
102
+
103
+ **End of session:**
104
+ - Call `vibedoc_update_task` for each task touched
105
+ - Call `vibedoc_update_memory` with full summary and handoff note
106
+ ```
107
+
108
+ ---
109
+
110
+ ## Multi-project
111
+
112
+ VibeDoc auto-discovers projects by scanning sibling directories for `CLAUDE.md` or `docs/architecture/`.
113
+ Switch projects using the dropdown in the top bar.
114
+
115
+ To override the scan base:
116
+ ```env
117
+ VIBEDOC_ROOT=/my/main/project
118
+ ```
119
+
120
+ ---
121
+
122
+ ## Project structure expected
123
+
124
+ ```
125
+ your-project/
126
+ ├── CLAUDE.md ← agent instructions
127
+ ├── docs/architecture/
128
+ │ ├── 01-overview/
129
+ │ ├── 02-high-level-design/
130
+ │ │ └── EVENT_CATALOG.md
131
+ │ ├── 03-services/
132
+ │ │ └── user-service/
133
+ │ │ ├── OVERVIEW.md
134
+ │ │ ├── API.md
135
+ │ │ └── EVENTS.md
136
+ │ └── decisions/
137
+ │ └── ADR-001-*.md
138
+ ├── plans/tasks/
139
+ │ ├── T001-scaffold.md ← **Status:** 📋 Ready
140
+ │ └── T002-auth.md
141
+ └── memory/
142
+ └── MEMORY.md
143
+ ```
144
+
145
+ ---
146
+
147
+ ## Activity log
148
+
149
+ All AI and human actions are written to `.vibedoc-activity.json` in your project root.
150
+ The Activity tab shows the last 30 events in real time (SSE).
151
+
152
+ ---
153
+
154
+ ## Tech stack
155
+
156
+ - **Next.js 14** (App Router)
157
+ - **Tailwind CSS** — dark theme, no component library
158
+ - **SSE** (`/api/events`) — real-time browser updates
159
+ - **MCP over HTTP** (`/api/mcp`) — JSON-RPC 2.0
160
+ - **File system** — reads your actual repo, no database
package/bin/vibedoc.js ADDED
@@ -0,0 +1,54 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ const { spawn } = require('child_process');
5
+ const path = require('path');
6
+
7
+ const PKG_DIR = path.resolve(__dirname, '..');
8
+ const VIBEDOC_ROOT = process.env.VIBEDOC_ROOT || process.cwd();
9
+ const PORT = process.env.PORT || '3000';
10
+ const WS_PORT = process.env.WS_PORT || '1234';
11
+
12
+ console.log(`[vibedoc] Starting...`);
13
+ console.log(`[vibedoc] Project root: ${VIBEDOC_ROOT}`);
14
+ console.log(`[vibedoc] App: http://localhost:${PORT}`);
15
+ console.log(`[vibedoc] WS: ws://localhost:${WS_PORT}`);
16
+
17
+ const env = { ...process.env, VIBEDOC_ROOT };
18
+
19
+ const next = spawn(
20
+ process.execPath,
21
+ [require.resolve('next/dist/bin/next', { paths: [PKG_DIR] }), 'start', '--port', PORT],
22
+ { cwd: PKG_DIR, stdio: 'inherit', env }
23
+ );
24
+
25
+ const ws = spawn(
26
+ process.execPath,
27
+ [path.join(PKG_DIR, 'ws-server.js')],
28
+ { cwd: PKG_DIR, stdio: 'inherit', env }
29
+ );
30
+
31
+ function shutdown() {
32
+ next.kill();
33
+ ws.kill();
34
+ }
35
+
36
+ process.on('SIGINT', shutdown);
37
+ process.on('SIGTERM', shutdown);
38
+
39
+ next.on('error', err => {
40
+ console.error('[vibedoc] Failed to start Next.js server:', err.message);
41
+ process.exit(1);
42
+ });
43
+
44
+ next.on('exit', code => process.exit(code ?? 0));
45
+
46
+ ws.on('error', err => {
47
+ console.error('[vibedoc] Failed to start WebSocket server:', err.message);
48
+ });
49
+
50
+ ws.on('exit', code => {
51
+ if (code !== 0 && code !== null) {
52
+ console.error(`[vibedoc] WebSocket server exited with code ${code}`);
53
+ }
54
+ });
package/next.config.js ADDED
@@ -0,0 +1,7 @@
1
+ /** @type {import('next').NextConfig} */
2
+ const nextConfig = {
3
+ // Allow reading files outside the app directory (project repos)
4
+ serverExternalPackages: ['glob', 'gray-matter'],
5
+ }
6
+
7
+ module.exports = nextConfig
package/package.json ADDED
@@ -0,0 +1,80 @@
1
+ {
2
+ "name": "vibedoc",
3
+ "version": "1.0.0",
4
+ "description": "Local-first project intelligence for AI-assisted development. Web UI + MCP server in one.",
5
+ "bin": {
6
+ "vibedoc": "bin/vibedoc.js"
7
+ },
8
+ "files": [
9
+ "bin/",
10
+ ".next/BUILD_ID",
11
+ ".next/build-manifest.json",
12
+ ".next/app-build-manifest.json",
13
+ ".next/app-path-routes-manifest.json",
14
+ ".next/prerender-manifest.json",
15
+ ".next/prerender-manifest.js",
16
+ ".next/react-loadable-manifest.json",
17
+ ".next/routes-manifest.json",
18
+ ".next/required-server-files.json",
19
+ ".next/server/",
20
+ ".next/static/",
21
+ "public/",
22
+ "next.config.js",
23
+ "ws-server.js",
24
+ "package.json"
25
+ ],
26
+ "scripts": {
27
+ "dev": "concurrently \"next dev\" \"node ws-server.js\" --names \"next,ws\" --prefix-colors \"cyan,yellow\"",
28
+ "dev:next": "next dev",
29
+ "dev:ws": "node ws-server.js",
30
+ "build": "next build",
31
+ "start": "next start",
32
+ "lint": "next lint",
33
+ "prepublishOnly": "next build"
34
+ },
35
+ "dependencies": {
36
+ "@codemirror/lang-markdown": "^6.5.0",
37
+ "@codemirror/state": "^6.5.4",
38
+ "@codemirror/theme-one-dark": "^6.1.3",
39
+ "@codemirror/view": "^6.39.16",
40
+ "@modelcontextprotocol/sdk": "^1.0.0",
41
+ "@radix-ui/react-collapsible": "^1.1.12",
42
+ "@radix-ui/react-dialog": "^1.1.15",
43
+ "@radix-ui/react-dropdown-menu": "^2.1.16",
44
+ "@radix-ui/react-scroll-area": "^1.2.10",
45
+ "@radix-ui/react-separator": "^1.1.8",
46
+ "@radix-ui/react-slot": "^1.2.4",
47
+ "@radix-ui/react-tabs": "^1.1.13",
48
+ "@radix-ui/react-tooltip": "^1.2.8",
49
+ "@uiw/react-codemirror": "^4.25.6",
50
+ "class-variance-authority": "^0.7.1",
51
+ "clsx": "^2.1.1",
52
+ "glob": "^11.0.0",
53
+ "gray-matter": "^4.0.3",
54
+ "lucide-react": "^0.575.0",
55
+ "marked": "^12.0.0",
56
+ "mermaid": "^11.12.3",
57
+ "next": "latest",
58
+ "open": "^11.0.0",
59
+ "react": "^19",
60
+ "react-dom": "^19",
61
+ "tailwind-merge": "^3.5.0",
62
+ "ws": "^8.18.0",
63
+ "y-codemirror.next": "^0.3.5",
64
+ "y-websocket": "^2.1.0",
65
+ "yjs": "^13.6.29",
66
+ "zod": "^3.23.8"
67
+ },
68
+ "devDependencies": {
69
+ "@types/node": "^20",
70
+ "@types/react": "^19",
71
+ "@types/react-dom": "^19",
72
+ "autoprefixer": "^10.0.1",
73
+ "concurrently": "^9.2.1",
74
+ "eslint": "^8.57.1",
75
+ "eslint-config-next": "latest",
76
+ "postcss": "^8",
77
+ "tailwindcss": "^3.4.1",
78
+ "typescript": "^5"
79
+ }
80
+ }
package/ws-server.js ADDED
@@ -0,0 +1,12 @@
1
+ const { setupWSConnection } = require('y-websocket/bin/utils')
2
+ const http = require('http')
3
+ const WebSocket = require('ws')
4
+
5
+ const server = http.createServer((_, res) => {
6
+ res.writeHead(200)
7
+ res.end('Yjs WS')
8
+ })
9
+ const wss = new WebSocket.Server({ server })
10
+ wss.on('connection', setupWSConnection)
11
+ const PORT = process.env.WS_PORT || 1234
12
+ server.listen(PORT, () => console.log(`[vibedoc-ws] Yjs server on ws://localhost:${PORT}`))