constella 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 (747) hide show
  1. package/.next/BUILD_ID +1 -0
  2. package/.next/app-path-routes-manifest.json +53 -0
  3. package/.next/build-manifest.json +20 -0
  4. package/.next/diagnostics/build-diagnostics.json +6 -0
  5. package/.next/diagnostics/framework.json +1 -0
  6. package/.next/export-marker.json +6 -0
  7. package/.next/images-manifest.json +68 -0
  8. package/.next/next-minimal-server.js.nft.json +1 -0
  9. package/.next/next-server.js.nft.json +1 -0
  10. package/.next/package.json +1 -0
  11. package/.next/prerender-manifest.json +36 -0
  12. package/.next/react-loadable-manifest.json +14 -0
  13. package/.next/required-server-files.js +343 -0
  14. package/.next/required-server-files.json +343 -0
  15. package/.next/routes-manifest.json +362 -0
  16. package/.next/server/app/(app)/activity/page.js +2 -0
  17. package/.next/server/app/(app)/activity/page.js.nft.json +1 -0
  18. package/.next/server/app/(app)/activity/page_client-reference-manifest.js +1 -0
  19. package/.next/server/app/(app)/agents/[handle]/page.js +18 -0
  20. package/.next/server/app/(app)/agents/[handle]/page.js.nft.json +1 -0
  21. package/.next/server/app/(app)/agents/[handle]/page_client-reference-manifest.js +1 -0
  22. package/.next/server/app/(app)/code/page.js +2 -0
  23. package/.next/server/app/(app)/code/page.js.nft.json +1 -0
  24. package/.next/server/app/(app)/code/page_client-reference-manifest.js +1 -0
  25. package/.next/server/app/(app)/config/page.js +2 -0
  26. package/.next/server/app/(app)/config/page.js.nft.json +1 -0
  27. package/.next/server/app/(app)/config/page_client-reference-manifest.js +1 -0
  28. package/.next/server/app/(app)/costs/page.js +2 -0
  29. package/.next/server/app/(app)/costs/page.js.nft.json +1 -0
  30. package/.next/server/app/(app)/costs/page_client-reference-manifest.js +1 -0
  31. package/.next/server/app/(app)/cron/page.js +2 -0
  32. package/.next/server/app/(app)/cron/page.js.nft.json +1 -0
  33. package/.next/server/app/(app)/cron/page_client-reference-manifest.js +1 -0
  34. package/.next/server/app/(app)/dashboard/page.js +2 -0
  35. package/.next/server/app/(app)/dashboard/page.js.nft.json +1 -0
  36. package/.next/server/app/(app)/dashboard/page_client-reference-manifest.js +1 -0
  37. package/.next/server/app/(app)/docs/[id]/page.js +2 -0
  38. package/.next/server/app/(app)/docs/[id]/page.js.nft.json +1 -0
  39. package/.next/server/app/(app)/docs/[id]/page_client-reference-manifest.js +1 -0
  40. package/.next/server/app/(app)/docs/page.js +2 -0
  41. package/.next/server/app/(app)/docs/page.js.nft.json +1 -0
  42. package/.next/server/app/(app)/docs/page_client-reference-manifest.js +1 -0
  43. package/.next/server/app/(app)/github/page.js +2 -0
  44. package/.next/server/app/(app)/github/page.js.nft.json +1 -0
  45. package/.next/server/app/(app)/github/page_client-reference-manifest.js +1 -0
  46. package/.next/server/app/(app)/goals/page.js +2 -0
  47. package/.next/server/app/(app)/goals/page.js.nft.json +1 -0
  48. package/.next/server/app/(app)/goals/page_client-reference-manifest.js +1 -0
  49. package/.next/server/app/(app)/inbox/page.js +2 -0
  50. package/.next/server/app/(app)/inbox/page.js.nft.json +1 -0
  51. package/.next/server/app/(app)/inbox/page_client-reference-manifest.js +1 -0
  52. package/.next/server/app/(app)/knowledge/page.js +3 -0
  53. package/.next/server/app/(app)/knowledge/page.js.nft.json +1 -0
  54. package/.next/server/app/(app)/knowledge/page_client-reference-manifest.js +1 -0
  55. package/.next/server/app/(app)/models/page.js +2 -0
  56. package/.next/server/app/(app)/models/page.js.nft.json +1 -0
  57. package/.next/server/app/(app)/models/page_client-reference-manifest.js +1 -0
  58. package/.next/server/app/(app)/notifications/page.js +2 -0
  59. package/.next/server/app/(app)/notifications/page.js.nft.json +1 -0
  60. package/.next/server/app/(app)/notifications/page_client-reference-manifest.js +1 -0
  61. package/.next/server/app/(app)/org/page.js +2 -0
  62. package/.next/server/app/(app)/org/page.js.nft.json +1 -0
  63. package/.next/server/app/(app)/org/page_client-reference-manifest.js +1 -0
  64. package/.next/server/app/(app)/organizations/page.js +2 -0
  65. package/.next/server/app/(app)/organizations/page.js.nft.json +1 -0
  66. package/.next/server/app/(app)/organizations/page_client-reference-manifest.js +1 -0
  67. package/.next/server/app/(app)/page.js +3 -0
  68. package/.next/server/app/(app)/page.js.nft.json +1 -0
  69. package/.next/server/app/(app)/page_client-reference-manifest.js +1 -0
  70. package/.next/server/app/(app)/planner/page.js +2 -0
  71. package/.next/server/app/(app)/planner/page.js.nft.json +1 -0
  72. package/.next/server/app/(app)/planner/page_client-reference-manifest.js +1 -0
  73. package/.next/server/app/(app)/plugins/page.js +2 -0
  74. package/.next/server/app/(app)/plugins/page.js.nft.json +1 -0
  75. package/.next/server/app/(app)/plugins/page_client-reference-manifest.js +1 -0
  76. package/.next/server/app/(app)/pm/page.js +2 -0
  77. package/.next/server/app/(app)/pm/page.js.nft.json +1 -0
  78. package/.next/server/app/(app)/pm/page_client-reference-manifest.js +1 -0
  79. package/.next/server/app/(app)/prepare-deploy/page.js +19 -0
  80. package/.next/server/app/(app)/prepare-deploy/page.js.nft.json +1 -0
  81. package/.next/server/app/(app)/prepare-deploy/page_client-reference-manifest.js +1 -0
  82. package/.next/server/app/(app)/profile/page.js +2 -0
  83. package/.next/server/app/(app)/profile/page.js.nft.json +1 -0
  84. package/.next/server/app/(app)/profile/page_client-reference-manifest.js +1 -0
  85. package/.next/server/app/(app)/pulse/page.js +2 -0
  86. package/.next/server/app/(app)/pulse/page.js.nft.json +1 -0
  87. package/.next/server/app/(app)/pulse/page_client-reference-manifest.js +1 -0
  88. package/.next/server/app/(app)/reports/[id]/page.js +3 -0
  89. package/.next/server/app/(app)/reports/[id]/page.js.nft.json +1 -0
  90. package/.next/server/app/(app)/reports/[id]/page_client-reference-manifest.js +1 -0
  91. package/.next/server/app/(app)/reports/page.js +5 -0
  92. package/.next/server/app/(app)/reports/page.js.nft.json +1 -0
  93. package/.next/server/app/(app)/reports/page_client-reference-manifest.js +1 -0
  94. package/.next/server/app/(app)/routines/page.js +2 -0
  95. package/.next/server/app/(app)/routines/page.js.nft.json +1 -0
  96. package/.next/server/app/(app)/routines/page_client-reference-manifest.js +1 -0
  97. package/.next/server/app/(app)/search/page.js +2 -0
  98. package/.next/server/app/(app)/search/page.js.nft.json +1 -0
  99. package/.next/server/app/(app)/search/page_client-reference-manifest.js +1 -0
  100. package/.next/server/app/(app)/security/page.js +2 -0
  101. package/.next/server/app/(app)/security/page.js.nft.json +1 -0
  102. package/.next/server/app/(app)/security/page_client-reference-manifest.js +1 -0
  103. package/.next/server/app/(app)/skills/page.js +18 -0
  104. package/.next/server/app/(app)/skills/page.js.nft.json +1 -0
  105. package/.next/server/app/(app)/skills/page_client-reference-manifest.js +1 -0
  106. package/.next/server/app/(app)/tasks/page.js +2 -0
  107. package/.next/server/app/(app)/tasks/page.js.nft.json +1 -0
  108. package/.next/server/app/(app)/tasks/page_client-reference-manifest.js +1 -0
  109. package/.next/server/app/(app)/test-dev/page.js +2 -0
  110. package/.next/server/app/(app)/test-dev/page.js.nft.json +1 -0
  111. package/.next/server/app/(app)/test-dev/page_client-reference-manifest.js +1 -0
  112. package/.next/server/app/(app)/update/page.js +2 -0
  113. package/.next/server/app/(app)/update/page.js.nft.json +1 -0
  114. package/.next/server/app/(app)/update/page_client-reference-manifest.js +1 -0
  115. package/.next/server/app/(auth)/login/page.js +2 -0
  116. package/.next/server/app/(auth)/login/page.js.nft.json +1 -0
  117. package/.next/server/app/(auth)/login/page_client-reference-manifest.js +1 -0
  118. package/.next/server/app/(auth)/onboarding/page.js +18 -0
  119. package/.next/server/app/(auth)/onboarding/page.js.nft.json +1 -0
  120. package/.next/server/app/(auth)/onboarding/page_client-reference-manifest.js +1 -0
  121. package/.next/server/app/_global-error/page.js +32 -0
  122. package/.next/server/app/_global-error/page.js.nft.json +1 -0
  123. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -0
  124. package/.next/server/app/_global-error.html +1 -0
  125. package/.next/server/app/_global-error.meta +16 -0
  126. package/.next/server/app/_global-error.rsc +15 -0
  127. package/.next/server/app/_global-error.segments/_full.segment.rsc +15 -0
  128. package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +5 -0
  129. package/.next/server/app/_global-error.segments/_global-error.segment.rsc +5 -0
  130. package/.next/server/app/_global-error.segments/_head.segment.rsc +5 -0
  131. package/.next/server/app/_global-error.segments/_index.segment.rsc +6 -0
  132. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -0
  133. package/.next/server/app/_not-found/page.js +2 -0
  134. package/.next/server/app/_not-found/page.js.nft.json +1 -0
  135. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -0
  136. package/.next/server/app/api/auth/[...all]/route.js +1 -0
  137. package/.next/server/app/api/auth/[...all]/route.js.nft.json +1 -0
  138. package/.next/server/app/api/auth/[...all]/route_client-reference-manifest.js +1 -0
  139. package/.next/server/app/api/cron/tick/route.js +52 -0
  140. package/.next/server/app/api/cron/tick/route.js.nft.json +1 -0
  141. package/.next/server/app/api/cron/tick/route_client-reference-manifest.js +1 -0
  142. package/.next/server/app/api/dev-login/route.js +1 -0
  143. package/.next/server/app/api/dev-login/route.js.nft.json +1 -0
  144. package/.next/server/app/api/dev-login/route_client-reference-manifest.js +1 -0
  145. package/.next/server/app/api/locks/acquire/route.js +1 -0
  146. package/.next/server/app/api/locks/acquire/route.js.nft.json +1 -0
  147. package/.next/server/app/api/locks/acquire/route_client-reference-manifest.js +1 -0
  148. package/.next/server/app/api/models/progress/route.js +1 -0
  149. package/.next/server/app/api/models/progress/route.js.nft.json +1 -0
  150. package/.next/server/app/api/models/progress/route_client-reference-manifest.js +1 -0
  151. package/.next/server/app/api/passkey/authenticate/options/route.js +1 -0
  152. package/.next/server/app/api/passkey/authenticate/options/route.js.nft.json +1 -0
  153. package/.next/server/app/api/passkey/authenticate/options/route_client-reference-manifest.js +1 -0
  154. package/.next/server/app/api/passkey/authenticate/verify/route.js +1 -0
  155. package/.next/server/app/api/passkey/authenticate/verify/route.js.nft.json +1 -0
  156. package/.next/server/app/api/passkey/authenticate/verify/route_client-reference-manifest.js +1 -0
  157. package/.next/server/app/api/passkey/register/options/route.js +1 -0
  158. package/.next/server/app/api/passkey/register/options/route.js.nft.json +1 -0
  159. package/.next/server/app/api/passkey/register/options/route_client-reference-manifest.js +1 -0
  160. package/.next/server/app/api/passkey/register/verify/route.js +1 -0
  161. package/.next/server/app/api/passkey/register/verify/route.js.nft.json +1 -0
  162. package/.next/server/app/api/passkey/register/verify/route_client-reference-manifest.js +1 -0
  163. package/.next/server/app/api/stream/route.js +4 -0
  164. package/.next/server/app/api/stream/route.js.nft.json +1 -0
  165. package/.next/server/app/api/stream/route_client-reference-manifest.js +1 -0
  166. package/.next/server/app/api/sync/file/route.js +2 -0
  167. package/.next/server/app/api/sync/file/route.js.nft.json +1 -0
  168. package/.next/server/app/api/sync/file/route_client-reference-manifest.js +1 -0
  169. package/.next/server/app/api/telegram/poll/route.js +15 -0
  170. package/.next/server/app/api/telegram/poll/route.js.nft.json +1 -0
  171. package/.next/server/app/api/telegram/poll/route_client-reference-manifest.js +1 -0
  172. package/.next/server/app/api/upload/route.js +1 -0
  173. package/.next/server/app/api/upload/route.js.nft.json +1 -0
  174. package/.next/server/app/api/upload/route_client-reference-manifest.js +1 -0
  175. package/.next/server/app/api/v1/[[...path]]/route.js +1 -0
  176. package/.next/server/app/api/v1/[[...path]]/route.js.nft.json +1 -0
  177. package/.next/server/app/api/v1/[[...path]]/route_client-reference-manifest.js +1 -0
  178. package/.next/server/app-paths-manifest.json +53 -0
  179. package/.next/server/chunks/1003.js +1 -0
  180. package/.next/server/chunks/127.js +26 -0
  181. package/.next/server/chunks/1388.js +1 -0
  182. package/.next/server/chunks/1408.js +21 -0
  183. package/.next/server/chunks/1572.js +1 -0
  184. package/.next/server/chunks/1591.js +24 -0
  185. package/.next/server/chunks/1619.js +188 -0
  186. package/.next/server/chunks/162.js +1 -0
  187. package/.next/server/chunks/1881.js +1 -0
  188. package/.next/server/chunks/1968.js +1 -0
  189. package/.next/server/chunks/2297.js +348 -0
  190. package/.next/server/chunks/2341.js +1 -0
  191. package/.next/server/chunks/2517.js +1 -0
  192. package/.next/server/chunks/2549.js +1 -0
  193. package/.next/server/chunks/259.js +14 -0
  194. package/.next/server/chunks/2599.js +1 -0
  195. package/.next/server/chunks/260.js +1 -0
  196. package/.next/server/chunks/2867.js +147 -0
  197. package/.next/server/chunks/3018.js +1 -0
  198. package/.next/server/chunks/3050.js +18 -0
  199. package/.next/server/chunks/3085.js +12 -0
  200. package/.next/server/chunks/3131.js +1 -0
  201. package/.next/server/chunks/3242.js +1 -0
  202. package/.next/server/chunks/3266.js +15 -0
  203. package/.next/server/chunks/3524.js +1 -0
  204. package/.next/server/chunks/3527.js +479 -0
  205. package/.next/server/chunks/3533.js +869 -0
  206. package/.next/server/chunks/3550.js +1 -0
  207. package/.next/server/chunks/3609.js +2 -0
  208. package/.next/server/chunks/3667.js +462 -0
  209. package/.next/server/chunks/3760.js +4 -0
  210. package/.next/server/chunks/4679.js +1 -0
  211. package/.next/server/chunks/4804.js +1 -0
  212. package/.next/server/chunks/4832.js +2 -0
  213. package/.next/server/chunks/4853.js +1 -0
  214. package/.next/server/chunks/4979.js +67 -0
  215. package/.next/server/chunks/5060.js +1 -0
  216. package/.next/server/chunks/5278.js +1 -0
  217. package/.next/server/chunks/5614.js +1 -0
  218. package/.next/server/chunks/5818.js +1 -0
  219. package/.next/server/chunks/6479.js +1 -0
  220. package/.next/server/chunks/6658.js +1 -0
  221. package/.next/server/chunks/6706.js +1 -0
  222. package/.next/server/chunks/6719.js +1 -0
  223. package/.next/server/chunks/678.js +1 -0
  224. package/.next/server/chunks/683.js +1 -0
  225. package/.next/server/chunks/6862.js +1 -0
  226. package/.next/server/chunks/6882.js +1 -0
  227. package/.next/server/chunks/7037.js +1 -0
  228. package/.next/server/chunks/7107.js +741 -0
  229. package/.next/server/chunks/73.js +17 -0
  230. package/.next/server/chunks/7327.js +1 -0
  231. package/.next/server/chunks/7514.js +1 -0
  232. package/.next/server/chunks/7622.js +1 -0
  233. package/.next/server/chunks/7778.js +1 -0
  234. package/.next/server/chunks/7912.js +1 -0
  235. package/.next/server/chunks/7949.js +1 -0
  236. package/.next/server/chunks/7971.js +1 -0
  237. package/.next/server/chunks/7989.js +1 -0
  238. package/.next/server/chunks/842.js +22 -0
  239. package/.next/server/chunks/8762.js +15 -0
  240. package/.next/server/chunks/8823.js +77 -0
  241. package/.next/server/chunks/9146.js +4 -0
  242. package/.next/server/chunks/9676.js +1 -0
  243. package/.next/server/chunks/9783.js +22 -0
  244. package/.next/server/chunks/9969.js +3 -0
  245. package/.next/server/functions-config-manifest.json +18 -0
  246. package/.next/server/instrumentation.js +1 -0
  247. package/.next/server/instrumentation.js.nft.json +1 -0
  248. package/.next/server/interception-route-rewrite-manifest.js +1 -0
  249. package/.next/server/middleware-build-manifest.js +1 -0
  250. package/.next/server/middleware-manifest.json +6 -0
  251. package/.next/server/middleware-react-loadable-manifest.js +1 -0
  252. package/.next/server/middleware.js +18 -0
  253. package/.next/server/middleware.js.nft.json +1 -0
  254. package/.next/server/next-font-manifest.js +1 -0
  255. package/.next/server/next-font-manifest.json +1 -0
  256. package/.next/server/pages/500.html +1 -0
  257. package/.next/server/pages-manifest.json +3 -0
  258. package/.next/server/prefetch-hints.json +1 -0
  259. package/.next/server/server-reference-manifest.js +1 -0
  260. package/.next/server/server-reference-manifest.json +1 -0
  261. package/.next/server/webpack-runtime.js +1 -0
  262. package/.next/static/chunks/1858-339516f78a4b00da.js +1 -0
  263. package/.next/static/chunks/2320-fc8b39380e69d465.js +2 -0
  264. package/.next/static/chunks/23550918-ff694f70f4b0648c.js +1 -0
  265. package/.next/static/chunks/3219-ebb3c23be38c838d.js +1 -0
  266. package/.next/static/chunks/4263-adecb5b466380b6e.js +1 -0
  267. package/.next/static/chunks/5479-0cceab68cd0ca9c7.js +1 -0
  268. package/.next/static/chunks/5701-665b927b06158b76.js +1 -0
  269. package/.next/static/chunks/5920.6451a68b63918988.js +1 -0
  270. package/.next/static/chunks/6575-5c9139720bb0f5bf.js +4 -0
  271. package/.next/static/chunks/6834-4759af1ce7d95fb6.js +32 -0
  272. package/.next/static/chunks/7509.721cd47a931c5518.js +1 -0
  273. package/.next/static/chunks/8264-1ca011989ee2b231.js +1 -0
  274. package/.next/static/chunks/9219-4a39a98b5502d9d1.js +1 -0
  275. package/.next/static/chunks/9690-53d5222618cbeddb.js +1 -0
  276. package/.next/static/chunks/app/(app)/activity/page-3973534281ecea81.js +1 -0
  277. package/.next/static/chunks/app/(app)/agents/[handle]/page-83662a175c098282.js +1 -0
  278. package/.next/static/chunks/app/(app)/code/page-33979545192cd137.js +1 -0
  279. package/.next/static/chunks/app/(app)/config/page-9933aed1ca8a85c1.js +1 -0
  280. package/.next/static/chunks/app/(app)/costs/page-131c4dc580efcc19.js +1 -0
  281. package/.next/static/chunks/app/(app)/cron/page-53ea1aff998a87ca.js +1 -0
  282. package/.next/static/chunks/app/(app)/dashboard/page-deed83aaa9d0d447.js +1 -0
  283. package/.next/static/chunks/app/(app)/docs/[id]/page-38c993d73c0eab4f.js +1 -0
  284. package/.next/static/chunks/app/(app)/docs/page-bf463b55d0554e86.js +1 -0
  285. package/.next/static/chunks/app/(app)/error-988cd28480809861.js +1 -0
  286. package/.next/static/chunks/app/(app)/github/page-62678b4e82dfecb6.js +1 -0
  287. package/.next/static/chunks/app/(app)/goals/page-4adb426fe1c96106.js +1 -0
  288. package/.next/static/chunks/app/(app)/inbox/page-e347dc55ab467310.js +1 -0
  289. package/.next/static/chunks/app/(app)/knowledge/page-65393a045b4349be.js +1 -0
  290. package/.next/static/chunks/app/(app)/layout-7f65675705b011d8.js +1 -0
  291. package/.next/static/chunks/app/(app)/models/page-e01f1dd7e49a2951.js +1 -0
  292. package/.next/static/chunks/app/(app)/notifications/page-56548ac87aef00da.js +1 -0
  293. package/.next/static/chunks/app/(app)/org/page-699e6a6dc0db7d81.js +1 -0
  294. package/.next/static/chunks/app/(app)/organizations/page-36051a380a7e8eb7.js +1 -0
  295. package/.next/static/chunks/app/(app)/page-7d1011a566f81520.js +1 -0
  296. package/.next/static/chunks/app/(app)/planner/page-dab7ced94083373a.js +1 -0
  297. package/.next/static/chunks/app/(app)/plugins/page-5b5a1f53389be42e.js +1 -0
  298. package/.next/static/chunks/app/(app)/pm/page-0de5c08c0b227bb0.js +1 -0
  299. package/.next/static/chunks/app/(app)/prepare-deploy/page-e426038552df8d41.js +1 -0
  300. package/.next/static/chunks/app/(app)/profile/page-608dfcaf8aae0a69.js +1 -0
  301. package/.next/static/chunks/app/(app)/pulse/page-309ccaca91de1faa.js +1 -0
  302. package/.next/static/chunks/app/(app)/reports/[id]/page-53ea1aff998a87ca.js +1 -0
  303. package/.next/static/chunks/app/(app)/reports/page-68cdc6dcfa472d86.js +1 -0
  304. package/.next/static/chunks/app/(app)/routines/page-bcc55550b197a9fa.js +1 -0
  305. package/.next/static/chunks/app/(app)/search/page-5c5f67558d0dbf0d.js +1 -0
  306. package/.next/static/chunks/app/(app)/security/page-a7d41e36aa366b45.js +1 -0
  307. package/.next/static/chunks/app/(app)/skills/page-c5b21e89593b8336.js +1 -0
  308. package/.next/static/chunks/app/(app)/tasks/page-08ae079e3e54d2ce.js +1 -0
  309. package/.next/static/chunks/app/(app)/test-dev/page-633f82dfd9c3ce23.js +1 -0
  310. package/.next/static/chunks/app/(app)/update/page-4be019054351bfac.js +1 -0
  311. package/.next/static/chunks/app/(auth)/login/page-6e85d3377062acae.js +1 -0
  312. package/.next/static/chunks/app/(auth)/onboarding/page-ebb10c175abf3b85.js +1 -0
  313. package/.next/static/chunks/app/_global-error/page-23fe50a6bf589c97.js +1 -0
  314. package/.next/static/chunks/app/_not-found/page-dc38b02aebeab535.js +1 -0
  315. package/.next/static/chunks/app/api/auth/[...all]/route-23fe50a6bf589c97.js +1 -0
  316. package/.next/static/chunks/app/api/cron/tick/route-23fe50a6bf589c97.js +1 -0
  317. package/.next/static/chunks/app/api/dev-login/route-23fe50a6bf589c97.js +1 -0
  318. package/.next/static/chunks/app/api/locks/acquire/route-23fe50a6bf589c97.js +1 -0
  319. package/.next/static/chunks/app/api/models/progress/route-23fe50a6bf589c97.js +1 -0
  320. package/.next/static/chunks/app/api/passkey/authenticate/options/route-23fe50a6bf589c97.js +1 -0
  321. package/.next/static/chunks/app/api/passkey/authenticate/verify/route-23fe50a6bf589c97.js +1 -0
  322. package/.next/static/chunks/app/api/passkey/register/options/route-23fe50a6bf589c97.js +1 -0
  323. package/.next/static/chunks/app/api/passkey/register/verify/route-23fe50a6bf589c97.js +1 -0
  324. package/.next/static/chunks/app/api/stream/route-23fe50a6bf589c97.js +1 -0
  325. package/.next/static/chunks/app/api/sync/file/route-23fe50a6bf589c97.js +1 -0
  326. package/.next/static/chunks/app/api/telegram/poll/route-23fe50a6bf589c97.js +1 -0
  327. package/.next/static/chunks/app/api/upload/route-23fe50a6bf589c97.js +1 -0
  328. package/.next/static/chunks/app/api/v1/[[...path]]/route-23fe50a6bf589c97.js +1 -0
  329. package/.next/static/chunks/app/error-09899a13c38b6e89.js +1 -0
  330. package/.next/static/chunks/app/global-error-b8050d4d886f448c.js +1 -0
  331. package/.next/static/chunks/app/layout-ab9deed1e7e2e9df.js +1 -0
  332. package/.next/static/chunks/framework-4b2c6b6043dd203f.js +1 -0
  333. package/.next/static/chunks/main-722e16032e7764d1.js +5 -0
  334. package/.next/static/chunks/main-app-761880af2b6f1962.js +1 -0
  335. package/.next/static/chunks/next/dist/client/components/builtin/app-error-23fe50a6bf589c97.js +1 -0
  336. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-23fe50a6bf589c97.js +1 -0
  337. package/.next/static/chunks/next/dist/client/components/builtin/not-found-23fe50a6bf589c97.js +1 -0
  338. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-23fe50a6bf589c97.js +1 -0
  339. package/.next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
  340. package/.next/static/chunks/webpack-222e3894b78c67db.js +1 -0
  341. package/.next/static/css/0a9b5805594444e3.css +1 -0
  342. package/.next/static/yztMvBwyrWWkSqP6jfXoa/_buildManifest.js +1 -0
  343. package/.next/static/yztMvBwyrWWkSqP6jfXoa/_ssgManifest.js +1 -0
  344. package/.next/trace-build +1 -0
  345. package/.next/types/app/(app)/activity/page.ts +87 -0
  346. package/.next/types/app/(app)/agents/[handle]/page.ts +87 -0
  347. package/.next/types/app/(app)/code/page.ts +87 -0
  348. package/.next/types/app/(app)/config/page.ts +87 -0
  349. package/.next/types/app/(app)/costs/page.ts +87 -0
  350. package/.next/types/app/(app)/cron/page.ts +87 -0
  351. package/.next/types/app/(app)/dashboard/page.ts +87 -0
  352. package/.next/types/app/(app)/docs/[id]/page.ts +87 -0
  353. package/.next/types/app/(app)/docs/page.ts +87 -0
  354. package/.next/types/app/(app)/github/page.ts +87 -0
  355. package/.next/types/app/(app)/goals/page.ts +87 -0
  356. package/.next/types/app/(app)/inbox/page.ts +87 -0
  357. package/.next/types/app/(app)/knowledge/page.ts +87 -0
  358. package/.next/types/app/(app)/models/page.ts +87 -0
  359. package/.next/types/app/(app)/notifications/page.ts +87 -0
  360. package/.next/types/app/(app)/org/page.ts +87 -0
  361. package/.next/types/app/(app)/organizations/page.ts +87 -0
  362. package/.next/types/app/(app)/page.ts +87 -0
  363. package/.next/types/app/(app)/planner/page.ts +87 -0
  364. package/.next/types/app/(app)/plugins/page.ts +87 -0
  365. package/.next/types/app/(app)/pm/page.ts +87 -0
  366. package/.next/types/app/(app)/prepare-deploy/page.ts +87 -0
  367. package/.next/types/app/(app)/profile/page.ts +87 -0
  368. package/.next/types/app/(app)/pulse/page.ts +87 -0
  369. package/.next/types/app/(app)/reports/[id]/page.ts +87 -0
  370. package/.next/types/app/(app)/reports/page.ts +87 -0
  371. package/.next/types/app/(app)/routines/page.ts +87 -0
  372. package/.next/types/app/(app)/search/page.ts +87 -0
  373. package/.next/types/app/(app)/security/page.ts +87 -0
  374. package/.next/types/app/(app)/skills/page.ts +87 -0
  375. package/.next/types/app/(app)/tasks/page.ts +87 -0
  376. package/.next/types/app/(app)/test-dev/page.ts +87 -0
  377. package/.next/types/app/(app)/update/page.ts +87 -0
  378. package/.next/types/app/(auth)/login/page.ts +87 -0
  379. package/.next/types/app/(auth)/onboarding/page.ts +87 -0
  380. package/.next/types/app/api/auth/[...all]/route.ts +351 -0
  381. package/.next/types/app/api/cron/tick/route.ts +351 -0
  382. package/.next/types/app/api/dev-login/route.ts +351 -0
  383. package/.next/types/app/api/locks/acquire/route.ts +351 -0
  384. package/.next/types/app/api/models/progress/route.ts +351 -0
  385. package/.next/types/app/api/passkey/authenticate/options/route.ts +351 -0
  386. package/.next/types/app/api/passkey/authenticate/verify/route.ts +351 -0
  387. package/.next/types/app/api/passkey/register/options/route.ts +351 -0
  388. package/.next/types/app/api/passkey/register/verify/route.ts +351 -0
  389. package/.next/types/app/api/stream/route.ts +351 -0
  390. package/.next/types/app/api/sync/file/route.ts +351 -0
  391. package/.next/types/app/api/telegram/poll/route.ts +351 -0
  392. package/.next/types/app/api/upload/route.ts +351 -0
  393. package/.next/types/app/api/v1/[[...path]]/route.ts +351 -0
  394. package/.next/types/cache-life.d.ts +145 -0
  395. package/.next/types/link.d.ts +210 -0
  396. package/.next/types/package.json +1 -0
  397. package/.next/types/routes.d.ts +120 -0
  398. package/.next/types/validator.ts +511 -0
  399. package/CHANGELOG.md +312 -0
  400. package/LICENSE +21 -0
  401. package/README.md +382 -0
  402. package/README.pt-BR.md +391 -0
  403. package/bin/constella.mjs +329 -0
  404. package/bin/guard-hook.mjs +44 -0
  405. package/bin/lock-hook.mjs +49 -0
  406. package/bin/worker.mjs +142 -0
  407. package/docs/assets/arch-orbit.svg +56 -0
  408. package/docs/assets/blackhole.svg +37 -0
  409. package/docs/assets/divider-orbit.svg +23 -0
  410. package/docs/assets/hero-constella.svg +72 -0
  411. package/docs/en/AGENTS.md +279 -0
  412. package/docs/en/AI_ARCHITECTURE.md +373 -0
  413. package/docs/en/ARCHITECTURE.md +334 -0
  414. package/docs/en/AUTH_MODE.md +247 -0
  415. package/docs/en/CHAT_COMMANDS.md +305 -0
  416. package/docs/en/CONFIGURATION.md +340 -0
  417. package/docs/en/DEPLOY.md +331 -0
  418. package/docs/en/DM.md +297 -0
  419. package/docs/en/FAQ.md +258 -0
  420. package/docs/en/GITHUB.md +341 -0
  421. package/docs/en/GOALS_SPECS_ISSUES.md +303 -0
  422. package/docs/en/INBOX.md +340 -0
  423. package/docs/en/INSTALLATION.md +329 -0
  424. package/docs/en/KB_AGENT.md +305 -0
  425. package/docs/en/KB_RAG.md +356 -0
  426. package/docs/en/MCP.md +313 -0
  427. package/docs/en/MEMORY_RAG.md +289 -0
  428. package/docs/en/MODELS.md +341 -0
  429. package/docs/en/ONBOARDING.md +327 -0
  430. package/docs/en/PLUGINS.md +290 -0
  431. package/docs/en/PORTABLE_MODE.md +387 -0
  432. package/docs/en/PO_AGENT.md +379 -0
  433. package/docs/en/PREPARE_DEPLOY.md +308 -0
  434. package/docs/en/PROJECT_STACKS.md +258 -0
  435. package/docs/en/PUBLIC_API.md +315 -0
  436. package/docs/en/PUBLISHING.md +343 -0
  437. package/docs/en/README.md +95 -0
  438. package/docs/en/SECURITY.md +280 -0
  439. package/docs/en/SKILLS.md +349 -0
  440. package/docs/en/START_MODE.md +340 -0
  441. package/docs/en/SYNCED_BLOCKS.md +320 -0
  442. package/docs/en/TEAM_ROOM.md +285 -0
  443. package/docs/en/TELEGRAM.md +294 -0
  444. package/docs/en/TEST_DEV.md +321 -0
  445. package/docs/en/TROUBLESHOOTING.md +294 -0
  446. package/docs/en/UPDATE.md +301 -0
  447. package/docs/en/VPS_MODE.md +334 -0
  448. package/docs/en/WORKFLOW.md +321 -0
  449. package/docs/pt/AGENTS.md +279 -0
  450. package/docs/pt/AI_ARCHITECTURE.md +373 -0
  451. package/docs/pt/ARCHITECTURE.md +334 -0
  452. package/docs/pt/AUTH_MODE.md +247 -0
  453. package/docs/pt/CHAT_COMMANDS.md +307 -0
  454. package/docs/pt/CONFIGURATION.md +340 -0
  455. package/docs/pt/DEPLOY.md +331 -0
  456. package/docs/pt/DM.md +297 -0
  457. package/docs/pt/FAQ.md +258 -0
  458. package/docs/pt/GITHUB.md +341 -0
  459. package/docs/pt/GOALS_SPECS_ISSUES.md +303 -0
  460. package/docs/pt/INBOX.md +340 -0
  461. package/docs/pt/INSTALLATION.md +329 -0
  462. package/docs/pt/KB_AGENT.md +305 -0
  463. package/docs/pt/KB_RAG.md +356 -0
  464. package/docs/pt/MCP.md +313 -0
  465. package/docs/pt/MEMORY_RAG.md +289 -0
  466. package/docs/pt/MODELS.md +341 -0
  467. package/docs/pt/ONBOARDING.md +327 -0
  468. package/docs/pt/PLUGINS.md +290 -0
  469. package/docs/pt/PORTABLE_MODE.md +387 -0
  470. package/docs/pt/PO_AGENT.md +379 -0
  471. package/docs/pt/PREPARE_DEPLOY.md +308 -0
  472. package/docs/pt/PROJECT_STACKS.md +258 -0
  473. package/docs/pt/PUBLIC_API.md +315 -0
  474. package/docs/pt/PUBLISHING.md +343 -0
  475. package/docs/pt/README.md +95 -0
  476. package/docs/pt/SECURITY.md +280 -0
  477. package/docs/pt/SKILLS.md +349 -0
  478. package/docs/pt/START_MODE.md +340 -0
  479. package/docs/pt/SYNCED_BLOCKS.md +320 -0
  480. package/docs/pt/TEAM_ROOM.md +285 -0
  481. package/docs/pt/TELEGRAM.md +294 -0
  482. package/docs/pt/TEST_DEV.md +321 -0
  483. package/docs/pt/TROUBLESHOOTING.md +294 -0
  484. package/docs/pt/UPDATE.md +301 -0
  485. package/docs/pt/VPS_MODE.md +334 -0
  486. package/docs/pt/WORKFLOW.md +321 -0
  487. package/drizzle/0000_regular_nightshade.sql +644 -0
  488. package/drizzle/0001_mixed_zombie.sql +106 -0
  489. package/drizzle/meta/0000_snapshot.json +4650 -0
  490. package/drizzle/meta/0001_snapshot.json +5418 -0
  491. package/drizzle/meta/_journal.json +20 -0
  492. package/drizzle.config.mjs +16 -0
  493. package/next.config.mjs +18 -0
  494. package/package.json +130 -0
  495. package/scripts/clean-repo.mjs +20 -0
  496. package/scripts/dev-all.mjs +46 -0
  497. package/scripts/i18n-parity.mjs +57 -0
  498. package/scripts/mcp-server.mjs +100 -0
  499. package/scripts/postbuild.mjs +11 -0
  500. package/scripts/publish-public.mjs +116 -0
  501. package/scripts/start-all.mjs +45 -0
  502. package/scripts/trim-next.mjs +23 -0
  503. package/scripts/vps-install.sh +39 -0
  504. package/skills/CONTRIBUTING.md +122 -0
  505. package/skills/COVERAGE.md +129 -0
  506. package/skills/INDEX.json +3443 -0
  507. package/skills/README.md +57 -0
  508. package/skills/design/animation-motion/SKILL.md +60 -0
  509. package/skills/design/color-and-typography/SKILL.md +60 -0
  510. package/skills/design/css-techniques/SKILL.md +58 -0
  511. package/skills/design/design-systems/SKILL.md +60 -0
  512. package/skills/design/gradients/SKILL.md +59 -0
  513. package/skills/design/graphic-design-basics/SKILL.md +55 -0
  514. package/skills/design/microinteractions/SKILL.md +58 -0
  515. package/skills/design/responsive-layout/SKILL.md +59 -0
  516. package/skills/design/ui-ux-principles/SKILL.md +58 -0
  517. package/skills/engineering/architecture/api-design-rest-graphql/SKILL.md +67 -0
  518. package/skills/engineering/architecture/caching-strategies/SKILL.md +59 -0
  519. package/skills/engineering/architecture/data-modeling/SKILL.md +64 -0
  520. package/skills/engineering/architecture/message-queues-async/SKILL.md +58 -0
  521. package/skills/engineering/architecture/scalability-reliability/SKILL.md +62 -0
  522. package/skills/engineering/architecture/software-architecture-patterns/SKILL.md +56 -0
  523. package/skills/engineering/architecture/system-design-fundamentals/SKILL.md +56 -0
  524. package/skills/engineering/backend/auth-and-authorization/SKILL.md +62 -0
  525. package/skills/engineering/backend/backend-fundamentals/SKILL.md +65 -0
  526. package/skills/engineering/backend/observability-logging/SKILL.md +60 -0
  527. package/skills/engineering/frontend/accessibility-wcag/SKILL.md +57 -0
  528. package/skills/engineering/frontend/frontend-architecture/SKILL.md +65 -0
  529. package/skills/engineering/frontend/rendering-strategies-ssr-csr/SKILL.md +60 -0
  530. package/skills/engineering/frontend/state-management/SKILL.md +69 -0
  531. package/skills/engineering/performance/backend-performance/SKILL.md +69 -0
  532. package/skills/engineering/performance/database-query-optimization/SKILL.md +64 -0
  533. package/skills/engineering/performance/profiling-and-benchmarking/SKILL.md +60 -0
  534. package/skills/engineering/performance/web-performance-core-vitals/SKILL.md +72 -0
  535. package/skills/engineering/practices/clean-code/SKILL.md +61 -0
  536. package/skills/engineering/practices/code-optimization/SKILL.md +60 -0
  537. package/skills/engineering/practices/code-review-practices/SKILL.md +58 -0
  538. package/skills/engineering/practices/git-workflow/SKILL.md +62 -0
  539. package/skills/engineering/practices/refactoring/SKILL.md +58 -0
  540. package/skills/engineering/security/appsec-fundamentals/SKILL.md +70 -0
  541. package/skills/engineering/security/dependency-supply-chain/SKILL.md +77 -0
  542. package/skills/engineering/security/owasp-asvs/SKILL.md +54 -0
  543. package/skills/engineering/security/owasp-top-10/SKILL.md +63 -0
  544. package/skills/engineering/security/secrets-management/SKILL.md +58 -0
  545. package/skills/engineering/security/secure-auth-sessions/SKILL.md +56 -0
  546. package/skills/engineering/testing/tdd-and-coverage/SKILL.md +62 -0
  547. package/skills/engineering/testing/testing-strategy-pyramid/SKILL.md +56 -0
  548. package/skills/engineering/testing/unit-integration-e2e/SKILL.md +75 -0
  549. package/skills/languages/c/SKILL.md +74 -0
  550. package/skills/languages/clojure/SKILL.md +73 -0
  551. package/skills/languages/cpp/SKILL.md +75 -0
  552. package/skills/languages/csharp/SKILL.md +75 -0
  553. package/skills/languages/dart/SKILL.md +82 -0
  554. package/skills/languages/elixir/SKILL.md +74 -0
  555. package/skills/languages/erlang/SKILL.md +76 -0
  556. package/skills/languages/go/SKILL.md +83 -0
  557. package/skills/languages/haskell/SKILL.md +70 -0
  558. package/skills/languages/java/SKILL.md +71 -0
  559. package/skills/languages/javascript/SKILL.md +62 -0
  560. package/skills/languages/kotlin/SKILL.md +68 -0
  561. package/skills/languages/lua/SKILL.md +79 -0
  562. package/skills/languages/objectivec/SKILL.md +83 -0
  563. package/skills/languages/php/SKILL.md +74 -0
  564. package/skills/languages/python/SKILL.md +68 -0
  565. package/skills/languages/r/SKILL.md +70 -0
  566. package/skills/languages/ruby/SKILL.md +67 -0
  567. package/skills/languages/rust/SKILL.md +72 -0
  568. package/skills/languages/scala/SKILL.md +73 -0
  569. package/skills/languages/swift/SKILL.md +73 -0
  570. package/skills/languages/typescript/SKILL.md +69 -0
  571. package/skills/meta/authoring-agent-skills/SKILL.md +73 -0
  572. package/skills/meta/progressive-disclosure/SKILL.md +65 -0
  573. package/skills/meta/skill-frontmatter-spec/SKILL.md +65 -0
  574. package/skills/process/adr-technical-decisions/SKILL.md +59 -0
  575. package/skills/process/app-planning/SKILL.md +63 -0
  576. package/skills/process/architecture-before-code/SKILL.md +52 -0
  577. package/skills/process/breaking-work-into-sprints/SKILL.md +53 -0
  578. package/skills/process/idea-to-product/SKILL.md +50 -0
  579. package/skills/process/mocks-and-screen-flows/SKILL.md +52 -0
  580. package/skills/process/prioritization-moscow-rice/SKILL.md +64 -0
  581. package/skills/process/problem-framing/SKILL.md +51 -0
  582. package/skills/process/product-discovery/SKILL.md +53 -0
  583. package/skills/process/readme-generation/SKILL.md +90 -0
  584. package/skills/process/requirements-to-specs/SKILL.md +53 -0
  585. package/skills/process/research-official-docs/SKILL.md +58 -0
  586. package/skills/process/review-code-perf-security/SKILL.md +65 -0
  587. package/skills/process/security-by-design/SKILL.md +68 -0
  588. package/skills/process/specs-to-issues/SKILL.md +53 -0
  589. package/skills/process/testing-before-done/SKILL.md +61 -0
  590. package/skills/process/validating-ux-navigation/SKILL.md +63 -0
  591. package/skills/references/ai-attachments-ui/SKILL.md +66 -0
  592. package/skills/references/ai-in-browser-webllm/SKILL.md +74 -0
  593. package/skills/references/ai-tool-ui-patterns/SKILL.md +63 -0
  594. package/skills/references/component-patterns-gallery/SKILL.md +62 -0
  595. package/skills/references/gradient-resources/SKILL.md +66 -0
  596. package/skills/references/react-component-libraries/SKILL.md +61 -0
  597. package/skills/references/saas-landing-patterns/SKILL.md +67 -0
  598. package/skills/references/shadcn-tailwind-theming/SKILL.md +74 -0
  599. package/skills/references/vercel-ai-sdk-elements/SKILL.md +66 -0
  600. package/skills/references/web-animation-codrops/SKILL.md +68 -0
  601. package/skills/stacks/aiml/jupyter/SKILL.md +68 -0
  602. package/skills/stacks/aiml/keras/SKILL.md +77 -0
  603. package/skills/stacks/aiml/numpy/SKILL.md +69 -0
  604. package/skills/stacks/aiml/pandas/SKILL.md +72 -0
  605. package/skills/stacks/aiml/pytorch/SKILL.md +77 -0
  606. package/skills/stacks/aiml/scikit-learn/SKILL.md +74 -0
  607. package/skills/stacks/aiml/tensorflow/SKILL.md +79 -0
  608. package/skills/stacks/auth/auth0/SKILL.md +63 -0
  609. package/skills/stacks/auth/authjs/SKILL.md +69 -0
  610. package/skills/stacks/auth/clerk/SKILL.md +72 -0
  611. package/skills/stacks/auth/keycloak/SKILL.md +63 -0
  612. package/skills/stacks/auth/lucia/SKILL.md +56 -0
  613. package/skills/stacks/auth/passport/SKILL.md +70 -0
  614. package/skills/stacks/auth/supabase-auth/SKILL.md +66 -0
  615. package/skills/stacks/baas/amplify/SKILL.md +71 -0
  616. package/skills/stacks/baas/appwrite/SKILL.md +79 -0
  617. package/skills/stacks/baas/firebase/SKILL.md +73 -0
  618. package/skills/stacks/baas/heroku/SKILL.md +71 -0
  619. package/skills/stacks/backend/actix/SKILL.md +77 -0
  620. package/skills/stacks/backend/adonisjs/SKILL.md +65 -0
  621. package/skills/stacks/backend/aspnet-core/SKILL.md +75 -0
  622. package/skills/stacks/backend/codeigniter/SKILL.md +76 -0
  623. package/skills/stacks/backend/django/SKILL.md +62 -0
  624. package/skills/stacks/backend/express/SKILL.md +65 -0
  625. package/skills/stacks/backend/fastapi/SKILL.md +64 -0
  626. package/skills/stacks/backend/fastify/SKILL.md +64 -0
  627. package/skills/stacks/backend/fiber/SKILL.md +68 -0
  628. package/skills/stacks/backend/flask/SKILL.md +71 -0
  629. package/skills/stacks/backend/gin/SKILL.md +68 -0
  630. package/skills/stacks/backend/graphql/SKILL.md +70 -0
  631. package/skills/stacks/backend/hono/SKILL.md +64 -0
  632. package/skills/stacks/backend/koa/SKILL.md +63 -0
  633. package/skills/stacks/backend/laravel/SKILL.md +73 -0
  634. package/skills/stacks/backend/nestjs/SKILL.md +70 -0
  635. package/skills/stacks/backend/nginx/SKILL.md +77 -0
  636. package/skills/stacks/backend/phoenix/SKILL.md +68 -0
  637. package/skills/stacks/backend/rails/SKILL.md +67 -0
  638. package/skills/stacks/backend/spring/SKILL.md +70 -0
  639. package/skills/stacks/backend/spring-boot/SKILL.md +70 -0
  640. package/skills/stacks/backend/symfony/SKILL.md +77 -0
  641. package/skills/stacks/container/containerd/SKILL.md +75 -0
  642. package/skills/stacks/container/docker/SKILL.md +90 -0
  643. package/skills/stacks/container/podman/SKILL.md +93 -0
  644. package/skills/stacks/database/cassandra/SKILL.md +74 -0
  645. package/skills/stacks/database/cockroachdb/SKILL.md +69 -0
  646. package/skills/stacks/database/dynamodb/SKILL.md +62 -0
  647. package/skills/stacks/database/mariadb/SKILL.md +71 -0
  648. package/skills/stacks/database/mongodb/SKILL.md +71 -0
  649. package/skills/stacks/database/mysql/SKILL.md +72 -0
  650. package/skills/stacks/database/neon/SKILL.md +68 -0
  651. package/skills/stacks/database/planetscale/SKILL.md +70 -0
  652. package/skills/stacks/database/postgresql/SKILL.md +81 -0
  653. package/skills/stacks/database/redis/SKILL.md +78 -0
  654. package/skills/stacks/database/sqlite/SKILL.md +70 -0
  655. package/skills/stacks/database/supabase/SKILL.md +79 -0
  656. package/skills/stacks/dataviz/chart-js/SKILL.md +72 -0
  657. package/skills/stacks/dataviz/d3/SKILL.md +77 -0
  658. package/skills/stacks/dataviz/grafana/SKILL.md +69 -0
  659. package/skills/stacks/dataviz/plotly/SKILL.md +71 -0
  660. package/skills/stacks/frontend/alpine/SKILL.md +75 -0
  661. package/skills/stacks/frontend/angular/SKILL.md +75 -0
  662. package/skills/stacks/frontend/backbone/SKILL.md +82 -0
  663. package/skills/stacks/frontend/ember/SKILL.md +85 -0
  664. package/skills/stacks/frontend/htmx/SKILL.md +73 -0
  665. package/skills/stacks/frontend/lit/SKILL.md +76 -0
  666. package/skills/stacks/frontend/preact/SKILL.md +74 -0
  667. package/skills/stacks/frontend/qwik/SKILL.md +65 -0
  668. package/skills/stacks/frontend/react/SKILL.md +77 -0
  669. package/skills/stacks/frontend/solidjs/SKILL.md +75 -0
  670. package/skills/stacks/frontend/svelte/SKILL.md +70 -0
  671. package/skills/stacks/frontend/vue/SKILL.md +69 -0
  672. package/skills/stacks/infra/ansible/SKILL.md +76 -0
  673. package/skills/stacks/infra/aws/SKILL.md +66 -0
  674. package/skills/stacks/infra/azure/SKILL.md +72 -0
  675. package/skills/stacks/infra/circleci/SKILL.md +78 -0
  676. package/skills/stacks/infra/cloudflare/SKILL.md +65 -0
  677. package/skills/stacks/infra/fly-io/SKILL.md +63 -0
  678. package/skills/stacks/infra/gcp/SKILL.md +66 -0
  679. package/skills/stacks/infra/jenkins/SKILL.md +73 -0
  680. package/skills/stacks/infra/kubernetes/SKILL.md +64 -0
  681. package/skills/stacks/infra/netlify/SKILL.md +60 -0
  682. package/skills/stacks/infra/railway/SKILL.md +63 -0
  683. package/skills/stacks/infra/tailscale/SKILL.md +65 -0
  684. package/skills/stacks/infra/terraform/SKILL.md +75 -0
  685. package/skills/stacks/infra/vagrant/SKILL.md +70 -0
  686. package/skills/stacks/infra/vercel/SKILL.md +60 -0
  687. package/skills/stacks/meta/astro/SKILL.md +64 -0
  688. package/skills/stacks/meta/docusaurus/SKILL.md +71 -0
  689. package/skills/stacks/meta/eleventy/SKILL.md +69 -0
  690. package/skills/stacks/meta/gatsby/SKILL.md +63 -0
  691. package/skills/stacks/meta/hugo/SKILL.md +73 -0
  692. package/skills/stacks/meta/jekyll/SKILL.md +70 -0
  693. package/skills/stacks/meta/nextjs/SKILL.md +62 -0
  694. package/skills/stacks/meta/nuxt/SKILL.md +66 -0
  695. package/skills/stacks/meta/remix/SKILL.md +67 -0
  696. package/skills/stacks/meta/sveltekit/SKILL.md +70 -0
  697. package/skills/stacks/meta/vite/SKILL.md +63 -0
  698. package/skills/stacks/mobile/android/SKILL.md +77 -0
  699. package/skills/stacks/mobile/flutter/SKILL.md +77 -0
  700. package/skills/stacks/mobile/ionic/SKILL.md +72 -0
  701. package/skills/stacks/mobile/nativescript/SKILL.md +71 -0
  702. package/skills/stacks/mobile/react-native/SKILL.md +75 -0
  703. package/skills/stacks/mobile/xamarin/SKILL.md +73 -0
  704. package/skills/stacks/orm/diesel/SKILL.md +72 -0
  705. package/skills/stacks/orm/django-orm/SKILL.md +58 -0
  706. package/skills/stacks/orm/drizzle/SKILL.md +67 -0
  707. package/skills/stacks/orm/gorm/SKILL.md +73 -0
  708. package/skills/stacks/orm/knex/SKILL.md +64 -0
  709. package/skills/stacks/orm/mongoose/SKILL.md +64 -0
  710. package/skills/stacks/orm/prisma/SKILL.md +64 -0
  711. package/skills/stacks/orm/sequelize/SKILL.md +65 -0
  712. package/skills/stacks/orm/sqlalchemy/SKILL.md +71 -0
  713. package/skills/stacks/orm/typeorm/SKILL.md +70 -0
  714. package/skills/stacks/queue/bullmq/SKILL.md +69 -0
  715. package/skills/stacks/queue/celery/SKILL.md +68 -0
  716. package/skills/stacks/queue/kafka/SKILL.md +66 -0
  717. package/skills/stacks/queue/nats/SKILL.md +66 -0
  718. package/skills/stacks/queue/rabbitmq/SKILL.md +64 -0
  719. package/skills/stacks/queue/redis/SKILL.md +66 -0
  720. package/skills/stacks/runtime/beam/SKILL.md +72 -0
  721. package/skills/stacks/runtime/bun/SKILL.md +80 -0
  722. package/skills/stacks/runtime/deno/SKILL.md +74 -0
  723. package/skills/stacks/runtime/dotnet/SKILL.md +64 -0
  724. package/skills/stacks/runtime/jvm/SKILL.md +66 -0
  725. package/skills/stacks/runtime/node/SKILL.md +70 -0
  726. package/skills/stacks/runtime/pypy/SKILL.md +69 -0
  727. package/skills/stacks/runtime/python3/SKILL.md +70 -0
  728. package/skills/stacks/styling/bootstrap/SKILL.md +74 -0
  729. package/skills/stacks/styling/bulma/SKILL.md +80 -0
  730. package/skills/stacks/styling/chakra-ui/SKILL.md +61 -0
  731. package/skills/stacks/styling/css-modules/SKILL.md +54 -0
  732. package/skills/stacks/styling/mui/SKILL.md +60 -0
  733. package/skills/stacks/styling/sass/SKILL.md +63 -0
  734. package/skills/stacks/styling/shadcn-ui/SKILL.md +58 -0
  735. package/skills/stacks/styling/styled-components/SKILL.md +62 -0
  736. package/skills/stacks/styling/tailwind/SKILL.md +59 -0
  737. package/skills/stacks/styling/unocss/SKILL.md +64 -0
  738. package/skills/stacks/styling/vanilla-extract/SKILL.md +64 -0
  739. package/skills/stacks/styling/vuetify/SKILL.md +89 -0
  740. package/skills/stacks/testing/cypress/SKILL.md +68 -0
  741. package/skills/stacks/testing/jasmine/SKILL.md +67 -0
  742. package/skills/stacks/testing/jest/SKILL.md +67 -0
  743. package/skills/stacks/testing/mocha/SKILL.md +71 -0
  744. package/skills/stacks/testing/playwright/SKILL.md +68 -0
  745. package/skills/stacks/testing/puppeteer/SKILL.md +70 -0
  746. package/skills/stacks/testing/selenium/SKILL.md +70 -0
  747. package/skills/stacks/testing/vitest/SKILL.md +68 -0
