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.
- package/.next/BUILD_ID +1 -1
- package/.next/app-path-routes-manifest.json +3 -3
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +3 -3
- package/.next/server/app/(app)/activity/page.js +2 -2
- package/.next/server/app/(app)/activity/page.js.nft.json +1 -1
- package/.next/server/app/(app)/activity/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/agents/[handle]/page.js +2 -2
- package/.next/server/app/(app)/agents/[handle]/page.js.nft.json +1 -1
- package/.next/server/app/(app)/agents/[handle]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/code/page.js +2 -2
- package/.next/server/app/(app)/code/page.js.nft.json +1 -1
- package/.next/server/app/(app)/code/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/config/page.js +2 -2
- package/.next/server/app/(app)/config/page.js.nft.json +1 -1
- package/.next/server/app/(app)/config/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/costs/page.js +2 -2
- package/.next/server/app/(app)/costs/page.js.nft.json +1 -1
- package/.next/server/app/(app)/costs/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/cron/page.js +2 -2
- package/.next/server/app/(app)/cron/page.js.nft.json +1 -1
- package/.next/server/app/(app)/cron/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/dashboard/page.js +2 -2
- package/.next/server/app/(app)/dashboard/page.js.nft.json +1 -1
- package/.next/server/app/(app)/dashboard/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/design/page.js +44 -44
- package/.next/server/app/(app)/design/page.js.nft.json +1 -1
- package/.next/server/app/(app)/design/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/docs/[id]/page.js +2 -2
- package/.next/server/app/(app)/docs/[id]/page.js.nft.json +1 -1
- package/.next/server/app/(app)/docs/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/docs/page.js +2 -2
- package/.next/server/app/(app)/docs/page.js.nft.json +1 -1
- package/.next/server/app/(app)/docs/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/github/page.js +2 -2
- package/.next/server/app/(app)/github/page.js.nft.json +1 -1
- package/.next/server/app/(app)/github/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/goals/page.js +2 -2
- package/.next/server/app/(app)/goals/page.js.nft.json +1 -1
- package/.next/server/app/(app)/goals/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/inbox/page.js +2 -2
- package/.next/server/app/(app)/inbox/page.js.nft.json +1 -1
- package/.next/server/app/(app)/inbox/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/knowledge/page.js +3 -3
- package/.next/server/app/(app)/knowledge/page.js.nft.json +1 -1
- package/.next/server/app/(app)/knowledge/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/models/page.js +2 -2
- package/.next/server/app/(app)/models/page.js.nft.json +1 -1
- package/.next/server/app/(app)/models/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/notifications/page.js +2 -2
- package/.next/server/app/(app)/notifications/page.js.nft.json +1 -1
- package/.next/server/app/(app)/notifications/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/org/page.js +5 -5
- package/.next/server/app/(app)/org/page.js.nft.json +1 -1
- package/.next/server/app/(app)/org/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/organizations/page.js +2 -2
- package/.next/server/app/(app)/organizations/page.js.nft.json +1 -1
- package/.next/server/app/(app)/organizations/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/page.js +3 -3
- package/.next/server/app/(app)/page.js.nft.json +1 -1
- package/.next/server/app/(app)/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/planner/page.js +3 -3
- package/.next/server/app/(app)/planner/page.js.nft.json +1 -1
- package/.next/server/app/(app)/planner/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/plugins/page.js +2 -2
- package/.next/server/app/(app)/plugins/page.js.nft.json +1 -1
- package/.next/server/app/(app)/plugins/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/pm/page.js +2 -2
- package/.next/server/app/(app)/pm/page.js.nft.json +1 -1
- package/.next/server/app/(app)/pm/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/prepare-deploy/page.js +6 -6
- package/.next/server/app/(app)/prepare-deploy/page.js.nft.json +1 -1
- package/.next/server/app/(app)/prepare-deploy/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/profile/page.js +2 -2
- package/.next/server/app/(app)/profile/page.js.nft.json +1 -1
- package/.next/server/app/(app)/profile/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/pulse/page.js +2 -2
- package/.next/server/app/(app)/pulse/page.js.nft.json +1 -1
- package/.next/server/app/(app)/pulse/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/reports/[id]/page.js +2 -2
- package/.next/server/app/(app)/reports/[id]/page.js.nft.json +1 -1
- package/.next/server/app/(app)/reports/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/reports/page.js +3 -3
- package/.next/server/app/(app)/reports/page.js.nft.json +1 -1
- package/.next/server/app/(app)/reports/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/routines/page.js +2 -2
- package/.next/server/app/(app)/routines/page.js.nft.json +1 -1
- package/.next/server/app/(app)/routines/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/search/page.js +2 -2
- package/.next/server/app/(app)/search/page.js.nft.json +1 -1
- package/.next/server/app/(app)/search/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/security/page.js +2 -2
- package/.next/server/app/(app)/security/page.js.nft.json +1 -1
- package/.next/server/app/(app)/security/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/skills/page.js +2 -2
- package/.next/server/app/(app)/skills/page.js.nft.json +1 -1
- package/.next/server/app/(app)/skills/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/tasks/page.js +2 -2
- package/.next/server/app/(app)/tasks/page.js.nft.json +1 -1
- package/.next/server/app/(app)/tasks/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/test-dev/page.js +2 -2
- package/.next/server/app/(app)/test-dev/page.js.nft.json +1 -1
- package/.next/server/app/(app)/test-dev/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/update/page.js +3 -3
- package/.next/server/app/(app)/update/page.js.nft.json +1 -1
- package/.next/server/app/(app)/update/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(auth)/login/page.js +2 -2
- package/.next/server/app/(auth)/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(auth)/onboarding/page.js +2 -2
- package/.next/server/app/(auth)/onboarding/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +3 -3
- package/.next/server/app/_global-error.segments/_full.segment.rsc +3 -3
- package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_index.segment.rsc +2 -2
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/api/cron/tick/route.js +16 -16
- package/.next/server/app/api/locks/acquire/route.js +1 -1
- package/.next/server/app/api/sync/file/route.js +1 -1
- package/.next/server/app/api/telegram/poll/route.js +11 -11
- package/.next/server/app/api/upload/route.js +1 -1
- package/.next/server/app/api/v1/[[...path]]/route.js +1 -1
- package/.next/server/app-paths-manifest.json +3 -3
- package/.next/server/chunks/1249.js +14 -14
- package/.next/server/chunks/158.js +21 -0
- package/.next/server/chunks/1765.js +1 -0
- package/.next/server/chunks/2495.js +1 -0
- package/.next/server/chunks/2517.js +1 -1
- package/.next/server/chunks/259.js +9 -9
- package/.next/server/chunks/2867.js +2 -2
- package/.next/server/chunks/2960.js +1 -1
- package/.next/server/chunks/3131.js +1 -1
- package/.next/server/chunks/3234.js +4 -4
- package/.next/server/chunks/4467.js +12 -0
- package/.next/server/chunks/4619.js +1 -1
- package/.next/server/chunks/4979.js +12 -12
- package/.next/server/chunks/535.js +1 -0
- package/.next/server/chunks/6431.js +1 -1
- package/.next/server/chunks/7225.js +4 -0
- package/.next/server/chunks/7336.js +1 -1
- package/.next/server/chunks/7589.js +3 -3
- package/.next/server/chunks/7989.js +1 -1
- package/.next/server/chunks/850.js +1 -1
- package/.next/server/chunks/8561.js +3 -3
- package/.next/server/chunks/8623.js +1 -1
- package/.next/server/chunks/8719.js +417 -0
- package/.next/server/chunks/8823.js +1 -1
- package/.next/server/chunks/9783.js +3 -3
- package/.next/server/chunks/9969.js +1 -1
- package/.next/server/instrumentation.js +1 -1
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/2831-d7f6495bf43f4f9d.js +4 -0
- package/.next/static/chunks/3219-486bddbf87074d04.js +1 -0
- package/.next/static/chunks/3775-82dcdf23109aa5bf.js +1 -0
- package/.next/static/chunks/6836-341614c5418e2aa4.js +1 -0
- package/.next/static/chunks/8306-7418693cd7fd5861.js +1 -0
- package/.next/static/chunks/8370-8b3e7106703024ce.js +12 -0
- package/.next/static/chunks/9690-ea874aec65263b9d.js +1 -0
- package/.next/static/chunks/app/(app)/activity/{page-09bc1c776962737c.js → page-cf8d67941440bdce.js} +1 -1
- package/.next/static/chunks/app/(app)/agents/[handle]/page-7baa24f1ae8bc400.js +1 -0
- package/.next/static/chunks/app/(app)/code/page-b342d74807e8b914.js +1 -0
- package/.next/static/chunks/app/(app)/config/page-1e68ba8d20215d67.js +1 -0
- package/.next/static/chunks/app/(app)/costs/page-a58d759eec6048df.js +1 -0
- package/.next/static/chunks/app/(app)/cron/page-cc7f4e3d8ab5618f.js +1 -0
- package/.next/static/chunks/app/(app)/dashboard/page-7757c33acf751c4c.js +1 -0
- package/.next/static/chunks/app/(app)/design/{page-d457cdfa525acb85.js → page-f48c0487d240248e.js} +3 -3
- package/.next/static/chunks/app/(app)/docs/[id]/page-95c52cf457d869ef.js +1 -0
- package/.next/static/chunks/app/(app)/docs/page-fbc50cd357d5e2ca.js +1 -0
- package/.next/static/chunks/app/(app)/github/page-dac138256ed91e65.js +1 -0
- package/.next/static/chunks/app/(app)/goals/page-f87d40f6832d63b3.js +1 -0
- package/.next/static/chunks/app/(app)/inbox/page-49c1293e0d98874f.js +12 -0
- package/.next/static/chunks/app/(app)/knowledge/page-18fca436883ed5cc.js +1 -0
- package/.next/static/chunks/app/(app)/layout-c9778f98c0103f74.js +1 -0
- package/.next/static/chunks/app/(app)/models/page-030c085cd7767495.js +1 -0
- package/.next/static/chunks/app/(app)/notifications/page-12af3fee8b36a00e.js +12 -0
- package/.next/static/chunks/app/(app)/org/page-576001ff4a820744.js +12 -0
- package/.next/static/chunks/app/(app)/organizations/page-b973e1eee6e56baf.js +1 -0
- package/.next/static/chunks/app/(app)/page-cef52fc5f4fd4418.js +1 -0
- package/.next/static/chunks/app/(app)/planner/page-da2db56914346192.js +1 -0
- package/.next/static/chunks/app/(app)/plugins/page-3b78b76ecb21d616.js +1 -0
- package/.next/static/chunks/app/(app)/pm/page-78303379c1ea5dc5.js +1 -0
- package/.next/static/chunks/app/(app)/prepare-deploy/page-98b1bd3bf712bb60.js +1 -0
- package/.next/static/chunks/app/(app)/profile/page-de24af53de0ef2b2.js +1 -0
- package/.next/static/chunks/app/(app)/pulse/page-db7fd63369c01fa2.js +1 -0
- package/.next/static/chunks/app/(app)/reports/[id]/page-cc7f4e3d8ab5618f.js +1 -0
- package/.next/static/chunks/app/(app)/reports/page-97ab95e6f8b77b62.js +1 -0
- package/.next/static/chunks/app/(app)/routines/{page-cf4e597389865ae8.js → page-cf6a3331775ca11b.js} +1 -1
- package/.next/static/chunks/app/(app)/search/page-3960825f66b05606.js +1 -0
- package/.next/static/chunks/app/(app)/security/page-53b0770355cf7aa4.js +1 -0
- package/.next/static/chunks/app/(app)/skills/page-809a73b94861f8b8.js +1 -0
- package/.next/static/chunks/app/(app)/tasks/page-b2497927d127f7aa.js +1 -0
- package/.next/static/chunks/app/(app)/test-dev/page-93ec5d89e2afb612.js +1 -0
- package/.next/static/chunks/app/(app)/update/page-a23322af4e59a93c.js +1 -0
- package/.next/static/chunks/app/(auth)/login/page-446681bfb762cb05.js +1 -0
- package/.next/static/chunks/app/(auth)/onboarding/page-2b8cb3e0b024c995.js +1 -0
- package/.next/trace-build +1 -1
- package/CHANGELOG.md +50 -0
- package/README.md +7 -1
- package/README.pt-BR.md +7 -1
- package/bin/constella-update.mjs +19 -7
- package/bin/constella.mjs +1 -1
- package/bin/worker.mjs +1 -0
- package/docs/UPDATE.md +17 -2
- package/docs/roadmap.md +36 -0
- package/package.json +1 -1
- package/scripts/i18n-parity.mjs +1 -1
- package/scripts/install.sh +4 -2
- package/scripts/publish-public.mjs +12 -3
- package/scripts/vps-clean.sh +1 -1
- package/scripts/vps-install.sh +24 -7
- package/scripts/vps-update.sh +27 -16
- package/.next/server/chunks/319.js +0 -1
- package/.next/server/chunks/4828.js +0 -1
- package/.next/server/chunks/5697.js +0 -1
- package/.next/server/chunks/6151.js +0 -12
- package/.next/server/chunks/6798.js +0 -21
- package/.next/server/chunks/6903.js +0 -417
- package/.next/server/chunks/8486.js +0 -4
- package/.next/static/chunks/3219-9684aa1c634212de.js +0 -1
- package/.next/static/chunks/4353-12629098ed83e468.js +0 -1
- package/.next/static/chunks/4398-e798770ae782576f.js +0 -1
- package/.next/static/chunks/4428-09f7d473d9e33d59.js +0 -1
- package/.next/static/chunks/7457-c37382c6f4e115f8.js +0 -4
- package/.next/static/chunks/8370-6da6aa10d687b8ae.js +0 -12
- package/.next/static/chunks/9690-00ad96a74abac075.js +0 -1
- package/.next/static/chunks/app/(app)/agents/[handle]/page-b11e5f8f25fb2f88.js +0 -1
- package/.next/static/chunks/app/(app)/code/page-ff6925db6e10e3cc.js +0 -1
- package/.next/static/chunks/app/(app)/config/page-4df2facd9c81adb5.js +0 -1
- package/.next/static/chunks/app/(app)/costs/page-c0a07c0283731a8c.js +0 -1
- package/.next/static/chunks/app/(app)/cron/page-662e6e1a25b14025.js +0 -1
- package/.next/static/chunks/app/(app)/dashboard/page-e6f62eaecc0f9926.js +0 -1
- package/.next/static/chunks/app/(app)/docs/[id]/page-4a1be0c9bd6ca402.js +0 -1
- package/.next/static/chunks/app/(app)/docs/page-e6db758a14f57ec8.js +0 -1
- package/.next/static/chunks/app/(app)/github/page-57bb812627d083a1.js +0 -1
- package/.next/static/chunks/app/(app)/goals/page-81e1af515f78e13b.js +0 -1
- package/.next/static/chunks/app/(app)/inbox/page-0baef1b01009c832.js +0 -12
- package/.next/static/chunks/app/(app)/knowledge/page-eb1317bf385e31ed.js +0 -1
- package/.next/static/chunks/app/(app)/layout-dcd4f30b53cb140f.js +0 -1
- package/.next/static/chunks/app/(app)/models/page-d73965ae6ca317e8.js +0 -1
- package/.next/static/chunks/app/(app)/notifications/page-b3ff14483cb6694e.js +0 -12
- package/.next/static/chunks/app/(app)/org/page-3075b218dbc681ce.js +0 -12
- package/.next/static/chunks/app/(app)/organizations/page-a6d35dbb21a61b7c.js +0 -1
- package/.next/static/chunks/app/(app)/page-c9e4fc0616a0083e.js +0 -1
- package/.next/static/chunks/app/(app)/planner/page-809dd3edda4ada93.js +0 -1
- package/.next/static/chunks/app/(app)/plugins/page-7e2aad1b702b5c88.js +0 -1
- package/.next/static/chunks/app/(app)/pm/page-709f9ac68ac98693.js +0 -1
- package/.next/static/chunks/app/(app)/prepare-deploy/page-f9609626153c2483.js +0 -1
- package/.next/static/chunks/app/(app)/profile/page-6d22c7bd0adb7a52.js +0 -1
- package/.next/static/chunks/app/(app)/pulse/page-f529917828ff4884.js +0 -1
- package/.next/static/chunks/app/(app)/reports/[id]/page-662e6e1a25b14025.js +0 -1
- package/.next/static/chunks/app/(app)/reports/page-5248735b18767054.js +0 -1
- package/.next/static/chunks/app/(app)/search/page-4d1e07c4c43a7489.js +0 -1
- package/.next/static/chunks/app/(app)/security/page-db7b8840d9cc6b72.js +0 -1
- package/.next/static/chunks/app/(app)/skills/page-a98da9e415efc310.js +0 -1
- package/.next/static/chunks/app/(app)/tasks/page-ab33402626a50c88.js +0 -1
- package/.next/static/chunks/app/(app)/test-dev/page-34612a4b47ec9aa2.js +0 -1
- package/.next/static/chunks/app/(app)/update/page-99d63495bfdd56a9.js +0 -1
- package/.next/static/chunks/app/(auth)/login/page-c7b372a5053512f0.js +0 -1
- package/.next/static/chunks/app/(auth)/onboarding/page-450bfc87fb942f9b.js +0 -1
- /package/.next/static/{mOVW9EdxrQ1xPT7vDdRdK → fb-rRThu8P8AXEQQBbLgT}/_buildManifest.js +0 -0
- /package/.next/static/{mOVW9EdxrQ1xPT7vDdRdK → fb-rRThu8P8AXEQQBbLgT}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";exports.id=4467,exports.ids=[4467],exports.modules={55774:(a,b,c)=>{c.d(b,{FixButton:()=>n,RunReviewButton:()=>o,Toggle:()=>m});var d=c(4374),e=c(74679),f=c(2910);let g=(0,f.createServerReference)("60753b828ec4d9ab111f73b4da14ed8e788d406be8",f.callServer,void 0,f.findSourceMapURL,"toggleRoutine"),h=(0,f.createServerReference)("60b7f662e366240a7f67885badcb3f49e48170fa66",f.callServer,void 0,f.findSourceMapURL,"togglePlugin"),i=(0,f.createServerReference)("4092a8a3a4164e2a5291e2852fe9d5328c07ba3f03",f.callServer,void 0,f.findSourceMapURL,"fixFinding"),j=(0,f.createServerReference)("004e8beadc05bdaf2ae2fbcb47074da365a6fcce4e",f.callServer,void 0,f.findSourceMapURL,"runReview");var k=c(43526),l=c(31819);function m({kind:a,id:b,on:c}){let[f,i]=(0,e.useTransition)(),j="routine"===a?g:h;return(0,d.jsx)("div",{className:"toggle"+(c?" on":""),"aria-disabled":f,role:"switch","aria-checked":c,onClick:()=>!f&&i(()=>j(b,!c))})}function n({id:a}){let b=(0,l.k)(),[c,f]=(0,e.useTransition)();return(0,d.jsxs)("button",{className:"sc2-btn",disabled:c,onClick:()=>f(()=>i(a)),children:[(0,d.jsx)(k.I,{name:"bot",size:12})," ",b("security.letAgentFix")]})}function o(){let a=(0,l.k)(),[b,c]=(0,e.useTransition)();return(0,d.jsxs)("button",{className:"btn-accent",disabled:b,onClick:()=>{window.dispatchEvent(new CustomEvent("constella:agent-run",{detail:{channel:"security"}})),c(async()=>{await j()})},children:[(0,d.jsx)(k.I,{name:"refresh",size:14,className:b?"sync-spin":""})," ",a(b?"security.reviewing":"security.runReview")]})}},86450:(a,b,c)=>{c.d(b,{FixButton:()=>f,RunReviewButton:()=>g,Toggle:()=>e});var d=c(62060);let e=(0,d.registerClientReference)(function(){throw Error("Attempted to call Toggle() from the server but Toggle 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\\module-toggles.tsx","Toggle");(0,d.registerClientReference)(function(){throw Error("Attempted to call ResolveButton() from the server but ResolveButton 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\\module-toggles.tsx","ResolveButton");let f=(0,d.registerClientReference)(function(){throw Error("Attempted to call FixButton() from the server but FixButton 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\\module-toggles.tsx","FixButton"),g=(0,d.registerClientReference)(function(){throw Error("Attempted to call RunReviewButton() from the server but RunReviewButton 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\\module-toggles.tsx","RunReviewButton")},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)},96734:(a,b,c)=>{c.r(b),c.d(b,{"0009ce734653f91e0152ed870ffea99c48e8be1273":()=>j.f,"0018beb06b15d253498af2e1d83c7efb58ba1235f1":()=>j.O,"001e9ef8a66d3ec2113043b24ab8849578169f7b7f":()=>F.eU,"0030de7d84721074ca2c38fb96d3e99e7adbe2b115":()=>e.y_,"004502b97d8e3fe943f13c3b5ade91831b1f1e77aa":()=>d.bt,"0045398aceb661eaa7517a21a9c934e25c61817872":()=>i.V,"004e8beadc05bdaf2ae2fbcb47074da365a6fcce4e":()=>E,"006719bab2c5093e448a5b60a38be68998349f13c8":()=>k.io,"00716b109ea97d20c9f19b65b246d9ef7ef16cbddf":()=>h.x7,"0083d8bd1fd660d07c4a32afdfbaf0d4ce78f74b81":()=>k.dj,"008623b8f1ea7a05b1a03f35024e64deff3c76f40f":()=>k.eg,"00a23e99d4e912da3ad1b266a22b1a141df6bc8b94":()=>F.PG,"00a77165f7dac9a25c366aaf49ac70c5ed0cb6a63d":()=>h.Mp,"00a782e5d3c8dd68f47e067a435acd0c8fe0089219":()=>e.PE,"00a8998940c2cf6566eea709d291cf65481f19b54b":()=>e.GK,"00ab9927a86440472b5cf26fdd4def0f285a68079c":()=>e.KO,"00ad3ff5b743f7808199b27e76248692706b96f718":()=>d.xU,"00f52218f5d83e696e1dc0d0c5d065efe7965bf187":()=>F.pM,"4005fa0fba2675b548027925c7a28feb6f5bdd2fe8":()=>C,"40167414a2e3f5a222b12781ff743cf8b6ee9ad2c6":()=>g.p,"4017b268da6934678c723b13073665577f1ce75125":()=>d.VL,"40196d281dfd92714d0ecb5e9aba74dea1bee6bc80":()=>d.rd,"4022a1ccf1ac607c0265da4f487775990a4b8caded":()=>h.lR,"4023f5918723ff8e7f3db05145a59992c8da49bc00":()=>A,"402e9c60aa3c6a6a0e19a64a54ffb83bac076adb9c":()=>i.F,"402fdcfeddf17de5709d551eccb08d8356339ea521":()=>k.De,"40337f5cf82830e51248818527fcc51ef672eb9a3e":()=>d.Wu,"4037371c47b3e43e6b878942db9705b7d9c6962e8a":()=>d.H7,"4063c93f1ee771828f6137bb585d64b60ae5977ed5":()=>e.jc,"4065b972fc53cae281adf85572f2891eab399b9ff9":()=>i.E_,"406ea9546f1236fb07b7a24e792f794a0bbfb38d1b":()=>h.sE,"407582551cfcbf2ac958cbe9bb798c5ab9b4596935":()=>e.RG,"408cb072e3f25c139043774855c69d936ddfb60fd8":()=>i.VJ,"408ccd7908d2b134a54b0e8d4b0d16b030de6e0632":()=>d.gg,"4092a8a3a4164e2a5291e2852fe9d5328c07ba3f03":()=>D,"409578e833742438f85eca112f74f4d631356f1cf7":()=>e.lJ,"409af259de44b27f92082eefeb0efe223bff8594fa":()=>g.L,"409ea47becd1f3f5c10a03dfe397bddcea7c125f30":()=>e.S,"40a067d42212349997f6b7b49b9b48eb75e87fe55a":()=>m.y,"40aca5e636733f4a71e30c5ee0da0e058892463f10":()=>F.Kg,"40afa32b6c37457e72bff11c25b8cb3acfad4e3d2d":()=>d.GW,"40bf46adf5ba85892bebf71f92748ed2bcbfecf292":()=>e.ey,"40c4dec4c26a6ed0bdf72098c743c4c2cb18ed1cd1":()=>F.lP,"40c85820def5803f3a9d54d933eb918b15d90b838a":()=>e.r7,"40ef945934daa47611bdb93b4cbc8906eb0f5ad253":()=>l.IL,"40f10406b426a9c38439a687284a721ddbf811f921":()=>i.zS,"40f7b5622fafa7f742d8cc68158fcbfd9b1ce99871":()=>l.q4,"40f7fd7992a8b9392597609349e63fb2460027c08a":()=>l.TX,"40f8fe3211abffb0b90ca8b8cc92391041d7df0c49":()=>z,"602483e14c0bdc4b5eb30468c3ef23b28e28b0df97":()=>e.q$,"604b3f96e4b0483edec3ec9f2f6daeac4fcdc8bbb1":()=>e.AA,"606af24aba1c9b79ec8a417abc29b49313f2de6b86":()=>l.Jp,"60736041a12fa374b1b47fa833b667d9d2d0997de2":()=>l.bk,"60753b828ec4d9ab111f73b4da14ed8e788d406be8":()=>y,"60761f3f2a77c81adf9da9b9d32b82e6d23912ccb9":()=>d.Fu,"6095694ef9c93f4af4573c8b78ab38c64e22c7215f":()=>l.bV,"60a238957762b5625582695c05d90f75b394483f2c":()=>f.I,"60b2447c6f65739ea8d93d715725c1f01851420aff":()=>e.LZ,"60b7f662e366240a7f67885badcb3f49e48170fa66":()=>B,"60b839ac7ca9a330595b14f8e699f9d128893bea16":()=>d.ME,"60bdbc934306dcff3e399beddf0cac16ca1290c000":()=>d.rm,"60da28e0e8059b61b3e22ba0d80a0bc367b5f79ae2":()=>d.n4,"60dba9908002f3000f3e7e8a0a7750d94f4e462c3d":()=>f.k,"60f9632ed57030592852ca206eb7d314c4bd1c4650":()=>d.jw,"705bb57bae647e5b0983590ed14a5926a22e285733":()=>d._z,"70c7731b108f014faf75e2ba778682d83c81ad6646":()=>e.M8});var d=c(97140),e=c(15487),f=c(79505),g=c(51605),h=c(46363),i=c(46282),j=c(387),k=c(13604),l=c(7482),m=c(58169),n=c(6866),o=c(77598),p=c(97603),q=c(31371),r=c(65705),s=c(1890),t=c(53993),u=c(70149),v=c(56338),w=c(24701),x=c(83963);async function y(a,b){let{workspace:c}=await (0,t.nP)();await r.db.update(s.routine).set({enabled:b}).where((0,p.Uo)((0,p.eq)(s.routine.id,a),(0,p.eq)(s.routine.workspaceId,c.id))),(0,q.revalidatePath)("/routines")}async function z(a){let{workspace:b}=await (0,t.nP)(),c=a.name.trim();return c?(await r.db.insert(s.routine).values({id:(0,o.randomUUID)(),workspaceId:b.id,name:c.slice(0,120),cmd:(a.cmd??"").trim().slice(0,500),freq:(a.freq??"Daily").trim()||"Daily",agentId:a.agentId||null,enabled:!0}),(0,q.revalidatePath)("/routines"),{ok:!0}):{ok:!1,error:"Name the routine."}}async function A(a){let{workspace:b}=await (0,t.nP)();await r.db.delete(s.routine).where((0,p.Uo)((0,p.eq)(s.routine.id,a),(0,p.eq)(s.routine.workspaceId,b.id))),(0,q.revalidatePath)("/routines")}async function B(a,b){let{workspace:c}=await (0,t.nP)();await r.db.update(s.plugin).set({enabled:b}).where((0,p.Uo)((0,p.eq)(s.plugin.id,a),(0,p.eq)(s.plugin.workspaceId,c.id))),(0,q.revalidatePath)("/plugins")}async function C(a){let{workspace:b}=await (0,t.nP)();await r.db.delete(s.inboxItem).where((0,p.Uo)((0,p.eq)(s.inboxItem.id,a),(0,p.eq)(s.inboxItem.workspaceId,b.id))),(0,q.revalidatePath)("/inbox")}async function D(a){let{workspace:b}=await (0,t.nP)();await r.db.update(s.finding).set({status:"fixed"}).where((0,p.Uo)((0,p.eq)(s.finding.id,a),(0,p.eq)(s.finding.workspaceId,b.id))),await r.db.insert(s.notification).values({id:(0,o.randomUUID)(),workspaceId:b.id,kind:"security",text:"Finding patched by the Code Review Agent",detail:"A security finding was fixed and a report was filed."}),(0,q.revalidatePath)("/security")}async function E(){let{org:a,workspace:b}=await (0,t.nP)(),c=await r.db.select().from(s.agent).where((0,p.eq)(s.agent.workspaceId,b.id)),d=c.find(a=>"whitfield"===a.handle)??c.find(a=>/cyber|sec/i.test(a.role))??c[0],e=(0,o.randomUUID)();if(!d)return{ok:!1,count:0,runId:e,error:"no agent"};await r.db.update(s.agent).set({status:"working"}).where((0,p.eq)(s.agent.id,d.id)),await (0,f.I)(b.id,{runId:e,channel:"security",agentId:d.id,kind:"thinking",target:`${d.name} is reviewing the workspace…`});let g=await r.db.select({name:s.skill.name,instructions:s.skill.instructions,summary:s.skill.summary}).from(s.agentSkill).innerJoin(s.skill,(0,p.eq)(s.agentSkill.skillId,s.skill.id)).where((0,p.Uo)((0,p.eq)(s.agentSkill.agentId,d.id),(0,p.RV)(s.skill.name,["owasp-top-10","owasp-asvs","appsec-fundamentals","secrets-management","secure-auth-sessions","dependency-supply-chain","review-code-perf-security","code-review-practices"]))),h=g.length?`
|
|
2
|
+
Apply these review skills (consult before judging):
|
|
3
|
+
${g.map(a=>`- ${a.name}: ${(a.instructions||a.summary).replace(/\s+/g," ").slice(0,300)}`).join("\n")}`:"",i=await (0,v.yY)(a.id,"security review: vulnerabilities, auth, secrets, prior findings and decisions",{agentHandle:d.handle,k:6}),j=i.context?`
|
|
4
|
+
Project knowledge (prior findings, decisions, patterns — do not contradict):
|
|
5
|
+
${i.context}`:"",k=[`You are ${d.name}, the security reviewer. Review the code in the current workspace directory for vulnerabilities, secret/token exposure, permission & workspace-isolation issues, and risky patterns.`,h,j,"Output ONLY a JSON array (no prose, no markdown fences) of findings:",'[{"sev":"high"|"med"|"low","title":"short title","file":"relative/path","suggestion":"how to fix"}]',"If the workspace is clean or empty, output []. Do not modify any files."].filter(Boolean).join("\n"),l=(0,u.hW)(d.adapter,d.model),m=(0,u.qX)(d.adapter),n=await (0,u.p1)(k,{orgId:a.id,binary:l,model:m,timeoutMs:24e4},a=>{(0,f.I)(b.id,{runId:e,channel:"security",agentId:d.id,kind:a.kind,target:a.target,detail:a.detail})}),y=[],z=n.text.match(/\[[\s\S]*\]/);if(z)try{y=JSON.parse(z[0])}catch{y=[]}for(let a of y.slice(0,40)){let c="high"===a.sev||"low"===a.sev?a.sev:"med";await r.db.insert(s.finding).values({id:(0,o.randomUUID)(),workspaceId:b.id,sev:c,title:String(a.title??"Finding").slice(0,200),file:String(a.file??""),suggestion:String(a.suggestion??""),status:"open"})}y.length&&(0,v.ru)(a.id,y.slice(0,40).map(a=>({type:"vuln",title:String(a.title??"Finding").slice(0,120),summary:`${a.sev??"med"}: ${String(a.suggestion??"")}`.slice(0,1e3),paths:a.file?[String(a.file)]:void 0,agentHandle:d.handle,sourceKind:"review",sourceRef:`${String(a.file??"")}::${String(a.title??"")}`.slice(0,200)}))).catch(()=>{}),(n.usd>0||n.inputTokens+n.outputTokens>0)&&await r.db.insert(s.costEntry).values({id:(0,o.randomUUID)(),workspaceId:b.id,agentId:d.id,provider:n.binary,model:n.model??d.model,usd:n.usd,tokens:n.inputTokens+n.outputTokens,at:new Date}),await r.db.update(s.workspace).set({settings:{...b.settings??{},lastSecurityRun:Date.now()}}).where((0,p.eq)(s.workspace.id,b.id)),await r.db.update(s.agent).set({status:"idle"}).where((0,p.eq)(s.agent.id,d.id));let A=new Date().toISOString().replace("T"," ").slice(0,19),B=`# Security review
|
|
6
|
+
|
|
7
|
+
_By @${d.handle} (${d.role}) \xb7 ${A}_
|
|
8
|
+
|
|
9
|
+
`+(y.length?`Filed ${y.length} finding(s):
|
|
10
|
+
|
|
11
|
+
`+y.slice(0,40).map(a=>`- **${a.sev??"med"}** ${a.title??"Finding"} — \`${a.file??"?"}\`
|
|
12
|
+
- ${a.suggestion??""}`).join("\n")+"\n":"No findings — the workspace looks clean.\n");try{await (0,x.g)(a.id,"Reports/security-review.md",B)}catch(a){console.error("[review] security report write failed:",a)}return await (0,f.I)(b.id,{runId:e,channel:"security",agentId:d.id,kind:n.ok?"done":"error",target:n.ok?`${y.length} finding(s) filed`:(n.error??"review failed").slice(0,200)}),await (0,w.I)(b.id,{kind:"security",text:"Security sweep finished",detail:`${d.name} filed ${y.length} finding(s).`,agentId:d.id}),(0,q.revalidatePath)("/security"),(0,q.revalidatePath)("/","layout"),{ok:n.ok,count:y.length,runId:e,error:n.error}}(0,c(74252).D)([y,z,A,B,C,D,E]),(0,n.A)(y,"60753b828ec4d9ab111f73b4da14ed8e788d406be8",null),(0,n.A)(z,"40f8fe3211abffb0b90ca8b8cc92391041d7df0c49",null),(0,n.A)(A,"4023f5918723ff8e7f3db05145a59992c8da49bc00",null),(0,n.A)(B,"60b7f662e366240a7f67885badcb3f49e48170fa66",null),(0,n.A)(C,"4005fa0fba2675b548027925c7a28feb6f5bdd2fe8",null),(0,n.A)(D,"4092a8a3a4164e2a5291e2852fe9d5328c07ba3f03",null),(0,n.A)(E,"004e8beadc05bdaf2ae2fbcb47074da365a6fcce4e",null);var F=c(52932)}};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";exports.id=4619,exports.ids=[4619],exports.modules={18612:(a,b,c)=>{c.d(b,{r$:()=>h,EX:()=>p,CS:()=>function a(b,c=""){let d=[];for(let e of l(b,c))if(e.isDir){if(m.has(e.name))continue;d.push(...a(b,e.path))}else d.push(e.path);return d},HZ:()=>j,Ci:()=>l,sL:()=>n,dx:()=>o});var d=c(73024),e=c(76760),f=c(48161),g=c(28430);function h(){return process.env.CONSTELLA_HOME?(0,g.Y)(process.env.CONSTELLA_HOME):(0,e.join)((0,f.homedir)(),".constella")}let i=new Set;function j(a){if(!/^[A-Za-z0-9_-]{6,64}$/.test(a))throw Error("Invalid orgId");let b=(0,e.join)(h(),"organizations",a,"workspace");if(!i.has(a)){i.add(a);try{let c=(0,e.join)(h(),"organizations",a,"constella"),f=!(0,d.existsSync)(b)||0===(0,d.readdirSync)(b).length;if((0,d.existsSync)(c)&&f)try{(0,d.renameSync)(c,b)}catch{(0,d.mkdirSync)(b,{recursive:!0}),0===(0,d.readdirSync)(b).length&&(0,d.cpSync)(c,b,{recursive:!0})}}catch{}}return b}function k(a,b){let c=(0,e.normalize)((0,e.join)(a,b));if(c!==a&&!c.startsWith(a+e.sep))throw Error("Path escapes workspace: "+b);if((0,d.existsSync)(a)){let f;try{f=d.realpathSync.native(a)}catch{f=a}let g=function(a){let b=a;for(;;){if((0,d.existsSync)(b))try{return d.realpathSync.native(b)}catch{return b}let a=(0,e.dirname)(b);if(a===b)return b;b=a}}(c);if(g!==f&&!g.startsWith(f+e.sep))throw Error("Path escapes workspace (symlink): "+b)}return c}function l(a,b=""){let c=k(j(a),b);return(0,d.existsSync)(c)?(0,d.readdirSync)(c).map(a=>{let f=(0,e.join)(c,a),g=(b?b+"/":"")+a;return{name:a,path:g,isDir:(0,d.statSync)(f).isDirectory()}}).sort((a,b)=>a.isDir===b.isDir?a.name.localeCompare(b.name):a.isDir?-1:1):[]}let m=new Set(["node_modules",".git",".next",".turbo","dist","build","out","coverage",".cache","archives",".testdev",".pnpm-store",".vercel","vendor"]);function n(a,b){let c=k(j(a),b);return(0,d.existsSync)(c)?(0,d.readFileSync)(c,"utf8"):null}function o(a,b,c){let f=k(j(a),b);(0,d.mkdirSync)((0,e.dirname)(f),{recursive:!0}),(0,d.writeFileSync)(f,c,"utf8")}function p(a,b){let c=k(j(a),b);(0,d.existsSync)(c)&&(0,d.rmSync)(c,{recursive:!0,force:!0})}},64619:(a,b,c)=>{c.d(b,{E6:()=>q,Nm:()=>A,PD:()=>w,SH:()=>y,U_:()=>r,hu:()=>u,sw:()=>s,xV:()=>t});var d=c(77598),e=c(1782),f=c(7852),g=c(80280),h=c(25533),i=c(18612);let j=process.env.OLLAMA_URL??"http://127.0.0.1:11434",k=process.env.CONSTELLA_EMBED_MODEL??"nomic-embed-text",l=/nomic/i.test(k),m=(a,b)=>`search_${b}: ${a}`,n=process.env.CONSTELLA_EMBED_URL??"http://127.0.0.1:8083",o=[".claude","DOCS","PO","Reports","specs","issues","design-skills"];function p(a){let b=a.replace(/\\/g,"/");return!(b.startsWith(".claude/kb/")||b.startsWith(".claude/skills/"))&&(b.startsWith("mock/")||b.startsWith("design-mock/")?/\.(md|html?|css|jsx?|tsx?|txt|json)$/i.test(b):b.endsWith(".md")&&o.some(a=>b===`${a}.md`||b.startsWith(`${a}/`)))}async function q(a,b="document"){try{let c=await fetch(`${j}/api/embeddings`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({model:k,prompt:l?m(a,b):a}),signal:AbortSignal.timeout(8e3)});if(c.ok){let a=await c.json();if(Array.isArray(a.embedding)&&a.embedding.length)return a.embedding}}catch{}try{let c=await fetch(`${n}/v1/embeddings`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({input:m(a,b),model:"nomic-embed"}),signal:AbortSignal.timeout(8e3)});if(c.ok){let a=await c.json(),b=a?.data?.[0]?.embedding;if(Array.isArray(b)&&b.length)return b}}catch{}return null}function r(a){let b=a.split(/\n(?=#{1,3}\s)/).map(a=>a.trim()).filter(Boolean),c=[];for(let d of b.length?b:[a])if(d)if(d.length<=1200)c.push(d);else for(let a=0;a<d.length;a+=1200)c.push(d.slice(a,a+1200));return c.slice(0,40)}function s(a,b){let c=0,d=0,e=0,f=Math.min(a.length,b.length);for(let g=0;g<f;g++)c+=a[g]*b[g],d+=a[g]*a[g],e+=b[g]*b[g];return d&&e?c/(Math.sqrt(d)*Math.sqrt(e)):0}async function t(a){let[b]=await g.db.select().from(h.workspace).where((0,e.eq)(h.workspace.orgId,a));if(!b)return{ok:!1,chunks:0,embedded:!1};let c=(0,i.CS)(a).filter(p);await g.db.delete(h.ragChunk).where((0,e.eq)(h.ragChunk.workspaceId,b.id));let f=0,j=!1;for(let e of c)for(let c of r((0,i.sL)(a,e)??"")){let a=await q(c);a&&(j=!0),await g.db.insert(h.ragChunk).values({id:(0,d.randomUUID)(),workspaceId:b.id,path:e,chunk:c,vector:a?JSON.stringify(a):null}),f++}return{ok:!0,chunks:f+=await u(a),embedded:j}}async function u(a){let[b]=await g.db.select().from(h.workspace).where((0,e.eq)(h.workspace.orgId,a));if(!b)return 0;await g.db.delete(h.ragChunk).where((0,e.Uo)((0,e.eq)(h.ragChunk.workspaceId,b.id),(0,e.mj)(h.ragChunk.path,"chat/%")));let c=await g.db.select().from(h.message).where((0,e.eq)(h.message.workspaceId,b.id)).orderBy((0,f.Y)(h.message.createdAt)),i=new Map;for(let a of c){let b=(a.text??"").replace(/\s+/g," ").trim();if(!b)continue;let c="operator"===a.fromKind?"Operator":"@"+(a.fromHandle??"agent"),d=i.get(a.channel);d||(d=[],i.set(a.channel,d)),d.push(`${c}: ${b}`)}let j=0;for(let[a,c]of i)for(let e of r(c.slice(-400).join("\n"))){let c=await q(e);await g.db.insert(h.ragChunk).values({id:(0,d.randomUUID)(),workspaceId:b.id,path:`chat/${a}`,chunk:e,vector:c?JSON.stringify(c):null}),j++}return j}let v=new Map;function w(a){let b=v.get(a);b&&clearTimeout(b),v.set(a,setTimeout(()=>{v.delete(a),u(a).catch(()=>{})},6e3))}async function x(a,b){if(!p(b))return;let[c]=await g.db.select().from(h.workspace).where((0,e.eq)(h.workspace.orgId,a));if(c)for(let f of(await g.db.delete(h.ragChunk).where((0,e.Uo)((0,e.eq)(h.ragChunk.workspaceId,c.id),(0,e.eq)(h.ragChunk.path,b))),r((0,i.sL)(a,b)??""))){let a=await q(f);await g.db.insert(h.ragChunk).values({id:(0,d.randomUUID)(),workspaceId:c.id,path:b,chunk:f,vector:a?JSON.stringify(a):null})}}async function y(a,b){if(!p(b))return;let[c]=await g.db.select().from(h.workspace).where((0,e.eq)(h.workspace.orgId,a));c&&await g.db.delete(h.ragChunk).where((0,e.Uo)((0,e.eq)(h.ragChunk.workspaceId,c.id),(0,e.eq)(h.ragChunk.path,b)))}let z=new Map;function A(a,b){if(!p(b))return;let c=a+"::"+b,d=z.get(c);d&&clearTimeout(d),z.set(c,setTimeout(()=>{z.delete(c),x(a,b).catch(()=>{})},2500))}}};
|
|
1
|
+
"use strict";exports.id=4619,exports.ids=[4619],exports.modules={18612:(a,b,c)=>{c.d(b,{r$:()=>h,EX:()=>p,CS:()=>function a(b,c=""){let d=[];for(let e of l(b,c))if(e.isDir){if(m.has(e.name))continue;d.push(...a(b,e.path))}else d.push(e.path);return d},HZ:()=>j,Ci:()=>l,sL:()=>n,dx:()=>o});var d=c(73024),e=c(76760),f=c(48161),g=c(28430);function h(){return process.env.CONSTELLA_HOME?(0,g.Y)(process.env.CONSTELLA_HOME):(0,e.join)((0,f.homedir)(),".constella")}let i=new Set;function j(a){if(!/^[A-Za-z0-9_-]{6,64}$/.test(a))throw Error("Invalid orgId");let b=(0,e.join)(h(),"organizations",a,"workspace");if(!i.has(a)){i.add(a);try{let c=(0,e.join)(h(),"organizations",a,"constella"),f=!(0,d.existsSync)(b)||0===(0,d.readdirSync)(b).length;if((0,d.existsSync)(c)&&f)try{(0,d.renameSync)(c,b)}catch{(0,d.existsSync)(c)&&((0,d.mkdirSync)(b,{recursive:!0}),0===(0,d.readdirSync)(b).length&&(0,d.cpSync)(c,b,{recursive:!0}))}}catch{}}return b}function k(a,b){let c=(0,e.normalize)((0,e.join)(a,b));if(c!==a&&!c.startsWith(a+e.sep))throw Error("Path escapes workspace: "+b);if((0,d.existsSync)(a)){let f;try{f=d.realpathSync.native(a)}catch{f=a}let g=function(a){let b=a;for(;;){if((0,d.existsSync)(b))try{return d.realpathSync.native(b)}catch{return b}let a=(0,e.dirname)(b);if(a===b)return b;b=a}}(c);if(g!==f&&!g.startsWith(f+e.sep))throw Error("Path escapes workspace (symlink): "+b)}return c}function l(a,b=""){let c=k(j(a),b);return(0,d.existsSync)(c)?(0,d.readdirSync)(c).map(a=>{let f=(0,e.join)(c,a),g=(b?b+"/":"")+a;return{name:a,path:g,isDir:(0,d.statSync)(f).isDirectory()}}).sort((a,b)=>a.isDir===b.isDir?a.name.localeCompare(b.name):a.isDir?-1:1):[]}let m=new Set(["node_modules",".git",".next",".turbo","dist","build","out","coverage",".cache","archives",".testdev",".pnpm-store",".vercel","vendor"]);function n(a,b){let c=k(j(a),b);return(0,d.existsSync)(c)?(0,d.readFileSync)(c,"utf8"):null}function o(a,b,c){let f=k(j(a),b);(0,d.mkdirSync)((0,e.dirname)(f),{recursive:!0}),(0,d.writeFileSync)(f,c,"utf8")}function p(a,b){let c=k(j(a),b);(0,d.existsSync)(c)&&(0,d.rmSync)(c,{recursive:!0,force:!0})}},64619:(a,b,c)=>{c.d(b,{E6:()=>q,Nm:()=>A,PD:()=>w,SH:()=>y,U_:()=>r,hu:()=>u,sw:()=>s,xV:()=>t});var d=c(77598),e=c(1782),f=c(7852),g=c(80280),h=c(25533),i=c(18612);let j=process.env.OLLAMA_URL??"http://127.0.0.1:11434",k=process.env.CONSTELLA_EMBED_MODEL??"nomic-embed-text",l=/nomic/i.test(k),m=(a,b)=>`search_${b}: ${a}`,n=process.env.CONSTELLA_EMBED_URL??"http://127.0.0.1:8083",o=[".claude","DOCS","PO","Reports","specs","issues","design-skills"];function p(a){let b=a.replace(/\\/g,"/");return!(b.startsWith(".claude/kb/")||b.startsWith(".claude/skills/"))&&(b.startsWith("mock/")||b.startsWith("design-mock/")?/\.(md|html?|css|jsx?|tsx?|txt|json)$/i.test(b):b.endsWith(".md")&&o.some(a=>b===`${a}.md`||b.startsWith(`${a}/`)))}async function q(a,b="document"){try{let c=await fetch(`${j}/api/embeddings`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({model:k,prompt:l?m(a,b):a}),signal:AbortSignal.timeout(8e3)});if(c.ok){let a=await c.json();if(Array.isArray(a.embedding)&&a.embedding.length)return a.embedding}}catch{}try{let c=await fetch(`${n}/v1/embeddings`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({input:m(a,b),model:"nomic-embed"}),signal:AbortSignal.timeout(8e3)});if(c.ok){let a=await c.json(),b=a?.data?.[0]?.embedding;if(Array.isArray(b)&&b.length)return b}}catch{}return null}function r(a){let b=a.split(/\n(?=#{1,3}\s)/).map(a=>a.trim()).filter(Boolean),c=[];for(let d of b.length?b:[a])if(d)if(d.length<=1200)c.push(d);else for(let a=0;a<d.length;a+=1200)c.push(d.slice(a,a+1200));return c.slice(0,40)}function s(a,b){let c=0,d=0,e=0,f=Math.min(a.length,b.length);for(let g=0;g<f;g++)c+=a[g]*b[g],d+=a[g]*a[g],e+=b[g]*b[g];return d&&e?c/(Math.sqrt(d)*Math.sqrt(e)):0}async function t(a){let[b]=await g.db.select().from(h.workspace).where((0,e.eq)(h.workspace.orgId,a));if(!b)return{ok:!1,chunks:0,embedded:!1};let c=(0,i.CS)(a).filter(p);await g.db.delete(h.ragChunk).where((0,e.Uo)((0,e.eq)(h.ragChunk.workspaceId,b.id),(0,e.kZ)(h.ragChunk.kbEntryId)));let f=0,j=!1;for(let e of c)for(let c of r((0,i.sL)(a,e)??"")){let a=await q(c);a&&(j=!0),await g.db.insert(h.ragChunk).values({id:(0,d.randomUUID)(),workspaceId:b.id,path:e,chunk:c,vector:a?JSON.stringify(a):null}),f++}return{ok:!0,chunks:f+=await u(a),embedded:j}}async function u(a){let[b]=await g.db.select().from(h.workspace).where((0,e.eq)(h.workspace.orgId,a));if(!b)return 0;await g.db.delete(h.ragChunk).where((0,e.Uo)((0,e.eq)(h.ragChunk.workspaceId,b.id),(0,e.mj)(h.ragChunk.path,"chat/%")));let c=await g.db.select().from(h.message).where((0,e.eq)(h.message.workspaceId,b.id)).orderBy((0,f.Y)(h.message.createdAt)),i=new Map;for(let a of c){let b=(a.text??"").replace(/\s+/g," ").trim();if(!b)continue;let c="operator"===a.fromKind?"Operator":"@"+(a.fromHandle??"agent"),d=i.get(a.channel);d||(d=[],i.set(a.channel,d)),d.push(`${c}: ${b}`)}let j=0;for(let[a,c]of i)for(let e of r(c.slice(-400).join("\n"))){let c=await q(e);await g.db.insert(h.ragChunk).values({id:(0,d.randomUUID)(),workspaceId:b.id,path:`chat/${a}`,chunk:e,vector:c?JSON.stringify(c):null}),j++}return j}let v=new Map;function w(a){let b=v.get(a);b&&clearTimeout(b),v.set(a,setTimeout(()=>{v.delete(a),u(a).catch(()=>{})},6e3))}async function x(a,b){if(!p(b))return;let[c]=await g.db.select().from(h.workspace).where((0,e.eq)(h.workspace.orgId,a));if(c)for(let f of(await g.db.delete(h.ragChunk).where((0,e.Uo)((0,e.eq)(h.ragChunk.workspaceId,c.id),(0,e.eq)(h.ragChunk.path,b))),r((0,i.sL)(a,b)??""))){let a=await q(f);await g.db.insert(h.ragChunk).values({id:(0,d.randomUUID)(),workspaceId:c.id,path:b,chunk:f,vector:a?JSON.stringify(a):null})}}async function y(a,b){if(!p(b))return;let[c]=await g.db.select().from(h.workspace).where((0,e.eq)(h.workspace.orgId,a));c&&await g.db.delete(h.ragChunk).where((0,e.Uo)((0,e.eq)(h.ragChunk.workspaceId,c.id),(0,e.eq)(h.ragChunk.path,b)))}let z=new Map;function A(a,b){if(!p(b))return;let c=a+"::"+b,d=z.get(c);d&&clearTimeout(d),z.set(c,setTimeout(()=>{z.delete(c),x(a,b).catch(()=>{})},2500))}}};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";exports.id=4979,exports.ids=[4979],exports.modules={44239:(a,b,c)=>{c.d(b,{$K:()=>m,$h:()=>q,FU:()=>t,II:()=>s,Kb:()=>u,MO:()=>o,Qu:()=>n,Vz:()=>r,dZ:()=>p});var d=c(6866),e=c(77598),f=c(97603),g=c(31371),h=c(65705),i=c(1890),j=c(53993),k=c(83963),l=c(84903);async function m(a){let{workspace:b}=await (0,j.nP)(),c=a.title.trim();c&&(await h.db.insert(i.backlogItem).values({id:(0,e.randomUUID)(),workspaceId:b.id,title:c,moscow:a.moscow??"Should",points:a.points??0}),(0,g.revalidatePath)("/pm"))}async function n(a){let{workspace:b}=await (0,j.nP)();await h.db.delete(i.backlogItem).where((0,f.Uo)((0,f.eq)(i.backlogItem.id,a),(0,f.eq)(i.backlogItem.workspaceId,b.id))),(0,g.revalidatePath)("/pm")}async function o(a,b){let c=await h.db.select().from(i.issue).where((0,f.Uo)((0,f.eq)(i.issue.workspaceId,b),(0,f.eq)(i.issue.status,"active"))),d=c.filter(a=>"done"===a.col),e=c.filter(a=>"done"!==a.col);if(!d.length)return{ok:!1,shipped:0,carried:e.length};let g=new Date().toISOString().slice(0,10),j=[`# Sprint retro — ${g}`,"",`## Shipped (${d.length})`,...d.map(a=>`- ${a.key} — ${a.title}${a.points?` (${a.points} pts)`:""}`),"",`## Carried over (${e.length})`,...e.length?e.map(a=>`- ${a.key} [${a.col}] — ${a.title}`):["- (nothing — clean sprint)"],"",`_Closed ${new Date().toISOString()} by the Product Owner._`,""].join("\n"),m=`PO/sprint-retro-${g}.md`;try{await (0,k.g)(a,m,j)}catch(a){console.error("[closeSprint] retro write failed:",a)}return await h.db.update(i.issue).set({status:"archived"}).where((0,f.Uo)((0,f.eq)(i.issue.workspaceId,b),(0,f.RV)(i.issue.id,d.map(a=>a.id)))),await (0,l.j)(b,{text:`Sprint closed — ${d.length} shipped, ${e.length} carried over; retro at ${m}`,by:"donald",source:"po-grooming"}),{ok:!0,shipped:d.length,carried:e.length,path:m}}async function p(){let{org:a,workspace:b}=await (0,j.nP)(),c=await o(a.id,b.id);return(0,g.revalidatePath)("/pm"),(0,g.revalidatePath)("/","layout"),c}async function q(a){let{workspace:b}=await (0,j.nP)(),[c]=await h.db.select().from(i.backlogItem).where((0,f.Uo)((0,f.eq)(i.backlogItem.id,a),(0,f.eq)(i.backlogItem.workspaceId,b.id)));if(!c)return;let d=(await h.db.select().from(i.issue).where((0,f.eq)(i.issue.workspaceId,b.id))).length;await h.db.insert(i.issue).values({id:(0,e.randomUUID)(),workspaceId:b.id,key:"S-"+(d+1),title:c.title,col:"todo",prio:"med",moscow:c.moscow,points:c.points}),await h.db.delete(i.backlogItem).where((0,f.eq)(i.backlogItem.id,a)),(0,g.revalidatePath)("/pm")}async function r(a,b){let{workspace:c}=await (0,j.nP)();await h.db.update(i.issue).set({col:b}).where((0,f.Uo)((0,f.eq)(i.issue.id,a),(0,f.eq)(i.issue.workspaceId,c.id))),(0,g.revalidatePath)("/pm")}async function s(a,b){let{workspace:c}=await (0,j.nP)();await h.db.update(i.issue).set({moscow:b}).where((0,f.Uo)((0,f.eq)(i.issue.id,a),(0,f.eq)(i.issue.workspaceId,c.id))),(0,g.revalidatePath)("/pm")}async function t(a){let{workspace:b}=await (0,j.nP)();await h.db.update(i.issue).set({col:"blocked"}).where((0,f.Uo)((0,f.eq)(i.issue.id,a),(0,f.eq)(i.issue.workspaceId,b.id))),await h.db.update(i.task).set({col:"blocked"}).where((0,f.Uo)((0,f.eq)(i.task.issueId,a),(0,f.eq)(i.task.workspaceId,b.id))),(0,g.revalidatePath)("/pm"),(0,g.revalidatePath)("/tasks")}async function u(a){let{workspace:b}=await (0,j.nP)();await h.db.update(i.issue).set({col:"todo"}).where((0,f.Uo)((0,f.eq)(i.issue.id,a),(0,f.eq)(i.issue.workspaceId,b.id)));let[c]=await h.db.update(i.task).set({col:"todo"}).where((0,f.Uo)((0,f.eq)(i.task.issueId,a),(0,f.eq)(i.task.workspaceId,b.id))).returning();c?.assigneeId&&await h.db.update(i.agent).set({status:"idle"}).where((0,f.eq)(i.agent.id,c.assigneeId)),(0,g.revalidatePath)("/pm"),(0,g.revalidatePath)("/tasks")}(0,c(74252).D)([m,n,o,p,q,r,s,t,u]),(0,d.A)(m,"4044e3371aee6680e5960d4a9fd95b3e19b475350d",null),(0,d.A)(n,"40fb535cc4b0dbbdd83c6144a0f5a245bf09cc32fc",null),(0,d.A)(o,"6080197d02e5d08088b725b7f04032153fe1cdb8e3",null),(0,d.A)(p,"00ba055b1bd2372b0078ca821ec84c027bac7f1078",null),(0,d.A)(q,"400aa27cae50f18adce211fdcd97ddd0394158be56",null),(0,d.A)(r,"6018c2668b84963092bf36ecc34fc4e5ec7029ec34",null),(0,d.A)(s,"6089d6aaa835232f3a6208cc6b6f427bcc18268e18",null),(0,d.A)(t,"4007f25a036675d56b9af474a2ba3beb9e624e9b4a",null),(0,d.A)(u,"40c8d60e90b031b659da84714901c5ed6c474eb568",null)},44842:(a,b,c)=>{c.d(b,{Lh:()=>t,NF:()=>v,PT:()=>w,jL:()=>u,ot:()=>q,yR:()=>r});var d=c(73024),e=c(76760),f=c(60547),g=c.n(f),h=c(97603),i=c(65705),j=c(1890),k=c(57086),l=c(70149),m=c(437),n=c(84903),o=c(77558),p=c(24701);async function q(a,b){let[c]=await i.db.select().from(j.goal).where((0,h.Uo)((0,h.eq)(j.goal.id,b),(0,h.eq)(j.goal.workspaceId,a)));return c}function r(a){return(a||"work").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,40)||"work"}async function s(a,b){for(let c of(await i.db.select().from(j.task).where((0,h.Uo)((0,h.eq)(j.task.workspaceId,a),(0,h.eq)(j.task.goalId,b)))))(0,l.KD)(c.id),("todo"===c.col||"doing"===c.col)&&(await i.db.update(j.task).set({col:"blocked"}).where((0,h.eq)(j.task.id,c.id)),c.issueId&&await i.db.update(j.issue).set({col:"blocked"}).where((0,h.eq)(j.issue.id,c.issueId))),c.assigneeId&&await i.db.update(j.agent).set({status:"idle"}).where((0,h.eq)(j.agent.id,c.assigneeId))}async function t(a,b){for(let c of(await i.db.select().from(j.task).where((0,h.Uo)((0,h.eq)(j.task.workspaceId,a),(0,h.eq)(j.task.goalId,b),(0,h.eq)(j.task.col,"blocked")))))await i.db.update(j.task).set({col:"todo"}).where((0,h.eq)(j.task.id,c.id)),c.issueId&&await i.db.update(j.issue).set({col:"todo"}).where((0,h.eq)(j.issue.id,c.issueId))}async function u(a,b,c){await i.db.update(j.spec).set({status:c}).where((0,h.Uo)((0,h.eq)(j.spec.workspaceId,a),(0,h.eq)(j.spec.goalId,b))),await i.db.update(j.issue).set({status:c}).where((0,h.Uo)((0,h.eq)(j.issue.workspaceId,a),(0,h.eq)(j.issue.goalId,b)))}async function v(a,b){let c=await q(a,b);return c?(await i.db.update(j.goal).set({status:"cancelled",cancelledAt:new Date}).where((0,h.eq)(j.goal.id,b)),await u(a,b,"cancelled"),await (0,o.TC)(a,b),await s(a,b),await (0,n.j)(a,{text:`Cancelled goal: ${c.title}`,by:"operator",source:"operator-instruction",goalId:b}),await (0,p.I)(a,{kind:"info",text:`Goal cancelled — ${c.title}`,detail:"Execution stopped; state preserved. Reopen to resume."}),{ok:!0,title:c.title}):{ok:!1}}async function w(a,b,c){let f=await q(b,c);if(!f)return{ok:!1};let l=(0,k.HZ)(a),[t,v,w,x,y]=await Promise.all([i.db.select().from(j.spec).where((0,h.Uo)((0,h.eq)(j.spec.workspaceId,b),(0,h.eq)(j.spec.goalId,c))),i.db.select().from(j.issue).where((0,h.Uo)((0,h.eq)(j.issue.workspaceId,b),(0,h.eq)(j.issue.goalId,c))),i.db.select().from(j.task).where((0,h.Uo)((0,h.eq)(j.task.workspaceId,b),(0,h.eq)(j.task.goalId,c))),i.db.select().from(j.decision).where((0,h.Uo)((0,h.eq)(j.decision.workspaceId,b),(0,h.eq)(j.decision.goalId,c))),i.db.select().from(j.report).where((0,h.Uo)((0,h.eq)(j.report.workspaceId,b),(0,h.eq)(j.report.goalId,c)))]),z=w.map(a=>a.id),A=z.length?await i.db.select().from(j.taskStep).where((0,h.RV)(j.taskStep.taskId,z)):[],B=await (0,m.Y)(b,c),C=new(g()),D=0;for(let a of B){let b=(0,e.join)(l,a);if((0,d.existsSync)(b))try{C.addFile("files/"+a,(0,d.readFileSync)(b)),D++}catch{}}let E={goal:f,specs:t,issues:v,tasks:w,taskSteps:A,decisions:x,reports:y,fileCount:D,archivedAt:new Date().toISOString()},F=[`# Archived work — ${f.title}`,"",`Status at archive: ${f.status} \xb7 progress ${f.progress}%`,"",`## Specs (${t.length})`,...t.map(a=>`- ${a.key} ${a.title}`),"",`## Issues (${v.length})`,...v.map(a=>`- ${a.key} [${a.col}] ${a.title}`),"",`## Decisions (${x.length})`,...x.map(a=>`- ${a.text} (${a.by})`),"",`## Source files (${D})`,...B.map(a=>`- ${a}`),""].join("\n");C.addFile("MANIFEST.json",Buffer.from(JSON.stringify(E,null,2))),C.addFile("MANIFEST.md",Buffer.from(F));let G=(0,e.join)(l,"archives");(0,d.mkdirSync)(G,{recursive:!0});let H=`archives/${r(f.title)}-${new Date().toISOString().slice(0,10)}-${c.slice(0,6)}.zip`;try{C.writeZip((0,e.join)(l,H))}catch(a){return console.error("[archiveGoalFor] zip failed:",a),{ok:!1}}return await i.db.update(j.goal).set({status:"archived",archivePath:H,archivedAt:new Date}).where((0,h.eq)(j.goal.id,c)),await u(b,c,"archived"),await (0,o.TC)(b,c),await s(b,c),await (0,n.j)(b,{text:`Archived goal: ${f.title} → ${H}`,by:"operator",source:"operator-instruction",goalId:c}),await (0,p.I)(b,{kind:"info",text:`Goal archived — ${f.title}`,detail:`${D} files + manifest zipped to ${H}.`}),{ok:!0,path:H,title:f.title}}},60686:(a,b,c)=>{c.d(b,{Fy:()=>m,KD:()=>q,Rr:()=>l,TH:()=>s,Xu:()=>r,j0:()=>n,nx:()=>o,zC:()=>p});var d=c(6866),e=c(31371),f=c(53993),g=c(63562),h=c(81204),i=c(70221),j=c(77558),k=c(24701);async function l(){let{org:a,workspace:b}=await (0,f.nP)(),c=await (0,g.ZF)(b.id,a.id);return(0,e.revalidatePath)("/test-dev"),c}async function m(){let{workspace:a}=await (0,f.nP)(),b=await (0,g.n9)(a.id);return(0,e.revalidatePath)("/test-dev"),b}async function n(){let{workspace:a}=await (0,f.nP)();return(0,g.CS)(a.id)}async function o(){let{org:a,workspace:b}=await (0,f.nP)(),c=(0,g.CS)(b.id);if("running"!==c.status&&"starting"!==c.status&&(c=await (0,g.ZF)(b.id,a.id)),!c.url||"running"!==c.status&&"starting"!==c.status)return{ok:!1,error:"The dev server isn't running — start the app first."};let d=await (0,h.nK)(b.id,c.url);return d?{ok:!0,url:d.url}:{ok:!1,error:"Could not start the inspect proxy."}}async function p(){let{workspace:a}=await (0,f.nP)();return(0,h.hA)(a.id),{ok:!0}}async function q(a){if(await (0,f.nP)(),!/^https?:\/\/(127\.0\.0\.1|localhost)(:\d+)?/i.test(a))return{frameable:!0};try{let b=await fetch(a,{redirect:"manual",signal:AbortSignal.timeout(3e3)}),c=(b.headers.get("x-frame-options")||"").toLowerCase(),d=(b.headers.get("content-security-policy")||"").toLowerCase(),e=/frame-ancestors\s+([^;]+)/.exec(d)?.[1]??"",f=c.includes("deny")||c.includes("sameorigin"),g=!!e&&!/(\*|localhost|127\.0\.0\.1)/.test(e);return{frameable:!(f||g)}}catch{return{frameable:!0}}}async function r(a){let{org:b,workspace:c}=await (0,f.nP)(),d=a?.issueId?await (0,i.B)(c.id,a.issueId):void 0,g=await (0,i.z)(c.id,b.id,{goalId:a?.goalId,issueId:a?.issueId,routes:d,by:"operator"});return(0,e.revalidatePath)("/test-dev"),g}async function s(a,b){let{workspace:c}=await (0,f.nP)();return await (0,j.vE)(c.id,{kind:"validation",refType:"validation",refId:a,title:`Validate ${a}`,detail:b.slice(0,500)}),await (0,k.I)(c.id,{kind:"review",text:`Validation requested — ${a}`,detail:b.slice(0,300)}),(0,e.revalidatePath)("/inbox"),{ok:!0}}(0,c(74252).D)([l,m,n,o,p,q,r,s]),(0,d.A)(l,"0052f8e2104f8633ca5df1d85c292d80b538d270cc",null),(0,d.A)(m,"00f45798ef0b92ff36e203fd85a965da22d38dad47",null),(0,d.A)(n,"001f7b38a3f729f9228f00bee7e2a5304a041ae35b",null),(0,d.A)(o,"000b3acc60b4d2b8a70e8d2d829b9aacc71ab61f76",null),(0,d.A)(p,"006d073b0c6542ef6eb5bdce823ce839aa00eb00ce",null),(0,d.A)(q,"40a38caeec3ba27df94e136db8976ff46f62348474",null),(0,d.A)(r,"4097bf88873bcc36e56b144ef77ec8cea15fa3de24",null),(0,d.A)(s,"60e8f7ea058e6f0799881f6c5d494eca17a7a94e72",null)},84979:(a,b,c)=>{c.d(b,{runSlashCommand:()=>ax});var d=c(77598),e=c(97603),f=c(95357),g=c(65705),h=c(1890),i=c(56338),j=c(57300),k=c(45125),l=c(33644),m=c(13328),n=c(44842),o=c(60686),p=c(69783),q=c(6866),r=c(73024),s=c(76760),t=c(48161),u=c(31371),v=c(53993),w=c(38926),x=c(57086),y=c(70149),z=c(78161),A=c(79505),B=c(63562),C=c(3196),D=c(77558),E=c(24701);let F=!1;function G(){F||(F=!0,g.F.exec(`
|
|
1
|
+
"use strict";exports.id=4979,exports.ids=[4979],exports.modules={44239:(a,b,c)=>{c.d(b,{$K:()=>m,$h:()=>q,FU:()=>t,II:()=>s,Kb:()=>u,MO:()=>o,Qu:()=>n,Vz:()=>r,dZ:()=>p});var d=c(6866),e=c(77598),f=c(97603),g=c(31371),h=c(65705),i=c(1890),j=c(53993),k=c(83963),l=c(84903);async function m(a){let{workspace:b}=await (0,j.nP)(),c=a.title.trim();c&&(await h.db.insert(i.backlogItem).values({id:(0,e.randomUUID)(),workspaceId:b.id,title:c,moscow:a.moscow??"Should",points:a.points??0}),(0,g.revalidatePath)("/pm"))}async function n(a){let{workspace:b}=await (0,j.nP)();await h.db.delete(i.backlogItem).where((0,f.Uo)((0,f.eq)(i.backlogItem.id,a),(0,f.eq)(i.backlogItem.workspaceId,b.id))),(0,g.revalidatePath)("/pm")}async function o(a,b){let c=await h.db.select().from(i.issue).where((0,f.Uo)((0,f.eq)(i.issue.workspaceId,b),(0,f.eq)(i.issue.status,"active"))),d=c.filter(a=>"done"===a.col),e=c.filter(a=>"done"!==a.col);if(!d.length)return{ok:!1,shipped:0,carried:e.length};let g=new Date().toISOString().slice(0,10),j=[`# Sprint retro — ${g}`,"",`## Shipped (${d.length})`,...d.map(a=>`- ${a.key} — ${a.title}${a.points?` (${a.points} pts)`:""}`),"",`## Carried over (${e.length})`,...e.length?e.map(a=>`- ${a.key} [${a.col}] — ${a.title}`):["- (nothing — clean sprint)"],"",`_Closed ${new Date().toISOString()} by the Product Owner._`,""].join("\n"),m=`PO/sprint-retro-${g}.md`;try{await (0,k.g)(a,m,j)}catch(a){console.error("[closeSprint] retro write failed:",a)}return await h.db.update(i.issue).set({status:"archived"}).where((0,f.Uo)((0,f.eq)(i.issue.workspaceId,b),(0,f.RV)(i.issue.id,d.map(a=>a.id)))),await (0,l.j)(b,{text:`Sprint closed — ${d.length} shipped, ${e.length} carried over; retro at ${m}`,by:"donald",source:"po-grooming"}),{ok:!0,shipped:d.length,carried:e.length,path:m}}async function p(){let{org:a,workspace:b}=await (0,j.nP)(),c=await o(a.id,b.id);return(0,g.revalidatePath)("/pm"),(0,g.revalidatePath)("/","layout"),c}async function q(a){let{workspace:b}=await (0,j.nP)(),[c]=await h.db.select().from(i.backlogItem).where((0,f.Uo)((0,f.eq)(i.backlogItem.id,a),(0,f.eq)(i.backlogItem.workspaceId,b.id)));if(!c)return;let d=(await h.db.select().from(i.issue).where((0,f.eq)(i.issue.workspaceId,b.id))).length;await h.db.insert(i.issue).values({id:(0,e.randomUUID)(),workspaceId:b.id,key:"S-"+(d+1),title:c.title,col:"todo",prio:"med",moscow:c.moscow,points:c.points}),await h.db.delete(i.backlogItem).where((0,f.eq)(i.backlogItem.id,a)),(0,g.revalidatePath)("/pm")}async function r(a,b){let{workspace:c}=await (0,j.nP)();await h.db.update(i.issue).set({col:b}).where((0,f.Uo)((0,f.eq)(i.issue.id,a),(0,f.eq)(i.issue.workspaceId,c.id))),(0,g.revalidatePath)("/pm")}async function s(a,b){let{workspace:c}=await (0,j.nP)();await h.db.update(i.issue).set({moscow:b}).where((0,f.Uo)((0,f.eq)(i.issue.id,a),(0,f.eq)(i.issue.workspaceId,c.id))),(0,g.revalidatePath)("/pm")}async function t(a){let{workspace:b}=await (0,j.nP)();await h.db.update(i.issue).set({col:"blocked"}).where((0,f.Uo)((0,f.eq)(i.issue.id,a),(0,f.eq)(i.issue.workspaceId,b.id))),await h.db.update(i.task).set({col:"blocked"}).where((0,f.Uo)((0,f.eq)(i.task.issueId,a),(0,f.eq)(i.task.workspaceId,b.id))),(0,g.revalidatePath)("/pm"),(0,g.revalidatePath)("/tasks")}async function u(a){let{workspace:b}=await (0,j.nP)();await h.db.update(i.issue).set({col:"todo"}).where((0,f.Uo)((0,f.eq)(i.issue.id,a),(0,f.eq)(i.issue.workspaceId,b.id)));let[c]=await h.db.update(i.task).set({col:"todo"}).where((0,f.Uo)((0,f.eq)(i.task.issueId,a),(0,f.eq)(i.task.workspaceId,b.id))).returning();c?.assigneeId&&await h.db.update(i.agent).set({status:"idle"}).where((0,f.eq)(i.agent.id,c.assigneeId)),(0,g.revalidatePath)("/pm"),(0,g.revalidatePath)("/tasks")}(0,c(74252).D)([m,n,o,p,q,r,s,t,u]),(0,d.A)(m,"4088009f0d2cbbba34e0207830000d876ac87be1e4",null),(0,d.A)(n,"40b958b631594e5113a81f7b91936c4ac45540972c",null),(0,d.A)(o,"606d72ee9f1b46526b075c7ba34e8f3d15f0489c81",null),(0,d.A)(p,"001ecbfc082955a63b43d043a47f66170df3047bc6",null),(0,d.A)(q,"4079e5a38d4b908c82b1592ca4145bac75fa9cdddc",null),(0,d.A)(r,"60556220eab507b346271261c487e26109176abf32",null),(0,d.A)(s,"601e71bc6879f55cdd1a7a2c292464cc6d883568c5",null),(0,d.A)(t,"400fbc4e797a5ff2ca8be3cfceda669990ea3cb583",null),(0,d.A)(u,"403eccf6f1b0da0ba79530a70de0d0b185e3b5fb30",null)},44842:(a,b,c)=>{c.d(b,{Lh:()=>t,NF:()=>v,PT:()=>w,jL:()=>u,ot:()=>q,yR:()=>r});var d=c(73024),e=c(76760),f=c(60547),g=c.n(f),h=c(97603),i=c(65705),j=c(1890),k=c(57086),l=c(70149),m=c(437),n=c(84903),o=c(77558),p=c(24701);async function q(a,b){let[c]=await i.db.select().from(j.goal).where((0,h.Uo)((0,h.eq)(j.goal.id,b),(0,h.eq)(j.goal.workspaceId,a)));return c}function r(a){return(a||"work").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,40)||"work"}async function s(a,b){for(let c of(await i.db.select().from(j.task).where((0,h.Uo)((0,h.eq)(j.task.workspaceId,a),(0,h.eq)(j.task.goalId,b)))))(0,l.KD)(c.id),("todo"===c.col||"doing"===c.col)&&(await i.db.update(j.task).set({col:"blocked"}).where((0,h.eq)(j.task.id,c.id)),c.issueId&&await i.db.update(j.issue).set({col:"blocked"}).where((0,h.eq)(j.issue.id,c.issueId))),c.assigneeId&&await i.db.update(j.agent).set({status:"idle"}).where((0,h.eq)(j.agent.id,c.assigneeId))}async function t(a,b){for(let c of(await i.db.select().from(j.task).where((0,h.Uo)((0,h.eq)(j.task.workspaceId,a),(0,h.eq)(j.task.goalId,b),(0,h.eq)(j.task.col,"blocked")))))await i.db.update(j.task).set({col:"todo"}).where((0,h.eq)(j.task.id,c.id)),c.issueId&&await i.db.update(j.issue).set({col:"todo"}).where((0,h.eq)(j.issue.id,c.issueId))}async function u(a,b,c){await i.db.update(j.spec).set({status:c}).where((0,h.Uo)((0,h.eq)(j.spec.workspaceId,a),(0,h.eq)(j.spec.goalId,b))),await i.db.update(j.issue).set({status:c}).where((0,h.Uo)((0,h.eq)(j.issue.workspaceId,a),(0,h.eq)(j.issue.goalId,b)))}async function v(a,b){let c=await q(a,b);return c?(await i.db.update(j.goal).set({status:"cancelled",cancelledAt:new Date}).where((0,h.eq)(j.goal.id,b)),await u(a,b,"cancelled"),await (0,o.TC)(a,b),await s(a,b),await (0,n.j)(a,{text:`Cancelled goal: ${c.title}`,by:"operator",source:"operator-instruction",goalId:b}),await (0,p.I)(a,{kind:"info",text:`Goal cancelled — ${c.title}`,detail:"Execution stopped; state preserved. Reopen to resume."}),{ok:!0,title:c.title}):{ok:!1}}async function w(a,b,c){let f=await q(b,c);if(!f)return{ok:!1};let l=(0,k.HZ)(a),[t,v,w,x,y]=await Promise.all([i.db.select().from(j.spec).where((0,h.Uo)((0,h.eq)(j.spec.workspaceId,b),(0,h.eq)(j.spec.goalId,c))),i.db.select().from(j.issue).where((0,h.Uo)((0,h.eq)(j.issue.workspaceId,b),(0,h.eq)(j.issue.goalId,c))),i.db.select().from(j.task).where((0,h.Uo)((0,h.eq)(j.task.workspaceId,b),(0,h.eq)(j.task.goalId,c))),i.db.select().from(j.decision).where((0,h.Uo)((0,h.eq)(j.decision.workspaceId,b),(0,h.eq)(j.decision.goalId,c))),i.db.select().from(j.report).where((0,h.Uo)((0,h.eq)(j.report.workspaceId,b),(0,h.eq)(j.report.goalId,c)))]),z=w.map(a=>a.id),A=z.length?await i.db.select().from(j.taskStep).where((0,h.RV)(j.taskStep.taskId,z)):[],B=await (0,m.Y)(b,c),C=new(g()),D=0;for(let a of B){let b=(0,e.join)(l,a);if((0,d.existsSync)(b))try{C.addFile("files/"+a,(0,d.readFileSync)(b)),D++}catch{}}let E={goal:f,specs:t,issues:v,tasks:w,taskSteps:A,decisions:x,reports:y,fileCount:D,archivedAt:new Date().toISOString()},F=[`# Archived work — ${f.title}`,"",`Status at archive: ${f.status} \xb7 progress ${f.progress}%`,"",`## Specs (${t.length})`,...t.map(a=>`- ${a.key} ${a.title}`),"",`## Issues (${v.length})`,...v.map(a=>`- ${a.key} [${a.col}] ${a.title}`),"",`## Decisions (${x.length})`,...x.map(a=>`- ${a.text} (${a.by})`),"",`## Source files (${D})`,...B.map(a=>`- ${a}`),""].join("\n");C.addFile("MANIFEST.json",Buffer.from(JSON.stringify(E,null,2))),C.addFile("MANIFEST.md",Buffer.from(F));let G=(0,e.join)(l,"archives");(0,d.mkdirSync)(G,{recursive:!0});let H=`archives/${r(f.title)}-${new Date().toISOString().slice(0,10)}-${c.slice(0,6)}.zip`;try{C.writeZip((0,e.join)(l,H))}catch(a){return console.error("[archiveGoalFor] zip failed:",a),{ok:!1}}return await i.db.update(j.goal).set({status:"archived",archivePath:H,archivedAt:new Date}).where((0,h.eq)(j.goal.id,c)),await u(b,c,"archived"),await (0,o.TC)(b,c),await s(b,c),await (0,n.j)(b,{text:`Archived goal: ${f.title} → ${H}`,by:"operator",source:"operator-instruction",goalId:c}),await (0,p.I)(b,{kind:"info",text:`Goal archived — ${f.title}`,detail:`${D} files + manifest zipped to ${H}.`}),{ok:!0,path:H,title:f.title}}},60686:(a,b,c)=>{c.d(b,{Fy:()=>m,KD:()=>q,Rr:()=>l,TH:()=>s,Xu:()=>r,j0:()=>n,nx:()=>o,zC:()=>p});var d=c(6866),e=c(31371),f=c(53993),g=c(63562),h=c(81204),i=c(70221),j=c(77558),k=c(24701);async function l(){let{org:a,workspace:b}=await (0,f.nP)(),c=await (0,g.ZF)(b.id,a.id);return(0,e.revalidatePath)("/test-dev"),c}async function m(){let{workspace:a}=await (0,f.nP)(),b=await (0,g.n9)(a.id);return(0,e.revalidatePath)("/test-dev"),b}async function n(){let{workspace:a}=await (0,f.nP)();return(0,g.CS)(a.id)}async function o(){let{org:a,workspace:b}=await (0,f.nP)(),c=(0,g.CS)(b.id);if("running"!==c.status&&"starting"!==c.status&&(c=await (0,g.ZF)(b.id,a.id)),!c.url||"running"!==c.status&&"starting"!==c.status)return{ok:!1,error:"The dev server isn't running — start the app first."};let d=await (0,h.nK)(b.id,c.url);return d?{ok:!0,url:d.url}:{ok:!1,error:"Could not start the inspect proxy."}}async function p(){let{workspace:a}=await (0,f.nP)();return(0,h.hA)(a.id),{ok:!0}}async function q(a){if(await (0,f.nP)(),!/^https?:\/\/(127\.0\.0\.1|localhost)(:\d+)?/i.test(a))return{frameable:!0};try{let b=await fetch(a,{redirect:"manual",signal:AbortSignal.timeout(3e3)}),c=(b.headers.get("x-frame-options")||"").toLowerCase(),d=(b.headers.get("content-security-policy")||"").toLowerCase(),e=/frame-ancestors\s+([^;]+)/.exec(d)?.[1]??"",f=c.includes("deny")||c.includes("sameorigin"),g=!!e&&!/(\*|localhost|127\.0\.0\.1)/.test(e);return{frameable:!(f||g)}}catch{return{frameable:!0}}}async function r(a){let{org:b,workspace:c}=await (0,f.nP)(),d=a?.issueId?await (0,i.B)(c.id,a.issueId):void 0,g=await (0,i.z)(c.id,b.id,{goalId:a?.goalId,issueId:a?.issueId,routes:d,by:"operator"});return(0,e.revalidatePath)("/test-dev"),g}async function s(a,b){let{workspace:c}=await (0,f.nP)();return await (0,j.vE)(c.id,{kind:"validation",refType:"validation",refId:a,title:`Validate ${a}`,detail:b.slice(0,500)}),await (0,k.I)(c.id,{kind:"review",text:`Validation requested — ${a}`,detail:b.slice(0,300)}),(0,e.revalidatePath)("/inbox"),{ok:!0}}(0,c(74252).D)([l,m,n,o,p,q,r,s]),(0,d.A)(l,"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)},84979:(a,b,c)=>{c.d(b,{runSlashCommand:()=>ay});var d=c(77598),e=c(97603),f=c(95357),g=c(65705),h=c(1890),i=c(56338),j=c(57300),k=c(45125),l=c(33644),m=c(13328),n=c(44842),o=c(60686),p=c(69783),q=c(6866),r=c(73024),s=c(76760),t=c(48161),u=c(31371),v=c(53993),w=c(38926),x=c(57086),y=c(70149),z=c(78161),A=c(79505),B=c(63562),C=c(3196),D=c(77558),E=c(24701);let F=!1;function G(){F||(F=!0,g.F.exec(`
|
|
2
2
|
CREATE TABLE IF NOT EXISTS deploy_run (
|
|
3
3
|
id TEXT PRIMARY KEY,
|
|
4
4
|
workspace_id TEXT NOT NULL REFERENCES workspace(id) ON DELETE CASCADE,
|
|
@@ -27,11 +27,11 @@ coverage/
|
|
|
27
27
|
.env.*
|
|
28
28
|
!.env.example
|
|
29
29
|
.DS_Store
|
|
30
|
-
`;function Q(a,b,c){if(a)try{let c=(0,s.join)(a.dir,b);if((0,r.existsSync)(c))return(0,r.readFileSync)(c,"utf8")}catch{}return(0,x.sL)(c,b)}function R(a,b){let c=Q(a,"package.json",b);if(!c)return null;try{return JSON.parse(c)}catch{return null}}function S(a){let b=(0,B.pp)(a);return!!b&&["dist","build","out",".next",".output","target/release","bin"].some(a=>{try{return(0,r.existsSync)((0,s.join)(b.dir,a))}catch{return!1}})}function T(a){return(a.stderr||a.stdout||"").replace(/\s+/g," ").trim().slice(-180)}let U=/\.(ts|tsx|js|jsx|mjs|cjs|py|go|rs|vue|svelte)$/i,V=/(?:process\.env\.([A-Z][A-Z0-9_]*)|process\.env\[['"]([A-Z][A-Z0-9_]*)['"]\]|import\.meta\.env\.([A-Z][A-Z0-9_]*)|os\.environ(?:\.get)?\(\s*['"]([A-Z][A-Z0-9_]*)['"]|os\.getenv\(\s*['"]([A-Z][A-Z0-9_]*)['"]|os\.Getenv\(\s*['"]([A-Z][A-Z0-9_]*)['"])/g,W=new Set(["NODE_ENV","PORT","HOST","PWD","HOME","PATH","CI","TZ","VERCEL","VERCEL_ENV"]);async function X(a){let b,c=(0,B.pp)(a),d=c?.kind??"unknown",e=R(c,a),f={...e?.dependencies??{},...e?.devDependencies??{}},g=function(a){if(!a)return[];let b=[];for(let c of a.split("\n")){let a=/^\s*([A-Z][A-Z0-9_]*)\s*=(.*)$/.exec(c);if(!a)continue;let d=a[2].trim().replace(/^["']|["']$/g,"");b.push({key:a[1],hasValue:d.length>0&&!/^(your[_-]|<|change[_-]?me|xxx|placeholder|example)/i.test(d)})}return b}(Q(c,".env.example",a)??Q(c,".env.sample",a)??Q(c,".env.template",a)),h=new Set(g.map(a=>a.key)),i=function(a){let b=new Set,c=0;for(let d of(0,x.CS)(a)){if(!U.test(d))continue;if(c++>1500)break;let e=(0,x.sL)(a,d);if(e&&!(e.length>524288))for(let a of e.matchAll(V)){let c=a[1]||a[2]||a[3]||a[4]||a[5]||a[6];c&&b.add(c)}}return b}(a),j=[...i].filter(a=>!h.has(a)&&!W.has(a)).sort().slice(0,40),{ports:k,hasDockerfile:l,hasCompose:m}=function(a,b){let c=new Set,d=Q(a,"Dockerfile",b);if(d)for(let a of d.matchAll(/EXPOSE\s+(\d+)/gi))c.add(Number(a[1]));let e=Q(a,"docker-compose.yml",b)??Q(a,"docker-compose.yaml",b)??Q(a,"compose.yml",b)??Q(a,"compose.yaml",b);if(e)for(let a of e.matchAll(/(\d{2,5}):\d{2,5}/g))c.add(Number(a[1]));return{ports:[...c].filter(a=>a>0&&a<65536).slice(0,12),hasDockerfile:null!=d,hasCompose:null!=e}}(c,a);return{detected:!!c,runtime:d,packageManager:"node"===d?c.runCmd:void 0,framework:"next"in f?"Next.js app":"nuxt"in f?"Nuxt app":"@remix-run/react"in f?"Remix app":"@angular/core"in f?"Angular app":"svelte"in f||"@sveltejs/kit"in f?"Svelte app":"vue"in f?"Vue app":"react"in f?"React app":"@nestjs/core"in f?"Nest API":"express"in f||"fastify"in f||"koa"in f||"@hapi/hapi"in f?"Node server":"python"===d?"Python service":"go"===d?"Go service":"rust"===d?"Rust service":"static"===d?"Static site":"node"===d?"Node app":void 0,projectName:c?.name,runLabel:c?.label,requiredEnv:g,referencedEnvCount:i.size,unsetEnvKeys:j,database:"node"===d?(b=(...a)=>a.some(a=>a in f))("pg","postgres","mysql","mysql2","better-sqlite3","sqlite3","sequelize","prisma","drizzle-orm","typeorm","knex")?"relational":b("mongodb","mongoose")?"document":b("redis","ioredis")?"key-value":"none":"none",ports:k,hasDockerfile:l,hasCompose:m,buildScript:e?.scripts?.build,startScript:e?.scripts?.start,mode:c?S(a)?"prod":"dev":"unknown"}}async function Y(){let{org:a}=await (0,v.nP)();return X(a.id)}function Z(a,b){let c=(0,x.HZ)(b),d=[],e=[],f=0;for(let g of(0,x.CS)(b))if(function(a){let b=a.replace(/\\/g,"/"),c=b.split("/")[0];return!(M.has(c)||b.startsWith(".constella")||N.test(b)&&!O.test(b))}(g))try{let b=(0,s.join)(c,g),h=(0,s.join)(a,g);(0,r.mkdirSync)((0,s.dirname)(h),{recursive:!0}),(0,r.cpSync)(b,h);let i=0;try{i=(0,r.statSync)(b).size}catch{}let j=g.replace(/\\/g,"/");d.push({path:j,size:i}),f++;let k=(j.split("/").pop()??"").toLowerCase();/^(readme|license|licence|changelog|deploy|contributing)(\.|$)/.test(k)&&e.push(j)}catch{}return(0,r.writeFileSync)((0,s.join)(a,".gitignore"),P),{copied:f,docs:e,files:d}}async function $(a){let b=(0,s.join)((0,t.tmpdir)(),"constella-preview-"+(0,d.randomUUID)());try{(0,r.mkdirSync)(b,{recursive:!0});let c=Z(b,a),d=[];c.copied>0&&(await (0,y.d1)("git",["init","-b","main"],{cwd:b}),await (0,y.d1)("git",["add","-A"],{cwd:b}),d=(await (0,C.I)(b)).findings);let e=c.files.reduce((a,b)=>a+b.size,0),f=(0,x.CS)(a).length;return{files:c.files.slice(0,500),tree:function(a){let b=new Map,c=[];for(let d of a){let a=d.path.split("/");if(1===a.length)c.push({name:a[0],kind:"file",size:d.size});else{let c=a[0],e=b.get(c)??{size:0,count:0};e.size+=d.size,e.count+=1,b.set(c,e)}}return[...[...b.entries()].map(([a,b])=>({name:a,kind:"dir",size:b.size,childCount:b.count})).sort((a,b)=>a.name.localeCompare(b.name)),...c.sort((a,b)=>a.name.localeCompare(b.name))]}(c.files),totalBytes:e,includedCount:c.copied,ignoredCount:Math.max(0,f-c.copied),docs:c.docs,hasBuild:S(a),secrets:d,blocked:d.length>0}}catch(a){return{files:[],tree:[],totalBytes:0,includedCount:0,ignoredCount:0,docs:[],hasBuild:!1,secrets:[],blocked:!1,error:String(a instanceof Error?a.message:a)}}finally{try{(0,r.rmSync)(b,{recursive:!0,force:!0})}catch{}}}async function _(){let{org:a}=await (0,v.nP)();return $(a.id)}async function aa(a,b,c,d){let e=(0,B.pp)(a),f=R(e,a),g=a=>c.steps.find(b=>b.key===a)?.status,h=b=>null!=Q(e,b,a),i=!!e&&"node"===d.runtime&&(()=>{try{return(0,r.existsSync)((0,s.join)(e.dir,"node_modules"))}catch{return!1}})(),j=!!await (0,w.r6)(b,"github_pat").catch(()=>null),k=[],l=(a,b,c,d)=>k.push({key:a,label:b,status:c,detail:d});"node"===d.runtime?l("pkg","package.json valid",f?"ok":"fail",f?void 0:"missing or invalid"):l("pkg","Project manifest present",d.detected?"ok":"todo"),l("deps","Dependencies installed","node"!==d.runtime?d.detected?"ok":"todo":i||"done"===g("deps")?"ok":"todo"),l("envExample",".env.example present",d.requiredEnv.length>0||h(".env.example")?"ok":"todo"),l("envComplete","All used env vars documented",0===d.unsetEnvKeys.length?"ok":"warn",d.unsetEnvKeys.length?`${d.unsetEnvKeys.length} undocumented`:void 0);let m=g("secrets");l("secrets","No secrets in the product","blocked"===m?"fail":"done"===m?"ok":"todo");let n=g("build");l("build","Production build runs",d.buildScript?"done"===n?"ok":"error"===n?"fail":"todo":"warn",d.buildScript?void 0:"no build script");let o=g("tests");return l("tests","Tests pass",f?.scripts?.test?"done"===o?"ok":"error"===o?"fail":"todo":"warn",f?.scripts?.test?void 0:"no test script"),l("readme","README present",h("README.md")||h("readme.md")?"ok":"todo"),l("deployDoc","Deploy docs present",h("DEPLOY.md")?"ok":"todo"),l("internalExcluded","Internal files excluded from export","ok"),l("exportRepo","Export repository configured",j?"ok":"todo",j?void 0:"connect a token"),k}async function ab(){let{org:a,workspace:b}=await (0,v.nP)(),[c,d]=await Promise.all([J(b.id),X(a.id)]);return aa(a.id,b.id,c,d)}async function ac(){let{workspace:a}=await (0,v.nP)();return J(a.id)}async function ad(a){let b=await g.db.select().from(h.agent).where((0,e.eq)(h.agent.workspaceId,a));return b.find(a=>/devops/i.test(a.role))??b.find(a=>"ada"===a.handle)??b[0]??null}async function ae(a,b,c,f,i){let j=(0,y.hW)(c.adapter,c.model),k="claude"===j?c.model.includes("opus")?"opus":c.model.includes("haiku")?"haiku":"sonnet":void 0;await g.db.update(h.agent).set({status:"working"}).where((0,e.eq)(h.agent.id,c.id));let{prompt:l}=await (0,z.s)({orgId:a,ws:b,agent:c,channel:"deploy",instruction:f}),m=await (0,y.p1)(l,{orgId:a,binary:j,model:k,timeoutMs:6e5},a=>{"done"!==a.kind&&(0,A.I)(b.id,{runId:i,channel:"deploy",agentId:c.id,kind:a.kind,target:a.target,detail:a.detail})});return await g.db.update(h.agent).set({status:"idle"}).where((0,e.eq)(h.agent.id,c.id)),(m.usd>0||m.inputTokens+m.outputTokens>0)&&await g.db.insert(h.costEntry).values({id:(0,d.randomUUID)(),workspaceId:b.id,agentId:c.id,provider:m.binary,model:m.model??c.model,usd:m.usd,tokens:m.inputTokens+m.outputTokens,at:new Date}),m}let af=[{key:"analyze",label:"Analyze the project"},{key:"deps",label:"Validate dependencies"},{key:"env",label:"Validate environment variables"},{key:"tests",label:"Run tests"},{key:"secrets",label:"Security scan"},{key:"build",label:"Production build"},{key:"validateBuild",label:"Validate build"},{key:"agent",label:"Configure env, fix & document"},{key:"package",label:"Prepare clean package"}];async function ag(){let{org:a,workspace:b}=await (0,v.nP)(),c=b.id,e=await J(c);if("running"===e.status&&e.startedAt&&Date.now()-e.startedAt<9e5)return e;let f=(0,d.randomUUID)(),g=af.map(a=>({key:a.key,label:a.label,status:"waiting"}));await K(c,{status:"running",runId:f,startedAt:Date.now(),steps:g,summary:"",buildLog:""});let h=async(a,b,d)=>{let e=g.findIndex(b=>b.key===a);e>=0&&(g[e]={...g[e],status:b,detail:d,..."running"===b?{startedAt:Date.now()}:{endedAt:Date.now()}}),await K(c,{steps:g}),(0,A.I)(c,{runId:f,channel:"deploy",agentId:null,kind:"text",target:"",detail:`${af.find(b=>b.key===a)?.label??a}${d?" — "+d:""}`})},i=(0,B.pp)(a.id),j=await X(a.id),k="",l=async(b,d)=>{let e=await aa(a.id,c,await J(c),j);return await K(c,{status:b,summary:d,checklist:e,buildLog:k}),(0,A.I)(c,{runId:f,channel:"deploy",agentId:null,kind:"failed"===b?"error":"done",target:"prep complete",detail:d.slice(0,160)}),await (0,E.I)(c,{kind:"deploy",text:"done"===b?"Production prep finished":"blocked"===b?"Prep blocked — secrets found":"Production prep failed",detail:d.slice(0,200)}),(0,u.revalidatePath)("/prepare-deploy"),J(c)};try{var m,n;if(await h("analyze","running"),!i)return await h("analyze","error","No runnable project detected."),l("failed","No runnable project detected in the workspace.");if(await h("analyze","done",`${j.framework??j.runtime}${i.label?" \xb7 "+i.label:""}`),await h("deps","running"),i.install){let a=await (0,y.d1)(i.install.cmd,i.install.args,{cwd:i.dir,timeoutMs:3e5,env:{...process.env,CI:"1"}});await h("deps",0===a.code?"done":"error",0===a.code?"dependencies installed":a.timedOut?"install timed out":T(a))}else await h("deps","done","already installed");await h("env","running"),await h("env",j.unsetEnvKeys.length?"needs-action":"done",j.unsetEnvKeys.length?`${j.unsetEnvKeys.length} var(s) missing from .env.example`:`${j.requiredEnv.length} documented`),await h("tests","running");let d=R(i,a.id);if("node"===j.runtime&&d?.scripts?.test){let a=await (0,y.d1)(i.runCmd,["test"],{cwd:i.dir,timeoutMs:3e5,env:{...process.env,CI:"1"}});await h("tests",0===a.code?"done":"error",0===a.code?"tests passing":a.timedOut?"tests timed out":T(a))}else await h("tests","needs-action","no automated test script");await h("secrets","running");let e=await $(a.id);if(e.blocked)return await h("secrets","blocked",`${e.secrets.length} potential secret(s)`),await (0,D.vE)(c,{kind:"block",refType:"task",refId:"deploy-prep",title:`Prep blocked — ${e.secrets.length} secret risk(s)`,detail:e.secrets.slice(0,5).map(a=>`${a.file}: ${a.kind}`).join("; ")}),l("blocked",`Blocked: ${e.secrets.length} potential secret(s) found in the product. Remove them and re-run.`);if(await h("secrets","done","no secrets found"),await h("build","running"),"node"===j.runtime&&j.buildScript){let a=await (0,y.d1)(i.runCmd,"npm"===i.runCmd?["run","build"]:["build"],{cwd:i.dir,timeoutMs:6e5,env:{...process.env,CI:"1"}});k=`build ${0===a.code?"OK":a.timedOut?"TIMED OUT":"FAILED ("+a.code+")"}
|
|
31
|
-
`+(a.stdout+a.stderr).slice(-1800),await K(c,{buildLog:
|
|
32
|
-
`+(a.stdout+a.stderr).slice(-1800);return await K(b.id,{buildLog:d}),(0,u.revalidatePath)("/prepare-deploy"),{ok:0===a.code,log:d}}):{ok:!1,log:"No Node build script to run."}}async function
|
|
33
|
-
`+(a.stdout+a.stderr).slice(-1800)}}):{ok:!1,log:"No test script to run."}}async function
|
|
34
|
-
Project: ${f.framework}${f.unsetEnvKeys.length?`; undocumented env vars: ${f.unsetEnvKeys.slice(0,20).join(", ")}`:""}.`:"",h=(0,d.randomUUID)();(0,A.I)(c.id,{runId:h,channel:"deploy",agentId:e.id,kind:"run",target:"readme"===a?"generate README":"generate deploy docs"});let i=await ae(b.id,c,e,("readme"===a?"Write or refresh a clear root `README.md` for this project: what it is, prerequisites, install, run, configure (reference .env.example), and basic usage. Keep it accurate to the real code; do NOT invent features.":"Write or refresh a root `DEPLOY.md` with concrete production deploy steps for this project's stack/host: build, environment variables (reference .env.example, never real secrets), run command, and host-specific notes. Keep it accurate to the real project.")+g,h);return(0,A.I)(c.id,{runId:h,channel:"deploy",agentId:e.id,kind:"done",target:"done"}),(0,u.revalidatePath)("/prepare-deploy"),{ok:i.ok,summary:(i.text||"").slice(0,400)}}async function
|
|
30
|
+
`;function Q(a,b,c){if(a)try{let c=(0,s.join)(a.dir,b);if((0,r.existsSync)(c))return(0,r.readFileSync)(c,"utf8")}catch{}return(0,x.sL)(c,b)}function R(a,b){let c=Q(a,"package.json",b);if(!c)return null;try{return JSON.parse(c)}catch{return null}}function S(a){let b=(0,B.pp)(a);return!!b&&["dist","build","out",".next",".output","target/release","bin"].some(a=>{try{return(0,r.existsSync)((0,s.join)(b.dir,a))}catch{return!1}})}function T(a){return(a.stderr||a.stdout||"").replace(/\s+/g," ").trim().slice(-180)}let U=/\.(ts|tsx|js|jsx|mjs|cjs|py|go|rs|vue|svelte)$/i,V=/(?:process\.env\.([A-Z][A-Z0-9_]*)|process\.env\[['"]([A-Z][A-Z0-9_]*)['"]\]|import\.meta\.env\.([A-Z][A-Z0-9_]*)|os\.environ(?:\.get)?\(\s*['"]([A-Z][A-Z0-9_]*)['"]|os\.getenv\(\s*['"]([A-Z][A-Z0-9_]*)['"]|os\.Getenv\(\s*['"]([A-Z][A-Z0-9_]*)['"])/g,W=new Set(["NODE_ENV","PORT","HOST","PWD","HOME","PATH","CI","TZ","VERCEL","VERCEL_ENV"]);async function X(a){let b,c=(0,B.pp)(a),d=c?.kind??"unknown",e=R(c,a),f={...e?.dependencies??{},...e?.devDependencies??{}},g=function(a){if(!a)return[];let b=[];for(let c of a.split("\n")){let a=/^\s*([A-Z][A-Z0-9_]*)\s*=(.*)$/.exec(c);if(!a)continue;let d=a[2].trim().replace(/^["']|["']$/g,"");b.push({key:a[1],hasValue:d.length>0&&!/^(your[_-]|<|change[_-]?me|xxx|placeholder|example)/i.test(d)})}return b}(Q(c,".env.example",a)??Q(c,".env.sample",a)??Q(c,".env.template",a)),h=new Set(g.map(a=>a.key)),i=function(a){let b=new Set,c=0;for(let d of(0,x.CS)(a)){if(!U.test(d))continue;if(c++>1500)break;let e=(0,x.sL)(a,d);if(e&&!(e.length>524288))for(let a of e.matchAll(V)){let c=a[1]||a[2]||a[3]||a[4]||a[5]||a[6];c&&b.add(c)}}return b}(a),j=[...i].filter(a=>!h.has(a)&&!W.has(a)).sort().slice(0,40),{ports:k,hasDockerfile:l,hasCompose:m}=function(a,b){let c=new Set,d=Q(a,"Dockerfile",b);if(d)for(let a of d.matchAll(/EXPOSE\s+(\d+)/gi))c.add(Number(a[1]));let e=Q(a,"docker-compose.yml",b)??Q(a,"docker-compose.yaml",b)??Q(a,"compose.yml",b)??Q(a,"compose.yaml",b);if(e)for(let a of e.matchAll(/^[ \t]*-[ \t]*["']?(\d{2,5}):\d{2,5}\b/gm))c.add(Number(a[1]));return{ports:[...c].filter(a=>a>0&&a<65536).slice(0,12),hasDockerfile:null!=d,hasCompose:null!=e}}(c,a);return{detected:!!c,runtime:d,packageManager:"node"===d?c.runCmd:void 0,framework:"next"in f?"Next.js app":"nuxt"in f?"Nuxt app":"@remix-run/react"in f?"Remix app":"@angular/core"in f?"Angular app":"svelte"in f||"@sveltejs/kit"in f?"Svelte app":"vue"in f?"Vue app":"react"in f?"React app":"@nestjs/core"in f?"Nest API":"express"in f||"fastify"in f||"koa"in f||"@hapi/hapi"in f?"Node server":"python"===d?"Python service":"go"===d?"Go service":"rust"===d?"Rust service":"static"===d?"Static site":"node"===d?"Node app":void 0,projectName:c?.name,runLabel:c?.label,requiredEnv:g,referencedEnvCount:i.size,unsetEnvKeys:j,database:"node"===d?(b=(...a)=>a.some(a=>a in f))("pg","postgres","mysql","mysql2","better-sqlite3","sqlite3","sequelize","prisma","drizzle-orm","typeorm","knex")?"relational":b("mongodb","mongoose")?"document":b("redis","ioredis")?"key-value":"none":"none",ports:k,hasDockerfile:l,hasCompose:m,buildScript:e?.scripts?.build,startScript:e?.scripts?.start,mode:c?S(a)?"prod":"dev":"unknown"}}async function Y(){let{org:a}=await (0,v.nP)();return X(a.id)}function Z(a,b){let c=(0,x.HZ)(b),d=[],e=[],f=0;for(let g of(0,x.CS)(b))if(function(a){let b=a.replace(/\\/g,"/"),c=b.split("/")[0];return!(M.has(c)||b.startsWith(".constella")||N.test(b)&&!O.test(b))}(g))try{let b=(0,s.join)(c,g),h=(0,s.join)(a,g);(0,r.mkdirSync)((0,s.dirname)(h),{recursive:!0}),(0,r.cpSync)(b,h);let i=0;try{i=(0,r.statSync)(b).size}catch{}let j=g.replace(/\\/g,"/");d.push({path:j,size:i}),f++;let k=(j.split("/").pop()??"").toLowerCase();/^(readme|license|licence|changelog|deploy|contributing)(\.|$)/.test(k)&&e.push(j)}catch{}return(0,r.writeFileSync)((0,s.join)(a,".gitignore"),P),{copied:f,docs:e,files:d}}async function $(a){let b=(0,s.join)((0,t.tmpdir)(),"constella-preview-"+(0,d.randomUUID)());try{(0,r.mkdirSync)(b,{recursive:!0});let c=Z(b,a),d=[];c.copied>0&&(await (0,y.d1)("git",["init","-b","main"],{cwd:b}),await (0,y.d1)("git",["add","-A"],{cwd:b}),d=(await (0,C.I)(b)).findings);let e=c.files.reduce((a,b)=>a+b.size,0),f=(0,x.CS)(a).length;return{files:c.files.slice(0,500),tree:function(a){let b=new Map,c=[];for(let d of a){let a=d.path.split("/");if(1===a.length)c.push({name:a[0],kind:"file",size:d.size});else{let c=a[0],e=b.get(c)??{size:0,count:0};e.size+=d.size,e.count+=1,b.set(c,e)}}return[...[...b.entries()].map(([a,b])=>({name:a,kind:"dir",size:b.size,childCount:b.count})).sort((a,b)=>a.name.localeCompare(b.name)),...c.sort((a,b)=>a.name.localeCompare(b.name))]}(c.files),totalBytes:e,includedCount:c.copied,ignoredCount:Math.max(0,f-c.copied),docs:c.docs,hasBuild:S(a),secrets:d,blocked:d.length>0}}catch(a){return{files:[],tree:[],totalBytes:0,includedCount:0,ignoredCount:0,docs:[],hasBuild:!1,secrets:[],blocked:!1,error:String(a instanceof Error?a.message:a)}}finally{try{(0,r.rmSync)(b,{recursive:!0,force:!0})}catch{}}}async function _(){let{org:a}=await (0,v.nP)();return $(a.id)}async function aa(a,b,c,d){let e=(0,B.pp)(a),f=R(e,a),g=a=>c.steps.find(b=>b.key===a)?.status,h=b=>null!=Q(e,b,a),i=!!e&&"node"===d.runtime&&(()=>{try{return(0,r.existsSync)((0,s.join)(e.dir,"node_modules"))}catch{return!1}})(),j=!!await (0,w.r6)(b,"github_pat").catch(()=>null),k=[],l=(a,b,c,d)=>k.push({key:a,label:b,status:c,detail:d});"node"===d.runtime?l("pkg","package.json valid",f?"ok":"fail",f?void 0:"missing or invalid"):l("pkg","Project manifest present",d.detected?"ok":"todo"),l("deps","Dependencies installed","node"!==d.runtime?d.detected?"ok":"todo":i||"done"===g("deps")?"ok":"todo"),l("envExample",".env.example present",d.requiredEnv.length>0||h(".env.example")?"ok":"todo"),l("envComplete","All used env vars documented",0===d.unsetEnvKeys.length?"ok":"warn",d.unsetEnvKeys.length?`${d.unsetEnvKeys.length} undocumented`:void 0);let m=g("secrets");l("secrets","No secrets in the product","blocked"===m?"fail":"done"===m?"ok":"todo");let n=g("build");l("build","Production build runs",d.buildScript?"done"===n?"ok":"error"===n?"fail":"todo":"warn",d.buildScript?void 0:"no build script");let o=g("tests");return l("tests","Tests pass",f?.scripts?.test?"done"===o?"ok":"error"===o?"fail":"todo":"warn",f?.scripts?.test?void 0:"no test script"),l("readme","README present",h("README.md")||h("readme.md")?"ok":"todo"),l("deployDoc","Deploy docs present",h("DEPLOY.md")?"ok":"todo"),l("internalExcluded","Internal files excluded from export","ok"),l("exportRepo","Export repository configured",j?"ok":"todo",j?void 0:"connect a token"),k}async function ab(){let{org:a,workspace:b}=await (0,v.nP)(),[c,d]=await Promise.all([J(b.id),X(a.id)]);return aa(a.id,b.id,c,d)}async function ac(){let{workspace:a}=await (0,v.nP)();return J(a.id)}async function ad(a){let b=await g.db.select().from(h.agent).where((0,e.eq)(h.agent.workspaceId,a));return b.find(a=>/devops/i.test(a.role))??b.find(a=>"ada"===a.handle)??b[0]??null}async function ae(a,b,c,f,i){let j=(0,y.hW)(c.adapter,c.model),k="claude"===j?c.model.includes("opus")?"opus":c.model.includes("haiku")?"haiku":"sonnet":void 0;await g.db.update(h.agent).set({status:"working"}).where((0,e.eq)(h.agent.id,c.id));let{prompt:l}=await (0,z.s)({orgId:a,ws:b,agent:c,channel:"deploy",instruction:f}),m=await (0,y.p1)(l,{orgId:a,binary:j,model:k,timeoutMs:6e5},a=>{"done"!==a.kind&&(0,A.I)(b.id,{runId:i,channel:"deploy",agentId:c.id,kind:a.kind,target:a.target,detail:a.detail})});return await g.db.update(h.agent).set({status:"idle"}).where((0,e.eq)(h.agent.id,c.id)),(m.usd>0||m.inputTokens+m.outputTokens>0)&&await g.db.insert(h.costEntry).values({id:(0,d.randomUUID)(),workspaceId:b.id,agentId:c.id,provider:m.binary,model:m.model??c.model,usd:m.usd,tokens:m.inputTokens+m.outputTokens,at:new Date}),m}let af=[{key:"analyze",label:"Analyze the project"},{key:"deps",label:"Validate dependencies"},{key:"env",label:"Validate environment variables"},{key:"tests",label:"Run tests"},{key:"secrets",label:"Security scan"},{key:"build",label:"Production build"},{key:"validateBuild",label:"Validate build"},{key:"agent",label:"Configure env, fix & document"},{key:"package",label:"Prepare clean package"}],ag=new Map;async function ah(){let{org:a,workspace:b}=await (0,v.nP)(),c=b.id,e=ag.get(c);if(e&&Date.now()-e<9e5)return J(c);ag.set(c,Date.now());let f=await J(c);if("running"===f.status&&f.startedAt&&Date.now()-f.startedAt<9e5)return ag.delete(c),f;let g=(0,d.randomUUID)(),h=af.map(a=>({key:a.key,label:a.label,status:"waiting"}));await K(c,{status:"running",runId:g,startedAt:Date.now(),steps:h,summary:"",buildLog:""});let i=async(a,b,d)=>{let e=h.findIndex(b=>b.key===a);e>=0&&(h[e]={...h[e],status:b,detail:d,..."running"===b?{startedAt:Date.now()}:{endedAt:Date.now()}}),await K(c,{steps:h}),(0,A.I)(c,{runId:g,channel:"deploy",agentId:null,kind:"text",target:"",detail:`${af.find(b=>b.key===a)?.label??a}${d?" — "+d:""}`})},j=(0,B.pp)(a.id),k=await X(a.id),l="",m=async(b,d)=>{ag.delete(c);let e=await aa(a.id,c,await J(c),k);return await K(c,{status:b,summary:d,checklist:e,buildLog:l}),(0,A.I)(c,{runId:g,channel:"deploy",agentId:null,kind:"failed"===b?"error":"done",target:"prep complete",detail:d.slice(0,160)}),await (0,E.I)(c,{kind:"deploy",text:"done"===b?"Production prep finished":"blocked"===b?"Prep blocked — secrets found":"Production prep failed",detail:d.slice(0,200)}),(0,u.revalidatePath)("/prepare-deploy"),J(c)};try{var n,o;if(await i("analyze","running"),!j)return await i("analyze","error","No runnable project detected."),m("failed","No runnable project detected in the workspace.");if(await i("analyze","done",`${k.framework??k.runtime}${j.label?" \xb7 "+j.label:""}`),await i("deps","running"),j.install){let a=await (0,y.d1)(j.install.cmd,j.install.args,{cwd:j.dir,timeoutMs:3e5,env:{...process.env,CI:"1"}});await i("deps",0===a.code?"done":"error",0===a.code?"dependencies installed":a.timedOut?"install timed out":T(a))}else await i("deps","done","already installed");await i("env","running"),await i("env",k.unsetEnvKeys.length?"needs-action":"done",k.unsetEnvKeys.length?`${k.unsetEnvKeys.length} var(s) missing from .env.example`:`${k.requiredEnv.length} documented`),await i("tests","running");let d=R(j,a.id);if("node"===k.runtime&&d?.scripts?.test){let a=await (0,y.d1)(j.runCmd,["test"],{cwd:j.dir,timeoutMs:3e5,env:{...process.env,CI:"1"}});await i("tests",0===a.code?"done":"error",0===a.code?"tests passing":a.timedOut?"tests timed out":T(a))}else await i("tests","needs-action","no automated test script");await i("secrets","running");let e=await $(a.id);if(e.blocked)return await i("secrets","blocked",`${e.secrets.length} potential secret(s)`),await (0,D.vE)(c,{kind:"block",refType:"task",refId:"deploy-prep",title:`Prep blocked — ${e.secrets.length} secret risk(s)`,detail:e.secrets.slice(0,5).map(a=>`${a.file}: ${a.kind}`).join("; ")}),m("blocked",`Blocked: ${e.secrets.length} potential secret(s) found in the product. Remove them and re-run.`);if(await i("secrets","done","no secrets found"),await i("build","running"),"node"===k.runtime&&k.buildScript){let a=await (0,y.d1)(j.runCmd,"npm"===j.runCmd?["run","build"]:["build"],{cwd:j.dir,timeoutMs:6e5,env:{...process.env,CI:"1"}});l=`build ${0===a.code?"OK":a.timedOut?"TIMED OUT":"FAILED ("+a.code+")"}
|
|
31
|
+
`+(a.stdout+a.stderr).slice(-1800),await K(c,{buildLog:l}),await i("build",0===a.code?"done":"error",0===a.code?"build succeeded":"build failed — the agent will try to fix it")}else await i("build","needs-action","node"===k.runtime?"no build script":"no build step for this stack");await i("validateBuild","running");let f=await (0,B.VX)(c,a.id);await i("validateBuild",f.ok?"done":"error",f.ok?S(a.id)?"boots \xb7 build output present":"boots":f.detail.slice(0,160)),await i("agent","running");let h=await ad(c),p="";if(h){let c,d=await ae(a.id,b,h,(n=l,c=["FINISH PREPARING THIS PROJECT FOR PRODUCTION. Dependencies, tests, the secret scan and the production build have ALREADY been run by the system — focus on the remaining gaps.","Do, in order: (1) create/refresh `.env.example` documenting EVERY required environment variable (NEVER inline real secrets/tokens — use placeholders)."+(k.unsetEnvKeys.length?` The code references these vars not yet in .env.example: ${k.unsetEnvKeys.slice(0,30).join(", ")}.`:""),"(2) if the production build failed, FIX the errors until it builds clean;","(3) write/refresh a root `README.md` (what it is, install, run, configure) and a root `DEPLOY.md` with concrete build/run/deploy steps for this project's host;","(4) finish with a SHORT operator summary + the exact next steps to deploy.","Keep the existing product and its UX; do NOT add internal/control files or a second app."],n&&c.push("Latest production build output (tail):\n"+n.slice(-1200)),c.join("\n")),g);p=(d.text||"").slice(0,800),await i("agent",d.ok?"done":"error",d.ok?"configured env, docs & fixes":d.error?.slice(0,160)||"agent run failed")}else await i("agent","needs-action","no agent available to run");await i("package","running");let q=await $(a.id);return await i("package",q.blocked?"blocked":"done",q.blocked?`${q.secrets.length} secret risk(s) in the export set`:`${q.includedCount} file(s) \xb7 ${(o=q.totalBytes)<1024?`${o} B`:o<1048576?`${(o/1024).toFixed(1)} KB`:`${(o/1024/1024).toFixed(1)} MB`}`),m(q.blocked?"blocked":"done",p||`Prepared ${q.includedCount} clean file(s) for production.`)}catch(a){return m("failed",String(a instanceof Error?a.message:a).slice(0,300))}}async function ai(a,b,c){let e=(0,d.randomUUID)();(0,A.I)(a,{runId:e,channel:"deploy",agentId:null,kind:"run",target:b});try{let d=await c();return(0,A.I)(a,{runId:e,channel:"deploy",agentId:null,kind:"done",target:b}),d}catch(c){throw(0,A.I)(a,{runId:e,channel:"deploy",agentId:null,kind:"error",target:b,detail:String(c)}),c}}async function aj(){let{org:a,workspace:b}=await (0,v.nP)(),c=(0,B.pp)(a.id),d=R(c,a.id);return c&&"node"===c.kind&&d?.scripts?.build?ai(b.id,"production build",async()=>{let a=await (0,y.d1)(c.runCmd,"npm"===c.runCmd?["run","build"]:["build"],{cwd:c.dir,timeoutMs:6e5,env:{...process.env,CI:"1"}}),d=`build ${0===a.code?"OK":a.timedOut?"TIMED OUT":"FAILED ("+a.code+")"}
|
|
32
|
+
`+(a.stdout+a.stderr).slice(-1800);return await K(b.id,{buildLog:d}),(0,u.revalidatePath)("/prepare-deploy"),{ok:0===a.code,log:d}}):{ok:!1,log:"No Node build script to run."}}async function ak(){let{org:a,workspace:b}=await (0,v.nP)(),c=(0,B.pp)(a.id),d=R(c,a.id);return c&&"node"===c.kind&&d?.scripts?.test?ai(b.id,"tests",async()=>{let a=await (0,y.d1)(c.runCmd,["test"],{cwd:c.dir,timeoutMs:3e5,env:{...process.env,CI:"1"}});return{ok:0===a.code,log:`tests ${0===a.code?"PASS":"FAIL"}
|
|
33
|
+
`+(a.stdout+a.stderr).slice(-1800)}}):{ok:!1,log:"No test script to run."}}async function al(a){let{org:b,workspace:c}=await (0,v.nP)(),e=await ad(c.id);if(!e)return{ok:!1,summary:"No agent available."};let f=await X(b.id),g=f.framework?`
|
|
34
|
+
Project: ${f.framework}${f.unsetEnvKeys.length?`; undocumented env vars: ${f.unsetEnvKeys.slice(0,20).join(", ")}`:""}.`:"",h=(0,d.randomUUID)();(0,A.I)(c.id,{runId:h,channel:"deploy",agentId:e.id,kind:"run",target:"readme"===a?"generate README":"generate deploy docs"});let i=await ae(b.id,c,e,("readme"===a?"Write or refresh a clear root `README.md` for this project: what it is, prerequisites, install, run, configure (reference .env.example), and basic usage. Keep it accurate to the real code; do NOT invent features.":"Write or refresh a root `DEPLOY.md` with concrete production deploy steps for this project's stack/host: build, environment variables (reference .env.example, never real secrets), run command, and host-specific notes. Keep it accurate to the real project.")+g,h);return(0,A.I)(c.id,{runId:h,channel:"deploy",agentId:e.id,kind:"done",target:"done"}),(0,u.revalidatePath)("/prepare-deploy"),{ok:i.ok,summary:(i.text||"").slice(0,400)}}async function am(){return al("readme")}async function an(){return al("deploy")}async function ao(a){let{org:b,workspace:c}=await (0,v.nP)(),e=(a.repo||"").trim().replace(/^https?:\/\/github\.com\//i,"").replace(/\.git$/,"");if(!/^[\w.-]+\/[\w.-]+$/.test(e))return{ok:!1,error:"Use the form owner/repo."};let f=a.token?.trim()||await (0,w.r6)(c.id,"github_pat");if(!f)return{ok:!1,error:"Provide a GitHub token (or connect one in Commit GitHub first)."};let g=a=>f?a.split(f).join("***"):a;try{let a=await fetch(`https://api.github.com/repos/${e}`,{headers:{Authorization:`Bearer ${f}`,"User-Agent":"constella",Accept:"application/vnd.github+json"},signal:AbortSignal.timeout(12e3)});if(404===a.status)return{ok:!1,error:"Repo not found, or this token can't access it."};if(!a.ok)return{ok:!1,error:`GitHub ${a.status}`}}catch{return{ok:!1,error:"Couldn't reach GitHub."}}let h=(0,s.join)((0,t.tmpdir)(),"constella-export-"+(0,d.randomUUID)()),i=a.branch?.trim()||"main";try{(0,r.mkdirSync)(h,{recursive:!0});let d=Z(h,b.id);if(0===d.copied)return{ok:!1,error:"Nothing to export yet — no clean product source files were found."};await (0,y.d1)("git",["init","-b",i],{cwd:h}),await (0,y.d1)("git",["add","-A"],{cwd:h});let j=await (0,C.I)(h);if(j.findings.length)return await (0,D.vE)(c.id,{kind:"block",refType:"task",refId:`export-${e}`,title:`Export blocked — ${j.findings.length} secret risk(s)`,detail:j.findings.slice(0,5).map(a=>`${a.file}: ${a.kind}`).join("; ")}),await (0,E.I)(c.id,{kind:"security",text:`Clean export blocked — ${j.findings.length} secret risk(s)`,detail:`Resolve before exporting to ${e}.`}),(0,u.revalidatePath)("/prepare-deploy"),(0,u.revalidatePath)("/inbox"),{ok:!1,blocked:!0,secrets:j.findings,error:`Blocked: ${j.findings.length} potential secret(s) in the export set.`};await (0,y.d1)("git",["-c","user.email=agents@constella.dev","-c","user.name=Constella Agents","commit","-m",a.message?.trim()||"chore: export clean source"],{cwd:h});let k=(await (0,y.d1)("git",["rev-parse","HEAD"],{cwd:h})).stdout.trim().slice(0,7),l=`https://x-access-token:${f}@github.com/${e}.git`,m=await (0,y.d1)("git",["push","-f",l,`HEAD:${i}`],{cwd:h,timeoutMs:12e4});if(0!==m.code)return{ok:!1,error:g((m.stderr||"git push failed").slice(-300))};return await K(c.id,{lastExport:{ok:!0,sha:k,copied:d.copied,repo:e,branch:i,at:Date.now()}}),(0,u.revalidatePath)("/prepare-deploy"),{ok:!0,pushed:!0,sha:k,copied:d.copied}}catch(a){return{ok:!1,error:g(String(a instanceof Error?a.message:a))}}finally{try{(0,r.rmSync)(h,{recursive:!0,force:!0})}catch{}}}(0,L.D)([Y,_,ab,ac,ah,aj,ak,am,an,ao]),(0,q.A)(Y,"00b863b9f4f6e160a57c4d5966bb6307390ea80e53",null),(0,q.A)(_,"0072e2e8a8574b859cd4e36a2fcd0ef954e3b7da36",null),(0,q.A)(ab,"00abc3f3dad61bf5d04505f9adfe3a0cd1da7699be",null),(0,q.A)(ac,"0061123fafa00cf35f376ccd7e9d514448138dbdfd",null),(0,q.A)(ah,"00ca52b13a6ca414ed3d4b6d989660403934f8bfcf",null),(0,q.A)(aj,"00e825032ee3ad46199f05ebf9c99c7b9be10d16c6",null),(0,q.A)(ak,"003bee6576188d0c5549e13dbd1ec4707e13a18a41",null),(0,q.A)(am,"00fbb2afb29ffabe20e21e0da8227c8878069d3150",null),(0,q.A)(an,"00dfa8bc820edd74e1b585649af203588a440a069a",null),(0,q.A)(ao,"4024097bdd06dda61f6cde1a54fc69f6977bae8102",null);var ap=c(88007),aq=c(31578),ar=c(93571),as=c(10335),at=c(23297),au=c(44239);let av=`Available commands:
|
|
35
35
|
- /help — this list
|
|
36
36
|
- /kb <question> (alias /ask-kb) — ask the Knowledge Base; answers with references
|
|
37
37
|
- /status — active goals, open issues, tasks in flight
|
|
@@ -54,14 +54,14 @@ Project: ${f.framework}${f.unsetEnvKeys.length?`; undocumented env vars: ${f.uns
|
|
|
54
54
|
- /assign <issue> <@agent> — assign an issue \xb7 /telegram — Telegram integration status
|
|
55
55
|
- /models — local model status \xb7 /skills — the skills library \xb7 /locks — file locks held
|
|
56
56
|
- /close-sprint — archive what shipped + write a sprint retro
|
|
57
|
-
Mention a teammate with @handle to talk to them directly.`;async function
|
|
58
|
-
${a||"(none)"}`,s),w()}case"/agent":{await
|
|
57
|
+
Mention a teammate with @handle to talk to them directly.`;async function aw(a,b,c,e){await g.db.insert(h.message).values({id:(0,d.randomUUID)(),workspaceId:a,channel:b,fromKind:"operator",text:c.slice(0,4e3),sessionId:e})}async function ax(a,b,c,e,f,i){await g.db.insert(h.message).values({id:(0,d.randomUUID)(),workspaceId:a,channel:b,fromKind:"agent",fromHandle:c,text:e.slice(0,4e3),createdAt:new Date,sessionId:f,kind:i?.kind??null,sources:i?.sources?.length?i.sources:null})}async function ay(a,b,c,q,r){let s=await (0,k.xF)(b,q),t=r.indexOf(" "),u=(-1===t?r:r.slice(0,t)).toLowerCase(),v=(-1===t?"":r.slice(t+1)).trim(),w=(a=[])=>((0,l.r)(b),{handled:!0,responders:a});switch(u){case"/help":return await aw(b,q,r,s),await ax(b,q,"system",av,s),w();case"/kb":case"/ask-kb":{if(await aw(b,q,r,s),!v)return await ax(b,q,"vannevar","Ask a question, e.g. `/kb how does the calculation engine work?`",s),w();let c=await (0,i.ed)(a,v);return await ax(b,q,"vannevar",c.text,s,{kind:"overview"===c.mode?"kb-card":void 0,sources:c.sources}),(0,j.PD)(a),w()}case"/reindex":{await aw(b,q,r,s);let c=await (0,j.xV)(a);return await ax(b,q,"vannevar",`Reindexed the knowledge base — ${c.chunks} chunk(s)${c.embedded?" (semantic)":" (keyword fallback — embed server down)"}.`,s),w()}case"/curate":{await aw(b,q,r,s);let c=await (0,i.aE)(a),d=c.merged+c.retired+c.summarized;return await ax(b,q,"vannevar",c.ok||d>0?`Curated the KB — merged ${c.merged}, retired ${c.retired}, re-summarised ${c.summarized}, ${c.gaps} gap(s). Details in Reports/kb-health.md.`:"Nothing to curate right now (needs a few entries + available budget).",s),w()}case"/clear":{if(await aw(b,q,r,s),!/^(confirm|yes|sim)$/i.test(v))return await ax(b,q,"system","⚠️ **/clear** permanently deletes EVERY message in this conversation — the full history, the compacted context summary and the run events. The agents lose this conversation's context (your board work, goals, specs and the Knowledge Base are NOT affected). Type `/clear confirm` to proceed.",s),w();let a=(await g.db.select({id:h.message.id}).from(h.message).where((0,e.Uo)((0,e.eq)(h.message.workspaceId,b),(0,e.eq)(h.message.channel,q)))).length;return await g.db.delete(h.message).where((0,e.Uo)((0,e.eq)(h.message.workspaceId,b),(0,e.eq)(h.message.channel,q))),await g.db.delete(h.messageSummary).where((0,e.Uo)((0,e.eq)(h.messageSummary.workspaceId,b),(0,e.eq)(h.messageSummary.channel,q))),await g.db.delete(h.event).where((0,e.Uo)((0,e.eq)(h.event.workspaceId,b),(0,e.eq)(h.event.channel,q))),await ax(b,q,"system",`✓ Conversation cleared — ${a} message(s) removed.`,s,{kind:"cleared"}),w()}case"/status":{await aw(b,q,r,s);let[a,c,d]=await Promise.all([g.db.select({status:h.goal.status}).from(h.goal).where((0,e.eq)(h.goal.workspaceId,b)),g.db.select({col:h.issue.col}).from(h.issue).where((0,e.eq)(h.issue.workspaceId,b)),g.db.select({id:h.task.id}).from(h.task).where((0,e.Uo)((0,e.eq)(h.task.workspaceId,b),(0,e.eq)(h.task.col,"doing")))]),f=a.filter(a=>"active"===a.status).length,i=c.filter(a=>"done"!==a.col).length;return await ax(b,q,"system",`Status — ${f} active goal(s) \xb7 ${i} open issue(s) \xb7 ${d.length} task(s) in flight.`,s),w()}case"/agents":{await aw(b,q,r,s);let a=c.map(a=>`@${a.handle} — ${a.name} (${a.role}, ${a.status})`).join("\n");return await ax(b,q,"system",`Team:
|
|
58
|
+
${a||"(none)"}`,s),w()}case"/agent":{await aw(b,q,r,s);let a=v.replace(/^@/,"").trim().toLowerCase();if(!a)return await ax(b,q,"system","Usage: `/agent <handle>` - e.g. `/agent ada`.",s),w();let d=c.find(b=>b.handle.toLowerCase()===a);if(!d)return await ax(b,q,"system",`No agent @${a} on the roster. Use \`/agents\` to see the team.`,s),w();let e=[d.adapter||"unknown adapter",d.model||""].filter(Boolean).join(" / "),f=d.health?` / health: ${d.health}`:"";return await ax(b,q,d.handle,`**${d.name}** (@${d.handle})
|
|
59
59
|
Role: ${d.role}
|
|
60
60
|
Status: ${d.status}${f}
|
|
61
61
|
Runtime: ${e}
|
|
62
62
|
|
|
63
|
-
[Open in Agent Studio](/agents/${d.handle})`,s,{kind:"agent-card"}),w()}case"/new-goal":case"/new-work":if(!v)return await
|
|
64
|
-
${b.slice(0,8).map(a=>`- ${a.title}`).join("\n")}`).join("\n\n");return await
|
|
63
|
+
[Open in Agent Studio](/agents/${d.handle})`,s,{kind:"agent-card"}),w()}case"/new-goal":case"/new-work":if(!v)return await aw(b,q,r,s),await ax(b,q,"system","Describe the work, e.g. `/new-goal a billing page with Stripe checkout`.",s),w();return await aw(b,q,`@ada ${v}`,s),(0,j.PD)(a),w(["ada"]);case"/approve":{await aw(b,q,r,s);let[c]=await g.db.select().from(h.workspace).where((0,e.eq)(h.workspace.id,b));if(!c)return await ax(b,q,"system","No workspace found.",s),w();let d=await (0,m.wz)(a,c);return await ax(b,q,"system",`✅ Plan approved — ${d.made} task(s) queued. Use \`/run-247\` to start autonomous execution.`,s),w()}case"/reject":return await aw(b,q,r,s),await (0,m.TR)(b,v||void 0),await ax(b,q,"system",v?"↩️ Plan sent back to the CEO — reason recorded.":"↩️ Plan sent back to the CEO for revision.",s),w();case"/run-247":case"/resume":return await aw(b,q,r,s),await (0,m.mL)(b,!0),await ax(b,q,"system","▶️ 24/7 autonomous execution is ON — the team will work the board.",s),w();case"/pause":return await aw(b,q,r,s),await (0,m.mL)(b,!1),await ax(b,q,"system","⏸ 24/7 autonomous execution paused.",s),w();case"/cancel":case"/archive":{await aw(b,q,r,s);let[c]=await g.db.select({id:h.goal.id,title:h.goal.title}).from(h.goal).where((0,e.Uo)((0,e.eq)(h.goal.workspaceId,b),(0,e.eq)(h.goal.status,"active"))).orderBy((0,f.i)(h.goal.createdAt)).limit(1);if(!c)return await ax(b,q,"system",`No active goal to ${"/cancel"===u?"cancel":"archive"}.`,s),w();if("/cancel"===u){let a=await (0,n.NF)(b,c.id);await ax(b,q,"system",a.ok?`🛑 Cancelled — ${a.title}. Execution stopped; reopen it in Goals to resume.`:"Couldn't cancel the goal.",s)}else{let d=await (0,n.PT)(a,b,c.id);await ax(b,q,"system",d.ok?`📦 Archived — ${d.title} → ${d.path}.`:"Couldn't archive the goal.",s)}return w()}case"/new-issue":{if(await aw(b,q,r,s),!v)return await ax(b,q,"system","Give a title, e.g. `/new-issue add a logout button`.",s),w();let a=String((await g.db.select({id:h.issue.id}).from(h.issue).where((0,e.eq)(h.issue.workspaceId,b))).length+1);return await g.db.insert(h.issue).values({id:(0,d.randomUUID)(),workspaceId:b,key:a,title:v.slice(0,200),col:"todo",prio:"med"}),await ax(b,q,"system",`📝 Issue #${a} created — ${v.slice(0,120)}. Open the Product Manager to size + assign it.`,s),w()}case"/new-spec":{if(await aw(b,q,r,s),!v)return await ax(b,q,"system","Give a title, e.g. `/new-spec billing architecture`.",s),w();let a=(await g.db.select({id:h.spec.id}).from(h.spec).where((0,e.eq)(h.spec.workspaceId,b))).length,c=`SPEC-${String(a+1).padStart(2,"0")}`;return await g.db.insert(h.spec).values({id:(0,d.randomUUID)(),workspaceId:b,key:c,title:v.slice(0,200)}),await ax(b,q,"system",`📄 Spec ${c} created — ${v.slice(0,120)}.`,s),w()}case"/search":{if(await aw(b,q,r,s),!v)return await ax(b,q,"vannevar","Search what? e.g. `/search how does auth work`.",s),w();let c=await (0,i.ed)(a,v);return await ax(b,q,"vannevar",c.text,s,{kind:"overview"===c.mode?"kb-card":void 0,sources:c.sources}),(0,j.PD)(a),w()}case"/graph":{if(await aw(b,q,r,s),!v)return await ax(b,q,"vannevar","Give a spec/issue key or a goal title, e.g. `/graph SPEC-01`.",s),w();let[c]=await g.db.select({id:h.spec.id}).from(h.spec).where((0,e.Uo)((0,e.eq)(h.spec.workspaceId,b),(0,e.eq)(h.spec.key,v))),[d]=c?[void 0]:await g.db.select({id:h.issue.id}).from(h.issue).where((0,e.Uo)((0,e.eq)(h.issue.workspaceId,b),(0,e.eq)(h.issue.key,v))),[f]=c||d?[void 0]:await g.db.select({id:h.goal.id}).from(h.goal).where((0,e.Uo)((0,e.eq)(h.goal.workspaceId,b),(0,e.mj)(h.goal.title,`%${v}%`))),j=c?{specId:c.id}:d?{issueId:d.id}:f?{goalId:f.id}:null;if(!j)return await ax(b,q,"vannevar",`No goal / spec / issue matches \`${v}\`.`,s),w();let k=await (0,i.Mn)(a,j);if(!k||!k.nodes.length)return await ax(b,q,"vannevar",`No connected knowledge for \`${v}\` yet — it grows as the team works.`,s),w();let l=Object.entries(k.byType).map(([a,b])=>`**${a}** (${b.length})
|
|
64
|
+
${b.slice(0,8).map(a=>`- ${a.title}`).join("\n")}`).join("\n\n");return await ax(b,q,"vannevar",`🕸️ Connections for \`${v}\` — ${k.nodes.length} related item(s):
|
|
65
65
|
|
|
66
|
-
${l}`,s,{kind:"kb-card"}),w()}case"/test-dev":{await
|
|
67
|
-
${a.slice(0,15).map(a=>`- \`${a.path}\` — @${a.agentHandle}`).join("\n")}`:"\uD83D\uDD13 No file locks held right now.",s),w()}case"/generate-plan":{await
|
|
66
|
+
${l}`,s,{kind:"kb-card"}),w()}case"/test-dev":{await aw(b,q,r,s),await ax(b,q,"edsger","\uD83E\uDDEA Running the Test Dev validation gate…",s);let a=await (0,o.Xu)();return await ax(b,q,"edsger",`Test Dev — **${a.status}**.${a.summary?` ${a.summary}`:""}`,s),w()}case"/github":{await aw(b,q,r,s);let a=await (0,p.Iq)();return await ax(b,q,"werner",a.ok?`🐙 GitHub — ${a.changed} changed file(s) detected. Open the GitHub module to commit + push.`:"\uD83D\uDC19 GitHub — couldn't read the repository status (is this a git repo?).",s),w()}case"/assign":{await aw(b,q,r,s);let a=v.match(/^(\S+)\s+@?(\S+)$/);if(!a)return await ax(b,q,"system","Usage: `/assign <issue-key> <@agent>` — e.g. `/assign 3 @margaret`.",s),w();let[,c,d]=a,[f]=await g.db.select({id:h.issue.id}).from(h.issue).where((0,e.Uo)((0,e.eq)(h.issue.workspaceId,b),(0,e.eq)(h.issue.key,c)));if(!f)return await ax(b,q,"system",`No issue #${c} on the board.`,s),w();let[i]=await g.db.select({id:h.agent.id,name:h.agent.name}).from(h.agent).where((0,e.Uo)((0,e.eq)(h.agent.workspaceId,b),(0,e.eq)(h.agent.handle,d.toLowerCase())));if(!i)return await ax(b,q,"system",`No agent @${d.toLowerCase()} on the roster.`,s),w();return await g.db.update(h.issue).set({assigneeId:i.id}).where((0,e.eq)(h.issue.id,f.id)),await ax(b,q,"system",`👤 Issue #${c} assigned to ${i.name} (@${d.toLowerCase()}).`,s),w()}case"/review":{let a=c.find(a=>/cybersec|security|qa/i.test(a.role))??c.find(a=>"whitfield"===a.handle);if(!a)return await aw(b,q,r,s),await ax(b,q,"system","No reviewer agent (CyberSec/QA) on the roster.",s),w();return await aw(b,q,`@${a.handle} review the recent changes on the board${v?`: ${v}`:""}.`,s),w([a.handle])}case"/prepare-deploy":{await aw(b,q,r,s),await ax(b,q,"werner","\uD83D\uDE80 Running the Prepare-Deploy pipeline — this can take a minute; live progress is in the Prepare Deploy module.",s);let a=await ah();return await ax(b,q,"werner",`Prepare-Deploy — **${a.status}**.${a.summary?` ${a.summary}`:""}`,s),w()}case"/export-source":{if(await aw(b,q,r,s),!v)return await ax(b,q,"system","Usage: `/export-source <github-repo>` — e.g. `/export-source myorg/constella-public`.",s),w();let a=await ao({repo:v.split(/\s+/)[0]});return await ax(b,q,"werner",a.ok?`📦 Exported the clean source${a.sha?` (${a.sha.slice(0,7)})`:""}${a.copied?` — ${a.copied} file(s)`:""}.`:a.blocked?`🛑 Export blocked — ${a.secrets?.length??0} secret finding(s). Resolve them first.`:`Export failed${a.error?` — ${a.error}`:""}.`,s),w()}case"/telegram":{await aw(b,q,r,s);let a=await (0,ap._9)(b);return await ax(b,q,"system",a?`📲 Telegram is configured — bot connected, alerts route to the allowlisted chat${a.allowedName?` (${a.allowedName})`:""}.`:"\uD83D\uDCF2 Telegram is not configured. Add a bot token + chat id in Settings → Integrations.",s),w()}case"/models":{await aw(b,q,r,s);let[a,c]=await Promise.all([(0,aq.VH)(),(0,aq.LU)()]),d=[c.up?`llama.cpp: up${c.model?` (${c.model})`:""}`:"llama.cpp: down",a.up?`Ollama: up — ${a.models.length} model(s)${a.models.length?`: ${a.models.slice(0,6).map(a=>a.name).join(", ")}`:""}`:"Ollama: not running"];return await ax(b,q,"system",`🧠 Local models — ${d.join(" \xb7 ")}. Browse + download in the Models module.`,s),w()}case"/skills":{await aw(b,q,r,s);let a=(0,ar.Ws)();return await ax(b,q,"system",`📚 Skills library — ${a.length} skill(s). Sample: ${a.slice(0,12).join(", ")}${a.length>12?" …":""}. Enable/disable per agent in Agent Studio → Skills.`,s),w()}case"/locks":{await aw(b,q,r,s);let a=await (0,as.h6)(b);return await ax(b,q,"system",a.length?`🔒 ${a.length} file lock(s) held:
|
|
67
|
+
${a.slice(0,15).map(a=>`- \`${a.path}\` — @${a.agentHandle}`).join("\n")}`:"\uD83D\uDD13 No file locks held right now.",s),w()}case"/generate-plan":{await aw(b,q,r,s);let[c]=await g.db.select().from(h.workspace).where((0,e.eq)(h.workspace.id,b));if(!c)return await ax(b,q,"system","No workspace found.",s),w();let d=await (0,at.generatePlanFor)(a,c,v?{brief:v}:void 0);return await ax(b,q,"ada",d.ok?"\uD83E\uDDED Plan generation started — drafting specs → issues → TODOs; it'll appear in the CEO Planner for your approval.":`Couldn't start plan generation${d.error?` — ${d.error}`:""}.`,s),w()}case"/close-sprint":{await aw(b,q,r,s);let c=await (0,au.MO)(a,b);return await ax(b,q,"donald",c.ok?`🏁 Sprint closed — ${c.shipped} shipped, ${c.carried} carried over. Retro written to \`${c.path}\`.`:"Nothing to close — no issues are in Done yet.",s),w()}default:return await aw(b,q,r,s),await ax(b,q,"system",`Unknown command \`${u}\`. Try \`/help\`.`,s),w()}}}};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";exports.id=535,exports.ids=[535,7336],exports.modules={4719:(a,b,c)=>{c.d(b,{ViewChrome:()=>d});let d=(0,c(62060).registerClientReference)(function(){throw Error("Attempted to call ViewChrome() from the server but ViewChrome is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"C:\\Users\\Usuario\\Documents\\constella\\src\\components\\shell\\view-chrome.tsx","ViewChrome")},5323:(a,b,c)=>{c.d(b,{_:()=>g});var d=c(61576),e=c(1308),f=c(4719);function g({title:a,sub:b,right:c,icon:h,flush:i,children:j}){return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(e.b,{title:a}),(0,d.jsx)(f.ViewChrome,{title:a,sub:b,right:c,icon:h,flush:i,children:j})]})}},9842:(a,b,c)=>{c.d(b,{IZ:()=>k,Ix:()=>j,ZF:()=>m,h6:()=>n,w1:()=>l});var d=c(1782),e=c(76760),f=c(80280),g=c(25533),h=c(18612),i=c(54033);function j(a,b){if(!b)return null;let c=(0,h.HZ)(a),d=((0,e.isAbsolute)(b)?(0,e.relative)(c,b):b).replace(/\\/g,"/");return!d||d.startsWith("..")||d.startsWith(".git/")||d.startsWith(".claude/")||d.startsWith("archives/")?null:d}async function k(a,b,c){let e=(0,d.Uo)((0,d.eq)(g.fileLock.workspaceId,a),(0,d.eq)(g.fileLock.path,b)),[h]=await f.db.select().from(g.fileLock).where(e);if(h){let a=!!c.taskId&&h.taskId===c.taskId,b=!h.taskId&&!!c.agentId&&h.agentId===c.agentId;return a||b?(await f.db.update(g.fileLock).set({heartbeatAt:new Date}).where(e),{ok:!0}):{ok:!1,heldBy:{handle:h.agentHandle,taskId:h.taskId}}}try{return await f.db.insert(g.fileLock).values({workspaceId:a,path:b,taskId:c.taskId||"",agentId:c.agentId||"",agentHandle:c.handle||"",acquiredAt:new Date,heartbeatAt:new Date}),{ok:!0}}catch{let[a]=await f.db.select().from(g.fileLock).where(e);if(a&&(a.taskId===c.taskId||a.agentId===c.agentId))return{ok:!0};return{ok:!1,heldBy:a?{handle:a.agentHandle,taskId:a.taskId}:void 0}}}async function l(a,b){if(b)try{let c=await f.db.select({path:g.fileLock.path}).from(g.fileLock).where((0,d.Uo)((0,d.eq)(g.fileLock.workspaceId,a),(0,d.eq)(g.fileLock.taskId,b)));for(let e of(await f.db.delete(g.fileLock).where((0,d.Uo)((0,d.eq)(g.fileLock.workspaceId,a),(0,d.eq)(g.fileLock.taskId,b))),c))await (0,i.W_)(a,"task",`lock:${e.path}`)}catch{}}async function m(a=3e5){try{await f.db.delete(g.fileLock).where((0,d.lt)(g.fileLock.heartbeatAt,new Date(Date.now()-a)))}catch{}}async function n(a){try{return await f.db.select({path:g.fileLock.path,agentHandle:g.fileLock.agentHandle,taskId:g.fileLock.taskId}).from(g.fileLock).where((0,d.eq)(g.fileLock.workspaceId,a))}catch{return[]}}},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)},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"}},65879:(a,b,c)=>{c.d(b,{O:()=>e});var d=c(2910);let e=(0,d.createServerReference)("0018beb06b15d253498af2e1d83c7efb58ba1235f1",d.callServer,void 0,d.findSourceMapURL,"curateKbAction")},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)}},82658:(a,b,c)=>{c.r(b),c.d(b,{"0009ce734653f91e0152ed870ffea99c48e8be1273":()=>j.f,"0018beb06b15d253498af2e1d83c7efb58ba1235f1":()=>j.O,"001e9ef8a66d3ec2113043b24ab8849578169f7b7f":()=>n.eU,"0030de7d84721074ca2c38fb96d3e99e7adbe2b115":()=>e.y_,"004502b97d8e3fe943f13c3b5ade91831b1f1e77aa":()=>d.bt,"0045398aceb661eaa7517a21a9c934e25c61817872":()=>i.V,"006719bab2c5093e448a5b60a38be68998349f13c8":()=>k.io,"00716b109ea97d20c9f19b65b246d9ef7ef16cbddf":()=>h.x7,"0083d8bd1fd660d07c4a32afdfbaf0d4ce78f74b81":()=>k.dj,"008623b8f1ea7a05b1a03f35024e64deff3c76f40f":()=>k.eg,"00a23e99d4e912da3ad1b266a22b1a141df6bc8b94":()=>n.PG,"00a77165f7dac9a25c366aaf49ac70c5ed0cb6a63d":()=>h.Mp,"00a782e5d3c8dd68f47e067a435acd0c8fe0089219":()=>e.PE,"00a8998940c2cf6566eea709d291cf65481f19b54b":()=>e.GK,"00ab9927a86440472b5cf26fdd4def0f285a68079c":()=>e.KO,"00ad3ff5b743f7808199b27e76248692706b96f718":()=>d.xU,"00f52218f5d83e696e1dc0d0c5d065efe7965bf187":()=>n.pM,"40167414a2e3f5a222b12781ff743cf8b6ee9ad2c6":()=>g.p,"4017b268da6934678c723b13073665577f1ce75125":()=>d.VL,"40196d281dfd92714d0ecb5e9aba74dea1bee6bc80":()=>d.rd,"4022a1ccf1ac607c0265da4f487775990a4b8caded":()=>h.lR,"402e9c60aa3c6a6a0e19a64a54ffb83bac076adb9c":()=>i.F,"402fdcfeddf17de5709d551eccb08d8356339ea521":()=>k.De,"40337f5cf82830e51248818527fcc51ef672eb9a3e":()=>d.Wu,"4037371c47b3e43e6b878942db9705b7d9c6962e8a":()=>d.H7,"4063c93f1ee771828f6137bb585d64b60ae5977ed5":()=>e.jc,"4065b972fc53cae281adf85572f2891eab399b9ff9":()=>i.E_,"406ea9546f1236fb07b7a24e792f794a0bbfb38d1b":()=>h.sE,"407582551cfcbf2ac958cbe9bb798c5ab9b4596935":()=>e.RG,"408cb072e3f25c139043774855c69d936ddfb60fd8":()=>i.VJ,"408ccd7908d2b134a54b0e8d4b0d16b030de6e0632":()=>d.gg,"409578e833742438f85eca112f74f4d631356f1cf7":()=>e.lJ,"409af259de44b27f92082eefeb0efe223bff8594fa":()=>g.L,"409ea47becd1f3f5c10a03dfe397bddcea7c125f30":()=>e.S,"40a067d42212349997f6b7b49b9b48eb75e87fe55a":()=>m.y,"40aca5e636733f4a71e30c5ee0da0e058892463f10":()=>n.Kg,"40afa32b6c37457e72bff11c25b8cb3acfad4e3d2d":()=>d.GW,"40bf46adf5ba85892bebf71f92748ed2bcbfecf292":()=>e.ey,"40c4dec4c26a6ed0bdf72098c743c4c2cb18ed1cd1":()=>n.lP,"40c85820def5803f3a9d54d933eb918b15d90b838a":()=>e.r7,"40ef945934daa47611bdb93b4cbc8906eb0f5ad253":()=>l.IL,"40f10406b426a9c38439a687284a721ddbf811f921":()=>i.zS,"40f7b5622fafa7f742d8cc68158fcbfd9b1ce99871":()=>l.q4,"40f7fd7992a8b9392597609349e63fb2460027c08a":()=>l.TX,"602483e14c0bdc4b5eb30468c3ef23b28e28b0df97":()=>e.q$,"604b3f96e4b0483edec3ec9f2f6daeac4fcdc8bbb1":()=>e.AA,"606af24aba1c9b79ec8a417abc29b49313f2de6b86":()=>l.Jp,"60736041a12fa374b1b47fa833b667d9d2d0997de2":()=>l.bk,"60761f3f2a77c81adf9da9b9d32b82e6d23912ccb9":()=>d.Fu,"6095694ef9c93f4af4573c8b78ab38c64e22c7215f":()=>l.bV,"60a238957762b5625582695c05d90f75b394483f2c":()=>f.I,"60b2447c6f65739ea8d93d715725c1f01851420aff":()=>e.LZ,"60b839ac7ca9a330595b14f8e699f9d128893bea16":()=>d.ME,"60bdbc934306dcff3e399beddf0cac16ca1290c000":()=>d.rm,"60da28e0e8059b61b3e22ba0d80a0bc367b5f79ae2":()=>d.n4,"60dba9908002f3000f3e7e8a0a7750d94f4e462c3d":()=>f.k,"60f9632ed57030592852ca206eb7d314c4bd1c4650":()=>d.jw,"705bb57bae647e5b0983590ed14a5926a22e285733":()=>d._z,"70c7731b108f014faf75e2ba778682d83c81ad6646":()=>e.M8});var d=c(97140),e=c(15487),f=c(79505),g=c(51605),h=c(46363),i=c(46282),j=c(387),k=c(13604),l=c(7482),m=c(58169),n=c(52932)}};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";exports.id=6431,exports.ids=[6431,7336],exports.modules={4719:(a,b,c)=>{c.d(b,{ViewChrome:()=>d});let d=(0,c(62060).registerClientReference)(function(){throw Error("Attempted to call ViewChrome() from the server but ViewChrome is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"C:\\Users\\Usuario\\Documents\\constella\\src\\components\\shell\\view-chrome.tsx","ViewChrome")},5323:(a,b,c)=>{c.d(b,{_:()=>g});var d=c(61576),e=c(1308),f=c(4719);function g({title:a,sub:b,right:c,icon:h,flush:i,children:j}){return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(e.b,{title:a}),(0,d.jsx)(f.ViewChrome,{title:a,sub:b,right:c,icon:h,flush:i,children:j})]})}},25228:(a,b,c)=>{c.d(b,{e:()=>e});var d=c(61576);function e({name:a,color:b,size:c=24,health:f,image:g}){let h=Math.max(6,Math.round(.3*c)),i=Math.round(.28*c),j=g?/^(data:|https?:|\/)/.test(g)?g:`/api/upload?path=${encodeURIComponent(g)}`:null;return(0,d.jsxs)("span",{style:{position:"relative",width:c,height:c,flex:`0 0 ${c}px`,display:"inline-block"},children:[j?(0,d.jsx)("img",{src:j,alt:a,width:c,height:c,style:{width:c,height:c,borderRadius:i,objectFit:"cover",display:"block"}}):(0,d.jsx)("span",{style:{width:c,height:c,borderRadius:i,background:b,color:"#fff",display:"grid",placeItems:"center",fontSize:Math.round(.42*c),fontWeight:700},children:(a[0]||"?").toUpperCase()}),f&&(0,d.jsx)("span",{style:{position:"absolute",right:-1,bottom:-1,width:h,height:h,borderRadius:"50%",background:"alive"===f?"var(--sx-string)":"stale"===f?"var(--sx-number)":"var(--text-faint)",border:"1.5px solid var(--bg-elevated)"}})]})}},47336:(a,b,c)=>{c.d(b,{checkForUpdate:()=>
|
|
1
|
+
"use strict";exports.id=6431,exports.ids=[6431,7336],exports.modules={4719:(a,b,c)=>{c.d(b,{ViewChrome:()=>d});let d=(0,c(62060).registerClientReference)(function(){throw Error("Attempted to call ViewChrome() from the server but ViewChrome is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"C:\\Users\\Usuario\\Documents\\constella\\src\\components\\shell\\view-chrome.tsx","ViewChrome")},5323:(a,b,c)=>{c.d(b,{_:()=>g});var d=c(61576),e=c(1308),f=c(4719);function g({title:a,sub:b,right:c,icon:h,flush:i,children:j}){return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(e.b,{title:a}),(0,d.jsx)(f.ViewChrome,{title:a,sub:b,right:c,icon:h,flush:i,children:j})]})}},25228:(a,b,c)=>{c.d(b,{e:()=>e});var d=c(61576);function e({name:a,color:b,size:c=24,health:f,image:g}){let h=Math.max(6,Math.round(.3*c)),i=Math.round(.28*c),j=g?/^(data:|https?:|\/)/.test(g)?g:`/api/upload?path=${encodeURIComponent(g)}`:null;return(0,d.jsxs)("span",{style:{position:"relative",width:c,height:c,flex:`0 0 ${c}px`,display:"inline-block"},children:[j?(0,d.jsx)("img",{src:j,alt:a,width:c,height:c,style:{width:c,height:c,borderRadius:i,objectFit:"cover",display:"block"}}):(0,d.jsx)("span",{style:{width:c,height:c,borderRadius:i,background:b,color:"#fff",display:"grid",placeItems:"center",fontSize:Math.round(.42*c),fontWeight:700},children:(a[0]||"?").toUpperCase()}),f&&(0,d.jsx)("span",{style:{position:"absolute",right:-1,bottom:-1,width:h,height:h,borderRadius:"50%",background:"alive"===f?"var(--sx-string)":"stale"===f?"var(--sx-number)":"var(--text-faint)",border:"1.5px solid var(--bg-elevated)"}})]})}},47336:(a,b,c)=>{c.d(b,{checkForUpdate:()=>m});var d=c(73024),e=c(76760),f=c(30043);let g="constellai",h=null,i=a=>a.replace(/^v/,"").split("-")[0].split(".").map(a=>parseInt(a,10)||0),j=a=>a.replace(/^v/,"").split("-")[1]??"";async function k(a){try{let b=new AbortController,c=setTimeout(()=>b.abort(),3e3),d=await fetch(a,{signal:b.signal,headers:{"user-agent":"constella"}});return clearTimeout(c),d.ok?await d.json():null}catch{return null}}async function l(a){try{let b=new AbortController,c=setTimeout(()=>b.abort(),3e3),d=await fetch(a,{signal:b.signal,headers:{"user-agent":"constella"}});return clearTimeout(c),d.ok?await d.text():null}catch{return null}}async function m(a=!1){let b,c,n=function(){if(process.env.CONSTELLA_VERSION)return process.env.CONSTELLA_VERSION;try{let a=JSON.parse((0,d.readFileSync)((0,e.join)((0,f.v)(),"package.json"),"utf8"));if(a?.version)return a.version}catch{}return"0.0.0"}(),o=`npm install -g ${g}@latest`;if(!a&&h&&Date.now()-h.at<216e5)return h.info;let p=await k(`https://registry.npmjs.org/${g}/latest`),q=p?.version??null,r=!!q&&function(a,b){let c=i(a),d=i(b);for(let a=0;a<3;a++){if((c[a]||0)>(d[a]||0))return!0;if((c[a]||0)<(d[a]||0))return!1}return!j(a)&&!!j(b)}(q,n),s=null;if(r&&q){let a=await l("https://raw.githubusercontent.com/gabriel7silva/constella/main/CHANGELOG.md");s=a?function(a,b){let c=b.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),d=a.match(RegExp(`(^|\\n)##\\s*\\[?${c}\\]?[\\s\\S]*?(?=\\n##\\s|$)`));if(d)return d[0].trim();let e=a.split(/\n##\s/)[1];return e?"## "+e.trim():null}(a,q):null}let t={current:n,latest:q,updateAvailable:r,type:q?(b=i(q),c=i(n),b[0]>c[0]?"major":b[1]>c[1]?"minor":b[2]>c[2]||!j(q)&&j(n)?"patch":null):null,command:o,changelog:s};return h={at:Date.now(),info:t},t}},51221:(a,b,c)=>{c.d(b,{ViewChrome:()=>h});var d=c(4374),e=c(43526),f=c(48442),g=c(31819);function h({title:a,sub:b,right:c,icon:i,flush:j,children:k}){let l=(0,g.k)(),m=f.e.find(b=>b.title===a),n=i??m?.icon,o=m?l(`mod.${m.id}`):a;return(0,d.jsxs)("div",{className:"app-view",children:[(0,d.jsxs)("div",{className:"view-head",children:[n&&(0,d.jsx)("div",{className:"vh-icon",children:(0,d.jsx)(e.I,{name:n,size:18})}),(0,d.jsxs)("div",{style:{flex:1,minWidth:0},children:[(0,d.jsx)("div",{className:"view-title",children:o}),b&&(0,d.jsx)("div",{className:"view-sub",children:b})]}),c]}),(0,d.jsx)("div",{className:"view-body",style:j?{padding:0,overflow:"hidden"}:void 0,children:k})]})}},52932:(a,b,c)=>{c.d(b,{pM:()=>z,lP:()=>y,Kg:()=>x,eU:()=>B,PG:()=>A});var d=c(6866),e=c(53993),f=c(30043),g=c(64567),h=c(30170);function i(){return(0,h.n)()?"dev":"vps"===(0,g.T)()?"vps":"portable"===(0,g.T)()?"portable":/[\\/]_npx[\\/]/.test((0,f.v)())?"npx":"global"}var j=c(47336),k=c(73024),l=c(76760),m=c(48161),n=c(31421),o=c(57086);let p=()=>new Date().toISOString().replace(/[:.]/g,"-"),q=()=>(0,l.join)((0,o.r$)(),"backups","last-update.json");async function r(){let a=await (0,j.checkForUpdate)(!0),b=i(),c=a.command;if(!a.updateAvailable)return{ok:!0,context:b,command:c,message:"Already up to date."};let d=function(){try{let a=(0,o.r$)(),b=(0,l.join)(a,"backups",p());for(let c of((0,k.mkdirSync)(b,{recursive:!0}),[".env","constella.db","constella.db-wal","constella.db-shm"])){let d=(0,l.join)(a,c);if((0,k.existsSync)(d))try{(0,k.copyFileSync)(d,(0,l.join)(b,c))}catch{}}return b}catch{return null}}()??void 0;if("dev"===b)return{ok:!1,context:b,command:c,backupDir:d,message:"Running from source — update with: git pull && pnpm install && pnpm build"};if("npx"===b)return{ok:!1,context:b,command:c,backupDir:d,message:"npx runs an ephemeral copy — re-run: npx constellai@latest"};if("vps"===b){var e="bash scripts/vps-update.sh";try{(0,k.writeFileSync)(q(),JSON.stringify({status:"running",to:a.latest,at:p()}));let b=(0,o.r$)(),c=process.env.CONSTELLA_PKG_ROOT||process.cwd(),f=(0,l.join)(c,"bin","constella-update.mjs"),g=a.latest?["--version",a.latest]:[];return(0,n.spawn)(process.execPath,[f,"--quiet","--mode","vps","--home",b,...g],{detached:!0,stdio:"ignore",cwd:(0,m.tmpdir)()}).unref(),{ok:!0,started:!0,needsRestart:!0,context:"vps",command:e,backupDir:d,message:`Updating to ${a.latest} and restarting the service — this page reconnects in a few seconds.`}}catch(a){return{ok:!1,context:"vps",command:e,backupDir:d,message:"Couldn't launch the updater: "+String(a instanceof Error?a.message:a)}}}return function(a,b,c,d){try{(0,k.writeFileSync)(q(),JSON.stringify({status:"running",to:a.latest,at:p()}));let e=process.env.CONSTELLA_RUN_MODE||"start",f=process.env.CONSTELLA_LAUNCHER_PID||"0",g=(0,o.r$)(),h=process.env.PORT||"3000",i=process.env.CONSTELLA_PKG_ROOT||process.cwd(),j=(0,l.join)(i,"bin","constella-update.mjs"),r=a.latest?["--version",a.latest]:[];return(0,n.spawn)(process.execPath,[j,"--quiet","--pid",f,"--mode",e,"--home",g,"--port",h,...r],{detached:!0,stdio:"ignore",windowsHide:!0,cwd:(0,m.tmpdir)()}).unref(),{ok:!0,started:!0,needsRestart:!0,context:b,command:c,backupDir:d,message:`Updating to ${a.latest} and restarting — this page reconnects in a few seconds.`}}catch(a){return{ok:!1,context:b,command:c,backupDir:d,message:"Couldn't launch the updater: "+String(a instanceof Error?a.message:a)}}}(a,b,c,d)}var s=c(97603),t=c(65705),u=c(1890),v=c(10245);async function w(){let a=await t.db.select({lastPulse:u.agent.lastPulse}).from(u.agent).where((0,s.eq)(u.agent.status,"working")),b=Date.now()-v.fQ;return a.some(a=>null!=a.lastPulse&&new Date(a.lastPulse).getTime()>=b)}async function x(a=!1){return(0,j.checkForUpdate)(a)}async function y(a=!1){let[b,c]=await Promise.all([(0,j.checkForUpdate)(a),w()]);return{info:b,busy:c}}async function z(){return i()}async function A(){return(await (0,e.nP)(),await w())?{ok:!1,started:!1,blocked:!0,context:"",command:"",message:"An agent is working — pause it before updating."}:r()}async function B(){try{return JSON.parse((0,k.readFileSync)(q(),"utf8"))}catch{return{status:"idle"}}}(0,c(74252).D)([x,y,z,A,B]),(0,d.A)(x,"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)},64567:(a,b,c)=>{c.d(b,{T:()=>e});let d=["start","auth","vps","portable"];function e(){let a=process.env.CONSTELLA_RUN_MODE;return a&&d.includes(a)?a:"start"}},67949:(a,b,c)=>{c.d(b,{l:()=>g});var d=c(79676),e=c(75785);async function f(){return(0,e.e)((await (0,d.cookies)()).get("cn-lang")?.value)}async function g(){let a=await f();return(b,c)=>(0,e.t)(a,b,c)}}};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
"use strict";exports.id=7225,exports.ids=[7225,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})]})}},26787:(a,b,c)=>{c.r(b),c.d(b,{"0009ce734653f91e0152ed870ffea99c48e8be1273":()=>j.f,"0018beb06b15d253498af2e1d83c7efb58ba1235f1":()=>j.O,"001e9ef8a66d3ec2113043b24ab8849578169f7b7f":()=>y.eU,"0030de7d84721074ca2c38fb96d3e99e7adbe2b115":()=>e.y_,"004502b97d8e3fe943f13c3b5ade91831b1f1e77aa":()=>d.bt,"0045398aceb661eaa7517a21a9c934e25c61817872":()=>i.V,"006719bab2c5093e448a5b60a38be68998349f13c8":()=>k.io,"00716b109ea97d20c9f19b65b246d9ef7ef16cbddf":()=>h.x7,"0083b5532945c137cd38a880d23dc3459bf06a26dd":()=>x,"0083d8bd1fd660d07c4a32afdfbaf0d4ce78f74b81":()=>k.dj,"008623b8f1ea7a05b1a03f35024e64deff3c76f40f":()=>k.eg,"00a23e99d4e912da3ad1b266a22b1a141df6bc8b94":()=>y.PG,"00a77165f7dac9a25c366aaf49ac70c5ed0cb6a63d":()=>h.Mp,"00a782e5d3c8dd68f47e067a435acd0c8fe0089219":()=>e.PE,"00a8998940c2cf6566eea709d291cf65481f19b54b":()=>e.GK,"00ab9927a86440472b5cf26fdd4def0f285a68079c":()=>e.KO,"00ad3ff5b743f7808199b27e76248692706b96f718":()=>d.xU,"00f52218f5d83e696e1dc0d0c5d065efe7965bf187":()=>y.pM,"40167414a2e3f5a222b12781ff743cf8b6ee9ad2c6":()=>g.p,"4017b268da6934678c723b13073665577f1ce75125":()=>d.VL,"40196d281dfd92714d0ecb5e9aba74dea1bee6bc80":()=>d.rd,"4022a1ccf1ac607c0265da4f487775990a4b8caded":()=>h.lR,"402e9c60aa3c6a6a0e19a64a54ffb83bac076adb9c":()=>i.F,"402fdcfeddf17de5709d551eccb08d8356339ea521":()=>k.De,"40337f5cf82830e51248818527fcc51ef672eb9a3e":()=>d.Wu,"4037371c47b3e43e6b878942db9705b7d9c6962e8a":()=>d.H7,"4063c93f1ee771828f6137bb585d64b60ae5977ed5":()=>e.jc,"4065b972fc53cae281adf85572f2891eab399b9ff9":()=>i.E_,"406ea9546f1236fb07b7a24e792f794a0bbfb38d1b":()=>h.sE,"407582551cfcbf2ac958cbe9bb798c5ab9b4596935":()=>e.RG,"408cb072e3f25c139043774855c69d936ddfb60fd8":()=>i.VJ,"408ccd7908d2b134a54b0e8d4b0d16b030de6e0632":()=>d.gg,"409578e833742438f85eca112f74f4d631356f1cf7":()=>e.lJ,"409af259de44b27f92082eefeb0efe223bff8594fa":()=>g.L,"409ea47becd1f3f5c10a03dfe397bddcea7c125f30":()=>e.S,"40a067d42212349997f6b7b49b9b48eb75e87fe55a":()=>m.y,"40aca5e636733f4a71e30c5ee0da0e058892463f10":()=>y.Kg,"40afa32b6c37457e72bff11c25b8cb3acfad4e3d2d":()=>d.GW,"40bf46adf5ba85892bebf71f92748ed2bcbfecf292":()=>e.ey,"40c4dec4c26a6ed0bdf72098c743c4c2cb18ed1cd1":()=>y.lP,"40c85820def5803f3a9d54d933eb918b15d90b838a":()=>e.r7,"40ef945934daa47611bdb93b4cbc8906eb0f5ad253":()=>l.IL,"40f10406b426a9c38439a687284a721ddbf811f921":()=>i.zS,"40f7b5622fafa7f742d8cc68158fcbfd9b1ce99871":()=>l.q4,"40f7fd7992a8b9392597609349e63fb2460027c08a":()=>l.TX,"602483e14c0bdc4b5eb30468c3ef23b28e28b0df97":()=>e.q$,"604b3f96e4b0483edec3ec9f2f6daeac4fcdc8bbb1":()=>e.AA,"606af24aba1c9b79ec8a417abc29b49313f2de6b86":()=>l.Jp,"60736041a12fa374b1b47fa833b667d9d2d0997de2":()=>l.bk,"60761f3f2a77c81adf9da9b9d32b82e6d23912ccb9":()=>d.Fu,"608b2ddb7f4b98eb35892f6d78ac9b43ff2b5f3d81":()=>w,"6095694ef9c93f4af4573c8b78ab38c64e22c7215f":()=>l.bV,"60a238957762b5625582695c05d90f75b394483f2c":()=>f.I,"60b2447c6f65739ea8d93d715725c1f01851420aff":()=>e.LZ,"60b839ac7ca9a330595b14f8e699f9d128893bea16":()=>d.ME,"60bdbc934306dcff3e399beddf0cac16ca1290c000":()=>d.rm,"60da28e0e8059b61b3e22ba0d80a0bc367b5f79ae2":()=>d.n4,"60dba9908002f3000f3e7e8a0a7750d94f4e462c3d":()=>f.k,"60f9632ed57030592852ca206eb7d314c4bd1c4650":()=>d.jw,"705bb57bae647e5b0983590ed14a5926a22e285733":()=>d._z,"70c7731b108f014faf75e2ba778682d83c81ad6646":()=>e.M8});var d=c(97140),e=c(15487),f=c(79505),g=c(51605),h=c(46363),i=c(46282),j=c(387),k=c(13604),l=c(7482),m=c(58169),n=c(6866),o=c(77598),p=c(97603),q=c(65705),r=c(1890),s=c(53993),t=c(83963),u=c(70149),v=c(24701);async function w(a,b){let{org:c,workspace:d}=await (0,s.nP)(),[e]=await q.db.select().from(r.docIndex).where((0,p.Uo)((0,p.eq)(r.docIndex.id,a),(0,p.eq)(r.docIndex.workspaceId,d.id)));return e?(await (0,t.g)(c.id,e.path,b),{ok:!0}):{ok:!1}}async function x(){let{org:a,workspace:b}=await (0,s.nP)(),c=await q.db.select().from(r.agent).where((0,p.eq)(r.agent.workspaceId,b.id)),d=c.find(a=>"barbara"===a.handle)??c.find(a=>/docs|writer/i.test(a.role))??c[0];if(!d)return{ok:!1,error:"no docs agent"};let e=(0,u.hW)(d.adapter,d.model),f="claude"===e?d.model.includes("opus")?"opus":d.model.includes("haiku")?"haiku":"sonnet":void 0,g=`You are ${d.name} (@${d.handle}), ${d.role} at ${b.name}.
|
|
2
|
+
Review the current state of this workspace directory (code, specs, structure) and write or refresh a single piece of project documentation in GitHub-flavoured Markdown.
|
|
3
|
+
Begin with one H1 title line. Cover what exists, how it is organised, and how to work with it. Be specific and truthful — describe only what the files actually show; do not invent features.
|
|
4
|
+
Output ONLY the Markdown document (no code fences).`,h=await (0,u.JN)(g,{orgId:a.id,binary:e,model:f,timeoutMs:24e4});(h.usd>0||h.inputTokens+h.outputTokens>0)&&await q.db.insert(r.costEntry).values({id:(0,o.randomUUID)(),workspaceId:b.id,agentId:d.id,provider:h.binary,model:h.model??d.model,usd:h.usd,tokens:h.inputTokens+h.outputTokens,at:new Date});let i=h.text.trim();if(!h.ok||!i)return await (0,v.I)(b.id,{kind:"info",text:"Docs generation failed",detail:(h.error??"no output").slice(0,300),agentId:d.id}),{ok:!1,error:h.error};let j=(i.split("\n").find(a=>a.trim())??"Documentation").replace(/^#+\s*/,"").slice(0,120)||"Documentation",k=j.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,60)||"doc",l=`DOCS/${k}.md`;return await (0,t.g)(a.id,l,i),await (0,v.I)(b.id,{kind:"done",text:`${d.name} updated the docs: ${j}`,detail:`Saved to ${l}`,agentId:d.id}),{ok:!0,path:l}}(0,c(74252).D)([w,x]),(0,n.A)(w,"608b2ddb7f4b98eb35892f6d78ac9b43ff2b5f3d81",null),(0,n.A)(x,"0083b5532945c137cd38a880d23dc3459bf06a26dd",null);var y=c(52932)},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)},64567:(a,b,c)=>{c.d(b,{T:()=>e});let d=["start","auth","vps","portable"];function e(){let a=process.env.CONSTELLA_RUN_MODE;return a&&d.includes(a)?a:"start"}},67949:(a,b,c)=>{c.d(b,{l:()=>g});var d=c(79676),e=c(75785);async function f(){return(0,e.e)((await (0,d.cookies)()).get("cn-lang")?.value)}async function g(){let a=await f();return(b,c)=>(0,e.t)(a,b,c)}}};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";exports.id=7336,exports.ids=[7336],exports.modules={47336:(a,b,c)=>{c.d(b,{checkForUpdate:()=>
|
|
1
|
+
"use strict";exports.id=7336,exports.ids=[7336],exports.modules={47336:(a,b,c)=>{c.d(b,{checkForUpdate:()=>m});var d=c(73024),e=c(76760),f=c(30043);let g="constellai",h=null,i=a=>a.replace(/^v/,"").split("-")[0].split(".").map(a=>parseInt(a,10)||0),j=a=>a.replace(/^v/,"").split("-")[1]??"";async function k(a){try{let b=new AbortController,c=setTimeout(()=>b.abort(),3e3),d=await fetch(a,{signal:b.signal,headers:{"user-agent":"constella"}});return clearTimeout(c),d.ok?await d.json():null}catch{return null}}async function l(a){try{let b=new AbortController,c=setTimeout(()=>b.abort(),3e3),d=await fetch(a,{signal:b.signal,headers:{"user-agent":"constella"}});return clearTimeout(c),d.ok?await d.text():null}catch{return null}}async function m(a=!1){let b,c,n=function(){if(process.env.CONSTELLA_VERSION)return process.env.CONSTELLA_VERSION;try{let a=JSON.parse((0,d.readFileSync)((0,e.join)((0,f.v)(),"package.json"),"utf8"));if(a?.version)return a.version}catch{}return"0.0.0"}(),o=`npm install -g ${g}@latest`;if(!a&&h&&Date.now()-h.at<216e5)return h.info;let p=await k(`https://registry.npmjs.org/${g}/latest`),q=p?.version??null,r=!!q&&function(a,b){let c=i(a),d=i(b);for(let a=0;a<3;a++){if((c[a]||0)>(d[a]||0))return!0;if((c[a]||0)<(d[a]||0))return!1}return!j(a)&&!!j(b)}(q,n),s=null;if(r&&q){let a=await l("https://raw.githubusercontent.com/gabriel7silva/constella/main/CHANGELOG.md");s=a?function(a,b){let c=b.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),d=a.match(RegExp(`(^|\\n)##\\s*\\[?${c}\\]?[\\s\\S]*?(?=\\n##\\s|$)`));if(d)return d[0].trim();let e=a.split(/\n##\s/)[1];return e?"## "+e.trim():null}(a,q):null}let t={current:n,latest:q,updateAvailable:r,type:q?(b=i(q),c=i(n),b[0]>c[0]?"major":b[1]>c[1]?"minor":b[2]>c[2]||!j(q)&&j(n)?"patch":null):null,command:o,changelog:s};return h={at:Date.now(),info:t},t}}};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
"use strict";exports.id=7589,exports.ids=[7589],exports.modules={13002:(a,b,c)=>{c.d(b,{T1:()=>l,YL:()=>k,hP:()=>m});var d=c(83999),e=c(87414);let f={TypeScript:"js",JavaScript:"js",Python:"py",Go:"go",Rust:"rust",Java:"jvm",Kotlin:"jvm",Scala:"jvm","C#":"dotnet",Ruby:"ruby",PHP:"php",Elixir:"elixir",Swift:"other","C++":"other",Dart:"other"},g={"Node.js":"js",Bun:"js",Deno:"js","Python 3":"py",PyPy:"py",JVM:"jvm",".NET":"dotnet","BEAM (Erlang VM)":"elixir"},h={NestJS:"js",Fastify:"js",Express:"js",Hono:"js",Koa:"js",AdonisJS:"js",Django:"py",Flask:"py",FastAPI:"py","Spring Boot":"jvm",Spring:"jvm",Laravel:"php",Symfony:"php",CodeIgniter:"php","Ruby on Rails":"ruby",Gin:"go",Fiber:"go",Actix:"rust",Phoenix:"elixir","ASP.NET Core":"dotnet"},i={Prisma:"js",Drizzle:"js",TypeORM:"js",Sequelize:"js",Knex:"js",Mongoose:"js",SQLAlchemy:"py","Django ORM":"py",GORM:"go",Diesel:"rust"},j={js:"JavaScript/TypeScript",py:"Python",jvm:"JVM",dotnet:".NET",go:"Go",rust:"Rust",php:"PHP",ruby:"Ruby",elixir:"Elixir",other:"this"};function k(a,b,c){let e=f[(0,d.BT)(a.language)],k=(0,d.jX)(a.database),l=(0,d.jX)(a.backend);if("runtime"===b){let a=g[c];if(e&&a&&a!==e)return`Needs a ${j[a]} language`}if("backend"===b){let a=h[c];if(e&&a&&a!==e)return`Requires a ${j[a]} language`}if("orm"===b){let a=i[c];if(e&&a&&a!==e)return`${j[a]} only`;if("Mongoose"===c&&k.length>0&&!k.includes("MongoDB"))return"Mongoose needs MongoDB";if("Django ORM"===c&&!l.includes("Django"))return"Only with Django";if(l.includes("Django")&&"Django ORM"!==c&&"None"!==c)return"Django already ships its own ORM"}return null}function l(a){let b={...a},c=[],f=!0,g=0;for(;f&&g++<20;)for(let a of(f=!1,e.z)){let e=(0,d.jX)(b[a.key]);if(!e.length)continue;let g=[];for(let d of e){let e="None"===d?null:k(b,a.key,d);e?(c.push({cat:a.key,opt:d,reason:e}),f=!0):g.push(d)}g.length!==e.length&&(b={...b,[a.key]:(0,d.He)(g)})}return{stack:b,removed:c}}function m(a){let b=(0,d.jX)(a.orm).filter(a=>!["Django ORM","None"].includes(a));return(0,d.jX)(a.backend).includes("Django")&&b.length>0?`Django includes its own ORM — a second ORM (${b.join(", ")}) is usually redundant.`:null}},64567:(a,b,c)=>{c.d(b,{T:()=>e});let d=["start","auth","vps","portable"];function e(){let a=process.env.CONSTELLA_RUN_MODE;return a&&d.includes(a)?a:"start"}},65300:(a,b,c)=>{function d(a,b,c){let d=a.match(/^---\n([\s\S]*?)\n---/);if(!d)return a;let e=d[1].split("\n"),f=!1,g=e.map(a=>a.startsWith(b+":")?(f=!0,`${b}: ${c}`):a);return f||g.push(`${b}: ${c}`),a.replace(/^---\n[\s\S]*?\n
|
|
1
|
+
"use strict";exports.id=7589,exports.ids=[7589],exports.modules={13002:(a,b,c)=>{c.d(b,{T1:()=>l,YL:()=>k,hP:()=>m});var d=c(83999),e=c(87414);let f={TypeScript:"js",JavaScript:"js",Python:"py",Go:"go",Rust:"rust",Java:"jvm",Kotlin:"jvm",Scala:"jvm","C#":"dotnet",Ruby:"ruby",PHP:"php",Elixir:"elixir",Swift:"other","C++":"other",Dart:"other"},g={"Node.js":"js",Bun:"js",Deno:"js","Python 3":"py",PyPy:"py",JVM:"jvm",".NET":"dotnet","BEAM (Erlang VM)":"elixir"},h={NestJS:"js",Fastify:"js",Express:"js",Hono:"js",Koa:"js",AdonisJS:"js",Django:"py",Flask:"py",FastAPI:"py","Spring Boot":"jvm",Spring:"jvm",Laravel:"php",Symfony:"php",CodeIgniter:"php","Ruby on Rails":"ruby",Gin:"go",Fiber:"go",Actix:"rust",Phoenix:"elixir","ASP.NET Core":"dotnet"},i={Prisma:"js",Drizzle:"js",TypeORM:"js",Sequelize:"js",Knex:"js",Mongoose:"js",SQLAlchemy:"py","Django ORM":"py",GORM:"go",Diesel:"rust"},j={js:"JavaScript/TypeScript",py:"Python",jvm:"JVM",dotnet:".NET",go:"Go",rust:"Rust",php:"PHP",ruby:"Ruby",elixir:"Elixir",other:"this"};function k(a,b,c){let e=f[(0,d.BT)(a.language)],k=(0,d.jX)(a.database),l=(0,d.jX)(a.backend);if("runtime"===b){let a=g[c];if(e&&a&&a!==e)return`Needs a ${j[a]} language`}if("backend"===b){let a=h[c];if(e&&a&&a!==e)return`Requires a ${j[a]} language`}if("orm"===b){let a=i[c];if(e&&a&&a!==e)return`${j[a]} only`;if("Mongoose"===c&&k.length>0&&!k.includes("MongoDB"))return"Mongoose needs MongoDB";if("Django ORM"===c&&!l.includes("Django"))return"Only with Django";if(l.includes("Django")&&"Django ORM"!==c&&"None"!==c)return"Django already ships its own ORM"}return null}function l(a){let b={...a},c=[],f=!0,g=0;for(;f&&g++<20;)for(let a of(f=!1,e.z)){let e=(0,d.jX)(b[a.key]);if(!e.length)continue;let g=[];for(let d of e){let e="None"===d?null:k(b,a.key,d);e?(c.push({cat:a.key,opt:d,reason:e}),f=!0):g.push(d)}g.length!==e.length&&(b={...b,[a.key]:(0,d.He)(g)})}return{stack:b,removed:c}}function m(a){let b=(0,d.jX)(a.orm).filter(a=>!["Django ORM","None"].includes(a));return(0,d.jX)(a.backend).includes("Django")&&b.length>0?`Django includes its own ORM — a second ORM (${b.join(", ")}) is usually redundant.`:null}},64567:(a,b,c)=>{c.d(b,{T:()=>e});let d=["start","auth","vps","portable"];function e(){let a=process.env.CONSTELLA_RUN_MODE;return a&&d.includes(a)?a:"start"}},65300:(a,b,c)=>{function d(a,b,c){let d=a.match(/^---\n([\s\S]*?)\n---/);if(!d)return a;let e=d[1].split("\n"),f=!1,g=e.map(a=>a.startsWith(b+":")?(f=!0,`${b}: ${c}`):a);return f||g.push(`${b}: ${c}`),a.replace(/^---\n[\s\S]*?\n---/,()=>`---
|
|
2
2
|
${g.join("\n")}
|
|
3
|
-
---`)}function e(a,b,c){let d=RegExp(`(\\*\\*${b}:\\*\\*\\s*).*`);return d.test(a)?a.replace(d
|
|
3
|
+
---`)}function e(a,b,c){let d=RegExp(`(\\*\\*${b}:\\*\\*\\s*).*`);return d.test(a)?a.replace(d,(a,b)=>`${b}${c}`):a}function f(a,b,c){let d=RegExp(`(^|\\n)##\\s+${b}\\s*\\n[\\s\\S]*?(?=\\n##\\s|$)`);return d.test(a)?a.replace(d,(a,d)=>`${d}## ${b}
|
|
4
4
|
${c}`):a.replace(/\s*$/,"")+`
|
|
5
5
|
|
|
6
6
|
## ${b}
|
|
@@ -19,4 +19,4 @@ ${b}`);try{for(let b of a.mockFiles.slice(0,200)){let a=("design-mock/import/"+b
|
|
|
19
19
|
_These files were attached at onboarding and copied here as the Design module's starting point. The frontend agent uses them to build or improve the prototype before the CEO Planner generates the plan._
|
|
20
20
|
|
|
21
21
|
## Files
|
|
22
|
-
${b}`)}catch(a){console.error("[onboarding] design-mock seed failed:",a)}try{await (0,v.I)(m,{kind:"design-review",text:`Mock imported — ${a.company||"your project"}`,detail:`${a.mockFiles.length} file(s) imported into the Design module. Open Design — Grace will reconstruct the mock on the canvas to prototype + approve before planning.`,tg:!0})}catch{}}g.db.insert(h.budget).values({workspaceId:m,monthlyCapUsd:400,monthlySpentUsd:0}).run(),g.db.insert(h.plan).values({workspaceId:m,stage:4}).run();let H=[];for(let[a,b,c,d]of E){let f=(0,e.randomUUID)();if(H.push(f),g.db.insert(h.skill).values({id:f,workspaceId:m,name:a,summary:b,trigger:c,native:!0,provisional:d,indexed:d?"pending":"indexed"}).run(),!d)for(let a of Object.keys(G))g.db.insert(h.agentSkill).values({agentId:G[a],skillId:f}).run()}try{(0,A.fR)({orgId:d,wsId:m,names:(0,z.Ws)(),agentIds:G,linkNames:[]}),(0,A.J$)(m)}catch(a){console.error("[onboarding] library skill seed failed:",a)}for(let[a,b,c]of[["GitHub","Commit, push & open PRs from the workspace.",!0],["Telegram","Route reports and alerts to a channel.",!0],["Vault","Encrypted secret storage for provider keys.",!0],["Web Search","Let agents look things up while planning.",!0]])g.db.insert(h.plugin).values({id:(0,e.randomUUID)(),workspaceId:m,name:a,description:b,enabled:c,native:!0}).run();return g.db.update(h.session).set({activeOrgId:d}).where((0,B.eq)(h.session.userId,c)).run(),{ok:!0}}async function I(){let{workspace:a}=await (0,i.nP)(),b=a.settings??{},c=b.source;return c?.type&&"new"!==c.type?(g.db.update(h.workspace).set({settings:{...b,source:{...c,analyzed:!1}}}).where((0,B.eq)(h.workspace.id,a.id)).run(),{ok:!0}):{ok:!1}}(0,C.D)([D,G,H,I]),(0,d.A)(D,"
|
|
22
|
+
${b}`)}catch(a){console.error("[onboarding] design-mock seed failed:",a)}try{await (0,v.I)(m,{kind:"design-review",text:`Mock imported — ${a.company||"your project"}`,detail:`${a.mockFiles.length} file(s) imported into the Design module. Open Design — Grace will reconstruct the mock on the canvas to prototype + approve before planning.`,tg:!0})}catch{}}g.db.insert(h.budget).values({workspaceId:m,monthlyCapUsd:400,monthlySpentUsd:0}).run(),g.db.insert(h.plan).values({workspaceId:m,stage:4}).run();let H=[];for(let[a,b,c,d]of E){let f=(0,e.randomUUID)();if(H.push(f),g.db.insert(h.skill).values({id:f,workspaceId:m,name:a,summary:b,trigger:c,native:!0,provisional:d,indexed:d?"pending":"indexed"}).run(),!d)for(let a of Object.keys(G))g.db.insert(h.agentSkill).values({agentId:G[a],skillId:f}).run()}try{(0,A.fR)({orgId:d,wsId:m,names:(0,z.Ws)(),agentIds:G,linkNames:[]}),(0,A.J$)(m)}catch(a){console.error("[onboarding] library skill seed failed:",a)}for(let[a,b,c]of[["GitHub","Commit, push & open PRs from the workspace.",!0],["Telegram","Route reports and alerts to a channel.",!0],["Vault","Encrypted secret storage for provider keys.",!0],["Web Search","Let agents look things up while planning.",!0]])g.db.insert(h.plugin).values({id:(0,e.randomUUID)(),workspaceId:m,name:a,description:b,enabled:c,native:!0}).run();return g.db.update(h.session).set({activeOrgId:d}).where((0,B.eq)(h.session.userId,c)).run(),{ok:!0}}async function I(){let{workspace:a}=await (0,i.nP)(),b=a.settings??{},c=b.source;return c?.type&&"new"!==c.type?(g.db.update(h.workspace).set({settings:{...b,source:{...c,analyzed:!1}}}).where((0,B.eq)(h.workspace.id,a.id)).run(),{ok:!0}):{ok:!1}}(0,C.D)([D,G,H,I]),(0,d.A)(D,"00536887303acc0e3e97ebf762573d54c8b90c22ac",null),(0,d.A)(G,"40d1c7d07e18a0c68e0da467c8d686b3fbd482314d",null),(0,d.A)(H,"40634c805da9328a750493c980590c2cc920b3c463",null),(0,d.A)(I,"0012c7f27136f3d1a39d8b01ca56de8dc491177ccd",null)}};
|