constellai 0.3.5 → 0.3.7

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 (300) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +2 -2
  3. package/.next/prerender-manifest.json +3 -3
  4. package/.next/server/app/(app)/activity/page.js +2 -2
  5. package/.next/server/app/(app)/activity/page.js.nft.json +1 -1
  6. package/.next/server/app/(app)/activity/page_client-reference-manifest.js +1 -1
  7. package/.next/server/app/(app)/agents/[handle]/page.js +2 -2
  8. package/.next/server/app/(app)/agents/[handle]/page.js.nft.json +1 -1
  9. package/.next/server/app/(app)/agents/[handle]/page_client-reference-manifest.js +1 -1
  10. package/.next/server/app/(app)/code/page.js +2 -2
  11. package/.next/server/app/(app)/code/page.js.nft.json +1 -1
  12. package/.next/server/app/(app)/code/page_client-reference-manifest.js +1 -1
  13. package/.next/server/app/(app)/config/page.js +2 -2
  14. package/.next/server/app/(app)/config/page.js.nft.json +1 -1
  15. package/.next/server/app/(app)/config/page_client-reference-manifest.js +1 -1
  16. package/.next/server/app/(app)/costs/page.js +2 -2
  17. package/.next/server/app/(app)/costs/page.js.nft.json +1 -1
  18. package/.next/server/app/(app)/costs/page_client-reference-manifest.js +1 -1
  19. package/.next/server/app/(app)/cron/page.js +2 -2
  20. package/.next/server/app/(app)/cron/page.js.nft.json +1 -1
  21. package/.next/server/app/(app)/cron/page_client-reference-manifest.js +1 -1
  22. package/.next/server/app/(app)/dashboard/page.js +2 -2
  23. package/.next/server/app/(app)/dashboard/page.js.nft.json +1 -1
  24. package/.next/server/app/(app)/dashboard/page_client-reference-manifest.js +1 -1
  25. package/.next/server/app/(app)/design/page.js +44 -44
  26. package/.next/server/app/(app)/design/page.js.nft.json +1 -1
  27. package/.next/server/app/(app)/design/page_client-reference-manifest.js +1 -1
  28. package/.next/server/app/(app)/docs/[id]/page.js +2 -2
  29. package/.next/server/app/(app)/docs/[id]/page.js.nft.json +1 -1
  30. package/.next/server/app/(app)/docs/[id]/page_client-reference-manifest.js +1 -1
  31. package/.next/server/app/(app)/docs/page.js +2 -2
  32. package/.next/server/app/(app)/docs/page.js.nft.json +1 -1
  33. package/.next/server/app/(app)/docs/page_client-reference-manifest.js +1 -1
  34. package/.next/server/app/(app)/github/page.js +2 -2
  35. package/.next/server/app/(app)/github/page.js.nft.json +1 -1
  36. package/.next/server/app/(app)/github/page_client-reference-manifest.js +1 -1
  37. package/.next/server/app/(app)/goals/page.js +2 -2
  38. package/.next/server/app/(app)/goals/page.js.nft.json +1 -1
  39. package/.next/server/app/(app)/goals/page_client-reference-manifest.js +1 -1
  40. package/.next/server/app/(app)/inbox/page.js +2 -2
  41. package/.next/server/app/(app)/inbox/page.js.nft.json +1 -1
  42. package/.next/server/app/(app)/inbox/page_client-reference-manifest.js +1 -1
  43. package/.next/server/app/(app)/knowledge/page.js +3 -3
  44. package/.next/server/app/(app)/knowledge/page.js.nft.json +1 -1
  45. package/.next/server/app/(app)/knowledge/page_client-reference-manifest.js +1 -1
  46. package/.next/server/app/(app)/models/page.js +2 -2
  47. package/.next/server/app/(app)/models/page.js.nft.json +1 -1
  48. package/.next/server/app/(app)/models/page_client-reference-manifest.js +1 -1
  49. package/.next/server/app/(app)/notifications/page.js +2 -2
  50. package/.next/server/app/(app)/notifications/page.js.nft.json +1 -1
  51. package/.next/server/app/(app)/notifications/page_client-reference-manifest.js +1 -1
  52. package/.next/server/app/(app)/org/page.js +4 -4
  53. package/.next/server/app/(app)/org/page.js.nft.json +1 -1
  54. package/.next/server/app/(app)/org/page_client-reference-manifest.js +1 -1
  55. package/.next/server/app/(app)/organizations/page.js +2 -2
  56. package/.next/server/app/(app)/organizations/page.js.nft.json +1 -1
  57. package/.next/server/app/(app)/organizations/page_client-reference-manifest.js +1 -1
  58. package/.next/server/app/(app)/page.js +3 -3
  59. package/.next/server/app/(app)/page.js.nft.json +1 -1
  60. package/.next/server/app/(app)/page_client-reference-manifest.js +1 -1
  61. package/.next/server/app/(app)/planner/page.js +2 -2
  62. package/.next/server/app/(app)/planner/page.js.nft.json +1 -1
  63. package/.next/server/app/(app)/planner/page_client-reference-manifest.js +1 -1
  64. package/.next/server/app/(app)/plugins/page.js +2 -2
  65. package/.next/server/app/(app)/plugins/page.js.nft.json +1 -1
  66. package/.next/server/app/(app)/plugins/page_client-reference-manifest.js +1 -1
  67. package/.next/server/app/(app)/pm/page.js +2 -2
  68. package/.next/server/app/(app)/pm/page.js.nft.json +1 -1
  69. package/.next/server/app/(app)/pm/page_client-reference-manifest.js +1 -1
  70. package/.next/server/app/(app)/prepare-deploy/page.js +6 -6
  71. package/.next/server/app/(app)/prepare-deploy/page.js.nft.json +1 -1
  72. package/.next/server/app/(app)/prepare-deploy/page_client-reference-manifest.js +1 -1
  73. package/.next/server/app/(app)/profile/page.js +2 -2
  74. package/.next/server/app/(app)/profile/page.js.nft.json +1 -1
  75. package/.next/server/app/(app)/profile/page_client-reference-manifest.js +1 -1
  76. package/.next/server/app/(app)/pulse/page.js +2 -2
  77. package/.next/server/app/(app)/pulse/page.js.nft.json +1 -1
  78. package/.next/server/app/(app)/pulse/page_client-reference-manifest.js +1 -1
  79. package/.next/server/app/(app)/reports/[id]/page.js +3 -3
  80. package/.next/server/app/(app)/reports/[id]/page.js.nft.json +1 -1
  81. package/.next/server/app/(app)/reports/[id]/page_client-reference-manifest.js +1 -1
  82. package/.next/server/app/(app)/reports/page.js +2 -2
  83. package/.next/server/app/(app)/reports/page.js.nft.json +1 -1
  84. package/.next/server/app/(app)/reports/page_client-reference-manifest.js +1 -1
  85. package/.next/server/app/(app)/routines/page.js +2 -2
  86. package/.next/server/app/(app)/routines/page.js.nft.json +1 -1
  87. package/.next/server/app/(app)/routines/page_client-reference-manifest.js +1 -1
  88. package/.next/server/app/(app)/search/page.js +2 -2
  89. package/.next/server/app/(app)/search/page.js.nft.json +1 -1
  90. package/.next/server/app/(app)/search/page_client-reference-manifest.js +1 -1
  91. package/.next/server/app/(app)/security/page.js +2 -2
  92. package/.next/server/app/(app)/security/page.js.nft.json +1 -1
  93. package/.next/server/app/(app)/security/page_client-reference-manifest.js +1 -1
  94. package/.next/server/app/(app)/skills/page.js +2 -2
  95. package/.next/server/app/(app)/skills/page.js.nft.json +1 -1
  96. package/.next/server/app/(app)/skills/page_client-reference-manifest.js +1 -1
  97. package/.next/server/app/(app)/tasks/page.js +2 -2
  98. package/.next/server/app/(app)/tasks/page.js.nft.json +1 -1
  99. package/.next/server/app/(app)/tasks/page_client-reference-manifest.js +1 -1
  100. package/.next/server/app/(app)/test-dev/page.js +2 -2
  101. package/.next/server/app/(app)/test-dev/page.js.nft.json +1 -1
  102. package/.next/server/app/(app)/test-dev/page_client-reference-manifest.js +1 -1
  103. package/.next/server/app/(app)/update/page.js +3 -3
  104. package/.next/server/app/(app)/update/page.js.nft.json +1 -1
  105. package/.next/server/app/(app)/update/page_client-reference-manifest.js +1 -1
  106. package/.next/server/app/(auth)/login/page.js +2 -2
  107. package/.next/server/app/(auth)/login/page.js.nft.json +1 -1
  108. package/.next/server/app/(auth)/login/page_client-reference-manifest.js +1 -1
  109. package/.next/server/app/(auth)/onboarding/page.js +1 -1
  110. package/.next/server/app/(auth)/onboarding/page.js.nft.json +1 -1
  111. package/.next/server/app/(auth)/onboarding/page_client-reference-manifest.js +1 -1
  112. package/.next/server/app/_global-error/page.js +1 -1
  113. package/.next/server/app/_global-error/page.js.nft.json +1 -1
  114. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  115. package/.next/server/app/_global-error.html +1 -1
  116. package/.next/server/app/_global-error.rsc +3 -3
  117. package/.next/server/app/_global-error.segments/_full.segment.rsc +3 -3
  118. package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  119. package/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  120. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  121. package/.next/server/app/_global-error.segments/_index.segment.rsc +2 -2
  122. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  123. package/.next/server/app/_not-found/page.js +1 -1
  124. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  125. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  126. package/.next/server/app/api/cron/tick/route.js +16 -16
  127. package/.next/server/app/api/locks/acquire/route.js +1 -1
  128. package/.next/server/app/api/sync/file/route.js +2 -2
  129. package/.next/server/app/api/telegram/poll/route.js +11 -11
  130. package/.next/server/app/api/upload/route.js +1 -1
  131. package/.next/server/app/api/v1/[[...path]]/route.js +1 -1
  132. package/.next/server/chunks/1249.js +14 -14
  133. package/.next/server/chunks/1845.js +1 -1
  134. package/.next/server/chunks/2517.js +1 -1
  135. package/.next/server/chunks/259.js +9 -9
  136. package/.next/server/chunks/260.js +1 -1
  137. package/.next/server/chunks/2867.js +2 -2
  138. package/.next/server/chunks/2960.js +1 -1
  139. package/.next/server/chunks/3131.js +1 -1
  140. package/.next/server/chunks/3234.js +4 -4
  141. package/.next/server/chunks/4574.js +1 -0
  142. package/.next/server/chunks/4619.js +1 -1
  143. package/.next/server/chunks/4979.js +12 -12
  144. package/.next/server/chunks/6431.js +1 -1
  145. package/.next/server/chunks/6753.js +1 -0
  146. package/.next/server/chunks/7236.js +4 -0
  147. package/.next/server/chunks/7336.js +1 -1
  148. package/.next/server/chunks/7589.js +3 -3
  149. package/.next/server/chunks/7621.js +12 -0
  150. package/.next/server/chunks/7989.js +1 -1
  151. package/.next/server/chunks/7993.js +21 -0
  152. package/.next/server/chunks/850.js +1 -1
  153. package/.next/server/chunks/8561.js +3 -3
  154. package/.next/server/chunks/8623.js +1 -1
  155. package/.next/server/chunks/8762.js +15 -417
  156. package/.next/server/chunks/8823.js +1 -1
  157. package/.next/server/chunks/8846.js +1 -0
  158. package/.next/server/chunks/9160.js +417 -0
  159. package/.next/server/chunks/9783.js +3 -3
  160. package/.next/server/chunks/9969.js +1 -1
  161. package/.next/server/instrumentation.js +1 -1
  162. package/.next/server/middleware-build-manifest.js +1 -1
  163. package/.next/server/pages/500.html +1 -1
  164. package/.next/server/server-reference-manifest.js +1 -1
  165. package/.next/server/server-reference-manifest.json +1 -1
  166. package/.next/static/chunks/215-18ea748d2ff2caff.js +1 -0
  167. package/.next/static/chunks/27-b49ec46cfcce75b7.js +1 -0
  168. package/.next/static/chunks/2989-2dd9a66d007a96e8.js +4 -0
  169. package/.next/static/chunks/3219-92e75397858f3f1f.js +1 -0
  170. package/.next/static/chunks/4643-d0ab4088e129651f.js +1 -0
  171. package/.next/static/chunks/8370-e88907d9c72435e7.js +12 -0
  172. package/.next/static/chunks/app/(app)/activity/{page-29e80a32c02f376b.js → page-93d4012627ea70d5.js} +1 -1
  173. package/.next/static/chunks/app/(app)/agents/[handle]/page-bfe740784bdf239c.js +1 -0
  174. package/.next/static/chunks/app/(app)/code/{page-1f954f7688bc24e4.js → page-5e24874f11857823.js} +1 -1
  175. package/.next/static/chunks/app/(app)/config/page-12c5487a8d55c2c2.js +1 -0
  176. package/.next/static/chunks/app/(app)/costs/page-6edcec363617f5ef.js +1 -0
  177. package/.next/static/chunks/app/(app)/cron/{page-a4dd65c78173b872.js → page-f9167770757921f7.js} +1 -1
  178. package/.next/static/chunks/app/(app)/dashboard/page-103f172e762911d1.js +1 -0
  179. package/.next/static/chunks/app/(app)/design/{page-238be90d78d22780.js → page-11b9cc40f32fe34f.js} +3 -3
  180. package/.next/static/chunks/app/(app)/docs/[id]/{page-e29afa1ba1a086e1.js → page-eaae80c3d47e1ba7.js} +1 -1
  181. package/.next/static/chunks/app/(app)/docs/page-87457e514ea7de32.js +1 -0
  182. package/.next/static/chunks/app/(app)/github/page-ff62b7618c594632.js +1 -0
  183. package/.next/static/chunks/app/(app)/goals/page-d4d854c091020a92.js +1 -0
  184. package/.next/static/chunks/app/(app)/inbox/page-1bcfc50e9df5ed6f.js +12 -0
  185. package/.next/static/chunks/app/(app)/knowledge/page-0a55ce74e274817c.js +1 -0
  186. package/.next/static/chunks/app/(app)/layout-825ba765e8034dfb.js +1 -0
  187. package/.next/static/chunks/app/(app)/models/page-cd077c548916b8cb.js +1 -0
  188. package/.next/static/chunks/app/(app)/notifications/page-c5c7945f6f6f18d6.js +12 -0
  189. package/.next/static/chunks/app/(app)/org/page-a83804854bd0d44a.js +12 -0
  190. package/.next/static/chunks/app/(app)/organizations/page-b38db8e364e3a108.js +1 -0
  191. package/.next/static/chunks/app/(app)/page-733340fec4cd0173.js +1 -0
  192. package/.next/static/chunks/app/(app)/planner/{page-920e439e6f88c238.js → page-06b2841d0438d92d.js} +1 -1
  193. package/.next/static/chunks/app/(app)/plugins/{page-d10239fcbabdf4fa.js → page-535ed062643077fc.js} +1 -1
  194. package/.next/static/chunks/app/(app)/pm/page-dc0296761e1af17c.js +1 -0
  195. package/.next/static/chunks/app/(app)/prepare-deploy/page-6f0c5081caf1d013.js +1 -0
  196. package/.next/static/chunks/app/(app)/profile/page-cef1aa72ffc02e9c.js +1 -0
  197. package/.next/static/chunks/app/(app)/pulse/page-d4bdec1709913581.js +1 -0
  198. package/.next/static/chunks/app/(app)/reports/[id]/{page-a4dd65c78173b872.js → page-f9167770757921f7.js} +1 -1
  199. package/.next/static/chunks/app/(app)/reports/{page-5c07fa3a8b5ba553.js → page-5c37a53bbd4fd1c3.js} +1 -1
  200. package/.next/static/chunks/app/(app)/routines/page-e274160cfbb3c594.js +1 -0
  201. package/.next/static/chunks/app/(app)/search/{page-07e037c487f14c35.js → page-f0e082b9b0402981.js} +1 -1
  202. package/.next/static/chunks/app/(app)/security/page-a12f04656bde8aad.js +1 -0
  203. package/.next/static/chunks/app/(app)/skills/page-583f9780fa981aa8.js +1 -0
  204. package/.next/static/chunks/app/(app)/tasks/page-7bb09650b84e0755.js +1 -0
  205. package/.next/static/chunks/app/(app)/test-dev/page-ce66efbb83b2ed21.js +1 -0
  206. package/.next/static/chunks/app/(app)/update/page-6a8082f1c1b3b762.js +1 -0
  207. package/.next/static/chunks/app/(auth)/login/page-b512c906a1566d8c.js +1 -0
  208. package/.next/static/chunks/app/(auth)/onboarding/page-8f6bf1259bb5aab5.js +1 -0
  209. package/.next/trace-build +1 -1
  210. package/CHANGELOG.md +63 -1
  211. package/README.md +7 -1
  212. package/README.pt-BR.md +7 -1
  213. package/THIRD_PARTY_LICENSES.md +64 -0
  214. package/bin/constella-update.mjs +19 -7
  215. package/bin/constella.mjs +1 -1
  216. package/bin/worker.mjs +1 -0
  217. package/docs/UPDATE.md +18 -2
  218. package/docs/en/AI_ARCHITECTURE.md +2 -2
  219. package/docs/en/CHAT_COMMANDS.md +1 -1
  220. package/docs/en/CONFIGURATION.md +1 -1
  221. package/docs/en/DESIGN.md +1 -1
  222. package/docs/en/FAQ.md +3 -3
  223. package/docs/en/GOALS_SPECS_ISSUES.md +1 -1
  224. package/docs/en/MCP.md +2 -2
  225. package/docs/en/PLUGINS.md +2 -2
  226. package/docs/en/PORTABLE_MODE.md +1 -1
  227. package/docs/en/PUBLISHING.md +14 -15
  228. package/docs/en/README.md +1 -1
  229. package/docs/en/SECURITY.md +3 -3
  230. package/docs/en/START_MODE.md +1 -1
  231. package/docs/en/TELEGRAM.md +1 -1
  232. package/docs/en/TROUBLESHOOTING.md +1 -1
  233. package/docs/en/VPS_MODE.md +2 -2
  234. package/docs/pt/AI_ARCHITECTURE.md +2 -2
  235. package/docs/pt/CHAT_COMMANDS.md +1 -1
  236. package/docs/pt/CONFIGURATION.md +1 -1
  237. package/docs/pt/DESIGN.md +1 -1
  238. package/docs/pt/FAQ.md +3 -3
  239. package/docs/pt/GOALS_SPECS_ISSUES.md +1 -1
  240. package/docs/pt/MCP.md +1 -1
  241. package/docs/pt/PLUGINS.md +2 -2
  242. package/docs/pt/PORTABLE_MODE.md +1 -1
  243. package/docs/pt/PUBLISHING.md +6 -7
  244. package/docs/pt/README.md +1 -1
  245. package/docs/pt/SECURITY.md +3 -3
  246. package/docs/pt/START_MODE.md +1 -1
  247. package/docs/pt/TELEGRAM.md +1 -1
  248. package/docs/pt/TROUBLESHOOTING.md +2 -2
  249. package/docs/pt/VPS_MODE.md +1 -1
  250. package/docs/roadmap.md +36 -0
  251. package/package.json +2 -1
  252. package/scripts/i18n-parity.mjs +1 -1
  253. package/scripts/install.sh +4 -2
  254. package/scripts/publish-public.mjs +33 -19
  255. package/scripts/vps-clean.sh +1 -1
  256. package/scripts/vps-install.sh +19 -5
  257. package/scripts/vps-update.sh +26 -17
  258. package/.next/server/chunks/212.js +0 -1
  259. package/.next/server/chunks/6381.js +0 -15
  260. package/.next/server/chunks/6853.js +0 -12
  261. package/.next/server/chunks/6954.js +0 -1
  262. package/.next/server/chunks/9215.js +0 -4
  263. package/.next/server/chunks/9229.js +0 -1
  264. package/.next/server/chunks/9310.js +0 -21
  265. package/.next/static/chunks/2692-7fee6e06b3c93940.js +0 -1
  266. package/.next/static/chunks/2997-ec8b18227849683e.js +0 -1
  267. package/.next/static/chunks/3219-b4941c7ff967e904.js +0 -1
  268. package/.next/static/chunks/6602-f26d109fd94cee1d.js +0 -4
  269. package/.next/static/chunks/8370-2733742abf5f3ddf.js +0 -12
  270. package/.next/static/chunks/9112-c37628abc8a164cd.js +0 -1
  271. package/.next/static/chunks/app/(app)/agents/[handle]/page-83277413debb3b25.js +0 -1
  272. package/.next/static/chunks/app/(app)/config/page-eee4f8736608afa5.js +0 -1
  273. package/.next/static/chunks/app/(app)/costs/page-0beac688917eaa30.js +0 -1
  274. package/.next/static/chunks/app/(app)/dashboard/page-519a934ccfcce6fa.js +0 -1
  275. package/.next/static/chunks/app/(app)/docs/page-b4462f9ca2118f8b.js +0 -1
  276. package/.next/static/chunks/app/(app)/github/page-cf8501e45fe38663.js +0 -1
  277. package/.next/static/chunks/app/(app)/goals/page-75c36155c162df5b.js +0 -1
  278. package/.next/static/chunks/app/(app)/inbox/page-f40bdb457609ddad.js +0 -12
  279. package/.next/static/chunks/app/(app)/knowledge/page-dc5dd15e4f0ad22e.js +0 -1
  280. package/.next/static/chunks/app/(app)/layout-408976a4d35f06a8.js +0 -1
  281. package/.next/static/chunks/app/(app)/models/page-a54e0b8ffed0085c.js +0 -1
  282. package/.next/static/chunks/app/(app)/notifications/page-1f84d74bc53c2c6c.js +0 -12
  283. package/.next/static/chunks/app/(app)/org/page-d17c62b7a668b399.js +0 -12
  284. package/.next/static/chunks/app/(app)/organizations/page-b55445f226cf8c61.js +0 -1
  285. package/.next/static/chunks/app/(app)/page-c7dd52ecc2da529d.js +0 -1
  286. package/.next/static/chunks/app/(app)/pm/page-61ad11558f241cf1.js +0 -1
  287. package/.next/static/chunks/app/(app)/prepare-deploy/page-8d25f86b26ab0d2e.js +0 -1
  288. package/.next/static/chunks/app/(app)/profile/page-236673e1a8c1e6c6.js +0 -1
  289. package/.next/static/chunks/app/(app)/pulse/page-f2c6049a967b93a3.js +0 -1
  290. package/.next/static/chunks/app/(app)/routines/page-0193e84e6a60a06a.js +0 -1
  291. package/.next/static/chunks/app/(app)/security/page-71e5d992b5ddf79a.js +0 -1
  292. package/.next/static/chunks/app/(app)/skills/page-72691864856c9906.js +0 -1
  293. package/.next/static/chunks/app/(app)/tasks/page-5c9ca8f83d4c904f.js +0 -1
  294. package/.next/static/chunks/app/(app)/test-dev/page-5aee630d9bc73a0b.js +0 -1
  295. package/.next/static/chunks/app/(app)/update/page-2c9bcdb65bd2f597.js +0 -1
  296. package/.next/static/chunks/app/(auth)/login/page-50033813b56469ee.js +0 -1
  297. package/.next/static/chunks/app/(auth)/onboarding/page-075fd9673f7ab241.js +0 -1
  298. package/docs/assets/blackhole.svg +0 -37
  299. /package/.next/static/{vaEtsAmUuKf_DngRqwRUn → Mx3bcAGWI83SQ6PqC4kYX}/_buildManifest.js +0 -0
  300. /package/.next/static/{vaEtsAmUuKf_DngRqwRUn → Mx3bcAGWI83SQ6PqC4kYX}/_ssgManifest.js +0 -0
