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,289 @@
1
+ [← Docs index](./README.md) · [🇧🇷 Português](../pt/MEMORY_RAG.md) · [✦ Constella](../../README.md)
2
+
3
+ # Memory RAG — the workspace memory nebula 🌌
4
+
5
+ ![](../assets/divider-orbit.svg)
6
+
7
+ Pure, org-scoped retrieval over the workspace Markdown **and** the chat transcripts. This is the gravity that pulls relevant context into a constellation's working memory just before it acts — semantic when a local embedding star is lit, keyword heuristic when it is not.
8
+
9
+ ---
10
+
11
+ ## When to use
12
+
13
+ - You want to understand how an agent "remembers" prior conversations and documents before a turn.
14
+ - You are debugging why retrieval returned nothing, or returned stale text.
15
+ - You are wiring `[[REMEMBER …]]` / `[[CONSULT: …]]` / `[[KB: …]]` agent tokens.
16
+ - You need to know which directories are indexed, the debounce timings, and how the file-watcher keeps memory current.
17
+
18
+ For the **curated, state-aware** layer (typed entries, obsolescence, the knowledge graph) see [KB_RAG](./KB_RAG.md) and [KB_AGENT](./KB_AGENT.md). For where retrieval is injected into a prompt, see [AI_ARCHITECTURE](./AI_ARCHITECTURE.md).
19
+
20
+ ---
21
+
22
+ ## How it works 🪐
23
+
24
+ Memory RAG lives in `src/server/rag.ts`. It is **pure retrieval**: it embeds and stores chunks, then ranks them by cosine similarity for a query. There is no state model, no obsolescence flag, no answer-writing — that is the job of the curated KB (`src/server/kb.ts`).
25
+
26
+ Two corpora are indexed into one table, `rag_chunk`:
27
+
28
+ 1. **Workspace Markdown** — files under the indexed directories (`.claude`, `DOCS`, `PO`, `Reports`, `specs`, `issues`, plus `mock/`), keyed by their real relative `path`.
29
+ 2. **Chat transcripts** — team-room, DM and Telegram conversations, stored under synthetic paths `chat/<channel>`.
30
+
31
+ Each row holds the `chunk` text and, when an embedding backend is reachable, its `vector` (a JSON-encoded float array). If no backend is up, the chunk is stored **without** a vector and retrieval falls back to a keyword heuristic — nothing is lost, and a lazy reindex upgrades the chunks once embeddings come online.
32
+
33
+ ### Embedding backends
34
+
35
+ `embed(text, kind)` tries two backends in order, then gives up:
36
+
37
+ | Order | Backend | URL (env) | Notes |
38
+ |-------|---------|-----------|-------|
39
+ | 1 | Ollama | `OLLAMA_URL` (default `http://127.0.0.1:11434`) `/api/embeddings`, model `CONSTELLA_EMBED_MODEL` (default `nomic-embed-text`) | Used only if running with the embed model pulled |
40
+ | 2 | Dedicated llama.cpp embed server | `CONSTELLA_EMBED_URL` (default `http://127.0.0.1:8083`) `/v1/embeddings`, model `nomic-embed` | Auto-started on boot via `ensureEmbedServer()` in `src/server/local-models.ts` |
41
+ | — | none | — | Returns `null` → caller uses keyword fallback |
42
+
43
+ Both calls have an 8 s timeout (`AbortSignal.timeout(8000)`).
44
+
45
+ > **Asymmetric prefixes.** `nomic-embed-text` was trained with task-instruction prefixes and **requires** them: documents are embedded as `search_document: …`, queries as `search_query: …`. `embed()` applies the right prefix via the `kind` argument (`"document"` | `"query"`). Mixing them silently degrades retrieval, so both the index side and the query side must use the same model with the matching prefix. The prefix is applied unconditionally on the llama.cpp path (always nomic) and only when `CONSTELLA_EMBED_MODEL` matches `/nomic/i` on the Ollama path.
46
+
47
+ ### Chunking
48
+
49
+ `chunksOf(md)` splits a document on H1–H3 Markdown headers (`\n(?=#{1,3}\s)`), trims, drops empties, then:
50
+
51
+ - keeps each part as one chunk if `≤ 1200` chars,
52
+ - otherwise hard-slices it into 1200-char windows,
53
+ - and caps the document at **40 chunks** (`.slice(0, 40)`).
54
+
55
+ ### Ranking
56
+
57
+ `cosine(a, b)` is a plain dot-product cosine over the shorter of the two vectors. `retrieve()` ranks all vectorized chunks by cosine to the query vector, takes the top `k` (default 5), and if no vectors exist falls back to keyword scoring (count of query terms longer than 3 chars that appear in the chunk). If even keyword scoring finds nothing, it returns the first up-to-3 chunks so the agent always gets *something*.
58
+
59
+ ---
60
+
61
+ ## Main flow — memory retrieval before a turn 🛰️
62
+
63
+ Before an agent acts, `assembleAgentPrompt()` (in `src/server/context-manager.ts`) pulls memory in parallel with the channel context. It calls the **state-aware** `kbQuery()` (which shares the same `rag_chunk` table and the same `embed`/`cosine` helpers as pure `retrieve()`), plus reads the static `.claude/memory.md` file. The retrieved knowledge is injected as a labelled, trimmable prompt section.
64
+
65
+ ```mermaid
66
+ flowchart TD
67
+ A["Agent turn begins<br/>(task / chat reply)"] --> B["assembleAgentPrompt()"]
68
+ B --> C["Build query<br/>(task title+desc OR role+instruction, ≤400 chars)"]
69
+ C --> D{"embed(query, 'query')"}
70
+ D -->|Ollama :11434| E["vector"]
71
+ D -->|llama.cpp :8083| E
72
+ D -->|no backend| F["keyword heuristic"]
73
+ E --> G["cosine rank over rag_chunk<br/>(files + chat/<channel>)"]
74
+ F --> G
75
+ G --> H["top-k chunks + source paths"]
76
+ H --> I["Inject as 'Knowledge' section<br/>+ '.claude/memory.md' as 'Relevant memory'"]
77
+ I --> J["Prompt fitted to model window<br/>(low-priority sections dropped first)"]
78
+ J --> K["Agent runs with memory in context"]
79
+ ```
80
+
81
+ Pure `retrieve()` returns `{ context, sources, mode }` where `mode` is `"semantic" | "heuristic" | "none"`; the `kbQuery()` variant adds state-awareness and `refs`. Both clip `context` to 4000 chars.
82
+
83
+ ---
84
+
85
+ ## Memory RAG vs curated KB 🕳️
86
+
87
+ Memory RAG and the curated KB share storage and embeddings but answer different questions. Memory is *what was written and said*; the KB is *what is true now*.
88
+
89
+ | Aspect | Memory RAG (`rag.ts`) | Curated KB (`kb.ts`) |
90
+ |--------|-----------------------|----------------------|
91
+ | Function | `retrieve()` | `kbQuery()` / `kbAnswer()` |
92
+ | Corpus | Workspace `.md` + `chat/<channel>` transcripts | Same `rag_chunk` table, but linked to typed `kb_entry` rows |
93
+ | State awareness | None — returns whatever ranks highest | Drops `obsolete=1` chunks (superseded / obsolete entries, cancelled / archived goals) |
94
+ | References | `sources` (file paths) only | `sources` + internal `refs` (spec / issue / goal / file jump-backs) |
95
+ | "Insufficient" signal | No | `sufficient` boolean |
96
+ | Logging | No | Logs each consult to `kb_query_log` |
97
+ | Owner | The watcher + the Knowledge agent (Vannevar) | The Knowledge agent (curation, dedupe, obsolescence) |
98
+
99
+ Both fall back to the same keyword heuristic and share `embed`, `chunksOf`, `cosine`, `indexRag`, `indexChat`. See [KB_RAG](./KB_RAG.md) for the curated layer.
100
+
101
+ ---
102
+
103
+ ## Agent memory tokens — REMEMBER / CONSULT / KB
104
+
105
+ Agents drive memory directly from their replies via square-bracket tokens. The runner and the chat reply path parse these out, act on them, and strip the tokens from the visible text (`src/server/kb.ts`).
106
+
107
+ | Token | Direction | What it does |
108
+ |-------|-----------|--------------|
109
+ | `[[REMEMBER type=<t>: <fact>]]` | producer | `extractRemembered()` turns each into a typed KB item to ingest. Type must be in `KB_LEARN_TYPES` (decision, architecture, business-rule, integration, dependency, bug, fix, test, review, vuln, ui-pattern, stack, env-config, command, note) else it falls back to `note`. Facts shorter than 8 chars are ignored. |
110
+ | `[[CONSULT: <question>]]` | consumer | `answerConsults()` runs each question through `kbQuery()` (k=6) and posts the answer back into the thread so it is in context on the agent's next turn. Questions under 4 chars are skipped. |
111
+ | `[[KB: reindex \| index-chat \| health]]` | maintenance | `runKbTools()`: `reindex` → `indexRag()` (rebuild file + chat chunks), `index-chat` → `indexChat()` (re-embed only the conversations), `health` → embed-server status (`up`/`down` + model). |
112
+
113
+ `[[REMEMBER]]` (producer) and `[[CONSULT]]` (consumer) are the write/read complement: an agent stores a learning, and a later agent retrieves it. The runner also auto-extracts `[[REMEMBER]]` from task results with `sourceKind: "task"`, and chat replies extract with `sourceKind: "chat"` (`src/server/runner.ts`, `src/server/collab.ts`).
114
+
115
+ ---
116
+
117
+ ## Indexed directories & paths 🌠
118
+
119
+ `inRagDirs(p)` decides what is memory-eligible:
120
+
121
+ | Path pattern | Indexed? | Notes |
122
+ |--------------|----------|-------|
123
+ | `.claude/kb/…` | No | The KB agent's own prompt/taxonomy — never surfaced |
124
+ | `.claude/skills/…` | No | The skill library — never surfaced |
125
+ | `.claude/*.md` and `.claude/<sub>/…` | Yes | Other `.claude` Markdown (e.g. `BRIEF.md`, `memory.md`) |
126
+ | `DOCS/`, `PO/`, `Reports/`, `specs/`, `issues/` (`*.md`) | Yes | The `RAG_DIRS` set |
127
+ | `mock/…` | Yes | Only text files: `.md .html .css .js(x) .ts(x) .txt .json` |
128
+ | `chat/<channel>` | Yes (synthetic) | Written by `indexChat()`, not a real file |
129
+ | everything else | No | — |
130
+
131
+ Chat transcripts are grouped per `channel` (`room`, `dm:<handle>`, `telegram`), each line rendered `Operator:` or `@<handle>:`, and only the **tail of 400 lines** per channel is embedded to keep the index bounded.
132
+
133
+ ---
134
+
135
+ ## Reindex & debounce — keeping memory current
136
+
137
+ Memory stays fresh automatically; the operator rarely needs the manual **Reindex** action. Three debounced paths feed `rag_chunk`:
138
+
139
+ | Trigger | Function | Debounce | Scope |
140
+ |---------|----------|----------|-------|
141
+ | A workspace file changes (agent or external edit) | `scheduleRagReindex(orgId, rel)` → `indexRagFile()` | **2500 ms** per `(org, file)` | Re-embeds just that one path's chunks |
142
+ | A message is posted to any channel | `scheduleChatReindex(orgId)` → `indexChat()` | **6000 ms** per org | Re-embeds only the `chat/%` chunks |
143
+ | The file-watcher in the worker | POST `/api/sync/file` | **400 ms** per `(org, file)` | Calls `indexFile()`, which itself calls `scheduleRagReindex` |
144
+ | Manual / agent | `indexRag()` (full), `[[KB: reindex]]`, `[[KB: index-chat]]` | none | Full or chat-only rebuild |
145
+
146
+ Note the two-stage debounce on file edits: the worker's chokidar watcher coalesces filesystem events over **400 ms** and POSTs to `/api/sync/file`; the server-side `indexFile()` then schedules a further **2500 ms** RAG re-embed. So a burst of edits to one file results in a single re-embed, not a storm.
147
+
148
+ ```mermaid
149
+ sequenceDiagram
150
+ participant FS as Workspace disk
151
+ participant W as Worker (chokidar)
152
+ participant API as /api/sync/file
153
+ participant SYNC as indexFile()
154
+ participant RAG as scheduleRagReindex → indexRagFile()
155
+ FS->>W: file add/change/unlink
156
+ W->>W: debounce 400ms per (org,file)
157
+ W->>API: POST {orgId, rel, event} (x-worker-secret)
158
+ API->>SYNC: indexFile() / deindexFile()
159
+ SYNC->>RAG: scheduleRagReindex(orgId, rel)
160
+ RAG->>RAG: debounce 2500ms per (org,file)
161
+ RAG->>RAG: re-embed just this path's chunks
162
+ ```
163
+
164
+ When a file is deleted, `deindexFile()` calls `deindexRagFile()` to drop that path's chunks — **disk is the source of truth**, so removed files leave no memory residue. See [SYNCED_BLOCKS](./SYNCED_BLOCKS.md) and [ARCHITECTURE](./ARCHITECTURE.md) for the broader sync engine.
165
+
166
+ ---
167
+
168
+ ## Tables
169
+
170
+ ### `rag_chunk` (the memory store)
171
+
172
+ | Column | Meaning |
173
+ |--------|---------|
174
+ | `id` | UUID |
175
+ | `workspace_id` | org/workspace scope — **every query is filtered to the active workspace** |
176
+ | `path` | real relative file path **or** `chat/<channel>` |
177
+ | `chunk` | the chunk text (≤ ~1200 chars) |
178
+ | `vector` | JSON-encoded float array, or `NULL` if no embedding backend was up |
179
+ | `kb_entry_id` | (KB layer) link to the typed `kb_entry` that produced the chunk, if any |
180
+ | `obsolete` | (KB layer) `1` hides the chunk from state-aware `kbQuery()` |
181
+
182
+ `kb_entry_id` and `obsolete` are added by `ensureKbTables()` for the curated layer; pure `retrieve()` ignores them. Other tables (`kb_entry`, `kb_query_log`, …) belong to [KB_RAG](./KB_RAG.md).
183
+
184
+ ---
185
+
186
+ ## Step-by-step — trace a retrieval
187
+
188
+ 1. An agent turn begins (a task in `runner.ts`, or a chat reply in `collab.ts`).
189
+ 2. `assembleAgentPrompt()` builds a query (task title + description, or role + instruction) clipped to 400 chars.
190
+ 3. In parallel: channel context is summarized, and `kbQuery(orgId, query, { k: 6 })` retrieves memory.
191
+ 4. `kbQuery` selects active chunks for the workspace; on an empty index it builds one once via `indexRag()`, then re-queries.
192
+ 5. `embed(query, "query")` produces a query vector (Ollama → llama.cpp → null).
193
+ 6. With a vector and vectorized chunks present, rows are cosine-ranked; otherwise keyword scoring runs.
194
+ 7. Top-`k` chunks become the `Knowledge` section; `.claude/memory.md` becomes `Relevant memory`.
195
+ 8. The prompt is fitted to the model's context window; low-priority sections drop first if over budget.
196
+ 9. The agent runs. If it emits `[[REMEMBER …]]`, that learning is ingested and becomes retrievable next time.
197
+
198
+ ---
199
+
200
+ ## Examples
201
+
202
+ Agent self-capturing a learning (producer):
203
+
204
+ ```
205
+ [[REMEMBER type=decision: Auth uses better-auth sessions (30d); do not roll a custom JWT.]]
206
+ ```
207
+
208
+ Agent consulting memory before acting (consumer):
209
+
210
+ ```
211
+ [[CONSULT: how is the file-upload size limit configured?]]
212
+ ```
213
+
214
+ Agent refreshing the index mid-run (maintenance):
215
+
216
+ ```
217
+ [[KB: index-chat]]
218
+ [[KB: health]]
219
+ ```
220
+
221
+ A bare `retrieve()` call (semantic when the embed server is up):
222
+
223
+ ```ts
224
+ const { context, sources, mode } = await retrieve(orgId, "how do agents commit to git?", 5);
225
+ // mode === "semantic" | "heuristic" | "none"
226
+ ```
227
+
228
+ ---
229
+
230
+ ## Possible states
231
+
232
+ `retrieve()` and `kbQuery()` report a retrieval `mode`:
233
+
234
+ | `mode` | Meaning |
235
+ |--------|---------|
236
+ | `semantic` | An embedding backend was reachable and vectorized chunks existed → cosine ranking |
237
+ | `heuristic` | No vectors (backend down at index time) → keyword term-overlap ranking |
238
+ | `none` | No workspace, or no chunks at all even after a build attempt |
239
+
240
+ Embed-server health (via `[[KB: health]]` → `llamaServerStatus()`): `up` (with model name) or `down`.
241
+
242
+ A self-healing detail: when the embed server comes up **after** an index was built without vectors, the first semantic query rebuilds the index **once per process** (`autoReindexed` guard) so chunks gain vectors — no manual reindex needed.
243
+
244
+ ---
245
+
246
+ ## Related integrations
247
+
248
+ - **[KB_RAG](./KB_RAG.md)** — the curated, state-aware layer over the same `rag_chunk` store.
249
+ - **[KB_AGENT](./KB_AGENT.md)** — Vannevar, owner of curation, dedupe and obsolescence.
250
+ - **[AI_ARCHITECTURE](./AI_ARCHITECTURE.md)** — how retrieved memory is fitted into the prompt window.
251
+ - **[MODELS](./MODELS.md)** — local embedding & chat servers (llama.cpp `:8083` / `:8082`, Ollama).
252
+ - **[SYNCED_BLOCKS](./SYNCED_BLOCKS.md)** / **[ARCHITECTURE](./ARCHITECTURE.md)** — the file-watcher and sync engine.
253
+ - **[TEAM_ROOM](./TEAM_ROOM.md)** / **[DM](./DM.md)** / **[TELEGRAM](./TELEGRAM.md)** — the conversations that feed `chat/<channel>` chunks.
254
+
255
+ ---
256
+
257
+ ## Security 🔐
258
+
259
+ - **Strict org isolation.** Every read and every query filters by `workspace_id`; only the active org's chunks are ever embedded or returned. There is no cross-tenant retrieval path.
260
+ - **Internals never surfaced.** `inRagDirs()` excludes `.claude/kb/` (KB agent prompt/taxonomy) and `.claude/skills/` so a query cannot leak the system's own internals.
261
+ - **Sync endpoint fails closed.** `/api/sync/file` requires `x-worker-secret` (`CONSTELLA_WORKER_SECRET`) and rejects with 401 if the secret is unset — it accepts an arbitrary `orgId`, so leaving it open would allow cross-tenant index tampering.
262
+ - **Secrets are scrubbed upstream.** Chat text is scrubbed before it is persisted/ingested (see [SECURITY](./SECURITY.md)); transcripts embedded into `chat/<channel>` inherit that scrubbing.
263
+
264
+ ---
265
+
266
+ ## Troubleshooting
267
+
268
+ | Symptom | Likely cause | Fix |
269
+ |---------|--------------|-----|
270
+ | `mode` is always `heuristic` | No embedding backend reachable at index/query time | Check `[[KB: health]]`; ensure the llama.cpp embed server is up on `:8083` (or Ollama on `:11434` with `nomic-embed-text` pulled) — see [MODELS](./MODELS.md) |
271
+ | Retrieval returns nothing | Empty index or no workspace | A first query auto-builds via `indexRag()`; if still empty, run a full reindex (`[[KB: reindex]]` or the Reindex action) |
272
+ | Stale text keeps coming back | Curated KB obsolescence, not memory | Pure `retrieve()` has no state model; use `kbQuery()`/curation — see [KB_RAG](./KB_RAG.md) |
273
+ | Edits not reflected | Watcher not running, or debounce window | The worker must be running (it owns chokidar); changes re-embed after the **2500 ms** RAG debounce |
274
+ | Deleted file still retrieved | Deindex didn't fire | Deletion goes through `deindexFile → deindexRagFile`; confirm the worker saw the `unlink` event |
275
+ | Chat not recalled | Chat reindex pending or empty channel | `scheduleChatReindex` debounces **6000 ms**; force with `[[KB: index-chat]]` |
276
+
277
+ ---
278
+
279
+ ## Related links
280
+
281
+ - [KB_RAG](./KB_RAG.md)
282
+ - [KB_AGENT](./KB_AGENT.md)
283
+ - [AI_ARCHITECTURE](./AI_ARCHITECTURE.md)
284
+ - [ARCHITECTURE](./ARCHITECTURE.md)
285
+ - [SYNCED_BLOCKS](./SYNCED_BLOCKS.md)
286
+ - [MODELS](./MODELS.md)
287
+ - [AGENTS](./AGENTS.md)
288
+ - [TEAM_ROOM](./TEAM_ROOM.md)
289
+ - [TROUBLESHOOTING](./TROUBLESHOOTING.md)
@@ -0,0 +1,341 @@
1
+ [← Docs index](./README.md) · [🇧🇷 Português](../pt/MODELS.md) · [✦ Constella](../../README.md)
2
+
3
+ # Models ✦ The Engine Constellation 🌌
4
+
5
+ ![](../assets/divider-orbit.svg)
6
+
7
+ > Every working star in a Constella company is powered by a model. This page documents the three families of engines — **cloud** providers, **CLI brains**, and **local** GGUF runtimes — how their catalogues are discovered live (never hardcoded), how Constella fits a local model to your hardware, and the two dedicated llama.cpp servers (chat on `:8082`, embeddings on `:8083`) that keep the workspace's gravity (RAG) and on-prem inference running.
8
+
9
+ The golden rule across the whole module: **model lists are never the source of truth in code.** They come live from [models.dev](https://models.dev/api.json) ∩ each provider's own `/v1/models` endpoint. The hardcoded lists are demoted to *offline fallback only*.
10
+
11
+ ---
12
+
13
+ ## 1. When to use 🪐
14
+
15
+ | You want to… | Entry point |
16
+ |---|---|
17
+ | See/connect cloud providers (Anthropic, OpenAI, Google…) | `connectProvider()`, `syncProvider()` — `src/server/providers.ts` |
18
+ | Refresh the live, enriched model list for a provider | `refreshProviderModels()` → `liveModels()` + `enrichModels()` |
19
+ | Pick a recommended default model for a provider | `defaultModelFor()` — `src/server/model-catalog.ts` |
20
+ | Probe the machine's CPU/RAM/GPU/VRAM | `detectHardware()` — `src/server/local-models.ts` |
21
+ | Download a local GGUF for llama.cpp | `downloadGguf()` from `GGUF_CATALOG` |
22
+ | Pull / serve a model via Ollama | `pullModel()`, `ollamaServe()`, `loadModel()` |
23
+ | Start the local chat server (`:8082`) | `startLlamaServer()` / `ensureLlamaServer()` |
24
+ | Start the RAG embedding server (`:8083`) | `startEmbeddings()` / `ensureEmbedServer()` |
25
+ | Know which CLI binary an agent runs on | `pickBinary()` — `src/server/adapters/cli.ts` |
26
+
27
+ The visible surface is the **Models** page (`/models`); most actions are server actions that revalidate that path.
28
+
29
+ ---
30
+
31
+ ## 2. How it works 🛰️
32
+
33
+ Constella treats "a model" as something you select for an **agent** (a working star). The model's *origin* is one of three kinds, recorded on the `provider.kind` column:
34
+
35
+ | `kind` | Meaning | Auth | Example catalog ids |
36
+ |---|---|---|---|
37
+ | `cloud` | A hosted HTTP API | `api_key` / `oauth` | `anthropic`, `openai`, `google_gemini`, `xai_grok`, `openrouter` |
38
+ | `cli` | A locally-installed agent CLI that Constella drives as a subprocess | `cli` / `oauth` | `claude_code`, `codex_cli`, `openclaw`, `hermes_cli`, `aider`, `opencode`, `copilot_cli`, `cursor_cli`, `cline_cli`, `kilo_code` |
39
+ | `local` | A model served on the loopback (GGUF/Ollama) | `local` | `llamacpp`, `ollama` |
40
+
41
+ The full menu of connectable providers is the typed **`PROVIDER_CATALOG`** (`src/data/providers-catalog.ts`) — 60+ entries spanning cloud APIs, routers, OpenAI-compatible endpoints, cloud platforms, local runtimes and CLIs. Each entry carries a `defaultAdapter`, `baseUrl`, capability flags and a `status` (`available` / `experimental` / `requires_setup` / `planned`).
42
+
43
+ ### The three data sources for cloud model metadata
44
+
45
+ 1. **models.dev** — the backbone. `src/server/model-catalog.ts` fetches `https://models.dev/api.json`, normalizes every provider's `models` map into `CatalogModel[]` (id, name, context, output limit, input/output cost per 1M tokens, capabilities, release date), caches it in memory + on disk at `<constellaHome>/cache/models-dev.json` with a **~24h TTL**.
46
+ 2. **The provider's own `/v1/models`** — `liveModels()` queries the live endpoint (or `/api/tags` for Ollama) for the *actually-available* ids. Routers like OpenRouter return rich rows (pricing + context) kept verbatim; first-party providers usually return id-only rows.
47
+ 3. **`FALLBACK_MODELS`** (`src/data/models-dev.ts`) — a small, current snapshot used **only** when both the network and the disk cache are cold.
48
+
49
+ `enrichModels()` intersects (2) with (1): live ids get filled in from the provider's models.dev set, then a cross-provider global index (so `anthropic/claude-…` router ids resolve too). The result is written wholesale into the `provider_model` table.
50
+
51
+ ---
52
+
53
+ ## 3. Main flow 🌠
54
+
55
+ ```mermaid
56
+ flowchart TD
57
+ A["Operator connects a provider"] --> B["connectProvider(catalogId, apiKey?)"]
58
+ B --> C["API key → vault (AES-256-GCM)"]
59
+ B --> D["syncProvider(id)"]
60
+ D --> E["syncAdapter → live model count + status"]
61
+ D --> F["refreshProviderModels(id)"]
62
+ F --> G["liveModels(): provider /v1/models or /api/tags"]
63
+ F --> H["modelsForCatalog(): models.dev cache (24h)"]
64
+ G --> I["enrichModels(): live ∩ models.dev + global index"]
65
+ H --> I
66
+ I --> J["defaultModelFor(): preference, else newest"]
67
+ I --> K["replace provider_model rows"]
68
+ J --> K
69
+ K --> L["Models UI reads CachedModel[]"]
70
+ ```
71
+
72
+ On boot (`src/server/boot.ts`), Constella warms the catalogue and brings the local engines up:
73
+
74
+ - `warmModelsDev()` — preloads the models.dev cache.
75
+ - `ensureEmbedServer()` — starts the RAG embedding server on `:8083` if a local embedding model is installed.
76
+ - `ensureLlamaServer()` — starts the local chat server on `:8082` if a chat GGUF is installed.
77
+
78
+ ---
79
+
80
+ ## 4. Key concepts 🕳️
81
+
82
+ ### `CatalogModel` — the normalized unit
83
+
84
+ Both models.dev and `/v1/models` are flattened into one shape (`src/data/models-dev.ts`):
85
+
86
+ ```ts
87
+ type CatalogModel = {
88
+ id: string; // "claude-opus-4-8", "gpt-5.2", "grok-4"
89
+ name: string; // "Claude Opus 4.8"
90
+ context: number; // max context tokens (0 = unknown)
91
+ outputLimit: number; // max output tokens
92
+ inputCost: number; // USD / 1M input tokens (0 = unknown / free)
93
+ outputCost: number; // USD / 1M output tokens
94
+ caps: { reasoning: boolean; tools: boolean; vision: boolean };
95
+ released: string; // ISO date — drives the "newest" default pick
96
+ };
97
+ ```
98
+
99
+ ### Catalog → models.dev key mapping
100
+
101
+ `CATALOG_TO_MODELSDEV` maps Constella's `catalogId` to the canonical models.dev provider key (e.g. `google_gemini → google`, `xai_grok → xai`, `dashscope → alibaba`). Anything unmapped falls back to a normalized guess via `modelsDevKeyForCatalog()`. Notably, the CLI brains `claude_code → anthropic` and `gemini_cli → google` map to a first-party family so versions/context can still be enriched.
102
+
103
+ ### Recommended default
104
+
105
+ `defaultModelFor()` consults `DEFAULT_PREFERENCE` (a substring preference order per key, e.g. `anthropic: ["sonnet-4", "sonnet", "opus-4", "opus"]`). The first available match wins, ties broken by newest release; with no preference hit it picks the newest dated model.
106
+
107
+ ### Cost & usage are real
108
+
109
+ Cost is **never fabricated**. Cloud cost metadata comes from models.dev/`/v1/models` (`inputCost`/`outputCost` are USD per **1M** tokens). For the Claude/Codex CLIs, real per-run cost is parsed straight from the CLI's JSON output (`total_cost_usd`, `usage`) in `src/server/adapters/cli.ts`. CLIs that emit no token/cost in headless mode record `usd: 0` honestly.
110
+
111
+ ---
112
+
113
+ ## 5. Cloud providers ✦
114
+
115
+ The `PROVIDER_CATALOG` is the single typed source of truth. A representative slice:
116
+
117
+ | Catalog id | Display name | Category | Adapter | Base URL |
118
+ |---|---|---|---|---|
119
+ | `anthropic` | Anthropic | `cloud_api` | `http_anthropic` | `https://api.anthropic.com` |
120
+ | `openai` | OpenAI | `cloud_api` | `http_openai` | `https://api.openai.com/v1` |
121
+ | `google_gemini` | Google AI / Gemini | `cloud_api` | `http_google` | `https://generativelanguage.googleapis.com` |
122
+ | `xai_grok` | xAI / Grok | `cloud_api` | `http_xai` | `https://api.x.ai/v1` |
123
+ | `deepseek` | DeepSeek | `cloud_api` | `http_deepseek` | `https://api.deepseek.com` |
124
+ | `groq` | Groq | `cloud_api` | `http_groq` | `https://api.groq.com/openai/v1` |
125
+ | `mistral`¹ | Mistral | `cloud_api` | — | — |
126
+ | `openrouter` | OpenRouter (router) | `router` | `http_openrouter` | `https://openrouter.ai/api/v1` |
127
+ | `openai_compatible` | OpenAI-compatible endpoint | `openai_compatible` | `http_openai_compat` | (your URL) |
128
+ | `azure_openai` | Azure OpenAI | `cloud_platform` | `http_azure_openai` | (setup) |
129
+ | `aws_bedrock` | AWS Bedrock | `cloud_platform` | `sdk_bedrock` | (SigV4) |
130
+ | `vertex_ai` | Google Vertex AI | `cloud_platform` | `sdk_vertex` | (GCP) |
131
+
132
+ > ¹ `mistral` appears in the `CATALOG_TO_MODELSDEV` / `DEFAULT_PREFERENCE` maps but is not a standalone row in the current `PROVIDER_CATALOG`; reach Mistral via OpenRouter or an OpenAI-compatible endpoint.
133
+
134
+ **Authentication.** API keys go to the **vault** (AES-256-GCM, table `vault`, ref like `openai_api_key`) — *never* onto the `provider` row. Anthropic's `/v1/models` is queried with `x-api-key` + `anthropic-version`; everything else is OpenAI-compatible `Bearer` auth.
135
+
136
+ **Routers & OpenAI-compatible endpoints** (OpenRouter, LiteLLM, LM Studio server, vLLM, Ollama's OpenAI surface) expose a live `/v1/models` list and are enriched the same way; OpenRouter additionally returns per-token pricing which Constella converts to per-1M.
137
+
138
+ ---
139
+
140
+ ## 6. CLI brains 🚀
141
+
142
+ CLI providers are **locally-installed agent CLIs** that Constella drives as subprocesses inside the org workspace (`src/server/adapters/cli.ts`). They authenticate via their *own* login/keys — Constella never holds their credentials.
143
+
144
+ | Adapter | Binary | Models (`CLI_MODELS`) | Cost reported? |
145
+ |---|---|---|---|
146
+ | `cli_claude_code` | `claude` | `opus`, `sonnet`, `haiku` | ✅ `total_cost_usd` + usage |
147
+ | `cli_codex` | `codex` | `gpt-5-codex`, `o4-mini` | best-effort from JSONL |
148
+ | `cli_openclaw` | `openclaw` | `(default)`, `openai/gpt-5.4`, `anthropic/claude-sonnet-4` | ❌ (0) |
149
+ | `cli_hermes` | `hermes` | `(default)`, `anthropic/claude-sonnet-4.6`, `openai/gpt-5.5` | ❌ (0) |
150
+ | `cli_aider` | `aider` | `(default)` + provider-prefixed (live via `aider --list-models`) | ❌ (0) |
151
+ | `cli_opencode` | `opencode` | `(default)` + provider-prefixed (live via `opencode models`) | ❌ (0) |
152
+ | `cli_copilot` | `copilot` | `(default)`, `claude-sonnet-4.5`, `gpt-5` | ❌ (0) |
153
+ | `cli_cursor` | `cursor-agent` | `(default)`, `claude-4.5-sonnet`, `gpt-5` | ❌ (0) |
154
+ | `cli_cline` | `cline` | `(default)` | ❌ (0) |
155
+ | `cli_kilo` | `kilocode` | `(default)` | ❌ (0) |
156
+
157
+ - `pickBinary(adapter, model)` resolves which executable runs; `strongestModelFor(adapter)` returns the best tier (e.g. `opus` for Claude) for review/security/validation steps.
158
+ - Only `cli_opencode` and `cli_aider` expose a real live list command via `cliModels()`; the rest fall back to their static `CLI_MODELS` options.
159
+ - The `claude` runs are **vanilla** (a `--settings` overlay with `disableAllHooks:true`) so the operator's personal `~/.claude` hooks/plugins don't leak into agent voices. Web research adds `--allowedTools WebSearch WebFetch` (default ON; `CONSTELLA_WEB_RESEARCH=0` off).
160
+ - Run-mode permissions: `start` → `bypassPermissions` (full); `vps`/`auth`/`portable` → `acceptEdits` (jailed). Override with `CONSTELLA_AGENT_FULL_ACCESS=1|0`. Default per-run timeout: **180s**.
161
+ - `detectCliAuth()` returns `ready` / `needs_login` / `needs_key` / `unknown` per binary; `LOGIN_HINTS` shows how to authenticate each.
162
+
163
+ ---
164
+
165
+ ## 7. Local models — GGUF catalog + Ollama 🌌
166
+
167
+ Local inference has two backends:
168
+
169
+ ### llama.cpp + GGUF (`GGUF_CATALOG`)
170
+
171
+ `src/data/model-catalog.ts` **generates** the GGUF catalog from a compact family spec (`GGUF_FAMILIES`) using lmstudio-community's reliable repo naming:
172
+
173
+ ```
174
+ https://huggingface.co/lmstudio-community/<Repo>-GGUF/resolve/main/<Repo>-<QUANT>.gguf
175
+ ```
176
+
177
+ - Families span **Qwen 2.5/3/3.5/3.6, Llama 3.x, Gemma 2/3/4, Mistral/Ministral/Devstral, Phi, DeepSeek-R1 distills, Yi, Granite, SmolLM2, Falcon3, EXAONE** and more, tagged `chat` / `code` / `reasoning` / `embed`.
178
+ - Quants are capped per size so every file stays single-part: ≤9B → `Q3_K_L, Q4_K_M, Q6_K, Q8_0`; ≤34B → drops `Q8_0`; ≥35B → only `Q3_K_L, Q4_K_M`.
179
+ - `sizeBytes` is estimated from `params × QUANT_MULT[quant]` (bytes-per-weight: `Q3_K_L 0.55`, `Q4_K_M 0.67`, `Q6_K 0.90`, `Q8_0 1.13`) — good enough for the GPU fit check.
180
+ - The embedding model `nomic-embed-text-v1.5 (Q8_0)` is kept first and special-cased everywhere — it powers semantic RAG.
181
+
182
+ `downloadGguf(id)` checks free disk (refuses if the drive can't hold ~1.1× the model), streams the file into `<constellaHome>/models/` with live byte progress, verifies size (and SHA-256 when known), then registers it once **per machine** in the `local_model` table (dedup by file path, shared across workspaces). `removeGguf(id)` deletes the file + rows.
183
+
184
+ ### Ollama (`OLLAMA_CATALOG`)
185
+
186
+ A curated short list pulled via the Ollama daemon: `nomic-embed-text`, `mxbai-embed-large` (embed), `llama3.2:3b`, `qwen2.5:7b`, `qwen2.5-coder:7b`, `gemma2:2b`, `phi3.5`. Server lives at `OLLAMA_URL` (default `http://127.0.0.1:11434`).
187
+
188
+ | Function | Action |
189
+ |---|---|
190
+ | `ollamaInstalled()` / `ollamaServe("start"\|"stop")` | detect / start / stop the daemon |
191
+ | `ollamaInfo()` (`/api/tags`) | up? + installed models |
192
+ | `pullModel(name)` (`/api/pull`) | download a model |
193
+ | `loadModel(name)` / `ollamaPs()` (`/api/ps`) | load into / list in memory |
194
+ | `removeModel(name)` (`/api/delete`) | uninstall |
195
+
196
+ ---
197
+
198
+ ## 8. GPU fit-check + quant recommendation 🛰️
199
+
200
+ `detectHardware()` runs a **real** probe (cached for the process; only free-RAM refreshes on read):
201
+
202
+ | Field | Source |
203
+ |---|---|
204
+ | `cpu`, `cores` | `os.cpus()` |
205
+ | `ram` | `os.totalmem()` / `os.freemem()` |
206
+ | `gpu`, `vram`, `backend`, `accel` | `nvidia-smi` → CUDA; macOS arm64 → Metal (unified memory ≈ 70% as VRAM); else CPU + AVX2/NEON |
207
+ | `diskFree` | `Get-PSDrive` (Windows) / `df -h` (POSIX) on the Constella home drive |
208
+ | `recommendedQuant` | `≥32 GB → Q5_K_M`, `≥16 GB → Q4_K_M`, else `Q4_0` |
209
+ | `maxParams` | `≥64 GB → 70B`, `≥32 GB → 34B`, `≥16 GB → 13B`, else `7B` |
210
+
211
+ The fit-check decides GPU offload at serve time. `gpuOffloadArgs(sizeBytes)`:
212
+
213
+ - Returns `[]` (CPU) when the backend isn't CUDA/Metal — the `-ngl` flag would do nothing.
214
+ - Returns `[]` when a sized model wouldn't fit: `sizeBytes × 1.15 > VRAM` → stay on CPU so a too-big model still **loads** instead of failing.
215
+ - Otherwise returns `["-ngl", "99"]` to offload every layer to the GPU.
216
+
217
+ ```mermaid
218
+ flowchart TD
219
+ A["detectHardware()"] --> B{"backend?"}
220
+ B -->|"CUDA / Metal"| C{"sizeBytes × 1.15 > VRAM?"}
221
+ B -->|"CPU"| D["[] (no offload)"]
222
+ C -->|"yes — won't fit"| D
223
+ C -->|"no — fits"| E["-ngl 99 (full GPU offload)"]
224
+ A --> F["recommendedQuant: ≥32→Q5_K_M, ≥16→Q4_K_M, else Q4_0"]
225
+ A --> G["maxParams: ≥64→70B, ≥32→34B, ≥16→13B, else 7B"]
226
+ ```
227
+
228
+ On Windows, CUDA llama.cpp builds need the CUDA runtime DLLs (`cudart64_*`, `cublas64_*`); `ensureCudaRuntime()` self-heals by fetching the matching `cudart-…` asset so `-ngl` actually offloads instead of silently falling back to CPU. `downloadLlamaServer()` auto-installs the right prebuilt (`CUDA` when an NVIDIA GPU is detected, else `CPU`) from `ggml-org/llama.cpp` releases into `<constellaHome>/bin/llama`.
229
+
230
+ ---
231
+
232
+ ## 9. The two local servers — chat `:8082` + embeddings `:8083` 🌠
233
+
234
+ Constella runs **two separate llama.cpp instances** so RAG embeddings never contend with chat inference:
235
+
236
+ | Server | Port | Env | Started by | Purpose |
237
+ |---|---|---|---|---|
238
+ | Chat / reasoning | `8082` | `LLAMACPP_URL` (`http://127.0.0.1:8082`) | `startLlamaServer()` / `ensureLlamaServer()` | OpenAI-compatible serving of the first installed **chat** GGUF for `local_llamacpp` agents |
239
+ | RAG embeddings | `8083` | `CONSTELLA_EMBED_URL` (`http://127.0.0.1:8083`) | `startEmbeddings()` / `ensureEmbedServer()` | serves the **embedding** GGUF (nomic) with `--embeddings --pooling mean` for semantic RAG |
240
+
241
+ Both bind **loopback only** (`127.0.0.1`). The launch args:
242
+
243
+ - Chat: `llama-server -m <chat.gguf> --host 127.0.0.1 --port 8082 -c 4096 [-ngl 99]`
244
+ - Embed: `llama-server -m <embed.gguf> --embeddings --host 127.0.0.1 --port 8083 -c 2048 --pooling mean [-ngl 99]`
245
+
246
+ Embedding models can't serve chat — if your only local model is an embedder, `startLlamaServer()` routes it to `:8083` and tells you to download a chat GGUF. Health is reported honestly via `llamaServerStatus()` (`/v1/models`) and `embedServerUp()` (`/health`).
247
+
248
+ ### RAG embedding fallback chain
249
+
250
+ `src/server/rag.ts` embeds via the dedicated server first, then **Ollama** (`OLLAMA_URL`, model `CONSTELLA_EMBED_MODEL` default `nomic-embed-text`), then a **keyword heuristic** if neither is up — retrieval degrades, never breaks. `nomic-embed-text` requires asymmetric prefixes: documents `search_document:`, queries `search_query:`.
251
+
252
+ ---
253
+
254
+ ## 10. Tables 🪐
255
+
256
+ | Table | Key columns | Role |
257
+ |---|---|---|
258
+ | `provider` | `catalogId`, `adapter`, `kind` (`cloud`/`cli`/`local`), `auth`, `status` (`connected`/`needs_sync`/`error`), `modelCount`, `cliVersion`, `defaultModel`, `authState` | one connected provider per workspace |
259
+ | `vault` | `providerId`, `ref` (`<catalogId>_api_key`), `ciphertext`, `iv` | encrypted secrets (AES-256-GCM) |
260
+ | `provider_model` | `providerId`, `modelId`, `name`, `context`, `outputLimit`, `inputCost`, `outputCost`, `caps`, `released`, `isDefault` | cached enriched catalog the UI reads; replaced wholesale per refresh |
261
+ | `local_model` | `name`, `file`, `quant`, `params`, `sizeBytes`, `sha256`, `bind` (`127.0.0.1:8082`), `loaded` | installed GGUF registry (machine-wide, dedup by `file`) |
262
+
263
+ ---
264
+
265
+ ## 11. Step-by-step 🛰️
266
+
267
+ ### Connect a cloud provider
268
+ 1. Open **Models**, choose a provider from the catalog (e.g. Anthropic).
269
+ 2. Paste the API key → `connectProvider("anthropic", key)` stores it in the vault.
270
+ 3. `syncProvider()` hits the live endpoint, sets `status`/`modelCount`, then `refreshProviderModels()` populates `provider_model`.
271
+ 4. Assign a model to an agent (the agent's `Agent.md` model field).
272
+
273
+ ### Run a model locally with llama.cpp
274
+ 1. **Models → llama.cpp → Install** (`downloadLlamaServer()` grabs the right prebuilt).
275
+ 2. Download a chat GGUF from the catalog (`downloadGguf(id)`), and the `nomic-embed-q8` embedding GGUF for RAG.
276
+ 3. **Start server** (`startLlamaServer()`) — boots on `:8082`, offloading to GPU when the model fits.
277
+ 4. `connectLlamaCpp()` registers `llamacpp` as a local provider; point agents at `local_llamacpp`.
278
+
279
+ ### Use Ollama
280
+ 1. Install Ollama, **Start** (`ollamaServe("start")`).
281
+ 2. `pullModel("qwen2.5:7b")`, then `loadModel(...)` to warm it.
282
+ 3. Connect via the `ollama` provider (live `/api/tags` list).
283
+
284
+ ---
285
+
286
+ ## 12. Possible states ✦
287
+
288
+ | Surface | States |
289
+ |---|---|
290
+ | `provider.status` | `connected`, `needs_sync`, `error` |
291
+ | `provider.authState` | `ready`, `needs_login`, `needs_key`, `unknown` |
292
+ | `provider.syncStatus` | `implemented`, `manual`, `not_implemented` |
293
+ | Catalog `status` | `available`, `experimental`, `requires_setup`, `planned`, `unsupported` |
294
+ | llama.cpp server | up / down (`/v1/models`); CPU vs `-ngl 99` (GPU) |
295
+ | Embed server | up / down (`/health`); model installed? |
296
+ | GGUF download | live `{ received, total, done, error }` progress |
297
+
298
+ ---
299
+
300
+ ## 13. Related integrations 🌌
301
+
302
+ - **[AGENTS](./AGENTS.md)** — each agent selects a provider + model; the default tier comes from `defaultModelFor()`.
303
+ - **[KB_RAG](./KB_RAG.md)** / **[MEMORY_RAG](./MEMORY_RAG.md)** — consume the embedding server on `:8083`.
304
+ - **[AI_ARCHITECTURE](./AI_ARCHITECTURE.md)** — where CLI adapters and runtime resolution fit.
305
+ - **[CONFIGURATION](./CONFIGURATION.md)** — per-workspace agent flags (web research, file locks, command guard).
306
+
307
+ ---
308
+
309
+ ## 14. Security 🕳️
310
+
311
+ - **Secrets in the vault only.** API keys are AES-256-GCM encrypted (`CONSTELLA_VAULT_KEY`) in the `vault` table — never on `provider` rows, never in logs.
312
+ - **Local servers are loopback-bound** (`127.0.0.1`) — no LAN exposure of `:8082`/`:8083`.
313
+ - **Model ids are validated** before reaching argv (`safeModel` / `safeModelSlash`) because `Agent.md` frontmatter is agent-writable — an unconstrained value (`sonnet"; rm -rf ~`) could otherwise be re-parsed by the shell. Invalid ids are dropped so the CLI uses its default.
314
+ - **GGUF integrity** — size check + SHA-256 (when known); a truncated download is deleted, never installed.
315
+ - **Vanilla agent runs** — `disableAllHooks` keeps operator hooks/plugins out of agent subprocesses.
316
+ - **CLI credentials stay with the CLI** — Constella drives `aider`/`opencode`/`cursor`/etc. but never stores their keys.
317
+
318
+ ---
319
+
320
+ ## 15. Troubleshooting 🚀
321
+
322
+ | Symptom | Likely cause / fix |
323
+ |---|---|
324
+ | Model list empty after connect | models.dev unreachable **and** disk cache cold → `FALLBACK_MODELS` only; retry online, or check the provider's `/v1/models`. |
325
+ | GPU not used (CPU pegged) | CUDA runtime DLLs missing → re-run **Install** (`ensureCudaRuntime(force)` self-heals), or model doesn't fit VRAM (`sizeBytes × 1.15 > VRAM`). |
326
+ | `llama-server not installed` | run **Install** or `brew install llama.cpp`; sets the `INSTALLED` marker. |
327
+ | Chat server won't start | only an embedding model installed → download a chat/instruct GGUF; check it's not loading nomic into `:8082`. |
328
+ | RAG not semantic | embed server down → `ensureEmbedServer()`; needs an embedding GGUF (download `nomic-embed-q8`) or Ollama with `nomic-embed-text`. |
329
+ | `Ollama not running` | start it (`ollamaServe("start")` / `ollama serve`); port `11434` may be busy. |
330
+ | `not enough free space` | GGUF needs ~1.1× its size free; free disk or pick a smaller quant. |
331
+ | CLI provider `needs_login` | run the binary's auth (see `LOGIN_HINTS`, e.g. `codex login`, `opencode auth login`). |
332
+ | `SHA-256 mismatch` | corrupt download — delete and retry. |
333
+
334
+ ---
335
+
336
+ ## Related links
337
+
338
+ - [AGENTS](./AGENTS.md) · [AI_ARCHITECTURE](./AI_ARCHITECTURE.md) · [ARCHITECTURE](./ARCHITECTURE.md)
339
+ - [KB_RAG](./KB_RAG.md) · [MEMORY_RAG](./MEMORY_RAG.md) · [CONFIGURATION](./CONFIGURATION.md)
340
+ - [INSTALLATION](./INSTALLATION.md) · [ONBOARDING](./ONBOARDING.md) · [WORKFLOW](./WORKFLOW.md)
341
+ - [✦ Back to the docs index](./README.md)