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
+ [← Índice](./README.md) · [🇬🇧 English](../en/UPDATE.md) · [✦ Constella](../../README.pt-BR.md)
2
+
3
+ # 🚀 Atualização — relançando a nave central
4
+
5
+ ![](../assets/divider-orbit.svg)
6
+
7
+ O Constella consulta o npm em busca de uma versão mais recente, mostra o changelog e aplica a atualização **da maneira que se encaixa em como este processo está rodando** — instalação global, npx, código-fonte (dev), VPS via Docker ou um pen drive portátil. Ele sempre faz backup do seu `.env` e do banco de dados antes, e nunca inventa um "sucesso" que não conquistou.
8
+
9
+ ---
10
+
11
+ ## ✦ Quando usar
12
+
13
+ - Uma nova versão do Constella foi publicada e você quer baixá-la.
14
+ - Você quer ler o changelog antes de atualizar (o painel "Novidades").
15
+ - Você quer confirmar que já está na versão mais recente (`constella update --check`).
16
+ - Você precisa do **comando exato** para o seu ambiente (dev / npx / VPS / portátil), porque alguns contextos não podem ser atualizados de dentro do servidor web em execução.
17
+
18
+ ---
19
+
20
+ ## 🌌 Como funciona
21
+
22
+ Duas metades cooperam:
23
+
24
+ | Metade | Arquivo | Responsabilidade |
25
+ | --- | --- | --- |
26
+ | **Verificação** | `src/server/update-check.ts` | Perguntar ao registro npm o `latest`, comparar versões, buscar o changelog. Cacheado, falha em silêncio. |
27
+ | **Aplicação** | `src/server/update-run.ts` | Detectar o contexto de execução, fazer backup da config local e, então, executar automaticamente (global) ou devolver o comando exato. |
28
+ | **Contexto** | `src/lib/run-context.ts` | `detectRunContext()` → `dev \| global \| npx \| vps \| portable`. |
29
+ | **UI** | `src/components/modules/update-screen.tsx` | Versões, dica de contexto, "Atualizar agora", changelog, poll ao vivo do atualizador em segundo plano. |
30
+ | **Actions** | `src/server/actions/update-actions.ts` | Server actions que a UI chama: `getUpdateStatus`, `getUpdateContext`, `runUpdate`, `pollUpdateResult`. |
31
+ | **CLI** | `bin/constella.mjs` (subcomando `update`) | Verificação/aplicação autônoma que roda **fora** do servidor web. |
32
+
33
+ A regra central (do comentário no código em `update-run.ts`): *somente a instalação npm `global` roda automaticamente* — todo outro contexto retorna o comando preciso para você executar, porque executá-los a partir do servidor web depende do ambiente.
34
+
35
+ ---
36
+
37
+ ## 🛰️ Fluxo principal
38
+
39
+ ```mermaid
40
+ flowchart TD
41
+ A["Abrir /update ou rodar `constella update`"] --> B["checkForUpdate()"]
42
+ B --> C{"registro npm acessível?"}
43
+ C -- "não" --> D["latest = null · sem atualização · falha em silêncio"]
44
+ C -- "sim" --> E["comparar latest vs current (isNewer)"]
45
+ E -- "não é mais novo" --> F["Já está atualizado"]
46
+ E -- "mais novo" --> G["buscar CHANGELOG · sliceChangelog(latest)"]
47
+ G --> H["startUpdate() → detectRunContext()"]
48
+ H --> I["backupBeforeUpdate() — copiar .env + db"]
49
+ I --> J{"contexto?"}
50
+ J -- "global" --> K["spawn destacado npm i -g · gravar last-update.json"]
51
+ J -- "dev / npx / vps / portable" --> L["retornar comando exato (sem execução automática)"]
52
+ K --> M["UI consulta getUpdateResult() a cada 3s"]
53
+ M --> N["running → done / error · pedir reinício"]
54
+ ```
55
+
56
+ ---
57
+
58
+ ## 🪐 Conceitos-chave
59
+
60
+ ### Verificação de versão (`checkForUpdate`)
61
+
62
+ - Lê a versão **instalada** via `currentVersion()` (`src/lib/version.ts`): env `CONSTELLA_VERSION` (definida pela CLI) → `package.json` do diretório de lançamento → `"0.0.0"`.
63
+ - Busca `https://registry.npmjs.org/constella/latest` pela `version` publicada.
64
+ - `isNewer(latest, current)` faz uma comparação semver numérica de 3 partes (sufixos de pré-lançamento removidos). `bumpType` classifica o salto como `major | minor | patch`.
65
+ - Retorna um `UpdateInfo`: `{ current, latest, updateAvailable, type, command, changelog }`. O `command` padrão é `npm install -g constella@latest`.
66
+ - **Cache em memória de 6 horas** (`TTL = 6 * 60 * 60 * 1000`) para que o polling do cliente nunca martele o registro. `checkForUpdate(true)` força uma atualização.
67
+ - **Falha fechada/silenciosa**: qualquer caminho offline / não publicado / timeout (`AbortController` de 3 s) resulta em `latest: null`, `updateAvailable: false`. Nunca lança erro e nunca inventa "atualizado".
68
+
69
+ ### Busca do changelog
70
+
71
+ - Buscado apenas quando `updateAvailable` é verdadeiro.
72
+ - Puxa `https://raw.githubusercontent.com/gabriel7silva/constella/main/CHANGELOG.md`.
73
+ - `sliceChangelog(md, version)` extrai a seção `## [x.y.z] …` até o próximo cabeçalho `##`; se o cabeçalho da versão exata não for encontrado, recai para a primeira seção do arquivo.
74
+ - Renderizado no card "Novidades na v{version}" da UI via `react-markdown` + `remark-gfm`.
75
+
76
+ ### Detecção do contexto de execução (`detectRunContext`)
77
+
78
+ A ordem importa — o primeiro match vence:
79
+
80
+ | Ordem | Teste | Contexto |
81
+ | --- | --- | --- |
82
+ | 1 | `isDevMode()` (rodando do código-fonte) | `dev` |
83
+ | 2 | `getRunMode() === "vps"` **ou** `/.dockerenv` existe | `vps` |
84
+ | 3 | `getRunMode() === "portable"` | `portable` |
85
+ | 4 | caminho de `launchDir()` contém `/_npx/` (cache do npx) | `npx` |
86
+ | 5 | (fallback) | `global` |
87
+
88
+ `isDevMode()` (`src/lib/build-mode.ts`): `CONSTELLA_PUBLIC=1` → `false`; senão `CONSTELLA_DEV=1` → `true`; senão `NODE_ENV !== "production"`. Um lançamento via CLI define `CONSTELLA_PUBLIC=1`, então execuções instaladas nunca são confundidas com dev.
89
+
90
+ ### Backup antes da atualização (`backupBeforeUpdate`)
91
+
92
+ - Esforço-melhor (best-effort), roda antes de qualquer atualização em `startUpdate()`.
93
+ - Cria `<HOME>/backups/<timestamp>/` (timestamp = ISO com `:`/`.` substituídos por `-`).
94
+ - Copia, se presentes: `.env`, `constella.db`, `constella.db-wal`, `constella.db-shm`.
95
+ - Retorna o caminho do diretório de backup (exibido na UI como "Backup salvo: …"). Qualquer falha de cópia é ignorada em silêncio — o backup nunca bloqueia a atualização.
96
+ - `<HOME>` resolve via `constellaHome()`: `CONSTELLA_HOME` (resolvido contra o diretório de lançamento) ou `~/.constella`.
97
+
98
+ ### Aplicação ciente de contexto (`startUpdate`)
99
+
100
+ | Contexto | `ok` | Roda automático? | Comando retornado | `needsRestart` |
101
+ | --- | --- | --- | --- | --- |
102
+ | `global` | `true` | ✅ `npm install -g constella@latest` destacado | `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` (após verificação de espaço/backup) | ✅ |
107
+
108
+ > Se `updateAvailable` for falso, `startUpdate()` faz curto-circuito com `ok: true, message: "Already up to date."` — sem backup, sem comando.
109
+
110
+ ### O atualizador global destacado + polling de resultado
111
+
112
+ Como uma atualização npm global não consegue terminar de forma confiável antes de o servidor web ser substituído, `startUpdate()` para `global`:
113
+
114
+ 1. Grava `<HOME>/backups/last-update.json` com `{ status: "running", to, at }`.
115
+ 2. Faz spawn de um one-liner `node -e` **destacado** (sem arquivo de script separado — funciona mesmo a partir de uma instalação global) que roda `npm install -g constella@latest` e reescreve o arquivo de resultado com `status: "done" | "error"`, o `code` de saída do npm e `at`.
116
+ 3. Faz `child.unref()` para que o atualizador sobreviva à requisição.
117
+ 4. Retorna `{ ok: true, started: true, needsRestart: true, … }`.
118
+
119
+ A UI (`update-screen.tsx`) então consulta `pollUpdateResult()` → `getUpdateResult()` a cada **3 segundos**, lendo `last-update.json`. Status: `idle` (sem arquivo), `running`, `done`, `error`. Em `done`/`error` ela para de consultar e pede um reinício (ou mostra a dica de rollback).
120
+
121
+ ---
122
+
123
+ ## 🌠 Tabelas
124
+
125
+ ### `UpdateInfo` (retornado por `checkForUpdate`)
126
+
127
+ | Campo | Tipo | Significado |
128
+ | --- | --- | --- |
129
+ | `current` | `string` | Versão instalada. |
130
+ | `latest` | `string \| null` | `latest` do npm, ou `null` quando o registro está inacessível. |
131
+ | `updateAvailable` | `boolean` | `latest` existe e é mais novo. |
132
+ | `type` | `"major" \| "minor" \| "patch" \| null` | Tamanho do salto de versão. |
133
+ | `command` | `string` | Comando de atualização padrão. |
134
+ | `changelog` | `string \| null` | Seção do changelog fatiada para `latest`. |
135
+
136
+ ### `UpdateResult` (retornado por `startUpdate` / `runUpdate`)
137
+
138
+ | Campo | Tipo | Significado |
139
+ | --- | --- | --- |
140
+ | `ok` | `boolean` | Operação bem-sucedida (global iniciada, ou já atual). |
141
+ | `started` | `boolean?` | O atualizador global destacado foi lançado → UI deve consultar. |
142
+ | `context` | `string` | Contexto de execução detectado. |
143
+ | `command` | `string` | O comando para este contexto. |
144
+ | `message` | `string` | Status / instrução legível por humanos. |
145
+ | `backupDir` | `string?` | Onde `.env`/db foram copiados. |
146
+ | `needsRestart` | `boolean?` | Reiniciar o Constella para carregar a nova versão. |
147
+
148
+ ### `last-update.json` (estado do atualizador em segundo plano)
149
+
150
+ | Campo | Tipo | Significado |
151
+ | --- | --- | --- |
152
+ | `status` | `"idle" \| "running" \| "done" \| "error"` | Estado do atualizador (`idle` = arquivo ausente). |
153
+ | `to` | `string` | Versão-alvo. |
154
+ | `code` | `number` | Código de saída do npm (na conclusão). |
155
+ | `at` | `string` | Timestamp ISO. |
156
+
157
+ ---
158
+
159
+ ## 🕳️ Fluxo de atualização por contexto
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["npm i -g constella@latest destacado"] --> G2["consultar last-update.json → reiniciar"]
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["verificar espaço livre + backup do drive, depois npm i -g constella@latest"]
174
+ ```
175
+
176
+ ---
177
+
178
+ ## ✦ Passo a passo
179
+
180
+ ### No aplicativo
181
+
182
+ 1. Abra o módulo **Atualizar** (`/update`). A página chama `getUpdateStatus()` e `getUpdateContext()`.
183
+ 2. Leia as versões **Instalada → Mais recente** e a pílula de salto (`major`/`minor`/`patch`).
184
+ 3. A linha de contexto informa como este processo roda (ex.: "Instalação npm global — pode atualizar no lugar.").
185
+ 4. Se houver uma atualização disponível, revise **"Novidades na v…"**.
186
+ 5. Clique em **Atualizar agora** → `runUpdate()` (protegido por auth via `requireWorkspace()`).
187
+ - **global** → o atualizador em segundo plano inicia; acompanhe o poll ao vivo (`running → instalada`), depois reinicie o Constella.
188
+ - **dev / npx / vps / portable** → copie o comando exato exibido e rode no seu terminal.
189
+ 6. A linha **Backup salvo** mostra onde seu `.env`/db foram copiados.
190
+
191
+ ### Pela CLI
192
+
193
+ ```bash
194
+ # Apenas verificar (sem aplicar) — imprime "Constella x.y.z · latest a.b.c"
195
+ constella update --check
196
+
197
+ # Verificar + aplicar (caminho de instalação global)
198
+ constella update
199
+ ```
200
+
201
+ O subcomando `update` da CLI (`bin/constella.mjs`):
202
+ - Lê a versão local do próprio `package.json` do pacote, busca `latest` no npm (timeout de 4 s).
203
+ - `--check` → imprime e sai.
204
+ - Se o registro estiver inacessível, ou `latest === current`, ele informa e sai com 0.
205
+ - Se detectar **código-fonte** (`.git` + `src/` no CWD), ele orienta a `git pull && pnpm install && pnpm build` e sai.
206
+ - Caso contrário, roda `npm install -g constella@latest` (usa `npm.cmd` no Windows, sem shell) com stdio herdado, e então pede para reiniciar.
207
+
208
+ ---
209
+
210
+ ## 🛰️ Exemplos
211
+
212
+ **Já atual (à prova de offline):**
213
+ ```text
214
+ Constella 0.1.0 · (npm registry unavailable)
215
+ Couldn't reach the npm registry — try again later.
216
+ ```
217
+
218
+ **Atualização global pela UI** — `runUpdate()` retorna:
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/voce/.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
+ …e o poll lê `<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** — sem execução automática; você recebe:
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
+ ## 🌌 Estados possíveis
244
+
245
+ | Estado | Como aparece | Origem |
246
+ | --- | --- | --- |
247
+ | Atualizado | "Você está na versão mais recente." | `updateAvailable === false` |
248
+ | Atualização disponível | Pílula de versão + "Atualizar agora" | `updateAvailable === true` |
249
+ | Registro inacessível | `latest = —`, sem botão | `latest === null` |
250
+ | Atualizando (global) | "Atualizando…" + spinner | `started === true`, `busy` |
251
+ | Poll: running | "Atualizador: executando…" | `last-update.json.status === "running"` |
252
+ | Poll: done | "✓ instalada — reinicie o Constella para carregá-la." | `status === "done"` |
253
+ | Poll: error | "✖ falhou — veja o rollback abaixo." + dica de rollback | `status === "error"` |
254
+ | Comando manual | Comando exibido em um `<pre>`; sem execução automática | `dev / npx / vps / portable` |
255
+
256
+ ---
257
+
258
+ ## 🪐 Integrações relacionadas
259
+
260
+ - **[VPS_MODE](./VPS_MODE.md)** — o caminho Docker `docker compose pull && up -d`.
261
+ - **[PORTABLE_MODE](./PORTABLE_MODE.md)** — pen drive, verificações de espaço livre antes de atualizar.
262
+ - **[INSTALLATION](./INSTALLATION.md)** / **[PUBLISHING](./PUBLISHING.md)** — como as versões chegam ao npm.
263
+ - **[START_MODE](./START_MODE.md)** / **[AUTH_MODE](./AUTH_MODE.md)** — modos de execução que alimentam `detectRunContext()`.
264
+ - **[CONFIGURATION](./CONFIGURATION.md)** — variáveis de ambiente (`CONSTELLA_HOME`, `CONSTELLA_VERSION`, `CONSTELLA_PUBLIC`).
265
+
266
+ ---
267
+
268
+ ## 🕳️ Segurança
269
+
270
+ - **Aplicação protegida por auth.** `runUpdate()` chama `requireWorkspace()` antes de fazer qualquer coisa.
271
+ - **Backup primeiro, sempre.** `.env` + o banco SQLite (e WAL/SHM) são copiados para `<HOME>/backups/<timestamp>/` antes de qualquer caminho de atualização.
272
+ - **Sem injeção de shell na CLI.** A instalação global faz spawn de `npm`/`npm.cmd` diretamente com um array argv — sem interpolação de string em shell.
273
+ - **Verificações fail-closed.** As buscas de registro/changelog usam um timeout `AbortController` de 3–4 s e engolem erros, então uma rede hostil ou morta não pode travar nem derrubar a tela de atualização — apenas reporta "sem atualização".
274
+ - **Resultados honestos.** O atualizador destacado grava um código de saída real do npm em `last-update.json`; a UI reflete `done`/`error` com fidelidade e nunca afirma sucesso em caso de falha.
275
+
276
+ ---
277
+
278
+ ## 🌠 Solução de problemas
279
+
280
+ | Sintoma | Causa provável | Solução |
281
+ | --- | --- | --- |
282
+ | "registry unavailable" | Offline / npm fora do ar / firewall | Tente mais tarde; verifique a conectividade com `registry.npmjs.org`. |
283
+ | Mais recente exibido mas desatualizado | Cache de 6 h | Force uma verificação nova: `checkForUpdate(true)` (re-fetch da UI) ou `constella update --check`. |
284
+ | Contexto detectado errado | Env inconsistente | Verifique `CONSTELLA_PUBLIC`/`CONSTELLA_DEV`, `CONSTELLA_RUN_MODE` e a presença de `/.dockerenv`. |
285
+ | Poll global travado em "running" | `npm` destacado ainda instalando ou bloqueado | Aguarde; se nunca resolver, rode `npm install -g constella@latest` manualmente. |
286
+ | Poll: error | npm saiu com código não-zero (permissões?) | Reexecute com permissões elevadas; rollback: `npm i -g constella@<atual>`, depois restaure o backup. |
287
+ | Versão ainda antiga após reiniciar | Processo antigo ainda rodando | Pare totalmente e relance o Constella para que `CONSTELLA_VERSION` seja relido. |
288
+ | Instalação dev não atualiza sozinha | Intencional | Rode `git pull && pnpm install && pnpm build` (ou `next build`). |
289
+
290
+ ---
291
+
292
+ ## ✦ Links relacionados
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
+ [← Índice](./README.md) · [🇬🇧 English](../en/VPS_MODE.md) · [✦ Constella](../../README.pt-BR.md)
2
+
3
+ # Modo VPS 🛰️
4
+
5
+ ![](../assets/divider-orbit.svg)
6
+
7
+ Rode a nave-mãe em um servidor remoto. O **modo VPS** inicia o Constella dentro do Docker em uma VPS, vincula o servidor web a `0.0.0.0` e o expõe **apenas** pela sua tailnet do Tailscale — uma órbita privada acessível de qualquer dispositivo que você autorizar, e de nenhum outro lugar.
8
+
9
+ ---
10
+
11
+ ## Quando usar 🌌
12
+
13
+ Escolha o modo VPS quando quiser um **plano de controle 24/7** que continue planejando, construindo, revisando e enviando enquanto seu notebook está fechado — sem colocar o painel na internet aberta.
14
+
15
+ | Você quer… | O modo VPS entrega |
16
+ | --- | --- |
17
+ | A constelação de agentes sempre ativa | Um processo de servidor de longa duração (web + worker), supervisionado e reiniciado automaticamente |
18
+ | Acesso remoto privado | Vinculado a `0.0.0.0`, mas acessível **apenas na sua tailnet do Tailscale** |
19
+ | Autenticação real | E-mail + senha exigidos a cada sessão (`requiresLogin: true`) |
20
+ | Uma instalação reproduzível | Um `Dockerfile` + `docker-compose.yml` + um bootstrap `vps-install.sh` de um passo |
21
+ | Execução endurecida por padrão | Jaula do contêiner + CLI do agente em modo `acceptEdits` (apenas edições) |
22
+
23
+ Se você só quer uma instância local sempre ativa na sua própria máquina, use [START_MODE](./START_MODE.md) ou [AUTH_MODE](./AUTH_MODE.md). Para uma instância que você carrega num drive, veja [PORTABLE_MODE](./PORTABLE_MODE.md).
24
+
25
+ ---
26
+
27
+ ## Como funciona 🪐
28
+
29
+ VPS é um dos quatro **modos de execução** declarados em `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
+ O modo é escolhido **no lançamento**, nunca na UI (um lançamento via CLI define `CONSTELLA_PUBLIC=1`, o que esconde o seletor de modo no app). Ele é resolvido em `bin/constella.mjs` a partir da flag `--vps` (com o legado `--bind tailnet` mapeando para o mesmo modo), depois exportado como `CONSTELLA_RUN_MODE=vps` e persistido na linha da organização (`organization.run_mode`) no onboarding via `getRunMode()`.
42
+
43
+ Três coisas tornam o VPS distinto dos outros modos:
44
+
45
+ 1. **Endereço de bind `0.0.0.0`.** Em `bin/constella.mjs`, `host = --host || (vps|portable ? "0.0.0.0" : "127.0.0.1")`. O servidor escuta em todas as interfaces para que a camada do Tailscale consiga alcançá-lo.
46
+ 2. **Login é obrigatório.** `requiresLogin()` retorna `true`, e `src/proxy.ts` redireciona toda requisição não autenticada para `/login` (apenas o modo `start` pula isso).
47
+ 3. **Contexto de execução = `vps`.** `detectRunContext()` em `src/lib/run-context.ts` retorna `"vps"` quando `getRunMode() === "vps"` **ou** quando `/.dockerenv` existe — assim o fluxo de Update no app sabe usar `docker compose` em vez de `npm`/`git`. Veja [UPDATE](./UPDATE.md).
48
+
49
+ > 🛰️ **O Tailscale é assumido como configurado externamente.** O Constella não gerencia sua tailnet, ACLs ou auth keys. O script de bootstrap e o arquivo compose *entram* numa tailnet para você, mas a tailnet em si (dispositivos, MagicDNS, ACLs) é sua para administrar em <https://login.tailscale.com>. O Constella apenas vincula `0.0.0.0`; é a tailnet que mantém esse bind privado.
50
+
51
+ ---
52
+
53
+ ## Fluxo principal 🌠
54
+
55
+ ```mermaid
56
+ flowchart TD
57
+ A["operador: bash scripts/vps-install.sh"] --> B["instala Docker"]
58
+ B --> C["instala Tailscale + tailscale up"]
59
+ C --> D["TS_AUTHKEY gravado em .env"]
60
+ D --> E["docker compose up -d --build"]
61
+ E --> F["sidecar tailscale entra na tailnet"]
62
+ E --> G["contêiner constella compila + inicia"]
63
+ G --> H["bin/constella.mjs --vps --host 0.0.0.0 --port 3000"]
64
+ H --> I["gera/persiste segredos em /data/.env (chmod 600)"]
65
+ H --> J["drizzle migrate contra /data/constella.db"]
66
+ H --> K["supervisiona: next start + worker"]
67
+ F & K --> L["acessível em http://<tailscale-ip>:3000"]
68
+ ```
69
+
70
+ ---
71
+
72
+ ## Conceitos-chave ✦
73
+
74
+ ### Os dois contêineres
75
+
76
+ O `docker-compose.yml` roda **dois serviços que compartilham um único namespace de rede**:
77
+
78
+ - **`tailscale`** — a imagem oficial `tailscale/tailscale`, atuando como sidecar. Ela controla `/dev/net/tun`, possui as capabilities `net_admin` + `sys_module`, entra na tailnet de forma headless com `TS_AUTHKEY` e persiste o estado do nó no volume `tailscale-state`.
79
+ - **`constella`** — construída a partir do `Dockerfile`, ligada à rede do sidecar com `network_mode: service:tailscale`. Como compartilham o namespace, o Constella fica acessível **apenas no IP do Tailscale** na porta 3000 — nunca nas interfaces públicas do host.
80
+
81
+ ### Raiz de runtime em um volume
82
+
83
+ Dentro do contêiner, `CONSTELLA_HOME=/data` (um volume Docker nomeado, `constella-data`). Todo o estado de runtime vive ali:
84
+
85
+ - `/data/constella.db` — o banco SQLite (`DATABASE_URL=file:/data/constella.db`).
86
+ - `/data/.env` — segredos gerados (`chmod 600`), sobrevivem a reinícios porque o volume é estável.
87
+ - `/data/organizations/<orgId>/workspace/` — a árvore do workspace dos agentes (a jaula de FS). Veja [ARCHITECTURE](./ARCHITECTURE.md).
88
+
89
+ ### Worker pelo loopback (mesmo em `0.0.0.0`)
90
+
91
+ O modelo de processo duplo (web + worker) é preservado no modo VPS. O launcher dispara `bin/worker.mjs` com `CONSTELLA_BASE_URL=http://127.0.0.1:<port>` — **loopback**, mesmo que o servidor web vincule `0.0.0.0`. Isso é uma **proteção deliberada contra SSRF / exfiltração de segredo**: o worker anexa o cabeçalho privilegiado `x-worker-secret` a cada chamada, então recusa qualquer base URL não-loopback:
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
+ Um worker genuinamente remoto precisa optar explicitamente com `CONSTELLA_ALLOW_REMOTE_WORKER_BASE_URL=1` (e é avisado se a URL for `http://` puro). Veja [ARCHITECTURE](./ARCHITECTURE.md).
102
+
103
+ ### Segredos são obrigatórios
104
+
105
+ O `bin/constella.mjs` gera e persiste **três** segredos em `/data/.env` no primeiro boot (e os reutiliza depois):
106
+
107
+ - `BETTER_AUTH_SECRET` — `next start` roda sob `NODE_ENV=production`, onde o better-auth **lança erro** com sua chave padrão; um modo de rede precisa de uma real.
108
+ - `CONSTELLA_VAULT_KEY` — chave AES-256-GCM para o cofre de credenciais/provedores. Veja [SECURITY](./SECURITY.md).
109
+ - `CONSTELLA_WORKER_SECRET` — o worker falha **fechado** sem ele (`x-worker-secret`).
110
+
111
+ O launcher imprime apenas `• Secrets ready (stored in <HOME>/.env, never printed).` — os valores nunca são logados.
112
+
113
+ ---
114
+
115
+ ## Tabelas 🗃️
116
+
117
+ ### Comparação dos modos de execução
118
+
119
+ | Propriedade | `start` | `auth` | `vps` | `portable` |
120
+ | --- | --- | --- | --- | --- |
121
+ | `requiresLogin` | `false` | `true` | `true` | `true` |
122
+ | Host de bind padrão | `127.0.0.1` | `127.0.0.1` | **`0.0.0.0`** | `0.0.0.0` |
123
+ | Exposição de rede | localhost | localhost | **tailnet do Tailscale** | LAN (host USB) |
124
+ | Runtime típico | local | local | **Docker** | drive USB |
125
+ | Permissão do CLI do agente | `bypassPermissions` (total) | `acceptEdits` (jaulado) | **`acceptEdits` (jaulado)** | `acceptEdits` (jaulado) |
126
+ | `detectRunContext()` | `dev`/`global`/`npx` | `dev`/`global`/`npx` | **`vps`** | `portable` |
127
+
128
+ ### Variáveis de ambiente do VPS
129
+
130
+ | Variável | Definida por | Valor | Propósito |
131
+ | --- | --- | --- | --- |
132
+ | `CONSTELLA_RUN_MODE` | launcher / Dockerfile / compose | `vps` | Seleciona o comportamento VPS, login obrigatório |
133
+ | `CONSTELLA_PUBLIC` | launcher / Dockerfile / compose | `1` | Marca um runtime público; esconde o seletor de modo da UI |
134
+ | `CONSTELLA_HOME` | Dockerfile / compose | `/data` | Raiz de runtime (um volume Docker) |
135
+ | `DATABASE_URL` | launcher | `file:/data/constella.db` | Caminho do SQLite sob o volume |
136
+ | `BETTER_AUTH_SECRET` | launcher (gerado) | base64url aleatório | Chave de assinatura de sessão |
137
+ | `CONSTELLA_VAULT_KEY` | launcher (gerado) | base64 aleatório | Chave de criptografia do cofre |
138
+ | `CONSTELLA_WORKER_SECRET` | launcher (gerado) | base64url aleatório | `x-worker-secret` do worker |
139
+ | `CONSTELLA_BASE_URL` | launcher (processo worker) | `http://127.0.0.1:3000` | Apenas loopback |
140
+ | `NODE_ENV` | Dockerfile | `production` | Boot de produção |
141
+ | `TS_AUTHKEY` | `.env` / compose | `tskey-auth-…` | Chave de entrada do sidecar Tailscale |
142
+ | `CONSTELLA_AGENT_FULL_ACCESS` | operador (opcional) | `1` / `0` | Sobrescreve exec jaulado/total do agente |
143
+ | `CONSTELLA_ALLOW_REMOTE_WORKER_BASE_URL` | operador (opcional) | `1` | Permite um worker não-loopback |
144
+ | `CONSTELLA_WEB_HEAP_MB` | operador (opcional) | inteiro | Aumenta o limite de heap V8 do web |
145
+
146
+ ### Serviços do docker compose
147
+
148
+ | Serviço | Imagem / build | Rede | Volumes | Capabilities notáveis |
149
+ | --- | --- | --- | --- | --- |
150
+ | `tailscale` | `tailscale/tailscale:latest` | namespace próprio | `tailscale-state:/var/lib/tailscale` | `net_admin`, `sys_module`, `/dev/net/tun` |
151
+ | `constella` | `build: .` (Dockerfile) | `service:tailscale` | `constella-data:/data` | roda como `node` sem privilégios (uid 1000) |
152
+
153
+ ---
154
+
155
+ ## Diagrama de topologia 🌌
156
+
157
+ ```mermaid
158
+ flowchart LR
159
+ subgraph TN["Sua tailnet do Tailscale (órbita privada)"]
160
+ direction LR
161
+ L["Notebook"]
162
+ P["Celular"]
163
+ subgraph VPS["Host VPS"]
164
+ subgraph NS["namespace de rede compartilhado"]
165
+ TS["sidecar tailscale\n(net_admin, /dev/net/tun)"]
166
+ C["contêiner constella\n0.0.0.0:3000\nuid 1000 'node'"]
167
+ end
168
+ V1[("volume /data\nconstella.db + .env")]
169
+ V2[("volume\ntailscale-state")]
170
+ end
171
+ end
172
+ NET(["internet pública"]) -. bloqueado .-> VPS
173
+ L -->|"tailnet https"| TS
174
+ P -->|"tailnet https"| TS
175
+ TS --> C
176
+ C --- V1
177
+ TS --- V2
178
+
179
+ subgraph IN["dentro do contêiner constella"]
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 -->|apenas loopback| W
183
+ end
184
+ ```
185
+
186
+ ---
187
+
188
+ ## Passo a passo 🚀
189
+
190
+ ### 1. Provisione uma VPS
191
+
192
+ Um Ubuntu Server novo é o alvo assumido (o bootstrap instala o Docker via `get.docker.com` e o Tailscale via `tailscale.com/install.sh`).
193
+
194
+ ### 2. Rode o bootstrap
195
+
196
+ ```bash
197
+ bash scripts/vps-install.sh
198
+ ```
199
+
200
+ O `scripts/vps-install.sh` faz, em ordem:
201
+
202
+ 1. **Instala o Docker** se `docker` não estiver no `PATH` (`curl -fsSL https://get.docker.com | sh`).
203
+ 2. **Instala o Tailscale** se ausente (`curl -fsSL https://tailscale.com/install.sh | sh`).
204
+ 3. **Entra na tailnet** com `sudo tailscale up` (imprime uma URL de auth no navegador se necessário).
205
+ 4. **Pede um `TS_AUTHKEY`** (para que o sidecar do *contêiner* entre de forma headless) e o anexa ao `.env`.
206
+ 5. **Constrói + inicia** a stack: `sudo docker compose up -d --build`.
207
+ 6. **Imprime a URL de acesso**: `http://<tailscale-ip>:3000`.
208
+
209
+ ### 3. Crie a auth key do Tailscale
210
+
211
+ Quando solicitado, crie uma chave em <https://login.tailscale.com/admin/settings/keys> e cole o valor `tskey-auth-…`. Ele é gravado no `.env` como `TS_AUTHKEY=…`, que o arquivo compose passa ao sidecar `tailscale`.
212
+
213
+ ### 4. Acesse o painel
214
+
215
+ De **qualquer dispositivo na mesma tailnet**, abra:
216
+
217
+ ```
218
+ http://<ip-tailscale-deste-nó>:3000
219
+ ```
220
+
221
+ Encontre o IP com `tailscale ip -4` na VPS. O primeiro carregamento cai em `/login` (login é obrigatório); após entrar, complete o [ONBOARDING](./ONBOARDING.md) se for o primeiro boot.
222
+
223
+ ### 5. Caminho manual com compose (sem o bootstrap)
224
+
225
+ ```bash
226
+ echo "TS_AUTHKEY=tskey-auth-..." > .env
227
+ docker compose up -d --build
228
+ # depois: http://<tailscale-ip>:3000
229
+ ```
230
+
231
+ ---
232
+
233
+ ## Exemplos 🪐
234
+
235
+ **Iniciar o modo VPS diretamente (sem Docker), vinculando todas as interfaces:**
236
+
237
+ ```bash
238
+ node bin/constella.mjs --vps --host 0.0.0.0 --port 3000
239
+ ```
240
+
241
+ **O comando exato do contêiner (do `Dockerfile`):**
242
+
243
+ ```dockerfile
244
+ CMD ["node", "bin/constella.mjs", "--vps", "--host", "0.0.0.0", "--port", "3000"]
245
+ ```
246
+
247
+ **Confirmar o contexto de execução que o app enxerga:**
248
+
249
+ ```bash
250
+ # dentro do contêiner — /.dockerenv existe, então detectRunContext() → "vps"
251
+ ls /.dockerenv && echo "context: vps"
252
+ ```
253
+
254
+ **Permitir exec de shell total aos agentes na VPS (sobrescrever a jaula — use com cuidado):**
255
+
256
+ ```bash
257
+ # defina no bloco `environment:` do compose para o serviço constella
258
+ CONSTELLA_AGENT_FULL_ACCESS=1
259
+ ```
260
+
261
+ ---
262
+
263
+ ## Estados possíveis ✦
264
+
265
+ | Estado | O que você vê | Significado |
266
+ | --- | --- | --- |
267
+ | Iniciando | `Mode : vps · 0.0.0.0:3000` nos logs | Launcher resolveu VPS, vinculando todas as interfaces |
268
+ | Segredos prontos | `• Secrets ready (stored in /data/.env, never printed).` | Três segredos gerados/reutilizados |
269
+ | Migrando | saída do drizzle migrate | Schema aplicado a `/data/constella.db` |
270
+ | Web no ar | `next start` escutando em `0.0.0.0:3000` | Painel acessível na tailnet |
271
+ | Worker no ar | `Constella worker → tick … every 60000ms` | Tick 24/7 + watcher + poll do Telegram rodando |
272
+ | Worker recusado | `✖ Refusing to send the worker secret to a non-loopback host` | `CONSTELLA_BASE_URL` não é loopback e sem override |
273
+ | Crash de filho | `• [web] exited (…) — auto-restarting in 2s` | Supervisor reiniciando (máx 5 / 60s) |
274
+ | Crash-loop | `✖ [web] … crashed 5x … giving up.` | Falha repetida; supervisor desiste |
275
+ | Barreira de login | redirecionado para `/login` | `requiresLogin` imposto por `src/proxy.ts` |
276
+
277
+ ---
278
+
279
+ ## Integrações relacionadas 🛰️
280
+
281
+ - **Worker / cron** — o worker ainda dirige o tick de 60s (`POST /api/cron/tick`), o watcher do chokidar (`/api/sync/file`) e o long-poll do Telegram, tudo pelo loopback. Veja [ARCHITECTURE](./ARCHITECTURE.md).
282
+ - **Telegram** — controle remoto da empresa pelo celular enquanto a VPS roda headless. Veja [TELEGRAM](./TELEGRAM.md).
283
+ - **API Pública / MCP** — um host de IA remoto pode dirigir a VPS pela tailnet via a API REST v1 ou o servidor MCP. Veja [PUBLIC_API](./PUBLIC_API.md) e [MCP](./MCP.md).
284
+ - **Update** — no contexto `vps`, o Update no app roda `docker compose pull && up -d`. Veja [UPDATE](./UPDATE.md).
285
+ - **Execução de agentes** — modo jaulado `acceptEdits` sobre a jaula do contêiner. Veja [AGENTS](./AGENTS.md) e [AI_ARCHITECTURE](./AI_ARCHITECTURE.md).
286
+
287
+ ---
288
+
289
+ ## Segurança 🕳️
290
+
291
+ | Camada | Mecanismo |
292
+ | --- | --- |
293
+ | Privacidade de rede | O app vincula `0.0.0.0`, mas só o sidecar Tailscale o alcança (`network_mode: service:tailscale`) — nunca a internet pública |
294
+ | Autenticação | Login obrigatório a cada sessão (`requiresLogin: true`, `src/proxy.ts` → `/login`); better-auth e-mail+senha, 2FA/passkeys opcionais |
295
+ | Endurecimento do contêiner | Roda como `node` sem privilégios (uid 1000), não root, então um RCE no nível do app não age como root sobre `/data` |
296
+ | Assinatura de segredo | `BETTER_AUTH_SECRET` real gerado (sem chave padrão em produção) |
297
+ | Cofre | Segredos de provedor/credenciais criptografados com `CONSTELLA_VAULT_KEY` (AES-256-GCM) |
298
+ | Isolamento do worker | O worker fala **apenas loopback**; recusa não-loopback salvo `CONSTELLA_ALLOW_REMOTE_WORKER_BASE_URL=1` |
299
+ | Permissões do `.env` | `/data/.env` gravado `chmod 600` |
300
+ | Jaula do agente | O CLI roda `acceptEdits` (apenas edições, sem exec arbitrário) + jaula de FS; o contêiner é a jaula externa rígida |
301
+
302
+ > 🕳️ **O bind sozinho não é a fronteira.** Vincular `0.0.0.0` é seguro *apenas porque* o contêiner compartilha o namespace do sidecar Tailscale e o host não publica a porta 3000 na internet pública. Se você remover o sidecar e expor a 3000 diretamente, perde a órbita privada — coloque-a atrás da tailnet ou de uma VPN/proxy reverso com autenticação.
303
+
304
+ > ⚠️ **Os CLIs dos agentes não são incluídos.** O `Dockerfile` observa que os CLIs `claude` / `codex` **não** estão na imagem. Para agentes numa VPS, ou adicione um passo `RUN` para instalar um CLI, ou configure provedores de API na nuvem no módulo [MODELS](./MODELS.md).
305
+
306
+ ---
307
+
308
+ ## Solução de problemas 🌠
309
+
310
+ | Sintoma | Causa provável | Correção |
311
+ | --- | --- | --- |
312
+ | Não acessa `http://<ip>:3000` | Fora da tailnet, ou IP errado | Confirme `tailscale status`; pegue o IP com `tailscale ip -4` na VPS |
313
+ | Sidecar não entra | `TS_AUTHKEY` ausente/expirado | Recrie a chave, atualize o `.env`, `docker compose up -d` |
314
+ | Redirecionado para `/login` e não avança | Primeiro boot, sem conta ainda | Cadastre-se / complete o [ONBOARDING](./ONBOARDING.md); login é obrigatório no VPS |
315
+ | `✖ Refusing to send the worker secret to a non-loopback host` | `CONSTELLA_BASE_URL` não é loopback | Deixe-a sem definir (padrão loopback) ou defina `CONSTELLA_ALLOW_REMOTE_WORKER_BASE_URL=1` deliberadamente |
316
+ | `better-auth` lança erro no boot | `BETTER_AUTH_SECRET` ausente | Garanta que o volume `/data` seja gravável para o launcher persistir o `.env` |
317
+ | Agentes não fazem nada | Sem CLI na imagem / sem provedor | Instale um CLI na imagem ou configure um provedor de nuvem ([MODELS](./MODELS.md)) |
318
+ | Web reinicia sem parar | OOM no nível do SO (RAM dos agentes) ou crash nativo | Limite agentes concorrentes, ou aumente `CONSTELLA_WEB_HEAP_MB` para um OOM de heap JS |
319
+ | `✖ … crashed 5x … giving up` | Crash-loop genuíno | Inspecione `docker compose logs constella`; corrija a causa antes de reiniciar |
320
+ | Migração de schema falha em DB novo | Permissão de volume / corrupção | Garanta que `/data` seja de `node:node` e gravável; o launcher aborta se a migração de um DB novo falhar |
321
+
322
+ ---
323
+
324
+ ## Links relacionados ✦
325
+
326
+ - [INSTALLATION](./INSTALLATION.md) — obter o pacote + pré-requisitos
327
+ - [START_MODE](./START_MODE.md) · [AUTH_MODE](./AUTH_MODE.md) · [PORTABLE_MODE](./PORTABLE_MODE.md) — os outros modos de execução
328
+ - [CONFIGURATION](./CONFIGURATION.md) — variáveis de ambiente e ajustes
329
+ - [ARCHITECTURE](./ARCHITECTURE.md) — web + worker, jaula de FS, motor de sync
330
+ - [UPDATE](./UPDATE.md) — atualizações cientes do contexto (`docker compose` no `vps`)
331
+ - [TELEGRAM](./TELEGRAM.md) — controle remoto da empresa headless
332
+ - [PUBLIC_API](./PUBLIC_API.md) · [MCP](./MCP.md) — dirigir o Constella remotamente
333
+ - [SECURITY](./SECURITY.md) — cofre, jaula de FS, limpeza de segredos
334
+ - [TROUBLESHOOTING](./TROUBLESHOOTING.md) · [FAQ](./FAQ.md)