constella 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (747) hide show
  1. package/.next/BUILD_ID +1 -0
  2. package/.next/app-path-routes-manifest.json +53 -0
  3. package/.next/build-manifest.json +20 -0
  4. package/.next/diagnostics/build-diagnostics.json +6 -0
  5. package/.next/diagnostics/framework.json +1 -0
  6. package/.next/export-marker.json +6 -0
  7. package/.next/images-manifest.json +68 -0
  8. package/.next/next-minimal-server.js.nft.json +1 -0
  9. package/.next/next-server.js.nft.json +1 -0
  10. package/.next/package.json +1 -0
  11. package/.next/prerender-manifest.json +36 -0
  12. package/.next/react-loadable-manifest.json +14 -0
  13. package/.next/required-server-files.js +343 -0
  14. package/.next/required-server-files.json +343 -0
  15. package/.next/routes-manifest.json +362 -0
  16. package/.next/server/app/(app)/activity/page.js +2 -0
  17. package/.next/server/app/(app)/activity/page.js.nft.json +1 -0
  18. package/.next/server/app/(app)/activity/page_client-reference-manifest.js +1 -0
  19. package/.next/server/app/(app)/agents/[handle]/page.js +18 -0
  20. package/.next/server/app/(app)/agents/[handle]/page.js.nft.json +1 -0
  21. package/.next/server/app/(app)/agents/[handle]/page_client-reference-manifest.js +1 -0
  22. package/.next/server/app/(app)/code/page.js +2 -0
  23. package/.next/server/app/(app)/code/page.js.nft.json +1 -0
  24. package/.next/server/app/(app)/code/page_client-reference-manifest.js +1 -0
  25. package/.next/server/app/(app)/config/page.js +2 -0
  26. package/.next/server/app/(app)/config/page.js.nft.json +1 -0
  27. package/.next/server/app/(app)/config/page_client-reference-manifest.js +1 -0
  28. package/.next/server/app/(app)/costs/page.js +2 -0
  29. package/.next/server/app/(app)/costs/page.js.nft.json +1 -0
  30. package/.next/server/app/(app)/costs/page_client-reference-manifest.js +1 -0
  31. package/.next/server/app/(app)/cron/page.js +2 -0
  32. package/.next/server/app/(app)/cron/page.js.nft.json +1 -0
  33. package/.next/server/app/(app)/cron/page_client-reference-manifest.js +1 -0
  34. package/.next/server/app/(app)/dashboard/page.js +2 -0
  35. package/.next/server/app/(app)/dashboard/page.js.nft.json +1 -0
  36. package/.next/server/app/(app)/dashboard/page_client-reference-manifest.js +1 -0
  37. package/.next/server/app/(app)/docs/[id]/page.js +2 -0
  38. package/.next/server/app/(app)/docs/[id]/page.js.nft.json +1 -0
  39. package/.next/server/app/(app)/docs/[id]/page_client-reference-manifest.js +1 -0
  40. package/.next/server/app/(app)/docs/page.js +2 -0
  41. package/.next/server/app/(app)/docs/page.js.nft.json +1 -0
  42. package/.next/server/app/(app)/docs/page_client-reference-manifest.js +1 -0
  43. package/.next/server/app/(app)/github/page.js +2 -0
  44. package/.next/server/app/(app)/github/page.js.nft.json +1 -0
  45. package/.next/server/app/(app)/github/page_client-reference-manifest.js +1 -0
  46. package/.next/server/app/(app)/goals/page.js +2 -0
  47. package/.next/server/app/(app)/goals/page.js.nft.json +1 -0
  48. package/.next/server/app/(app)/goals/page_client-reference-manifest.js +1 -0
  49. package/.next/server/app/(app)/inbox/page.js +2 -0
  50. package/.next/server/app/(app)/inbox/page.js.nft.json +1 -0
  51. package/.next/server/app/(app)/inbox/page_client-reference-manifest.js +1 -0
  52. package/.next/server/app/(app)/knowledge/page.js +3 -0
  53. package/.next/server/app/(app)/knowledge/page.js.nft.json +1 -0
  54. package/.next/server/app/(app)/knowledge/page_client-reference-manifest.js +1 -0
  55. package/.next/server/app/(app)/models/page.js +2 -0
  56. package/.next/server/app/(app)/models/page.js.nft.json +1 -0
  57. package/.next/server/app/(app)/models/page_client-reference-manifest.js +1 -0
  58. package/.next/server/app/(app)/notifications/page.js +2 -0
  59. package/.next/server/app/(app)/notifications/page.js.nft.json +1 -0
  60. package/.next/server/app/(app)/notifications/page_client-reference-manifest.js +1 -0
  61. package/.next/server/app/(app)/org/page.js +2 -0
  62. package/.next/server/app/(app)/org/page.js.nft.json +1 -0
  63. package/.next/server/app/(app)/org/page_client-reference-manifest.js +1 -0
  64. package/.next/server/app/(app)/organizations/page.js +2 -0
  65. package/.next/server/app/(app)/organizations/page.js.nft.json +1 -0
  66. package/.next/server/app/(app)/organizations/page_client-reference-manifest.js +1 -0
  67. package/.next/server/app/(app)/page.js +3 -0
  68. package/.next/server/app/(app)/page.js.nft.json +1 -0
  69. package/.next/server/app/(app)/page_client-reference-manifest.js +1 -0
  70. package/.next/server/app/(app)/planner/page.js +2 -0
  71. package/.next/server/app/(app)/planner/page.js.nft.json +1 -0
  72. package/.next/server/app/(app)/planner/page_client-reference-manifest.js +1 -0
  73. package/.next/server/app/(app)/plugins/page.js +2 -0
  74. package/.next/server/app/(app)/plugins/page.js.nft.json +1 -0
  75. package/.next/server/app/(app)/plugins/page_client-reference-manifest.js +1 -0
  76. package/.next/server/app/(app)/pm/page.js +2 -0
  77. package/.next/server/app/(app)/pm/page.js.nft.json +1 -0
  78. package/.next/server/app/(app)/pm/page_client-reference-manifest.js +1 -0
  79. package/.next/server/app/(app)/prepare-deploy/page.js +19 -0
  80. package/.next/server/app/(app)/prepare-deploy/page.js.nft.json +1 -0
  81. package/.next/server/app/(app)/prepare-deploy/page_client-reference-manifest.js +1 -0
  82. package/.next/server/app/(app)/profile/page.js +2 -0
  83. package/.next/server/app/(app)/profile/page.js.nft.json +1 -0
  84. package/.next/server/app/(app)/profile/page_client-reference-manifest.js +1 -0
  85. package/.next/server/app/(app)/pulse/page.js +2 -0
  86. package/.next/server/app/(app)/pulse/page.js.nft.json +1 -0
  87. package/.next/server/app/(app)/pulse/page_client-reference-manifest.js +1 -0
  88. package/.next/server/app/(app)/reports/[id]/page.js +3 -0
  89. package/.next/server/app/(app)/reports/[id]/page.js.nft.json +1 -0
  90. package/.next/server/app/(app)/reports/[id]/page_client-reference-manifest.js +1 -0
  91. package/.next/server/app/(app)/reports/page.js +5 -0
  92. package/.next/server/app/(app)/reports/page.js.nft.json +1 -0
  93. package/.next/server/app/(app)/reports/page_client-reference-manifest.js +1 -0
  94. package/.next/server/app/(app)/routines/page.js +2 -0
  95. package/.next/server/app/(app)/routines/page.js.nft.json +1 -0
  96. package/.next/server/app/(app)/routines/page_client-reference-manifest.js +1 -0
  97. package/.next/server/app/(app)/search/page.js +2 -0
  98. package/.next/server/app/(app)/search/page.js.nft.json +1 -0
  99. package/.next/server/app/(app)/search/page_client-reference-manifest.js +1 -0
  100. package/.next/server/app/(app)/security/page.js +2 -0
  101. package/.next/server/app/(app)/security/page.js.nft.json +1 -0
  102. package/.next/server/app/(app)/security/page_client-reference-manifest.js +1 -0
  103. package/.next/server/app/(app)/skills/page.js +18 -0
  104. package/.next/server/app/(app)/skills/page.js.nft.json +1 -0
  105. package/.next/server/app/(app)/skills/page_client-reference-manifest.js +1 -0
  106. package/.next/server/app/(app)/tasks/page.js +2 -0
  107. package/.next/server/app/(app)/tasks/page.js.nft.json +1 -0
  108. package/.next/server/app/(app)/tasks/page_client-reference-manifest.js +1 -0
  109. package/.next/server/app/(app)/test-dev/page.js +2 -0
  110. package/.next/server/app/(app)/test-dev/page.js.nft.json +1 -0
  111. package/.next/server/app/(app)/test-dev/page_client-reference-manifest.js +1 -0
  112. package/.next/server/app/(app)/update/page.js +2 -0
  113. package/.next/server/app/(app)/update/page.js.nft.json +1 -0
  114. package/.next/server/app/(app)/update/page_client-reference-manifest.js +1 -0
  115. package/.next/server/app/(auth)/login/page.js +2 -0
  116. package/.next/server/app/(auth)/login/page.js.nft.json +1 -0
  117. package/.next/server/app/(auth)/login/page_client-reference-manifest.js +1 -0
  118. package/.next/server/app/(auth)/onboarding/page.js +18 -0
  119. package/.next/server/app/(auth)/onboarding/page.js.nft.json +1 -0
  120. package/.next/server/app/(auth)/onboarding/page_client-reference-manifest.js +1 -0
  121. package/.next/server/app/_global-error/page.js +32 -0
  122. package/.next/server/app/_global-error/page.js.nft.json +1 -0
  123. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -0
  124. package/.next/server/app/_global-error.html +1 -0
  125. package/.next/server/app/_global-error.meta +16 -0
  126. package/.next/server/app/_global-error.rsc +15 -0
  127. package/.next/server/app/_global-error.segments/_full.segment.rsc +15 -0
  128. package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +5 -0
  129. package/.next/server/app/_global-error.segments/_global-error.segment.rsc +5 -0
  130. package/.next/server/app/_global-error.segments/_head.segment.rsc +5 -0
  131. package/.next/server/app/_global-error.segments/_index.segment.rsc +6 -0
  132. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -0
  133. package/.next/server/app/_not-found/page.js +2 -0
  134. package/.next/server/app/_not-found/page.js.nft.json +1 -0
  135. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -0
  136. package/.next/server/app/api/auth/[...all]/route.js +1 -0
  137. package/.next/server/app/api/auth/[...all]/route.js.nft.json +1 -0
  138. package/.next/server/app/api/auth/[...all]/route_client-reference-manifest.js +1 -0
  139. package/.next/server/app/api/cron/tick/route.js +52 -0
  140. package/.next/server/app/api/cron/tick/route.js.nft.json +1 -0
  141. package/.next/server/app/api/cron/tick/route_client-reference-manifest.js +1 -0
  142. package/.next/server/app/api/dev-login/route.js +1 -0
  143. package/.next/server/app/api/dev-login/route.js.nft.json +1 -0
  144. package/.next/server/app/api/dev-login/route_client-reference-manifest.js +1 -0
  145. package/.next/server/app/api/locks/acquire/route.js +1 -0
  146. package/.next/server/app/api/locks/acquire/route.js.nft.json +1 -0
  147. package/.next/server/app/api/locks/acquire/route_client-reference-manifest.js +1 -0
  148. package/.next/server/app/api/models/progress/route.js +1 -0
  149. package/.next/server/app/api/models/progress/route.js.nft.json +1 -0
  150. package/.next/server/app/api/models/progress/route_client-reference-manifest.js +1 -0
  151. package/.next/server/app/api/passkey/authenticate/options/route.js +1 -0
  152. package/.next/server/app/api/passkey/authenticate/options/route.js.nft.json +1 -0
  153. package/.next/server/app/api/passkey/authenticate/options/route_client-reference-manifest.js +1 -0
  154. package/.next/server/app/api/passkey/authenticate/verify/route.js +1 -0
  155. package/.next/server/app/api/passkey/authenticate/verify/route.js.nft.json +1 -0
  156. package/.next/server/app/api/passkey/authenticate/verify/route_client-reference-manifest.js +1 -0
  157. package/.next/server/app/api/passkey/register/options/route.js +1 -0
  158. package/.next/server/app/api/passkey/register/options/route.js.nft.json +1 -0
  159. package/.next/server/app/api/passkey/register/options/route_client-reference-manifest.js +1 -0
  160. package/.next/server/app/api/passkey/register/verify/route.js +1 -0
  161. package/.next/server/app/api/passkey/register/verify/route.js.nft.json +1 -0
  162. package/.next/server/app/api/passkey/register/verify/route_client-reference-manifest.js +1 -0
  163. package/.next/server/app/api/stream/route.js +4 -0
  164. package/.next/server/app/api/stream/route.js.nft.json +1 -0
  165. package/.next/server/app/api/stream/route_client-reference-manifest.js +1 -0
  166. package/.next/server/app/api/sync/file/route.js +2 -0
  167. package/.next/server/app/api/sync/file/route.js.nft.json +1 -0
  168. package/.next/server/app/api/sync/file/route_client-reference-manifest.js +1 -0
  169. package/.next/server/app/api/telegram/poll/route.js +15 -0
  170. package/.next/server/app/api/telegram/poll/route.js.nft.json +1 -0
  171. package/.next/server/app/api/telegram/poll/route_client-reference-manifest.js +1 -0
  172. package/.next/server/app/api/upload/route.js +1 -0
  173. package/.next/server/app/api/upload/route.js.nft.json +1 -0
  174. package/.next/server/app/api/upload/route_client-reference-manifest.js +1 -0
  175. package/.next/server/app/api/v1/[[...path]]/route.js +1 -0
  176. package/.next/server/app/api/v1/[[...path]]/route.js.nft.json +1 -0
  177. package/.next/server/app/api/v1/[[...path]]/route_client-reference-manifest.js +1 -0
  178. package/.next/server/app-paths-manifest.json +53 -0
  179. package/.next/server/chunks/1003.js +1 -0
  180. package/.next/server/chunks/127.js +26 -0
  181. package/.next/server/chunks/1388.js +1 -0
  182. package/.next/server/chunks/1408.js +21 -0
  183. package/.next/server/chunks/1572.js +1 -0
  184. package/.next/server/chunks/1591.js +24 -0
  185. package/.next/server/chunks/1619.js +188 -0
  186. package/.next/server/chunks/162.js +1 -0
  187. package/.next/server/chunks/1881.js +1 -0
  188. package/.next/server/chunks/1968.js +1 -0
  189. package/.next/server/chunks/2297.js +348 -0
  190. package/.next/server/chunks/2341.js +1 -0
  191. package/.next/server/chunks/2517.js +1 -0
  192. package/.next/server/chunks/2549.js +1 -0
  193. package/.next/server/chunks/259.js +14 -0
  194. package/.next/server/chunks/2599.js +1 -0
  195. package/.next/server/chunks/260.js +1 -0
  196. package/.next/server/chunks/2867.js +147 -0
  197. package/.next/server/chunks/3018.js +1 -0
  198. package/.next/server/chunks/3050.js +18 -0
  199. package/.next/server/chunks/3085.js +12 -0
  200. package/.next/server/chunks/3131.js +1 -0
  201. package/.next/server/chunks/3242.js +1 -0
  202. package/.next/server/chunks/3266.js +15 -0
  203. package/.next/server/chunks/3524.js +1 -0
  204. package/.next/server/chunks/3527.js +479 -0
  205. package/.next/server/chunks/3533.js +869 -0
  206. package/.next/server/chunks/3550.js +1 -0
  207. package/.next/server/chunks/3609.js +2 -0
  208. package/.next/server/chunks/3667.js +462 -0
  209. package/.next/server/chunks/3760.js +4 -0
  210. package/.next/server/chunks/4679.js +1 -0
  211. package/.next/server/chunks/4804.js +1 -0
  212. package/.next/server/chunks/4832.js +2 -0
  213. package/.next/server/chunks/4853.js +1 -0
  214. package/.next/server/chunks/4979.js +67 -0
  215. package/.next/server/chunks/5060.js +1 -0
  216. package/.next/server/chunks/5278.js +1 -0
  217. package/.next/server/chunks/5614.js +1 -0
  218. package/.next/server/chunks/5818.js +1 -0
  219. package/.next/server/chunks/6479.js +1 -0
  220. package/.next/server/chunks/6658.js +1 -0
  221. package/.next/server/chunks/6706.js +1 -0
  222. package/.next/server/chunks/6719.js +1 -0
  223. package/.next/server/chunks/678.js +1 -0
  224. package/.next/server/chunks/683.js +1 -0
  225. package/.next/server/chunks/6862.js +1 -0
  226. package/.next/server/chunks/6882.js +1 -0
  227. package/.next/server/chunks/7037.js +1 -0
  228. package/.next/server/chunks/7107.js +741 -0
  229. package/.next/server/chunks/73.js +17 -0
  230. package/.next/server/chunks/7327.js +1 -0
  231. package/.next/server/chunks/7514.js +1 -0
  232. package/.next/server/chunks/7622.js +1 -0
  233. package/.next/server/chunks/7778.js +1 -0
  234. package/.next/server/chunks/7912.js +1 -0
  235. package/.next/server/chunks/7949.js +1 -0
  236. package/.next/server/chunks/7971.js +1 -0
  237. package/.next/server/chunks/7989.js +1 -0
  238. package/.next/server/chunks/842.js +22 -0
  239. package/.next/server/chunks/8762.js +15 -0
  240. package/.next/server/chunks/8823.js +77 -0
  241. package/.next/server/chunks/9146.js +4 -0
  242. package/.next/server/chunks/9676.js +1 -0
  243. package/.next/server/chunks/9783.js +22 -0
  244. package/.next/server/chunks/9969.js +3 -0
  245. package/.next/server/functions-config-manifest.json +18 -0
  246. package/.next/server/instrumentation.js +1 -0
  247. package/.next/server/instrumentation.js.nft.json +1 -0
  248. package/.next/server/interception-route-rewrite-manifest.js +1 -0
  249. package/.next/server/middleware-build-manifest.js +1 -0
  250. package/.next/server/middleware-manifest.json +6 -0
  251. package/.next/server/middleware-react-loadable-manifest.js +1 -0
  252. package/.next/server/middleware.js +18 -0
  253. package/.next/server/middleware.js.nft.json +1 -0
  254. package/.next/server/next-font-manifest.js +1 -0
  255. package/.next/server/next-font-manifest.json +1 -0
  256. package/.next/server/pages/500.html +1 -0
  257. package/.next/server/pages-manifest.json +3 -0
  258. package/.next/server/prefetch-hints.json +1 -0
  259. package/.next/server/server-reference-manifest.js +1 -0
  260. package/.next/server/server-reference-manifest.json +1 -0
  261. package/.next/server/webpack-runtime.js +1 -0
  262. package/.next/static/chunks/1858-339516f78a4b00da.js +1 -0
  263. package/.next/static/chunks/2320-fc8b39380e69d465.js +2 -0
  264. package/.next/static/chunks/23550918-ff694f70f4b0648c.js +1 -0
  265. package/.next/static/chunks/3219-ebb3c23be38c838d.js +1 -0
  266. package/.next/static/chunks/4263-adecb5b466380b6e.js +1 -0
  267. package/.next/static/chunks/5479-0cceab68cd0ca9c7.js +1 -0
  268. package/.next/static/chunks/5701-665b927b06158b76.js +1 -0
  269. package/.next/static/chunks/5920.6451a68b63918988.js +1 -0
  270. package/.next/static/chunks/6575-5c9139720bb0f5bf.js +4 -0
  271. package/.next/static/chunks/6834-4759af1ce7d95fb6.js +32 -0
  272. package/.next/static/chunks/7509.721cd47a931c5518.js +1 -0
  273. package/.next/static/chunks/8264-1ca011989ee2b231.js +1 -0
  274. package/.next/static/chunks/9219-4a39a98b5502d9d1.js +1 -0
  275. package/.next/static/chunks/9690-53d5222618cbeddb.js +1 -0
  276. package/.next/static/chunks/app/(app)/activity/page-3973534281ecea81.js +1 -0
  277. package/.next/static/chunks/app/(app)/agents/[handle]/page-83662a175c098282.js +1 -0
  278. package/.next/static/chunks/app/(app)/code/page-33979545192cd137.js +1 -0
  279. package/.next/static/chunks/app/(app)/config/page-9933aed1ca8a85c1.js +1 -0
  280. package/.next/static/chunks/app/(app)/costs/page-131c4dc580efcc19.js +1 -0
  281. package/.next/static/chunks/app/(app)/cron/page-53ea1aff998a87ca.js +1 -0
  282. package/.next/static/chunks/app/(app)/dashboard/page-deed83aaa9d0d447.js +1 -0
  283. package/.next/static/chunks/app/(app)/docs/[id]/page-38c993d73c0eab4f.js +1 -0
  284. package/.next/static/chunks/app/(app)/docs/page-bf463b55d0554e86.js +1 -0
  285. package/.next/static/chunks/app/(app)/error-988cd28480809861.js +1 -0
  286. package/.next/static/chunks/app/(app)/github/page-62678b4e82dfecb6.js +1 -0
  287. package/.next/static/chunks/app/(app)/goals/page-4adb426fe1c96106.js +1 -0
  288. package/.next/static/chunks/app/(app)/inbox/page-e347dc55ab467310.js +1 -0
  289. package/.next/static/chunks/app/(app)/knowledge/page-65393a045b4349be.js +1 -0
  290. package/.next/static/chunks/app/(app)/layout-7f65675705b011d8.js +1 -0
  291. package/.next/static/chunks/app/(app)/models/page-e01f1dd7e49a2951.js +1 -0
  292. package/.next/static/chunks/app/(app)/notifications/page-56548ac87aef00da.js +1 -0
  293. package/.next/static/chunks/app/(app)/org/page-699e6a6dc0db7d81.js +1 -0
  294. package/.next/static/chunks/app/(app)/organizations/page-36051a380a7e8eb7.js +1 -0
  295. package/.next/static/chunks/app/(app)/page-7d1011a566f81520.js +1 -0
  296. package/.next/static/chunks/app/(app)/planner/page-dab7ced94083373a.js +1 -0
  297. package/.next/static/chunks/app/(app)/plugins/page-5b5a1f53389be42e.js +1 -0
  298. package/.next/static/chunks/app/(app)/pm/page-0de5c08c0b227bb0.js +1 -0
  299. package/.next/static/chunks/app/(app)/prepare-deploy/page-e426038552df8d41.js +1 -0
  300. package/.next/static/chunks/app/(app)/profile/page-608dfcaf8aae0a69.js +1 -0
  301. package/.next/static/chunks/app/(app)/pulse/page-309ccaca91de1faa.js +1 -0
  302. package/.next/static/chunks/app/(app)/reports/[id]/page-53ea1aff998a87ca.js +1 -0
  303. package/.next/static/chunks/app/(app)/reports/page-68cdc6dcfa472d86.js +1 -0
  304. package/.next/static/chunks/app/(app)/routines/page-bcc55550b197a9fa.js +1 -0
  305. package/.next/static/chunks/app/(app)/search/page-5c5f67558d0dbf0d.js +1 -0
  306. package/.next/static/chunks/app/(app)/security/page-a7d41e36aa366b45.js +1 -0
  307. package/.next/static/chunks/app/(app)/skills/page-c5b21e89593b8336.js +1 -0
  308. package/.next/static/chunks/app/(app)/tasks/page-08ae079e3e54d2ce.js +1 -0
  309. package/.next/static/chunks/app/(app)/test-dev/page-633f82dfd9c3ce23.js +1 -0
  310. package/.next/static/chunks/app/(app)/update/page-4be019054351bfac.js +1 -0
  311. package/.next/static/chunks/app/(auth)/login/page-6e85d3377062acae.js +1 -0
  312. package/.next/static/chunks/app/(auth)/onboarding/page-ebb10c175abf3b85.js +1 -0
  313. package/.next/static/chunks/app/_global-error/page-23fe50a6bf589c97.js +1 -0
  314. package/.next/static/chunks/app/_not-found/page-dc38b02aebeab535.js +1 -0
  315. package/.next/static/chunks/app/api/auth/[...all]/route-23fe50a6bf589c97.js +1 -0
  316. package/.next/static/chunks/app/api/cron/tick/route-23fe50a6bf589c97.js +1 -0
  317. package/.next/static/chunks/app/api/dev-login/route-23fe50a6bf589c97.js +1 -0
  318. package/.next/static/chunks/app/api/locks/acquire/route-23fe50a6bf589c97.js +1 -0
  319. package/.next/static/chunks/app/api/models/progress/route-23fe50a6bf589c97.js +1 -0
  320. package/.next/static/chunks/app/api/passkey/authenticate/options/route-23fe50a6bf589c97.js +1 -0
  321. package/.next/static/chunks/app/api/passkey/authenticate/verify/route-23fe50a6bf589c97.js +1 -0
  322. package/.next/static/chunks/app/api/passkey/register/options/route-23fe50a6bf589c97.js +1 -0
  323. package/.next/static/chunks/app/api/passkey/register/verify/route-23fe50a6bf589c97.js +1 -0
  324. package/.next/static/chunks/app/api/stream/route-23fe50a6bf589c97.js +1 -0
  325. package/.next/static/chunks/app/api/sync/file/route-23fe50a6bf589c97.js +1 -0
  326. package/.next/static/chunks/app/api/telegram/poll/route-23fe50a6bf589c97.js +1 -0
  327. package/.next/static/chunks/app/api/upload/route-23fe50a6bf589c97.js +1 -0
  328. package/.next/static/chunks/app/api/v1/[[...path]]/route-23fe50a6bf589c97.js +1 -0
  329. package/.next/static/chunks/app/error-09899a13c38b6e89.js +1 -0
  330. package/.next/static/chunks/app/global-error-b8050d4d886f448c.js +1 -0
  331. package/.next/static/chunks/app/layout-ab9deed1e7e2e9df.js +1 -0
  332. package/.next/static/chunks/framework-4b2c6b6043dd203f.js +1 -0
  333. package/.next/static/chunks/main-722e16032e7764d1.js +5 -0
  334. package/.next/static/chunks/main-app-761880af2b6f1962.js +1 -0
  335. package/.next/static/chunks/next/dist/client/components/builtin/app-error-23fe50a6bf589c97.js +1 -0
  336. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-23fe50a6bf589c97.js +1 -0
  337. package/.next/static/chunks/next/dist/client/components/builtin/not-found-23fe50a6bf589c97.js +1 -0
  338. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-23fe50a6bf589c97.js +1 -0
  339. package/.next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
  340. package/.next/static/chunks/webpack-222e3894b78c67db.js +1 -0
  341. package/.next/static/css/0a9b5805594444e3.css +1 -0
  342. package/.next/static/yztMvBwyrWWkSqP6jfXoa/_buildManifest.js +1 -0
  343. package/.next/static/yztMvBwyrWWkSqP6jfXoa/_ssgManifest.js +1 -0
  344. package/.next/trace-build +1 -0
  345. package/.next/types/app/(app)/activity/page.ts +87 -0
  346. package/.next/types/app/(app)/agents/[handle]/page.ts +87 -0
  347. package/.next/types/app/(app)/code/page.ts +87 -0
  348. package/.next/types/app/(app)/config/page.ts +87 -0
  349. package/.next/types/app/(app)/costs/page.ts +87 -0
  350. package/.next/types/app/(app)/cron/page.ts +87 -0
  351. package/.next/types/app/(app)/dashboard/page.ts +87 -0
  352. package/.next/types/app/(app)/docs/[id]/page.ts +87 -0
  353. package/.next/types/app/(app)/docs/page.ts +87 -0
  354. package/.next/types/app/(app)/github/page.ts +87 -0
  355. package/.next/types/app/(app)/goals/page.ts +87 -0
  356. package/.next/types/app/(app)/inbox/page.ts +87 -0
  357. package/.next/types/app/(app)/knowledge/page.ts +87 -0
  358. package/.next/types/app/(app)/models/page.ts +87 -0
  359. package/.next/types/app/(app)/notifications/page.ts +87 -0
  360. package/.next/types/app/(app)/org/page.ts +87 -0
  361. package/.next/types/app/(app)/organizations/page.ts +87 -0
  362. package/.next/types/app/(app)/page.ts +87 -0
  363. package/.next/types/app/(app)/planner/page.ts +87 -0
  364. package/.next/types/app/(app)/plugins/page.ts +87 -0
  365. package/.next/types/app/(app)/pm/page.ts +87 -0
  366. package/.next/types/app/(app)/prepare-deploy/page.ts +87 -0
  367. package/.next/types/app/(app)/profile/page.ts +87 -0
  368. package/.next/types/app/(app)/pulse/page.ts +87 -0
  369. package/.next/types/app/(app)/reports/[id]/page.ts +87 -0
  370. package/.next/types/app/(app)/reports/page.ts +87 -0
  371. package/.next/types/app/(app)/routines/page.ts +87 -0
  372. package/.next/types/app/(app)/search/page.ts +87 -0
  373. package/.next/types/app/(app)/security/page.ts +87 -0
  374. package/.next/types/app/(app)/skills/page.ts +87 -0
  375. package/.next/types/app/(app)/tasks/page.ts +87 -0
  376. package/.next/types/app/(app)/test-dev/page.ts +87 -0
  377. package/.next/types/app/(app)/update/page.ts +87 -0
  378. package/.next/types/app/(auth)/login/page.ts +87 -0
  379. package/.next/types/app/(auth)/onboarding/page.ts +87 -0
  380. package/.next/types/app/api/auth/[...all]/route.ts +351 -0
  381. package/.next/types/app/api/cron/tick/route.ts +351 -0
  382. package/.next/types/app/api/dev-login/route.ts +351 -0
  383. package/.next/types/app/api/locks/acquire/route.ts +351 -0
  384. package/.next/types/app/api/models/progress/route.ts +351 -0
  385. package/.next/types/app/api/passkey/authenticate/options/route.ts +351 -0
  386. package/.next/types/app/api/passkey/authenticate/verify/route.ts +351 -0
  387. package/.next/types/app/api/passkey/register/options/route.ts +351 -0
  388. package/.next/types/app/api/passkey/register/verify/route.ts +351 -0
  389. package/.next/types/app/api/stream/route.ts +351 -0
  390. package/.next/types/app/api/sync/file/route.ts +351 -0
  391. package/.next/types/app/api/telegram/poll/route.ts +351 -0
  392. package/.next/types/app/api/upload/route.ts +351 -0
  393. package/.next/types/app/api/v1/[[...path]]/route.ts +351 -0
  394. package/.next/types/cache-life.d.ts +145 -0
  395. package/.next/types/link.d.ts +210 -0
  396. package/.next/types/package.json +1 -0
  397. package/.next/types/routes.d.ts +120 -0
  398. package/.next/types/validator.ts +511 -0
  399. package/CHANGELOG.md +312 -0
  400. package/LICENSE +21 -0
  401. package/README.md +382 -0
  402. package/README.pt-BR.md +391 -0
  403. package/bin/constella.mjs +329 -0
  404. package/bin/guard-hook.mjs +44 -0
  405. package/bin/lock-hook.mjs +49 -0
  406. package/bin/worker.mjs +142 -0
  407. package/docs/assets/arch-orbit.svg +56 -0
  408. package/docs/assets/blackhole.svg +37 -0
  409. package/docs/assets/divider-orbit.svg +23 -0
  410. package/docs/assets/hero-constella.svg +72 -0
  411. package/docs/en/AGENTS.md +279 -0
  412. package/docs/en/AI_ARCHITECTURE.md +373 -0
  413. package/docs/en/ARCHITECTURE.md +334 -0
  414. package/docs/en/AUTH_MODE.md +247 -0
  415. package/docs/en/CHAT_COMMANDS.md +305 -0
  416. package/docs/en/CONFIGURATION.md +340 -0
  417. package/docs/en/DEPLOY.md +331 -0
  418. package/docs/en/DM.md +297 -0
  419. package/docs/en/FAQ.md +258 -0
  420. package/docs/en/GITHUB.md +341 -0
  421. package/docs/en/GOALS_SPECS_ISSUES.md +303 -0
  422. package/docs/en/INBOX.md +340 -0
  423. package/docs/en/INSTALLATION.md +329 -0
  424. package/docs/en/KB_AGENT.md +305 -0
  425. package/docs/en/KB_RAG.md +356 -0
  426. package/docs/en/MCP.md +313 -0
  427. package/docs/en/MEMORY_RAG.md +289 -0
  428. package/docs/en/MODELS.md +341 -0
  429. package/docs/en/ONBOARDING.md +327 -0
  430. package/docs/en/PLUGINS.md +290 -0
  431. package/docs/en/PORTABLE_MODE.md +387 -0
  432. package/docs/en/PO_AGENT.md +379 -0
  433. package/docs/en/PREPARE_DEPLOY.md +308 -0
  434. package/docs/en/PROJECT_STACKS.md +258 -0
  435. package/docs/en/PUBLIC_API.md +315 -0
  436. package/docs/en/PUBLISHING.md +343 -0
  437. package/docs/en/README.md +95 -0
  438. package/docs/en/SECURITY.md +280 -0
  439. package/docs/en/SKILLS.md +349 -0
  440. package/docs/en/START_MODE.md +340 -0
  441. package/docs/en/SYNCED_BLOCKS.md +320 -0
  442. package/docs/en/TEAM_ROOM.md +285 -0
  443. package/docs/en/TELEGRAM.md +294 -0
  444. package/docs/en/TEST_DEV.md +321 -0
  445. package/docs/en/TROUBLESHOOTING.md +294 -0
  446. package/docs/en/UPDATE.md +301 -0
  447. package/docs/en/VPS_MODE.md +334 -0
  448. package/docs/en/WORKFLOW.md +321 -0
  449. package/docs/pt/AGENTS.md +279 -0
  450. package/docs/pt/AI_ARCHITECTURE.md +373 -0
  451. package/docs/pt/ARCHITECTURE.md +334 -0
  452. package/docs/pt/AUTH_MODE.md +247 -0
  453. package/docs/pt/CHAT_COMMANDS.md +307 -0
  454. package/docs/pt/CONFIGURATION.md +340 -0
  455. package/docs/pt/DEPLOY.md +331 -0
  456. package/docs/pt/DM.md +297 -0
  457. package/docs/pt/FAQ.md +258 -0
  458. package/docs/pt/GITHUB.md +341 -0
  459. package/docs/pt/GOALS_SPECS_ISSUES.md +303 -0
  460. package/docs/pt/INBOX.md +340 -0
  461. package/docs/pt/INSTALLATION.md +329 -0
  462. package/docs/pt/KB_AGENT.md +305 -0
  463. package/docs/pt/KB_RAG.md +356 -0
  464. package/docs/pt/MCP.md +313 -0
  465. package/docs/pt/MEMORY_RAG.md +289 -0
  466. package/docs/pt/MODELS.md +341 -0
  467. package/docs/pt/ONBOARDING.md +327 -0
  468. package/docs/pt/PLUGINS.md +290 -0
  469. package/docs/pt/PORTABLE_MODE.md +387 -0
  470. package/docs/pt/PO_AGENT.md +379 -0
  471. package/docs/pt/PREPARE_DEPLOY.md +308 -0
  472. package/docs/pt/PROJECT_STACKS.md +258 -0
  473. package/docs/pt/PUBLIC_API.md +315 -0
  474. package/docs/pt/PUBLISHING.md +343 -0
  475. package/docs/pt/README.md +95 -0
  476. package/docs/pt/SECURITY.md +280 -0
  477. package/docs/pt/SKILLS.md +349 -0
  478. package/docs/pt/START_MODE.md +340 -0
  479. package/docs/pt/SYNCED_BLOCKS.md +320 -0
  480. package/docs/pt/TEAM_ROOM.md +285 -0
  481. package/docs/pt/TELEGRAM.md +294 -0
  482. package/docs/pt/TEST_DEV.md +321 -0
  483. package/docs/pt/TROUBLESHOOTING.md +294 -0
  484. package/docs/pt/UPDATE.md +301 -0
  485. package/docs/pt/VPS_MODE.md +334 -0
  486. package/docs/pt/WORKFLOW.md +321 -0
  487. package/drizzle/0000_regular_nightshade.sql +644 -0
  488. package/drizzle/0001_mixed_zombie.sql +106 -0
  489. package/drizzle/meta/0000_snapshot.json +4650 -0
  490. package/drizzle/meta/0001_snapshot.json +5418 -0
  491. package/drizzle/meta/_journal.json +20 -0
  492. package/drizzle.config.mjs +16 -0
  493. package/next.config.mjs +18 -0
  494. package/package.json +130 -0
  495. package/scripts/clean-repo.mjs +20 -0
  496. package/scripts/dev-all.mjs +46 -0
  497. package/scripts/i18n-parity.mjs +57 -0
  498. package/scripts/mcp-server.mjs +100 -0
  499. package/scripts/postbuild.mjs +11 -0
  500. package/scripts/publish-public.mjs +116 -0
  501. package/scripts/start-all.mjs +45 -0
  502. package/scripts/trim-next.mjs +23 -0
  503. package/scripts/vps-install.sh +39 -0
  504. package/skills/CONTRIBUTING.md +122 -0
  505. package/skills/COVERAGE.md +129 -0
  506. package/skills/INDEX.json +3443 -0
  507. package/skills/README.md +57 -0
  508. package/skills/design/animation-motion/SKILL.md +60 -0
  509. package/skills/design/color-and-typography/SKILL.md +60 -0
  510. package/skills/design/css-techniques/SKILL.md +58 -0
  511. package/skills/design/design-systems/SKILL.md +60 -0
  512. package/skills/design/gradients/SKILL.md +59 -0
  513. package/skills/design/graphic-design-basics/SKILL.md +55 -0
  514. package/skills/design/microinteractions/SKILL.md +58 -0
  515. package/skills/design/responsive-layout/SKILL.md +59 -0
  516. package/skills/design/ui-ux-principles/SKILL.md +58 -0
  517. package/skills/engineering/architecture/api-design-rest-graphql/SKILL.md +67 -0
  518. package/skills/engineering/architecture/caching-strategies/SKILL.md +59 -0
  519. package/skills/engineering/architecture/data-modeling/SKILL.md +64 -0
  520. package/skills/engineering/architecture/message-queues-async/SKILL.md +58 -0
  521. package/skills/engineering/architecture/scalability-reliability/SKILL.md +62 -0
  522. package/skills/engineering/architecture/software-architecture-patterns/SKILL.md +56 -0
  523. package/skills/engineering/architecture/system-design-fundamentals/SKILL.md +56 -0
  524. package/skills/engineering/backend/auth-and-authorization/SKILL.md +62 -0
  525. package/skills/engineering/backend/backend-fundamentals/SKILL.md +65 -0
  526. package/skills/engineering/backend/observability-logging/SKILL.md +60 -0
  527. package/skills/engineering/frontend/accessibility-wcag/SKILL.md +57 -0
  528. package/skills/engineering/frontend/frontend-architecture/SKILL.md +65 -0
  529. package/skills/engineering/frontend/rendering-strategies-ssr-csr/SKILL.md +60 -0
  530. package/skills/engineering/frontend/state-management/SKILL.md +69 -0
  531. package/skills/engineering/performance/backend-performance/SKILL.md +69 -0
  532. package/skills/engineering/performance/database-query-optimization/SKILL.md +64 -0
  533. package/skills/engineering/performance/profiling-and-benchmarking/SKILL.md +60 -0
  534. package/skills/engineering/performance/web-performance-core-vitals/SKILL.md +72 -0
  535. package/skills/engineering/practices/clean-code/SKILL.md +61 -0
  536. package/skills/engineering/practices/code-optimization/SKILL.md +60 -0
  537. package/skills/engineering/practices/code-review-practices/SKILL.md +58 -0
  538. package/skills/engineering/practices/git-workflow/SKILL.md +62 -0
  539. package/skills/engineering/practices/refactoring/SKILL.md +58 -0
  540. package/skills/engineering/security/appsec-fundamentals/SKILL.md +70 -0
  541. package/skills/engineering/security/dependency-supply-chain/SKILL.md +77 -0
  542. package/skills/engineering/security/owasp-asvs/SKILL.md +54 -0
  543. package/skills/engineering/security/owasp-top-10/SKILL.md +63 -0
  544. package/skills/engineering/security/secrets-management/SKILL.md +58 -0
  545. package/skills/engineering/security/secure-auth-sessions/SKILL.md +56 -0
  546. package/skills/engineering/testing/tdd-and-coverage/SKILL.md +62 -0
  547. package/skills/engineering/testing/testing-strategy-pyramid/SKILL.md +56 -0
  548. package/skills/engineering/testing/unit-integration-e2e/SKILL.md +75 -0
  549. package/skills/languages/c/SKILL.md +74 -0
  550. package/skills/languages/clojure/SKILL.md +73 -0
  551. package/skills/languages/cpp/SKILL.md +75 -0
  552. package/skills/languages/csharp/SKILL.md +75 -0
  553. package/skills/languages/dart/SKILL.md +82 -0
  554. package/skills/languages/elixir/SKILL.md +74 -0
  555. package/skills/languages/erlang/SKILL.md +76 -0
  556. package/skills/languages/go/SKILL.md +83 -0
  557. package/skills/languages/haskell/SKILL.md +70 -0
  558. package/skills/languages/java/SKILL.md +71 -0
  559. package/skills/languages/javascript/SKILL.md +62 -0
  560. package/skills/languages/kotlin/SKILL.md +68 -0
  561. package/skills/languages/lua/SKILL.md +79 -0
  562. package/skills/languages/objectivec/SKILL.md +83 -0
  563. package/skills/languages/php/SKILL.md +74 -0
  564. package/skills/languages/python/SKILL.md +68 -0
  565. package/skills/languages/r/SKILL.md +70 -0
  566. package/skills/languages/ruby/SKILL.md +67 -0
  567. package/skills/languages/rust/SKILL.md +72 -0
  568. package/skills/languages/scala/SKILL.md +73 -0
  569. package/skills/languages/swift/SKILL.md +73 -0
  570. package/skills/languages/typescript/SKILL.md +69 -0
  571. package/skills/meta/authoring-agent-skills/SKILL.md +73 -0
  572. package/skills/meta/progressive-disclosure/SKILL.md +65 -0
  573. package/skills/meta/skill-frontmatter-spec/SKILL.md +65 -0
  574. package/skills/process/adr-technical-decisions/SKILL.md +59 -0
  575. package/skills/process/app-planning/SKILL.md +63 -0
  576. package/skills/process/architecture-before-code/SKILL.md +52 -0
  577. package/skills/process/breaking-work-into-sprints/SKILL.md +53 -0
  578. package/skills/process/idea-to-product/SKILL.md +50 -0
  579. package/skills/process/mocks-and-screen-flows/SKILL.md +52 -0
  580. package/skills/process/prioritization-moscow-rice/SKILL.md +64 -0
  581. package/skills/process/problem-framing/SKILL.md +51 -0
  582. package/skills/process/product-discovery/SKILL.md +53 -0
  583. package/skills/process/readme-generation/SKILL.md +90 -0
  584. package/skills/process/requirements-to-specs/SKILL.md +53 -0
  585. package/skills/process/research-official-docs/SKILL.md +58 -0
  586. package/skills/process/review-code-perf-security/SKILL.md +65 -0
  587. package/skills/process/security-by-design/SKILL.md +68 -0
  588. package/skills/process/specs-to-issues/SKILL.md +53 -0
  589. package/skills/process/testing-before-done/SKILL.md +61 -0
  590. package/skills/process/validating-ux-navigation/SKILL.md +63 -0
  591. package/skills/references/ai-attachments-ui/SKILL.md +66 -0
  592. package/skills/references/ai-in-browser-webllm/SKILL.md +74 -0
  593. package/skills/references/ai-tool-ui-patterns/SKILL.md +63 -0
  594. package/skills/references/component-patterns-gallery/SKILL.md +62 -0
  595. package/skills/references/gradient-resources/SKILL.md +66 -0
  596. package/skills/references/react-component-libraries/SKILL.md +61 -0
  597. package/skills/references/saas-landing-patterns/SKILL.md +67 -0
  598. package/skills/references/shadcn-tailwind-theming/SKILL.md +74 -0
  599. package/skills/references/vercel-ai-sdk-elements/SKILL.md +66 -0
  600. package/skills/references/web-animation-codrops/SKILL.md +68 -0
  601. package/skills/stacks/aiml/jupyter/SKILL.md +68 -0
  602. package/skills/stacks/aiml/keras/SKILL.md +77 -0
  603. package/skills/stacks/aiml/numpy/SKILL.md +69 -0
  604. package/skills/stacks/aiml/pandas/SKILL.md +72 -0
  605. package/skills/stacks/aiml/pytorch/SKILL.md +77 -0
  606. package/skills/stacks/aiml/scikit-learn/SKILL.md +74 -0
  607. package/skills/stacks/aiml/tensorflow/SKILL.md +79 -0
  608. package/skills/stacks/auth/auth0/SKILL.md +63 -0
  609. package/skills/stacks/auth/authjs/SKILL.md +69 -0
  610. package/skills/stacks/auth/clerk/SKILL.md +72 -0
  611. package/skills/stacks/auth/keycloak/SKILL.md +63 -0
  612. package/skills/stacks/auth/lucia/SKILL.md +56 -0
  613. package/skills/stacks/auth/passport/SKILL.md +70 -0
  614. package/skills/stacks/auth/supabase-auth/SKILL.md +66 -0
  615. package/skills/stacks/baas/amplify/SKILL.md +71 -0
  616. package/skills/stacks/baas/appwrite/SKILL.md +79 -0
  617. package/skills/stacks/baas/firebase/SKILL.md +73 -0
  618. package/skills/stacks/baas/heroku/SKILL.md +71 -0
  619. package/skills/stacks/backend/actix/SKILL.md +77 -0
  620. package/skills/stacks/backend/adonisjs/SKILL.md +65 -0
  621. package/skills/stacks/backend/aspnet-core/SKILL.md +75 -0
  622. package/skills/stacks/backend/codeigniter/SKILL.md +76 -0
  623. package/skills/stacks/backend/django/SKILL.md +62 -0
  624. package/skills/stacks/backend/express/SKILL.md +65 -0
  625. package/skills/stacks/backend/fastapi/SKILL.md +64 -0
  626. package/skills/stacks/backend/fastify/SKILL.md +64 -0
  627. package/skills/stacks/backend/fiber/SKILL.md +68 -0
  628. package/skills/stacks/backend/flask/SKILL.md +71 -0
  629. package/skills/stacks/backend/gin/SKILL.md +68 -0
  630. package/skills/stacks/backend/graphql/SKILL.md +70 -0
  631. package/skills/stacks/backend/hono/SKILL.md +64 -0
  632. package/skills/stacks/backend/koa/SKILL.md +63 -0
  633. package/skills/stacks/backend/laravel/SKILL.md +73 -0
  634. package/skills/stacks/backend/nestjs/SKILL.md +70 -0
  635. package/skills/stacks/backend/nginx/SKILL.md +77 -0
  636. package/skills/stacks/backend/phoenix/SKILL.md +68 -0
  637. package/skills/stacks/backend/rails/SKILL.md +67 -0
  638. package/skills/stacks/backend/spring/SKILL.md +70 -0
  639. package/skills/stacks/backend/spring-boot/SKILL.md +70 -0
  640. package/skills/stacks/backend/symfony/SKILL.md +77 -0
  641. package/skills/stacks/container/containerd/SKILL.md +75 -0
  642. package/skills/stacks/container/docker/SKILL.md +90 -0
  643. package/skills/stacks/container/podman/SKILL.md +93 -0
  644. package/skills/stacks/database/cassandra/SKILL.md +74 -0
  645. package/skills/stacks/database/cockroachdb/SKILL.md +69 -0
  646. package/skills/stacks/database/dynamodb/SKILL.md +62 -0
  647. package/skills/stacks/database/mariadb/SKILL.md +71 -0
  648. package/skills/stacks/database/mongodb/SKILL.md +71 -0
  649. package/skills/stacks/database/mysql/SKILL.md +72 -0
  650. package/skills/stacks/database/neon/SKILL.md +68 -0
  651. package/skills/stacks/database/planetscale/SKILL.md +70 -0
  652. package/skills/stacks/database/postgresql/SKILL.md +81 -0
  653. package/skills/stacks/database/redis/SKILL.md +78 -0
  654. package/skills/stacks/database/sqlite/SKILL.md +70 -0
  655. package/skills/stacks/database/supabase/SKILL.md +79 -0
  656. package/skills/stacks/dataviz/chart-js/SKILL.md +72 -0
  657. package/skills/stacks/dataviz/d3/SKILL.md +77 -0
  658. package/skills/stacks/dataviz/grafana/SKILL.md +69 -0
  659. package/skills/stacks/dataviz/plotly/SKILL.md +71 -0
  660. package/skills/stacks/frontend/alpine/SKILL.md +75 -0
  661. package/skills/stacks/frontend/angular/SKILL.md +75 -0
  662. package/skills/stacks/frontend/backbone/SKILL.md +82 -0
  663. package/skills/stacks/frontend/ember/SKILL.md +85 -0
  664. package/skills/stacks/frontend/htmx/SKILL.md +73 -0
  665. package/skills/stacks/frontend/lit/SKILL.md +76 -0
  666. package/skills/stacks/frontend/preact/SKILL.md +74 -0
  667. package/skills/stacks/frontend/qwik/SKILL.md +65 -0
  668. package/skills/stacks/frontend/react/SKILL.md +77 -0
  669. package/skills/stacks/frontend/solidjs/SKILL.md +75 -0
  670. package/skills/stacks/frontend/svelte/SKILL.md +70 -0
  671. package/skills/stacks/frontend/vue/SKILL.md +69 -0
  672. package/skills/stacks/infra/ansible/SKILL.md +76 -0
  673. package/skills/stacks/infra/aws/SKILL.md +66 -0
  674. package/skills/stacks/infra/azure/SKILL.md +72 -0
  675. package/skills/stacks/infra/circleci/SKILL.md +78 -0
  676. package/skills/stacks/infra/cloudflare/SKILL.md +65 -0
  677. package/skills/stacks/infra/fly-io/SKILL.md +63 -0
  678. package/skills/stacks/infra/gcp/SKILL.md +66 -0
  679. package/skills/stacks/infra/jenkins/SKILL.md +73 -0
  680. package/skills/stacks/infra/kubernetes/SKILL.md +64 -0
  681. package/skills/stacks/infra/netlify/SKILL.md +60 -0
  682. package/skills/stacks/infra/railway/SKILL.md +63 -0
  683. package/skills/stacks/infra/tailscale/SKILL.md +65 -0
  684. package/skills/stacks/infra/terraform/SKILL.md +75 -0
  685. package/skills/stacks/infra/vagrant/SKILL.md +70 -0
  686. package/skills/stacks/infra/vercel/SKILL.md +60 -0
  687. package/skills/stacks/meta/astro/SKILL.md +64 -0
  688. package/skills/stacks/meta/docusaurus/SKILL.md +71 -0
  689. package/skills/stacks/meta/eleventy/SKILL.md +69 -0
  690. package/skills/stacks/meta/gatsby/SKILL.md +63 -0
  691. package/skills/stacks/meta/hugo/SKILL.md +73 -0
  692. package/skills/stacks/meta/jekyll/SKILL.md +70 -0
  693. package/skills/stacks/meta/nextjs/SKILL.md +62 -0
  694. package/skills/stacks/meta/nuxt/SKILL.md +66 -0
  695. package/skills/stacks/meta/remix/SKILL.md +67 -0
  696. package/skills/stacks/meta/sveltekit/SKILL.md +70 -0
  697. package/skills/stacks/meta/vite/SKILL.md +63 -0
  698. package/skills/stacks/mobile/android/SKILL.md +77 -0
  699. package/skills/stacks/mobile/flutter/SKILL.md +77 -0
  700. package/skills/stacks/mobile/ionic/SKILL.md +72 -0
  701. package/skills/stacks/mobile/nativescript/SKILL.md +71 -0
  702. package/skills/stacks/mobile/react-native/SKILL.md +75 -0
  703. package/skills/stacks/mobile/xamarin/SKILL.md +73 -0
  704. package/skills/stacks/orm/diesel/SKILL.md +72 -0
  705. package/skills/stacks/orm/django-orm/SKILL.md +58 -0
  706. package/skills/stacks/orm/drizzle/SKILL.md +67 -0
  707. package/skills/stacks/orm/gorm/SKILL.md +73 -0
  708. package/skills/stacks/orm/knex/SKILL.md +64 -0
  709. package/skills/stacks/orm/mongoose/SKILL.md +64 -0
  710. package/skills/stacks/orm/prisma/SKILL.md +64 -0
  711. package/skills/stacks/orm/sequelize/SKILL.md +65 -0
  712. package/skills/stacks/orm/sqlalchemy/SKILL.md +71 -0
  713. package/skills/stacks/orm/typeorm/SKILL.md +70 -0
  714. package/skills/stacks/queue/bullmq/SKILL.md +69 -0
  715. package/skills/stacks/queue/celery/SKILL.md +68 -0
  716. package/skills/stacks/queue/kafka/SKILL.md +66 -0
  717. package/skills/stacks/queue/nats/SKILL.md +66 -0
  718. package/skills/stacks/queue/rabbitmq/SKILL.md +64 -0
  719. package/skills/stacks/queue/redis/SKILL.md +66 -0
  720. package/skills/stacks/runtime/beam/SKILL.md +72 -0
  721. package/skills/stacks/runtime/bun/SKILL.md +80 -0
  722. package/skills/stacks/runtime/deno/SKILL.md +74 -0
  723. package/skills/stacks/runtime/dotnet/SKILL.md +64 -0
  724. package/skills/stacks/runtime/jvm/SKILL.md +66 -0
  725. package/skills/stacks/runtime/node/SKILL.md +70 -0
  726. package/skills/stacks/runtime/pypy/SKILL.md +69 -0
  727. package/skills/stacks/runtime/python3/SKILL.md +70 -0
  728. package/skills/stacks/styling/bootstrap/SKILL.md +74 -0
  729. package/skills/stacks/styling/bulma/SKILL.md +80 -0
  730. package/skills/stacks/styling/chakra-ui/SKILL.md +61 -0
  731. package/skills/stacks/styling/css-modules/SKILL.md +54 -0
  732. package/skills/stacks/styling/mui/SKILL.md +60 -0
  733. package/skills/stacks/styling/sass/SKILL.md +63 -0
  734. package/skills/stacks/styling/shadcn-ui/SKILL.md +58 -0
  735. package/skills/stacks/styling/styled-components/SKILL.md +62 -0
  736. package/skills/stacks/styling/tailwind/SKILL.md +59 -0
  737. package/skills/stacks/styling/unocss/SKILL.md +64 -0
  738. package/skills/stacks/styling/vanilla-extract/SKILL.md +64 -0
  739. package/skills/stacks/styling/vuetify/SKILL.md +89 -0
  740. package/skills/stacks/testing/cypress/SKILL.md +68 -0
  741. package/skills/stacks/testing/jasmine/SKILL.md +67 -0
  742. package/skills/stacks/testing/jest/SKILL.md +67 -0
  743. package/skills/stacks/testing/mocha/SKILL.md +71 -0
  744. package/skills/stacks/testing/playwright/SKILL.md +68 -0
  745. package/skills/stacks/testing/puppeteer/SKILL.md +70 -0
  746. package/skills/stacks/testing/selenium/SKILL.md +70 -0
  747. package/skills/stacks/testing/vitest/SKILL.md +68 -0
