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
package/docs/pt/MCP.md ADDED
@@ -0,0 +1,313 @@
1
+ [← Índice](./README.md) · [🇬🇧 English](../en/MCP.md) · [✦ Constella](../../README.pt-BR.md)
2
+
3
+ # 🛰️ Servidor MCP — Pilotando a Nave Central a partir da Órbita
4
+
5
+ ![](../assets/divider-orbit.svg)
6
+
7
+ Um servidor **Model Context Protocol** autossuficiente (`scripts/mcp-server.mjs`) que expõe a API REST pública da Constella como ferramentas MCP, permitindo que um host de IA externo — Claude Desktop, Cursor ou qualquer cliente MCP — pilote o seu plano de controle Constella por linguagem natural.
8
+
9
+ ---
10
+
11
+ ## Quando usar
12
+
13
+ Recorra ao servidor MCP quando quiser que uma **IA externa** observe e dirija a Constella sem abrir a interface web:
14
+
15
+ - Perguntar ao Claude Desktop "qual é o status da minha empresa de agentes?" e fazê-lo chamar `constella_status`.
16
+ - Aprovar um plano pendente, ligar/desligar a execução 24/7 ou iniciar um novo trabalho de dentro do chat do Cursor.
17
+ - Integrar a Constella a qualquer host agêntico que fale MCP, usando um Personal Access Token com escopo como única credencial.
18
+
19
+ Esta é a direção **de saída para a Constella** (outbound): um host de IA *dirige* a Constella. É o espelho da própria constelação de agentes da Constella *consumindo* servidores MCP externos — veja [Duas direções de MCP](#-duas-direções-de-mcp--não-confunda) abaixo.
20
+
21
+ ---
22
+
23
+ ## Como funciona 🌌
24
+
25
+ O servidor MCP é uma ponte fina e sem dependências. Ele fala **JSON-RPC sobre stdio** com o host MCP, e cada chamada de ferramenta é traduzida em uma única requisição à API REST pública v1 (`/api/v1/...`), autenticada com um Personal Access Token (PAT).
26
+
27
+ ```
28
+ Host MCP (Claude Desktop / Cursor)
29
+ │ JSON-RPC sobre stdio
30
+
31
+ scripts/mcp-server.mjs ──Bearer cn_…──► /api/v1/[[...path]] ──► núcleos da Constella
32
+ ```
33
+
34
+ Propriedades-chave direto do código-fonte:
35
+
36
+ - **Zero dependências.** O `scripts/mcp-server.mjs` importa apenas `node:readline` e usa o `fetch` global (Node 18+). Ele acompanha a distribuição compilada sem alterações.
37
+ - **MCP feito à mão.** Implementa diretamente os métodos JSON-RPC `initialize`, `notifications/initialized`, `ping`, `tools/list` e `tools/call` — sem SDK.
38
+ - **Mapeamento fino.** O `build(args)` de cada ferramenta retorna `{ method, path, body? }`, que `callApi` envia para `${BASE}/api/v1${path}` com `Authorization: Bearer ${PAT}` (e `x-constella-org` quando `CONSTELLA_ORG` está definido).
39
+ - **Uma só credencial.** A camada REST (`authenticatePAT` em `src/server/api/pat-auth.ts`) é exclusivamente por PAT; não há sessão. O escopo (`read` / `write`) é validado no servidor.
40
+ - **Timeout de requisição.** Cada chamada REST usa `AbortSignal.timeout(30_000)` — um teto de 30 segundos por chamada de ferramenta.
41
+
42
+ ---
43
+
44
+ ## Fluxo principal 🚀
45
+
46
+ ```mermaid
47
+ sequenceDiagram
48
+ participant Host as Host MCP (Claude Desktop)
49
+ participant MCP as mcp-server.mjs
50
+ participant API as dispatcher /api/v1
51
+ participant Core as plan-ops / work-ops / kb
52
+
53
+ Host->>MCP: initialize (stdio)
54
+ MCP-->>Host: serverInfo {name: constella}
55
+ Host->>MCP: tools/list
56
+ MCP-->>Host: 13 ferramentas constella_*
57
+ Host->>MCP: tools/call constella_status
58
+ MCP->>API: GET /api/v1/status (Bearer cn_…)
59
+ API->>API: authenticatePAT + rate-limit
60
+ API->>Core: apiStatus(workspace)
61
+ Core-->>API: contagens
62
+ API-->>MCP: {ok:true, data:{…}}
63
+ MCP-->>Host: content[text] (JSON formatado)
64
+ ```
65
+
66
+ O ciclo de vida, passo a passo:
67
+
68
+ 1. **Handshake.** O host envia `initialize`; o servidor responde com `protocolVersion` (ecoando a do host, padrão `2024-11-05`), `capabilities: { tools: {} }` e `serverInfo: { name: "constella", version: "1.0.0" }`.
69
+ 2. **Descoberta.** Em `tools/list`, o servidor retorna todas as ferramentas (`name`, `description`, `inputSchema`).
70
+ 3. **Invocação.** Em `tools/call`, ele localiza a ferramenta pelo nome, chama `build(arguments)`, dispara a requisição REST via `callApi` e embrulha a resposta JSON como `{ content: [{ type: "text", text }], isError: data?.ok === false }`.
71
+ 4. **Auth e escopo.** O dispatcher REST autentica o PAT, aplica um rate limit de janela deslizante (120 req/min/token) e rejeita rotas de escrita quando o token tem escopo `read`.
72
+
73
+ ---
74
+
75
+ ## Conceitos-chave ✦
76
+
77
+ | Conceito | Onde | Significado |
78
+ |---|---|---|
79
+ | **MCP de saída** | `scripts/mcp-server.mjs` | Um host de IA externo dirige a Constella via REST autenticada por PAT. |
80
+ | **PAT** | tabela `personalAccessToken` | Token `cn_…`, com hash SHA-256, escopo `read` ou `write`, texto puro exibido uma vez. |
81
+ | **Trava de escopo** | `route.ts` `needWrite()` | Tokens `write` podem mutar; tokens `read` recebem `403` em mutações POST. |
82
+ | **Seleção de org** | `CONSTELLA_ORG` → `x-constella-org` | Escolhe em qual org um usuário multi-org atua (validado por participação). |
83
+ | **Rate limit** | `route.ts` `rateLimited()` | Janela deslizante de 60s em memória, máximo de 120 requisições por token. |
84
+ | **Envelope** | `route.ts` `ok()` / `fail()` | Toda resposta é `{ ok: true, data }` ou `{ ok: false, error }`. |
85
+
86
+ ---
87
+
88
+ ## Variáveis de ambiente 🪐
89
+
90
+ O servidor MCP é configurado exclusivamente por variáveis de ambiente passadas pelo host:
91
+
92
+ | Variável | Padrão | Obrigatória | Finalidade |
93
+ |---|---|---|---|
94
+ | `CONSTELLA_PAT` | — | **Sim** | O Personal Access Token `cn_…`. Use um token **write** para permitir aprovar/execução/novo-trabalho; um token **read** para somente leitura. Se ausente, toda ferramenta retorna `{ ok: false, error: "CONSTELLA_PAT is not set" }`. |
95
+ | `CONSTELLA_BASE_URL` | `http://localhost:3000` | Não | URL base do servidor Constella em execução. Barras finais são removidas. |
96
+ | `CONSTELLA_ORG` | — | Não | Um `orgId` para usuários multi-org; enviado no cabeçalho `X-Constella-Org`. |
97
+
98
+ > 🕳️ O token **nunca é registrado em log** por nenhum dos lados. O `pat-auth.ts` valida o bearer contra o `tokenHash` armazenado e resolve a org/workspace por um join de participação, de modo que um token não pode ser apontado para outro inquilino.
99
+
100
+ ---
101
+
102
+ ## Catálogo de ferramentas — cada `constella_*` mapeada à sua rota REST 🌠
103
+
104
+ Todas as 13 ferramentas estão definidas no array `TOOLS` de `scripts/mcp-server.mjs`. Cada uma mapeia 1:1 para uma rota v1.
105
+
106
+ | Ferramenta MCP | Escopo | REST | Entradas | O que faz |
107
+ |---|---|---|---|---|
108
+ | `constella_status` | read | `GET /status` | — | Contagens de goals, issues, tasks e o estado do plano. |
109
+ | `constella_review` | read | `GET /review` | — | Resumo textual legível de plano, issues, tasks e próximos passos. |
110
+ | `constella_goals` | read | `GET /goals` | — | Lista goals. |
111
+ | `constella_issues` | read | `GET /issues` | — | Lista issues. |
112
+ | `constella_tasks` | read | `GET /tasks` | — | Lista tasks. |
113
+ | `constella_specs` | read | `GET /specs` | — | Lista specs. |
114
+ | `constella_kb` | read | `POST /kb` | `q` (obrigatório) | Faz uma pergunta à Base de Conhecimento. |
115
+ | `constella_approve_plan` | **write** | `POST /plan/approve` | — | Aprova o plano pendente e enfileira as tasks. |
116
+ | `constella_reject_plan` | **write** | `POST /plan/reject` | `reason` (opcional) | Devolve o plano ao CEO para revisão. |
117
+ | `constella_set_execution` | **write** | `POST /execution` | `on` (obrigatório, bool) | Liga ou desliga a execução autônoma 24/7. |
118
+ | `constella_new_work` | **write** | `POST /work` | `brief` (obrigatório), `title` (opcional) | Inicia uma nova unidade de trabalho — o CEO redige specs/issues para aprovação. |
119
+ | `constella_cancel_goal` | **write** | `POST /goals/{id}/cancel` | `id` (obrigatório) | Cancela um goal pelo id. |
120
+ | `constella_archive_goal` | **write** | `POST /goals/{id}/archive` | `id` (obrigatório) | Arquiva um goal pelo id. |
121
+
122
+ ### Handlers no servidor
123
+
124
+ Cada rota cai no switch `dispatch()` de `src/app/api/v1/[[...path]]/route.ts`, que reutiliza os mesmos núcleos sem sessão usados pelo controle remoto do Telegram:
125
+
126
+ | Rota REST | Handler |
127
+ |---|---|
128
+ | `GET /status` | `apiStatus(ws)` |
129
+ | `GET /review` | `reviewSummaryFor(ws)` |
130
+ | `GET /goals` `/issues` `/tasks` `/specs` | `apiGoals` / `apiIssues` / `apiTasks` / `apiSpecs` |
131
+ | `POST /kb`, `GET /kb?q=` | `kbAnswer(org.id, q)` |
132
+ | `POST /plan/approve` | `approvePlanFor(org.id, ws)` |
133
+ | `POST /plan/reject` | `requestPlanChangesFor(ws.id, reason)` |
134
+ | `POST /execution` | `setAuto247For(ws.id, on)` |
135
+ | `POST /work` | `startNewWorkFor(org.id, ws, { brief, title })` |
136
+ | `POST /goals/{id}/cancel` | `cancelGoalFor(ws.id, id)` |
137
+ | `POST /goals/{id}/archive` | `archiveGoalFor(org.id, ws.id, id)` |
138
+
139
+ > Observação: a lista de ferramentas do lado do host **não** inclui uma ferramenta `me`, mas a API REST expõe `GET /api/v1` (ou `/me`), retornando usuário, org, workspace e escopo do token. Hosts podem acessá-la pela [API Pública](./PUBLIC_API.md) diretamente.
140
+
141
+ ---
142
+
143
+ ## Passo a passo: configurando um host MCP
144
+
145
+ ### 1. Gerar um Personal Access Token
146
+
147
+ Na interface web da Constella: **Perfil → Personal access tokens → Novo token**. Escolha um escopo:
148
+
149
+ - **read** — apenas para as ferramentas de status/review/listagem/KB.
150
+ - **write** — para também permitir aprovar, rejeitar, execução, novo-trabalho, cancelar e arquivar.
151
+
152
+ O valor `cn_…` em texto puro é exibido **uma única vez** (`createPAT` o retorna; apenas o hash SHA-256 é persistido). Copie imediatamente.
153
+
154
+ ### 2. Garanta que a Constella esteja rodando
155
+
156
+ O servidor MCP conversa com um servidor ativo em `CONSTELLA_BASE_URL` (padrão `http://localhost:3000`). Inicie a Constella normalmente (`constella` / `npm start`).
157
+
158
+ ### 3. Registre o servidor no seu host
159
+
160
+ **Claude Desktop** — edite `claude_desktop_config.json`:
161
+
162
+ ```json
163
+ {
164
+ "mcpServers": {
165
+ "constella": {
166
+ "command": "node",
167
+ "args": ["C:/Users/Usuario/Documents/constella/scripts/mcp-server.mjs"],
168
+ "env": {
169
+ "CONSTELLA_PAT": "cn_seu_token_write_aqui",
170
+ "CONSTELLA_BASE_URL": "http://localhost:3000"
171
+ }
172
+ }
173
+ }
174
+ }
175
+ ```
176
+
177
+ **Cursor** — adicione o mesmo bloco sob `mcpServers` nas configurações de MCP do Cursor (`.cursor/mcp.json` ou a configuração MCP global). Para um usuário multi-org, adicione `"CONSTELLA_ORG": "<orgId>"` em `env`.
178
+
179
+ ### 4. Use
180
+
181
+ Reinicie o host, abra um chat e peça em linguagem natural — o host descobrirá as 13 ferramentas `constella_*` via `tools/list` e as chamará conforme necessário:
182
+
183
+ > "Use a Constella para me mostrar o status atual e, em seguida, aprove o plano pendente."
184
+
185
+ ---
186
+
187
+ ## Exemplos 🌌
188
+
189
+ ### Testar o servidor manualmente
190
+
191
+ Você pode dirigir o protocolo stdio diretamente para confirmar a ligação:
192
+
193
+ ```bash
194
+ CONSTELLA_PAT=cn_xxx CONSTELLA_BASE_URL=http://localhost:3000 \
195
+ node scripts/mcp-server.mjs <<'EOF'
196
+ {"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05"}}
197
+ {"jsonrpc":"2.0","id":2,"method":"tools/list"}
198
+ {"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"constella_status","arguments":{}}}
199
+ EOF
200
+ ```
201
+
202
+ Cada linha é JSON-RPC delimitado por nova linha; o servidor responde um objeto JSON por linha.
203
+
204
+ ### Uma requisição `tools/call` e a resposta
205
+
206
+ Requisição do host:
207
+
208
+ ```json
209
+ {"jsonrpc":"2.0","id":7,"method":"tools/call",
210
+ "params":{"name":"constella_new_work",
211
+ "arguments":{"brief":"Adicionar um botão de modo escuro nas configurações","title":"Modo escuro"}}}
212
+ ```
213
+
214
+ Resposta do servidor (o envelope REST é formatado dentro de um bloco de conteúdo de texto):
215
+
216
+ ```json
217
+ {"jsonrpc":"2.0","id":7,"result":{
218
+ "content":[{"type":"text","text":"{\n \"ok\": true,\n \"data\": { ... }\n}"}],
219
+ "isError":false}}
220
+ ```
221
+
222
+ Se o PAT tivesse escopo `read`, a camada REST retornaria `403` e o `ok` do conteúdo seria `false`, fazendo `isError` virar `true`.
223
+
224
+ ---
225
+
226
+ ## Estados possíveis 🕳️
227
+
228
+ | Situação | Onde aparece | Resultado |
229
+ |---|---|---|
230
+ | `CONSTELLA_PAT` não definido | `callApi` | `{ ok: false, error: "CONSTELLA_PAT is not set" }` (sem chamada de rede). |
231
+ | Bearer malformado / ausente | `authenticatePAT` | HTTP `401` `"missing or malformed bearer token"`. |
232
+ | Hash de token desconhecido | `authenticatePAT` | HTTP `401` `"invalid token"`. |
233
+ | Sem org / org arquivada | `authenticatePAT` | HTTP `404` / `409`. |
234
+ | Token read em rota de escrita | `needWrite()` | HTTP `403` `"this token has read scope; a write-scope token is required"`. |
235
+ | Acima de 120 req/min | `rateLimited()` | HTTP `429` `"rate limit exceeded (120 req/min)"`. |
236
+ | Nome de ferramenta desconhecido | `tools/call` | Erro JSON-RPC `-32602` `unknown tool: …`. |
237
+ | Método JSON-RPC desconhecido | `handle()` | Erro JSON-RPC `-32601` `method not found: …`. |
238
+ | Handler lança exceção | `rl.on("line")` | Erro JSON-RPC `-32603` (interno). |
239
+ | Linha de stdin não-JSON | `rl.on("line")` | Ignorada silenciosamente. |
240
+ | REST retorna não-JSON | `callApi` | `{ ok: false, error: "non-JSON response (http <status>)" }`. |
241
+
242
+ ---
243
+
244
+ ## 🪐 Duas direções de MCP — não confunda
245
+
246
+ A Constella toca o MCP em **duas direções opostas**:
247
+
248
+ | Direção | Quem dirige quem | Mecanismo |
249
+ |---|---|---|
250
+ | **Saída (este doc)** | Um host de IA externo dirige a **Constella** | `scripts/mcp-server.mjs` → API REST pública v1, autenticada por PAT. |
251
+ | **Entrada (agentes consomem MCPs externos)** | Os **agentes da Constella** dirigem servidores MCP externos | Configurado pela config `~/.claude` da CLI `claude`; **não** pela tabela `plugin` da Constella. |
252
+
253
+ ```mermaid
254
+ flowchart LR
255
+ subgraph Saida["Saída"]
256
+ H["Claude Desktop / Cursor"] -->|stdio JSON-RPC| M["mcp-server.mjs"]
257
+ M -->|"Bearer cn_…"| R["/api/v1"]
258
+ R --> C["núcleos da Constella"]
259
+ end
260
+ subgraph Entrada
261
+ A["agente Constella (CLI claude)"] -->|"config MCP ~/.claude"| X["servidor MCP externo"]
262
+ end
263
+ ```
264
+
265
+ A direção de entrada é configuração da CLI `claude` no nível do operador e não tem relação com o registro de [Plugins](./PLUGINS.md) da Constella. Veja [Agentes](./AGENTS.md) e [Arquitetura de IA](./AI_ARCHITECTURE.md) para entender como os agentes rodam.
266
+
267
+ ---
268
+
269
+ ## Integrações relacionadas
270
+
271
+ - **[API Pública](./PUBLIC_API.md)** — a superfície REST v1 que o servidor MCP envolve; mesmos PATs e escopos.
272
+ - **[Telegram](./TELEGRAM.md)** — outra superfície de controle remoto que reutiliza os mesmos núcleos sem sessão (`plan-ops.ts` / `work-ops.ts`).
273
+ - **[Plugins](./PLUGINS.md)** — o registro de plugins nativos da Constella (GitHub, Telegram, Vault, Web Search); distinto do consumo de MCP externo.
274
+ - **[KB & RAG](./KB_RAG.md)** — o que `constella_kb` consulta por baixo dos panos.
275
+
276
+ ---
277
+
278
+ ## Segurança 🔒
279
+
280
+ - **Apenas PAT, com hash em repouso.** Só o `tokenHash` SHA-256 é armazenado (tabela `personalAccessToken`). O `cn_…` em texto puro aparece uma vez na criação e nunca é registrado em log por nenhum lado.
281
+ - **Resolução de org segura por participação.** `getActiveOrg(userId, orgHeader)` valida a org solicitada por um join de participação — um token não pode ser apontado para outro inquilino.
282
+ - **Imposição de escopo.** Mutações exigem `write`; o escopo `read` fica restrito às ferramentas estilo GET mais as consultas à KB.
283
+ - **Limitação de taxa.** 120 requisições/min/token (janela deslizante de 60s), reiniciada no restart do servidor.
284
+ - **Loopback por padrão.** Com `CONSTELLA_BASE_URL` padrão `http://localhost:3000`, o servidor MCP alcança a Constella pela interface de loopback, a menos que você aponte deliberadamente para outro lugar.
285
+ - **Chamadas limitadas.** Cada requisição REST é limitada a 30 segundos (`AbortSignal.timeout(30_000)`).
286
+ - **Menor privilégio.** Prefira um token **read** para hosts de monitoramento; reserve tokens **write** para hosts em que você realmente confie para aprovar planos e iniciar trabalhos.
287
+
288
+ ---
289
+
290
+ ## Solução de problemas 🛠️
291
+
292
+ | Sintoma | Causa provável | Correção |
293
+ |---|---|---|
294
+ | Toda ferramenta retorna `"CONSTELLA_PAT is not set"` | Variável ausente no bloco `env` do host | Adicione `CONSTELLA_PAT` à entrada do servidor MCP e reinicie o host. |
295
+ | `401 invalid token` | Token revogado, digitado errado ou de outra instância | Gere um PAT novo; confirme que `CONSTELLA_BASE_URL` aponta para a mesma instância. |
296
+ | `403 … write-scope token is required` | Usando token read para aprovar/execução/novo-trabalho | Crie um token de escopo **write**. |
297
+ | `429 rate limit exceeded` | Mais de 120 chamadas/min em um token | Reduza o ritmo ou use um segundo token. |
298
+ | Conexão recusada / resposta não-JSON | Constella não está rodando ou URL base errada | Inicie a Constella; verifique `CONSTELLA_BASE_URL`. |
299
+ | Host não mostra ferramentas da Constella | Servidor falhou ao iniciar | Veja os logs MCP do host; confirme o comando `node` e o caminho absoluto até `scripts/mcp-server.mjs`. |
300
+ | `409 organization is archived` | A org do token foi arquivada | Use um token cuja org esteja ativa, ou defina um `CONSTELLA_ORG` válido. |
301
+
302
+ ---
303
+
304
+ ## Links relacionados
305
+
306
+ - [API Pública](./PUBLIC_API.md)
307
+ - [Telegram](./TELEGRAM.md)
308
+ - [Plugins](./PLUGINS.md)
309
+ - [Agentes](./AGENTS.md)
310
+ - [Arquitetura de IA](./AI_ARCHITECTURE.md)
311
+ - [KB & RAG](./KB_RAG.md)
312
+ - [Segurança](./SECURITY.md)
313
+ - [Arquitetura](./ARCHITECTURE.md)
@@ -0,0 +1,289 @@
1
+ [← Índice](./README.md) · [🇬🇧 English](../en/MEMORY_RAG.md) · [✦ Constella](../../README.pt-BR.md)
2
+
3
+ # Memory RAG — a nebulosa de memória do workspace 🌌
4
+
5
+ ![](../assets/divider-orbit.svg)
6
+
7
+ Recuperação pura, restrita à organização, sobre o Markdown do workspace **e** as transcrições de conversa. É a gravidade que puxa o contexto relevante para a memória de trabalho de uma constelação pouco antes de ela agir — semântica quando uma estrela de embedding local está acesa, heurística por palavra-chave quando não está.
8
+
9
+ ---
10
+
11
+ ## Quando usar
12
+
13
+ - Você quer entender como um agente "lembra" de conversas e documentos anteriores antes de um turno.
14
+ - Você está depurando por que a recuperação retornou nada, ou retornou texto desatualizado.
15
+ - Você está integrando os tokens de agente `[[REMEMBER …]]` / `[[CONSULT: …]]` / `[[KB: …]]`.
16
+ - Você precisa saber quais diretórios são indexados, os tempos de debounce e como o file-watcher mantém a memória atualizada.
17
+
18
+ Para a camada **curada e ciente de estado** (entradas tipadas, obsolescência, o grafo de conhecimento) veja [KB_RAG](./KB_RAG.md) e [KB_AGENT](./KB_AGENT.md). Para onde a recuperação é injetada num prompt, veja [AI_ARCHITECTURE](./AI_ARCHITECTURE.md).
19
+
20
+ ---
21
+
22
+ ## Como funciona 🪐
23
+
24
+ O Memory RAG vive em `src/server/rag.ts`. É **recuperação pura**: ele embeda e armazena chunks, depois os ordena por similaridade de cosseno para uma consulta. Não há modelo de estado, nem flag de obsolescência, nem escrita de resposta — isso é trabalho da KB curada (`src/server/kb.ts`).
25
+
26
+ Dois corpora são indexados numa única tabela, `rag_chunk`:
27
+
28
+ 1. **Markdown do workspace** — arquivos sob os diretórios indexados (`.claude`, `DOCS`, `PO`, `Reports`, `specs`, `issues`, além de `mock/`), chaveados pelo seu `path` relativo real.
29
+ 2. **Transcrições de conversa** — conversas da team-room, DM e Telegram, armazenadas sob caminhos sintéticos `chat/<channel>`.
30
+
31
+ Cada linha guarda o texto do `chunk` e, quando um backend de embedding está acessível, seu `vector` (um array de floats codificado em JSON). Se nenhum backend estiver no ar, o chunk é armazenado **sem** vetor e a recuperação cai numa heurística por palavra-chave — nada é perdido, e um reindex preguiçoso melhora os chunks assim que os embeddings ficam disponíveis.
32
+
33
+ ### Backends de embedding
34
+
35
+ `embed(text, kind)` tenta dois backends em ordem, depois desiste:
36
+
37
+ | Ordem | Backend | URL (env) | Notas |
38
+ |-------|---------|-----------|-------|
39
+ | 1 | Ollama | `OLLAMA_URL` (padrão `http://127.0.0.1:11434`) `/api/embeddings`, modelo `CONSTELLA_EMBED_MODEL` (padrão `nomic-embed-text`) | Usado só se estiver rodando com o modelo de embedding baixado |
40
+ | 2 | Servidor llama.cpp de embedding dedicado | `CONSTELLA_EMBED_URL` (padrão `http://127.0.0.1:8083`) `/v1/embeddings`, modelo `nomic-embed` | Iniciado automaticamente no boot via `ensureEmbedServer()` em `src/server/local-models.ts` |
41
+ | — | nenhum | — | Retorna `null` → o chamador usa o fallback por palavra-chave |
42
+
43
+ Ambas as chamadas têm timeout de 8 s (`AbortSignal.timeout(8000)`).
44
+
45
+ > **Prefixos assimétricos.** O `nomic-embed-text` foi treinado com prefixos de instrução de tarefa e os **exige**: documentos são embedados como `search_document: …`, consultas como `search_query: …`. O `embed()` aplica o prefixo correto via o argumento `kind` (`"document"` | `"query"`). Misturá-los degrada a recuperação silenciosamente, então tanto o lado de indexação quanto o de consulta devem usar o mesmo modelo com o prefixo correspondente. O prefixo é aplicado incondicionalmente no caminho llama.cpp (sempre nomic) e só quando `CONSTELLA_EMBED_MODEL` casa com `/nomic/i` no caminho Ollama.
46
+
47
+ ### Chunking
48
+
49
+ `chunksOf(md)` divide um documento em cabeçalhos Markdown H1–H3 (`\n(?=#{1,3}\s)`), apara, descarta vazios, depois:
50
+
51
+ - mantém cada parte como um chunk se tiver `≤ 1200` chars,
52
+ - caso contrário, fatia em janelas de 1200 chars,
53
+ - e limita o documento em **40 chunks** (`.slice(0, 40)`).
54
+
55
+ ### Ordenação
56
+
57
+ `cosine(a, b)` é um cosseno por produto escalar simples sobre o menor dos dois vetores. `retrieve()` ordena todos os chunks vetorizados por cosseno em relação ao vetor da consulta, pega os top `k` (padrão 5), e se não existirem vetores cai na pontuação por palavra-chave (contagem de termos da consulta com mais de 3 chars que aparecem no chunk). Se nem a pontuação por palavra-chave achar nada, retorna os primeiros até 3 chunks para que o agente sempre receba *algo*.
58
+
59
+ ---
60
+
61
+ ## Fluxo principal — recuperação de memória antes de um turno 🛰️
62
+
63
+ Antes de um agente agir, `assembleAgentPrompt()` (em `src/server/context-manager.ts`) puxa memória em paralelo com o contexto do canal. Ele chama o `kbQuery()` **ciente de estado** (que compartilha a mesma tabela `rag_chunk` e os mesmos helpers `embed`/`cosine` do `retrieve()` puro), e lê o arquivo estático `.claude/memory.md`. O conhecimento recuperado é injetado como uma seção de prompt rotulada e aparável.
64
+
65
+ ```mermaid
66
+ flowchart TD
67
+ A["Turno do agente começa<br/>(task / resposta de chat)"] --> B["assembleAgentPrompt()"]
68
+ B --> C["Monta a query<br/>(título+desc da task OU role+instrução, ≤400 chars)"]
69
+ C --> D{"embed(query, 'query')"}
70
+ D -->|Ollama :11434| E["vetor"]
71
+ D -->|llama.cpp :8083| E
72
+ D -->|sem backend| F["heurística por palavra-chave"]
73
+ E --> G["ordenação por cosseno sobre rag_chunk<br/>(arquivos + chat/<channel>)"]
74
+ F --> G
75
+ G --> H["top-k chunks + caminhos de origem"]
76
+ H --> I["Injeta como seção 'Knowledge'<br/>+ '.claude/memory.md' como 'Relevant memory'"]
77
+ I --> J["Prompt ajustado à janela do modelo<br/>(seções de baixa prioridade descartadas primeiro)"]
78
+ J --> K["Agente roda com memória no contexto"]
79
+ ```
80
+
81
+ O `retrieve()` puro retorna `{ context, sources, mode }` onde `mode` é `"semantic" | "heuristic" | "none"`; a variante `kbQuery()` adiciona ciência de estado e `refs`. Ambos cortam `context` em 4000 chars.
82
+
83
+ ---
84
+
85
+ ## Memory RAG vs KB curada 🕳️
86
+
87
+ Memory RAG e a KB curada compartilham armazenamento e embeddings mas respondem perguntas diferentes. Memória é *o que foi escrito e dito*; a KB é *o que é verdade agora*.
88
+
89
+ | Aspecto | Memory RAG (`rag.ts`) | KB curada (`kb.ts`) |
90
+ |---------|-----------------------|---------------------|
91
+ | Função | `retrieve()` | `kbQuery()` / `kbAnswer()` |
92
+ | Corpus | `.md` do workspace + transcrições `chat/<channel>` | Mesma tabela `rag_chunk`, mas ligada a linhas tipadas de `kb_entry` |
93
+ | Ciência de estado | Nenhuma — retorna o que ordenar mais alto | Descarta chunks `obsolete=1` (entradas superseded / obsolete, goals cancelled / archived) |
94
+ | Referências | Apenas `sources` (caminhos de arquivo) | `sources` + `refs` internas (jump-backs de spec / issue / goal / file) |
95
+ | Sinal de "insuficiente" | Não | Booleano `sufficient` |
96
+ | Logging | Não | Loga cada consulta em `kb_query_log` |
97
+ | Dono | O watcher + o agente de Conhecimento (Vannevar) | O agente de Conhecimento (curadoria, dedupe, obsolescência) |
98
+
99
+ Ambos caem na mesma heurística por palavra-chave e compartilham `embed`, `chunksOf`, `cosine`, `indexRag`, `indexChat`. Veja [KB_RAG](./KB_RAG.md) para a camada curada.
100
+
101
+ ---
102
+
103
+ ## Tokens de memória do agente — REMEMBER / CONSULT / KB
104
+
105
+ Agentes dirigem a memória diretamente das suas respostas via tokens em colchetes. O runner e o caminho de resposta de chat fazem o parse desses tokens, agem sobre eles e os removem do texto visível (`src/server/kb.ts`).
106
+
107
+ | Token | Direção | O que faz |
108
+ |-------|---------|-----------|
109
+ | `[[REMEMBER type=<t>: <fato>]]` | produtor | `extractRemembered()` transforma cada um num item de KB tipado para ingerir. O tipo deve estar em `KB_LEARN_TYPES` (decision, architecture, business-rule, integration, dependency, bug, fix, test, review, vuln, ui-pattern, stack, env-config, command, note), senão cai para `note`. Fatos com menos de 8 chars são ignorados. |
110
+ | `[[CONSULT: <pergunta>]]` | consumidor | `answerConsults()` roda cada pergunta por `kbQuery()` (k=6) e posta a resposta de volta na thread para que ela esteja no contexto no próximo turno do agente. Perguntas com menos de 4 chars são puladas. |
111
+ | `[[KB: reindex \| index-chat \| health]]` | manutenção | `runKbTools()`: `reindex` → `indexRag()` (reconstrói chunks de arquivo + chat), `index-chat` → `indexChat()` (re-embeda só as conversas), `health` → status do servidor de embedding (`up`/`down` + modelo). |
112
+
113
+ `[[REMEMBER]]` (produtor) e `[[CONSULT]]` (consumidor) são o complemento escrita/leitura: um agente armazena um aprendizado, e um agente posterior o recupera. O runner também auto-extrai `[[REMEMBER]]` dos resultados de task com `sourceKind: "task"`, e as respostas de chat extraem com `sourceKind: "chat"` (`src/server/runner.ts`, `src/server/collab.ts`).
114
+
115
+ ---
116
+
117
+ ## Diretórios e caminhos indexados 🌠
118
+
119
+ `inRagDirs(p)` decide o que é elegível à memória:
120
+
121
+ | Padrão de caminho | Indexado? | Notas |
122
+ |-------------------|-----------|-------|
123
+ | `.claude/kb/…` | Não | Prompt/taxonomia do próprio agente de KB — nunca exposto |
124
+ | `.claude/skills/…` | Não | A biblioteca de skills — nunca exposta |
125
+ | `.claude/*.md` e `.claude/<sub>/…` | Sim | Outro Markdown de `.claude` (ex.: `BRIEF.md`, `memory.md`) |
126
+ | `DOCS/`, `PO/`, `Reports/`, `specs/`, `issues/` (`*.md`) | Sim | O conjunto `RAG_DIRS` |
127
+ | `mock/…` | Sim | Só arquivos de texto: `.md .html .css .js(x) .ts(x) .txt .json` |
128
+ | `chat/<channel>` | Sim (sintético) | Escrito por `indexChat()`, não é um arquivo real |
129
+ | qualquer outra coisa | Não | — |
130
+
131
+ As transcrições de conversa são agrupadas por `channel` (`room`, `dm:<handle>`, `telegram`), cada linha renderizada como `Operator:` ou `@<handle>:`, e só a **cauda de 400 linhas** por canal é embedada para manter o índice limitado.
132
+
133
+ ---
134
+
135
+ ## Reindex e debounce — mantendo a memória atual
136
+
137
+ A memória se mantém fresca automaticamente; o operador raramente precisa da ação manual **Reindex**. Três caminhos com debounce alimentam `rag_chunk`:
138
+
139
+ | Gatilho | Função | Debounce | Escopo |
140
+ |---------|--------|----------|--------|
141
+ | Um arquivo do workspace muda (edição de agente ou externa) | `scheduleRagReindex(orgId, rel)` → `indexRagFile()` | **2500 ms** por `(org, file)` | Re-embeda só os chunks daquele caminho |
142
+ | Uma mensagem é postada em qualquer canal | `scheduleChatReindex(orgId)` → `indexChat()` | **6000 ms** por org | Re-embeda só os chunks `chat/%` |
143
+ | O file-watcher no worker | POST `/api/sync/file` | **400 ms** por `(org, file)` | Chama `indexFile()`, que por sua vez chama `scheduleRagReindex` |
144
+ | Manual / agente | `indexRag()` (completo), `[[KB: reindex]]`, `[[KB: index-chat]]` | nenhum | Reconstrução completa ou só de chat |
145
+
146
+ Note o debounce em dois estágios nas edições de arquivo: o watcher chokidar do worker coalesce eventos de filesystem ao longo de **400 ms** e faz POST para `/api/sync/file`; o `indexFile()` do lado do servidor então agenda um re-embed de RAG adicional de **2500 ms**. Assim, uma rajada de edições num arquivo resulta num único re-embed, não numa tempestade.
147
+
148
+ ```mermaid
149
+ sequenceDiagram
150
+ participant FS as Disco do workspace
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: add/change/unlink de arquivo
156
+ W->>W: debounce 400ms por (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 por (org,file)
161
+ RAG->>RAG: re-embeda só os chunks deste caminho
162
+ ```
163
+
164
+ Quando um arquivo é deletado, `deindexFile()` chama `deindexRagFile()` para remover os chunks daquele caminho — **o disco é a fonte da verdade**, então arquivos removidos não deixam resíduo de memória. Veja [SYNCED_BLOCKS](./SYNCED_BLOCKS.md) e [ARCHITECTURE](./ARCHITECTURE.md) para o motor de sincronização mais amplo.
165
+
166
+ ---
167
+
168
+ ## Tabelas
169
+
170
+ ### `rag_chunk` (o armazém de memória)
171
+
172
+ | Coluna | Significado |
173
+ |--------|-------------|
174
+ | `id` | UUID |
175
+ | `workspace_id` | escopo de org/workspace — **toda query é filtrada pelo workspace ativo** |
176
+ | `path` | caminho relativo real do arquivo **ou** `chat/<channel>` |
177
+ | `chunk` | o texto do chunk (≤ ~1200 chars) |
178
+ | `vector` | array de floats em JSON, ou `NULL` se nenhum backend de embedding estava no ar |
179
+ | `kb_entry_id` | (camada KB) link para o `kb_entry` tipado que produziu o chunk, se houver |
180
+ | `obsolete` | (camada KB) `1` esconde o chunk do `kbQuery()` ciente de estado |
181
+
182
+ `kb_entry_id` e `obsolete` são adicionados por `ensureKbTables()` para a camada curada; o `retrieve()` puro os ignora. Outras tabelas (`kb_entry`, `kb_query_log`, …) pertencem ao [KB_RAG](./KB_RAG.md).
183
+
184
+ ---
185
+
186
+ ## Passo a passo — rastreando uma recuperação
187
+
188
+ 1. Um turno de agente começa (uma task em `runner.ts`, ou uma resposta de chat em `collab.ts`).
189
+ 2. `assembleAgentPrompt()` monta uma query (título + descrição da task, ou role + instrução) cortada em 400 chars.
190
+ 3. Em paralelo: o contexto do canal é resumido, e `kbQuery(orgId, query, { k: 6 })` recupera memória.
191
+ 4. `kbQuery` seleciona chunks ativos do workspace; num índice vazio, constrói um uma vez via `indexRag()`, depois re-consulta.
192
+ 5. `embed(query, "query")` produz um vetor de consulta (Ollama → llama.cpp → null).
193
+ 6. Com um vetor e chunks vetorizados presentes, as linhas são ordenadas por cosseno; senão roda a pontuação por palavra-chave.
194
+ 7. Os top-`k` chunks viram a seção `Knowledge`; `.claude/memory.md` vira `Relevant memory`.
195
+ 8. O prompt é ajustado à janela de contexto do modelo; seções de baixa prioridade caem primeiro se exceder o orçamento.
196
+ 9. O agente roda. Se emitir `[[REMEMBER …]]`, esse aprendizado é ingerido e fica recuperável na próxima vez.
197
+
198
+ ---
199
+
200
+ ## Exemplos
201
+
202
+ Agente capturando um aprendizado (produtor):
203
+
204
+ ```
205
+ [[REMEMBER type=decision: Auth uses better-auth sessions (30d); do not roll a custom JWT.]]
206
+ ```
207
+
208
+ Agente consultando a memória antes de agir (consumidor):
209
+
210
+ ```
211
+ [[CONSULT: how is the file-upload size limit configured?]]
212
+ ```
213
+
214
+ Agente atualizando o índice durante a execução (manutenção):
215
+
216
+ ```
217
+ [[KB: index-chat]]
218
+ [[KB: health]]
219
+ ```
220
+
221
+ Uma chamada nua de `retrieve()` (semântica quando o servidor de embedding está no ar):
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
+ ## Estados possíveis
231
+
232
+ `retrieve()` e `kbQuery()` reportam um `mode` de recuperação:
233
+
234
+ | `mode` | Significado |
235
+ |--------|-------------|
236
+ | `semantic` | Um backend de embedding estava acessível e existiam chunks vetorizados → ordenação por cosseno |
237
+ | `heuristic` | Sem vetores (backend fora no momento da indexação) → ordenação por sobreposição de termos |
238
+ | `none` | Sem workspace, ou sem chunk algum mesmo após uma tentativa de construção |
239
+
240
+ Saúde do servidor de embedding (via `[[KB: health]]` → `llamaServerStatus()`): `up` (com nome do modelo) ou `down`.
241
+
242
+ Um detalhe auto-curativo: quando o servidor de embedding sobe **depois** de um índice ter sido construído sem vetores, a primeira query semântica reconstrói o índice **uma vez por processo** (guard `autoReindexed`) para que os chunks ganhem vetores — sem reindex manual.
243
+
244
+ ---
245
+
246
+ ## Integrações relacionadas
247
+
248
+ - **[KB_RAG](./KB_RAG.md)** — a camada curada e ciente de estado sobre o mesmo armazém `rag_chunk`.
249
+ - **[KB_AGENT](./KB_AGENT.md)** — Vannevar, dono da curadoria, dedupe e obsolescência.
250
+ - **[AI_ARCHITECTURE](./AI_ARCHITECTURE.md)** — como a memória recuperada é ajustada à janela do prompt.
251
+ - **[MODELS](./MODELS.md)** — servidores locais de embedding & chat (llama.cpp `:8083` / `:8082`, Ollama).
252
+ - **[SYNCED_BLOCKS](./SYNCED_BLOCKS.md)** / **[ARCHITECTURE](./ARCHITECTURE.md)** — o file-watcher e o motor de sincronização.
253
+ - **[TEAM_ROOM](./TEAM_ROOM.md)** / **[DM](./DM.md)** / **[TELEGRAM](./TELEGRAM.md)** — as conversas que alimentam os chunks `chat/<channel>`.
254
+
255
+ ---
256
+
257
+ ## Segurança 🔐
258
+
259
+ - **Isolamento estrito por org.** Toda leitura e toda query filtram por `workspace_id`; só os chunks da org ativa são embedados ou retornados. Não há caminho de recuperação cross-tenant.
260
+ - **Internos nunca expostos.** `inRagDirs()` exclui `.claude/kb/` (prompt/taxonomia do agente de KB) e `.claude/skills/` para que uma query não vaze os internos do próprio sistema.
261
+ - **Endpoint de sync falha fechado.** `/api/sync/file` exige `x-worker-secret` (`CONSTELLA_WORKER_SECRET`) e rejeita com 401 se o segredo não estiver definido — ele aceita um `orgId` arbitrário, então deixá-lo aberto permitiria adulteração de índice cross-tenant.
262
+ - **Segredos são removidos à montante.** O texto de conversa é higienizado antes de ser persistido/ingerido (veja [SECURITY](./SECURITY.md)); transcrições embedadas em `chat/<channel>` herdam essa higienização.
263
+
264
+ ---
265
+
266
+ ## Solução de problemas
267
+
268
+ | Sintoma | Causa provável | Correção |
269
+ |---------|----------------|----------|
270
+ | `mode` é sempre `heuristic` | Nenhum backend de embedding acessível na indexação/consulta | Cheque `[[KB: health]]`; garanta que o servidor llama.cpp de embedding está no ar em `:8083` (ou Ollama em `:11434` com `nomic-embed-text` baixado) — veja [MODELS](./MODELS.md) |
271
+ | Recuperação retorna nada | Índice vazio ou sem workspace | A primeira query auto-constrói via `indexRag()`; se ainda vazio, rode um reindex completo (`[[KB: reindex]]` ou a ação Reindex) |
272
+ | Texto desatualizado continua voltando | Obsolescência da KB curada, não memória | O `retrieve()` puro não tem modelo de estado; use `kbQuery()`/curadoria — veja [KB_RAG](./KB_RAG.md) |
273
+ | Edições não refletidas | Watcher não rodando, ou janela de debounce | O worker deve estar rodando (ele é dono do chokidar); mudanças re-embedam após o debounce de RAG de **2500 ms** |
274
+ | Arquivo deletado ainda recuperado | O deindex não disparou | A deleção passa por `deindexFile → deindexRagFile`; confirme que o worker viu o evento `unlink` |
275
+ | Conversa não lembrada | Reindex de chat pendente ou canal vazio | `scheduleChatReindex` faz debounce de **6000 ms**; force com `[[KB: index-chat]]` |
276
+
277
+ ---
278
+
279
+ ## Links relacionados
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)