@@ -0,0 +1,301 @@
1
+ [โ† Docs index](./README.md) ยท [๐Ÿ‡ง๐Ÿ‡ท Portuguรชs](../pt/UPDATE.md) ยท [โœฆ Constella](../../README.md)
2
+
3
+ # ๐Ÿš€ Update โ€” relaunching the central ship
4
+
5
+ ![](../assets/divider-orbit.svg)
6
+
7
+ Constella checks npm for a newer release, shows you the changelog, and applies the update **the way that fits how this process is running** โ€” global install, npx, dev source, Docker VPS, or a portable USB drive. It always backs up your `.env` and database first, and it never fabricates a "success" it didn't earn.
8
+
9
+ ---
10
+
11
+ ## โœฆ When to use
12
+
13
+ - A new Constella version is published and you want to pull it down.
14
+ - You want to read the changelog before upgrading (the "What's new" panel).
15
+ - You want to confirm you are already on the latest version (`constella update --check`).
16
+ - You need the **exact command** for your environment (dev / npx / VPS / portable), because some contexts can't be updated from inside the running web server.
17
+
18
+ ---
19
+
20
+ ## ๐ŸŒŒ How it works
21
+
22
+ Two halves cooperate:
23
+
24
+ | Half | File | Responsibility |
25
+ | --- | --- | --- |
26
+ | **Check** | `src/server/update-check.ts` | Ask the npm registry for `latest`, compare versions, fetch the changelog. Cached, fails silent. |
27
+ | **Apply** | `src/server/update-run.ts` | Detect the run context, back up local config, then either auto-run (global) or hand back the exact command. |
28
+ | **Context** | `src/lib/run-context.ts` | `detectRunContext()` โ†’ `dev \| global \| npx \| vps \| portable`. |
29
+ | **UI** | `src/components/modules/update-screen.tsx` | Versions, context hint, "Update now", changelog, live poll of the background updater. |
30
+ | **Actions** | `src/server/actions/update-actions.ts` | Server actions the UI calls: `getUpdateStatus`, `getUpdateContext`, `runUpdate`, `pollUpdateResult`. |
31
+ | **CLI** | `bin/constella.mjs` (`update` subcommand) | Standalone check/apply that runs **outside** the web server. |
32
+
33
+ The central rule (from the code comment in `update-run.ts`): *only the `global` npm install auto-runs* โ€” every other context returns the precise command for you to run, because executing those from the web server is environment-specific.
34
+
35
+ ---
36
+
37
+ ## ๐Ÿ›ฐ๏ธ Main flow
38
+
39
+ ```mermaid
40
+ flowchart TD
41
+ A["Open /update or run `constella update`"] --> B["checkForUpdate()"]
42
+ B --> C{"npm registry reachable?"}
43
+ C -- "no" --> D["latest = null ยท no update ยท fail silent"]
44
+ C -- "yes" --> E["compare latest vs current (isNewer)"]
45
+ E -- "not newer" --> F["Already up to date"]
46
+ E -- "newer" --> G["fetch CHANGELOG ยท sliceChangelog(latest)"]
47
+ G --> H["startUpdate() โ†’ detectRunContext()"]
48
+ H --> I["backupBeforeUpdate() โ€” copy .env + db"]
49
+ I --> J{"context?"}
50
+ J -- "global" --> K["spawn detached npm i -g ยท write last-update.json"]
51
+ J -- "dev / npx / vps / portable" --> L["return exact command (no auto-run)"]
52
+ K --> M["UI polls getUpdateResult() every 3s"]
53
+ M --> N["running โ†’ done / error ยท prompt restart"]
54
+ ```
55
+
56
+ ---
57
+
58
+ ## ๐Ÿช Key concepts
59
+
60
+ ### Version check (`checkForUpdate`)
61
+
62
+ - Reads the **installed** version via `currentVersion()` (`src/lib/version.ts`): `CONSTELLA_VERSION` env (set by the CLI) โ†’ launch-dir `package.json` โ†’ `"0.0.0"`.
63
+ - Fetches `https://registry.npmjs.org/constella/latest` for the published `version`.
64
+ - `isNewer(latest, current)` does a numeric 3-part semver compare (pre-release suffixes stripped). `bumpType` classifies the jump as `major | minor | patch`.
65
+ - Returns an `UpdateInfo`: `{ current, latest, updateAvailable, type, command, changelog }`. The default `command` is `npm install -g constella@latest`.
66
+ - **6-hour in-memory cache** (`TTL = 6 * 60 * 60 * 1000`) so client polling never hammers the registry. `checkForUpdate(true)` forces a refresh.
67
+ - **Fails closed/silent**: any offline / unpublished / timeout (3 s `AbortController`) path yields `latest: null`, `updateAvailable: false`. It never throws and never fabricates "updated".
68
+
69
+ ### Changelog fetch
70
+
71
+ - Only fetched when `updateAvailable` is true.
72
+ - Pulls `https://raw.githubusercontent.com/gabriel7silva/constella/main/CHANGELOG.md`.
73
+ - `sliceChangelog(md, version)` extracts the `## [x.y.z] โ€ฆ` section up to the next `##` heading; if the exact version heading isn't found, it falls back to the first section in the file.
74
+ - Rendered in the UI's "What's new in v{version}" card via `react-markdown` + `remark-gfm`.
75
+
76
+ ### Run-context detection (`detectRunContext`)
77
+
78
+ Order matters โ€” the first match wins:
79
+
80
+ | Order | Test | Context |
81
+ | --- | --- | --- |
82
+ | 1 | `isDevMode()` (running from source) | `dev` |
83
+ | 2 | `getRunMode() === "vps"` **or** `/.dockerenv` exists | `vps` |
84
+ | 3 | `getRunMode() === "portable"` | `portable` |
85
+ | 4 | `launchDir()` path contains `/_npx/` (npm's npx cache) | `npx` |
86
+ | 5 | (fallback) | `global` |
87
+
88
+ `isDevMode()` (`src/lib/build-mode.ts`): `CONSTELLA_PUBLIC=1` โ†’ `false`; else `CONSTELLA_DEV=1` โ†’ `true`; else `NODE_ENV !== "production"`. A CLI launch sets `CONSTELLA_PUBLIC=1`, so installed runs are never mistaken for dev.
89
+
90
+ ### Backup before update (`backupBeforeUpdate`)
91
+
92
+ - Best-effort, runs before any update in `startUpdate()`.
93
+ - Creates `<HOME>/backups/<timestamp>/` (timestamp = ISO with `:`/`.` replaced by `-`).
94
+ - Copies, if present: `.env`, `constella.db`, `constella.db-wal`, `constella.db-shm`.
95
+ - Returns the backup directory path (surfaced in the UI as "Backup saved: โ€ฆ"). Any copy failure is skipped silently โ€” backup never blocks the update.
96
+ - `<HOME>` resolves via `constellaHome()`: `CONSTELLA_HOME` (resolved against the launch dir) or `~/.constella`.
97
+
98
+ ### Context-aware apply (`startUpdate`)
99
+
100
+ | Context | `ok` | Auto-runs? | Command returned | `needsRestart` |
101
+ | --- | --- | --- | --- | --- |
102
+ | `global` | `true` | โœ… detached `npm install -g constella@latest` | `npm install -g constella@latest` | โœ… |
103
+ | `dev` | `false` | โŒ | `git pull && pnpm install && pnpm build` | โ€” |
104
+ | `npx` | `false` | โŒ | `npx constella@latest` | โ€” |
105
+ | `vps` | `false` | โŒ | `docker compose pull && docker compose up -d` | โœ… |
106
+ | `portable` | `false` | โŒ | `npm install -g constella@latest` (after free-space/backup check) | โœ… |
107
+
108
+ > If `updateAvailable` is false, `startUpdate()` short-circuits with `ok: true, message: "Already up to date."` โ€” no backup, no command.
109
+
110
+ ### The detached global updater + result polling
111
+
112
+ Because a global npm update can't reliably finish before the web server is replaced, `startUpdate()` for `global`:
113
+
114
+ 1. Writes `<HOME>/backups/last-update.json` with `{ status: "running", to, at }`.
115
+ 2. Spawns a **detached** `node -e` one-liner (no separate script file โ€” works even from a global install) that runs `npm install -g constella@latest` and rewrites the result file with `status: "done" | "error"`, the npm exit `code`, and `at`.
116
+ 3. `child.unref()`s so the updater outlives the request.
117
+ 4. Returns `{ ok: true, started: true, needsRestart: true, โ€ฆ }`.
118
+
119
+ The UI (`update-screen.tsx`) then polls `pollUpdateResult()` โ†’ `getUpdateResult()` every **3 seconds**, reading `last-update.json`. Statuses: `idle` (no file), `running`, `done`, `error`. On `done`/`error` it stops polling and prompts a restart (or shows the rollback hint).
120
+
121
+ ---
122
+
123
+ ## ๐ŸŒ  Tables
124
+
125
+ ### `UpdateInfo` (returned by `checkForUpdate`)
126
+
127
+ | Field | Type | Meaning |
128
+ | --- | --- | --- |
129
+ | `current` | `string` | Installed version. |
130
+ | `latest` | `string \| null` | npm `latest`, or `null` when the registry is unreachable. |
131
+ | `updateAvailable` | `boolean` | `latest` exists and is newer. |
132
+ | `type` | `"major" \| "minor" \| "patch" \| null` | Size of the version jump. |
133
+ | `command` | `string` | Default upgrade command. |
134
+ | `changelog` | `string \| null` | Sliced changelog section for `latest`. |
135
+
136
+ ### `UpdateResult` (returned by `startUpdate` / `runUpdate`)
137
+
138
+ | Field | Type | Meaning |
139
+ | --- | --- | --- |
140
+ | `ok` | `boolean` | Operation succeeded (global started, or already current). |
141
+ | `started` | `boolean?` | The detached global updater was launched โ†’ UI should poll. |
142
+ | `context` | `string` | Detected run context. |
143
+ | `command` | `string` | The command for this context. |
144
+ | `message` | `string` | Human-readable status / instruction. |
145
+ | `backupDir` | `string?` | Where `.env`/db were copied. |
146
+ | `needsRestart` | `boolean?` | Restart Constella to load the new version. |
147
+
148
+ ### `last-update.json` (background updater state)
149
+
150
+ | Field | Type | Meaning |
151
+ | --- | --- | --- |
152
+ | `status` | `"idle" \| "running" \| "done" \| "error"` | Updater state (`idle` = file absent). |
153
+ | `to` | `string` | Target version. |
154
+ | `code` | `number` | npm exit code (on completion). |
155
+ | `at` | `string` | ISO timestamp. |
156
+
157
+ ---
158
+
159
+ ## ๐Ÿ•ณ๏ธ Update flow per context
160
+
161
+ ```mermaid
162
+ flowchart LR
163
+ X["detectRunContext()"] --> G["global"]
164
+ X --> D["dev"]
165
+ X --> N["npx"]
166
+ X --> V["vps"]
167
+ X --> P["portable"]
168
+
169
+ G --> G1["detached npm i -g constella@latest"] --> G2["poll last-update.json โ†’ restart"]
170
+ D --> D1["git pull && pnpm install && pnpm build"]
171
+ N --> N1["npx constella@latest"]
172
+ V --> V1["docker compose pull && docker compose up -d"]
173
+ P --> P1["check free space + back up drive, then npm i -g constella@latest"]
174
+ ```
175
+
176
+ ---
177
+
178
+ ## โœฆ Step-by-step
179
+
180
+ ### In the app
181
+
182
+ 1. Open the **Update** module (`/update`). The page calls `getUpdateStatus()` and `getUpdateContext()`.
183
+ 2. Read the **Installed โ†’ Latest** versions and the bump pill (`major`/`minor`/`patch`).
184
+ 3. The context line tells you how this process runs (e.g. "Global npm install โ€” can update in place.").
185
+ 4. If an update is available, review **"What's new in vโ€ฆ"**.
186
+ 5. Click **Update now** โ†’ `runUpdate()` (auth-gated via `requireWorkspace()`).
187
+ - **global** โ†’ background updater starts; watch the live poll (`running โ†’ installed`), then restart Constella.
188
+ - **dev / npx / vps / portable** โ†’ copy the exact command shown and run it in your terminal.
189
+ 6. The **Backup saved** line shows where your `.env`/db were copied.
190
+
191
+ ### From the CLI
192
+
193
+ ```bash
194
+ # Just check (no apply) โ€” prints "Constella x.y.z ยท latest a.b.c"
195
+ constella update --check
196
+
197
+ # Check + apply (global install path)
198
+ constella update
199
+ ```
200
+
201
+ The CLI `update` subcommand (`bin/constella.mjs`):
202
+ - Reads the local version from the package's own `package.json`, fetches npm `latest` (4 s timeout).
203
+ - `--check` โ†’ print and exit.
204
+ - If the registry is unreachable, or `latest === current`, it says so and exits 0.
205
+ - If it detects **source** (`.git` + `src/` in CWD), it tells you to `git pull && pnpm install && pnpm build` and exits.
206
+ - Otherwise it runs `npm install -g constella@latest` (uses `npm.cmd` on Windows, no shell) with inherited stdio, then asks you to restart.
207
+
208
+ ---
209
+
210
+ ## ๐Ÿ›ฐ๏ธ Examples
211
+
212
+ **Already current (offline-safe):**
213
+ ```text
214
+ Constella 0.1.0 ยท (npm registry unavailable)
215
+ Couldn't reach the npm registry โ€” try again later.
216
+ ```
217
+
218
+ **Global update from the UI** โ€” `runUpdate()` returns:
219
+ ```json
220
+ {
221
+ "ok": true,
222
+ "started": true,
223
+ "needsRestart": true,
224
+ "context": "global",
225
+ "command": "npm install -g constella@latest",
226
+ "backupDir": "/home/you/.constella/backups/2026-06-22T10-15-03-000Z",
227
+ "message": "Updating to 0.2.0 in the background โ€” restart Constella when it completes."
228
+ }
229
+ ```
230
+ โ€ฆand the poll reads `<HOME>/backups/last-update.json`:
231
+ ```json
232
+ { "status": "done", "to": "0.2.0", "code": 0, "at": "2026-06-22T10:15:41.220Z" }
233
+ ```
234
+
235
+ **VPS** โ€” no auto-run; you get:
236
+ ```json
237
+ { "ok": false, "context": "vps", "command": "docker compose pull && docker compose up -d", "needsRestart": true,
238
+ "message": "On a VPS, update with Docker: docker compose pull && docker compose up -d" }
239
+ ```
240
+
241
+ ---
242
+
243
+ ## ๐ŸŒŒ Possible states
244
+
245
+ | State | How it shows | Source |
246
+ | --- | --- | --- |
247
+ | Up to date | "You're on the latest version." | `updateAvailable === false` |
248
+ | Update available | Version pill + "Update now" | `updateAvailable === true` |
249
+ | Registry unreachable | `latest = โ€”`, no button | `latest === null` |
250
+ | Updating (global) | "Updatingโ€ฆ" + spinner | `started === true`, `busy` |
251
+ | Poll: running | "Updater: runningโ€ฆ" | `last-update.json.status === "running"` |
252
+ | Poll: done | "โœ“ installed โ€” restart Constella to load it." | `status === "done"` |
253
+ | Poll: error | "โœ– failed โ€” see rollback below." + rollback hint | `status === "error"` |
254
+ | Manual command | Command shown in a `<pre>`; no auto-run | `dev / npx / vps / portable` |
255
+
256
+ ---
257
+
258
+ ## ๐Ÿช Related integrations
259
+
260
+ - **[VPS_MODE](./VPS_MODE.md)** โ€” the Docker `docker compose pull && up -d` path.
261
+ - **[PORTABLE_MODE](./PORTABLE_MODE.md)** โ€” USB drive, free-space checks before updating.
262
+ - **[INSTALLATION](./INSTALLATION.md)** / **[PUBLISHING](./PUBLISHING.md)** โ€” how versions land on npm.
263
+ - **[START_MODE](./START_MODE.md)** / **[AUTH_MODE](./AUTH_MODE.md)** โ€” run modes that feed `detectRunContext()`.
264
+ - **[CONFIGURATION](./CONFIGURATION.md)** โ€” env vars (`CONSTELLA_HOME`, `CONSTELLA_VERSION`, `CONSTELLA_PUBLIC`).
265
+
266
+ ---
267
+
268
+ ## ๐Ÿ•ณ๏ธ Security
269
+
270
+ - **Auth-gated apply.** `runUpdate()` calls `requireWorkspace()` before doing anything.
271
+ - **Backup first, always.** `.env` + the SQLite DB (and WAL/SHM) are copied to `<HOME>/backups/<timestamp>/` before any update path.
272
+ - **No shell injection in the CLI.** The global install spawns `npm`/`npm.cmd` directly with an argv array โ€” no shell string interpolation.
273
+ - **Fail-closed checks.** The registry/changelog fetches use a 3โ€“4 s `AbortController` timeout and swallow errors, so a hostile or dead network can't hang or crash the update screen โ€” it just reports "no update".
274
+ - **Honest results.** The detached updater writes a real npm exit code into `last-update.json`; the UI reflects `done`/`error` truthfully and never claims success on failure.
275
+
276
+ ---
277
+
278
+ ## ๐ŸŒ  Troubleshooting
279
+
280
+ | Symptom | Likely cause | Fix |
281
+ | --- | --- | --- |
282
+ | "registry unavailable" | Offline / npm down / firewall | Retry later; check connectivity to `registry.npmjs.org`. |
283
+ | Latest shown but stale | 6 h cache | Force a fresh check: `checkForUpdate(true)` (UI re-fetch) or `constella update --check`. |
284
+ | Wrong context detected | Env mismatch | Verify `CONSTELLA_PUBLIC`/`CONSTELLA_DEV`, `CONSTELLA_RUN_MODE`, and `/.dockerenv` presence. |
285
+ | Global poll stuck on "running" | Detached `npm` still installing or blocked | Wait; if it never resolves, run `npm install -g constella@latest` manually. |
286
+ | Poll: error | npm exited non-zero (permissions?) | Re-run with elevated permissions; rollback: `npm i -g constella@<current>`, then restore the backup. |
287
+ | Version still old after restart | Old process still running | Fully stop and relaunch Constella so `CONSTELLA_VERSION` re-reads. |
288
+ | Dev install won't auto-update | Intentional | Run `git pull && pnpm install && pnpm build` (or `next build`). |
289
+
290
+ ---
291
+
292
+ ## โœฆ Related links
293
+
294
+ - [INSTALLATION](./INSTALLATION.md)
295
+ - [CONFIGURATION](./CONFIGURATION.md)
296
+ - [VPS_MODE](./VPS_MODE.md)
297
+ - [PORTABLE_MODE](./PORTABLE_MODE.md)
298
+ - [START_MODE](./START_MODE.md)
299
+ - [PUBLISHING](./PUBLISHING.md)
300
+ - [ARCHITECTURE](./ARCHITECTURE.md)
301
+ - [TROUBLESHOOTING](./TROUBLESHOOTING.md)
@@ -0,0 +1,334 @@
1
+ [โ† Docs index](./README.md) ยท [๐Ÿ‡ง๐Ÿ‡ท Portuguรชs](../pt/VPS_MODE.md) ยท [โœฆ Constella](../../README.md)
2
+
3
+ # VPS Mode ๐Ÿ›ฐ๏ธ
4
+
5
+ ![](../assets/divider-orbit.svg)
6
+
7
+ Run the central ship on a remote server. **VPS mode** boots Constella inside Docker on a VPS, binds the web server to `0.0.0.0`, and exposes it **only** over your Tailscale tailnet โ€” a private orbit reachable from any device you've authorized, and from nowhere else.
8
+
9
+ ---
10
+
11
+ ## When to use ๐ŸŒŒ
12
+
13
+ Pick VPS mode when you want a **24/7 control plane** that keeps planning, building, reviewing and shipping while your laptop is closed โ€” without putting the dashboard on the open internet.
14
+
15
+ | You wantโ€ฆ | VPS mode gives you |
16
+ | --- | --- |
17
+ | The agent constellation always running | A long-lived server process (web + worker), supervised + auto-restarted |
18
+ | Private remote access | Bound to `0.0.0.0` but reachable **only on your Tailscale tailnet** |
19
+ | Real authentication | Email + password required every session (`requiresLogin: true`) |
20
+ | A reproducible install | A `Dockerfile` + `docker-compose.yml` + a one-shot `vps-install.sh` bootstrap |
21
+ | Hardened-by-default execution | Container jail + agent CLI in `acceptEdits` (edits-only) mode |
22
+
23
+ If you just want a local always-on instance on your own machine, use [START_MODE](./START_MODE.md) or [AUTH_MODE](./AUTH_MODE.md). For a drive-you-carry instance, see [PORTABLE_MODE](./PORTABLE_MODE.md).
24
+
25
+ ---
26
+
27
+ ## How it works ๐Ÿช
28
+
29
+ VPS is one of four **run modes** declared in `src/lib/run-mode.ts`:
30
+
31
+ ```ts
32
+ export type RunMode = "start" | "auth" | "vps" | "portable";
33
+
34
+ export const RUN_MODES = {
35
+ // โ€ฆ
36
+ vps: { label: "VPS", requiresLogin: true,
37
+ note: "Access over your Tailscale tailnet; runs in Docker." },
38
+ };
39
+ ```
40
+
41
+ The mode is chosen **at launch**, never in the UI (a CLI launch sets `CONSTELLA_PUBLIC=1`, which hides the in-app mode picker). It is resolved in `bin/constella.mjs` from the `--vps` flag (with legacy `--bind tailnet` mapping to the same mode), then exported as `CONSTELLA_RUN_MODE=vps` and persisted onto the organization row (`organization.run_mode`) at onboarding via `getRunMode()`.
42
+
43
+ Three things make VPS distinct from the other modes:
44
+
45
+ 1. **Bind address `0.0.0.0`.** In `bin/constella.mjs`, `host = --host || (vps|portable ? "0.0.0.0" : "127.0.0.1")`. The server listens on all interfaces so the Tailscale layer can reach it.
46
+ 2. **Login is enforced.** `requiresLogin()` returns `true`, and `src/proxy.ts` redirects every unauthenticated request to `/login` (only `start` mode skips this).
47
+ 3. **Run context = `vps`.** `detectRunContext()` in `src/lib/run-context.ts` returns `"vps"` when `getRunMode() === "vps"` **or** when `/.dockerenv` exists โ€” so the in-app Update flow knows to use `docker compose` rather than `npm`/`git`. See [UPDATE](./UPDATE.md).
48
+
49
+ > ๐Ÿ›ฐ๏ธ **Tailscale is assumed externally configured.** Constella does not manage your tailnet, ACLs or auth keys. The bootstrap script and compose file *join* a tailnet for you, but the tailnet itself (devices, MagicDNS, ACLs) is yours to own at <https://login.tailscale.com>. Constella only binds `0.0.0.0`; the tailnet is what keeps that bind private.
50
+
51
+ ---
52
+
53
+ ## Main flow ๐ŸŒ 
54
+
55
+ ```mermaid
56
+ flowchart TD
57
+ A["operator: bash scripts/vps-install.sh"] --> B["install Docker"]
58
+ B --> C["install Tailscale + tailscale up"]
59
+ C --> D["TS_AUTHKEY written to .env"]
60
+ D --> E["docker compose up -d --build"]
61
+ E --> F["tailscale sidecar joins tailnet"]
62
+ E --> G["constella container builds + boots"]
63
+ G --> H["bin/constella.mjs --vps --host 0.0.0.0 --port 3000"]
64
+ H --> I["generate/persist secrets in /data/.env (chmod 600)"]
65
+ H --> J["drizzle migrate against /data/constella.db"]
66
+ H --> K["supervise: next start + worker"]
67
+ F & K --> L["reachable at http://<tailscale-ip>:3000"]
68
+ ```
69
+
70
+ ---
71
+
72
+ ## Key concepts โœฆ
73
+
74
+ ### The two containers
75
+
76
+ `docker-compose.yml` runs **two services that share one network namespace**:
77
+
78
+ - **`tailscale`** โ€” the official `tailscale/tailscale` image, acting as a sidecar. It owns `/dev/net/tun`, holds `net_admin` + `sys_module` caps, joins the tailnet headlessly with `TS_AUTHKEY`, and persists node state in the `tailscale-state` volume.
79
+ - **`constella`** โ€” built from the `Dockerfile`, joined to the sidecar's network with `network_mode: service:tailscale`. Because they share the namespace, Constella is reachable **only at the Tailscale IP** on port 3000 โ€” never on the host's public interfaces.
80
+
81
+ ### Runtime root on a volume
82
+
83
+ Inside the container, `CONSTELLA_HOME=/data` (a named Docker volume, `constella-data`). All runtime state lives there:
84
+
85
+ - `/data/constella.db` โ€” the SQLite database (`DATABASE_URL=file:/data/constella.db`).
86
+ - `/data/.env` โ€” generated secrets (`chmod 600`), survives restarts because the volume is stable.
87
+ - `/data/organizations/<orgId>/workspace/` โ€” the agent workspace tree (the FS jail). See [ARCHITECTURE](./ARCHITECTURE.md).
88
+
89
+ ### Worker over loopback (even on `0.0.0.0`)
90
+
91
+ The dual-process model (web + worker) is preserved in VPS mode. The launcher spawns `bin/worker.mjs` with `CONSTELLA_BASE_URL=http://127.0.0.1:<port>` โ€” **loopback**, even though the web server binds `0.0.0.0`. This is a deliberate **SSRF / secret-exfil guard**: the worker attaches the privileged `x-worker-secret` header to every call, so it refuses any non-loopback base URL:
92
+
93
+ ```js
94
+ const isLoopback = ["localhost", "127.0.0.1", "::1", "[::1]"].includes(baseHost);
95
+ if (!isLoopback && !ALLOW_REMOTE) {
96
+ console.error(`โœ– Refusing to send the worker secret to a non-loopback host (${baseHost}). โ€ฆ`);
97
+ process.exit(1);
98
+ }
99
+ ```
100
+
101
+ A genuinely remote worker must explicitly opt in with `CONSTELLA_ALLOW_REMOTE_WORKER_BASE_URL=1` (and is warned if the URL is plain `http://`). See [ARCHITECTURE](./ARCHITECTURE.md).
102
+
103
+ ### Secrets are mandatory
104
+
105
+ `bin/constella.mjs` generates and persists **three** secrets into `/data/.env` on first boot (and reuses them after):
106
+
107
+ - `BETTER_AUTH_SECRET` โ€” `next start` runs under `NODE_ENV=production`, where better-auth **throws** on its default key; a network mode must have a real one.
108
+ - `CONSTELLA_VAULT_KEY` โ€” AES-256-GCM key for the provider/credential vault. See [SECURITY](./SECURITY.md).
109
+ - `CONSTELLA_WORKER_SECRET` โ€” the worker fails **closed** without it (`x-worker-secret`).
110
+
111
+ The launcher prints only `โ€ข Secrets ready (stored in <HOME>/.env, never printed).` โ€” values are never logged.
112
+
113
+ ---
114
+
115
+ ## Tables ๐Ÿ—ƒ๏ธ
116
+
117
+ ### Run-mode comparison
118
+
119
+ | Property | `start` | `auth` | `vps` | `portable` |
120
+ | --- | --- | --- | --- | --- |
121
+ | `requiresLogin` | `false` | `true` | `true` | `true` |
122
+ | Default bind host | `127.0.0.1` | `127.0.0.1` | **`0.0.0.0`** | `0.0.0.0` |
123
+ | Network exposure | localhost | localhost | **Tailscale tailnet** | LAN (USB host) |
124
+ | Typical runtime | local | local | **Docker** | USB drive |
125
+ | Agent CLI permission | `bypassPermissions` (full) | `acceptEdits` (jailed) | **`acceptEdits` (jailed)** | `acceptEdits` (jailed) |
126
+ | `detectRunContext()` | `dev`/`global`/`npx` | `dev`/`global`/`npx` | **`vps`** | `portable` |
127
+
128
+ ### VPS environment variables
129
+
130
+ | Variable | Set by | Value | Purpose |
131
+ | --- | --- | --- | --- |
132
+ | `CONSTELLA_RUN_MODE` | launcher / Dockerfile / compose | `vps` | Selects VPS behavior, login enforcement |
133
+ | `CONSTELLA_PUBLIC` | launcher / Dockerfile / compose | `1` | Marks a public runtime; hides the UI mode picker |
134
+ | `CONSTELLA_HOME` | Dockerfile / compose | `/data` | Runtime root (a Docker volume) |
135
+ | `DATABASE_URL` | launcher | `file:/data/constella.db` | SQLite path under the volume |
136
+ | `BETTER_AUTH_SECRET` | launcher (generated) | random base64url | Session signing key |
137
+ | `CONSTELLA_VAULT_KEY` | launcher (generated) | random base64 | Vault encryption key |
138
+ | `CONSTELLA_WORKER_SECRET` | launcher (generated) | random base64url | Worker `x-worker-secret` |
139
+ | `CONSTELLA_BASE_URL` | launcher (worker child) | `http://127.0.0.1:3000` | Loopback only |
140
+ | `NODE_ENV` | Dockerfile | `production` | Production boot |
141
+ | `TS_AUTHKEY` | `.env` / compose | `tskey-auth-โ€ฆ` | Tailscale sidecar join key |
142
+ | `CONSTELLA_AGENT_FULL_ACCESS` | operator (optional) | `1` / `0` | Override jailed/full agent exec |
143
+ | `CONSTELLA_ALLOW_REMOTE_WORKER_BASE_URL` | operator (optional) | `1` | Allow a non-loopback worker |
144
+ | `CONSTELLA_WEB_HEAP_MB` | operator (optional) | integer | Raise the web V8 heap cap |
145
+
146
+ ### Docker compose services
147
+
148
+ | Service | Image / build | Network | Volumes | Notable caps |
149
+ | --- | --- | --- | --- | --- |
150
+ | `tailscale` | `tailscale/tailscale:latest` | own namespace | `tailscale-state:/var/lib/tailscale` | `net_admin`, `sys_module`, `/dev/net/tun` |
151
+ | `constella` | `build: .` (Dockerfile) | `service:tailscale` | `constella-data:/data` | runs as unprivileged `node` (uid 1000) |
152
+
153
+ ---
154
+
155
+ ## Topology diagram ๐ŸŒŒ
156
+
157
+ ```mermaid
158
+ flowchart LR
159
+ subgraph TN["Your Tailscale tailnet (private orbit)"]
160
+ direction LR
161
+ L["Laptop"]
162
+ P["Phone"]
163
+ subgraph VPS["VPS host"]
164
+ subgraph NS["shared net namespace"]
165
+ TS["tailscale sidecar\n(net_admin, /dev/net/tun)"]
166
+ C["constella container\n0.0.0.0:3000\nuid 1000 'node'"]
167
+ end
168
+ V1[("/data volume\nconstella.db + .env")]
169
+ V2[("tailscale-state\nvolume")]
170
+ end
171
+ end
172
+ NET(["public internet"]) -. blocked .-> VPS
173
+ L -->|"https tailnet"| TS
174
+ P -->|"https tailnet"| TS
175
+ TS --> C
176
+ C --- V1
177
+ TS --- V2
178
+
179
+ subgraph IN["inside the constella container"]
180
+ W["next start (web)\n0.0.0.0:3000"]
181
+ K["worker.mjs\nโ†’ 127.0.0.1:3000\nx-worker-secret"]
182
+ K -->|loopback only| W
183
+ end
184
+ ```
185
+
186
+ ---
187
+
188
+ ## Step-by-step ๐Ÿš€
189
+
190
+ ### 1. Provision a VPS
191
+
192
+ A fresh Ubuntu Server is the assumed target (the bootstrap installs Docker via `get.docker.com` and Tailscale via `tailscale.com/install.sh`).
193
+
194
+ ### 2. Run the bootstrap
195
+
196
+ ```bash
197
+ bash scripts/vps-install.sh
198
+ ```
199
+
200
+ `scripts/vps-install.sh` does, in order:
201
+
202
+ 1. **Install Docker** if `docker` is not on `PATH` (`curl -fsSL https://get.docker.com | sh`).
203
+ 2. **Install Tailscale** if absent (`curl -fsSL https://tailscale.com/install.sh | sh`).
204
+ 3. **Join the tailnet** with `sudo tailscale up` (prints a browser auth URL if needed).
205
+ 4. **Ask for a `TS_AUTHKEY`** (so the *container* sidecar can join headlessly) and append it to `.env`.
206
+ 5. **Build + start** the stack: `sudo docker compose up -d --build`.
207
+ 6. **Print the reach URL**: `http://<tailscale-ip>:3000`.
208
+
209
+ ### 3. Create the Tailscale auth key
210
+
211
+ When prompted, create a key at <https://login.tailscale.com/admin/settings/keys> and paste the `tskey-auth-โ€ฆ` value. It is written to `.env` as `TS_AUTHKEY=โ€ฆ`, which the compose file passes to the `tailscale` sidecar.
212
+
213
+ ### 4. Reach the dashboard
214
+
215
+ From **any device on the same tailnet**, open:
216
+
217
+ ```
218
+ http://<this-node's-tailscale-ip>:3000
219
+ ```
220
+
221
+ Find the IP with `tailscale ip -4` on the VPS. First load lands on `/login` (login is enforced); after sign-in, complete [ONBOARDING](./ONBOARDING.md) if it's the first run.
222
+
223
+ ### 5. Manual compose path (no bootstrap)
224
+
225
+ ```bash
226
+ echo "TS_AUTHKEY=tskey-auth-..." > .env
227
+ docker compose up -d --build
228
+ # then: http://<tailscale-ip>:3000
229
+ ```
230
+
231
+ ---
232
+
233
+ ## Examples ๐Ÿช
234
+
235
+ **Launch VPS mode directly (without Docker), binding all interfaces:**
236
+
237
+ ```bash
238
+ node bin/constella.mjs --vps --host 0.0.0.0 --port 3000
239
+ ```
240
+
241
+ **The exact container command (from the `Dockerfile`):**
242
+
243
+ ```dockerfile
244
+ CMD ["node", "bin/constella.mjs", "--vps", "--host", "0.0.0.0", "--port", "3000"]
245
+ ```
246
+
247
+ **Confirm the run context the app sees:**
248
+
249
+ ```bash
250
+ # inside the container โ€” /.dockerenv exists, so detectRunContext() โ†’ "vps"
251
+ ls /.dockerenv && echo "context: vps"
252
+ ```
253
+
254
+ **Allow agents full shell exec on the VPS (override the jail โ€” use with care):**
255
+
256
+ ```bash
257
+ # set in the compose `environment:` block for the constella service
258
+ CONSTELLA_AGENT_FULL_ACCESS=1
259
+ ```
260
+
261
+ ---
262
+
263
+ ## Possible states โœฆ
264
+
265
+ | State | What you see | Meaning |
266
+ | --- | --- | --- |
267
+ | Booting | `Mode : vps ยท 0.0.0.0:3000` in logs | Launcher resolved VPS, binding all interfaces |
268
+ | Secrets ready | `โ€ข Secrets ready (stored in /data/.env, never printed).` | Three secrets generated/reused |
269
+ | Migrating | drizzle migrate output | Schema applied to `/data/constella.db` |
270
+ | Web up | `next start` listening on `0.0.0.0:3000` | Dashboard reachable on tailnet |
271
+ | Worker up | `Constella worker โ†’ tick โ€ฆ every 60000ms` | 24/7 tick + watcher + Telegram poll running |
272
+ | Worker refused | `โœ– Refusing to send the worker secret to a non-loopback host` | `CONSTELLA_BASE_URL` is not loopback and no override |
273
+ | Child crash | `โ€ข [web] exited (โ€ฆ) โ€” auto-restarting in 2s` | Supervisor restarting (max 5 / 60s) |
274
+ | Crash-loop | `โœ– [web] โ€ฆ crashed 5x โ€ฆ giving up.` | Repeated failure; supervisor stops |
275
+ | Login wall | redirected to `/login` | `requiresLogin` enforced by `src/proxy.ts` |
276
+
277
+ ---
278
+
279
+ ## Related integrations ๐Ÿ›ฐ๏ธ
280
+
281
+ - **Worker / cron** โ€” the worker still drives the 60s tick (`POST /api/cron/tick`), the chokidar watcher (`/api/sync/file`), and the Telegram long-poll, all over loopback. See [ARCHITECTURE](./ARCHITECTURE.md).
282
+ - **Telegram** โ€” remote-control the company from your phone while the VPS runs headless. See [TELEGRAM](./TELEGRAM.md).
283
+ - **Public API / MCP** โ€” a remote AI host can drive the VPS over the tailnet via the v1 REST API or the MCP server. See [PUBLIC_API](./PUBLIC_API.md) and [MCP](./MCP.md).
284
+ - **Update** โ€” on `vps` context, the in-app Update runs `docker compose pull && up -d`. See [UPDATE](./UPDATE.md).
285
+ - **Agent execution** โ€” jailed `acceptEdits` mode on top of the container jail. See [AGENTS](./AGENTS.md) and [AI_ARCHITECTURE](./AI_ARCHITECTURE.md).
286
+
287
+ ---
288
+
289
+ ## Security ๐Ÿ•ณ๏ธ
290
+
291
+ | Layer | Mechanism |
292
+ | --- | --- |
293
+ | Network privacy | App binds `0.0.0.0` but only the Tailscale sidecar reaches it (`network_mode: service:tailscale`) โ€” never the public internet |
294
+ | Authentication | Login enforced every session (`requiresLogin: true`, `src/proxy.ts` โ†’ `/login`); better-auth email+password, optional 2FA/passkeys |
295
+ | Container hardening | Runs as unprivileged `node` (uid 1000), not root, so an app-level RCE can't act as root over `/data` |
296
+ | Secret signing | Real `BETTER_AUTH_SECRET` generated (no default key in production) |
297
+ | Vault | Provider/credential secrets encrypted with `CONSTELLA_VAULT_KEY` (AES-256-GCM) |
298
+ | Worker isolation | Worker talks **loopback only**; refuses non-loopback unless `CONSTELLA_ALLOW_REMOTE_WORKER_BASE_URL=1` |
299
+ | File `.env` perms | `/data/.env` written `chmod 600` |
300
+ | Agent jail | CLI runs `acceptEdits` (edits-only, no arbitrary exec) + FS jail; container is the hard outer jail |
301
+
302
+ > ๐Ÿ•ณ๏ธ **The bind alone is not the boundary.** Binding `0.0.0.0` is safe *only because* the container shares the Tailscale sidecar's namespace and the host does not publish port 3000 to the public internet. If you remove the sidecar and expose 3000 directly, you lose the private orbit โ€” put it behind the tailnet or a VPN/reverse proxy with auth.
303
+
304
+ > โš ๏ธ **Agent CLIs are not bundled.** The `Dockerfile` notes the `claude` / `codex` CLIs are **not** in the image. For agents on a VPS, either add a `RUN` step to install a CLI, or configure cloud API providers in the [MODELS](./MODELS.md) module.
305
+
306
+ ---
307
+
308
+ ## Troubleshooting ๐ŸŒ 
309
+
310
+ | Symptom | Likely cause | Fix |
311
+ | --- | --- | --- |
312
+ | Can't reach `http://<ip>:3000` | Not on the tailnet, or wrong IP | Confirm `tailscale status`; get the IP with `tailscale ip -4` on the VPS |
313
+ | Sidecar won't join | Missing/expired `TS_AUTHKEY` | Re-create the key, update `.env`, `docker compose up -d` |
314
+ | Redirected to `/login` and can't proceed | First run, no account yet | Sign up / complete [ONBOARDING](./ONBOARDING.md); login is mandatory in VPS |
315
+ | `โœ– Refusing to send the worker secret to a non-loopback host` | `CONSTELLA_BASE_URL` not loopback | Leave it unset (defaults to loopback) or set `CONSTELLA_ALLOW_REMOTE_WORKER_BASE_URL=1` deliberately |
316
+ | `better-auth` throws on boot | Missing `BETTER_AUTH_SECRET` | Ensure `/data` volume is writable so the launcher can persist `.env` |
317
+ | Agents do nothing | No CLI in image / no provider | Install a CLI in the image or configure a cloud provider ([MODELS](./MODELS.md)) |
318
+ | Web keeps restarting | OS-level OOM (agent RAM) or native crash | Cap concurrent agents, or raise `CONSTELLA_WEB_HEAP_MB` for a JS-heap OOM |
319
+ | `โœ– โ€ฆ crashed 5x โ€ฆ giving up` | Genuine crash-loop | Inspect `docker compose logs constella`; fix root cause before restart |
320
+ | Schema migrate fails on fresh DB | Volume permission / corrupt | Ensure `/data` is `node:node`-owned and writable; the launcher aborts on a fresh-DB migrate failure |
321
+
322
+ ---
323
+
324
+ ## Related links โœฆ
325
+
326
+ - [INSTALLATION](./INSTALLATION.md) โ€” getting the package + prerequisites
327
+ - [START_MODE](./START_MODE.md) ยท [AUTH_MODE](./AUTH_MODE.md) ยท [PORTABLE_MODE](./PORTABLE_MODE.md) โ€” the other run modes
328
+ - [CONFIGURATION](./CONFIGURATION.md) โ€” environment variables and tuning
329
+ - [ARCHITECTURE](./ARCHITECTURE.md) โ€” web + worker, FS jail, sync engine
330
+ - [UPDATE](./UPDATE.md) โ€” context-aware updates (`docker compose` on `vps`)
331
+ - [TELEGRAM](./TELEGRAM.md) โ€” remote control of the headless company
332
+ - [PUBLIC_API](./PUBLIC_API.md) ยท [MCP](./MCP.md) โ€” drive Constella remotely
333
+ - [SECURITY](./SECURITY.md) โ€” vault, FS jail, secret scrubbing
334
+ - [TROUBLESHOOTING](./TROUBLESHOOTING.md) ยท [FAQ](./FAQ.md)