constellai 0.3.4 → 0.3.6

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 (268) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +3 -3
  3. package/.next/build-manifest.json +2 -2
  4. package/.next/prerender-manifest.json +3 -3
  5. package/.next/server/app/(app)/activity/page.js +2 -2
  6. package/.next/server/app/(app)/activity/page.js.nft.json +1 -1
  7. package/.next/server/app/(app)/activity/page_client-reference-manifest.js +1 -1
  8. package/.next/server/app/(app)/agents/[handle]/page.js +2 -2
  9. package/.next/server/app/(app)/agents/[handle]/page.js.nft.json +1 -1
  10. package/.next/server/app/(app)/agents/[handle]/page_client-reference-manifest.js +1 -1
  11. package/.next/server/app/(app)/code/page.js +2 -2
  12. package/.next/server/app/(app)/code/page.js.nft.json +1 -1
  13. package/.next/server/app/(app)/code/page_client-reference-manifest.js +1 -1
  14. package/.next/server/app/(app)/config/page.js +2 -2
  15. package/.next/server/app/(app)/config/page.js.nft.json +1 -1
  16. package/.next/server/app/(app)/config/page_client-reference-manifest.js +1 -1
  17. package/.next/server/app/(app)/costs/page.js +2 -2
  18. package/.next/server/app/(app)/costs/page.js.nft.json +1 -1
  19. package/.next/server/app/(app)/costs/page_client-reference-manifest.js +1 -1
  20. package/.next/server/app/(app)/cron/page.js +2 -2
  21. package/.next/server/app/(app)/cron/page.js.nft.json +1 -1
  22. package/.next/server/app/(app)/cron/page_client-reference-manifest.js +1 -1
  23. package/.next/server/app/(app)/dashboard/page.js +2 -2
  24. package/.next/server/app/(app)/dashboard/page.js.nft.json +1 -1
  25. package/.next/server/app/(app)/dashboard/page_client-reference-manifest.js +1 -1
  26. package/.next/server/app/(app)/design/page.js +44 -44
  27. package/.next/server/app/(app)/design/page.js.nft.json +1 -1
  28. package/.next/server/app/(app)/design/page_client-reference-manifest.js +1 -1
  29. package/.next/server/app/(app)/docs/[id]/page.js +2 -2
  30. package/.next/server/app/(app)/docs/[id]/page.js.nft.json +1 -1
  31. package/.next/server/app/(app)/docs/[id]/page_client-reference-manifest.js +1 -1
  32. package/.next/server/app/(app)/docs/page.js +2 -2
  33. package/.next/server/app/(app)/docs/page.js.nft.json +1 -1
  34. package/.next/server/app/(app)/docs/page_client-reference-manifest.js +1 -1
  35. package/.next/server/app/(app)/github/page.js +2 -2
  36. package/.next/server/app/(app)/github/page.js.nft.json +1 -1
  37. package/.next/server/app/(app)/github/page_client-reference-manifest.js +1 -1
  38. package/.next/server/app/(app)/goals/page.js +2 -2
  39. package/.next/server/app/(app)/goals/page.js.nft.json +1 -1
  40. package/.next/server/app/(app)/goals/page_client-reference-manifest.js +1 -1
  41. package/.next/server/app/(app)/inbox/page.js +2 -2
  42. package/.next/server/app/(app)/inbox/page.js.nft.json +1 -1
  43. package/.next/server/app/(app)/inbox/page_client-reference-manifest.js +1 -1
  44. package/.next/server/app/(app)/knowledge/page.js +3 -3
  45. package/.next/server/app/(app)/knowledge/page.js.nft.json +1 -1
  46. package/.next/server/app/(app)/knowledge/page_client-reference-manifest.js +1 -1
  47. package/.next/server/app/(app)/models/page.js +2 -2
  48. package/.next/server/app/(app)/models/page.js.nft.json +1 -1
  49. package/.next/server/app/(app)/models/page_client-reference-manifest.js +1 -1
  50. package/.next/server/app/(app)/notifications/page.js +2 -2
  51. package/.next/server/app/(app)/notifications/page.js.nft.json +1 -1
  52. package/.next/server/app/(app)/notifications/page_client-reference-manifest.js +1 -1
  53. package/.next/server/app/(app)/org/page.js +5 -5
  54. package/.next/server/app/(app)/org/page.js.nft.json +1 -1
  55. package/.next/server/app/(app)/org/page_client-reference-manifest.js +1 -1
  56. package/.next/server/app/(app)/organizations/page.js +2 -2
  57. package/.next/server/app/(app)/organizations/page.js.nft.json +1 -1
  58. package/.next/server/app/(app)/organizations/page_client-reference-manifest.js +1 -1
  59. package/.next/server/app/(app)/page.js +3 -3
  60. package/.next/server/app/(app)/page.js.nft.json +1 -1
  61. package/.next/server/app/(app)/page_client-reference-manifest.js +1 -1
  62. package/.next/server/app/(app)/planner/page.js +3 -3
  63. package/.next/server/app/(app)/planner/page.js.nft.json +1 -1
  64. package/.next/server/app/(app)/planner/page_client-reference-manifest.js +1 -1
  65. package/.next/server/app/(app)/plugins/page.js +2 -2
  66. package/.next/server/app/(app)/plugins/page.js.nft.json +1 -1
  67. package/.next/server/app/(app)/plugins/page_client-reference-manifest.js +1 -1
  68. package/.next/server/app/(app)/pm/page.js +2 -2
  69. package/.next/server/app/(app)/pm/page.js.nft.json +1 -1
  70. package/.next/server/app/(app)/pm/page_client-reference-manifest.js +1 -1
  71. package/.next/server/app/(app)/prepare-deploy/page.js +6 -6
  72. package/.next/server/app/(app)/prepare-deploy/page.js.nft.json +1 -1
  73. package/.next/server/app/(app)/prepare-deploy/page_client-reference-manifest.js +1 -1
  74. package/.next/server/app/(app)/profile/page.js +2 -2
  75. package/.next/server/app/(app)/profile/page.js.nft.json +1 -1
  76. package/.next/server/app/(app)/profile/page_client-reference-manifest.js +1 -1
  77. package/.next/server/app/(app)/pulse/page.js +2 -2
  78. package/.next/server/app/(app)/pulse/page.js.nft.json +1 -1
  79. package/.next/server/app/(app)/pulse/page_client-reference-manifest.js +1 -1
  80. package/.next/server/app/(app)/reports/[id]/page.js +2 -2
  81. package/.next/server/app/(app)/reports/[id]/page.js.nft.json +1 -1
  82. package/.next/server/app/(app)/reports/[id]/page_client-reference-manifest.js +1 -1
  83. package/.next/server/app/(app)/reports/page.js +3 -3
  84. package/.next/server/app/(app)/reports/page.js.nft.json +1 -1
  85. package/.next/server/app/(app)/reports/page_client-reference-manifest.js +1 -1
  86. package/.next/server/app/(app)/routines/page.js +2 -2
  87. package/.next/server/app/(app)/routines/page.js.nft.json +1 -1
  88. package/.next/server/app/(app)/routines/page_client-reference-manifest.js +1 -1
  89. package/.next/server/app/(app)/search/page.js +2 -2
  90. package/.next/server/app/(app)/search/page.js.nft.json +1 -1
  91. package/.next/server/app/(app)/search/page_client-reference-manifest.js +1 -1
  92. package/.next/server/app/(app)/security/page.js +2 -2
  93. package/.next/server/app/(app)/security/page.js.nft.json +1 -1
  94. package/.next/server/app/(app)/security/page_client-reference-manifest.js +1 -1
  95. package/.next/server/app/(app)/skills/page.js +2 -2
  96. package/.next/server/app/(app)/skills/page.js.nft.json +1 -1
  97. package/.next/server/app/(app)/skills/page_client-reference-manifest.js +1 -1
  98. package/.next/server/app/(app)/tasks/page.js +2 -2
  99. package/.next/server/app/(app)/tasks/page.js.nft.json +1 -1
  100. package/.next/server/app/(app)/tasks/page_client-reference-manifest.js +1 -1
  101. package/.next/server/app/(app)/test-dev/page.js +2 -2
  102. package/.next/server/app/(app)/test-dev/page.js.nft.json +1 -1
  103. package/.next/server/app/(app)/test-dev/page_client-reference-manifest.js +1 -1
  104. package/.next/server/app/(app)/update/page.js +3 -3
  105. package/.next/server/app/(app)/update/page.js.nft.json +1 -1
  106. package/.next/server/app/(app)/update/page_client-reference-manifest.js +1 -1
  107. package/.next/server/app/(auth)/login/page.js +2 -2
  108. package/.next/server/app/(auth)/login/page_client-reference-manifest.js +1 -1
  109. package/.next/server/app/(auth)/onboarding/page.js +2 -2
  110. package/.next/server/app/(auth)/onboarding/page_client-reference-manifest.js +1 -1
  111. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  112. package/.next/server/app/_global-error.html +1 -1
  113. package/.next/server/app/_global-error.rsc +3 -3
  114. package/.next/server/app/_global-error.segments/_full.segment.rsc +3 -3
  115. package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  116. package/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  117. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  118. package/.next/server/app/_global-error.segments/_index.segment.rsc +2 -2
  119. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  120. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  121. package/.next/server/app/api/cron/tick/route.js +16 -16
  122. package/.next/server/app/api/locks/acquire/route.js +1 -1
  123. package/.next/server/app/api/sync/file/route.js +1 -1
  124. package/.next/server/app/api/telegram/poll/route.js +11 -11
  125. package/.next/server/app/api/upload/route.js +1 -1
  126. package/.next/server/app/api/v1/[[...path]]/route.js +1 -1
  127. package/.next/server/app-paths-manifest.json +3 -3
  128. package/.next/server/chunks/1249.js +14 -14
  129. package/.next/server/chunks/158.js +21 -0
  130. package/.next/server/chunks/1765.js +1 -0
  131. package/.next/server/chunks/2495.js +1 -0
  132. package/.next/server/chunks/2517.js +1 -1
  133. package/.next/server/chunks/259.js +9 -9
  134. package/.next/server/chunks/2867.js +2 -2
  135. package/.next/server/chunks/2960.js +1 -1
  136. package/.next/server/chunks/3131.js +1 -1
  137. package/.next/server/chunks/3234.js +4 -4
  138. package/.next/server/chunks/4467.js +12 -0
  139. package/.next/server/chunks/4619.js +1 -1
  140. package/.next/server/chunks/4979.js +12 -12
  141. package/.next/server/chunks/535.js +1 -0
  142. package/.next/server/chunks/6431.js +1 -1
  143. package/.next/server/chunks/7225.js +4 -0
  144. package/.next/server/chunks/7336.js +1 -1
  145. package/.next/server/chunks/7589.js +3 -3
  146. package/.next/server/chunks/7989.js +1 -1
  147. package/.next/server/chunks/850.js +1 -1
  148. package/.next/server/chunks/8561.js +3 -3
  149. package/.next/server/chunks/8623.js +1 -1
  150. package/.next/server/chunks/8719.js +417 -0
  151. package/.next/server/chunks/8823.js +1 -1
  152. package/.next/server/chunks/9783.js +3 -3
  153. package/.next/server/chunks/9969.js +1 -1
  154. package/.next/server/instrumentation.js +1 -1
  155. package/.next/server/middleware-build-manifest.js +1 -1
  156. package/.next/server/pages/500.html +1 -1
  157. package/.next/server/server-reference-manifest.js +1 -1
  158. package/.next/server/server-reference-manifest.json +1 -1
  159. package/.next/static/chunks/2831-d7f6495bf43f4f9d.js +4 -0
  160. package/.next/static/chunks/3219-486bddbf87074d04.js +1 -0
  161. package/.next/static/chunks/3775-82dcdf23109aa5bf.js +1 -0
  162. package/.next/static/chunks/6836-341614c5418e2aa4.js +1 -0
  163. package/.next/static/chunks/8306-7418693cd7fd5861.js +1 -0
  164. package/.next/static/chunks/8370-8b3e7106703024ce.js +12 -0
  165. package/.next/static/chunks/9690-ea874aec65263b9d.js +1 -0
  166. package/.next/static/chunks/app/(app)/activity/{page-09bc1c776962737c.js → page-cf8d67941440bdce.js} +1 -1
  167. package/.next/static/chunks/app/(app)/agents/[handle]/page-7baa24f1ae8bc400.js +1 -0
  168. package/.next/static/chunks/app/(app)/code/page-b342d74807e8b914.js +1 -0
  169. package/.next/static/chunks/app/(app)/config/page-1e68ba8d20215d67.js +1 -0
  170. package/.next/static/chunks/app/(app)/costs/page-a58d759eec6048df.js +1 -0
  171. package/.next/static/chunks/app/(app)/cron/page-cc7f4e3d8ab5618f.js +1 -0
  172. package/.next/static/chunks/app/(app)/dashboard/page-7757c33acf751c4c.js +1 -0
  173. package/.next/static/chunks/app/(app)/design/{page-d457cdfa525acb85.js → page-f48c0487d240248e.js} +3 -3
  174. package/.next/static/chunks/app/(app)/docs/[id]/page-95c52cf457d869ef.js +1 -0
  175. package/.next/static/chunks/app/(app)/docs/page-fbc50cd357d5e2ca.js +1 -0
  176. package/.next/static/chunks/app/(app)/github/page-dac138256ed91e65.js +1 -0
  177. package/.next/static/chunks/app/(app)/goals/page-f87d40f6832d63b3.js +1 -0
  178. package/.next/static/chunks/app/(app)/inbox/page-49c1293e0d98874f.js +12 -0
  179. package/.next/static/chunks/app/(app)/knowledge/page-18fca436883ed5cc.js +1 -0
  180. package/.next/static/chunks/app/(app)/layout-c9778f98c0103f74.js +1 -0
  181. package/.next/static/chunks/app/(app)/models/page-030c085cd7767495.js +1 -0
  182. package/.next/static/chunks/app/(app)/notifications/page-12af3fee8b36a00e.js +12 -0
  183. package/.next/static/chunks/app/(app)/org/page-576001ff4a820744.js +12 -0
  184. package/.next/static/chunks/app/(app)/organizations/page-b973e1eee6e56baf.js +1 -0
  185. package/.next/static/chunks/app/(app)/page-cef52fc5f4fd4418.js +1 -0
  186. package/.next/static/chunks/app/(app)/planner/page-da2db56914346192.js +1 -0
  187. package/.next/static/chunks/app/(app)/plugins/page-3b78b76ecb21d616.js +1 -0
  188. package/.next/static/chunks/app/(app)/pm/page-78303379c1ea5dc5.js +1 -0
  189. package/.next/static/chunks/app/(app)/prepare-deploy/page-98b1bd3bf712bb60.js +1 -0
  190. package/.next/static/chunks/app/(app)/profile/page-de24af53de0ef2b2.js +1 -0
  191. package/.next/static/chunks/app/(app)/pulse/page-db7fd63369c01fa2.js +1 -0
  192. package/.next/static/chunks/app/(app)/reports/[id]/page-cc7f4e3d8ab5618f.js +1 -0
  193. package/.next/static/chunks/app/(app)/reports/page-97ab95e6f8b77b62.js +1 -0
  194. package/.next/static/chunks/app/(app)/routines/{page-cf4e597389865ae8.js → page-cf6a3331775ca11b.js} +1 -1
  195. package/.next/static/chunks/app/(app)/search/page-3960825f66b05606.js +1 -0
  196. package/.next/static/chunks/app/(app)/security/page-53b0770355cf7aa4.js +1 -0
  197. package/.next/static/chunks/app/(app)/skills/page-809a73b94861f8b8.js +1 -0
  198. package/.next/static/chunks/app/(app)/tasks/page-b2497927d127f7aa.js +1 -0
  199. package/.next/static/chunks/app/(app)/test-dev/page-93ec5d89e2afb612.js +1 -0
  200. package/.next/static/chunks/app/(app)/update/page-a23322af4e59a93c.js +1 -0
  201. package/.next/static/chunks/app/(auth)/login/page-446681bfb762cb05.js +1 -0
  202. package/.next/static/chunks/app/(auth)/onboarding/page-2b8cb3e0b024c995.js +1 -0
  203. package/.next/trace-build +1 -1
  204. package/CHANGELOG.md +50 -0
  205. package/README.md +7 -1
  206. package/README.pt-BR.md +7 -1
  207. package/bin/constella-update.mjs +19 -7
  208. package/bin/constella.mjs +1 -1
  209. package/bin/worker.mjs +1 -0
  210. package/docs/UPDATE.md +17 -2
  211. package/docs/roadmap.md +36 -0
  212. package/package.json +1 -1
  213. package/scripts/i18n-parity.mjs +1 -1
  214. package/scripts/install.sh +4 -2
  215. package/scripts/publish-public.mjs +12 -3
  216. package/scripts/vps-clean.sh +1 -1
  217. package/scripts/vps-install.sh +24 -7
  218. package/scripts/vps-update.sh +27 -16
  219. package/.next/server/chunks/319.js +0 -1
  220. package/.next/server/chunks/4828.js +0 -1
  221. package/.next/server/chunks/5697.js +0 -1
  222. package/.next/server/chunks/6151.js +0 -12
  223. package/.next/server/chunks/6798.js +0 -21
  224. package/.next/server/chunks/6903.js +0 -417
  225. package/.next/server/chunks/8486.js +0 -4
  226. package/.next/static/chunks/3219-9684aa1c634212de.js +0 -1
  227. package/.next/static/chunks/4353-12629098ed83e468.js +0 -1
  228. package/.next/static/chunks/4398-e798770ae782576f.js +0 -1
  229. package/.next/static/chunks/4428-09f7d473d9e33d59.js +0 -1
  230. package/.next/static/chunks/7457-c37382c6f4e115f8.js +0 -4
  231. package/.next/static/chunks/8370-6da6aa10d687b8ae.js +0 -12
  232. package/.next/static/chunks/9690-00ad96a74abac075.js +0 -1
  233. package/.next/static/chunks/app/(app)/agents/[handle]/page-b11e5f8f25fb2f88.js +0 -1
  234. package/.next/static/chunks/app/(app)/code/page-ff6925db6e10e3cc.js +0 -1
  235. package/.next/static/chunks/app/(app)/config/page-4df2facd9c81adb5.js +0 -1
  236. package/.next/static/chunks/app/(app)/costs/page-c0a07c0283731a8c.js +0 -1
  237. package/.next/static/chunks/app/(app)/cron/page-662e6e1a25b14025.js +0 -1
  238. package/.next/static/chunks/app/(app)/dashboard/page-e6f62eaecc0f9926.js +0 -1
  239. package/.next/static/chunks/app/(app)/docs/[id]/page-4a1be0c9bd6ca402.js +0 -1
  240. package/.next/static/chunks/app/(app)/docs/page-e6db758a14f57ec8.js +0 -1
  241. package/.next/static/chunks/app/(app)/github/page-57bb812627d083a1.js +0 -1
  242. package/.next/static/chunks/app/(app)/goals/page-81e1af515f78e13b.js +0 -1
  243. package/.next/static/chunks/app/(app)/inbox/page-0baef1b01009c832.js +0 -12
  244. package/.next/static/chunks/app/(app)/knowledge/page-eb1317bf385e31ed.js +0 -1
  245. package/.next/static/chunks/app/(app)/layout-dcd4f30b53cb140f.js +0 -1
  246. package/.next/static/chunks/app/(app)/models/page-d73965ae6ca317e8.js +0 -1
  247. package/.next/static/chunks/app/(app)/notifications/page-b3ff14483cb6694e.js +0 -12
  248. package/.next/static/chunks/app/(app)/org/page-3075b218dbc681ce.js +0 -12
  249. package/.next/static/chunks/app/(app)/organizations/page-a6d35dbb21a61b7c.js +0 -1
  250. package/.next/static/chunks/app/(app)/page-c9e4fc0616a0083e.js +0 -1
  251. package/.next/static/chunks/app/(app)/planner/page-809dd3edda4ada93.js +0 -1
  252. package/.next/static/chunks/app/(app)/plugins/page-7e2aad1b702b5c88.js +0 -1
  253. package/.next/static/chunks/app/(app)/pm/page-709f9ac68ac98693.js +0 -1
  254. package/.next/static/chunks/app/(app)/prepare-deploy/page-f9609626153c2483.js +0 -1
  255. package/.next/static/chunks/app/(app)/profile/page-6d22c7bd0adb7a52.js +0 -1
  256. package/.next/static/chunks/app/(app)/pulse/page-f529917828ff4884.js +0 -1
  257. package/.next/static/chunks/app/(app)/reports/[id]/page-662e6e1a25b14025.js +0 -1
  258. package/.next/static/chunks/app/(app)/reports/page-5248735b18767054.js +0 -1
  259. package/.next/static/chunks/app/(app)/search/page-4d1e07c4c43a7489.js +0 -1
  260. package/.next/static/chunks/app/(app)/security/page-db7b8840d9cc6b72.js +0 -1
  261. package/.next/static/chunks/app/(app)/skills/page-a98da9e415efc310.js +0 -1
  262. package/.next/static/chunks/app/(app)/tasks/page-ab33402626a50c88.js +0 -1
  263. package/.next/static/chunks/app/(app)/test-dev/page-34612a4b47ec9aa2.js +0 -1
  264. package/.next/static/chunks/app/(app)/update/page-99d63495bfdd56a9.js +0 -1
  265. package/.next/static/chunks/app/(auth)/login/page-c7b372a5053512f0.js +0 -1
  266. package/.next/static/chunks/app/(auth)/onboarding/page-450bfc87fb942f9b.js +0 -1
  267. /package/.next/static/{mOVW9EdxrQ1xPT7vDdRdK → fb-rRThu8P8AXEQQBbLgT}/_buildManifest.js +0 -0
  268. /package/.next/static/{mOVW9EdxrQ1xPT7vDdRdK → fb-rRThu8P8AXEQQBbLgT}/_ssgManifest.js +0 -0
