constellai 0.3.5 → 0.3.7

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 (300) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +2 -2
  3. package/.next/prerender-manifest.json +3 -3
  4. package/.next/server/app/(app)/activity/page.js +2 -2
  5. package/.next/server/app/(app)/activity/page.js.nft.json +1 -1
  6. package/.next/server/app/(app)/activity/page_client-reference-manifest.js +1 -1
  7. package/.next/server/app/(app)/agents/[handle]/page.js +2 -2
  8. package/.next/server/app/(app)/agents/[handle]/page.js.nft.json +1 -1
  9. package/.next/server/app/(app)/agents/[handle]/page_client-reference-manifest.js +1 -1
  10. package/.next/server/app/(app)/code/page.js +2 -2
  11. package/.next/server/app/(app)/code/page.js.nft.json +1 -1
  12. package/.next/server/app/(app)/code/page_client-reference-manifest.js +1 -1
  13. package/.next/server/app/(app)/config/page.js +2 -2
  14. package/.next/server/app/(app)/config/page.js.nft.json +1 -1
  15. package/.next/server/app/(app)/config/page_client-reference-manifest.js +1 -1
  16. package/.next/server/app/(app)/costs/page.js +2 -2
  17. package/.next/server/app/(app)/costs/page.js.nft.json +1 -1
  18. package/.next/server/app/(app)/costs/page_client-reference-manifest.js +1 -1
  19. package/.next/server/app/(app)/cron/page.js +2 -2
  20. package/.next/server/app/(app)/cron/page.js.nft.json +1 -1
  21. package/.next/server/app/(app)/cron/page_client-reference-manifest.js +1 -1
  22. package/.next/server/app/(app)/dashboard/page.js +2 -2
  23. package/.next/server/app/(app)/dashboard/page.js.nft.json +1 -1
  24. package/.next/server/app/(app)/dashboard/page_client-reference-manifest.js +1 -1
  25. package/.next/server/app/(app)/design/page.js +44 -44
  26. package/.next/server/app/(app)/design/page.js.nft.json +1 -1
  27. package/.next/server/app/(app)/design/page_client-reference-manifest.js +1 -1
  28. package/.next/server/app/(app)/docs/[id]/page.js +2 -2
  29. package/.next/server/app/(app)/docs/[id]/page.js.nft.json +1 -1
  30. package/.next/server/app/(app)/docs/[id]/page_client-reference-manifest.js +1 -1
  31. package/.next/server/app/(app)/docs/page.js +2 -2
  32. package/.next/server/app/(app)/docs/page.js.nft.json +1 -1
  33. package/.next/server/app/(app)/docs/page_client-reference-manifest.js +1 -1
  34. package/.next/server/app/(app)/github/page.js +2 -2
  35. package/.next/server/app/(app)/github/page.js.nft.json +1 -1
  36. package/.next/server/app/(app)/github/page_client-reference-manifest.js +1 -1
  37. package/.next/server/app/(app)/goals/page.js +2 -2
  38. package/.next/server/app/(app)/goals/page.js.nft.json +1 -1
  39. package/.next/server/app/(app)/goals/page_client-reference-manifest.js +1 -1
  40. package/.next/server/app/(app)/inbox/page.js +2 -2
  41. package/.next/server/app/(app)/inbox/page.js.nft.json +1 -1
  42. package/.next/server/app/(app)/inbox/page_client-reference-manifest.js +1 -1
  43. package/.next/server/app/(app)/knowledge/page.js +3 -3
  44. package/.next/server/app/(app)/knowledge/page.js.nft.json +1 -1
  45. package/.next/server/app/(app)/knowledge/page_client-reference-manifest.js +1 -1
  46. package/.next/server/app/(app)/models/page.js +2 -2
  47. package/.next/server/app/(app)/models/page.js.nft.json +1 -1
  48. package/.next/server/app/(app)/models/page_client-reference-manifest.js +1 -1
  49. package/.next/server/app/(app)/notifications/page.js +2 -2
  50. package/.next/server/app/(app)/notifications/page.js.nft.json +1 -1
  51. package/.next/server/app/(app)/notifications/page_client-reference-manifest.js +1 -1
  52. package/.next/server/app/(app)/org/page.js +4 -4
  53. package/.next/server/app/(app)/org/page.js.nft.json +1 -1
  54. package/.next/server/app/(app)/org/page_client-reference-manifest.js +1 -1
  55. package/.next/server/app/(app)/organizations/page.js +2 -2
  56. package/.next/server/app/(app)/organizations/page.js.nft.json +1 -1
  57. package/.next/server/app/(app)/organizations/page_client-reference-manifest.js +1 -1
  58. package/.next/server/app/(app)/page.js +3 -3
  59. package/.next/server/app/(app)/page.js.nft.json +1 -1
  60. package/.next/server/app/(app)/page_client-reference-manifest.js +1 -1
  61. package/.next/server/app/(app)/planner/page.js +2 -2
  62. package/.next/server/app/(app)/planner/page.js.nft.json +1 -1
  63. package/.next/server/app/(app)/planner/page_client-reference-manifest.js +1 -1
  64. package/.next/server/app/(app)/plugins/page.js +2 -2
  65. package/.next/server/app/(app)/plugins/page.js.nft.json +1 -1
  66. package/.next/server/app/(app)/plugins/page_client-reference-manifest.js +1 -1
  67. package/.next/server/app/(app)/pm/page.js +2 -2
  68. package/.next/server/app/(app)/pm/page.js.nft.json +1 -1
  69. package/.next/server/app/(app)/pm/page_client-reference-manifest.js +1 -1
  70. package/.next/server/app/(app)/prepare-deploy/page.js +6 -6
  71. package/.next/server/app/(app)/prepare-deploy/page.js.nft.json +1 -1
  72. package/.next/server/app/(app)/prepare-deploy/page_client-reference-manifest.js +1 -1
  73. package/.next/server/app/(app)/profile/page.js +2 -2
  74. package/.next/server/app/(app)/profile/page.js.nft.json +1 -1
  75. package/.next/server/app/(app)/profile/page_client-reference-manifest.js +1 -1
  76. package/.next/server/app/(app)/pulse/page.js +2 -2
  77. package/.next/server/app/(app)/pulse/page.js.nft.json +1 -1
  78. package/.next/server/app/(app)/pulse/page_client-reference-manifest.js +1 -1
  79. package/.next/server/app/(app)/reports/[id]/page.js +3 -3
  80. package/.next/server/app/(app)/reports/[id]/page.js.nft.json +1 -1
  81. package/.next/server/app/(app)/reports/[id]/page_client-reference-manifest.js +1 -1
  82. package/.next/server/app/(app)/reports/page.js +2 -2
  83. package/.next/server/app/(app)/reports/page.js.nft.json +1 -1
  84. package/.next/server/app/(app)/reports/page_client-reference-manifest.js +1 -1
  85. package/.next/server/app/(app)/routines/page.js +2 -2
  86. package/.next/server/app/(app)/routines/page.js.nft.json +1 -1
  87. package/.next/server/app/(app)/routines/page_client-reference-manifest.js +1 -1
  88. package/.next/server/app/(app)/search/page.js +2 -2
  89. package/.next/server/app/(app)/search/page.js.nft.json +1 -1
  90. package/.next/server/app/(app)/search/page_client-reference-manifest.js +1 -1
  91. package/.next/server/app/(app)/security/page.js +2 -2
  92. package/.next/server/app/(app)/security/page.js.nft.json +1 -1
  93. package/.next/server/app/(app)/security/page_client-reference-manifest.js +1 -1
  94. package/.next/server/app/(app)/skills/page.js +2 -2
  95. package/.next/server/app/(app)/skills/page.js.nft.json +1 -1
  96. package/.next/server/app/(app)/skills/page_client-reference-manifest.js +1 -1
  97. package/.next/server/app/(app)/tasks/page.js +2 -2
  98. package/.next/server/app/(app)/tasks/page.js.nft.json +1 -1
  99. package/.next/server/app/(app)/tasks/page_client-reference-manifest.js +1 -1
  100. package/.next/server/app/(app)/test-dev/page.js +2 -2
  101. package/.next/server/app/(app)/test-dev/page.js.nft.json +1 -1
  102. package/.next/server/app/(app)/test-dev/page_client-reference-manifest.js +1 -1
  103. package/.next/server/app/(app)/update/page.js +3 -3
  104. package/.next/server/app/(app)/update/page.js.nft.json +1 -1
  105. package/.next/server/app/(app)/update/page_client-reference-manifest.js +1 -1
  106. package/.next/server/app/(auth)/login/page.js +2 -2
  107. package/.next/server/app/(auth)/login/page.js.nft.json +1 -1
  108. package/.next/server/app/(auth)/login/page_client-reference-manifest.js +1 -1
  109. package/.next/server/app/(auth)/onboarding/page.js +1 -1
  110. package/.next/server/app/(auth)/onboarding/page.js.nft.json +1 -1
  111. package/.next/server/app/(auth)/onboarding/page_client-reference-manifest.js +1 -1
  112. package/.next/server/app/_global-error/page.js +1 -1
  113. package/.next/server/app/_global-error/page.js.nft.json +1 -1
  114. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  115. package/.next/server/app/_global-error.html +1 -1
  116. package/.next/server/app/_global-error.rsc +3 -3
  117. package/.next/server/app/_global-error.segments/_full.segment.rsc +3 -3
  118. package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  119. package/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  120. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  121. package/.next/server/app/_global-error.segments/_index.segment.rsc +2 -2
  122. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  123. package/.next/server/app/_not-found/page.js +1 -1
  124. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  125. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  126. package/.next/server/app/api/cron/tick/route.js +16 -16
  127. package/.next/server/app/api/locks/acquire/route.js +1 -1
  128. package/.next/server/app/api/sync/file/route.js +2 -2
  129. package/.next/server/app/api/telegram/poll/route.js +11 -11
  130. package/.next/server/app/api/upload/route.js +1 -1
  131. package/.next/server/app/api/v1/[[...path]]/route.js +1 -1
  132. package/.next/server/chunks/1249.js +14 -14
  133. package/.next/server/chunks/1845.js +1 -1
  134. package/.next/server/chunks/2517.js +1 -1
  135. package/.next/server/chunks/259.js +9 -9
  136. package/.next/server/chunks/260.js +1 -1
  137. package/.next/server/chunks/2867.js +2 -2
  138. package/.next/server/chunks/2960.js +1 -1
  139. package/.next/server/chunks/3131.js +1 -1
  140. package/.next/server/chunks/3234.js +4 -4
  141. package/.next/server/chunks/4574.js +1 -0
  142. package/.next/server/chunks/4619.js +1 -1
  143. package/.next/server/chunks/4979.js +12 -12
  144. package/.next/server/chunks/6431.js +1 -1
  145. package/.next/server/chunks/6753.js +1 -0
  146. package/.next/server/chunks/7236.js +4 -0
  147. package/.next/server/chunks/7336.js +1 -1
  148. package/.next/server/chunks/7589.js +3 -3
  149. package/.next/server/chunks/7621.js +12 -0
  150. package/.next/server/chunks/7989.js +1 -1
  151. package/.next/server/chunks/7993.js +21 -0
  152. package/.next/server/chunks/850.js +1 -1
  153. package/.next/server/chunks/8561.js +3 -3
  154. package/.next/server/chunks/8623.js +1 -1
  155. package/.next/server/chunks/8762.js +15 -417
  156. package/.next/server/chunks/8823.js +1 -1
  157. package/.next/server/chunks/8846.js +1 -0
  158. package/.next/server/chunks/9160.js +417 -0
  159. package/.next/server/chunks/9783.js +3 -3
  160. package/.next/server/chunks/9969.js +1 -1
  161. package/.next/server/instrumentation.js +1 -1
  162. package/.next/server/middleware-build-manifest.js +1 -1
  163. package/.next/server/pages/500.html +1 -1
  164. package/.next/server/server-reference-manifest.js +1 -1
  165. package/.next/server/server-reference-manifest.json +1 -1
  166. package/.next/static/chunks/215-18ea748d2ff2caff.js +1 -0
  167. package/.next/static/chunks/27-b49ec46cfcce75b7.js +1 -0
  168. package/.next/static/chunks/2989-2dd9a66d007a96e8.js +4 -0
  169. package/.next/static/chunks/3219-92e75397858f3f1f.js +1 -0
  170. package/.next/static/chunks/4643-d0ab4088e129651f.js +1 -0
  171. package/.next/static/chunks/8370-e88907d9c72435e7.js +12 -0
  172. package/.next/static/chunks/app/(app)/activity/{page-29e80a32c02f376b.js → page-93d4012627ea70d5.js} +1 -1
  173. package/.next/static/chunks/app/(app)/agents/[handle]/page-bfe740784bdf239c.js +1 -0
  174. package/.next/static/chunks/app/(app)/code/{page-1f954f7688bc24e4.js → page-5e24874f11857823.js} +1 -1
  175. package/.next/static/chunks/app/(app)/config/page-12c5487a8d55c2c2.js +1 -0
  176. package/.next/static/chunks/app/(app)/costs/page-6edcec363617f5ef.js +1 -0
  177. package/.next/static/chunks/app/(app)/cron/{page-a4dd65c78173b872.js → page-f9167770757921f7.js} +1 -1
  178. package/.next/static/chunks/app/(app)/dashboard/page-103f172e762911d1.js +1 -0
  179. package/.next/static/chunks/app/(app)/design/{page-238be90d78d22780.js → page-11b9cc40f32fe34f.js} +3 -3
  180. package/.next/static/chunks/app/(app)/docs/[id]/{page-e29afa1ba1a086e1.js → page-eaae80c3d47e1ba7.js} +1 -1
  181. package/.next/static/chunks/app/(app)/docs/page-87457e514ea7de32.js +1 -0
  182. package/.next/static/chunks/app/(app)/github/page-ff62b7618c594632.js +1 -0
  183. package/.next/static/chunks/app/(app)/goals/page-d4d854c091020a92.js +1 -0
  184. package/.next/static/chunks/app/(app)/inbox/page-1bcfc50e9df5ed6f.js +12 -0
  185. package/.next/static/chunks/app/(app)/knowledge/page-0a55ce74e274817c.js +1 -0
  186. package/.next/static/chunks/app/(app)/layout-825ba765e8034dfb.js +1 -0
  187. package/.next/static/chunks/app/(app)/models/page-cd077c548916b8cb.js +1 -0
  188. package/.next/static/chunks/app/(app)/notifications/page-c5c7945f6f6f18d6.js +12 -0
  189. package/.next/static/chunks/app/(app)/org/page-a83804854bd0d44a.js +12 -0
  190. package/.next/static/chunks/app/(app)/organizations/page-b38db8e364e3a108.js +1 -0
  191. package/.next/static/chunks/app/(app)/page-733340fec4cd0173.js +1 -0
  192. package/.next/static/chunks/app/(app)/planner/{page-920e439e6f88c238.js → page-06b2841d0438d92d.js} +1 -1
  193. package/.next/static/chunks/app/(app)/plugins/{page-d10239fcbabdf4fa.js → page-535ed062643077fc.js} +1 -1
  194. package/.next/static/chunks/app/(app)/pm/page-dc0296761e1af17c.js +1 -0
  195. package/.next/static/chunks/app/(app)/prepare-deploy/page-6f0c5081caf1d013.js +1 -0
  196. package/.next/static/chunks/app/(app)/profile/page-cef1aa72ffc02e9c.js +1 -0
  197. package/.next/static/chunks/app/(app)/pulse/page-d4bdec1709913581.js +1 -0
  198. package/.next/static/chunks/app/(app)/reports/[id]/{page-a4dd65c78173b872.js → page-f9167770757921f7.js} +1 -1
  199. package/.next/static/chunks/app/(app)/reports/{page-5c07fa3a8b5ba553.js → page-5c37a53bbd4fd1c3.js} +1 -1
  200. package/.next/static/chunks/app/(app)/routines/page-e274160cfbb3c594.js +1 -0
  201. package/.next/static/chunks/app/(app)/search/{page-07e037c487f14c35.js → page-f0e082b9b0402981.js} +1 -1
  202. package/.next/static/chunks/app/(app)/security/page-a12f04656bde8aad.js +1 -0
  203. package/.next/static/chunks/app/(app)/skills/page-583f9780fa981aa8.js +1 -0
  204. package/.next/static/chunks/app/(app)/tasks/page-7bb09650b84e0755.js +1 -0
  205. package/.next/static/chunks/app/(app)/test-dev/page-ce66efbb83b2ed21.js +1 -0
  206. package/.next/static/chunks/app/(app)/update/page-6a8082f1c1b3b762.js +1 -0
  207. package/.next/static/chunks/app/(auth)/login/page-b512c906a1566d8c.js +1 -0
  208. package/.next/static/chunks/app/(auth)/onboarding/page-8f6bf1259bb5aab5.js +1 -0
  209. package/.next/trace-build +1 -1
  210. package/CHANGELOG.md +63 -1
  211. package/README.md +7 -1
  212. package/README.pt-BR.md +7 -1
  213. package/THIRD_PARTY_LICENSES.md +64 -0
  214. package/bin/constella-update.mjs +19 -7
  215. package/bin/constella.mjs +1 -1
  216. package/bin/worker.mjs +1 -0
  217. package/docs/UPDATE.md +18 -2
  218. package/docs/en/AI_ARCHITECTURE.md +2 -2
  219. package/docs/en/CHAT_COMMANDS.md +1 -1
  220. package/docs/en/CONFIGURATION.md +1 -1
  221. package/docs/en/DESIGN.md +1 -1
  222. package/docs/en/FAQ.md +3 -3
  223. package/docs/en/GOALS_SPECS_ISSUES.md +1 -1
  224. package/docs/en/MCP.md +2 -2
  225. package/docs/en/PLUGINS.md +2 -2
  226. package/docs/en/PORTABLE_MODE.md +1 -1
  227. package/docs/en/PUBLISHING.md +14 -15
  228. package/docs/en/README.md +1 -1
  229. package/docs/en/SECURITY.md +3 -3
  230. package/docs/en/START_MODE.md +1 -1
  231. package/docs/en/TELEGRAM.md +1 -1
  232. package/docs/en/TROUBLESHOOTING.md +1 -1
  233. package/docs/en/VPS_MODE.md +2 -2
  234. package/docs/pt/AI_ARCHITECTURE.md +2 -2
  235. package/docs/pt/CHAT_COMMANDS.md +1 -1
  236. package/docs/pt/CONFIGURATION.md +1 -1
  237. package/docs/pt/DESIGN.md +1 -1
  238. package/docs/pt/FAQ.md +3 -3
  239. package/docs/pt/GOALS_SPECS_ISSUES.md +1 -1
  240. package/docs/pt/MCP.md +1 -1
  241. package/docs/pt/PLUGINS.md +2 -2
  242. package/docs/pt/PORTABLE_MODE.md +1 -1
  243. package/docs/pt/PUBLISHING.md +6 -7
  244. package/docs/pt/README.md +1 -1
  245. package/docs/pt/SECURITY.md +3 -3
  246. package/docs/pt/START_MODE.md +1 -1
  247. package/docs/pt/TELEGRAM.md +1 -1
  248. package/docs/pt/TROUBLESHOOTING.md +2 -2
  249. package/docs/pt/VPS_MODE.md +1 -1
  250. package/docs/roadmap.md +36 -0
  251. package/package.json +2 -1
  252. package/scripts/i18n-parity.mjs +1 -1
  253. package/scripts/install.sh +4 -2
  254. package/scripts/publish-public.mjs +33 -19
  255. package/scripts/vps-clean.sh +1 -1
  256. package/scripts/vps-install.sh +19 -5
  257. package/scripts/vps-update.sh +26 -17
  258. package/.next/server/chunks/212.js +0 -1
  259. package/.next/server/chunks/6381.js +0 -15
  260. package/.next/server/chunks/6853.js +0 -12
  261. package/.next/server/chunks/6954.js +0 -1
  262. package/.next/server/chunks/9215.js +0 -4
  263. package/.next/server/chunks/9229.js +0 -1
  264. package/.next/server/chunks/9310.js +0 -21
  265. package/.next/static/chunks/2692-7fee6e06b3c93940.js +0 -1
  266. package/.next/static/chunks/2997-ec8b18227849683e.js +0 -1
  267. package/.next/static/chunks/3219-b4941c7ff967e904.js +0 -1
  268. package/.next/static/chunks/6602-f26d109fd94cee1d.js +0 -4
  269. package/.next/static/chunks/8370-2733742abf5f3ddf.js +0 -12
  270. package/.next/static/chunks/9112-c37628abc8a164cd.js +0 -1
  271. package/.next/static/chunks/app/(app)/agents/[handle]/page-83277413debb3b25.js +0 -1
  272. package/.next/static/chunks/app/(app)/config/page-eee4f8736608afa5.js +0 -1
  273. package/.next/static/chunks/app/(app)/costs/page-0beac688917eaa30.js +0 -1
  274. package/.next/static/chunks/app/(app)/dashboard/page-519a934ccfcce6fa.js +0 -1
  275. package/.next/static/chunks/app/(app)/docs/page-b4462f9ca2118f8b.js +0 -1
  276. package/.next/static/chunks/app/(app)/github/page-cf8501e45fe38663.js +0 -1
  277. package/.next/static/chunks/app/(app)/goals/page-75c36155c162df5b.js +0 -1
  278. package/.next/static/chunks/app/(app)/inbox/page-f40bdb457609ddad.js +0 -12
  279. package/.next/static/chunks/app/(app)/knowledge/page-dc5dd15e4f0ad22e.js +0 -1
  280. package/.next/static/chunks/app/(app)/layout-408976a4d35f06a8.js +0 -1
  281. package/.next/static/chunks/app/(app)/models/page-a54e0b8ffed0085c.js +0 -1
  282. package/.next/static/chunks/app/(app)/notifications/page-1f84d74bc53c2c6c.js +0 -12
  283. package/.next/static/chunks/app/(app)/org/page-d17c62b7a668b399.js +0 -12
  284. package/.next/static/chunks/app/(app)/organizations/page-b55445f226cf8c61.js +0 -1
  285. package/.next/static/chunks/app/(app)/page-c7dd52ecc2da529d.js +0 -1
  286. package/.next/static/chunks/app/(app)/pm/page-61ad11558f241cf1.js +0 -1
  287. package/.next/static/chunks/app/(app)/prepare-deploy/page-8d25f86b26ab0d2e.js +0 -1
  288. package/.next/static/chunks/app/(app)/profile/page-236673e1a8c1e6c6.js +0 -1
  289. package/.next/static/chunks/app/(app)/pulse/page-f2c6049a967b93a3.js +0 -1
  290. package/.next/static/chunks/app/(app)/routines/page-0193e84e6a60a06a.js +0 -1
  291. package/.next/static/chunks/app/(app)/security/page-71e5d992b5ddf79a.js +0 -1
  292. package/.next/static/chunks/app/(app)/skills/page-72691864856c9906.js +0 -1
  293. package/.next/static/chunks/app/(app)/tasks/page-5c9ca8f83d4c904f.js +0 -1
  294. package/.next/static/chunks/app/(app)/test-dev/page-5aee630d9bc73a0b.js +0 -1
  295. package/.next/static/chunks/app/(app)/update/page-2c9bcdb65bd2f597.js +0 -1
  296. package/.next/static/chunks/app/(auth)/login/page-50033813b56469ee.js +0 -1
  297. package/.next/static/chunks/app/(auth)/onboarding/page-075fd9673f7ab241.js +0 -1
  298. package/docs/assets/blackhole.svg +0 -37
  299. /package/.next/static/{vaEtsAmUuKf_DngRqwRUn → Mx3bcAGWI83SQ6PqC4kYX}/_buildManifest.js +0 -0
  300. /package/.next/static/{vaEtsAmUuKf_DngRqwRUn → Mx3bcAGWI83SQ6PqC4kYX}/_ssgManifest.js +0 -0
