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,321 @@
1
+ [โ† Docs index](./README.md) ยท [๐Ÿ‡ง๐Ÿ‡ท Portuguรชs](../pt/TEST_DEV.md) ยท [โœฆ Constella](../../README.md)
2
+
3
+ # Test Dev ๐Ÿ›ฐ๏ธ โ€” flying the product before it ships
4
+
5
+ ![](../assets/divider-orbit.svg)
6
+
7
+ Test Dev boots the **product the agents are building** (not the Constella ship itself), drives it with a headless browser, and reports back what it saw: console errors, page crashes, failed requests, leaked secrets and a handful of security probes. It is both an **operator console** (the `/test-dev` screen) and an **autonomous gate** that the work loop crosses before a task is marked `done`.
8
+
9
+ > Star map: the product is a small probe in orbit. Test Dev is the telemetry pass โ€” we fly it, watch the instruments, and only clear it for the next leg if nothing critical lights up. A boot that never reaches orbit is `inconclusive`, never a false `fail`.
10
+
11
+ ---
12
+
13
+ ## When to use ๐ŸŒŒ
14
+
15
+ - **Operator, on demand** โ€” open the **Test Dev** module (`/test-dev` route) or type `/test-dev` in the Team Room / a DM to run the validation pass against the running app.
16
+ - **Autonomously, as a gate** โ€” when an agent finishes a *code* task, the work loop boots the project (boot gate) and, if a server is up, runs Test Dev as a second gate before the task can land on `done`.
17
+ - **As part of deploy prep** โ€” `runDeployPipeline` calls `ensureBootable` in its `validateBuild` step, reusing the same dev-server machinery (see [PREPARE_DEPLOY.md](./PREPARE_DEPLOY.md)).
18
+
19
+ Use it whenever you want a *real* signal that the app still starts and renders โ€” not a unit test, an actual browser hitting actual routes.
20
+
21
+ ---
22
+
23
+ ## How it works ๐Ÿช
24
+
25
+ Two server modules cooperate:
26
+
27
+ | Module | File | Responsibility |
28
+ | --- | --- | --- |
29
+ | **Dev server manager** | `src/server/devserver.ts` | Detect a runnable project, install deps once, pick a free port, spawn + supervise the project's own dev server, watch its console. |
30
+ | **Test harness** | `src/server/test-harness.ts` | Drive the running server with headless Chromium (Playwright), collect findings, run security probes, screenshot, compute the verdict, persist the run, capture it to the KB. |
31
+
32
+ The project dev server is a **long-lived child process**, one per workspace, tracked in-memory in a `SERVERS` map (`Map<workspaceId, DevServer>`). It is *not* the Constella web/worker process โ€” it is the app under construction. On Constella boot reconcile, `stopAllProjectServers()` kills every tracked server so a restart leaves none orphaned.
33
+
34
+ ---
35
+
36
+ ## Main flow ๐ŸŒ 
37
+
38
+ ```mermaid
39
+ flowchart TD
40
+ A["runTestDev(workspaceId, orgId, opts)"] --> B["insert test_run (status: running)"]
41
+ B --> C{"serverUrl() live?"}
42
+ C -- "no, opts.noBoot" --> Z1["inconclusive โ€” start the dev server"]
43
+ C -- "no" --> D["startProjectServer()"]
44
+ D --> E{"running + url?"}
45
+ E -- "no" --> Z2["inconclusive โ€” didn't boot"]
46
+ E -- "yes" --> F
47
+ C -- "yes" --> F["derive routes (caller or '/'), max 8"]
48
+ F --> G{"import @playwright/test"}
49
+ G -- "missing" --> Z3["inconclusive โ€” Playwright not available"]
50
+ G -- "ok" --> H["chromium.launch headless"]
51
+ H -- "binary missing" --> H2["ensureChromium() install ยท retry"]
52
+ H2 -- "still fails" --> Z4["inconclusive โ€” couldn't launch chromium"]
53
+ H --> I["new context 1280x800 ยท attach console/pageerror/requestfailed listeners"]
54
+ I --> J["for each route: goto ยท click first button ยท scan HTML for secrets ยท screenshot"]
55
+ J --> K["security probes: /.env /.env.local /.git/config /config.json /admin /api"]
56
+ K --> L{"any high-severity finding?"}
57
+ L -- "yes" --> M["verdict: fail"]
58
+ L -- "no" --> N["verdict: pass"]
59
+ M --> O["update test_run ยท ingestKnowledge(type: test)"]
60
+ N --> O
61
+ ```
62
+
63
+ ### Step list (what `runTestDev` actually does)
64
+
65
+ 1. **Open the run** โ€” insert a `test_run` row with `status: "running"`, `by` = `operator` (default) or `agent`.
66
+ 2. **Ensure a dev server** โ€”
67
+ - If a server URL is already live, use it.
68
+ - If not and `opts.noBoot` is set (the autonomous gate path), return `inconclusive` immediately โ€” the gate never auto-installs/boots a project mid-task.
69
+ - Otherwise call `startProjectServer()`; if it doesn't come up, return `inconclusive`.
70
+ - If the server is started but `serverStatus().status !== "running"` yet, return `inconclusive` ("still starting โ€” try again shortly").
71
+ 3. **Derive routes** โ€” caller-provided `opts.routes`, else `["/"]`, capped at **8** routes.
72
+ 4. **Launch the browser** โ€” dynamic `import("@playwright/test")`. If the import fails โ†’ `inconclusive`. If `chromium.launch()` throws because the browser binary isn't installed โ†’ `ensureChromium()` runs `npx playwright install chromium` (once per process, 300s bound) and retries; still failing โ†’ `inconclusive`.
73
+ 5. **Drive each route** โ€” open a context at **1280ร—800**, attach listeners, then for each route: `page.goto(...)` (`domcontentloaded`, 20s timeout), record a `high` finding on HTTP โ‰ฅ 500, wait 800ms, click the first visible enabled `button` to exercise a flow, scan the served HTML for secrets, screenshot to `.testdev/`.
74
+ 6. **Security probes** โ€” `fetch` each sensitive path (`redirect: "manual"`, 4s timeout); a `200` with content (any path except `/api`) or a secret match is a `high` security finding.
75
+ 7. **Verdict** โ€” any `high`-severity finding โ‡’ `fail`; otherwise `pass`. Warnings / low findings never fail a run.
76
+ 8. **Persist + capture** โ€” update the `test_run` row (`status`, `summary`, `findings`, `finishedAt`) and `ingestKnowledge(type: "test")` so the verdict becomes durable KB.
77
+
78
+ ---
79
+
80
+ ## Key concepts โœฆ
81
+
82
+ ### Stack detection (`detectProject`)
83
+
84
+ `detectProject(orgId)` scans the workspace root **and** common subdirs (`packages`, `apps`, `app`, `web`, `client`, `frontend`, `backend`, `server`, `api`). It runs two passes:
85
+
86
+ - **Pass 1 โ€” Node always wins.** `detectNode(dir)` looks for `package.json` with a `dev`, `start`, or `serve` script (in that priority). Package manager is inferred from the lockfile: `pnpm-lock.yaml` โ†’ `pnpm`, `yarn.lock` โ†’ `yarn`, else `npm`. Install is flagged only when `node_modules` is missing.
87
+ - **Pass 2 โ€” other ecosystems**, in order: Django (`manage.py`), FastAPI (`main.py` containing `FastAPI(`) โ†’ `uvicorn`, plain `main.py` โ†’ `python main.py`, Go (`go.mod`) โ†’ `go run .`, Rust (`Cargo.toml`) โ†’ `cargo run`, static (`server.js`) โ†’ `node server.js`.
88
+
89
+ | `ProjectKind` | Trigger | Label | Install step |
90
+ | --- | --- | --- | --- |
91
+ | `node` | `package.json` + dev/start/serve | `npm/pnpm/yarn <script>` | `<pm> install` if `node_modules` missing |
92
+ | `python` (django) | `manage.py` | `django runserver` | `pip install -r requirements.txt` (once, marker) |
93
+ | `python` (fastapi) | `main.py` with `FastAPI(` | `uvicorn` | same |
94
+ | `python` (script) | `main.py` | `python main.py` | same |
95
+ | `go` | `go.mod` | `go run` | โ€” |
96
+ | `rust` | `Cargo.toml` | `cargo run` | โ€” |
97
+ | `static` | `server.js` | `node server.js` | โ€” |
98
+
99
+ ### Port range ๐Ÿ›ฐ๏ธ
100
+
101
+ `freePort(start = 4173, end = 4999)` walks the range and returns the first port that binds on `127.0.0.1`. The range deliberately **avoids Constella's own `:3000`**. The chosen port is exported to the child as `PORT`, and any literal `$PORT` sentinel in `runArgs` is substituted before spawn. Env passed to the child: `PORT`, `BROWSER=none`, `NODE_ENV=development`.
102
+
103
+ ### Toolchain pre-flight
104
+
105
+ For non-Node, non-static kinds (`python`/`go`/`rust`), `toolAvailable(cmd)` runs `<cmd> --version` (cached 60s) before booting. A missing toolchain fails **fast and clearly** instead of a 30s dead wait. In the boot gate this is treated as "can't validate, don't punish" โ€” see Possible states.
106
+
107
+ ### Ready detection + boot deadlines
108
+
109
+ `push()` watches the child's stdout/stderr; the first line matching `/(ready|listening|localhost:|started server|compiled)/i` flips `status: "starting" โ†’ "running"`. In parallel, `waitReachable(url, deadline)` polls the port. Deadlines scale by kind:
110
+
111
+ | Kind | Boot deadline |
112
+ | --- | --- |
113
+ | `go`, `rust` (compile) | 120 000 ms |
114
+ | `python` | 60 000 ms |
115
+ | `node` / `static` | 30 000 ms |
116
+
117
+ ### Findings โ€” kinds & severities ๐Ÿ•ณ๏ธ
118
+
119
+ A `Finding` is `{ severity, kind, route, message }`.
120
+
121
+ | `kind` | Source | Typical `severity` |
122
+ | --- | --- | --- |
123
+ | `console` | `page.on("console")` โ€” `error` โ†’ high, `warning` โ†’ low | high / low |
124
+ | `pageerror` | `page.on("pageerror")` โ€” uncaught JS exception | high |
125
+ | `request` | `page.on("requestfailed")` (non-`ERR_ABORTED`), HTTP โ‰ฅ 500 on `goto`, or a failed navigation | med / high |
126
+ | `security` | secret regex match in served HTML, or a sensitive probe path returning `200` with content | high |
127
+ | `boot` | dev server / chromium couldn't start | low |
128
+
129
+ The secret detector `SECRET_RE` matches `sk-โ€ฆ` keys, AWS `AKIAโ€ฆ` IDs, PEM private-key headers, and `password: "โ€ฆ"` / `password='โ€ฆ'` literals. It is applied to both served HTML and probe response bodies.
130
+
131
+ ### Security probes
132
+
133
+ `SECURITY_PATHS = ["/.env", "/.env.local", "/.git/config", "/config.json", "/admin", "/api"]`. Each is fetched against the **local project dev server only** โ€” never an external host. A `200` that returns content (every path except `/api`, which is allowed to be a routable 200) is flagged as a high-severity `security` finding, as is any response body matching `SECRET_RE`.
134
+
135
+ ### Verdict logic
136
+
137
+ ```text
138
+ high = findings where severity === "high"
139
+ status = high.length ? "fail" : "pass"
140
+ ```
141
+
142
+ Only **hard (high-severity)** findings block. Warnings and low-severity notes are recorded but do not fail the run. If the app can't boot, Playwright is missing, or chromium won't launch, the verdict is **`inconclusive`** โ€” a deliberate design choice so the harness never produces a false `fail` and never wrongly blocks a task.
143
+
144
+ ---
145
+
146
+ ## The `test_run` table ๐Ÿ—„๏ธ
147
+
148
+ Defined in `src/db/schema.ts` (`sqliteTable("test_run", โ€ฆ)`):
149
+
150
+ | Column | Type | Notes |
151
+ | --- | --- | --- |
152
+ | `id` | text PK | run UUID |
153
+ | `workspaceId` | text โ†’ `workspace.id` | cascade delete; indexed (`test_run_ws_idx`) |
154
+ | `goalId` | text, nullable | optional link to the goal under test |
155
+ | `issueId` | text, nullable | optional link to the issue under test |
156
+ | `status` | enum `running` \| `pass` \| `fail` \| `inconclusive` | default `running` |
157
+ | `summary` | text | default `""`; persisted slice of โ‰ค 600 chars |
158
+ | `findings` | text (JSON) | `Finding[]` serialized; persisted slice of โ‰ค 20 000 chars |
159
+ | `by` | enum `operator` \| `agent` | who triggered the run |
160
+ | `startedAt` | integer timestamp | defaults to now |
161
+ | `finishedAt` | integer timestamp, nullable | set on `finish()` |
162
+
163
+ The `/test-dev` page (`src/app/(app)/test-dev/page.tsx`) lists the **20 most recent** runs for the workspace plus the live `serverStatus(workspace.id)`.
164
+
165
+ ---
166
+
167
+ ## Possible states ๐ŸŒŒ
168
+
169
+ ### Dev server status (`DevServerStatus.status`)
170
+
171
+ | State | Meaning |
172
+ | --- | --- |
173
+ | `none` | no server tracked for this workspace |
174
+ | `starting` | spawned, not yet reachable / no ready line seen |
175
+ | `running` | reachable / printed a ready line |
176
+ | `stopped` | exited cleanly or stopped by operator |
177
+ | `error` | spawn failed, exit โ‰  0, missing toolchain, or no free port |
178
+
179
+ ### Test verdict (`TestVerdict`)
180
+
181
+ | Verdict | When |
182
+ | --- | --- |
183
+ | `pass` | no high-severity findings |
184
+ | `fail` | โ‰ฅ 1 high-severity finding |
185
+ | `inconclusive` | couldn't boot / no runnable project / Playwright or chromium unavailable / server not reachable yet / `noBoot` and nothing running |
186
+
187
+ ---
188
+
189
+ ## Step-by-step ๐Ÿš€
190
+
191
+ ### Run it as the operator
192
+
193
+ 1. Open the **Test Dev** module, or type `/test-dev` in the Team Room or a DM.
194
+ 2. If no dev server is up, start it from the module (this calls `startDevServerAction` โ†’ `startProjectServer`, installing deps the first time).
195
+ 3. Run the validation pass. Edsger posts the result back into the thread:
196
+ `Test Dev โ€” **pass** โ€ฆ Navigated N route(s).`
197
+ 4. Inspect findings + screenshots (saved under `<org-root>/.testdev/<runId>-<route>.png`).
198
+
199
+ ### Run it for a specific issue
200
+
201
+ `runTestDevAction({ issueId })` resolves routes with `routesForIssue(workspaceId, issueId)`, which mines the issue title/key for `/path`-looking substrings (up to 4) and always includes `/`.
202
+
203
+ ---
204
+
205
+ ## Examples ๐Ÿ›ฐ๏ธ
206
+
207
+ **Operator slash command (`/test-dev`)** โ€” handled in `src/server/commands.ts`:
208
+
209
+ ```text
210
+ operator: /test-dev
211
+ edsger: ๐Ÿงช Running the Test Dev validation gateโ€ฆ
212
+ edsger: Test Dev โ€” pass. Passed โ€” 2 note(s), no blocking issues. Navigated 1 route(s).
213
+ ```
214
+
215
+ **Autonomous gate (runner)** โ€” after a code task, in `src/server/runner.ts`:
216
+
217
+ ```ts
218
+ // boot gate โ€” the project MUST still boot
219
+ const boot = await ensureBootable(ws.id, ws.orgId);
220
+ if (!boot.ok) {
221
+ next = "review";
222
+ await pushInbox(ws.id, { kind: "block", refType: "task", refId: t.id, /* โ€ฆ */
223
+ title: `${t.key} broke the dev server`, detail: `${t.title}\n\n${boot.detail}` });
224
+ }
225
+
226
+ // Test Dev gate โ€” only if a server is already up (noBoot: true)
227
+ if (next === "done" && serverUrl(ws.id)) {
228
+ const gate = await runTestDev(ws.id, ws.orgId, { goalId: t.goalId, issueId: t.issueId ?? undefined,
229
+ by: "agent", noBoot: true, routes: /* routesForIssue */ });
230
+ if (gate.status === "fail") {
231
+ next = "review";
232
+ await pushInbox(ws.id, { kind: "validation", refType: "validation", refId: gate.id, /* โ€ฆ */
233
+ title: `${t.key} failed Test Dev`, detail: gate.summary });
234
+ }
235
+ }
236
+ ```
237
+
238
+ ---
239
+
240
+ ## Edsger gating + the two-gate model ๐Ÿช
241
+
242
+ The autonomous work loop applies **two** gates before a code task can be marked `done`:
243
+
244
+ 1. **Boot gate (`ensureBootable`)** โ€” applies when `next === "done"` and the task touched at least one *code* path (`isCodePath`: anything not under `.claude/`, `DOCS/`, `PO/`, `Reports/`, `specs/`, `issues/`, `mock/`, and not a top-level `*.md`). If the project no longer boots, the task is sent back to `review`, an Inbox `block` is filed (`"<key> broke the dev server"`), and the operator is notified. A *missing toolchain* returns `ok: true` (skip, "cannot validate"), never a false block.
245
+ 2. **Test Dev gate (`runTestDev`, `noBoot: true`)** โ€” applies when `next === "done"` **and a dev server is already live** (`serverUrl(ws.id)`). Because of `noBoot`, this gate never installs/boots a project mid-task โ€” it only validates what's already up. A `fail` verdict sends the task back to `review` with an Inbox `validation` item (`"<key> failed Test Dev"`).
246
+
247
+ **Edsger** is the QA/test agent (handle `edsger`, reports to `linus`). When Test Dev runs as the autonomous gate (`by: "agent"`), the KB capture is attributed to `edsger`; when run from `/test-dev`, Edsger is the persona that posts the verdict into the conversation. Both gates are designed to **degrade to `inconclusive`/skip** rather than wrongly hold a task.
248
+
249
+ ```mermaid
250
+ flowchart LR
251
+ T["task finished by agent"] --> C1{"touched code path?"}
252
+ C1 -- "no (docs/PO)" --> DONE["done"]
253
+ C1 -- "yes" --> BG["boot gate: ensureBootable"]
254
+ BG -- "ok:false" --> REV1["review + Inbox block"]
255
+ BG -- "ok:true" --> C2{"dev server live?"}
256
+ C2 -- "no" --> RG["review gate (reviewer)"]
257
+ C2 -- "yes" --> TD["runTestDev noBoot:true"]
258
+ TD -- "fail" --> REV2["review + Inbox validation"]
259
+ TD -- "pass / inconclusive" --> RG
260
+ RG --> DONE
261
+ ```
262
+
263
+ ---
264
+
265
+ ## Screenshots & artifacts ๐ŸŒ 
266
+
267
+ - Screenshots are written to `<org-root>/.testdev/<runId>-<route>.png` (route slugged to `[a-z0-9_]`, `root` for `/`). The directory is created best-effort with `mkdirSync(..., { recursive: true })`.
268
+ - The KB capture (`ingestKnowledge`) writes a `test`-type entry titled `Test Dev โ€” <status>` with the summary, linked to the goal/issue, attributed to `edsger` (agent runs) or `operator`.
269
+ - The `.testdev/` directory is a Constella control artifact โ€” it is stripped from the clean source tree by deploy prep (`buildCleanTree`) and is not part of the shipped product.
270
+
271
+ ---
272
+
273
+ ## Related integrations ๐Ÿ›ฐ๏ธ
274
+
275
+ - **Work loop / runner** โ€” `src/server/runner.ts` wires both gates (see [WORKFLOW.md](./WORKFLOW.md), [AGENTS.md](./AGENTS.md)).
276
+ - **Inbox** โ€” failed gates file `block` / `validation` items (see [INBOX.md](./INBOX.md)).
277
+ - **KB / RAG** โ€” every verdict is ingested as durable `test` knowledge (see [KB_RAG.md](./KB_RAG.md), [KB_AGENT.md](./KB_AGENT.md)).
278
+ - **Prepare Deploy** โ€” reuses `ensureBootable` + `detectProject` in its `validateBuild` step (see [PREPARE_DEPLOY.md](./PREPARE_DEPLOY.md)).
279
+ - **Chat commands** โ€” `/test-dev` and `/review` (see [CHAT_COMMANDS.md](./CHAT_COMMANDS.md)).
280
+ - **Project stacks** โ€” stack detection mirrors the runnable-starter ecosystems (see [PROJECT_STACKS.md](./PROJECT_STACKS.md)).
281
+
282
+ ---
283
+
284
+ ## Security ๐Ÿ•ณ๏ธ
285
+
286
+ - **Probes are local-only.** Security probes and the iframe-frameability check (`previewFrameableAction`) only ever target `127.0.0.1` / `localhost`. The harness never points a browser or `fetch` at an external host.
287
+ - **Secret scanning** runs on served HTML and on probe response bodies via `SECRET_RE`; a hit is a high-severity `security` finding (and, if surfaced in the product output, something the agents must fix before deploy).
288
+ - **Sensitive-path probing** confirms `/.env`, `/.git/config`, `/admin`, etc. are not served unauthenticated by the app under test.
289
+ - **No false fail.** Inability to boot or to install Chromium yields `inconclusive`, never `fail` โ€” the gate cannot be turned into a denial-of-progress by a flaky toolchain.
290
+ - The project dev server runs with `NODE_ENV=development`, `BROWSER=none`, inside the org workspace; on Constella restart, `stopAllProjectServers()` reaps it.
291
+
292
+ See [SECURITY.md](./SECURITY.md) for the overall trust model.
293
+
294
+ ---
295
+
296
+ ## Troubleshooting ๐ŸŒŒ
297
+
298
+ | Symptom | Cause | Fix |
299
+ | --- | --- | --- |
300
+ | `inconclusive โ€” No runnable project` | no `package.json` dev/start/serve script and no Python/Go/Rust/`server.js` entry | add a `dev`/`start` script or a recognized entry point under the workspace |
301
+ | `inconclusive โ€” Playwright not available` | `@playwright/test` not installed | install Playwright in the install dir |
302
+ | `Couldn't install/launch chromium` | browser binary missing, install timed out (300s) | run `npx playwright install chromium` in the install dir, then retry |
303
+ | `inconclusive โ€” Dev server is still starting` | port not reachable yet within the deadline | wait and re-run; for go/rust first compile this can take up to 120s |
304
+ | `error โ€” Toolchain not found: '<cmd>'` | python/go/cargo not on `PATH` | install the toolchain, or pick a Node stack (the boot gate skips it as "cannot validate") |
305
+ | `error โ€” No free port available` | nothing free in `4173โ€“4999` | free a port in the range or stop stale dev servers |
306
+ | Boot gate held the task (`"<key> broke the dev server"`) | the change left the project unbootable | fix the build/import error; the task is parked at `review` with the boot log in the Inbox |
307
+ | Preview iframe shows a browser error | app sends `X-Frame-Options` / restrictive CSP `frame-ancestors` | expected โ€” `previewFrameableAction` detects it; open the app in a new tab |
308
+
309
+ ---
310
+
311
+ ## Related links โœฆ
312
+
313
+ - [WORKFLOW.md](./WORKFLOW.md) โ€” the full work lifecycle and where the gates sit
314
+ - [AGENTS.md](./AGENTS.md) โ€” Edsger (QA) and the roster
315
+ - [PREPARE_DEPLOY.md](./PREPARE_DEPLOY.md) โ€” reuse of `ensureBootable` in deploy prep
316
+ - [DEPLOY.md](./DEPLOY.md) โ€” launching the product
317
+ - [INBOX.md](./INBOX.md) โ€” where failed gates land
318
+ - [KB_RAG.md](./KB_RAG.md) ยท [KB_AGENT.md](./KB_AGENT.md) โ€” durable test knowledge
319
+ - [CHAT_COMMANDS.md](./CHAT_COMMANDS.md) โ€” `/test-dev`, `/review`
320
+ - [PROJECT_STACKS.md](./PROJECT_STACKS.md) โ€” stacks the dev server can boot
321
+ - [SECURITY.md](./SECURITY.md) ยท [TROUBLESHOOTING.md](./TROUBLESHOOTING.md)
@@ -0,0 +1,294 @@
1
+ [โ† Docs index](./README.md) ยท [๐Ÿ‡ง๐Ÿ‡ท Portuguรชs](../pt/TROUBLESHOOTING.md) ยท [โœฆ Constella](../../README.md)
2
+
3
+ # Troubleshooting ๐Ÿ›ฐ๏ธ โ€” when the constellation drifts off course
4
+
5
+ ![](../assets/divider-orbit.svg)
6
+
7
+ Real, code-grounded fixes for the things that actually break: a busy port, a sleeping embed server, a missing browser, an unauthenticated CLI, a stalled worker. Every symptom below is traced to a concrete line of behaviour in the codebase โ€” no folklore.
8
+
9
+ > The central ship runs two engines (web + worker) and a fleet of satellite services (embed server, llama.cpp, Telegram poll, the project dev server). When one drops out of orbit, Constella is designed to **degrade, not crash**. This page tells you which star went dark and how to relight it.
10
+
11
+ ---
12
+
13
+ ## 1. When to use ๐ŸŒŒ
14
+
15
+ Reach for this page when:
16
+
17
+ - A run mode won't boot (`npx constella --auth`, `--vps`, `--portable`).
18
+ - Something *works but quietly degrades* โ€” RAG goes keyword-only, Test Dev returns `INCONCLUSIVE`, agents fall back to a default model.
19
+ - The 24/7 loop seems frozen: no agent moves, no Telegram reply, no cron tick.
20
+ - An install/first-run problem: build fails, `claude`/`codex` not found, drive too small.
21
+
22
+ For deeper background on any subsystem, follow the [Related links](#15-related-links--sibling-docs) at the bottom โ€” this page is the triage desk, not the full manual.
23
+
24
+ ---
25
+
26
+ ## 2. How it works โ€” the fail-soft design ๐Ÿช
27
+
28
+ Constella's diagnostics rest on three principles baked into the source:
29
+
30
+ | Principle | Where it lives | What it means for you |
31
+ |---|---|---|
32
+ | **Fail closed on secrets/auth** | `src/app/api/cron/tick/route.ts`, `bin/worker.mjs` | Missing `CONSTELLA_WORKER_SECRET` โ†’ the tick endpoint returns **401**, the worker won't even talk to a non-loopback host. A security gap never silently opens. |
33
+ | **Fail soft on capability** | `src/server/rag.ts`, `src/server/test-harness.ts`, `src/server/adapters/cli.ts` | No embed server โ†’ keyword retrieval. No Playwright โ†’ `inconclusive`. Bad model id โ†’ CLI default. A missing *capability* degrades; it doesn't error the whole flow. |
34
+ | **Honest status** | `src/server/local-models.ts`, `src/server/devserver.ts` | Server "up?" probes return the real reason (`"llama-server not installed"`, `"no embedding model installed"`). The UI shows what the code actually found โ€” never a fabricated "ready". |
35
+
36
+ So most troubleshooting is **reading the honest reason** the code already surfaced, then fixing the named cause.
37
+
38
+ ---
39
+
40
+ ## 3. Main flow โ€” boot order and where it can break ๐ŸŒ 
41
+
42
+ ```mermaid
43
+ flowchart TD
44
+ A["npx constella --<mode>"] --> B{"secrets in <HOME>/.env?"}
45
+ B -- "no" --> B2["generate BETTER_AUTH_SECRET,<br/>CONSTELLA_VAULT_KEY,<br/>CONSTELLA_WORKER_SECRET (chmod 600)"]
46
+ B -- "yes" --> C["drizzle-kit migrate"]
47
+ B2 --> C
48
+ C -- "fails on FRESH db" --> CX["โœ– abort: app needs its tables"]
49
+ C -- "ok / no-op" --> D{".next/BUILD_ID exists?"}
50
+ D -- "no, public mode" --> DX["build; if it fails โ†’ โœ– refuse dev server"]
51
+ D -- "yes" --> E["supervise web (next start) + worker"]
52
+ E --> F["worker: waitForServer โ†’ tick โ†’ watcher โ†’ telegram poll"]
53
+ F --> G{"embed server :8083 up?"}
54
+ G -- "yes" --> H["RAG = semantic"]
55
+ G -- "no" --> I["RAG = keyword fallback"]
56
+ ```
57
+
58
+ Each diamond is a place a real symptom appears. The table in [ยง7](#7-symptom--cause--fix--the-master-table-) maps every one of them to a fix.
59
+
60
+ ---
61
+
62
+ ## 4. Key concepts ๐Ÿ•ณ๏ธ
63
+
64
+ - **Runtime root** โ€” everything lives under `<HOME>` (default `~/.constella`, override with `CONSTELLA_HOME` or `--path`). The DB is `<HOME>/constella.db`; secrets are `<HOME>/.env`. When something can't find data, this is the first path to confirm.
65
+ - **Dual process** โ€” the web server (`next start`) and the worker (`bin/worker.mjs`) are separate. A frozen UI and a stalled 24/7 loop are *different* problems with *different* logs.
66
+ - **Loopback-only worker** โ€” the worker attaches the privileged `x-worker-secret` to every call and **refuses** any non-loopback `CONSTELLA_BASE_URL` unless you set `CONSTELLA_ALLOW_REMOTE_WORKER_BASE_URL=1`.
67
+ - **Capability probes** โ€” `embedServerUp()`, `llamaServerStatus()`, `cliVersion()`, `detectCliAuth()`, `toolAvailable()` are all real, bounded probes. They never throw; they return a status you can act on.
68
+
69
+ ---
70
+
71
+ ## 5. Diagnostic command kit ๐Ÿš€
72
+
73
+ | Goal | Command | Reads |
74
+ |---|---|---|
75
+ | Version + update availability | `npx constella update --check` | npm registry (`registry.npmjs.org/constella/latest`) |
76
+ | Is the Claude CLI authed? | `claude --version` then sign in to Claude Code | `cliVersion("claude")` / `detectCliAuth` |
77
+ | Is the Codex CLI authed? | `codex --version`, then `codex login` | same |
78
+ | Embed server alive? | `curl http://127.0.0.1:8083/health` | `embedServerUp()` |
79
+ | Chat llama server alive? | `curl http://127.0.0.1:8082/v1/models` | `llamaServerStatus()` |
80
+ | Worker reachable target | check `CONSTELLA_BASE_URL` (must be loopback) | `bin/worker.mjs` SSRF guard |
81
+ | Manually re-run the schema | `npm run db:migrate` | `drizzle-kit migrate` |
82
+ | Free space on the runtime drive | launcher prints it in portable mode | `freeBytes()` / `checkUsbFreeSpace()` |
83
+
84
+ > The launcher never prints secrets โ€” it logs `โ€ข Secrets ready (stored in <HOME>/.env, never printed).` Don't go looking for them in the console.
85
+
86
+ ---
87
+
88
+ ## 6. Step-by-step triage ๐ŸŒŒ
89
+
90
+ 1. **Read the launch banner.** `bin/constella.mjs` prints the runtime root, the mode + bind, and the next-start line. A wrong `<HOME>` here explains most "my data vanished" reports.
91
+ 2. **Separate web from worker.** Is the *UI* broken, or is the *loop* not advancing? They have independent supervisors (max 5 restarts / 60 s each) and independent stdout.
92
+ 3. **Check the honest probe.** Open the relevant page (Models, Test Dev) โ€” the code already surfaced the real reason. Match it to the table below.
93
+ 4. **Fix the named cause**, then let the self-heal kick in (the embed server auto-starts, RAG auto-reindexes once embeddings appear, chromium auto-installs once).
94
+ 5. **If a child crash-loops**, the supervisor gives up after 5 restarts in 60 s and prints a hint (e.g. "Likely OS-level OOM โ€ฆ raise `CONSTELLA_WEB_HEAP_MB`").
95
+
96
+ ---
97
+
98
+ ## 7. Symptom ยท Cause ยท Fix โ€” the master table ๐Ÿ›ฐ๏ธ
99
+
100
+ ### 7.1 Boot & install
101
+
102
+ | Symptom | Cause | Fix |
103
+ |---|---|---|
104
+ | `EADDRINUSE` / "port 3000 in use" on launch | Another process holds the chosen port (web on 3000, or a stale Constella) | Pass `--port <n>` (or `PORT=<n>`), or stop the other process. The launcher reads `--port` โ†’ `PORT` โ†’ `3000`. |
105
+ | `โœ– drizzle-kit not found in the install` | Incomplete install (dep tree trimmed) | Reinstall the package. `drizzle-kit migrate` is mandatory โ€” the launcher aborts without it. |
106
+ | `โœ– Database schema migration failed on a fresh database โ€” aborting` | Migrations couldn't apply to a brand-new `<HOME>/constella.db` | Inspect the drizzle error above it. A fresh DB with no tables would 500 on every request, so boot fails closed by design. On an *existing* DB a failed re-run is tolerated (logged `โ€ข schema migrate skipped/failed โ€ฆ continuing`). |
107
+ | `โœ– No production build and the build failed โ€ฆ Refusing to start a dev server in a public/network mode` | Running a source tree with no `.next/BUILD_ID`, build failed, public mode (`CONSTELLA_PUBLIC=1`) | Install a prebuilt package, or run `npm run build`. A CLI launch never silently downgrades to the unhardened `next dev`. Devs may opt in with `CONSTELLA_DEV=1` (source tree only). |
108
+ | Build-on-first-run is slow then succeeds | Source tree without a build โ†’ one-time `next build` | Expected once. The published npm package ships a prebuilt `.next`, so end users never hit this. |
109
+ | `โœ– next not found in the install` | Trimmed/broken `node_modules` | Reinstall the package. |
110
+
111
+ ### 7.2 Agent execution (claude / codex CLIs)
112
+
113
+ | Symptom | Cause | Fix |
114
+ |---|---|---|
115
+ | Agent runs error instantly, result text is a spawn error | `claude` (or `codex`) **not installed / not on PATH** | Install the CLI; verify with `claude --version`. `runProc` spawns the bare binary in the workspace cwd. |
116
+ | Agent runs but result is empty / "needs login" | CLI installed but **not authenticated** | Sign in to Claude Code; for Codex run `codex login`. `detectCliAuth` checks `~/.claude/.credentials.json`, `~/.codex/auth.json`. `LOGIN_HINTS` shows the per-CLI action in the UI. |
117
+ | Run ends with `error: "timed out"` | The CLI exceeded the **180 s** default timeout | Heavy tasks: increase the timeout for that adapter, or split the work. The runner SIGKILLs at the cap and records `timed out` honestly. |
118
+ | Agent ignores its configured model | Model id failed `safeModel` validation (injection guard) | Use a plausible CLI model id (`opus`/`sonnet`/`haiku`, `gpt-5-codex`, or `provider/model`). An invalid value is dropped and the CLI uses its own default. |
119
+ | Agents "talk weird" (clipped, article-dropped) | Operator's personal `~/.claude` hooks/plugins leaked into the headless run | Already mitigated: agents run with a `--settings {disableAllHooks:true}` overlay. If you enabled the lock/guard hooks, isolation uses a clean config dir instead. |
120
+ | Agent can't install deps / run tests | Run mode is **jailed** (`vps`/`auth`/`portable` โ†’ `acceptEdits`, codex `workspace-write`) | Expected hardening. Override with `CONSTELLA_AGENT_FULL_ACCESS=1` (or `=0` to re-jail `start` mode). |
121
+ | Web research not happening | `CONSTELLA_WEB_RESEARCH=0` or per-workspace `settings.agents.webResearch=false` | Web tools are ON by default (`--allowedTools WebSearch WebFetch`). Re-enable it. |
122
+
123
+ ### 7.3 RAG / KB memory nebula ๐ŸŒŒ
124
+
125
+ | Symptom | Cause | Fix |
126
+ |---|---|---|
127
+ | Retrieval feels shallow / keyword-only | **Embed server :8083 down** โ†’ semantic search unavailable | `embed()` tries Ollama (`OLLAMA_URL`), then llama.cpp (`CONSTELLA_EMBED_URL` :8083). With neither, `retrieve()` falls back to a keyword heuristic (`mode: "heuristic"`). Download `nomic-embed-text`; the embed server auto-starts on boot and after the model lands. |
128
+ | Chunks exist but have no vectors | Index was built while the embed server was down | No action needed โ€” once embeddings become available, `retrieve()` auto-reindexes **once per process** (`autoReindexed` guard) so chunks get vectors. Force it from Models โ†’ Reindex. |
129
+ | `retrieve` returns `mode: "none"` | No chunks at all (empty index) | First call lazily runs `indexRag`. If still empty, there's nothing in the indexed dirs (`.claude`, `DOCS`, `PO`, `Reports`, `specs`, `issues`, `mock`). |
130
+ | Internal prompts/skills leak into answers | โ€” | Can't happen: `.claude/kb/` and `.claude/skills/` are excluded from RAG by `inRagDirs`. |
131
+ | Ollama path errors | Ollama not running | Start it (`ollama serve`) and pull `nomic-embed-text`, or just rely on the dedicated llama.cpp embed server. |
132
+
133
+ ### 7.4 Test Dev (the project's dev server + Playwright) ๐Ÿš€
134
+
135
+ | Symptom | Cause | Fix |
136
+ |---|---|---|
137
+ | Verdict is `INCONCLUSIVE`, message "Playwright not available" | `@playwright/test` not importable | `npx playwright install chromium` in the install dir, then retry. |
138
+ | `INCONCLUSIVE`, "Couldn't install/launch chromium" | The browser binary is missing (npm installs the lib, not the browser) | Test Dev auto-runs `npx playwright install chromium` once per process; if that fails, run it manually. |
139
+ | `INCONCLUSIVE`, "No runnable project / dev server didn't boot" | No `package.json` dev/start script, or no Python/Go/Rust project under the workspace | Add a runnable entry (`detectProject` scans root + `apps`/`web`/`server`/โ€ฆ subdirs). |
140
+ | `INCONCLUSIVE`, "Toolchain not found: 'python'/'go'/'cargo'" | The non-Node starter's toolchain isn't installed | Install the toolchain, or pick a Node stack. `toolAvailable()` pre-flights it to fail fast instead of a 30 s dead wait. |
141
+ | `INCONCLUSIVE`, "Dev server is still starting" | Server booted but the port isn't reachable yet | Retry shortly. Go/Rust first boots get 120 s, Python 60 s, Node 30 s. |
142
+ | `INCONCLUSIVE` not `FAIL` when the app is broken | By design โ€” Test Dev never returns a **false fail** | Only high-severity findings flip the verdict to `FAIL`. A boot/tooling problem is `inconclusive`. |
143
+
144
+ ### 7.5 Worker / 24/7 loop ๐Ÿ›ฐ๏ธ
145
+
146
+ | Symptom | Cause | Fix |
147
+ |---|---|---|
148
+ | Nothing advances autonomously; no tick logs | Worker can't reach the web server | The worker probes `CONSTELLA_BASE_URL` for ~90 s before the first tick. Confirm the web server is up and the base URL is the loopback `http://127.0.0.1:<port>`. |
149
+ | Worker prints `โœ– Refusing to send the worker secret to a non-loopback host` and exits | `CONSTELLA_BASE_URL` points at a non-loopback host | The SSRF guard is intentional. For a genuine remote worker, set `CONSTELLA_ALLOW_REMOTE_WORKER_BASE_URL=1` (prefer `https://`). |
150
+ | Cron tick returns **401 unauthorized** | `CONSTELLA_WORKER_SECRET` missing or mismatched | The endpoint fails closed. The launcher persists the secret in `<HOME>/.env`; make sure both web and worker inherit the same env. |
151
+ | Tick runs but no agent moves | The autonomous loop only runs workspaces with **Run 24/7 ON** | `tickAll({ execute: true, auto: true })` skips workspaces where the operator hasn't enabled the 24/7 loop. Turn it on (or approve the plan first). |
152
+ | Watcher never indexes file edits | The file isn't in an INDEXED path | The worker only syncs `.claude/skills/*.md`, `.claude/agents/<h>/{Agent,skills}.md`, `DOCS/*.md`, `PO/*.md`, `Reports/*.md`. Other files are ignored by design. |
153
+ | Worker keeps restarting | A child crashed; supervisor auto-restarts (max 5 / 60 s) | After 5 crashes in 60 s it gives up and prints a hint. Check the child's stderr; for OOM, raise `CONSTELLA_WEB_HEAP_MB` or cap concurrent agents. |
154
+
155
+ ### 7.6 Telegram ๐ŸŒ 
156
+
157
+ | Symptom | Cause | Fix |
158
+ |---|---|---|
159
+ | Bot doesn't respond | Integration off, or no vaulted token | The poll skips workspaces where the `telegram` integration is off or `getTelegramConfig` returns nothing. Enable the integration and set the bot token. |
160
+ | Telegram poll returns **401** | `CONSTELLA_WORKER_SECRET` missing/mismatched | Same fail-closed gate as cron tick; the worker backs off 30 s and retries. Fix the shared secret. |
161
+ | Bot ignores your messages | You're not on the allowlist | Only the registered private chat may talk: both `chat.id` and `from.id` must equal the configured `chatId`. Anything else is silently dropped. |
162
+ | `/` command menu missing | `setMyCommands` not yet run for that bot | It auto-registers once per process on the next poll (`commandsRegistered` guard). Wait one cycle. |
163
+ | Slow / one-message-per-poll feel | Long-poll: `getUpdates` waits ~25 s server-side | Expected. The worker adds a 1 s gap between long-polls. |
164
+
165
+ ### 7.7 Network modes & secrets ๐Ÿ•ณ๏ธ
166
+
167
+ | Symptom | Cause | Fix |
168
+ |---|---|---|
169
+ | better-auth throws on a default secret in `auth`/`vps`/`portable` | No real `BETTER_AUTH_SECRET` | The launcher generates + persists one in `<HOME>/.env` (`chmod 600`) for **every** mode. If you cleared `.env`, just relaunch โ€” it regenerates. |
170
+ | Vault can't decrypt provider keys / Telegram token | `CONSTELLA_VAULT_KEY` changed or missing | The vault is AES-256-GCM keyed by `CONSTELLA_VAULT_KEY`. **Changing it orphans existing ciphertext.** Restore the original key from `<HOME>/.env`, or re-enter the secrets. |
171
+ | VPS unreachable over the tailnet | Bound `0.0.0.0` but Tailscale/Docker not wired | VPS mode binds `0.0.0.0` for the tailnet and runs in Docker. Verify the container + Tailscale; the worker still talks to the server on loopback inside the container. |
172
+
173
+ ### 7.8 Portable & disk space ๐Ÿช
174
+
175
+ | Symptom | Cause | Fix |
176
+ |---|---|---|
177
+ | `โœ– Portable mode: no removable USB drive detected` | No USB drive mounted | Insert a pen-drive, or pass `--path <drive>` explicitly. |
178
+ | `โœ– Portable needs at least 32 GB free` and exits | Drive below the hard minimum (`PORTABLE_MIN_GB = 32`) | Use a bigger drive. This is a fatal gate. |
179
+ | `โ€ข <n> GB free on the drive โ€” good` | At or above the 32 GB minimum (`PORTABLE_RECOMMENDED_GB = 32`) | Boots normally โ€” more headroom only helps if you carry local models. |
180
+ | GGUF download refused: "not enough free space" | Drive can't hold `sizeBytes * 1.1` | Free space or pick a smaller quant. The check runs before the download starts. |
181
+ | Downloaded model fails to load | Truncated/corrupt download | `verifyDownloadedFileSize` (2% tolerance) and the optional SHA-256 catch this; the file is deleted. Re-download. |
182
+
183
+ ### 7.9 Database & migrations ๐ŸŒŒ
184
+
185
+ | Symptom | Cause | Fix |
186
+ |---|---|---|
187
+ | App 500s on every request after a manual schema change | Tables missing/inconsistent | Re-apply with `npm run db:migrate` (idempotent). The launcher does this automatically on boot. |
188
+ | Lost the operator password after a "reset" | You ran `db:reset` / `db:nuke` (wipes `.constella` + `organizations`) | Avoid the nuke scripts on a real install โ€” they destroy data. Prefer surgical scripts (`db:reset-state`, `db:repair-fs`). For a demo only, `db:reset-demo`. |
189
+ | `db:push` rewrote things unexpectedly | `drizzle-kit push` is the unsafe dev path | Use `db:migrate` (generated, versioned SQL), not `db:push`, on anything you care about. |
190
+
191
+ ---
192
+
193
+ ## 8. Self-heal map โ€” what fixes itself ๐ŸŒ 
194
+
195
+ ```mermaid
196
+ flowchart LR
197
+ A["embed model downloaded"] --> B["ensureEmbedServer() auto-starts :8083"]
198
+ B --> C["retrieve() auto-reindexes once โ†’ vectors"]
199
+ D["chromium missing"] --> E["ensureChromium() installs once per process"]
200
+ F["CUDA build, no runtime DLLs"] --> G["ensureCudaRuntime() fetches cudart"]
201
+ H["web/worker child dies"] --> I["supervisor restarts (โ‰ค5 / 60s)"]
202
+ J["file edited in INDEXED path"] --> K["watcher โ†’ /api/sync/file โ†’ RAG reindex"]
203
+ ```
204
+
205
+ If a symptom is on the left, **wait one cycle** before intervening โ€” the system likely recovers on its own.
206
+
207
+ ---
208
+
209
+ ## 9. Possible states ๐Ÿ›ฐ๏ธ
210
+
211
+ | Subsystem | Healthy | Degraded | Down |
212
+ |---|---|---|---|
213
+ | RAG | `mode: "semantic"` | `mode: "heuristic"` (keyword) | `mode: "none"` (no chunks) |
214
+ | Test Dev | `PASS` | `INCONCLUSIVE` | `FAIL` (only high-severity findings) |
215
+ | Embed server | `embedServerUp() โ†’ true` | โ€” | reason: "not installed" / "didn't come up" |
216
+ | llama chat server | `llamaServerStatus().up` | โ€” | reason: "no chat GGUF" / "not installed" |
217
+ | Worker | ticks logged every ~60 s | retrying (server warming) | exited after 5 crash-loops |
218
+ | CLI auth | `detectCliAuth โ†’ "ready"` | `"unknown"` | `"needs_login"` / `"needs_key"` |
219
+ | Agent run | `ok: true` | partial (provider-routed CLI, 0 cost reported) | `error` set (timeout / no JSON / exit code) |
220
+
221
+ ---
222
+
223
+ ## 10. Examples ๐Ÿš€
224
+
225
+ **A. RAG quietly went keyword-only.** You notice answers are less precise. Check `curl http://127.0.0.1:8083/health` โ†’ no response. Open **Models**, confirm `nomic-embed-text` is installed, click **Start embeddings** (or just reboot โ€” `ensureEmbedServer` runs on boot). Next query returns `mode: "semantic"`.
226
+
227
+ **B. Test Dev keeps saying INCONCLUSIVE.** The first run reports "Couldn't install/launch chromium." Run `npx playwright install chromium` in the install dir, retry. Now navigation + console capture run and you get `PASS`/`FAIL`.
228
+
229
+ **C. Agents do nothing overnight.** Tick logs are present but no work card moves. The goal's plan exists but **Run 24/7 is off** โ€” `tickAll(auto:true)` skips it. Approve the plan and enable Run 24/7.
230
+
231
+ **D. Worker exits immediately on a VPS.** Log: `โœ– Refusing to send the worker secret to a non-loopback host`. Your `CONSTELLA_BASE_URL` points at a public hostname. Set it to the in-container loopback, or `CONSTELLA_ALLOW_REMOTE_WORKER_BASE_URL=1` over `https://` if remote is truly intended.
232
+
233
+ ---
234
+
235
+ ## 11. Related integrations ๐Ÿช
236
+
237
+ - **Models / local engine** โ€” embed (:8083) and chat (:8082) llama.cpp servers, Ollama fallback. See [MODELS](./MODELS.md).
238
+ - **Test Dev** โ€” project dev server boot + Playwright. See [TEST_DEV](./TEST_DEV.md).
239
+ - **Telegram** โ€” remote control + poll. See [TELEGRAM](./TELEGRAM.md).
240
+ - **GitHub** โ€” token/auth, commit/push, secret-scan gate. See [GITHUB](./GITHUB.md).
241
+ - **Public API / MCP** โ€” PAT auth, rate limits. See [PUBLIC_API](./PUBLIC_API.md) and [MCP](./MCP.md).
242
+
243
+ ---
244
+
245
+ ## 12. Security notes ๐Ÿ•ณ๏ธ
246
+
247
+ - Several "errors" are **security gates, not bugs**: the 401 on the cron/Telegram endpoints, the worker's loopback-only refusal, the build-mode refusal to drop to `next dev`, and the portable space gate. Don't bypass them blindly.
248
+ - Secrets never appear in logs โ€” the launcher prints `โ€ข Secrets ready` and nothing else; `scrubSecrets` strips them before KB ingest, Telegram and logs. If you see a secret in output, treat it as an incident.
249
+ - `<HOME>/.env` is written `chmod 600`. If permissions widened, re-tighten them.
250
+ - The destructive-command guard (`bin/guard-hook.mjs`, default on) and file-lock hook are defense-in-depth around agent shell. See [SECURITY](./SECURITY.md).
251
+
252
+ ---
253
+
254
+ ## 13. When to escalate ๐ŸŒ 
255
+
256
+ If a fix above doesn't apply, gather:
257
+
258
+ 1. The **launch banner** (runtime root, mode, bind, port).
259
+ 2. The **honest probe reason** from the relevant page (Models / Test Dev).
260
+ 3. Whether it's a **web** or **worker** problem (separate stdout).
261
+ 4. `npx constella update --check` output (version + latest).
262
+
263
+ Then check [FAQ](./FAQ.md) and the [TROUBLESHOOTING] entries here, and consult [INSTALLATION](./INSTALLATION.md) / [CONFIGURATION](./CONFIGURATION.md) for environment specifics.
264
+
265
+ ---
266
+
267
+ ## 14. Quick reference โ€” env knobs ๐Ÿ›ฐ๏ธ
268
+
269
+ | Var | Effect | Default |
270
+ |---|---|---|
271
+ | `CONSTELLA_HOME` / `--path` | Runtime root | `~/.constella` |
272
+ | `PORT` / `--port` | Web port | `3000` |
273
+ | `--host` | Bind address | `127.0.0.1` (start/auth), `0.0.0.0` (vps/portable) |
274
+ | `CONSTELLA_WORKER_SECRET` | Cron/Telegram auth | generated in `<HOME>/.env` |
275
+ | `CONSTELLA_BASE_URL` | Worker โ†’ server target (loopback) | `http://127.0.0.1:<port>` |
276
+ | `CONSTELLA_ALLOW_REMOTE_WORKER_BASE_URL` | Allow non-loopback worker target | unset (off) |
277
+ | `CONSTELLA_EMBED_URL` | Embed server | `http://127.0.0.1:8083` |
278
+ | `OLLAMA_URL` | Ollama embed fallback | `http://127.0.0.1:11434` |
279
+ | `LLAMACPP_URL` | Chat server | `http://127.0.0.1:8082` |
280
+ | `CONSTELLA_AGENT_FULL_ACCESS` | Agent shell access | `1` in `start`, else `0` |
281
+ | `CONSTELLA_WEB_RESEARCH` | Agent WebSearch/WebFetch | on |
282
+ | `CONSTELLA_WEB_HEAP_MB` | Web Node heap cap | Node default |
283
+ | `CONSTELLA_DEV` | Allow `next dev` fallback (source) | unset |
284
+
285
+ ---
286
+
287
+ ## 15. Related links โ€” sibling docs ๐ŸŒŒ
288
+
289
+ - [INSTALLATION](./INSTALLATION.md) ยท [CONFIGURATION](./CONFIGURATION.md) ยท [FAQ](./FAQ.md)
290
+ - [START_MODE](./START_MODE.md) ยท [AUTH_MODE](./AUTH_MODE.md) ยท [VPS_MODE](./VPS_MODE.md) ยท [PORTABLE_MODE](./PORTABLE_MODE.md)
291
+ - [ARCHITECTURE](./ARCHITECTURE.md) ยท [AI_ARCHITECTURE](./AI_ARCHITECTURE.md) ยท [AGENTS](./AGENTS.md)
292
+ - [MODELS](./MODELS.md) ยท [KB_RAG](./KB_RAG.md) ยท [MEMORY_RAG](./MEMORY_RAG.md)
293
+ - [TEST_DEV](./TEST_DEV.md) ยท [TELEGRAM](./TELEGRAM.md) ยท [GITHUB](./GITHUB.md)
294
+ - [UPDATE](./UPDATE.md) ยท [SECURITY](./SECURITY.md) ยท [DEPLOY](./DEPLOY.md) ยท [PREPARE_DEPLOY](./PREPARE_DEPLOY.md)