@@ -0,0 +1,21 @@
1
+ "use strict";exports.id=158,exports.ids=[158],exports.modules={1200:(a,b,c)=>{c.d(b,{j:()=>e});var d=c(2910);let e=(0,d.createServerReference)("40a51f05a62e5ad01e4585ad064bcc9493ef1588fc",d.callServer,void 0,d.findSourceMapURL,"pullModel")},17407:(a,b,c)=>{c.d(b,{A:()=>e});var d=c(2910);let e=(0,d.createServerReference)("403a1916644d7877e6f55e5ed65de73f9157ca3977",d.callServer,void 0,d.findSourceMapURL,"listCatalogModels")},19881:(a,b,c)=>{c.d(b,{W:()=>h});var d=c(4374),e=c(74679);let f={anthropic:"anthropic",claude_code:"claude",openai:"openai",codex_cli:"openai",google:"google",google_gemini:"gemini",gemini_cli:"gemini",vertex_ai:"vertexai",mistral:"mistral",deepseek:"deepseek",cohere:"cohere",perplexity:"perplexity",xai_grok:"grok",groq:"groq",ai21:"ai21",nvidia_nim:"nvidia",huggingface:"huggingface",replicate:"replicate",azure_openai:"azure",aws_bedrock:"bedrock",cloudflare:"cloudflare",dashscope:"qwen",zhipu:"zhipu",moonshot:"moonshot",minimax:"minimax",together:"together",openrouter:"openrouter",fireworks:"fireworks",cerebras:"cerebras",ollama:"ollama",ollama_cli:"ollama",lmstudio:"lmstudio",vllm:"vllm",localai:"localai",elevenlabs:"elevenlabs",stability:"stability",jina:"jina",voyage:"voyage"},g={anthropic:["#d97757","An"],openai:["#10a37f","AI"],google_gemini:["#4285f4","G"],google:["#4285f4","G"],mistral:["#fa520f","Mi"],xai_grok:["#1a1a1a","X"],deepseek:["#4d6bfe","DS"],cohere:["#39594d","Co"],ai21:["#e8488a","A2"],perplexity:["#20808d","Px"],groq:["#f55036","Gq"],nvidia_nim:["#76b900","NV"],together:["#0f6fff","To"],fireworks:["#5019c5","Fw"],cerebras:["#f25733","Cb"],huggingface:["#ff9d00","HF"],replicate:["#1a1a1a","Rp"],openrouter:["#6566f1","OR"],litellm:["#00b8a3","LL"],portkey:["#3b5bdb","Pk"],azure_openai:["#0078d4","Az"],aws_bedrock:["#ff9900","Br"],vertex_ai:["#4285f4","Vx"],cloudflare:["#f38020","Cf"],dashscope:["#ff6a00","Qw"],zhipu:["#3859ff","GL"],moonshot:["#16162a","Ki"],minimax:["#e1342c","MM"],ollama:["#0c0c0c","Ol"],llamacpp:["#7a4ddb","Lc"],lmstudio:["#4a5cff","LM"],vllm:["#1668dc","vL"],localai:["#2e7d32","La"],gpt4all:["#5b6cff","G4"],jan:["#1a1a1a","Jn"],claude_code:["#d97757","CC"],codex_cli:["#10a37f","Cx"],gemini_cli:["#4285f4","Gc"],aider:["#14b8a6","Ad"],ollama_cli:["#0c0c0c","Oc"],openclaw:["#e8590c","OC"],hermes_cli:["#6d28d9","Hm"],opencode:["#1a1a1a","Oc"],copilot_cli:["#1f2328","Co"],cursor_cli:["#1a1a1a","Cu"],cline_cli:["#2563eb","Cl"],kilo_code:["#7c3aed","Ki"],voyage:["#5b21b6","Vo"],jina:["#ec4899","Ji"],stability:["#a855f7","St"],elevenlabs:["#1a1a1a","El"]};function h({id:a,size:b=34,radius:c}){let i,j=g[a],k=j?j[0]:"#5b6378",l=j?j[1]:(a||"?").slice(0,2).replace(/[^a-z0-9]/gi,"").toUpperCase(),m=(i=f[a])?`https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg/icons/${i}.svg`:null,[n,o]=(0,e.useState)(!1),p=null!=c?c:Math.round(.28*b),q=m&&!n,r=Math.round(.66*b);return(0,d.jsx)("span",{className:"prov-glyph",style:{width:b,height:b,flex:"0 0 "+b+"px",borderRadius:p,background:q?"#fff":"linear-gradient(150deg, "+k+", color-mix(in srgb, "+k+" 70%, #000))",color:"#fff",display:"grid",placeItems:"center",overflow:"hidden",fontSize:Math.round(.4*b),fontWeight:800,letterSpacing:"-.5px",boxShadow:q?"inset 0 0 0 1px rgba(0,0,0,.08)":"inset 0 1px 0 rgba(255,255,255,.18)"},children:q?(0,d.jsx)("img",{src:m,alt:"",width:r,height:r,loading:"lazy",onError:()=>o(!0),style:{width:r,height:r,objectFit:"contain",display:"block"}}):l})}},27829:(a,b,c)=>{c.d(b,{Y:()=>j});var d=c(4374),e=c(74679),f=c(71898),g=c(31819);let h={cli_claude_code:[{value:"opus",label:"Claude Opus \xb7 most capable"},{value:"sonnet",label:"Claude Sonnet \xb7 balanced"},{value:"haiku",label:"Claude Haiku \xb7 fast"}],cli_codex:[{value:"gpt-5-codex",label:"GPT-5 Codex"},{value:"o4-mini",label:"o4-mini"}],cli_gemini:[{value:"gemini-2.5-pro",label:"Gemini 2.5 Pro"},{value:"gemini-2.5-flash",label:"Gemini 2.5 Flash"}],cli_openclaw:[{value:"(default)",label:"Configured default"},{value:"openai/gpt-5.4",label:"OpenAI \xb7 GPT-5.4"},{value:"anthropic/claude-sonnet-4",label:"Anthropic \xb7 Claude Sonnet 4"}],cli_hermes:[{value:"(default)",label:"Configured default"},{value:"anthropic/claude-sonnet-4.6",label:"Anthropic \xb7 Claude Sonnet 4.6"},{value:"openai/gpt-5.5",label:"OpenAI \xb7 GPT-5.5"}],cli_aider:[{value:"(default)",label:"Configured default"},{value:"anthropic/claude-sonnet-4-6",label:"Anthropic \xb7 Claude Sonnet 4.6"},{value:"openai/gpt-5.2",label:"OpenAI \xb7 GPT-5.2"},{value:"deepseek/deepseek-chat",label:"DeepSeek \xb7 Chat"}],cli_opencode:[{value:"(default)",label:"Configured default"},{value:"anthropic/claude-sonnet-4-6",label:"Anthropic \xb7 Claude Sonnet 4.6"},{value:"openai/gpt-5.2",label:"OpenAI \xb7 GPT-5.2"}],cli_copilot:[{value:"(default)",label:"Configured default"},{value:"claude-sonnet-4.5",label:"Claude Sonnet 4.5"},{value:"gpt-5",label:"GPT-5"}],cli_cursor:[{value:"(default)",label:"Configured default"},{value:"claude-4.5-sonnet",label:"Claude Sonnet 4.5"},{value:"gpt-5",label:"GPT-5"}],cli_cline:[{value:"(default)",label:"Configured default"}],cli_kilo:[{value:"(default)",label:"Configured default"}]};var i=c(69503);function j({adapter:a,value:b,onChange:c,providers:k}){let l=(0,g.k)(),m=function(a){let b=h[a]??null;if(!b)return null;let c=(0,i.L2)(a);return c?b.map(a=>{let b=c.find(b=>b.id===a.value);return b?{value:a.value,label:`${b.label} ${b.version}${b.note?" \xb7 "+b.note:""}`}:a}):b}(a),n=a.startsWith("local_"),[o,p]=(0,e.useState)(null),[q,r]=(0,e.useState)("");k.find(b=>b.adapter===a);let s=n?[{value:b||"local",label:l("modelpicker.localGguf")}]:null,t=m??s??o??(b?[{value:b,label:b}]:[]),u=b&&!t.some(a=>a.value===b)?[{value:b,label:b},...t]:t;return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(f.m,{mono:!0,value:b,options:u,placeholder:l("modelpicker.placeholder"),onChange:c}),q&&(0,d.jsx)("div",{className:"form-hint",style:{marginTop:4},children:q})]})}c(17407),c(90947)},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
+ ${g.join("\n")}
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
+ ${c}`):a.replace(/\s*$/,"")+`
5
+
6
+ ## ${b}
7
+ ${c}
8
+ `}c.d(b,{a$:()=>e,c4:()=>f,tT:()=>d})},69503:(a,b,c)=>{c.d(b,{L2:()=>e,Ov:()=>f});let d={cli_claude_code:[{id:"opus",label:"Claude Opus",version:"4.8",note:"most capable"},{id:"sonnet",label:"Claude Sonnet",version:"4.6",note:"balanced"},{id:"haiku",label:"Claude Haiku",version:"4.5",note:"fast"}],cli_codex:[{id:"gpt-5-codex",label:"GPT-5 Codex",version:"5"},{id:"o4-mini",label:"o4-mini",version:"o4"}],cli_gemini:[{id:"gemini-2.5-pro",label:"Gemini Pro",version:"2.5"},{id:"gemini-2.5-flash",label:"Gemini Flash",version:"2.5"}],cli_openclaw:[{id:"(default)",label:"OpenClaw",version:"default",note:"configured provider"},{id:"openai/gpt-5.4",label:"GPT",version:"5.4"},{id:"anthropic/claude-sonnet-4",label:"Claude Sonnet",version:"4"}],cli_hermes:[{id:"(default)",label:"Hermes",version:"default",note:"configured provider"},{id:"anthropic/claude-sonnet-4.6",label:"Claude Sonnet",version:"4.6"},{id:"openai/gpt-5.5",label:"GPT",version:"5.5"}],cli_aider:[{id:"(default)",label:"Aider",version:"default",note:"configured provider"},{id:"anthropic/claude-sonnet-4-6",label:"Claude Sonnet",version:"4.6"},{id:"openai/gpt-5.2",label:"GPT",version:"5.2"},{id:"deepseek/deepseek-chat",label:"DeepSeek Chat",version:""}],cli_opencode:[{id:"(default)",label:"OpenCode",version:"default",note:"configured provider"},{id:"anthropic/claude-sonnet-4-6",label:"Claude Sonnet",version:"4.6"},{id:"openai/gpt-5.2",label:"GPT",version:"5.2"}],cli_copilot:[{id:"(default)",label:"Copilot",version:"default",note:"configured provider"},{id:"claude-sonnet-4.5",label:"Claude Sonnet",version:"4.5"},{id:"gpt-5",label:"GPT",version:"5"}],cli_cursor:[{id:"(default)",label:"Cursor",version:"default",note:"configured provider"},{id:"claude-4.5-sonnet",label:"Claude Sonnet",version:"4.5"},{id:"gpt-5",label:"GPT",version:"5"}],cli_cline:[{id:"(default)",label:"Cline",version:"default",note:"configured provider"}],cli_kilo:[{id:"(default)",label:"Kilo Code",version:"default",note:"configured provider"}]};function e(a){return d[a]??null}function f(a){if(!a)return{label:"",version:""};let b=a.replace(/[-_.\s]\d+(?:x\d+)?[bm]\b/i,""),c=b.match(/(\d+(?:[.\-]\d+){0,2})(?!.*\d)/),d=c?c[1].replace(/-/g,"."):"";return{label:(c?b.slice(0,c.index).replace(/[-_.\s]+$/,""):b).split(/[-_.\s]+/).filter(Boolean).map(a=>/^(gpt|llm|api|ai)$/i.test(a)?a.toUpperCase():a.charAt(0).toUpperCase()+a.slice(1)).join(" ")||a,version:d}}},71898:(a,b,c)=>{c.d(b,{m:()=>i});var d=c(4374),e=c(74679),f=c(43526),g=c(19881),h=c(31819);function i({value:a,options:b,onChange:c,placeholder:j,mono:k,glyph:l,disabled:m,searchable:n}){let o=(0,h.k)(),[p,q]=(0,e.useState)(!1),[r,s]=(0,e.useState)(""),t=(0,e.useRef)(null),u=(0,e.useRef)(null),v=(0,e.useMemo)(()=>(b||[]).map(a=>"string"==typeof a?{value:a,label:a}:a),[b]),w=v.find(b=>b.value===a),x=(n??v.length>8)&&!m,y=r.trim().toLowerCase(),z=x&&y?v.filter(a=>(a.label+" "+a.value+" "+(a.sub||"")).toLowerCase().includes(y)):v;return(0,d.jsxs)("div",{className:"dd"+(p?" open":"")+(m?" disabled":""),ref:t,children:[(0,d.jsxs)("button",{type:"button",className:"dd-btn"+(k?" mono":""),onClick:()=>!m&&q(a=>!a),children:[l&&w&&(0,d.jsx)(g.W,{id:w.glyphId||w.value,size:20}),(0,d.jsx)("span",{className:"dd-val",children:w?w.label:(0,d.jsx)("span",{className:"dd-ph",children:j||o("common.selectEllipsis")})}),(0,d.jsx)(f.I,{name:"chevronDown",size:14})]}),p&&(0,d.jsxs)("div",{className:"dd-menu scroll",children:[x&&(0,d.jsxs)("div",{style:{position:"sticky",top:0,zIndex:1,display:"flex",alignItems:"center",gap:6,padding:"6px 8px",margin:"-4px -4px 4px",background:"var(--bg-elev, var(--bg-active))",borderBottom:"1px solid var(--border)"},children:[(0,d.jsx)(f.I,{name:"search",size:13}),(0,d.jsx)("input",{ref:u,value:r,placeholder:o("common.searchEllipsis"),onChange:a=>s(a.target.value),onKeyDown:a=>{"Enter"===a.key&&z[0]?(c(z[0].value),q(!1)):"Escape"===a.key&&r&&(a.stopPropagation(),s(""))},className:k?"mono":void 0,style:{flex:1,minWidth:0,background:"transparent",border:"none",outline:"none",color:"var(--text)",fontSize:12.5,fontFamily:k?"var(--mono-font)":"inherit"}}),r&&(0,d.jsx)("button",{type:"button",title:o("common.clear"),onClick:()=>{s(""),u.current?.focus()},style:{background:"none",border:"none",color:"var(--text-dim)",cursor:"pointer",display:"flex",padding:0},children:(0,d.jsx)(f.I,{name:"close",size:12})})]}),0===v.length&&(0,d.jsx)("div",{className:"dd-empty",children:o("common.noOptions")}),v.length>0&&0===z.length&&(0,d.jsx)("div",{className:"dd-empty",children:o("dropdown.noMatch",{q:r})}),z.map(b=>(0,d.jsxs)("button",{type:"button",className:"dd-opt"+(b.value===a?" on":""),onClick:()=>{c(b.value),q(!1)},children:[l&&(0,d.jsx)(g.W,{id:b.glyphId||b.value,size:22}),(0,d.jsxs)("span",{className:"dd-opt-main",children:[(0,d.jsx)("span",{className:"dd-opt-label"+(k?" mono":""),children:b.label}),b.sub&&(0,d.jsx)("span",{className:"dd-opt-sub",children:b.sub})]}),b.tag&&(0,d.jsx)("span",{className:"dd-opt-tag",children:b.tag}),b.value===a&&(0,d.jsx)(f.I,{name:"check",size:13})]},b.value))]})]})}},72167:(a,b,c)=>{c.d(b,{k:()=>e});var d=c(2910);let e=(0,d.createServerReference)("605ca43c0bef77a42f5e1fee476bad0478ca45b90e",d.callServer,void 0,d.findSourceMapURL,"saveAgentModel")},86036:(a,b,c)=>{c.d(b,{bv:()=>t,eH:()=>q,iw:()=>o,jM:()=>n,kq:()=>p,yS:()=>s,z6:()=>r});var d=c(6866),e=c(97603),f=c(31371),g=c(65705),h=c(1890),i=c(53993),j=c(57086),k=c(83963),l=c(65300),m=c(35745);async function n(a,b){let{workspace:c}=await (0,i.nP)();if(a===b)return;let d=Object.fromEntries((await g.db.select().from(h.agent).where((0,e.eq)(h.agent.workspaceId,c.id))).map(a=>[a.id,a])),j=b,k=new Set;for(;j;){if(j===a)return;if(k.has(j))break;k.add(j),j=d[j]?.reportsTo??null}await g.db.update(h.agent).set({reportsTo:b}).where((0,e.Uo)((0,e.eq)(h.agent.id,a),(0,e.eq)(h.agent.workspaceId,c.id))),(0,f.revalidatePath)("/org")}async function o(a,b){let{workspace:c}=await (0,i.nP)();if(a===b)return;let d=Object.fromEntries((await g.db.select().from(h.agent).where((0,e.eq)(h.agent.workspaceId,c.id))).map(a=>[a.handle,a])),j=d[a];if(!j||null!==b&&!d[b])return;let k=b,l=new Set;for(;k;){if(k===a)return;if(l.has(k))break;l.add(k),k=d[k]?.reportsTo??null}await g.db.update(h.agent).set({reportsTo:b}).where((0,e.Uo)((0,e.eq)(h.agent.id,j.id),(0,e.eq)(h.agent.workspaceId,c.id))),(0,f.revalidatePath)("/org")}async function p(a,b){let{org:c,workspace:d}=await (0,i.nP)(),[n]=await g.db.select().from(h.agent).where((0,e.Uo)((0,e.eq)(h.agent.id,a),(0,e.eq)(h.agent.workspaceId,d.id)));if(!n)return;await g.db.update(h.agent).set({...void 0!==b.adapter?{adapter:b.adapter}:{},...void 0!==b.model?{model:b.model}:{},...void 0!==b.temperature?{temperature:b.temperature}:{},...void 0!==b.dailyCapUsd?{dailyCapUsd:b.dailyCapUsd}:{},...void 0!==b.tierFloor?{tierFloor:b.tierFloor}:{}}).where((0,e.eq)(h.agent.id,a));let o=`.claude/agents/${n.handle}/Agent.md`,p=(0,j.sL)(c.id,o);p&&(void 0!==b.adapter&&(p=(0,l.tT)(p,"provider",b.adapter)),void 0!==b.model&&(p=(0,l.tT)(p,"model",b.model)),void 0!==b.temperature&&(p=(0,l.tT)(p,"temperature",b.temperature),p=(0,l.c4)(p,"Behavior",(0,m.T)(b.temperature))),void 0!==b.dailyCapUsd&&(p=(0,l.tT)(p,"dailyCapUsd",b.dailyCapUsd)),void 0!==b.tierFloor&&(p=(0,l.tT)(p,"tierFloor",b.tierFloor)),await (0,k.g)(c.id,o,p)),(0,f.revalidatePath)("/agents/[handle]","page")}async function q(a,b){let{org:c,workspace:d}=await (0,i.nP)(),[k]=await g.db.select().from(h.agent).where((0,e.Uo)((0,e.eq)(h.agent.id,a),(0,e.eq)(h.agent.workspaceId,d.id)));if(k){if(k.image&&k.image.startsWith("uploads/")&&k.image!==b)try{(0,j.EX)(c.id,k.image.split("/").slice(0,2).join("/"))}catch{}await g.db.update(h.agent).set({image:b??null}).where((0,e.eq)(h.agent.id,a)),(0,f.revalidatePath)("/agents/[handle]","page"),(0,f.revalidatePath)("/","layout")}}async function r(a,b){let{org:c,workspace:d}=await (0,i.nP)(),[m]=await g.db.select().from(h.agent).where((0,e.Uo)((0,e.eq)(h.agent.id,a),(0,e.eq)(h.agent.workspaceId,d.id)));if(!m)return;await g.db.update(h.agent).set({persona:b}).where((0,e.eq)(h.agent.id,a));let n=`.claude/agents/${m.handle}/Agent.md`,o=(0,j.sL)(c.id,n);o?(o=(0,l.a$)(o,"Identity",b.identity),o=(0,l.a$)(o,"Ritual",b.ritual),o=(0,l.c4)(o,"System prompt",b.systemPrompt)):o=`---
9
+ handle: ${m.handle}
10
+ name: ${m.name}
11
+ role: ${m.role}
12
+ ---
13
+ # ${m.name} — ${m.role}
14
+
15
+ **Identity:** ${b.identity}
16
+
17
+ **Ritual:** ${b.ritual}
18
+
19
+ ## System prompt
20
+ ${b.systemPrompt}
21
+ `,await (0,k.g)(c.id,n,o),(0,f.revalidatePath)("/agents/[handle]","page")}async function s(a,b,c){let{workspace:d}=await (0,i.nP)();await g.db.update(h.agent).set({orgX:Math.round(b),orgY:Math.round(c)}).where((0,e.Uo)((0,e.eq)(h.agent.handle,a),(0,e.eq)(h.agent.workspaceId,d.id)))}async function t(a,b){let{workspace:c}=await (0,i.nP)(),[d]=await g.db.select().from(h.agent).where((0,e.Uo)((0,e.eq)(h.agent.id,a),(0,e.eq)(h.agent.workspaceId,c.id)));d&&(await g.db.update(h.agent).set({rag:b}).where((0,e.eq)(h.agent.id,a)),(0,f.revalidatePath)("/agents/[handle]","page"))}(0,c(74252).D)([n,o,p,q,r,s,t]),(0,d.A)(n,"603d3b3f71d2dc504d36087af78a58c48abbaf19a8",null),(0,d.A)(o,"600d260de15729632d71707ed51e55a2e12884844f",null),(0,d.A)(p,"605ca43c0bef77a42f5e1fee476bad0478ca45b90e",null),(0,d.A)(q,"609f08c865b80f43e61772b8141134edf53177a2a5",null),(0,d.A)(r,"60c6fb772eba8a3705aa019f120ca7623d29429e3b",null),(0,d.A)(s,"70e54c006a264f594d594ab5d1fea8206ac2cf27c8",null),(0,d.A)(t,"60b4349818d80fc676c780e9786c7a7b66d518a949",null)},90947:(a,b,c)=>{c.d(b,{E:()=>e});var d=c(2910);let e=(0,d.createServerReference)("409ff004d8d4df25bdce5af6d94dd7d215787a3304",d.callServer,void 0,d.findSourceMapURL,"listProviderModels")},96214:(a,b,c)=>{c.d(b,{aO:()=>H,AO:()=>M,EC:()=>O,uR:()=>L,Po:()=>J,iw:()=>P,xf:()=>Q,x1:()=>I,WU:()=>N});var d=c(6866),e=c(77598),f=c(97603),g=c(31371),h=c(65705),i=c(1890),j=c(53993),k=c(38926),l=c(29803),m=c(70149);async function n(a,b,c=12e3){let d=new AbortController,e=setTimeout(()=>d.abort(),c);try{let c,e=await fetch(a,{headers:b,signal:d.signal}),f=await e.text();try{c=JSON.parse(f)}catch{c=void 0}return{ok:e.ok,status:e.status,json:c,error:e.ok?void 0:f.slice(0,200)||e.statusText}}catch(a){return{ok:!1,status:0,error:a instanceof Error?a.message:String(a)}}finally{clearTimeout(e)}}function o(a){return a&&"object"==typeof a?Array.isArray(a.data)?a.data.length:Array.isArray(a.models)?a.models.length:0:0}async function p(a,b){let c=a.defaultAdapter;if(c.startsWith("cli_")){let a=(0,m.hW)(c);return await (0,m.$g)(a)?{ok:!0,count:(m.w5[c]??m.w5.cli_claude_code).length}:{ok:!1,count:0,error:`${a} CLI not found on PATH`}}if("local_ollama"===c||"ollama"===a.id||"ollama_openai"===a.id){let b=a.baseUrl||"http://127.0.0.1:11434",c=await n(b.replace(/\/$/,"")+"/api/tags",{});return c.ok?{ok:!0,count:o(c.json)}:{ok:!1,count:0,error:c.error||"Ollama not reachable at "+b}}if("local_runtime"===a.category){let c=a.baseUrl||"http://127.0.0.1:8080",d=await n(c.replace(/\/$/,"")+"/v1/models",b?{Authorization:"Bearer "+b}:{});return d.ok?{ok:!0,count:o(d.json)}:{ok:!1,count:0,error:d.error||"local runtime not reachable"}}if(!b)return{ok:!1,count:0,error:"no API key in vault — connect with a key first"};if("http_anthropic"===c||"anthropic"===a.id){let a=await n("https://api.anthropic.com/v1/models",{"x-api-key":b,"anthropic-version":"2023-06-01"});return a.ok?{ok:!0,count:o(a.json)}:{ok:!1,count:0,error:a.error||"auth failed ("+a.status+")"}}let d=(a.baseUrl||"https://api.openai.com/v1").replace(/\/$/,""),e=d.endsWith("/models")?d:d+(d.includes("/v1")?"/models":"/v1/models"),f=await n(e,{Authorization:"Bearer "+b});return f.ok?{ok:!0,count:o(f.json)}:{ok:!1,count:0,error:f.error||"auth failed ("+f.status+")"}}var q=c(73024),r=c(76760),s=c(57086);let t={anthropic:"anthropic",openai:"openai",google_gemini:"google",xai_grok:"xai",deepseek:"deepseek",cohere:"cohere",groq:"groq",nvidia_nim:"nvidia",together:"togetherai",fireworks:"fireworks-ai",cerebras:"cerebras",perplexity:"perplexity",openrouter:"openrouter",mistral:"mistral",moonshot:"moonshotai",dashscope:"alibaba",zhipu:"zhipuai",azure_openai:"azure",aws_bedrock:"amazon-bedrock",vertex_ai:"google-vertex",claude_code:"anthropic",gemini_cli:"google",codex_cli:"openai"};function u(a){return t[a]?t[a]:a.replace(/_(grok|gemini|nim|cli|openai|api|server|rt)$/g,"").replace(/_/g,"-")}let v={anthropic:["sonnet-4","sonnet","opus-4","opus"],openai:["gpt-5.2","gpt-5.1","gpt-5","gpt-4.1","o4"],google:["gemini-3-pro","gemini-3","gemini-2.5-pro","pro"],xai:["grok-4","grok-3","grok"],groq:["llama-4","llama-3.3","llama-3.1"],deepseek:["deepseek-chat","deepseek-v3","deepseek-reasoner"],mistral:["mistral-large","mistral-medium"],openrouter:["claude-sonnet","gpt-5","gemini"]},w=(a,b,c,d,e,f,g,h)=>({id:a,name:b,context:c,outputLimit:d,inputCost:e,outputCost:f,caps:{reasoning:!!g.reasoning,tools:!!g.tools,vision:!!g.vision},released:h}),x={anthropic:[w("claude-opus-4-8","Claude Opus 4.8",1e6,64e3,5,25,{reasoning:!0,tools:!0,vision:!0},"2026-02-01"),w("claude-opus-4-7","Claude Opus 4.7",1e6,64e3,5,25,{reasoning:!0,tools:!0,vision:!0},"2025-12-01"),w("claude-sonnet-4-6","Claude Sonnet 4.6",1e6,64e3,3,15,{reasoning:!0,tools:!0,vision:!0},"2026-01-15"),w("claude-haiku-4-5","Claude Haiku 4.5",2e5,32e3,1,5,{tools:!0,vision:!0},"2025-10-01")],openai:[w("gpt-5.2","GPT-5.2",4e5,128e3,1.25,10,{reasoning:!0,tools:!0,vision:!0},"2026-03-01"),w("gpt-5.1","GPT-5.1",4e5,128e3,1.25,10,{reasoning:!0,tools:!0,vision:!0},"2025-12-01"),w("gpt-5","GPT-5",4e5,128e3,1.25,10,{reasoning:!0,tools:!0,vision:!0},"2025-08-01"),w("o4-mini","o4-mini",2e5,1e5,1.1,4.4,{reasoning:!0,tools:!0},"2025-04-01")],google:[w("gemini-3-pro","Gemini 3 Pro",2e6,64e3,2,12,{reasoning:!0,tools:!0,vision:!0},"2026-02-01"),w("gemini-3-flash","Gemini 3 Flash",1e6,64e3,.3,2.5,{tools:!0,vision:!0},"2026-02-01"),w("gemini-2.5-pro","Gemini 2.5 Pro",2e6,64e3,1.25,10,{reasoning:!0,tools:!0,vision:!0},"2025-06-01")],xai:[w("grok-4.3","Grok 4.3",256e3,64e3,3,15,{reasoning:!0,tools:!0,vision:!0},"2026-02-01"),w("grok-4","Grok 4",256e3,64e3,3,15,{reasoning:!0,tools:!0,vision:!0},"2025-09-01"),w("grok-3","Grok 3",131072,32e3,3,15,{tools:!0,vision:!0},"2025-02-01")],deepseek:[w("deepseek-chat","DeepSeek Chat",128e3,8e3,.27,1.1,{tools:!0},"2025-12-01"),w("deepseek-reasoner","DeepSeek Reasoner",128e3,64e3,.55,2.19,{reasoning:!0,tools:!0},"2025-12-01")],groq:[w("llama-4-scout","Llama 4 Scout",131072,8e3,.11,.34,{tools:!0,vision:!0},"2025-04-01"),w("llama-3.3-70b","Llama 3.3 70B",131072,32e3,.59,.79,{tools:!0},"2024-12-01")]},y=null;function z(){return(0,r.join)((0,s.r$)(),"cache","models-dev.json")}async function A(){try{let a=await fetch("https://models.dev/api.json",{signal:AbortSignal.timeout(1e4),headers:{accept:"application/json"}});if(!a.ok)return null;let b=await a.json();if(!b||"object"!=typeof b)return null;let c={};for(let[a,d]of Object.entries(b)){let b=d?.models,e=function(a){if(!a||"object"!=typeof a)return[];let b=[];for(let[c,d]of Object.entries(a)){let a=d??{},e=String(a.id??c),f=e.includes("/")?e.split("/").pop():e;if(!f)continue;let g=a.modalities??{},h=Array.isArray(g.input)?g.input:[],i=a.limit??{},j=a.cost??{},k={reasoning:!0===a.reasoning,tools:!0===a.tool_call,vision:!0===a.attachment||h.includes("image")};b.push({id:f,name:String(a.name??f),context:Number(i.context??0)||0,outputLimit:Number(i.output??0)||0,inputCost:Number(j.input??0)||0,outputCost:Number(j.output??0)||0,caps:k,released:"string"==typeof a.release_date?a.release_date:""})}return b}(b);e.length&&(c[a]=e)}return Object.keys(c).length?c:null}catch{return null}}async function B(){if(y&&Date.now()-y.at<864e5)return y.data;let a=function(){try{let a=z();if(!(0,q.existsSync)(a))return null;let b=JSON.parse((0,q.readFileSync)(a,"utf8"));if(!b?.data||"object"!=typeof b.data)return null;return{at:Number(b.at??(0,q.statSync)(a).mtimeMs),data:b.data}}catch{return null}}();if(a&&Date.now()-a.at<864e5)return y=a,a.data;let b=await A();if(b){y={at:Date.now(),data:b};try{(0,q.mkdirSync)((0,r.join)((0,s.r$)(),"cache"),{recursive:!0}),(0,q.writeFileSync)(z(),JSON.stringify({at:Date.now(),data:b}),"utf8")}catch{}return b}return a?(y=a,a.data):{}}async function C(a){let b=u(a),c=await B();return c[b]?.length?c[b]:x[b]??[]}async function D(a,b,c=9e3){try{let d=await fetch(a,{headers:b,signal:AbortSignal.timeout(c)});if(!d.ok)return null;return await d.json()}catch{return null}}async function E(a){let{catalogId:b,adapter:c,baseUrl:d,apiKey:e}=a;if(c.startsWith("cli_"))return"cli_opencode"===c?(await (0,m.ZB)("opencode")).map(a=>({id:a})):"cli_aider"===c?(await (0,m.ZB)("aider")).map(a=>({id:a})):null;if(/ollama/i.test(b)||c.includes("ollama")){let a=(d||"http://127.0.0.1:11434").replace(/\/$/,"").replace(/\/v1$/,""),b=await D(`${a}/api/tags`,{});return b?(b.models??[]).map(a=>({id:String(a.name??"")})).filter(a=>a.id):[]}if(!d)return null;let f=d.replace(/\/$/,""),g="http_anthropic"===c||"anthropic"===b,h=g?"https://api.anthropic.com/v1/models":f.endsWith("/models")?f:f+(f.includes("/v1")?"/models":"/v1/models"),i=g?e?{"x-api-key":e,"anthropic-version":"2023-06-01"}:{}:e?{authorization:`Bearer ${e}`}:{},j=await D(h,i);return j?(Array.isArray(j.data)?j.data:Array.isArray(j.models)?j.models:[]).map(a=>{let b=String(a.id??a.name??"");if(!b)return null;let c={id:b};"string"==typeof a.display_name?c.name=a.display_name:"string"==typeof a.name&&(c.name=a.name),"number"==typeof a.context_length&&(c.context=a.context_length);let d=a.pricing;if(d){let a=Number(d.prompt),b=Number(d.completion);Number.isFinite(a)&&a>0&&(c.inputCost=1e6*a),Number.isFinite(b)&&b>0&&(c.outputCost=1e6*b)}return c}).filter(a=>!!a).slice(0,200):[]}async function F(){let a=await B(),b=new Map;for(let c of Object.values(a))for(let a of c){let c=a.id.toLowerCase();b.has(c)||b.set(c,a)}return b}async function G(a,b){let c=await C(a);if(!b||0===b.length)return c;let d=new Map;for(let a of c)d.set(a.id.toLowerCase(),a);let e=await F(),f=a=>{let b=a.toLowerCase(),c=a.includes("/")?a.split("/").pop().toLowerCase():b;return d.get(b)??d.get(c)??e.get(b)??e.get(c)},g=[];for(let a of b){let b=f(a.id);g.push({id:a.id,name:a.name||b?.name||a.id,context:a.context??b?.context??0,outputLimit:b?.outputLimit??0,inputCost:a.inputCost??b?.inputCost??0,outputCost:a.outputCost??b?.outputCost??0,caps:b?.caps??{reasoning:!1,tools:!1,vision:!1},released:b?.released??""})}return g}async function H(a,b){let{workspace:c}=await (0,j.nP)(),d=(0,l.kH)(a);if(!d)return;let f=(0,e.randomUUID)();await h.db.insert(i.provider).values({id:f,workspaceId:c.id,catalogId:a,adapter:d.defaultAdapter,kind:"cli"===d.category?"cli":"local_runtime"===d.category?"local":"cloud",auth:d.connectionTypes.includes("api_key")?"api_key":d.connectionTypes[0],status:"needs_sync",syncStatus:d.supportsModelSync?"implemented":"manual"}),b&&await (0,k.IW)(c.id,`${a}_api_key`,b,f),(0,g.revalidatePath)("/models"),await I(f)}async function I(a){let b,{workspace:c}=await (0,j.nP)(),[d]=await h.db.select().from(i.provider).where((0,f.Uo)((0,f.eq)(i.provider.id,a),(0,f.eq)(i.provider.workspaceId,c.id)));if(!d)return{ok:!1,error:"not found"};let e=(0,l.kH)(d.catalogId);if(!e)return{ok:!1,error:"unknown provider"};let n=await (0,k.r6)(c.id,`${d.catalogId}_api_key`),o=await p(e,n),q=null;if("cli"===e.category){let a=(0,m.hW)(e.defaultAdapter);b=(q=await (0,m.$g)(a).catch(()=>null))?await (0,m.Kp)(a).catch(()=>"unknown"):"needs_login"}else b="local_runtime"===e.category?o.ok?"ready":"unknown":n&&o.ok?"ready":"needs_key";return await h.db.update(i.provider).set({status:o.ok?"connected":"error",modelCount:o.count,lastSync:new Date,cliVersion:q,authState:b}).where((0,f.eq)(i.provider.id,a)),o.ok&&await J(a).catch(()=>{}),(0,g.revalidatePath)("/models"),o}async function J(a){let{workspace:b}=await (0,j.nP)(),[c]=await h.db.select().from(i.provider).where((0,f.Uo)((0,f.eq)(i.provider.id,a),(0,f.eq)(i.provider.workspaceId,b.id)));if(!c)return{ok:!1,count:0,error:"not found"};let d=await K(c);return(0,g.revalidatePath)("/models"),d}async function K(a){let b,c,d,g=(0,l.kH)(a.catalogId);if(!g)return{ok:!1,count:0,error:"unknown provider"};let j=await (0,k.r6)(a.workspaceId,`${a.catalogId}_api_key`),n="cli"===g.category;try{b=await E({catalogId:a.catalogId,adapter:a.adapter,baseUrl:g.baseUrl,apiKey:j})}catch{b=null}if(n){let e=(0,m.hW)(a.adapter);d=(c=await (0,m.$g)(e).catch(()=>null))?await (0,m.Kp)(e).catch(()=>"unknown"):"needs_login",null===b&&(b=(m.w5[a.adapter]??[]).filter(a=>"(default)"!==a).map(a=>({id:a})))}if(null===b)return{ok:!0,count:0};let o=await G(a.catalogId,b),p=new Date,q=o.length?function(a,b){if(!b.length)return"";let c=v[u(a)];if(c)for(let a of c){let c=b.filter(b=>b.id.toLowerCase().includes(a));if(c.length)return c.sort((a,b)=>(b.released||"").localeCompare(a.released||"")),c[0].id}let d=b.filter(a=>a.released);return d.length?(d.sort((a,b)=>b.released.localeCompare(a.released)),d[0].id):b[0].id}(a.catalogId,o):null;if(o.length)await h.db.delete(i.providerModel).where((0,f.eq)(i.providerModel.providerId,a.id)),await h.db.insert(i.providerModel).values(o.map(b=>({id:(0,e.randomUUID)(),workspaceId:a.workspaceId,providerId:a.id,catalogId:a.catalogId,modelId:b.id,name:b.name,context:b.context,outputLimit:b.outputLimit,inputCost:b.inputCost,outputCost:b.outputCost,caps:b.caps,released:b.released,isDefault:b.id===q,lastSeen:p})));else if(!n)return{ok:!1,count:0,error:"no models returned"};let r=n&&!c?"needs_sync":"connected";return await h.db.update(i.provider).set({status:r,modelCount:o.length||(n?a.modelCount:0),lastSync:p,defaultModel:q||a.defaultModel,...n?{cliVersion:c??null,authState:d??null}:{}}).where((0,f.eq)(i.provider.id,a.id)),{ok:!0,count:o.length}}async function L(a=12){let b,c=new Date(Date.now()-60*a*6e4);try{b=await h.db.select().from(i.provider).where((0,f.Uo)((0,f.eq)(i.provider.status,"connected"),(0,f.or)((0,f.kZ)(i.provider.lastSync),(0,f.lt)(i.provider.lastSync,c))))}catch{return{refreshed:0}}let d=0;for(let a of b.slice(0,50))try{let b=await K(a);b.ok&&b.count>0&&d++}catch{}return{refreshed:d}}async function M(a){let{workspace:b}=await (0,j.nP)(),c=(await h.db.select().from(i.providerModel).where((0,f.Uo)((0,f.eq)(i.providerModel.providerId,a),(0,f.eq)(i.providerModel.workspaceId,b.id)))).map(a=>({id:a.modelId,name:a.name,context:a.context,outputLimit:a.outputLimit,inputCost:a.inputCost,outputCost:a.outputCost,caps:a.caps??{reasoning:!1,tools:!1,vision:!1},released:a.released,isDefault:a.isDefault}));return c.sort((a,b)=>Number(b.isDefault)-Number(a.isDefault)||(b.released||"").localeCompare(a.released||"")||a.name.localeCompare(b.name)),{models:c}}async function N(a){let{workspace:b}=await (0,j.nP)(),[c]=await h.db.select().from(i.provider).where((0,f.Uo)((0,f.eq)(i.provider.id,a),(0,f.eq)(i.provider.workspaceId,b.id)));if(!c)return{ok:!1,error:"not found"};let d=(0,l.kH)(c.catalogId);if(!d)return{ok:!1,error:"unknown provider"};let e=await (0,k.r6)(b.id,`${c.catalogId}_api_key`),m=await p(d,e);return await h.db.update(i.provider).set({status:m.ok?"connected":"error"}).where((0,f.eq)(i.provider.id,a)),(0,g.revalidatePath)("/models"),{ok:m.ok,error:m.error}}async function O(a){let{workspace:b}=await (0,j.nP)(),[c]=await h.db.select().from(i.provider).where((0,f.Uo)((0,f.eq)(i.provider.id,a),(0,f.eq)(i.provider.workspaceId,b.id)));if(!c)return{models:[],error:"not found"};let d=(0,l.kH)(c.catalogId);if(!d?.baseUrl)return{models:[],error:"no public endpoint for this provider"};let e=await (0,k.r6)(b.id,`${c.catalogId}_api_key`),g=d.baseUrl.replace(/\/$/,"");try{let a=/ollama/i.test(c.catalogId)||c.adapter.includes("ollama")?`${g.replace(/\/v1$/,"")}/api/tags`:`${g}/models`,b=await fetch(a,{headers:e?{authorization:`Bearer ${e}`}:{},signal:AbortSignal.timeout(8e3)});if(!b.ok)return{models:[],error:`endpoint ${b.status}`};let d=await b.json();return{models:(d.data??d.models??[]).map(a=>a.id??a.name??"").filter(Boolean).slice(0,80)}}catch(b){let a=String(b instanceof Error?b.message:b);return{models:[],error:/abort|fetch failed|ECONN/i.test(a)?"endpoint unreachable":a}}}async function P(a){let{workspace:b}=await (0,j.nP)(),[c]=await h.db.select().from(i.provider).where((0,f.Uo)((0,f.eq)(i.provider.id,a),(0,f.eq)(i.provider.workspaceId,b.id)));c&&await (0,k.Kh)(b.id,`${c.catalogId}_api_key`),await h.db.delete(i.provider).where((0,f.Uo)((0,f.eq)(i.provider.id,a),(0,f.eq)(i.provider.workspaceId,b.id))),(0,g.revalidatePath)("/models")}async function Q(a){let{workspace:b}=await (0,j.nP)(),[c]=await h.db.select().from(i.provider).where((0,f.Uo)((0,f.eq)(i.provider.id,a),(0,f.eq)(i.provider.workspaceId,b.id)));c&&(await (0,k.Kh)(b.id,`${c.catalogId}_api_key`),await h.db.update(i.provider).set({auth:"none",status:"needs_sync",modelCount:0}).where((0,f.eq)(i.provider.id,a)),(0,g.revalidatePath)("/models"))}(0,c(74252).D)([H,I,J,L,M,N,O,P,Q]),(0,d.A)(H,"60f96bab69a09e9fcf636f80db1eff87d3be983a60",null),(0,d.A)(I,"4005f3f9461c2e6b2fecdac81c822e2481fbdbaec1",null),(0,d.A)(J,"408898da73d5e0af066104c62997b817201c0a99cf",null),(0,d.A)(L,"40897071ec7c50dcab7572d01ec05ab9ed5da6d715",null),(0,d.A)(M,"403a1916644d7877e6f55e5ed65de73f9157ca3977",null),(0,d.A)(N,"40c4cc3f2d97110b2d69610739ee46dbe5a2a37d85",null),(0,d.A)(O,"409ff004d8d4df25bdce5af6d94dd7d215787a3304",null),(0,d.A)(P,"4004673068530656edd28ca2b130a1096f274e2cde",null),(0,d.A)(Q,"403c1d8c05fcc53bd28044c5b835d4b402564a964f",null)}};
@@ -0,0 +1 @@
1
+ "use strict";exports.id=1765,exports.ids=[1765,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})]})}},18353:(a,b,c)=>{c.d(b,{R:()=>e});var d=c(2910);let e=(0,d.createServerReference)("0079cfdfcc71b9a8c092b9085a9c8b72014bcbb6c5",d.callServer,void 0,d.findSourceMapURL,"startDevServerAction")},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})}},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,"40aca5e636733f4a71e30c5ee0da0e058892463f10",null),(0,d.A)(y,"40c4dec4c26a6ed0bdf72098c743c4c2cb18ed1cd1",null),(0,d.A)(z,"00f52218f5d83e696e1dc0d0c5d065efe7965bf187",null),(0,d.A)(A,"00a23e99d4e912da3ad1b266a22b1a141df6bc8b94",null),(0,d.A)(B,"001e9ef8a66d3ec2113043b24ab8849578169f7b7f",null)},56876:(a,b,c)=>{c.d(b,{K:()=>e});var d=c(2910);let e=(0,d.createServerReference)("40da21c6bbeaa4552b49716a8dfbcac208ccbc19de",d.callServer,void 0,d.findSourceMapURL,"previewFrameableAction")},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,"0079cfdfcc71b9a8c092b9085a9c8b72014bcbb6c5",null),(0,d.A)(m,"0071c0c415606f75d34057f5c94bb4efe577d2ff0e",null),(0,d.A)(n,"007933fd75e660ac66ed736e9d6d0b69644af4a43b",null),(0,d.A)(o,"00fdada6be1a38a8708164669874820b7975ce5b2c",null),(0,d.A)(p,"00d65e45cb695349c22d8299d0a6c214595d78ddcb",null),(0,d.A)(q,"40da21c6bbeaa4552b49716a8dfbcac208ccbc19de",null),(0,d.A)(r,"4080c10817259174f4ef74779a7c337a16132a5c36",null),(0,d.A)(s,"600c3699d037bfd629bc403bae98c8f0c0032d3ade",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)}},76044:(a,b,c)=>{c.d(b,{j:()=>e});var d=c(2910);let e=(0,d.createServerReference)("007933fd75e660ac66ed736e9d6d0b69644af4a43b",d.callServer,void 0,d.findSourceMapURL,"devServerStatusAction")},94954:(a,b,c)=>{c.r(b),c.d(b,{"008bd27139e00f9f5be3394c6584b5c1e0fae6947f":()=>d.cT,"00feed4d6ebbd8cdf6c7a8f96aad93c3301737f1ff":()=>d.Kd,"400e7da147986a1242edea165fb0c92593e589674c":()=>d.OD,"40de90f6895a7d0c2b8a88e0680804e983f69fc7a0":()=>d.j0});var d=c(14565)}};
@@ -0,0 +1 @@
1
+ "use strict";exports.id=2495,exports.ids=[2495],exports.modules={5012:(a,b,c)=>{c.d(b,{P:()=>e});var d=c(2910);let e=(0,d.createServerReference)("00d707af504f1a0491ca9dcf763ef015da594b49f3",d.callServer,void 0,d.findSourceMapURL,"approvePlan")},25130:(a,b,c)=>{c.d(b,{J:()=>e});var d=c(2910);let e=(0,d.createServerReference)("40e8f30a047d0f241003dcbb3194b872639e110c96",d.callServer,void 0,d.findSourceMapURL,"rejectSpec")},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")},29304:(a,b,c)=>{c.d(b,{B:()=>e});var d=c(2910);let e=(0,d.createServerReference)("40ced2f71e662e1884c830a2cb80626a57aa8be42c",d.callServer,void 0,d.findSourceMapURL,"approveSpec")},58096:(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)("40a8b5e4223fa4e2f64798e3c4f10e2052d74263a0",j.callServer,void 0,j.findSourceMapURL,"generatePlan"),l=(0,j.createServerReference)("0089bb3aeea0ab3018bc9c6c3d254bc32927017ade",j.callServer,void 0,j.findSourceMapURL,"requestPlanChanges");var m=c(5012),n=c(29304),o=c(25130),p=c(88888),q=c(81160);let r=(0,j.createServerReference)("4038b15099bf2fe9a8f44cea08bfedf104a01c187e",j.callServer,void 0,j.findSourceMapURL,"setAuto247"),s=(0,j.createServerReference)("000d2475a828032e63b1cbb99501b270d46c86c4d9",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}})]})}},73134:(a,b,c)=>{c.d(b,{AgentRunLive:()=>j});var d=c(4374),e=c(74679),f=c(47104),g=c(43526);c(67520);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))})]})]})}},81160:(a,b,c)=>{c.d(b,{d:()=>e});var d=c(2910);let e=(0,d.createServerReference)("40beac2559eab1128341c145e31826c3b57f094595",d.callServer,void 0,d.findSourceMapURL,"rejectIssue")},88888:(a,b,c)=>{c.d(b,{t:()=>e});var d=c(2910);let e=(0,d.createServerReference)("4023169ed85000187a7267198eab5e95902c9af1b9",d.callServer,void 0,d.findSourceMapURL,"approveIssue")},94954:(a,b,c)=>{c.r(b),c.d(b,{"008bd27139e00f9f5be3394c6584b5c1e0fae6947f":()=>d.cT,"00feed4d6ebbd8cdf6c7a8f96aad93c3301737f1ff":()=>d.Kd,"400e7da147986a1242edea165fb0c92593e589674c":()=>d.OD,"40de90f6895a7d0c2b8a88e0680804e983f69fc7a0":()=>d.j0});var d=c(14565)}};
@@ -1 +1 @@
1
- "use strict";exports.id=2517,exports.ids=[2517],exports.modules={11185:(a,b,c)=>{c.d(b,{Y:()=>h,r:()=>g});var d=c(73024),e=c(76760),f=c(28430);let g="constellai";function h(){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"}},22517:(a,b,c)=>{c.d(b,{checkForUpdate:()=>i});var d=c(11185);let e=null,f=a=>a.replace(/^v/,"").split("-")[0].split(".").map(a=>parseInt(a,10)||0);async function g(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 h(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 i(a=!1){let b,c,j=(0,d.Y)(),k=`npm install -g ${d.r}@latest`;if(!a&&e&&Date.now()-e.at<216e5)return e.info;let l=await g(`https://registry.npmjs.org/${d.r}/latest`),m=l?.version??null,n=!!m&&function(a,b){let c=f(a),d=f(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}(m,j),o=null;if(n&&m){let a=await h("https://raw.githubusercontent.com/gabriel7silva/constella/main/CHANGELOG.md");o=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,m):null}let p={current:j,latest:m,updateAvailable:n,type:m?(b=f(m),c=f(j),b[0]>c[0]?"major":b[1]>c[1]?"minor":b[2]>c[2]?"patch":null):null,command:k,changelog:o};return e={at:Date.now(),info:p},p}}};
1
+ "use strict";exports.id=2517,exports.ids=[2517],exports.modules={11185:(a,b,c)=>{c.d(b,{Y:()=>h,r:()=>g});var d=c(73024),e=c(76760),f=c(28430);let g="constellai";function h(){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"}},22517:(a,b,c)=>{c.d(b,{checkForUpdate:()=>j});var d=c(11185);let e=null,f=a=>a.replace(/^v/,"").split("-")[0].split(".").map(a=>parseInt(a,10)||0),g=a=>a.replace(/^v/,"").split("-")[1]??"";async function h(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 i(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 j(a=!1){let b,c,k=(0,d.Y)(),l=`npm install -g ${d.r}@latest`;if(!a&&e&&Date.now()-e.at<216e5)return e.info;let m=await h(`https://registry.npmjs.org/${d.r}/latest`),n=m?.version??null,o=!!n&&function(a,b){let c=f(a),d=f(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!g(a)&&!!g(b)}(n,k),p=null;if(o&&n){let a=await i("https://raw.githubusercontent.com/gabriel7silva/constella/main/CHANGELOG.md");p=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,n):null}let q={current:k,latest:n,updateAvailable:o,type:n?(b=f(n),c=f(k),b[0]>c[0]?"major":b[1]>c[1]?"minor":b[2]>c[2]||!g(n)&&g(k)?"patch":null):null,command:l,changelog:p};return e={at:Date.now(),info:q},q}}};
@@ -1,4 +1,4 @@
1
- "use strict";exports.id=259,exports.ids=[259],exports.modules={90259:(a,b,c)=>{c.d(b,{Hg:()=>aj,a7:()=>ak,sy:()=>am,is:()=>I,fM:()=>J,Sy:()=>H,e9:()=>ap,EQ:()=>an,NM:()=>al,$_:()=>ab,qw:()=>T,DX:()=>W,ME:()=>F,oS:()=>K,RS:()=>L,R6:()=>ai,wP:()=>X,Ni:()=>_,gn:()=>ac,yL:()=>ae,NW:()=>Q,lj:()=>Z,fb:()=>ah,pG:()=>af,I_:()=>M,Fo:()=>N,o3:()=>O,a4:()=>ag,ft:()=>aa,Tu:()=>V,h_:()=>G,PO:()=>U});var d=c(6866),e=c(77598),f=c(97603),g=c(95357),h=c(31371),i=c(65705),j=c(1890),k=c(53993),l=c(70149),m=c(79505),n=c(36482),o=c(33644),p=c(57086),q=c(84903),r=c(24701);let s=!1;function t(){s||(s=!0,i.F.exec(`
1
+ "use strict";exports.id=259,exports.ids=[259],exports.modules={90259:(a,b,c)=>{c.d(b,{Hg:()=>ak,a7:()=>al,sy:()=>an,is:()=>I,fM:()=>J,Sy:()=>H,e9:()=>aq,EQ:()=>ao,NM:()=>am,$_:()=>ac,qw:()=>U,DX:()=>X,ME:()=>F,oS:()=>K,RS:()=>L,R6:()=>aj,wP:()=>Y,Ni:()=>aa,gn:()=>ad,yL:()=>af,NW:()=>R,lj:()=>$,fb:()=>ai,pG:()=>ag,I_:()=>M,Fo:()=>O,o3:()=>P,a4:()=>ah,ft:()=>ab,Tu:()=>W,h_:()=>G,PO:()=>V});var d=c(6866),e=c(77598),f=c(97603),g=c(95357),h=c(31371),i=c(65705),j=c(1890),k=c(53993),l=c(70149),m=c(79505),n=c(36482),o=c(33644),p=c(57086),q=c(84903),r=c(24701);let s=!1;function t(){s||(s=!0,i.F.exec(`
2
2
  CREATE TABLE IF NOT EXISTS design_session (
3
3
  id TEXT PRIMARY KEY,
4
4
  workspace_id TEXT NOT NULL REFERENCES workspace(id) ON DELETE CASCADE,
@@ -67,10 +67,10 @@ BUILD METHOD — write the prototype LIVE (the operator watches the canvas paint
67
67
  • NEVER compose the whole screen in your reply or in memory and Write it once at the end — that defeats the live preview. Create the skeleton early, then edit it into shape so each write renders a new block on the canvas.`,`
68
68
  HOW TO RESPOND — decide first:
69
69
  • If the operator is only greeting, chatting, or asking a question (NO concrete screen/component/visual change requested), just reply in 1-3 sentences IN CHARACTER: greet them and offer 2-3 concrete things you can build. Do NOT search the project, read files, or write anything yet — only talk.
70
- • When they DO ask for a concrete screen, component or visual change: consult your design skills, then BUILD IT LIVE as described above (skeleton file first, then incremental edits under design-mock/screens/), TEST what you built (does it render? do the requested changes appear?), and reply with a 2-3 sentence summary of what you built, what you validated, and what's next.`].filter(Boolean).join("\n"),N=new Set,O=await (0,l.p1)(M,{orgId:q.id,binary:z,model:C,timeoutMs:6e5,agentId:v.id,agentHandle:v.handle},a=>{if("create"===a.kind||"edit"===a.kind){let b=(a.target||"").replace(/\\/g,"/"),c=b.toLowerCase().indexOf("design-mock/");c>=0&&N.add(b.slice(c))}(0,m.I)(s.id,{runId:B,channel:D,agentId:v.id,kind:a.kind,target:a.target,detail:a.detail})});(O.usd>0||O.inputTokens+O.outputTokens>0)&&await i.db.insert(j.costEntry).values({id:(0,e.randomUUID)(),workspaceId:s.id,agentId:v.id,channel:D,provider:O.binary,model:O.model??v.model,usd:O.usd,tokens:O.inputTokens+O.outputTokens,at:new Date});let P=O.ok?O.text?.trim()||"Prototype updated.":`(couldn't respond: ${(0,w.Tc)(O.error||O.text)})`;if(await i.db.insert(j.message).values({id:B,workspaceId:s.id,channel:D,fromKind:"agent",fromHandle:v.handle,text:P.slice(0,4e3),createdAt:new Date,sessionId:null}),await (0,n.f)(s.id,B,D),O.ok&&N.size)try{let a=(O.text?.trim().split("\n").find(a=>a.trim())||"Prototype iteration").slice(0,200);await ad(s.id,a,[...N])}catch{}if(O.ok&&N.size)try{let a=(0,u.zw)(q.id,s),b=a.designMockFiles.some(a=>/design-mock\/screens\/.+\.html?$/i.test(a));if(!a.approved&&b){let a=await T(q.id,s);await (0,r.I)(s.id,{kind:"design-approval",text:`Design ready to review — ${s.name}`,detail:a,agentId:v.id,tg:!0})}}catch{}(0,o.r)(s.id);try{(0,h.revalidatePath)("/design")}catch{}}catch(a){console.error("[design] askDesign run failed:",a);try{await i.db.insert(j.message).values({id:B,workspaceId:s.id,channel:D,fromKind:"agent",fromHandle:v.handle,text:`(couldn't respond: ${(0,w.Tc)(a?.message)})`.slice(0,4e3),createdAt:new Date,sessionId:null}),await (0,n.f)(s.id,B,D),(0,o.r)(s.id)}catch{}}finally{try{await i.db.update(j.agent).set({status:"idle"}).where((0,f.eq)(j.agent.id,v.id))}catch{}(0,o.r)(s.id)}})(),{ok:!0,started:!0}}async function I(a){let{org:b,workspace:c}=await (0,k.nP)();return J(b.id,c,a)}async function J(a,b,c){t();let d=(0,u.zw)(a,b),k=await E(b.id),[l]=await i.db.select({id:j.designSession.id}).from(j.designSession).where((0,f.eq)(j.designSession.workspaceId,b.id)).orderBy((0,g.i)(j.designSession.createdAt)).limit(1);l?await i.db.update(j.designSession).set({status:"approved",updatedAt:new Date}).where((0,f.eq)(j.designSession.id,l.id)):await i.db.insert(j.designSession).values({id:(0,e.randomUUID)(),workspaceId:b.id,title:`${b.name} — design`,status:"approved",tokens:{}});let m=["# Approved design — official visual reference","",`_Approved by the operator in the Design module. This is the OFFICIAL visual reference for ${b.name}: the real implementation must follow it exactly (zero drift) — same screens, layout, components, design system, tokens, states and behavior. The CEO Planner turns this into the Super Spec, specs, issues and plan._`,"",d.mission?`**Mission:** ${d.mission}`:"",d.objective?`**Objective:** ${d.objective}`:"",d.stackList?`**Stack:** ${d.stackList}`:"",c?.trim()?`
70
+ • When they DO ask for a concrete screen, component or visual change: consult your design skills, then BUILD IT LIVE as described above (skeleton file first, then incremental edits under design-mock/screens/), TEST what you built (does it render? do the requested changes appear?), and reply with a 2-3 sentence summary of what you built, what you validated, and what's next.`].filter(Boolean).join("\n"),N=new Set,O=await (0,l.p1)(M,{orgId:q.id,binary:z,model:C,timeoutMs:6e5,agentId:v.id,agentHandle:v.handle},a=>{if("create"===a.kind||"edit"===a.kind){let b=(a.target||"").replace(/\\/g,"/"),c=b.toLowerCase().indexOf("design-mock/");c>=0&&N.add(b.slice(c))}(0,m.I)(s.id,{runId:B,channel:D,agentId:v.id,kind:a.kind,target:a.target,detail:a.detail})});(O.usd>0||O.inputTokens+O.outputTokens>0)&&await i.db.insert(j.costEntry).values({id:(0,e.randomUUID)(),workspaceId:s.id,agentId:v.id,channel:D,provider:O.binary,model:O.model??v.model,usd:O.usd,tokens:O.inputTokens+O.outputTokens,at:new Date});let P=O.ok?O.text?.trim()||"Prototype updated.":`(couldn't respond: ${(0,w.Tc)(O.error||O.text)})`;if(await i.db.insert(j.message).values({id:B,workspaceId:s.id,channel:D,fromKind:"agent",fromHandle:v.handle,text:P.slice(0,4e3),createdAt:new Date,sessionId:null}),await (0,n.f)(s.id,B,D),O.ok&&N.size)try{let a=(O.text?.trim().split("\n").find(a=>a.trim())||"Prototype iteration").slice(0,200);await ae(s.id,a,[...N])}catch{}if(O.ok&&N.size)try{let a=(0,u.zw)(q.id,s),b=a.designMockFiles.some(a=>/design-mock\/screens\/.+\.html?$/i.test(a));if(!a.approved&&b){let a=await U(q.id,s);await (0,r.I)(s.id,{kind:"design-approval",text:`Design ready to review — ${s.name}`,detail:a,agentId:v.id,tg:!0})}}catch{}(0,o.r)(s.id);try{(0,h.revalidatePath)("/design")}catch{}}catch(a){console.error("[design] askDesign run failed:",a);try{await i.db.insert(j.message).values({id:B,workspaceId:s.id,channel:D,fromKind:"agent",fromHandle:v.handle,text:`(couldn't respond: ${(0,w.Tc)(a?.message)})`.slice(0,4e3),createdAt:new Date,sessionId:null}),await (0,n.f)(s.id,B,D),(0,o.r)(s.id)}catch{}}finally{try{await i.db.update(j.agent).set({status:"idle"}).where((0,f.eq)(j.agent.id,v.id))}catch{}(0,o.r)(s.id)}})(),{ok:!0,started:!0}}async function I(a){let{org:b,workspace:c}=await (0,k.nP)();return J(b.id,c,a)}async function J(a,b,c){t();let d=(0,u.zw)(a,b),k=await E(b.id),[l]=await i.db.select({id:j.designSession.id}).from(j.designSession).where((0,f.eq)(j.designSession.workspaceId,b.id)).orderBy((0,g.i)(j.designSession.createdAt)).limit(1);l?await i.db.update(j.designSession).set({status:"approved",updatedAt:new Date}).where((0,f.eq)(j.designSession.id,l.id)):await i.db.insert(j.designSession).values({id:(0,e.randomUUID)(),workspaceId:b.id,title:`${b.name} — design`,status:"approved",tokens:{}});let m=["# Approved design — official visual reference","",`_Approved by the operator in the Design module. This is the OFFICIAL visual reference for ${b.name}: the real implementation must follow it exactly (zero drift) — same screens, layout, components, design system, tokens, states and behavior. The CEO Planner turns this into the Super Spec, specs, issues and plan._`,"",d.mission?`**Mission:** ${d.mission}`:"",d.objective?`**Objective:** ${d.objective}`:"",d.stackList?`**Stack:** ${d.stackList}`:"",c?.trim()?`
71
71
  **Operator note:** ${c.trim()}`:"","","## Design files (design-mock/)",d.designMockFiles.length?d.designMockFiles.map(a=>`- ${a}`).join("\n"):"_(none yet — the frontend agent's prototype files will be listed here)_","",d.mockFiles.length?`## Source mock (mock/)
72
72
  ${d.mockFiles.map(a=>`- ${a}`).join("\n")}
73
- `:"","## Handoff","Open the CEO Planner and Generate plan — the approved design above is read as official context, so specs/issues honor it.",""].filter(Boolean).join("\n");(0,p.dx)(a,u.Oi,m),await (0,q.j)(b.id,{text:`Design approved — official visual reference for ${b.name}`,by:k?.handle??"grace",source:"design",refKey:u.Oi,rationale:(c?.trim()||`${d.designMockFiles.length} design file(s); stack: ${d.stackList||"—"}`).slice(0,1e3)}),await (0,r.I)(b.id,{kind:"done",text:"Design approved — official visual reference",detail:"The CEO Planner will turn it into the Super Spec, specs and issues.",agentId:k?.id});try{(0,h.revalidatePath)("/design"),(0,h.revalidatePath)("/planner")}catch{}return{ok:!0}}async function K(){let{org:a,workspace:b}=await (0,k.nP)();return L(a.id,b)}async function L(a,b){let c=await J(a,b);if(!c.ok)return c;let d=(0,u.Iz)(a);(0,u.H5)(a,{skip:!1,brief:d.brief,goalTitle:d.goalTitle,handoffAt:Date.now()});let e=d.brief?.trim()?{brief:d.brief.trim(),goalTitle:d.goalTitle}:void 0;return await R(a,b,e),{ok:!0}}async function M(){let{org:a,workspace:b}=await (0,k.nP)();return N(a.id,b)}async function N(a,b){let c=(0,u.Iz)(a);if(!c.handoffAt)return{ok:!0};let d=await E(b.id);if(d?.status==="working")return{ok:!0};(0,u.H5)(a,{skip:!1,brief:c.brief,goalTitle:c.goalTitle,handoffAt:Date.now()});let e=c.brief?.trim()?{brief:c.brief.trim(),goalTitle:c.goalTitle}:void 0;return await R(a,b,e),{ok:!0}}async function O(){let a=0;try{for(let b of(await i.db.select().from(j.workspace)))if((0,u.Iz)(b.orgId).handoffAt)try{await N(b.orgId,b),a++}catch(a){console.error("[design] resume handoff failed:",b.id,a)}}catch(a){console.error("[design] resumePendingDesignHandoffs failed:",a)}return a}let P=`const http = require("http");
73
+ `:"","## Handoff","Open the CEO Planner and Generate plan — the approved design above is read as official context, so specs/issues honor it.",""].filter(Boolean).join("\n");(0,p.dx)(a,u.Oi,m),await (0,q.j)(b.id,{text:`Design approved — official visual reference for ${b.name}`,by:k?.handle??"grace",source:"design",refKey:u.Oi,rationale:(c?.trim()||`${d.designMockFiles.length} design file(s); stack: ${d.stackList||"—"}`).slice(0,1e3)}),await (0,r.I)(b.id,{kind:"done",text:"Design approved — official visual reference",detail:"The CEO Planner will turn it into the Super Spec, specs and issues.",agentId:k?.id});try{(0,h.revalidatePath)("/design"),(0,h.revalidatePath)("/planner")}catch{}return{ok:!0}}async function K(){let{org:a,workspace:b}=await (0,k.nP)();return L(a.id,b)}async function L(a,b){let c=await J(a,b);if(!c.ok)return c;let d=(0,u.Iz)(a);(0,u.H5)(a,{skip:!1,brief:d.brief,goalTitle:d.goalTitle,handoffAt:Date.now()});let e=d.brief?.trim()?{brief:d.brief.trim(),goalTitle:d.goalTitle}:void 0;return await S(a,b,e),{ok:!0}}async function M(){let{org:a,workspace:b}=await (0,k.nP)();return O(a.id,b)}let N=new Set;async function O(a,b){let c=(0,u.Iz)(a);if(!c.handoffAt)return{ok:!0};let d=await E(b.id);if(d?.status==="working"||N.has(a))return{ok:!0};N.add(a);try{(0,u.H5)(a,{skip:!1,brief:c.brief,goalTitle:c.goalTitle,handoffAt:Date.now()});let d=c.brief?.trim()?{brief:c.brief.trim(),goalTitle:c.goalTitle}:void 0;return await S(a,b,d),{ok:!0}}finally{N.delete(a)}}async function P(){let a=0;try{for(let b of(await i.db.select().from(j.workspace)))if((0,u.Iz)(b.orgId).handoffAt)try{await O(b.orgId,b),a++}catch(a){console.error("[design] resume handoff failed:",b.id,a)}}catch(a){console.error("[design] resumePendingDesignHandoffs failed:",a)}return a}let Q=`const http = require("http");
74
74
  const fs = require("fs");
75
75
  const path = require("path");
76
76
  const PORT = Number(process.env.PORT) || 3000;
@@ -88,11 +88,11 @@ http.createServer((req, res) => {
88
88
  res.end(buf);
89
89
  });
90
90
  }).listen(PORT, "127.0.0.1", () => console.log("listening on http://127.0.0.1:" + PORT));
91
- `;async function Q(a,b){let c=(0,u.zw)(a,b).designMockFiles.filter(a=>/design-mock\/screens\/.+\.html?$/i.test(a));if(!c.length)return{ok:!1,target:"",served:!1,needsPort:!1,files:[],resync:!1};let d=(0,v.hB)(b.stack??{}),e="next"===d||d.startsWith("vite-"),f="static"===d,g=e?"design-source":"public",h=(0,u.hp)(a),i=!h.at,j=c.find(a=>/(^|\/)(home|index|landing)[^/]*\.html?$/i.test(a))??c[0],k=[],l=!1;if(i){for(let b of c){let c=B((0,p.sL)(a,b)??"",b,b=>(0,p.sL)(a,b)),d=b.split("/").pop()||"screen.html";b===j&&((0,p.dx)(a,`${g}/index.html`,c),k.push(`${g}/index.html`)),(b!==j||"index.html"!==d.toLowerCase())&&((0,p.dx)(a,`${g}/${d}`,c),k.push(`${g}/${d}`))}f&&((0,p.dx)(a,"server.js",P),l=!0)}else l=!!h.served;let m=i?k:h.files??[],n=["# Promoted design → project source","",`_The operator-approved design ${i?"was promoted into":"lives in"} the project's ${l?"served ":""}frontend source. This is the REAL UI — engineers EXTEND it (wire real data/backend/states on top), they do NOT rebuild or restyle it._`,"",`**Target:** \`${g}/\`${l?" (served by the dev server)":e?" (staged — needs a port into the framework)":" (needs the server wired to serve it)"}`,`**Stack starter:** ${d}`,!i?`
92
- _Re-sync: the design was updated in the Design module. Apply the visual changes to the files below WITHOUT clobbering the wired backend/data._`:"","","## Promoted files",m.map(a=>`- ${a}`).join("\n"),""].filter(Boolean).join("\n");(0,p.dx)(a,"design-mock/PROMOTED.md",n),(0,u.e1)(a,{at:Date.now(),target:h.target??g,served:l,needsPort:h.needsPort??e,files:m});try{await ad(b.id,i?"Promoted design → project source":"Design re-synced (update pending)",m)}catch{}return{ok:!0,target:h.target??g,served:l,needsPort:e,files:m,resync:!i}}async function R(a,b,c){let d=await E(b.id);if(!d)return void await S(a,b,c);let g=(0,e.randomUUID)();await i.db.update(j.agent).set({status:"working"}).where((0,f.eq)(j.agent.id,d.id)),await (0,m.I)(b.id,{runId:g,channel:D,agentId:d.id,kind:"thinking",target:`${d.name} is writing the handoff documentation…`}),(async()=>{let h=!1;try{let c=(0,u.zw)(a,b);(0,l.Pe)(b.settings?.agents?.fileLocks??null),(0,l.Hs)(b.settings?.agents?.cmdGuard??null),(0,l.UC)(b.settings?.agents?.webResearch??null);let f=(0,l.hW)(d.adapter,d.model),k="claude"===f?d.model.includes("opus")?"opus":d.model.includes("haiku")?"haiku":"sonnet":void 0,o=(0,y.qg)("constella-design"),q=[o?(0,y.BC)(o).trim():`You are ${d.name} (@${d.handle}), the frontend designer in Constella's Design module.`,`
91
+ `;async function R(a,b){let c=(0,u.zw)(a,b).designMockFiles.filter(a=>/design-mock\/screens\/.+\.html?$/i.test(a));if(!c.length)return{ok:!1,target:"",served:!1,needsPort:!1,files:[],resync:!1};let d=(0,v.hB)(b.stack??{}),e="next"===d||d.startsWith("vite-"),f="static"===d,g=e?"design-source":"public",h=(0,u.hp)(a),i=!h.at,j=c.find(a=>/(^|\/)(home|index|landing)[^/]*\.html?$/i.test(a))??c[0],k=[],l=!1;if(i){for(let b of c){let c=B((0,p.sL)(a,b)??"",b,b=>(0,p.sL)(a,b)),d=b.split("/").pop()||"screen.html";b===j&&((0,p.dx)(a,`${g}/index.html`,c),k.push(`${g}/index.html`)),(b!==j||"index.html"!==d.toLowerCase())&&((0,p.dx)(a,`${g}/${d}`,c),k.push(`${g}/${d}`))}f&&((0,p.dx)(a,"server.js",Q),l=!0)}else l=!!h.served;let m=i?k:h.files??[],n=["# Promoted design → project source","",`_The operator-approved design ${i?"was promoted into":"lives in"} the project's ${l?"served ":""}frontend source. This is the REAL UI — engineers EXTEND it (wire real data/backend/states on top), they do NOT rebuild or restyle it._`,"",`**Target:** \`${g}/\`${l?" (served by the dev server)":e?" (staged — needs a port into the framework)":" (needs the server wired to serve it)"}`,`**Stack starter:** ${d}`,!i?`
92
+ _Re-sync: the design was updated in the Design module. Apply the visual changes to the files below WITHOUT clobbering the wired backend/data._`:"","","## Promoted files",m.map(a=>`- ${a}`).join("\n"),""].filter(Boolean).join("\n");(0,p.dx)(a,"design-mock/PROMOTED.md",n),(0,u.e1)(a,{at:Date.now(),target:h.target??g,served:l,needsPort:h.needsPort??e,files:m});try{await ae(b.id,i?"Promoted design → project source":"Design re-synced (update pending)",m)}catch{}return{ok:!0,target:h.target??g,served:l,needsPort:e,files:m,resync:!i}}async function S(a,b,c){let d=await E(b.id);if(!d)return void await T(a,b,c);let g=(0,e.randomUUID)();await i.db.update(j.agent).set({status:"working"}).where((0,f.eq)(j.agent.id,d.id)),await (0,m.I)(b.id,{runId:g,channel:D,agentId:d.id,kind:"thinking",target:`${d.name} is writing the handoff documentation…`}),(async()=>{let h=!1;try{let c=(0,u.zw)(a,b);(0,l.Pe)(b.settings?.agents?.fileLocks??null),(0,l.Hs)(b.settings?.agents?.cmdGuard??null),(0,l.UC)(b.settings?.agents?.webResearch??null);let f=(0,l.hW)(d.adapter,d.model),k="claude"===f?d.model.includes("opus")?"opus":d.model.includes("haiku")?"haiku":"sonnet":void 0,o=(0,y.qg)("constella-design"),q=[o?(0,y.BC)(o).trim():`You are ${d.name} (@${d.handle}), the frontend designer in Constella's Design module.`,`
93
93
  (You are @${d.handle} / ${d.name} on the "design" channel. The operator just APPROVED the design and clicked "Send to execution". Mirror the operator's language in your short final reply; write all docs in English.)`,"TASK — produce the COMPLETE design HANDOFF DOCUMENTATION now, grounded in the APPROVED screens + the design tokens (and the source mock/ if present). Do NOT rebuild screens. Write/UPDATE these files under design-mock/ (create if missing):","1) design-mock/design-system.md — the full system: palette + tokens, typography scale, spacing, radius/elevation, components with their states, motion, accessibility, responsive breakpoints.","2) design-mock/components.md — each reusable component: anatomy, variants, states, usage notes.","3) design-mock/handoff.md — a screen-by-screen spec: layout, sections, data/fields, interactions & behavior, mapped to the approved screens — engineering builds EXACTLY this (zero drift).","4) design-mock/decisions.md — append the key UI/UX decisions and the rationale.","Keep everything consistent with design-mock/APPROVED.md. Build the docs incrementally (the operator watches the files appear). When done, reply in 2-3 sentences summarizing the handoff package and confirming it's ready for the CEO.",`
94
94
  PROJECT CONTEXT:
95
- ${(0,u.uy)(c)}`,(0,u.Er)(c,"design system documentation handoff components")].filter(Boolean).join("\n"),s=new Set,t=await (0,l.p1)(q,{orgId:a,binary:f,model:k,timeoutMs:6e5,agentId:d.id,agentHandle:d.handle},a=>{if("create"===a.kind||"edit"===a.kind){let b=(a.target||"").replace(/\\/g,"/"),c=b.toLowerCase().indexOf("design-mock/");c>=0&&s.add(b.slice(c))}(0,m.I)(b.id,{runId:g,channel:D,agentId:d.id,kind:a.kind,target:a.target,detail:a.detail})});(t.usd>0||t.inputTokens+t.outputTokens>0)&&await i.db.insert(j.costEntry).values({id:(0,e.randomUUID)(),workspaceId:b.id,agentId:d.id,channel:D,provider:t.binary,model:t.model??d.model,usd:t.usd,tokens:t.inputTokens+t.outputTokens,at:new Date});let v=t.ok?t.text?.trim()||"Handoff documentation ready — sending to the CEO.":`(couldn't finish the docs: ${(0,w.Tc)(t.error||t.text)})`;if(await i.db.insert(j.message).values({id:g,workspaceId:b.id,channel:D,fromKind:"agent",fromHandle:d.handle,text:v.slice(0,4e3),createdAt:new Date,sessionId:null}),await (0,n.f)(b.id,g,D),t.ok&&s.size){try{await ad(b.id,"Design handoff documentation",[...s])}catch{}try{await (0,r.I)(b.id,{kind:"design-review",text:`Design documentation ready — ${b.name}`,detail:`${d.name} wrote the full handoff package (design system, components, screen specs, decisions). Handing off to Ada now.`,agentId:d.id,tg:!0})}catch{}}h=t.ok&&(s.size>0||!!(0,p.sL)(a,"design-mock/handoff.md"))}catch(a){console.error("[design] handoff docs run failed:",a)}finally{try{await i.db.update(j.agent).set({status:"idle"}).where((0,f.eq)(j.agent.id,d.id))}catch{}(0,o.r)(b.id)}if(h){try{let c=await Q(a,b);c.ok&&await (0,r.I)(b.id,{kind:"design-review",text:`Design promoted to the project — ${b.name}`,detail:c.served?`The approved UI is now the real served frontend (${c.target}/). Ada will add the backend on top.`:`The approved UI was staged (${c.target}/)${c.needsPort?" — Ada will port it into the framework":""}. Ada plans from here.`,agentId:d.id,tg:!0})}catch(a){console.error("[design] promotion failed:",a)}try{await S(a,b,c),(0,u.DQ)(a)}catch(a){console.error("[design] CEO activation after handoff failed:",a)}}else try{await (0,r.I)(b.id,{kind:"design-review",text:`Design handoff didn't finish — ${b.name}`,detail:"Grace couldn't write the handoff documentation (provider limit / network). Open the Design module and tap Resume handoff to try again.",agentId:d.id,tg:!0})}catch{}})()}async function S(a,b,d){let{generatePlanFor:e,startNewWorkFor:g}=await Promise.resolve().then(c.bind(c,23297)),h=await T(a,b);try{await (0,r.I)(b.id,{kind:"design-review",text:`Ada received the design handoff — ${b.name}`,detail:"Turning the approved design + docs into Super Spec, specs, issues and tasks.",tg:!0})}catch{}if(d?.brief)return void await g(a,b,{title:d.goalTitle||"Design feature → execution",brief:`${d.brief}
95
+ ${(0,u.uy)(c)}`,(0,u.Er)(c,"design system documentation handoff components")].filter(Boolean).join("\n"),s=new Set,t=await (0,l.p1)(q,{orgId:a,binary:f,model:k,timeoutMs:6e5,agentId:d.id,agentHandle:d.handle},a=>{if("create"===a.kind||"edit"===a.kind){let b=(a.target||"").replace(/\\/g,"/"),c=b.toLowerCase().indexOf("design-mock/");c>=0&&s.add(b.slice(c))}(0,m.I)(b.id,{runId:g,channel:D,agentId:d.id,kind:a.kind,target:a.target,detail:a.detail})});(t.usd>0||t.inputTokens+t.outputTokens>0)&&await i.db.insert(j.costEntry).values({id:(0,e.randomUUID)(),workspaceId:b.id,agentId:d.id,channel:D,provider:t.binary,model:t.model??d.model,usd:t.usd,tokens:t.inputTokens+t.outputTokens,at:new Date});let v=t.ok?t.text?.trim()||"Handoff documentation ready — sending to the CEO.":`(couldn't finish the docs: ${(0,w.Tc)(t.error||t.text)})`;if(await i.db.insert(j.message).values({id:g,workspaceId:b.id,channel:D,fromKind:"agent",fromHandle:d.handle,text:v.slice(0,4e3),createdAt:new Date,sessionId:null}),await (0,n.f)(b.id,g,D),t.ok&&s.size){try{await ae(b.id,"Design handoff documentation",[...s])}catch{}try{await (0,r.I)(b.id,{kind:"design-review",text:`Design documentation ready — ${b.name}`,detail:`${d.name} wrote the full handoff package (design system, components, screen specs, decisions). Handing off to Ada now.`,agentId:d.id,tg:!0})}catch{}}h=t.ok&&(s.size>0||!!(0,p.sL)(a,"design-mock/handoff.md"))}catch(a){console.error("[design] handoff docs run failed:",a)}finally{try{await i.db.update(j.agent).set({status:"idle"}).where((0,f.eq)(j.agent.id,d.id))}catch{}(0,o.r)(b.id)}if(h){try{let c=await R(a,b);c.ok&&await (0,r.I)(b.id,{kind:"design-review",text:`Design promoted to the project — ${b.name}`,detail:c.served?`The approved UI is now the real served frontend (${c.target}/). Ada will add the backend on top.`:`The approved UI was staged (${c.target}/)${c.needsPort?" — Ada will port it into the framework":""}. Ada plans from here.`,agentId:d.id,tg:!0})}catch(a){console.error("[design] promotion failed:",a)}try{await T(a,b,c),(0,u.DQ)(a)}catch(a){console.error("[design] CEO activation after handoff failed:",a)}}else try{await (0,r.I)(b.id,{kind:"design-review",text:`Design handoff didn't finish — ${b.name}`,detail:"Grace couldn't write the handoff documentation (provider limit / network). Open the Design module and tap Resume handoff to try again.",agentId:d.id,tg:!0})}catch{}})()}async function T(a,b,d){let{generatePlanFor:e,startNewWorkFor:g}=await Promise.resolve().then(c.bind(c,23297)),h=await U(a,b);try{await (0,r.I)(b.id,{kind:"design-review",text:`Ada received the design handoff — ${b.name}`,detail:"Turning the approved design + docs into Super Spec, specs, issues and tasks.",tg:!0})}catch{}if(d?.brief)return void await g(a,b,{title:d.goalTitle||"Design feature → execution",brief:`${d.brief}
96
96
 
97
97
  The UI for this work has been prototyped + APPROVED in the Design module (design-mock/APPROVED.md + docs) — build it EXACTLY as designed (zero drift).
98
98
 
@@ -100,8 +100,8 @@ ${h}`});if(0===(await i.db.select({id:j.spec.id}).from(j.spec).where((0,f.Uo)((0
100
100
 
101
101
  ${h}`}:{title:"Implement the approved design",brief:`Implement the operator-approved UI design (design-mock/APPROVED.md + the design-mock/ documentation) into the product — match it EXACTLY (zero drift): build the screens, components and design system as documented.
102
102
 
103
- ${h}`})}async function T(a,b){let c=(0,u.zw)(a,b),d=c.designMockFiles.filter(a=>/design-mock\/screens\/.+\.html?$/i.test(a));if(!d.length)return`No screens prototyped yet for ${b.name}.`;let e=[`🎨 Design — ${b.name} (${d.length} screen${d.length>1?"s":""})`];for(let b of d.slice(0,5)){let c=(0,p.sL)(a,b)??"",d=(b.split("/").pop()||b).replace(/\.html?$/i,""),f=Array.from(c.matchAll(/<h[1-3][^>]*>([\s\S]*?)<\/h[1-3]>/gi)).map(a=>a[1].replace(/<[^>]+>/g,"").trim()).filter(Boolean).slice(0,4),g=Array.from(c.matchAll(/<(?:input|select|textarea)\b[^>]*?(?:placeholder|name|aria-label)\s*=\s*["']([^"']+)["']/gi)).map(a=>a[1].trim()).filter(Boolean).slice(0,6),h=Array.from(c.matchAll(/<button\b[^>]*>([\s\S]*?)<\/button>/gi)).map(a=>a[1].replace(/<[^>]+>/g,"").replace(/\s+/g," ").trim()).filter(Boolean).slice(0,5),i=/@media/i.test(c),j=[];f.length&&j.push(`sections: ${f.join(", ")}`),g.length&&j.push(`form fields: ${g.join(", ")}`),h.length&&j.push(`buttons: ${h.join(", ")}`),j.push(i?"responsive":"fixed layout"),e.push(`• ${d} — ${j.join("; ")}.`)}return c.approved&&e.push(`
104
- Status: APPROVED (official visual reference).`),e.join("\n").slice(0,3400)}async function U(){let{org:a}=await (0,k.nP)();return(0,u.H5)(a.id,{...(0,u.Iz)(a.id),skip:!0}),{ok:!0}}async function V(){let a,{org:b,workspace:c}=await (0,k.nP)(),d=(0,u.zw)(b.id,c),e=(0,u.Iz)(b.id);if((0,u.H5)(b.id,{...e,scaffoldedAt:Date.now()}),e.brief&&e.brief.trim())a=`This is a NEW visual unit of work to DESIGN before it's built:
103
+ ${h}`})}async function U(a,b){let c=(0,u.zw)(a,b),d=c.designMockFiles.filter(a=>/design-mock\/screens\/.+\.html?$/i.test(a));if(!d.length)return`No screens prototyped yet for ${b.name}.`;let e=[`🎨 Design — ${b.name} (${d.length} screen${d.length>1?"s":""})`];for(let b of d.slice(0,5)){let c=(0,p.sL)(a,b)??"",d=(b.split("/").pop()||b).replace(/\.html?$/i,""),f=Array.from(c.matchAll(/<h[1-3][^>]*>([\s\S]*?)<\/h[1-3]>/gi)).map(a=>a[1].replace(/<[^>]+>/g,"").trim()).filter(Boolean).slice(0,4),g=Array.from(c.matchAll(/<(?:input|select|textarea)\b[^>]*?(?:placeholder|name|aria-label)\s*=\s*["']([^"']+)["']/gi)).map(a=>a[1].trim()).filter(Boolean).slice(0,6),h=Array.from(c.matchAll(/<button\b[^>]*>([\s\S]*?)<\/button>/gi)).map(a=>a[1].replace(/<[^>]+>/g,"").replace(/\s+/g," ").trim()).filter(Boolean).slice(0,5),i=/@media/i.test(c),j=[];f.length&&j.push(`sections: ${f.join(", ")}`),g.length&&j.push(`form fields: ${g.join(", ")}`),h.length&&j.push(`buttons: ${h.join(", ")}`),j.push(i?"responsive":"fixed layout"),e.push(`• ${d} — ${j.join("; ")}.`)}return c.approved&&e.push(`
104
+ Status: APPROVED (official visual reference).`),e.join("\n").slice(0,3400)}async function V(){let{org:a}=await (0,k.nP)();return(0,u.H5)(a.id,{...(0,u.Iz)(a.id),skip:!0}),{ok:!0}}async function W(){let a,{org:b,workspace:c}=await (0,k.nP)(),d=(0,u.zw)(b.id,c),e=(0,u.Iz)(b.id);if((0,u.H5)(b.id,{...e,scaffoldedAt:Date.now()}),e.brief&&e.brief.trim())a=`This is a NEW visual unit of work to DESIGN before it's built:
105
105
  "${e.brief.trim().slice(0,1200)}"
106
106
  Prototype the screen(s) for THIS feature under design-mock/screens/ (token-driven, link ../styles/global.css — create global.css if missing). Block out the real layout, sections and components for the feature, consistent with any existing design-mock screens + design-mock/APPROVED.md. Then tell me what you built and what to validate before approving.`;else if(d.mockFiles.length)a=`A MOCK / prototype is attached in mock/ (${d.mockFiles.length} file(s): ${d.mockFiles.slice(0,16).join(", ")}). The mock is the SOURCE OF TRUTH — do NOT invent a different look.
107
107
  1) READ every mock file with your file tools (images/HTML supported) — treat it as the exact visual brief.
@@ -116,4 +116,4 @@ ${c.map(a=>"- "+a).join("\n")||"(scan the project for components / screens / sty
116
116
  1) Create design-mock/styles/global.css with the design tokens (:root), reset/base and theme ([data-theme]).
117
117
  2) Scaffold a skeleton of the main screen(s) under design-mock/screens/ — valid HTML linking ../styles/global.css, with the key sections blocked out as labelled placeholders.
118
118
  3) Write design-mock/design-system.md outlining the palette, typography, spacing, core components and the screens to build.
119
- 4) Tell me what you set up and what to build/validate next before approving.`;return H(`Ada is preparing the delivery plan and needs the design prototyped + approved first (zero drift). ${a}`)}async function W(a){let{org:b}=await (0,k.nP)();if(!a||!a.startsWith("design-mock/")||a.includes("..")||!/\.html?$/i.test(a))return{ok:!1,error:"Not a design screen."};let c=(0,p.sL)(b.id,a);return null==c?{ok:!1,error:"Screen not found."}:{ok:!0,html:B(c,a,a=>(0,p.sL)(b.id,a)).slice(0,2e6)}}async function X(){let{org:a,workspace:b}=await (0,k.nP)(),c=(0,p.CS)(a.id).filter(a=>a.startsWith("design-mock/")&&/\.(md|markdown)$/i.test(a)&&!/\/README\.md$/i.test(a)).map(a=>({path:a,label:a.replace(/^design-mock\//,"")})).sort((a,b)=>Y(a.path)-Y(b.path)||a.label.localeCompare(b.label));return(0,u.zw)(a.id,b),{docs:c}}function Y(a){return/APPROVED\.md$/i.test(a)?0:/design-system\.md$/i.test(a)?1:2}async function Z(a){let{org:b}=await (0,k.nP)();if(!a||!a.startsWith("design-mock/")||a.includes("..")||!/\.(md|markdown)$/i.test(a))return{ok:!1,error:"Not a design doc."};let c=(0,p.sL)(b.id,a);return null==c?{ok:!1,error:"Doc not found."}:{ok:!0,body:c.slice(0,5e5)}}let $=".claude/design-presets.json";async function _(){let{org:a}=await (0,k.nP)(),b=(0,p.sL)(a.id,$);if(!b)return{presets:[]};try{let a=JSON.parse(b);return{presets:Array.isArray(a)?a.slice(0,60):[]}}catch{return{presets:[]}}}async function aa(a,b){let{org:c}=await (0,k.nP)(),d=(a??"").trim();if(!d||d.length>6e4)return{ok:!1,error:"Nothing to save."};let{presets:f}=await _(),g=[{id:"p"+(0,e.randomUUID)().slice(0,6),label:(b||"Preset").slice(0,40),html:d},...f].slice(0,60);return(0,p.dx)(c.id,$,JSON.stringify(g,null,2)),{ok:!0}}async function ab(a){let{org:b}=await (0,k.nP)(),{presets:c}=await _();return(0,p.dx)(b.id,$,JSON.stringify(c.filter(b=>b.id!==a),null,2)),{ok:!0}}async function ac(){let{org:a,workspace:b}=await (0,k.nP)(),c=(0,u.zw)(a.id,b);return{screens:c.designMockFiles.filter(a=>/\.html?$/i.test(a)),components:c.designMockFiles.filter(a=>a.startsWith("design-mock/components/"))}}async function ad(a,b,c){let[d]=await i.db.select({id:j.designSession.id}).from(j.designSession).where((0,f.eq)(j.designSession.workspaceId,a)).orderBy((0,g.i)(j.designSession.createdAt)).limit(1);if(!d)return;let h=await i.db.select({id:j.designVersion.id}).from(j.designVersion).where((0,f.eq)(j.designVersion.sessionId,d.id));await i.db.insert(j.designVersion).values({id:(0,e.randomUUID)(),sessionId:d.id,label:"v"+(h.length+1),note:b.slice(0,300),patch:{files:c}})}async function ae(){let{workspace:a}=await (0,k.nP)();t();let[b]=await i.db.select({id:j.designSession.id}).from(j.designSession).where((0,f.eq)(j.designSession.workspaceId,a.id)).orderBy((0,g.i)(j.designSession.createdAt)).limit(1);return b?{versions:(await i.db.select().from(j.designVersion).where((0,f.eq)(j.designVersion.sessionId,b.id)).orderBy((0,g.i)(j.designVersion.createdAt))).map(a=>{let b=a.patch;return{id:a.id,label:a.label,note:a.note,files:b?.files??[],restorable:!!b?.snapshot,createdAt:a.createdAt.getTime()}})}:{versions:[]}}async function af(a,b){return H(`Restore the prototype to ${a} — "${b}". Re-apply that state to the screens under design-mock/screens/ and tell me what changed.`)}async function ag(a){let{org:b,workspace:c}=await (0,k.nP)();if(!a||!a.startsWith("design-mock/")||a.includes("..")||!/\.html?$/i.test(a))return{ok:!1,error:"Not a design screen."};t();let d=(0,p.sL)(b.id,a);if(null==d)return{ok:!1,error:"Screen not found."};let[l]=await i.db.select({id:j.designSession.id}).from(j.designSession).where((0,f.eq)(j.designSession.workspaceId,c.id)).orderBy((0,g.i)(j.designSession.createdAt)).limit(1);if(!l)return{ok:!1,error:"No design session."};let m="Saved v"+((await i.db.select({id:j.designVersion.id}).from(j.designVersion).where((0,f.eq)(j.designVersion.sessionId,l.id))).length+1),n=(a.split("/").pop()||a).replace(/\.[a-z]+$/i,"");await i.db.insert(j.designVersion).values({id:(0,e.randomUUID)(),sessionId:l.id,label:m,note:`Checkpoint \xb7 ${n}`,patch:{files:[a],snapshot:d}});try{(0,h.revalidatePath)("/design")}catch{}return{ok:!0,label:m}}async function ah(a){let{org:b,workspace:c}=await (0,k.nP)();t();let[d]=await i.db.select({id:j.designSession.id}).from(j.designSession).where((0,f.eq)(j.designSession.workspaceId,c.id)).orderBy((0,g.i)(j.designSession.createdAt)).limit(1);if(!d)return{ok:!1,error:"No design session."};let[e]=await i.db.select().from(j.designVersion).where((0,f.Uo)((0,f.eq)(j.designVersion.id,a),(0,f.eq)(j.designVersion.sessionId,d.id))).limit(1);if(!e)return{ok:!1,error:"Checkpoint not found."};let l=e.patch,m=l?.files?.[0];if(!l?.snapshot||!m)return{ok:!1,error:"This version isn't a restorable checkpoint."};if(!m.startsWith("design-mock/")||m.includes(".."))return{ok:!1,error:"Bad path."};(0,p.dx)(b.id,m,l.snapshot);try{(0,h.revalidatePath)("/design")}catch{}return{ok:!0}}async function ai(a){let{workspace:b}=await (0,k.nP)();t();let[c]=await i.db.select({id:j.designSession.id}).from(j.designSession).where((0,f.eq)(j.designSession.workspaceId,b.id)).orderBy((0,g.i)(j.designSession.createdAt)).limit(1);if(!c)return{comments:[]};let d=a?(0,f.Uo)((0,f.eq)(j.designComment.sessionId,c.id),(0,f.eq)(j.designComment.pageKey,a)):(0,f.eq)(j.designComment.sessionId,c.id);return{comments:(await i.db.select().from(j.designComment).where(d).orderBy(j.designComment.createdAt)).map(a=>({id:a.id,pageKey:a.pageKey,xp:a.xp,yp:a.yp,body:a.body,reply:a.reply,selection:a.selection,createdAt:a.createdAt.getTime()}))}}async function aj(a,b,c,d,f){let g=d?.trim();if(!g)return{ok:!1,error:"Empty comment."};t();let k=await F(),l=(0,e.randomUUID)();await i.db.insert(j.designComment).values({id:l,sessionId:k.id,pageKey:(a||"").slice(0,300),xp:b,yp:c,body:g.slice(0,2e3),reply:"",selection:f??null});try{(0,h.revalidatePath)("/design")}catch{}return{ok:!0,id:l}}async function ak(a,b,c){t();let d=await F(),f=(0,e.randomUUID)(),g=(c||"").trim();await i.db.insert(j.designComment).values({id:f,sessionId:d.id,pageKey:(a||"").slice(0,300),xp:b.x,yp:b.y,body:(g||"(region marked for review)").slice(0,2e3),reply:"",selection:{kind:"markup",rect:b}});try{(0,h.revalidatePath)("/design")}catch{}return{ok:!0,id:f}}async function al(a){let{workspace:b}=await (0,k.nP)();t();let[c]=await i.db.select({id:j.designSession.id}).from(j.designSession).where((0,f.eq)(j.designSession.workspaceId,b.id)).orderBy((0,g.i)(j.designSession.createdAt)).limit(1);c&&await i.db.delete(j.designComment).where((0,f.Uo)((0,f.eq)(j.designComment.id,a),(0,f.eq)(j.designComment.sessionId,c.id)));try{(0,h.revalidatePath)("/design")}catch{}return{ok:!0}}async function am(a,b,c){let{org:d}=await (0,k.nP)();if(!a||!a.startsWith("design-mock/")||a.includes("..")||!/\.html?$/i.test(a))return{ok:!1,error:"Not a design screen."};let e=(b??"").trim();if(!e)return{ok:!1,error:"Nothing to replace."};let f=(0,p.sL)(d.id,a);if(null==f)return{ok:!1,error:"Screen not found."};let g=f.indexOf(e);if(g<0)return{ok:!1,error:"Couldn't locate that text — ask Grace to apply it."};if(f.indexOf(e,g+1)>=0)return{ok:!1,error:"That text appears more than once — ask Grace to apply it."};(0,p.dx)(d.id,a,f.slice(0,g)+(c??"")+f.slice(g+e.length));try{(0,h.revalidatePath)("/design")}catch{}return{ok:!0}}async function an(a,b){let{org:c,workspace:d}=await (0,k.nP)();if(!a||!a.startsWith("design-mock/")||a.includes("..")||!/\.html?$/i.test(a))return{ok:!1,error:"Not a design screen."};if(null==b)return{ok:!1,error:"Nothing to commit."};if(b.length>4e6)return{ok:!1,error:"Screen too large."};let e=b,f=e.match(/<body[^>]*>([\s\S]*)<\/body>/i);f&&(e=f[1]),e=e.replace(/<!doctype[^>]*>/gi,"").replace(/<\/?(?:html|head|body)\b[^>]*>/gi,"");let g=(0,p.sL)(c.id,a);if(null==g)return{ok:!1,error:"Screen not found."};let i=g.match(/<body([^>]*)>[\s\S]*<\/body>/i),j=i&&null!=i.index?g.slice(0,i.index)+`<body${i[1]}>`+e+"</body>"+g.slice(i.index+i[0].length):`<!doctype html><html><head><meta charset="utf-8"></head><body>${e}</body></html>`;(0,p.dx)(c.id,a,j);try{await ao(d.id,a)}catch{}try{(0,h.revalidatePath)("/design")}catch{}return{ok:!0}}async function ao(a,b){let[c]=await i.db.select({id:j.designSession.id}).from(j.designSession).where((0,f.eq)(j.designSession.workspaceId,a)).orderBy((0,g.i)(j.designSession.createdAt)).limit(1);if(!c)return;let d="Manual canvas edit",[h]=await i.db.select().from(j.designVersion).where((0,f.eq)(j.designVersion.sessionId,c.id)).orderBy((0,g.i)(j.designVersion.createdAt)).limit(1);if(h&&h.note===d&&Date.now()-h.createdAt.getTime()<9e4){let a=Array.from(new Set([...h.patch?.files??[],b]));await i.db.update(j.designVersion).set({patch:{files:a},createdAt:new Date}).where((0,f.eq)(j.designVersion.id,h.id))}else{let a=await i.db.select({id:j.designVersion.id}).from(j.designVersion).where((0,f.eq)(j.designVersion.sessionId,c.id));await i.db.insert(j.designVersion).values({id:(0,e.randomUUID)(),sessionId:c.id,label:"v"+(a.length+1),note:d,patch:{files:[b]}})}}async function ap(){let{org:a,workspace:b}=await (0,k.nP)(),c=(0,u.zw)(a.id,b).designMockFiles.filter(a=>/design-mock\/screens\/.+\.html?$/i.test(a));if(!c.length)return{ok:!1,built:[],error:"No screens to build yet — ask Grace for a screen first."};let d=[];for(let b of c){let c=(0,p.sL)(a.id,b);if(null==c)continue;let{out:e,obfuscated:f}=function(a){let b=/<script\b/i.test(a),c=function(a){let b;return(b=[],a.replace(/<style\b([^>]*)>([\s\S]*?)<\/style>/gi,(a,b,c)=>`<style${b}>${c.replace(/\/\*[\s\S]*?\*\//g,"").replace(/\s+/g," ").replace(/\s*([{};,])\s*/g,"$1").replace(/:\s+/g,":").replace(/;}/g,"}").trim()}</style>`).replace(/<(script|style)\b[\s\S]*?<\/\1>/gi,a=>(b.push(a),`\0${b.length-1}\0`)).replace(/<!--(?!\[if)[\s\S]*?-->/g,"").replace(/(\d+)/g,(a,c)=>b[Number(c)])).trim()}(a);return b||(c=function(a){if(/<script\b/i.test(a))return a;let b=new Set;for(let c of a.matchAll(/class\s*=\s*"([^"]*)"/gi))c[1].split(/\s+/).filter(Boolean).forEach(a=>b.add(a));if(!b.size)return a;let c=new Map;[...b].forEach((a,b)=>c.set(a,function(a){let b="",c=a+1;for(;c>0;)b="abcdefghijklmnopqrstuvwxyz"[--c%26]+b,c=Math.floor(c/26);return b}(b)));let d=a.replace(/class\s*=\s*"([^"]*)"/gi,(a,b)=>`class="${b.split(/\s+/).filter(Boolean).map(a=>c.get(a)??a).join(" ")}"`);return d.replace(/<style\b([^>]*)>([\s\S]*?)<\/style>/gi,(a,b,d)=>{let e=d;for(let[a,b]of c)e=e.replace(RegExp("\\."+a.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")+"(?![-_\\w])","g"),"."+b);return`<style${b}>${e}</style>`})}(c)),{out:c,obfuscated:!b}}(B(c,b,b=>(0,p.sL)(a.id,b))),g=`design-mock/dist/${b.split("/").pop()}`;(0,p.dx)(a.id,g,e),d.push({path:g,before:c.length,after:e.length,obfuscated:f})}try{(0,h.revalidatePath)("/design")}catch{}return{ok:!0,built:d}}(0,C.D)([F,G,H,I,J,K,L,M,N,O,Q,T,U,V,W,X,Z,_,aa,ab,ac,ae,af,ag,ah,ai,aj,ak,al,am,an,ap]),(0,d.A)(F,"00b0578e37d9ebe94aea8c3a34edc1eb3072857776",null),(0,d.A)(G,"4017a2e91aac0e44c71e7dc8bdc64b91c86af6966e",null),(0,d.A)(H,"702318f1552859b902907168b6bbd6d46cbb1cd8bd",null),(0,d.A)(I,"40a2ed61c41d82e88df9f715926555d4751d7925b2",null),(0,d.A)(J,"7088368271648f6247e709bf8e6336af1a18845379",null),(0,d.A)(K,"00c6849ba47e6e7fea083ff67d4e2a602a90900e03",null),(0,d.A)(L,"60643b82a325d6fdb9a22f2326122b2156783fb109",null),(0,d.A)(M,"00041d8182167f36657652fa5117a86f04ad9fdac4",null),(0,d.A)(N,"60e384f0f20aad069f13d07666957fcf7fb2f9646f",null),(0,d.A)(O,"005693f47d654854560b9d0bc386173850cbf8240e",null),(0,d.A)(Q,"605cae860898064ae08c87ba7e942dd9d714085b87",null),(0,d.A)(T,"60da31e678463e5daa11931edbba1bf33db81533f2",null),(0,d.A)(U,"00194592ad47500e882eca534f2a4293d58ced6167",null),(0,d.A)(V,"009e146b7742c650ca216beeed8e617243a4a5c103",null),(0,d.A)(W,"40ef9327df3c76aeec61e899723f3a4fce0f04e0f4",null),(0,d.A)(X,"002dfc0678550fd7b554d7d8b3301ed4c835ae2a9f",null),(0,d.A)(Z,"406e30e8c1f70608478aa34a2cfc9f472c06c1ade1",null),(0,d.A)(_,"00ba8cc316d3085e76aed850bf0439194afd9bdec4",null),(0,d.A)(aa,"601c6bff04fd688cd4118800632f7fbc53a64ee6a5",null),(0,d.A)(ab,"409ca62ff6760c73fdd8c8c7267a97b16e88a526f7",null),(0,d.A)(ac,"0072163f36363b48de78305a257f30f3daefa28c88",null),(0,d.A)(ae,"00f53bdd7c80bb26d6c234682ff09d42c9fa8d285c",null),(0,d.A)(af,"602c949d6b4f90259a9dd0bf28582677f4f84cdc82",null),(0,d.A)(ag,"400105d268e50cf405554ad50d07b6cf74ab3dfdfb",null),(0,d.A)(ah,"4036941845402c95b0a364055242692180e15d59a1",null),(0,d.A)(ai,"4042d732975c30e998b1b417f244d02bc240771b42",null),(0,d.A)(aj,"7ca088c8458079633b65380437dffa61b3a503e9d8",null),(0,d.A)(ak,"7084c40999976496a9f63bf8a44a4c05630a91605b",null),(0,d.A)(al,"40205db6b6772e5190d6280f495fecc4c49bb1880c",null),(0,d.A)(am,"70de449374fe32fcef6ed2f670f9dd29539a04eff1",null),(0,d.A)(an,"60dbb220db735685b4802d9264fe095d42ffd507fa",null),(0,d.A)(ap,"0053a9e20f5c5328aa2a2502d518180bfd6eed8f2f",null)}};
119
+ 4) Tell me what you set up and what to build/validate next before approving.`;return H(`Ada is preparing the delivery plan and needs the design prototyped + approved first (zero drift). ${a}`)}async function X(a){let{org:b}=await (0,k.nP)();if(!a||!a.startsWith("design-mock/")||a.includes("..")||!/\.html?$/i.test(a))return{ok:!1,error:"Not a design screen."};let c=(0,p.sL)(b.id,a);return null==c?{ok:!1,error:"Screen not found."}:{ok:!0,html:B(c,a,a=>(0,p.sL)(b.id,a)).slice(0,2e6)}}async function Y(){let{org:a,workspace:b}=await (0,k.nP)(),c=(0,p.CS)(a.id).filter(a=>a.startsWith("design-mock/")&&/\.(md|markdown)$/i.test(a)&&!/\/README\.md$/i.test(a)).map(a=>({path:a,label:a.replace(/^design-mock\//,"")})).sort((a,b)=>Z(a.path)-Z(b.path)||a.label.localeCompare(b.label));return(0,u.zw)(a.id,b),{docs:c}}function Z(a){return/APPROVED\.md$/i.test(a)?0:/design-system\.md$/i.test(a)?1:2}async function $(a){let{org:b}=await (0,k.nP)();if(!a||!a.startsWith("design-mock/")||a.includes("..")||!/\.(md|markdown)$/i.test(a))return{ok:!1,error:"Not a design doc."};let c=(0,p.sL)(b.id,a);return null==c?{ok:!1,error:"Doc not found."}:{ok:!0,body:c.slice(0,5e5)}}let _=".claude/design-presets.json";async function aa(){let{org:a}=await (0,k.nP)(),b=(0,p.sL)(a.id,_);if(!b)return{presets:[]};try{let a=JSON.parse(b);return{presets:Array.isArray(a)?a.slice(0,60):[]}}catch{return{presets:[]}}}async function ab(a,b){let{org:c}=await (0,k.nP)(),d=(a??"").trim();if(!d||d.length>6e4)return{ok:!1,error:"Nothing to save."};let{presets:f}=await aa(),g=[{id:"p"+(0,e.randomUUID)().slice(0,6),label:(b||"Preset").slice(0,40),html:d},...f].slice(0,60);return(0,p.dx)(c.id,_,JSON.stringify(g,null,2)),{ok:!0}}async function ac(a){let{org:b}=await (0,k.nP)(),{presets:c}=await aa();return(0,p.dx)(b.id,_,JSON.stringify(c.filter(b=>b.id!==a),null,2)),{ok:!0}}async function ad(){let{org:a,workspace:b}=await (0,k.nP)(),c=(0,u.zw)(a.id,b);return{screens:c.designMockFiles.filter(a=>/\.html?$/i.test(a)),components:c.designMockFiles.filter(a=>a.startsWith("design-mock/components/"))}}async function ae(a,b,c){let[d]=await i.db.select({id:j.designSession.id}).from(j.designSession).where((0,f.eq)(j.designSession.workspaceId,a)).orderBy((0,g.i)(j.designSession.createdAt)).limit(1);if(!d)return;let h=await i.db.select({id:j.designVersion.id}).from(j.designVersion).where((0,f.eq)(j.designVersion.sessionId,d.id));await i.db.insert(j.designVersion).values({id:(0,e.randomUUID)(),sessionId:d.id,label:"v"+(h.length+1),note:b.slice(0,300),patch:{files:c}})}async function af(){let{workspace:a}=await (0,k.nP)();t();let[b]=await i.db.select({id:j.designSession.id}).from(j.designSession).where((0,f.eq)(j.designSession.workspaceId,a.id)).orderBy((0,g.i)(j.designSession.createdAt)).limit(1);return b?{versions:(await i.db.select().from(j.designVersion).where((0,f.eq)(j.designVersion.sessionId,b.id)).orderBy((0,g.i)(j.designVersion.createdAt))).map(a=>{let b=a.patch;return{id:a.id,label:a.label,note:a.note,files:b?.files??[],restorable:!!b?.snapshot,createdAt:a.createdAt.getTime()}})}:{versions:[]}}async function ag(a,b){return H(`Restore the prototype to ${a} — "${b}". Re-apply that state to the screens under design-mock/screens/ and tell me what changed.`)}async function ah(a){let{org:b,workspace:c}=await (0,k.nP)();if(!a||!a.startsWith("design-mock/")||a.includes("..")||!/\.html?$/i.test(a))return{ok:!1,error:"Not a design screen."};t();let d=(0,p.sL)(b.id,a);if(null==d)return{ok:!1,error:"Screen not found."};let[l]=await i.db.select({id:j.designSession.id}).from(j.designSession).where((0,f.eq)(j.designSession.workspaceId,c.id)).orderBy((0,g.i)(j.designSession.createdAt)).limit(1);if(!l)return{ok:!1,error:"No design session."};let m="Saved v"+((await i.db.select({id:j.designVersion.id}).from(j.designVersion).where((0,f.eq)(j.designVersion.sessionId,l.id))).length+1),n=(a.split("/").pop()||a).replace(/\.[a-z]+$/i,"");await i.db.insert(j.designVersion).values({id:(0,e.randomUUID)(),sessionId:l.id,label:m,note:`Checkpoint \xb7 ${n}`,patch:{files:[a],snapshot:d}});try{(0,h.revalidatePath)("/design")}catch{}return{ok:!0,label:m}}async function ai(a){let{org:b,workspace:c}=await (0,k.nP)();t();let[d]=await i.db.select({id:j.designSession.id}).from(j.designSession).where((0,f.eq)(j.designSession.workspaceId,c.id)).orderBy((0,g.i)(j.designSession.createdAt)).limit(1);if(!d)return{ok:!1,error:"No design session."};let[e]=await i.db.select().from(j.designVersion).where((0,f.Uo)((0,f.eq)(j.designVersion.id,a),(0,f.eq)(j.designVersion.sessionId,d.id))).limit(1);if(!e)return{ok:!1,error:"Checkpoint not found."};let l=e.patch,m=l?.files?.[0];if(!l?.snapshot||!m)return{ok:!1,error:"This version isn't a restorable checkpoint."};if(!m.startsWith("design-mock/")||m.includes(".."))return{ok:!1,error:"Bad path."};(0,p.dx)(b.id,m,l.snapshot);try{(0,h.revalidatePath)("/design")}catch{}return{ok:!0}}async function aj(a){let{workspace:b}=await (0,k.nP)();t();let[c]=await i.db.select({id:j.designSession.id}).from(j.designSession).where((0,f.eq)(j.designSession.workspaceId,b.id)).orderBy((0,g.i)(j.designSession.createdAt)).limit(1);if(!c)return{comments:[]};let d=a?(0,f.Uo)((0,f.eq)(j.designComment.sessionId,c.id),(0,f.eq)(j.designComment.pageKey,a)):(0,f.eq)(j.designComment.sessionId,c.id);return{comments:(await i.db.select().from(j.designComment).where(d).orderBy(j.designComment.createdAt)).map(a=>({id:a.id,pageKey:a.pageKey,xp:a.xp,yp:a.yp,body:a.body,reply:a.reply,selection:a.selection,createdAt:a.createdAt.getTime()}))}}async function ak(a,b,c,d,f){let g=d?.trim();if(!g)return{ok:!1,error:"Empty comment."};t();let k=await F(),l=(0,e.randomUUID)();await i.db.insert(j.designComment).values({id:l,sessionId:k.id,pageKey:(a||"").slice(0,300),xp:b,yp:c,body:g.slice(0,2e3),reply:"",selection:f??null});try{(0,h.revalidatePath)("/design")}catch{}return{ok:!0,id:l}}async function al(a,b,c){t();let d=await F(),f=(0,e.randomUUID)(),g=(c||"").trim();await i.db.insert(j.designComment).values({id:f,sessionId:d.id,pageKey:(a||"").slice(0,300),xp:b.x,yp:b.y,body:(g||"(region marked for review)").slice(0,2e3),reply:"",selection:{kind:"markup",rect:b}});try{(0,h.revalidatePath)("/design")}catch{}return{ok:!0,id:f}}async function am(a){let{workspace:b}=await (0,k.nP)();t();let[c]=await i.db.select({id:j.designSession.id}).from(j.designSession).where((0,f.eq)(j.designSession.workspaceId,b.id)).orderBy((0,g.i)(j.designSession.createdAt)).limit(1);c&&await i.db.delete(j.designComment).where((0,f.Uo)((0,f.eq)(j.designComment.id,a),(0,f.eq)(j.designComment.sessionId,c.id)));try{(0,h.revalidatePath)("/design")}catch{}return{ok:!0}}async function an(a,b,c){let{org:d}=await (0,k.nP)();if(!a||!a.startsWith("design-mock/")||a.includes("..")||!/\.html?$/i.test(a))return{ok:!1,error:"Not a design screen."};let e=(b??"").trim();if(!e)return{ok:!1,error:"Nothing to replace."};let f=(0,p.sL)(d.id,a);if(null==f)return{ok:!1,error:"Screen not found."};let g=f.indexOf(e);if(g<0)return{ok:!1,error:"Couldn't locate that text — ask Grace to apply it."};if(f.indexOf(e,g+1)>=0)return{ok:!1,error:"That text appears more than once — ask Grace to apply it."};(0,p.dx)(d.id,a,f.slice(0,g)+(c??"")+f.slice(g+e.length));try{(0,h.revalidatePath)("/design")}catch{}return{ok:!0}}async function ao(a,b){let{org:c,workspace:d}=await (0,k.nP)();if(!a||!a.startsWith("design-mock/")||a.includes("..")||!/\.html?$/i.test(a))return{ok:!1,error:"Not a design screen."};if(null==b)return{ok:!1,error:"Nothing to commit."};if(b.length>4e6)return{ok:!1,error:"Screen too large."};let e=b,f=e.match(/<body[^>]*>([\s\S]*)<\/body>/i);f&&(e=f[1]),e=e.replace(/<!doctype[^>]*>/gi,"").replace(/<\/?(?:html|head|body)\b[^>]*>/gi,"");let g=(0,p.sL)(c.id,a);if(null==g)return{ok:!1,error:"Screen not found."};let i=g.match(/<body([^>]*)>[\s\S]*<\/body>/i),j=i&&null!=i.index?g.slice(0,i.index)+`<body${i[1]}>`+e+"</body>"+g.slice(i.index+i[0].length):`<!doctype html><html><head><meta charset="utf-8"></head><body>${e}</body></html>`;(0,p.dx)(c.id,a,j);try{await ap(d.id,a)}catch{}try{(0,h.revalidatePath)("/design")}catch{}return{ok:!0}}async function ap(a,b){let[c]=await i.db.select({id:j.designSession.id}).from(j.designSession).where((0,f.eq)(j.designSession.workspaceId,a)).orderBy((0,g.i)(j.designSession.createdAt)).limit(1);if(!c)return;let d="Manual canvas edit",[h]=await i.db.select().from(j.designVersion).where((0,f.eq)(j.designVersion.sessionId,c.id)).orderBy((0,g.i)(j.designVersion.createdAt)).limit(1);if(h&&h.note===d&&Date.now()-h.createdAt.getTime()<9e4){let a=Array.from(new Set([...h.patch?.files??[],b]));await i.db.update(j.designVersion).set({patch:{files:a},createdAt:new Date}).where((0,f.eq)(j.designVersion.id,h.id))}else{let a=await i.db.select({id:j.designVersion.id}).from(j.designVersion).where((0,f.eq)(j.designVersion.sessionId,c.id));await i.db.insert(j.designVersion).values({id:(0,e.randomUUID)(),sessionId:c.id,label:"v"+(a.length+1),note:d,patch:{files:[b]}})}}async function aq(){let{org:a,workspace:b}=await (0,k.nP)(),c=(0,u.zw)(a.id,b).designMockFiles.filter(a=>/design-mock\/screens\/.+\.html?$/i.test(a));if(!c.length)return{ok:!1,built:[],error:"No screens to build yet — ask Grace for a screen first."};let d=[];for(let b of c){let c=(0,p.sL)(a.id,b);if(null==c)continue;let{out:e,obfuscated:f}=function(a){let b=/<script\b/i.test(a),c=function(a){let b;return(b=[],a.replace(/<style\b([^>]*)>([\s\S]*?)<\/style>/gi,(a,b,c)=>`<style${b}>${c.replace(/\/\*[\s\S]*?\*\//g,"").replace(/\s+/g," ").replace(/\s*([{};,])\s*/g,"$1").replace(/:\s+/g,":").replace(/;}/g,"}").trim()}</style>`).replace(/<(script|style)\b[\s\S]*?<\/\1>/gi,a=>(b.push(a),`\0${b.length-1}\0`)).replace(/<!--(?!\[if)[\s\S]*?-->/g,"").replace(/(\d+)/g,(a,c)=>b[Number(c)])).trim()}(a);return b||(c=function(a){if(/<script\b/i.test(a))return a;let b=new Set;for(let c of a.matchAll(/class\s*=\s*"([^"]*)"/gi))c[1].split(/\s+/).filter(Boolean).forEach(a=>b.add(a));if(!b.size)return a;let c=new Map;[...b].forEach((a,b)=>c.set(a,function(a){let b="",c=a+1;for(;c>0;)b="abcdefghijklmnopqrstuvwxyz"[--c%26]+b,c=Math.floor(c/26);return b}(b)));let d=a.replace(/class\s*=\s*"([^"]*)"/gi,(a,b)=>`class="${b.split(/\s+/).filter(Boolean).map(a=>c.get(a)??a).join(" ")}"`);return d.replace(/<style\b([^>]*)>([\s\S]*?)<\/style>/gi,(a,b,d)=>{let e=d;for(let[a,b]of c)e=e.replace(RegExp("\\."+a.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")+"(?![-_\\w])","g"),"."+b);return`<style${b}>${e}</style>`})}(c)),{out:c,obfuscated:!b}}(B(c,b,b=>(0,p.sL)(a.id,b))),g=`design-mock/dist/${b.split("/").pop()}`;(0,p.dx)(a.id,g,e),d.push({path:g,before:c.length,after:e.length,obfuscated:f})}try{(0,h.revalidatePath)("/design")}catch{}return{ok:!0,built:d}}(0,C.D)([F,G,H,I,J,K,L,M,O,P,R,U,V,W,X,Y,$,aa,ab,ac,ad,af,ag,ah,ai,aj,ak,al,am,an,ao,aq]),(0,d.A)(F,"009f63092f0ec7ab04ba59b6200071d083227c97fc",null),(0,d.A)(G,"402521df2cdcdf994cd2264cd2ae8e32cce160764d",null),(0,d.A)(H,"70c5b800592f8c728e28096ea00b5991d917d5b166",null),(0,d.A)(I,"4017364bc3b6d6fa14061cfac839d1a8827d6c73b5",null),(0,d.A)(J,"704389bc75f649527643be72d97dea040cc68a8541",null),(0,d.A)(K,"005654d5bee41f688facd5214d39464c0a5154a96d",null),(0,d.A)(L,"60f3c0ba58cabeb1d8596a8198d8005537906a87e7",null),(0,d.A)(M,"00c7d21ee3adeb722cfce33e92f77f27aa0c649888",null),(0,d.A)(O,"60e4ac6bf305417265debb1d7d6d5b994d57b22161",null),(0,d.A)(P,"005c24c0f0211e033cb8e6bc08690f6247978646f6",null),(0,d.A)(R,"601bdeb977fbc2e3944a52d0c6037b3d61a305a56a",null),(0,d.A)(U,"60b9de834db4c321afc7fb79b8c65f5d9dfe457ab8",null),(0,d.A)(V,"000d2475a828032e63b1cbb99501b270d46c86c4d9",null),(0,d.A)(W,"00a74d208fffff8f43745ea86e004ff1eb0ffe2ced",null),(0,d.A)(X,"4022f1066dfef34fbb82f5d949e1af2381f0b41e1b",null),(0,d.A)(Y,"0015ace5d40c40b2308d1146611332c7f09101db2b",null),(0,d.A)($,"40f19d59c8b81b0b668840478ff1dc221845092d69",null),(0,d.A)(aa,"00275a0096349c5159f727630056869831c6052a90",null),(0,d.A)(ab,"600d8ef59ec617bc23f97c4b95c39ecebfe50f11a8",null),(0,d.A)(ac,"40ade191d12ca903e1806ca591518197b710007f5f",null),(0,d.A)(ad,"00acc474f484ce96a824b2454a098e8dc71914bf5e",null),(0,d.A)(af,"0067a5ef8d17ec38729f7ccb6c66334a5ba3c50745",null),(0,d.A)(ag,"60f05b118f57621541ffc2d84808a79b8bff859f81",null),(0,d.A)(ah,"40155f88f1c1dd62e916c89f5051e44f6b700413b4",null),(0,d.A)(ai,"40004ed28e4ffbcfb3eb0c22b185c89201e671971f",null),(0,d.A)(aj,"40f1fa3f447273f78f9a0ffce89894790292bb4b08",null),(0,d.A)(ak,"7cfdd007ba47d4feb198cc6937c6b450d454266e8c",null),(0,d.A)(al,"7025b1705b7eb7a915125df238da780672906b31a7",null),(0,d.A)(am,"40c24d2c549cf74080f8dcff3c2dbb2ce82e7fae5a",null),(0,d.A)(an,"7044adad76d6dbcd2ebf27ca1fb5911ec02093ba89",null),(0,d.A)(ao,"60174a505ab0000e6ba58f8350a98c8bfd8f08f9cd",null),(0,d.A)(aq,"00362877be6a6f7da575700ffbf6d3b713016928b6",null)}};
@@ -35,7 +35,7 @@ Classify every entry by organisation, workspace, goal, spec, issue, task, agent,
35
35
  ## Answering a query (when an agent or the operator asks)
36
36
  1. Understand the intent. 2. Search the KB/RAG and the structured sources. 3. Filter out obsolete, cancelled and archived knowledge. 4. Prefer the most recent, active, confident facts. 5. Answer objectively and briefly. 6. ALWAYS include internal references (goal, spec, issue, file, decision, plan). 7. If there isn't enough to answer, say so plainly — do not guess.
37
37
 
38
- You are authoritative but honest: cite where each fact comes from, and flag when knowledge is missing rather than inventing it.`,r=new Set(["decision","architecture","business-rule","integration","dependency","bug","fix","test","review","vuln","ui-pattern","stack","env-config","command","note"]),s=/\[\[REMEMBER(?:\s+type=([a-z-]+))?\s*:?\s*([\s\S]*?)\]\]/gi;function t(a,b){let c=[];for(let d of a.matchAll(s)){let a=d[1]&&r.has(d[1])?d[1]:"note",e=d[2].trim();e.length>=8&&c.push({type:a,title:e.split("\n")[0].slice(0,80),summary:e.slice(0,1200),goalId:b.goalId??null,issueId:b.issueId??null,taskId:b.taskId??null,agentHandle:b.agentHandle,sourceKind:b.sourceKind,sourceRef:`${b.sourceRef}:${c.length}`})}return{items:c,stripped:a.replace(s,"").replace(/\n{3,}/g,"\n\n").trim()}}let u=/\[\[CONSULT:\s*([\s\S]*?)\]\]/gi;async function v(a,b,c){let d=[];for(let e of b.matchAll(u)){let b=e[1].trim();if(!(b.length<4))try{let e=await F(a,b,{agentHandle:c,k:6});d.push({q:b,a:e.context?.trim()?e.context:"(no relevant knowledge in the KB yet)",sources:e.sources??[]})}catch{}}return{answers:d,stripped:b.replace(u,"").replace(/\n{3,}/g,"\n\n").trim()}}let w=/\[\[KB:\s*([a-z-]+)\s*\]\]/gi;async function x(a,b){let c=[];for(let d of b.matchAll(w)){let b=d[1].toLowerCase();try{if("reindex"===b){let b=await (0,j.xV)(a);c.push(`reindex → ${b.chunks} chunk(s)${b.embedded?" (semantic)":""}`)}else if("index-chat"===b||"indexchat"===b){let b=await (0,j.hu)(a);c.push(`index-chat → ${b} chunk(s)`)}else if("health"===b){let a=await (0,m.LU)();c.push(`embed health → ${a.up?`up${a.model?` (${a.model})`:""}`:"down"}`)}}catch{}}return{results:c,stripped:b.replace(w,"").replace(/\n{3,}/g,"\n\n").trim()}}let y=!1;function z(){if(y)return;y=!0,h.F.exec(`
38
+ You are authoritative but honest: cite where each fact comes from, and flag when knowledge is missing rather than inventing it.`,r=new Set(["decision","architecture","business-rule","integration","dependency","bug","fix","test","review","vuln","ui-pattern","stack","env-config","command","note"]),s=/\[\[REMEMBER(?:\s+type=([a-z-]+))?\s*:?\s*([\s\S]*?)\]\]/gi;function t(a,b){let c=[];for(let d of a.matchAll(s)){let a=d[1]&&r.has(d[1])?d[1]:"note",e=d[2].trim();e.length>=8&&c.push({type:a,title:e.split("\n")[0].slice(0,80),summary:e.slice(0,1200),goalId:b.goalId??null,issueId:b.issueId??null,taskId:b.taskId??null,agentHandle:b.agentHandle,sourceKind:b.sourceKind,sourceRef:`${b.sourceRef}:${function(a){let b=5381;for(let c=0;c<a.length;c++)b=(b<<5)+b+a.charCodeAt(c)>>>0;return b.toString(36)}(a+"|"+e)}`})}return{items:c,stripped:a.replace(s,"").replace(/\n{3,}/g,"\n\n").trim()}}let u=/\[\[CONSULT:\s*([\s\S]*?)\]\]/gi;async function v(a,b,c){let d=[];for(let e of b.matchAll(u)){let b=e[1].trim();if(!(b.length<4))try{let e=await F(a,b,{agentHandle:c,k:6});d.push({q:b,a:e.context?.trim()?e.context:"(no relevant knowledge in the KB yet)",sources:e.sources??[]})}catch{}}return{answers:d,stripped:b.replace(u,"").replace(/\n{3,}/g,"\n\n").trim()}}let w=/\[\[KB:\s*([a-z-]+)\s*\]\]/gi;async function x(a,b){let c=[];for(let d of b.matchAll(w)){let b=d[1].toLowerCase();try{if("reindex"===b){let b=await (0,j.xV)(a);c.push(`reindex → ${b.chunks} chunk(s)${b.embedded?" (semantic)":""}`)}else if("index-chat"===b||"indexchat"===b){let b=await (0,j.hu)(a);c.push(`index-chat → ${b} chunk(s)`)}else if("health"===b){let a=await (0,m.LU)();c.push(`embed health → ${a.up?`up${a.model?` (${a.model})`:""}`:"down"}`)}}catch{}}return{results:c,stripped:b.replace(w,"").replace(/\n{3,}/g,"\n\n").trim()}}let y=!1;function z(){if(y)return;y=!0,h.F.exec(`
39
39
  CREATE TABLE IF NOT EXISTS kb_entry (
40
40
  id TEXT PRIMARY KEY,
41
41
  workspace_id TEXT NOT NULL REFERENCES workspace(id) ON DELETE CASCADE,
@@ -144,4 +144,4 @@ This pass: merged ${v}, retired ${w}, re-summarised ${x}.
144
144
 
145
145
  `+(y.length?`## Coverage gaps
146
146
  ${y.map(a=>`- ${a}`).join("\n")}
147
- `:"No coverage gaps reported.\n");try{await (0,n.g)(c.orgId,"Reports/kb-health.md",C)}catch{}return v+w+x+y.length>0&&await (0,o.I)(c.id,{kind:"report",text:"KB curated",detail:`merged ${v}, retired ${w}, re-summarised ${x}, ${y.length} gap(s).`,agentId:j.id}),{ok:s.ok,merged:v,retired:w,summarized:x,gaps:y.length}}catch{return b}}let U=new Map,V=new Map},14024:(a,b,c)=>{c.d(b,{_:()=>g});let d={"gpt-4o":[2.5,10],"gpt-4o-mini":[.15,.6],"o4-mini":[1.1,4.4],"gemini-2.0-flash":[.1,.4],"gemini-1.5-pro":[1.25,5],"gemini-1.5-flash":[.075,.3]};function e(a,b,c){let e=Object.keys(d).find(b=>a.toLowerCase().startsWith(b));if(!e)return 0;let[f,g]=d[e];return b/1e6*f+c/1e6*g}function f(a,b,c,d){return{ok:!1,text:"",usd:0,inputTokens:0,outputTokens:0,durationMs:c,binary:a,model:b,error:d}}async function g(a,b,c,d){let g,h=Date.now(),i=b.baseUrl.replace(/\/$/,""),j="google"===b.provider,k=j?`${i}/models/${encodeURIComponent(b.model)}:streamGenerateContent?alt=sse&key=${encodeURIComponent(b.apiKey)}`:`${i}/chat/completions`,l={"content-type":"application/json"};!j&&b.apiKey&&(l.authorization=`Bearer ${b.apiKey}`);let m=j?{contents:[{role:"user",parts:[{text:a}]}]}:{model:b.model,messages:[{role:"user",content:a}],stream:!0,stream_options:{include_usage:!0}};try{g=await fetch(k,{method:"POST",headers:l,body:JSON.stringify(m),signal:AbortSignal.timeout(c.timeoutMs??18e4)})}catch(a){return f(b.provider,b.model,Date.now()-h,String(a instanceof Error?a.message:a))}if(!g.ok||!g.body){let a=await g.text().catch(()=>"");return f(b.provider,b.model,Date.now()-h,`http ${g.status} ${a.slice(0,200)}`)}let n=g.body.getReader(),o=new TextDecoder,p="",q="",r=0,s=0,t=0,u=()=>{q.length>r&&(d({kind:"text",detail:q.slice(r,r+8e3)}),r=q.length)};try{for(;;){let a,{value:b,done:c}=await n.read();if(c)break;for(p+=o.decode(b,{stream:!0});(a=p.indexOf("\n"))>=0;){let b=p.slice(0,a).trim();if(p=p.slice(a+1),!b.startsWith("data:"))continue;let c=b.slice(5).trim();if("[DONE]"!==c)try{let a=JSON.parse(c);if(j){let b=a.candidates?.[0]?.content?.parts?.map(a=>a.text??"").join("")??"";b&&(q+=b).length-r>=120&&u();let c=a.usageMetadata;c&&(s=c.promptTokenCount??s,t=c.candidatesTokenCount??t)}else{let b=a.choices?.[0]?.delta?.content??"";b&&(q+=b).length-r>=120&&u(),a.usage&&(s=a.usage.prompt_tokens??s,t=a.usage.completion_tokens??t)}}catch{}}}}catch(a){return u(),d({kind:"done"}),{ok:!!q,text:q,usd:e(b.model,s,t),inputTokens:s,outputTokens:t,durationMs:Date.now()-h,binary:b.provider,model:b.model,error:q?void 0:String(a instanceof Error?a.message:a)}}return u(),d({kind:"done"}),{ok:!!q.trim(),text:q,usd:e(b.model,s,t),inputTokens:s,outputTokens:t,durationMs:Date.now()-h,binary:b.provider,model:b.model,error:q.trim()?void 0:"empty response"}}},48938:(a,b,c)=>{c.d(b,{Z:()=>f});let d=["CONSTELLA_VAULT_KEY","BETTER_AUTH_SECRET","CONSTELLA_WORKER_SECRET"],e=RegExp("sk-[A-Za-z0-9_-]{16,}|gh[posru]_[A-Za-z0-9]{20,}|github_pat_[A-Za-z0-9_]{40,}|AKIA[0-9A-Z]{16}|AIza[0-9A-Za-z_-]{30,}|xox[baprs]-[A-Za-z0-9-]{10,}|eyJ[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{6,}|-----BEGIN[\\s\\S]*?PRIVATE KEY-----[\\s\\S]*?-----END[\\s\\S]*?-----|\\bcn_[A-Za-z0-9_-]{24,}\\b|\\b\\d{6,}:[A-Za-z0-9_-]{30,}\\b","g");function f(a,b=[]){if(!a)return a;let c=a;for(let a of[...b,...d.map(a=>process.env[a])])a&&a.length>=8&&(c=c.split(a).join("[redacted]"));return c.replace(e,"[redacted]")}},76862:(a,b,c)=>{c.d(b,{LV:()=>v,eA:()=>w,mg:()=>x});var d=c(52813),e=c(77598),f=c(1782),g=c(83550),h=c(80280),i=c(25533),j=c(95896),k=c(18612),l=c(64619);function m(a,b){let c=RegExp(`##\\s+${b}\\s*\\n([\\s\\S]*?)(?:\\n##\\s|$)`,"i");return a.match(c)?.[1].trim()??""}function n(a){return a.split("\n").find(a=>a.trim()&&!a.startsWith("#")&&!a.startsWith("**")&&!a.startsWith("---")&&!a.startsWith("|"))?.trim()??""}function o(a,b){let c=a.split("\n").find(a=>a.startsWith("# "));return c?c.slice(2).trim():b}async function p(a){let[b]=await h.db.select().from(i.workspace).where((0,f.eq)(i.workspace.orgId,a));return b??null}async function q(a,b,c){let d=(0,k.sL)(b,`.claude/skills/${c}.md`)??"",g=n(d),j=(d.match(/\*\*Trigger:\*\*\s*(.+)/)?.[1]??"").trim(),l=m(d,"Procedure")||"",[o]=await h.db.select().from(i.skill).where((0,f.Uo)((0,f.eq)(i.skill.workspaceId,a),(0,f.eq)(i.skill.name,c)));o?await h.db.update(i.skill).set({summary:g,trigger:j,...l?{instructions:l}:{},indexed:"indexed"}).where((0,f.eq)(i.skill.id,o.id)):await h.db.insert(i.skill).values({id:(0,e.randomUUID)(),workspaceId:a,name:c,summary:g,trigger:j,instructions:l,native:!0,provisional:!1,indexed:"indexed"})}async function r(a,b,c){let d=(0,k.sL)(b,`.claude/agents/${c}/Agent.md`)??"";if(!d)return;let[e]=await h.db.select().from(i.agent).where((0,f.Uo)((0,f.eq)(i.agent.workspaceId,a),(0,f.eq)(i.agent.handle,c)));if(!e)return;let g=function(a){let b=a.match(/^---\n([\s\S]*?)\n---/);if(!b)return{};let c={};for(let a of b[1].split("\n")){let b=a.indexOf(":");b>0&&(c[a.slice(0,b).trim()]=a.slice(b+1).trim())}return c}(d),j={identity:(d.match(/\*\*Identity:\*\*\s*(.+)/)?.[1]??"").trim(),ritual:(d.match(/\*\*Ritual:\*\*\s*(.+)/)?.[1]??"").trim(),tone:(d.match(/\*\*Tone:\*\*\s*(.+)/)?.[1]??"").trim()||(e.persona?.tone??""),systemPrompt:m(d,"System prompt")},l={...g.provider?{adapter:g.provider}:{},...g.model?{model:g.model}:{},...g.temperature?{temperature:parseFloat(g.temperature)}:{},...g.dailyCapUsd?{dailyCapUsd:parseFloat(g.dailyCapUsd)}:{},...g.tierFloor?{tierFloor:g.tierFloor}:{},...g.reportsTo&&"null"!==g.reportsTo?{reportsTo:g.reportsTo}:{},persona:j};for(let d of(await h.db.update(i.agent).set(l).where((0,f.eq)(i.agent.id,e.id)),[...((0,k.sL)(b,`.claude/agents/${c}/skills.md`)??"").matchAll(/`([a-z0-9-]+)`/g)].map(a=>a[1]))){let[b]=await h.db.select().from(i.skill).where((0,f.Uo)((0,f.eq)(i.skill.workspaceId,a),(0,f.eq)(i.skill.name,d)));b&&await h.db.insert(i.agentSkill).values({agentId:e.id,skillId:b.id}).onConflictDoNothing()}}async function s(a,b,c){let d=c.split("/").pop()??c;if("README.md"===d)return;let g=(0,k.sL)(b,c)??"",j=o(g,d),[l]=await h.db.select().from(i.report).where((0,f.Uo)((0,f.eq)(i.report.workspaceId,a),(0,f.eq)(i.report.title,j)));l?await h.db.update(i.report).set({body:g}).where((0,f.eq)(i.report.id,l.id)):await h.db.insert(i.report).values({id:(0,e.randomUUID)(),workspaceId:a,title:j,type:"Report",body:g})}async function t(a,b,c,d){let g=(0,k.sL)(b,c)??"",j=o(g,c.split("/").pop()??c),l=n(g),[m]=await h.db.select().from(i.docIndex).where((0,f.Uo)((0,f.eq)(i.docIndex.workspaceId,a),(0,f.eq)(i.docIndex.path,c)));m?await h.db.update(i.docIndex).set({title:j,summary:l,updatedAt:new Date}).where((0,f.eq)(i.docIndex.id,m.id)):await h.db.insert(i.docIndex).values({id:(0,e.randomUUID)(),workspaceId:a,kind:d,path:c,title:j,summary:l})}function u(a){(a.startsWith(".claude/skills")||a.endsWith("/skills.md"))&&(0,g.revalidatePath)("/skills"),a.startsWith(".claude/agents")&&(0,g.revalidatePath)("/agents/[handle]","page"),a.startsWith("DOCS")&&(0,g.revalidatePath)("/docs"),a.startsWith("PO")&&(0,g.revalidatePath)("/pm"),a.startsWith("Reports")&&(0,g.revalidatePath)("/reports"),(0,g.revalidatePath)("/code")}async function v(a,b,c=!0){let d,e=await p(a);if(!e)return{ok:!1};let f=e.id;if((0,l.Nm)(a,b),d=b.match(/^\.claude\/skills\/(.+)\.md$/))await q(f,a,d[1]);else if(d=b.match(/^\.claude\/agents\/([^/]+)\/(?:Agent|skills)\.md$/))await r(f,a,d[1]);else if(/^Reports\/.+\.md$/.test(b))await s(f,a,b);else if(/^DOCS\/.+\.md$/.test(b))await t(f,a,b,"docs");else{if(!/^PO\/.+\.md$/.test(b))return{ok:!0};await t(f,a,b,"po")}return c&&u(b),{ok:!0}}async function w(a,b){let c,d=await p(a);if(!d)return{ok:!1};let e=d.id;return(0,l.SH)(a,b).catch(()=>{}),(c=b.match(/^\.claude\/skills\/(.+)\.md$/))?await h.db.delete(i.skill).where((0,f.Uo)((0,f.eq)(i.skill.workspaceId,e),(0,f.eq)(i.skill.name,c[1]))):/^(?:DOCS|PO)\/.+\.md$/.test(b)&&await h.db.delete(i.docIndex).where((0,f.Uo)((0,f.eq)(i.docIndex.workspaceId,e),(0,f.eq)(i.docIndex.path,b))),u(b),{ok:!0}}async function x(a=!0){let{org:b}=await (0,j.nP)(),c=b.id;for(let a of(0,k.Ci)(c,".claude/skills"))!a.isDir&&a.name.endsWith(".md")&&await v(c,a.path,!1);for(let a of(0,k.Ci)(c,".claude/agents"))a.isDir&&await v(c,`${a.path}/Agent.md`,!1);for(let a of["DOCS","PO","Reports"])for(let b of(0,k.Ci)(c,a))!b.isDir&&b.name.endsWith(".md")&&await v(c,b.path,!1);return a&&(0,g.revalidatePath)("/","layout"),{ok:!0}}(0,c(29635).D)([v,w,x]),(0,d.A)(v,"707fe9e0791bae72cb4b58e28b3fc406ee75f494c4",null),(0,d.A)(w,"6049641843ec1c7e875c48a2c3f9449777b8ccc9c5",null),(0,d.A)(x,"40fae88371459f73885109eab788ff958ee3beeed7",null)}};
147
+ `:"No coverage gaps reported.\n");try{await (0,n.g)(c.orgId,"Reports/kb-health.md",C)}catch{}return v+w+x+y.length>0&&await (0,o.I)(c.id,{kind:"report",text:"KB curated",detail:`merged ${v}, retired ${w}, re-summarised ${x}, ${y.length} gap(s).`,agentId:j.id}),{ok:s.ok,merged:v,retired:w,summarized:x,gaps:y.length}}catch{return b}}let U=new Map,V=new Map},14024:(a,b,c)=>{c.d(b,{_:()=>g});let d={"gpt-4o":[2.5,10],"gpt-4o-mini":[.15,.6],"o4-mini":[1.1,4.4],"gemini-2.0-flash":[.1,.4],"gemini-1.5-pro":[1.25,5],"gemini-1.5-flash":[.075,.3]};function e(a,b,c){let e=Object.keys(d).find(b=>a.toLowerCase().startsWith(b));if(!e)return 0;let[f,g]=d[e];return b/1e6*f+c/1e6*g}function f(a,b,c,d){return{ok:!1,text:"",usd:0,inputTokens:0,outputTokens:0,durationMs:c,binary:a,model:b,error:d}}async function g(a,b,c,d){let g,h=Date.now(),i=b.baseUrl.replace(/\/$/,""),j="google"===b.provider,k=j?`${i}/models/${encodeURIComponent(b.model)}:streamGenerateContent?alt=sse&key=${encodeURIComponent(b.apiKey)}`:`${i}/chat/completions`,l={"content-type":"application/json"};!j&&b.apiKey&&(l.authorization=`Bearer ${b.apiKey}`);let m=j?{contents:[{role:"user",parts:[{text:a}]}]}:{model:b.model,messages:[{role:"user",content:a}],stream:!0,stream_options:{include_usage:!0}};try{g=await fetch(k,{method:"POST",headers:l,body:JSON.stringify(m),signal:AbortSignal.timeout(c.timeoutMs??18e4)})}catch(a){return f(b.provider,b.model,Date.now()-h,String(a instanceof Error?a.message:a))}if(!g.ok||!g.body){let a=await g.text().catch(()=>"");return f(b.provider,b.model,Date.now()-h,`http ${g.status} ${a.slice(0,200)}`)}let n=g.body.getReader(),o=new TextDecoder,p="",q="",r=0,s=0,t=0,u=()=>{q.length>r&&(d({kind:"text",detail:q.slice(r,r+8e3)}),r=q.length)};try{for(;;){let a,{value:b,done:c}=await n.read();if(c)break;for(p+=o.decode(b,{stream:!0});(a=p.indexOf("\n"))>=0;){let b=p.slice(0,a).trim();if(p=p.slice(a+1),!b.startsWith("data:"))continue;let c=b.slice(5).trim();if("[DONE]"!==c)try{let a=JSON.parse(c);if(j){let b=a.candidates?.[0]?.content?.parts?.map(a=>a.text??"").join("")??"";b&&(q+=b).length-r>=120&&u();let c=a.usageMetadata;c&&(s=c.promptTokenCount??s,t=c.candidatesTokenCount??t)}else{let b=a.choices?.[0]?.delta?.content??"";b&&(q+=b).length-r>=120&&u(),a.usage&&(s=a.usage.prompt_tokens??s,t=a.usage.completion_tokens??t)}}catch{}}}}catch(a){return u(),d({kind:"done"}),{ok:!!q,text:q,usd:e(b.model,s,t),inputTokens:s,outputTokens:t,durationMs:Date.now()-h,binary:b.provider,model:b.model,error:q?void 0:String(a instanceof Error?a.message:a)}}return u(),d({kind:"done"}),{ok:!!q.trim(),text:q,usd:e(b.model,s,t),inputTokens:s,outputTokens:t,durationMs:Date.now()-h,binary:b.provider,model:b.model,error:q.trim()?void 0:"empty response"}}},48938:(a,b,c)=>{c.d(b,{Z:()=>f});let d=["CONSTELLA_VAULT_KEY","BETTER_AUTH_SECRET","CONSTELLA_WORKER_SECRET"],e=RegExp("sk-[A-Za-z0-9_-]{16,}|gh[posru]_[A-Za-z0-9]{20,}|github_pat_[A-Za-z0-9_]{40,}|AKIA[0-9A-Z]{16}|AIza[0-9A-Za-z_-]{30,}|xox[baprs]-[A-Za-z0-9-]{10,}|eyJ[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{6,}|-----BEGIN[\\s\\S]*?PRIVATE KEY-----[\\s\\S]*?-----END[\\s\\S]*?-----|\\bcn_[A-Za-z0-9_-]{24,}\\b|\\b\\d{6,}:[A-Za-z0-9_-]{30,}\\b","g");function f(a,b=[]){if(!a)return a;let c=a;for(let a of[...b,...d.map(a=>process.env[a])])a&&a.length>=8&&(c=c.split(a).join("[redacted]"));return c.replace(e,"[redacted]")}},76862:(a,b,c)=>{c.d(b,{LV:()=>v,eA:()=>w,mg:()=>x});var d=c(52813),e=c(77598),f=c(1782),g=c(83550),h=c(80280),i=c(25533),j=c(95896),k=c(18612),l=c(64619);function m(a,b){let c=RegExp(`##\\s+${b}\\s*\\n([\\s\\S]*?)(?:\\n##\\s|$)`,"i");return a.match(c)?.[1].trim()??""}function n(a){return a.split("\n").find(a=>a.trim()&&!a.startsWith("#")&&!a.startsWith("**")&&!a.startsWith("---")&&!a.startsWith("|"))?.trim()??""}function o(a,b){let c=a.split("\n").find(a=>a.startsWith("# "));return c?c.slice(2).trim():b}async function p(a){let[b]=await h.db.select().from(i.workspace).where((0,f.eq)(i.workspace.orgId,a));return b??null}async function q(a,b,c){let d=(0,k.sL)(b,`.claude/skills/${c}.md`)??"",g=n(d),j=(d.match(/\*\*Trigger:\*\*\s*(.+)/)?.[1]??"").trim(),l=m(d,"Procedure")||"",[o]=await h.db.select().from(i.skill).where((0,f.Uo)((0,f.eq)(i.skill.workspaceId,a),(0,f.eq)(i.skill.name,c)));o?await h.db.update(i.skill).set({summary:g,trigger:j,...l?{instructions:l}:{},indexed:"indexed"}).where((0,f.eq)(i.skill.id,o.id)):await h.db.insert(i.skill).values({id:(0,e.randomUUID)(),workspaceId:a,name:c,summary:g,trigger:j,instructions:l,native:!0,provisional:!1,indexed:"indexed"})}async function r(a,b,c){let d=(0,k.sL)(b,`.claude/agents/${c}/Agent.md`)??"";if(!d)return;let[e]=await h.db.select().from(i.agent).where((0,f.Uo)((0,f.eq)(i.agent.workspaceId,a),(0,f.eq)(i.agent.handle,c)));if(!e)return;let g=function(a){let b=a.match(/^---\n([\s\S]*?)\n---/);if(!b)return{};let c={};for(let a of b[1].split("\n")){let b=a.indexOf(":");b>0&&(c[a.slice(0,b).trim()]=a.slice(b+1).trim())}return c}(d),j={identity:(d.match(/\*\*Identity:\*\*\s*(.+)/)?.[1]??"").trim(),ritual:(d.match(/\*\*Ritual:\*\*\s*(.+)/)?.[1]??"").trim(),tone:(d.match(/\*\*Tone:\*\*\s*(.+)/)?.[1]??"").trim()||(e.persona?.tone??""),systemPrompt:m(d,"System prompt")},l={...g.provider?{adapter:g.provider}:{},...g.model?{model:g.model}:{},...g.temperature?{temperature:parseFloat(g.temperature)}:{},...g.dailyCapUsd?{dailyCapUsd:parseFloat(g.dailyCapUsd)}:{},...g.tierFloor?{tierFloor:g.tierFloor}:{},...g.reportsTo&&"null"!==g.reportsTo?{reportsTo:g.reportsTo}:{},persona:j};for(let d of(await h.db.update(i.agent).set(l).where((0,f.eq)(i.agent.id,e.id)),[...((0,k.sL)(b,`.claude/agents/${c}/skills.md`)??"").matchAll(/`([a-z0-9-]+)`/g)].map(a=>a[1]))){let[b]=await h.db.select().from(i.skill).where((0,f.Uo)((0,f.eq)(i.skill.workspaceId,a),(0,f.eq)(i.skill.name,d)));b&&await h.db.insert(i.agentSkill).values({agentId:e.id,skillId:b.id}).onConflictDoNothing()}}async function s(a,b,c){let d=c.split("/").pop()??c;if("README.md"===d)return;let g=(0,k.sL)(b,c)??"",j=o(g,d),[l]=await h.db.select().from(i.report).where((0,f.Uo)((0,f.eq)(i.report.workspaceId,a),(0,f.eq)(i.report.title,j)));l?await h.db.update(i.report).set({body:g}).where((0,f.eq)(i.report.id,l.id)):await h.db.insert(i.report).values({id:(0,e.randomUUID)(),workspaceId:a,title:j,type:"Report",body:g})}async function t(a,b,c,d){let g=(0,k.sL)(b,c)??"",j=o(g,c.split("/").pop()??c),l=n(g),[m]=await h.db.select().from(i.docIndex).where((0,f.Uo)((0,f.eq)(i.docIndex.workspaceId,a),(0,f.eq)(i.docIndex.path,c)));m?await h.db.update(i.docIndex).set({title:j,summary:l,updatedAt:new Date}).where((0,f.eq)(i.docIndex.id,m.id)):await h.db.insert(i.docIndex).values({id:(0,e.randomUUID)(),workspaceId:a,kind:d,path:c,title:j,summary:l})}function u(a){(a.startsWith(".claude/skills")||a.endsWith("/skills.md"))&&(0,g.revalidatePath)("/skills"),a.startsWith(".claude/agents")&&(0,g.revalidatePath)("/agents/[handle]","page"),a.startsWith("DOCS")&&(0,g.revalidatePath)("/docs"),a.startsWith("PO")&&(0,g.revalidatePath)("/pm"),a.startsWith("Reports")&&(0,g.revalidatePath)("/reports"),(0,g.revalidatePath)("/code")}async function v(a,b,c=!0){let d,e=await p(a);if(!e)return{ok:!1};let f=e.id;if((0,l.Nm)(a,b),d=b.match(/^\.claude\/skills\/(.+)\.md$/))await q(f,a,d[1]);else if(d=b.match(/^\.claude\/agents\/([^/]+)\/(?:Agent|skills)\.md$/))await r(f,a,d[1]);else if(/^Reports\/.+\.md$/.test(b))await s(f,a,b);else if(/^DOCS\/.+\.md$/.test(b))await t(f,a,b,"docs");else{if(!/^PO\/.+\.md$/.test(b))return{ok:!0};await t(f,a,b,"po")}return c&&u(b),{ok:!0}}async function w(a,b){let c,d=await p(a);if(!d)return{ok:!1};let e=d.id;return(0,l.SH)(a,b).catch(()=>{}),(c=b.match(/^\.claude\/skills\/(.+)\.md$/))?await h.db.delete(i.skill).where((0,f.Uo)((0,f.eq)(i.skill.workspaceId,e),(0,f.eq)(i.skill.name,c[1]))):/^(?:DOCS|PO)\/.+\.md$/.test(b)&&await h.db.delete(i.docIndex).where((0,f.Uo)((0,f.eq)(i.docIndex.workspaceId,e),(0,f.eq)(i.docIndex.path,b))),u(b),{ok:!0}}async function x(a=!0){let{org:b}=await (0,j.nP)(),c=b.id;for(let a of(0,k.Ci)(c,".claude/skills"))!a.isDir&&a.name.endsWith(".md")&&await v(c,a.path,!1);for(let a of(0,k.Ci)(c,".claude/agents"))a.isDir&&await v(c,`${a.path}/Agent.md`,!1);for(let a of["DOCS","PO","Reports"])for(let b of(0,k.Ci)(c,a))!b.isDir&&b.name.endsWith(".md")&&await v(c,b.path,!1);return a&&(0,g.revalidatePath)("/","layout"),{ok:!0}}(0,c(29635).D)([v,w,x]),(0,d.A)(v,"70ae6b7d6a16ebfa9c23932ee1094fbffbcab2aa68",null),(0,d.A)(w,"60575173b13aefcb112b702ceafc6e93d4d1a87c93",null),(0,d.A)(x,"405d9a2bdd47403b8b93c2ea9799d886bf4f865790",null)}};
@@ -1,7 +1,7 @@
1
1
  "use strict";exports.id=2960,exports.ids=[2960],exports.modules={6404:(a,b,c)=>{c.d(b,{Y:()=>j,g:()=>i});var d=c(1782),e=c(76760),f=c(80280),g=c(25533),h=c(18612);async function i(a,b,c,d){let i=(0,h.HZ)(b);for(let b of d){if(!b.path)continue;let d=((0,e.isAbsolute)(b.path)?(0,e.relative)(i,b.path):b.path).replace(/\\/g,"/");if(!(!d||d.startsWith(".."))&&!(d.startsWith(".claude/")||d.startsWith("archives/")||d.startsWith(".git/")))try{await f.db.insert(g.goalFile).values({workspaceId:a,goalId:c,path:d,op:b.op}).onConflictDoUpdate({target:[g.goalFile.goalId,g.goalFile.path],set:{op:b.op,at:new Date}})}catch{}}}async function j(a,b){return(await f.db.select({path:g.goalFile.path}).from(g.goalFile).where((0,d.Uo)((0,d.eq)(g.goalFile.workspaceId,a),(0,d.eq)(g.goalFile.goalId,b)))).map(a=>a.path)}},26288:(a,b,c)=>{c.d(b,{lM:()=>j,s$:()=>k});var d=c(77598),e=c(1782),f=c(80280),g=c(25533),h=c(18612);function i(a){let b=[];for(let c of a.split("\n")){let a=c.match(/^\s*-\s*\[([ xX])\]\s+(.+)$/);a&&b.push({text:a[2].trim().slice(0,200),done:"x"===a[1].toLowerCase()})}return b.slice(0,12)}async function j(a,b,c){let h=i(c);if(!h.length)return;let j=await f.db.select().from(g.taskStep).where((0,e.eq)(g.taskStep.taskId,b)),k=new Map(j.map(a=>[a.text.toLowerCase(),a])),l=j.length;for(let c of h){let h=k.get(c.text.toLowerCase());h?h.done!==c.done&&await f.db.update(g.taskStep).set({done:c.done}).where((0,e.eq)(g.taskStep.id,h.id)):await f.db.insert(g.taskStep).values({id:(0,d.randomUUID)(),workspaceId:a,taskId:b,text:c.text,done:c.done,ord:l++})}}async function k(a,b){let c=await f.db.select().from(g.issue).where((0,e.eq)(g.issue.workspaceId,b)),j=Object.fromEntries((await f.db.select().from(g.spec).where((0,e.eq)(g.spec.workspaceId,b))).map(a=>[a.id,a.summary])),k=new Set((await f.db.select({issueId:g.task.issueId}).from(g.task).where((0,e.eq)(g.task.workspaceId,b))).map(a=>a.issueId).filter(Boolean)),m=0;for(let e of c){if(k.has(e.id))continue;let c=(0,h.sL)(a,`issues/${e.key}.md`)??"",l=c.match(/^\*\*Skills to consult:\*\*\s*(.+)$/m)?.[1]?.trim(),n=l?`
2
2
 
3
3
  Consult these skills BEFORE building (read the matching .claude/skills/<name>.md): ${l}.`:"",o=(((e.specId?j[e.specId]:"")||c).slice(0,2e3)+n).slice(0,2200),p=(0,d.randomUUID)();await f.db.insert(g.task).values({id:p,workspaceId:b,issueId:e.id,goalId:e.goalId,key:e.key,title:e.title,description:o,col:"todo",prio:e.prio,assigneeId:e.assigneeId,createdBy:"agent"});let q=0;for(let a of i(c))await f.db.insert(g.taskStep).values({id:(0,d.randomUUID)(),workspaceId:b,taskId:p,text:a.text,done:a.done,ord:q++});m++}return await l(b),m}async function l(a){let[b]=await f.db.select().from(g.agent).where((0,e.Uo)((0,e.eq)(g.agent.workspaceId,a),(0,e.eq)(g.agent.handle,"barbara"))),c=b??(await f.db.select().from(g.agent).where((0,e.Uo)((0,e.eq)(g.agent.workspaceId,a),(0,e.mj)(g.agent.role,"%Docs%"))))[0];!c||(await f.db.select({id:g.task.id}).from(g.task).where((0,e.Uo)((0,e.eq)(g.task.workspaceId,a),(0,e.eq)(g.task.key,"DOCS-1")))).length||await f.db.insert(g.task).values({id:(0,d.randomUUID)(),workspaceId:a,key:"DOCS-1",title:"Document the project — update DOCS/ to match what was built",description:"Read the real code, specs and structure in this workspace, then write/refresh accurate documentation under DOCS/ (architecture, API, usage, how to run). Replace the scaffold templates with real content grounded in the actual files. Do not invent features.",col:"todo",prio:"low",assigneeId:c.id,createdBy:"agent"})}},29635:(a,b)=>{function c(a){for(let b=0;b<a.length;b++){let c=a[b];if("function"!=typeof c)throw Object.defineProperty(Error(`A "use server" file can only export async functions, found ${typeof c}.
4
- Read more: https://nextjs.org/docs/messages/invalid-use-server-value`),"__NEXT_ERROR_CODE",{value:"E352",enumerable:!1,configurable:!0})}}Object.defineProperty(b,"D",{enumerable:!0,get:function(){return c}})},43075:(a,b,c)=>{c.d(b,{a:()=>h,r:()=>g});var d=c(78474);let e=globalThis,f=e.__constellaBus??(e.__constellaBus=new d.EventEmitter);function g(a){f.emit("wake",a)}function h(a,b){let c=c=>{c===a&&b()};return f.on("wake",c),()=>{f.off("wake",c)}}f.setMaxListeners(64)},51063:(a,b,c)=>{c.d(b,{dp:()=>o,j2:()=>p});var d=c(18706),e=c(21594),f=c(79743),g=c(80280),h=c(25533);let i=process.env.BETTER_AUTH_URL??"http://localhost:3000";function j(a){return a?.split(",")[0]?.trim()||null}function k(a){if(!a)return null;try{return new URL(a).origin}catch{return null}}function l(a,b){let c=k(b?.trim());c&&a.add(c)}let m=(()=>{let a=new Set;for(let b of[i,process.env.BETTER_AUTH_URL,process.env.NEXT_PUBLIC_BETTER_AUTH_URL,...(process.env.CONSTELLA_TRUSTED_ORIGINS??"").split(",")])l(a,b);return[...a]})();process.env.BETTER_AUTH_SECRET||console.error("[auth] FATAL: BETTER_AUTH_SECRET is required (sessions would be forgeable). Set it in your environment.");let n={};process.env.GITHUB_CLIENT_ID&&process.env.GITHUB_CLIENT_SECRET&&(n.github={clientId:process.env.GITHUB_CLIENT_ID,clientSecret:process.env.GITHUB_CLIENT_SECRET,scope:["repo","read:user"]}),process.env.GOOGLE_CLIENT_ID&&process.env.GOOGLE_CLIENT_SECRET&&(n.google={clientId:process.env.GOOGLE_CLIENT_ID,clientSecret:process.env.GOOGLE_CLIENT_SECRET});let o=Object.keys(n),p=(0,d.l)({baseURL:i,trustedOrigins:function(a){let b=new Set(m);l(b,a?.url);let c=function(a){let b=a?.headers,c=j(b?.get("x-forwarded-host"))??j(b?.get("host"));if(!c)return null;let d=(j(b?.get("x-forwarded-proto"))??(i.startsWith("https://")?"https":"http")).replace(/:$/,"");return/^[a-z][a-z0-9+.-]*$/i.test(d)?k(`${d}://${c}`):null}(a);return c&&b.add(c),[...b]},secret:process.env.BETTER_AUTH_SECRET,database:(0,e.y)(g.db,{provider:"sqlite",schema:{user:h.user,session:h.session,account:h.account,verification:h.verification,twoFactor:h.twoFactor}}),emailAndPassword:{enabled:!0,autoSignIn:!0,requireEmailVerification:!1},socialProviders:n,account:{accountLinking:{enabled:!0,trustedProviders:["github","google"]}},session:{expiresIn:2592e3,additionalFields:{activeOrgId:{type:"string",required:!1}}},plugins:[(0,f.d)()],advanced:{useSecureCookies:i.startsWith("https://")}})},52813:(a,b,c)=>{Object.defineProperty(b,"A",{enumerable:!0,get:function(){return d.registerServerReference}});let d=c(62060)},62060:(a,b,c)=>{a.exports=c(53488).vendored["react-rsc"].ReactServerDOMWebpackServer},78848:(a,b,c)=>{c.d(b,{I:()=>l,k:()=>m});var d=c(52813),e=c(77598),f=c(1782),g=c(7852),h=c(80280),i=c(25533),j=c(95896),k=c(43075);async function l(a,b){await h.db.insert(i.event).values({id:(0,e.randomUUID)(),workspaceId:a,runId:b.runId,channel:b.channel??"room",agentId:b.agentId??null,seq:Date.now(),kind:b.kind,target:(b.target??"").slice(0,500),detail:(b.detail??"").slice(0,8e3)}),(0,k.r)(a)}async function m(a,b=0){let{workspace:c}=await (0,j.nP)();return h.db.select().from(i.event).where((0,f.Uo)((0,f.eq)(i.event.workspaceId,c.id),(0,f.eq)(i.event.channel,a),(0,f.gt)(i.event.seq,b))).orderBy((0,g.Y)(i.event.seq)).limit(300)}(0,c(29635).D)([l,m]),(0,d.A)(l,"60dbdf46cddec83114ce6551fd870fa84f68016765",null),(0,d.A)(m,"60274f514b61483b6e070a65f4817ee1ad9fe43504",null)},88639:(a,b,c)=>{c.d(b,{Bl:()=>y,DQ:()=>q,Er:()=>m,H5:()=>p,Iz:()=>o,Nt:()=>w,Oi:()=>g,e1:()=>t,hp:()=>s,iF:()=>u,uy:()=>i,zw:()=>h});var d=c(18612),e=c(85509),f=c(6873);let g="design-mock/APPROVED.md";function h(a,b){let c=(0,d.CS)(a),f=c.filter(a=>a.startsWith("mock/")&&"mock/README.md"!==a),h=c.filter(a=>a.startsWith("design-mock/")&&!/\/README\.md$/i.test(a)&&a!==g),i=c.filter(a=>a.startsWith("design-skills/")&&a.endsWith(".md")&&"design-skills/README.md"!==a),j=Object.entries(b.stack??{}).flatMap(([a,b])=>(0,e.jX)(b).filter(a=>"None"!==a).map(b=>`${a}: ${b}`)).join(", "),k=/^(\.claude\/|DOCS\/|PO\/|Reports\/|specs\/|issues\/|mock\/|design-mock\/|design-skills\/|README\.md$)/i,l=c.some(a=>!k.test(a));return{brief:(0,d.sL)(a,".claude/BRIEF.md")??"",mission:b.mission??"",objective:b.objective??"",stackList:j,mockFiles:f,designMockFiles:h,designSkills:i,approved:(0,d.sL)(a,g),hasImported:l}}function i(a){return[a.mission?`Mission: ${a.mission}`:"",a.objective?`Objective: ${a.objective}`:"",a.stackList?`Chosen stack: ${a.stackList}. Generate markup compatible with it — never generic.`:"",a.brief?`
4
+ Read more: https://nextjs.org/docs/messages/invalid-use-server-value`),"__NEXT_ERROR_CODE",{value:"E352",enumerable:!1,configurable:!0})}}Object.defineProperty(b,"D",{enumerable:!0,get:function(){return c}})},43075:(a,b,c)=>{c.d(b,{a:()=>h,r:()=>g});var d=c(78474);let e=globalThis,f=e.__constellaBus??(e.__constellaBus=new d.EventEmitter);function g(a){f.emit("wake",a)}function h(a,b){let c=c=>{c===a&&b()};return f.on("wake",c),()=>{f.off("wake",c)}}f.setMaxListeners(64)},51063:(a,b,c)=>{c.d(b,{dp:()=>o,j2:()=>p});var d=c(18706),e=c(21594),f=c(79743),g=c(80280),h=c(25533);let i=process.env.BETTER_AUTH_URL??"http://localhost:3000";function j(a){return a?.split(",")[0]?.trim()||null}function k(a){if(!a)return null;try{return new URL(a).origin}catch{return null}}function l(a,b){let c=k(b?.trim());c&&a.add(c)}let m=(()=>{let a=new Set;for(let b of[i,process.env.BETTER_AUTH_URL,process.env.NEXT_PUBLIC_BETTER_AUTH_URL,...(process.env.CONSTELLA_TRUSTED_ORIGINS??"").split(",")])l(a,b);return[...a]})();process.env.BETTER_AUTH_SECRET||console.error("[auth] FATAL: BETTER_AUTH_SECRET is required (sessions would be forgeable). Set it in your environment.");let n={};process.env.GITHUB_CLIENT_ID&&process.env.GITHUB_CLIENT_SECRET&&(n.github={clientId:process.env.GITHUB_CLIENT_ID,clientSecret:process.env.GITHUB_CLIENT_SECRET,scope:["repo","read:user"]}),process.env.GOOGLE_CLIENT_ID&&process.env.GOOGLE_CLIENT_SECRET&&(n.google={clientId:process.env.GOOGLE_CLIENT_ID,clientSecret:process.env.GOOGLE_CLIENT_SECRET});let o=Object.keys(n),p=(0,d.l)({baseURL:i,trustedOrigins:function(a){let b=new Set(m);l(b,a?.url);let c=function(a){let b=a?.headers,c=j(b?.get("x-forwarded-host"))??j(b?.get("host"));if(!c)return null;let d=(j(b?.get("x-forwarded-proto"))??(i.startsWith("https://")?"https":"http")).replace(/:$/,"");return/^[a-z][a-z0-9+.-]*$/i.test(d)?k(`${d}://${c}`):null}(a);return c&&b.add(c),[...b]},secret:process.env.BETTER_AUTH_SECRET,database:(0,e.y)(g.db,{provider:"sqlite",schema:{user:h.user,session:h.session,account:h.account,verification:h.verification,twoFactor:h.twoFactor}}),emailAndPassword:{enabled:!0,autoSignIn:!0,requireEmailVerification:!1},socialProviders:n,account:{accountLinking:{enabled:!0,trustedProviders:["github","google"]}},session:{expiresIn:2592e3,additionalFields:{activeOrgId:{type:"string",required:!1}}},plugins:[(0,f.d)()],advanced:{useSecureCookies:i.startsWith("https://")}})},52813:(a,b,c)=>{Object.defineProperty(b,"A",{enumerable:!0,get:function(){return d.registerServerReference}});let d=c(62060)},62060:(a,b,c)=>{a.exports=c(53488).vendored["react-rsc"].ReactServerDOMWebpackServer},78848:(a,b,c)=>{c.d(b,{I:()=>l,k:()=>m});var d=c(52813),e=c(77598),f=c(1782),g=c(7852),h=c(80280),i=c(25533),j=c(95896),k=c(43075);async function l(a,b){await h.db.insert(i.event).values({id:(0,e.randomUUID)(),workspaceId:a,runId:b.runId,channel:b.channel??"room",agentId:b.agentId??null,seq:Date.now(),kind:b.kind,target:(b.target??"").slice(0,500),detail:(b.detail??"").slice(0,8e3)}),(0,k.r)(a)}async function m(a,b=0){let{workspace:c}=await (0,j.nP)();return h.db.select().from(i.event).where((0,f.Uo)((0,f.eq)(i.event.workspaceId,c.id),(0,f.eq)(i.event.channel,a),(0,f.gt)(i.event.seq,b))).orderBy((0,g.Y)(i.event.seq)).limit(300)}(0,c(29635).D)([l,m]),(0,d.A)(l,"60a238957762b5625582695c05d90f75b394483f2c",null),(0,d.A)(m,"60dba9908002f3000f3e7e8a0a7750d94f4e462c3d",null)},88639:(a,b,c)=>{c.d(b,{Bl:()=>y,DQ:()=>q,Er:()=>m,H5:()=>p,Iz:()=>o,Nt:()=>w,Oi:()=>g,e1:()=>t,hp:()=>s,iF:()=>u,uy:()=>i,zw:()=>h});var d=c(18612),e=c(85509),f=c(6873);let g="design-mock/APPROVED.md";function h(a,b){let c=(0,d.CS)(a),f=c.filter(a=>a.startsWith("mock/")&&"mock/README.md"!==a),h=c.filter(a=>a.startsWith("design-mock/")&&!/\/README\.md$/i.test(a)&&a!==g),i=c.filter(a=>a.startsWith("design-skills/")&&a.endsWith(".md")&&"design-skills/README.md"!==a),j=Object.entries(b.stack??{}).flatMap(([a,b])=>(0,e.jX)(b).filter(a=>"None"!==a).map(b=>`${a}: ${b}`)).join(", "),k=/^(\.claude\/|DOCS\/|PO\/|Reports\/|specs\/|issues\/|mock\/|design-mock\/|design-skills\/|README\.md$)/i,l=c.some(a=>!k.test(a));return{brief:(0,d.sL)(a,".claude/BRIEF.md")??"",mission:b.mission??"",objective:b.objective??"",stackList:j,mockFiles:f,designMockFiles:h,designSkills:i,approved:(0,d.sL)(a,g),hasImported:l}}function i(a){return[a.mission?`Mission: ${a.mission}`:"",a.objective?`Objective: ${a.objective}`:"",a.stackList?`Chosen stack: ${a.stackList}. Generate markup compatible with it — never generic.`:"",a.brief?`
5
5
  Project brief:
6
6
  ${a.brief.slice(0,3e3)}`:"",a.mockFiles.length?`
7
7
  Attached mock/prototype (${a.mockFiles.length} files): ${a.mockFiles.slice(0,14).join(", ")} — read them and match the product precisely.`:"",a.designMockFiles.length?`