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
+ [← Docs index](./README.md) Β· [πŸ‡§πŸ‡· PortuguΓͺs](../pt/START_MODE.md) Β· [✦ Constella](../../README.md)
2
+
3
+ # Start Mode ✦ β€” the launch pad
4
+
5
+ > The default ignition for a single-pilot ship: Constella boots on `127.0.0.1`, auto-provisions a local operator, signs you in with no login screen, and lets the agent constellation run with full local permissions.
6
+
7
+ Start Mode is the run mode you get when you launch Constella with no mode flag (or with `--start`). It optimizes for a single operator on their own machine: zero friction, no passwords, full agent autonomy.
8
+
9
+ ---
10
+
11
+ ## πŸ›°οΈ When to use
12
+
13
+ | Use Start Mode when… | Prefer another mode when… |
14
+ | --- | --- |
15
+ | You run Constella **on your own laptop / workstation** | You expose it on a network β†’ [AUTH_MODE](./AUTH_MODE.md) / [VPS_MODE](./VPS_MODE.md) |
16
+ | You want **no login screen**, always signed in | Multiple humans need accounts / 2FA β†’ [AUTH_MODE](./AUTH_MODE.md) |
17
+ | You want agents that can **install deps + run tests** (full shell) | You want agents jailed to edits-only β†’ [AUTH_MODE](./AUTH_MODE.md) |
18
+ | You're developing, demoing, or running a personal agent-company | You boot from a USB drive across machines β†’ [PORTABLE_MODE](./PORTABLE_MODE.md) |
19
+
20
+ Start Mode is **local-only by design**. It binds the loopback interface and uses a predictable operator credential β€” both safe on one machine, both unsafe on a network. The code refuses to provision that credential in any other mode.
21
+
22
+ ---
23
+
24
+ ## 🌌 How it works
25
+
26
+ Start Mode is one of four values of `RunMode` (`src/lib/run-mode.ts`):
27
+
28
+ ```ts
29
+ export type RunMode = "start" | "auth" | "vps" | "portable";
30
+ ```
31
+
32
+ The launcher (`bin/constella.mjs`) selects the mode from the launch flag and exports it as `CONSTELLA_RUN_MODE`. The whole server reads it back through `getRunMode()`, which **defaults to `start`** when the env var is missing or unknown:
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
+ The `RUN_MODES` registry marks `start` as the only mode that does **not** require a login:
43
+
44
+ ```ts
45
+ start: { label: "Start", requiresLogin: false, note: "Local auto-created account Β· always signed in." },
46
+ ```
47
+
48
+ Three behaviours flow from that single fact:
49
+
50
+ 1. **No login screen.** The workspace guard sends unauthenticated requests to the silent auto-login route instead of `/login`.
51
+ 2. **Auto-provisioned operator.** A real local user + a real better-auth password hash are created idempotently, and signed in.
52
+ 3. **Full-access agents.** The CLI adapter runs agents with `--permission-mode bypassPermissions` (install deps, run tests, full shell) because you're on your own machine.
53
+
54
+ The chosen mode is also **persisted on the organization** at onboarding time (`organization.runMode`), so the org record remembers it was born in Start Mode.
55
+
56
+ ---
57
+
58
+ ## πŸš€ Main flow
59
+
60
+ ```mermaid
61
+ flowchart TD
62
+ A["constella (no flag) or constella --start"] --> B["bin/constella.mjs"]
63
+ B --> C["CONSTELLA_RUN_MODE=start<br/>host=127.0.0.1 port=3000"]
64
+ C --> D["Persist secrets to &lt;HOME&gt;/.env (chmod 600)<br/>BETTER_AUTH_SECRET Β· VAULT_KEY Β· WORKER_SECRET"]
65
+ D --> E["drizzle-kit migrate (fresh DB gets its tables)"]
66
+ E --> F["next start + worker (supervised)"]
67
+ F --> G["Browser hits any (app) page"]
68
+ G --> H{"requireWorkspace():<br/>session cookie?"}
69
+ H -- "yes" --> Z["Render the app"]
70
+ H -- "no (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
+ ### Auto-login flow (the heart of Start Mode) 🌠
78
+
79
+ ```mermaid
80
+ sequenceDiagram
81
+ participant U as Browser
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: no session cookie
90
+ W-->>U: 307 β†’ /api/dev-login
91
+ U->>R: GET /api/dev-login
92
+ R->>R: getRunMode() === "start" ?
93
+ alt not start mode
94
+ R-->>U: 307 β†’ /login
95
+ else start mode
96
+ R->>D: ensureLocalOperator()
97
+ D->>D: upsert user_operator + credential hash
98
+ R->>A: signInEmail(operator@constella.dev / operator123)
99
+ A-->>R: session cookie (nextCookies plugin)
100
+ R-->>U: 307 β†’ / (now authenticated)
101
+ end
102
+ ```
103
+
104
+ ---
105
+
106
+ ## πŸͺ Key concepts
107
+
108
+ ### The local operator
109
+
110
+ `src/server/dev-auth.ts` defines the predictable account:
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()` is **idempotent** and safe to call on every request:
122
+
123
+ - It looks up the user by email; if absent, inserts `user_operator` (with `emailVerified: true`).
124
+ - It looks up the `credential` account; if absent, hashes `operator123` through better-auth's own `ctx.password.hash` and inserts a real credential row.
125
+ - It returns the user id.
126
+
127
+ Because the id is fixed (`user_operator`) and matches the seed owner, a seeded demo org is owned by the auto-provisioned operator β€” so a **from-scratch DB wipe self-heals**: the next page load re-creates the operator and signs in, no manual step.
128
+
129
+ > πŸ•³οΈ **Defense-in-depth gate:** `ensureLocalOperator()` throws `"ensureLocalOperator is start-mode only"` if `getRunMode() !== "start"`. The predictable `operator/operator123` credential can therefore **never** exist in a network-exposed mode where the default password would be a remote login.
130
+
131
+ ### The auto-login route
132
+
133
+ `src/app/api/dev-login/route.ts` is a `GET` handler:
134
+
135
+ - Outside Start Mode β†’ `redirect("/login")` (the normal screen).
136
+ - In Start Mode β†’ `ensureLocalOperator()` β†’ `auth.api.signInEmail({ email, password })` (the cookie is set by the `nextCookies()` better-auth plugin) β†’ `redirect("/")`.
137
+ - On any failure β†’ `redirect("/login?autologin=failed")` so the guard never loops.
138
+
139
+ ### The workspace guard
140
+
141
+ `src/lib/workspace.ts` `requireWorkspace()` is the gate every `(app)` page and server action passes through. The Start-Mode branch:
142
+
143
+ ```ts
144
+ if (!session) redirect(getRunMode() === "start" ? "/api/dev-login" : "/login");
145
+ ```
146
+
147
+ That single line is what turns "no session" into "auto sign-in" in Start Mode, and "show the login screen" everywhere else.
148
+
149
+ ### Full-access agents (`bypassPermissions`)
150
+
151
+ `src/server/adapters/cli.ts` decides how much shell power agents get:
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 β†’ full: install + test
162
+ : ["--permission-mode", "acceptEdits"]; // network modes β†’ jailed: edits only
163
+ }
164
+ ```
165
+
166
+ So in Start Mode the `claude` / `codex` CLIs run with `bypassPermissions` β€” they can install dependencies and run tests in the workspace β€” because you're on your own machine. Network modes (`auth` / `vps` / `portable`) default to `acceptEdits` (edits-only, jailed). Override either way with `CONSTELLA_AGENT_FULL_ACCESS=1|0`. Agents still always run **vanilla** (a temp settings overlay sets `disableAllHooks: true`) so the operator's personal `~/.claude` hooks/plugins never bleed into agent runs. See [AGENTS](./AGENTS.md) and [AI_ARCHITECTURE](./AI_ARCHITECTURE.md).
167
+
168
+ ### The auth secret in Start Mode
169
+
170
+ `next start` runs under `NODE_ENV=production`, where better-auth **throws on its default secret**. So even local Start Mode needs a real `BETTER_AUTH_SECRET` β€” the launcher generates and persists one to `<HOME>/.env` (`chmod 600`). The only relaxation: `assertAuthSecret()` accepts a missing secret **only** when `RUN_MODE === "start"`; every network mode hard-fails closed without one (`src/lib/auth.ts`). Session cookies stay non-`Secure` in Start Mode because it's local `http` only.
171
+
172
+ ---
173
+
174
+ ## Tables πŸ“Š
175
+
176
+ ### Start Mode vs the other run modes
177
+
178
+ | Property | **start** | auth | vps | portable |
179
+ | --- | --- | --- | --- | --- |
180
+ | `requiresLogin` | **false** | true | true | true |
181
+ | Login screen | none (auto) | email + password | email + password | email + password |
182
+ | Bind host | `127.0.0.1` | `127.0.0.1` | `0.0.0.0` | `0.0.0.0` |
183
+ | Operator | auto `operator@constella.dev` | you create it | you create it | you create it |
184
+ | Agent permission | `bypassPermissions` | `acceptEdits` | `acceptEdits` | `acceptEdits` |
185
+ | `BETTER_AUTH_SECRET` required | persisted, not enforced | enforced | enforced | enforced |
186
+ | Secure cookies | no (local http) | if behind https | yes | if behind https |
187
+ | Typical use | own machine / dev | shared box, local net | server over Tailscale | USB across machines |
188
+
189
+ ### Launch commands β†’ Start Mode
190
+
191
+ | Command | Result |
192
+ | --- | --- |
193
+ | `constella` | Start Mode (default `cmd === "start"`) |
194
+ | `constella --start` | Start Mode (explicit) |
195
+ | `constella --bind local` | Start Mode (legacy `--bind` back-compat) |
196
+ | `CONSTELLA_RUN_MODE=start` | Forces Start Mode for the server process |
197
+
198
+ ### Env vars that shape Start Mode
199
+
200
+ | Variable | Default in Start Mode | Effect |
201
+ | --- | --- | --- |
202
+ | `CONSTELLA_RUN_MODE` | `start` | The run mode the server reads |
203
+ | `CONSTELLA_HOME` | `~/.constella` | Runtime root (DB, secrets, orgs) |
204
+ | `--host` / host | `127.0.0.1` | Loopback bind |
205
+ | `--port` / `PORT` | `3000` | Web port |
206
+ | `CONSTELLA_AGENT_FULL_ACCESS` | `1` (implied by start) | `0` re-jails agents to edits-only |
207
+ | `CONSTELLA_WEB_RESEARCH` | on | `0` disables agent WebSearch/WebFetch |
208
+ | `BETTER_AUTH_SECRET` | generated β†’ `<HOME>/.env` | Session signing key |
209
+
210
+ ### Key files
211
+
212
+ | File | Role |
213
+ | --- | --- |
214
+ | `src/lib/run-mode.ts` | `RunMode` type, `RUN_MODES`, `getRunMode()`, `requiresLogin()` |
215
+ | `bin/constella.mjs` | Launcher: picks mode, sets host/port, persists secrets, boots web + worker |
216
+ | `src/lib/workspace.ts` | `requireWorkspace()` β€” redirects to `/api/dev-login` in Start Mode |
217
+ | `src/app/api/dev-login/route.ts` | Silent auto sign-in route |
218
+ | `src/server/dev-auth.ts` | `DEV_OPERATOR`, `ensureLocalOperator()` |
219
+ | `src/lib/auth.ts` | better-auth config; `assertAuthSecret()` relaxes only for `start` |
220
+ | `src/server/adapters/cli.ts` | `claudePermArgs()` β†’ `bypassPermissions` in Start Mode |
221
+ | `src/lib/run-context.ts` | `detectRunContext()` for the Update path |
222
+
223
+ ---
224
+
225
+ ## Step-by-step 🧭
226
+
227
+ ### Start a fresh ship in Start Mode
228
+
229
+ 1. **Launch** with no flag (or `--start`):
230
+ ```bash
231
+ npx constella
232
+ # or, installed globally:
233
+ constella --start
234
+ ```
235
+ 2. The launcher prints the runtime root and `Mode : start Β· 127.0.0.1:3000`, persists secrets to `<HOME>/.env`, applies migrations, and boots `next start` + the worker.
236
+ 3. **Open** `http://127.0.0.1:3000`.
237
+ 4. `requireWorkspace()` finds no session β†’ redirects to `/api/dev-login`.
238
+ 5. The route provisions `operator@constella.dev`, signs it in, sets the cookie, and bounces to `/`.
239
+ 6. If no org exists yet, you land in [ONBOARDING](./ONBOARDING.md); otherwise you're in the app, already signed in.
240
+
241
+ ### Wipe and self-heal
242
+
243
+ ```bash
244
+ # stop Constella, then:
245
+ rm ~/.constella/constella.db
246
+ constella
247
+ ```
248
+ The next page load re-runs `ensureLocalOperator()` and re-creates the operator β€” no manual account step.
249
+
250
+ ### Re-jail agents in Start Mode (extra caution)
251
+
252
+ ```bash
253
+ CONSTELLA_AGENT_FULL_ACCESS=0 constella --start
254
+ ```
255
+ Agents now run `acceptEdits` (edits-only, no arbitrary shell), while you keep the no-login convenience.
256
+
257
+ ---
258
+
259
+ ## Examples 🌟
260
+
261
+ **Default launch (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
+ **Custom port, still Start Mode:**
271
+ ```bash
272
+ $ constella --start --port 4000
273
+ # β†’ http://127.0.0.1:4000, auto-login, full-access agents
274
+ ```
275
+
276
+ **Pin a different runtime root:**
277
+ ```bash
278
+ $ CONSTELLA_HOME=/data/constella constella --start
279
+ # DB at /data/constella/constella.db; secrets at /data/constella/.env
280
+ ```
281
+
282
+ ---
283
+
284
+ ## Possible states πŸ›°οΈ
285
+
286
+ | Situation | Behaviour |
287
+ | --- | --- |
288
+ | No session cookie, Start Mode | Redirect `/api/dev-login` β†’ auto sign-in β†’ `/` |
289
+ | No session cookie, **not** Start Mode | Redirect `/login` |
290
+ | Auto sign-in succeeds | Cookie set, land on `/` (or `/onboarding` if no org) |
291
+ | Auto sign-in **fails** | Redirect `/login?autologin=failed` (no loop) |
292
+ | `CONSTELLA_FORCE_ONBOARDING=1` | After session, redirect `/onboarding` (one-shot, cleared by `completeOnboarding`) |
293
+ | Org missing / workspace missing | Redirect `/onboarding` |
294
+ | `ensureLocalOperator()` called outside start | Throws `"ensureLocalOperator is start-mode only"` |
295
+ | Agent run, Start Mode | `claude --permission-mode bypassPermissions` (full shell) |
296
+ | Agent run, `CONSTELLA_AGENT_FULL_ACCESS=0` | `claude --permission-mode acceptEdits` (jailed) |
297
+
298
+ ---
299
+
300
+ ## Related integrations πŸͺ
301
+
302
+ - **Onboarding** persists the active mode onto `organization.runMode` (`src/server/onboarding.ts`). See [ONBOARDING](./ONBOARDING.md).
303
+ - **Worker** (`bin/worker.mjs`) connects back over `127.0.0.1` regardless of bind host; in Start Mode that's also the web bind. See [ARCHITECTURE](./ARCHITECTURE.md).
304
+ - **Vault** still needs `CONSTELLA_VAULT_KEY` even in Start Mode (provider keys are encrypted). See [SECURITY](./SECURITY.md).
305
+ - **Update** path is mode-aware via `detectRunContext()`. See [UPDATE](./UPDATE.md).
306
+
307
+ ---
308
+
309
+ ## Security πŸ•³οΈ
310
+
311
+ Start Mode trades network hardening for local convenience β€” safe precisely because it is local:
312
+
313
+ - **Loopback only.** Host binds `127.0.0.1`; nothing is reachable off-box.
314
+ - **Predictable credential is gated.** `operator@constella.dev / operator123` is provisioned **only** when `getRunMode() === "start"`; `ensureLocalOperator()` throws otherwise. The dev-login route also returns `/login` outside Start Mode.
315
+ - **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`.
316
+ - **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.
317
+ - **Do not port-forward Start Mode.** If you need remote access, switch to [VPS_MODE](./VPS_MODE.md) (Tailscale + Docker) or [AUTH_MODE](./AUTH_MODE.md) β€” never expose the loopback Start Mode to a network, where the default password becomes a remote login.
318
+
319
+ ---
320
+
321
+ ## Troubleshooting 🧰
322
+
323
+ | Symptom | Likely cause | Fix |
324
+ | --- | --- | --- |
325
+ | Stuck on `/login` despite `--start` | `CONSTELLA_RUN_MODE` not `start` for the server | Verify launch flag; check the `Mode : start` line at boot |
326
+ | `/login?autologin=failed` | Auto sign-in threw (DB locked, schema not migrated) | Check console `[dev-login] auto sign-in failed`; ensure migrations ran |
327
+ | Login loop | Guard ↔ dev-login bouncing | The route falls back to `/login?autologin=failed` by design; inspect the logged error |
328
+ | Agents can't install deps / run tests | `CONSTELLA_AGENT_FULL_ACCESS=0` set, or not Start Mode | Unset the override, or relaunch with `--start` |
329
+ | Reachable from another machine | You overrode `--host` to `0.0.0.0` | Drop `--host`; Start Mode binds `127.0.0.1` |
330
+ | better-auth secret error at boot | Forced a network mode without a secret | Network modes require `BETTER_AUTH_SECRET`; the launcher persists one β€” let it run, or set it |
331
+ | Operator vanished after DB reset | Expected | Reload any page β€” `ensureLocalOperator()` re-creates it |
332
+
333
+ ---
334
+
335
+ ## Related links 🌌
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
+ [← Docs index](./README.md) Β· [πŸ‡§πŸ‡· PortuguΓͺs](../pt/SYNCED_BLOCKS.md) Β· [✦ Constella](../../README.md)
2
+
3
+ # 🌌 Synced Blocks β€” the canonical memory nebula
4
+
5
+ ![](../assets/divider-orbit.svg)
6
+
7
+ Synced blocks are the **single source of truth** for durable project knowledge: one named unit (`slug` + Markdown `body`) edited in exactly one place and surfaced by reference everywhere β€” agent prompts, the welcome home, and transcluded into reports. Edit a block once and every surface reflects the latest, with no copy-paste drift. They are distinct from auto-captured `kb_entry` knowledge: a synced block is **curated, canonical, and versioned**; agents can only *propose* edits to it.
8
+
9
+ Source of truth in code: `src/server/blocks.ts`, schema `src/db/schema.ts` (`synced_block`, `block_proposal`).
10
+
11
+ ---
12
+
13
+ ## 1. When to use πŸͺ
14
+
15
+ Use synced blocks for facts that:
16
+
17
+ - are **durable** and **reused** across many runs and surfaces (the official stack, business rules, security patterns, the architecture every agent must treat as canonical);
18
+ - must stay **consistent** everywhere they appear (no drift between the persona file, a report, and a chat answer);
19
+ - benefit from **operator/KB-agent review** before changing the shared truth.
20
+
21
+ Do **not** use them for transient, run-specific learnings. Those flow into the auto-captured KB via the `[[REMEMBER type=<t>: <fact>]]` token (no approval) β€” see [KB_RAG.md](./KB_RAG.md) and [MEMORY_RAG.md](./MEMORY_RAG.md).
22
+
23
+ | Knowledge kind | Mechanism | Approval | Versioned | Doc |
24
+ |---|---|---|---|---|
25
+ | Canonical, curated fact | Synced block (`synced_block`) | Operator / KB agent merges proposals | Yes (`version`) | this doc |
26
+ | Auto-captured learning | `kb_entry` via `[[REMEMBER …]]` | None (ingested directly) | No (status lifecycle) | [KB_RAG.md](./KB_RAG.md) |
27
+
28
+ ---
29
+
30
+ ## 2. How it works πŸ›°οΈ
31
+
32
+ A synced block lives in the `synced_block` table, keyed by `(workspaceId, slug)`. Its `body` is canonical Markdown. Two things happen whenever a block is written via `upsertBlock`:
33
+
34
+ 1. The row is **upserted** β€” on create `version = 1`; on update `version` is incremented (`cur.version + 1`), `updatedBy` and `updatedAt` are refreshed.
35
+ 2. The body is **re-embedded** into `rag_chunk` at path `block/<slug>` (`embedBlock`), so agents also *retrieve* the current block through RAG, not just receive it injected. The old chunks at that path are deleted first, so embeddings never go stale.
36
+
37
+ The block then reaches agents through **three** distinct surfaces:
38
+
39
+ - **Injected** β€” `canonicalFactsSection(wsId)` builds a compact "Canonical project facts" section (up to 20 most-recently-updated blocks, each title + kind + first 800 chars, capped at 5000 chars total) that the context manager injects near the top of every agent prompt.
40
+ - **Transcluded** β€” `resolveBlocks(orgId, text)` replaces `{{kb:slug}}` markers anywhere in text (persona files, instructions, report bodies) with the block's current `body`. A missing slug renders a LOUD visible marker `[[missing block: <slug>]]` rather than silently vanishing.
41
+ - **Retrieved** β€” the RAG chunks at `block/<slug>` are returned by ordinary `kbQuery` retrieval, so a block can surface even when it isn't in the always-injected window.
42
+
43
+ ### Slug rules
44
+
45
+ Slugs are normalized (`normSlug`): lowercased, trimmed, non-`[a-z0-9-]` collapsed to `-`, leading/trailing dashes stripped, truncated to 60 chars, and validated against `/^[a-z0-9][a-z0-9-]{0,60}$/`. An invalid slug fails the upsert (`{ ok: false }`).
46
+
47
+ ### Field bounds (enforced in `upsertBlock`)
48
+
49
+ | Field | Bound |
50
+ |---|---|
51
+ | `title` | sliced to 200 chars |
52
+ | `body` | sliced to 20000 chars |
53
+ | `kind` | sliced to 40 chars (default `note`) |
54
+ | `updatedBy` | sliced to 60 chars (default `operator`) |
55
+
56
+ ---
57
+
58
+ ## 3. Main flow 🌠
59
+
60
+ ```mermaid
61
+ flowchart TD
62
+ subgraph Authoring
63
+ OP["Operator edits in Knowledge UI"] -->|saveBlockAction| UP["upsertBlock()"]
64
+ SEED["Boot / KB card seeding"] -->|seedDefaultBlocks Β· seedCanonicalBlocks| UP
65
+ AG["Agent proposes [[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["Agent prompt: Canonical project facts"]
71
+ TBL -->|"resolveBlocks {{kb:slug}}"| SURF["Reports Β· persona Β· instructions"]
72
+ RC -->|kbQuery retrieval| PROMPT
73
+ ```
74
+
75
+ ---
76
+
77
+ ## 4. Key concepts ✦
78
+
79
+ | Concept | What it is |
80
+ |---|---|
81
+ | **Block** | `typeof syncedBlock.$inferSelect` β€” one canonical knowledge unit `(slug, kind, title, body, version, updatedBy)`. |
82
+ | **Proposal** | `typeof blockProposal.$inferSelect` β€” an agent's *suggested* edit awaiting merge/reject. |
83
+ | **`{{kb:slug}}` marker** | A transclusion token resolved at read time to the block's current body. |
84
+ | **`[[KB-BLOCK slug]]…[[/KB-BLOCK]]`** | The token an agent emits in its run output to *propose* a block edit. |
85
+ | **Canonical facts section** | The bounded block digest injected into every agent prompt as the authoritative source of truth. |
86
+ | **Re-embedding** | Each save refreshes `rag_chunk` at `block/<slug>` so RAG retrieval stays current. |
87
+ | **Versioning** | `version` starts at 1, increments on every update; the UI shows `v<n>` and `updatedBy`. |
88
+
89
+ ---
90
+
91
+ ## 5. Tables πŸ—„οΈ
92
+
93
+ ### `synced_block` (PK `(workspaceId, slug)`)
94
+
95
+ | Column | Type | Notes |
96
+ |---|---|---|
97
+ | `workspace_id` | text | FK β†’ `workspace.id`, `onDelete: cascade` |
98
+ | `slug` | text | stable handle, e.g. `official-stack` |
99
+ | `kind` | text | default `note`; see kinds below |
100
+ | `title` | text | default `""` |
101
+ | `body` | text | canonical Markdown β€” the single source of truth |
102
+ | `version` | integer | default `1`, bumped on every update |
103
+ | `updated_by` | text | agent handle or `operator` (or `system` for seeded) |
104
+ | `created_at` | timestamp | `unixepoch()` |
105
+ | `updated_at` | timestamp | `unixepoch()`; blocks are listed/digested in `desc(updatedAt)` |
106
+
107
+ **`kind` values** (from the schema comment): `mission`, `objective`, `stack`, `architecture`, `business-rule`, `ui-pattern`, `security`, `commands`, `deploy-checklist`, `review-checklist`, `glossary`, `policy`, `note`. `kind` is free text (sliced to 40 chars), so these are conventions, not a DB enum.
108
+
109
+ ### `block_proposal` (PK `id`, index `block_prop_ws_idx` on `(workspaceId, status)`)
110
+
111
+ | Column | Type | Notes |
112
+ |---|---|---|
113
+ | `id` | text | `randomUUID()` |
114
+ | `workspace_id` | text | FK β†’ `workspace.id`, `onDelete: cascade` |
115
+ | `slug` | text | target block slug (normalized) |
116
+ | `kind` | text | default `note` |
117
+ | `title` | text | default `""` |
118
+ | `body` | text | proposed Markdown body |
119
+ | `by_agent_handle` | text | who proposed it |
120
+ | `status` | text enum | `pending` \| `merged` \| `rejected` (default `pending`) |
121
+ | `created_at` | timestamp | `unixepoch()` |
122
+ | `decided_at` | timestamp | set on merge/reject |
123
+ | `decided_by` | text | default `""`; `operator` from the action |
124
+
125
+ ---
126
+
127
+ ## 6. The canonical block set πŸš€
128
+
129
+ `seedCanonicalBlocks(orgId)` (wired to the KB card and the Welcome Home "Create central blocks" button via `seedDefaultBlocksAction`) ensures the full curated set exists. `mission`, `objective`, and `official-stack` are filled from the workspace's own fields; the rest are created as **editable starter placeholders** so they show up to be filled in. It is **idempotent** β€” it never overwrites an existing block, and returns how many were newly created.
130
+
131
+ | slug | kind | source of body |
132
+ |---|---|---|
133
+ | `mission` | `mission` | `workspace.mission` |
134
+ | `objective` | `objective` | `workspace.objective` |
135
+ | `official-stack` | `stack` | rendered from `workspace.stack` (`- **key:** value`, skips `None`) |
136
+ | `current-architecture` | `architecture` | starter placeholder |
137
+ | `business-rules` | `business-rule` | starter placeholder |
138
+ | `ui-patterns` | `ui-pattern` | starter placeholder |
139
+ | `security-patterns` | `security` | starter placeholder |
140
+ | `deploy-checklist` | `deploy-checklist` | starter placeholder |
141
+ | `code-review-checklist` | `review-checklist` | starter placeholder |
142
+ | `glossary` | `glossary` | starter placeholder |
143
+ | `technical-decisions` | `note` | starter placeholder |
144
+
145
+ A lighter `seedDefaultBlocks(orgId)` seeds only `mission` / `objective` / `official-stack` and only if absent **and** non-empty. It runs at boot for every workspace via `seedDefaultBlocksForExistingWorkspaces()` (called from `src/server/boot.ts`).
146
+
147
+ ---
148
+
149
+ ## 7. Agent proposals: propose β†’ review β†’ merge ✦
150
+
151
+ Agents never write blocks directly. The runner instruction tells them:
152
+
153
+ > If you discover a DURABLE canonical fact that belongs in the shared knowledge … you MAY propose a synced-block edit by emitting on their own lines: `[[KB-BLOCK <kebab-slug>]]` then the new Markdown body then `[[/KB-BLOCK]]` β€” the operator / Knowledge agent reviews and merges it. Use sparingly, only for reusable facts (e.g. `official-stack`, `security-patterns`).
154
+
155
+ After a successful run, `src/server/runner.ts` scans the output for `[[KB-BLOCK slug]]…[[/KB-BLOCK]]` blocks, calls `proposeBlockEdit` for each (queuing a `block_proposal` with `status = pending`), records the touched slugs (β†’ room chips), and **strips the tokens** from the visible text. Each proposal also:
156
+
157
+ - pushes an **Inbox** item (`kind: review`, `refType: validation`, `refId = proposalId`) titled `Block edit proposed β€” <slug>`;
158
+ - fires an operator notification via `notifyOps`.
159
+
160
+ The operator (or the Knowledge agent, Vannevar) then **merges** or **rejects** from the Knowledge module's `BlocksPanel`.
161
+
162
+ ```mermaid
163
+ sequenceDiagram
164
+ participant A as Agent
165
+ participant R as runner.ts
166
+ participant P as block_proposal
167
+ participant I as Inbox / notifyOps
168
+ participant OP as Operator / KB agent
169
+ participant B as synced_block
170
+
171
+ A->>R: run output with [[KB-BLOCK slug]]…[[/KB-BLOCK]]
172
+ R->>P: proposeBlockEdit() β†’ status=pending
173
+ R->>I: pushInbox(review/validation) + notifyOps
174
+ Note over OP: reviews in 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
+ On **merge**, `mergeProposal(wsId, id, by)` only proceeds if the proposal is still `pending`; it then runs `upsertBlock` with `updatedBy` set to the proposing agent's handle (so authorship is preserved), marks the proposal `merged`, and resolves the Inbox item. On **reject**, `rejectProposal` marks it `rejected` and resolves the Inbox item without touching the block.
189
+
190
+ ---
191
+
192
+ ## 8. Step-by-step πŸ› οΈ
193
+
194
+ **Seed the canonical set**
195
+
196
+ 1. Open the **Knowledge** module (or the Welcome Home / dashboard KB card).
197
+ 2. Click **Create central blocks** β†’ `seedDefaultBlocksAction` β†’ `seedCanonicalBlocks`.
198
+ 3. `mission` / `objective` / `official-stack` come pre-filled from the workspace; the rest appear as starter placeholders to edit.
199
+
200
+ **Edit a block as operator**
201
+
202
+ 1. In `BlocksPanel`, click **Edit** on a block (or **New**).
203
+ 2. Set `slug`, `title`, `kind`, `body` (Markdown).
204
+ 3. Save β†’ `saveBlockAction` β†’ `upsertBlock(…, updatedBy: "operator")` β†’ `version++` + re-embed.
205
+
206
+ **Transclude a block into a report or persona**
207
+
208
+ 1. Write `{{kb:official-stack}}` anywhere in the text.
209
+ 2. At read time, `resolveBlocks` swaps it for the block's current body (reports resolve in `src/app/(app)/reports/[id]/page.tsx`; prompts resolve at the end of context assembly).
210
+
211
+ **Let an agent propose a change**
212
+
213
+ 1. The agent emits `[[KB-BLOCK security-patterns]] …new body… [[/KB-BLOCK]]` in its run output.
214
+ 2. The proposal lands in the Knowledge module's pending list + the Inbox.
215
+ 3. You **Merge** (applies + bumps version) or **Reject**.
216
+
217
+ ---
218
+
219
+ ## 9. Examples πŸ“‘
220
+
221
+ **Transclusion marker** (in a report or `.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
+ A missing slug stays loudly visible:
232
+
233
+ ```markdown
234
+ {{kb:does-not-exist}} β†’ [[missing block: does-not-exist]]
235
+ ```
236
+
237
+ **Agent proposal token** (emitted by the agent, stripped from chat after capture):
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
+ **Injected digest** (what `canonicalFactsSection` produces, abbreviated):
248
+
249
+ ```text
250
+ ### Official stack (stack)
251
+ - **framework:** Next.js 16
252
+ - **db:** SQLite
253
+
254
+ ### Business rules (business-rule)
255
+ ...first 800 chars...
256
+ ```
257
+
258
+ ---
259
+
260
+ ## 10. Possible states πŸ•³οΈ
261
+
262
+ **Block** β€” has no status column; its lifecycle is the `version` counter. A block exists, is edited (version bumps), or is deleted (`deleteBlock` removes the row **and** its `rag_chunk` entries at `block/<slug>`).
263
+
264
+ **Proposal** (`block_proposal.status`):
265
+
266
+ | State | Meaning | Set by |
267
+ |---|---|---|
268
+ | `pending` | awaiting operator/KB-agent decision; appears in `listProposals` + Inbox | `proposeBlockEdit` (default) |
269
+ | `merged` | applied to the block (version bumped), Inbox resolved | `mergeProposal` |
270
+ | `rejected` | discarded, block untouched, Inbox resolved | `rejectProposal` |
271
+
272
+ `listProposals(wsId)` returns only `pending` proposals, newest first.
273
+
274
+ ---
275
+
276
+ ## 11. Related integrations πŸ”—
277
+
278
+ - **RAG** ([KB_RAG.md](./KB_RAG.md), [MEMORY_RAG.md](./MEMORY_RAG.md)) β€” every save re-embeds the block into `rag_chunk` (`embed` + `chunksOf`) at path `block/<slug>`, so blocks participate in ordinary retrieval. A keyword fallback applies if the embed server is down.
279
+ - **Context manager** ([AI_ARCHITECTURE.md](./AI_ARCHITECTURE.md)) β€” `canonicalFactsSection` is injected as the top-priority "Canonical project facts" section; `resolveBlocks` runs last over the assembled prompt.
280
+ - **Inbox** ([INBOX.md](./INBOX.md)) β€” proposals raise and resolve `validation` review items.
281
+ - **Agents / Knowledge agent** ([AGENTS.md](./AGENTS.md), [KB_AGENT.md](./KB_AGENT.md)) β€” agents propose; Vannevar / the operator merge.
282
+ - **Reports & specs** ([GOALS_SPECS_ISSUES.md](./GOALS_SPECS_ISSUES.md)) β€” report bodies transclude `{{kb:slug}}` at read time.
283
+ - **Knowledge tokens** ([CHAT_COMMANDS.md](./CHAT_COMMANDS.md)) β€” `[[KB-BLOCK …]]` sits alongside `[[REMEMBER …]]` / `[[CONSULT …]]` in the agent token vocabulary.
284
+
285
+ ---
286
+
287
+ ## 12. Security πŸ›‘οΈ
288
+
289
+ - **No direct agent writes.** Agents can only *propose*; the canonical body changes only through `mergeProposal` / `saveBlockAction` (operator or KB agent). This keeps the shared source of truth under human/curator control.
290
+ - **Workspace isolation.** Every query is scoped by `workspaceId`; the PK is `(workspaceId, slug)` and FKs cascade on workspace delete.
291
+ - **Bounded input.** `title`/`body`/`kind`/`updatedBy` are length-capped; slugs are normalized and regex-validated before any write.
292
+ - **Secret hygiene.** Blocks are curated knowledge, but treat bodies like any shared surface β€” do not paste secrets; the platform scrubs secrets on KB ingest, Telegram and logs (`scrubSecrets`, see [SECURITY.md](./SECURITY.md)).
293
+ - **Resilience.** All block functions wrap their DB work in `try/catch` and degrade gracefully (`listBlocks` β†’ `[]`, `resolveBlocks` β†’ original text), so a transient failure never breaks prompt assembly.
294
+
295
+ ---
296
+
297
+ ## 13. Troubleshooting πŸ”§
298
+
299
+ | Symptom | Likely cause | Fix |
300
+ |---|---|---|
301
+ | `[[missing block: <slug>]]` in a report/prompt | the referenced block does not exist (or slug typo) | create the block, or fix the `{{kb:slug}}` marker; slugs are lowercase kebab |
302
+ | Block save silently fails (`{ ok: false }`) | invalid slug (fails `SLUG_RE`) or empty after normalization | use `[a-z0-9-]`, start with alphanumeric, ≀ 60 chars |
303
+ | Agent's proposal never appears | the agent didn't wrap it correctly, or the body was empty | tokens must be exactly `[[KB-BLOCK <slug>]]` … `[[/KB-BLOCK]]` with a non-empty body |
304
+ | Merge button does nothing | the proposal is no longer `pending` (already decided) | refresh; `mergeProposal` ignores non-pending proposals |
305
+ | Edited block doesn't show in agent answers | RAG retrieval cold / embed server down | the block is still injected via `canonicalFactsSection`; check the embed server (see [MODELS.md](./MODELS.md)) |
306
+ | No blocks at all after onboarding | workspace `mission`/`objective`/`stack` were empty (nothing to seed) | click **Create central blocks** to seed the full set with starters |
307
+
308
+ ---
309
+
310
+ ## 14. Related links ✦
311
+
312
+ - [KB_RAG.md](./KB_RAG.md) β€” the knowledge base, ingestion, and `kbQuery`
313
+ - [MEMORY_RAG.md](./MEMORY_RAG.md) β€” embeddings, the memory nebula
314
+ - [KB_AGENT.md](./KB_AGENT.md) β€” Vannevar, the Knowledge agent
315
+ - [AI_ARCHITECTURE.md](./AI_ARCHITECTURE.md) β€” how context is assembled for agents
316
+ - [AGENTS.md](./AGENTS.md) β€” the agent roster and how they run
317
+ - [INBOX.md](./INBOX.md) β€” review items and resolution
318
+ - [GOALS_SPECS_ISSUES.md](./GOALS_SPECS_ISSUES.md) β€” specs, reports, transclusion targets
319
+ - [CHAT_COMMANDS.md](./CHAT_COMMANDS.md) β€” agent token vocabulary
320
+ - [SECURITY.md](./SECURITY.md) β€” isolation, scrubbing, vault