@@ -0,0 +1 @@
1
+ "use strict";exports.id=4574,exports.ids=[4574],exports.modules={6287:(a,b,c)=>{c.d(b,{IssueApprove:()=>x,PlanGate:()=>v,PlanGateLive:()=>u,Run247Button:()=>y,p:()=>w});var d=c(4374),e=c(74679),f=c(47104),g=c(43526),h=c(31819),i=c(73134),j=c(2910);let k=(0,j.createServerReference)("404354d696dbc7dac4784ba3b3ab014333e0ad954f",j.callServer,void 0,j.findSourceMapURL,"generatePlan"),l=(0,j.createServerReference)("00e4e634074e109e51ede5ae51e150337216174c81",j.callServer,void 0,j.findSourceMapURL,"requestPlanChanges");var m=c(12718),n=c(73790),o=c(14829),p=c(83955),q=c(52650);let r=(0,j.createServerReference)("40f66d6d6c5aacdeed470d1cc25d6929dd35ff7dee",j.callServer,void 0,j.findSourceMapURL,"setAuto247"),s=(0,j.createServerReference)("006debeee382aeab3cec4a1512b243e5752158bddb",j.callServer,void 0,j.findSourceMapURL,"skipDesignGate");function t(a,b){window.dispatchEvent(new CustomEvent("constella:open-dm",{detail:{handle:a,text:b}}))}function u({planning:a,planSince:b,designRecommended:c=!1,designPending:j=!1}){let l=(0,h.k)(),[m,n]=(0,e.useTransition)(),o=(0,f.useRouter)(),[p,q]=(0,e.useState)(!1),[r,t]=(0,e.useState)(""),v=a||p;function w(){t(""),q(!0),window.dispatchEvent(new CustomEvent("constella:agent-run",{detail:{channel:"planner"}})),n(async()=>{try{let a=await k();(!a?.ok||!1===a.started)&&(q(!1),a?.error&&t(a.error)),o.refresh()}catch{q(!1),t(l("planner.gate.staleTab"))}})}return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(i.AgentRunLive,{channel:"planner",resume:a,sinceSeq:a?b-1:0,onFinish:()=>q(!1)}),v?(0,d.jsxs)("div",{className:"plan-gate",children:[(0,d.jsx)("div",{className:"plan-gate-bar","aria-hidden":!0}),(0,d.jsx)("div",{className:"pg-ic",children:(0,d.jsx)(g.I,{name:"bot",size:20})}),(0,d.jsxs)("div",{className:"pg-main",children:[(0,d.jsx)("div",{className:"pg-t",children:l("planner.gate.drafting.t")}),(0,d.jsx)("div",{className:"pg-d",children:l("planner.gate.drafting.d")})]})]}):c||j?(0,d.jsxs)("div",{className:"plan-gate",style:{borderColor:"rgba(99,102,241,.45)"},children:[(0,d.jsx)("div",{className:"plan-gate-bar","aria-hidden":!0,style:{background:"#6366f1"}}),(0,d.jsx)("div",{className:"pg-ic",style:{background:"rgba(99,102,241,.16)",color:"#6366f1"},children:(0,d.jsx)(g.I,{name:"skill",size:20})}),(0,d.jsxs)("div",{className:"pg-main",children:[(0,d.jsx)("div",{className:"pg-t",children:j?"Design step pending":"Recommended: prototype the design first"}),(0,d.jsx)("div",{className:"pg-d",children:j?"Ada is holding the plan on the design step. Open the Design module, build & approve the prototype with Grace, then Send to execution — Ada turns the approved design into specs & issues (zero drift).":"This is a frontend product. Prototype & approve the UI in the Design module before generating the plan — Grace turns the brief into a real visual reference, so the specs are precise and you avoid rework."}),r&&(0,d.jsx)("div",{className:"pg-d",style:{color:"var(--sx-keyword)",marginTop:6},children:r})]}),(0,d.jsxs)("div",{className:"pg-actions",children:[(0,d.jsxs)("button",{className:"btn-accent",onClick:()=>o.push("/design"),children:[(0,d.jsx)(g.I,{name:"skill",size:14})," Open Design"]}),(0,d.jsxs)("button",{className:"btn-ghost",disabled:m,onClick:function(){n(async()=>{try{await s()}catch{}}),w()},style:{fontSize:12},children:[(0,d.jsx)(g.I,{name:m?"refresh":"bot",size:13,className:m?"sync-spin":""})," ",m?l("planner.gate.analyzing"):"Skip design & plan anyway"]})]})]}):(0,d.jsxs)("div",{className:"plan-gate",children:[(0,d.jsx)("div",{className:"plan-gate-bar","aria-hidden":!0}),(0,d.jsx)("div",{className:"pg-ic",children:(0,d.jsx)(g.I,{name:"bot",size:20})}),(0,d.jsxs)("div",{className:"pg-main",children:[(0,d.jsx)("div",{className:"pg-t",children:l("planner.gate.noPlan.t")}),(0,d.jsx)("div",{className:"pg-d",children:l("planner.gate.noPlan.d")}),r&&(0,d.jsx)("div",{className:"pg-d",style:{color:"var(--sx-keyword)",marginTop:6},children:r})]}),(0,d.jsxs)("div",{className:"pg-actions",children:[(0,d.jsxs)("div",{className:"plan-hint",children:[(0,d.jsx)("div",{className:"plan-hint-t",children:l("planner.gate.hint.t")}),(0,d.jsx)("div",{className:"plan-hint-d",children:l("planner.gate.hint.d")})]}),(0,d.jsxs)("button",{className:"btn-accent",disabled:m,onClick:w,children:[(0,d.jsx)(g.I,{name:m?"refresh":"bot",size:14,className:m?"sync-spin":""})," ",m?l("planner.gate.analyzing"):l("planner.gate.generate")]})]})]})]})}function v({specs:a,total:b}){let c=(0,h.k)(),[f,i]=(0,e.useTransition)();return(0,d.jsxs)("div",{className:"plan-gate",children:[(0,d.jsx)("div",{className:"pg-ic",children:(0,d.jsx)(g.I,{name:"bot",size:20})}),(0,d.jsxs)("div",{className:"pg-main",children:[(0,d.jsx)("div",{className:"pg-t",children:c("planner.gate.ready.t")}),(0,d.jsx)("div",{className:"pg-d",children:c("planner.gate.ready.d",{specs:a,total:b})})]}),(0,d.jsxs)("div",{className:"pg-actions",children:[(0,d.jsxs)("button",{className:"btn-ghost",disabled:f,onClick:()=>i(async()=>{await l(),t("ada",c("planner.gate.rejectPlanDm"))}),children:[(0,d.jsx)(g.I,{name:"refresh",size:13})," ",c("planner.gate.requestChanges")]}),(0,d.jsxs)("button",{className:"btn-accent",disabled:f,onClick:()=>i(()=>(0,m.P)()),children:[(0,d.jsx)(g.I,{name:"check",size:14})," ",c("planner.gate.approvePlan")]})]})]})}function w({specId:a,specKey:b,approved:c}){let f=(0,h.k)(),[i,j]=(0,e.useTransition)();return c?(0,d.jsxs)("span",{className:"pill",style:{background:"var(--sx-string)22",color:"var(--sx-string)"},children:[(0,d.jsx)(g.I,{name:"check",size:11})," ",f("planner.approved")]}):(0,d.jsxs)("span",{style:{display:"inline-flex",gap:6},children:[(0,d.jsxs)("button",{className:"sc2-btn",disabled:i,onClick:()=>j(()=>(0,n.B)(a)),children:[(0,d.jsx)(g.I,{name:"check",size:11})," ",f("planner.approve")]}),(0,d.jsxs)("button",{className:"sc2-btn danger",disabled:i,onClick:()=>j(async()=>{t((await (0,o.J)(a)).handle,f("planner.rejectItemDm",{key:b}))}),children:[(0,d.jsx)(g.I,{name:"refresh",size:11})," ",f("planner.reject")]})]})}function x({issueId:a,issueKey:b,approved:c}){let f=(0,h.k)(),[i,j]=(0,e.useTransition)();return c?(0,d.jsxs)("span",{className:"pill",style:{background:"var(--sx-string)22",color:"var(--sx-string)"},children:[(0,d.jsx)(g.I,{name:"check",size:11})," ",f("planner.approved")]}):(0,d.jsxs)("span",{style:{display:"inline-flex",gap:6},children:[(0,d.jsxs)("button",{className:"sc2-btn",disabled:i,onClick:()=>j(()=>(0,p.t)(a)),children:[(0,d.jsx)(g.I,{name:"check",size:11})," ",f("planner.approve")]}),(0,d.jsxs)("button",{className:"sc2-btn danger",disabled:i,onClick:()=>j(async()=>{t((await (0,q.d)(a)).handle,f("planner.rejectItemDm",{key:b}))}),children:[(0,d.jsx)(g.I,{name:"refresh",size:11})," ",f("planner.reject")]})]})}function y({auto:a,approved:b,state:c}){let f=(0,h.k)(),[i,j]=(0,e.useTransition)(),k=f(i?a?"planner.run247.pausing":"planner.run247.starting":"waiting-approval"===c?"planner.run247.approveToRun":"all-done"===c?"planner.run247.allDone":a?"planner.run247.pause":"planner.run247.run"),l="blocked"===c?f("planner.run247.blockedTip"):void 0,m="off"===c&&!i;return(0,d.jsxs)("button",{className:"btn-"+(a?"ghost":"accent")+(m?" run-attn":""),disabled:!b||"all-done"===c||i,title:l,onClick:()=>j(()=>r(!a)),children:[(0,d.jsx)(g.I,{name:i?"refresh":"waiting-approval"===c?"bot":"all-done"===c?"check":a?"close":"play",size:14,className:i?"sync-spin":""})," ",k,("running"===c||m)&&(0,d.jsx)("span",{className:"dotpulse",style:{marginLeft:6}})]})}},12718:(a,b,c)=>{c.d(b,{P:()=>e});var d=c(2910);let e=(0,d.createServerReference)("002187847445622978bc55b9008235c0fa546c1928",d.callServer,void 0,d.findSourceMapURL,"approvePlan")},14829:(a,b,c)=>{c.d(b,{J:()=>e});var d=c(2910);let e=(0,d.createServerReference)("40911ea817fb8869817712ed68abca3202362f67a7",d.callServer,void 0,d.findSourceMapURL,"rejectSpec")},20716:(a,b,c)=>{c.r(b),c.d(b,{"0008abfdeefe18f706104ed40846a30c52580116ee":()=>d.cT,"004229861342763cdeeaecdf33af20836775cdc461":()=>d.Kd,"40563850bdfe40e806746d690f3e37de1586a42f27":()=>d.OD,"40e48edbe25a09f72718d05442f5dd82214415b864":()=>d.j0});var d=c(14565)},25543:(a,b,c)=>{c.d(b,{IssueApprove:()=>g,PlanGate:()=>f,PlanGateLive:()=>e,Run247Button:()=>h});var d=c(62060);let e=(0,d.registerClientReference)(function(){throw Error("Attempted to call PlanGateLive() from the server but PlanGateLive is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"C:\\Users\\Usuario\\Documents\\constella\\src\\components\\modules\\plan-gate.tsx","PlanGateLive");(0,d.registerClientReference)(function(){throw Error("Attempted to call GeneratePlanButton() from the server but GeneratePlanButton is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"C:\\Users\\Usuario\\Documents\\constella\\src\\components\\modules\\plan-gate.tsx","GeneratePlanButton");let f=(0,d.registerClientReference)(function(){throw Error("Attempted to call PlanGate() from the server but PlanGate is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"C:\\Users\\Usuario\\Documents\\constella\\src\\components\\modules\\plan-gate.tsx","PlanGate");(0,d.registerClientReference)(function(){throw Error("Attempted to call SpecApprove() from the server but SpecApprove is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"C:\\Users\\Usuario\\Documents\\constella\\src\\components\\modules\\plan-gate.tsx","SpecApprove");let g=(0,d.registerClientReference)(function(){throw Error("Attempted to call IssueApprove() from the server but IssueApprove is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"C:\\Users\\Usuario\\Documents\\constella\\src\\components\\modules\\plan-gate.tsx","IssueApprove"),h=(0,d.registerClientReference)(function(){throw Error("Attempted to call Run247Button() from the server but Run247Button is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"C:\\Users\\Usuario\\Documents\\constella\\src\\components\\modules\\plan-gate.tsx","Run247Button")},52650:(a,b,c)=>{c.d(b,{d:()=>e});var d=c(2910);let e=(0,d.createServerReference)("4060c1bd339b97979ac6672046624b24053d14da09",d.callServer,void 0,d.findSourceMapURL,"rejectIssue")},73134:(a,b,c)=>{c.d(b,{AgentRunLive:()=>j});var d=c(4374),e=c(74679),f=c(47104),g=c(43526);c(5199);var h=c(31819);let i=["read","create","edit","run","search","thinking","done","error"];function j({channel:a,resume:b=!1,sinceSeq:c=0,onFinish:k}){let l=(0,h.k)();(0,f.useRouter)();let[m,n]=(0,e.useState)(b),[o,p]=(0,e.useState)([]),[q,r]=(0,e.useState)(0);if((0,e.useRef)(b?c:0),(0,e.useRef)(!1),(0,e.useRef)(0),!m&&0===o.length)return null;let s=function(a){let b=[];for(let c of a)if("text"===c.kind){let a=(c.detail||"").replace(/\s+/g," ").trim();if(!a)continue;let d=b[b.length-1];d&&"text"===d.kind?d.content=(d.content+" "+a).slice(-600):b.push({id:c.id,kind:"text",content:a})}else if("thinking"===c.kind){let a=(c.detail||c.target||"").replace(/\s+/g," ").trim();a&&b.push({id:c.id,kind:"thinking",content:a})}else b.push({id:c.id,kind:c.kind,content:function(a){if(!a)return"";let b=a.split(/[\\/]/);return b.length>1?b.slice(-2).join("/"):a}(c.target)||c.detail||""});return b}(o),t=s.slice(-5),u=s.length-t.length,v=o.some(a=>"done"===a.kind||"error"===a.kind),w=o.some(a=>"error"===a.kind),x=String(Math.floor(q/60)).padStart(2,"0"),y=String(q%60).padStart(2,"0");return(0,d.jsxs)("div",{className:"card live-stream",style:{marginBottom:16,borderColor:w?"var(--sx-keyword)":"var(--accent)"},children:[(0,d.jsxs)("div",{className:"set-desc",style:{marginBottom:8,display:"flex",alignItems:"center",gap:7},children:[m&&!v?(0,d.jsx)("span",{className:"dotpulse"}):(0,d.jsx)(g.I,{name:w?"close":"check",size:13,style:{color:w?"var(--sx-keyword)":"var(--sx-string)"}}),m&&!v?l("agent.run.working"):w?l("agent.run.failed"):l("agent.run.finished"),s.length>0&&(0,d.jsxs)("span",{style:{color:"var(--text-faint)"},children:["\xb7 ",l(1===s.length?"agent.run.steps.one":"agent.run.steps.other",{n:s.length})]}),(0,d.jsxs)("span",{className:"live-elapsed",style:{marginLeft:"auto"},children:[x,":",y]})]}),0===t.length?(0,d.jsxs)("div",{className:"muted",style:{fontSize:12,display:"flex",alignItems:"center",gap:7},children:[(0,d.jsx)("span",{className:"sync-spin",children:(0,d.jsx)(g.I,{name:"refresh",size:12})})," ",l("agent.run.reading")]}):(0,d.jsxs)(d.Fragment,{children:[u>0&&(0,d.jsx)("div",{className:"live-more",children:l(1===u?"agent.run.earlier.one":"agent.run.earlier.other",{n:u})}),(0,d.jsx)("div",{className:"live-stream-lines",children:t.map(a=>(0,d.jsxs)("div",{className:"live-line "+a.kind,children:["text"!==a.kind&&(0,d.jsx)("span",{className:"ll-k",children:i.includes(a.kind)?l(`agent.verb.${a.kind}`):a.kind}),(0,d.jsxs)("span",{className:"ll-c",children:[a.content,!v&&a===t[t.length-1]&&"text"===a.kind&&(0,d.jsx)("span",{className:"ll-caret"})]})]},a.id))})]})]})}},73790:(a,b,c)=>{c.d(b,{B:()=>e});var d=c(2910);let e=(0,d.createServerReference)("408f2adaf50869e2202aa5684ad55b7e739765297b",d.callServer,void 0,d.findSourceMapURL,"approveSpec")},83955:(a,b,c)=>{c.d(b,{t:()=>e});var d=c(2910);let e=(0,d.createServerReference)("4077cdda445a2dc4096786e1b55bbe9c2aa5a764f8",d.callServer,void 0,d.findSourceMapURL,"approveIssue")}};
@@ -1 +1 @@
1
- "use strict";exports.id=4619,exports.ids=[4619],exports.modules={18612:(a,b,c)=>{c.d(b,{r$:()=>h,EX:()=>p,CS:()=>function a(b,c=""){let d=[];for(let e of l(b,c))if(e.isDir){if(m.has(e.name))continue;d.push(...a(b,e.path))}else d.push(e.path);return d},HZ:()=>j,Ci:()=>l,sL:()=>n,dx:()=>o});var d=c(73024),e=c(76760),f=c(48161),g=c(28430);function h(){return process.env.CONSTELLA_HOME?(0,g.Y)(process.env.CONSTELLA_HOME):(0,e.join)((0,f.homedir)(),".constella")}let i=new Set;function j(a){if(!/^[A-Za-z0-9_-]{6,64}$/.test(a))throw Error("Invalid orgId");let b=(0,e.join)(h(),"organizations",a,"workspace");if(!i.has(a)){i.add(a);try{let c=(0,e.join)(h(),"organizations",a,"constella"),f=!(0,d.existsSync)(b)||0===(0,d.readdirSync)(b).length;if((0,d.existsSync)(c)&&f)try{(0,d.renameSync)(c,b)}catch{(0,d.mkdirSync)(b,{recursive:!0}),0===(0,d.readdirSync)(b).length&&(0,d.cpSync)(c,b,{recursive:!0})}}catch{}}return b}function k(a,b){let c=(0,e.normalize)((0,e.join)(a,b));if(c!==a&&!c.startsWith(a+e.sep))throw Error("Path escapes workspace: "+b);if((0,d.existsSync)(a)){let f;try{f=d.realpathSync.native(a)}catch{f=a}let g=function(a){let b=a;for(;;){if((0,d.existsSync)(b))try{return d.realpathSync.native(b)}catch{return b}let a=(0,e.dirname)(b);if(a===b)return b;b=a}}(c);if(g!==f&&!g.startsWith(f+e.sep))throw Error("Path escapes workspace (symlink): "+b)}return c}function l(a,b=""){let c=k(j(a),b);return(0,d.existsSync)(c)?(0,d.readdirSync)(c).map(a=>{let f=(0,e.join)(c,a),g=(b?b+"/":"")+a;return{name:a,path:g,isDir:(0,d.statSync)(f).isDirectory()}}).sort((a,b)=>a.isDir===b.isDir?a.name.localeCompare(b.name):a.isDir?-1:1):[]}let m=new Set(["node_modules",".git",".next",".turbo","dist","build","out","coverage",".cache","archives",".testdev",".pnpm-store",".vercel","vendor"]);function n(a,b){let c=k(j(a),b);return(0,d.existsSync)(c)?(0,d.readFileSync)(c,"utf8"):null}function o(a,b,c){let f=k(j(a),b);(0,d.mkdirSync)((0,e.dirname)(f),{recursive:!0}),(0,d.writeFileSync)(f,c,"utf8")}function p(a,b){let c=k(j(a),b);(0,d.existsSync)(c)&&(0,d.rmSync)(c,{recursive:!0,force:!0})}},64619:(a,b,c)=>{c.d(b,{E6:()=>q,Nm:()=>A,PD:()=>w,SH:()=>y,U_:()=>r,hu:()=>u,sw:()=>s,xV:()=>t});var d=c(77598),e=c(1782),f=c(7852),g=c(80280),h=c(25533),i=c(18612);let j=process.env.OLLAMA_URL??"http://127.0.0.1:11434",k=process.env.CONSTELLA_EMBED_MODEL??"nomic-embed-text",l=/nomic/i.test(k),m=(a,b)=>`search_${b}: ${a}`,n=process.env.CONSTELLA_EMBED_URL??"http://127.0.0.1:8083",o=[".claude","DOCS","PO","Reports","specs","issues","design-skills"];function p(a){let b=a.replace(/\\/g,"/");return!(b.startsWith(".claude/kb/")||b.startsWith(".claude/skills/"))&&(b.startsWith("mock/")||b.startsWith("design-mock/")?/\.(md|html?|css|jsx?|tsx?|txt|json)$/i.test(b):b.endsWith(".md")&&o.some(a=>b===`${a}.md`||b.startsWith(`${a}/`)))}async function q(a,b="document"){try{let c=await fetch(`${j}/api/embeddings`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({model:k,prompt:l?m(a,b):a}),signal:AbortSignal.timeout(8e3)});if(c.ok){let a=await c.json();if(Array.isArray(a.embedding)&&a.embedding.length)return a.embedding}}catch{}try{let c=await fetch(`${n}/v1/embeddings`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({input:m(a,b),model:"nomic-embed"}),signal:AbortSignal.timeout(8e3)});if(c.ok){let a=await c.json(),b=a?.data?.[0]?.embedding;if(Array.isArray(b)&&b.length)return b}}catch{}return null}function r(a){let b=a.split(/\n(?=#{1,3}\s)/).map(a=>a.trim()).filter(Boolean),c=[];for(let d of b.length?b:[a])if(d)if(d.length<=1200)c.push(d);else for(let a=0;a<d.length;a+=1200)c.push(d.slice(a,a+1200));return c.slice(0,40)}function s(a,b){let c=0,d=0,e=0,f=Math.min(a.length,b.length);for(let g=0;g<f;g++)c+=a[g]*b[g],d+=a[g]*a[g],e+=b[g]*b[g];return d&&e?c/(Math.sqrt(d)*Math.sqrt(e)):0}async function t(a){let[b]=await g.db.select().from(h.workspace).where((0,e.eq)(h.workspace.orgId,a));if(!b)return{ok:!1,chunks:0,embedded:!1};let c=(0,i.CS)(a).filter(p);await g.db.delete(h.ragChunk).where((0,e.eq)(h.ragChunk.workspaceId,b.id));let f=0,j=!1;for(let e of c)for(let c of r((0,i.sL)(a,e)??"")){let a=await q(c);a&&(j=!0),await g.db.insert(h.ragChunk).values({id:(0,d.randomUUID)(),workspaceId:b.id,path:e,chunk:c,vector:a?JSON.stringify(a):null}),f++}return{ok:!0,chunks:f+=await u(a),embedded:j}}async function u(a){let[b]=await g.db.select().from(h.workspace).where((0,e.eq)(h.workspace.orgId,a));if(!b)return 0;await g.db.delete(h.ragChunk).where((0,e.Uo)((0,e.eq)(h.ragChunk.workspaceId,b.id),(0,e.mj)(h.ragChunk.path,"chat/%")));let c=await g.db.select().from(h.message).where((0,e.eq)(h.message.workspaceId,b.id)).orderBy((0,f.Y)(h.message.createdAt)),i=new Map;for(let a of c){let b=(a.text??"").replace(/\s+/g," ").trim();if(!b)continue;let c="operator"===a.fromKind?"Operator":"@"+(a.fromHandle??"agent"),d=i.get(a.channel);d||(d=[],i.set(a.channel,d)),d.push(`${c}: ${b}`)}let j=0;for(let[a,c]of i)for(let e of r(c.slice(-400).join("\n"))){let c=await q(e);await g.db.insert(h.ragChunk).values({id:(0,d.randomUUID)(),workspaceId:b.id,path:`chat/${a}`,chunk:e,vector:c?JSON.stringify(c):null}),j++}return j}let v=new Map;function w(a){let b=v.get(a);b&&clearTimeout(b),v.set(a,setTimeout(()=>{v.delete(a),u(a).catch(()=>{})},6e3))}async function x(a,b){if(!p(b))return;let[c]=await g.db.select().from(h.workspace).where((0,e.eq)(h.workspace.orgId,a));if(c)for(let f of(await g.db.delete(h.ragChunk).where((0,e.Uo)((0,e.eq)(h.ragChunk.workspaceId,c.id),(0,e.eq)(h.ragChunk.path,b))),r((0,i.sL)(a,b)??""))){let a=await q(f);await g.db.insert(h.ragChunk).values({id:(0,d.randomUUID)(),workspaceId:c.id,path:b,chunk:f,vector:a?JSON.stringify(a):null})}}async function y(a,b){if(!p(b))return;let[c]=await g.db.select().from(h.workspace).where((0,e.eq)(h.workspace.orgId,a));c&&await g.db.delete(h.ragChunk).where((0,e.Uo)((0,e.eq)(h.ragChunk.workspaceId,c.id),(0,e.eq)(h.ragChunk.path,b)))}let z=new Map;function A(a,b){if(!p(b))return;let c=a+"::"+b,d=z.get(c);d&&clearTimeout(d),z.set(c,setTimeout(()=>{z.delete(c),x(a,b).catch(()=>{})},2500))}}};
1
+ "use strict";exports.id=4619,exports.ids=[4619],exports.modules={18612:(a,b,c)=>{c.d(b,{r$:()=>h,EX:()=>p,CS:()=>function a(b,c=""){let d=[];for(let e of l(b,c))if(e.isDir){if(m.has(e.name))continue;d.push(...a(b,e.path))}else d.push(e.path);return d},HZ:()=>j,Ci:()=>l,sL:()=>n,dx:()=>o});var d=c(73024),e=c(76760),f=c(48161),g=c(28430);function h(){return process.env.CONSTELLA_HOME?(0,g.Y)(process.env.CONSTELLA_HOME):(0,e.join)((0,f.homedir)(),".constella")}let i=new Set;function j(a){if(!/^[A-Za-z0-9_-]{6,64}$/.test(a))throw Error("Invalid orgId");let b=(0,e.join)(h(),"organizations",a,"workspace");if(!i.has(a)){i.add(a);try{let c=(0,e.join)(h(),"organizations",a,"constella"),f=!(0,d.existsSync)(b)||0===(0,d.readdirSync)(b).length;if((0,d.existsSync)(c)&&f)try{(0,d.renameSync)(c,b)}catch{(0,d.existsSync)(c)&&((0,d.mkdirSync)(b,{recursive:!0}),0===(0,d.readdirSync)(b).length&&(0,d.cpSync)(c,b,{recursive:!0}))}}catch{}}return b}function k(a,b){let c=(0,e.normalize)((0,e.join)(a,b));if(c!==a&&!c.startsWith(a+e.sep))throw Error("Path escapes workspace: "+b);if((0,d.existsSync)(a)){let f;try{f=d.realpathSync.native(a)}catch{f=a}let g=function(a){let b=a;for(;;){if((0,d.existsSync)(b))try{return d.realpathSync.native(b)}catch{return b}let a=(0,e.dirname)(b);if(a===b)return b;b=a}}(c);if(g!==f&&!g.startsWith(f+e.sep))throw Error("Path escapes workspace (symlink): "+b)}return c}function l(a,b=""){let c=k(j(a),b);return(0,d.existsSync)(c)?(0,d.readdirSync)(c).map(a=>{let f=(0,e.join)(c,a),g=(b?b+"/":"")+a;return{name:a,path:g,isDir:(0,d.statSync)(f).isDirectory()}}).sort((a,b)=>a.isDir===b.isDir?a.name.localeCompare(b.name):a.isDir?-1:1):[]}let m=new Set(["node_modules",".git",".next",".turbo","dist","build","out","coverage",".cache","archives",".testdev",".pnpm-store",".vercel","vendor"]);function n(a,b){let c=k(j(a),b);return(0,d.existsSync)(c)?(0,d.readFileSync)(c,"utf8"):null}function o(a,b,c){let f=k(j(a),b);(0,d.mkdirSync)((0,e.dirname)(f),{recursive:!0}),(0,d.writeFileSync)(f,c,"utf8")}function p(a,b){let c=k(j(a),b);(0,d.existsSync)(c)&&(0,d.rmSync)(c,{recursive:!0,force:!0})}},64619:(a,b,c)=>{c.d(b,{E6:()=>q,Nm:()=>A,PD:()=>w,SH:()=>y,U_:()=>r,hu:()=>u,sw:()=>s,xV:()=>t});var d=c(77598),e=c(1782),f=c(7852),g=c(80280),h=c(25533),i=c(18612);let j=process.env.OLLAMA_URL??"http://127.0.0.1:11434",k=process.env.CONSTELLA_EMBED_MODEL??"nomic-embed-text",l=/nomic/i.test(k),m=(a,b)=>`search_${b}: ${a}`,n=process.env.CONSTELLA_EMBED_URL??"http://127.0.0.1:8083",o=[".claude","DOCS","PO","Reports","specs","issues","design-skills"];function p(a){let b=a.replace(/\\/g,"/");return!(b.startsWith(".claude/kb/")||b.startsWith(".claude/skills/"))&&(b.startsWith("mock/")||b.startsWith("design-mock/")?/\.(md|html?|css|jsx?|tsx?|txt|json)$/i.test(b):b.endsWith(".md")&&o.some(a=>b===`${a}.md`||b.startsWith(`${a}/`)))}async function q(a,b="document"){try{let c=await fetch(`${j}/api/embeddings`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({model:k,prompt:l?m(a,b):a}),signal:AbortSignal.timeout(8e3)});if(c.ok){let a=await c.json();if(Array.isArray(a.embedding)&&a.embedding.length)return a.embedding}}catch{}try{let c=await fetch(`${n}/v1/embeddings`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({input:m(a,b),model:"nomic-embed"}),signal:AbortSignal.timeout(8e3)});if(c.ok){let a=await c.json(),b=a?.data?.[0]?.embedding;if(Array.isArray(b)&&b.length)return b}}catch{}return null}function r(a){let b=a.split(/\n(?=#{1,3}\s)/).map(a=>a.trim()).filter(Boolean),c=[];for(let d of b.length?b:[a])if(d)if(d.length<=1200)c.push(d);else for(let a=0;a<d.length;a+=1200)c.push(d.slice(a,a+1200));return c.slice(0,40)}function s(a,b){let c=0,d=0,e=0,f=Math.min(a.length,b.length);for(let g=0;g<f;g++)c+=a[g]*b[g],d+=a[g]*a[g],e+=b[g]*b[g];return d&&e?c/(Math.sqrt(d)*Math.sqrt(e)):0}async function t(a){let[b]=await g.db.select().from(h.workspace).where((0,e.eq)(h.workspace.orgId,a));if(!b)return{ok:!1,chunks:0,embedded:!1};let c=(0,i.CS)(a).filter(p);await g.db.delete(h.ragChunk).where((0,e.Uo)((0,e.eq)(h.ragChunk.workspaceId,b.id),(0,e.kZ)(h.ragChunk.kbEntryId)));let f=0,j=!1;for(let e of c)for(let c of r((0,i.sL)(a,e)??"")){let a=await q(c);a&&(j=!0),await g.db.insert(h.ragChunk).values({id:(0,d.randomUUID)(),workspaceId:b.id,path:e,chunk:c,vector:a?JSON.stringify(a):null}),f++}return{ok:!0,chunks:f+=await u(a),embedded:j}}async function u(a){let[b]=await g.db.select().from(h.workspace).where((0,e.eq)(h.workspace.orgId,a));if(!b)return 0;await g.db.delete(h.ragChunk).where((0,e.Uo)((0,e.eq)(h.ragChunk.workspaceId,b.id),(0,e.mj)(h.ragChunk.path,"chat/%")));let c=await g.db.select().from(h.message).where((0,e.eq)(h.message.workspaceId,b.id)).orderBy((0,f.Y)(h.message.createdAt)),i=new Map;for(let a of c){let b=(a.text??"").replace(/\s+/g," ").trim();if(!b)continue;let c="operator"===a.fromKind?"Operator":"@"+(a.fromHandle??"agent"),d=i.get(a.channel);d||(d=[],i.set(a.channel,d)),d.push(`${c}: ${b}`)}let j=0;for(let[a,c]of i)for(let e of r(c.slice(-400).join("\n"))){let c=await q(e);await g.db.insert(h.ragChunk).values({id:(0,d.randomUUID)(),workspaceId:b.id,path:`chat/${a}`,chunk:e,vector:c?JSON.stringify(c):null}),j++}return j}let v=new Map;function w(a){let b=v.get(a);b&&clearTimeout(b),v.set(a,setTimeout(()=>{v.delete(a),u(a).catch(()=>{})},6e3))}async function x(a,b){if(!p(b))return;let[c]=await g.db.select().from(h.workspace).where((0,e.eq)(h.workspace.orgId,a));if(c)for(let f of(await g.db.delete(h.ragChunk).where((0,e.Uo)((0,e.eq)(h.ragChunk.workspaceId,c.id),(0,e.eq)(h.ragChunk.path,b))),r((0,i.sL)(a,b)??""))){let a=await q(f);await g.db.insert(h.ragChunk).values({id:(0,d.randomUUID)(),workspaceId:c.id,path:b,chunk:f,vector:a?JSON.stringify(a):null})}}async function y(a,b){if(!p(b))return;let[c]=await g.db.select().from(h.workspace).where((0,e.eq)(h.workspace.orgId,a));c&&await g.db.delete(h.ragChunk).where((0,e.Uo)((0,e.eq)(h.ragChunk.workspaceId,c.id),(0,e.eq)(h.ragChunk.path,b)))}let z=new Map;function A(a,b){if(!p(b))return;let c=a+"::"+b,d=z.get(c);d&&clearTimeout(d),z.set(c,setTimeout(()=>{z.delete(c),x(a,b).catch(()=>{})},2500))}}};
@@ -1,4 +1,4 @@
1
- "use strict";exports.id=4979,exports.ids=[4979],exports.modules={44239:(a,b,c)=>{c.d(b,{$K:()=>m,$h:()=>q,FU:()=>t,II:()=>s,Kb:()=>u,MO:()=>o,Qu:()=>n,Vz:()=>r,dZ:()=>p});var d=c(6866),e=c(77598),f=c(97603),g=c(31371),h=c(65705),i=c(1890),j=c(53993),k=c(83963),l=c(84903);async function m(a){let{workspace:b}=await (0,j.nP)(),c=a.title.trim();c&&(await h.db.insert(i.backlogItem).values({id:(0,e.randomUUID)(),workspaceId:b.id,title:c,moscow:a.moscow??"Should",points:a.points??0}),(0,g.revalidatePath)("/pm"))}async function n(a){let{workspace:b}=await (0,j.nP)();await h.db.delete(i.backlogItem).where((0,f.Uo)((0,f.eq)(i.backlogItem.id,a),(0,f.eq)(i.backlogItem.workspaceId,b.id))),(0,g.revalidatePath)("/pm")}async function o(a,b){let c=await h.db.select().from(i.issue).where((0,f.Uo)((0,f.eq)(i.issue.workspaceId,b),(0,f.eq)(i.issue.status,"active"))),d=c.filter(a=>"done"===a.col),e=c.filter(a=>"done"!==a.col);if(!d.length)return{ok:!1,shipped:0,carried:e.length};let g=new Date().toISOString().slice(0,10),j=[`# Sprint retro — ${g}`,"",`## Shipped (${d.length})`,...d.map(a=>`- ${a.key} — ${a.title}${a.points?` (${a.points} pts)`:""}`),"",`## Carried over (${e.length})`,...e.length?e.map(a=>`- ${a.key} [${a.col}] — ${a.title}`):["- (nothing — clean sprint)"],"",`_Closed ${new Date().toISOString()} by the Product Owner._`,""].join("\n"),m=`PO/sprint-retro-${g}.md`;try{await (0,k.g)(a,m,j)}catch(a){console.error("[closeSprint] retro write failed:",a)}return await h.db.update(i.issue).set({status:"archived"}).where((0,f.Uo)((0,f.eq)(i.issue.workspaceId,b),(0,f.RV)(i.issue.id,d.map(a=>a.id)))),await (0,l.j)(b,{text:`Sprint closed — ${d.length} shipped, ${e.length} carried over; retro at ${m}`,by:"donald",source:"po-grooming"}),{ok:!0,shipped:d.length,carried:e.length,path:m}}async function p(){let{org:a,workspace:b}=await (0,j.nP)(),c=await o(a.id,b.id);return(0,g.revalidatePath)("/pm"),(0,g.revalidatePath)("/","layout"),c}async function q(a){let{workspace:b}=await (0,j.nP)(),[c]=await h.db.select().from(i.backlogItem).where((0,f.Uo)((0,f.eq)(i.backlogItem.id,a),(0,f.eq)(i.backlogItem.workspaceId,b.id)));if(!c)return;let d=(await h.db.select().from(i.issue).where((0,f.eq)(i.issue.workspaceId,b.id))).length;await h.db.insert(i.issue).values({id:(0,e.randomUUID)(),workspaceId:b.id,key:"S-"+(d+1),title:c.title,col:"todo",prio:"med",moscow:c.moscow,points:c.points}),await h.db.delete(i.backlogItem).where((0,f.eq)(i.backlogItem.id,a)),(0,g.revalidatePath)("/pm")}async function r(a,b){let{workspace:c}=await (0,j.nP)();await h.db.update(i.issue).set({col:b}).where((0,f.Uo)((0,f.eq)(i.issue.id,a),(0,f.eq)(i.issue.workspaceId,c.id))),(0,g.revalidatePath)("/pm")}async function s(a,b){let{workspace:c}=await (0,j.nP)();await h.db.update(i.issue).set({moscow:b}).where((0,f.Uo)((0,f.eq)(i.issue.id,a),(0,f.eq)(i.issue.workspaceId,c.id))),(0,g.revalidatePath)("/pm")}async function t(a){let{workspace:b}=await (0,j.nP)();await h.db.update(i.issue).set({col:"blocked"}).where((0,f.Uo)((0,f.eq)(i.issue.id,a),(0,f.eq)(i.issue.workspaceId,b.id))),await h.db.update(i.task).set({col:"blocked"}).where((0,f.Uo)((0,f.eq)(i.task.issueId,a),(0,f.eq)(i.task.workspaceId,b.id))),(0,g.revalidatePath)("/pm"),(0,g.revalidatePath)("/tasks")}async function u(a){let{workspace:b}=await (0,j.nP)();await h.db.update(i.issue).set({col:"todo"}).where((0,f.Uo)((0,f.eq)(i.issue.id,a),(0,f.eq)(i.issue.workspaceId,b.id)));let[c]=await h.db.update(i.task).set({col:"todo"}).where((0,f.Uo)((0,f.eq)(i.task.issueId,a),(0,f.eq)(i.task.workspaceId,b.id))).returning();c?.assigneeId&&await h.db.update(i.agent).set({status:"idle"}).where((0,f.eq)(i.agent.id,c.assigneeId)),(0,g.revalidatePath)("/pm"),(0,g.revalidatePath)("/tasks")}(0,c(74252).D)([m,n,o,p,q,r,s,t,u]),(0,d.A)(m,"409de9f69b882918b8a07dabc9dec58364814bdeaa",null),(0,d.A)(n,"40c27aa25c74f7655b3c9bdfbbd9f868cc87fc30c2",null),(0,d.A)(o,"607c25192df3e28ea8a3536e1e915acd8e36f18eb0",null),(0,d.A)(p,"00d4514aa8b3276e7cd7f2ccdb1cbc9ee21e8228d6",null),(0,d.A)(q,"408d22662a6b4e7fa901f1b17ce84697d6804c4036",null),(0,d.A)(r,"601d943053a8f7bcbbb18685ea112be40ffb932496",null),(0,d.A)(s,"607c19875716d26362b91428adaa02629ef939900f",null),(0,d.A)(t,"400abaaa0b341ad3236b2003a66f3562e579512e41",null),(0,d.A)(u,"406c49aaa2f1c5e8602d542b71b2986c0f6cb8e6cc",null)},44842:(a,b,c)=>{c.d(b,{Lh:()=>t,NF:()=>v,PT:()=>w,jL:()=>u,ot:()=>q,yR:()=>r});var d=c(73024),e=c(76760),f=c(60547),g=c.n(f),h=c(97603),i=c(65705),j=c(1890),k=c(57086),l=c(70149),m=c(437),n=c(84903),o=c(77558),p=c(24701);async function q(a,b){let[c]=await i.db.select().from(j.goal).where((0,h.Uo)((0,h.eq)(j.goal.id,b),(0,h.eq)(j.goal.workspaceId,a)));return c}function r(a){return(a||"work").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,40)||"work"}async function s(a,b){for(let c of(await i.db.select().from(j.task).where((0,h.Uo)((0,h.eq)(j.task.workspaceId,a),(0,h.eq)(j.task.goalId,b)))))(0,l.KD)(c.id),("todo"===c.col||"doing"===c.col)&&(await i.db.update(j.task).set({col:"blocked"}).where((0,h.eq)(j.task.id,c.id)),c.issueId&&await i.db.update(j.issue).set({col:"blocked"}).where((0,h.eq)(j.issue.id,c.issueId))),c.assigneeId&&await i.db.update(j.agent).set({status:"idle"}).where((0,h.eq)(j.agent.id,c.assigneeId))}async function t(a,b){for(let c of(await i.db.select().from(j.task).where((0,h.Uo)((0,h.eq)(j.task.workspaceId,a),(0,h.eq)(j.task.goalId,b),(0,h.eq)(j.task.col,"blocked")))))await i.db.update(j.task).set({col:"todo"}).where((0,h.eq)(j.task.id,c.id)),c.issueId&&await i.db.update(j.issue).set({col:"todo"}).where((0,h.eq)(j.issue.id,c.issueId))}async function u(a,b,c){await i.db.update(j.spec).set({status:c}).where((0,h.Uo)((0,h.eq)(j.spec.workspaceId,a),(0,h.eq)(j.spec.goalId,b))),await i.db.update(j.issue).set({status:c}).where((0,h.Uo)((0,h.eq)(j.issue.workspaceId,a),(0,h.eq)(j.issue.goalId,b)))}async function v(a,b){let c=await q(a,b);return c?(await i.db.update(j.goal).set({status:"cancelled",cancelledAt:new Date}).where((0,h.eq)(j.goal.id,b)),await u(a,b,"cancelled"),await (0,o.TC)(a,b),await s(a,b),await (0,n.j)(a,{text:`Cancelled goal: ${c.title}`,by:"operator",source:"operator-instruction",goalId:b}),await (0,p.I)(a,{kind:"info",text:`Goal cancelled — ${c.title}`,detail:"Execution stopped; state preserved. Reopen to resume."}),{ok:!0,title:c.title}):{ok:!1}}async function w(a,b,c){let f=await q(b,c);if(!f)return{ok:!1};let l=(0,k.HZ)(a),[t,v,w,x,y]=await Promise.all([i.db.select().from(j.spec).where((0,h.Uo)((0,h.eq)(j.spec.workspaceId,b),(0,h.eq)(j.spec.goalId,c))),i.db.select().from(j.issue).where((0,h.Uo)((0,h.eq)(j.issue.workspaceId,b),(0,h.eq)(j.issue.goalId,c))),i.db.select().from(j.task).where((0,h.Uo)((0,h.eq)(j.task.workspaceId,b),(0,h.eq)(j.task.goalId,c))),i.db.select().from(j.decision).where((0,h.Uo)((0,h.eq)(j.decision.workspaceId,b),(0,h.eq)(j.decision.goalId,c))),i.db.select().from(j.report).where((0,h.Uo)((0,h.eq)(j.report.workspaceId,b),(0,h.eq)(j.report.goalId,c)))]),z=w.map(a=>a.id),A=z.length?await i.db.select().from(j.taskStep).where((0,h.RV)(j.taskStep.taskId,z)):[],B=await (0,m.Y)(b,c),C=new(g()),D=0;for(let a of B){let b=(0,e.join)(l,a);if((0,d.existsSync)(b))try{C.addFile("files/"+a,(0,d.readFileSync)(b)),D++}catch{}}let E={goal:f,specs:t,issues:v,tasks:w,taskSteps:A,decisions:x,reports:y,fileCount:D,archivedAt:new Date().toISOString()},F=[`# Archived work — ${f.title}`,"",`Status at archive: ${f.status} \xb7 progress ${f.progress}%`,"",`## Specs (${t.length})`,...t.map(a=>`- ${a.key} ${a.title}`),"",`## Issues (${v.length})`,...v.map(a=>`- ${a.key} [${a.col}] ${a.title}`),"",`## Decisions (${x.length})`,...x.map(a=>`- ${a.text} (${a.by})`),"",`## Source files (${D})`,...B.map(a=>`- ${a}`),""].join("\n");C.addFile("MANIFEST.json",Buffer.from(JSON.stringify(E,null,2))),C.addFile("MANIFEST.md",Buffer.from(F));let G=(0,e.join)(l,"archives");(0,d.mkdirSync)(G,{recursive:!0});let H=`archives/${r(f.title)}-${new Date().toISOString().slice(0,10)}-${c.slice(0,6)}.zip`;try{C.writeZip((0,e.join)(l,H))}catch(a){return console.error("[archiveGoalFor] zip failed:",a),{ok:!1}}return await i.db.update(j.goal).set({status:"archived",archivePath:H,archivedAt:new Date}).where((0,h.eq)(j.goal.id,c)),await u(b,c,"archived"),await (0,o.TC)(b,c),await s(b,c),await (0,n.j)(b,{text:`Archived goal: ${f.title} → ${H}`,by:"operator",source:"operator-instruction",goalId:c}),await (0,p.I)(b,{kind:"info",text:`Goal archived — ${f.title}`,detail:`${D} files + manifest zipped to ${H}.`}),{ok:!0,path:H,title:f.title}}},60686:(a,b,c)=>{c.d(b,{Fy:()=>m,KD:()=>q,Rr:()=>l,TH:()=>s,Xu:()=>r,j0:()=>n,nx:()=>o,zC:()=>p});var d=c(6866),e=c(31371),f=c(53993),g=c(63562),h=c(81204),i=c(70221),j=c(77558),k=c(24701);async function l(){let{org:a,workspace:b}=await (0,f.nP)(),c=await (0,g.ZF)(b.id,a.id);return(0,e.revalidatePath)("/test-dev"),c}async function m(){let{workspace:a}=await (0,f.nP)(),b=await (0,g.n9)(a.id);return(0,e.revalidatePath)("/test-dev"),b}async function n(){let{workspace:a}=await (0,f.nP)();return(0,g.CS)(a.id)}async function o(){let{org:a,workspace:b}=await (0,f.nP)(),c=(0,g.CS)(b.id);if("running"!==c.status&&"starting"!==c.status&&(c=await (0,g.ZF)(b.id,a.id)),!c.url||"running"!==c.status&&"starting"!==c.status)return{ok:!1,error:"The dev server isn't running — start the app first."};let d=await (0,h.nK)(b.id,c.url);return d?{ok:!0,url:d.url}:{ok:!1,error:"Could not start the inspect proxy."}}async function p(){let{workspace:a}=await (0,f.nP)();return(0,h.hA)(a.id),{ok:!0}}async function q(a){if(await (0,f.nP)(),!/^https?:\/\/(127\.0\.0\.1|localhost)(:\d+)?/i.test(a))return{frameable:!0};try{let b=await fetch(a,{redirect:"manual",signal:AbortSignal.timeout(3e3)}),c=(b.headers.get("x-frame-options")||"").toLowerCase(),d=(b.headers.get("content-security-policy")||"").toLowerCase(),e=/frame-ancestors\s+([^;]+)/.exec(d)?.[1]??"",f=c.includes("deny")||c.includes("sameorigin"),g=!!e&&!/(\*|localhost|127\.0\.0\.1)/.test(e);return{frameable:!(f||g)}}catch{return{frameable:!0}}}async function r(a){let{org:b,workspace:c}=await (0,f.nP)(),d=a?.issueId?await (0,i.B)(c.id,a.issueId):void 0,g=await (0,i.z)(c.id,b.id,{goalId:a?.goalId,issueId:a?.issueId,routes:d,by:"operator"});return(0,e.revalidatePath)("/test-dev"),g}async function s(a,b){let{workspace:c}=await (0,f.nP)();return await (0,j.vE)(c.id,{kind:"validation",refType:"validation",refId:a,title:`Validate ${a}`,detail:b.slice(0,500)}),await (0,k.I)(c.id,{kind:"review",text:`Validation requested — ${a}`,detail:b.slice(0,300)}),(0,e.revalidatePath)("/inbox"),{ok:!0}}(0,c(74252).D)([l,m,n,o,p,q,r,s]),(0,d.A)(l,"00e79a2910953ba23d55e44f542460c91f36bc6d24",null),(0,d.A)(m,"005be0217b190c99c78e1a0dc631e9b70453dec1b4",null),(0,d.A)(n,"00b229778561ca74fdf7f619d40ef60f711f8dc660",null),(0,d.A)(o,"001ea85f0f81ba1f14deff96bb2a8d21fe250767c7",null),(0,d.A)(p,"00db2ee1e67ece6f216fbfd564b413c5a06b3b4a8b",null),(0,d.A)(q,"40c26e82965595a54ada49ac8ee9eb62c1405f3c0f",null),(0,d.A)(r,"402c6120e41fe58f6ca9735a1633fe00352d91d07d",null),(0,d.A)(s,"607681b20f05689a939aff145464b2c255998d63e6",null)},84979:(a,b,c)=>{c.d(b,{runSlashCommand:()=>ax});var d=c(77598),e=c(97603),f=c(95357),g=c(65705),h=c(1890),i=c(56338),j=c(57300),k=c(45125),l=c(33644),m=c(13328),n=c(44842),o=c(60686),p=c(69783),q=c(6866),r=c(73024),s=c(76760),t=c(48161),u=c(31371),v=c(53993),w=c(38926),x=c(57086),y=c(70149),z=c(78161),A=c(79505),B=c(63562),C=c(3196),D=c(77558),E=c(24701);let F=!1;function G(){F||(F=!0,g.F.exec(`
1
+ "use strict";exports.id=4979,exports.ids=[4979],exports.modules={44239:(a,b,c)=>{c.d(b,{$K:()=>m,$h:()=>q,FU:()=>t,II:()=>s,Kb:()=>u,MO:()=>o,Qu:()=>n,Vz:()=>r,dZ:()=>p});var d=c(6866),e=c(77598),f=c(97603),g=c(31371),h=c(65705),i=c(1890),j=c(53993),k=c(83963),l=c(84903);async function m(a){let{workspace:b}=await (0,j.nP)(),c=a.title.trim();c&&(await h.db.insert(i.backlogItem).values({id:(0,e.randomUUID)(),workspaceId:b.id,title:c,moscow:a.moscow??"Should",points:a.points??0}),(0,g.revalidatePath)("/pm"))}async function n(a){let{workspace:b}=await (0,j.nP)();await h.db.delete(i.backlogItem).where((0,f.Uo)((0,f.eq)(i.backlogItem.id,a),(0,f.eq)(i.backlogItem.workspaceId,b.id))),(0,g.revalidatePath)("/pm")}async function o(a,b){let c=await h.db.select().from(i.issue).where((0,f.Uo)((0,f.eq)(i.issue.workspaceId,b),(0,f.eq)(i.issue.status,"active"))),d=c.filter(a=>"done"===a.col),e=c.filter(a=>"done"!==a.col);if(!d.length)return{ok:!1,shipped:0,carried:e.length};let g=new Date().toISOString().slice(0,10),j=[`# Sprint retro — ${g}`,"",`## Shipped (${d.length})`,...d.map(a=>`- ${a.key} — ${a.title}${a.points?` (${a.points} pts)`:""}`),"",`## Carried over (${e.length})`,...e.length?e.map(a=>`- ${a.key} [${a.col}] — ${a.title}`):["- (nothing — clean sprint)"],"",`_Closed ${new Date().toISOString()} by the Product Owner._`,""].join("\n"),m=`PO/sprint-retro-${g}.md`;try{await (0,k.g)(a,m,j)}catch(a){console.error("[closeSprint] retro write failed:",a)}return await h.db.update(i.issue).set({status:"archived"}).where((0,f.Uo)((0,f.eq)(i.issue.workspaceId,b),(0,f.RV)(i.issue.id,d.map(a=>a.id)))),await (0,l.j)(b,{text:`Sprint closed — ${d.length} shipped, ${e.length} carried over; retro at ${m}`,by:"donald",source:"po-grooming"}),{ok:!0,shipped:d.length,carried:e.length,path:m}}async function p(){let{org:a,workspace:b}=await (0,j.nP)(),c=await o(a.id,b.id);return(0,g.revalidatePath)("/pm"),(0,g.revalidatePath)("/","layout"),c}async function q(a){let{workspace:b}=await (0,j.nP)(),[c]=await h.db.select().from(i.backlogItem).where((0,f.Uo)((0,f.eq)(i.backlogItem.id,a),(0,f.eq)(i.backlogItem.workspaceId,b.id)));if(!c)return;let d=(await h.db.select().from(i.issue).where((0,f.eq)(i.issue.workspaceId,b.id))).length;await h.db.insert(i.issue).values({id:(0,e.randomUUID)(),workspaceId:b.id,key:"S-"+(d+1),title:c.title,col:"todo",prio:"med",moscow:c.moscow,points:c.points}),await h.db.delete(i.backlogItem).where((0,f.eq)(i.backlogItem.id,a)),(0,g.revalidatePath)("/pm")}async function r(a,b){let{workspace:c}=await (0,j.nP)();await h.db.update(i.issue).set({col:b}).where((0,f.Uo)((0,f.eq)(i.issue.id,a),(0,f.eq)(i.issue.workspaceId,c.id))),(0,g.revalidatePath)("/pm")}async function s(a,b){let{workspace:c}=await (0,j.nP)();await h.db.update(i.issue).set({moscow:b}).where((0,f.Uo)((0,f.eq)(i.issue.id,a),(0,f.eq)(i.issue.workspaceId,c.id))),(0,g.revalidatePath)("/pm")}async function t(a){let{workspace:b}=await (0,j.nP)();await h.db.update(i.issue).set({col:"blocked"}).where((0,f.Uo)((0,f.eq)(i.issue.id,a),(0,f.eq)(i.issue.workspaceId,b.id))),await h.db.update(i.task).set({col:"blocked"}).where((0,f.Uo)((0,f.eq)(i.task.issueId,a),(0,f.eq)(i.task.workspaceId,b.id))),(0,g.revalidatePath)("/pm"),(0,g.revalidatePath)("/tasks")}async function u(a){let{workspace:b}=await (0,j.nP)();await h.db.update(i.issue).set({col:"todo"}).where((0,f.Uo)((0,f.eq)(i.issue.id,a),(0,f.eq)(i.issue.workspaceId,b.id)));let[c]=await h.db.update(i.task).set({col:"todo"}).where((0,f.Uo)((0,f.eq)(i.task.issueId,a),(0,f.eq)(i.task.workspaceId,b.id))).returning();c?.assigneeId&&await h.db.update(i.agent).set({status:"idle"}).where((0,f.eq)(i.agent.id,c.assigneeId)),(0,g.revalidatePath)("/pm"),(0,g.revalidatePath)("/tasks")}(0,c(74252).D)([m,n,o,p,q,r,s,t,u]),(0,d.A)(m,"40adaed69cb8d09df8663f469d1825e20b94229a28",null),(0,d.A)(n,"40d4aa1ac73cd0c35762ae766b8a4ab8f72b189cc5",null),(0,d.A)(o,"601094db02622b1650a04f93ba9f7c60c1898fe1ee",null),(0,d.A)(p,"001a2dc3e3cd4a83a9f0652a1f87149de3b0a2fe0b",null),(0,d.A)(q,"40c6ca49335e5a5a81b8f2718fab1616da908d05ad",null),(0,d.A)(r,"60f0fa12d82f02c81401486163c234ed7c4d900709",null),(0,d.A)(s,"60aae24f29316acee8bda578d914faab688815449c",null),(0,d.A)(t,"407c494f8a4350ec1cef63beb366fd9297a03ceb67",null),(0,d.A)(u,"403790f8d775fbdd69a8747988af11021b3fc590de",null)},44842:(a,b,c)=>{c.d(b,{Lh:()=>t,NF:()=>v,PT:()=>w,jL:()=>u,ot:()=>q,yR:()=>r});var d=c(73024),e=c(76760),f=c(60547),g=c.n(f),h=c(97603),i=c(65705),j=c(1890),k=c(57086),l=c(70149),m=c(437),n=c(84903),o=c(77558),p=c(24701);async function q(a,b){let[c]=await i.db.select().from(j.goal).where((0,h.Uo)((0,h.eq)(j.goal.id,b),(0,h.eq)(j.goal.workspaceId,a)));return c}function r(a){return(a||"work").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,40)||"work"}async function s(a,b){for(let c of(await i.db.select().from(j.task).where((0,h.Uo)((0,h.eq)(j.task.workspaceId,a),(0,h.eq)(j.task.goalId,b)))))(0,l.KD)(c.id),("todo"===c.col||"doing"===c.col)&&(await i.db.update(j.task).set({col:"blocked"}).where((0,h.eq)(j.task.id,c.id)),c.issueId&&await i.db.update(j.issue).set({col:"blocked"}).where((0,h.eq)(j.issue.id,c.issueId))),c.assigneeId&&await i.db.update(j.agent).set({status:"idle"}).where((0,h.eq)(j.agent.id,c.assigneeId))}async function t(a,b){for(let c of(await i.db.select().from(j.task).where((0,h.Uo)((0,h.eq)(j.task.workspaceId,a),(0,h.eq)(j.task.goalId,b),(0,h.eq)(j.task.col,"blocked")))))await i.db.update(j.task).set({col:"todo"}).where((0,h.eq)(j.task.id,c.id)),c.issueId&&await i.db.update(j.issue).set({col:"todo"}).where((0,h.eq)(j.issue.id,c.issueId))}async function u(a,b,c){await i.db.update(j.spec).set({status:c}).where((0,h.Uo)((0,h.eq)(j.spec.workspaceId,a),(0,h.eq)(j.spec.goalId,b))),await i.db.update(j.issue).set({status:c}).where((0,h.Uo)((0,h.eq)(j.issue.workspaceId,a),(0,h.eq)(j.issue.goalId,b)))}async function v(a,b){let c=await q(a,b);return c?(await i.db.update(j.goal).set({status:"cancelled",cancelledAt:new Date}).where((0,h.eq)(j.goal.id,b)),await u(a,b,"cancelled"),await (0,o.TC)(a,b),await s(a,b),await (0,n.j)(a,{text:`Cancelled goal: ${c.title}`,by:"operator",source:"operator-instruction",goalId:b}),await (0,p.I)(a,{kind:"info",text:`Goal cancelled — ${c.title}`,detail:"Execution stopped; state preserved. Reopen to resume."}),{ok:!0,title:c.title}):{ok:!1}}async function w(a,b,c){let f=await q(b,c);if(!f)return{ok:!1};let l=(0,k.HZ)(a),[t,v,w,x,y]=await Promise.all([i.db.select().from(j.spec).where((0,h.Uo)((0,h.eq)(j.spec.workspaceId,b),(0,h.eq)(j.spec.goalId,c))),i.db.select().from(j.issue).where((0,h.Uo)((0,h.eq)(j.issue.workspaceId,b),(0,h.eq)(j.issue.goalId,c))),i.db.select().from(j.task).where((0,h.Uo)((0,h.eq)(j.task.workspaceId,b),(0,h.eq)(j.task.goalId,c))),i.db.select().from(j.decision).where((0,h.Uo)((0,h.eq)(j.decision.workspaceId,b),(0,h.eq)(j.decision.goalId,c))),i.db.select().from(j.report).where((0,h.Uo)((0,h.eq)(j.report.workspaceId,b),(0,h.eq)(j.report.goalId,c)))]),z=w.map(a=>a.id),A=z.length?await i.db.select().from(j.taskStep).where((0,h.RV)(j.taskStep.taskId,z)):[],B=await (0,m.Y)(b,c),C=new(g()),D=0;for(let a of B){let b=(0,e.join)(l,a);if((0,d.existsSync)(b))try{C.addFile("files/"+a,(0,d.readFileSync)(b)),D++}catch{}}let E={goal:f,specs:t,issues:v,tasks:w,taskSteps:A,decisions:x,reports:y,fileCount:D,archivedAt:new Date().toISOString()},F=[`# Archived work — ${f.title}`,"",`Status at archive: ${f.status} \xb7 progress ${f.progress}%`,"",`## Specs (${t.length})`,...t.map(a=>`- ${a.key} ${a.title}`),"",`## Issues (${v.length})`,...v.map(a=>`- ${a.key} [${a.col}] ${a.title}`),"",`## Decisions (${x.length})`,...x.map(a=>`- ${a.text} (${a.by})`),"",`## Source files (${D})`,...B.map(a=>`- ${a}`),""].join("\n");C.addFile("MANIFEST.json",Buffer.from(JSON.stringify(E,null,2))),C.addFile("MANIFEST.md",Buffer.from(F));let G=(0,e.join)(l,"archives");(0,d.mkdirSync)(G,{recursive:!0});let H=`archives/${r(f.title)}-${new Date().toISOString().slice(0,10)}-${c.slice(0,6)}.zip`;try{C.writeZip((0,e.join)(l,H))}catch(a){return console.error("[archiveGoalFor] zip failed:",a),{ok:!1}}return await i.db.update(j.goal).set({status:"archived",archivePath:H,archivedAt:new Date}).where((0,h.eq)(j.goal.id,c)),await u(b,c,"archived"),await (0,o.TC)(b,c),await s(b,c),await (0,n.j)(b,{text:`Archived goal: ${f.title} → ${H}`,by:"operator",source:"operator-instruction",goalId:c}),await (0,p.I)(b,{kind:"info",text:`Goal archived — ${f.title}`,detail:`${D} files + manifest zipped to ${H}.`}),{ok:!0,path:H,title:f.title}}},60686:(a,b,c)=>{c.d(b,{Fy:()=>m,KD:()=>q,Rr:()=>l,TH:()=>s,Xu:()=>r,j0:()=>n,nx:()=>o,zC:()=>p});var d=c(6866),e=c(31371),f=c(53993),g=c(63562),h=c(81204),i=c(70221),j=c(77558),k=c(24701);async function l(){let{org:a,workspace:b}=await (0,f.nP)(),c=await (0,g.ZF)(b.id,a.id);return(0,e.revalidatePath)("/test-dev"),c}async function m(){let{workspace:a}=await (0,f.nP)(),b=await (0,g.n9)(a.id);return(0,e.revalidatePath)("/test-dev"),b}async function n(){let{workspace:a}=await (0,f.nP)();return(0,g.CS)(a.id)}async function o(){let{org:a,workspace:b}=await (0,f.nP)(),c=(0,g.CS)(b.id);if("running"!==c.status&&"starting"!==c.status&&(c=await (0,g.ZF)(b.id,a.id)),!c.url||"running"!==c.status&&"starting"!==c.status)return{ok:!1,error:"The dev server isn't running — start the app first."};let d=await (0,h.nK)(b.id,c.url);return d?{ok:!0,url:d.url}:{ok:!1,error:"Could not start the inspect proxy."}}async function p(){let{workspace:a}=await (0,f.nP)();return(0,h.hA)(a.id),{ok:!0}}async function q(a){if(await (0,f.nP)(),!/^https?:\/\/(127\.0\.0\.1|localhost)(:\d+)?/i.test(a))return{frameable:!0};try{let b=await fetch(a,{redirect:"manual",signal:AbortSignal.timeout(3e3)}),c=(b.headers.get("x-frame-options")||"").toLowerCase(),d=(b.headers.get("content-security-policy")||"").toLowerCase(),e=/frame-ancestors\s+([^;]+)/.exec(d)?.[1]??"",f=c.includes("deny")||c.includes("sameorigin"),g=!!e&&!/(\*|localhost|127\.0\.0\.1)/.test(e);return{frameable:!(f||g)}}catch{return{frameable:!0}}}async function r(a){let{org:b,workspace:c}=await (0,f.nP)(),d=a?.issueId?await (0,i.B)(c.id,a.issueId):void 0,g=await (0,i.z)(c.id,b.id,{goalId:a?.goalId,issueId:a?.issueId,routes:d,by:"operator"});return(0,e.revalidatePath)("/test-dev"),g}async function s(a,b){let{workspace:c}=await (0,f.nP)();return await (0,j.vE)(c.id,{kind:"validation",refType:"validation",refId:a,title:`Validate ${a}`,detail:b.slice(0,500)}),await (0,k.I)(c.id,{kind:"review",text:`Validation requested — ${a}`,detail:b.slice(0,300)}),(0,e.revalidatePath)("/inbox"),{ok:!0}}(0,c(74252).D)([l,m,n,o,p,q,r,s]),(0,d.A)(l,"0025702d9be00ab981752267c30f22148e1156d08d",null),(0,d.A)(m,"001a3a28426f79abc91d40fa7dd4cbfd43e3d36131",null),(0,d.A)(n,"004d8d9e8033cc5ebc8e4bc28d5a0b17c3a5f1a42c",null),(0,d.A)(o,"00e7096e00c8dea3583e5b0ed9bcdf52d4b3b42bd5",null),(0,d.A)(p,"003313fcedf1513e66577ac56f5f63a9dc25f333a3",null),(0,d.A)(q,"40491c74154aedc3bfa423d1b839aa0e79a0901a39",null),(0,d.A)(r,"4080fd438c1b3c444b71999be816e9aacd959ad4e7",null),(0,d.A)(s,"60d4ee67d4835094e07f66aebe55ebbf965ee7aef0",null)},84979:(a,b,c)=>{c.d(b,{runSlashCommand:()=>ay});var d=c(77598),e=c(97603),f=c(95357),g=c(65705),h=c(1890),i=c(56338),j=c(57300),k=c(45125),l=c(33644),m=c(13328),n=c(44842),o=c(60686),p=c(69783),q=c(6866),r=c(73024),s=c(76760),t=c(48161),u=c(31371),v=c(53993),w=c(38926),x=c(57086),y=c(70149),z=c(78161),A=c(79505),B=c(63562),C=c(3196),D=c(77558),E=c(24701);let F=!1;function G(){F||(F=!0,g.F.exec(`
2
2
  CREATE TABLE IF NOT EXISTS deploy_run (
3
3
  id TEXT PRIMARY KEY,
4
4
  workspace_id TEXT NOT NULL REFERENCES workspace(id) ON DELETE CASCADE,
@@ -27,11 +27,11 @@ coverage/
27
27
  .env.*
28
28
  !.env.example
29
29
  .DS_Store
30
- `;function Q(a,b,c){if(a)try{let c=(0,s.join)(a.dir,b);if((0,r.existsSync)(c))return(0,r.readFileSync)(c,"utf8")}catch{}return(0,x.sL)(c,b)}function R(a,b){let c=Q(a,"package.json",b);if(!c)return null;try{return JSON.parse(c)}catch{return null}}function S(a){let b=(0,B.pp)(a);return!!b&&["dist","build","out",".next",".output","target/release","bin"].some(a=>{try{return(0,r.existsSync)((0,s.join)(b.dir,a))}catch{return!1}})}function T(a){return(a.stderr||a.stdout||"").replace(/\s+/g," ").trim().slice(-180)}let U=/\.(ts|tsx|js|jsx|mjs|cjs|py|go|rs|vue|svelte)$/i,V=/(?:process\.env\.([A-Z][A-Z0-9_]*)|process\.env\[['"]([A-Z][A-Z0-9_]*)['"]\]|import\.meta\.env\.([A-Z][A-Z0-9_]*)|os\.environ(?:\.get)?\(\s*['"]([A-Z][A-Z0-9_]*)['"]|os\.getenv\(\s*['"]([A-Z][A-Z0-9_]*)['"]|os\.Getenv\(\s*['"]([A-Z][A-Z0-9_]*)['"])/g,W=new Set(["NODE_ENV","PORT","HOST","PWD","HOME","PATH","CI","TZ","VERCEL","VERCEL_ENV"]);async function X(a){let b,c=(0,B.pp)(a),d=c?.kind??"unknown",e=R(c,a),f={...e?.dependencies??{},...e?.devDependencies??{}},g=function(a){if(!a)return[];let b=[];for(let c of a.split("\n")){let a=/^\s*([A-Z][A-Z0-9_]*)\s*=(.*)$/.exec(c);if(!a)continue;let d=a[2].trim().replace(/^["']|["']$/g,"");b.push({key:a[1],hasValue:d.length>0&&!/^(your[_-]|<|change[_-]?me|xxx|placeholder|example)/i.test(d)})}return b}(Q(c,".env.example",a)??Q(c,".env.sample",a)??Q(c,".env.template",a)),h=new Set(g.map(a=>a.key)),i=function(a){let b=new Set,c=0;for(let d of(0,x.CS)(a)){if(!U.test(d))continue;if(c++>1500)break;let e=(0,x.sL)(a,d);if(e&&!(e.length>524288))for(let a of e.matchAll(V)){let c=a[1]||a[2]||a[3]||a[4]||a[5]||a[6];c&&b.add(c)}}return b}(a),j=[...i].filter(a=>!h.has(a)&&!W.has(a)).sort().slice(0,40),{ports:k,hasDockerfile:l,hasCompose:m}=function(a,b){let c=new Set,d=Q(a,"Dockerfile",b);if(d)for(let a of d.matchAll(/EXPOSE\s+(\d+)/gi))c.add(Number(a[1]));let e=Q(a,"docker-compose.yml",b)??Q(a,"docker-compose.yaml",b)??Q(a,"compose.yml",b)??Q(a,"compose.yaml",b);if(e)for(let a of e.matchAll(/(\d{2,5}):\d{2,5}/g))c.add(Number(a[1]));return{ports:[...c].filter(a=>a>0&&a<65536).slice(0,12),hasDockerfile:null!=d,hasCompose:null!=e}}(c,a);return{detected:!!c,runtime:d,packageManager:"node"===d?c.runCmd:void 0,framework:"next"in f?"Next.js app":"nuxt"in f?"Nuxt app":"@remix-run/react"in f?"Remix app":"@angular/core"in f?"Angular app":"svelte"in f||"@sveltejs/kit"in f?"Svelte app":"vue"in f?"Vue app":"react"in f?"React app":"@nestjs/core"in f?"Nest API":"express"in f||"fastify"in f||"koa"in f||"@hapi/hapi"in f?"Node server":"python"===d?"Python service":"go"===d?"Go service":"rust"===d?"Rust service":"static"===d?"Static site":"node"===d?"Node app":void 0,projectName:c?.name,runLabel:c?.label,requiredEnv:g,referencedEnvCount:i.size,unsetEnvKeys:j,database:"node"===d?(b=(...a)=>a.some(a=>a in f))("pg","postgres","mysql","mysql2","better-sqlite3","sqlite3","sequelize","prisma","drizzle-orm","typeorm","knex")?"relational":b("mongodb","mongoose")?"document":b("redis","ioredis")?"key-value":"none":"none",ports:k,hasDockerfile:l,hasCompose:m,buildScript:e?.scripts?.build,startScript:e?.scripts?.start,mode:c?S(a)?"prod":"dev":"unknown"}}async function Y(){let{org:a}=await (0,v.nP)();return X(a.id)}function Z(a,b){let c=(0,x.HZ)(b),d=[],e=[],f=0;for(let g of(0,x.CS)(b))if(function(a){let b=a.replace(/\\/g,"/"),c=b.split("/")[0];return!(M.has(c)||b.startsWith(".constella")||N.test(b)&&!O.test(b))}(g))try{let b=(0,s.join)(c,g),h=(0,s.join)(a,g);(0,r.mkdirSync)((0,s.dirname)(h),{recursive:!0}),(0,r.cpSync)(b,h);let i=0;try{i=(0,r.statSync)(b).size}catch{}let j=g.replace(/\\/g,"/");d.push({path:j,size:i}),f++;let k=(j.split("/").pop()??"").toLowerCase();/^(readme|license|licence|changelog|deploy|contributing)(\.|$)/.test(k)&&e.push(j)}catch{}return(0,r.writeFileSync)((0,s.join)(a,".gitignore"),P),{copied:f,docs:e,files:d}}async function $(a){let b=(0,s.join)((0,t.tmpdir)(),"constella-preview-"+(0,d.randomUUID)());try{(0,r.mkdirSync)(b,{recursive:!0});let c=Z(b,a),d=[];c.copied>0&&(await (0,y.d1)("git",["init","-b","main"],{cwd:b}),await (0,y.d1)("git",["add","-A"],{cwd:b}),d=(await (0,C.I)(b)).findings);let e=c.files.reduce((a,b)=>a+b.size,0),f=(0,x.CS)(a).length;return{files:c.files.slice(0,500),tree:function(a){let b=new Map,c=[];for(let d of a){let a=d.path.split("/");if(1===a.length)c.push({name:a[0],kind:"file",size:d.size});else{let c=a[0],e=b.get(c)??{size:0,count:0};e.size+=d.size,e.count+=1,b.set(c,e)}}return[...[...b.entries()].map(([a,b])=>({name:a,kind:"dir",size:b.size,childCount:b.count})).sort((a,b)=>a.name.localeCompare(b.name)),...c.sort((a,b)=>a.name.localeCompare(b.name))]}(c.files),totalBytes:e,includedCount:c.copied,ignoredCount:Math.max(0,f-c.copied),docs:c.docs,hasBuild:S(a),secrets:d,blocked:d.length>0}}catch(a){return{files:[],tree:[],totalBytes:0,includedCount:0,ignoredCount:0,docs:[],hasBuild:!1,secrets:[],blocked:!1,error:String(a instanceof Error?a.message:a)}}finally{try{(0,r.rmSync)(b,{recursive:!0,force:!0})}catch{}}}async function _(){let{org:a}=await (0,v.nP)();return $(a.id)}async function aa(a,b,c,d){let e=(0,B.pp)(a),f=R(e,a),g=a=>c.steps.find(b=>b.key===a)?.status,h=b=>null!=Q(e,b,a),i=!!e&&"node"===d.runtime&&(()=>{try{return(0,r.existsSync)((0,s.join)(e.dir,"node_modules"))}catch{return!1}})(),j=!!await (0,w.r6)(b,"github_pat").catch(()=>null),k=[],l=(a,b,c,d)=>k.push({key:a,label:b,status:c,detail:d});"node"===d.runtime?l("pkg","package.json valid",f?"ok":"fail",f?void 0:"missing or invalid"):l("pkg","Project manifest present",d.detected?"ok":"todo"),l("deps","Dependencies installed","node"!==d.runtime?d.detected?"ok":"todo":i||"done"===g("deps")?"ok":"todo"),l("envExample",".env.example present",d.requiredEnv.length>0||h(".env.example")?"ok":"todo"),l("envComplete","All used env vars documented",0===d.unsetEnvKeys.length?"ok":"warn",d.unsetEnvKeys.length?`${d.unsetEnvKeys.length} undocumented`:void 0);let m=g("secrets");l("secrets","No secrets in the product","blocked"===m?"fail":"done"===m?"ok":"todo");let n=g("build");l("build","Production build runs",d.buildScript?"done"===n?"ok":"error"===n?"fail":"todo":"warn",d.buildScript?void 0:"no build script");let o=g("tests");return l("tests","Tests pass",f?.scripts?.test?"done"===o?"ok":"error"===o?"fail":"todo":"warn",f?.scripts?.test?void 0:"no test script"),l("readme","README present",h("README.md")||h("readme.md")?"ok":"todo"),l("deployDoc","Deploy docs present",h("DEPLOY.md")?"ok":"todo"),l("internalExcluded","Internal files excluded from export","ok"),l("exportRepo","Export repository configured",j?"ok":"todo",j?void 0:"connect a token"),k}async function ab(){let{org:a,workspace:b}=await (0,v.nP)(),[c,d]=await Promise.all([J(b.id),X(a.id)]);return aa(a.id,b.id,c,d)}async function ac(){let{workspace:a}=await (0,v.nP)();return J(a.id)}async function ad(a){let b=await g.db.select().from(h.agent).where((0,e.eq)(h.agent.workspaceId,a));return b.find(a=>/devops/i.test(a.role))??b.find(a=>"ada"===a.handle)??b[0]??null}async function ae(a,b,c,f,i){let j=(0,y.hW)(c.adapter,c.model),k="claude"===j?c.model.includes("opus")?"opus":c.model.includes("haiku")?"haiku":"sonnet":void 0;await g.db.update(h.agent).set({status:"working"}).where((0,e.eq)(h.agent.id,c.id));let{prompt:l}=await (0,z.s)({orgId:a,ws:b,agent:c,channel:"deploy",instruction:f}),m=await (0,y.p1)(l,{orgId:a,binary:j,model:k,timeoutMs:6e5},a=>{"done"!==a.kind&&(0,A.I)(b.id,{runId:i,channel:"deploy",agentId:c.id,kind:a.kind,target:a.target,detail:a.detail})});return await g.db.update(h.agent).set({status:"idle"}).where((0,e.eq)(h.agent.id,c.id)),(m.usd>0||m.inputTokens+m.outputTokens>0)&&await g.db.insert(h.costEntry).values({id:(0,d.randomUUID)(),workspaceId:b.id,agentId:c.id,provider:m.binary,model:m.model??c.model,usd:m.usd,tokens:m.inputTokens+m.outputTokens,at:new Date}),m}let af=[{key:"analyze",label:"Analyze the project"},{key:"deps",label:"Validate dependencies"},{key:"env",label:"Validate environment variables"},{key:"tests",label:"Run tests"},{key:"secrets",label:"Security scan"},{key:"build",label:"Production build"},{key:"validateBuild",label:"Validate build"},{key:"agent",label:"Configure env, fix & document"},{key:"package",label:"Prepare clean package"}];async function ag(){let{org:a,workspace:b}=await (0,v.nP)(),c=b.id,e=await J(c);if("running"===e.status&&e.startedAt&&Date.now()-e.startedAt<9e5)return e;let f=(0,d.randomUUID)(),g=af.map(a=>({key:a.key,label:a.label,status:"waiting"}));await K(c,{status:"running",runId:f,startedAt:Date.now(),steps:g,summary:"",buildLog:""});let h=async(a,b,d)=>{let e=g.findIndex(b=>b.key===a);e>=0&&(g[e]={...g[e],status:b,detail:d,..."running"===b?{startedAt:Date.now()}:{endedAt:Date.now()}}),await K(c,{steps:g}),(0,A.I)(c,{runId:f,channel:"deploy",agentId:null,kind:"text",target:"",detail:`${af.find(b=>b.key===a)?.label??a}${d?" — "+d:""}`})},i=(0,B.pp)(a.id),j=await X(a.id),k="",l=async(b,d)=>{let e=await aa(a.id,c,await J(c),j);return await K(c,{status:b,summary:d,checklist:e,buildLog:k}),(0,A.I)(c,{runId:f,channel:"deploy",agentId:null,kind:"failed"===b?"error":"done",target:"prep complete",detail:d.slice(0,160)}),await (0,E.I)(c,{kind:"deploy",text:"done"===b?"Production prep finished":"blocked"===b?"Prep blocked — secrets found":"Production prep failed",detail:d.slice(0,200)}),(0,u.revalidatePath)("/prepare-deploy"),J(c)};try{var m,n;if(await h("analyze","running"),!i)return await h("analyze","error","No runnable project detected."),l("failed","No runnable project detected in the workspace.");if(await h("analyze","done",`${j.framework??j.runtime}${i.label?" \xb7 "+i.label:""}`),await h("deps","running"),i.install){let a=await (0,y.d1)(i.install.cmd,i.install.args,{cwd:i.dir,timeoutMs:3e5,env:{...process.env,CI:"1"}});await h("deps",0===a.code?"done":"error",0===a.code?"dependencies installed":a.timedOut?"install timed out":T(a))}else await h("deps","done","already installed");await h("env","running"),await h("env",j.unsetEnvKeys.length?"needs-action":"done",j.unsetEnvKeys.length?`${j.unsetEnvKeys.length} var(s) missing from .env.example`:`${j.requiredEnv.length} documented`),await h("tests","running");let d=R(i,a.id);if("node"===j.runtime&&d?.scripts?.test){let a=await (0,y.d1)(i.runCmd,["test"],{cwd:i.dir,timeoutMs:3e5,env:{...process.env,CI:"1"}});await h("tests",0===a.code?"done":"error",0===a.code?"tests passing":a.timedOut?"tests timed out":T(a))}else await h("tests","needs-action","no automated test script");await h("secrets","running");let e=await $(a.id);if(e.blocked)return await h("secrets","blocked",`${e.secrets.length} potential secret(s)`),await (0,D.vE)(c,{kind:"block",refType:"task",refId:"deploy-prep",title:`Prep blocked — ${e.secrets.length} secret risk(s)`,detail:e.secrets.slice(0,5).map(a=>`${a.file}: ${a.kind}`).join("; ")}),l("blocked",`Blocked: ${e.secrets.length} potential secret(s) found in the product. Remove them and re-run.`);if(await h("secrets","done","no secrets found"),await h("build","running"),"node"===j.runtime&&j.buildScript){let a=await (0,y.d1)(i.runCmd,"npm"===i.runCmd?["run","build"]:["build"],{cwd:i.dir,timeoutMs:6e5,env:{...process.env,CI:"1"}});k=`build ${0===a.code?"OK":a.timedOut?"TIMED OUT":"FAILED ("+a.code+")"}
31
- `+(a.stdout+a.stderr).slice(-1800),await K(c,{buildLog:k}),await h("build",0===a.code?"done":"error",0===a.code?"build succeeded":"build failed — the agent will try to fix it")}else await h("build","needs-action","node"===j.runtime?"no build script":"no build step for this stack");await h("validateBuild","running");let g=await (0,B.VX)(c,a.id);await h("validateBuild",g.ok?"done":"error",g.ok?S(a.id)?"boots \xb7 build output present":"boots":g.detail.slice(0,160)),await h("agent","running");let o=await ad(c),p="";if(o){let c,d=await ae(a.id,b,o,(m=k,c=["FINISH PREPARING THIS PROJECT FOR PRODUCTION. Dependencies, tests, the secret scan and the production build have ALREADY been run by the system — focus on the remaining gaps.","Do, in order: (1) create/refresh `.env.example` documenting EVERY required environment variable (NEVER inline real secrets/tokens — use placeholders)."+(j.unsetEnvKeys.length?` The code references these vars not yet in .env.example: ${j.unsetEnvKeys.slice(0,30).join(", ")}.`:""),"(2) if the production build failed, FIX the errors until it builds clean;","(3) write/refresh a root `README.md` (what it is, install, run, configure) and a root `DEPLOY.md` with concrete build/run/deploy steps for this project's host;","(4) finish with a SHORT operator summary + the exact next steps to deploy.","Keep the existing product and its UX; do NOT add internal/control files or a second app."],m&&c.push("Latest production build output (tail):\n"+m.slice(-1200)),c.join("\n")),f);p=(d.text||"").slice(0,800),await h("agent",d.ok?"done":"error",d.ok?"configured env, docs & fixes":d.error?.slice(0,160)||"agent run failed")}else await h("agent","needs-action","no agent available to run");await h("package","running");let q=await $(a.id);return await h("package",q.blocked?"blocked":"done",q.blocked?`${q.secrets.length} secret risk(s) in the export set`:`${q.includedCount} file(s) \xb7 ${(n=q.totalBytes)<1024?`${n} B`:n<1048576?`${(n/1024).toFixed(1)} KB`:`${(n/1024/1024).toFixed(1)} MB`}`),l(q.blocked?"blocked":"done",p||`Prepared ${q.includedCount} clean file(s) for production.`)}catch(a){return l("failed",String(a instanceof Error?a.message:a).slice(0,300))}}async function ah(a,b,c){let e=(0,d.randomUUID)();(0,A.I)(a,{runId:e,channel:"deploy",agentId:null,kind:"run",target:b});try{let d=await c();return(0,A.I)(a,{runId:e,channel:"deploy",agentId:null,kind:"done",target:b}),d}catch(c){throw(0,A.I)(a,{runId:e,channel:"deploy",agentId:null,kind:"error",target:b,detail:String(c)}),c}}async function ai(){let{org:a,workspace:b}=await (0,v.nP)(),c=(0,B.pp)(a.id),d=R(c,a.id);return c&&"node"===c.kind&&d?.scripts?.build?ah(b.id,"production build",async()=>{let a=await (0,y.d1)(c.runCmd,"npm"===c.runCmd?["run","build"]:["build"],{cwd:c.dir,timeoutMs:6e5,env:{...process.env,CI:"1"}}),d=`build ${0===a.code?"OK":a.timedOut?"TIMED OUT":"FAILED ("+a.code+")"}
32
- `+(a.stdout+a.stderr).slice(-1800);return await K(b.id,{buildLog:d}),(0,u.revalidatePath)("/prepare-deploy"),{ok:0===a.code,log:d}}):{ok:!1,log:"No Node build script to run."}}async function aj(){let{org:a,workspace:b}=await (0,v.nP)(),c=(0,B.pp)(a.id),d=R(c,a.id);return c&&"node"===c.kind&&d?.scripts?.test?ah(b.id,"tests",async()=>{let a=await (0,y.d1)(c.runCmd,["test"],{cwd:c.dir,timeoutMs:3e5,env:{...process.env,CI:"1"}});return{ok:0===a.code,log:`tests ${0===a.code?"PASS":"FAIL"}
33
- `+(a.stdout+a.stderr).slice(-1800)}}):{ok:!1,log:"No test script to run."}}async function ak(a){let{org:b,workspace:c}=await (0,v.nP)(),e=await ad(c.id);if(!e)return{ok:!1,summary:"No agent available."};let f=await X(b.id),g=f.framework?`
34
- Project: ${f.framework}${f.unsetEnvKeys.length?`; undocumented env vars: ${f.unsetEnvKeys.slice(0,20).join(", ")}`:""}.`:"",h=(0,d.randomUUID)();(0,A.I)(c.id,{runId:h,channel:"deploy",agentId:e.id,kind:"run",target:"readme"===a?"generate README":"generate deploy docs"});let i=await ae(b.id,c,e,("readme"===a?"Write or refresh a clear root `README.md` for this project: what it is, prerequisites, install, run, configure (reference .env.example), and basic usage. Keep it accurate to the real code; do NOT invent features.":"Write or refresh a root `DEPLOY.md` with concrete production deploy steps for this project's stack/host: build, environment variables (reference .env.example, never real secrets), run command, and host-specific notes. Keep it accurate to the real project.")+g,h);return(0,A.I)(c.id,{runId:h,channel:"deploy",agentId:e.id,kind:"done",target:"done"}),(0,u.revalidatePath)("/prepare-deploy"),{ok:i.ok,summary:(i.text||"").slice(0,400)}}async function al(){return ak("readme")}async function am(){return ak("deploy")}async function an(a){let{org:b,workspace:c}=await (0,v.nP)(),e=(a.repo||"").trim().replace(/^https?:\/\/github\.com\//i,"").replace(/\.git$/,"");if(!/^[\w.-]+\/[\w.-]+$/.test(e))return{ok:!1,error:"Use the form owner/repo."};let f=a.token?.trim()||await (0,w.r6)(c.id,"github_pat");if(!f)return{ok:!1,error:"Provide a GitHub token (or connect one in Commit GitHub first)."};let g=a=>f?a.split(f).join("***"):a;try{let a=await fetch(`https://api.github.com/repos/${e}`,{headers:{Authorization:`Bearer ${f}`,"User-Agent":"constella",Accept:"application/vnd.github+json"},signal:AbortSignal.timeout(12e3)});if(404===a.status)return{ok:!1,error:"Repo not found, or this token can't access it."};if(!a.ok)return{ok:!1,error:`GitHub ${a.status}`}}catch{return{ok:!1,error:"Couldn't reach GitHub."}}let h=(0,s.join)((0,t.tmpdir)(),"constella-export-"+(0,d.randomUUID)()),i=a.branch?.trim()||"main";try{(0,r.mkdirSync)(h,{recursive:!0});let d=Z(h,b.id);if(0===d.copied)return{ok:!1,error:"Nothing to export yet — no clean product source files were found."};await (0,y.d1)("git",["init","-b",i],{cwd:h}),await (0,y.d1)("git",["add","-A"],{cwd:h});let j=await (0,C.I)(h);if(j.findings.length)return await (0,D.vE)(c.id,{kind:"block",refType:"task",refId:`export-${e}`,title:`Export blocked — ${j.findings.length} secret risk(s)`,detail:j.findings.slice(0,5).map(a=>`${a.file}: ${a.kind}`).join("; ")}),await (0,E.I)(c.id,{kind:"security",text:`Clean export blocked — ${j.findings.length} secret risk(s)`,detail:`Resolve before exporting to ${e}.`}),(0,u.revalidatePath)("/prepare-deploy"),(0,u.revalidatePath)("/inbox"),{ok:!1,blocked:!0,secrets:j.findings,error:`Blocked: ${j.findings.length} potential secret(s) in the export set.`};await (0,y.d1)("git",["-c","user.email=agents@constella.dev","-c","user.name=Constella Agents","commit","-m",a.message?.trim()||"chore: export clean source"],{cwd:h});let k=(await (0,y.d1)("git",["rev-parse","HEAD"],{cwd:h})).stdout.trim().slice(0,7),l=`https://x-access-token:${f}@github.com/${e}.git`,m=await (0,y.d1)("git",["push","-f",l,`HEAD:${i}`],{cwd:h,timeoutMs:12e4});if(0!==m.code)return{ok:!1,error:g((m.stderr||"git push failed").slice(-300))};return await K(c.id,{lastExport:{ok:!0,sha:k,copied:d.copied,repo:e,branch:i,at:Date.now()}}),(0,u.revalidatePath)("/prepare-deploy"),{ok:!0,pushed:!0,sha:k,copied:d.copied}}catch(a){return{ok:!1,error:g(String(a instanceof Error?a.message:a))}}finally{try{(0,r.rmSync)(h,{recursive:!0,force:!0})}catch{}}}(0,L.D)([Y,_,ab,ac,ag,ai,aj,al,am,an]),(0,q.A)(Y,"00dbcc5dc864b46aa3e442fb4365901da8917af9e1",null),(0,q.A)(_,"0002bc384a352cb7d0679450153bd31e96fce868ee",null),(0,q.A)(ab,"00dfb1e3aad53e012572704d5495dae9e9731be9ff",null),(0,q.A)(ac,"008ed591719d85a68d45b97fdd76d39382a3083825",null),(0,q.A)(ag,"00712b9ccbf8d8c1d2d9899d149775a32e64f0234e",null),(0,q.A)(ai,"0074facb1045783f8fa29b198c39804e57a42e2372",null),(0,q.A)(aj,"001c3465b4e63abb94aa0be768f001bcd00a901876",null),(0,q.A)(al,"00610235a1b4206753c6419f0974445ca7e4ada61d",null),(0,q.A)(am,"00636793f9eef57562607ef7b4cd341e1e1e24dd24",null),(0,q.A)(an,"40c076575eea63988ecfaf7ee3a36bea40effac2dc",null);var ao=c(88007),ap=c(31578),aq=c(93571),ar=c(10335),as=c(23297),at=c(44239);let au=`Available commands:
30
+ `;function Q(a,b,c){if(a)try{let c=(0,s.join)(a.dir,b);if((0,r.existsSync)(c))return(0,r.readFileSync)(c,"utf8")}catch{}return(0,x.sL)(c,b)}function R(a,b){let c=Q(a,"package.json",b);if(!c)return null;try{return JSON.parse(c)}catch{return null}}function S(a){let b=(0,B.pp)(a);return!!b&&["dist","build","out",".next",".output","target/release","bin"].some(a=>{try{return(0,r.existsSync)((0,s.join)(b.dir,a))}catch{return!1}})}function T(a){return(a.stderr||a.stdout||"").replace(/\s+/g," ").trim().slice(-180)}let U=/\.(ts|tsx|js|jsx|mjs|cjs|py|go|rs|vue|svelte)$/i,V=/(?:process\.env\.([A-Z][A-Z0-9_]*)|process\.env\[['"]([A-Z][A-Z0-9_]*)['"]\]|import\.meta\.env\.([A-Z][A-Z0-9_]*)|os\.environ(?:\.get)?\(\s*['"]([A-Z][A-Z0-9_]*)['"]|os\.getenv\(\s*['"]([A-Z][A-Z0-9_]*)['"]|os\.Getenv\(\s*['"]([A-Z][A-Z0-9_]*)['"])/g,W=new Set(["NODE_ENV","PORT","HOST","PWD","HOME","PATH","CI","TZ","VERCEL","VERCEL_ENV"]);async function X(a){let b,c=(0,B.pp)(a),d=c?.kind??"unknown",e=R(c,a),f={...e?.dependencies??{},...e?.devDependencies??{}},g=function(a){if(!a)return[];let b=[];for(let c of a.split("\n")){let a=/^\s*([A-Z][A-Z0-9_]*)\s*=(.*)$/.exec(c);if(!a)continue;let d=a[2].trim().replace(/^["']|["']$/g,"");b.push({key:a[1],hasValue:d.length>0&&!/^(your[_-]|<|change[_-]?me|xxx|placeholder|example)/i.test(d)})}return b}(Q(c,".env.example",a)??Q(c,".env.sample",a)??Q(c,".env.template",a)),h=new Set(g.map(a=>a.key)),i=function(a){let b=new Set,c=0;for(let d of(0,x.CS)(a)){if(!U.test(d))continue;if(c++>1500)break;let e=(0,x.sL)(a,d);if(e&&!(e.length>524288))for(let a of e.matchAll(V)){let c=a[1]||a[2]||a[3]||a[4]||a[5]||a[6];c&&b.add(c)}}return b}(a),j=[...i].filter(a=>!h.has(a)&&!W.has(a)).sort().slice(0,40),{ports:k,hasDockerfile:l,hasCompose:m}=function(a,b){let c=new Set,d=Q(a,"Dockerfile",b);if(d)for(let a of d.matchAll(/EXPOSE\s+(\d+)/gi))c.add(Number(a[1]));let e=Q(a,"docker-compose.yml",b)??Q(a,"docker-compose.yaml",b)??Q(a,"compose.yml",b)??Q(a,"compose.yaml",b);if(e)for(let a of e.matchAll(/^[ \t]*-[ \t]*["']?(\d{2,5}):\d{2,5}\b/gm))c.add(Number(a[1]));return{ports:[...c].filter(a=>a>0&&a<65536).slice(0,12),hasDockerfile:null!=d,hasCompose:null!=e}}(c,a);return{detected:!!c,runtime:d,packageManager:"node"===d?c.runCmd:void 0,framework:"next"in f?"Next.js app":"nuxt"in f?"Nuxt app":"@remix-run/react"in f?"Remix app":"@angular/core"in f?"Angular app":"svelte"in f||"@sveltejs/kit"in f?"Svelte app":"vue"in f?"Vue app":"react"in f?"React app":"@nestjs/core"in f?"Nest API":"express"in f||"fastify"in f||"koa"in f||"@hapi/hapi"in f?"Node server":"python"===d?"Python service":"go"===d?"Go service":"rust"===d?"Rust service":"static"===d?"Static site":"node"===d?"Node app":void 0,projectName:c?.name,runLabel:c?.label,requiredEnv:g,referencedEnvCount:i.size,unsetEnvKeys:j,database:"node"===d?(b=(...a)=>a.some(a=>a in f))("pg","postgres","mysql","mysql2","better-sqlite3","sqlite3","sequelize","prisma","drizzle-orm","typeorm","knex")?"relational":b("mongodb","mongoose")?"document":b("redis","ioredis")?"key-value":"none":"none",ports:k,hasDockerfile:l,hasCompose:m,buildScript:e?.scripts?.build,startScript:e?.scripts?.start,mode:c?S(a)?"prod":"dev":"unknown"}}async function Y(){let{org:a}=await (0,v.nP)();return X(a.id)}function Z(a,b){let c=(0,x.HZ)(b),d=[],e=[],f=0;for(let g of(0,x.CS)(b))if(function(a){let b=a.replace(/\\/g,"/"),c=b.split("/")[0];return!(M.has(c)||b.startsWith(".constella")||N.test(b)&&!O.test(b))}(g))try{let b=(0,s.join)(c,g),h=(0,s.join)(a,g);(0,r.mkdirSync)((0,s.dirname)(h),{recursive:!0}),(0,r.cpSync)(b,h);let i=0;try{i=(0,r.statSync)(b).size}catch{}let j=g.replace(/\\/g,"/");d.push({path:j,size:i}),f++;let k=(j.split("/").pop()??"").toLowerCase();/^(readme|license|licence|changelog|deploy|contributing)(\.|$)/.test(k)&&e.push(j)}catch{}return(0,r.writeFileSync)((0,s.join)(a,".gitignore"),P),{copied:f,docs:e,files:d}}async function $(a){let b=(0,s.join)((0,t.tmpdir)(),"constella-preview-"+(0,d.randomUUID)());try{(0,r.mkdirSync)(b,{recursive:!0});let c=Z(b,a),d=[];c.copied>0&&(await (0,y.d1)("git",["init","-b","main"],{cwd:b}),await (0,y.d1)("git",["add","-A"],{cwd:b}),d=(await (0,C.I)(b)).findings);let e=c.files.reduce((a,b)=>a+b.size,0),f=(0,x.CS)(a).length;return{files:c.files.slice(0,500),tree:function(a){let b=new Map,c=[];for(let d of a){let a=d.path.split("/");if(1===a.length)c.push({name:a[0],kind:"file",size:d.size});else{let c=a[0],e=b.get(c)??{size:0,count:0};e.size+=d.size,e.count+=1,b.set(c,e)}}return[...[...b.entries()].map(([a,b])=>({name:a,kind:"dir",size:b.size,childCount:b.count})).sort((a,b)=>a.name.localeCompare(b.name)),...c.sort((a,b)=>a.name.localeCompare(b.name))]}(c.files),totalBytes:e,includedCount:c.copied,ignoredCount:Math.max(0,f-c.copied),docs:c.docs,hasBuild:S(a),secrets:d,blocked:d.length>0}}catch(a){return{files:[],tree:[],totalBytes:0,includedCount:0,ignoredCount:0,docs:[],hasBuild:!1,secrets:[],blocked:!1,error:String(a instanceof Error?a.message:a)}}finally{try{(0,r.rmSync)(b,{recursive:!0,force:!0})}catch{}}}async function _(){let{org:a}=await (0,v.nP)();return $(a.id)}async function aa(a,b,c,d){let e=(0,B.pp)(a),f=R(e,a),g=a=>c.steps.find(b=>b.key===a)?.status,h=b=>null!=Q(e,b,a),i=!!e&&"node"===d.runtime&&(()=>{try{return(0,r.existsSync)((0,s.join)(e.dir,"node_modules"))}catch{return!1}})(),j=!!await (0,w.r6)(b,"github_pat").catch(()=>null),k=[],l=(a,b,c,d)=>k.push({key:a,label:b,status:c,detail:d});"node"===d.runtime?l("pkg","package.json valid",f?"ok":"fail",f?void 0:"missing or invalid"):l("pkg","Project manifest present",d.detected?"ok":"todo"),l("deps","Dependencies installed","node"!==d.runtime?d.detected?"ok":"todo":i||"done"===g("deps")?"ok":"todo"),l("envExample",".env.example present",d.requiredEnv.length>0||h(".env.example")?"ok":"todo"),l("envComplete","All used env vars documented",0===d.unsetEnvKeys.length?"ok":"warn",d.unsetEnvKeys.length?`${d.unsetEnvKeys.length} undocumented`:void 0);let m=g("secrets");l("secrets","No secrets in the product","blocked"===m?"fail":"done"===m?"ok":"todo");let n=g("build");l("build","Production build runs",d.buildScript?"done"===n?"ok":"error"===n?"fail":"todo":"warn",d.buildScript?void 0:"no build script");let o=g("tests");return l("tests","Tests pass",f?.scripts?.test?"done"===o?"ok":"error"===o?"fail":"todo":"warn",f?.scripts?.test?void 0:"no test script"),l("readme","README present",h("README.md")||h("readme.md")?"ok":"todo"),l("deployDoc","Deploy docs present",h("DEPLOY.md")?"ok":"todo"),l("internalExcluded","Internal files excluded from export","ok"),l("exportRepo","Export repository configured",j?"ok":"todo",j?void 0:"connect a token"),k}async function ab(){let{org:a,workspace:b}=await (0,v.nP)(),[c,d]=await Promise.all([J(b.id),X(a.id)]);return aa(a.id,b.id,c,d)}async function ac(){let{workspace:a}=await (0,v.nP)();return J(a.id)}async function ad(a){let b=await g.db.select().from(h.agent).where((0,e.eq)(h.agent.workspaceId,a));return b.find(a=>/devops/i.test(a.role))??b.find(a=>"ada"===a.handle)??b[0]??null}async function ae(a,b,c,f,i){let j=(0,y.hW)(c.adapter,c.model),k="claude"===j?c.model.includes("opus")?"opus":c.model.includes("haiku")?"haiku":"sonnet":void 0;await g.db.update(h.agent).set({status:"working"}).where((0,e.eq)(h.agent.id,c.id));let{prompt:l}=await (0,z.s)({orgId:a,ws:b,agent:c,channel:"deploy",instruction:f}),m=await (0,y.p1)(l,{orgId:a,binary:j,model:k,timeoutMs:6e5},a=>{"done"!==a.kind&&(0,A.I)(b.id,{runId:i,channel:"deploy",agentId:c.id,kind:a.kind,target:a.target,detail:a.detail})});return await g.db.update(h.agent).set({status:"idle"}).where((0,e.eq)(h.agent.id,c.id)),(m.usd>0||m.inputTokens+m.outputTokens>0)&&await g.db.insert(h.costEntry).values({id:(0,d.randomUUID)(),workspaceId:b.id,agentId:c.id,provider:m.binary,model:m.model??c.model,usd:m.usd,tokens:m.inputTokens+m.outputTokens,at:new Date}),m}let af=[{key:"analyze",label:"Analyze the project"},{key:"deps",label:"Validate dependencies"},{key:"env",label:"Validate environment variables"},{key:"tests",label:"Run tests"},{key:"secrets",label:"Security scan"},{key:"build",label:"Production build"},{key:"validateBuild",label:"Validate build"},{key:"agent",label:"Configure env, fix & document"},{key:"package",label:"Prepare clean package"}],ag=new Map;async function ah(){let{org:a,workspace:b}=await (0,v.nP)(),c=b.id,e=ag.get(c);if(e&&Date.now()-e<9e5)return J(c);ag.set(c,Date.now());let f=await J(c);if("running"===f.status&&f.startedAt&&Date.now()-f.startedAt<9e5)return ag.delete(c),f;let g=(0,d.randomUUID)(),h=af.map(a=>({key:a.key,label:a.label,status:"waiting"}));await K(c,{status:"running",runId:g,startedAt:Date.now(),steps:h,summary:"",buildLog:""});let i=async(a,b,d)=>{let e=h.findIndex(b=>b.key===a);e>=0&&(h[e]={...h[e],status:b,detail:d,..."running"===b?{startedAt:Date.now()}:{endedAt:Date.now()}}),await K(c,{steps:h}),(0,A.I)(c,{runId:g,channel:"deploy",agentId:null,kind:"text",target:"",detail:`${af.find(b=>b.key===a)?.label??a}${d?" — "+d:""}`})},j=(0,B.pp)(a.id),k=await X(a.id),l="",m=async(b,d)=>{ag.delete(c);let e=await aa(a.id,c,await J(c),k);return await K(c,{status:b,summary:d,checklist:e,buildLog:l}),(0,A.I)(c,{runId:g,channel:"deploy",agentId:null,kind:"failed"===b?"error":"done",target:"prep complete",detail:d.slice(0,160)}),await (0,E.I)(c,{kind:"deploy",text:"done"===b?"Production prep finished":"blocked"===b?"Prep blocked — secrets found":"Production prep failed",detail:d.slice(0,200)}),(0,u.revalidatePath)("/prepare-deploy"),J(c)};try{var n,o;if(await i("analyze","running"),!j)return await i("analyze","error","No runnable project detected."),m("failed","No runnable project detected in the workspace.");if(await i("analyze","done",`${k.framework??k.runtime}${j.label?" \xb7 "+j.label:""}`),await i("deps","running"),j.install){let a=await (0,y.d1)(j.install.cmd,j.install.args,{cwd:j.dir,timeoutMs:3e5,env:{...process.env,CI:"1"}});await i("deps",0===a.code?"done":"error",0===a.code?"dependencies installed":a.timedOut?"install timed out":T(a))}else await i("deps","done","already installed");await i("env","running"),await i("env",k.unsetEnvKeys.length?"needs-action":"done",k.unsetEnvKeys.length?`${k.unsetEnvKeys.length} var(s) missing from .env.example`:`${k.requiredEnv.length} documented`),await i("tests","running");let d=R(j,a.id);if("node"===k.runtime&&d?.scripts?.test){let a=await (0,y.d1)(j.runCmd,["test"],{cwd:j.dir,timeoutMs:3e5,env:{...process.env,CI:"1"}});await i("tests",0===a.code?"done":"error",0===a.code?"tests passing":a.timedOut?"tests timed out":T(a))}else await i("tests","needs-action","no automated test script");await i("secrets","running");let e=await $(a.id);if(e.blocked)return await i("secrets","blocked",`${e.secrets.length} potential secret(s)`),await (0,D.vE)(c,{kind:"block",refType:"task",refId:"deploy-prep",title:`Prep blocked — ${e.secrets.length} secret risk(s)`,detail:e.secrets.slice(0,5).map(a=>`${a.file}: ${a.kind}`).join("; ")}),m("blocked",`Blocked: ${e.secrets.length} potential secret(s) found in the product. Remove them and re-run.`);if(await i("secrets","done","no secrets found"),await i("build","running"),"node"===k.runtime&&k.buildScript){let a=await (0,y.d1)(j.runCmd,"npm"===j.runCmd?["run","build"]:["build"],{cwd:j.dir,timeoutMs:6e5,env:{...process.env,CI:"1"}});l=`build ${0===a.code?"OK":a.timedOut?"TIMED OUT":"FAILED ("+a.code+")"}
31
+ `+(a.stdout+a.stderr).slice(-1800),await K(c,{buildLog:l}),await i("build",0===a.code?"done":"error",0===a.code?"build succeeded":"build failed — the agent will try to fix it")}else await i("build","needs-action","node"===k.runtime?"no build script":"no build step for this stack");await i("validateBuild","running");let f=await (0,B.VX)(c,a.id);await i("validateBuild",f.ok?"done":"error",f.ok?S(a.id)?"boots \xb7 build output present":"boots":f.detail.slice(0,160)),await i("agent","running");let h=await ad(c),p="";if(h){let c,d=await ae(a.id,b,h,(n=l,c=["FINISH PREPARING THIS PROJECT FOR PRODUCTION. Dependencies, tests, the secret scan and the production build have ALREADY been run by the system — focus on the remaining gaps.","Do, in order: (1) create/refresh `.env.example` documenting EVERY required environment variable (NEVER inline real secrets/tokens — use placeholders)."+(k.unsetEnvKeys.length?` The code references these vars not yet in .env.example: ${k.unsetEnvKeys.slice(0,30).join(", ")}.`:""),"(2) if the production build failed, FIX the errors until it builds clean;","(3) write/refresh a root `README.md` (what it is, install, run, configure) and a root `DEPLOY.md` with concrete build/run/deploy steps for this project's host;","(4) finish with a SHORT operator summary + the exact next steps to deploy.","Keep the existing product and its UX; do NOT add internal/control files or a second app."],n&&c.push("Latest production build output (tail):\n"+n.slice(-1200)),c.join("\n")),g);p=(d.text||"").slice(0,800),await i("agent",d.ok?"done":"error",d.ok?"configured env, docs & fixes":d.error?.slice(0,160)||"agent run failed")}else await i("agent","needs-action","no agent available to run");await i("package","running");let q=await $(a.id);return await i("package",q.blocked?"blocked":"done",q.blocked?`${q.secrets.length} secret risk(s) in the export set`:`${q.includedCount} file(s) \xb7 ${(o=q.totalBytes)<1024?`${o} B`:o<1048576?`${(o/1024).toFixed(1)} KB`:`${(o/1024/1024).toFixed(1)} MB`}`),m(q.blocked?"blocked":"done",p||`Prepared ${q.includedCount} clean file(s) for production.`)}catch(a){return m("failed",String(a instanceof Error?a.message:a).slice(0,300))}}async function ai(a,b,c){let e=(0,d.randomUUID)();(0,A.I)(a,{runId:e,channel:"deploy",agentId:null,kind:"run",target:b});try{let d=await c();return(0,A.I)(a,{runId:e,channel:"deploy",agentId:null,kind:"done",target:b}),d}catch(c){throw(0,A.I)(a,{runId:e,channel:"deploy",agentId:null,kind:"error",target:b,detail:String(c)}),c}}async function aj(){let{org:a,workspace:b}=await (0,v.nP)(),c=(0,B.pp)(a.id),d=R(c,a.id);return c&&"node"===c.kind&&d?.scripts?.build?ai(b.id,"production build",async()=>{let a=await (0,y.d1)(c.runCmd,"npm"===c.runCmd?["run","build"]:["build"],{cwd:c.dir,timeoutMs:6e5,env:{...process.env,CI:"1"}}),d=`build ${0===a.code?"OK":a.timedOut?"TIMED OUT":"FAILED ("+a.code+")"}
32
+ `+(a.stdout+a.stderr).slice(-1800);return await K(b.id,{buildLog:d}),(0,u.revalidatePath)("/prepare-deploy"),{ok:0===a.code,log:d}}):{ok:!1,log:"No Node build script to run."}}async function ak(){let{org:a,workspace:b}=await (0,v.nP)(),c=(0,B.pp)(a.id),d=R(c,a.id);return c&&"node"===c.kind&&d?.scripts?.test?ai(b.id,"tests",async()=>{let a=await (0,y.d1)(c.runCmd,["test"],{cwd:c.dir,timeoutMs:3e5,env:{...process.env,CI:"1"}});return{ok:0===a.code,log:`tests ${0===a.code?"PASS":"FAIL"}
33
+ `+(a.stdout+a.stderr).slice(-1800)}}):{ok:!1,log:"No test script to run."}}async function al(a){let{org:b,workspace:c}=await (0,v.nP)(),e=await ad(c.id);if(!e)return{ok:!1,summary:"No agent available."};let f=await X(b.id),g=f.framework?`
34
+ Project: ${f.framework}${f.unsetEnvKeys.length?`; undocumented env vars: ${f.unsetEnvKeys.slice(0,20).join(", ")}`:""}.`:"",h=(0,d.randomUUID)();(0,A.I)(c.id,{runId:h,channel:"deploy",agentId:e.id,kind:"run",target:"readme"===a?"generate README":"generate deploy docs"});let i=await ae(b.id,c,e,("readme"===a?"Write or refresh a clear root `README.md` for this project: what it is, prerequisites, install, run, configure (reference .env.example), and basic usage. Keep it accurate to the real code; do NOT invent features.":"Write or refresh a root `DEPLOY.md` with concrete production deploy steps for this project's stack/host: build, environment variables (reference .env.example, never real secrets), run command, and host-specific notes. Keep it accurate to the real project.")+g,h);return(0,A.I)(c.id,{runId:h,channel:"deploy",agentId:e.id,kind:"done",target:"done"}),(0,u.revalidatePath)("/prepare-deploy"),{ok:i.ok,summary:(i.text||"").slice(0,400)}}async function am(){return al("readme")}async function an(){return al("deploy")}async function ao(a){let{org:b,workspace:c}=await (0,v.nP)(),e=(a.repo||"").trim().replace(/^https?:\/\/github\.com\//i,"").replace(/\.git$/,"");if(!/^[\w.-]+\/[\w.-]+$/.test(e))return{ok:!1,error:"Use the form owner/repo."};let f=a.token?.trim()||await (0,w.r6)(c.id,"github_pat");if(!f)return{ok:!1,error:"Provide a GitHub token (or connect one in Commit GitHub first)."};let g=a=>f?a.split(f).join("***"):a;try{let a=await fetch(`https://api.github.com/repos/${e}`,{headers:{Authorization:`Bearer ${f}`,"User-Agent":"constella",Accept:"application/vnd.github+json"},signal:AbortSignal.timeout(12e3)});if(404===a.status)return{ok:!1,error:"Repo not found, or this token can't access it."};if(!a.ok)return{ok:!1,error:`GitHub ${a.status}`}}catch{return{ok:!1,error:"Couldn't reach GitHub."}}let h=(0,s.join)((0,t.tmpdir)(),"constella-export-"+(0,d.randomUUID)()),i=a.branch?.trim()||"main";try{(0,r.mkdirSync)(h,{recursive:!0});let d=Z(h,b.id);if(0===d.copied)return{ok:!1,error:"Nothing to export yet — no clean product source files were found."};await (0,y.d1)("git",["init","-b",i],{cwd:h}),await (0,y.d1)("git",["add","-A"],{cwd:h});let j=await (0,C.I)(h);if(j.findings.length)return await (0,D.vE)(c.id,{kind:"block",refType:"task",refId:`export-${e}`,title:`Export blocked — ${j.findings.length} secret risk(s)`,detail:j.findings.slice(0,5).map(a=>`${a.file}: ${a.kind}`).join("; ")}),await (0,E.I)(c.id,{kind:"security",text:`Clean export blocked — ${j.findings.length} secret risk(s)`,detail:`Resolve before exporting to ${e}.`}),(0,u.revalidatePath)("/prepare-deploy"),(0,u.revalidatePath)("/inbox"),{ok:!1,blocked:!0,secrets:j.findings,error:`Blocked: ${j.findings.length} potential secret(s) in the export set.`};await (0,y.d1)("git",["-c","user.email=agents@constella.dev","-c","user.name=Constella Agents","commit","-m",a.message?.trim()||"chore: export clean source"],{cwd:h});let k=(await (0,y.d1)("git",["rev-parse","HEAD"],{cwd:h})).stdout.trim().slice(0,7),l=`https://x-access-token:${f}@github.com/${e}.git`,m=await (0,y.d1)("git",["push","-f",l,`HEAD:${i}`],{cwd:h,timeoutMs:12e4});if(0!==m.code)return{ok:!1,error:g((m.stderr||"git push failed").slice(-300))};return await K(c.id,{lastExport:{ok:!0,sha:k,copied:d.copied,repo:e,branch:i,at:Date.now()}}),(0,u.revalidatePath)("/prepare-deploy"),{ok:!0,pushed:!0,sha:k,copied:d.copied}}catch(a){return{ok:!1,error:g(String(a instanceof Error?a.message:a))}}finally{try{(0,r.rmSync)(h,{recursive:!0,force:!0})}catch{}}}(0,L.D)([Y,_,ab,ac,ah,aj,ak,am,an,ao]),(0,q.A)(Y,"005d007ca7332dc0cf3028efe2b97134bdfa04871b",null),(0,q.A)(_,"00c5697ceca155904adf5671cf6338d85c99637976",null),(0,q.A)(ab,"00178c1b422c3c3c523678f2f41433bec71afdbf24",null),(0,q.A)(ac,"007f0cb5ace2c3f75e145ab8f38e4e0dbd2e0e5452",null),(0,q.A)(ah,"008b2efe45715018aa48e8d632246fcb3cb4db0152",null),(0,q.A)(aj,"00146500dae51e9c7914b774fd72c7315923faeb1c",null),(0,q.A)(ak,"009242e1437069b9bbef85d83baee2ec21eece394c",null),(0,q.A)(am,"003c211a8ef23f7fbec63af896b6bcd377fb6e803f",null),(0,q.A)(an,"00b9a31b8f14b4be4dc6f611dfb9d265d6e7dec6d0",null),(0,q.A)(ao,"409ec9aaac1a28f7cd3a017a56e6b81589162efa96",null);var ap=c(88007),aq=c(31578),ar=c(93571),as=c(10335),at=c(23297),au=c(44239);let av=`Available commands:
35
35
  - /help — this list
36
36
  - /kb <question> (alias /ask-kb) — ask the Knowledge Base; answers with references
37
37
  - /status — active goals, open issues, tasks in flight
@@ -54,14 +54,14 @@ Project: ${f.framework}${f.unsetEnvKeys.length?`; undocumented env vars: ${f.uns
54
54
  - /assign <issue> <@agent> — assign an issue \xb7 /telegram — Telegram integration status
55
55
  - /models — local model status \xb7 /skills — the skills library \xb7 /locks — file locks held
56
56
  - /close-sprint — archive what shipped + write a sprint retro
57
- Mention a teammate with @handle to talk to them directly.`;async function av(a,b,c,e){await g.db.insert(h.message).values({id:(0,d.randomUUID)(),workspaceId:a,channel:b,fromKind:"operator",text:c.slice(0,4e3),sessionId:e})}async function aw(a,b,c,e,f,i){await g.db.insert(h.message).values({id:(0,d.randomUUID)(),workspaceId:a,channel:b,fromKind:"agent",fromHandle:c,text:e.slice(0,4e3),createdAt:new Date,sessionId:f,kind:i?.kind??null,sources:i?.sources?.length?i.sources:null})}async function ax(a,b,c,q,r){let s=await (0,k.xF)(b,q),t=r.indexOf(" "),u=(-1===t?r:r.slice(0,t)).toLowerCase(),v=(-1===t?"":r.slice(t+1)).trim(),w=(a=[])=>((0,l.r)(b),{handled:!0,responders:a});switch(u){case"/help":return await av(b,q,r,s),await aw(b,q,"system",au,s),w();case"/kb":case"/ask-kb":{if(await av(b,q,r,s),!v)return await aw(b,q,"vannevar","Ask a question, e.g. `/kb how does the calculation engine work?`",s),w();let c=await (0,i.ed)(a,v);return await aw(b,q,"vannevar",c.text,s,{kind:"overview"===c.mode?"kb-card":void 0,sources:c.sources}),(0,j.PD)(a),w()}case"/reindex":{await av(b,q,r,s);let c=await (0,j.xV)(a);return await aw(b,q,"vannevar",`Reindexed the knowledge base — ${c.chunks} chunk(s)${c.embedded?" (semantic)":" (keyword fallback — embed server down)"}.`,s),w()}case"/curate":{await av(b,q,r,s);let c=await (0,i.aE)(a),d=c.merged+c.retired+c.summarized;return await aw(b,q,"vannevar",c.ok||d>0?`Curated the KB — merged ${c.merged}, retired ${c.retired}, re-summarised ${c.summarized}, ${c.gaps} gap(s). Details in Reports/kb-health.md.`:"Nothing to curate right now (needs a few entries + available budget).",s),w()}case"/clear":{if(await av(b,q,r,s),!/^(confirm|yes|sim)$/i.test(v))return await aw(b,q,"system","⚠️ **/clear** permanently deletes EVERY message in this conversation — the full history, the compacted context summary and the run events. The agents lose this conversation's context (your board work, goals, specs and the Knowledge Base are NOT affected). Type `/clear confirm` to proceed.",s),w();let a=(await g.db.select({id:h.message.id}).from(h.message).where((0,e.Uo)((0,e.eq)(h.message.workspaceId,b),(0,e.eq)(h.message.channel,q)))).length;return await g.db.delete(h.message).where((0,e.Uo)((0,e.eq)(h.message.workspaceId,b),(0,e.eq)(h.message.channel,q))),await g.db.delete(h.messageSummary).where((0,e.Uo)((0,e.eq)(h.messageSummary.workspaceId,b),(0,e.eq)(h.messageSummary.channel,q))),await g.db.delete(h.event).where((0,e.Uo)((0,e.eq)(h.event.workspaceId,b),(0,e.eq)(h.event.channel,q))),await aw(b,q,"system",`✓ Conversation cleared — ${a} message(s) removed.`,s,{kind:"cleared"}),w()}case"/status":{await av(b,q,r,s);let[a,c,d]=await Promise.all([g.db.select({status:h.goal.status}).from(h.goal).where((0,e.eq)(h.goal.workspaceId,b)),g.db.select({col:h.issue.col}).from(h.issue).where((0,e.eq)(h.issue.workspaceId,b)),g.db.select({id:h.task.id}).from(h.task).where((0,e.Uo)((0,e.eq)(h.task.workspaceId,b),(0,e.eq)(h.task.col,"doing")))]),f=a.filter(a=>"active"===a.status).length,i=c.filter(a=>"done"!==a.col).length;return await aw(b,q,"system",`Status — ${f} active goal(s) \xb7 ${i} open issue(s) \xb7 ${d.length} task(s) in flight.`,s),w()}case"/agents":{await av(b,q,r,s);let a=c.map(a=>`@${a.handle} — ${a.name} (${a.role}, ${a.status})`).join("\n");return await aw(b,q,"system",`Team:
58
- ${a||"(none)"}`,s),w()}case"/agent":{await av(b,q,r,s);let a=v.replace(/^@/,"").trim().toLowerCase();if(!a)return await aw(b,q,"system","Usage: `/agent <handle>` - e.g. `/agent ada`.",s),w();let d=c.find(b=>b.handle.toLowerCase()===a);if(!d)return await aw(b,q,"system",`No agent @${a} on the roster. Use \`/agents\` to see the team.`,s),w();let e=[d.adapter||"unknown adapter",d.model||""].filter(Boolean).join(" / "),f=d.health?` / health: ${d.health}`:"";return await aw(b,q,d.handle,`**${d.name}** (@${d.handle})
57
+ Mention a teammate with @handle to talk to them directly.`;async function aw(a,b,c,e){await g.db.insert(h.message).values({id:(0,d.randomUUID)(),workspaceId:a,channel:b,fromKind:"operator",text:c.slice(0,4e3),sessionId:e})}async function ax(a,b,c,e,f,i){await g.db.insert(h.message).values({id:(0,d.randomUUID)(),workspaceId:a,channel:b,fromKind:"agent",fromHandle:c,text:e.slice(0,4e3),createdAt:new Date,sessionId:f,kind:i?.kind??null,sources:i?.sources?.length?i.sources:null})}async function ay(a,b,c,q,r){let s=await (0,k.xF)(b,q),t=r.indexOf(" "),u=(-1===t?r:r.slice(0,t)).toLowerCase(),v=(-1===t?"":r.slice(t+1)).trim(),w=(a=[])=>((0,l.r)(b),{handled:!0,responders:a});switch(u){case"/help":return await aw(b,q,r,s),await ax(b,q,"system",av,s),w();case"/kb":case"/ask-kb":{if(await aw(b,q,r,s),!v)return await ax(b,q,"vannevar","Ask a question, e.g. `/kb how does the calculation engine work?`",s),w();let c=await (0,i.ed)(a,v);return await ax(b,q,"vannevar",c.text,s,{kind:"overview"===c.mode?"kb-card":void 0,sources:c.sources}),(0,j.PD)(a),w()}case"/reindex":{await aw(b,q,r,s);let c=await (0,j.xV)(a);return await ax(b,q,"vannevar",`Reindexed the knowledge base — ${c.chunks} chunk(s)${c.embedded?" (semantic)":" (keyword fallback — embed server down)"}.`,s),w()}case"/curate":{await aw(b,q,r,s);let c=await (0,i.aE)(a),d=c.merged+c.retired+c.summarized;return await ax(b,q,"vannevar",c.ok||d>0?`Curated the KB — merged ${c.merged}, retired ${c.retired}, re-summarised ${c.summarized}, ${c.gaps} gap(s). Details in Reports/kb-health.md.`:"Nothing to curate right now (needs a few entries + available budget).",s),w()}case"/clear":{if(await aw(b,q,r,s),!/^(confirm|yes|sim)$/i.test(v))return await ax(b,q,"system","⚠️ **/clear** permanently deletes EVERY message in this conversation — the full history, the compacted context summary and the run events. The agents lose this conversation's context (your board work, goals, specs and the Knowledge Base are NOT affected). Type `/clear confirm` to proceed.",s),w();let a=(await g.db.select({id:h.message.id}).from(h.message).where((0,e.Uo)((0,e.eq)(h.message.workspaceId,b),(0,e.eq)(h.message.channel,q)))).length;return await g.db.delete(h.message).where((0,e.Uo)((0,e.eq)(h.message.workspaceId,b),(0,e.eq)(h.message.channel,q))),await g.db.delete(h.messageSummary).where((0,e.Uo)((0,e.eq)(h.messageSummary.workspaceId,b),(0,e.eq)(h.messageSummary.channel,q))),await g.db.delete(h.event).where((0,e.Uo)((0,e.eq)(h.event.workspaceId,b),(0,e.eq)(h.event.channel,q))),await ax(b,q,"system",`✓ Conversation cleared — ${a} message(s) removed.`,s,{kind:"cleared"}),w()}case"/status":{await aw(b,q,r,s);let[a,c,d]=await Promise.all([g.db.select({status:h.goal.status}).from(h.goal).where((0,e.eq)(h.goal.workspaceId,b)),g.db.select({col:h.issue.col}).from(h.issue).where((0,e.eq)(h.issue.workspaceId,b)),g.db.select({id:h.task.id}).from(h.task).where((0,e.Uo)((0,e.eq)(h.task.workspaceId,b),(0,e.eq)(h.task.col,"doing")))]),f=a.filter(a=>"active"===a.status).length,i=c.filter(a=>"done"!==a.col).length;return await ax(b,q,"system",`Status — ${f} active goal(s) \xb7 ${i} open issue(s) \xb7 ${d.length} task(s) in flight.`,s),w()}case"/agents":{await aw(b,q,r,s);let a=c.map(a=>`@${a.handle} — ${a.name} (${a.role}, ${a.status})`).join("\n");return await ax(b,q,"system",`Team:
58
+ ${a||"(none)"}`,s),w()}case"/agent":{await aw(b,q,r,s);let a=v.replace(/^@/,"").trim().toLowerCase();if(!a)return await ax(b,q,"system","Usage: `/agent <handle>` - e.g. `/agent ada`.",s),w();let d=c.find(b=>b.handle.toLowerCase()===a);if(!d)return await ax(b,q,"system",`No agent @${a} on the roster. Use \`/agents\` to see the team.`,s),w();let e=[d.adapter||"unknown adapter",d.model||""].filter(Boolean).join(" / "),f=d.health?` / health: ${d.health}`:"";return await ax(b,q,d.handle,`**${d.name}** (@${d.handle})
59
59
  Role: ${d.role}
60
60
  Status: ${d.status}${f}
61
61
  Runtime: ${e}
62
62
 
63
- [Open in Agent Studio](/agents/${d.handle})`,s,{kind:"agent-card"}),w()}case"/new-goal":case"/new-work":if(!v)return await av(b,q,r,s),await aw(b,q,"system","Describe the work, e.g. `/new-goal a billing page with Stripe checkout`.",s),w();return await av(b,q,`@ada ${v}`,s),(0,j.PD)(a),w(["ada"]);case"/approve":{await av(b,q,r,s);let[c]=await g.db.select().from(h.workspace).where((0,e.eq)(h.workspace.id,b));if(!c)return await aw(b,q,"system","No workspace found.",s),w();let d=await (0,m.wz)(a,c);return await aw(b,q,"system",`✅ Plan approved — ${d.made} task(s) queued. Use \`/run-247\` to start autonomous execution.`,s),w()}case"/reject":return await av(b,q,r,s),await (0,m.TR)(b,v||void 0),await aw(b,q,"system",v?"↩️ Plan sent back to the CEO — reason recorded.":"↩️ Plan sent back to the CEO for revision.",s),w();case"/run-247":case"/resume":return await av(b,q,r,s),await (0,m.mL)(b,!0),await aw(b,q,"system","▶️ 24/7 autonomous execution is ON — the team will work the board.",s),w();case"/pause":return await av(b,q,r,s),await (0,m.mL)(b,!1),await aw(b,q,"system","⏸ 24/7 autonomous execution paused.",s),w();case"/cancel":case"/archive":{await av(b,q,r,s);let[c]=await g.db.select({id:h.goal.id,title:h.goal.title}).from(h.goal).where((0,e.Uo)((0,e.eq)(h.goal.workspaceId,b),(0,e.eq)(h.goal.status,"active"))).orderBy((0,f.i)(h.goal.createdAt)).limit(1);if(!c)return await aw(b,q,"system",`No active goal to ${"/cancel"===u?"cancel":"archive"}.`,s),w();if("/cancel"===u){let a=await (0,n.NF)(b,c.id);await aw(b,q,"system",a.ok?`🛑 Cancelled — ${a.title}. Execution stopped; reopen it in Goals to resume.`:"Couldn't cancel the goal.",s)}else{let d=await (0,n.PT)(a,b,c.id);await aw(b,q,"system",d.ok?`📦 Archived — ${d.title} → ${d.path}.`:"Couldn't archive the goal.",s)}return w()}case"/new-issue":{if(await av(b,q,r,s),!v)return await aw(b,q,"system","Give a title, e.g. `/new-issue add a logout button`.",s),w();let a=String((await g.db.select({id:h.issue.id}).from(h.issue).where((0,e.eq)(h.issue.workspaceId,b))).length+1);return await g.db.insert(h.issue).values({id:(0,d.randomUUID)(),workspaceId:b,key:a,title:v.slice(0,200),col:"todo",prio:"med"}),await aw(b,q,"system",`📝 Issue #${a} created — ${v.slice(0,120)}. Open the Product Manager to size + assign it.`,s),w()}case"/new-spec":{if(await av(b,q,r,s),!v)return await aw(b,q,"system","Give a title, e.g. `/new-spec billing architecture`.",s),w();let a=(await g.db.select({id:h.spec.id}).from(h.spec).where((0,e.eq)(h.spec.workspaceId,b))).length,c=`SPEC-${String(a+1).padStart(2,"0")}`;return await g.db.insert(h.spec).values({id:(0,d.randomUUID)(),workspaceId:b,key:c,title:v.slice(0,200)}),await aw(b,q,"system",`📄 Spec ${c} created — ${v.slice(0,120)}.`,s),w()}case"/search":{if(await av(b,q,r,s),!v)return await aw(b,q,"vannevar","Search what? e.g. `/search how does auth work`.",s),w();let c=await (0,i.ed)(a,v);return await aw(b,q,"vannevar",c.text,s,{kind:"overview"===c.mode?"kb-card":void 0,sources:c.sources}),(0,j.PD)(a),w()}case"/graph":{if(await av(b,q,r,s),!v)return await aw(b,q,"vannevar","Give a spec/issue key or a goal title, e.g. `/graph SPEC-01`.",s),w();let[c]=await g.db.select({id:h.spec.id}).from(h.spec).where((0,e.Uo)((0,e.eq)(h.spec.workspaceId,b),(0,e.eq)(h.spec.key,v))),[d]=c?[void 0]:await g.db.select({id:h.issue.id}).from(h.issue).where((0,e.Uo)((0,e.eq)(h.issue.workspaceId,b),(0,e.eq)(h.issue.key,v))),[f]=c||d?[void 0]:await g.db.select({id:h.goal.id}).from(h.goal).where((0,e.Uo)((0,e.eq)(h.goal.workspaceId,b),(0,e.mj)(h.goal.title,`%${v}%`))),j=c?{specId:c.id}:d?{issueId:d.id}:f?{goalId:f.id}:null;if(!j)return await aw(b,q,"vannevar",`No goal / spec / issue matches \`${v}\`.`,s),w();let k=await (0,i.Mn)(a,j);if(!k||!k.nodes.length)return await aw(b,q,"vannevar",`No connected knowledge for \`${v}\` yet — it grows as the team works.`,s),w();let l=Object.entries(k.byType).map(([a,b])=>`**${a}** (${b.length})
64
- ${b.slice(0,8).map(a=>`- ${a.title}`).join("\n")}`).join("\n\n");return await aw(b,q,"vannevar",`🕸️ Connections for \`${v}\` — ${k.nodes.length} related item(s):
63
+ [Open in Agent Studio](/agents/${d.handle})`,s,{kind:"agent-card"}),w()}case"/new-goal":case"/new-work":if(!v)return await aw(b,q,r,s),await ax(b,q,"system","Describe the work, e.g. `/new-goal a billing page with payment-provider checkout`.",s),w();return await aw(b,q,`@ada ${v}`,s),(0,j.PD)(a),w(["ada"]);case"/approve":{await aw(b,q,r,s);let[c]=await g.db.select().from(h.workspace).where((0,e.eq)(h.workspace.id,b));if(!c)return await ax(b,q,"system","No workspace found.",s),w();let d=await (0,m.wz)(a,c);return await ax(b,q,"system",`✅ Plan approved — ${d.made} task(s) queued. Use \`/run-247\` to start autonomous execution.`,s),w()}case"/reject":return await aw(b,q,r,s),await (0,m.TR)(b,v||void 0),await ax(b,q,"system",v?"↩️ Plan sent back to the CEO — reason recorded.":"↩️ Plan sent back to the CEO for revision.",s),w();case"/run-247":case"/resume":return await aw(b,q,r,s),await (0,m.mL)(b,!0),await ax(b,q,"system","▶️ 24/7 autonomous execution is ON — the team will work the board.",s),w();case"/pause":return await aw(b,q,r,s),await (0,m.mL)(b,!1),await ax(b,q,"system","⏸ 24/7 autonomous execution paused.",s),w();case"/cancel":case"/archive":{await aw(b,q,r,s);let[c]=await g.db.select({id:h.goal.id,title:h.goal.title}).from(h.goal).where((0,e.Uo)((0,e.eq)(h.goal.workspaceId,b),(0,e.eq)(h.goal.status,"active"))).orderBy((0,f.i)(h.goal.createdAt)).limit(1);if(!c)return await ax(b,q,"system",`No active goal to ${"/cancel"===u?"cancel":"archive"}.`,s),w();if("/cancel"===u){let a=await (0,n.NF)(b,c.id);await ax(b,q,"system",a.ok?`🛑 Cancelled — ${a.title}. Execution stopped; reopen it in Goals to resume.`:"Couldn't cancel the goal.",s)}else{let d=await (0,n.PT)(a,b,c.id);await ax(b,q,"system",d.ok?`📦 Archived — ${d.title} → ${d.path}.`:"Couldn't archive the goal.",s)}return w()}case"/new-issue":{if(await aw(b,q,r,s),!v)return await ax(b,q,"system","Give a title, e.g. `/new-issue add a logout button`.",s),w();let a=String((await g.db.select({id:h.issue.id}).from(h.issue).where((0,e.eq)(h.issue.workspaceId,b))).length+1);return await g.db.insert(h.issue).values({id:(0,d.randomUUID)(),workspaceId:b,key:a,title:v.slice(0,200),col:"todo",prio:"med"}),await ax(b,q,"system",`📝 Issue #${a} created — ${v.slice(0,120)}. Open the Product Manager to size + assign it.`,s),w()}case"/new-spec":{if(await aw(b,q,r,s),!v)return await ax(b,q,"system","Give a title, e.g. `/new-spec billing architecture`.",s),w();let a=(await g.db.select({id:h.spec.id}).from(h.spec).where((0,e.eq)(h.spec.workspaceId,b))).length,c=`SPEC-${String(a+1).padStart(2,"0")}`;return await g.db.insert(h.spec).values({id:(0,d.randomUUID)(),workspaceId:b,key:c,title:v.slice(0,200)}),await ax(b,q,"system",`📄 Spec ${c} created — ${v.slice(0,120)}.`,s),w()}case"/search":{if(await aw(b,q,r,s),!v)return await ax(b,q,"vannevar","Search what? e.g. `/search how does auth work`.",s),w();let c=await (0,i.ed)(a,v);return await ax(b,q,"vannevar",c.text,s,{kind:"overview"===c.mode?"kb-card":void 0,sources:c.sources}),(0,j.PD)(a),w()}case"/graph":{if(await aw(b,q,r,s),!v)return await ax(b,q,"vannevar","Give a spec/issue key or a goal title, e.g. `/graph SPEC-01`.",s),w();let[c]=await g.db.select({id:h.spec.id}).from(h.spec).where((0,e.Uo)((0,e.eq)(h.spec.workspaceId,b),(0,e.eq)(h.spec.key,v))),[d]=c?[void 0]:await g.db.select({id:h.issue.id}).from(h.issue).where((0,e.Uo)((0,e.eq)(h.issue.workspaceId,b),(0,e.eq)(h.issue.key,v))),[f]=c||d?[void 0]:await g.db.select({id:h.goal.id}).from(h.goal).where((0,e.Uo)((0,e.eq)(h.goal.workspaceId,b),(0,e.mj)(h.goal.title,`%${v}%`))),j=c?{specId:c.id}:d?{issueId:d.id}:f?{goalId:f.id}:null;if(!j)return await ax(b,q,"vannevar",`No goal / spec / issue matches \`${v}\`.`,s),w();let k=await (0,i.Mn)(a,j);if(!k||!k.nodes.length)return await ax(b,q,"vannevar",`No connected knowledge for \`${v}\` yet — it grows as the team works.`,s),w();let l=Object.entries(k.byType).map(([a,b])=>`**${a}** (${b.length})
64
+ ${b.slice(0,8).map(a=>`- ${a.title}`).join("\n")}`).join("\n\n");return await ax(b,q,"vannevar",`🕸️ Connections for \`${v}\` — ${k.nodes.length} related item(s):
65
65
 
66
- ${l}`,s,{kind:"kb-card"}),w()}case"/test-dev":{await av(b,q,r,s),await aw(b,q,"edsger","\uD83E\uDDEA Running the Test Dev validation gate…",s);let a=await (0,o.Xu)();return await aw(b,q,"edsger",`Test Dev — **${a.status}**.${a.summary?` ${a.summary}`:""}`,s),w()}case"/github":{await av(b,q,r,s);let a=await (0,p.Iq)();return await aw(b,q,"werner",a.ok?`🐙 GitHub — ${a.changed} changed file(s) detected. Open the GitHub module to commit + push.`:"\uD83D\uDC19 GitHub — couldn't read the repository status (is this a git repo?).",s),w()}case"/assign":{await av(b,q,r,s);let a=v.match(/^(\S+)\s+@?(\S+)$/);if(!a)return await aw(b,q,"system","Usage: `/assign <issue-key> <@agent>` — e.g. `/assign 3 @margaret`.",s),w();let[,c,d]=a,[f]=await g.db.select({id:h.issue.id}).from(h.issue).where((0,e.Uo)((0,e.eq)(h.issue.workspaceId,b),(0,e.eq)(h.issue.key,c)));if(!f)return await aw(b,q,"system",`No issue #${c} on the board.`,s),w();let[i]=await g.db.select({id:h.agent.id,name:h.agent.name}).from(h.agent).where((0,e.Uo)((0,e.eq)(h.agent.workspaceId,b),(0,e.eq)(h.agent.handle,d.toLowerCase())));if(!i)return await aw(b,q,"system",`No agent @${d.toLowerCase()} on the roster.`,s),w();return await g.db.update(h.issue).set({assigneeId:i.id}).where((0,e.eq)(h.issue.id,f.id)),await aw(b,q,"system",`👤 Issue #${c} assigned to ${i.name} (@${d.toLowerCase()}).`,s),w()}case"/review":{let a=c.find(a=>/cybersec|security|qa/i.test(a.role))??c.find(a=>"whitfield"===a.handle);if(!a)return await av(b,q,r,s),await aw(b,q,"system","No reviewer agent (CyberSec/QA) on the roster.",s),w();return await av(b,q,`@${a.handle} review the recent changes on the board${v?`: ${v}`:""}.`,s),w([a.handle])}case"/prepare-deploy":{await av(b,q,r,s),await aw(b,q,"werner","\uD83D\uDE80 Running the Prepare-Deploy pipeline — this can take a minute; live progress is in the Prepare Deploy module.",s);let a=await ag();return await aw(b,q,"werner",`Prepare-Deploy — **${a.status}**.${a.summary?` ${a.summary}`:""}`,s),w()}case"/export-source":{if(await av(b,q,r,s),!v)return await aw(b,q,"system","Usage: `/export-source <github-repo>` — e.g. `/export-source myorg/constella-public`.",s),w();let a=await an({repo:v.split(/\s+/)[0]});return await aw(b,q,"werner",a.ok?`📦 Exported the clean source${a.sha?` (${a.sha.slice(0,7)})`:""}${a.copied?` — ${a.copied} file(s)`:""}.`:a.blocked?`🛑 Export blocked — ${a.secrets?.length??0} secret finding(s). Resolve them first.`:`Export failed${a.error?` — ${a.error}`:""}.`,s),w()}case"/telegram":{await av(b,q,r,s);let a=await (0,ao._9)(b);return await aw(b,q,"system",a?`📲 Telegram is configured — bot connected, alerts route to the allowlisted chat${a.allowedName?` (${a.allowedName})`:""}.`:"\uD83D\uDCF2 Telegram is not configured. Add a bot token + chat id in Settings → Integrations.",s),w()}case"/models":{await av(b,q,r,s);let[a,c]=await Promise.all([(0,ap.VH)(),(0,ap.LU)()]),d=[c.up?`llama.cpp: up${c.model?` (${c.model})`:""}`:"llama.cpp: down",a.up?`Ollama: up — ${a.models.length} model(s)${a.models.length?`: ${a.models.slice(0,6).map(a=>a.name).join(", ")}`:""}`:"Ollama: not running"];return await aw(b,q,"system",`🧠 Local models — ${d.join(" \xb7 ")}. Browse + download in the Models module.`,s),w()}case"/skills":{await av(b,q,r,s);let a=(0,aq.Ws)();return await aw(b,q,"system",`📚 Skills library — ${a.length} skill(s). Sample: ${a.slice(0,12).join(", ")}${a.length>12?" …":""}. Enable/disable per agent in Agent Studio → Skills.`,s),w()}case"/locks":{await av(b,q,r,s);let a=await (0,ar.h6)(b);return await aw(b,q,"system",a.length?`🔒 ${a.length} file lock(s) held:
67
- ${a.slice(0,15).map(a=>`- \`${a.path}\` — @${a.agentHandle}`).join("\n")}`:"\uD83D\uDD13 No file locks held right now.",s),w()}case"/generate-plan":{await av(b,q,r,s);let[c]=await g.db.select().from(h.workspace).where((0,e.eq)(h.workspace.id,b));if(!c)return await aw(b,q,"system","No workspace found.",s),w();let d=await (0,as.generatePlanFor)(a,c,v?{brief:v}:void 0);return await aw(b,q,"ada",d.ok?"\uD83E\uDDED Plan generation started — drafting specs → issues → TODOs; it'll appear in the CEO Planner for your approval.":`Couldn't start plan generation${d.error?` — ${d.error}`:""}.`,s),w()}case"/close-sprint":{await av(b,q,r,s);let c=await (0,at.MO)(a,b);return await aw(b,q,"donald",c.ok?`🏁 Sprint closed — ${c.shipped} shipped, ${c.carried} carried over. Retro written to \`${c.path}\`.`:"Nothing to close — no issues are in Done yet.",s),w()}default:return await av(b,q,r,s),await aw(b,q,"system",`Unknown command \`${u}\`. Try \`/help\`.`,s),w()}}}};
66
+ ${l}`,s,{kind:"kb-card"}),w()}case"/test-dev":{await aw(b,q,r,s),await ax(b,q,"edsger","\uD83E\uDDEA Running the Test Dev validation gate…",s);let a=await (0,o.Xu)();return await ax(b,q,"edsger",`Test Dev — **${a.status}**.${a.summary?` ${a.summary}`:""}`,s),w()}case"/github":{await aw(b,q,r,s);let a=await (0,p.Iq)();return await ax(b,q,"werner",a.ok?`🐙 GitHub — ${a.changed} changed file(s) detected. Open the GitHub module to commit + push.`:"\uD83D\uDC19 GitHub — couldn't read the repository status (is this a git repo?).",s),w()}case"/assign":{await aw(b,q,r,s);let a=v.match(/^(\S+)\s+@?(\S+)$/);if(!a)return await ax(b,q,"system","Usage: `/assign <issue-key> <@agent>` — e.g. `/assign 3 @margaret`.",s),w();let[,c,d]=a,[f]=await g.db.select({id:h.issue.id}).from(h.issue).where((0,e.Uo)((0,e.eq)(h.issue.workspaceId,b),(0,e.eq)(h.issue.key,c)));if(!f)return await ax(b,q,"system",`No issue #${c} on the board.`,s),w();let[i]=await g.db.select({id:h.agent.id,name:h.agent.name}).from(h.agent).where((0,e.Uo)((0,e.eq)(h.agent.workspaceId,b),(0,e.eq)(h.agent.handle,d.toLowerCase())));if(!i)return await ax(b,q,"system",`No agent @${d.toLowerCase()} on the roster.`,s),w();return await g.db.update(h.issue).set({assigneeId:i.id}).where((0,e.eq)(h.issue.id,f.id)),await ax(b,q,"system",`👤 Issue #${c} assigned to ${i.name} (@${d.toLowerCase()}).`,s),w()}case"/review":{let a=c.find(a=>/cybersec|security|qa/i.test(a.role))??c.find(a=>"whitfield"===a.handle);if(!a)return await aw(b,q,r,s),await ax(b,q,"system","No reviewer agent (CyberSec/QA) on the roster.",s),w();return await aw(b,q,`@${a.handle} review the recent changes on the board${v?`: ${v}`:""}.`,s),w([a.handle])}case"/prepare-deploy":{await aw(b,q,r,s),await ax(b,q,"werner","\uD83D\uDE80 Running the Prepare-Deploy pipeline — this can take a minute; live progress is in the Prepare Deploy module.",s);let a=await ah();return await ax(b,q,"werner",`Prepare-Deploy — **${a.status}**.${a.summary?` ${a.summary}`:""}`,s),w()}case"/export-source":{if(await aw(b,q,r,s),!v)return await ax(b,q,"system","Usage: `/export-source <github-repo>` — e.g. `/export-source myorg/constella-public`.",s),w();let a=await ao({repo:v.split(/\s+/)[0]});return await ax(b,q,"werner",a.ok?`📦 Exported the clean source${a.sha?` (${a.sha.slice(0,7)})`:""}${a.copied?` — ${a.copied} file(s)`:""}.`:a.blocked?`🛑 Export blocked — ${a.secrets?.length??0} secret finding(s). Resolve them first.`:`Export failed${a.error?` — ${a.error}`:""}.`,s),w()}case"/telegram":{await aw(b,q,r,s);let a=await (0,ap._9)(b);return await ax(b,q,"system",a?`📲 Telegram is configured — bot connected, alerts route to the allowlisted chat${a.allowedName?` (${a.allowedName})`:""}.`:"\uD83D\uDCF2 Telegram is not configured. Add a bot token + chat id in Settings → Integrations.",s),w()}case"/models":{await aw(b,q,r,s);let[a,c]=await Promise.all([(0,aq.VH)(),(0,aq.LU)()]),d=[c.up?`llama.cpp: up${c.model?` (${c.model})`:""}`:"llama.cpp: down",a.up?`Ollama: up — ${a.models.length} model(s)${a.models.length?`: ${a.models.slice(0,6).map(a=>a.name).join(", ")}`:""}`:"Ollama: not running"];return await ax(b,q,"system",`🧠 Local models — ${d.join(" \xb7 ")}. Browse + download in the Models module.`,s),w()}case"/skills":{await aw(b,q,r,s);let a=(0,ar.Ws)();return await ax(b,q,"system",`📚 Skills library — ${a.length} skill(s). Sample: ${a.slice(0,12).join(", ")}${a.length>12?" …":""}. Enable/disable per agent in Agent Studio → Skills.`,s),w()}case"/locks":{await aw(b,q,r,s);let a=await (0,as.h6)(b);return await ax(b,q,"system",a.length?`🔒 ${a.length} file lock(s) held:
67
+ ${a.slice(0,15).map(a=>`- \`${a.path}\` — @${a.agentHandle}`).join("\n")}`:"\uD83D\uDD13 No file locks held right now.",s),w()}case"/generate-plan":{await aw(b,q,r,s);let[c]=await g.db.select().from(h.workspace).where((0,e.eq)(h.workspace.id,b));if(!c)return await ax(b,q,"system","No workspace found.",s),w();let d=await (0,at.generatePlanFor)(a,c,v?{brief:v}:void 0);return await ax(b,q,"ada",d.ok?"\uD83E\uDDED Plan generation started — drafting specs → issues → TODOs; it'll appear in the CEO Planner for your approval.":`Couldn't start plan generation${d.error?` — ${d.error}`:""}.`,s),w()}case"/close-sprint":{await aw(b,q,r,s);let c=await (0,au.MO)(a,b);return await ax(b,q,"donald",c.ok?`🏁 Sprint closed — ${c.shipped} shipped, ${c.carried} carried over. Retro written to \`${c.path}\`.`:"Nothing to close — no issues are in Done yet.",s),w()}default:return await aw(b,q,r,s),await ax(b,q,"system",`Unknown command \`${u}\`. Try \`/help\`.`,s),w()}}}};
@@ -1 +1 @@
1
- "use strict";exports.id=6431,exports.ids=[6431,7336],exports.modules={4719:(a,b,c)=>{c.d(b,{ViewChrome:()=>d});let d=(0,c(62060).registerClientReference)(function(){throw Error("Attempted to call ViewChrome() from the server but ViewChrome is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"C:\\Users\\Usuario\\Documents\\constella\\src\\components\\shell\\view-chrome.tsx","ViewChrome")},5323:(a,b,c)=>{c.d(b,{_:()=>g});var d=c(61576),e=c(1308),f=c(4719);function g({title:a,sub:b,right:c,icon:h,flush:i,children:j}){return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(e.b,{title:a}),(0,d.jsx)(f.ViewChrome,{title:a,sub:b,right:c,icon:h,flush:i,children:j})]})}},25228:(a,b,c)=>{c.d(b,{e:()=>e});var d=c(61576);function e({name:a,color:b,size:c=24,health:f,image:g}){let h=Math.max(6,Math.round(.3*c)),i=Math.round(.28*c),j=g?/^(data:|https?:|\/)/.test(g)?g:`/api/upload?path=${encodeURIComponent(g)}`:null;return(0,d.jsxs)("span",{style:{position:"relative",width:c,height:c,flex:`0 0 ${c}px`,display:"inline-block"},children:[j?(0,d.jsx)("img",{src:j,alt:a,width:c,height:c,style:{width:c,height:c,borderRadius:i,objectFit:"cover",display:"block"}}):(0,d.jsx)("span",{style:{width:c,height:c,borderRadius:i,background:b,color:"#fff",display:"grid",placeItems:"center",fontSize:Math.round(.42*c),fontWeight:700},children:(a[0]||"?").toUpperCase()}),f&&(0,d.jsx)("span",{style:{position:"absolute",right:-1,bottom:-1,width:h,height:h,borderRadius:"50%",background:"alive"===f?"var(--sx-string)":"stale"===f?"var(--sx-number)":"var(--text-faint)",border:"1.5px solid var(--bg-elevated)"}})]})}},47336:(a,b,c)=>{c.d(b,{checkForUpdate:()=>l});var d=c(73024),e=c(76760),f=c(30043);let g="constellai",h=null,i=a=>a.replace(/^v/,"").split("-")[0].split(".").map(a=>parseInt(a,10)||0);async function j(a){try{let b=new AbortController,c=setTimeout(()=>b.abort(),3e3),d=await fetch(a,{signal:b.signal,headers:{"user-agent":"constella"}});return clearTimeout(c),d.ok?await d.json():null}catch{return null}}async function k(a){try{let b=new AbortController,c=setTimeout(()=>b.abort(),3e3),d=await fetch(a,{signal:b.signal,headers:{"user-agent":"constella"}});return clearTimeout(c),d.ok?await d.text():null}catch{return null}}async function l(a=!1){let b,c,m=function(){if(process.env.CONSTELLA_VERSION)return process.env.CONSTELLA_VERSION;try{let a=JSON.parse((0,d.readFileSync)((0,e.join)((0,f.v)(),"package.json"),"utf8"));if(a?.version)return a.version}catch{}return"0.0.0"}(),n=`npm install -g ${g}@latest`;if(!a&&h&&Date.now()-h.at<216e5)return h.info;let o=await j(`https://registry.npmjs.org/${g}/latest`),p=o?.version??null,q=!!p&&function(a,b){let c=i(a),d=i(b);for(let a=0;a<3;a++){if((c[a]||0)>(d[a]||0))return!0;if((c[a]||0)<(d[a]||0))break}return!1}(p,m),r=null;if(q&&p){let a=await k("https://raw.githubusercontent.com/gabriel7silva/constella/main/CHANGELOG.md");r=a?function(a,b){let c=b.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),d=a.match(RegExp(`(^|\\n)##\\s*\\[?${c}\\]?[\\s\\S]*?(?=\\n##\\s|$)`));if(d)return d[0].trim();let e=a.split(/\n##\s/)[1];return e?"## "+e.trim():null}(a,p):null}let s={current:m,latest:p,updateAvailable:q,type:p?(b=i(p),c=i(m),b[0]>c[0]?"major":b[1]>c[1]?"minor":b[2]>c[2]?"patch":null):null,command:n,changelog:r};return h={at:Date.now(),info:s},s}},51221:(a,b,c)=>{c.d(b,{ViewChrome:()=>h});var d=c(4374),e=c(43526),f=c(48442),g=c(31819);function h({title:a,sub:b,right:c,icon:i,flush:j,children:k}){let l=(0,g.k)(),m=f.e.find(b=>b.title===a),n=i??m?.icon,o=m?l(`mod.${m.id}`):a;return(0,d.jsxs)("div",{className:"app-view",children:[(0,d.jsxs)("div",{className:"view-head",children:[n&&(0,d.jsx)("div",{className:"vh-icon",children:(0,d.jsx)(e.I,{name:n,size:18})}),(0,d.jsxs)("div",{style:{flex:1,minWidth:0},children:[(0,d.jsx)("div",{className:"view-title",children:o}),b&&(0,d.jsx)("div",{className:"view-sub",children:b})]}),c]}),(0,d.jsx)("div",{className:"view-body",style:j?{padding:0,overflow:"hidden"}:void 0,children:k})]})}},52932:(a,b,c)=>{c.d(b,{pM:()=>z,lP:()=>y,Kg:()=>x,eU:()=>B,PG:()=>A});var d=c(6866),e=c(53993),f=c(30043),g=c(64567),h=c(30170);function i(){return(0,h.n)()?"dev":"vps"===(0,g.T)()?"vps":"portable"===(0,g.T)()?"portable":/[\\/]_npx[\\/]/.test((0,f.v)())?"npx":"global"}var j=c(47336),k=c(73024),l=c(76760),m=c(48161),n=c(31421),o=c(57086);let p=()=>new Date().toISOString().replace(/[:.]/g,"-"),q=()=>(0,l.join)((0,o.r$)(),"backups","last-update.json");async function r(){let a=await (0,j.checkForUpdate)(!0),b=i(),c=a.command;if(!a.updateAvailable)return{ok:!0,context:b,command:c,message:"Already up to date."};let d=function(){try{let a=(0,o.r$)(),b=(0,l.join)(a,"backups",p());for(let c of((0,k.mkdirSync)(b,{recursive:!0}),[".env","constella.db","constella.db-wal","constella.db-shm"])){let d=(0,l.join)(a,c);if((0,k.existsSync)(d))try{(0,k.copyFileSync)(d,(0,l.join)(b,c))}catch{}}return b}catch{return null}}()??void 0;if("dev"===b)return{ok:!1,context:b,command:c,backupDir:d,message:"Running from source — update with: git pull && pnpm install && pnpm build"};if("npx"===b)return{ok:!1,context:b,command:c,backupDir:d,message:"npx runs an ephemeral copy — re-run: npx constellai@latest"};if("vps"===b){var e="bash scripts/vps-update.sh";try{(0,k.writeFileSync)(q(),JSON.stringify({status:"running",to:a.latest,at:p()}));let b=(0,o.r$)(),c=process.env.CONSTELLA_PKG_ROOT||process.cwd(),f=(0,l.join)(c,"bin","constella-update.mjs"),g=a.latest?["--version",a.latest]:[];return(0,n.spawn)(process.execPath,[f,"--quiet","--mode","vps","--home",b,...g],{detached:!0,stdio:"ignore",cwd:(0,m.tmpdir)()}).unref(),{ok:!0,started:!0,needsRestart:!0,context:"vps",command:e,backupDir:d,message:`Updating to ${a.latest} and restarting the service — this page reconnects in a few seconds.`}}catch(a){return{ok:!1,context:"vps",command:e,backupDir:d,message:"Couldn't launch the updater: "+String(a instanceof Error?a.message:a)}}}return function(a,b,c,d){try{(0,k.writeFileSync)(q(),JSON.stringify({status:"running",to:a.latest,at:p()}));let e=process.env.CONSTELLA_RUN_MODE||"start",f=process.env.CONSTELLA_LAUNCHER_PID||(process.ppid?String(process.ppid):"0"),g=(0,o.r$)(),h=process.env.PORT||"3000",i=process.env.CONSTELLA_PKG_ROOT||process.cwd(),j=(0,l.join)(i,"bin","constella-update.mjs"),r=a.latest?["--version",a.latest]:[];return(0,n.spawn)(process.execPath,[j,"--quiet","--pid",f,"--mode",e,"--home",g,"--port",h,...r],{detached:!0,stdio:"ignore",windowsHide:!0,cwd:(0,m.tmpdir)()}).unref(),{ok:!0,started:!0,needsRestart:!0,context:b,command:c,backupDir:d,message:`Updating to ${a.latest} and restarting — this page reconnects in a few seconds.`}}catch(a){return{ok:!1,context:b,command:c,backupDir:d,message:"Couldn't launch the updater: "+String(a instanceof Error?a.message:a)}}}(a,b,c,d)}var s=c(97603),t=c(65705),u=c(1890),v=c(10245);async function w(){let a=await t.db.select({lastPulse:u.agent.lastPulse}).from(u.agent).where((0,s.eq)(u.agent.status,"working")),b=Date.now()-v.fQ;return a.some(a=>null!=a.lastPulse&&new Date(a.lastPulse).getTime()>=b)}async function x(a=!1){return(0,j.checkForUpdate)(a)}async function y(a=!1){let[b,c]=await Promise.all([(0,j.checkForUpdate)(a),w()]);return{info:b,busy:c}}async function z(){return i()}async function A(){return(await (0,e.nP)(),await w())?{ok:!1,started:!1,blocked:!0,context:"",command:"",message:"An agent is working — pause it before updating."}:r()}async function B(){try{return JSON.parse((0,k.readFileSync)(q(),"utf8"))}catch{return{status:"idle"}}}(0,c(74252).D)([x,y,z,A,B]),(0,d.A)(x,"40bc1c38fe5859f94e8f79cb473dbc41e188992aad",null),(0,d.A)(y,"40e75079f4b731afb27cbf4de46348e1c26461bbb5",null),(0,d.A)(z,"00ee5748ec968a18003657ec434046e78e64366821",null),(0,d.A)(A,"009378c403e9e324f0ea88a71d85dfea0ed41709af",null),(0,d.A)(B,"0042ee277c4926ed16da4986433df2a10d31d9c1e3",null)},64567:(a,b,c)=>{c.d(b,{T:()=>e});let d=["start","auth","vps","portable"];function e(){let a=process.env.CONSTELLA_RUN_MODE;return a&&d.includes(a)?a:"start"}},67949:(a,b,c)=>{c.d(b,{l:()=>g});var d=c(79676),e=c(75785);async function f(){return(0,e.e)((await (0,d.cookies)()).get("cn-lang")?.value)}async function g(){let a=await f();return(b,c)=>(0,e.t)(a,b,c)}}};
1
+ "use strict";exports.id=6431,exports.ids=[6431,7336],exports.modules={4719:(a,b,c)=>{c.d(b,{ViewChrome:()=>d});let d=(0,c(62060).registerClientReference)(function(){throw Error("Attempted to call ViewChrome() from the server but ViewChrome is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"C:\\Users\\Usuario\\Documents\\constella\\src\\components\\shell\\view-chrome.tsx","ViewChrome")},5323:(a,b,c)=>{c.d(b,{_:()=>g});var d=c(61576),e=c(1308),f=c(4719);function g({title:a,sub:b,right:c,icon:h,flush:i,children:j}){return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(e.b,{title:a}),(0,d.jsx)(f.ViewChrome,{title:a,sub:b,right:c,icon:h,flush:i,children:j})]})}},25228:(a,b,c)=>{c.d(b,{e:()=>e});var d=c(61576);function e({name:a,color:b,size:c=24,health:f,image:g}){let h=Math.max(6,Math.round(.3*c)),i=Math.round(.28*c),j=g?/^(data:|https?:|\/)/.test(g)?g:`/api/upload?path=${encodeURIComponent(g)}`:null;return(0,d.jsxs)("span",{style:{position:"relative",width:c,height:c,flex:`0 0 ${c}px`,display:"inline-block"},children:[j?(0,d.jsx)("img",{src:j,alt:a,width:c,height:c,style:{width:c,height:c,borderRadius:i,objectFit:"cover",display:"block"}}):(0,d.jsx)("span",{style:{width:c,height:c,borderRadius:i,background:b,color:"#fff",display:"grid",placeItems:"center",fontSize:Math.round(.42*c),fontWeight:700},children:(a[0]||"?").toUpperCase()}),f&&(0,d.jsx)("span",{style:{position:"absolute",right:-1,bottom:-1,width:h,height:h,borderRadius:"50%",background:"alive"===f?"var(--sx-string)":"stale"===f?"var(--sx-number)":"var(--text-faint)",border:"1.5px solid var(--bg-elevated)"}})]})}},47336:(a,b,c)=>{c.d(b,{checkForUpdate:()=>m});var d=c(73024),e=c(76760),f=c(30043);let g="constellai",h=null,i=a=>a.replace(/^v/,"").split("-")[0].split(".").map(a=>parseInt(a,10)||0),j=a=>a.replace(/^v/,"").split("-")[1]??"";async function k(a){try{let b=new AbortController,c=setTimeout(()=>b.abort(),3e3),d=await fetch(a,{signal:b.signal,headers:{"user-agent":"constella"}});return clearTimeout(c),d.ok?await d.json():null}catch{return null}}async function l(a){try{let b=new AbortController,c=setTimeout(()=>b.abort(),3e3),d=await fetch(a,{signal:b.signal,headers:{"user-agent":"constella"}});return clearTimeout(c),d.ok?await d.text():null}catch{return null}}async function m(a=!1){let b,c,n=function(){if(process.env.CONSTELLA_VERSION)return process.env.CONSTELLA_VERSION;try{let a=JSON.parse((0,d.readFileSync)((0,e.join)((0,f.v)(),"package.json"),"utf8"));if(a?.version)return a.version}catch{}return"0.0.0"}(),o=`npm install -g ${g}@latest`;if(!a&&h&&Date.now()-h.at<216e5)return h.info;let p=await k(`https://registry.npmjs.org/${g}/latest`),q=p?.version??null,r=!!q&&function(a,b){let c=i(a),d=i(b);for(let a=0;a<3;a++){if((c[a]||0)>(d[a]||0))return!0;if((c[a]||0)<(d[a]||0))return!1}return!j(a)&&!!j(b)}(q,n),s=null;if(r&&q){let a=await l("https://raw.githubusercontent.com/gabriel7silva/constella/main/CHANGELOG.md");s=a?function(a,b){let c=b.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),d=a.match(RegExp(`(^|\\n)##\\s*\\[?${c}\\]?[\\s\\S]*?(?=\\n##\\s|$)`));if(d)return d[0].trim();let e=a.split(/\n##\s/)[1];return e?"## "+e.trim():null}(a,q):null}let t={current:n,latest:q,updateAvailable:r,type:q?(b=i(q),c=i(n),b[0]>c[0]?"major":b[1]>c[1]?"minor":b[2]>c[2]||!j(q)&&j(n)?"patch":null):null,command:o,changelog:s};return h={at:Date.now(),info:t},t}},51221:(a,b,c)=>{c.d(b,{ViewChrome:()=>h});var d=c(4374),e=c(43526),f=c(48442),g=c(31819);function h({title:a,sub:b,right:c,icon:i,flush:j,children:k}){let l=(0,g.k)(),m=f.e.find(b=>b.title===a),n=i??m?.icon,o=m?l(`mod.${m.id}`):a;return(0,d.jsxs)("div",{className:"app-view",children:[(0,d.jsxs)("div",{className:"view-head",children:[n&&(0,d.jsx)("div",{className:"vh-icon",children:(0,d.jsx)(e.I,{name:n,size:18})}),(0,d.jsxs)("div",{style:{flex:1,minWidth:0},children:[(0,d.jsx)("div",{className:"view-title",children:o}),b&&(0,d.jsx)("div",{className:"view-sub",children:b})]}),c]}),(0,d.jsx)("div",{className:"view-body",style:j?{padding:0,overflow:"hidden"}:void 0,children:k})]})}},52932:(a,b,c)=>{c.d(b,{pM:()=>z,lP:()=>y,Kg:()=>x,eU:()=>B,PG:()=>A});var d=c(6866),e=c(53993),f=c(30043),g=c(64567),h=c(30170);function i(){return(0,h.n)()?"dev":"vps"===(0,g.T)()?"vps":"portable"===(0,g.T)()?"portable":/[\\/]_npx[\\/]/.test((0,f.v)())?"npx":"global"}var j=c(47336),k=c(73024),l=c(76760),m=c(48161),n=c(31421),o=c(57086);let p=()=>new Date().toISOString().replace(/[:.]/g,"-"),q=()=>(0,l.join)((0,o.r$)(),"backups","last-update.json");async function r(){let a=await (0,j.checkForUpdate)(!0),b=i(),c=a.command;if(!a.updateAvailable)return{ok:!0,context:b,command:c,message:"Already up to date."};let d=function(){try{let a=(0,o.r$)(),b=(0,l.join)(a,"backups",p());for(let c of((0,k.mkdirSync)(b,{recursive:!0}),[".env","constella.db","constella.db-wal","constella.db-shm"])){let d=(0,l.join)(a,c);if((0,k.existsSync)(d))try{(0,k.copyFileSync)(d,(0,l.join)(b,c))}catch{}}return b}catch{return null}}()??void 0;if("dev"===b)return{ok:!1,context:b,command:c,backupDir:d,message:"Running from source — update with: git pull && pnpm install && pnpm build"};if("npx"===b)return{ok:!1,context:b,command:c,backupDir:d,message:"npx runs an ephemeral copy — re-run: npx constellai@latest"};if("vps"===b){var e="bash scripts/vps-update.sh";try{(0,k.writeFileSync)(q(),JSON.stringify({status:"running",to:a.latest,at:p()}));let b=(0,o.r$)(),c=process.env.CONSTELLA_PKG_ROOT||process.cwd(),f=(0,l.join)(c,"bin","constella-update.mjs"),g=a.latest?["--version",a.latest]:[];return(0,n.spawn)(process.execPath,[f,"--quiet","--mode","vps","--home",b,...g],{detached:!0,stdio:"ignore",cwd:(0,m.tmpdir)()}).unref(),{ok:!0,started:!0,needsRestart:!0,context:"vps",command:e,backupDir:d,message:`Updating to ${a.latest} and restarting the service — this page reconnects in a few seconds.`}}catch(a){return{ok:!1,context:"vps",command:e,backupDir:d,message:"Couldn't launch the updater: "+String(a instanceof Error?a.message:a)}}}return function(a,b,c,d){try{(0,k.writeFileSync)(q(),JSON.stringify({status:"running",to:a.latest,at:p()}));let e=process.env.CONSTELLA_RUN_MODE||"start",f=process.env.CONSTELLA_LAUNCHER_PID||"0",g=(0,o.r$)(),h=process.env.PORT||"3000",i=process.env.CONSTELLA_PKG_ROOT||process.cwd(),j=(0,l.join)(i,"bin","constella-update.mjs"),r=a.latest?["--version",a.latest]:[];return(0,n.spawn)(process.execPath,[j,"--quiet","--pid",f,"--mode",e,"--home",g,"--port",h,...r],{detached:!0,stdio:"ignore",windowsHide:!0,cwd:(0,m.tmpdir)()}).unref(),{ok:!0,started:!0,needsRestart:!0,context:b,command:c,backupDir:d,message:`Updating to ${a.latest} and restarting — this page reconnects in a few seconds.`}}catch(a){return{ok:!1,context:b,command:c,backupDir:d,message:"Couldn't launch the updater: "+String(a instanceof Error?a.message:a)}}}(a,b,c,d)}var s=c(97603),t=c(65705),u=c(1890),v=c(10245);async function w(){let a=await t.db.select({lastPulse:u.agent.lastPulse}).from(u.agent).where((0,s.eq)(u.agent.status,"working")),b=Date.now()-v.fQ;return a.some(a=>null!=a.lastPulse&&new Date(a.lastPulse).getTime()>=b)}async function x(a=!1){return(0,j.checkForUpdate)(a)}async function y(a=!1){let[b,c]=await Promise.all([(0,j.checkForUpdate)(a),w()]);return{info:b,busy:c}}async function z(){return i()}async function A(){return(await (0,e.nP)(),await w())?{ok:!1,started:!1,blocked:!0,context:"",command:"",message:"An agent is working — pause it before updating."}:r()}async function B(){try{return JSON.parse((0,k.readFileSync)(q(),"utf8"))}catch{return{status:"idle"}}}(0,c(74252).D)([x,y,z,A,B]),(0,d.A)(x,"4032ce36226d2272a3df9a36cf1933b6c28baccdd3",null),(0,d.A)(y,"40e976bc870ce1c7b3f38b0d9673cb9eb9fe7e3699",null),(0,d.A)(z,"00559e73fec16acf73cac021e62ec0e900348d99f4",null),(0,d.A)(A,"002b0e1a6cbadd698c849dff2fb3a3f7c779f3f410",null),(0,d.A)(B,"005a571e9f925fc3e12976cc4f07b437bcea1f0f12",null)},64567:(a,b,c)=>{c.d(b,{T:()=>e});let d=["start","auth","vps","portable"];function e(){let a=process.env.CONSTELLA_RUN_MODE;return a&&d.includes(a)?a:"start"}},67949:(a,b,c)=>{c.d(b,{l:()=>g});var d=c(79676),e=c(75785);async function f(){return(0,e.e)((await (0,d.cookies)()).get("cn-lang")?.value)}async function g(){let a=await f();return(b,c)=>(0,e.t)(a,b,c)}}};
@@ -0,0 +1 @@
1
+ "use strict";exports.id=6753,exports.ids=[6753,7336],exports.modules={4719:(a,b,c)=>{c.d(b,{ViewChrome:()=>d});let d=(0,c(62060).registerClientReference)(function(){throw Error("Attempted to call ViewChrome() from the server but ViewChrome is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"C:\\Users\\Usuario\\Documents\\constella\\src\\components\\shell\\view-chrome.tsx","ViewChrome")},5323:(a,b,c)=>{c.d(b,{_:()=>g});var d=c(61576),e=c(1308),f=c(4719);function g({title:a,sub:b,right:c,icon:h,flush:i,children:j}){return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(e.b,{title:a}),(0,d.jsx)(f.ViewChrome,{title:a,sub:b,right:c,icon:h,flush:i,children:j})]})}},9842:(a,b,c)=>{c.d(b,{IZ:()=>k,Ix:()=>j,ZF:()=>m,h6:()=>n,w1:()=>l});var d=c(1782),e=c(76760),f=c(80280),g=c(25533),h=c(18612),i=c(54033);function j(a,b){if(!b)return null;let c=(0,h.HZ)(a),d=((0,e.isAbsolute)(b)?(0,e.relative)(c,b):b).replace(/\\/g,"/");return!d||d.startsWith("..")||d.startsWith(".git/")||d.startsWith(".claude/")||d.startsWith("archives/")?null:d}async function k(a,b,c){let e=(0,d.Uo)((0,d.eq)(g.fileLock.workspaceId,a),(0,d.eq)(g.fileLock.path,b)),[h]=await f.db.select().from(g.fileLock).where(e);if(h){let a=!!c.taskId&&h.taskId===c.taskId,b=!h.taskId&&!!c.agentId&&h.agentId===c.agentId;return a||b?(await f.db.update(g.fileLock).set({heartbeatAt:new Date}).where(e),{ok:!0}):{ok:!1,heldBy:{handle:h.agentHandle,taskId:h.taskId}}}try{return await f.db.insert(g.fileLock).values({workspaceId:a,path:b,taskId:c.taskId||"",agentId:c.agentId||"",agentHandle:c.handle||"",acquiredAt:new Date,heartbeatAt:new Date}),{ok:!0}}catch{let[a]=await f.db.select().from(g.fileLock).where(e);if(a&&(a.taskId===c.taskId||a.agentId===c.agentId))return{ok:!0};return{ok:!1,heldBy:a?{handle:a.agentHandle,taskId:a.taskId}:void 0}}}async function l(a,b){if(b)try{let c=await f.db.select({path:g.fileLock.path}).from(g.fileLock).where((0,d.Uo)((0,d.eq)(g.fileLock.workspaceId,a),(0,d.eq)(g.fileLock.taskId,b)));for(let e of(await f.db.delete(g.fileLock).where((0,d.Uo)((0,d.eq)(g.fileLock.workspaceId,a),(0,d.eq)(g.fileLock.taskId,b))),c))await (0,i.W_)(a,"task",`lock:${e.path}`)}catch{}}async function m(a=3e5){try{await f.db.delete(g.fileLock).where((0,d.lt)(g.fileLock.heartbeatAt,new Date(Date.now()-a)))}catch{}}async function n(a){try{return await f.db.select({path:g.fileLock.path,agentHandle:g.fileLock.agentHandle,taskId:g.fileLock.taskId}).from(g.fileLock).where((0,d.eq)(g.fileLock.workspaceId,a))}catch{return[]}}},36883:(a,b,c)=>{c.d(b,{O:()=>e});var d=c(2910);let e=(0,d.createServerReference)("0084309fb44ce269483fc8999928b4a0ba04581c5a",d.callServer,void 0,d.findSourceMapURL,"curateKbAction")},47336:(a,b,c)=>{c.d(b,{checkForUpdate:()=>m});var d=c(73024),e=c(76760),f=c(30043);let g="constellai",h=null,i=a=>a.replace(/^v/,"").split("-")[0].split(".").map(a=>parseInt(a,10)||0),j=a=>a.replace(/^v/,"").split("-")[1]??"";async function k(a){try{let b=new AbortController,c=setTimeout(()=>b.abort(),3e3),d=await fetch(a,{signal:b.signal,headers:{"user-agent":"constella"}});return clearTimeout(c),d.ok?await d.json():null}catch{return null}}async function l(a){try{let b=new AbortController,c=setTimeout(()=>b.abort(),3e3),d=await fetch(a,{signal:b.signal,headers:{"user-agent":"constella"}});return clearTimeout(c),d.ok?await d.text():null}catch{return null}}async function m(a=!1){let b,c,n=function(){if(process.env.CONSTELLA_VERSION)return process.env.CONSTELLA_VERSION;try{let a=JSON.parse((0,d.readFileSync)((0,e.join)((0,f.v)(),"package.json"),"utf8"));if(a?.version)return a.version}catch{}return"0.0.0"}(),o=`npm install -g ${g}@latest`;if(!a&&h&&Date.now()-h.at<216e5)return h.info;let p=await k(`https://registry.npmjs.org/${g}/latest`),q=p?.version??null,r=!!q&&function(a,b){let c=i(a),d=i(b);for(let a=0;a<3;a++){if((c[a]||0)>(d[a]||0))return!0;if((c[a]||0)<(d[a]||0))return!1}return!j(a)&&!!j(b)}(q,n),s=null;if(r&&q){let a=await l("https://raw.githubusercontent.com/gabriel7silva/constella/main/CHANGELOG.md");s=a?function(a,b){let c=b.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),d=a.match(RegExp(`(^|\\n)##\\s*\\[?${c}\\]?[\\s\\S]*?(?=\\n##\\s|$)`));if(d)return d[0].trim();let e=a.split(/\n##\s/)[1];return e?"## "+e.trim():null}(a,q):null}let t={current:n,latest:q,updateAvailable:r,type:q?(b=i(q),c=i(n),b[0]>c[0]?"major":b[1]>c[1]?"minor":b[2]>c[2]||!j(q)&&j(n)?"patch":null):null,command:o,changelog:s};return h={at:Date.now(),info:t},t}},51221:(a,b,c)=>{c.d(b,{ViewChrome:()=>h});var d=c(4374),e=c(43526),f=c(48442),g=c(31819);function h({title:a,sub:b,right:c,icon:i,flush:j,children:k}){let l=(0,g.k)(),m=f.e.find(b=>b.title===a),n=i??m?.icon,o=m?l(`mod.${m.id}`):a;return(0,d.jsxs)("div",{className:"app-view",children:[(0,d.jsxs)("div",{className:"view-head",children:[n&&(0,d.jsx)("div",{className:"vh-icon",children:(0,d.jsx)(e.I,{name:n,size:18})}),(0,d.jsxs)("div",{style:{flex:1,minWidth:0},children:[(0,d.jsx)("div",{className:"view-title",children:o}),b&&(0,d.jsx)("div",{className:"view-sub",children:b})]}),c]}),(0,d.jsx)("div",{className:"view-body",style:j?{padding:0,overflow:"hidden"}:void 0,children:k})]})}},52932:(a,b,c)=>{c.d(b,{pM:()=>z,lP:()=>y,Kg:()=>x,eU:()=>B,PG:()=>A});var d=c(6866),e=c(53993),f=c(30043),g=c(64567),h=c(30170);function i(){return(0,h.n)()?"dev":"vps"===(0,g.T)()?"vps":"portable"===(0,g.T)()?"portable":/[\\/]_npx[\\/]/.test((0,f.v)())?"npx":"global"}var j=c(47336),k=c(73024),l=c(76760),m=c(48161),n=c(31421),o=c(57086);let p=()=>new Date().toISOString().replace(/[:.]/g,"-"),q=()=>(0,l.join)((0,o.r$)(),"backups","last-update.json");async function r(){let a=await (0,j.checkForUpdate)(!0),b=i(),c=a.command;if(!a.updateAvailable)return{ok:!0,context:b,command:c,message:"Already up to date."};let d=function(){try{let a=(0,o.r$)(),b=(0,l.join)(a,"backups",p());for(let c of((0,k.mkdirSync)(b,{recursive:!0}),[".env","constella.db","constella.db-wal","constella.db-shm"])){let d=(0,l.join)(a,c);if((0,k.existsSync)(d))try{(0,k.copyFileSync)(d,(0,l.join)(b,c))}catch{}}return b}catch{return null}}()??void 0;if("dev"===b)return{ok:!1,context:b,command:c,backupDir:d,message:"Running from source — update with: git pull && pnpm install && pnpm build"};if("npx"===b)return{ok:!1,context:b,command:c,backupDir:d,message:"npx runs an ephemeral copy — re-run: npx constellai@latest"};if("vps"===b){var e="bash scripts/vps-update.sh";try{(0,k.writeFileSync)(q(),JSON.stringify({status:"running",to:a.latest,at:p()}));let b=(0,o.r$)(),c=process.env.CONSTELLA_PKG_ROOT||process.cwd(),f=(0,l.join)(c,"bin","constella-update.mjs"),g=a.latest?["--version",a.latest]:[];return(0,n.spawn)(process.execPath,[f,"--quiet","--mode","vps","--home",b,...g],{detached:!0,stdio:"ignore",cwd:(0,m.tmpdir)()}).unref(),{ok:!0,started:!0,needsRestart:!0,context:"vps",command:e,backupDir:d,message:`Updating to ${a.latest} and restarting the service — this page reconnects in a few seconds.`}}catch(a){return{ok:!1,context:"vps",command:e,backupDir:d,message:"Couldn't launch the updater: "+String(a instanceof Error?a.message:a)}}}return function(a,b,c,d){try{(0,k.writeFileSync)(q(),JSON.stringify({status:"running",to:a.latest,at:p()}));let e=process.env.CONSTELLA_RUN_MODE||"start",f=process.env.CONSTELLA_LAUNCHER_PID||"0",g=(0,o.r$)(),h=process.env.PORT||"3000",i=process.env.CONSTELLA_PKG_ROOT||process.cwd(),j=(0,l.join)(i,"bin","constella-update.mjs"),r=a.latest?["--version",a.latest]:[];return(0,n.spawn)(process.execPath,[j,"--quiet","--pid",f,"--mode",e,"--home",g,"--port",h,...r],{detached:!0,stdio:"ignore",windowsHide:!0,cwd:(0,m.tmpdir)()}).unref(),{ok:!0,started:!0,needsRestart:!0,context:b,command:c,backupDir:d,message:`Updating to ${a.latest} and restarting — this page reconnects in a few seconds.`}}catch(a){return{ok:!1,context:b,command:c,backupDir:d,message:"Couldn't launch the updater: "+String(a instanceof Error?a.message:a)}}}(a,b,c,d)}var s=c(97603),t=c(65705),u=c(1890),v=c(10245);async function w(){let a=await t.db.select({lastPulse:u.agent.lastPulse}).from(u.agent).where((0,s.eq)(u.agent.status,"working")),b=Date.now()-v.fQ;return a.some(a=>null!=a.lastPulse&&new Date(a.lastPulse).getTime()>=b)}async function x(a=!1){return(0,j.checkForUpdate)(a)}async function y(a=!1){let[b,c]=await Promise.all([(0,j.checkForUpdate)(a),w()]);return{info:b,busy:c}}async function z(){return i()}async function A(){return(await (0,e.nP)(),await w())?{ok:!1,started:!1,blocked:!0,context:"",command:"",message:"An agent is working — pause it before updating."}:r()}async function B(){try{return JSON.parse((0,k.readFileSync)(q(),"utf8"))}catch{return{status:"idle"}}}(0,c(74252).D)([x,y,z,A,B]),(0,d.A)(x,"4032ce36226d2272a3df9a36cf1933b6c28baccdd3",null),(0,d.A)(y,"40e976bc870ce1c7b3f38b0d9673cb9eb9fe7e3699",null),(0,d.A)(z,"00559e73fec16acf73cac021e62ec0e900348d99f4",null),(0,d.A)(A,"002b0e1a6cbadd698c849dff2fb3a3f7c779f3f410",null),(0,d.A)(B,"005a571e9f925fc3e12976cc4f07b437bcea1f0f12",null)},64567:(a,b,c)=>{c.d(b,{T:()=>e});let d=["start","auth","vps","portable"];function e(){let a=process.env.CONSTELLA_RUN_MODE;return a&&d.includes(a)?a:"start"}},67949:(a,b,c)=>{c.d(b,{l:()=>g});var d=c(79676),e=c(75785);async function f(){return(0,e.e)((await (0,d.cookies)()).get("cn-lang")?.value)}async function g(){let a=await f();return(b,c)=>(0,e.t)(a,b,c)}},81560:(a,b,c)=>{c.r(b),c.d(b,{"001b9ae4c2ecf53ff029edf2f641e5c766015dc45a":()=>e.y_,"002b0e1a6cbadd698c849dff2fb3a3f7c779f3f410":()=>n.PG,"002b81a5ac2b55ecc8d0337fcf394b1b5997bf57bf":()=>h.x7,"002d170169b404dfa07563c61f709ed86ed7649c07":()=>j.f,"003b06d797273823125ca9af0efeb730b9e96ebdf9":()=>d.xU,"00559e73fec16acf73cac021e62ec0e900348d99f4":()=>n.pM,"005a571e9f925fc3e12976cc4f07b437bcea1f0f12":()=>n.eU,"005aed0ec5d7865de82822cea6e37e04ed711483b0":()=>e.GK,"005d90d568d42db379104c20b60d90b9287e50b1ea":()=>e.PE,"0084309fb44ce269483fc8999928b4a0ba04581c5a":()=>j.O,"008abaabb379d9fbbd4d309ffb88d9371bd171a3d1":()=>k.io,"00c4dd9d99c4d6a26d18945e406f7cde2515944c2e":()=>k.eg,"00ca307e338ad5c4eab62b9e08bc77d4373a600b0e":()=>i.V,"00db26a073944d2d371310b169dcba82ab4bdf3b35":()=>k.dj,"00e8c93fad2e12a8a2d973aa8eac769b42bd0f47a0":()=>e.KO,"00ea05b9ea50055e383eedb9db7a20a0a377095e71":()=>h.Mp,"00ea21e753d9d278e1b3555dd56af4f2daed118c74":()=>d.bt,"400d5f8b83cd2cbcd61cc0e98214c40a80328b81bd":()=>d.gg,"4013575da004bdd1b0a98c979bec6d3ea8c847b87a":()=>k.De,"4014fad5d4a6c0cdadbe2426bd996cce51ad2b8539":()=>i.F,"4030178e8daf36e04142f59d0b5d0c42fa5ddb26a8":()=>i.VJ,"4032ce36226d2272a3df9a36cf1933b6c28baccdd3":()=>n.Kg,"403efa02985947bb2e55947842896a8b3bb0fbdebb":()=>h.lR,"404118134d93aa31bf95ed5fb006a338a57841c620":()=>d.VL,"404abb8b6333ddb838d1d08be265ef5ac941458557":()=>e.ey,"405ad4cd34827706eef52f506339446771d01deade":()=>g.p,"4061b0fc50632faed18dc136cef71539c43b0a646b":()=>d.rd,"4067bdd8eed7e5307f4e420d295c94f85df5b88fff":()=>i.E_,"406daa9a26c598e859f8399f373c73dbefc1167f05":()=>d.GW,"4071b32bf6585d7bc4fcb2e4b5ca0158cbf0cbfa31":()=>d.Wu,"4072b2947cae9c50aafd25582c4e391bd17034d89e":()=>e.RG,"4076cc6b6cff1859f96df3b69ea5748fc1694546a4":()=>e.r7,"407ed950674c9518df668a6c77e9261ad5fd411859":()=>l.q4,"4081819487c7b4a3ca7c0ea79ee3b1adcc076b3dfc":()=>h.sE,"4083c241ed22d1569697ed1b7954f452bccb0dfbe9":()=>e.lJ,"40868c53dcde67d6e8a29cfa083b154cf5be2c774f":()=>l.TX,"408cbc1b9a1e5b6f456bdb17a31c2aa3ead960be5a":()=>e.S,"40b976e0ca8c2141852ea542ea13b8eceaffc367c6":()=>e.jc,"40bb6b44a7c7968528b50ab5312676084e3834259a":()=>l.IL,"40dffad47bc5304514a3e51316ca72022ad3b21ffb":()=>g.L,"40e5a89c27197733d772c2a88cd60b5054b3c26077":()=>m.y,"40e5b955789eec4a1e5972dc536d0f77c54abb0372":()=>d.H7,"40e976bc870ce1c7b3f38b0d9673cb9eb9fe7e3699":()=>n.lP,"40f111930771729d33726ba9d580ec819563b9cb6f":()=>i.zS,"60002bb8da7f2c3a630af3e2165a1a12199f7770f8":()=>e.AA,"6003b268e82f53efcb72087982c8bd31646cbe734f":()=>d.Fu,"600e4c29037ec9fae5202a4a4d0890a44c2d2743c9":()=>f.k,"602d64cbbf4e40e223808485255b7956d79297971c":()=>d.n4,"607069e2bfec182c53a5c62cb6f81a08ef780eb58f":()=>l.Jp,"6075eef0f0b461e465382461b6bc2e3d8c9f970e02":()=>d.ME,"607d87ba6080e0a18f7515163eaa0c8deb323a9e9d":()=>e.q$,"60a1530818f1466351c9506fe097350848042a9afa":()=>d.jw,"60b7be3ed20547cfe6e958bf0bc7cd7597b4cd7cd9":()=>d.rm,"60cb5532c7e73a92965d6c8c43deae1bc445658948":()=>l.bk,"60df683925211e3fe2c339ccf9e922d11e098ccd23":()=>l.bV,"60dfe5517f88ae8541c0250966511da5c29416ccb5":()=>f.I,"60e3c6341b7c8308309300fac949db6ba63d9ad540":()=>e.LZ,"70883b63909498b35c556806231bb1479efe0b3add":()=>e.M8,"709c95f1955b8a7cfcf2b4aed1aa1d7f02e091c6bf":()=>d._z});var d=c(97140),e=c(15487),f=c(79505),g=c(51605),h=c(46363),i=c(46282),j=c(387),k=c(13604),l=c(7482),m=c(58169),n=c(52932)}};
@@ -0,0 +1,4 @@
1
+ "use strict";exports.id=7236,exports.ids=[7236,7336],exports.modules={4719:(a,b,c)=>{c.d(b,{ViewChrome:()=>d});let d=(0,c(62060).registerClientReference)(function(){throw Error("Attempted to call ViewChrome() from the server but ViewChrome is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"C:\\Users\\Usuario\\Documents\\constella\\src\\components\\shell\\view-chrome.tsx","ViewChrome")},5323:(a,b,c)=>{c.d(b,{_:()=>g});var d=c(61576),e=c(1308),f=c(4719);function g({title:a,sub:b,right:c,icon:h,flush:i,children:j}){return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(e.b,{title:a}),(0,d.jsx)(f.ViewChrome,{title:a,sub:b,right:c,icon:h,flush:i,children:j})]})}},47336:(a,b,c)=>{c.d(b,{checkForUpdate:()=>m});var d=c(73024),e=c(76760),f=c(30043);let g="constellai",h=null,i=a=>a.replace(/^v/,"").split("-")[0].split(".").map(a=>parseInt(a,10)||0),j=a=>a.replace(/^v/,"").split("-")[1]??"";async function k(a){try{let b=new AbortController,c=setTimeout(()=>b.abort(),3e3),d=await fetch(a,{signal:b.signal,headers:{"user-agent":"constella"}});return clearTimeout(c),d.ok?await d.json():null}catch{return null}}async function l(a){try{let b=new AbortController,c=setTimeout(()=>b.abort(),3e3),d=await fetch(a,{signal:b.signal,headers:{"user-agent":"constella"}});return clearTimeout(c),d.ok?await d.text():null}catch{return null}}async function m(a=!1){let b,c,n=function(){if(process.env.CONSTELLA_VERSION)return process.env.CONSTELLA_VERSION;try{let a=JSON.parse((0,d.readFileSync)((0,e.join)((0,f.v)(),"package.json"),"utf8"));if(a?.version)return a.version}catch{}return"0.0.0"}(),o=`npm install -g ${g}@latest`;if(!a&&h&&Date.now()-h.at<216e5)return h.info;let p=await k(`https://registry.npmjs.org/${g}/latest`),q=p?.version??null,r=!!q&&function(a,b){let c=i(a),d=i(b);for(let a=0;a<3;a++){if((c[a]||0)>(d[a]||0))return!0;if((c[a]||0)<(d[a]||0))return!1}return!j(a)&&!!j(b)}(q,n),s=null;if(r&&q){let a=await l("https://raw.githubusercontent.com/gabriel7silva/constella/main/CHANGELOG.md");s=a?function(a,b){let c=b.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),d=a.match(RegExp(`(^|\\n)##\\s*\\[?${c}\\]?[\\s\\S]*?(?=\\n##\\s|$)`));if(d)return d[0].trim();let e=a.split(/\n##\s/)[1];return e?"## "+e.trim():null}(a,q):null}let t={current:n,latest:q,updateAvailable:r,type:q?(b=i(q),c=i(n),b[0]>c[0]?"major":b[1]>c[1]?"minor":b[2]>c[2]||!j(q)&&j(n)?"patch":null):null,command:o,changelog:s};return h={at:Date.now(),info:t},t}},51221:(a,b,c)=>{c.d(b,{ViewChrome:()=>h});var d=c(4374),e=c(43526),f=c(48442),g=c(31819);function h({title:a,sub:b,right:c,icon:i,flush:j,children:k}){let l=(0,g.k)(),m=f.e.find(b=>b.title===a),n=i??m?.icon,o=m?l(`mod.${m.id}`):a;return(0,d.jsxs)("div",{className:"app-view",children:[(0,d.jsxs)("div",{className:"view-head",children:[n&&(0,d.jsx)("div",{className:"vh-icon",children:(0,d.jsx)(e.I,{name:n,size:18})}),(0,d.jsxs)("div",{style:{flex:1,minWidth:0},children:[(0,d.jsx)("div",{className:"view-title",children:o}),b&&(0,d.jsx)("div",{className:"view-sub",children:b})]}),c]}),(0,d.jsx)("div",{className:"view-body",style:j?{padding:0,overflow:"hidden"}:void 0,children:k})]})}},52932:(a,b,c)=>{c.d(b,{pM:()=>z,lP:()=>y,Kg:()=>x,eU:()=>B,PG:()=>A});var d=c(6866),e=c(53993),f=c(30043),g=c(64567),h=c(30170);function i(){return(0,h.n)()?"dev":"vps"===(0,g.T)()?"vps":"portable"===(0,g.T)()?"portable":/[\\/]_npx[\\/]/.test((0,f.v)())?"npx":"global"}var j=c(47336),k=c(73024),l=c(76760),m=c(48161),n=c(31421),o=c(57086);let p=()=>new Date().toISOString().replace(/[:.]/g,"-"),q=()=>(0,l.join)((0,o.r$)(),"backups","last-update.json");async function r(){let a=await (0,j.checkForUpdate)(!0),b=i(),c=a.command;if(!a.updateAvailable)return{ok:!0,context:b,command:c,message:"Already up to date."};let d=function(){try{let a=(0,o.r$)(),b=(0,l.join)(a,"backups",p());for(let c of((0,k.mkdirSync)(b,{recursive:!0}),[".env","constella.db","constella.db-wal","constella.db-shm"])){let d=(0,l.join)(a,c);if((0,k.existsSync)(d))try{(0,k.copyFileSync)(d,(0,l.join)(b,c))}catch{}}return b}catch{return null}}()??void 0;if("dev"===b)return{ok:!1,context:b,command:c,backupDir:d,message:"Running from source — update with: git pull && pnpm install && pnpm build"};if("npx"===b)return{ok:!1,context:b,command:c,backupDir:d,message:"npx runs an ephemeral copy — re-run: npx constellai@latest"};if("vps"===b){var e="bash scripts/vps-update.sh";try{(0,k.writeFileSync)(q(),JSON.stringify({status:"running",to:a.latest,at:p()}));let b=(0,o.r$)(),c=process.env.CONSTELLA_PKG_ROOT||process.cwd(),f=(0,l.join)(c,"bin","constella-update.mjs"),g=a.latest?["--version",a.latest]:[];return(0,n.spawn)(process.execPath,[f,"--quiet","--mode","vps","--home",b,...g],{detached:!0,stdio:"ignore",cwd:(0,m.tmpdir)()}).unref(),{ok:!0,started:!0,needsRestart:!0,context:"vps",command:e,backupDir:d,message:`Updating to ${a.latest} and restarting the service — this page reconnects in a few seconds.`}}catch(a){return{ok:!1,context:"vps",command:e,backupDir:d,message:"Couldn't launch the updater: "+String(a instanceof Error?a.message:a)}}}return function(a,b,c,d){try{(0,k.writeFileSync)(q(),JSON.stringify({status:"running",to:a.latest,at:p()}));let e=process.env.CONSTELLA_RUN_MODE||"start",f=process.env.CONSTELLA_LAUNCHER_PID||"0",g=(0,o.r$)(),h=process.env.PORT||"3000",i=process.env.CONSTELLA_PKG_ROOT||process.cwd(),j=(0,l.join)(i,"bin","constella-update.mjs"),r=a.latest?["--version",a.latest]:[];return(0,n.spawn)(process.execPath,[j,"--quiet","--pid",f,"--mode",e,"--home",g,"--port",h,...r],{detached:!0,stdio:"ignore",windowsHide:!0,cwd:(0,m.tmpdir)()}).unref(),{ok:!0,started:!0,needsRestart:!0,context:b,command:c,backupDir:d,message:`Updating to ${a.latest} and restarting — this page reconnects in a few seconds.`}}catch(a){return{ok:!1,context:b,command:c,backupDir:d,message:"Couldn't launch the updater: "+String(a instanceof Error?a.message:a)}}}(a,b,c,d)}var s=c(97603),t=c(65705),u=c(1890),v=c(10245);async function w(){let a=await t.db.select({lastPulse:u.agent.lastPulse}).from(u.agent).where((0,s.eq)(u.agent.status,"working")),b=Date.now()-v.fQ;return a.some(a=>null!=a.lastPulse&&new Date(a.lastPulse).getTime()>=b)}async function x(a=!1){return(0,j.checkForUpdate)(a)}async function y(a=!1){let[b,c]=await Promise.all([(0,j.checkForUpdate)(a),w()]);return{info:b,busy:c}}async function z(){return i()}async function A(){return(await (0,e.nP)(),await w())?{ok:!1,started:!1,blocked:!0,context:"",command:"",message:"An agent is working — pause it before updating."}:r()}async function B(){try{return JSON.parse((0,k.readFileSync)(q(),"utf8"))}catch{return{status:"idle"}}}(0,c(74252).D)([x,y,z,A,B]),(0,d.A)(x,"4032ce36226d2272a3df9a36cf1933b6c28baccdd3",null),(0,d.A)(y,"40e976bc870ce1c7b3f38b0d9673cb9eb9fe7e3699",null),(0,d.A)(z,"00559e73fec16acf73cac021e62ec0e900348d99f4",null),(0,d.A)(A,"002b0e1a6cbadd698c849dff2fb3a3f7c779f3f410",null),(0,d.A)(B,"005a571e9f925fc3e12976cc4f07b437bcea1f0f12",null)},64567:(a,b,c)=>{c.d(b,{T:()=>e});let d=["start","auth","vps","portable"];function e(){let a=process.env.CONSTELLA_RUN_MODE;return a&&d.includes(a)?a:"start"}},67949:(a,b,c)=>{c.d(b,{l:()=>g});var d=c(79676),e=c(75785);async function f(){return(0,e.e)((await (0,d.cookies)()).get("cn-lang")?.value)}async function g(){let a=await f();return(b,c)=>(0,e.t)(a,b,c)}},95032:(a,b,c)=>{c.r(b),c.d(b,{"001b9ae4c2ecf53ff029edf2f641e5c766015dc45a":()=>e.y_,"002b0e1a6cbadd698c849dff2fb3a3f7c779f3f410":()=>y.PG,"002b81a5ac2b55ecc8d0337fcf394b1b5997bf57bf":()=>h.x7,"002d170169b404dfa07563c61f709ed86ed7649c07":()=>j.f,"003b06d797273823125ca9af0efeb730b9e96ebdf9":()=>d.xU,"00559e73fec16acf73cac021e62ec0e900348d99f4":()=>y.pM,"005a571e9f925fc3e12976cc4f07b437bcea1f0f12":()=>y.eU,"005aed0ec5d7865de82822cea6e37e04ed711483b0":()=>e.GK,"005d90d568d42db379104c20b60d90b9287e50b1ea":()=>e.PE,"0084309fb44ce269483fc8999928b4a0ba04581c5a":()=>j.O,"008abaabb379d9fbbd4d309ffb88d9371bd171a3d1":()=>k.io,"00bc817e09142a9121c2b7669c04a48d5b607f4132":()=>x,"00c4dd9d99c4d6a26d18945e406f7cde2515944c2e":()=>k.eg,"00ca307e338ad5c4eab62b9e08bc77d4373a600b0e":()=>i.V,"00db26a073944d2d371310b169dcba82ab4bdf3b35":()=>k.dj,"00e8c93fad2e12a8a2d973aa8eac769b42bd0f47a0":()=>e.KO,"00ea05b9ea50055e383eedb9db7a20a0a377095e71":()=>h.Mp,"00ea21e753d9d278e1b3555dd56af4f2daed118c74":()=>d.bt,"400d5f8b83cd2cbcd61cc0e98214c40a80328b81bd":()=>d.gg,"4013575da004bdd1b0a98c979bec6d3ea8c847b87a":()=>k.De,"4014fad5d4a6c0cdadbe2426bd996cce51ad2b8539":()=>i.F,"4030178e8daf36e04142f59d0b5d0c42fa5ddb26a8":()=>i.VJ,"4032ce36226d2272a3df9a36cf1933b6c28baccdd3":()=>y.Kg,"403efa02985947bb2e55947842896a8b3bb0fbdebb":()=>h.lR,"404118134d93aa31bf95ed5fb006a338a57841c620":()=>d.VL,"404abb8b6333ddb838d1d08be265ef5ac941458557":()=>e.ey,"405ad4cd34827706eef52f506339446771d01deade":()=>g.p,"4061b0fc50632faed18dc136cef71539c43b0a646b":()=>d.rd,"4067bdd8eed7e5307f4e420d295c94f85df5b88fff":()=>i.E_,"406daa9a26c598e859f8399f373c73dbefc1167f05":()=>d.GW,"4071b32bf6585d7bc4fcb2e4b5ca0158cbf0cbfa31":()=>d.Wu,"4072b2947cae9c50aafd25582c4e391bd17034d89e":()=>e.RG,"4076cc6b6cff1859f96df3b69ea5748fc1694546a4":()=>e.r7,"407ed950674c9518df668a6c77e9261ad5fd411859":()=>l.q4,"4081819487c7b4a3ca7c0ea79ee3b1adcc076b3dfc":()=>h.sE,"4083c241ed22d1569697ed1b7954f452bccb0dfbe9":()=>e.lJ,"40868c53dcde67d6e8a29cfa083b154cf5be2c774f":()=>l.TX,"408cbc1b9a1e5b6f456bdb17a31c2aa3ead960be5a":()=>e.S,"40b976e0ca8c2141852ea542ea13b8eceaffc367c6":()=>e.jc,"40bb6b44a7c7968528b50ab5312676084e3834259a":()=>l.IL,"40dffad47bc5304514a3e51316ca72022ad3b21ffb":()=>g.L,"40e5a89c27197733d772c2a88cd60b5054b3c26077":()=>m.y,"40e5b955789eec4a1e5972dc536d0f77c54abb0372":()=>d.H7,"40e976bc870ce1c7b3f38b0d9673cb9eb9fe7e3699":()=>y.lP,"40f111930771729d33726ba9d580ec819563b9cb6f":()=>i.zS,"60002bb8da7f2c3a630af3e2165a1a12199f7770f8":()=>e.AA,"6003b268e82f53efcb72087982c8bd31646cbe734f":()=>d.Fu,"600e4c29037ec9fae5202a4a4d0890a44c2d2743c9":()=>f.k,"602d64cbbf4e40e223808485255b7956d79297971c":()=>d.n4,"607069e2bfec182c53a5c62cb6f81a08ef780eb58f":()=>l.Jp,"6075eef0f0b461e465382461b6bc2e3d8c9f970e02":()=>d.ME,"607d87ba6080e0a18f7515163eaa0c8deb323a9e9d":()=>e.q$,"60a1530818f1466351c9506fe097350848042a9afa":()=>d.jw,"60b7be3ed20547cfe6e958bf0bc7cd7597b4cd7cd9":()=>d.rm,"60cb5532c7e73a92965d6c8c43deae1bc445658948":()=>l.bk,"60d4137111a3ab604aa9847aaf4e5897b600133866":()=>w,"60df683925211e3fe2c339ccf9e922d11e098ccd23":()=>l.bV,"60dfe5517f88ae8541c0250966511da5c29416ccb5":()=>f.I,"60e3c6341b7c8308309300fac949db6ba63d9ad540":()=>e.LZ,"70883b63909498b35c556806231bb1479efe0b3add":()=>e.M8,"709c95f1955b8a7cfcf2b4aed1aa1d7f02e091c6bf":()=>d._z});var d=c(97140),e=c(15487),f=c(79505),g=c(51605),h=c(46363),i=c(46282),j=c(387),k=c(13604),l=c(7482),m=c(58169),n=c(6866),o=c(77598),p=c(97603),q=c(65705),r=c(1890),s=c(53993),t=c(83963),u=c(70149),v=c(24701);async function w(a,b){let{org:c,workspace:d}=await (0,s.nP)(),[e]=await q.db.select().from(r.docIndex).where((0,p.Uo)((0,p.eq)(r.docIndex.id,a),(0,p.eq)(r.docIndex.workspaceId,d.id)));return e?(await (0,t.g)(c.id,e.path,b),{ok:!0}):{ok:!1}}async function x(){let{org:a,workspace:b}=await (0,s.nP)(),c=await q.db.select().from(r.agent).where((0,p.eq)(r.agent.workspaceId,b.id)),d=c.find(a=>"barbara"===a.handle)??c.find(a=>/docs|writer/i.test(a.role))??c[0];if(!d)return{ok:!1,error:"no docs agent"};let e=(0,u.hW)(d.adapter,d.model),f="claude"===e?d.model.includes("opus")?"opus":d.model.includes("haiku")?"haiku":"sonnet":void 0,g=`You are ${d.name} (@${d.handle}), ${d.role} at ${b.name}.
2
+ Review the current state of this workspace directory (code, specs, structure) and write or refresh a single piece of project documentation in GitHub-flavoured Markdown.
3
+ Begin with one H1 title line. Cover what exists, how it is organised, and how to work with it. Be specific and truthful — describe only what the files actually show; do not invent features.
4
+ Output ONLY the Markdown document (no code fences).`,h=await (0,u.JN)(g,{orgId:a.id,binary:e,model:f,timeoutMs:24e4});(h.usd>0||h.inputTokens+h.outputTokens>0)&&await q.db.insert(r.costEntry).values({id:(0,o.randomUUID)(),workspaceId:b.id,agentId:d.id,provider:h.binary,model:h.model??d.model,usd:h.usd,tokens:h.inputTokens+h.outputTokens,at:new Date});let i=h.text.trim();if(!h.ok||!i)return await (0,v.I)(b.id,{kind:"info",text:"Docs generation failed",detail:(h.error??"no output").slice(0,300),agentId:d.id}),{ok:!1,error:h.error};let j=(i.split("\n").find(a=>a.trim())??"Documentation").replace(/^#+\s*/,"").slice(0,120)||"Documentation",k=j.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,60)||"doc",l=`DOCS/${k}.md`;return await (0,t.g)(a.id,l,i),await (0,v.I)(b.id,{kind:"done",text:`${d.name} updated the docs: ${j}`,detail:`Saved to ${l}`,agentId:d.id}),{ok:!0,path:l}}(0,c(74252).D)([w,x]),(0,n.A)(w,"60d4137111a3ab604aa9847aaf4e5897b600133866",null),(0,n.A)(x,"00bc817e09142a9121c2b7669c04a48d5b607f4132",null);var y=c(52932)}};
@@ -1 +1 @@
1
- "use strict";exports.id=7336,exports.ids=[7336],exports.modules={47336:(a,b,c)=>{c.d(b,{checkForUpdate:()=>l});var d=c(73024),e=c(76760),f=c(30043);let g="constellai",h=null,i=a=>a.replace(/^v/,"").split("-")[0].split(".").map(a=>parseInt(a,10)||0);async function j(a){try{let b=new AbortController,c=setTimeout(()=>b.abort(),3e3),d=await fetch(a,{signal:b.signal,headers:{"user-agent":"constella"}});return clearTimeout(c),d.ok?await d.json():null}catch{return null}}async function k(a){try{let b=new AbortController,c=setTimeout(()=>b.abort(),3e3),d=await fetch(a,{signal:b.signal,headers:{"user-agent":"constella"}});return clearTimeout(c),d.ok?await d.text():null}catch{return null}}async function l(a=!1){let b,c,m=function(){if(process.env.CONSTELLA_VERSION)return process.env.CONSTELLA_VERSION;try{let a=JSON.parse((0,d.readFileSync)((0,e.join)((0,f.v)(),"package.json"),"utf8"));if(a?.version)return a.version}catch{}return"0.0.0"}(),n=`npm install -g ${g}@latest`;if(!a&&h&&Date.now()-h.at<216e5)return h.info;let o=await j(`https://registry.npmjs.org/${g}/latest`),p=o?.version??null,q=!!p&&function(a,b){let c=i(a),d=i(b);for(let a=0;a<3;a++){if((c[a]||0)>(d[a]||0))return!0;if((c[a]||0)<(d[a]||0))break}return!1}(p,m),r=null;if(q&&p){let a=await k("https://raw.githubusercontent.com/gabriel7silva/constella/main/CHANGELOG.md");r=a?function(a,b){let c=b.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),d=a.match(RegExp(`(^|\\n)##\\s*\\[?${c}\\]?[\\s\\S]*?(?=\\n##\\s|$)`));if(d)return d[0].trim();let e=a.split(/\n##\s/)[1];return e?"## "+e.trim():null}(a,p):null}let s={current:m,latest:p,updateAvailable:q,type:p?(b=i(p),c=i(m),b[0]>c[0]?"major":b[1]>c[1]?"minor":b[2]>c[2]?"patch":null):null,command:n,changelog:r};return h={at:Date.now(),info:s},s}}};
1
+ "use strict";exports.id=7336,exports.ids=[7336],exports.modules={47336:(a,b,c)=>{c.d(b,{checkForUpdate:()=>m});var d=c(73024),e=c(76760),f=c(30043);let g="constellai",h=null,i=a=>a.replace(/^v/,"").split("-")[0].split(".").map(a=>parseInt(a,10)||0),j=a=>a.replace(/^v/,"").split("-")[1]??"";async function k(a){try{let b=new AbortController,c=setTimeout(()=>b.abort(),3e3),d=await fetch(a,{signal:b.signal,headers:{"user-agent":"constella"}});return clearTimeout(c),d.ok?await d.json():null}catch{return null}}async function l(a){try{let b=new AbortController,c=setTimeout(()=>b.abort(),3e3),d=await fetch(a,{signal:b.signal,headers:{"user-agent":"constella"}});return clearTimeout(c),d.ok?await d.text():null}catch{return null}}async function m(a=!1){let b,c,n=function(){if(process.env.CONSTELLA_VERSION)return process.env.CONSTELLA_VERSION;try{let a=JSON.parse((0,d.readFileSync)((0,e.join)((0,f.v)(),"package.json"),"utf8"));if(a?.version)return a.version}catch{}return"0.0.0"}(),o=`npm install -g ${g}@latest`;if(!a&&h&&Date.now()-h.at<216e5)return h.info;let p=await k(`https://registry.npmjs.org/${g}/latest`),q=p?.version??null,r=!!q&&function(a,b){let c=i(a),d=i(b);for(let a=0;a<3;a++){if((c[a]||0)>(d[a]||0))return!0;if((c[a]||0)<(d[a]||0))return!1}return!j(a)&&!!j(b)}(q,n),s=null;if(r&&q){let a=await l("https://raw.githubusercontent.com/gabriel7silva/constella/main/CHANGELOG.md");s=a?function(a,b){let c=b.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),d=a.match(RegExp(`(^|\\n)##\\s*\\[?${c}\\]?[\\s\\S]*?(?=\\n##\\s|$)`));if(d)return d[0].trim();let e=a.split(/\n##\s/)[1];return e?"## "+e.trim():null}(a,q):null}let t={current:n,latest:q,updateAvailable:r,type:q?(b=i(q),c=i(n),b[0]>c[0]?"major":b[1]>c[1]?"minor":b[2]>c[2]||!j(q)&&j(n)?"patch":null):null,command:o,changelog:s};return h={at:Date.now(),info:t},t}}};
@@ -1,6 +1,6 @@
1
- "use strict";exports.id=7589,exports.ids=[7589],exports.modules={13002:(a,b,c)=>{c.d(b,{T1:()=>l,YL:()=>k,hP:()=>m});var d=c(83999),e=c(87414);let f={TypeScript:"js",JavaScript:"js",Python:"py",Go:"go",Rust:"rust",Java:"jvm",Kotlin:"jvm",Scala:"jvm","C#":"dotnet",Ruby:"ruby",PHP:"php",Elixir:"elixir",Swift:"other","C++":"other",Dart:"other"},g={"Node.js":"js",Bun:"js",Deno:"js","Python 3":"py",PyPy:"py",JVM:"jvm",".NET":"dotnet","BEAM (Erlang VM)":"elixir"},h={NestJS:"js",Fastify:"js",Express:"js",Hono:"js",Koa:"js",AdonisJS:"js",Django:"py",Flask:"py",FastAPI:"py","Spring Boot":"jvm",Spring:"jvm",Laravel:"php",Symfony:"php",CodeIgniter:"php","Ruby on Rails":"ruby",Gin:"go",Fiber:"go",Actix:"rust",Phoenix:"elixir","ASP.NET Core":"dotnet"},i={Prisma:"js",Drizzle:"js",TypeORM:"js",Sequelize:"js",Knex:"js",Mongoose:"js",SQLAlchemy:"py","Django ORM":"py",GORM:"go",Diesel:"rust"},j={js:"JavaScript/TypeScript",py:"Python",jvm:"JVM",dotnet:".NET",go:"Go",rust:"Rust",php:"PHP",ruby:"Ruby",elixir:"Elixir",other:"this"};function k(a,b,c){let e=f[(0,d.BT)(a.language)],k=(0,d.jX)(a.database),l=(0,d.jX)(a.backend);if("runtime"===b){let a=g[c];if(e&&a&&a!==e)return`Needs a ${j[a]} language`}if("backend"===b){let a=h[c];if(e&&a&&a!==e)return`Requires a ${j[a]} language`}if("orm"===b){let a=i[c];if(e&&a&&a!==e)return`${j[a]} only`;if("Mongoose"===c&&k.length>0&&!k.includes("MongoDB"))return"Mongoose needs MongoDB";if("Django ORM"===c&&!l.includes("Django"))return"Only with Django";if(l.includes("Django")&&"Django ORM"!==c&&"None"!==c)return"Django already ships its own ORM"}return null}function l(a){let b={...a},c=[],f=!0,g=0;for(;f&&g++<20;)for(let a of(f=!1,e.z)){let e=(0,d.jX)(b[a.key]);if(!e.length)continue;let g=[];for(let d of e){let e="None"===d?null:k(b,a.key,d);e?(c.push({cat:a.key,opt:d,reason:e}),f=!0):g.push(d)}g.length!==e.length&&(b={...b,[a.key]:(0,d.He)(g)})}return{stack:b,removed:c}}function m(a){let b=(0,d.jX)(a.orm).filter(a=>!["Django ORM","None"].includes(a));return(0,d.jX)(a.backend).includes("Django")&&b.length>0?`Django includes its own ORM — a second ORM (${b.join(", ")}) is usually redundant.`:null}},64567:(a,b,c)=>{c.d(b,{T:()=>e});let d=["start","auth","vps","portable"];function e(){let a=process.env.CONSTELLA_RUN_MODE;return a&&d.includes(a)?a:"start"}},65300:(a,b,c)=>{function d(a,b,c){let d=a.match(/^---\n([\s\S]*?)\n---/);if(!d)return a;let e=d[1].split("\n"),f=!1,g=e.map(a=>a.startsWith(b+":")?(f=!0,`${b}: ${c}`):a);return f||g.push(`${b}: ${c}`),a.replace(/^---\n[\s\S]*?\n---/,`---
1
+ "use strict";exports.id=7589,exports.ids=[7589],exports.modules={13002:(a,b,c)=>{c.d(b,{T1:()=>l,YL:()=>k,hP:()=>m});var d=c(83999),e=c(87414);let f={TypeScript:"js",JavaScript:"js",Python:"py",Go:"go",Rust:"rust",Java:"jvm",Kotlin:"jvm",Scala:"jvm","C#":"dotnet",Ruby:"ruby",PHP:"php",Elixir:"elixir",Swift:"other","C++":"other",Dart:"other"},g={"Node.js":"js",Bun:"js",Deno:"js","Python 3":"py",PyPy:"py",JVM:"jvm",".NET":"dotnet","BEAM (Erlang VM)":"elixir"},h={NestJS:"js",Fastify:"js",Express:"js",Hono:"js",Koa:"js",AdonisJS:"js",Django:"py",Flask:"py",FastAPI:"py","Spring Boot":"jvm",Spring:"jvm",Laravel:"php",Symfony:"php",CodeIgniter:"php","Ruby on Rails":"ruby",Gin:"go",Fiber:"go",Actix:"rust",Phoenix:"elixir","ASP.NET Core":"dotnet"},i={Prisma:"js",Drizzle:"js",TypeORM:"js",Sequelize:"js",Knex:"js",Mongoose:"js",SQLAlchemy:"py","Django ORM":"py",GORM:"go",Diesel:"rust"},j={js:"JavaScript/TypeScript",py:"Python",jvm:"JVM",dotnet:".NET",go:"Go",rust:"Rust",php:"PHP",ruby:"Ruby",elixir:"Elixir",other:"this"};function k(a,b,c){let e=f[(0,d.BT)(a.language)],k=(0,d.jX)(a.database),l=(0,d.jX)(a.backend);if("runtime"===b){let a=g[c];if(e&&a&&a!==e)return`Needs a ${j[a]} language`}if("backend"===b){let a=h[c];if(e&&a&&a!==e)return`Requires a ${j[a]} language`}if("orm"===b){let a=i[c];if(e&&a&&a!==e)return`${j[a]} only`;if("Mongoose"===c&&k.length>0&&!k.includes("MongoDB"))return"Mongoose needs MongoDB";if("Django ORM"===c&&!l.includes("Django"))return"Only with Django";if(l.includes("Django")&&"Django ORM"!==c&&"None"!==c)return"Django already ships its own ORM"}return null}function l(a){let b={...a},c=[],f=!0,g=0;for(;f&&g++<20;)for(let a of(f=!1,e.z)){let e=(0,d.jX)(b[a.key]);if(!e.length)continue;let g=[];for(let d of e){let e="None"===d?null:k(b,a.key,d);e?(c.push({cat:a.key,opt:d,reason:e}),f=!0):g.push(d)}g.length!==e.length&&(b={...b,[a.key]:(0,d.He)(g)})}return{stack:b,removed:c}}function m(a){let b=(0,d.jX)(a.orm).filter(a=>!["Django ORM","None"].includes(a));return(0,d.jX)(a.backend).includes("Django")&&b.length>0?`Django includes its own ORM — a second ORM (${b.join(", ")}) is usually redundant.`:null}},64567:(a,b,c)=>{c.d(b,{T:()=>e});let d=["start","auth","vps","portable"];function e(){let a=process.env.CONSTELLA_RUN_MODE;return a&&d.includes(a)?a:"start"}},65300:(a,b,c)=>{function d(a,b,c){let d=a.match(/^---\n([\s\S]*?)\n---/);if(!d)return a;let e=d[1].split("\n"),f=!1,g=e.map(a=>a.startsWith(b+":")?(f=!0,`${b}: ${c}`):a);return f||g.push(`${b}: ${c}`),a.replace(/^---\n[\s\S]*?\n---/,()=>`---
2
2
  ${g.join("\n")}
3
- ---`)}function e(a,b,c){let d=RegExp(`(\\*\\*${b}:\\*\\*\\s*).*`);return d.test(a)?a.replace(d,`$1${c}`):a}function f(a,b,c){let d=RegExp(`(^|\\n)##\\s+${b}\\s*\\n[\\s\\S]*?(?=\\n##\\s|$)`);return d.test(a)?a.replace(d,`$1## ${b}
3
+ ---`)}function e(a,b,c){let d=RegExp(`(\\*\\*${b}:\\*\\*\\s*).*`);return d.test(a)?a.replace(d,(a,b)=>`${b}${c}`):a}function f(a,b,c){let d=RegExp(`(^|\\n)##\\s+${b}\\s*\\n[\\s\\S]*?(?=\\n##\\s|$)`);return d.test(a)?a.replace(d,(a,d)=>`${d}## ${b}
4
4
  ${c}`):a.replace(/\s*$/,"")+`
5
5
 
6
6
  ## ${b}
@@ -19,4 +19,4 @@ ${b}`);try{for(let b of a.mockFiles.slice(0,200)){let a=("design-mock/import/"+b
19
19
  _These files were attached at onboarding and copied here as the Design module's starting point. The frontend agent uses them to build or improve the prototype before the CEO Planner generates the plan._
20
20
 
21
21
  ## Files
22
- ${b}`)}catch(a){console.error("[onboarding] design-mock seed failed:",a)}try{await (0,v.I)(m,{kind:"design-review",text:`Mock imported — ${a.company||"your project"}`,detail:`${a.mockFiles.length} file(s) imported into the Design module. Open Design — Grace will reconstruct the mock on the canvas to prototype + approve before planning.`,tg:!0})}catch{}}g.db.insert(h.budget).values({workspaceId:m,monthlyCapUsd:400,monthlySpentUsd:0}).run(),g.db.insert(h.plan).values({workspaceId:m,stage:4}).run();let H=[];for(let[a,b,c,d]of E){let f=(0,e.randomUUID)();if(H.push(f),g.db.insert(h.skill).values({id:f,workspaceId:m,name:a,summary:b,trigger:c,native:!0,provisional:d,indexed:d?"pending":"indexed"}).run(),!d)for(let a of Object.keys(G))g.db.insert(h.agentSkill).values({agentId:G[a],skillId:f}).run()}try{(0,A.fR)({orgId:d,wsId:m,names:(0,z.Ws)(),agentIds:G,linkNames:[]}),(0,A.J$)(m)}catch(a){console.error("[onboarding] library skill seed failed:",a)}for(let[a,b,c]of[["GitHub","Commit, push & open PRs from the workspace.",!0],["Telegram","Route reports and alerts to a channel.",!0],["Vault","Encrypted secret storage for provider keys.",!0],["Web Search","Let agents look things up while planning.",!0]])g.db.insert(h.plugin).values({id:(0,e.randomUUID)(),workspaceId:m,name:a,description:b,enabled:c,native:!0}).run();return g.db.update(h.session).set({activeOrgId:d}).where((0,B.eq)(h.session.userId,c)).run(),{ok:!0}}async function I(){let{workspace:a}=await (0,i.nP)(),b=a.settings??{},c=b.source;return c?.type&&"new"!==c.type?(g.db.update(h.workspace).set({settings:{...b,source:{...c,analyzed:!1}}}).where((0,B.eq)(h.workspace.id,a.id)).run(),{ok:!0}):{ok:!1}}(0,C.D)([D,G,H,I]),(0,d.A)(D,"002a58d4e2dea782e2d6c5630045ebc8a621e6fa3f",null),(0,d.A)(G,"404dc47930847f7368939292c31a3233f8815d72e3",null),(0,d.A)(H,"4053584b4b60068bbaa74e2ee47b431c2e15816866",null),(0,d.A)(I,"00e37cb736d670118378fc7cb07462e51c5dc63fbc",null)}};
22
+ ${b}`)}catch(a){console.error("[onboarding] design-mock seed failed:",a)}try{await (0,v.I)(m,{kind:"design-review",text:`Mock imported — ${a.company||"your project"}`,detail:`${a.mockFiles.length} file(s) imported into the Design module. Open Design — Grace will reconstruct the mock on the canvas to prototype + approve before planning.`,tg:!0})}catch{}}g.db.insert(h.budget).values({workspaceId:m,monthlyCapUsd:400,monthlySpentUsd:0}).run(),g.db.insert(h.plan).values({workspaceId:m,stage:4}).run();let H=[];for(let[a,b,c,d]of E){let f=(0,e.randomUUID)();if(H.push(f),g.db.insert(h.skill).values({id:f,workspaceId:m,name:a,summary:b,trigger:c,native:!0,provisional:d,indexed:d?"pending":"indexed"}).run(),!d)for(let a of Object.keys(G))g.db.insert(h.agentSkill).values({agentId:G[a],skillId:f}).run()}try{(0,A.fR)({orgId:d,wsId:m,names:(0,z.Ws)(),agentIds:G,linkNames:[]}),(0,A.J$)(m)}catch(a){console.error("[onboarding] library skill seed failed:",a)}for(let[a,b,c]of[["GitHub","Commit, push & open PRs from the workspace.",!0],["Telegram","Route reports and alerts to a channel.",!0],["Vault","Encrypted secret storage for provider keys.",!0],["Web Search","Let agents look things up while planning.",!0]])g.db.insert(h.plugin).values({id:(0,e.randomUUID)(),workspaceId:m,name:a,description:b,enabled:c,native:!0}).run();return g.db.update(h.session).set({activeOrgId:d}).where((0,B.eq)(h.session.userId,c)).run(),{ok:!0}}async function I(){let{workspace:a}=await (0,i.nP)(),b=a.settings??{},c=b.source;return c?.type&&"new"!==c.type?(g.db.update(h.workspace).set({settings:{...b,source:{...c,analyzed:!1}}}).where((0,B.eq)(h.workspace.id,a.id)).run(),{ok:!0}):{ok:!1}}(0,C.D)([D,G,H,I]),(0,d.A)(D,"001599348fed6aa2cb81fbb4b30cf90a2d16e7e1d0",null),(0,d.A)(G,"400c4882cb9dd69b6575464ee648d953ee69f42bda",null),(0,d.A)(H,"401c3a6e350704945e1308840ac160b6cbc9da60fd",null),(0,d.A)(I,"00afc45b19539a687c675909157cb84839f70707f7",null)}};