@@ -0,0 +1,340 @@
1
+ [← Índice](./README.md) · [🇬🇧 English](../en/START_MODE.md) · [✦ Constella](../../README.pt-BR.md)
2
+
3
+ # Start Mode ✦ — a plataforma de lançamento
4
+
5
+ > A ignição padrão para uma nave de piloto único: o Constella sobe em `127.0.0.1`, provisiona um operador local automaticamente, faz seu login sem tela de autenticação e deixa a constelação de agentes rodar com permissões locais totais.
6
+
7
+ O Start Mode é o modo de execução que você obtém ao iniciar o Constella sem nenhuma flag de modo (ou com `--start`). Ele otimiza para um único operador na própria máquina: zero atrito, sem senhas, autonomia total dos agentes.
8
+
9
+ ---
10
+
11
+ ## 🛰️ Quando usar
12
+
13
+ | Use o Start Mode quando… | Prefira outro modo quando… |
14
+ | --- | --- |
15
+ | Você roda o Constella **no seu próprio notebook / estação** | Você o expõe em rede → [AUTH_MODE](./AUTH_MODE.md) / [VPS_MODE](./VPS_MODE.md) |
16
+ | Você quer **sem tela de login**, sempre autenticado | Vários humanos precisam de contas / 2FA → [AUTH_MODE](./AUTH_MODE.md) |
17
+ | Você quer agentes que **instalam dependências + rodam testes** (shell completo) | Você quer agentes presos a só-edições → [AUTH_MODE](./AUTH_MODE.md) |
18
+ | Você está desenvolvendo, demonstrando ou rodando uma agent-company pessoal | Você inicializa de um pen-drive entre máquinas → [PORTABLE_MODE](./PORTABLE_MODE.md) |
19
+
20
+ O Start Mode é **local por design**. Ele faz bind na interface de loopback e usa uma credencial de operador previsível — ambos seguros em uma única máquina, ambos inseguros em rede. O código se recusa a provisionar essa credencial em qualquer outro modo.
21
+
22
+ ---
23
+
24
+ ## 🌌 Como funciona
25
+
26
+ O Start Mode é um dos quatro valores de `RunMode` (`src/lib/run-mode.ts`):
27
+
28
+ ```ts
29
+ export type RunMode = "start" | "auth" | "vps" | "portable";
30
+ ```
31
+
32
+ O launcher (`bin/constella.mjs`) seleciona o modo a partir da flag de lançamento e o exporta como `CONSTELLA_RUN_MODE`. O servidor inteiro o lê de volta através de `getRunMode()`, que **assume `start` como padrão** quando a variável de ambiente está ausente ou é desconhecida:
33
+
34
+ ```ts
35
+ // src/lib/run-mode.ts
36
+ export function getRunMode(): RunMode {
37
+ const m = process.env.CONSTELLA_RUN_MODE as RunMode | undefined;
38
+ return m && m in RUN_MODES ? m : "start";
39
+ }
40
+ ```
41
+
42
+ O registro `RUN_MODES` marca `start` como o único modo que **não** exige login:
43
+
44
+ ```ts
45
+ start: { label: "Start", requiresLogin: false, note: "Local auto-created account · always signed in." },
46
+ ```
47
+
48
+ Três comportamentos derivam desse único fato:
49
+
50
+ 1. **Sem tela de login.** O guarda de workspace envia requisições não autenticadas para a rota silenciosa de auto-login, em vez de `/login`.
51
+ 2. **Operador provisionado automaticamente.** Um usuário local real + um hash de senha real do better-auth são criados de forma idempotente, e a sessão é iniciada.
52
+ 3. **Agentes com acesso total.** O adaptador da CLI roda os agentes com `--permission-mode bypassPermissions` (instalar dependências, rodar testes, shell completo) porque você está na sua própria máquina.
53
+
54
+ O modo escolhido também é **persistido na organização** no momento do onboarding (`organization.runMode`), de forma que o registro da org lembra que nasceu em Start Mode.
55
+
56
+ ---
57
+
58
+ ## 🚀 Fluxo principal
59
+
60
+ ```mermaid
61
+ flowchart TD
62
+ A["constella (sem flag) ou constella --start"] --> B["bin/constella.mjs"]
63
+ B --> C["CONSTELLA_RUN_MODE=start<br/>host=127.0.0.1 port=3000"]
64
+ C --> D["Persiste segredos em &lt;HOME&gt;/.env (chmod 600)<br/>BETTER_AUTH_SECRET · VAULT_KEY · WORKER_SECRET"]
65
+ D --> E["drizzle-kit migrate (DB novo ganha as tabelas)"]
66
+ E --> F["next start + worker (supervisionados)"]
67
+ F --> G["Navegador acessa qualquer página (app)"]
68
+ G --> H{"requireWorkspace():<br/>cookie de sessão?"}
69
+ H -- "sim" --> Z["Renderiza o app"]
70
+ H -- "não (start mode)" --> I["redirect /api/dev-login"]
71
+ I --> J["ensureLocalOperator()"]
72
+ J --> K["auth.signInEmail(operator@constella.dev)"]
73
+ K --> L["Set-Cookie + redirect /"]
74
+ L --> Z
75
+ ```
76
+
77
+ ### Fluxo de auto-login (o coração do Start Mode) 🌠
78
+
79
+ ```mermaid
80
+ sequenceDiagram
81
+ participant U as Navegador
82
+ participant W as requireWorkspace()
83
+ participant R as /api/dev-login
84
+ participant D as dev-auth.ts
85
+ participant A as better-auth
86
+
87
+ U->>W: GET /(app)/...
88
+ W->>W: getSession()
89
+ Note over W: sem cookie de sessão
90
+ W-->>U: 307 → /api/dev-login
91
+ U->>R: GET /api/dev-login
92
+ R->>R: getRunMode() === "start" ?
93
+ alt não é start mode
94
+ R-->>U: 307 → /login
95
+ else start mode
96
+ R->>D: ensureLocalOperator()
97
+ D->>D: upsert user_operator + hash da credencial
98
+ R->>A: signInEmail(operator@constella.dev / operator123)
99
+ A-->>R: cookie de sessão (plugin nextCookies)
100
+ R-->>U: 307 → / (agora autenticado)
101
+ end
102
+ ```
103
+
104
+ ---
105
+
106
+ ## 🪐 Conceitos-chave
107
+
108
+ ### O operador local
109
+
110
+ `src/server/dev-auth.ts` define a conta previsível:
111
+
112
+ ```ts
113
+ export const DEV_OPERATOR = {
114
+ id: "user_operator",
115
+ email: "operator@constella.dev",
116
+ password: "operator123",
117
+ name: "Operator",
118
+ };
119
+ ```
120
+
121
+ `ensureLocalOperator()` é **idempotente** e seguro de chamar a cada requisição:
122
+
123
+ - Busca o usuário por e-mail; se ausente, insere `user_operator` (com `emailVerified: true`).
124
+ - Busca a conta `credential`; se ausente, gera o hash de `operator123` pelo próprio `ctx.password.hash` do better-auth e insere uma linha de credencial real.
125
+ - Retorna o id do usuário.
126
+
127
+ Como o id é fixo (`user_operator`) e coincide com o dono do seed, uma org de demonstração semeada pertence ao operador provisionado automaticamente — então uma **limpeza do DB do zero se auto-recupera**: o próximo carregamento de página recria o operador e faz login, sem passo manual.
128
+
129
+ > 🕳️ **Trava de defesa em profundidade:** `ensureLocalOperator()` lança `"ensureLocalOperator is start-mode only"` se `getRunMode() !== "start"`. A credencial previsível `operator/operator123`, portanto, **nunca** pode existir em um modo exposto à rede, onde a senha padrão seria um login remoto.
130
+
131
+ ### A rota de auto-login
132
+
133
+ `src/app/api/dev-login/route.ts` é um handler `GET`:
134
+
135
+ - Fora do Start Mode → `redirect("/login")` (a tela normal).
136
+ - No Start Mode → `ensureLocalOperator()` → `auth.api.signInEmail({ email, password })` (o cookie é definido pelo plugin `nextCookies()` do better-auth) → `redirect("/")`.
137
+ - Em qualquer falha → `redirect("/login?autologin=failed")`, para que o guarda nunca entre em loop.
138
+
139
+ ### O guarda de workspace
140
+
141
+ `requireWorkspace()` de `src/lib/workspace.ts` é a barreira por onde passa toda página `(app)` e toda server action. O ramo do Start Mode:
142
+
143
+ ```ts
144
+ if (!session) redirect(getRunMode() === "start" ? "/api/dev-login" : "/login");
145
+ ```
146
+
147
+ Essa única linha é o que transforma "sem sessão" em "auto sign-in" no Start Mode, e em "mostrar a tela de login" em qualquer outro lugar.
148
+
149
+ ### Agentes com acesso total (`bypassPermissions`)
150
+
151
+ `src/server/adapters/cli.ts` decide quanto poder de shell os agentes recebem:
152
+
153
+ ```ts
154
+ const RUN_MODE = process.env.CONSTELLA_RUN_MODE ?? "start";
155
+ const AGENT_FULL_ACCESS = process.env.CONSTELLA_AGENT_FULL_ACCESS != null
156
+ ? process.env.CONSTELLA_AGENT_FULL_ACCESS !== "0"
157
+ : RUN_MODE === "start";
158
+
159
+ function claudePermArgs(): string[] {
160
+ return AGENT_FULL_ACCESS
161
+ ? ["--permission-mode", "bypassPermissions"] // start → total: instala + testa
162
+ : ["--permission-mode", "acceptEdits"]; // modos de rede → presos: só edições
163
+ }
164
+ ```
165
+
166
+ Assim, no Start Mode as CLIs `claude` / `codex` rodam com `bypassPermissions` — podem instalar dependências e rodar testes no workspace — porque você está na sua própria máquina. Modos de rede (`auth` / `vps` / `portable`) assumem `acceptEdits` por padrão (só-edições, presos). Sobrescreva nos dois sentidos com `CONSTELLA_AGENT_FULL_ACCESS=1|0`. Os agentes ainda rodam sempre **vanilla** (um overlay temporário de settings define `disableAllHooks: true`), de modo que os hooks/plugins pessoais do `~/.claude` do operador nunca vazem para as execuções dos agentes. Veja [AGENTS](./AGENTS.md) e [AI_ARCHITECTURE](./AI_ARCHITECTURE.md).
167
+
168
+ ### O segredo de auth no Start Mode
169
+
170
+ `next start` roda sob `NODE_ENV=production`, onde o better-auth **lança erro com o segredo padrão**. Então até o Start Mode local precisa de um `BETTER_AUTH_SECRET` real — o launcher gera e persiste um em `<HOME>/.env` (`chmod 600`). A única flexibilização: `assertAuthSecret()` aceita um segredo ausente **apenas** quando `RUN_MODE === "start"`; todo modo de rede falha de forma fechada sem ele (`src/lib/auth.ts`). Os cookies de sessão continuam não-`Secure` no Start Mode porque é `http` local apenas.
171
+
172
+ ---
173
+
174
+ ## Tabelas 📊
175
+
176
+ ### Start Mode vs os outros modos de execução
177
+
178
+ | Propriedade | **start** | auth | vps | portable |
179
+ | --- | --- | --- | --- | --- |
180
+ | `requiresLogin` | **false** | true | true | true |
181
+ | Tela de login | nenhuma (auto) | e-mail + senha | e-mail + senha | e-mail + senha |
182
+ | Host de bind | `127.0.0.1` | `127.0.0.1` | `0.0.0.0` | `0.0.0.0` |
183
+ | Operador | auto `operator@constella.dev` | você cria | você cria | você cria |
184
+ | Permissão dos agentes | `bypassPermissions` | `acceptEdits` | `acceptEdits` | `acceptEdits` |
185
+ | `BETTER_AUTH_SECRET` obrigatório | persistido, não imposto | imposto | imposto | imposto |
186
+ | Cookies Secure | não (http local) | se atrás de https | sim | se atrás de https |
187
+ | Uso típico | máquina própria / dev | máquina compartilhada, rede local | servidor via Tailscale | USB entre máquinas |
188
+
189
+ ### Comandos de lançamento → Start Mode
190
+
191
+ | Comando | Resultado |
192
+ | --- | --- |
193
+ | `constella` | Start Mode (padrão `cmd === "start"`) |
194
+ | `constella --start` | Start Mode (explícito) |
195
+ | `constella --bind local` | Start Mode (compatibilidade legada de `--bind`) |
196
+ | `CONSTELLA_RUN_MODE=start` | Força Start Mode no processo do servidor |
197
+
198
+ ### Variáveis de ambiente que moldam o Start Mode
199
+
200
+ | Variável | Padrão no Start Mode | Efeito |
201
+ | --- | --- | --- |
202
+ | `CONSTELLA_RUN_MODE` | `start` | O modo de execução que o servidor lê |
203
+ | `CONSTELLA_HOME` | `~/.constella` | Raiz de runtime (DB, segredos, orgs) |
204
+ | `--host` / host | `127.0.0.1` | Bind de loopback |
205
+ | `--port` / `PORT` | `3000` | Porta web |
206
+ | `CONSTELLA_AGENT_FULL_ACCESS` | `1` (implícito pelo start) | `0` reaprisiona os agentes em só-edições |
207
+ | `CONSTELLA_WEB_RESEARCH` | ligado | `0` desativa WebSearch/WebFetch dos agentes |
208
+ | `BETTER_AUTH_SECRET` | gerado → `<HOME>/.env` | Chave de assinatura de sessão |
209
+
210
+ ### Arquivos-chave
211
+
212
+ | Arquivo | Papel |
213
+ | --- | --- |
214
+ | `src/lib/run-mode.ts` | Tipo `RunMode`, `RUN_MODES`, `getRunMode()`, `requiresLogin()` |
215
+ | `bin/constella.mjs` | Launcher: escolhe o modo, define host/porta, persiste segredos, sobe web + worker |
216
+ | `src/lib/workspace.ts` | `requireWorkspace()` — redireciona para `/api/dev-login` no Start Mode |
217
+ | `src/app/api/dev-login/route.ts` | Rota de auto sign-in silenciosa |
218
+ | `src/server/dev-auth.ts` | `DEV_OPERATOR`, `ensureLocalOperator()` |
219
+ | `src/lib/auth.ts` | Config do better-auth; `assertAuthSecret()` flexibiliza só para `start` |
220
+ | `src/server/adapters/cli.ts` | `claudePermArgs()` → `bypassPermissions` no Start Mode |
221
+ | `src/lib/run-context.ts` | `detectRunContext()` para o caminho de Update |
222
+
223
+ ---
224
+
225
+ ## Passo a passo 🧭
226
+
227
+ ### Suba uma nave nova em Start Mode
228
+
229
+ 1. **Lance** sem flag (ou `--start`):
230
+ ```bash
231
+ npx constella
232
+ # ou, instalado globalmente:
233
+ constella --start
234
+ ```
235
+ 2. O launcher imprime a raiz de runtime e `Mode : start · 127.0.0.1:3000`, persiste os segredos em `<HOME>/.env`, aplica as migrations e sobe `next start` + o worker.
236
+ 3. **Abra** `http://127.0.0.1:3000`.
237
+ 4. `requireWorkspace()` não encontra sessão → redireciona para `/api/dev-login`.
238
+ 5. A rota provisiona `operator@constella.dev`, faz login, define o cookie e devolve para `/`.
239
+ 6. Se nenhuma org existir ainda, você cai no [ONBOARDING](./ONBOARDING.md); caso contrário, você está no app, já autenticado.
240
+
241
+ ### Limpar e auto-recuperar
242
+
243
+ ```bash
244
+ # pare o Constella, depois:
245
+ rm ~/.constella/constella.db
246
+ constella
247
+ ```
248
+ O próximo carregamento de página reexecuta `ensureLocalOperator()` e recria o operador — sem passo manual de conta.
249
+
250
+ ### Reaprisionar os agentes no Start Mode (cautela extra)
251
+
252
+ ```bash
253
+ CONSTELLA_AGENT_FULL_ACCESS=0 constella --start
254
+ ```
255
+ Os agentes agora rodam `acceptEdits` (só-edições, sem shell arbitrário), enquanto você mantém a conveniência do sem-login.
256
+
257
+ ---
258
+
259
+ ## Exemplos 🌟
260
+
261
+ **Lançamento padrão (Start Mode):**
262
+ ```bash
263
+ $ constella
264
+ Constella runtime root : /home/you/.constella
265
+ Mode : start · 127.0.0.1:3000
266
+ • Secrets ready (stored in /home/you/.constella/.env, never printed).
267
+ • Starting: next start -H 127.0.0.1 -p 3000 (…) + worker
268
+ ```
269
+
270
+ **Porta personalizada, ainda Start Mode:**
271
+ ```bash
272
+ $ constella --start --port 4000
273
+ # → http://127.0.0.1:4000, auto-login, agentes com acesso total
274
+ ```
275
+
276
+ **Fixar outra raiz de runtime:**
277
+ ```bash
278
+ $ CONSTELLA_HOME=/data/constella constella --start
279
+ # DB em /data/constella/constella.db; segredos em /data/constella/.env
280
+ ```
281
+
282
+ ---
283
+
284
+ ## Estados possíveis 🛰️
285
+
286
+ | Situação | Comportamento |
287
+ | --- | --- |
288
+ | Sem cookie de sessão, Start Mode | Redireciona `/api/dev-login` → auto sign-in → `/` |
289
+ | Sem cookie de sessão, **não** Start Mode | Redireciona `/login` |
290
+ | Auto sign-in bem-sucedido | Cookie definido, cai em `/` (ou `/onboarding` se não houver org) |
291
+ | Auto sign-in **falha** | Redireciona `/login?autologin=failed` (sem loop) |
292
+ | `CONSTELLA_FORCE_ONBOARDING=1` | Após a sessão, redireciona `/onboarding` (one-shot, limpo por `completeOnboarding`) |
293
+ | Org ausente / workspace ausente | Redireciona `/onboarding` |
294
+ | `ensureLocalOperator()` chamado fora do start | Lança `"ensureLocalOperator is start-mode only"` |
295
+ | Execução de agente, Start Mode | `claude --permission-mode bypassPermissions` (shell completo) |
296
+ | Execução de agente, `CONSTELLA_AGENT_FULL_ACCESS=0` | `claude --permission-mode acceptEdits` (preso) |
297
+
298
+ ---
299
+
300
+ ## Integrações relacionadas 🪐
301
+
302
+ - O **Onboarding** persiste o modo ativo em `organization.runMode` (`src/server/onboarding.ts`). Veja [ONBOARDING](./ONBOARDING.md).
303
+ - O **Worker** (`bin/worker.mjs`) conecta de volta via `127.0.0.1` independentemente do host de bind; no Start Mode esse também é o bind do web. Veja [ARCHITECTURE](./ARCHITECTURE.md).
304
+ - O **Vault** ainda precisa de `CONSTELLA_VAULT_KEY` mesmo no Start Mode (as chaves de provedor são criptografadas). Veja [SECURITY](./SECURITY.md).
305
+ - O caminho de **Update** é sensível ao modo via `detectRunContext()`. Veja [UPDATE](./UPDATE.md).
306
+
307
+ ---
308
+
309
+ ## Segurança 🕳️
310
+
311
+ O Start Mode troca o endurecimento de rede por conveniência local — seguro justamente por ser local:
312
+
313
+ - **Somente loopback.** O host faz bind em `127.0.0.1`; nada é alcançável fora da máquina.
314
+ - **A credencial previsível é travada.** `operator@constella.dev / operator123` é provisionada **apenas** quando `getRunMode() === "start"`; `ensureLocalOperator()` lança erro caso contrário. A rota de dev-login também retorna `/login` fora do Start Mode.
315
+ - **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.
316
+ - **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.
317
+ - **Não faça port-forward do Start Mode.** Se precisar de acesso remoto, mude para [VPS_MODE](./VPS_MODE.md) (Tailscale + Docker) ou [AUTH_MODE](./AUTH_MODE.md) — nunca exponha o Start Mode de loopback a uma rede, onde a senha padrão vira um login remoto.
318
+
319
+ ---
320
+
321
+ ## Solução de problemas 🧰
322
+
323
+ | Sintoma | Causa provável | Correção |
324
+ | --- | --- | --- |
325
+ | Preso em `/login` apesar de `--start` | `CONSTELLA_RUN_MODE` não é `start` no servidor | Verifique a flag de lançamento; confira a linha `Mode : start` no boot |
326
+ | `/login?autologin=failed` | Auto sign-in lançou erro (DB travado, schema não migrado) | Cheque o console `[dev-login] auto sign-in failed`; garanta que as migrations rodaram |
327
+ | Loop de login | Guarda ↔ dev-login se rebatendo | A rota cai em `/login?autologin=failed` por design; inspecione o erro logado |
328
+ | Agentes não instalam deps / não rodam testes | `CONSTELLA_AGENT_FULL_ACCESS=0` definido, ou não é Start Mode | Remova o override, ou relance com `--start` |
329
+ | Alcançável de outra máquina | Você sobrescreveu `--host` para `0.0.0.0` | Remova `--host`; o Start Mode faz bind em `127.0.0.1` |
330
+ | Erro de segredo do better-auth no boot | Forçou um modo de rede sem segredo | Modos de rede exigem `BETTER_AUTH_SECRET`; o launcher persiste um — deixe rodar, ou defina-o |
331
+ | Operador sumiu após reset do DB | Esperado | Recarregue qualquer página — `ensureLocalOperator()` o recria |
332
+
333
+ ---
334
+
335
+ ## Links relacionados 🌌
336
+
337
+ - [INSTALLATION](./INSTALLATION.md) · [ONBOARDING](./ONBOARDING.md) · [CONFIGURATION](./CONFIGURATION.md)
338
+ - [AUTH_MODE](./AUTH_MODE.md) · [VPS_MODE](./VPS_MODE.md) · [PORTABLE_MODE](./PORTABLE_MODE.md)
339
+ - [ARCHITECTURE](./ARCHITECTURE.md) · [AI_ARCHITECTURE](./AI_ARCHITECTURE.md) · [AGENTS](./AGENTS.md)
340
+ - [SECURITY](./SECURITY.md) · [UPDATE](./UPDATE.md) · [TROUBLESHOOTING](./TROUBLESHOOTING.md) · [FAQ](./FAQ.md)
@@ -0,0 +1,320 @@
1
+ [← Índice](./README.md) · [🇬🇧 English](../en/SYNCED_BLOCKS.md) · [✦ Constella](../../README.pt-BR.md)
2
+
3
+ # 🌌 Synced Blocks — a nebulosa de memória canônica
4
+
5
+ ![](../assets/divider-orbit.svg)
6
+
7
+ Os synced blocks (blocos sincronizados) são a **fonte única de verdade** para o conhecimento durável do projeto: uma unidade nomeada (`slug` + `body` em Markdown) editada em exatamente um lugar e exibida por referência em todos os outros — prompts dos agentes, a home de boas-vindas e transcluída em relatórios. Edite um bloco uma vez e toda superfície reflete a versão mais recente, sem o desalinhamento de copiar e colar. Eles são distintos do conhecimento auto-capturado em `kb_entry`: um synced block é **curado, canônico e versionado**; os agentes só podem *propor* edições nele.
8
+
9
+ Fonte de verdade no código: `src/server/blocks.ts`, schema `src/db/schema.ts` (`synced_block`, `block_proposal`).
10
+
11
+ ---
12
+
13
+ ## 1. Quando usar 🪐
14
+
15
+ Use synced blocks para fatos que:
16
+
17
+ - são **duráveis** e **reutilizados** em muitas execuções e superfícies (a stack oficial, regras de negócio, padrões de segurança, a arquitetura que todo agente deve tratar como canônica);
18
+ - precisam permanecer **consistentes** em todos os lugares onde aparecem (sem desalinhamento entre o arquivo de persona, um relatório e uma resposta no chat);
19
+ - se beneficiam de **revisão do operador / agente de KB** antes de mudar a verdade compartilhada.
20
+
21
+ **Não** os use para aprendizados transitórios, específicos de uma execução. Esses fluem para a KB auto-capturada via o token `[[REMEMBER type=<t>: <fact>]]` (sem aprovação) — veja [KB_RAG.md](./KB_RAG.md) e [MEMORY_RAG.md](./MEMORY_RAG.md).
22
+
23
+ | Tipo de conhecimento | Mecanismo | Aprovação | Versionado | Doc |
24
+ |---|---|---|---|---|
25
+ | Fato canônico e curado | Synced block (`synced_block`) | Operador / agente de KB faz merge das propostas | Sim (`version`) | este doc |
26
+ | Aprendizado auto-capturado | `kb_entry` via `[[REMEMBER …]]` | Nenhuma (ingerido diretamente) | Não (ciclo de status) | [KB_RAG.md](./KB_RAG.md) |
27
+
28
+ ---
29
+
30
+ ## 2. Como funciona 🛰️
31
+
32
+ Um synced block vive na tabela `synced_block`, chaveado por `(workspaceId, slug)`. Seu `body` é Markdown canônico. Duas coisas acontecem sempre que um bloco é gravado via `upsertBlock`:
33
+
34
+ 1. A linha é **upsertada** — na criação `version = 1`; na atualização o `version` é incrementado (`cur.version + 1`), e `updatedBy` e `updatedAt` são atualizados.
35
+ 2. O corpo é **re-embeddado** em `rag_chunk` no caminho `block/<slug>` (`embedBlock`), para que os agentes também *recuperem* o bloco atual via RAG, não apenas o recebam injetado. Os chunks antigos desse caminho são apagados primeiro, então os embeddings nunca ficam obsoletos.
36
+
37
+ O bloco então chega aos agentes por **três** superfícies distintas:
38
+
39
+ - **Injetado** — `canonicalFactsSection(wsId)` monta uma seção compacta "Canonical project facts" (até os 20 blocos atualizados mais recentemente, cada um com título + kind + os primeiros 800 caracteres, limitada a 5000 caracteres no total) que o gestor de contexto injeta no topo de todo prompt de agente.
40
+ - **Transcluído** — `resolveBlocks(orgId, text)` substitui marcadores `{{kb:slug}}` em qualquer texto (arquivos de persona, instruções, corpos de relatório) pelo `body` atual do bloco. Um slug ausente renderiza um marcador BEM visível `[[missing block: <slug>]]` em vez de sumir silenciosamente.
41
+ - **Recuperado** — os chunks de RAG em `block/<slug>` são retornados pela recuperação normal do `kbQuery`, então um bloco pode aparecer mesmo quando não está na janela sempre-injetada.
42
+
43
+ ### Regras de slug
44
+
45
+ Os slugs são normalizados (`normSlug`): em minúsculas, sem espaços nas pontas, caracteres fora de `[a-z0-9-]` colapsados em `-`, traços inicial/final removidos, truncado em 60 caracteres, e validado contra `/^[a-z0-9][a-z0-9-]{0,60}$/`. Um slug inválido faz o upsert falhar (`{ ok: false }`).
46
+
47
+ ### Limites de campo (impostos em `upsertBlock`)
48
+
49
+ | Campo | Limite |
50
+ |---|---|
51
+ | `title` | cortado em 200 caracteres |
52
+ | `body` | cortado em 20000 caracteres |
53
+ | `kind` | cortado em 40 caracteres (padrão `note`) |
54
+ | `updatedBy` | cortado em 60 caracteres (padrão `operator`) |
55
+
56
+ ---
57
+
58
+ ## 3. Fluxo principal 🌠
59
+
60
+ ```mermaid
61
+ flowchart TD
62
+ subgraph Autoria
63
+ OP["Operador edita na UI de Knowledge"] -->|saveBlockAction| UP["upsertBlock()"]
64
+ SEED["Seeding no boot / KB card"] -->|seedDefaultBlocks · seedCanonicalBlocks| UP
65
+ AG["Agente propõe [[KB-BLOCK]]"] -->|proposeBlockEdit| PQ["block_proposal (pending)"]
66
+ PQ -->|mergeProposal| UP
67
+ end
68
+ UP -->|version++| TBL["synced_block (workspaceId, slug)"]
69
+ UP -->|re-embed| RC["rag_chunk path=block/&lt;slug&gt;"]
70
+ TBL -->|canonicalFactsSection| PROMPT["Prompt do agente: Canonical project facts"]
71
+ TBL -->|"resolveBlocks {{kb:slug}}"| SURF["Relatórios · persona · instruções"]
72
+ RC -->|recuperação kbQuery| PROMPT
73
+ ```
74
+
75
+ ---
76
+
77
+ ## 4. Conceitos-chave ✦
78
+
79
+ | Conceito | O que é |
80
+ |---|---|
81
+ | **Block** | `typeof syncedBlock.$inferSelect` — uma unidade canônica de conhecimento `(slug, kind, title, body, version, updatedBy)`. |
82
+ | **Proposal** | `typeof blockProposal.$inferSelect` — uma edição *sugerida* por um agente, aguardando merge/rejeição. |
83
+ | **Marcador `{{kb:slug}}`** | Um token de transclusão resolvido em tempo de leitura para o corpo atual do bloco. |
84
+ | **`[[KB-BLOCK slug]]…[[/KB-BLOCK]]`** | O token que um agente emite na saída da execução para *propor* uma edição de bloco. |
85
+ | **Seção de fatos canônicos** | O resumo limitado de blocos injetado em todo prompt de agente como a fonte de verdade autoritativa. |
86
+ | **Re-embedding** | Cada gravação atualiza o `rag_chunk` em `block/<slug>` para manter a recuperação por RAG atual. |
87
+ | **Versionamento** | `version` começa em 1, incrementa a cada atualização; a UI mostra `v<n>` e `updatedBy`. |
88
+
89
+ ---
90
+
91
+ ## 5. Tabelas 🗄️
92
+
93
+ ### `synced_block` (PK `(workspaceId, slug)`)
94
+
95
+ | Coluna | Tipo | Notas |
96
+ |---|---|---|
97
+ | `workspace_id` | text | FK → `workspace.id`, `onDelete: cascade` |
98
+ | `slug` | text | handle estável, ex.: `official-stack` |
99
+ | `kind` | text | padrão `note`; veja os kinds abaixo |
100
+ | `title` | text | padrão `""` |
101
+ | `body` | text | Markdown canônico — a fonte única de verdade |
102
+ | `version` | integer | padrão `1`, incrementado a cada atualização |
103
+ | `updated_by` | text | handle do agente ou `operator` (ou `system` para os semeados) |
104
+ | `created_at` | timestamp | `unixepoch()` |
105
+ | `updated_at` | timestamp | `unixepoch()`; os blocos são listados/resumidos em `desc(updatedAt)` |
106
+
107
+ **Valores de `kind`** (do comentário no schema): `mission`, `objective`, `stack`, `architecture`, `business-rule`, `ui-pattern`, `security`, `commands`, `deploy-checklist`, `review-checklist`, `glossary`, `policy`, `note`. `kind` é texto livre (cortado em 40 caracteres), então são convenções, não um enum de banco.
108
+
109
+ ### `block_proposal` (PK `id`, índice `block_prop_ws_idx` em `(workspaceId, status)`)
110
+
111
+ | Coluna | Tipo | Notas |
112
+ |---|---|---|
113
+ | `id` | text | `randomUUID()` |
114
+ | `workspace_id` | text | FK → `workspace.id`, `onDelete: cascade` |
115
+ | `slug` | text | slug do bloco alvo (normalizado) |
116
+ | `kind` | text | padrão `note` |
117
+ | `title` | text | padrão `""` |
118
+ | `body` | text | corpo Markdown proposto |
119
+ | `by_agent_handle` | text | quem propôs |
120
+ | `status` | text enum | `pending` \| `merged` \| `rejected` (padrão `pending`) |
121
+ | `created_at` | timestamp | `unixepoch()` |
122
+ | `decided_at` | timestamp | definido no merge/rejeição |
123
+ | `decided_by` | text | padrão `""`; `operator` a partir da action |
124
+
125
+ ---
126
+
127
+ ## 6. O conjunto canônico de blocos 🚀
128
+
129
+ `seedCanonicalBlocks(orgId)` (ligado ao KB card e ao botão "Create central blocks" da Welcome Home via `seedDefaultBlocksAction`) garante que o conjunto curado completo exista. `mission`, `objective` e `official-stack` são preenchidos a partir dos próprios campos do workspace; o restante é criado como **placeholders iniciais editáveis** para que apareçam e sejam preenchidos. É **idempotente** — nunca sobrescreve um bloco existente e retorna quantos foram recém-criados.
130
+
131
+ | slug | kind | origem do corpo |
132
+ |---|---|---|
133
+ | `mission` | `mission` | `workspace.mission` |
134
+ | `objective` | `objective` | `workspace.objective` |
135
+ | `official-stack` | `stack` | renderizado de `workspace.stack` (`- **key:** value`, ignora `None`) |
136
+ | `current-architecture` | `architecture` | placeholder inicial |
137
+ | `business-rules` | `business-rule` | placeholder inicial |
138
+ | `ui-patterns` | `ui-pattern` | placeholder inicial |
139
+ | `security-patterns` | `security` | placeholder inicial |
140
+ | `deploy-checklist` | `deploy-checklist` | placeholder inicial |
141
+ | `code-review-checklist` | `review-checklist` | placeholder inicial |
142
+ | `glossary` | `glossary` | placeholder inicial |
143
+ | `technical-decisions` | `note` | placeholder inicial |
144
+
145
+ Um `seedDefaultBlocks(orgId)` mais leve semeia apenas `mission` / `objective` / `official-stack` e só se ausentes **e** não vazios. Ele roda no boot para cada workspace via `seedDefaultBlocksForExistingWorkspaces()` (chamado de `src/server/boot.ts`).
146
+
147
+ ---
148
+
149
+ ## 7. Propostas dos agentes: propor → revisar → merge ✦
150
+
151
+ Os agentes nunca gravam blocos diretamente. A instrução do runner diz a eles:
152
+
153
+ > Se você descobrir um FATO canônico DURÁVEL que pertence ao conhecimento compartilhado … você PODE propor uma edição de synced-block emitindo em linhas próprias: `[[KB-BLOCK <kebab-slug>]]` depois o novo corpo Markdown depois `[[/KB-BLOCK]]` — o operador / agente de Knowledge revisa e faz o merge. Use com moderação, apenas para fatos reutilizáveis (ex.: `official-stack`, `security-patterns`).
154
+
155
+ Após uma execução bem-sucedida, `src/server/runner.ts` varre a saída por blocos `[[KB-BLOCK slug]]…[[/KB-BLOCK]]`, chama `proposeBlockEdit` para cada um (enfileirando um `block_proposal` com `status = pending`), registra os slugs tocados (→ chips na room), e **remove os tokens** do texto visível. Cada proposta também:
156
+
157
+ - empurra um item de **Inbox** (`kind: review`, `refType: validation`, `refId = proposalId`) com título `Block edit proposed — <slug>`;
158
+ - dispara uma notificação ao operador via `notifyOps`.
159
+
160
+ O operador (ou o agente de Knowledge, Vannevar) então faz **merge** ou **rejeita** no `BlocksPanel` do módulo de Knowledge.
161
+
162
+ ```mermaid
163
+ sequenceDiagram
164
+ participant A as Agente
165
+ participant R as runner.ts
166
+ participant P as block_proposal
167
+ participant I as Inbox / notifyOps
168
+ participant OP as Operador / agente de KB
169
+ participant B as synced_block
170
+
171
+ A->>R: saída com [[KB-BLOCK slug]]…[[/KB-BLOCK]]
172
+ R->>P: proposeBlockEdit() → status=pending
173
+ R->>I: pushInbox(review/validation) + notifyOps
174
+ Note over OP: revisa em Knowledge → BlocksPanel
175
+ alt merge
176
+ OP->>P: mergeProposalAction(id)
177
+ P->>B: upsertBlock(body, updatedBy=byAgentHandle) → version++
178
+ B->>B: re-embed rag_chunk block/<slug>
179
+ P->>P: status=merged, decidedAt, decidedBy
180
+ P->>I: resolveInboxFor(validation, id)
181
+ else reject
182
+ OP->>P: rejectProposalAction(id)
183
+ P->>P: status=rejected, decidedAt, decidedBy
184
+ P->>I: resolveInboxFor(validation, id)
185
+ end
186
+ ```
187
+
188
+ No **merge**, `mergeProposal(wsId, id, by)` só prossegue se a proposta ainda estiver `pending`; ele então roda `upsertBlock` com `updatedBy` definido como o handle do agente proponente (preservando a autoria), marca a proposta como `merged` e resolve o item de Inbox. Na **rejeição**, `rejectProposal` a marca como `rejected` e resolve o item de Inbox sem tocar no bloco.
189
+
190
+ ---
191
+
192
+ ## 8. Passo a passo 🛠️
193
+
194
+ **Semear o conjunto canônico**
195
+
196
+ 1. Abra o módulo **Knowledge** (ou o KB card da Welcome Home / dashboard).
197
+ 2. Clique em **Create central blocks** → `seedDefaultBlocksAction` → `seedCanonicalBlocks`.
198
+ 3. `mission` / `objective` / `official-stack` vêm pré-preenchidos do workspace; o restante aparece como placeholders iniciais para editar.
199
+
200
+ **Editar um bloco como operador**
201
+
202
+ 1. No `BlocksPanel`, clique em **Edit** em um bloco (ou em **New**).
203
+ 2. Defina `slug`, `title`, `kind`, `body` (Markdown).
204
+ 3. Salve → `saveBlockAction` → `upsertBlock(…, updatedBy: "operator")` → `version++` + re-embed.
205
+
206
+ **Transcluir um bloco em um relatório ou persona**
207
+
208
+ 1. Escreva `{{kb:official-stack}}` em qualquer lugar do texto.
209
+ 2. Em tempo de leitura, `resolveBlocks` o troca pelo corpo atual do bloco (relatórios resolvem em `src/app/(app)/reports/[id]/page.tsx`; prompts resolvem ao final da montagem de contexto).
210
+
211
+ **Deixar um agente propor uma mudança**
212
+
213
+ 1. O agente emite `[[KB-BLOCK security-patterns]] …novo corpo… [[/KB-BLOCK]]` na saída da execução.
214
+ 2. A proposta cai na lista de pendentes do módulo de Knowledge + na Inbox.
215
+ 3. Você faz **Merge** (aplica + incrementa a versão) ou **Reject**.
216
+
217
+ ---
218
+
219
+ ## 9. Exemplos 📡
220
+
221
+ **Marcador de transclusão** (em um relatório ou em `.claude/agents/<handle>/Agent.md`):
222
+
223
+ ```markdown
224
+ ## Stack you must use
225
+ {{kb:official-stack}}
226
+
227
+ ## Rules you must never break
228
+ {{kb:business-rules}}
229
+ ```
230
+
231
+ Um slug ausente permanece bem visível:
232
+
233
+ ```markdown
234
+ {{kb:does-not-exist}} → [[missing block: does-not-exist]]
235
+ ```
236
+
237
+ **Token de proposta do agente** (emitido pelo agente, removido do chat após a captura):
238
+
239
+ ```text
240
+ [[KB-BLOCK official-stack]]
241
+ - **language:** TypeScript
242
+ - **framework:** Next.js 16
243
+ - **db:** SQLite via drizzle-orm
244
+ [[/KB-BLOCK]]
245
+ ```
246
+
247
+ **Resumo injetado** (o que `canonicalFactsSection` produz, abreviado):
248
+
249
+ ```text
250
+ ### Official stack (stack)
251
+ - **framework:** Next.js 16
252
+ - **db:** SQLite
253
+
254
+ ### Business rules (business-rule)
255
+ ...primeiros 800 caracteres...
256
+ ```
257
+
258
+ ---
259
+
260
+ ## 10. Estados possíveis 🕳️
261
+
262
+ **Block** — não tem coluna de status; seu ciclo de vida é o contador `version`. Um bloco existe, é editado (versão incrementa), ou é deletado (`deleteBlock` remove a linha **e** suas entradas em `rag_chunk` no caminho `block/<slug>`).
263
+
264
+ **Proposal** (`block_proposal.status`):
265
+
266
+ | Estado | Significado | Definido por |
267
+ |---|---|---|
268
+ | `pending` | aguardando decisão do operador/agente de KB; aparece em `listProposals` + Inbox | `proposeBlockEdit` (padrão) |
269
+ | `merged` | aplicado ao bloco (versão incrementada), Inbox resolvida | `mergeProposal` |
270
+ | `rejected` | descartado, bloco intocado, Inbox resolvida | `rejectProposal` |
271
+
272
+ `listProposals(wsId)` retorna apenas as propostas `pending`, mais recentes primeiro.
273
+
274
+ ---
275
+
276
+ ## 11. Integrações relacionadas 🔗
277
+
278
+ - **RAG** ([KB_RAG.md](./KB_RAG.md), [MEMORY_RAG.md](./MEMORY_RAG.md)) — cada gravação re-embedda o bloco em `rag_chunk` (`embed` + `chunksOf`) no caminho `block/<slug>`, então blocos participam da recuperação normal. Um fallback por palavra-chave se aplica se o servidor de embeddings estiver fora.
279
+ - **Gestor de contexto** ([AI_ARCHITECTURE.md](./AI_ARCHITECTURE.md)) — `canonicalFactsSection` é injetado como a seção de prioridade máxima "Canonical project facts"; `resolveBlocks` roda por último sobre o prompt montado.
280
+ - **Inbox** ([INBOX.md](./INBOX.md)) — propostas levantam e resolvem itens de revisão `validation`.
281
+ - **Agentes / agente de Knowledge** ([AGENTS.md](./AGENTS.md), [KB_AGENT.md](./KB_AGENT.md)) — agentes propõem; Vannevar / o operador faz o merge.
282
+ - **Relatórios & specs** ([GOALS_SPECS_ISSUES.md](./GOALS_SPECS_ISSUES.md)) — corpos de relatório transcluem `{{kb:slug}}` em tempo de leitura.
283
+ - **Tokens de conhecimento** ([CHAT_COMMANDS.md](./CHAT_COMMANDS.md)) — `[[KB-BLOCK …]]` convive com `[[REMEMBER …]]` / `[[CONSULT …]]` no vocabulário de tokens dos agentes.
284
+
285
+ ---
286
+
287
+ ## 12. Segurança 🛡️
288
+
289
+ - **Sem gravações diretas de agentes.** Agentes só podem *propor*; o corpo canônico muda apenas via `mergeProposal` / `saveBlockAction` (operador ou agente de KB). Isso mantém a fonte de verdade compartilhada sob controle humano/curador.
290
+ - **Isolamento de workspace.** Toda consulta é escopada por `workspaceId`; a PK é `(workspaceId, slug)` e as FKs cascateiam na exclusão do workspace.
291
+ - **Entrada limitada.** `title`/`body`/`kind`/`updatedBy` têm tamanho limitado; slugs são normalizados e validados por regex antes de qualquer gravação.
292
+ - **Higiene de segredos.** Blocos são conhecimento curado, mas trate os corpos como qualquer superfície compartilhada — não cole segredos; a plataforma faz scrub de segredos na ingestão de KB, no Telegram e nos logs (`scrubSecrets`, veja [SECURITY.md](./SECURITY.md)).
293
+ - **Resiliência.** Todas as funções de bloco envolvem o trabalho de banco em `try/catch` e degradam graciosamente (`listBlocks` → `[]`, `resolveBlocks` → texto original), então uma falha transitória nunca quebra a montagem do prompt.
294
+
295
+ ---
296
+
297
+ ## 13. Solução de problemas 🔧
298
+
299
+ | Sintoma | Causa provável | Correção |
300
+ |---|---|---|
301
+ | `[[missing block: <slug>]]` em um relatório/prompt | o bloco referenciado não existe (ou erro de digitação no slug) | crie o bloco, ou corrija o marcador `{{kb:slug}}`; slugs são kebab minúsculo |
302
+ | Gravação do bloco falha em silêncio (`{ ok: false }`) | slug inválido (falha o `SLUG_RE`) ou vazio após normalização | use `[a-z0-9-]`, comece com alfanumérico, ≤ 60 caracteres |
303
+ | A proposta do agente nunca aparece | o agente não a envolveu corretamente, ou o corpo estava vazio | os tokens devem ser exatamente `[[KB-BLOCK <slug>]]` … `[[/KB-BLOCK]]` com corpo não vazio |
304
+ | O botão de merge não faz nada | a proposta não está mais `pending` (já decidida) | recarregue; `mergeProposal` ignora propostas não pendentes |
305
+ | O bloco editado não aparece nas respostas do agente | recuperação de RAG fria / servidor de embeddings fora | o bloco ainda é injetado via `canonicalFactsSection`; verifique o servidor de embeddings (veja [MODELS.md](./MODELS.md)) |
306
+ | Nenhum bloco após o onboarding | `mission`/`objective`/`stack` do workspace estavam vazios (nada a semear) | clique em **Create central blocks** para semear o conjunto completo com placeholders |
307
+
308
+ ---
309
+
310
+ ## 14. Links relacionados ✦
311
+
312
+ - [KB_RAG.md](./KB_RAG.md) — a base de conhecimento, ingestão e `kbQuery`
313
+ - [MEMORY_RAG.md](./MEMORY_RAG.md) — embeddings, a nebulosa de memória
314
+ - [KB_AGENT.md](./KB_AGENT.md) — Vannevar, o agente de Knowledge
315
+ - [AI_ARCHITECTURE.md](./AI_ARCHITECTURE.md) — como o contexto é montado para os agentes
316
+ - [AGENTS.md](./AGENTS.md) — o elenco de agentes e como eles executam
317
+ - [INBOX.md](./INBOX.md) — itens de revisão e resolução
318
+ - [GOALS_SPECS_ISSUES.md](./GOALS_SPECS_ISSUES.md) — specs, relatórios, alvos de transclusão
319
+ - [CHAT_COMMANDS.md](./CHAT_COMMANDS.md) — vocabulário de tokens dos agentes
320
+ - [SECURITY.md](./SECURITY.md) — isolamento, scrubbing, vault