@@ -171,7 +171,7 @@ Each diamond is a place a real symptom appears. The table in [§7](#7-symptom--c
171
171
  | Fresh install shows the **Sign in** screen and login fails with `User not found` | A **stale `~/.constella`** from a previous install. The runtime root persists across installs by design; its `<HOME>/.env` still has `CONSTELLA_OPERATOR_PW_SET=1` (forces the login screen) while its DB has a different / no operator. `operator@constella.dev` is only the **dev** seed — a real fresh install has no account. | Use the **Sign up** screen to create the first operator. If it's stuck on Sign in, you're reading old data: remove or rename `~/.constella` (back up first — it holds the DB, secrets, workspaces), or set `CONSTELLA_HOME` to a fresh dir, then relaunch → signup. |
172
172
  | better-auth throws on a default secret | No real `BETTER_AUTH_SECRET` | The launcher generates + persists one in `<HOME>/.env` (`chmod 600`) for **every** install target (auth is universal). If you cleared `.env`, just relaunch — it regenerates. |
173
173
  | Vault can't decrypt provider keys / Telegram token | `CONSTELLA_VAULT_KEY` changed or missing | The vault is AES-256-GCM keyed by `CONSTELLA_VAULT_KEY`. **Changing it orphans existing ciphertext.** Restore the original key from `<HOME>/.env`, or re-enter the secrets. |
174
- | VPS unreachable over the tailnet | Bound `0.0.0.0` but Tailscale/Docker not wired | VPS mode binds `0.0.0.0` for the tailnet and runs in Docker. Verify the container + Tailscale; the worker still talks to the server on loopback inside the container. |
174
+ | VPS unreachable over the tailnet | Bound `0.0.0.0` but Tailscale not wired | VPS mode binds `0.0.0.0` for the tailnet and runs natively on the host. Verify the systemd service + Tailscale; the worker talks to the server on loopback. |
175
175
 
176
176
  ### 7.8 Portable & disk space 🪐
177
177
 
@@ -75,7 +75,7 @@ flowchart TD
75
75
 
76
76
  ### Native on the host
77
77
 
78
- There is **no container**. The published `constellai` npm package (the compiled, prebuilt `.next`) is installed globally with `npm i -g` — there is **no source build**, because the public tree ships no `src/`. The `constella --vps` process runs directly under the host user. Tailscale runs on the **host**, so the host itself is the tailnet node; the web server's `0.0.0.0` bind is reachable **only at the host's Tailscale IP** as long as port 3000 has no public route (tailnet + firewall). Pin a version any time with `npm install -g constellai@<version>`.
78
+ There is **no container**. The published `constellai` npm package (the compiled, prebuilt `.next`) is installed globally with `npm i -g` — there is **no source build**, because the npm package ships the prebuilt `.next`. The `constella --vps` process runs directly under the host user. Tailscale runs on the **host**, so the host itself is the tailnet node; the web server's `0.0.0.0` bind is reachable **only at the host's Tailscale IP** as long as port 3000 has no public route (tailnet + firewall). Pin a version any time with `npm install -g constellai@<version>`.
79
79
 
80
80
  ### Runtime root in the home directory
81
81
 
@@ -211,7 +211,7 @@ It runs `tailscale up` to join the host (using your tailnet account / auth flow
211
211
 
212
212
  ### 2. Provision a VPS
213
213
 
214
- A fresh **Ubuntu Server** (24.04 / 26.04 LTS) is the assumed target. You don't need to clone the repo for the managed path — the installer pulls `constellai` from npm. If you prefer to run the bootstrap from a checkout, get the product tree (it carries `scripts/vps-install.sh`):
214
+ A fresh **Ubuntu Server** (24.04 / 26.04 LTS) is the assumed target. You don't need to clone the repo for the managed path — the installer pulls `constellai` from npm. If you prefer to run the bootstrap from a checkout, get the repo (it carries `scripts/vps-install.sh`):
215
215
 
216
216
  ```bash
217
217
  apt-get update && apt-get install -y git # if git is missing
@@ -143,7 +143,7 @@ Quando esse dir limpo está ativo, `claudeSettingsArgs()` retorna `[]` (o dir j
143
143
  | `start` (dev local) | `true` | `bypassPermissions` (instala + roda testes) | `danger-full-access` |
144
144
  | `auth` / `vps` / `portable` (prod) | `false` | `acceptEdits` (só edições, sem rede/exec) | `workspace-write` (sem rede) |
145
145
 
146
- > Em prod já roda dentro de Docker + Tailscale (o container é a jaula dura). A CLI fica restrita por cima para defesa em profundidade.
146
+ > Em prod já roda num host privado atrás do Tailscale (o host só-tailnet é a fronteira dura). A CLI fica restrita por cima para defesa em profundidade.
147
147
 
148
148
  ### Pesquisa na web 🌠
149
149
 
@@ -339,7 +339,7 @@ opencode auth list # detectCliAuth("opencode")
339
339
  - **shell:false para git/gh** — executáveis reais rodam com `shell: false` para que args de branch/mensagem/caminho influenciados pelo cliente não possam ser re-parseados por um shell.
340
340
  - **Hooks vanilla** — `disableAllHooks` mantém os plugins/hooks do operador fora das execuções dos agentes (isolamento de voz + comportamento).
341
341
  - **Command guard** — `bin/guard-hook.mjs` (padrão LIGADO) bloqueia shell catastrófico (`rm -rf /`, force-push, `mkfs`, fork-bomb).
342
- - **Jaula de permissão em prod** — `acceptEdits` (sem rede/exec arbitrário) por cima de Docker + Tailscale.
342
+ - **Jaula de permissão em prod** — `acceptEdits` (sem rede/exec arbitrário) por cima do host privado no Tailscale.
343
343
  - **Scrub de segredos** — respostas de chat passam por `scrubSecrets` antes de serem armazenadas / mostradas / enviadas ao Telegram.
344
344
  - **Endurecimento contra prompt-injection** — cláusulas de Telegram + arquivos anexados marcam a entrada do operador como DADO, nunca instruções.
345
345
 
@@ -212,7 +212,7 @@ Todo comando reconhecido por `runSlashCommand`, agrupado por categoria. "Respond
212
212
  /graph SPEC-01
213
213
  /reindex
214
214
  /curate
215
- /new-goal a billing page with Stripe checkout
215
+ /new-goal a billing page with payment-provider checkout
216
216
  /new-work add 2FA to the login screen
217
217
  /generate-plan migrate the database to Postgres
218
218
  /approve
@@ -314,7 +314,7 @@ node scripts/mcp-server.mjs
314
314
  - `src/lib/scrub.ts` remove `CONSTELLA_VAULT_KEY`, `BETTER_AUTH_SECRET` e `CONSTELLA_WORKER_SECRET` antes da ingestão de KB, do Telegram e dos logs.
315
315
  - O worker aplica um **guard de SSRF apenas-loopback** em `CONSTELLA_BASE_URL`.
316
316
  - `process.env` sempre sobrescreve o arquivo `.env` — operadores controlam a configuração via shell/Docker/systemd, não via um arquivo gravável por atacante.
317
- - As permissões dos agentes degradam com segurança: acesso total só com `--start` (sua própria máquina); `--vps`/`--portable` ficam jaulados (Docker + Tailscale como jaula dura). A autenticação (e-mail + senha) é exigida em todo destino. Veja [SECURITY](./SECURITY.md).
317
+ - As permissões dos agentes degradam com segurança: acesso total só com `--start` (sua própria máquina); `--vps`/`--portable` ficam jaulados (o host só-tailnet como fronteira dura). A autenticação (e-mail + senha) é exigida em todo destino. Veja [SECURITY](./SECURITY.md).
318
318
 
319
319
  ---
320
320
 
package/docs/pt/DESIGN.md CHANGED
@@ -98,7 +98,7 @@ O painel **Docs** renderiza a documentação que a Grace escreve em markdown: `d
98
98
  ## RAG & seleção de skills 🌌
99
99
 
100
100
  A Grace não lê uma lista chapada de skills. Ela **extrai palavras-chave** do brief, missão, objetivo, mock anexado e da
101
- sua mensagem, **expande** por um léxico de domínio + estilo (hotel → reserva / hospitalidade / quartos; "Apple/iOS" →
101
+ sua mensagem, **expande** por um léxico de domínio + estilo (hotel → reserva / hospitalidade / quartos; "native mobile" →
102
102
  glassmorphism / microinterações / tipografia premium) e **rankeia as skills seedadas** por nome / tags / descrição — e
103
103
  lê as mais relevantes primeiro. Ciente de domínio e estilo, não genérica.
104
104
 
package/docs/pt/FAQ.md CHANGED
@@ -114,7 +114,7 @@ O diretório do workspace é a **fonte da verdade** (`src/lib/fs-workspace.ts`);
114
114
  Sim — dois padrões suportados, mais uma ressalva:
115
115
 
116
116
  - **Portable** (`--portable`): a raiz de runtime fica num **pendrive USB** montado como raiz, carregado entre máquinas. Requer `>=32GB` livres (fatal abaixo disso); `>=32GB` está ok. Bind em `0.0.0.0`. Login (e-mail + senha) é obrigatório — como em todos.
117
- - **VPS** (`--vps`): o Constella roda em Docker num servidor e você o acessa pela sua **tailnet Tailscale**. Bind em `0.0.0.0`. Login (e-mail + senha) obrigatório, igual a todo destino.
117
+ - **VPS** (`--vps`): o Constella roda nativamente num servidor (npm + systemd, sem Docker) e você o acessa pela sua **tailnet Tailscale**. Bind em `0.0.0.0`. Login (e-mail + senha) obrigatório, igual a todo destino.
118
118
 
119
119
  Ressalva: as credenciais de assinatura da CLI (`~/.claude/.credentials.json`) ficam no host que roda os agentes. O Constella copia as credenciais Claude do operador para um diretório de config limpo por agente para que os agentes permaneçam logados (veja Q8), mas a **máquina host** ainda precisa de um login de CLI válido. O modo portable carrega os dados do Constella, não necessariamente a autenticação de cada CLI.
120
120
 
@@ -131,14 +131,14 @@ A flag de execução é um **destino de instalação** (`src/lib/run-mode.ts`),
131
131
  | Destino de instalação | Flag | Bind | Melhor para |
132
132
  | --- | --- | --- | --- |
133
133
  | Local (padrão) | `--start` | `127.0.0.1` | Uso local solo na sua própria máquina; agentes têm **acesso total** (instalar deps, rodar testes) |
134
- | VPS | `--vps` | `0.0.0.0` | Um servidor compartilhado via Tailscale, roda em Docker; agentes **enjaulados** apenas a edições |
134
+ | VPS | `--vps` | `0.0.0.0` | Um servidor compartilhado via Tailscale (nativo, sem Docker); agentes **enjaulados** apenas a edições |
135
135
  | USB | `--portable` | `0.0.0.0` | Um USB que você carrega entre máquinas; agentes **enjaulados** |
136
136
 
137
137
  ```mermaid
138
138
  flowchart TD
139
139
  Q{"Onde vai rodar?"}
140
140
  Q -->|Minha própria máquina| START["--start local, agente com acesso total"]
141
- Q -->|Um servidor que acesso remotamente| VPS["--vps Docker + Tailscale"]
141
+ Q -->|Um servidor que acesso remotamente| VPS["--vps nativo + Tailscale"]
142
142
  Q -->|Um USB que carrego| PORT["--portable"]
143
143
  START --> AUTH["todos os destinos: cadastro depois login<br/>e-mail + senha"]
144
144
  VPS --> AUTH
@@ -230,7 +230,7 @@ stateDiagram-v2
230
230
  **Novo trabalho a partir de uma DM** (tratado por `planFromConversationFor` → `generatePlanFor`):
231
231
 
232
232
  ```
233
- @ada construa um painel de cobrança com Stripe e exportação CSV
233
+ @ada construa um painel de cobrança com um provedor de pagamento e exportação CSV
234
234
  ```
235
235
 
236
236
  **Aprovar via slash command** ([CHAT_COMMANDS](./CHAT_COMMANDS.md)):
package/docs/pt/MCP.md CHANGED
@@ -164,7 +164,7 @@ O servidor MCP conversa com um servidor ativo em `CONSTELLA_BASE_URL` (padrão `
164
164
  "mcpServers": {
165
165
  "constella": {
166
166
  "command": "node",
167
- "args": ["C:/Users/Usuario/Documents/constella/scripts/mcp-server.mjs"],
167
+ "args": ["/path/to/constella/scripts/mcp-server.mjs"],
168
168
  "env": {
169
169
  "CONSTELLA_PAT": "cn_seu_token_write_aqui",
170
170
  "CONSTELLA_BASE_URL": "http://localhost:3000"
@@ -179,7 +179,7 @@ Dois esclarecimentos cruciais:
179
179
  ### "Instalar" um plugin placeholder (PARCIAL)
180
180
 
181
181
  1. Clique em **Install from URL** na topbar.
182
- 2. O `window.prompt` do navegador pede uma URL ou nome (texto placeholder: `github.com/acme/slack-bridge`).
182
+ 2. O `window.prompt` do navegador pede uma URL ou nome (texto placeholder: `github.com/acme/chat-bridge`).
183
183
  3. `installPlugin(url.trim())` insere uma linha não-nativa, `enabled: true`, `description: "Installed from URL"`.
184
184
  4. Nada é baixado nem cabeado. A linha é apenas um marcador — **isto é um mock** (veja [Estados possíveis](#estados-possíveis-)).
185
185
 
@@ -208,7 +208,7 @@ await togglePlugin(githubPluginId, false);
208
208
  ```ts
209
209
  import { installPlugin } from "@/server/actions/plugin-actions";
210
210
 
211
- const res = await installPlugin("github.com/acme/slack-bridge");
211
+ const res = await installPlugin("github.com/acme/chat-bridge");
212
212
  // res => { ok: true }
213
213
  // Uma linha não-nativa aparece em /plugins, enabled, descrição "Installed from URL".
214
214
  // Nenhum código de bridge roda — é um marcador de catálogo.
@@ -347,7 +347,7 @@ $ npx constellai --portable
347
347
 
348
348
  - **Update** ([UPDATE](./UPDATE.md)) — `detectRunContext()` retorna `"portable"`; `startUpdate()` **não** roda automaticamente no portátil. Faz backup de `.env` + db em `<USB>/.constella/backups/<timestamp>/`, depois retorna o comando e *"Portable: ensure free space, back up the drive, then run: `npm install -g constellai@latest`"* com `needsRestart: true`.
349
349
  - **Modelos locais / RAG** ([MODELS](./MODELS.md), [MEMORY_RAG](./MEMORY_RAG.md)) — modelos GGUF e servidores de embed/chat rodam a partir do runtime root no drive; o mínimo de 32 GB dá boot, mas os modelos locais são o motivo para levar um drive maior.
350
- - **VPS** ([VPS_MODE](./VPS_MODE.md)) — compartilha o bind em `0.0.0.0`; difere por o VPS rodar em Docker sobre uma tailnet, enquanto o portátil roda a partir de um drive.
350
+ - **VPS** ([VPS_MODE](./VPS_MODE.md)) — compartilha o bind em `0.0.0.0`; difere por o VPS rodar nativamente no host sobre uma tailnet, enquanto o portátil roda a partir de um drive.
351
351
  - **Configuração** ([CONFIGURATION](./CONFIGURATION.md)) — `CONSTELLA_HOME`, `CONSTELLA_RUN_MODE`, `DATABASE_URL` e as variáveis de env de segredo estão documentadas lá.
352
352
 
353
353
  ---
@@ -4,9 +4,9 @@
4
4
 
5
5
  ![](../assets/divider-orbit.svg)
6
6
 
7
- Publicar é como a nave-mãe deixa o estaleiro. Dois lançamentos acontecem, em duas direções: o **tarball do npm** leva o *runtime compilado* aos usuários finais, e o **espelho público no Git** leva a *árvore do produto* (docs, launcher, migrações — sem código-fonte) para `github.com/gabriel7silva/constella`. A árvore privada de desenvolvimento permanece em casa, em órbita, no remoto `dev`.
7
+ Publicar é como a nave-mãe deixa o estaleiro. Dois lançamentos acontecem, em duas direções: o **tarball do npm** leva o *runtime compilado* aos usuários finais, e o repositório público no Git leva o *código-fonte aberto completo* (`src/`, docs, launcher, migrações) para `github.com/gabriel7silva/constella`. ✦
8
8
 
9
- > **Resumo** — Usuários finais recebem um runtime compilado e minificado, **nunca o `src/`**. O `npm publish` envia o `.next` pré-compilado; `scripts/publish-public.mjs --push` espelha uma árvore limpa, escaneada contra segredos e sem código-fonte para o repositório Git público. Ambos os canais se recusam a publicar segredos.
9
+ > **Resumo** — Usuários finais recebem pelo npm um runtime compilado e minificado, **nunca o `src/`** (sem etapa de build). O `npm publish` envia o `.next` pré-compilado; `scripts/publish-public.mjs --push` espelha o código-fonte aberto para o repositório Git público, escaneado contra segredos. Ambos os canais se recusam a publicar segredos.
10
10
 
11
11
  ---
12
12
 
@@ -48,7 +48,7 @@ A Constella distribui por **dois canais** que compartilham um princípio: *publi
48
48
 
49
49
  1. **Canal npm** — `npm publish` envia o runtime como um tarball. A allowlist `files` no `package.json` seleciona exatamente o que viaja; `prepublishOnly` valida a árvore; `prepack` (`trim-next.mjs`) remove os artefatos de dev do `.next`, de modo que os usuários finais recebam apenas o runtime de produção.
50
50
  2. **Canal Git** — `scripts/publish-public.mjs` constrói uma árvore filtrada em um índice git *temporário* (HEAD menos `src/`/testes, mais as migrações geradas em `drizzle/`), escaneia contra segredos exatamente esse conjunto e faz **force-push** dele como um commit-raiz novo para o remoto `public`. O `.next` compilado **não** viaja pelo git — ele chega aos usuários pelo tarball do npm.
51
- 3. **Repositório duplo** — o remoto privado `dev` (`constella-Dev`) guarda todo o histórico do código-fonte; o remoto `public` (`constella`) é um espelho limpo e descartável, não um histórico compartilhado.
51
+ 3. **Repositório público** — o remoto `public` (`constella`) é o lar do código-fonte aberto; o tarball do npm é publicado separadamente, com o `.next` compilado.
52
52
 
53
53
  > Nenhum dos canais carrega o `src/`. O esquema chega aos usuários como SQL gerado em `drizzle/`, aplicado por `drizzle-kit migrate`. Veja [INSTALLATION](./INSTALLATION.md).
54
54
 
@@ -186,8 +186,7 @@ O `publish-public.mjs` carrega um espelho inline do scanner do repositório. Ele
186
186
 
187
187
  | Remoto | Repositório | Contém | Histórico |
188
188
  | --- | --- | --- | --- |
189
- | `dev` | `gabriel7silva/constella-Dev` | Árvore de fonte privada completa (`src/`, testes, e2e, histórico) | Real, preservado |
190
- | `public` | `gabriel7silva/constella` | Apenas produto (docs, `bin/`, `drizzle/`, `skills/`, configs) | Descartável — sobrescrito por force-push |
189
+ | `public` | `gabriel7silva/constella` | Código-fonte aberto completo (`src/`, docs, `bin/`, `drizzle/`, `skills/`, configs) | Open source |
191
190
 
192
191
  O espelho público **não** é um alvo de colaboração com histórico compartilhado. Cada `--push` escreve um commit-raiz novo e sobrescreve o `main` à força. O desenvolvimento acontece contra `dev`; o tarball do npm é publicado separadamente de qualquer push git.
193
192
 
@@ -220,7 +219,7 @@ tar -tf constellai-0.1.0.tgz | sort # inspecione o que seria enviado — confi
220
219
  ```bash
221
220
  # Simulação — gera migrações se necessário, calcula o conjunto, escaneia segredos, imprime a contagem:
222
221
  node scripts/publish-public.mjs
223
- # ✓ Clean: <N> files to publish (no src/, no secrets). Migrations: <M> file(s).
222
+ # ✓ Clean: <N> files to publish (full source, no secrets). Migrations: <M> file(s).
224
223
 
225
224
  # Push — constrói a árvore filtrada em um índice temp e faz force-push para o public main:
226
225
  node scripts/publish-public.mjs --push
@@ -243,7 +242,7 @@ O `clean-repo.mjs` é idempotente e conservador: ele só apaga um conjunto conhe
243
242
 
244
243
  ```text
245
244
  $ node scripts/publish-public.mjs
246
- ✓ Clean: 412 files to publish (no src/, no secrets). Migrations: 7 file(s).
245
+ ✓ Clean: 1712 files to publish (full source, no secrets). Migrations: 7 file(s).
247
246
 
248
247
  Dry run. To publish the clean compiled tree to the public repo, run:
249
248
  node scripts/publish-public.mjs --push
package/docs/pt/README.md CHANGED
@@ -28,7 +28,7 @@ A autenticação é sempre exigida (e-mail + senha), idêntica em todos — a fl
28
28
  | Doc | O que cobre |
29
29
  |-----|-------------|
30
30
  | [Start (local)](START_MODE.md) | `constella --start`, escuta em `127.0.0.1` — a instalação local padrão |
31
- | [VPS](VPS_MODE.md) | `constella --vps`, escuta em `0.0.0.0` sobre uma tailnet Tailscale, Docker |
31
+ | [VPS](VPS_MODE.md) | `constella --vps`, escuta em `0.0.0.0` sobre uma tailnet Tailscale (nativo, sem Docker) |
32
32
  | [Portable (USB)](PORTABLE_MODE.md) | `constella --portable`, roda a partir de um pen-drive, escuta em `0.0.0.0` |
33
33
 
34
34
  ## 🛰️ Arquitetura
@@ -26,7 +26,7 @@ A Constella empilha controles independentes para que nenhuma falha isolada seja
26
26
  ```mermaid
27
27
  flowchart TB
28
28
  subgraph Edge["🛰️ Borda de rede"]
29
- A1["Bind por run-mode: start/auth = 127.0.0.1 · vps/portable = 0.0.0.0 + Tailscale/Docker"]
29
+ A1["Bind por run-mode: start/auth = 127.0.0.1 · vps/portable = 0.0.0.0 + Tailscale"]
30
30
  A2["Barreira de sessão do better-auth (e-mail+senha · 2FA TOTP · passkeys WebAuthn)"]
31
31
  A3["Endpoints do worker: x-worker-secret, fail CLOSED"]
32
32
  end
@@ -169,10 +169,10 @@ Ambos os hooks **falham abertos** em qualquer condição inesperada (sem context
169
169
  | --- | --- | --- | --- | --- | --- |
170
170
  | `start` (local) | `127.0.0.1` | **ligado** (padrão) | `bypassPermissions` | `danger-full-access` | completo: instala deps + roda testes |
171
171
  | `auth` | `127.0.0.1` | desligado | `acceptEdits` | `workspace-write` | só edições, sem rede |
172
- | `vps` | `0.0.0.0` | desligado | `acceptEdits` | `workspace-write` | só edições — *além* do container Docker + Tailscale serem a cela dura |
172
+ | `vps` | `0.0.0.0` | desligado | `acceptEdits` | `workspace-write` | só edições — *além* do host privado no Tailscale ser a fronteira dura |
173
173
  | `portable` | `0.0.0.0` | desligado | `acceptEdits` | `workspace-write` | só edições |
174
174
 
175
- Defesa em profundidade: modos de prod já rodam dentro de Docker + Tailscale (o container é a cela real); o CLI fica restrito por cima. Mais duas proteções no spawn do agente:
175
+ Defesa em profundidade: modos de prod já rodam num host privado atrás do Tailscale (o host só-tailnet é a fronteira real); o CLI fica restrito por cima. Mais duas proteções no spawn do agente:
176
176
 
177
177
  - **Agentes vanilla** — agentes rodam independentes dos hooks/plugins pessoais do `~/.claude` do operador via um overlay `--settings {disableAllHooks:true}` (ou um `CLAUDE_CONFIG_DIR` limpo carregando apenas os hooks de lock/guard da Constella). A auth permanece intacta (as credenciais do operador são copiadas).
178
178
  - **Sem injeção de shell via id de modelo** — `safeModel()` / `safeModelSlash()` validam a string de modelo (que se origina do frontmatter de `Agent.md`, gravável pelo agente) contra um charset estrito antes de chegar ao argv num spawn `shell: true`, então `sonnet"; rm -rf ~` não pode ser re-interpretado pelo shell. Chamadas de git/`gh` usam `shell: false` para que args de branch/mensagem/path sejam passados literalmente.
@@ -258,7 +258,7 @@ Uma instalação local troca o endurecimento de rede por conveniência local —
258
258
  - **Autenticação sempre ligada.** Uma barreira real de cadastro-depois-login guarda cada sessão — não há auto-login e não há credencial previsível. O operador único é quem completa o cadastro na primeira execução.
259
259
  - **Segredo de auth real persistido.** Um `BETTER_AUTH_SECRET` real é gerado em `<HOME>/.env` (`chmod 600`) para que as sessões não sejam forjáveis; os cookies são não-`Secure` apenas porque o transporte local é `http` puro.
260
260
  - **Agentes com acesso total são apenas locais.** `bypassPermissions` deixa os agentes rodarem shell, mas o workspace ainda é uma jaula de FS (`safe()` com checagens léxicas + de symlink), e os hooks de guarda/lock continuam valendo. Defina `CONSTELLA_AGENT_FULL_ACCESS=0` para reaprisionar.
261
- - **Não faça port-forward de uma instalação local.** Se precisar de acesso remoto, use [VPS](./VPS_MODE.md) (Tailscale + Docker) — nunca exponha a instalação de loopback a uma rede.
261
+ - **Não faça port-forward de uma instalação local.** Se precisar de acesso remoto, use [VPS](./VPS_MODE.md) (Tailscale, nativo) — nunca exponha a instalação de loopback a uma rede.
262
262
 
263
263
  ---
264
264
 
@@ -231,7 +231,7 @@ Uma mensagem sem texto e sem nenhum anexo salvo é descartada.
231
231
  /approve → enfileira as tasks
232
232
  /start_execution → aprova + 24/7 LIGADO
233
233
  /pause /resume → liga/desliga o 24/7
234
- /reject use Stripe e não PayPal→ devolve o plano com um motivo
234
+ /reject use um provedor de pagamento diferente → devolve o plano com um motivo
235
235
  /cancel /archive → para / arquiva o goal ativo
236
236
  /kb como funciona a auth? → pergunta à Base de Conhecimento
237
237
  só conversar normalmente → fala com a CEO (Ada)
@@ -171,7 +171,7 @@ Cada losango é um lugar onde um sintoma real aparece. A tabela em [§7](#7-sint
171
171
  | Install fresco mostra a tela **Sign in** e o login falha com `User not found` | Um **`~/.constella` velho** de um install anterior. O runtime root persiste entre installs de propósito; o `<HOME>/.env` dele ainda tem `CONSTELLA_OPERATOR_PW_SET=1` (força a tela de login) enquanto o DB tem um operator diferente / nenhum. `operator@constella.dev` é só o seed do **dev** — um install fresco de verdade não tem conta. | Use a tela **Sign up** pra criar o primeiro operator. Se travar no Sign in, você tá lendo dado velho: remova ou renomeie `~/.constella` (faça backup — tem DB, segredos, workspaces), ou aponte `CONSTELLA_HOME` pra um dir novo, e reinicie → signup. |
172
172
  | better-auth lança erro com segredo padrão | Sem `BETTER_AUTH_SECRET` real | O launcher gera + persiste um em `<HOME>/.env` (`chmod 600`) para **todo** destino de instalação (a autenticação é universal). Se você limpou o `.env`, basta reiniciar — ele regenera. |
173
173
  | O vault não decifra as chaves de provedor / token do Telegram | `CONSTELLA_VAULT_KEY` mudou ou sumiu | O vault é AES-256-GCM com chave `CONSTELLA_VAULT_KEY`. **Trocar a chave orfana o texto cifrado existente.** Restaure a chave original de `<HOME>/.env`, ou re-insira os segredos. |
174
- | VPS inacessível pela tailnet | Bind em `0.0.0.0` mas Tailscale/Docker não conectados | O modo VPS faz bind em `0.0.0.0` para a tailnet e roda em Docker. Verifique o contêiner + Tailscale; o worker ainda fala com o servidor por loopback dentro do contêiner. |
174
+ | VPS inacessível pela tailnet | Bind em `0.0.0.0` mas Tailscale não conectado | O modo VPS faz bind em `0.0.0.0` para a tailnet e roda nativamente no host sob systemd. Verifique o serviço + Tailscale; o worker ainda fala com o servidor por loopback no host. |
175
175
 
176
176
  ### 7.8 Portable & espaço em disco 🪐
177
177
 
@@ -231,7 +231,7 @@ Se um sintoma estiver à esquerda, **espere um ciclo** antes de intervir — o s
231
231
 
232
232
  **C. Os agentes não fazem nada durante a noite.** Há logs de tick mas nenhum card de trabalho se move. O plano do goal existe mas **Run 24/7 está desligado** — `tickAll(auto:true)` o pula. Aprove o plano e habilite o Run 24/7.
233
233
 
234
- **D. O worker sai na hora num VPS.** Log: `✖ Refusing to send the worker secret to a non-loopback host`. Seu `CONSTELLA_BASE_URL` aponta para um hostname público. Ajuste-o para o loopback dentro do contêiner, ou `CONSTELLA_ALLOW_REMOTE_WORKER_BASE_URL=1` sobre `https://` se o remoto for mesmo a intenção.
234
+ **D. O worker sai na hora num VPS.** Log: `✖ Refusing to send the worker secret to a non-loopback host`. Seu `CONSTELLA_BASE_URL` aponta para um hostname público. Ajuste-o para o loopback no host, ou `CONSTELLA_ALLOW_REMOTE_WORKER_BASE_URL=1` sobre `https://` se o remoto for mesmo a intenção.
235
235
 
236
236
  ---
237
237
 
@@ -75,7 +75,7 @@ flowchart TD
75
75
 
76
76
  ### Nativo no host
77
77
 
78
- **Não há contêiner.** O pacote npm publicado `constellai` (o `.next` compilado e pré-buildado) é instalado globalmente com `npm i -g` — **não há build de fonte**, porque a árvore pública não inclui `src/`. O processo `constella --vps` roda direto sob o usuário do host. O Tailscale roda no **host**, então o próprio host é o nó da tailnet; o bind `0.0.0.0` do servidor web fica acessível **apenas no IP do Tailscale do host** enquanto a porta 3000 não tiver rota pública (tailnet + firewall). Fixe uma versão a qualquer momento com `npm install -g constellai@<versão>`.
78
+ **Não há contêiner.** O pacote npm publicado `constellai` (o `.next` compilado e pré-buildado) é instalado globalmente com `npm i -g` — **não há build de fonte**, porque o pacote npm traz o `.next` pré-buildado. O processo `constella --vps` roda direto sob o usuário do host. O Tailscale roda no **host**, então o próprio host é o nó da tailnet; o bind `0.0.0.0` do servidor web fica acessível **apenas no IP do Tailscale do host** enquanto a porta 3000 não tiver rota pública (tailnet + firewall). Fixe uma versão a qualquer momento com `npm install -g constellai@<versão>`.
79
79
 
80
80
  ### Raiz de runtime no diretório home
81
81
 
@@ -0,0 +1,36 @@
1
+ # 🗺️ Constella Roadmap
2
+
3
+ [✦ Constella](../README.md) · [Changelog](../CHANGELOG.md)
4
+
5
+ ![](./assets/divider-orbit.svg)
6
+
7
+ > Where Constella is headed. A living document — items move between sections as work starts and ships.
8
+ > For what's already released, see the [Changelog](../CHANGELOG.md).
9
+
10
+ ---
11
+
12
+ ## 🚀 Now — in progress
13
+
14
+ _— to be filled in —_
15
+
16
+ ## 🔜 Next — planned
17
+
18
+ _— to be filled in —_
19
+
20
+ ## 🌌 Later — exploring
21
+
22
+ _— to be filled in —_
23
+
24
+ ## 🧪 Compatibility & platforms
25
+
26
+ _— to be filled in —_
27
+
28
+ ---
29
+
30
+ ## ✅ Shipped
31
+
32
+ Already released — see the full [Changelog](../CHANGELOG.md).
33
+
34
+ ---
35
+
36
+ [✦ Constella](../README.md) · [Changelog](../CHANGELOG.md) · [Updating](./UPDATE.md) · [Report an issue](../ISSUE.md)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "constellai",
3
- "version": "0.3.5",
3
+ "version": "0.3.7",
4
4
  "description": "Constella — run autonomous AI agent-companies locally: real claude/codex agents, Goals → Specs → Issues → Plans, local models, GitHub & Telegram, all from one cosmic control plane.",
5
5
  "//name": "Published as `constellai` (the unscoped `constella` was taken). Ships BOTH a `constellai` and a `constella` bin (same launcher): `npx constellai` needs a bin matching the package name to run on Windows, and a global install also gives the short `constella` command.",
6
6
  "license": "MIT",
@@ -44,6 +44,7 @@
44
44
  "drizzle.config.mjs",
45
45
  "README.md",
46
46
  "LICENSE",
47
+ "THIRD_PARTY_LICENSES.md",
47
48
  "CHANGELOG.md"
48
49
  ],
49
50
  "publishConfig": {
@@ -20,7 +20,7 @@ const src = readFileSync(join(root, "src/lib/i18n.ts"), "utf8");
20
20
  function keysOf(name, endMarker) {
21
21
  const start = src.indexOf(`const ${name}: Dict = {`);
22
22
  if (start === -1) throw new Error(`Could not find \`const ${name}: Dict = {\` in i18n.ts`);
23
- const end = src.indexOf(endMarker, start);
23
+ const end = src.indexOf("\n" + endMarker, start); // anchor to start-of-line so a translation VALUE containing the marker text can't truncate the key set
24
24
  if (end === -1) throw new Error(`Could not find end marker \`${endMarker}\` after \`${name}\``);
25
25
  const body = src.slice(start, end);
26
26
  const keys = new Set();
@@ -66,8 +66,10 @@ case "$MODE" in
66
66
 
67
67
  --update)
68
68
  if systemctl list-unit-files 2>/dev/null | grep -q '^constella\.service'; then
69
- # VPS: update the global CLI + restart the systemd service.
70
- exec bash -c "curl -fsSL '$RAW/scripts/vps-update.sh' | bash -s -- ${2:-}"
69
+ # VPS: update the global CLI + restart the systemd service. Pass $RAW + the version as POSITIONAL args
70
+ # to the inner shell (not interpolated into the command string) so a version with shell-special chars
71
+ # can't word-split or inject.
72
+ exec bash -c 'curl -fsSL "$1/scripts/vps-update.sh" | bash -s -- "${2:-latest}"' _ "$RAW" "${2:-}"
71
73
  else
72
74
  ensure_node; $SUDO npm install -g "${PKG}@${2:-latest}"; say "✓ Updated. Relaunch: constella --start (or --vps / --portable)"
73
75
  fi
@@ -1,15 +1,16 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * Push the CLEAN, COMPILED-distribution tree to the PUBLIC repo (`public` remote = gabriel7silva/constella).
3
+ * Push the CLEAN, OPEN-SOURCE tree to the PUBLIC repo (`public` remote = gabriel7silva/constella).
4
4
  *
5
- * The public repo ships the *product*, not the source: docs, the launcher (bin/), runtime scripts,
6
- * the native skills library, config, and the generated DB migrations (drizzle/) — but **NO `src/`**
7
- * and **no committed build** (the compiled `.next` reaches users through the npm tarball, not git).
8
- * This script builds that filtered tree in a temporary git index, secret-scans exactly what it will
9
- * publish, and REFUSES on any finding. It never runs automatically.
5
+ * The public repo is now FULL SOURCE (open-source): `src/`, docs, the launcher (bin/), runtime scripts,
6
+ * the native skills library, config, and the generated DB migrations (drizzle/) — but NOT test config
7
+ * (e2e/tests/playwright) or the internal release guide (the per-locale PUBLISHING.md), and no committed build
8
+ * (the compiled `.next` reaches users through the npm tarball, not git). This script builds that filtered
9
+ * tree in a temporary git index, secret-scans exactly what it will publish, and REFUSES on any finding. It
10
+ * force-pushes a single clean root commit (dev history stays private). It never runs automatically.
10
11
  *
11
12
  * node scripts/publish-public.mjs # scan only (dry run)
12
- * node scripts/publish-public.mjs --push # scan, then force-push the clean tree to `public main`
13
+ * node scripts/publish-public.mjs --push # scan, then force-push the clean source tree to `public main`
13
14
  */
14
15
  import { execSync } from "node:child_process";
15
16
  import { readFileSync, statSync, mkdtempSync, existsSync, readdirSync } from "node:fs";
@@ -18,8 +19,12 @@ import { join } from "node:path";
18
19
 
19
20
  const PUSH = process.argv.includes("--push");
20
21
 
21
- // Tracked paths that must NEVER reach the public repo (the whole point: no source, no test config).
22
- const EXCLUDE = ["src", "playwright.config.ts", "e2e", "tests"];
22
+ // Tracked paths that must NEVER reach the public repo: test config + the INTERNAL release guide (it names the
23
+ // private dev backup remote). `src/` is now PUBLISHED (open-source) — only these stay private.
24
+ const EXCLUDE = [
25
+ "playwright.config.ts", "e2e", "tests",
26
+ "docs/en/PUBLISHING.md", "docs/pt/PUBLISHING.md", // internal release guide (names the private dev remote)
27
+ ];
23
28
 
24
29
  // Mirror of src/server/git-scan.ts — sensitive filenames + high-confidence inline secret patterns.
25
30
  const SENSITIVE_FILE = /(^|\/)(\.env(\.[\w.-]+)?|id_[rd]sa\w*|.*\.(pem|key|p12|pfx|keystore|jks|ppk|asc)|credentials?\.json|service[-_]?account[\w.-]*\.json|.*\.(sql|dump|bak|sqlite3?|db)|npm-debug\.log|.*\.local)$/i;
@@ -41,7 +46,7 @@ const SECRETS = [
41
46
  ["DB URL with creds", /\b(?:postgres(?:ql)?|mysql|mongodb(?:\+srv)?|redis|amqp):\/\/([^\s:@/]+):([^\s:@/]+)@/, (m) => !PLACEHOLDER.test(m[1]) && !PLACEHOLDER.test(m[2])],
42
47
  ["Telegram bot token", /\b\d{6,}:[A-Za-z0-9_-]{35,}\b/],
43
48
  ];
44
- const TEXT = /\.(m?[jt]sx?|json|md|css|ya?ml|toml|sh|env|txt|html?)$/i;
49
+ const TEXT = /\.(c?m?[jt]sx?|json|md|css|ya?ml|toml|sh|env|txt|html?)$/i; // c?m? also covers .cjs/.cts/.mjs/.mts (tracked skill helpers)
45
50
 
46
51
  const isExcluded = (f) => EXCLUDE.some((p) => f === p || f.startsWith(p + "/"));
47
52
 
@@ -77,23 +82,32 @@ for (const f of publishFiles) {
77
82
  let body;
78
83
  try { if (statSync(f).size > 512 * 1024) continue; body = readFileSync(f, "utf8"); } catch { continue; }
79
84
  for (const [name, re, valid] of SECRETS) {
80
- const m = body.match(re);
81
- if (m && (!valid || valid(m))) { findings.push(`${f}: ${name}`); break; }
85
+ if (valid) {
86
+ // Validated pattern (DB URL): scan ALL matches a placeholder match first must not hide a REAL
87
+ // credential later in the file. `match()` returns only the first occurrence, so iterate.
88
+ const gre = new RegExp(re.source, re.flags.includes("g") ? re.flags : re.flags + "g");
89
+ let hit = false;
90
+ for (const m of body.matchAll(gre)) { if (valid(m)) { hit = true; break; } }
91
+ if (hit) { findings.push(`${f}: ${name}`); break; }
92
+ } else {
93
+ const m = body.match(re);
94
+ if (m) { findings.push(`${f}: ${name}`); break; }
95
+ }
82
96
  }
83
97
  }
84
- // Belt-and-suspenders: make sure no src/ slipped into the publish set.
85
- const leaked = publishFiles.filter((f) => f === "src" || f.startsWith("src/"));
86
- if (leaked.length) findings.push(`src/ leaked into the public tree (${leaked.length} file(s)) — aborting`);
98
+ // Belt-and-suspenders: make sure the internal release guide never slips through.
99
+ const leaked = publishFiles.filter((f) => /(^|\/)PUBLISHING\.md$/.test(f));
100
+ if (leaked.length) findings.push(`internal PUBLISHING.md leaked into the public tree (${leaked.join(", ")}) — aborting`);
87
101
 
88
102
  if (findings.length) {
89
- console.error(`\n✖ Refusing to publish — ${findings.length} potential secret/sensitive/source finding(s):`);
103
+ console.error(`\n✖ Refusing to publish — ${findings.length} potential secret/sensitive finding(s):`);
90
104
  for (const x of findings.slice(0, 30)) console.error(" - " + x);
91
105
  process.exit(1);
92
106
  }
93
- console.log(`✓ Clean: ${publishFiles.length} files to publish (no src/, no secrets). Migrations: ${publishFiles.filter((f) => f.startsWith("drizzle/")).length} file(s).`);
107
+ console.log(`✓ Clean: ${publishFiles.length} files to publish (full source, no secrets). Migrations: ${publishFiles.filter((f) => f.startsWith("drizzle/")).length} file(s).`);
94
108
 
95
109
  if (!PUSH) {
96
- console.log("\nDry run. To publish the clean compiled tree to the public repo, run:");
110
+ console.log("\nDry run. To publish the clean source tree to the public repo, run:");
97
111
  console.log(" node scripts/publish-public.mjs --push");
98
112
  process.exit(0);
99
113
  }
@@ -107,7 +121,7 @@ execSync("git read-tree HEAD", { env, stdio: "inherit" });
107
121
  for (const p of EXCLUDE) execSync(`git rm -r --cached --ignore-unmatch -- "${p}"`, { env, stdio: "ignore" });
108
122
  if (existsSync("drizzle")) execSync("git add -f -- drizzle", { env, stdio: "inherit" });
109
123
  const tree = execSync("git write-tree", { env }).toString().trim();
110
- const commit = execSync(`git commit-tree ${tree} -m "Constella — compiled distribution (docs, launcher, migrations; no source)"`, { env }).toString().trim();
124
+ const commit = execSync(`git commit-tree ${tree} -m "Constella — public source release (open-source mirror; no test config / build)"`, { env }).toString().trim();
111
125
 
112
126
  console.log(`Pushing clean tree (${commit.slice(0, 9)}) to \`public\` (gabriel7silva/constella)…`);
113
127
  // Fully-qualify the destination ref: pushing a bare commit object to `main` fails on an empty remote
@@ -40,7 +40,7 @@ fi
40
40
  # 1) Stop + remove the systemd service.
41
41
  if systemctl list-unit-files 2>/dev/null | grep -q '^constella\.service'; then
42
42
  say "• Stopping + removing the constella systemd service…"
43
- $SUDO systemctl disable --now constella 2>/dev/null
43
+ $SUDO systemctl disable --now constella || say " ⚠ disable failed — removing the unit anyway; the daemon-reload below clears any dangling .wants symlink."
44
44
  $SUDO rm -f /etc/systemd/system/constella.service
45
45
  $SUDO systemctl daemon-reload 2>/dev/null
46
46
  else
@@ -40,13 +40,25 @@ fi
40
40
  # 2) The Constella CLI.
41
41
  say "• Installing the ${PKG} CLI…"
42
42
  $SUDO npm install -g "$PKG"
43
- BIN="$(command -v constella || true)"; [ -n "$BIN" ] || BIN="/usr/bin/constella"
43
+ # The service MUST run the binary that `sudo npm i -g` installs/updates NOT whatever `command -v constella`
44
+ # resolves first on the operator's PATH. An earlier user-level `npm i -g` (into ~/.npm-global) shadows it, so
45
+ # ExecStart would pin THAT copy and every future `sudo npm i -g` (in-app update, vps-update.sh) would update a
46
+ # different prefix → "updated, but the app still shows the old version". Pin ExecStart to sudo's global prefix.
47
+ NPM_PREFIX="$($SUDO npm config get prefix 2>/dev/null)"; [ -n "$NPM_PREFIX" ] || NPM_PREFIX="/usr/local"
48
+ BIN="${NPM_PREFIX}/bin/constella"
49
+ [ -x "$BIN" ] || BIN="$(command -v constella || echo "$BIN")"
50
+ say " → service binary: ${BIN} (global prefix ${NPM_PREFIX})"
51
+
52
+ # Absolute npm/systemctl paths — passed to the in-app self-updater via the service env AND used in the sudoers
53
+ # rule below, so `sudo -n` matches the NOPASSWD entry regardless of how sudo's secure_path resolves a bare name.
54
+ NPM_PATH="$(command -v npm || echo "${NPM_PREFIX}/bin/npm")"
55
+ SYSTEMCTL_PATH="$(command -v systemctl || echo /usr/bin/systemctl)"
44
56
 
45
57
  # Agent CLIs (claude / codex / …) install into per-USER bin dirs (~/.local/bin, ~/.npm-global/bin, the claude
46
58
  # native install) that systemd's minimal PATH does NOT include — so the service couldn't run them: the onboarding
47
59
  # "detected providers" missed Claude Code, and real agent runs would fail to spawn the CLI. Bake a PATH that
48
60
  # covers the common locations + the installer's own PATH so the service sees exactly what your shell does.
49
- NPM_BIN="$(npm config get prefix 2>/dev/null)/bin"
61
+ NPM_BIN="${NPM_PREFIX}/bin"
50
62
  SVC_PATH="${RUN_HOME}/.local/bin:${RUN_HOME}/.npm-global/bin:${NPM_BIN}:${RUN_HOME}/.claude/local:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:${PATH}"
51
63
 
52
64
  # 3) Tailscale on the host (the host IS the tailnet node — no sidecar, no auth key prompt).
@@ -72,6 +84,8 @@ Environment=CONSTELLA_RUN_MODE=vps
72
84
  Environment=CONSTELLA_HOME=${CHOME}
73
85
  Environment=CONSTELLA_SKIP_TAILSCALE=1
74
86
  Environment=PATH=${SVC_PATH}
87
+ Environment=CONSTELLA_NPM_PATH=${NPM_PATH}
88
+ Environment=CONSTELLA_SYSTEMCTL_PATH=${SYSTEMCTL_PATH}
75
89
  ExecStart=${BIN} --vps --host 0.0.0.0 --port 3000
76
90
  Restart=always
77
91
  RestartSec=3
@@ -88,16 +102,16 @@ $SUDO systemctl enable --now constella
88
102
  # package and restart the unit. Nothing else. Validated with `visudo -c` before it's installed (a malformed
89
103
  # sudoers file would lock out sudo), and skipped gracefully if validation fails.
90
104
  say "• Enabling passwordless self-update (sudoers.d/constella)…"
91
- NPM_PATH="$(command -v npm || echo /usr/bin/npm)"
92
- SYSTEMCTL_PATH="$(command -v systemctl || echo /usr/bin/systemctl)"
93
105
  # visudo lives in /usr/sbin, which is NOT on a non-root user's PATH (this script may run as the operator via
94
106
  # `curl | bash`). Resolve it explicitly and validate THROUGH sudo so it's both found and privileged.
95
107
  VISUDO="$(command -v visudo || echo /usr/sbin/visudo)"
96
108
  SUDOERS_TMP="$(mktemp)"
109
+ # EXACT commands only — `constellai@latest` (the in-app button always installs latest), not a trailing `@*`
110
+ # wildcard whose `*` can span whitespace and absorb extra npm flags under root.
97
111
  cat > "$SUDOERS_TMP" <<EOF
98
112
  # Constella self-update - managed by scripts/vps-install.sh. Lets ${RUN_USER} update Constella and restart
99
113
  # its service without a password (the in-app Update button + scripts/vps-update.sh). Scoped to two commands.
100
- ${RUN_USER} ALL=(root) NOPASSWD: ${NPM_PATH} install -g constellai, ${NPM_PATH} install -g constellai@*, ${SYSTEMCTL_PATH} restart constella, ${SYSTEMCTL_PATH} restart constella.service
114
+ ${RUN_USER} ALL=(root) NOPASSWD: ${NPM_PATH} install -g constellai, ${NPM_PATH} install -g constellai@latest, ${SYSTEMCTL_PATH} restart constella, ${SYSTEMCTL_PATH} restart constella.service
101
115
  EOF
102
116
  if $SUDO "$VISUDO" -cf "$SUDOERS_TMP" >/dev/null 2>&1; then
103
117
  $SUDO install -m 0440 -o root -g root "$SUDOERS_TMP" /etc/sudoers.d/constella