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
package/.next/trace-build CHANGED
@@ -1 +1 @@
1
- [{"name":"run-webpack","duration":26815952,"timestamp":190799899484,"id":14,"parentId":1,"tags":{},"startTime":1782510503049,"traceId":"bc7cc12461eca835"},{"name":"run-typescript","duration":12000260,"timestamp":190826723198,"id":7670,"parentId":1,"tags":{},"startTime":1782510529873,"traceId":"bc7cc12461eca835"},{"name":"static-check","duration":1542436,"timestamp":190838901609,"id":7673,"parentId":1,"tags":{},"startTime":1782510542051,"traceId":"bc7cc12461eca835"},{"name":"static-generation","duration":3346027,"timestamp":190841194366,"id":7783,"parentId":1,"tags":{},"startTime":1782510544344,"traceId":"bc7cc12461eca835"},{"name":"collect-build-traces","duration":11536388,"timestamp":190840447211,"id":7780,"parentId":1,"tags":{},"startTime":1782510543597,"traceId":"bc7cc12461eca835"},{"name":"telemetry-flush","duration":42,"timestamp":190851987658,"id":7792,"parentId":1,"tags":{},"startTime":1782510555137,"traceId":"bc7cc12461eca835"},{"name":"next-build","duration":52206246,"timestamp":190799781460,"id":1,"tags":{"buildMode":"default","version":"16.2.9","bundler":"webpack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1782510502931,"traceId":"bc7cc12461eca835"}]
1
+ [{"name":"run-webpack","duration":28308283,"timestamp":276127696865,"id":14,"parentId":1,"tags":{},"startTime":1782595829996,"traceId":"ad93f9f314c29a48"},{"name":"run-typescript","duration":14486864,"timestamp":276156010895,"id":7671,"parentId":1,"tags":{},"startTime":1782595858310,"traceId":"ad93f9f314c29a48"},{"name":"static-check","duration":1755511,"timestamp":276170709852,"id":7674,"parentId":1,"tags":{},"startTime":1782595873009,"traceId":"ad93f9f314c29a48"},{"name":"static-generation","duration":3914775,"timestamp":276173483920,"id":7784,"parentId":1,"tags":{},"startTime":1782595875783,"traceId":"ad93f9f314c29a48"},{"name":"collect-build-traces","duration":12968077,"timestamp":276172468841,"id":7781,"parentId":1,"tags":{},"startTime":1782595874768,"traceId":"ad93f9f314c29a48"},{"name":"telemetry-flush","duration":93,"timestamp":276185442467,"id":7793,"parentId":1,"tags":{},"startTime":1782595887742,"traceId":"ad93f9f314c29a48"},{"name":"next-build","duration":57862680,"timestamp":276127579889,"id":1,"tags":{"buildMode":"default","version":"16.2.9","bundler":"webpack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1782595829879,"traceId":"ad93f9f314c29a48"}]
package/CHANGELOG.md CHANGED
@@ -12,6 +12,68 @@ may still introduce breaking changes while the platform stabilises.
12
12
 
13
13
  ---
14
14
 
15
+ ## [0.3.7] — "Open source: full source goes public"
16
+
17
+ Constella goes **fully open-source**: the public GitHub repo now carries the complete `src/`, not a
18
+ source-less compiled mirror. A pre-publication scrub and third-party licensing are in place.
19
+
20
+ ### Open source
21
+ - **Full source published.** `scripts/publish-public.mjs` now ships the whole source tree (`src/`, `bin/`,
22
+ `scripts/`, the native skills library, configs, generated migrations) — excluding only test config
23
+ (`e2e`/`tests`/Playwright) and the internal release guide (the per-locale `PUBLISHING.md`). No committed
24
+ build: the compiled `.next` still reaches users through the npm tarball, not git.
25
+ - **`THIRD_PARTY_LICENSES.md`** added at the root — indexes every bundled Agent Skill by license (Apache-2.0
26
+ © Anthropic, MIT © Leonxlnx, and the proprietary Anthropic document skills), each folder keeping its own
27
+ authoritative `LICENSE`.
28
+
29
+ ### Changed
30
+ - **Pre-publication scrub.** Neutralised third-party brand mentions and removed personal paths / example PII
31
+ from the code and docs (the `skills/` content keeps its own references — those are public web skills).
32
+
33
+ ### Docs
34
+ - Re-framed the published docs for the open-source flow (the public repo is full source, not a disposable
35
+ compiled mirror) and corrected stale "VPS runs in Docker" claims to the real **native** model
36
+ (npm + systemd + Tailscale).
37
+
38
+ ---
39
+
40
+ ## [0.3.6] — 2026-06-26 — "Hardening pass"
41
+
42
+ A whole-project code review — **security, correctness and robustness**. Highlights:
43
+
44
+ ### Security
45
+ - **Operator-account takeover closed.** The signup takeover guard keyed off the `.env` flag ALONE; a
46
+ restored/copied `constella.db` (flag absent, credential present) let an unauthenticated caller reset the
47
+ operator's password. The DB credential is now the source of truth (signup action **and** login screen).
48
+ - **Secret scanning hardened.** The commit/export scan now catches GitHub fine-grained PATs (`github_pat_…`);
49
+ the public-publish scan covers `.cjs/.cts` files and iterates ALL matches of validated patterns (a
50
+ placeholder no longer hides a real secret later in a file).
51
+ - **Web-research allowlist** re-validates the FINAL url host after redirects (and matches port-bearing hosts).
52
+ - **Live-inspect spoofing closed** — the canvas only trusts a `live:select` message from its own iframe.
53
+
54
+ ### Fixed
55
+ - **RAG reindex** no longer wipes curated KB-entry chunks (scoped to non-KB chunks).
56
+ - **Runner:** a null-assignee task can't deadlock the queue; an agent isn't left stuck "working" after a throw;
57
+ a relay failure can't abort a task's own bookkeeping; the "update available" notice stops re-appearing after
58
+ you dismiss it.
59
+ - **Telegram:** a failed ingest no longer drops the operator's message (offset advances only on success); the
60
+ inline-button allowlist is default-deny.
61
+ - **Dev server:** detached process group (a clean stop no longer orphans the real server) + an in-flight boot
62
+ lock (no second server spawned on a concurrent start).
63
+ - **Local models:** stopping the chat server (:8082) no longer also kills the RAG embedding server (:8083).
64
+ - **Dates:** report + profile no longer render far-future (year-57000) timestamps.
65
+ - Plus markdown-patch `$`-escaping, prerelease-aware update checks, a stdin-EPIPE crash guard, and a long tail
66
+ of data/UI/script fixes.
67
+
68
+ ### Changed
69
+ - **VPS one-click self-update hardened:** invoke the SAME absolute npm/systemctl the sudoers rule uses, scope
70
+ the rule to `constellai@latest` (drop the `@*` wildcard), and always (re)write the drop-in so a stale one
71
+ self-heals.
72
+ - **Docs:** an honest **compatibility status** in the README (Windows primary · Linux experimental · macOS
73
+ untested · portable in validation) + a **[roadmap](docs/roadmap.md)** skeleton.
74
+
75
+ ---
76
+
15
77
  ## [0.3.5] — 2026-06-26 — "VPS update polish"
16
78
 
17
79
  ### Fixed
@@ -97,7 +159,7 @@ Telegram.
97
159
  animations files and `<link>`s them; the canvas **inlines** them (the sandbox only renders inline CSS) and the
98
160
  production build bundles + minifies/obfuscates. Clean modular source, working live preview.
99
161
  - **Domain/style-aware RAG + skill selection** — Grace extracts keywords from the brief, mission, objective, attached
100
- mock and your message, expands them through a domain+style lexicon (hotel → booking/hospitality; "Apple/iOS" →
162
+ mock and your message, expands them through a domain+style lexicon (hotel → booking/hospitality; "native mobile" →
101
163
  glassmorphism/microinteractions/premium type) and **ranks the seeded skills** by name/tags/description, telling her
102
164
  to read the most relevant ones first — not a flat generic list.
103
165
  - **The Design → Grace → Ada → Execution flow.** A planner **design gate** holds a frontend/visual plan until the UI is
package/README.md CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  <p align="center">
7
7
  <a href="#-quickstart"><img alt="npx constella" src="https://img.shields.io/badge/npx-constellai-7c3aed?style=for-the-badge&logo=npm&logoColor=white"></a>
8
- <img alt="version" src="https://img.shields.io/badge/version-0.3.5-22d3ee?style=for-the-badge">
8
+ <img alt="version" src="https://img.shields.io/badge/version-0.3.7-22d3ee?style=for-the-badge">
9
9
  <img alt="node" src="https://img.shields.io/badge/node-%E2%89%A520-3fb950?style=for-the-badge&logo=node.js&logoColor=white">
10
10
  <img alt="license" src="https://img.shields.io/badge/license-MIT-a78bfa?style=for-the-badge">
11
11
  <img alt="agent CLIs" src="https://img.shields.io/badge/agent%20CLIs-claude%20%C2%B7%20codex%20%C2%B7%20%2B8-e879f9?style=for-the-badge">
@@ -32,6 +32,12 @@ Real `claude` / `codex` agents that plan, build, review and ship — on your mac
32
32
  > 24/7 — writing real code in a real workspace, using local or cloud models, with budgets, skills,
33
33
  > RAG memory, GitHub/Telegram integration and a deploy pipeline. **Nothing is faked.**
34
34
 
35
+ > ⚙️ **Compatibility status** — Constella is young and not yet tested in every environment:
36
+ > - **Windows** — primary platform (developed + tested here)
37
+ > - **Linux** — experimental; works normally, still in active testing
38
+ > - **macOS** — not tested yet (no Mac on hand 😅)
39
+ > - **Portable (USB) mode** — in validation
40
+
35
41
  <p align="center"><img src="docs/assets/divider-orbit.svg" alt="" width="100%"/></p>
36
42
 
37
43
  ## 🪐 What is Constella?
package/README.pt-BR.md CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  <p align="center">
7
7
  <a href="#-início-rápido"><img alt="npx constella" src="https://img.shields.io/badge/npx-constellai-7c3aed?style=for-the-badge&logo=npm&logoColor=white"></a>
8
- <img alt="version" src="https://img.shields.io/badge/version-0.3.5-22d3ee?style=for-the-badge">
8
+ <img alt="version" src="https://img.shields.io/badge/version-0.3.7-22d3ee?style=for-the-badge">
9
9
  <img alt="node" src="https://img.shields.io/badge/node-%E2%89%A520-3fb950?style=for-the-badge&logo=node.js&logoColor=white">
10
10
  <img alt="license" src="https://img.shields.io/badge/license-MIT-a78bfa?style=for-the-badge">
11
11
  <img alt="agent CLIs" src="https://img.shields.io/badge/CLIs%20de%20agente-claude%20%C2%B7%20codex%20%C2%B7%20%2B8-e879f9?style=for-the-badge">
@@ -33,6 +33,12 @@ Agentes `claude` / `codex` reais que planejam, constroem, revisam e entregam —
33
33
  > com orçamentos, skills, memória RAG, integração com GitHub/Telegram e um pipeline de deploy. **Nada é
34
34
  > falso.**
35
35
 
36
+ > ⚙️ **Status de compatibilidade** — a Constella é nova e ainda não foi testada em todos os ambientes:
37
+ > - **Windows** — plataforma principal (desenvolvida + testada aqui)
38
+ > - **Linux** — experimental; funciona normalmente, em fase de testes
39
+ > - **macOS** — não testado (não tenho um Mac 😅)
40
+ > - **Modo pen-drive (portátil)** — em validação
41
+
36
42
  <p align="center"><img src="docs/assets/divider-orbit.svg" alt="" width="100%"/></p>
37
43
 
38
44
  ## 🪐 O que é a Constella?
@@ -0,0 +1,64 @@
1
+ # Third-party licenses
2
+
3
+ Constella itself is **MIT** (see [LICENSE](LICENSE)). The bundled **Agent Skills** under `skills/` are
4
+ third-party content and are redistributed under their own licenses. Each skill folder keeps its authoritative
5
+ `LICENSE` / `LICENSE.txt` — those files are the source of truth; this page is a convenience index.
6
+
7
+ ---
8
+
9
+ ## Apache-2.0 — © Anthropic, PBC
10
+
11
+ Official Anthropic Agent Skills, redistributed under the Apache License 2.0 (each folder retains the full
12
+ license text):
13
+
14
+ - `skills/design/algorithmic-art`
15
+ - `skills/design/brand-guidelines`
16
+ - `skills/design/interface-composition-playbook`
17
+ - `skills/design/pet-companion-animation-rows-reference-guide`
18
+ - `skills/design/pet-companion-codex-companion-contract-reference-guide`
19
+ - `skills/design/pet-companion-orientation-guide`
20
+ - `skills/design/pet-companion-playbook`
21
+ - `skills/design/pet-companion-qa-rubric-reference-guide`
22
+ - `skills/design/theme-factory`
23
+ - `skills/design/uupm-ui-styling`
24
+ - `skills/front-end/canvas-design`
25
+ - `skills/front-end/claude-api`
26
+ - `skills/front-end/frontend-design`
27
+ - `skills/front-end/internal-comms`
28
+ - `skills/front-end/mcp-builder`
29
+ - `skills/front-end/skill-creator`
30
+ - `skills/front-end/slack-gif-creator`
31
+ - `skills/front-end/web-artifacts-builder`
32
+ - `skills/front-end/webapp-testing`
33
+
34
+ Apache-2.0: <https://www.apache.org/licenses/LICENSE-2.0>
35
+
36
+ ## MIT — © Leonxlnx
37
+
38
+ Design playbooks redistributed under the MIT License (each folder retains its `LICENSE`):
39
+
40
+ - `skills/design/composition-taste-interface-playbook`
41
+ - `skills/design/composition-taste-interface-v1-playbook`
42
+ - `skills/design/full-delivery-enforcement-playbook`
43
+ - `skills/design/gpt-taste-playbook`
44
+ - `skills/design/high-end-visual-composition-playbook`
45
+ - `skills/design/identity-kit-playbook`
46
+ - `skills/design/imagecraft-interface-mobile-playbook`
47
+ - `skills/design/imagecraft-interface-web-playbook`
48
+ - `skills/design/industrial-raw-ui-playbook`
49
+ - `skills/design/minimal-ui-playbook`
50
+ - `skills/design/refresh-existing-projects-playbook`
51
+ - `skills/design/stitch-composition-taste-playbook`
52
+ - `skills/design/stitch-playbook-composition-journal`
53
+ - `skills/design/visual-to-code-playbook`
54
+
55
+ ## Anthropic document skills — proprietary notice — © Anthropic, PBC
56
+
57
+ The document skills below carry "© Anthropic, PBC. All rights reserved" (use governed by your agreement with
58
+ Anthropic). They are **not** MIT/Apache. They are redistributed here as obtained from Anthropic's public
59
+ skills repository; each folder keeps its original `LICENSE.txt`, which is the authoritative term:
60
+
61
+ - `skills/front-end/docx`
62
+ - `skills/front-end/pdf`
63
+ - `skills/front-end/pptx`
64
+ - `skills/front-end/xlsx`
@@ -55,7 +55,13 @@ const PORT = String(arg("--port") || process.env.PORT || state.port || "3000");
55
55
  let LAUNCHER = Number(arg("--pid") || process.env.CONSTELLA_LAUNCHER_PID || state.launcherPid || 0);
56
56
 
57
57
  const log = (...a) => { if (!QUIET) console.log(...a); };
58
- const sleep = (ms) => { try { Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms); } catch { /* no SAB → skip */ } };
58
+ const sleep = (ms) => {
59
+ try { Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms); return; } catch { /* no SAB → busy-wait */ }
60
+ // Fallback when SharedArrayBuffer is unavailable (sandbox / hardened runtime): a real blocking wait. The old
61
+ // no-op return made the graceful-shutdown loops spin instantly → an immediate SIGKILL that skipped run.json
62
+ // cleanup + the child-kill cascade.
63
+ const end = Date.now() + ms; while (Date.now() < end) { /* block */ }
64
+ };
59
65
  const alive = (p) => { try { process.kill(p, 0); return true; } catch { return false; } };
60
66
  const psout = (s) => { try { return execFileSync("powershell", ["-NoProfile", "-Command", s], { timeout: 9000, windowsHide: true }).toString(); } catch { return ""; } };
61
67
  const ints = (s) => s.split(/\r?\n/).map((x) => +x.trim()).filter((n) => n > 0);
@@ -116,16 +122,21 @@ function relaunch() {
116
122
  // So here we update via `sudo -n` and then let systemd cycle the unit (it stops this whole cgroup — us
117
123
  // included — and starts fresh on the new code). No kill-by-pid, no relaunch: systemd owns the process.
118
124
  const SERVICE = process.env.CONSTELLA_SERVICE || "constella";
125
+ // Invoke the SAME absolute npm/systemctl the sudoers rule was written with (vps-install.sh passes them via the
126
+ // service env), so `sudo -n` matches the NOPASSWD entry even when sudo's secure_path resolves a bare `npm`/
127
+ // `systemctl` to a different path. Falls back to the bare name (unchanged behavior) when the env isn't set.
128
+ const NPM = process.env.CONSTELLA_NPM_PATH || "npm";
129
+ const SYSTEMCTL = process.env.CONSTELLA_SYSTEMCTL_PATH || "systemctl";
119
130
 
120
131
  function vpsInstall(target) {
121
132
  const opt = { stdio: QUIET ? "ignore" : "inherit", windowsHide: true, cwd: SAFE_CWD };
122
133
  for (let i = 0; i < 4; i++) {
123
- log(`• sudo npm install -g ${target} (attempt ${i + 1}/4)…`);
134
+ log(`• sudo ${NPM} install -g ${target} (attempt ${i + 1}/4)…`);
124
135
  // Prefer passwordless sudo (root-owned global prefix). Fall back to plain npm in case the prefix is
125
136
  // already user-writable (a user-level npm prefix) — then no sudo is needed at all.
126
- let r = spawnSync("sudo", ["-n", "npm", "install", "-g", target], opt);
137
+ let r = spawnSync("sudo", ["-n", NPM, "install", "-g", target], opt);
127
138
  if (r.status === 0) return true;
128
- r = spawnSync("npm", ["install", "-g", target], { ...opt, shell: true });
139
+ r = spawnSync(NPM, ["install", "-g", target], { ...opt, shell: true });
129
140
  if (r.status === 0) return true;
130
141
  sleep(3000);
131
142
  }
@@ -138,14 +149,15 @@ function restartUnit() {
138
149
  // code. The result file is already "done", so the reconnecting UI sees success. If sudo/systemctl isn't
139
150
  // available (a non-systemd container), this no-ops and the host keeps running the old code until a manual
140
151
  // restart — `Restart=always` does NOT help here because we didn't crash.
141
- try { spawnSync("sudo", ["-n", "systemctl", "restart", SERVICE], { stdio: QUIET ? "ignore" : "inherit" }); } catch { /* manual restart needed */ }
152
+ try { spawnSync("sudo", ["-n", SYSTEMCTL, "restart", SERVICE], { stdio: QUIET ? "ignore" : "inherit" }); } catch { /* manual restart needed */ }
142
153
  }
143
154
 
144
155
  if (MODE === "vps") {
145
156
  result({ status: "running" });
146
157
  if (QUIET) sleep(1200); // let the UI receive the response + start polling
147
- const v = arg("--version") || "latest";
148
- const target = `${PKG}@${/^\d+\.\d+\.\d+/.test(v) ? v : "latest"}`; // only a real semver or @latest (sudoers-scoped)
158
+ // Always @latest on a VPS: the NOPASSWD sudoers rule is scoped to EXACTLY `constellai@latest` (no `@*`
159
+ // wildcard that could span into extra args), and the button only ever wants the newest release.
160
+ const target = `${PKG}@latest`;
149
161
  const okv = vpsInstall(target);
150
162
  result({ status: okv ? "done" : "error" });
151
163
  log(okv ? "✓ Installed — restarting the service." : "✖ Update failed — run by hand: sudo npm i -g constellai@latest && sudo systemctl restart constella");
package/bin/constella.mjs CHANGED
@@ -153,7 +153,7 @@ async function pickUsbHome() {
153
153
  const PKG = "constellai"; // npm package name (the CLI command/bin stays `constella`)
154
154
  const args = process.argv.slice(2);
155
155
  const has = (f) => args.includes(f);
156
- const flag = (f) => { const i = args.indexOf(f); return i >= 0 ? args[i + 1] : undefined; };
156
+ const flag = (f) => { const i = args.indexOf(f); if (i < 0) return undefined; const v = args[i + 1]; return v && !v.startsWith("-") ? v : undefined; }; // a value-less option (e.g. `--port --onboarding`) must not swallow the next flag as its value
157
157
  const rawCmd = args.find((a) => !a.startsWith("-")); // the bare subcommand the user typed (if any)
158
158
  const cmd = rawCmd ?? "";
159
159
 
package/bin/worker.mjs CHANGED
@@ -41,6 +41,7 @@ if (!isLoopback && !ALLOW_REMOTE) {
41
41
  if (!isLoopback && ALLOW_REMOTE && new URL(BASE).protocol !== "https:") {
42
42
  console.warn(`• CONSTELLA_BASE_URL is a remote http:// host (${baseHost}) — the worker secret will travel in cleartext. Use https://.`);
43
43
  }
44
+ if (!SECRET) console.error("✖ CONSTELLA_WORKER_SECRET is empty — every privileged worker call (tick · sync · telegram) will be rejected (401) and nothing scheduled will run. Set it in ~/.constella/.env, then restart.");
44
45
  const headers = (SECRET && (isLoopback || ALLOW_REMOTE)) ? { "x-worker-secret": SECRET } : {};
45
46
 
46
47
  /* ---- 24/7 tick ---- */
package/docs/UPDATE.md CHANGED
@@ -4,8 +4,8 @@
4
4
 
5
5
  ![](./assets/divider-orbit.svg)
6
6
 
7
- **Current stable release: `v0.3.5`** — a VPS updates itself in one click (now correctly labelled + reliably
8
- enabled). See what changed in the [Changelog](../CHANGELOG.md) (the Update module also shows it inline as
7
+ **Current stable release: `v0.3.7`** — Constella goes **fully open-source**: the public repo now carries the
8
+ complete source. See what changed in the [Changelog](../CHANGELOG.md) (the Update module also shows it inline as
9
9
  “What's new”).
10
10
 
11
11
  > This is the page the **Update** module's “docs” button opens. It tells you, in plain terms, how to move Constella
@@ -24,6 +24,22 @@ it didn't earn: the updater writes the real result and the screen reflects it tr
24
24
  Latest first. The in-app **Update** module shows the changelog inline as “What's new”; this is the same history, kept
25
25
  here so the “docs” button always shows what each release added. Full detail: [Changelog](../CHANGELOG.md).
26
26
 
27
+ ### v0.3.7 — open source
28
+ - **Constella is now fully open-source** — the public GitHub repo carries the complete source (`src/` and all),
29
+ not a source-less compiled mirror. A pre-publication scrub neutralised third-party brand mentions and removed
30
+ personal paths / PII, and a root **`THIRD_PARTY_LICENSES.md`** indexes every bundled skill's license.
31
+ - Docs re-framed for the open-source flow + corrected stale "VPS = Docker" claims to the real native model
32
+ (npm + systemd + Tailscale).
33
+
34
+ ### v0.3.6 — hardening pass
35
+ - A whole-project code review (**security · correctness · robustness**): closed an operator-account takeover
36
+ (restored-DB path), hardened secret scanning (fine-grained PATs, `.cjs/.cts`, redirect re-validation), fixed
37
+ a RAG reindex that wiped curated KB chunks, a runner queue deadlock + a stuck "working" agent, a dropped
38
+ Telegram message, dev-server process-group + double-spawn, the year-57000 dates — among many others.
39
+ - **VPS one-click update hardened** — absolute npm/systemctl paths, sudoers scoped to `constellai@latest`, a
40
+ self-healing drop-in.
41
+ - Docs: an honest **compatibility status** + a **roadmap** skeleton.
42
+
27
43
  ### v0.3.5 — VPS update polish
28
44
  - Dropped the inaccurate **"(Docker)"** label — VPS mode is **native** (systemd + Tailscale, no Docker).
29
45
  - Fixed the passwordless self-update drop-in being **skipped at setup** (`visudo` wasn't on the non-root PATH), so
@@ -143,7 +143,7 @@ When this clean dir is active, `claudeSettingsArgs()` returns `[]` (the dir alre
143
143
  | `start` (local dev) | `true` | `bypassPermissions` (install + run tests) | `danger-full-access` |
144
144
  | `auth` / `vps` / `portable` (prod) | `false` | `acceptEdits` (edits only, no net/exec) | `workspace-write` (no network) |
145
145
 
146
- > Prod already runs inside Docker + Tailscale (the container is the hard jail). The CLI stays restricted on top for defense-in-depth.
146
+ > Prod already runs on a private host behind Tailscale (the tailnet-only host is the hard boundary). The CLI stays restricted on top for defense-in-depth.
147
147
 
148
148
  ### Web research 🌠
149
149
 
@@ -339,7 +339,7 @@ opencode auth list # detectCliAuth("opencode")
339
339
  - **shell:false for git/gh** — real executables run with `shell: false` so client-influenced branch/message/path args can't be re-parsed by a shell.
340
340
  - **Vanilla hooks** — `disableAllHooks` keeps an operator's plugins/hooks out of agent runs (voice + behavior isolation).
341
341
  - **Command guard** — `bin/guard-hook.mjs` (default ON) blocks catastrophic shell (`rm -rf /`, force-push, `mkfs`, fork-bomb).
342
- - **Permission jail in prod** — `acceptEdits` (no net/arbitrary exec) on top of Docker + Tailscale.
342
+ - **Permission jail in prod** — `acceptEdits` (no net/arbitrary exec) on top of the Tailscale-private host.
343
343
  - **Secret scrub** — chat replies pass through `scrubSecrets` before they're stored / shown / sent to Telegram.
344
344
  - **Prompt-injection hardening** — Telegram + attached-file clauses mark operator input as DATA, never instructions.
345
345
 
@@ -212,7 +212,7 @@ Every command parsed by `runSlashCommand`, grouped by category. "Responds as" is
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` scrubs `CONSTELLA_VAULT_KEY`, `BETTER_AUTH_SECRET` and `CONSTELLA_WORKER_SECRET` before KB ingest, Telegram and logs.
315
315
  - The worker enforces a **loopback-only SSRF guard** on `CONSTELLA_BASE_URL`.
316
316
  - `process.env` always overrides the `.env` file — operators control configuration via the shell/Docker/systemd, not via an attacker-writable file.
317
- - Agent permissions degrade safely: full access only with `--start` (your own machine); `--vps`/`--portable` stay jailed (Docker + Tailscale as the hard jail). Authentication (email + password) is required on every target. See [SECURITY](./SECURITY.md).
317
+ - Agent permissions degrade safely: full access only with `--start` (your own machine); `--vps`/`--portable` stay jailed (the host + Tailscale tailnet as the hard boundary). Authentication (email + password) is required on every target. See [SECURITY](./SECURITY.md).
318
318
 
319
319
  ---
320
320
 
package/docs/en/DESIGN.md CHANGED
@@ -96,7 +96,7 @@ The **Docs** rail renders Grace's written documentation as markdown: `design-sys
96
96
  ## RAG & skill selection 🌌
97
97
 
98
98
  Grace doesn't read a flat skill list. She **extracts keywords** from the brief, mission, objective, attached mock and
99
- your message, **expands** them through a domain + style lexicon (hotel → booking / hospitality / rooms; "Apple/iOS" →
99
+ your message, **expands** them through a domain + style lexicon (hotel → booking / hospitality / rooms; "native mobile" →
100
100
  glassmorphism / microinteractions / premium typography), and **ranks the seeded skills** by name / tags / description —
101
101
  then reads the most relevant ones first. Domain- and style-aware, not generic.
102
102
 
package/docs/en/FAQ.md CHANGED
@@ -114,7 +114,7 @@ The workspace directory is the **source of truth** (`src/lib/fs-workspace.ts`);
114
114
  Yes — two supported patterns, plus a caveat:
115
115
 
116
116
  - **Portable** (`--portable`): the runtime root lives on a **USB drive** mounted as root, carried between machines. Requires `>=32GB` free (fatal below that); `>=32GB` is fine. Binds `0.0.0.0`. Login (email + password) is required — as it is everywhere.
117
- - **VPS** (`--vps`): Constella runs in Docker on a server and you reach it over your **Tailscale tailnet**. Binds `0.0.0.0`. Login (email + password) required, same as every target.
117
+ - **VPS** (`--vps`): Constella runs natively on a server (npm + systemd) and you reach it over your **Tailscale tailnet** — no Docker; the host itself is the tailnet node. Binds `0.0.0.0`. Login (email + password) required, same as every target.
118
118
 
119
119
  Caveat: the CLI subscription credentials (`~/.claude/.credentials.json`) live on the host running the agents. Constella copies the operator's Claude credentials into a clean per-agent config dir so agents stay logged in (see Q8), but the **host machine** still needs a valid CLI login. Portable mode carries Constella's data, not necessarily every CLI's auth.
120
120
 
@@ -131,14 +131,14 @@ The launch flag is an **install target** (`src/lib/run-mode.ts`), not an auth mo
131
131
  | Install target | Launch flag | Bind | Best for |
132
132
  | --- | --- | --- | --- |
133
133
  | Local (default) | `--start` | `127.0.0.1` | Solo local use on your own machine; agents get **full access** (install deps, run tests) |
134
- | VPS | `--vps` | `0.0.0.0` | A shared server over Tailscale, runs in Docker; agents **jailed** to edits-only |
134
+ | VPS | `--vps` | `0.0.0.0` | A shared server over Tailscale (native npm + systemd, no Docker); agents **jailed** to edits-only |
135
135
  | USB | `--portable` | `0.0.0.0` | A USB you carry between machines; agents **jailed** |
136
136
 
137
137
  ```mermaid
138
138
  flowchart TD
139
139
  Q{"Where will it run?"}
140
140
  Q -->|My own machine| START["--start local, full agent access"]
141
- Q -->|A server I reach remotely| VPS["--vps Docker + Tailscale"]
141
+ Q -->|A server I reach remotely| VPS["--vps native + Tailscale"]
142
142
  Q -->|A USB I carry around| PORT["--portable"]
143
143
  START --> AUTH["all targets: signup then login<br/>email + password"]
144
144
  VPS --> AUTH
@@ -230,7 +230,7 @@ stateDiagram-v2
230
230
  **New work from a DM** (handled by `planFromConversationFor` → `generatePlanFor`):
231
231
 
232
232
  ```
233
- @ada build a billing dashboard with Stripe and a CSV export
233
+ @ada build a billing dashboard with a payment provider and a CSV export
234
234
  ```
235
235
 
236
236
  **Approve from a slash command** ([CHAT_COMMANDS](./CHAT_COMMANDS.md)):
package/docs/en/MCP.md CHANGED
@@ -33,7 +33,7 @@ scripts/mcp-server.mjs ──Bearer cn_…──► /api/v1/[[...path]] ─
33
33
 
34
34
  Key properties straight from the source:
35
35
 
36
- - **Zero dependencies.** `scripts/mcp-server.mjs` imports only `node:readline` and uses the global `fetch` (Node 18+). It ships in the compiled distribution unchanged.
36
+ - **Zero dependencies.** `scripts/mcp-server.mjs` imports only `node:readline` and uses the global `fetch` (Node 18+). It ships in the package unchanged.
37
37
  - **Hand-rolled MCP.** It implements the JSON-RPC methods `initialize`, `notifications/initialized`, `ping`, `tools/list` and `tools/call` directly — no SDK.
38
38
  - **Thin mapping.** Every tool's `build(args)` returns `{ method, path, body? }`, which `callApi` sends to `${BASE}/api/v1${path}` with `Authorization: Bearer ${PAT}` (and `x-constella-org` when `CONSTELLA_ORG` is set).
39
39
  - **One credential.** The REST layer (`authenticatePAT` in `src/server/api/pat-auth.ts`) is PAT-only; there is no session. Scope (`read` / `write`) is enforced server-side.
@@ -164,7 +164,7 @@ The MCP server talks to a live server at `CONSTELLA_BASE_URL` (default `http://l
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_your_write_token_here",
170
170
  "CONSTELLA_BASE_URL": "http://localhost:3000"
@@ -179,7 +179,7 @@ Two crucial clarifications:
179
179
  ### "Install" a placeholder plugin (PARTIAL)
180
180
 
181
181
  1. Click **Install from URL** in the topbar.
182
- 2. The browser `window.prompt` asks for a URL or name (placeholder text: `github.com/acme/slack-bridge`).
182
+ 2. The browser `window.prompt` asks for a URL or name (placeholder text: `github.com/acme/chat-bridge`).
183
183
  3. `installPlugin(url.trim())` inserts a non-native row, `enabled: true`, `description: "Installed from URL"`.
184
184
  4. Nothing is downloaded or wired. The row is a bookmark only — **this is a mock** (see [Possible states](#possible-states-)).
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
  // A non-native row appears in /plugins, enabled, description "Installed from URL".
214
214
  // No bridge code runs — it is a catalog bookmark.
@@ -347,7 +347,7 @@ $ npx constellai --portable
347
347
 
348
348
  - **Update** ([UPDATE](./UPDATE.md)) — `detectRunContext()` returns `"portable"`; `startUpdate()` does **not** auto-run on portable. It backs up `.env` + db to `<USB>/.constella/backups/<timestamp>/`, then returns the command and *"Portable: ensure free space, back up the drive, then run: `npm install -g constellai@latest`"* with `needsRestart: true`.
349
349
  - **Local models / RAG** ([MODELS](./MODELS.md), [MEMORY_RAG](./MEMORY_RAG.md)) — GGUF models and embed/chat servers run off the drive's runtime root; the 32 GB minimum boots, but local models are why you'd carry a larger drive.
350
- - **VPS** ([VPS_MODE](./VPS_MODE.md)) — shares the `0.0.0.0` bind; differs in that VPS runs in Docker over a tailnet, portable runs off a drive.
350
+ - **VPS** ([VPS_MODE](./VPS_MODE.md)) — shares the `0.0.0.0` bind; differs in that VPS runs natively on a host over a tailnet (no Docker), portable runs off a drive.
351
351
  - **Configuration** ([CONFIGURATION](./CONFIGURATION.md)) — `CONSTELLA_HOME`, `CONSTELLA_RUN_MODE`, `DATABASE_URL` and the secret env vars are documented there.
352
352
 
353
353
  ---
@@ -4,9 +4,9 @@
4
4
 
5
5
  ![](../assets/divider-orbit.svg)
6
6
 
7
- Publishing is how the central ship leaves the shipyard. Two launches happen, in two directions: the **npm tarball** carries the *compiled runtime* to end users, and the **public Git mirror** carries the *product tree* (docs, launcher, migrations — no source) to `github.com/gabriel7silva/constella`. The private development tree stays home, in orbit, on the `dev` remote.
7
+ Publishing is how the central ship leaves the shipyard. Two launches happen, in two directions: the **npm tarball** carries the *compiled runtime* to end users (the prebuilt `.next`, no build step), and the **public Git repo** carries the *full open-source tree* (`src/`, docs, launcher, migrations) to `github.com/gabriel7silva/constella`. ✦
8
8
 
9
- > **TL;DR** — End users receive a compiled, minified runtime, **never `src/`**. `npm publish` ships the prebuilt `.next`; `scripts/publish-public.mjs --push` mirrors a clean, secret-scanned, source-free tree to the public Git repo. Both refuse to ship secrets.
9
+ > **TL;DR** — End users of the **npm package** receive a compiled, minified runtime (the prebuilt `.next`, no build step) — the tarball never carries `src/`. The **public Git repo** is the open source. `npm publish` ships the prebuilt `.next`; `scripts/publish-public.mjs --push` mirrors a clean, secret-scanned tree to the public Git repo. Both refuse to ship secrets.
10
10
 
11
11
  ---
12
12
 
@@ -27,7 +27,7 @@ This page covers the **two distribution channels** and the gates that protect th
27
27
 
28
28
  ## How it works 🌌
29
29
 
30
- Constella distributes through **two channels** that share one principle: *ship the product, never the source.*
30
+ Constella distributes through **two channels**: the npm tarball ships the *compiled runtime* (no `src/` in the package), while the public Git repo ships the *open source*.
31
31
 
32
32
  ```
33
33
  ┌────────────────────── dev tree (private) ──────────────────────┐
@@ -42,13 +42,13 @@ Constella distributes through **two channels** that share one principle: *ship t
42
42
  │ npm registry: constellai │ │ public Git: gabriel7silva/ │
43
43
  │ COMPILED runtime tarball │ │ constella (force-pushed mirror) │
44
44
  │ .next + bin + drizzle + docs │ │ docs + bin + drizzle + skills │
45
- │ NO src/ │ │ NO src/, NO .next, NO secrets │
45
+ │ NO src/ │ │ FULL src/ · no .next/secrets │
46
46
  └─────────────────────────────┘ └────────────────────────────────┘
47
47
  ```
48
48
 
49
49
  1. **npm channel** — `npm publish` ships the runtime as a tarball. The `files` allowlist in `package.json` selects exactly what travels; `prepublishOnly` validates the tree; `prepack` (`trim-next.mjs`) strips dev artifacts from `.next` so end users receive only the production runtime.
50
50
  2. **Git channel** — `scripts/publish-public.mjs` builds a filtered tree in a *temporary* git index (HEAD minus `src/`/tests, plus the generated `drizzle/` migrations), secret-scans exactly that set, and **force-pushes** it as a fresh root commit to the `public` remote. The compiled `.next` does **not** travel through git — it reaches users via the npm tarball.
51
- 3. **Dual-repo** — the private `dev` remote (`constella-Dev`) keeps the full source history; the `public` remote (`constella`) is a clean, disposable mirror, not a shared history.
51
+ 3. **Public repo** — the `public` remote (`constella`) is the open-source home, carrying the full `src/` tree.
52
52
 
53
53
  > Neither channel carries `src/`. The schema reaches users as generated SQL under `drizzle/`, applied by `drizzle-kit migrate`. See [INSTALLATION](./INSTALLATION.md).
54
54
 
@@ -151,7 +151,7 @@ Because the `files` allowlist re-includes the **whole** `.next` directory (overr
151
151
 
152
152
  ### `publish-public.mjs` — the clean Git mirror
153
153
 
154
- `scripts/publish-public.mjs` produces the **source-free** Git mirror. It never runs automatically; you invoke it deliberately.
154
+ `scripts/publish-public.mjs` produces the open-source public Git tree. It never runs automatically; you invoke it deliberately.
155
155
 
156
156
  The constant that defines the whole point:
157
157
 
@@ -186,10 +186,9 @@ Flow inside the script:
186
186
 
187
187
  | Remote | Repository | Contains | History |
188
188
  | --- | --- | --- | --- |
189
- | `dev` | `gabriel7silva/constella-Dev` | Full private source tree (`src/`, tests, e2e, history) | Real, preserved |
190
- | `public` | `gabriel7silva/constella` | Product only (docs, `bin/`, `drizzle/`, `skills/`, configs) | Disposable — overwritten by force-push |
189
+ | `public` | `gabriel7silva/constella` | Open-source tree (`src/`, docs, `bin/`, `drizzle/`, `skills/`, configs) | Maintained history |
191
190
 
192
- The public mirror is **not** a shared-history collaboration target. Each `--push` writes a fresh root commit and force-overwrites `main`. Development happens against `dev`; the npm tarball is published separately from either git push.
191
+ The npm tarball is published separately from the git push.
193
192
 
194
193
  ---
195
194
 
@@ -220,7 +219,7 @@ tar -tf constellai-0.1.0.tgz | sort # inspect what would ship — confirm no s
220
219
  ```bash
221
220
  # Dry run — generate migrations if needed, compute the publish set, secret-scan, print the count:
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 — build the filtered tree in a temp index and force-push to public main:
226
225
  node scripts/publish-public.mjs --push
@@ -243,9 +242,9 @@ npm run clean # scripts/clean-repo.mjs — removes scratch artifacts at the r
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
- Dry run. To publish the clean compiled tree to the public repo, run:
247
+ Dry run. To publish the clean tree to the public repo, run:
249
248
  node scripts/publish-public.mjs --push
250
249
  ```
251
250
 
@@ -305,8 +304,8 @@ Publishing is a high-trust operation; the design assumes a mistake *will* happen
305
304
  - **Source never ships.** Both channels exclude `src/`. The Git mirror checks twice — `EXCLUDE` filters it out, then a final pass aborts if any `src/` path survived.
306
305
  - **Secret-scan refuses on any finding.** `publish-public.mjs` blocks on the **first** match per file across 10 inline patterns + a sensitive-filename rule. It is deliberately conservative (`512 KB` text-file cap, placeholder-credential allowance to avoid false positives in docs).
307
306
  - **`.env` and DB files are sensitive by filename.** They are blocked even if you never opened them — except the explicit allowlist (`.env.example`, etc.) and `drizzle/*.sql` DDL.
308
- - **Force-push is intentional.** The public repo is a *clean mirror*, not a collaboration history. It carries no `.next` and no secrets, so overwriting it is safe by construction.
309
- - **The tarball is compiled.** End users run a minified `.next` and applied SQL migrations — no readable application source, no devDependencies.
307
+ - **The public repo carries no secrets.** The publish set is secret-scanned before every push; it carries no `.next` and no `.env`.
308
+ - **The npm tarball is compiled.** End users of the package run a minified `.next` and applied SQL migrations — no build step, no devDependencies. (The source itself is open on GitHub.)
310
309
  - **Secrets live outside the tree.** Runtime secrets are persisted to `<HOME>/.env` (`chmod 600`) and never in the repo; the vault key, worker secret and auth secret are generated at first boot. See [SECURITY](./SECURITY.md).
311
310
 
312
311
  > The scanner is a safety net, not a substitute for discipline. Keep secrets in `<HOME>/.env` and the vault, never in tracked files.
@@ -340,4 +339,4 @@ Publishing is a high-trust operation; the design assumes a mistake *will* happen
340
339
 
341
340
  ---
342
341
 
343
- <sub>✦ The shipyard is quiet, the launch is loud. Ship the product, keep the blueprints. 🚀</sub>
342
+ <sub>✦ The shipyard is quiet, the launch is loud. Ship the product, open the blueprints. 🚀</sub>
package/docs/en/README.md CHANGED
@@ -28,7 +28,7 @@ Auth is always required (email + password), identical everywhere — the launch
28
28
  | Doc | What it covers |
29
29
  |-----|----------------|
30
30
  | [Start (local)](START_MODE.md) | `constella --start`, binds `127.0.0.1` — the default local install |
31
- | [VPS](VPS_MODE.md) | `constella --vps`, binds `0.0.0.0` over a Tailscale tailnet, Docker |
31
+ | [VPS](VPS_MODE.md) | `constella --vps`, binds `0.0.0.0` over a Tailscale tailnet (native, no Docker) |
32
32
  | [Portable (USB)](PORTABLE_MODE.md) | `constella --portable`, runs off a USB drive, binds `0.0.0.0` |
33
33
 
34
34
  ## 🛰️ Architecture
@@ -26,7 +26,7 @@ Constella layers independent controls so no single failure is catastrophic. The
26
26
  ```mermaid
27
27
  flowchart TB
28
28
  subgraph Edge["🛰️ Network edge"]
29
- A1["Run-mode bind: start/auth = 127.0.0.1 · vps/portable = 0.0.0.0 + Tailscale/Docker"]
29
+ A1["Run-mode bind: start/auth = 127.0.0.1 · vps/portable = 0.0.0.0 + Tailscale"]
30
30
  A2["better-auth session gate (email+password · TOTP 2FA · WebAuthn passkeys)"]
31
31
  A3["Worker endpoints: x-worker-secret, fail CLOSED"]
32
32
  end
@@ -169,10 +169,10 @@ Both hooks **fail open** on any unexpected condition (no context, network glitch
169
169
  | --- | --- | --- | --- | --- | --- |
170
170
  | `start` (local) | `127.0.0.1` | **on** (default) | `bypassPermissions` | `danger-full-access` | full: install deps + run tests |
171
171
  | `auth` | `127.0.0.1` | off | `acceptEdits` | `workspace-write` | edits-only, no network |
172
- | `vps` | `0.0.0.0` | off | `acceptEdits` | `workspace-write` | edits-only — *plus* the Docker container + Tailscale are the hard jail |
172
+ | `vps` | `0.0.0.0` | off | `acceptEdits` | `workspace-write` | edits-only — *plus* the Tailscale-private host is the hard boundary |
173
173
  | `portable` | `0.0.0.0` | off | `acceptEdits` | `workspace-write` | edits-only |
174
174
 
175
- Defense-in-depth: prod modes already run inside Docker + Tailscale (the container is the real jail); the CLI stays restricted on top. Two more agent-spawn protections:
175
+ Defense-in-depth: prod modes already run on a private host behind Tailscale (the tailnet-only host is the real boundary); the CLI stays restricted on top. Two more agent-spawn protections:
176
176
 
177
177
  - **Vanilla agents** — agents run independent of the operator's personal `~/.claude` hooks/plugins via a `--settings {disableAllHooks:true}` overlay (or a clean `CLAUDE_CONFIG_DIR` carrying only Constella's lock/guard hooks). Auth stays intact (the operator's credentials are copied in).
178
178
  - **No shell injection via model id** — `safeModel()` / `safeModelSlash()` validate the model string (which originates from agent-writable `Agent.md` frontmatter) against a strict charset before it reaches argv on a `shell: true` spawn, so `sonnet"; rm -rf ~` can't be re-parsed by the shell. Git/`gh` calls use `shell: false` so branch/message/path args are passed literally.
@@ -258,7 +258,7 @@ A local install trades network hardening for local convenience — safe precisel
258
258
  - **Authentication always on.** A real signup-then-login gate guards every session — there is no auto-login and no predictable credential. The single operator is whoever completes the first-run signup.
259
259
  - **Real auth secret persisted.** A real `BETTER_AUTH_SECRET` is generated to `<HOME>/.env` (`chmod 600`) so sessions aren't forgeable; cookies are non-`Secure` only because the local transport is plain `http`.
260
260
  - **Full-access agents are local-only.** `bypassPermissions` lets agents run shell, but the workspace is still an FS jail (`safe()` lexical + symlink checks), and the guard/lock hooks still apply. Set `CONSTELLA_AGENT_FULL_ACCESS=0` to re-jail.
261
- - **Do not port-forward a local install.** If you need remote access, use [VPS](./VPS_MODE.md) (Tailscale + Docker) — never expose the loopback install to a network.
261
+ - **Do not port-forward a local install.** If you need remote access, use [VPS](./VPS_MODE.md) (Tailscale, native) — never expose the loopback install to a network.
262
262
 
263
263
  ---
264
264
 
@@ -231,7 +231,7 @@ A message with neither text nor any saved attachment is dropped.
231
231
  /approve → queue tasks
232
232
  /start_execution → approve + 24/7 ON
233
233
  /pause /resume → flip 24/7
234
- /reject use Stripe not PayPal→ send plan back with a reason
234
+ /reject use a different payment provider → send plan back with a reason
235
235
  /cancel /archive → stop / park the active goal
236
236
  /kb how does auth work? → ask the Knowledge Base
237
237
  just talk normally → chat with the CEO (Ada)