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,285 @@
1
+ [← Docs index](./README.md) · [🇧🇷 Português](../pt/TEAM_ROOM.md) · [✦ Constella](../../README.md)
2
+
3
+ # Team Room — The Shared Constellation 🌌🛰️
4
+
5
+ ![](../assets/divider-orbit.svg)
6
+
7
+ The **Team Room** is the single shared channel where the operator and the agent constellation talk in the open. A message must `@mention` a teammate to be answered; up to **three** stars light up per turn, and from there the conversation can relay itself agent-to-agent down a bounded **hand-off chain** until the work is reported back.
8
+
9
+ ## When to use
10
+
11
+ - You want to **address one or more agents in the open** (the whole team can see the thread), as opposed to a private [DM](./DM.md).
12
+ - You want to **kick off a hand-off** — ask QA to test, then have them ask the engineer to fix, then ask Docs to document — without micromanaging every step.
13
+ - You want to turn a chat line into **new work** by asking the CEO (Ada) or a planner to "build / fix / change" something (the spec→issue→plan ritual; see [WORKFLOW](./WORKFLOW.md)).
14
+ - You want the **traceability** of a message back to its board task → issue → goal.
15
+
16
+ Use a **DM** (`dm:<handle>`) when you want a private 1:1 with one agent; use **[Telegram](./TELEGRAM.md)** when you're remote. The Team Room is the public square.
17
+
18
+ ## How it works ✦
19
+
20
+ The Team Room is the `message` channel literally named **`"room"`**. Two server actions in `src/server/chat.ts` drive it, backed by the relay engine in `src/server/collab.ts`:
21
+
22
+ | Function | File | Responsibility |
23
+ |---|---|---|
24
+ | `sendMessage(channel, text, attachments?)` | `chat.ts` | Stores the operator's message, parses `@mentions`, returns up to **3** responder handles. Intercepts slash commands first. |
25
+ | `agentRespond(channel, handle)` | `chat.ts` | Runs one agent's reply via `replyInChannel`, then (in the room) fires the autonomous hand-off chain via `relayRoomMentions`. |
26
+ | `replyInChannel(orgId, ws, channel, a, mode, handoff?)` | `collab.ts` | One real agent turn: builds the prompt, runs the CLI runtime, scrubs secrets, stores the reply, books cost. `mode` = `chat` or `work`. |
27
+ | `relayRoomMentions(orgId, ws, fromHandle, text, depth, fired)` | `collab.ts` | Recursive hand-off: for each teammate the reply `@mentions`, have them **act** in work mode, then recurse on their reply's mention. |
28
+
29
+ The flow is deliberately **chat-first**: nothing is faked. Each agent turn is a real `claude`/`codex` CLI process running with the workspace as its current directory (the FS jail), producing real output, booking real `costEntry` rows.
30
+
31
+ ### Channels at a glance
32
+
33
+ The `message.channel` column distinguishes where a message lives:
34
+
35
+ | `channel` value | Meaning | Responders |
36
+ |---|---|---|
37
+ | `room` | The Team Room (this doc) | The `@mentioned` handles, max 3 |
38
+ | `dm:<handle>` | A private 1:1 with one agent | Always that handle |
39
+ | `telegram` | The isolated remote thread | Always the CEO (`ada`), falls back to the first agent |
40
+
41
+ ## Main flow 🌠
42
+
43
+ ```mermaid
44
+ sequenceDiagram
45
+ actor Op as Operator
46
+ participant Room as Team Room (channel "room")
47
+ participant Send as sendMessage
48
+ participant Resp as agentRespond
49
+ participant Reply as replyInChannel
50
+ participant Relay as relayRoomMentions
51
+
52
+ Op->>Send: "@edsger please test the login flow"
53
+ Send->>Send: mentions() → ["edsger"] (max 3)
54
+ Send->>Room: insert operator message (fromKind=operator)
55
+ Send-->>Resp: responders = ["edsger"]
56
+ Resp->>Reply: edsger, mode "chat"
57
+ Reply->>Room: insert edsger reply ("Failing — @margaret please fix login")
58
+ Resp->>Relay: relayRoomMentions(from=edsger, text, depth 0)
59
+ Relay->>Reply: margaret, mode "work", handoff={from:edsger}
60
+ Reply->>Room: insert margaret reply ("Fixed. @barbara document it")
61
+ Relay->>Reply: barbara, mode "work", handoff={from:margaret}
62
+ Reply->>Room: insert barbara reply (no mention → chain ends)
63
+ ```
64
+
65
+ 1. The operator posts a message. `sendMessage` checks for a leading `/` (slash command) — if so it is dispatched to `runSlashCommand` and the normal path is skipped.
66
+ 2. Otherwise `sendMessage` extracts `@mentions`, keeps only handles that are **real agents**, and slices to the first **3**. If none match, **nothing is posted as a responder set** (`return { responders: [] }`) — the room never holds a dead-end message.
67
+ 3. The operator message is stored (`fromKind: "operator"`), the SSE stream is woken (`wake`), the chat is scheduled for RAG re-index, and — if the message is substantive (≥15 chars) — it is logged as a **decision** (`source: "operator-instruction"`).
68
+ 4. The UI calls `agentRespond` for each responder. Each runs `replyInChannel` in **`chat`** mode (conversational, no file edits) and the reply is stored.
69
+ 5. In the room, `agentRespond` then calls `relayRoomMentions` — the autonomous hand-off chain. Relayed agents run in **`work`** mode (they may read/edit/run files), and the chain continues to whoever they `@mention`.
70
+
71
+ ## Key concepts ✦
72
+
73
+ ### `@mentions` and the max-3 rule
74
+
75
+ A Team Room message is only answered if it `@mentions` a real teammate. The regex is `@([a-z0-9-]+)`:
76
+
77
+ - In `sendMessage`, `mentions(text)` lowercases each handle, filters to known agents, and **`.slice(0, 3)`** — at most three agents respond to a single operator message.
78
+ - The client-side composer blocks an un-mentioned post; the server check is the authoritative guard.
79
+ - `@operator` is a special target: when an agent `@mentions @operator`, no agent fires (operator isn't an agent) but a persistent notification + Inbox item is raised (see [INBOX](./INBOX.md)).
80
+
81
+ ### `chat` mode vs `work` mode
82
+
83
+ `replyInChannel` takes a `mode`:
84
+
85
+ | Mode | Used by | Behaviour |
86
+ |---|---|---|
87
+ | `chat` | The direct response to an operator mention (`agentRespond`) | "Reply in 1-3 sentences as yourself. **Do not modify files.**" Conversational only. |
88
+ | `work` | Relayed hand-offs (`relayRoomMentions`) | "Do what's needed in the workspace now… then post a SHORT update… END by `@mentioning` EXACTLY ONE teammate with a concrete ask." The agent reads/edits/runs files. |
89
+
90
+ In `work` mode, when a hand-off is present the prompt makes it explicit: *"Your teammate `@<from>` just handed off to YOU… that hand-off IS your instruction — there is NO separate operator message."* This fixed the "I don't see a message from the operator" confusion.
91
+
92
+ ### The hand-off chain (relay)
93
+
94
+ `relayRoomMentions` is the autonomous backbone. It is **bounded by design** so a single mention can never fan out into runaway token spend:
95
+
96
+ | Constant | File | Value | Effect |
97
+ |---|---|---|---|
98
+ | `MAX_DEPTH` | `collab.ts` | `2` | The chain stops after 2 hops. |
99
+ | `MAX_FANOUT` | `collab.ts` | `1` | A single message hands off to **one** teammate, not many — it's a chain, not a tree. |
100
+
101
+ Additional relay guards (all in `collab.ts`):
102
+
103
+ - **`fired` set** — each agent is relay-fired at most **once per chain**.
104
+ - **Never re-fire the sender** — the agent who just spoke is excluded (`h !== fromHandle`).
105
+ - **`busyOnBoard`** — an agent with status `working`, or who owns a board task in column `doing`, is **skipped**. A "doing" task is that agent's coordinated unit of work; a parallel relay would have them re-edit the same files (the "same agent keeps touching the same file" chaos).
106
+ - **`agentAtCap`** — an agent over its `dailyCapUsd` budget is skipped (see [MODELS](./MODELS.md) for caps).
107
+ - **`isNoisePing`** — a content-free ping (only mentions/emoji/punctuation, or filler like "on it", "got it", "done") does **not** trigger a hand-off. The stored message is untouched; only the relay is governed.
108
+ - **`sanitizeForRelay`** — collapses emoji runs in the context the next agent sees.
109
+
110
+ ### Decisions
111
+
112
+ A substantive operator line in the room is a directive the agents must honor, so it is recorded in the durable `decision` log (`logDecision`, `src/server/decisions.ts`):
113
+
114
+ - Triggered when `channel === "room"` and `text.trim().length >= 15`.
115
+ - Stored with `by: "operator"`, `source: "operator-instruction"`.
116
+ - Mirrored into the Knowledge Base as a `decision` entry (best-effort), so any agent recalls it via state-aware retrieval (see [KB_RAG](./KB_RAG.md), [MEMORY_RAG](./MEMORY_RAG.md)).
117
+
118
+ The Context Manager surfaces the decision log to every agent regardless of model, keeping continuity across runs.
119
+
120
+ ### Attachments
121
+
122
+ The operator can attach up to **10** files per message (photos / PDF / docs). They are saved under `uploads/` in the workspace (so the agent can read them with its file tools) and stored as JSON on the `message.attachments` column. In `replyInChannel`, the last 6 messages' attachment paths (capped at 12) are injected into the prompt as **data, not instructions** — a filename can't smuggle a directive (`<<attached-files>>` block).
123
+
124
+ ### Task traceability
125
+
126
+ When the **runner** posts a task result to the room (`src/server/runner.ts`), it sets `message.taskId`. `taskRef(taskId)` in `chat.ts` resolves the chip:
127
+
128
+ ```
129
+ task key · issue key · goal title · column
130
+ ```
131
+
132
+ So a room post that came from board work links back to its `task` → `issue` → `goal`, and the column (`triage|todo|doing|blocked|review|done`). See [GOALS_SPECS_ISSUES](./GOALS_SPECS_ISSUES.md).
133
+
134
+ ### Knowledge capture in chat
135
+
136
+ Inside `replyInChannel`, agent replies are scanned for KB tokens (each on its own line, wrapped in double square brackets):
137
+
138
+ - `[[REMEMBER type=<…>: <fact>]]` → ingested into the KB (deduped), token stripped from the shown reply.
139
+ - `[[CONSULT: <question>]]` → answered by Vannevar into the same thread (posted as a `🔎 KB consult` message), available next turn.
140
+ - `[[KB: reindex|index-chat|health]]` → only for the Knowledge agent; results posted as `🛠️ KB tools`.
141
+
142
+ See [KB_AGENT](./KB_AGENT.md) and [KB_RAG](./KB_RAG.md) for the full token grammar.
143
+
144
+ ### Turning chat into new work
145
+
146
+ In `chat` mode, the prompt lets **any** agent turn an explicit build request into new work. If the operator asks to BUILD / IMPLEMENT / ADD / FIX / CHANGE something, the agent confirms briefly and outputs the machine token `[[CREATE_WORK]]` on a final line. `agentRespond` detects `planRequested`, strips the token, and runs `planFromConversation` — the same spec→issue→plan ritual as the first plan, waiting for operator approval. See [WORKFLOW](./WORKFLOW.md) and [PO_AGENT](./PO_AGENT.md).
147
+
148
+ ## Tables 🪐
149
+
150
+ ### `message` (the room's spine — `src/db/schema.ts`)
151
+
152
+ | Column | Type | Notes |
153
+ |---|---|---|
154
+ | `id` | text PK | UUID |
155
+ | `workspaceId` | text | FK → `workspace`, cascade delete |
156
+ | `channel` | text | `room` \| `dm:<handle>` \| `telegram` (default `room`) |
157
+ | `fromKind` | enum | `operator` \| `agent` |
158
+ | `fromHandle` | text | agent handle (NULL for operator) |
159
+ | `text` | text | message body (replies stored ≤4000 chars) |
160
+ | `sources` | json `string[]` | workspace files the agent retrieved (RAG) to produce this reply → source chips |
161
+ | `attachments` | json | `{ name, type, size, path }[]`, ≤10/message |
162
+ | `sessionId` | text | DM session (`chat_session`); NULL for room/Telegram |
163
+ | `taskId` | text | the board task this message reports on → traceability chip |
164
+ | `kind` | text | render hint (e.g. `kb-card`); NULL = normal message |
165
+ | `blocks` | json `string[]` | synced-block slugs a reply proposed an edit to (see [SYNCED_BLOCKS](./SYNCED_BLOCKS.md)) |
166
+ | `createdAt` | timestamp | default `unixepoch()` |
167
+
168
+ Index: `msg_ws_chan_idx` on `(workspaceId, channel)`.
169
+
170
+ ### `decision` (`src/db/schema.ts`)
171
+
172
+ | Column | Notes |
173
+ |---|---|
174
+ | `text` | the decision (operator instruction, ≤400 chars from the room line) |
175
+ | `by` | `operator` or an agent handle |
176
+ | `source` | `operator-instruction` here; also `plan-approve` \| `issue-block` \| `spec-reject` \| `task-done` |
177
+ | `rationale`, `refKey`, `goalId` | optional links for jump-back |
178
+
179
+ ### `messageSummary` & `event`
180
+
181
+ | Table | Role |
182
+ |---|---|
183
+ | `messageSummary` | Compacted summary of older messages per `(workspace, channel, sessionId)` — feeds the Context Manager so long threads don't blow the model's window. Wiped on `clearConversation`. |
184
+ | `event` | Live runtime steps streamed from an agent run (`read`/`create`/`edit`/`run`/`search`/`thinking`/`text`/`done`), grouped by `runId` into Team Room **work-blocks**. Pruned by `pruneRunEvents`. |
185
+
186
+ ## Diagram — mention → responders → hand-off 🛰️
187
+
188
+ ```mermaid
189
+ flowchart TD
190
+ A["Operator posts in room"] --> B{"Starts with '/'?"}
191
+ B -- "yes" --> C["runSlashCommand"]
192
+ B -- "no" --> D["mentions() → real handles"]
193
+ D --> E{"any handle?"}
194
+ E -- "no" --> X["no responders — nothing posted"]
195
+ E -- "yes" --> F["slice(0,3) responders"]
196
+ F --> G["store operator msg + logDecision if ≥15 chars"]
197
+ G --> H["agentRespond per responder (chat mode)"]
198
+ H --> I["relayRoomMentions(depth 0)"]
199
+ I --> J{"reply @mentions a teammate?"}
200
+ J -- "no / noise ping" --> K["chain ends"]
201
+ J -- "yes" --> L{"guards: fired? busyOnBoard? atCap? depth<MAX_DEPTH?"}
202
+ L -- "blocked" --> K
203
+ L -- "ok" --> M["teammate replies in WORK mode (handoff context)"]
204
+ M --> I
205
+ ```
206
+
207
+ ## Step-by-step
208
+
209
+ 1. **Mention a teammate.** Type `@edsger run the e2e suite on the checkout flow` in the room. The composer requires at least one valid `@handle`.
210
+ 2. **Up to 3 respond.** `@margaret @grace @edsger triage this bug` lights up all three; a fourth mention is dropped by `.slice(0, 3)`.
211
+ 3. **Watch the hand-off.** If Edsger replies "Failing — `@margaret` please fix the null check", Margaret is fired in **work** mode with Edsger's message as explicit hand-off context, edits the file, and replies "Fixed — `@barbara` document the change."
212
+ 4. **Chain ends.** After `MAX_DEPTH` (2) hops, or when a reply mentions no one (or only emits a noise ping), the relay stops.
213
+ 5. **Ask the operator.** When an agent needs your call, it ends with `@operator` — you get an Inbox item + notification, not another agent turn.
214
+ 6. **Promote to KB.** Use the per-message action to send a useful line to the Knowledge Base (`sendMessageToKb` → a `note` entry).
215
+ 7. **Clear it.** "Clear conversation" on the Welcome Home calls `clearConversation("room")` — deletes the room's messages, its summary, and its run events.
216
+
217
+ ## Examples
218
+
219
+ ```text
220
+ # A bounded QA → fix → docs chain (3 hops would be capped at 2):
221
+ Operator: @edsger smoke-test the new /settings page
222
+ Edsger: 404 on save — @margaret the PUT handler is missing
223
+ Margaret: Added the handler + test, green now — @barbara update the API doc
224
+ # chain ends at depth 2 (barbara's reply, if it mentions anyone, is NOT relayed)
225
+
226
+ # Address the human for a decision:
227
+ Grace: Two layout options attached — @operator which do you prefer?
228
+ # → Inbox "question" item + notification; no agent fires
229
+
230
+ # Turn a request into new work (any agent, runs the ritual):
231
+ Operator: @ada add a CSV export to the reports page
232
+ Ada: Got it — I'll turn this into a spec + issues for your approval.
233
+ # (Ada emits [[CREATE_WORK]] internally → planFromConversation → CEO Planner)
234
+ ```
235
+
236
+ ## Possible states
237
+
238
+ | State | Where | Meaning |
239
+ |---|---|---|
240
+ | no responders | `sendMessage` returns `{ responders: [] }` | message `@mentioned` no real agent → nothing answers |
241
+ | responding | agent `status = working` | the agent's CLI run is in flight |
242
+ | relayed | `relayRoomMentions` fires a teammate | hand-off in work mode |
243
+ | chain end | `depth >= MAX_DEPTH`, no mention, or noise ping | the autonomous chain stops |
244
+ | skipped (busy) | `busyOnBoard` true | agent already executing a board task → not relay-fired |
245
+ | skipped (cap) | `agentAtCap` true | agent over `dailyCapUsd` → not relay-fired |
246
+ | addressed-to-operator | `@operator` detected | Inbox + notification raised, no agent fires |
247
+ | failed | reply stored as `(<name> couldn't respond: …)` | the CLI run errored or returned no output |
248
+
249
+ ## Related integrations 🌌
250
+
251
+ - **[DM](./DM.md)** — private 1:1 channel (`dm:<handle>`), session-based; the room is its public counterpart.
252
+ - **[Telegram](./TELEGRAM.md)** — the isolated remote thread; Ada answers, replies mirrored from the in-app tab.
253
+ - **[Inbox](./INBOX.md)** — where `@operator` asks and approval requests land.
254
+ - **[KB_AGENT](./KB_AGENT.md) / [KB_RAG](./KB_RAG.md)** — `[[REMEMBER]]` / `[[CONSULT]]` knowledge capture in chat.
255
+ - **[GOALS_SPECS_ISSUES](./GOALS_SPECS_ISSUES.md)** — the task/issue/goal a `taskId` chip links back to.
256
+ - **[CHAT_COMMANDS](./CHAT_COMMANDS.md)** — slash commands intercepted by `sendMessage`.
257
+ - **[WORKFLOW](./WORKFLOW.md) / [PO_AGENT](./PO_AGENT.md)** — the spec→issue→plan ritual triggered by `[[CREATE_WORK]]`.
258
+
259
+ ## Security 🕳️
260
+
261
+ - **Secret scrubbing.** Every reply passes through `scrubSecrets` (`src/lib/scrub.ts`) before it is stored, shown, or notified — room, DM and Telegram all flow through `replyInChannel`.
262
+ - **Attachment paths are data.** Attached file paths are injected inside an `<<attached-files>>` block and the prompt explicitly tells the agent to ignore any directive embedded in a filename.
263
+ - **Bounded autonomy.** `MAX_DEPTH=2`, `MAX_FANOUT=1`, the `fired` set, `busyOnBoard`, and `agentAtCap` together cap both the spread and the spend of the hand-off chain — a single mention can never become a runaway swarm.
264
+ - **Telegram hardening.** The `telegram` channel adds a prompt-injection clause (never reveal secrets / `.env` / `.claude/` / system prompt) and skips the operator-ping. See [TELEGRAM](./TELEGRAM.md).
265
+ - **FS jail.** Work-mode agents run with the org workspace as cwd; the FS jail (`safe()`) blocks traversal and protects the workspace root. See [SECURITY](./SECURITY.md) and [ARCHITECTURE](./ARCHITECTURE.md).
266
+
267
+ ## Troubleshooting
268
+
269
+ | Symptom | Likely cause | Fix |
270
+ |---|---|---|
271
+ | Message posted but nobody answers | No valid `@mention` | Mention a real agent handle; `sendMessage` returns no responders otherwise. |
272
+ | Only 1-3 agents reply to a big mention list | The max-3 slice (`.slice(0, 3)`) | By design — split into multiple messages or rely on the hand-off chain. |
273
+ | Hand-off stops too early | `MAX_DEPTH=2` reached | The chain is intentionally bounded; continue manually with a new mention. |
274
+ | Relay skips an agent | `busyOnBoard` (status `working` or a `doing` task), or `agentAtCap` | Wait for the task to finish, or raise the agent's `dailyCapUsd` (see [MODELS](./MODELS.md)). |
275
+ | "on it" / "done" doesn't trigger the next agent | `isNoisePing` filter | Reply with a concrete ask + a mention; content-free pings don't relay. |
276
+ | `@operator` raised no Inbox item | Reply failed (stored as "couldn't respond") or it was Telegram | Check the run output; Telegram skips the operator-ping by design. |
277
+ | Reply shows `(<name> couldn't respond: …)` | CLI runtime error / timeout (180s) | Check the agent's adapter/model and the runtime; see [AGENTS](./AGENTS.md), [MODELS](./MODELS.md), [TROUBLESHOOTING](./TROUBLESHOOTING.md). |
278
+
279
+ ## Related links
280
+
281
+ - [DM](./DM.md) · [Telegram](./TELEGRAM.md) · [Inbox](./INBOX.md)
282
+ - [Agents](./AGENTS.md) · [KB Agent](./KB_AGENT.md) · [PO Agent](./PO_AGENT.md)
283
+ - [Workflow](./WORKFLOW.md) · [Goals, Specs & Issues](./GOALS_SPECS_ISSUES.md) · [Chat Commands](./CHAT_COMMANDS.md)
284
+ - [KB & RAG](./KB_RAG.md) · [Memory & RAG](./MEMORY_RAG.md) · [Synced Blocks](./SYNCED_BLOCKS.md)
285
+ - [Architecture](./ARCHITECTURE.md) · [AI Architecture](./AI_ARCHITECTURE.md) · [Security](./SECURITY.md) · [Troubleshooting](./TROUBLESHOOTING.md)
@@ -0,0 +1,294 @@
1
+ [← Docs index](./README.md) · [🇧🇷 Português](../pt/TELEGRAM.md) · [✦ Constella](../../README.md)
2
+
3
+ # 🛰️ Telegram — the pocket bridge to your constellation
4
+
5
+ ![](../assets/divider-orbit.svg)
6
+
7
+ A single private Telegram chat becomes a remote bridge to your agent-company: talk to the CEO (Ada), approve plans, start or pause 24/7 execution, kick off new work, and query the Knowledge Base — all from your phone, while the control ship keeps running headless.
8
+
9
+ > Source of truth: `src/server/telegram.ts` (ingest + commands + callbacks), `src/lib/telegram.ts` (Bot API client + token shape), `bin/worker.mjs` (long-poll loop), `src/app/api/telegram/poll/route.ts` (worker-only entry), `src/server/actions/profile-actions.ts` (`connectTelegram`), `src/lib/scrub.ts` (secret scrub).
10
+
11
+ ---
12
+
13
+ ## 2. What it is
14
+
15
+ A bidirectional Telegram bot, scoped to **one** allowlisted private chat per workspace. Inbound messages reach the CEO agent over an **isolated** channel (`telegram`), and a set of slash-commands + inline buttons act as a real remote control over the work lifecycle. Outbound: agent replies typed in the in-app Telegram tab are mirrored back to the phone, so the thread stays single regardless of where you type.
16
+
17
+ ## 3. When to use 🌠
18
+
19
+ - You are away from the control ship but want to **check status**, **approve a pending plan**, or **flip 24/7 execution** on/off.
20
+ - You want to **start new work** from a one-line brief (`/new …`) and let the CEO turn it into specs · issues · TODOs.
21
+ - You want to **ask the Knowledge Base** a question (`/kb …`) without opening the app.
22
+ - You want to **chat with the CEO** (Ada) like any DM, but from your phone.
23
+
24
+ Telegram is optional. It is a native plugin and the integration toggle (`settings.integrations.telegram`) defaults **ON**, but nothing happens until you connect a bot token + chat id from the Profile screen. If unconfigured, every Telegram path is an honest no-op.
25
+
26
+ ## 4. How it works 🌌
27
+
28
+ ### The two processes
29
+
30
+ Constella runs a **web** process (Next.js) and a separate **worker** (`bin/worker.mjs`). Telegram polling lives in the worker:
31
+
32
+ - The worker runs `telegramLoop()` — an infinite loop that POSTs `BASE/api/telegram/poll` with the privileged `x-worker-secret` header.
33
+ - That route (`src/app/api/telegram/poll/route.ts`) is **fail-closed**: it requires `CONSTELLA_WORKER_SECRET` and returns `401` if the header is missing/wrong. On `401`, the worker backs off 30s (treated as "not configured / secret mismatch").
34
+ - The route calls `pollTelegram()` (in `src/server/telegram.ts`), which does the real work, then returns `{ ok, updates }`.
35
+
36
+ ### Long-polling, per workspace
37
+
38
+ `pollTelegram()` iterates **every** workspace. For each one it:
39
+
40
+ 1. Skips the workspace if the integration is off (`integrationOn(settings.integrations, "telegram")` — see `src/lib/integrations.ts`).
41
+ 2. Loads the vaulted config via `getTelegramConfig(ws.id)`; skips if absent or the token is malformed.
42
+ 3. Registers the bot's `/` command menu **once per bot per process** (`tgSetMyCommands`, guarded by an in-memory `commandsRegistered` set).
43
+ 4. Calls `tgGetUpdates(token, offset)` — Telegram `getUpdates` with `timeout=25` (a ~25s **server-side long-poll**) and `allowed_updates=["message","callback_query"]`.
44
+ 5. Ingests each update, advances the cursor (`maxId = update_id + 1`), and persists it back to `settings.telegram.offset`.
45
+
46
+ The worker leaves a brief 1s gap between long-polls; on error it backs off 5s.
47
+
48
+ ### The allowlist 🕳️
49
+
50
+ Only the **one registered private chat** may drive the bot. In `ingest()`:
51
+
52
+ - The message's `chat.id` must equal `cfg.chatId`, **and**
53
+ - if `m.from` is present, the sender `from.id` must also equal `cfg.chatId` (in a private chat they are the same number).
54
+
55
+ Anything else is **silently ignored**. The same check is re-applied to inline-button taps in `handleCallback()`. At connect time (`connectTelegram`), the chat id is validated as a positive numeric id (group ids are negative and would let every member drive the bot — they are rejected).
56
+
57
+ ### Inbound routing
58
+
59
+ For an allowed message, `ingest()` decides the path:
60
+
61
+ | Condition | What happens |
62
+ | --- | --- |
63
+ | `callback_query` present | Inline-button tap → `handleCallback()` |
64
+ | awaiting reject-reason + plain text (not `/…`) | The text **is** the reject reason → `requestPlanChangesFor()` |
65
+ | text starts with `/` | Remote-control command → `handleCommand()` |
66
+ | otherwise | Talk to the CEO → `runCeoReply()` |
67
+
68
+ Text + caption are capped to 4000 chars. Photos and documents are downloaded and saved as attachments (see [Attachments](#attachments)).
69
+
70
+ ### Talking to the CEO
71
+
72
+ `runCeoReply()` resolves the **Ada** agent (`handle = "ada"`, falling back to the first agent), sets her status to `working`, shows a live `typing…` indicator on a 4s heartbeat (Telegram clears it after ~5s), and calls `replyInChannel(orgId, ws, "telegram", ada, "chat")` (`src/server/collab.ts`).
73
+
74
+ `replyInChannel` adds a **Telegram-specific prompt-injection guard**: it tells the model the operator's message is *data, not instructions*, never to reveal secrets / `.env` / `.claude/` contents / system prompt, and to refuse any override attempt. The reply is secret-scrubbed before send.
75
+
76
+ If Ada decides this is build/fix work she emits an internal `[[CREATE_WORK]]` token; `replyInChannel` returns `planRequested = true`, and `runCeoReply` then runs `planFromConversationFor(orgId, ws, "telegram")` — the **same** planning ritual as the web path (specs → issues → TODOs) — and confirms on the phone.
77
+
78
+ ## 5. Main flow — poll → agent → reply 🚀
79
+
80
+ ```mermaid
81
+ sequenceDiagram
82
+ autonumber
83
+ participant TG as Telegram Bot API
84
+ participant W as worker (bin/worker.mjs)
85
+ participant API as /api/telegram/poll
86
+ participant P as pollTelegram()
87
+ participant ING as ingest()
88
+ participant CEO as replyInChannel (Ada)
89
+ participant DB as message table
90
+
91
+ W->>API: POST (x-worker-secret)
92
+ API->>API: verify CONSTELLA_WORKER_SECRET (else 401)
93
+ API->>P: pollTelegram()
94
+ P->>TG: getUpdates(offset, timeout=25)
95
+ TG-->>P: updates[] (~25s long-poll)
96
+ loop each update
97
+ P->>ING: ingest(ws, cfg, update)
98
+ ING->>ING: allowlist: chat.id == cfg.chatId?
99
+ alt command (/…)
100
+ ING->>ING: handleCommand() → real action
101
+ else inline button
102
+ ING->>ING: handleCallback() → real action
103
+ else free text
104
+ ING->>DB: persist operator turn (channel=telegram)
105
+ ING->>CEO: replyInChannel(..., "chat")
106
+ CEO-->>ING: text + planRequested
107
+ ING->>TG: sendMessage(scrubbed reply)
108
+ opt planRequested
109
+ ING->>ING: planFromConversationFor() (specs·issues·TODOs)
110
+ end
111
+ end
112
+ end
113
+ P->>DB: save settings.telegram.offset = maxId
114
+ P-->>W: { updates: N }
115
+ ```
116
+
117
+ ## 6. Key concepts ✦
118
+
119
+ - **Isolated channel.** Telegram lives on its own `telegram` channel — never `room` or `dm:<handle>` — so phone chatter never bleeds context into the team room or DMs. (`TG_CHANNEL = "telegram"`.)
120
+ - **Vaulted credentials.** The bot token + chat id are stored encrypted in the vault under ref `telegram_bot` as JSON `{botToken, chatId, allowedName}`. They are never persisted in plaintext settings.
121
+ - **Offset cursor.** `settings.telegram.offset` is the Telegram update cursor; advancing it acknowledges processed updates so they are never re-delivered.
122
+ - **Reject-reason wait.** An in-memory `awaitingReason` set remembers that you tapped the **↩️ Reject** button; your next free-text message becomes the reason. In-memory is fine — a server restart simply drops the pending wait (re-tap to retry).
123
+ - **Command-menu registration.** `commandsRegistered` ensures `setMyCommands` runs once per bot per process — even bots connected before that feature existed get their menu on the next poll.
124
+ - **Secret scrub.** Every outbound string passes through `scrubSecrets(text, [cfg.botToken])` (`src/lib/scrub.ts`) — redacting the bot token, the standard env secrets, and high-confidence credential shapes (OpenAI/Anthropic `sk-…`, GitHub tokens, AWS keys, JWTs, PEM keys, Constella `cn_…` PATs, and even other Telegram tokens).
125
+
126
+ ## 7. Tables
127
+
128
+ ### Telegram slash commands (`handleCommand`)
129
+
130
+ | Command | Aliases | Action |
131
+ | --- | --- | --- |
132
+ | `/help` | — | Show the remote-control help text |
133
+ | `/status` | — | `planStatusFor(ws)` — quick status |
134
+ | `/review` | — | `reviewSummaryFor(ws)` — plan / issues / tasks summary |
135
+ | `/tasks` | — | `tasksListFor(ws)` — what's in flight now |
136
+ | `/approve` | — | `approvePlanFor()` — approve pending plan, queue tasks |
137
+ | `/start_execution` | `/start`, `/run` | `approvePlanFor()` + `setAuto247For(true)` — approve and run 24/7 |
138
+ | `/pause` | `/stop` | `setAuto247For(false)` — pause 24/7 |
139
+ | `/resume` | — | `setAuto247For(true)` — resume 24/7 |
140
+ | `/reject <reason>` | — | `requestPlanChangesFor()` — send plan back to the CEO |
141
+ | `/new <brief>` | `/new-work`, `/new-goal` | Seed an operator turn + run the CEO → goal · specs · issues |
142
+ | `/cancel` | — | `cancelGoalFor()` on the latest active goal — stops execution |
143
+ | `/archive` | — | `archiveGoalFor()` on the latest active goal — zips + parks it |
144
+ | `/kb <question>` | `/ask-kb` | `kbAnswer(orgId, q)` — ask the Knowledge Base |
145
+ | *(unknown)* | — | Replies "Unknown command" + help |
146
+
147
+ > The `/` menu Telegram shows is registered from `TG_BOT_COMMANDS` in `src/lib/telegram.ts` and must mirror `handleCommand`. The displayed menu omits aliases.
148
+
149
+ ### Inline-button callbacks (`handleCallback`)
150
+
151
+ | `callback_data` | Action | Toast | One-shot? |
152
+ | --- | --- | --- | --- |
153
+ | `approve_plan` | `approvePlanFor()` | ✅ Approved | yes (keyboard stripped) |
154
+ | `start_exec` | `approvePlanFor()` + `setAuto247For(true)` | ▶️ Executing | yes |
155
+ | `reject_plan` | `requestPlanChangesFor()` + arm reject-reason wait | ↩️ Sent back | yes |
156
+ | `review` | `reviewSummaryFor(ws)` | 📝 Review | no |
157
+ | `status` | `planStatusFor(ws)` | 📊 Status | no |
158
+ | `pause` | `setAuto247For(false)` | ⏸ Paused | no |
159
+ | `resume` | `setAuto247For(true)` | ▶️ Resumed | no |
160
+ | *(unknown)* | — | Unknown action | — |
161
+
162
+ One-shot actions (`approve_plan` / `start_exec` / `reject_plan`) have their inline keyboard stripped via `tgClearButtons` so a second tap can't re-fire them.
163
+
164
+ ### Vaulted config & settings
165
+
166
+ | Where | Key / column | Meaning |
167
+ | --- | --- | --- |
168
+ | vault | ref `telegram_bot` | encrypted JSON `{botToken, chatId, allowedName}` |
169
+ | `workspace.settings` | `integrations.telegram` | integration toggle (defaults `true`) |
170
+ | `workspace.settings` | `telegram.offset` | Telegram `getUpdates` cursor |
171
+
172
+ ### `message` rows written by Telegram
173
+
174
+ | Column | Value on the Telegram path |
175
+ | --- | --- |
176
+ | `channel` | `"telegram"` (constant `TG_CHANNEL`) |
177
+ | `fromKind` | `"operator"` (inbound) / `"agent"` (replies) |
178
+ | `fromHandle` | `"system"` for control replies; Ada's handle for CEO replies |
179
+ | `text` | message text or `"(attachment)"`, capped 4000 |
180
+ | `attachments` | saved file descriptors, or `null` |
181
+
182
+ ## 8. Bot API surface 🪐
183
+
184
+ All HTTP calls go through `src/lib/telegram.ts` against `https://api.telegram.org`. Every helper first checks `isTelegramToken()` — token shape `^\d{6,}:[A-Za-z0-9_-]{30,}$` — so a malformed value can never repoint the request URL.
185
+
186
+ | Helper | Bot API method | Purpose |
187
+ | --- | --- | --- |
188
+ | `tgGetMe` | `getMe` | verify token → `@username` (at connect time) |
189
+ | `tgSetMyCommands` | `setMyCommands` | register the `/` command menu |
190
+ | `tgGetUpdates` | `getUpdates` | long-poll (`timeout=25`, `message` + `callback_query`) |
191
+ | `tgGetFile` | `getFile` + `/file/bot…` | download a photo/document → bytes |
192
+ | `tgSendChatAction` | `sendChatAction` | `typing…` indicator |
193
+ | `sendTelegramTo` | `sendMessage` | plain-text reply (no Markdown) |
194
+ | `sendTelegram` | `sendMessage` | notification send (Markdown) |
195
+ | `sendTelegramButtons` | `sendMessage` + `inline_keyboard` | message with remote-control buttons |
196
+ | `tgAnswerCallback` | `answerCallbackQuery` | ACK a button tap + optional toast |
197
+ | `tgClearButtons` | `editMessageReplyMarkup` | strip a one-shot keyboard |
198
+
199
+ Agent replies use `sendTelegramTo` (plain text, no `parse_mode`) on purpose — arbitrary content (issue titles, code, workspace names) must never break the send or be parsed as Markdown.
200
+
201
+ ## 9. Attachments
202
+
203
+ Photos and documents on an inbound message are downloaded and stored in the workspace:
204
+
205
+ - A short per-message download id is generated (`uid().slice(0,8)`).
206
+ - Each file is fetched via `tgGetFile`, its name sanitized (`[^\w.\-]` → `_`, last 60 chars), and written to `uploads/tg-<dlId>/<safe-name>` under the **org root** (`orgRoot(ws.orgId)`).
207
+ - An attachment descriptor `{name, type, size, path}` is appended to the persisted `message.attachments`.
208
+ - Photos use the largest available size; documents keep their original `file_name` and `mime_type`.
209
+
210
+ A message with neither text nor any saved attachment is dropped.
211
+
212
+ ## 10. Step-by-step — connect & drive 🛰️
213
+
214
+ ### Connect the bot (`connectTelegram`)
215
+
216
+ 1. Create a bot with Telegram's **@BotFather** and copy its token.
217
+ 2. Find your **personal numeric chat id** (a private chat — not a group).
218
+ 3. In Constella's **Profile** screen, enter the token + chat id (and an optional display name).
219
+ 4. `connectTelegram()` validates the token shape, rejects non-positive/group ids, calls `tgGetMe` to verify the token actually works, then stores `{botToken, chatId, allowedName}` in the vault and registers the `/` menu (`tgSetMyCommands`).
220
+ 5. The worker picks it up on its next poll — message the bot to confirm.
221
+
222
+ > `telegramStatus()` powers the in-app card and masks the chat id (`12•••89`). `disconnectTelegram()` deletes the vault ref `telegram_bot`.
223
+
224
+ ### Drive it from the phone
225
+
226
+ ```text
227
+ /status → quick status
228
+ /review → full plan / issues / tasks summary
229
+ /new a billing page with checkout
230
+ → CEO drafts goal · specs · issues · TODOs
231
+ /approve → queue tasks
232
+ /start_execution → approve + 24/7 ON
233
+ /pause /resume → flip 24/7
234
+ /reject use Stripe not PayPal→ send plan back with a reason
235
+ /cancel /archive → stop / park the active goal
236
+ /kb how does auth work? → ask the Knowledge Base
237
+ just talk normally → chat with the CEO (Ada)
238
+ ```
239
+
240
+ ### Mirroring (in-app → phone)
241
+
242
+ When you reply from the **in-app Telegram tab**, `src/server/chat.ts` calls `mirrorToTelegram(workspace.id, reply)`. It loads the vaulted config and sends the scrubbed reply out to the real chat — so the bot conversation stays a single thread regardless of where you typed.
243
+
244
+ ## 11. Possible states
245
+
246
+ | State | Symptom | Cause |
247
+ | --- | --- | --- |
248
+ | **Unconfigured** | Bot never replies; poll route returns `401` then 30s back-off | no `telegram_bot` vault secret |
249
+ | **Integration off** | Configured but ignored | `settings.integrations.telegram = false` |
250
+ | **Connected** | Replies, commands and buttons work | valid token + matching chat id |
251
+ | **Foreign chat** | Silence | sender / chat id ≠ `cfg.chatId` (silently ignored) |
252
+ | **Awaiting reason** | Next plain message recorded as reject reason | you tapped **↩️ Reject** |
253
+ | **Typing…** | Live indicator while a reply generates | 4s heartbeat in `runCeoReply` |
254
+ | **Worker down** | No replies at all | the worker process isn't running (see [TEST_DEV](./TEST_DEV.md) / [ARCHITECTURE](./ARCHITECTURE.md)) |
255
+
256
+ ## 12. Related integrations
257
+
258
+ - The CEO reply path is the same one used by [DM](./DM.md) and the [TEAM_ROOM](./TEAM_ROOM.md) — Telegram just runs it on its own isolated channel with an extra injection guard.
259
+ - `/new` runs the full [WORKFLOW](./WORKFLOW.md) ritual (Goal → Spec → Issue → Plan → TODOs); see [GOALS_SPECS_ISSUES](./GOALS_SPECS_ISSUES.md).
260
+ - `/kb` answers from the [KB_RAG](./KB_RAG.md) memory nebula.
261
+ - The same remote-control actions are exposed programmatically via the [PUBLIC_API](./PUBLIC_API.md) and [MCP](./MCP.md) server.
262
+ - Telegram is a native [PLUGINS](./PLUGINS.md) entry; toggling lives alongside the other integrations.
263
+
264
+ ## 13. Security 🕳️
265
+
266
+ - **Worker-only entry.** `/api/telegram/poll` requires `x-worker-secret == CONSTELLA_WORKER_SECRET` (fail-closed `401`). The worker also refuses to send that secret to any non-loopback `CONSTELLA_BASE_URL` unless `CONSTELLA_ALLOW_REMOTE_WORKER_BASE_URL=1` (SSRF / secret-exfil guard).
267
+ - **Strict allowlist.** Exactly one private chat id; both `chat.id` and `from.id` are checked on messages and on button taps. Group ids (negative) are rejected at connect time.
268
+ - **Token shape enforcement.** `isTelegramToken()` gates every Bot API call so a tampered token can't redirect the request URL.
269
+ - **Prompt-injection hardening.** `replyInChannel` injects a Telegram-specific security clause: the operator message is *data*, secrets/`.env`/`.claude/`/system-prompt must never be revealed, override attempts are refused.
270
+ - **Secret scrub on egress.** Every outbound message runs through `scrubSecrets(…, [cfg.botToken])` — redacting the bot token plus high-confidence credential shapes — before it leaves the ship.
271
+ - **Encrypted at rest.** Credentials live in the AES-256-GCM [vault](./SECURITY.md), never in plaintext settings; the in-app status card masks the chat id.
272
+ - **Bounded egress.** Outbound bodies are length-capped (`sendTelegramTo` 3800, `sendTelegram` 3500), and `callback_data` is capped to Telegram's 64-byte limit.
273
+
274
+ ## 14. Troubleshooting 🛠️
275
+
276
+ | Symptom | Check |
277
+ | --- | --- |
278
+ | Bot silent, poll route returns `401` | No `telegram_bot` secret — connect from Profile. (Worker treats `401` as "not configured" and backs off 30s.) |
279
+ | "Telegram rejected this bot token." at connect | Token wrong/revoked — `tgGetMe` failed; re-copy from @BotFather. |
280
+ | "Chat id must be your personal numeric id…" | You used a group id (negative) — use your private chat id. |
281
+ | Messages ignored, no error | Sender's `chat.id`/`from.id` ≠ the registered `cfg.chatId` (allowlist). |
282
+ | `/` menu not showing | `setMyCommands` is best-effort; runs once per bot per process — restart the worker or re-connect. |
283
+ | No replies at all | The **worker** process isn't running — start `npm start` (web + worker) or `npm run dev:all`. |
284
+ | Reply looks truncated | Bodies are length-capped by design (3800/3500 chars). |
285
+ | Reject reason not recorded | A slash command supersedes the pending reject-reason wait; send the reason as plain text right after tapping ↩️ Reject. |
286
+
287
+ ## 15. Related links
288
+
289
+ - [DM](./DM.md) · [TEAM_ROOM](./TEAM_ROOM.md) · [CHAT_COMMANDS](./CHAT_COMMANDS.md)
290
+ - [WORKFLOW](./WORKFLOW.md) · [GOALS_SPECS_ISSUES](./GOALS_SPECS_ISSUES.md)
291
+ - [KB_RAG](./KB_RAG.md) · [KB_AGENT](./KB_AGENT.md)
292
+ - [PUBLIC_API](./PUBLIC_API.md) · [MCP](./MCP.md) · [PLUGINS](./PLUGINS.md)
293
+ - [ARCHITECTURE](./ARCHITECTURE.md) · [AI_ARCHITECTURE](./AI_ARCHITECTURE.md) · [SECURITY](./SECURITY.md)
294
+ - [CONFIGURATION](./CONFIGURATION.md) · [TROUBLESHOOTING](./TROUBLESHOOTING.md) · [FAQ](./FAQ.md)