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
|
@@ -78,7 +78,7 @@ app.get("/", (c) => c.html(HTML));
|
|
|
78
78
|
serve({ fetch: app.fetch, port: PORT, hostname: "127.0.0.1" }, () => console.log("listening on http://127.0.0.1:" + PORT));
|
|
79
79
|
`)],[".gitignore",i],[".env.example",m]]}function p(a){return{p:e(a.company),obj:a.objective?.trim()||"this product",chips:g(a.stack)}}function q(a){let b=e(a.company);return`:root{color-scheme:dark}body{margin:0;min-height:100vh;display:grid;place-items:center;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;background:radial-gradient(1200px 800px at 70% -10%,#${b.c2}33,transparent),linear-gradient(160deg,#${b.c1},#05060d);color:#e8eaf2}.card{max-width:680px;padding:48px 44px;text-align:center}.badge{display:inline-block;font-size:12px;letter-spacing:.08em;text-transform:uppercase;color:#${b.c2};border:1px solid #${b.c2}55;border-radius:999px;padding:5px 14px;margin-bottom:22px}h1{font-size:52px;margin:0 0 14px;background:linear-gradient(120deg,#fff,#${b.c2});-webkit-background-clip:text;background-clip:text;color:transparent}.mission{font-size:17px;line-height:1.6;color:#c3c7d6;margin:0 0 26px}.build{font-size:14px;color:#9aa0b8;background:#ffffff0a;border:1px solid #ffffff14;border-radius:12px;padding:14px 18px;margin-bottom:22px}.build b{color:#${b.c2}}.chips{font-size:12px;color:#8b90a8;font-family:ui-monospace,monospace;margin-bottom:30px}.foot{font-size:12px;color:#6b7088}
|
|
80
80
|
`}function r(a){return`HTML = """${h(a)}"""
|
|
81
|
-
`}let s=new Set(["Next.js","Nuxt","Remix","SvelteKit","Astro","Gatsby"]);function t(a){let b=a||{},c=b.meta,d=b.frontend,e=b.backend,f=b.language;return"Next.js"===c?"next":"HTML/CSS"===d||"Vanilla JS"===d||"Static (no framework)"===c?"static":"Vite (SPA)"===c||d&&"None"!==d&&(!c||"None"===c||s.has(c))?"Vue"===d?"vite-vue":"Svelte"===d||"SvelteKit"===c?"vite-svelte":"vite-react":"Express"===e?"node-express":"Fastify"===e?"node-fastify":"Koa"===e?"node-koa":"Hono"===e?"node-hono":"NestJS"===e?"node-nest":"FastAPI"===e?"fastapi":"Flask"===e?"flask":"Django"===e?"django":"Gin"===e?"go-gin":"Actix"===e?"rust-actix":"Python"===f?"flask":"Go"===f?"go-http":"Rust"===f?"rust-axum":"TypeScript"===f||"JavaScript"===f?"vite-react":"static"}function u(a){return{id:t(a.stack),files:function(a){var b,c;let d=t(a.stack);switch(d){case"next":return function(a){let{obj:b,chips:c}=p(a),d=`export default function Home() {
|
|
81
|
+
`}let s=new Set(["Next.js","Nuxt","Remix","SvelteKit","Astro","Gatsby"]);function t(a){let b=a||{},c=b.meta,d=b.frontend,e=b.backend,f=b.language;return"Next.js"===c?"next":"SvelteKit"===c?"vite-svelte":"Nuxt"===c?"vite-vue":"HTML/CSS"===d||"Vanilla JS"===d||"Static (no framework)"===c?"static":"Vite (SPA)"===c||d&&"None"!==d&&(!c||"None"===c||s.has(c))?"Vue"===d?"vite-vue":"Svelte"===d||"SvelteKit"===c?"vite-svelte":"vite-react":"Express"===e?"node-express":"Fastify"===e?"node-fastify":"Koa"===e?"node-koa":"Hono"===e?"node-hono":"NestJS"===e?"node-nest":"FastAPI"===e?"fastapi":"Flask"===e?"flask":"Django"===e?"django":"Gin"===e?"go-gin":"Actix"===e?"rust-actix":"Python"===f?"flask":"Go"===f?"go-http":"Rust"===f?"rust-axum":"TypeScript"===f||"JavaScript"===f?"vite-react":"static"}function u(a){return{id:t(a.stack),files:function(a){var b,c;let d=t(a.stack);switch(d){case"next":return function(a){let{obj:b,chips:c}=p(a),d=`export default function Home() {
|
|
82
82
|
return (
|
|
83
83
|
<main className="card">
|
|
84
84
|
<span className="badge">● Live starter</span>
|
|
@@ -345,7 +345,7 @@ async fn main() -> std::io::Result<()> {
|
|
|
345
345
|
}
|
|
346
346
|
`],[".gitignore",l],[".env.example",m]];default:return o(a,"static")}}(a)}}},10133:(a,b,c)=>{c.d(b,{T1:()=>k});var d=c(83101),e=c(65121);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){let b={...a},c=[],k=!0,l=0;for(;k&&l++<20;)for(let a of(k=!1,e.z)){let e=(0,d.jX)(b[a.key]);if(!e.length)continue;let l=[];for(let m of e){let e="None"===m?null:function(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}(b,a.key,m);e?(c.push({cat:a.key,opt:m,reason:e}),k=!0):l.push(m)}l.length!==e.length&&(b={...b,[a.key]:(0,d.He)(l)})}return{stack:b,removed:c}}},24701:(a,b,c)=>{c.d(b,{I:()=>k});var d=c(77598),e=c(97603),f=c(65705),g=c(1890),h=c(88007);let i=new Set(["escalation","approval","needs-approval","block","blocked","security","deploy","error","alert","review","report","warn","warning","design-approval","design-pending","design-review"]);async function j(a,b){try{let c=b.kind??"info";if(!(!0===b.tg||!1!==b.tg&&i.has(c)))return;let[d]=await f.db.select({orgId:g.workspace.orgId}).from(g.workspace).where((0,e.eq)(g.workspace.id,a));if(!d)return;let[j]=await f.db.select({ownerId:g.organization.ownerId}).from(g.organization).where((0,e.eq)(g.organization.id,d.orgId));if(!j)return;let[k]=await f.db.select().from(g.notificationPref).where((0,e.eq)(g.notificationPref.userId,j.ownerId));if(k&&!1===k.telegram)return;let l=await (0,h._9)(a);if(!l)return;let m=c.replace(/[-_]/g," ").toUpperCase(),n=`🔔 ${m}
|
|
347
347
|
${b.text}${b.detail?`
|
|
348
|
-
${b.detail}`:""}`.slice(0,3400);await (0,h.bT)(l.botToken,l.chatId,n,"approval"===c||"needs-approval"===c?[[{text:"✅ Approve",data:"approve_plan"},{text:"▶️ Start execution",data:"start_exec"}],[{text:"\uD83D\uDCDD Review",data:"review"},{text:"↩️ Reject",data:"reject_plan"}]]:"design-approval"===c?[[{text:"✅ Approve & send to execution",data:"approve_design"}],[{text:"\uD83D\uDCDD Review",data:"review_design"},{text:"↩️ Request changes",data:"reject_design"}]]:"design-pending"===c||"design-review"===c?[[{text:"\uD83D\uDCDD Review design",data:"review_design"},{text:"\uD83D\uDCCA Status",data:"status"}]]:[[{text:"\uD83D\uDCDD Review",data:"review"},{text:"\uD83D\uDCCA Status",data:"status"}]])}catch{}}async function k(a,b){await f.db.insert(g.notification).values({id:(0,d.randomUUID)(),workspaceId:a,kind:b.kind??"info",text:b.text,detail:b.detail??"",agentId:b.agentId??null,messageId:b.messageId??null,channel:b.channel??""}),await j(a,b)}},29803:(a,b,c)=>{c.d(b,{WQ:()=>d,kH:()=>f});let d=[{id:"anthropic",displayName:"Anthropic",category:"cloud_api",connectionTypes:["api_key","oauth"],defaultAdapter:"http_anthropic",baseUrl:"https://api.anthropic.com",supportsModelSync:!0,supportsApiKey:!0,supportsOAuth:!0,supportsVision:!0,supportsTools:!0,status:"available",notes:"Claude family. Model list mapped from provider capabilities."},{id:"openai",displayName:"OpenAI",category:"cloud_api",connectionTypes:["api_key","oauth"],defaultAdapter:"http_openai",baseUrl:"https://api.openai.com/v1",supportsModelSync:!0,supportsApiKey:!0,supportsOAuth:!0,supportsVision:!0,supportsTools:!0,status:"available",notes:"GPT-4o/o-series + DALL\xb7E + Whisper."},{id:"google_gemini",displayName:"Google AI / Gemini",category:"cloud_api",connectionTypes:["api_key","oauth"],defaultAdapter:"http_google",baseUrl:"https://generativelanguage.googleapis.com",supportsModelSync:!0,supportsApiKey:!0,supportsOAuth:!0,supportsVision:!0,supportsTools:!0,status:"available",notes:"Gemini 1.5/2.x via AI Studio API key."},{id:"xai_grok",displayName:"xAI / Grok",category:"cloud_api",connectionTypes:["api_key"],defaultAdapter:"http_xai",baseUrl:"https://api.x.ai/v1",supportsModelSync:!0,supportsApiKey:!0,supportsOAuth:!1,supportsVision:!0,supportsTools:!0,status:"available",notes:"OpenAI-compatible REST. Grok-2/3."},{id:"deepseek",displayName:"DeepSeek",category:"cloud_api",connectionTypes:["api_key"],defaultAdapter:"http_deepseek",baseUrl:"https://api.deepseek.com",supportsModelSync:!0,supportsApiKey:!0,supportsOAuth:!1,supportsTools:!0,status:"available",notes:"deepseek-chat / deepseek-reasoner."},{id:"cohere",displayName:"Cohere",category:"cloud_api",connectionTypes:["api_key"],defaultAdapter:"http_cohere",baseUrl:"https://api.cohere.com/v2",supportsModelSync:!0,supportsApiKey:!0,supportsOAuth:!1,supportsTools:!0,status:"available",notes:"Command R/R+ and strong rerank/embeddings."},{id:"ai21",displayName:"AI21",category:"cloud_api",connectionTypes:["api_key"],defaultAdapter:"http_ai21",baseUrl:"https://api.ai21.com/studio/v1",supportsModelSync:!1,supportsApiKey:!0,supportsOAuth:!1,status:"experimental"},{id:"perplexity",displayName:"Perplexity",category:"cloud_api",connectionTypes:["api_key"],defaultAdapter:"http_perplexity",baseUrl:"https://api.perplexity.ai",supportsModelSync:!1,supportsApiKey:!0,supportsOAuth:!1,status:"available"},{id:"groq",displayName:"Groq",category:"cloud_api",connectionTypes:["api_key"],defaultAdapter:"http_groq",baseUrl:"https://api.groq.com/openai/v1",supportsModelSync:!0,supportsApiKey:!0,supportsOAuth:!1,supportsTools:!0,status:"available",notes:"Ultra-low-latency LPU inference, OpenAI-compatible."},{id:"nvidia_nim",displayName:"NVIDIA / NIM",category:"cloud_api",connectionTypes:["api_key"],defaultAdapter:"http_nvidia",baseUrl:"https://integrate.api.nvidia.com/v1",supportsModelSync:!0,supportsApiKey:!0,supportsOAuth:!1,supportsVision:!0,supportsTools:!0,status:"available",notes:"NIM microservices, OpenAI-compatible."},{id:"together",displayName:"Together AI",category:"cloud_api",connectionTypes:["api_key"],defaultAdapter:"http_together",baseUrl:"https://api.together.xyz/v1",supportsModelSync:!0,supportsApiKey:!0,supportsOAuth:!1,supportsTools:!0,status:"available"},{id:"fireworks",displayName:"Fireworks AI",category:"cloud_api",connectionTypes:["api_key"],defaultAdapter:"http_fireworks",baseUrl:"https://api.fireworks.ai/inference/v1",supportsModelSync:!0,supportsApiKey:!0,supportsOAuth:!1,supportsTools:!0,status:"available"},{id:"cerebras",displayName:"Cerebras",category:"cloud_api",connectionTypes:["api_key"],defaultAdapter:"http_cerebras",baseUrl:"https://api.cerebras.ai/v1",supportsModelSync:!0,supportsApiKey:!0,supportsOAuth:!1,status:"available",notes:"Wafer-scale fast inference."},{id:"huggingface",displayName:"Hugging Face",category:"cloud_api",connectionTypes:["api_key"],defaultAdapter:"http_hf",baseUrl:"https://api-inference.huggingface.co",supportsModelSync:!1,supportsApiKey:!0,supportsOAuth:!1,status:"experimental"},{id:"replicate",displayName:"Replicate",category:"cloud_api",connectionTypes:["api_key"],defaultAdapter:"http_replicate",baseUrl:"https://api.replicate.com/v1",supportsModelSync:!1,supportsApiKey:!0,supportsOAuth:!1,status:"experimental"},{id:"anyscale",displayName:"Anyscale",category:"cloud_api",connectionTypes:["api_key"],defaultAdapter:"http_anyscale",baseUrl:"https://api.endpoints.anyscale.com/v1",supportsModelSync:!1,supportsApiKey:!0,supportsOAuth:!1,status:"planned",notes:"Endpoints product changing — adapter pending."},{id:"databricks",displayName:"Databricks",category:"cloud_api",connectionTypes:["api_key","oauth"],defaultAdapter:"http_databricks",supportsModelSync:!1,supportsApiKey:!0,supportsOAuth:!0,status:"requires_setup"},{id:"stability",displayName:"Stability AI",category:"image",connectionTypes:["api_key"],defaultAdapter:"http_stability",baseUrl:"https://api.stability.ai",supportsModelSync:!1,supportsApiKey:!0,supportsOAuth:!1,status:"experimental"},{id:"elevenlabs",displayName:"ElevenLabs",category:"audio",connectionTypes:["api_key"],defaultAdapter:"http_elevenlabs",baseUrl:"https://api.elevenlabs.io/v1",supportsModelSync:!0,supportsApiKey:!0,supportsOAuth:!1,status:"available",notes:"TTS / voice."},{id:"voyage",displayName:"Voyage AI",category:"embedding",connectionTypes:["api_key"],defaultAdapter:"http_voyage",baseUrl:"https://api.voyageai.com/v1",supportsModelSync:!1,supportsApiKey:!0,supportsOAuth:!1,status:"available"},{id:"jina",displayName:"Jina AI",category:"embedding",connectionTypes:["api_key"],defaultAdapter:"http_jina",baseUrl:"https://api.jina.ai/v1",supportsModelSync:!1,supportsApiKey:!0,supportsOAuth:!1,status:"available"},{id:"runpod",displayName:"RunPod",category:"cloud_api",connectionTypes:["api_key"],defaultAdapter:"http_runpod",baseUrl:"https://api.runpod.ai/v2",supportsModelSync:!1,supportsApiKey:!0,supportsOAuth:!1,status:"requires_setup"},{id:"lambda",displayName:"Lambda Labs",category:"cloud_api",connectionTypes:["api_key"],defaultAdapter:"http_lambda",baseUrl:"https://api.lambdalabs.com/v1",supportsModelSync:!0,supportsApiKey:!0,supportsOAuth:!1,status:"experimental"},{id:"modal",displayName:"Modal",category:"cloud_api",connectionTypes:["api_key","custom_endpoint"],defaultAdapter:"http_modal",supportsModelSync:!1,supportsApiKey:!0,supportsOAuth:!1,status:"requires_setup"},{id:"baseten",displayName:"Baseten",category:"cloud_api",connectionTypes:["api_key"],defaultAdapter:"http_baseten",baseUrl:"https://inference.baseten.co/v1",supportsModelSync:!1,supportsApiKey:!0,supportsOAuth:!1,status:"requires_setup"},{id:"openrouter",displayName:"OpenRouter",category:"router",connectionTypes:["api_key","oauth"],defaultAdapter:"http_openrouter",baseUrl:"https://openrouter.ai/api/v1",supportsModelSync:!0,supportsApiKey:!0,supportsOAuth:!0,supportsVision:!0,supportsTools:!0,status:"available",notes:"Aggregates 300+ models across providers — full live list."},{id:"omnirouter",displayName:"OmniRouter",category:"router",connectionTypes:["api_key"],defaultAdapter:"http_omnirouter",baseUrl:"https://api.omnirouter.ai/v1",supportsModelSync:!0,supportsApiKey:!0,supportsOAuth:!1,status:"experimental",notes:"OpenAI-compatible multi-provider router."},{id:"litellm",displayName:"LiteLLM",category:"openai_compatible",connectionTypes:["api_key","openai_compatible","custom_endpoint"],defaultAdapter:"http_litellm",baseUrl:"http://localhost:4000",supportsModelSync:!0,supportsApiKey:!0,supportsOAuth:!1,supportsTools:!0,status:"available",notes:"Self-hosted proxy; unifies 100+ providers."},{id:"portkey",displayName:"Portkey",category:"router",connectionTypes:["api_key"],defaultAdapter:"http_portkey",baseUrl:"https://api.portkey.ai/v1",supportsModelSync:!0,supportsApiKey:!0,supportsOAuth:!1,supportsTools:!0,status:"experimental",notes:"Gateway with virtual keys."},{id:"helicone",displayName:"Helicone",category:"router",connectionTypes:["api_key"],defaultAdapter:"http_helicone",baseUrl:"https://oai.helicone.ai/v1",supportsModelSync:!1,supportsApiKey:!0,supportsOAuth:!1,status:"experimental",notes:"Observability proxy in front of OpenAI-compatible providers."},{id:"openai_compatible",displayName:"OpenAI-compatible endpoint",category:"openai_compatible",connectionTypes:["openai_compatible","api_key","custom_endpoint"],defaultAdapter:"http_openai_compat",baseUrl:"https://",supportsModelSync:!0,supportsApiKey:!0,supportsOAuth:!1,supportsTools:!0,status:"available",notes:"Any server exposing /v1/chat/completions + /v1/models."},{id:"lmstudio_server",displayName:"LM Studio (OpenAI server)",category:"openai_compatible",connectionTypes:["openai_compatible","local"],defaultAdapter:"http_openai_compat",baseUrl:"http://localhost:1234/v1",supportsModelSync:!0,supportsApiKey:!1,supportsOAuth:!1,status:"available",notes:"Local OpenAI-compatible server from LM Studio."},{id:"ollama_openai",displayName:"Ollama (OpenAI endpoint)",category:"openai_compatible",connectionTypes:["openai_compatible","local"],defaultAdapter:"http_openai_compat",baseUrl:"http://localhost:11434/v1",supportsModelSync:!0,supportsApiKey:!1,supportsOAuth:!1,supportsTools:!0,status:"available",notes:"Ollama's OpenAI-compatible surface."},{id:"vllm_server",displayName:"vLLM (OpenAI server)",category:"openai_compatible",connectionTypes:["openai_compatible","local"],defaultAdapter:"http_openai_compat",baseUrl:"http://localhost:8000/v1",supportsModelSync:!0,supportsApiKey:!1,supportsOAuth:!1,supportsTools:!0,status:"available",notes:"High-throughput self-hosted serving."},{id:"tgi",displayName:"Text Generation Inference",category:"openai_compatible",connectionTypes:["openai_compatible","local","custom_endpoint"],defaultAdapter:"http_openai_compat",baseUrl:"http://localhost:8080/v1",supportsModelSync:!0,supportsApiKey:!1,supportsOAuth:!1,status:"experimental",notes:"HF TGI with OpenAI route."},{id:"localai",displayName:"LocalAI",category:"openai_compatible",connectionTypes:["openai_compatible","local"],defaultAdapter:"http_openai_compat",baseUrl:"http://localhost:8080/v1",supportsModelSync:!0,supportsApiKey:!1,supportsOAuth:!1,status:"available",notes:"Drop-in OpenAI replacement, fully local."},{id:"azure_openai",displayName:"Azure OpenAI",category:"cloud_platform",connectionTypes:["api_key","oauth"],defaultAdapter:"http_azure_openai",supportsModelSync:!1,supportsApiKey:!0,supportsOAuth:!0,supportsVision:!0,supportsTools:!0,status:"requires_setup"},{id:"aws_bedrock",displayName:"AWS Bedrock",category:"cloud_platform",connectionTypes:["api_key","custom_endpoint"],defaultAdapter:"sdk_bedrock",supportsModelSync:!0,supportsApiKey:!0,supportsOAuth:!1,supportsVision:!0,supportsTools:!0,status:"requires_setup",notes:"SigV4 auth; multi-vendor models."},{id:"vertex_ai",displayName:"Google Vertex AI",category:"cloud_platform",connectionTypes:["oauth","api_key"],defaultAdapter:"sdk_vertex",supportsModelSync:!0,supportsApiKey:!0,supportsOAuth:!0,supportsVision:!0,supportsTools:!0,status:"requires_setup",notes:"GCP service-account / ADC."},{id:"cloudflare",displayName:"Cloudflare Workers AI",category:"cloud_platform",connectionTypes:["api_key"],defaultAdapter:"http_cloudflare",baseUrl:"https://api.cloudflare.com/client/v4",supportsModelSync:!0,supportsApiKey:!0,supportsOAuth:!1,status:"experimental"},{id:"oci_genai",displayName:"Oracle OCI Generative AI",category:"cloud_platform",connectionTypes:["api_key","custom_endpoint"],defaultAdapter:"sdk_oci",supportsModelSync:!1,supportsApiKey:!0,supportsOAuth:!1,status:"planned",notes:"OCI SDK signing — adapter pending."},{id:"watsonx",displayName:"IBM watsonx",category:"cloud_platform",connectionTypes:["api_key","oauth"],defaultAdapter:"http_watsonx",supportsModelSync:!1,supportsApiKey:!0,supportsOAuth:!0,status:"requires_setup"},{id:"dashscope",displayName:"Alibaba DashScope / Qwen",category:"cloud_platform",connectionTypes:["api_key"],defaultAdapter:"http_dashscope",baseUrl:"https://dashscope-intl.aliyuncs.com/compatible-mode/v1",supportsModelSync:!0,supportsApiKey:!0,supportsOAuth:!1,supportsVision:!0,supportsTools:!0,status:"experimental",notes:"Qwen models, OpenAI-compatible mode."},{id:"qianfan",displayName:"Baidu Qianfan",category:"cloud_platform",connectionTypes:["api_key","oauth"],defaultAdapter:"http_qianfan",supportsModelSync:!1,supportsApiKey:!0,supportsOAuth:!0,status:"planned",notes:"ERNIE; access-token auth — adapter pending."},{id:"hunyuan",displayName:"Tencent Hunyuan",category:"cloud_platform",connectionTypes:["api_key"],defaultAdapter:"http_hunyuan",supportsModelSync:!1,supportsApiKey:!0,supportsOAuth:!1,status:"planned",notes:"TC3-HMAC signing — adapter pending."},{id:"zhipu",displayName:"Zhipu AI (GLM)",category:"cloud_platform",connectionTypes:["api_key"],defaultAdapter:"http_zhipu",baseUrl:"https://open.bigmodel.cn/api/paas/v4",supportsModelSync:!1,supportsApiKey:!0,supportsOAuth:!1,supportsVision:!0,supportsTools:!0,status:"experimental"},{id:"moonshot",displayName:"Moonshot AI / Kimi",category:"cloud_platform",connectionTypes:["api_key"],defaultAdapter:"http_moonshot",baseUrl:"https://api.moonshot.cn/v1",supportsModelSync:!0,supportsApiKey:!0,supportsOAuth:!1,supportsTools:!0,status:"experimental",notes:"OpenAI-compatible; long context."},{id:"minimax",displayName:"MiniMax",category:"cloud_platform",connectionTypes:["api_key"],defaultAdapter:"http_minimax",baseUrl:"https://api.minimax.chat/v1",supportsModelSync:!1,supportsApiKey:!0,supportsOAuth:!1,status:"planned",notes:"Group-id + key auth — adapter pending."},{id:"ollama",displayName:"Ollama",category:"local_runtime",connectionTypes:["local","cli"],defaultAdapter:"local_ollama",baseUrl:"http://localhost:11434",supportsModelSync:!0,supportsApiKey:!1,supportsOAuth:!1,supportsVision:!0,supportsTools:!0,status:"available",notes:"Pulls + serves local models; live /api/tags list."},{id:"llamacpp",displayName:"llama.cpp",category:"local_runtime",connectionTypes:["local"],defaultAdapter:"local_llamacpp",baseUrl:"http://127.0.0.1:8082",supportsModelSync:!0,supportsApiKey:!1,supportsOAuth:!1,status:"available",notes:"GGUF models, SHA-256 verified, bound to 127.0.0.1."},{id:"lmstudio",displayName:"LM Studio",category:"local_runtime",connectionTypes:["local"],defaultAdapter:"local_lmstudio",baseUrl:"http://localhost:1234",supportsModelSync:!0,supportsApiKey:!1,supportsOAuth:!1,supportsVision:!0,status:"available",notes:"Desktop runtime + local server."},{id:"vllm",displayName:"vLLM",category:"local_runtime",connectionTypes:["local"],defaultAdapter:"local_vllm",baseUrl:"http://localhost:8000",supportsModelSync:!0,supportsApiKey:!1,supportsOAuth:!1,supportsTools:!0,status:"available",notes:"GPU serving engine."},{id:"localai_rt",displayName:"LocalAI",category:"local_runtime",connectionTypes:["local"],defaultAdapter:"local_localai",baseUrl:"http://localhost:8080",supportsModelSync:!0,supportsApiKey:!1,supportsOAuth:!1,status:"available"},{id:"gpt4all",displayName:"GPT4All",category:"local_runtime",connectionTypes:["local"],defaultAdapter:"local_gpt4all",baseUrl:"http://localhost:4891/v1",supportsModelSync:!0,supportsApiKey:!1,supportsOAuth:!1,status:"experimental"},{id:"koboldcpp",displayName:"KoboldCpp",category:"local_runtime",connectionTypes:["local"],defaultAdapter:"local_kobold",baseUrl:"http://localhost:5001",supportsModelSync:!1,supportsApiKey:!1,supportsOAuth:!1,status:"experimental"},{id:"jan",displayName:"Jan",category:"local_runtime",connectionTypes:["local"],defaultAdapter:"local_jan",baseUrl:"http://localhost:1337/v1",supportsModelSync:!0,supportsApiKey:!1,supportsOAuth:!1,status:"experimental"},{id:"anythingllm",displayName:"AnythingLLM (local)",category:"local_runtime",connectionTypes:["local","api_key"],defaultAdapter:"local_anythingllm",baseUrl:"http://localhost:3001/api",supportsModelSync:!1,supportsApiKey:!0,supportsOAuth:!1,status:"planned",notes:"Workspace API — adapter pending."},{id:"openwebui",displayName:"Open WebUI (backend)",category:"local_runtime",connectionTypes:["local","openai_compatible"],defaultAdapter:"http_openai_compat",baseUrl:"http://localhost:3000/api",supportsModelSync:!0,supportsApiKey:!1,supportsOAuth:!1,status:"experimental"},{id:"claude_code",displayName:"Claude Code",category:"cli",connectionTypes:["cli","oauth"],defaultAdapter:"cli_claude_code",supportsModelSync:!1,supportsApiKey:!1,supportsOAuth:!0,supportsTools:!0,status:"available",notes:"Drives the local Claude Code CLI / agent."},{id:"codex_cli",displayName:"Codex CLI",category:"cli",connectionTypes:["cli"],defaultAdapter:"cli_codex",supportsModelSync:!1,supportsApiKey:!1,supportsOAuth:!1,supportsTools:!0,status:"experimental",notes:"OpenAI Codex CLI agent."},{id:"openclaw",displayName:"OpenClaw",category:"cli",connectionTypes:["cli"],defaultAdapter:"cli_openclaw",supportsModelSync:!1,supportsApiKey:!1,supportsOAuth:!1,supportsTools:!0,status:"experimental",notes:"OpenClaw CLI — headless `openclaw infer model run --json` (provider-routed). No token/cost reported."},{id:"hermes_cli",displayName:"Hermes (Nous Research)",category:"cli",connectionTypes:["cli"],defaultAdapter:"cli_hermes",supportsModelSync:!1,supportsApiKey:!1,supportsOAuth:!1,supportsTools:!0,status:"experimental",notes:"Hermes agent CLI — headless `hermes -z`. Configure providers via `hermes model`."},{id:"gemini_cli",displayName:"Gemini CLI",category:"cli",connectionTypes:["cli","oauth"],defaultAdapter:"cli_gemini",supportsModelSync:!1,supportsApiKey:!1,supportsOAuth:!0,supportsTools:!0,status:"experimental"},{id:"aider",displayName:"Aider",category:"cli",connectionTypes:["cli"],defaultAdapter:"cli_aider",supportsModelSync:!0,supportsApiKey:!1,supportsOAuth:!1,supportsTools:!0,status:"experimental",notes:"Headless `aider --message --yes-always`; provider-routed via its own env keys. Model list from `aider --list-models`. No token/cost reported."},{id:"opencode",displayName:"OpenCode",category:"cli",connectionTypes:["cli"],defaultAdapter:"cli_opencode",supportsModelSync:!0,supportsApiKey:!1,supportsOAuth:!1,supportsTools:!0,status:"experimental",notes:"Headless `opencode run`; providers via `opencode auth login`. Model list from `opencode models`. No token/cost reported."},{id:"copilot_cli",displayName:"GitHub Copilot CLI",category:"cli",connectionTypes:["cli","oauth"],defaultAdapter:"cli_copilot",supportsModelSync:!1,supportsApiKey:!1,supportsOAuth:!0,supportsTools:!0,status:"experimental",notes:"Headless `copilot -p --allow-all-tools`; sign in with the Copilot CLI. No token/cost reported."},{id:"cursor_cli",displayName:"Cursor CLI",category:"cli",connectionTypes:["cli"],defaultAdapter:"cli_cursor",supportsModelSync:!1,supportsApiKey:!1,supportsOAuth:!1,supportsTools:!0,status:"experimental",notes:"Headless `cursor-agent -p --output-format json`; sign in via `cursor-agent login`. `-p` can hang → bounded timeout. No token/cost reported."},{id:"cline_cli",displayName:"Cline CLI",category:"cli",connectionTypes:["cli"],defaultAdapter:"cli_cline",supportsModelSync:!1,supportsApiKey:!1,supportsOAuth:!1,supportsTools:!0,status:"experimental",notes:"Headless `cline --json -y`; provider-routed via its own config. No token/cost reported."},{id:"kilo_code",displayName:"Kilo Code CLI",category:"cli",connectionTypes:["cli"],defaultAdapter:"cli_kilo",supportsModelSync:!1,supportsApiKey:!1,supportsOAuth:!1,supportsTools:!0,status:"experimental",notes:"Headless `kilocode --yes`; provider-routed via its own config. No token/cost reported."},{id:"openai_cli",displayName:"OpenAI CLI",category:"cli",connectionTypes:["cli","api_key"],defaultAdapter:"cli_openai",supportsModelSync:!1,supportsApiKey:!0,supportsOAuth:!1,status:"planned",notes:"Thin CLI over the API — adapter pending."},{id:"ollama_cli",displayName:"Ollama CLI",category:"cli",connectionTypes:["cli","local"],defaultAdapter:"cli_ollama",supportsModelSync:!0,supportsApiKey:!1,supportsOAuth:!1,status:"available",notes:"`ollama run/list` driven."},{id:"custom_cli",displayName:"Custom CLI provider",category:"cli",connectionTypes:["cli","custom_endpoint"],defaultAdapter:"cli_custom",supportsModelSync:!1,supportsApiKey:!1,supportsOAuth:!1,status:"requires_setup",notes:"Define your own command + arg template."}],e=Object.fromEntries(d.map(a=>[a.id,a])),f=a=>e[a]},31578:(a,b,c)=>{c.d(b,{V$:()=>ah,Uw:()=>F,wp:()=>O,Jw:()=>X,Cp:()=>P,S8:()=>ab,kb:()=>ae,Hi:()=>ac,Vr:()=>ad,nl:()=>Y,LU:()=>Z,cm:()=>J,VH:()=>K,zO:()=>G,Gh:()=>I,I2:()=>H,ju:()=>M,Ac:()=>ag,m:()=>Q,az:()=>N,ts:()=>af,L0:()=>ai,lC:()=>aj});var d=c(6866),e=c(48161),f=c.n(e),g=c(77598),h=c(73024),i=c(31421),j=c(60547),k=c.n(j),l=c(76760),m=c(57075),n=c(46466),o=c(97603),p=c(31371),q=c(65705),r=c(1890),s=c(53993),t=c(57086),u=c(57300);function v(a,b,c=.02){let d=0;try{d=(0,h.statSync)(a).size}catch{return{ok:!1,actual:0,expected:b,message:"file missing after download"}}if(!b||b<=0)return{ok:!0,actual:d,expected:b,message:"size ok (no expected size)"};let e=d/b,f=e>=1-c&&e<=1+c;return{ok:f,actual:d,expected:b,message:f?"size verified":`size mismatch — got ${d} bytes, expected ~${b} (truncated/corrupt)`}}let w=new Map,x=[{repo:"Qwen2.5-0.5B-Instruct",paramsB:.5,kind:"chat"},{repo:"Qwen2.5-1.5B-Instruct",paramsB:1.5,kind:"chat"},{repo:"Qwen2.5-3B-Instruct",paramsB:3,kind:"chat"},{repo:"Qwen2.5-7B-Instruct",paramsB:7,kind:"chat"},{repo:"Qwen2.5-14B-Instruct",paramsB:14,kind:"chat"},{repo:"Qwen2.5-32B-Instruct",paramsB:32,kind:"chat"},{repo:"Qwen2.5-72B-Instruct",paramsB:72,kind:"chat"},{repo:"Qwen2.5-Coder-1.5B-Instruct",paramsB:1.5,kind:"code"},{repo:"Qwen2.5-Coder-3B-Instruct",paramsB:3,kind:"code"},{repo:"Qwen2.5-Coder-7B-Instruct",paramsB:7,kind:"code"},{repo:"Qwen2.5-Coder-14B-Instruct",paramsB:14,kind:"code"},{repo:"Qwen2.5-Coder-32B-Instruct",paramsB:32,kind:"code"},{repo:"Qwen3-0.6B",paramsB:.6,kind:"chat"},{repo:"Qwen3-1.7B",paramsB:1.7,kind:"chat"},{repo:"Qwen3-4B",paramsB:4,kind:"chat"},{repo:"Qwen3-8B",paramsB:8,kind:"chat"},{repo:"Qwen3-14B",paramsB:14,kind:"chat"},{repo:"Qwen3-32B",paramsB:32,kind:"chat"},{repo:"Llama-3.2-1B-Instruct",paramsB:1,kind:"chat"},{repo:"Llama-3.2-3B-Instruct",paramsB:3,kind:"chat"},{repo:"Meta-Llama-3.1-8B-Instruct",paramsB:8,kind:"chat"},{repo:"Meta-Llama-3.1-70B-Instruct",paramsB:70,kind:"chat"},{repo:"Llama-3.3-70B-Instruct",paramsB:70,kind:"chat"},{repo:"gemma-2-2b-it",paramsB:2,kind:"chat"},{repo:"gemma-2-9b-it",paramsB:9,kind:"chat"},{repo:"gemma-2-27b-it",paramsB:27,kind:"chat"},{repo:"gemma-3-1b-it",paramsB:1,kind:"chat"},{repo:"gemma-3-4b-it",paramsB:4,kind:"chat"},{repo:"gemma-3-12b-it",paramsB:12,kind:"chat"},{repo:"gemma-3-27b-it",paramsB:27,kind:"chat"},{repo:"Mistral-7B-Instruct-v0.3",paramsB:7,kind:"chat"},{repo:"Mistral-Nemo-Instruct-2407",paramsB:12,kind:"chat"},{repo:"Mistral-Small-Instruct-2409",paramsB:22,kind:"chat"},{repo:"Mistral-Small-24B-Instruct-2501",paramsB:24,kind:"chat"},{repo:"Codestral-22B-v0.1",paramsB:22,kind:"code"},{repo:"Phi-3.1-mini-4k-instruct",paramsB:3.8,kind:"chat"},{repo:"DeepSeek-R1-Distill-Qwen-1.5B",paramsB:1.5,kind:"reasoning"},{repo:"DeepSeek-R1-Distill-Qwen-7B",paramsB:7,kind:"reasoning"},{repo:"DeepSeek-R1-Distill-Qwen-14B",paramsB:14,kind:"reasoning"},{repo:"DeepSeek-R1-Distill-Qwen-32B",paramsB:32,kind:"reasoning"},{repo:"DeepSeek-R1-Distill-Llama-8B",paramsB:8,kind:"reasoning"},{repo:"DeepSeek-Coder-V2-Lite-Instruct",paramsB:16,kind:"code"},{repo:"Yi-1.5-9B-Chat",paramsB:9,kind:"chat"},{repo:"Yi-1.5-34B-Chat",paramsB:34,kind:"chat"},{repo:"granite-3.0-8b-instruct",paramsB:8,kind:"chat"},{repo:"granite-3.1-8b-instruct",paramsB:8,kind:"chat"},{repo:"SmolLM2-360M-Instruct",paramsB:.36,kind:"chat"},{repo:"SmolLM2-1.7B-Instruct",paramsB:1.7,kind:"chat"},{repo:"aya-expanse-8b",paramsB:8,kind:"chat"},{repo:"aya-expanse-32b",paramsB:32,kind:"chat"},{repo:"Falcon3-7B-Instruct",paramsB:7,kind:"chat"},{repo:"Falcon3-10B-Instruct",paramsB:10,kind:"chat"},{repo:"EXAONE-3.5-2.4B-Instruct",paramsB:2.4,kind:"chat"},{repo:"EXAONE-3.5-7.8B-Instruct",paramsB:7.8,kind:"chat"},{repo:"Qwen3.5-0.8B",paramsB:.8,kind:"chat"},{repo:"Qwen3.5-2B",paramsB:2,kind:"chat"},{repo:"Qwen3.5-9B",paramsB:9,kind:"chat"},{repo:"Qwen3.5-27B",paramsB:27,kind:"chat"},{repo:"Qwen3.5-35B-A3B",paramsB:35,kind:"chat"},{repo:"Qwen3.6-27B",paramsB:27,kind:"chat"},{repo:"Qwen3.6-35B-A3B",paramsB:35,kind:"chat"},{repo:"Qwen3-30B-A3B",paramsB:30,kind:"chat"},{repo:"Qwen3-30B-A3B-Instruct-2507",paramsB:30,kind:"chat"},{repo:"Qwen3-Next-80B-A3B-Instruct",paramsB:80,kind:"chat"},{repo:"Qwen3-4B-Thinking-2507",paramsB:4,kind:"reasoning"},{repo:"QwQ-32B",paramsB:32,kind:"reasoning"},{repo:"Qwen2.5-7B-Instruct-1M",paramsB:7,kind:"chat"},{repo:"Qwen2.5-Coder-0.5B-Instruct",paramsB:.5,kind:"code"},{repo:"Qwen2.5-Coder-3B",paramsB:3,kind:"code"},{repo:"Qwen2.5-Coder-32B",paramsB:32,kind:"code"},{repo:"Qwen2.5-Math-7B-Instruct",paramsB:7,kind:"chat"},{repo:"Qwen2-500M-Instruct",paramsB:.5,kind:"chat"},{repo:"Qwen1.5-32B-Chat",paramsB:32,kind:"chat"},{repo:"gemma-4-E2B-it",paramsB:2,kind:"chat"},{repo:"gemma-4-E4B-it",paramsB:4,kind:"chat"},{repo:"gemma-4-12B-it",paramsB:12,kind:"chat"},{repo:"gemma-4-26B-A4B-it",paramsB:26,kind:"chat"},{repo:"gemma-4-31B-it",paramsB:31,kind:"chat"},{repo:"gemma-3-270m-it",paramsB:.27,kind:"chat"},{repo:"gemma-1.1-2b-it",paramsB:2,kind:"chat"},{repo:"codegemma-2b",paramsB:2,kind:"code"},{repo:"codegemma-7b",paramsB:7,kind:"code"},{repo:"codegemma-7b-it",paramsB:7,kind:"code"},{repo:"codegemma-1.1-7b-it",paramsB:7,kind:"code"},{repo:"Ministral-3-3B-Instruct-2512",paramsB:3,kind:"chat"},{repo:"Ministral-3-8B-Instruct-2512",paramsB:8,kind:"chat"},{repo:"Ministral-3-14B-Instruct-2512",paramsB:14,kind:"chat"},{repo:"Ministral-3-3B-Reasoning-2512",paramsB:3,kind:"reasoning"},{repo:"Ministral-3-8B-Reasoning-2512",paramsB:8,kind:"reasoning"},{repo:"Ministral-3-14B-Reasoning-2512",paramsB:14,kind:"reasoning"},{repo:"Mistral-Small-3.1-24B-Instruct-2503",paramsB:24,kind:"chat"},{repo:"Mistral-Small-3.2-24B-Instruct-2506",paramsB:24,kind:"chat"},{repo:"Devstral-Small-2-24B-Instruct-2512",paramsB:24,kind:"code"},{repo:"mathstral-7B-v0.1",paramsB:7,kind:"chat"},{repo:"dolphin-2.8-mistral-7b-v02",paramsB:7,kind:"chat"},{repo:"WizardLM-2-7B",paramsB:7,kind:"chat"},{repo:"DeepSeek-R1-0528-Qwen3-8B",paramsB:8,kind:"reasoning"},{repo:"DeepSeek-R1-Distill-Llama-70B",paramsB:70,kind:"reasoning"},{repo:"deepseek-coder-1.3B-kexer",paramsB:1.3,kind:"code"},{repo:"deepseek-coder-6.7B-kexer",paramsB:6.7,kind:"code"},{repo:"granite-3.2-8b-instruct",paramsB:8,kind:"chat"},{repo:"granite-4.1-3b",paramsB:3,kind:"chat"},{repo:"granite-4.1-8b",paramsB:8,kind:"chat"},{repo:"granite-4.1-30b",paramsB:30,kind:"chat"},{repo:"Olmo-3-32B-Think",paramsB:32,kind:"reasoning"},{repo:"Seed-OSS-36B-Instruct",paramsB:36,kind:"chat"},{repo:"ERNIE-4.5-21B-A3B-PT",paramsB:21,kind:"chat"},{repo:"LFM2-24B-A2B",paramsB:24,kind:"chat"},{repo:"LFM2.5-1.2B-Instruct",paramsB:1.2,kind:"chat"},{repo:"LFM2.5-1.2B-Thinking",paramsB:1.2,kind:"reasoning"},{repo:"NVIDIA-Nemotron-3-Nano-4B",paramsB:4,kind:"chat"},{repo:"Hermes-4-70B",paramsB:70,kind:"chat"},{repo:"Llama-3.1-Tulu-3-8B",paramsB:8,kind:"chat"},{repo:"Meta-Llama-3-70B-Instruct",paramsB:70,kind:"chat"},{repo:"Llama3-ChatQA-1.5-70B",paramsB:70,kind:"chat"},{repo:"Llama-3-Groq-8B-Tool-Use",paramsB:8,kind:"chat"},{repo:"aya-23-8B",paramsB:8,kind:"chat"},{repo:"aya-23-35B",paramsB:35,kind:"chat"},{repo:"SmolLM2-135M-Instruct",paramsB:.135,kind:"chat"},{repo:"Yi-Coder-1.5B",paramsB:1.5,kind:"code"},{repo:"Yi-Coder-9B-Chat",paramsB:9,kind:"code"},{repo:"OpenCoder-1.5B-Instruct",paramsB:1.5,kind:"code"},{repo:"stable-code-instruct-3b",paramsB:3,kind:"code"},{repo:"internlm2-math-plus-7b",paramsB:7,kind:"chat"},{repo:"internlm2-math-plus-20b",paramsB:20,kind:"chat"}],y={Q3_K_L:.55,Q4_K_M:.67,Q6_K:.9,Q8_0:1.13},z=[{id:"nomic-embed-q8",name:"nomic-embed-text-v1.5 (Q8_0)",url:"https://huggingface.co/nomic-ai/nomic-embed-text-v1.5-GGUF/resolve/main/nomic-embed-text-v1.5.Q8_0.gguf",params:"137M",quant:"Q8_0",sizeBytes:146e6,kind:"embed",paramsB:.137},...function(){let a=[];for(let d of x){var b,c;let e=d.vendor??"lmstudio-community";for(let f of(b=d.paramsB)<=9?["Q3_K_L","Q4_K_M","Q6_K","Q8_0"]:b<=34?["Q3_K_L","Q4_K_M","Q6_K"]:["Q3_K_L","Q4_K_M"]){let b=`${d.repo}-${f}.gguf`;a.push({id:`${d.repo}-${f}`.toLowerCase().replace(/[^a-z0-9]+/g,"-"),name:`${d.repo} (${f})`,url:`https://huggingface.co/${e}/${d.repo}-GGUF/resolve/main/${b}`,params:(c=d.paramsB)<1?`${Math.round(1e3*c)}M`:`${c}B`,quant:f,sizeBytes:Math.round(1e9*d.paramsB*y[f]),kind:d.kind,paramsB:d.paramsB})}}return a}()];var A=c(74252);let B=process.env.OLLAMA_URL??"http://127.0.0.1:11434",C=process.env.LLAMACPP_URL??"http://127.0.0.1:8082",D=process.env.CONSTELLA_EMBED_URL??"http://127.0.0.1:8083",E=null;async function F(){if(E){let a=f().totalmem()/0x40000000,b=f().freemem()/0x40000000;return{...E,ram:`${a.toFixed(0)} GB \xb7 ${b.toFixed(1)} free`}}let a=f().cpus(),b=(a[0]?.model??"Unknown CPU").replace(/\s+/g," ").trim(),c=a.length,d=f().totalmem()/0x40000000,e=f().freemem()/0x40000000,g=`${d.toFixed(0)} GB \xb7 ${e.toFixed(1)} free`,h=f().platform(),j="—",k="—",l="CPU",m=[];try{let a=(0,i.execSync)("nvidia-smi --query-gpu=name,memory.total --format=csv,noheader,nounits",{timeout:4e3,stdio:["ignore","pipe","ignore"]}).toString().trim();if(a){let[b,c]=a.split("\n")[0].split(",");j=b.trim(),k=`${Math.round(Number(c)/1024)} GB`,l="CUDA",m.push("CUDA")}}catch{}if("CPU"===l&&"darwin"===h){l="Metal",m.push("Metal");let a="Apple Silicon";try{let b=(0,i.execFileSync)("sysctl",["-n","machdep.cpu.brand_string"],{timeout:3e3,stdio:["ignore","pipe","ignore"]}).toString().trim();b&&(a=b)}catch{/apple/i.test(b)&&(a=b)}j=/apple/i.test(a)?`${a} GPU`:"Apple GPU","arm64"===f().arch()&&(k=`${Math.max(1,Math.round(.7*d))} GB unified`)}m.push("arm64"===f().arch()?"NEON":"AVX2");let n="—";try{if("win32"===h){let a=((0,t.r$)()[0]||"C").toUpperCase(),b=/^[A-Z]$/.test(a)?a:"C",c=(0,i.execFileSync)("powershell",["-NoProfile","-Command",`(Get-PSDrive ${b}).Free`],{timeout:5e3,stdio:["ignore","pipe","ignore"]}).toString().trim(),d=Number(c.replace(/[^\d]/g,""));d>0&&(n=`${(d/0x40000000).toFixed(0)} GB`)}else{let a=(0,i.execFileSync)("df",["-h",(0,t.r$)()],{timeout:4e3,stdio:["ignore","pipe","ignore"]}).toString().trim().split("\n"),b=(a[a.length-1]??"").split(/\s+/);b[3]&&(n=b[3])}}catch{}return E={cpu:b,cores:c,ram:g,gpu:j,vram:k,diskFree:n,backend:l,accel:m,recommendedQuant:d>=32?"Q5_K_M":d>=16?"Q4_K_M":"Q4_0",maxParams:d>=64?"70B":d>=32?"34B":d>=16?"13B":"7B"}}async function G(){try{return(0,i.execSync)("ollama --version",{timeout:3e3,stdio:"ignore"}),!0}catch{return!1}}async function H(a){let b=await G(),c=[];if("start"===a){if(!b)return{up:!1,installed:!1,log:["Ollama is not installed — get it at https://ollama.com, then retry."]};if((await K()).up)return{up:!0,installed:b,log:[`server already running on ${B}`]};try{let a=(0,i.spawn)("ollama",["serve"],{detached:!0,stdio:"ignore"}),d="";a.on("error",a=>{d=String(a instanceof Error?a.message:a)}),a.unref(),c.push("$ ollama serve"),await new Promise(a=>setTimeout(a,2e3));let e=(await K()).up;return d&&c.push("spawn failed: "+d),c.push(e?`✓ ready \xb7 ${B}`:"still stopped — the port may be busy; run `ollama serve` in a terminal to see the error."),(0,p.revalidatePath)("/models"),{up:e,installed:b,log:c}}catch(a){return{up:!1,installed:b,log:["failed to start: "+String(a instanceof Error?a.message:a)]}}}try{"win32"===f().platform()?(0,i.execSync)("taskkill /IM ollama.exe /F",{stdio:"ignore",timeout:4e3}):(0,i.execSync)("pkill -f 'ollama serve'",{stdio:"ignore",timeout:4e3}),c.push("server stopped")}catch{c.push("no running ollama process found")}return(0,p.revalidatePath)("/models"),{up:!1,installed:b,log:c}}async function I(){try{let a=await fetch(`${B}/api/ps`,{signal:AbortSignal.timeout(3e3)});if(!a.ok)return{running:[]};return{running:((await a.json()).models??[]).map(a=>({name:a.name,vram:a.size_vram??0}))}}catch{return{running:[]}}}async function J(a){try{let b=await fetch(`${B}/api/generate`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({model:a,prompt:"",keep_alive:"30m"}),signal:AbortSignal.timeout(12e4)});if(!b.ok)return{ok:!1,error:`Ollama ${b.status}`};return await b.json().catch(()=>({})),(0,p.revalidatePath)("/models"),{ok:!0}}catch(b){let a=String(b instanceof Error?b.message:b);return{ok:!1,error:/abort|fetch failed|ECONN/i.test(a)?"Ollama not running":a}}}async function K(){try{let a=await fetch(`${B}/api/tags`,{signal:AbortSignal.timeout(3e3)});if(!a.ok)return{up:!1,models:[]};let b=await a.json();return{up:!0,models:(b.models??[]).map(a=>({name:a.name,size:a.size??0}))}}catch{return{up:!1,models:[]}}}async function L(a){let b=await K(),[c]=await q.db.select().from(r.provider).where((0,o.Uo)((0,o.eq)(r.provider.workspaceId,a),(0,o.eq)(r.provider.catalogId,"ollama"))),d={status:b.up?"connected":"needs_sync",modelCount:b.models.length,lastSync:b.up?new Date:null};c?await q.db.update(r.provider).set(d).where((0,o.eq)(r.provider.id,c.id)):await q.db.insert(r.provider).values({id:(0,g.randomUUID)(),workspaceId:a,catalogId:"ollama",adapter:"local_ollama",kind:"local",auth:"local",syncStatus:"implemented",...d})}async function M(a){let{workspace:b}=await (0,s.nP)();if(!a.trim())return{ok:!1,error:"no model name"};try{let c=await fetch(`${B}/api/pull`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({name:a.trim(),stream:!1}),signal:AbortSignal.timeout(18e5)});if(!c.ok){let a=await c.text().catch(()=>"");return{ok:!1,error:`Ollama ${c.status}${a?": "+a.slice(0,120):""}`}}let d=await c.json().catch(()=>({}));return await L(b.id),(0,p.revalidatePath)("/models"),{ok:"success"===d.status||null==d.error,error:d.error}}catch(b){let a=String(b instanceof Error?b.message:b);return{ok:!1,error:/abort|fetch failed|ECONN/i.test(a)?"Ollama not running — start it, then retry.":a}}}async function N(a){let{workspace:b}=await (0,s.nP)();try{await fetch(`${B}/api/delete`,{method:"DELETE",headers:{"content-type":"application/json"},body:JSON.stringify({name:a})})}catch{}return await L(b.id),(0,p.revalidatePath)("/models"),{ok:!0}}async function O(a){let{workspace:b}=await (0,s.nP)(),c=z.find(b=>b.id===a);if(!c)return{ok:!1,error:"unknown model"};let d=(0,l.join)((0,t.r$)(),"models");(0,h.mkdirSync)(d,{recursive:!0});let e=function(a){try{if("win32"===f().platform()){let b=(a[0]||"C").toUpperCase(),c=/^[A-Z]$/.test(b)?b:"C",d=(0,i.execFileSync)("powershell",["-NoProfile","-Command",`(Get-PSDrive ${c}).Free`],{timeout:6e3,stdio:["ignore","pipe","ignore"]}).toString().trim();return Number(d.replace(/[^\d]/g,""))||0}let b=(0,i.execFileSync)("df",["-k",a],{timeout:5e3,stdio:["ignore","pipe","ignore"]}).toString().trim().split("\n"),c=(b[b.length-1]??"").split(/\s+/),d=Number(c[3]);return d?1024*d:0}catch{return 0}}(d);if(e&&c.sizeBytes&&e<1.1*c.sizeBytes)return{ok:!1,error:`not enough free space — need ~${(c.sizeBytes/1e9).toFixed(1)} GB, ${(e/1e9).toFixed(1)} GB free`};let j=c.url.split("/").pop()??`${c.id}.gguf`,k=(0,l.join)(d,j);w.set(a,{received:0,total:0,done:!1});try{if(!(0,h.existsSync)(k)){let b=await fetch(c.url,{signal:AbortSignal.timeout(36e5)});if(!b.ok||!b.body)return w.set(a,{received:0,total:0,done:!0,error:`download failed (${b.status})`}),{ok:!1,error:`download failed (${b.status})`};let d=Number(b.headers.get("content-length"))||c.sizeBytes||0,e=0;w.set(a,{received:0,total:d,done:!1});let f=new m.PassThrough;f.on("data",b=>{e+=b.length;let c=w.get(a);c&&(c.received=e)}),await (0,n.pipeline)(m.Readable.fromWeb(b.body),f,(0,h.createWriteStream)(k));let g=v(k,d);if(!g.ok){try{(0,h.rmSync)(k)}catch{}return w.set(a,{received:e,total:d,done:!0,error:g.message}),{ok:!1,error:g.message}}}if((w.set(a,{received:1,total:1,done:!0}),c.sha256)&&await new Promise((a,b)=>{let c=(0,g.createHash)("sha256");(0,h.createReadStream)(k).on("data",a=>c.update(a)).on("end",()=>a(c.digest("hex"))).on("error",b)})!==c.sha256)return{ok:!1,error:"SHA-256 mismatch — file corrupt"};let d=(0,h.statSync)(k).size,[e]=await q.db.select().from(r.localModel).where((0,o.eq)(r.localModel.file,k));return e||await q.db.insert(r.localModel).values({id:(0,g.randomUUID)(),workspaceId:b.id,name:c.name,file:k,quant:c.quant,params:c.params,sizeBytes:d,sha256:c.sha256??"",bind:"127.0.0.1:8082"}),/embed|nomic|bge|mxbai|gte/i.test(c.name)&&ac().catch(()=>{}),(0,p.revalidatePath)("/models"),{ok:!0,path:k}}catch(d){let b=String(d instanceof Error?d.message:d),c=w.get(a);return w.set(a,{received:c?.received??0,total:c?.total??0,done:!0,error:b}),{ok:!1,error:b}}}async function P(a){return w.get(a)??null}async function Q(a){await (0,s.nP)();let[b]=await q.db.select().from(r.localModel).where((0,o.eq)(r.localModel.id,a));if(!b)return{ok:!1,error:"model not found"};try{b.file&&(0,h.existsSync)(b.file)&&(0,h.rmSync)(b.file,{force:!0})}catch{}return await q.db.delete(r.localModel).where((0,o.eq)(r.localModel.file,b.file)),(0,p.revalidatePath)("/models"),{ok:!0}}function R(){return(0,l.join)((0,t.r$)(),"bin","llama")}function S(){try{let a=(0,l.join)(R(),"INSTALLED");if(!(0,h.existsSync)(a))return null;let b=(0,h.readFileSync)(a,"utf8").trim();return b&&(0,h.existsSync)(b)?b:null}catch{return null}}async function T(a,b,c,d){let e=/\.(tar\.gz|tgz)$/i.test(b),f=(0,l.join)(c,b.replace(/[^\w.\-]+/g,"_"));(0,h.mkdirSync)(c,{recursive:!0});let g=await fetch(a,{signal:AbortSignal.timeout(18e5)});if(!g.ok||!g.body)return d&&w.set(d,{received:0,total:0,done:!0,error:`download failed (${g.status})`}),`download failed (${g.status})`;let j=Number(g.headers.get("content-length"))||0,o=m.Readable.fromWeb(g.body);if(d){let a=0;w.set(d,{received:0,total:j,done:!1});let b=new m.PassThrough;b.on("data",b=>{a+=b.length;let c=w.get(d);c&&(c.received=a)}),await (0,n.pipeline)(o,b,(0,h.createWriteStream)(f))}else await (0,n.pipeline)(o,(0,h.createWriteStream)(f));let p=v(f,j);if(!p.ok){try{(0,h.rmSync)(f)}catch{}return p.message}e?(0,i.execFileSync)("tar",["-xzf",f,"-C",c],{stdio:"ignore",timeout:12e4}):new(k())(f).extractAllTo(c,!0);try{(0,h.rmSync)(f)}catch{}return null}async function U(){try{let a=await fetch("https://api.github.com/repos/ggml-org/llama.cpp/releases/latest",{headers:{"User-Agent":"constella",Accept:"application/vnd.github+json"},signal:AbortSignal.timeout(15e3)});if(!a.ok)return null;return(await a.json()).assets??[]}catch{return null}}let V=!1;async function W(a=!1){let b;if("win32"!==f().platform())return{ok:!0,fetched:!1};let c=R();try{b=(0,h.readdirSync)(c)}catch{return{ok:!1,fetched:!1,reason:"no llama dir"}}let d=b.some(a=>/^ggml-cuda\.dll$/i.test(a)),e=b.some(a=>/^cudart64_\d+\.dll$/i.test(a));if(!d||e)return{ok:e||!d,fetched:!1};if(V&&!a)return{ok:!1,fetched:!1,reason:"already attempted this run"};V=!0;let g="12";try{let a=(0,h.readFileSync)((0,l.join)(c,"ggml-cuda.dll")).toString("latin1").match(/cudart64_(\d+)\.dll/i);a&&(g=a[1])}catch{}let i=await U();if(!i)return{ok:!1,fetched:!1,reason:"GitHub unreachable"};let j=i.filter(a=>/cudart/i.test(a.name)&&/x64|amd64/i.test(a.name)),k=j.find(a=>RegExp(`cuda-${g}\\.`,"i").test(a.name))??j[0];if(!k)return{ok:!1,fetched:!1,reason:"no cudart asset in the latest release"};let m=await T(k.browser_download_url,k.name,c).catch(a=>String(a instanceof Error?a.message:a));if(m)return{ok:!1,fetched:!1,reason:m};let n=!1;try{n=(0,h.readdirSync)(c).some(a=>/^cudart64_\d+\.dll$/i.test(a))}catch{}return{ok:n,fetched:n}}async function X(){let a;await (0,s.nP)();let b=[];if(S()||await Y()){let a=await W(!0).catch(()=>null);return{ok:!0,installed:!0,log:["llama-server already installed.",...a?.fetched?["✓ fetched the CUDA runtime DLLs — GPU enabled."]:a&&!a.ok?[`⚠ CUDA runtime still missing (${a.reason??"unknown"}).`]:[]]}}let c=await F(),d=/cuda|nvidia/i.test(c.backend)||(c.accel??[]).some(a=>/cuda|nvidia/i.test(a));b.push(`platform ${f().platform()}/${f().arch()} \xb7 backend ${c.backend} → ${d?"CUDA":"CPU"} build`);try{let c=await fetch("https://api.github.com/repos/ggml-org/llama.cpp/releases/latest",{headers:{"User-Agent":"constella",Accept:"application/vnd.github+json"},signal:AbortSignal.timeout(15e3)});if(!c.ok)return{ok:!1,installed:!1,log:b,error:403===c.status?"GitHub API rate-limited — try again later or install manually from the releases page.":`GitHub releases API ${c.status}`};a=(await c.json()).assets??[]}catch(a){return{ok:!1,installed:!1,log:b,error:"couldn't reach GitHub: "+String(a instanceof Error?a.message:a)}}let e=function(a,b){let c=f().platform(),d="win32"===c?/win/i:"darwin"===c?/macos/i:/(ubuntu|linux)/i,e="arm64"===f().arch(),g=a.filter(a=>/\.(zip|tar\.gz|tgz)$/i.test(a.name)&&d.test(a.name));e||(g=g.filter(a=>!/arm64|aarch64/i.test(a.name)));let h=/cuda|hip|vulkan|sycl|kompute|musa|cann|adreno/i,i=a=>{if(!a.length)return null;let b=e?a.filter(a=>/arm64|aarch64/i.test(a.name)):a.filter(a=>/x64|amd64/i.test(a.name)),c=(b.length?b:a).sort((a,b)=>a.name.length-b.name.length)[0];return c?{name:c.name,url:c.browser_download_url}:null};if(b){let a=g.filter(a=>/cuda/i.test(a.name));if(a.length)return i(a)}let j=g.filter(a=>!h.test(a.name));return i(j.length?j:g)}(a,!!d);if(!e)return{ok:!1,installed:!1,log:b,error:"no matching prebuilt for this platform — install manually from the releases page."};b.push(`downloading ${e.name}…`);let g=R();(0,h.mkdirSync)(g,{recursive:!0}),w.set("llama-server",{received:0,total:0,done:!1});try{let a=await T(e.url,e.name,g,"llama-server");if(a)return w.set("llama-server",{received:0,total:0,done:!0,error:a}),{ok:!1,installed:!1,log:b,error:a};if(d){let a=await W(!0);b.push(a.ok?a.fetched?"✓ CUDA runtime DLLs installed — GPU enabled.":"CUDA runtime already present.":`⚠ CUDA runtime not installed (${a.reason??"unknown"}) — runs on CPU; retries on next Start/Install.`)}}catch(a){return{ok:!1,installed:!1,log:b,error:"download/extract failed: "+String(a instanceof Error?a.message:a)}}let i=function a(b,c,d){let e;if(d<0)return null;try{e=(0,h.readdirSync)(b,{withFileTypes:!0})}catch{return null}for(let a of e)if(a.isFile()&&a.name===c)return(0,l.join)(b,a.name);for(let f of e)if(f.isDirectory()){let e=a((0,l.join)(b,f.name),c,d-1);if(e)return e}return null}(g,"win32"===f().platform()?"llama-server.exe":"llama-server",5);if(!i)return{ok:!1,installed:!1,log:b,error:"downloaded, but llama-server wasn't found in the archive."};if("win32"!==f().platform())try{(0,h.chmodSync)(i,493)}catch{}return(0,h.writeFileSync)((0,l.join)(g,"INSTALLED"),i,"utf8"),w.set("llama-server",{received:1,total:1,done:!0}),b.push(`✓ installed → ${i}`),await ah().catch(()=>{}),(0,p.revalidatePath)("/models"),{ok:!0,installed:!0,path:i,log:b}}async function Y(){if(S())return!0;try{return(0,i.execSync)("llama-server --version",{timeout:3e3,stdio:"ignore"}),!0}catch{return!1}}async function Z(){try{let a=await fetch(`${C}/v1/models`,{signal:AbortSignal.timeout(2500)});if(!a.ok)return{up:!1,model:null};let b=await a.json(),c=b.data?.[0]?.id;return{up:!0,model:c?c.split(/[\\/]/).pop()??c:null}}catch{return{up:!1,model:null}}}async function $(a){try{var b;let c,d=await F();if(!/cuda|metal/i.test(d.backend))return[];let e=(b=d.vram,(c=/([\d.]+)\s*GB/i.exec(b||""))?1e9*parseFloat(c[1]):0);if(a&&e&&1.15*a>e)return[];return["-ngl","99"]}catch{return[]}}function _(){try{let a=q.db.select({file:r.localModel.file,name:r.localModel.name}).from(r.localModel).all().find(a=>/embed|nomic|bge|mxbai|gte/i.test(a.name)&&a.file&&(0,h.existsSync)(a.file));return a?{file:a.file,name:a.name}:null}catch{return null}}function aa(){try{let a=q.db.select({file:r.localModel.file,name:r.localModel.name,sizeBytes:r.localModel.sizeBytes}).from(r.localModel).all().find(a=>!/embed|nomic|bge|mxbai|gte/i.test(a.name)&&a.file&&(0,h.existsSync)(a.file));return a?{file:a.file,name:a.name,sizeBytes:a.sizeBytes}:null}catch{return null}}async function ab(){try{return(await fetch(`${D}/health`,{signal:AbortSignal.timeout(1500)})).ok}catch{return!1}}async function ac(){if(await ab())return{up:!0};let a=S();if(!a)return{up:!1,reason:"llama-server not installed"};let b=_();if(!b)return{up:!1,reason:"no embedding model installed (download nomic-embed-text)"};try{await W().catch(()=>{});let c=await $(),d=(0,i.spawn)(a,["-m",b.file,"--embeddings","--host","127.0.0.1","--port","8083","-c","2048","--pooling","mean",...c],{detached:!0,stdio:"ignore"});d.on("error",()=>{}),d.unref()}catch(a){return{up:!1,reason:"spawn failed: "+String(a instanceof Error?a.message:a)}}for(let a=0;a<24;a++)if(await new Promise(a=>setTimeout(a,500)),await ab())return{up:!0,model:b.name};return{up:!1,reason:"embedding server didn't come up in time"}}async function ad(){if((await Z()).up)return{up:!0};let a=S();if(!a)return{up:!1,reason:"llama-server not installed"};let b=aa();if(!b)return{up:!1,reason:"no chat GGUF installed"};try{await W().catch(()=>{});let c=await $(b.sizeBytes),d=(0,i.spawn)(a,["-m",b.file,"--host","127.0.0.1","--port","8082","-c","4096",...c],{detached:!0,stdio:"ignore"});d.on("error",()=>{}),d.unref()}catch(a){return{up:!1,reason:"spawn failed: "+String(a instanceof Error?a.message:a)}}for(let a=0;a<24;a++)if(await new Promise(a=>setTimeout(a,500)),(await Z()).up)return{up:!0,model:b.name};return{up:!1,reason:"llama server didn't come up in time"}}async function ae(){let a=_();return{up:await ab(),model:a?.name??null,installed:!!a}}async function af(){let a=await ac();return(0,p.revalidatePath)("/models"),a}async function ag(){let{org:a}=await (0,s.nP)();await ac().catch(()=>{});let b=await (0,u.xV)(a.id);return(0,p.revalidatePath)("/models"),b}async function ah(){let{workspace:a}=await (0,s.nP)(),b=await Z(),c=new Set((await q.db.select({file:r.localModel.file}).from(r.localModel)).map(a=>a.file)).size,d={status:b.up?"connected":"needs_sync",modelCount:c,lastSync:b.up?new Date:null},[e]=await q.db.select().from(r.provider).where((0,o.Uo)((0,o.eq)(r.provider.workspaceId,a.id),(0,o.eq)(r.provider.catalogId,"llamacpp")));return e?await q.db.update(r.provider).set(d).where((0,o.eq)(r.provider.id,e.id)):await q.db.insert(r.provider).values({id:(0,g.randomUUID)(),workspaceId:a.id,catalogId:"llamacpp",adapter:"local_llamacpp",kind:"local",auth:"local",syncStatus:"implemented",...d}),(0,p.revalidatePath)("/models"),{ok:!0}}async function ai(a){let b;await (0,s.nP)();let c=await Y(),d=[];if(!c)return{up:!1,installed:!1,log:["llama-server not found — install llama.cpp from https://github.com/ggml-org/llama.cpp/releases (or `brew install llama.cpp`), then retry."]};if((await Z()).up)return{up:!0,installed:c,log:[`server already running on ${C}`]};let e=0;if(a){let d,[f]=await q.db.select().from(r.localModel).where((0,o.eq)(r.localModel.id,a));if(f&&(d=f.name,/embed|nomic|bge|mxbai|gte/i.test(d))){let a=await ac();return{up:a.up,installed:c,log:[`${f.name} is an EMBEDDING model — started the RAG embedding server on :8083 (it can't power chat on :8082).`,a.up?`✓ embeddings ready \xb7 ${D}`:`embeddings: ${a.reason??"failed to start"}`]}}b=f?.file,e=f?.sizeBytes??0}if(!b){let a=aa();b=a?.file,e=a?.sizeBytes??0}if(!b||!(0,h.existsSync)(b)){let a=_();if(a){let b=await ac();return{up:!1,installed:c,log:[`Your only local model (${a.name}) is an EMBEDDING model — it powers RAG on the embeddings server (${D}), not the chat server.`,b.up?"✓ embeddings server is running.":`embeddings: ${b.reason??"not started"}`,"Download a chat/instruct GGUF (e.g. Qwen, Llama) below to run the chat server on :8082."]}}return{up:!1,installed:c,log:["no GGUF model on disk — download one below first."]}}try{let a=S()??"llama-server";await W().catch(()=>{});let f=await $(e),g=(0,i.spawn)(a,["-m",b,"--host","127.0.0.1","--port","8082","-c","4096",...f],{detached:!0,stdio:"ignore"}),h="";g.on("error",a=>{h=String(a instanceof Error?a.message:a)}),g.unref(),d.push(`$ llama-server -m ${b.split(/[\\/]/).pop()} --port 8082${f.length?" -ngl 99 (GPU)":" (CPU)"}`);let j=!1;for(let a=0;a<12&&!j;a++)await new Promise(a=>setTimeout(a,1e3)),j=(await Z()).up;return h&&d.push("spawn failed: "+h),d.push(j?`✓ ready \xb7 ${C}`:"still starting — large models take longer; run llama-server in a terminal to see progress."),await ah(),(0,p.revalidatePath)("/models"),{up:j,installed:c,log:d}}catch(a){return{up:!1,installed:c,log:["failed to start: "+String(a instanceof Error?a.message:a)]}}}async function aj(){let a=await Y(),b=[];try{"win32"===f().platform()?(0,i.execSync)("taskkill /IM llama-server.exe /F",{stdio:"ignore",timeout:4e3}):(0,i.execSync)("pkill -f llama-server",{stdio:"ignore",timeout:4e3}),b.push("server stopped")}catch{b.push("no running llama-server process found")}return await ah(),(0,p.revalidatePath)("/models"),{up:!1,installed:a,log:b}}(0,A.D)([F,G,H,I,J,K,M,N,O,P,Q,X,Y,Z,ab,ac,ad,ae,af,ag,ah,ai,aj]),(0,d.A)(F,"0002906425c37ba0a53bbfafa19691e9a906050d86",null),(0,d.A)(G,"00cefe7d564b7bd933451222433059aa5dd8e95c2a",null),(0,d.A)(H,"40b07ca371170bbb9e7bc16ba05a00629bae0e3e9e",null),(0,d.A)(I,"0056078f13eb137d213d4a1085a13ff6f381dabd2e",null),(0,d.A)(J,"403e61223e2aa817de8ec2340570d4e49d420e3398",null),(0,d.A)(K,"0038bfb5d0e8748666ba18a4f02557897aae6a50b5",null),(0,d.A)(M,"40d05376667b91af0ad411cbfa854abffb551f894d",null),(0,d.A)(N,"40d3c0594ce0b931cad118a1790bac1c8aba31a6bb",null),(0,d.A)(O,"404b75852390a00b75a0428e40249cda9fec6baced",null),(0,d.A)(P,"404502bf64b6ad6b7865767a52d5f6f55bf6a43e3a",null),(0,d.A)(Q,"407f6077577515b726822bd6f80f9a601f412e1015",null),(0,d.A)(X,"0097079f8bb244de0b0343f4afa7990fed9fb324d2",null),(0,d.A)(Y,"005d6b177b466248dc8ade5a43a93b4d803eab6094",null),(0,d.A)(Z,"0061afb7f7b8b1fd8ac5aa96a903e3f22f615aa20f",null),(0,d.A)(ab,"00f924b6c219ad8d088625ee88343322f8ea498bcf",null),(0,d.A)(ac,"00a94d93b5071359022f2378c3d54073eee3fa85c3",null),(0,d.A)(ad,"00bffc1c2ed5e8793aa8d097de94037f7e98e3292f",null),(0,d.A)(ae,"00dec8cf58fde95e890b2dbab03e0216c02db09ee8",null),(0,d.A)(af,"007e381e52bd202d1b126f7cd30c571345bc33887e",null),(0,d.A)(ag,"006dcbb5e7e346c443d7102ca0daafd3d6ef659076",null),(0,d.A)(ah,"00abc16008e05e917d0ebc5e65eec07577fecb4570",null),(0,d.A)(ai,"40eb0711e58f72723c75d51f7586109839bbe62d56",null),(0,d.A)(aj,"00a7e1670a16ccb470c5305aabfe79db99128992b9",null)},35745:(a,b,c)=>{c.d(b,{T:()=>d});function d(a){return a<=.3?"Behavior (temperature low): be precise and deterministic. Give the single most correct, conventional answer; minimize speculation and creative variation; keep output tight and repeatable. Best for code, reviews and tools.":a<=.6?"Behavior (temperature balanced): be accurate and direct, but use reasonable judgment and allow a little exploration where the task clearly benefits.":a<=.85?"Behavior (temperature high): be creative and exploratory. Offer alternatives and non-obvious approaches and elaborate where it adds value — while staying correct and on-spec.":"Behavior (temperature max): be highly exploratory and generative. Brainstorm broadly, propose multiple distinct options and novel angles; favor breadth — still grounded in the requirements."}},38926:(a,b,c)=>{c.d(b,{IW:()=>i,Kh:()=>k,r6:()=>j});var d=c(77598),e=c(97603),f=c(65705),g=c(1890);function h(){let a=process.env.CONSTELLA_VAULT_KEY;if(!a)throw Error("CONSTELLA_VAULT_KEY is not set");let b=Buffer.from(a,"base64");if(32!==b.length)throw Error("CONSTELLA_VAULT_KEY must decode to 32 bytes");return b}async function i(a,b,c,i){let j=(0,d.randomBytes)(12),k=(0,d.createCipheriv)("aes-256-gcm",h(),j),l=Buffer.concat([k.update(c,"utf8"),k.final()]),m=k.getAuthTag(),n=Buffer.concat([l,m]).toString("base64");await f.db.delete(g.vault).where((0,e.Uo)((0,e.eq)(g.vault.workspaceId,a),(0,e.eq)(g.vault.ref,b))),await f.db.insert(g.vault).values({id:(0,d.randomUUID)(),workspaceId:a,providerId:i,ref:b,ciphertext:n,iv:j.toString("base64")})}async function j(a,b){let[c]=await f.db.select().from(g.vault).where((0,e.Uo)((0,e.eq)(g.vault.workspaceId,a),(0,e.eq)(g.vault.ref,b)));if(!c)return null;let i=Buffer.from(c.ciphertext,"base64"),j=i.subarray(i.length-16),k=i.subarray(0,i.length-16),l=(0,d.createDecipheriv)("aes-256-gcm",h(),Buffer.from(c.iv,"base64"));return l.setAuthTag(j),Buffer.concat([l.update(k),l.final()]).toString("utf8")}async function k(a,b){await f.db.delete(g.vault).where((0,e.Uo)((0,e.eq)(g.vault.workspaceId,a),(0,e.eq)(g.vault.ref,b)))}},53993:(a,b,c)=>{c.d(b,{Ht:()=>j,O5:()=>m,Yv:()=>o,nP:()=>n});var d=c(44013),e=c(84988),f=c(97603),g=c(65705),h=c(1890),i=c(37296);async function j(){return i.j2.api.getSession({headers:await (0,d.headers)()})}async function k(a,b){if(b){let[c]=await g.db.select({org:h.organization}).from(h.member).innerJoin(h.organization,(0,f.eq)(h.member.orgId,h.organization.id)).where((0,f.Uo)((0,f.eq)(h.member.userId,a),(0,f.eq)(h.organization.id,b)));if(c)return c.org}let c=await g.db.select({org:h.organization}).from(h.member).innerJoin(h.organization,(0,f.eq)(h.member.orgId,h.organization.id)).where((0,f.eq)(h.member.userId,a));return c[0]?.org??null}async function l(a){let[b]=await g.db.select().from(h.workspace).where((0,f.eq)(h.workspace.orgId,a));return b??null}async function m(a){return g.db.select({id:h.organization.id,name:h.organization.name}).from(h.member).innerJoin(h.organization,(0,f.eq)(h.member.orgId,h.organization.id)).where((0,f.eq)(h.member.userId,a))}async function n(){let a=await j();a||(0,e.redirect)("/login"),"1"===process.env.CONSTELLA_FORCE_ONBOARDING&&(0,e.redirect)("/onboarding");let b=await k(a.user.id,a.session.activeOrgId);b||(0,e.redirect)("/onboarding");let c=await l(b.id);return c||(0,e.redirect)("/onboarding"),{session:a,org:b,workspace:c}}function o(a){return(a||"org").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"")}},56267:(a,b,c)=>{c.d(b,{Lb:()=>u,bP:()=>v,tt:()=>w,GA:()=>x});var d=c(57086),e=c(65121);let f={TypeScript:{slug:"typescript"},JavaScript:{slug:"javascript"},Python:{slug:"python"},Go:{slug:"go",variant:"original-wordmark"},Rust:{slug:"rust"},Java:{slug:"java"},Kotlin:{slug:"kotlin"},"C#":{slug:"csharp"},Ruby:{slug:"ruby"},PHP:{slug:"php"},Elixir:{slug:"elixir"},Swift:{slug:"swift"},"C++":{slug:"cplusplus"},Scala:{slug:"scala"},Dart:{slug:"dart"},C:{slug:"c"},Clojure:{slug:"clojure"},Haskell:{slug:"haskell"},Lua:{slug:"lua"},R:{slug:"r"},"Objective-C":{slug:"objectivec"},Erlang:{slug:"erlang",variant:"plain"},"Node.js":{slug:"nodejs"},Bun:{slug:"bun"},Deno:{slug:"denojs"},"Python 3":{slug:"python"},JVM:{slug:"java"},".NET":{slug:"dotnetcore"},"BEAM (Erlang VM)":{slug:"erlang",variant:"plain"},React:{slug:"react"},Vue:{slug:"vuejs"},Svelte:{slug:"svelte"},Angular:{slug:"angular"},SolidJS:{slug:"solidjs"},"Alpine.js":{slug:"alpinejs"},Ember:{slug:"ember"},Backbone:{slug:"backbonejs"},"HTML/CSS":{slug:"html5"},"Vanilla JS":{slug:"javascript"},"Plain CSS":{slug:"css3"},"Next.js":{slug:"nextjs"},Nuxt:{slug:"nuxtjs"},Remix:{slug:"remix"},SvelteKit:{slug:"svelte"},Astro:{slug:"astro"},Gatsby:{slug:"gatsby"},"Vite (SPA)":{slug:"vitejs"},Hugo:{slug:"hugo"},Jekyll:{slug:"jekyll",variant:"original-wordmark"},NestJS:{slug:"nestjs"},Fastify:{slug:"fastify"},Express:{slug:"express"},Koa:{slug:"koa"},Django:{slug:"django",variant:"plain"},Flask:{slug:"flask"},FastAPI:{slug:"fastapi"},"Spring Boot":{slug:"spring"},Spring:{slug:"spring"},Laravel:{slug:"laravel"},"Ruby on Rails":{slug:"rails"},Gin:{slug:"go",variant:"original-wordmark"},Phoenix:{slug:"phoenix"},"ASP.NET Core":{slug:"dotnetcore"},Nginx:{slug:"nginx"},GraphQL:{slug:"graphql"},Symfony:{slug:"symfony"},CodeIgniter:{slug:"codeigniter"},PostgreSQL:{slug:"postgresql"},MySQL:{slug:"mysql"},MariaDB:{slug:"mariadb"},SQLite:{slug:"sqlite"},MongoDB:{slug:"mongodb"},Redis:{slug:"redis"},Cassandra:{slug:"cassandra"},DynamoDB:{slug:"dynamodb"},Supabase:{slug:"supabase"},Prisma:{slug:"prisma"},Sequelize:{slug:"sequelize"},SQLAlchemy:{slug:"sqlalchemy"},"Tailwind CSS":{slug:"tailwindcss"},"CSS Modules":{slug:"css3"},Sass:{slug:"sass"},MUI:{slug:"materialui"},Bootstrap:{slug:"bootstrap"},Bulma:{slug:"bulma"},Vuetify:{slug:"vuetify"},Docker:{slug:"docker"},Podman:{slug:"podman"},Vercel:{slug:"vercel"},Netlify:{slug:"netlify"},AWS:{slug:"amazonwebservices",variant:"original-wordmark"},GCP:{slug:"googlecloud"},Kubernetes:{slug:"kubernetes"},Azure:{slug:"azure"},Jenkins:{slug:"jenkins"},CircleCI:{slug:"circleci",variant:"plain"},Terraform:{slug:"terraform"},Ansible:{slug:"ansible"},Vagrant:{slug:"vagrant"},RabbitMQ:{slug:"rabbitmq"},Kafka:{slug:"apachekafka"},Auth0:{slug:"auth0",variant:"plain"},Keycloak:{slug:"keycloak"},"React Native":{slug:"react"},Flutter:{slug:"flutter"},Android:{slug:"android"},Ionic:{slug:"ionic"},Xamarin:{slug:"xamarin"},NativeScript:{slug:"nativescript"},TensorFlow:{slug:"tensorflow"},PyTorch:{slug:"pytorch"},"scikit-learn":{slug:"scikitlearn"},Pandas:{slug:"pandas"},NumPy:{slug:"numpy"},Jupyter:{slug:"jupyter"},Jest:{slug:"jest"},Vitest:{slug:"vitest"},Cypress:{slug:"cypressio"},Playwright:{slug:"playwright"},Selenium:{slug:"selenium"},Mocha:{slug:"mocha"},Jasmine:{slug:"jasmine"},Puppeteer:{slug:"puppeteer"},D3:{slug:"d3js"},Grafana:{slug:"grafana"},Firebase:{slug:"firebase"},Appwrite:{slug:"appwrite"},Heroku:{slug:"heroku"}},g=Object.fromEntries(e.z.map(a=>[a.key,a.label])),h={TypeScript:{logo:"typescript",color:"3178C6"},JavaScript:{logo:"javascript",color:"F7DF1E"},Python:{logo:"python",color:"3776AB"},"Python 3":{logo:"python",color:"3776AB"},Go:{logo:"go",color:"00ADD8"},Rust:{logo:"rust",color:"000000"},Java:{logo:"openjdk",color:"ED8B00"},Kotlin:{logo:"kotlin",color:"7F52FF"},"C#":{logo:"csharp",color:"512BD4"},Ruby:{logo:"ruby",color:"CC342D"},PHP:{logo:"php",color:"777BB4"},Elixir:{logo:"elixir",color:"4B275F"},Swift:{logo:"swift",color:"F05138"},"C++":{logo:"cplusplus",color:"00599C"},C:{logo:"c",color:"A8B9CC"},Scala:{logo:"scala",color:"DC322F"},Dart:{logo:"dart",color:"0175C2"},Clojure:{logo:"clojure",color:"5881D8"},Haskell:{logo:"haskell",color:"5D4F85"},Lua:{logo:"lua",color:"2C2D72"},R:{logo:"r",color:"276DC3"},Erlang:{logo:"erlang",color:"A90533"},"Node.js":{logo:"nodedotjs",color:"5FA04E"},Bun:{logo:"bun",color:"000000"},Deno:{logo:"deno",color:"70FFAF"},".NET":{logo:"dotnet",color:"512BD4"},React:{logo:"react",color:"61DAFB"},Vue:{logo:"vuedotjs",color:"4FC08D"},Svelte:{logo:"svelte",color:"FF3E00"},Angular:{logo:"angular",color:"DD0031"},SolidJS:{logo:"solid",color:"2C4F7C"},Preact:{logo:"preact",color:"673AB8"},Qwik:{logo:"qwik",color:"AC7EF4"},"Alpine.js":{logo:"alpinedotjs",color:"8BC0D0"},Ember:{logo:"emberdotjs",color:"E04E39"},"Next.js":{logo:"nextdotjs",color:"000000"},Nuxt:{logo:"nuxtdotjs",color:"00DC82"},Remix:{logo:"remix",color:"000000"},SvelteKit:{logo:"svelte",color:"FF3E00"},Astro:{logo:"astro",color:"BC52EE"},Gatsby:{logo:"gatsby",color:"663399"},"Vite (SPA)":{logo:"vite",color:"646CFF"},Hugo:{logo:"hugo",color:"FF4088"},Jekyll:{logo:"jekyll",color:"CC0000"},NestJS:{logo:"nestjs",color:"E0234E"},Fastify:{logo:"fastify",color:"000000"},Express:{logo:"express",color:"000000"},Hono:{logo:"hono",color:"E36002"},Koa:{logo:"koa",color:"33333D"},Django:{logo:"django",color:"092E20"},Flask:{logo:"flask",color:"000000"},FastAPI:{logo:"fastapi",color:"009688"},"Spring Boot":{logo:"springboot",color:"6DB33F"},Spring:{logo:"spring",color:"6DB33F"},Laravel:{logo:"laravel",color:"FF2D20"},Symfony:{logo:"symfony",color:"000000"},"Ruby on Rails":{logo:"rubyonrails",color:"D30001"},Gin:{logo:"gin",color:"008ECF"},Phoenix:{logo:"phoenixframework",color:"FD4F00"},"ASP.NET Core":{logo:"dotnet",color:"512BD4"},GraphQL:{logo:"graphql",color:"E10098"},Nginx:{logo:"nginx",color:"009639"},"React Native":{logo:"react",color:"61DAFB"},Flutter:{logo:"flutter",color:"02569B"},Android:{logo:"android",color:"3DDC84"},Ionic:{logo:"ionic",color:"3880FF"},PostgreSQL:{logo:"postgresql",color:"4169E1"},MySQL:{logo:"mysql",color:"4479A1"},MariaDB:{logo:"mariadb",color:"003545"},SQLite:{logo:"sqlite",color:"003B57"},MongoDB:{logo:"mongodb",color:"47A248"},Redis:{logo:"redis",color:"FF4438"},Cassandra:{logo:"apachecassandra",color:"1287B1"},DynamoDB:{logo:"amazondynamodb",color:"4053D6"},Supabase:{logo:"supabase",color:"3FCF8E"},Prisma:{logo:"prisma",color:"2D3748"},Drizzle:{logo:"drizzle",color:"C5F74F"},TypeORM:{logo:"typeorm",color:"FE0803"},Sequelize:{logo:"sequelize",color:"52B0E7"},SQLAlchemy:{logo:"sqlalchemy",color:"D71F00"},"Tailwind CSS":{logo:"tailwindcss",color:"06B6D4"},"CSS Modules":{logo:"cssmodules",color:"000000"},"styled-components":{logo:"styledcomponents",color:"DB7093"},Sass:{logo:"sass",color:"CC6699"},MUI:{logo:"mui",color:"007FFF"},Bootstrap:{logo:"bootstrap",color:"7952B3"},Bulma:{logo:"bulma",color:"00D1B2"},Vuetify:{logo:"vuetify",color:"1867C0"},Jest:{logo:"jest",color:"C21325"},Vitest:{logo:"vitest",color:"6E9F18"},Cypress:{logo:"cypress",color:"69D3A7"},Playwright:{logo:"playwright",color:"2EAD33"},Selenium:{logo:"selenium",color:"43B02A"},Mocha:{logo:"mocha",color:"8D6748"},TensorFlow:{logo:"tensorflow",color:"FF6F00"},PyTorch:{logo:"pytorch",color:"EE4C2C"},"scikit-learn":{logo:"scikitlearn",color:"F7931E"},Keras:{logo:"keras",color:"D00000"},Pandas:{logo:"pandas",color:"150458"},NumPy:{logo:"numpy",color:"013243"},Jupyter:{logo:"jupyter",color:"F37626"},D3:{logo:"d3dotjs",color:"F9A03C"},"Chart.js":{logo:"chartdotjs",color:"FF6384"},Grafana:{logo:"grafana",color:"F46800"},Plotly:{logo:"plotly",color:"3F4F75"},Docker:{logo:"docker",color:"2496ED"},Podman:{logo:"podman",color:"892CA0"},Vercel:{logo:"vercel",color:"000000"},Netlify:{logo:"netlify",color:"00C7B7"},AWS:{logo:"amazonwebservices",color:"232F3E"},GCP:{logo:"googlecloud",color:"4285F4"},Azure:{logo:"microsoftazure",color:"0078D4"},Kubernetes:{logo:"kubernetes",color:"326CE5"},Cloudflare:{logo:"cloudflare",color:"F38020"},Jenkins:{logo:"jenkins",color:"D24939"},CircleCI:{logo:"circleci",color:"343434"},Terraform:{logo:"terraform",color:"7B42BC"},Ansible:{logo:"ansible",color:"EE0000"},Firebase:{logo:"firebase",color:"DD2C00"},Appwrite:{logo:"appwrite",color:"FD366E"},Heroku:{logo:"heroku",color:"430098"},BullMQ:{logo:"bull",color:"CB0000"},RabbitMQ:{logo:"rabbitmq",color:"FF6600"},Kafka:{logo:"apachekafka",color:"231F20"},Celery:{logo:"celery",color:"37814A"},"Auth.js":{logo:"auth0",color:"EB5424"},Clerk:{logo:"clerk",color:"6C47FF"},Auth0:{logo:"auth0",color:"EB5424"},Keycloak:{logo:"keycloak",color:"4D4D4D"}},i=[{c1:"0E0D17",c2:"E0A44E"},{c1:"0B1120",c2:"38BDF8"},{c1:"1A0B2E",c2:"A855F7"},{c1:"0A1F1C",c2:"2DD4BF"},{c1:"1F0A0A",c2:"F87171"},{c1:"0A0A1F",c2:"6366F1"},{c1:"131A0A",c2:"A3E635"},{c1:"1F140A",c2:"FB923C"}];function j(a){return a.toLowerCase().replace(/[^\w\s-]/g,"").trim().replace(/\s+/g,"-")}function k(a){let b=h[a],c=a.replace(/-/g,"--").replace(/_/g,"__").replace(/ /g,"_");return b?``:``}function l(a){return Object.entries(a||{}).filter(([,a])=>a&&"None"!==a&&a.trim())}var m=c(4370),n=c(35745);let o=[{handle:"ada",name:"Ada",role:"CEO",color:"#e0a44e",reportsTo:null,model:"sonnet",provider:"cli_claude_code",temperature:.4,dailyCapUsd:15,tier:"critical",identity:"Decisive, outcome-driven leader. Speaks in goals, not tasks. Protects scope and budget.",ritual:"Read the company goals, decompose into epics, delegate to leads, review what shipped."},{handle:"linus",name:"Linus",role:"CTO",color:"#9a5cff",reportsTo:"ada",model:"sonnet",provider:"cli_claude_code",temperature:.3,dailyCapUsd:40,tier:"critical",identity:"Systems thinker. Balances delivery speed against technical debt.",ritual:"Turn epics into tickets, route work to specialists, clear blockers, review PRs."},{handle:"donald",name:"Donald",role:"Product Owner",color:"#4fc9b0",reportsTo:"ada",model:"haiku",provider:"cli_claude_code",temperature:.4,dailyCapUsd:20,tier:"heavy",identity:"Customer voice. Ruthless about priority and clarity.",ritual:"Groom the backlog with MoSCoW, plan the sprint, track delivery, close with a retro."},{handle:"margaret",name:"Margaret",role:"Backend",color:"#3fb98f",reportsTo:"linus",model:"sonnet",provider:"cli_claude_code",temperature:.3,dailyCapUsd:50,tier:"heavy",identity:"Pragmatic server engineer. Values correctness, small diffs and green tests.",ritual:"Pull one ticket, read context, implement on a branch, never push without a passing suite."},{handle:"grace",name:"Grace",role:"Frontend",color:"#5b8def",reportsTo:"linus",model:"sonnet",provider:"cli_claude_code",temperature:.5,dailyCapUsd:45,tier:"heavy",identity:"Craft-focused UI engineer. Cares about accessibility and clean component APIs.",ritual:"Read the design tokens, build the smallest component that works, typecheck before PR."},{handle:"edsger",name:"Edsger",role:"QA",color:"#e8688f",reportsTo:"linus",model:"haiku",provider:"cli_claude_code",temperature:.2,dailyCapUsd:25,tier:"heavy",identity:"Skeptical quality gate. Assumes nothing works until proven by a test.",ritual:"Reproduce, cover with a test, run the suite, then gate the sign-off."},{handle:"werner",name:"Werner",role:"DevOps",color:"#f0a35e",reportsTo:"linus",model:"haiku",provider:"cli_claude_code",temperature:.3,dailyCapUsd:20,tier:"heavy",identity:"Reliability-minded operator. Automates the boring, guards the leases.",ritual:"Build, deploy a preview, report the URL, never leave an env leased too long."},{handle:"barbara",name:"Barbara",role:"Docs",color:"#b3d97a",reportsTo:"ada",model:"haiku",provider:"cli_claude_code",temperature:.4,dailyCapUsd:15,tier:"light",identity:"Patient explainer. Turns changes into understandable docs.",ritual:"Watch merges, draft docs while context is fresh, verify every link."},{handle:"whitfield",name:"Whitfield",role:"CyberSec",color:"#c4a0ff",reportsTo:"linus",model:"opus",provider:"cli_claude_code",temperature:.2,dailyCapUsd:30,tier:"critical",identity:"Adversarial reviewer. Thinks like an attacker, writes like an auditor.",ritual:"Audit every change for secret handling and injection, file findings with a concrete fix."},{handle:"vannevar",name:"Vannevar",role:"Knowledge",color:"#7ac5e0",reportsTo:"ada",model:"haiku",provider:"cli_claude_code",temperature:.2,dailyCapUsd:10,tier:"light",identity:"Keeper of the company's semantic memory. Indexes every document AND conversation into embeddings so any agent can recall anything instantly.",ritual:"Keep the embedding server healthy; re-index the workspace docs and the chat (team room, DMs, Telegram) into the RAG index so retrieval stays current."}],p=[{name:"open-pr",summary:"Branch, commit, open a PR with a test plan and request CTO review.",trigger:"When a work product is ready to merge",steps:["Create a branch from main","Commit the change set","Open a PR with summary + test plan","Request review from the CTO"]},{name:"run-suite",summary:"Detect the package manager, run the test task and gate sign-off on red.",trigger:"Before any sign-off",steps:["Detect package manager","Run the workspace test task","Parse results","Block sign-off if red"]},{name:"secret-scan",summary:"Scan for plaintext keys, verify vault references and flag log leaks.",trigger:"On every adapter change",steps:["Grep for plaintext keys","Check vault references","Flag any echo to logs"]},{name:"telegram-notify",summary:"Format a digest and POST it to the Telegram Bot API.",trigger:"When a routine completes",steps:["Format the digest","Resolve the chat id from secrets","POST to Telegram Bot API"]},{name:"moscow-prioritise",summary:"Score backlog items and re-order them with the MoSCoW method.",trigger:"During backlog grooming",steps:["Score each item","Assign Must/Should/Could/Won't","Re-order the backlog"]},{name:"gguf-validate",summary:"Pull a GGUF, verify SHA-256 and bind to loopback.",trigger:"When installing a local model",steps:["Download the GGUF","Verify SHA-256","Bind to 127.0.0.1 only"]}],q=p.filter(a=>"telegram-notify"!==a.name&&"gguf-validate"!==a.name).map(a=>a.name);function r(a,b){return`# ${a}
|
|
348
|
+
${b.detail}`:""}`.slice(0,3400);await (0,h.bT)(l.botToken,l.chatId,n,"approval"===c||"needs-approval"===c?[[{text:"✅ Approve",data:"approve_plan"},{text:"▶️ Start execution",data:"start_exec"}],[{text:"\uD83D\uDCDD Review",data:"review"},{text:"↩️ Reject",data:"reject_plan"}]]:"design-approval"===c?[[{text:"✅ Approve & send to execution",data:"approve_design"}],[{text:"\uD83D\uDCDD Review",data:"review_design"},{text:"↩️ Request changes",data:"reject_design"}]]:"design-pending"===c||"design-review"===c?[[{text:"\uD83D\uDCDD Review design",data:"review_design"},{text:"\uD83D\uDCCA Status",data:"status"}]]:[[{text:"\uD83D\uDCDD Review",data:"review"},{text:"\uD83D\uDCCA Status",data:"status"}]])}catch{}}async function k(a,b){await f.db.insert(g.notification).values({id:(0,d.randomUUID)(),workspaceId:a,kind:b.kind??"info",text:b.text,detail:b.detail??"",agentId:b.agentId??null,messageId:b.messageId??null,channel:b.channel??""}),await j(a,b)}},29803:(a,b,c)=>{c.d(b,{WQ:()=>d,kH:()=>f});let d=[{id:"anthropic",displayName:"Anthropic",category:"cloud_api",connectionTypes:["api_key","oauth"],defaultAdapter:"http_anthropic",baseUrl:"https://api.anthropic.com",supportsModelSync:!0,supportsApiKey:!0,supportsOAuth:!0,supportsVision:!0,supportsTools:!0,status:"available",notes:"Claude family. Model list mapped from provider capabilities."},{id:"openai",displayName:"OpenAI",category:"cloud_api",connectionTypes:["api_key","oauth"],defaultAdapter:"http_openai",baseUrl:"https://api.openai.com/v1",supportsModelSync:!0,supportsApiKey:!0,supportsOAuth:!0,supportsVision:!0,supportsTools:!0,status:"available",notes:"GPT-4o/o-series + DALL\xb7E + Whisper."},{id:"google_gemini",displayName:"Google AI / Gemini",category:"cloud_api",connectionTypes:["api_key","oauth"],defaultAdapter:"http_google",baseUrl:"https://generativelanguage.googleapis.com",supportsModelSync:!0,supportsApiKey:!0,supportsOAuth:!0,supportsVision:!0,supportsTools:!0,status:"available",notes:"Gemini 1.5/2.x via AI Studio API key."},{id:"xai_grok",displayName:"xAI / Grok",category:"cloud_api",connectionTypes:["api_key"],defaultAdapter:"http_xai",baseUrl:"https://api.x.ai/v1",supportsModelSync:!0,supportsApiKey:!0,supportsOAuth:!1,supportsVision:!0,supportsTools:!0,status:"available",notes:"OpenAI-compatible REST. Grok-2/3."},{id:"deepseek",displayName:"DeepSeek",category:"cloud_api",connectionTypes:["api_key"],defaultAdapter:"http_deepseek",baseUrl:"https://api.deepseek.com",supportsModelSync:!0,supportsApiKey:!0,supportsOAuth:!1,supportsTools:!0,status:"available",notes:"deepseek-chat / deepseek-reasoner."},{id:"cohere",displayName:"Cohere",category:"cloud_api",connectionTypes:["api_key"],defaultAdapter:"http_cohere",baseUrl:"https://api.cohere.com/v2",supportsModelSync:!0,supportsApiKey:!0,supportsOAuth:!1,supportsTools:!0,status:"available",notes:"Command R/R+ and strong rerank/embeddings."},{id:"ai21",displayName:"AI21",category:"cloud_api",connectionTypes:["api_key"],defaultAdapter:"http_ai21",baseUrl:"https://api.ai21.com/studio/v1",supportsModelSync:!1,supportsApiKey:!0,supportsOAuth:!1,status:"experimental"},{id:"perplexity",displayName:"Perplexity",category:"cloud_api",connectionTypes:["api_key"],defaultAdapter:"http_perplexity",baseUrl:"https://api.perplexity.ai",supportsModelSync:!1,supportsApiKey:!0,supportsOAuth:!1,status:"available"},{id:"groq",displayName:"Groq",category:"cloud_api",connectionTypes:["api_key"],defaultAdapter:"http_groq",baseUrl:"https://api.groq.com/openai/v1",supportsModelSync:!0,supportsApiKey:!0,supportsOAuth:!1,supportsTools:!0,status:"available",notes:"Ultra-low-latency LPU inference, OpenAI-compatible."},{id:"nvidia_nim",displayName:"NVIDIA / NIM",category:"cloud_api",connectionTypes:["api_key"],defaultAdapter:"http_nvidia",baseUrl:"https://integrate.api.nvidia.com/v1",supportsModelSync:!0,supportsApiKey:!0,supportsOAuth:!1,supportsVision:!0,supportsTools:!0,status:"available",notes:"NIM microservices, OpenAI-compatible."},{id:"together",displayName:"Together AI",category:"cloud_api",connectionTypes:["api_key"],defaultAdapter:"http_together",baseUrl:"https://api.together.xyz/v1",supportsModelSync:!0,supportsApiKey:!0,supportsOAuth:!1,supportsTools:!0,status:"available"},{id:"fireworks",displayName:"Fireworks AI",category:"cloud_api",connectionTypes:["api_key"],defaultAdapter:"http_fireworks",baseUrl:"https://api.fireworks.ai/inference/v1",supportsModelSync:!0,supportsApiKey:!0,supportsOAuth:!1,supportsTools:!0,status:"available"},{id:"cerebras",displayName:"Cerebras",category:"cloud_api",connectionTypes:["api_key"],defaultAdapter:"http_cerebras",baseUrl:"https://api.cerebras.ai/v1",supportsModelSync:!0,supportsApiKey:!0,supportsOAuth:!1,status:"available",notes:"Wafer-scale fast inference."},{id:"huggingface",displayName:"Hugging Face",category:"cloud_api",connectionTypes:["api_key"],defaultAdapter:"http_hf",baseUrl:"https://api-inference.huggingface.co",supportsModelSync:!1,supportsApiKey:!0,supportsOAuth:!1,status:"experimental"},{id:"replicate",displayName:"Replicate",category:"cloud_api",connectionTypes:["api_key"],defaultAdapter:"http_replicate",baseUrl:"https://api.replicate.com/v1",supportsModelSync:!1,supportsApiKey:!0,supportsOAuth:!1,status:"experimental"},{id:"anyscale",displayName:"Anyscale",category:"cloud_api",connectionTypes:["api_key"],defaultAdapter:"http_anyscale",baseUrl:"https://api.endpoints.anyscale.com/v1",supportsModelSync:!1,supportsApiKey:!0,supportsOAuth:!1,status:"planned",notes:"Endpoints product changing — adapter pending."},{id:"databricks",displayName:"Databricks",category:"cloud_api",connectionTypes:["api_key","oauth"],defaultAdapter:"http_databricks",supportsModelSync:!1,supportsApiKey:!0,supportsOAuth:!0,status:"requires_setup"},{id:"stability",displayName:"Stability AI",category:"image",connectionTypes:["api_key"],defaultAdapter:"http_stability",baseUrl:"https://api.stability.ai",supportsModelSync:!1,supportsApiKey:!0,supportsOAuth:!1,status:"experimental"},{id:"elevenlabs",displayName:"ElevenLabs",category:"audio",connectionTypes:["api_key"],defaultAdapter:"http_elevenlabs",baseUrl:"https://api.elevenlabs.io/v1",supportsModelSync:!0,supportsApiKey:!0,supportsOAuth:!1,status:"available",notes:"TTS / voice."},{id:"voyage",displayName:"Voyage AI",category:"embedding",connectionTypes:["api_key"],defaultAdapter:"http_voyage",baseUrl:"https://api.voyageai.com/v1",supportsModelSync:!1,supportsApiKey:!0,supportsOAuth:!1,status:"available"},{id:"jina",displayName:"Jina AI",category:"embedding",connectionTypes:["api_key"],defaultAdapter:"http_jina",baseUrl:"https://api.jina.ai/v1",supportsModelSync:!1,supportsApiKey:!0,supportsOAuth:!1,status:"available"},{id:"runpod",displayName:"RunPod",category:"cloud_api",connectionTypes:["api_key"],defaultAdapter:"http_runpod",baseUrl:"https://api.runpod.ai/v2",supportsModelSync:!1,supportsApiKey:!0,supportsOAuth:!1,status:"requires_setup"},{id:"lambda",displayName:"Lambda Labs",category:"cloud_api",connectionTypes:["api_key"],defaultAdapter:"http_lambda",baseUrl:"https://api.lambdalabs.com/v1",supportsModelSync:!0,supportsApiKey:!0,supportsOAuth:!1,status:"experimental"},{id:"modal",displayName:"Modal",category:"cloud_api",connectionTypes:["api_key","custom_endpoint"],defaultAdapter:"http_modal",supportsModelSync:!1,supportsApiKey:!0,supportsOAuth:!1,status:"requires_setup"},{id:"baseten",displayName:"Baseten",category:"cloud_api",connectionTypes:["api_key"],defaultAdapter:"http_baseten",baseUrl:"https://inference.baseten.co/v1",supportsModelSync:!1,supportsApiKey:!0,supportsOAuth:!1,status:"requires_setup"},{id:"openrouter",displayName:"OpenRouter",category:"router",connectionTypes:["api_key","oauth"],defaultAdapter:"http_openrouter",baseUrl:"https://openrouter.ai/api/v1",supportsModelSync:!0,supportsApiKey:!0,supportsOAuth:!0,supportsVision:!0,supportsTools:!0,status:"available",notes:"Aggregates 300+ models across providers — full live list."},{id:"omnirouter",displayName:"OmniRouter",category:"router",connectionTypes:["api_key"],defaultAdapter:"http_omnirouter",baseUrl:"https://api.omnirouter.ai/v1",supportsModelSync:!0,supportsApiKey:!0,supportsOAuth:!1,status:"experimental",notes:"OpenAI-compatible multi-provider router."},{id:"litellm",displayName:"LiteLLM",category:"openai_compatible",connectionTypes:["api_key","openai_compatible","custom_endpoint"],defaultAdapter:"http_litellm",baseUrl:"http://localhost:4000",supportsModelSync:!0,supportsApiKey:!0,supportsOAuth:!1,supportsTools:!0,status:"available",notes:"Self-hosted proxy; unifies 100+ providers."},{id:"portkey",displayName:"Portkey",category:"router",connectionTypes:["api_key"],defaultAdapter:"http_portkey",baseUrl:"https://api.portkey.ai/v1",supportsModelSync:!0,supportsApiKey:!0,supportsOAuth:!1,supportsTools:!0,status:"experimental",notes:"Gateway with virtual keys."},{id:"helicone",displayName:"Helicone",category:"router",connectionTypes:["api_key"],defaultAdapter:"http_helicone",baseUrl:"https://oai.helicone.ai/v1",supportsModelSync:!1,supportsApiKey:!0,supportsOAuth:!1,status:"experimental",notes:"Observability proxy in front of OpenAI-compatible providers."},{id:"openai_compatible",displayName:"OpenAI-compatible endpoint",category:"openai_compatible",connectionTypes:["openai_compatible","api_key","custom_endpoint"],defaultAdapter:"http_openai_compat",baseUrl:"https://",supportsModelSync:!0,supportsApiKey:!0,supportsOAuth:!1,supportsTools:!0,status:"available",notes:"Any server exposing /v1/chat/completions + /v1/models."},{id:"lmstudio_server",displayName:"LM Studio (OpenAI server)",category:"openai_compatible",connectionTypes:["openai_compatible","local"],defaultAdapter:"http_openai_compat",baseUrl:"http://localhost:1234/v1",supportsModelSync:!0,supportsApiKey:!1,supportsOAuth:!1,status:"available",notes:"Local OpenAI-compatible server from LM Studio."},{id:"ollama_openai",displayName:"Ollama (OpenAI endpoint)",category:"openai_compatible",connectionTypes:["openai_compatible","local"],defaultAdapter:"http_openai_compat",baseUrl:"http://localhost:11434/v1",supportsModelSync:!0,supportsApiKey:!1,supportsOAuth:!1,supportsTools:!0,status:"available",notes:"Ollama's OpenAI-compatible surface."},{id:"vllm_server",displayName:"vLLM (OpenAI server)",category:"openai_compatible",connectionTypes:["openai_compatible","local"],defaultAdapter:"http_openai_compat",baseUrl:"http://localhost:8000/v1",supportsModelSync:!0,supportsApiKey:!1,supportsOAuth:!1,supportsTools:!0,status:"available",notes:"High-throughput self-hosted serving."},{id:"tgi",displayName:"Text Generation Inference",category:"openai_compatible",connectionTypes:["openai_compatible","local","custom_endpoint"],defaultAdapter:"http_openai_compat",baseUrl:"http://localhost:8080/v1",supportsModelSync:!0,supportsApiKey:!1,supportsOAuth:!1,status:"experimental",notes:"HF TGI with OpenAI route."},{id:"localai",displayName:"LocalAI",category:"openai_compatible",connectionTypes:["openai_compatible","local"],defaultAdapter:"http_openai_compat",baseUrl:"http://localhost:8080/v1",supportsModelSync:!0,supportsApiKey:!1,supportsOAuth:!1,status:"available",notes:"Drop-in OpenAI replacement, fully local."},{id:"azure_openai",displayName:"Azure OpenAI",category:"cloud_platform",connectionTypes:["api_key","oauth"],defaultAdapter:"http_azure_openai",supportsModelSync:!1,supportsApiKey:!0,supportsOAuth:!0,supportsVision:!0,supportsTools:!0,status:"requires_setup"},{id:"aws_bedrock",displayName:"AWS Bedrock",category:"cloud_platform",connectionTypes:["api_key","custom_endpoint"],defaultAdapter:"sdk_bedrock",supportsModelSync:!0,supportsApiKey:!0,supportsOAuth:!1,supportsVision:!0,supportsTools:!0,status:"requires_setup",notes:"SigV4 auth; multi-vendor models."},{id:"vertex_ai",displayName:"Google Vertex AI",category:"cloud_platform",connectionTypes:["oauth","api_key"],defaultAdapter:"sdk_vertex",supportsModelSync:!0,supportsApiKey:!0,supportsOAuth:!0,supportsVision:!0,supportsTools:!0,status:"requires_setup",notes:"GCP service-account / ADC."},{id:"cloudflare",displayName:"Cloudflare Workers AI",category:"cloud_platform",connectionTypes:["api_key"],defaultAdapter:"http_cloudflare",baseUrl:"https://api.cloudflare.com/client/v4",supportsModelSync:!0,supportsApiKey:!0,supportsOAuth:!1,status:"experimental"},{id:"oci_genai",displayName:"Oracle OCI Generative AI",category:"cloud_platform",connectionTypes:["api_key","custom_endpoint"],defaultAdapter:"sdk_oci",supportsModelSync:!1,supportsApiKey:!0,supportsOAuth:!1,status:"planned",notes:"OCI SDK signing — adapter pending."},{id:"watsonx",displayName:"IBM watsonx",category:"cloud_platform",connectionTypes:["api_key","oauth"],defaultAdapter:"http_watsonx",supportsModelSync:!1,supportsApiKey:!0,supportsOAuth:!0,status:"requires_setup"},{id:"dashscope",displayName:"Alibaba DashScope / Qwen",category:"cloud_platform",connectionTypes:["api_key"],defaultAdapter:"http_dashscope",baseUrl:"https://dashscope-intl.aliyuncs.com/compatible-mode/v1",supportsModelSync:!0,supportsApiKey:!0,supportsOAuth:!1,supportsVision:!0,supportsTools:!0,status:"experimental",notes:"Qwen models, OpenAI-compatible mode."},{id:"qianfan",displayName:"Baidu Qianfan",category:"cloud_platform",connectionTypes:["api_key","oauth"],defaultAdapter:"http_qianfan",supportsModelSync:!1,supportsApiKey:!0,supportsOAuth:!0,status:"planned",notes:"ERNIE; access-token auth — adapter pending."},{id:"hunyuan",displayName:"Tencent Hunyuan",category:"cloud_platform",connectionTypes:["api_key"],defaultAdapter:"http_hunyuan",supportsModelSync:!1,supportsApiKey:!0,supportsOAuth:!1,status:"planned",notes:"TC3-HMAC signing — adapter pending."},{id:"zhipu",displayName:"Zhipu AI (GLM)",category:"cloud_platform",connectionTypes:["api_key"],defaultAdapter:"http_zhipu",baseUrl:"https://open.bigmodel.cn/api/paas/v4",supportsModelSync:!1,supportsApiKey:!0,supportsOAuth:!1,supportsVision:!0,supportsTools:!0,status:"experimental"},{id:"moonshot",displayName:"Moonshot AI / Kimi",category:"cloud_platform",connectionTypes:["api_key"],defaultAdapter:"http_moonshot",baseUrl:"https://api.moonshot.cn/v1",supportsModelSync:!0,supportsApiKey:!0,supportsOAuth:!1,supportsTools:!0,status:"experimental",notes:"OpenAI-compatible; long context."},{id:"minimax",displayName:"MiniMax",category:"cloud_platform",connectionTypes:["api_key"],defaultAdapter:"http_minimax",baseUrl:"https://api.minimax.chat/v1",supportsModelSync:!1,supportsApiKey:!0,supportsOAuth:!1,status:"planned",notes:"Group-id + key auth — adapter pending."},{id:"ollama",displayName:"Ollama",category:"local_runtime",connectionTypes:["local","cli"],defaultAdapter:"local_ollama",baseUrl:"http://localhost:11434",supportsModelSync:!0,supportsApiKey:!1,supportsOAuth:!1,supportsVision:!0,supportsTools:!0,status:"available",notes:"Pulls + serves local models; live /api/tags list."},{id:"llamacpp",displayName:"llama.cpp",category:"local_runtime",connectionTypes:["local"],defaultAdapter:"local_llamacpp",baseUrl:"http://127.0.0.1:8082",supportsModelSync:!0,supportsApiKey:!1,supportsOAuth:!1,status:"available",notes:"GGUF models, SHA-256 verified, bound to 127.0.0.1."},{id:"lmstudio",displayName:"LM Studio",category:"local_runtime",connectionTypes:["local"],defaultAdapter:"local_lmstudio",baseUrl:"http://localhost:1234",supportsModelSync:!0,supportsApiKey:!1,supportsOAuth:!1,supportsVision:!0,status:"available",notes:"Desktop runtime + local server."},{id:"vllm",displayName:"vLLM",category:"local_runtime",connectionTypes:["local"],defaultAdapter:"local_vllm",baseUrl:"http://localhost:8000",supportsModelSync:!0,supportsApiKey:!1,supportsOAuth:!1,supportsTools:!0,status:"available",notes:"GPU serving engine."},{id:"localai_rt",displayName:"LocalAI",category:"local_runtime",connectionTypes:["local"],defaultAdapter:"local_localai",baseUrl:"http://localhost:8080",supportsModelSync:!0,supportsApiKey:!1,supportsOAuth:!1,status:"available"},{id:"gpt4all",displayName:"GPT4All",category:"local_runtime",connectionTypes:["local"],defaultAdapter:"local_gpt4all",baseUrl:"http://localhost:4891/v1",supportsModelSync:!0,supportsApiKey:!1,supportsOAuth:!1,status:"experimental"},{id:"koboldcpp",displayName:"KoboldCpp",category:"local_runtime",connectionTypes:["local"],defaultAdapter:"local_kobold",baseUrl:"http://localhost:5001",supportsModelSync:!1,supportsApiKey:!1,supportsOAuth:!1,status:"experimental"},{id:"jan",displayName:"Jan",category:"local_runtime",connectionTypes:["local"],defaultAdapter:"local_jan",baseUrl:"http://localhost:1337/v1",supportsModelSync:!0,supportsApiKey:!1,supportsOAuth:!1,status:"experimental"},{id:"anythingllm",displayName:"AnythingLLM (local)",category:"local_runtime",connectionTypes:["local","api_key"],defaultAdapter:"local_anythingllm",baseUrl:"http://localhost:3001/api",supportsModelSync:!1,supportsApiKey:!0,supportsOAuth:!1,status:"planned",notes:"Workspace API — adapter pending."},{id:"openwebui",displayName:"Open WebUI (backend)",category:"local_runtime",connectionTypes:["local","openai_compatible"],defaultAdapter:"http_openai_compat",baseUrl:"http://localhost:3000/api",supportsModelSync:!0,supportsApiKey:!1,supportsOAuth:!1,status:"experimental"},{id:"claude_code",displayName:"Claude Code",category:"cli",connectionTypes:["cli","oauth"],defaultAdapter:"cli_claude_code",supportsModelSync:!1,supportsApiKey:!1,supportsOAuth:!0,supportsTools:!0,status:"available",notes:"Drives the local Claude Code CLI / agent."},{id:"codex_cli",displayName:"Codex CLI",category:"cli",connectionTypes:["cli"],defaultAdapter:"cli_codex",supportsModelSync:!1,supportsApiKey:!1,supportsOAuth:!1,supportsTools:!0,status:"experimental",notes:"OpenAI Codex CLI agent."},{id:"openclaw",displayName:"OpenClaw",category:"cli",connectionTypes:["cli"],defaultAdapter:"cli_openclaw",supportsModelSync:!1,supportsApiKey:!1,supportsOAuth:!1,supportsTools:!0,status:"experimental",notes:"OpenClaw CLI — headless `openclaw infer model run --json` (provider-routed). No token/cost reported."},{id:"hermes_cli",displayName:"Hermes (Nous Research)",category:"cli",connectionTypes:["cli"],defaultAdapter:"cli_hermes",supportsModelSync:!1,supportsApiKey:!1,supportsOAuth:!1,supportsTools:!0,status:"experimental",notes:"Hermes agent CLI — headless `hermes -z`. Configure providers via `hermes model`."},{id:"gemini_cli",displayName:"Gemini CLI",category:"cli",connectionTypes:["cli","oauth"],defaultAdapter:"cli_gemini",supportsModelSync:!1,supportsApiKey:!1,supportsOAuth:!0,supportsTools:!0,status:"experimental"},{id:"aider",displayName:"Aider",category:"cli",connectionTypes:["cli"],defaultAdapter:"cli_aider",supportsModelSync:!0,supportsApiKey:!1,supportsOAuth:!1,supportsTools:!0,status:"experimental",notes:"Headless `aider --message --yes-always`; provider-routed via its own env keys. Model list from `aider --list-models`. No token/cost reported."},{id:"opencode",displayName:"OpenCode",category:"cli",connectionTypes:["cli"],defaultAdapter:"cli_opencode",supportsModelSync:!0,supportsApiKey:!1,supportsOAuth:!1,supportsTools:!0,status:"experimental",notes:"Headless `opencode run`; providers via `opencode auth login`. Model list from `opencode models`. No token/cost reported."},{id:"copilot_cli",displayName:"GitHub Copilot CLI",category:"cli",connectionTypes:["cli","oauth"],defaultAdapter:"cli_copilot",supportsModelSync:!1,supportsApiKey:!1,supportsOAuth:!0,supportsTools:!0,status:"experimental",notes:"Headless `copilot -p --allow-all-tools`; sign in with the Copilot CLI. No token/cost reported."},{id:"cursor_cli",displayName:"Cursor CLI",category:"cli",connectionTypes:["cli"],defaultAdapter:"cli_cursor",supportsModelSync:!1,supportsApiKey:!1,supportsOAuth:!1,supportsTools:!0,status:"experimental",notes:"Headless `cursor-agent -p --output-format json`; sign in via `cursor-agent login`. `-p` can hang → bounded timeout. No token/cost reported."},{id:"cline_cli",displayName:"Cline CLI",category:"cli",connectionTypes:["cli"],defaultAdapter:"cli_cline",supportsModelSync:!1,supportsApiKey:!1,supportsOAuth:!1,supportsTools:!0,status:"experimental",notes:"Headless `cline --json -y`; provider-routed via its own config. No token/cost reported."},{id:"kilo_code",displayName:"Kilo Code CLI",category:"cli",connectionTypes:["cli"],defaultAdapter:"cli_kilo",supportsModelSync:!1,supportsApiKey:!1,supportsOAuth:!1,supportsTools:!0,status:"experimental",notes:"Headless `kilocode --yes`; provider-routed via its own config. No token/cost reported."},{id:"openai_cli",displayName:"OpenAI CLI",category:"cli",connectionTypes:["cli","api_key"],defaultAdapter:"cli_openai",supportsModelSync:!1,supportsApiKey:!0,supportsOAuth:!1,status:"planned",notes:"Thin CLI over the API — adapter pending."},{id:"ollama_cli",displayName:"Ollama CLI",category:"cli",connectionTypes:["cli","local"],defaultAdapter:"cli_ollama",supportsModelSync:!0,supportsApiKey:!1,supportsOAuth:!1,status:"available",notes:"`ollama run/list` driven."},{id:"custom_cli",displayName:"Custom CLI provider",category:"cli",connectionTypes:["cli","custom_endpoint"],defaultAdapter:"cli_custom",supportsModelSync:!1,supportsApiKey:!1,supportsOAuth:!1,status:"requires_setup",notes:"Define your own command + arg template."}],e=Object.fromEntries(d.map(a=>[a.id,a])),f=a=>e[a]},31578:(a,b,c)=>{c.d(b,{V$:()=>ah,Uw:()=>F,wp:()=>O,Jw:()=>X,Cp:()=>P,S8:()=>ab,kb:()=>ae,Hi:()=>ac,Vr:()=>ad,nl:()=>Y,LU:()=>Z,cm:()=>J,VH:()=>K,zO:()=>G,Gh:()=>I,I2:()=>H,ju:()=>M,Ac:()=>ag,m:()=>Q,az:()=>N,ts:()=>af,L0:()=>ai,lC:()=>aj});var d=c(6866),e=c(48161),f=c.n(e),g=c(77598),h=c(73024),i=c(31421),j=c(60547),k=c.n(j),l=c(76760),m=c(57075),n=c(46466),o=c(97603),p=c(31371),q=c(65705),r=c(1890),s=c(53993),t=c(57086),u=c(57300);function v(a,b,c=.02){let d=0;try{d=(0,h.statSync)(a).size}catch{return{ok:!1,actual:0,expected:b,message:"file missing after download"}}if(!b||b<=0)return{ok:!0,actual:d,expected:b,message:"size ok (no expected size)"};let e=d/b,f=e>=1-c&&e<=1+c;return{ok:f,actual:d,expected:b,message:f?"size verified":`size mismatch — got ${d} bytes, expected ~${b} (truncated/corrupt)`}}let w=new Map,x=[{repo:"Qwen2.5-0.5B-Instruct",paramsB:.5,kind:"chat"},{repo:"Qwen2.5-1.5B-Instruct",paramsB:1.5,kind:"chat"},{repo:"Qwen2.5-3B-Instruct",paramsB:3,kind:"chat"},{repo:"Qwen2.5-7B-Instruct",paramsB:7,kind:"chat"},{repo:"Qwen2.5-14B-Instruct",paramsB:14,kind:"chat"},{repo:"Qwen2.5-32B-Instruct",paramsB:32,kind:"chat"},{repo:"Qwen2.5-72B-Instruct",paramsB:72,kind:"chat"},{repo:"Qwen2.5-Coder-1.5B-Instruct",paramsB:1.5,kind:"code"},{repo:"Qwen2.5-Coder-3B-Instruct",paramsB:3,kind:"code"},{repo:"Qwen2.5-Coder-7B-Instruct",paramsB:7,kind:"code"},{repo:"Qwen2.5-Coder-14B-Instruct",paramsB:14,kind:"code"},{repo:"Qwen2.5-Coder-32B-Instruct",paramsB:32,kind:"code"},{repo:"Qwen3-0.6B",paramsB:.6,kind:"chat"},{repo:"Qwen3-1.7B",paramsB:1.7,kind:"chat"},{repo:"Qwen3-4B",paramsB:4,kind:"chat"},{repo:"Qwen3-8B",paramsB:8,kind:"chat"},{repo:"Qwen3-14B",paramsB:14,kind:"chat"},{repo:"Qwen3-32B",paramsB:32,kind:"chat"},{repo:"Llama-3.2-1B-Instruct",paramsB:1,kind:"chat"},{repo:"Llama-3.2-3B-Instruct",paramsB:3,kind:"chat"},{repo:"Meta-Llama-3.1-8B-Instruct",paramsB:8,kind:"chat"},{repo:"Meta-Llama-3.1-70B-Instruct",paramsB:70,kind:"chat"},{repo:"Llama-3.3-70B-Instruct",paramsB:70,kind:"chat"},{repo:"gemma-2-2b-it",paramsB:2,kind:"chat"},{repo:"gemma-2-9b-it",paramsB:9,kind:"chat"},{repo:"gemma-2-27b-it",paramsB:27,kind:"chat"},{repo:"gemma-3-1b-it",paramsB:1,kind:"chat"},{repo:"gemma-3-4b-it",paramsB:4,kind:"chat"},{repo:"gemma-3-12b-it",paramsB:12,kind:"chat"},{repo:"gemma-3-27b-it",paramsB:27,kind:"chat"},{repo:"Mistral-7B-Instruct-v0.3",paramsB:7,kind:"chat"},{repo:"Mistral-Nemo-Instruct-2407",paramsB:12,kind:"chat"},{repo:"Mistral-Small-Instruct-2409",paramsB:22,kind:"chat"},{repo:"Mistral-Small-24B-Instruct-2501",paramsB:24,kind:"chat"},{repo:"Codestral-22B-v0.1",paramsB:22,kind:"code"},{repo:"Phi-3.1-mini-4k-instruct",paramsB:3.8,kind:"chat"},{repo:"DeepSeek-R1-Distill-Qwen-1.5B",paramsB:1.5,kind:"reasoning"},{repo:"DeepSeek-R1-Distill-Qwen-7B",paramsB:7,kind:"reasoning"},{repo:"DeepSeek-R1-Distill-Qwen-14B",paramsB:14,kind:"reasoning"},{repo:"DeepSeek-R1-Distill-Qwen-32B",paramsB:32,kind:"reasoning"},{repo:"DeepSeek-R1-Distill-Llama-8B",paramsB:8,kind:"reasoning"},{repo:"DeepSeek-Coder-V2-Lite-Instruct",paramsB:16,kind:"code"},{repo:"Yi-1.5-9B-Chat",paramsB:9,kind:"chat"},{repo:"Yi-1.5-34B-Chat",paramsB:34,kind:"chat"},{repo:"granite-3.0-8b-instruct",paramsB:8,kind:"chat"},{repo:"granite-3.1-8b-instruct",paramsB:8,kind:"chat"},{repo:"SmolLM2-360M-Instruct",paramsB:.36,kind:"chat"},{repo:"SmolLM2-1.7B-Instruct",paramsB:1.7,kind:"chat"},{repo:"aya-expanse-8b",paramsB:8,kind:"chat"},{repo:"aya-expanse-32b",paramsB:32,kind:"chat"},{repo:"Falcon3-7B-Instruct",paramsB:7,kind:"chat"},{repo:"Falcon3-10B-Instruct",paramsB:10,kind:"chat"},{repo:"EXAONE-3.5-2.4B-Instruct",paramsB:2.4,kind:"chat"},{repo:"EXAONE-3.5-7.8B-Instruct",paramsB:7.8,kind:"chat"},{repo:"Qwen3.5-0.8B",paramsB:.8,kind:"chat"},{repo:"Qwen3.5-2B",paramsB:2,kind:"chat"},{repo:"Qwen3.5-9B",paramsB:9,kind:"chat"},{repo:"Qwen3.5-27B",paramsB:27,kind:"chat"},{repo:"Qwen3.5-35B-A3B",paramsB:35,kind:"chat"},{repo:"Qwen3.6-27B",paramsB:27,kind:"chat"},{repo:"Qwen3.6-35B-A3B",paramsB:35,kind:"chat"},{repo:"Qwen3-30B-A3B",paramsB:30,kind:"chat"},{repo:"Qwen3-30B-A3B-Instruct-2507",paramsB:30,kind:"chat"},{repo:"Qwen3-Next-80B-A3B-Instruct",paramsB:80,kind:"chat"},{repo:"Qwen3-4B-Thinking-2507",paramsB:4,kind:"reasoning"},{repo:"QwQ-32B",paramsB:32,kind:"reasoning"},{repo:"Qwen2.5-7B-Instruct-1M",paramsB:7,kind:"chat"},{repo:"Qwen2.5-Coder-0.5B-Instruct",paramsB:.5,kind:"code"},{repo:"Qwen2.5-Coder-3B",paramsB:3,kind:"code"},{repo:"Qwen2.5-Coder-32B",paramsB:32,kind:"code"},{repo:"Qwen2.5-Math-7B-Instruct",paramsB:7,kind:"chat"},{repo:"Qwen2-500M-Instruct",paramsB:.5,kind:"chat"},{repo:"Qwen1.5-32B-Chat",paramsB:32,kind:"chat"},{repo:"gemma-4-E2B-it",paramsB:2,kind:"chat"},{repo:"gemma-4-E4B-it",paramsB:4,kind:"chat"},{repo:"gemma-4-12B-it",paramsB:12,kind:"chat"},{repo:"gemma-4-26B-A4B-it",paramsB:26,kind:"chat"},{repo:"gemma-4-31B-it",paramsB:31,kind:"chat"},{repo:"gemma-3-270m-it",paramsB:.27,kind:"chat"},{repo:"gemma-1.1-2b-it",paramsB:2,kind:"chat"},{repo:"codegemma-2b",paramsB:2,kind:"code"},{repo:"codegemma-7b",paramsB:7,kind:"code"},{repo:"codegemma-7b-it",paramsB:7,kind:"code"},{repo:"codegemma-1.1-7b-it",paramsB:7,kind:"code"},{repo:"Ministral-3-3B-Instruct-2512",paramsB:3,kind:"chat"},{repo:"Ministral-3-8B-Instruct-2512",paramsB:8,kind:"chat"},{repo:"Ministral-3-14B-Instruct-2512",paramsB:14,kind:"chat"},{repo:"Ministral-3-3B-Reasoning-2512",paramsB:3,kind:"reasoning"},{repo:"Ministral-3-8B-Reasoning-2512",paramsB:8,kind:"reasoning"},{repo:"Ministral-3-14B-Reasoning-2512",paramsB:14,kind:"reasoning"},{repo:"Mistral-Small-3.1-24B-Instruct-2503",paramsB:24,kind:"chat"},{repo:"Mistral-Small-3.2-24B-Instruct-2506",paramsB:24,kind:"chat"},{repo:"Devstral-Small-2-24B-Instruct-2512",paramsB:24,kind:"code"},{repo:"mathstral-7B-v0.1",paramsB:7,kind:"chat"},{repo:"dolphin-2.8-mistral-7b-v02",paramsB:7,kind:"chat"},{repo:"WizardLM-2-7B",paramsB:7,kind:"chat"},{repo:"DeepSeek-R1-0528-Qwen3-8B",paramsB:8,kind:"reasoning"},{repo:"DeepSeek-R1-Distill-Llama-70B",paramsB:70,kind:"reasoning"},{repo:"deepseek-coder-1.3B-kexer",paramsB:1.3,kind:"code"},{repo:"deepseek-coder-6.7B-kexer",paramsB:6.7,kind:"code"},{repo:"granite-3.2-8b-instruct",paramsB:8,kind:"chat"},{repo:"granite-4.1-3b",paramsB:3,kind:"chat"},{repo:"granite-4.1-8b",paramsB:8,kind:"chat"},{repo:"granite-4.1-30b",paramsB:30,kind:"chat"},{repo:"Olmo-3-32B-Think",paramsB:32,kind:"reasoning"},{repo:"Seed-OSS-36B-Instruct",paramsB:36,kind:"chat"},{repo:"ERNIE-4.5-21B-A3B-PT",paramsB:21,kind:"chat"},{repo:"LFM2-24B-A2B",paramsB:24,kind:"chat"},{repo:"LFM2.5-1.2B-Instruct",paramsB:1.2,kind:"chat"},{repo:"LFM2.5-1.2B-Thinking",paramsB:1.2,kind:"reasoning"},{repo:"NVIDIA-Nemotron-3-Nano-4B",paramsB:4,kind:"chat"},{repo:"Hermes-4-70B",paramsB:70,kind:"chat"},{repo:"Llama-3.1-Tulu-3-8B",paramsB:8,kind:"chat"},{repo:"Meta-Llama-3-70B-Instruct",paramsB:70,kind:"chat"},{repo:"Llama3-ChatQA-1.5-70B",paramsB:70,kind:"chat"},{repo:"Llama-3-Groq-8B-Tool-Use",paramsB:8,kind:"chat"},{repo:"aya-23-8B",paramsB:8,kind:"chat"},{repo:"aya-23-35B",paramsB:35,kind:"chat"},{repo:"SmolLM2-135M-Instruct",paramsB:.135,kind:"chat"},{repo:"Yi-Coder-1.5B",paramsB:1.5,kind:"code"},{repo:"Yi-Coder-9B-Chat",paramsB:9,kind:"code"},{repo:"OpenCoder-1.5B-Instruct",paramsB:1.5,kind:"code"},{repo:"stable-code-instruct-3b",paramsB:3,kind:"code"},{repo:"internlm2-math-plus-7b",paramsB:7,kind:"chat"},{repo:"internlm2-math-plus-20b",paramsB:20,kind:"chat"}],y={Q3_K_L:.55,Q4_K_M:.67,Q6_K:.9,Q8_0:1.13},z=[{id:"nomic-embed-q8",name:"nomic-embed-text-v1.5 (Q8_0)",url:"https://huggingface.co/nomic-ai/nomic-embed-text-v1.5-GGUF/resolve/main/nomic-embed-text-v1.5.Q8_0.gguf",params:"137M",quant:"Q8_0",sizeBytes:146e6,kind:"embed",paramsB:.137},...function(){let a=[];for(let d of x){var b,c;let e=d.vendor??"lmstudio-community";for(let f of(b=d.paramsB)<=9?["Q3_K_L","Q4_K_M","Q6_K","Q8_0"]:b<=34?["Q3_K_L","Q4_K_M","Q6_K"]:["Q3_K_L","Q4_K_M"]){let b=`${d.repo}-${f}.gguf`;a.push({id:`${d.repo}-${f}`.toLowerCase().replace(/[^a-z0-9]+/g,"-"),name:`${d.repo} (${f})`,url:`https://huggingface.co/${e}/${d.repo}-GGUF/resolve/main/${b}`,params:(c=d.paramsB)<1?`${Math.round(1e3*c)}M`:`${c}B`,quant:f,sizeBytes:Math.round(1e9*d.paramsB*y[f]),kind:d.kind,paramsB:d.paramsB})}}return a}()];var A=c(74252);let B=process.env.OLLAMA_URL??"http://127.0.0.1:11434",C=process.env.LLAMACPP_URL??"http://127.0.0.1:8082",D=process.env.CONSTELLA_EMBED_URL??"http://127.0.0.1:8083",E=null;async function F(){if(E){let a=f().totalmem()/0x40000000,b=f().freemem()/0x40000000;return{...E,ram:`${a.toFixed(0)} GB \xb7 ${b.toFixed(1)} free`}}let a=f().cpus(),b=(a[0]?.model??"Unknown CPU").replace(/\s+/g," ").trim(),c=a.length,d=f().totalmem()/0x40000000,e=f().freemem()/0x40000000,g=`${d.toFixed(0)} GB \xb7 ${e.toFixed(1)} free`,h=f().platform(),j="—",k="—",l="CPU",m=[];try{let a=(0,i.execSync)("nvidia-smi --query-gpu=name,memory.total --format=csv,noheader,nounits",{timeout:4e3,stdio:["ignore","pipe","ignore"]}).toString().trim();if(a){let[b,c]=a.split("\n")[0].split(",");j=b.trim(),k=`${Math.round(Number(c)/1024)} GB`,l="CUDA",m.push("CUDA")}}catch{}if("CPU"===l&&"darwin"===h){l="Metal",m.push("Metal");let a="Apple Silicon";try{let b=(0,i.execFileSync)("sysctl",["-n","machdep.cpu.brand_string"],{timeout:3e3,stdio:["ignore","pipe","ignore"]}).toString().trim();b&&(a=b)}catch{/apple/i.test(b)&&(a=b)}j=/apple/i.test(a)?`${a} GPU`:"Apple GPU","arm64"===f().arch()&&(k=`${Math.max(1,Math.round(.7*d))} GB unified`)}m.push("arm64"===f().arch()?"NEON":"AVX2");let n="—";try{if("win32"===h){let a=((0,t.r$)()[0]||"C").toUpperCase(),b=/^[A-Z]$/.test(a)?a:"C",c=(0,i.execFileSync)("powershell",["-NoProfile","-Command",`(Get-PSDrive ${b}).Free`],{timeout:5e3,stdio:["ignore","pipe","ignore"]}).toString().trim(),d=Number(c.replace(/[^\d]/g,""));d>0&&(n=`${(d/0x40000000).toFixed(0)} GB`)}else{let a=(0,i.execFileSync)("df",["-h",(0,t.r$)()],{timeout:4e3,stdio:["ignore","pipe","ignore"]}).toString().trim().split("\n"),b=(a[a.length-1]??"").split(/\s+/);b[3]&&(n=b[3])}}catch{}return E={cpu:b,cores:c,ram:g,gpu:j,vram:k,diskFree:n,backend:l,accel:m,recommendedQuant:d>=32?"Q5_K_M":d>=16?"Q4_K_M":"Q4_0",maxParams:d>=64?"70B":d>=32?"34B":d>=16?"13B":"7B"}}async function G(){try{return(0,i.execSync)("ollama --version",{timeout:3e3,stdio:"ignore"}),!0}catch{return!1}}async function H(a){let b=await G(),c=[];if("start"===a){if(!b)return{up:!1,installed:!1,log:["Ollama is not installed — get it at https://ollama.com, then retry."]};if((await K()).up)return{up:!0,installed:b,log:[`server already running on ${B}`]};try{let a=(0,i.spawn)("ollama",["serve"],{detached:!0,stdio:"ignore"}),d="";a.on("error",a=>{d=String(a instanceof Error?a.message:a)}),a.unref(),c.push("$ ollama serve"),await new Promise(a=>setTimeout(a,2e3));let e=(await K()).up;return d&&c.push("spawn failed: "+d),c.push(e?`✓ ready \xb7 ${B}`:"still stopped — the port may be busy; run `ollama serve` in a terminal to see the error."),(0,p.revalidatePath)("/models"),{up:e,installed:b,log:c}}catch(a){return{up:!1,installed:b,log:["failed to start: "+String(a instanceof Error?a.message:a)]}}}try{"win32"===f().platform()?(0,i.execSync)("taskkill /IM ollama.exe /F",{stdio:"ignore",timeout:4e3}):(0,i.execSync)("pkill -f 'ollama serve'",{stdio:"ignore",timeout:4e3}),c.push("server stopped")}catch{c.push("no running ollama process found")}return(0,p.revalidatePath)("/models"),{up:!1,installed:b,log:c}}async function I(){try{let a=await fetch(`${B}/api/ps`,{signal:AbortSignal.timeout(3e3)});if(!a.ok)return{running:[]};return{running:((await a.json()).models??[]).map(a=>({name:a.name,vram:a.size_vram??0}))}}catch{return{running:[]}}}async function J(a){try{let b=await fetch(`${B}/api/generate`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({model:a,prompt:"",keep_alive:"30m"}),signal:AbortSignal.timeout(12e4)});if(!b.ok)return{ok:!1,error:`Ollama ${b.status}`};return await b.json().catch(()=>({})),(0,p.revalidatePath)("/models"),{ok:!0}}catch(b){let a=String(b instanceof Error?b.message:b);return{ok:!1,error:/abort|fetch failed|ECONN/i.test(a)?"Ollama not running":a}}}async function K(){try{let a=await fetch(`${B}/api/tags`,{signal:AbortSignal.timeout(3e3)});if(!a.ok)return{up:!1,models:[]};let b=await a.json();return{up:!0,models:(b.models??[]).map(a=>({name:a.name,size:a.size??0}))}}catch{return{up:!1,models:[]}}}async function L(a){let b=await K(),[c]=await q.db.select().from(r.provider).where((0,o.Uo)((0,o.eq)(r.provider.workspaceId,a),(0,o.eq)(r.provider.catalogId,"ollama"))),d={status:b.up?"connected":"needs_sync",modelCount:b.models.length,lastSync:b.up?new Date:null};c?await q.db.update(r.provider).set(d).where((0,o.eq)(r.provider.id,c.id)):await q.db.insert(r.provider).values({id:(0,g.randomUUID)(),workspaceId:a,catalogId:"ollama",adapter:"local_ollama",kind:"local",auth:"local",syncStatus:"implemented",...d})}async function M(a){let{workspace:b}=await (0,s.nP)();if(!a.trim())return{ok:!1,error:"no model name"};try{let c=await fetch(`${B}/api/pull`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({name:a.trim(),stream:!1}),signal:AbortSignal.timeout(18e5)});if(!c.ok){let a=await c.text().catch(()=>"");return{ok:!1,error:`Ollama ${c.status}${a?": "+a.slice(0,120):""}`}}let d=await c.json().catch(()=>({}));return await L(b.id),(0,p.revalidatePath)("/models"),{ok:"success"===d.status||null==d.error,error:d.error}}catch(b){let a=String(b instanceof Error?b.message:b);return{ok:!1,error:/abort|fetch failed|ECONN/i.test(a)?"Ollama not running — start it, then retry.":a}}}async function N(a){let{workspace:b}=await (0,s.nP)();try{await fetch(`${B}/api/delete`,{method:"DELETE",headers:{"content-type":"application/json"},body:JSON.stringify({name:a})})}catch{}return await L(b.id),(0,p.revalidatePath)("/models"),{ok:!0}}async function O(a){let{workspace:b}=await (0,s.nP)(),c=z.find(b=>b.id===a);if(!c)return{ok:!1,error:"unknown model"};let d=(0,l.join)((0,t.r$)(),"models");(0,h.mkdirSync)(d,{recursive:!0});let e=function(a){try{if("win32"===f().platform()){let b=(a[0]||"C").toUpperCase(),c=/^[A-Z]$/.test(b)?b:"C",d=(0,i.execFileSync)("powershell",["-NoProfile","-Command",`(Get-PSDrive ${c}).Free`],{timeout:6e3,stdio:["ignore","pipe","ignore"]}).toString().trim();return Number(d.replace(/[^\d]/g,""))||0}let b=(0,i.execFileSync)("df",["-k",a],{timeout:5e3,stdio:["ignore","pipe","ignore"]}).toString().trim().split("\n"),c=(b[b.length-1]??"").split(/\s+/),d=Number(c[3]);return d?1024*d:0}catch{return 0}}(d);if(e&&c.sizeBytes&&e<1.1*c.sizeBytes)return{ok:!1,error:`not enough free space — need ~${(c.sizeBytes/1e9).toFixed(1)} GB, ${(e/1e9).toFixed(1)} GB free`};let j=c.url.split("/").pop()??`${c.id}.gguf`,k=(0,l.join)(d,j);w.set(a,{received:0,total:0,done:!1});try{if(!(0,h.existsSync)(k)){let b=await fetch(c.url,{signal:AbortSignal.timeout(36e5)});if(!b.ok||!b.body)return w.set(a,{received:0,total:0,done:!0,error:`download failed (${b.status})`}),{ok:!1,error:`download failed (${b.status})`};let d=Number(b.headers.get("content-length"))||c.sizeBytes||0,e=0;w.set(a,{received:0,total:d,done:!1});let f=new m.PassThrough;f.on("data",b=>{e+=b.length;let c=w.get(a);c&&(c.received=e)}),await (0,n.pipeline)(m.Readable.fromWeb(b.body),f,(0,h.createWriteStream)(k));let g=v(k,d);if(!g.ok){try{(0,h.rmSync)(k)}catch{}return w.set(a,{received:e,total:d,done:!0,error:g.message}),{ok:!1,error:g.message}}}if((w.set(a,{received:1,total:1,done:!0}),c.sha256)&&await new Promise((a,b)=>{let c=(0,g.createHash)("sha256");(0,h.createReadStream)(k).on("data",a=>c.update(a)).on("end",()=>a(c.digest("hex"))).on("error",b)})!==c.sha256)return{ok:!1,error:"SHA-256 mismatch — file corrupt"};let d=(0,h.statSync)(k).size,[e]=await q.db.select().from(r.localModel).where((0,o.eq)(r.localModel.file,k));return e||await q.db.insert(r.localModel).values({id:(0,g.randomUUID)(),workspaceId:b.id,name:c.name,file:k,quant:c.quant,params:c.params,sizeBytes:d,sha256:c.sha256??"",bind:"127.0.0.1:8082"}),/embed|nomic|bge|mxbai|gte/i.test(c.name)&&ac().catch(()=>{}),(0,p.revalidatePath)("/models"),{ok:!0,path:k}}catch(d){let b=String(d instanceof Error?d.message:d),c=w.get(a);return w.set(a,{received:c?.received??0,total:c?.total??0,done:!0,error:b}),{ok:!1,error:b}}}async function P(a){return w.get(a)??null}async function Q(a){await (0,s.nP)();let[b]=await q.db.select().from(r.localModel).where((0,o.eq)(r.localModel.id,a));if(!b)return{ok:!1,error:"model not found"};try{b.file&&(0,h.existsSync)(b.file)&&(0,h.rmSync)(b.file,{force:!0})}catch{}return await q.db.delete(r.localModel).where((0,o.eq)(r.localModel.file,b.file)),(0,p.revalidatePath)("/models"),{ok:!0}}function R(){return(0,l.join)((0,t.r$)(),"bin","llama")}function S(){try{let a=(0,l.join)(R(),"INSTALLED");if(!(0,h.existsSync)(a))return null;let b=(0,h.readFileSync)(a,"utf8").trim();return b&&(0,h.existsSync)(b)?b:null}catch{return null}}async function T(a,b,c,d){let e=/\.(tar\.gz|tgz)$/i.test(b),f=(0,l.join)(c,b.replace(/[^\w.\-]+/g,"_"));(0,h.mkdirSync)(c,{recursive:!0});let g=await fetch(a,{signal:AbortSignal.timeout(18e5)});if(!g.ok||!g.body)return d&&w.set(d,{received:0,total:0,done:!0,error:`download failed (${g.status})`}),`download failed (${g.status})`;let j=Number(g.headers.get("content-length"))||0,o=m.Readable.fromWeb(g.body);if(d){let a=0;w.set(d,{received:0,total:j,done:!1});let b=new m.PassThrough;b.on("data",b=>{a+=b.length;let c=w.get(d);c&&(c.received=a)}),await (0,n.pipeline)(o,b,(0,h.createWriteStream)(f))}else await (0,n.pipeline)(o,(0,h.createWriteStream)(f));let p=v(f,j);if(!p.ok){try{(0,h.rmSync)(f)}catch{}return p.message}e?(0,i.execFileSync)("tar",["-xzf",f,"-C",c],{stdio:"ignore",timeout:12e4}):new(k())(f).extractAllTo(c,!0);try{(0,h.rmSync)(f)}catch{}return null}async function U(){try{let a=await fetch("https://api.github.com/repos/ggml-org/llama.cpp/releases/latest",{headers:{"User-Agent":"constella",Accept:"application/vnd.github+json"},signal:AbortSignal.timeout(15e3)});if(!a.ok)return null;return(await a.json()).assets??[]}catch{return null}}let V=!1;async function W(a=!1){let b;if("win32"!==f().platform())return{ok:!0,fetched:!1};let c=R();try{b=(0,h.readdirSync)(c)}catch{return{ok:!1,fetched:!1,reason:"no llama dir"}}let d=b.some(a=>/^ggml-cuda\.dll$/i.test(a)),e=b.some(a=>/^cudart64_\d+\.dll$/i.test(a));if(!d||e)return{ok:e||!d,fetched:!1};if(V&&!a)return{ok:!1,fetched:!1,reason:"already attempted this run"};V=!0;let g="12";try{let a=(0,h.readFileSync)((0,l.join)(c,"ggml-cuda.dll")).toString("latin1").match(/cudart64_(\d+)\.dll/i);a&&(g=a[1])}catch{}let i=await U();if(!i)return{ok:!1,fetched:!1,reason:"GitHub unreachable"};let j=i.filter(a=>/cudart/i.test(a.name)&&/x64|amd64/i.test(a.name)),k=j.find(a=>RegExp(`cuda-${g}\\.`,"i").test(a.name))??j[0];if(!k)return{ok:!1,fetched:!1,reason:"no cudart asset in the latest release"};let m=await T(k.browser_download_url,k.name,c).catch(a=>String(a instanceof Error?a.message:a));if(m)return{ok:!1,fetched:!1,reason:m};let n=!1;try{n=(0,h.readdirSync)(c).some(a=>/^cudart64_\d+\.dll$/i.test(a))}catch{}return{ok:n,fetched:n}}async function X(){let a;await (0,s.nP)();let b=[];if(S()||await Y()){let a=await W(!0).catch(()=>null);return{ok:!0,installed:!0,log:["llama-server already installed.",...a?.fetched?["✓ fetched the CUDA runtime DLLs — GPU enabled."]:a&&!a.ok?[`⚠ CUDA runtime still missing (${a.reason??"unknown"}).`]:[]]}}let c=await F(),d=/cuda|nvidia/i.test(c.backend)||(c.accel??[]).some(a=>/cuda|nvidia/i.test(a));b.push(`platform ${f().platform()}/${f().arch()} \xb7 backend ${c.backend} → ${d?"CUDA":"CPU"} build`);try{let c=await fetch("https://api.github.com/repos/ggml-org/llama.cpp/releases/latest",{headers:{"User-Agent":"constella",Accept:"application/vnd.github+json"},signal:AbortSignal.timeout(15e3)});if(!c.ok)return{ok:!1,installed:!1,log:b,error:403===c.status?"GitHub API rate-limited — try again later or install manually from the releases page.":`GitHub releases API ${c.status}`};a=(await c.json()).assets??[]}catch(a){return{ok:!1,installed:!1,log:b,error:"couldn't reach GitHub: "+String(a instanceof Error?a.message:a)}}let e=function(a,b){let c=f().platform(),d="win32"===c?/win/i:"darwin"===c?/macos/i:/(ubuntu|linux)/i,e="arm64"===f().arch(),g=a.filter(a=>/\.(zip|tar\.gz|tgz)$/i.test(a.name)&&d.test(a.name));e||(g=g.filter(a=>!/arm64|aarch64/i.test(a.name)));let h=/cuda|hip|vulkan|sycl|kompute|musa|cann|adreno/i,i=a=>{if(!a.length)return null;let b=e?a.filter(a=>/arm64|aarch64/i.test(a.name)):a.filter(a=>/x64|amd64/i.test(a.name)),c=(b.length?b:a).sort((a,b)=>a.name.length-b.name.length)[0];return c?{name:c.name,url:c.browser_download_url}:null};if(b){let a=g.filter(a=>/cuda/i.test(a.name));if(a.length)return i(a)}let j=g.filter(a=>!h.test(a.name));return i(j.length?j:g)}(a,!!d);if(!e)return{ok:!1,installed:!1,log:b,error:"no matching prebuilt for this platform — install manually from the releases page."};b.push(`downloading ${e.name}…`);let g=R();(0,h.mkdirSync)(g,{recursive:!0}),w.set("llama-server",{received:0,total:0,done:!1});try{let a=await T(e.url,e.name,g,"llama-server");if(a)return w.set("llama-server",{received:0,total:0,done:!0,error:a}),{ok:!1,installed:!1,log:b,error:a};if(d){let a=await W(!0);b.push(a.ok?a.fetched?"✓ CUDA runtime DLLs installed — GPU enabled.":"CUDA runtime already present.":`⚠ CUDA runtime not installed (${a.reason??"unknown"}) — runs on CPU; retries on next Start/Install.`)}}catch(a){return{ok:!1,installed:!1,log:b,error:"download/extract failed: "+String(a instanceof Error?a.message:a)}}let i=function a(b,c,d){let e;if(d<0)return null;try{e=(0,h.readdirSync)(b,{withFileTypes:!0})}catch{return null}for(let a of e)if(a.isFile()&&a.name===c)return(0,l.join)(b,a.name);for(let f of e)if(f.isDirectory()){let e=a((0,l.join)(b,f.name),c,d-1);if(e)return e}return null}(g,"win32"===f().platform()?"llama-server.exe":"llama-server",5);if(!i)return{ok:!1,installed:!1,log:b,error:"downloaded, but llama-server wasn't found in the archive."};if("win32"!==f().platform())try{(0,h.chmodSync)(i,493)}catch{}return(0,h.writeFileSync)((0,l.join)(g,"INSTALLED"),i,"utf8"),w.set("llama-server",{received:1,total:1,done:!0}),b.push(`✓ installed → ${i}`),await ah().catch(()=>{}),(0,p.revalidatePath)("/models"),{ok:!0,installed:!0,path:i,log:b}}async function Y(){if(S())return!0;try{return(0,i.execSync)("llama-server --version",{timeout:3e3,stdio:"ignore"}),!0}catch{return!1}}async function Z(){try{let a=await fetch(`${C}/v1/models`,{signal:AbortSignal.timeout(2500)});if(!a.ok)return{up:!1,model:null};let b=await a.json(),c=b.data?.[0]?.id;return{up:!0,model:c?c.split(/[\\/]/).pop()??c:null}}catch{return{up:!1,model:null}}}async function $(a){try{var b;let c,d=await F();if(!/cuda|metal/i.test(d.backend))return[];let e=(b=d.vram,(c=/([\d.]+)\s*GB/i.exec(b||""))?1e9*parseFloat(c[1]):0);if(a&&e&&1.15*a>e)return[];return["-ngl","99"]}catch{return[]}}function _(){try{let a=q.db.select({file:r.localModel.file,name:r.localModel.name}).from(r.localModel).all().find(a=>/embed|nomic|bge|mxbai|gte/i.test(a.name)&&a.file&&(0,h.existsSync)(a.file));return a?{file:a.file,name:a.name}:null}catch{return null}}function aa(){try{let a=q.db.select({file:r.localModel.file,name:r.localModel.name,sizeBytes:r.localModel.sizeBytes}).from(r.localModel).all().find(a=>!/embed|nomic|bge|mxbai|gte/i.test(a.name)&&a.file&&(0,h.existsSync)(a.file));return a?{file:a.file,name:a.name,sizeBytes:a.sizeBytes}:null}catch{return null}}async function ab(){try{return(await fetch(`${D}/health`,{signal:AbortSignal.timeout(1500)})).ok}catch{return!1}}async function ac(){if(await ab())return{up:!0};let a=S();if(!a)return{up:!1,reason:"llama-server not installed"};let b=_();if(!b)return{up:!1,reason:"no embedding model installed (download nomic-embed-text)"};try{await W().catch(()=>{});let c=await $(),d=(0,i.spawn)(a,["-m",b.file,"--embeddings","--host","127.0.0.1","--port","8083","-c","2048","--pooling","mean",...c],{detached:!0,stdio:"ignore"});d.on("error",()=>{}),d.unref()}catch(a){return{up:!1,reason:"spawn failed: "+String(a instanceof Error?a.message:a)}}for(let a=0;a<24;a++)if(await new Promise(a=>setTimeout(a,500)),await ab())return{up:!0,model:b.name};return{up:!1,reason:"embedding server didn't come up in time"}}async function ad(){if((await Z()).up)return{up:!0};let a=S();if(!a)return{up:!1,reason:"llama-server not installed"};let b=aa();if(!b)return{up:!1,reason:"no chat GGUF installed"};try{await W().catch(()=>{});let c=await $(b.sizeBytes),d=(0,i.spawn)(a,["-m",b.file,"--host","127.0.0.1","--port","8082","-c","4096",...c],{detached:!0,stdio:"ignore"});d.on("error",()=>{}),d.unref()}catch(a){return{up:!1,reason:"spawn failed: "+String(a instanceof Error?a.message:a)}}for(let a=0;a<24;a++)if(await new Promise(a=>setTimeout(a,500)),(await Z()).up)return{up:!0,model:b.name};return{up:!1,reason:"llama server didn't come up in time"}}async function ae(){let a=_();return{up:await ab(),model:a?.name??null,installed:!!a}}async function af(){let a=await ac();return(0,p.revalidatePath)("/models"),a}async function ag(){let{org:a}=await (0,s.nP)();await ac().catch(()=>{});let b=await (0,u.xV)(a.id);return(0,p.revalidatePath)("/models"),b}async function ah(){let{workspace:a}=await (0,s.nP)(),b=await Z(),c=new Set((await q.db.select({file:r.localModel.file}).from(r.localModel)).map(a=>a.file)).size,d={status:b.up?"connected":"needs_sync",modelCount:c,lastSync:b.up?new Date:null},[e]=await q.db.select().from(r.provider).where((0,o.Uo)((0,o.eq)(r.provider.workspaceId,a.id),(0,o.eq)(r.provider.catalogId,"llamacpp")));return e?await q.db.update(r.provider).set(d).where((0,o.eq)(r.provider.id,e.id)):await q.db.insert(r.provider).values({id:(0,g.randomUUID)(),workspaceId:a.id,catalogId:"llamacpp",adapter:"local_llamacpp",kind:"local",auth:"local",syncStatus:"implemented",...d}),(0,p.revalidatePath)("/models"),{ok:!0}}async function ai(a){let b;await (0,s.nP)();let c=await Y(),d=[];if(!c)return{up:!1,installed:!1,log:["llama-server not found — install llama.cpp from https://github.com/ggml-org/llama.cpp/releases (or `brew install llama.cpp`), then retry."]};if((await Z()).up)return{up:!0,installed:c,log:[`server already running on ${C}`]};let e=0;if(a){let d,[f]=await q.db.select().from(r.localModel).where((0,o.eq)(r.localModel.id,a));if(f&&(d=f.name,/embed|nomic|bge|mxbai|gte/i.test(d))){let a=await ac();return{up:a.up,installed:c,log:[`${f.name} is an EMBEDDING model — started the RAG embedding server on :8083 (it can't power chat on :8082).`,a.up?`✓ embeddings ready \xb7 ${D}`:`embeddings: ${a.reason??"failed to start"}`]}}b=f?.file,e=f?.sizeBytes??0}if(!b){let a=aa();b=a?.file,e=a?.sizeBytes??0}if(!b||!(0,h.existsSync)(b)){let a=_();if(a){let b=await ac();return{up:!1,installed:c,log:[`Your only local model (${a.name}) is an EMBEDDING model — it powers RAG on the embeddings server (${D}), not the chat server.`,b.up?"✓ embeddings server is running.":`embeddings: ${b.reason??"not started"}`,"Download a chat/instruct GGUF (e.g. Qwen, Llama) below to run the chat server on :8082."]}}return{up:!1,installed:c,log:["no GGUF model on disk — download one below first."]}}try{let a=S()??"llama-server";await W().catch(()=>{});let f=await $(e),g=(0,i.spawn)(a,["-m",b,"--host","127.0.0.1","--port","8082","-c","4096",...f],{detached:!0,stdio:"ignore"}),h="";g.on("error",a=>{h=String(a instanceof Error?a.message:a)}),g.unref(),d.push(`$ llama-server -m ${b.split(/[\\/]/).pop()} --port 8082${f.length?" -ngl 99 (GPU)":" (CPU)"}`);let j=!1;for(let a=0;a<12&&!j;a++)await new Promise(a=>setTimeout(a,1e3)),j=(await Z()).up;return h&&d.push("spawn failed: "+h),d.push(j?`✓ ready \xb7 ${C}`:"still starting — large models take longer; run llama-server in a terminal to see progress."),await ah(),(0,p.revalidatePath)("/models"),{up:j,installed:c,log:d}}catch(a){return{up:!1,installed:c,log:["failed to start: "+String(a instanceof Error?a.message:a)]}}}async function aj(){let a=await Y(),b=[];try{if("win32"===f().platform()){let a=(0,i.execSync)('powershell -NoProfile -Command "Get-NetTCPConnection -LocalPort 8082 -State Listen -ErrorAction SilentlyContinue | Select-Object -ExpandProperty OwningProcess"',{timeout:5e3}).toString().split(/\r?\n/).map(a=>a.trim()).filter(Boolean);if(!a.length)throw Error("not running");for(let b of a)(0,i.execSync)(`taskkill /PID ${b} /F`,{stdio:"ignore",timeout:4e3})}else(0,i.execSync)("pkill -f -- 'llama-server.*--port 8082'",{stdio:"ignore",timeout:4e3});b.push("server stopped")}catch{b.push("no running chat llama-server process found")}return await ah(),(0,p.revalidatePath)("/models"),{up:!1,installed:a,log:b}}(0,A.D)([F,G,H,I,J,K,M,N,O,P,Q,X,Y,Z,ab,ac,ad,ae,af,ag,ah,ai,aj]),(0,d.A)(F,"0085c3c15f848da7beac072fd797bc11048a499d8f",null),(0,d.A)(G,"00f03d2d81bb26d468c7e4637a0f32c70fda9c6565",null),(0,d.A)(H,"40e58ec47b3c8acdd5eeb552095b8d34ce834fa009",null),(0,d.A)(I,"006b9d9e61368e96e287131f2a79d8141f80607bc5",null),(0,d.A)(J,"404fa4e7b74f3432c13521faa40badac327c784ea2",null),(0,d.A)(K,"0073cd1b77e35abc407ab8c0bfd7158ee296172e28",null),(0,d.A)(M,"40a51f05a62e5ad01e4585ad064bcc9493ef1588fc",null),(0,d.A)(N,"40caf95c1217c0ac6c4afc1ff748b52c6e39b5c8cd",null),(0,d.A)(O,"4070a1e8f5dfdb123c1dd3ba53e819cd324592eeef",null),(0,d.A)(P,"40c08d36ba60f30915b37b6dd0aed4824b73741fe7",null),(0,d.A)(Q,"4054d8c9d713d027d9beb3076074624ea681f897ba",null),(0,d.A)(X,"0024bf7b34a52fe14a9a978ce3e57cfede2898f61a",null),(0,d.A)(Y,"0015b06bbd98ec7937ca597bbae4092e26b1991a66",null),(0,d.A)(Z,"004d7785b6e7ed54fec1c45370d77ac4c2f07804e2",null),(0,d.A)(ab,"0011c2404adc6b3048be5ca5eb204351e28665fedd",null),(0,d.A)(ac,"003c134392bb340969faa7fda2658f2c4517730d98",null),(0,d.A)(ad,"004c4e8970872e80bf3a634ff51fb13079a791cc11",null),(0,d.A)(ae,"0078876825bee310a72cf001e5fe01a3304ba0a060",null),(0,d.A)(af,"00554e833ae48f796f0eac7ddef3970ff24f235ad7",null),(0,d.A)(ag,"0018c198f4a47e6adc1238b5daa532fab3632f90ad",null),(0,d.A)(ah,"0026a43f3e1b62dcf12b65a152b2b7d0b33855e685",null),(0,d.A)(ai,"40c0f496f5293823123e86e702c43f6dbd13fa0241",null),(0,d.A)(aj,"00a82d9997685786a827f84d1adec8c0464ab77242",null)},35745:(a,b,c)=>{c.d(b,{T:()=>d});function d(a){return a<=.3?"Behavior (temperature low): be precise and deterministic. Give the single most correct, conventional answer; minimize speculation and creative variation; keep output tight and repeatable. Best for code, reviews and tools.":a<=.6?"Behavior (temperature balanced): be accurate and direct, but use reasonable judgment and allow a little exploration where the task clearly benefits.":a<=.85?"Behavior (temperature high): be creative and exploratory. Offer alternatives and non-obvious approaches and elaborate where it adds value — while staying correct and on-spec.":"Behavior (temperature max): be highly exploratory and generative. Brainstorm broadly, propose multiple distinct options and novel angles; favor breadth — still grounded in the requirements."}},38926:(a,b,c)=>{c.d(b,{IW:()=>i,Kh:()=>k,r6:()=>j});var d=c(77598),e=c(97603),f=c(65705),g=c(1890);function h(){let a=process.env.CONSTELLA_VAULT_KEY;if(!a)throw Error("CONSTELLA_VAULT_KEY is not set");let b=Buffer.from(a,"base64");if(32!==b.length)throw Error("CONSTELLA_VAULT_KEY must decode to 32 bytes");return b}async function i(a,b,c,i){let j=(0,d.randomBytes)(12),k=(0,d.createCipheriv)("aes-256-gcm",h(),j),l=Buffer.concat([k.update(c,"utf8"),k.final()]),m=k.getAuthTag(),n=Buffer.concat([l,m]).toString("base64");await f.db.delete(g.vault).where((0,e.Uo)((0,e.eq)(g.vault.workspaceId,a),(0,e.eq)(g.vault.ref,b))),await f.db.insert(g.vault).values({id:(0,d.randomUUID)(),workspaceId:a,providerId:i,ref:b,ciphertext:n,iv:j.toString("base64")})}async function j(a,b){let[c]=await f.db.select().from(g.vault).where((0,e.Uo)((0,e.eq)(g.vault.workspaceId,a),(0,e.eq)(g.vault.ref,b)));if(!c)return null;let i=Buffer.from(c.ciphertext,"base64"),j=i.subarray(i.length-16),k=i.subarray(0,i.length-16),l=(0,d.createDecipheriv)("aes-256-gcm",h(),Buffer.from(c.iv,"base64"));return l.setAuthTag(j),Buffer.concat([l.update(k),l.final()]).toString("utf8")}async function k(a,b){await f.db.delete(g.vault).where((0,e.Uo)((0,e.eq)(g.vault.workspaceId,a),(0,e.eq)(g.vault.ref,b)))}},53993:(a,b,c)=>{c.d(b,{Ht:()=>j,O5:()=>m,Yv:()=>o,nP:()=>n});var d=c(44013),e=c(84988),f=c(97603),g=c(65705),h=c(1890),i=c(37296);async function j(){return i.j2.api.getSession({headers:await (0,d.headers)()})}async function k(a,b){if(b){let[c]=await g.db.select({org:h.organization}).from(h.member).innerJoin(h.organization,(0,f.eq)(h.member.orgId,h.organization.id)).where((0,f.Uo)((0,f.eq)(h.member.userId,a),(0,f.eq)(h.organization.id,b)));if(c)return c.org}let c=await g.db.select({org:h.organization}).from(h.member).innerJoin(h.organization,(0,f.eq)(h.member.orgId,h.organization.id)).where((0,f.eq)(h.member.userId,a));return c[0]?.org??null}async function l(a){let[b]=await g.db.select().from(h.workspace).where((0,f.eq)(h.workspace.orgId,a));return b??null}async function m(a){return g.db.select({id:h.organization.id,name:h.organization.name}).from(h.member).innerJoin(h.organization,(0,f.eq)(h.member.orgId,h.organization.id)).where((0,f.eq)(h.member.userId,a))}async function n(){let a=await j();a||(0,e.redirect)("/login"),"1"===process.env.CONSTELLA_FORCE_ONBOARDING&&(0,e.redirect)("/onboarding");let b=await k(a.user.id,a.session.activeOrgId);b||(0,e.redirect)("/onboarding");let c=await l(b.id);return c||(0,e.redirect)("/onboarding"),{session:a,org:b,workspace:c}}function o(a){return(a||"org").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"")}},56267:(a,b,c)=>{c.d(b,{Lb:()=>u,bP:()=>v,tt:()=>w,GA:()=>x});var d=c(57086),e=c(65121);let f={TypeScript:{slug:"typescript"},JavaScript:{slug:"javascript"},Python:{slug:"python"},Go:{slug:"go",variant:"original-wordmark"},Rust:{slug:"rust"},Java:{slug:"java"},Kotlin:{slug:"kotlin"},"C#":{slug:"csharp"},Ruby:{slug:"ruby"},PHP:{slug:"php"},Elixir:{slug:"elixir"},Swift:{slug:"swift"},"C++":{slug:"cplusplus"},Scala:{slug:"scala"},Dart:{slug:"dart"},C:{slug:"c"},Clojure:{slug:"clojure"},Haskell:{slug:"haskell"},Lua:{slug:"lua"},R:{slug:"r"},"Objective-C":{slug:"objectivec"},Erlang:{slug:"erlang",variant:"plain"},"Node.js":{slug:"nodejs"},Bun:{slug:"bun"},Deno:{slug:"denojs"},"Python 3":{slug:"python"},JVM:{slug:"java"},".NET":{slug:"dotnetcore"},"BEAM (Erlang VM)":{slug:"erlang",variant:"plain"},React:{slug:"react"},Vue:{slug:"vuejs"},Svelte:{slug:"svelte"},Angular:{slug:"angular"},SolidJS:{slug:"solidjs"},"Alpine.js":{slug:"alpinejs"},Ember:{slug:"ember"},Backbone:{slug:"backbonejs"},"HTML/CSS":{slug:"html5"},"Vanilla JS":{slug:"javascript"},"Plain CSS":{slug:"css3"},"Next.js":{slug:"nextjs"},Nuxt:{slug:"nuxtjs"},Remix:{slug:"remix"},SvelteKit:{slug:"svelte"},Astro:{slug:"astro"},Gatsby:{slug:"gatsby"},"Vite (SPA)":{slug:"vitejs"},Hugo:{slug:"hugo"},Jekyll:{slug:"jekyll",variant:"original-wordmark"},NestJS:{slug:"nestjs"},Fastify:{slug:"fastify"},Express:{slug:"express"},Koa:{slug:"koa"},Django:{slug:"django",variant:"plain"},Flask:{slug:"flask"},FastAPI:{slug:"fastapi"},"Spring Boot":{slug:"spring"},Spring:{slug:"spring"},Laravel:{slug:"laravel"},"Ruby on Rails":{slug:"rails"},Gin:{slug:"go",variant:"original-wordmark"},Phoenix:{slug:"phoenix"},"ASP.NET Core":{slug:"dotnetcore"},Nginx:{slug:"nginx"},GraphQL:{slug:"graphql"},Symfony:{slug:"symfony"},CodeIgniter:{slug:"codeigniter"},PostgreSQL:{slug:"postgresql"},MySQL:{slug:"mysql"},MariaDB:{slug:"mariadb"},SQLite:{slug:"sqlite"},MongoDB:{slug:"mongodb"},Redis:{slug:"redis"},Cassandra:{slug:"cassandra"},DynamoDB:{slug:"dynamodb"},Supabase:{slug:"supabase"},Prisma:{slug:"prisma"},Sequelize:{slug:"sequelize"},SQLAlchemy:{slug:"sqlalchemy"},"Tailwind CSS":{slug:"tailwindcss"},"CSS Modules":{slug:"css3"},Sass:{slug:"sass"},MUI:{slug:"materialui"},Bootstrap:{slug:"bootstrap"},Bulma:{slug:"bulma"},Vuetify:{slug:"vuetify"},Docker:{slug:"docker"},Podman:{slug:"podman"},Vercel:{slug:"vercel"},Netlify:{slug:"netlify"},AWS:{slug:"amazonwebservices",variant:"original-wordmark"},GCP:{slug:"googlecloud"},Kubernetes:{slug:"kubernetes"},Azure:{slug:"azure"},Jenkins:{slug:"jenkins"},CircleCI:{slug:"circleci",variant:"plain"},Terraform:{slug:"terraform"},Ansible:{slug:"ansible"},Vagrant:{slug:"vagrant"},RabbitMQ:{slug:"rabbitmq"},Kafka:{slug:"apachekafka"},Auth0:{slug:"auth0",variant:"plain"},Keycloak:{slug:"keycloak"},"React Native":{slug:"react"},Flutter:{slug:"flutter"},Android:{slug:"android"},Ionic:{slug:"ionic"},Xamarin:{slug:"xamarin"},NativeScript:{slug:"nativescript"},TensorFlow:{slug:"tensorflow"},PyTorch:{slug:"pytorch"},"scikit-learn":{slug:"scikitlearn"},Pandas:{slug:"pandas"},NumPy:{slug:"numpy"},Jupyter:{slug:"jupyter"},Jest:{slug:"jest"},Vitest:{slug:"vitest"},Cypress:{slug:"cypressio"},Playwright:{slug:"playwright"},Selenium:{slug:"selenium"},Mocha:{slug:"mocha"},Jasmine:{slug:"jasmine"},Puppeteer:{slug:"puppeteer"},D3:{slug:"d3js"},Grafana:{slug:"grafana"},Firebase:{slug:"firebase"},Appwrite:{slug:"appwrite"},Heroku:{slug:"heroku"}},g=Object.fromEntries(e.z.map(a=>[a.key,a.label])),h={TypeScript:{logo:"typescript",color:"3178C6"},JavaScript:{logo:"javascript",color:"F7DF1E"},Python:{logo:"python",color:"3776AB"},"Python 3":{logo:"python",color:"3776AB"},Go:{logo:"go",color:"00ADD8"},Rust:{logo:"rust",color:"000000"},Java:{logo:"openjdk",color:"ED8B00"},Kotlin:{logo:"kotlin",color:"7F52FF"},"C#":{logo:"csharp",color:"512BD4"},Ruby:{logo:"ruby",color:"CC342D"},PHP:{logo:"php",color:"777BB4"},Elixir:{logo:"elixir",color:"4B275F"},Swift:{logo:"swift",color:"F05138"},"C++":{logo:"cplusplus",color:"00599C"},C:{logo:"c",color:"A8B9CC"},Scala:{logo:"scala",color:"DC322F"},Dart:{logo:"dart",color:"0175C2"},Clojure:{logo:"clojure",color:"5881D8"},Haskell:{logo:"haskell",color:"5D4F85"},Lua:{logo:"lua",color:"2C2D72"},R:{logo:"r",color:"276DC3"},Erlang:{logo:"erlang",color:"A90533"},"Node.js":{logo:"nodedotjs",color:"5FA04E"},Bun:{logo:"bun",color:"000000"},Deno:{logo:"deno",color:"70FFAF"},".NET":{logo:"dotnet",color:"512BD4"},React:{logo:"react",color:"61DAFB"},Vue:{logo:"vuedotjs",color:"4FC08D"},Svelte:{logo:"svelte",color:"FF3E00"},Angular:{logo:"angular",color:"DD0031"},SolidJS:{logo:"solid",color:"2C4F7C"},Preact:{logo:"preact",color:"673AB8"},Qwik:{logo:"qwik",color:"AC7EF4"},"Alpine.js":{logo:"alpinedotjs",color:"8BC0D0"},Ember:{logo:"emberdotjs",color:"E04E39"},"Next.js":{logo:"nextdotjs",color:"000000"},Nuxt:{logo:"nuxtdotjs",color:"00DC82"},Remix:{logo:"remix",color:"000000"},SvelteKit:{logo:"svelte",color:"FF3E00"},Astro:{logo:"astro",color:"BC52EE"},Gatsby:{logo:"gatsby",color:"663399"},"Vite (SPA)":{logo:"vite",color:"646CFF"},Hugo:{logo:"hugo",color:"FF4088"},Jekyll:{logo:"jekyll",color:"CC0000"},NestJS:{logo:"nestjs",color:"E0234E"},Fastify:{logo:"fastify",color:"000000"},Express:{logo:"express",color:"000000"},Hono:{logo:"hono",color:"E36002"},Koa:{logo:"koa",color:"33333D"},Django:{logo:"django",color:"092E20"},Flask:{logo:"flask",color:"000000"},FastAPI:{logo:"fastapi",color:"009688"},"Spring Boot":{logo:"springboot",color:"6DB33F"},Spring:{logo:"spring",color:"6DB33F"},Laravel:{logo:"laravel",color:"FF2D20"},Symfony:{logo:"symfony",color:"000000"},"Ruby on Rails":{logo:"rubyonrails",color:"D30001"},Gin:{logo:"gin",color:"008ECF"},Phoenix:{logo:"phoenixframework",color:"FD4F00"},"ASP.NET Core":{logo:"dotnet",color:"512BD4"},GraphQL:{logo:"graphql",color:"E10098"},Nginx:{logo:"nginx",color:"009639"},"React Native":{logo:"react",color:"61DAFB"},Flutter:{logo:"flutter",color:"02569B"},Android:{logo:"android",color:"3DDC84"},Ionic:{logo:"ionic",color:"3880FF"},PostgreSQL:{logo:"postgresql",color:"4169E1"},MySQL:{logo:"mysql",color:"4479A1"},MariaDB:{logo:"mariadb",color:"003545"},SQLite:{logo:"sqlite",color:"003B57"},MongoDB:{logo:"mongodb",color:"47A248"},Redis:{logo:"redis",color:"FF4438"},Cassandra:{logo:"apachecassandra",color:"1287B1"},DynamoDB:{logo:"amazondynamodb",color:"4053D6"},Supabase:{logo:"supabase",color:"3FCF8E"},Prisma:{logo:"prisma",color:"2D3748"},Drizzle:{logo:"drizzle",color:"C5F74F"},TypeORM:{logo:"typeorm",color:"FE0803"},Sequelize:{logo:"sequelize",color:"52B0E7"},SQLAlchemy:{logo:"sqlalchemy",color:"D71F00"},"Tailwind CSS":{logo:"tailwindcss",color:"06B6D4"},"CSS Modules":{logo:"cssmodules",color:"000000"},"styled-components":{logo:"styledcomponents",color:"DB7093"},Sass:{logo:"sass",color:"CC6699"},MUI:{logo:"mui",color:"007FFF"},Bootstrap:{logo:"bootstrap",color:"7952B3"},Bulma:{logo:"bulma",color:"00D1B2"},Vuetify:{logo:"vuetify",color:"1867C0"},Jest:{logo:"jest",color:"C21325"},Vitest:{logo:"vitest",color:"6E9F18"},Cypress:{logo:"cypress",color:"69D3A7"},Playwright:{logo:"playwright",color:"2EAD33"},Selenium:{logo:"selenium",color:"43B02A"},Mocha:{logo:"mocha",color:"8D6748"},TensorFlow:{logo:"tensorflow",color:"FF6F00"},PyTorch:{logo:"pytorch",color:"EE4C2C"},"scikit-learn":{logo:"scikitlearn",color:"F7931E"},Keras:{logo:"keras",color:"D00000"},Pandas:{logo:"pandas",color:"150458"},NumPy:{logo:"numpy",color:"013243"},Jupyter:{logo:"jupyter",color:"F37626"},D3:{logo:"d3dotjs",color:"F9A03C"},"Chart.js":{logo:"chartdotjs",color:"FF6384"},Grafana:{logo:"grafana",color:"F46800"},Plotly:{logo:"plotly",color:"3F4F75"},Docker:{logo:"docker",color:"2496ED"},Podman:{logo:"podman",color:"892CA0"},Vercel:{logo:"vercel",color:"000000"},Netlify:{logo:"netlify",color:"00C7B7"},AWS:{logo:"amazonwebservices",color:"232F3E"},GCP:{logo:"googlecloud",color:"4285F4"},Azure:{logo:"microsoftazure",color:"0078D4"},Kubernetes:{logo:"kubernetes",color:"326CE5"},Cloudflare:{logo:"cloudflare",color:"F38020"},Jenkins:{logo:"jenkins",color:"D24939"},CircleCI:{logo:"circleci",color:"343434"},Terraform:{logo:"terraform",color:"7B42BC"},Ansible:{logo:"ansible",color:"EE0000"},Firebase:{logo:"firebase",color:"DD2C00"},Appwrite:{logo:"appwrite",color:"FD366E"},Heroku:{logo:"heroku",color:"430098"},BullMQ:{logo:"bull",color:"CB0000"},RabbitMQ:{logo:"rabbitmq",color:"FF6600"},Kafka:{logo:"apachekafka",color:"231F20"},Celery:{logo:"celery",color:"37814A"},"Auth.js":{logo:"auth0",color:"EB5424"},Clerk:{logo:"clerk",color:"6C47FF"},Auth0:{logo:"auth0",color:"EB5424"},Keycloak:{logo:"keycloak",color:"4D4D4D"}},i=[{c1:"0E0D17",c2:"E0A44E"},{c1:"0B1120",c2:"38BDF8"},{c1:"1A0B2E",c2:"A855F7"},{c1:"0A1F1C",c2:"2DD4BF"},{c1:"1F0A0A",c2:"F87171"},{c1:"0A0A1F",c2:"6366F1"},{c1:"131A0A",c2:"A3E635"},{c1:"1F140A",c2:"FB923C"}];function j(a){return a.toLowerCase().replace(/[^\w\s-]/g,"").trim().replace(/\s+/g,"-")}function k(a){let b=h[a],c=a.replace(/-/g,"--").replace(/_/g,"__").replace(/ /g,"_");return b?``:``}function l(a){return Object.entries(a||{}).filter(([,a])=>a&&"None"!==a&&a.trim())}var m=c(4370),n=c(35745);let o=[{handle:"ada",name:"Ada",role:"CEO",color:"#e0a44e",reportsTo:null,model:"sonnet",provider:"cli_claude_code",temperature:.4,dailyCapUsd:15,tier:"critical",identity:"Decisive, outcome-driven leader. Speaks in goals, not tasks. Protects scope and budget.",ritual:"Read the company goals, decompose into epics, delegate to leads, review what shipped."},{handle:"linus",name:"Linus",role:"CTO",color:"#9a5cff",reportsTo:"ada",model:"sonnet",provider:"cli_claude_code",temperature:.3,dailyCapUsd:40,tier:"critical",identity:"Systems thinker. Balances delivery speed against technical debt.",ritual:"Turn epics into tickets, route work to specialists, clear blockers, review PRs."},{handle:"donald",name:"Donald",role:"Product Owner",color:"#4fc9b0",reportsTo:"ada",model:"haiku",provider:"cli_claude_code",temperature:.4,dailyCapUsd:20,tier:"heavy",identity:"Customer voice. Ruthless about priority and clarity.",ritual:"Groom the backlog with MoSCoW, plan the sprint, track delivery, close with a retro."},{handle:"margaret",name:"Margaret",role:"Backend",color:"#3fb98f",reportsTo:"linus",model:"sonnet",provider:"cli_claude_code",temperature:.3,dailyCapUsd:50,tier:"heavy",identity:"Pragmatic server engineer. Values correctness, small diffs and green tests.",ritual:"Pull one ticket, read context, implement on a branch, never push without a passing suite."},{handle:"grace",name:"Grace",role:"Frontend",color:"#5b8def",reportsTo:"linus",model:"sonnet",provider:"cli_claude_code",temperature:.5,dailyCapUsd:45,tier:"heavy",identity:"Craft-focused UI engineer. Cares about accessibility and clean component APIs.",ritual:"Read the design tokens, build the smallest component that works, typecheck before PR."},{handle:"edsger",name:"Edsger",role:"QA",color:"#e8688f",reportsTo:"linus",model:"haiku",provider:"cli_claude_code",temperature:.2,dailyCapUsd:25,tier:"heavy",identity:"Skeptical quality gate. Assumes nothing works until proven by a test.",ritual:"Reproduce, cover with a test, run the suite, then gate the sign-off."},{handle:"werner",name:"Werner",role:"DevOps",color:"#f0a35e",reportsTo:"linus",model:"haiku",provider:"cli_claude_code",temperature:.3,dailyCapUsd:20,tier:"heavy",identity:"Reliability-minded operator. Automates the boring, guards the leases.",ritual:"Build, deploy a preview, report the URL, never leave an env leased too long."},{handle:"barbara",name:"Barbara",role:"Docs",color:"#b3d97a",reportsTo:"ada",model:"haiku",provider:"cli_claude_code",temperature:.4,dailyCapUsd:15,tier:"light",identity:"Patient explainer. Turns changes into understandable docs.",ritual:"Watch merges, draft docs while context is fresh, verify every link."},{handle:"whitfield",name:"Whitfield",role:"CyberSec",color:"#c4a0ff",reportsTo:"linus",model:"opus",provider:"cli_claude_code",temperature:.2,dailyCapUsd:30,tier:"critical",identity:"Adversarial reviewer. Thinks like an attacker, writes like an auditor.",ritual:"Audit every change for secret handling and injection, file findings with a concrete fix."},{handle:"vannevar",name:"Vannevar",role:"Knowledge",color:"#7ac5e0",reportsTo:"ada",model:"haiku",provider:"cli_claude_code",temperature:.2,dailyCapUsd:10,tier:"light",identity:"Keeper of the company's semantic memory. Indexes every document AND conversation into embeddings so any agent can recall anything instantly.",ritual:"Keep the embedding server healthy; re-index the workspace docs and the chat (team room, DMs, Telegram) into the RAG index so retrieval stays current."}],p=[{name:"open-pr",summary:"Branch, commit, open a PR with a test plan and request CTO review.",trigger:"When a work product is ready to merge",steps:["Create a branch from main","Commit the change set","Open a PR with summary + test plan","Request review from the CTO"]},{name:"run-suite",summary:"Detect the package manager, run the test task and gate sign-off on red.",trigger:"Before any sign-off",steps:["Detect package manager","Run the workspace test task","Parse results","Block sign-off if red"]},{name:"secret-scan",summary:"Scan for plaintext keys, verify vault references and flag log leaks.",trigger:"On every adapter change",steps:["Grep for plaintext keys","Check vault references","Flag any echo to logs"]},{name:"telegram-notify",summary:"Format a digest and POST it to the Telegram Bot API.",trigger:"When a routine completes",steps:["Format the digest","Resolve the chat id from secrets","POST to Telegram Bot API"]},{name:"moscow-prioritise",summary:"Score backlog items and re-order them with the MoSCoW method.",trigger:"During backlog grooming",steps:["Score each item","Assign Must/Should/Could/Won't","Re-order the backlog"]},{name:"gguf-validate",summary:"Pull a GGUF, verify SHA-256 and bind to loopback.",trigger:"When installing a local model",steps:["Download the GGUF","Verify SHA-256","Bind to 127.0.0.1 only"]}],q=p.filter(a=>"telegram-notify"!==a.name&&"gguf-validate"!==a.name).map(a=>a.name);function r(a,b){return`# ${a}
|
|
349
349
|
|
|
350
350
|
${b}
|
|
351
351
|
`}function s(a){let b,c,d,e=[[".claude/organization.md",`---
|
|
@@ -588,7 +588,7 @@ ${b.map(a=>`| \`${a}\` | ${a.includes("fs")?"Workspace file access":a.includes("
|
|
|
588
588
|
## Execution limits & safety
|
|
589
589
|
- Stop at the daily budget cap ($${a.dailyCapUsd}). Never inline or echo secrets.
|
|
590
590
|
- Use a tool only when its purpose matches the task; otherwise skip it.
|
|
591
|
-
`}(b)]),e.push([`${c}/skills.md`,function(a){var b;let c=[...new Set([...q,..."DevOps"===(b=a.role)?["telegram-notify"]:"Backend"===b
|
|
591
|
+
`}(b)]),e.push([`${c}/skills.md`,function(a){var b;let c=[...new Set([...q,..."DevOps"===(b=a.role)?["telegram-notify","gguf-validate"]:"Backend"===b?["gguf-validate"]:[]])];return`# Skills — ${a.name}
|
|
592
592
|
|
|
593
593
|
Assigned procedures. Each links to a real file in \`../../skills/\`.
|
|
594
594
|
|
|
@@ -858,7 +858,7 @@ Released under the **MIT License** — see [\`LICENSE\`](./LICENSE).
|
|
|
858
858
|
<div align="center">
|
|
859
859
|
<sub>Scaffolded & maintained by an autonomous AI team \xb7 🤖 <a href="#">Constella</a></sub>
|
|
860
860
|
</div>
|
|
861
|
-
`}({company:a.company,mission:a.mission,objective:a.objective,stack:a.stack,slug:a.slug})]),e}let t=/^(\.claude\/organization\.md|\.claude\/CLAUDE\.md|README\.md|DOCS\/architecture\.md|DOCS\/onboarding\.md|PO\/roadmap\.md|\.claude\/agents\/[^/]+\/Agent\.md)$/;function u(a){let b=[];for(let[c,e]of s(a))t.test(c)&&((0,d.dx)(a.orgId,c,e),b.push(c));return b}function v(a){let b=[];for(let[c,e]of s(a)){let f=(0,d.sL)(a.orgId,c);(null==f||""===f.trim())&&((0,d.dx)(a.orgId,c,e),b.push(c))}return b.push(...w(a).written),b}function w(a){let b=[];try{let{id:c,files:e}=(0,m.xF)({company:a.company,mission:a.mission,objective:a.objective,slug:a.slug,stack:a.stack});for(let[c,f]of e)null==(0,d.sL)(a.orgId,c)&&((0,d.dx)(a.orgId,c,f),b.push(c));return{id:c,written:b}}catch(a){return console.error("[scaffold] project starter failed:",a),{id:"static",written:b}}}function x(a,b){var c={orgId:a,slug:b.slug??a,company:b.company,mission:b.mission,objective:b.objective,stack:b.stack,runMode:b.runMode,createdAt:new Date().toISOString().slice(0,10),preserveReadme:b.preserveReadme};for(let[a,b]of s(c))(0,d.dx)(c.orgId,a,b)}},57086:(a,b,c)=>{c.d(b,{xZ:()=>h,r$:()=>i,EX:()=>q,CS:()=>function a(b,c=""){let d=[];for(let e of m(b,c))if(e.isDir){if(n.has(e.name))continue;d.push(...a(b,e.path))}else d.push(e.path);return d},HZ:()=>k,Ci:()=>m,sL:()=>o,dx:()=>p});var d=c(73024),e=c(76760),f=c(48161),g=c(30043);let h=new Set(["node_modules",".git",".next",".turbo","dist","build","out","coverage",".cache",".pnpm-store",".vercel","vendor",".parcel-cache",".svelte-kit",".nuxt",".astro",".angular",".venv","venv","env","__pycache__",".mypy_cache",".pytest_cache",".ruff_cache",".tox",".nox","htmlcov","site-packages",".eggs",".ipynb_checkpoints","target",".gradle","bin","obj","Pods",".cargo","Carthage",".cxx","DerivedData",".idea",".vscode",".svn",".hg",".vs",".fleet","logs","tmp","temp",".terraform","archives",".testdev"]);function i(){return process.env.CONSTELLA_HOME?(0,g.Y)(process.env.CONSTELLA_HOME):(0,e.join)((0,f.homedir)(),".constella")}let j=new Set;function k(a){if(!/^[A-Za-z0-9_-]{6,64}$/.test(a))throw Error("Invalid orgId");let b=(0,e.join)(i(),"organizations",a,"workspace");if(!j.has(a)){j.add(a);try{let c=(0,e.join)(i(),"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 l(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 m(a,b=""){let c=l(k(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 n=new Set(["node_modules",".git",".next",".turbo","dist","build","out","coverage",".cache","archives",".testdev",".pnpm-store",".vercel","vendor"]);function o(a,b){let c=l(k(a),b);return(0,d.existsSync)(c)?(0,d.readFileSync)(c,"utf8"):null}function p(a,b,c){let f=l(k(a),b);(0,d.mkdirSync)((0,e.dirname)(f),{recursive:!0}),(0,d.writeFileSync)(f,c,"utf8")}function q(a,b){let c=l(k(a),b);(0,d.existsSync)(c)&&(0,d.rmSync)(c,{recursive:!0,force:!0})}},57300:(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(97603),f=c(95357),g=c(65705),h=c(1890),i=c(57086);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))}},65121:(a,b,c)=>{c.d(b,{z:()=>d});let d=[{key:"language",label:"Language",opts:["TypeScript","JavaScript","Python","Go","Rust","Java","Kotlin","C#","Ruby","PHP","Elixir","Swift","C++","C","Scala","Dart","Clojure","Haskell","Lua","R","Objective-C","Erlang","None"]},{key:"runtime",label:"Runtime",opts:["Node.js","Bun","Deno","Python 3","PyPy","JVM",".NET","BEAM (Erlang VM)","None"]},{key:"frontend",label:"Frontend",opts:["React","Vue","Svelte","Angular","SolidJS","Preact","Qwik","Lit","HTMX","Alpine.js","Ember","Backbone","HTML/CSS","Vanilla JS","None"]},{key:"meta",label:"Meta-framework / SSG",opts:["Next.js","Nuxt","Remix","SvelteKit","Astro","Gatsby","Vite (SPA)","Hugo","Jekyll","Eleventy","Docusaurus","Static (no framework)","None"]},{key:"backend",label:"Backend framework",opts:["NestJS","Fastify","Express","Hono","Koa","Django","Flask","FastAPI","Spring Boot","Spring","Laravel","Symfony","CodeIgniter","Ruby on Rails","Gin","Fiber","Actix","Phoenix","ASP.NET Core","AdonisJS","GraphQL","Nginx","None"]},{key:"mobile",label:"Mobile",opts:["React Native","Flutter","Android","Ionic","Xamarin","NativeScript","None"]},{key:"database",label:"Database",opts:["PostgreSQL","MySQL","MariaDB","SQLite","MongoDB","Redis","CockroachDB","Cassandra","DynamoDB","Supabase","PlanetScale","Neon","None"]},{key:"orm",label:"ORM / Data layer",opts:["Prisma","Drizzle","TypeORM","Sequelize","SQLAlchemy","Django ORM","Mongoose","Knex","Diesel","GORM","None"]},{key:"styling",label:"Styling / UI",opts:["Tailwind CSS","Plain CSS","CSS Modules","styled-components","Sass","Vanilla Extract","UnoCSS","shadcn/ui","MUI","Bootstrap","Bulma","Vuetify","Chakra UI","None"]},{key:"testing",label:"Testing",opts:["Jest","Vitest","Cypress","Playwright","Selenium","Mocha","Jasmine","Puppeteer","None"]},{key:"aiml",label:"AI / ML",opts:["TensorFlow","PyTorch","scikit-learn","Keras","Pandas","NumPy","Jupyter","None"]},{key:"dataviz",label:"Data viz",opts:["D3","Chart.js","Grafana","Plotly","None"]},{key:"container",label:"Container",opts:["Docker","Podman","containerd","None"]},{key:"infra",label:"Infra / DevOps",opts:["Tailscale","Cloudflare","Vercel","Netlify","Fly.io","Railway","AWS","GCP","Azure","Kubernetes","Jenkins","CircleCI","Terraform","Ansible","Vagrant","None"]},{key:"baas",label:"Backend-as-a-service",opts:["Firebase","Appwrite","Amplify","Heroku","Supabase","None"]},{key:"queue",label:"Queue / Cache",opts:["Redis","BullMQ","RabbitMQ","Kafka","NATS","Celery","None"]},{key:"auth",label:"Auth",opts:["Auth.js","Clerk","Lucia","Supabase Auth","Keycloak","Auth0","Passport","None"]}]},70149:(a,b,c)=>{c.d(b,{$g:()=>U,Hs:()=>r,JN:()=>Z,KD:()=>C,Kp:()=>V,Pe:()=>o,UC:()=>u,ZB:()=>S,d1:()=>T,hW:()=>X,p1:()=>ab,qX:()=>Y,w5:()=>W});var d=c(31421),e=c(73024),f=c(48161),g=c(76760),h=c(57086);let i="win32"===process.platform,j=process.env.CONSTELLA_RUN_MODE??"start",k=null!=process.env.CONSTELLA_AGENT_FULL_ACCESS?"0"!==process.env.CONSTELLA_AGENT_FULL_ACCESS:"start"===j;function l(){return k?["--permission-mode","bypassPermissions"]:["--permission-mode","acceptEdits"]}let m=null,n=null;function o(a){n=a}function p(){return n??"1"===process.env.CONSTELLA_AGENT_LOCK_HOOK}let q=null;function r(a){q=a}function s(){return q??"1"===process.env.CONSTELLA_AGENT_CMD_GUARD}let t=null;function u(a){t=a}function v(){try{let a=(0,g.join)((0,h.r$)(),".agent-claude");(0,e.mkdirSync)(a,{recursive:!0});let b=(0,g.join)((0,f.homedir)(),".claude",".credentials.json");if(!(0,e.existsSync)(b))return null;(0,e.copyFileSync)(b,(0,g.join)(a,".credentials.json"));let c=(0,g.join)((0,f.homedir)(),".claude.json");if((0,e.existsSync)(c))try{(0,e.copyFileSync)(c,(0,g.join)(a,".claude.json"))}catch{}let d=process.env.CONSTELLA_PKG_ROOT||process.cwd(),i=[];return p()&&i.push({matcher:"Write|Edit|MultiEdit|NotebookEdit",hooks:[{type:"command",command:`node "${(0,g.join)(d,"bin","lock-hook.mjs")}"`}]}),s()&&i.push({matcher:"Bash",hooks:[{type:"command",command:`node "${(0,g.join)(d,"bin","guard-hook.mjs")}"`}]}),(0,e.writeFileSync)((0,g.join)(a,"settings.json"),JSON.stringify({hooks:{PreToolUse:i}}),"utf8"),a}catch{return null}}function w(){if((p()||s())&&v())return[];if(null===m)try{let a=(0,g.join)((0,f.tmpdir)(),"constella-agent-settings.json");(0,e.writeFileSync)(a,JSON.stringify({disableAllHooks:!0}),"utf8"),m=a}catch{m=""}return m?["--settings",m]:[]}function x(a){if(!p()&&!s())return process.env;let b=v();return b?{...process.env,CLAUDE_CONFIG_DIR:b,CONSTELLA_ORG_ID:a.orgId,CONSTELLA_TASK_ID:a.token||"",CONSTELLA_AGENT_ID:a.agentId||"",CONSTELLA_AGENT_HANDLE:a.agentHandle||"",CONSTELLA_BASE_URL:process.env.CONSTELLA_BASE_URL||"http://127.0.0.1:3000"}:process.env}function y(a){if(a)return/^[A-Za-z0-9][A-Za-z0-9._:-]{0,63}$/.test(a)?a:void 0}function z(a){if(a&&"(default)"!==a)return/^[A-Za-z0-9][A-Za-z0-9._:/-]{0,79}$/.test(a)?a:void 0}let A=new Map,B=new Set;function C(a){B.add(a);let b=A.get(a);if(!b)return!1;A.delete(a);try{return b.kill("SIGKILL"),!0}catch{return!1}}function D(a,b){if(a){if(B.has(a)){B.delete(a);try{b.kill("SIGKILL")}catch{}return}A.set(a,b)}}function E(a){a&&(A.delete(a),B.delete(a))}function F(a,b,c,e,f,g,h,j=i){return new Promise(i=>{let k=Date.now(),l=(0,d.spawn)(a,b,{cwd:e,shell:j,windowsHide:!0,env:g??process.env});D(h,l);let m="",n="",o=!1,p=setTimeout(()=>{o=!0;try{l.kill("SIGKILL")}catch{}},f);l.stdout.on("data",a=>m+=a.toString()),l.stderr.on("data",a=>n+=a.toString()),l.on("error",a=>{clearTimeout(p),E(h),i({code:-1,stdout:m,stderr:n+String(a),durationMs:Date.now()-k,timedOut:o})}),l.on("close",a=>{clearTimeout(p),E(h),i({code:a,stdout:m,stderr:n,durationMs:Date.now()-k,timedOut:o})}),c&&l.stdin.write(c),l.stdin.end()})}async function G(a,b){let c=(0,h.HZ)(b.orgId);(0,e.mkdirSync)(c,{recursive:!0});let d=y(b.model),f=["-p","--output-format","json",...w(),...l()];d&&f.push("--model",d);let g=await F("claude",f,a,c,b.timeoutMs??18e4,x(b),b.token);if(g.timedOut)return I("claude",b.model,g.durationMs,"timed out");let i=null;try{i=JSON.parse(g.stdout.trim())}catch{let a=g.stdout.split("\n").reverse().find(a=>a.includes('"type":"result"'));if(a)try{i=JSON.parse(a)}catch{}}if(!i)return I("claude",b.model,g.durationMs,g.stderr.slice(-300)||"no JSON output (code "+g.code+")");let j=i.usage??{};return{ok:!0!==i.is_error&&"success"===i.subtype,text:String(i.result??""),usd:Number(i.total_cost_usd??0),inputTokens:Number(j.input_tokens??0)+Number(j.cache_read_input_tokens??0)+Number(j.cache_creation_input_tokens??0),outputTokens:Number(j.output_tokens??0),durationMs:g.durationMs,binary:"claude",model:b.model,error:!0===i.is_error?String(i.result??"error"):void 0}}async function H(a,b){let c=(0,h.HZ)(b.orgId);(0,e.mkdirSync)(c,{recursive:!0});let d=y(b.model),f=["exec","--json","--skip-git-repo-check","-s",k?"danger-full-access":"workspace-write"];d&&f.push("-m",d);let g=await F("codex",f,a,c,b.timeoutMs??18e4,void 0,b.token);if(g.timedOut)return I("codex",b.model,g.durationMs,"timed out");let i="",j=0,l=0,m=0;for(let a of g.stdout.split("\n")){let b=a.trim();if(b.startsWith("{"))try{let a=JSON.parse(b),c=a.item??a.msg??{};"string"==typeof c.text&&c.text&&(i=c.text),"string"==typeof a.text&&(i=a.text);let d=a.usage??a.token_usage??c.usage??{};d.input_tokens&&(j=Number(d.input_tokens)),d.output_tokens&&(l=Number(d.output_tokens)),"number"==typeof a.cost_usd&&(m=a.cost_usd)}catch{}}return{ok:0===g.code,text:i,usd:m,inputTokens:j,outputTokens:l,durationMs:g.durationMs,binary:"codex",model:b.model,error:0===g.code?void 0:g.stderr.slice(-300)||"codex exit "+g.code}}function I(a,b,c,d){return{ok:!1,text:"",usd:0,inputTokens:0,outputTokens:0,durationMs:c,binary:a,model:b,error:d}}async function J(a,b){let c=(0,h.HZ)(b.orgId);(0,e.mkdirSync)(c,{recursive:!0});let d=z(b.model),f=["-z",a];if(d){let a=d.indexOf("/");a>0?f.push("--provider",d.slice(0,a),"--model",d.slice(a+1)):f.push("--model",d)}let g=await F("hermes",f,"",c,b.timeoutMs??18e4,void 0,b.token);if(g.timedOut)return I("hermes",b.model,g.durationMs,"timed out");let i=(g.stdout||"").trim();return{ok:0===g.code&&!!i,text:i,usd:0,inputTokens:0,outputTokens:0,durationMs:g.durationMs,binary:"hermes",model:b.model,error:0===g.code?void 0:g.stderr.slice(-300)||"hermes exit "+g.code}}async function K(a,b){let c=(0,h.HZ)(b.orgId);(0,e.mkdirSync)(c,{recursive:!0});let d=z(b.model),f=["infer","model","run","--prompt",a,"--json"];d&&f.push("--model",d);let g=await F("openclaw",f,"",c,b.timeoutMs??18e4,void 0,b.token);if(g.timedOut)return I("openclaw",b.model,g.durationMs,"timed out");let i="",j=0===g.code,k;try{var l;let a=JSON.parse(g.stdout.trim());j=!1!==a.ok&&0===g.code,i=(l=a.outputs)?"string"==typeof l?l:Array.isArray(l)?l.map(a=>"string"==typeof a?a:a&&"object"==typeof a?String(a.text??a.content??a.output??a.message??""):"").filter(Boolean).join("\n"):"object"==typeof l?String(l.text??l.content??""):"":"",a.error&&(k=String(a.error?.message??a.error))}catch{i=g.stdout.trim(),0!==g.code&&(j=!1,k=g.stderr.slice(-300)||"openclaw exit "+g.code)}return i||k||(k=g.stderr.slice(-300)||"no output (code "+g.code+")"),{ok:j&&!!i,text:i,usd:0,inputTokens:0,outputTokens:0,durationMs:g.durationMs,binary:"openclaw",model:b.model,error:k}}async function L(a,b,c){let d=(0,h.HZ)(c.orgId);(0,e.mkdirSync)(d,{recursive:!0});let f=await F(a,b,"",d,c.timeoutMs??18e4,void 0,c.token);if(f.timedOut)return I(a,c.model,f.durationMs,"timed out");let g=function(a){let b=a.trim();if(!b)return"";if(b.startsWith("{")||b.startsWith("["))try{let a=JSON.parse(b),c=a.result??a.text??a.response??a.content??a.message??a.output;if("string"==typeof c&&c)return c;if(c&&"object"==typeof c){let a=c.text??c.content;if("string"==typeof a)return a}}catch{}return b}(f.stdout),i=0===f.code?g?void 0:f.stderr.slice(-300)||"no output (code "+f.code+")":f.stderr.slice(-300)||`${a} exit ${f.code}`;return{ok:0===f.code&&!!g,text:g,usd:0,inputTokens:0,outputTokens:0,durationMs:f.durationMs,binary:a,model:c.model,error:i}}async function M(a,b){let c=z(b.model),d=["--message",a,"--yes-always","--no-auto-commits","--no-stream"];return c&&d.push("--model",c),L("aider",d,b)}async function N(a,b){let c=z(b.model),d=["run",a];return c&&d.push("--model",c),L("opencode",d,b)}async function O(a,b){let c=z(b.model),d=["-p",a,"--allow-all-tools"];return c&&d.push("--model",c),L("copilot",d,b)}async function P(a,b){let c=z(b.model),d=["-p",a,"--output-format","json"];return c&&d.push("--model",c),L("cursor-agent",d,{...b,timeoutMs:b.timeoutMs??15e4})}async function Q(a,b){let c=z(b.model),d=["--json","-y",a];return c&&d.push("--model",c),L("cline",d,b)}async function R(a,b){let c=z(b.model),d=["--yes",a];return c&&d.push("--model",c),L("kilocode",d,b)}async function S(a){try{if("opencode"===a){let a=await F("opencode",["models"],"",process.cwd(),2e4);if(0!==a.code)return[];return a.stdout.split("\n").map(a=>a.trim()).filter(a=>/^[\w.-]+\/[\w./:-]+$/.test(a)).slice(0,200)}if("aider"===a){let a=await F("aider",["--list-models","/"],"",process.cwd(),25e3);if(0!==a.code)return[];return a.stdout.split("\n").map(a=>a.replace(/^[-*\s]+/,"").trim()).filter(a=>/^[\w.-]+\/[\w./:-]+$/.test(a)).slice(0,200)}}catch{}return[]}async function T(a,b,c){return F(a,b,c.input??"",c.cwd,c.timeoutMs??6e4,c.env?{...process.env,...c.env}:void 0,void 0,!1)}async function U(a){let b=await F(a,["--version"],"",process.cwd(),15e3);return 0!==b.code?null:(b.stdout||b.stderr).trim().split("\n")[0]||"ok"}async function V(a){let b=(0,f.homedir)(),c=(...a)=>a.some(a=>(0,e.existsSync)((0,g.join)(b,a)));try{switch(a){case"claude":return c(".claude/.credentials.json",".claude.json",".config/claude")?"ready":"needs_login";case"codex":return c(".codex/auth.json",".codex")?"ready":"needs_login";case"aider":return process.env.OPENAI_API_KEY||process.env.ANTHROPIC_API_KEY||process.env.DEEPSEEK_API_KEY||process.env.GEMINI_API_KEY||process.env.OPENROUTER_API_KEY||process.env.GROQ_API_KEY?"ready":"needs_login";case"opencode":{let a=await F("opencode",["auth","list"],"",process.cwd(),8e3);if(0===a.code&&/\w/.test(a.stdout)&&!/\b(no|none|not)\b.*(auth|provider|credential|logged)/i.test(a.stdout))return"ready";return c(".local/share/opencode/auth.json",".config/opencode")?"ready":"needs_login"}case"copilot":return c(".config/github-copilot/apps.json",".config/github-copilot",".copilot")?"ready":"needs_login";case"cursor-agent":return c(".config/cursor-agent",".cursor-agent",".cursor")?"ready":"needs_login";case"openclaw":return c(".openclaw",".config/openclaw")?"ready":"unknown";case"hermes":return c(".hermes",".config/hermes")?"ready":"unknown";case"cline":return c(".cline",".config/cline")?"ready":"unknown";case"kilocode":return c(".kilocode",".config/kilocode")?"ready":"unknown"}}catch{}return"unknown"}let W={cli_claude_code:["opus","sonnet","haiku"],cli_codex:["gpt-5-codex","o4-mini"],cli_openclaw:["(default)","openai/gpt-5.4","anthropic/claude-sonnet-4"],cli_hermes:["(default)","anthropic/claude-sonnet-4.6","openai/gpt-5.5"],cli_aider:["(default)","anthropic/claude-sonnet-4-6","openai/gpt-5.2","deepseek/deepseek-chat"],cli_opencode:["(default)","anthropic/claude-sonnet-4-6","openai/gpt-5.2"],cli_copilot:["(default)","claude-sonnet-4.5","gpt-5"],cli_cursor:["(default)","claude-4.5-sonnet","gpt-5"],cli_cline:["(default)"],cli_kilo:["(default)"]};function X(a,b){if("cli_codex"===a||"cli_codex_cli"===a)return"codex";if("cli_openclaw"===a)return"openclaw";if("cli_hermes"===a)return"hermes";if("cli_aider"===a)return"aider";if("cli_opencode"===a)return"opencode";if("cli_copilot"===a||"cli_copilot_cli"===a)return"copilot";if("cli_cursor"===a||"cli_cursor_cli"===a)return"cursor-agent";if("cli_cline"===a||"cli_cline_cli"===a)return"cline";if("cli_kilo"===a||"cli_kilo_code"===a)return"kilocode";if("cli_claude_code"===a)return"claude";let c=(b??"").toLowerCase();return c.startsWith("codex")||c.startsWith("gpt")||c.startsWith("o1")||c.startsWith("o3")||c.startsWith("o4")?"codex":"claude"}function Y(a){let b=X(a);return"claude"===b?"opus":"codex"!==b?(W[a??""]??[]).find(a=>"(default)"!==a):void 0}async function Z(a,b){let c=b.binary??"claude",d={model:b.model,orgId:b.orgId,timeoutMs:b.timeoutMs,token:b.token,agentId:b.agentId,agentHandle:b.agentHandle};return"codex"===c?H(a,d):"openclaw"===c?K(a,d):"hermes"===c?J(a,d):"aider"===c?M(a,d):"opencode"===c?N(a,d):"copilot"===c?O(a,d):"cursor-agent"===c?P(a,d):"cline"===c?Q(a,d):"kilocode"===c?R(a,d):G(a,d)}async function $(a,b,c){let f=(0,h.HZ)(b.orgId);(0,e.mkdirSync)(f,{recursive:!0});let g=y(b.model),j=["-p","--output-format","stream-json","--include-partial-messages","--verbose",...w(),...l(),...t??"0"!==process.env.CONSTELLA_WEB_RESEARCH?["--allowedTools","WebSearch","WebFetch"]:[]];return g&&j.push("--model",g),new Promise(e=>{let g=Date.now(),h=(0,d.spawn)("claude",j,{cwd:f,shell:i,windowsHide:!0,env:x(b)});D(b.token,h);let k="",l="",m=0,n=0,o=0,p=!1,q,r="",s=0,t=!1,u=()=>{r.length>s&&(c({kind:"text",detail:r.slice(s,s+8e3)}),s=r.length)},v=setTimeout(()=>{try{h.kill("SIGKILL")}catch{}},b.timeoutMs??24e4);h.stdout.on("data",a=>{let b;for(k+=a.toString();(b=k.indexOf("\n"))>=0;){let a=k.slice(0,b).trim();if(k=k.slice(b+1),a.startsWith("{"))try{!function(a){if("stream_event"===a.type){let b=a.event;b?.type==="content_block_start"&&b.content_block?.type==="text"&&r?r+="\n\n":b?.type==="content_block_delta"&&b.delta?.type==="text_delta"&&b.delta.text&&(t=!0,(r+=b.delta.text).length-s>=120&&u())}else if("assistant"===a.type){for(let b of a.message?.content??[])"tool_use"===b.type&&b.name?c(function(a,b){if("Read"===a)return{kind:"read",target:String(b.file_path??"")};if("Write"===a)return{kind:"create",target:String(b.file_path??""),detail:String(b.content??"").slice(0,4e3)};if("Edit"===a||"NotebookEdit"===a){let a=String(b.old_string??"").split("\n"),c=String(b.new_string??"").split("\n"),d=[...a.map(a=>"-"+a),...c.map(a=>"+"+a)].slice(0,80).join("\n");return{kind:"edit",target:String(b.file_path??""),detail:d}}return"Bash"===a||"PowerShell"===a?{kind:"run",target:String(b.command??"").slice(0,200)}:"Glob"===a||"Grep"===a?{kind:"search",target:String(b.pattern??"")}:{kind:"read",target:a}}(b.name,b.input??{})):"text"===b.type&&b.text?(l=b.text,t||c({kind:"text",detail:b.text.slice(0,8e3)})):"thinking"===b.type&&b.thinking&&c({kind:"thinking",detail:b.thinking.slice(0,200)});u()}else if("result"===a.type){p=!0!==a.is_error&&"success"===a.subtype,"string"==typeof a.result&&(l=a.result),m=Number(a.total_cost_usd??0);let b=a.usage??{};n=Number(b.input_tokens??0)+Number(b.cache_read_input_tokens??0)+Number(b.cache_creation_input_tokens??0),o=Number(b.output_tokens??0),a.is_error&&(q=String(a.result??"error"))}}(JSON.parse(a))}catch{}}}),h.on("error",a=>{clearTimeout(v),E(b.token),e(I("claude",b.model,Date.now()-g,String(a)))}),h.on("close",()=>{clearTimeout(v),E(b.token),c({kind:"done"}),e({ok:p,text:l,usd:m,inputTokens:n,outputTokens:o,durationMs:Date.now()-g,binary:"claude",model:b.model,error:q})}),h.stdin.write(a),h.stdin.end()})}let _=[6e4,3e5,9e5],aa=a=>new Promise(b=>setTimeout(b,a));async function ab(a,b,c){let d=null;for(let f=0;f<=_.length;f++){var e;let g=await ac(a,b,c);if(g.ok||!((e=g.error)&&/(\b429\b|overloaded|rate[\s_-]?limit|usage limit|\bquota\b|too many requests|service unavailable|\b50[0-3]\b|\bupstream\b|fetch failed|network error|econnreset|enotfound|etimedout|econnrefused|socket hang up)/i.test(e)))return g;if(d=g,f<_.length){let a=_[f];c({kind:"thinking",target:`Provider limit / network — retrying in ${Math.round(a/6e4)} min (attempt ${f+2}/${_.length+1})…`,detail:(g.error||"").slice(0,160)}),await aa(a)}}return d}async function ac(a,b,c){let d=b.binary??"claude";if("claude"===d)return $(a,{model:b.model,orgId:b.orgId,timeoutMs:b.timeoutMs,token:b.token,agentId:b.agentId,agentHandle:b.agentHandle},c);let e={model:b.model,orgId:b.orgId,timeoutMs:b.timeoutMs,token:b.token},f="openclaw"===d?await K(a,e):"hermes"===d?await J(a,e):"aider"===d?await M(a,e):"opencode"===d?await N(a,e):"copilot"===d?await O(a,e):"cursor-agent"===d?await P(a,e):"cline"===d?await Q(a,e):"kilocode"===d?await R(a,e):await H(a,e);return c({kind:"done"}),f}},76158:(a,b,c)=>{c.d(b,{J$:()=>k,fR:()=>j});var d=c(77598),e=c(97603),f=c(65705),g=c(1890),h=c(57086),i=c(93571);function j(a){let{orgId:b,wsId:c,names:j,agentIds:k}=a,l=a.linkNames?new Set(a.linkNames):null,m=0;for(let a of j){let j=(0,i.fi)(a);if(!j||f.db.select({id:g.skill.id}).from(g.skill).where((0,e.Uo)((0,e.eq)(g.skill.workspaceId,c),(0,e.eq)(g.skill.name,a))).get())continue;let n=(0,i.qg)(a);if(!n)continue;let o=(0,i.BC)(n),p=`When working with ${a} in this project.`,q=`# Skill — ${a}
|
|
861
|
+
`}({company:a.company,mission:a.mission,objective:a.objective,stack:a.stack,slug:a.slug})]),e}let t=/^(\.claude\/organization\.md|\.claude\/CLAUDE\.md|README\.md|DOCS\/architecture\.md|DOCS\/onboarding\.md|PO\/roadmap\.md|\.claude\/agents\/[^/]+\/Agent\.md)$/;function u(a){let b=[];for(let[c,e]of s(a))t.test(c)&&((0,d.dx)(a.orgId,c,e),b.push(c));return b}function v(a){let b=[];for(let[c,e]of s(a)){let f=(0,d.sL)(a.orgId,c);(null==f||""===f.trim())&&((0,d.dx)(a.orgId,c,e),b.push(c))}return b.push(...w(a).written),b}function w(a){let b=[];try{let{id:c,files:e}=(0,m.xF)({company:a.company,mission:a.mission,objective:a.objective,slug:a.slug,stack:a.stack});for(let[c,f]of e)null==(0,d.sL)(a.orgId,c)&&((0,d.dx)(a.orgId,c,f),b.push(c));return{id:c,written:b}}catch(a){return console.error("[scaffold] project starter failed:",a),{id:"static",written:b}}}function x(a,b){var c={orgId:a,slug:b.slug??a,company:b.company,mission:b.mission,objective:b.objective,stack:b.stack,runMode:b.runMode,createdAt:new Date().toISOString().slice(0,10),preserveReadme:b.preserveReadme};for(let[a,b]of s(c))(0,d.dx)(c.orgId,a,b)}},57086:(a,b,c)=>{c.d(b,{xZ:()=>h,r$:()=>i,EX:()=>q,CS:()=>function a(b,c=""){let d=[];for(let e of m(b,c))if(e.isDir){if(n.has(e.name))continue;d.push(...a(b,e.path))}else d.push(e.path);return d},HZ:()=>k,Ci:()=>m,sL:()=>o,dx:()=>p});var d=c(73024),e=c(76760),f=c(48161),g=c(30043);let h=new Set(["node_modules",".git",".next",".turbo","dist","build","out","coverage",".cache",".pnpm-store",".vercel","vendor",".parcel-cache",".svelte-kit",".nuxt",".astro",".angular",".venv","venv","env","__pycache__",".mypy_cache",".pytest_cache",".ruff_cache",".tox",".nox","htmlcov","site-packages",".eggs",".ipynb_checkpoints","target",".gradle","bin","obj","Pods",".cargo","Carthage",".cxx","DerivedData",".idea",".vscode",".svn",".hg",".vs",".fleet","logs","tmp","temp",".terraform","archives",".testdev"]);function i(){return process.env.CONSTELLA_HOME?(0,g.Y)(process.env.CONSTELLA_HOME):(0,e.join)((0,f.homedir)(),".constella")}let j=new Set;function k(a){if(!/^[A-Za-z0-9_-]{6,64}$/.test(a))throw Error("Invalid orgId");let b=(0,e.join)(i(),"organizations",a,"workspace");if(!j.has(a)){j.add(a);try{let c=(0,e.join)(i(),"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 l(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 m(a,b=""){let c=l(k(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 n=new Set(["node_modules",".git",".next",".turbo","dist","build","out","coverage",".cache","archives",".testdev",".pnpm-store",".vercel","vendor"]);function o(a,b){let c=l(k(a),b);return(0,d.existsSync)(c)?(0,d.readFileSync)(c,"utf8"):null}function p(a,b,c){let f=l(k(a),b);(0,d.mkdirSync)((0,e.dirname)(f),{recursive:!0}),(0,d.writeFileSync)(f,c,"utf8")}function q(a,b){let c=l(k(a),b);(0,d.existsSync)(c)&&(0,d.rmSync)(c,{recursive:!0,force:!0})}},57300:(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(97603),f=c(95357),g=c(65705),h=c(1890),i=c(57086);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))}},65121:(a,b,c)=>{c.d(b,{z:()=>d});let d=[{key:"language",label:"Language",opts:["TypeScript","JavaScript","Python","Go","Rust","Java","Kotlin","C#","Ruby","PHP","Elixir","Swift","C++","C","Scala","Dart","Clojure","Haskell","Lua","R","Objective-C","Erlang","None"]},{key:"runtime",label:"Runtime",opts:["Node.js","Bun","Deno","Python 3","PyPy","JVM",".NET","BEAM (Erlang VM)","None"]},{key:"frontend",label:"Frontend",opts:["React","Vue","Svelte","Angular","SolidJS","Preact","Qwik","Lit","HTMX","Alpine.js","Ember","Backbone","HTML/CSS","Vanilla JS","None"]},{key:"meta",label:"Meta-framework / SSG",opts:["Next.js","Nuxt","Remix","SvelteKit","Astro","Gatsby","Vite (SPA)","Hugo","Jekyll","Eleventy","Docusaurus","Static (no framework)","None"]},{key:"backend",label:"Backend framework",opts:["NestJS","Fastify","Express","Hono","Koa","Django","Flask","FastAPI","Spring Boot","Spring","Laravel","Symfony","CodeIgniter","Ruby on Rails","Gin","Fiber","Actix","Phoenix","ASP.NET Core","AdonisJS","GraphQL","Nginx","None"]},{key:"mobile",label:"Mobile",opts:["React Native","Flutter","Android","Ionic","Xamarin","NativeScript","None"]},{key:"database",label:"Database",opts:["PostgreSQL","MySQL","MariaDB","SQLite","MongoDB","Redis","CockroachDB","Cassandra","DynamoDB","Supabase","PlanetScale","Neon","None"]},{key:"orm",label:"ORM / Data layer",opts:["Prisma","Drizzle","TypeORM","Sequelize","SQLAlchemy","Django ORM","Mongoose","Knex","Diesel","GORM","None"]},{key:"styling",label:"Styling / UI",opts:["Tailwind CSS","Plain CSS","CSS Modules","styled-components","Sass","Vanilla Extract","UnoCSS","shadcn/ui","MUI","Bootstrap","Bulma","Vuetify","Chakra UI","None"]},{key:"testing",label:"Testing",opts:["Jest","Vitest","Cypress","Playwright","Selenium","Mocha","Jasmine","Puppeteer","None"]},{key:"aiml",label:"AI / ML",opts:["TensorFlow","PyTorch","scikit-learn","Keras","Pandas","NumPy","Jupyter","None"]},{key:"dataviz",label:"Data viz",opts:["D3","Chart.js","Grafana","Plotly","None"]},{key:"container",label:"Container",opts:["Docker","Podman","containerd","None"]},{key:"infra",label:"Infra / DevOps",opts:["Tailscale","Cloudflare","Vercel","Netlify","Fly.io","Railway","AWS","GCP","Azure","Kubernetes","Jenkins","CircleCI","Terraform","Ansible","Vagrant","None"]},{key:"baas",label:"Backend-as-a-service",opts:["Firebase","Appwrite","Amplify","Heroku","Supabase","None"]},{key:"queue",label:"Queue / Cache",opts:["Redis","BullMQ","RabbitMQ","Kafka","NATS","Celery","None"]},{key:"auth",label:"Auth",opts:["Auth.js","Clerk","Lucia","Supabase Auth","Keycloak","Auth0","Passport","None"]}]},70149:(a,b,c)=>{c.d(b,{$g:()=>U,Hs:()=>r,JN:()=>Z,KD:()=>C,Kp:()=>V,Pe:()=>o,UC:()=>u,ZB:()=>S,d1:()=>T,hW:()=>X,p1:()=>ab,qX:()=>Y,w5:()=>W});var d=c(31421),e=c(73024),f=c(48161),g=c(76760),h=c(57086);let i="win32"===process.platform,j=process.env.CONSTELLA_RUN_MODE??"start",k=null!=process.env.CONSTELLA_AGENT_FULL_ACCESS?"0"!==process.env.CONSTELLA_AGENT_FULL_ACCESS:"start"===j;function l(){return k?["--permission-mode","bypassPermissions"]:["--permission-mode","acceptEdits"]}let m=null,n=null;function o(a){n=a}function p(){return n??"1"===process.env.CONSTELLA_AGENT_LOCK_HOOK}let q=null;function r(a){q=a}function s(){return q??"1"===process.env.CONSTELLA_AGENT_CMD_GUARD}let t=null;function u(a){t=a}function v(){try{let a=(0,g.join)((0,h.r$)(),".agent-claude");(0,e.mkdirSync)(a,{recursive:!0});let b=(0,g.join)((0,f.homedir)(),".claude",".credentials.json");if(!(0,e.existsSync)(b))return null;(0,e.copyFileSync)(b,(0,g.join)(a,".credentials.json"));let c=(0,g.join)((0,f.homedir)(),".claude.json");if((0,e.existsSync)(c))try{(0,e.copyFileSync)(c,(0,g.join)(a,".claude.json"))}catch{}let d=process.env.CONSTELLA_PKG_ROOT||process.cwd(),i=[];return p()&&i.push({matcher:"Write|Edit|MultiEdit|NotebookEdit",hooks:[{type:"command",command:`node "${(0,g.join)(d,"bin","lock-hook.mjs")}"`}]}),s()&&i.push({matcher:"Bash",hooks:[{type:"command",command:`node "${(0,g.join)(d,"bin","guard-hook.mjs")}"`}]}),(0,e.writeFileSync)((0,g.join)(a,"settings.json"),JSON.stringify({hooks:{PreToolUse:i}}),"utf8"),a}catch{return null}}function w(a){if((p()||s())&&a)return[];if(null===m)try{let a=(0,g.join)((0,f.tmpdir)(),"constella-agent-settings.json");(0,e.writeFileSync)(a,JSON.stringify({disableAllHooks:!0}),"utf8"),m=a}catch{m=""}return m?["--settings",m]:[]}function x(a,b){return(p()||s())&&b?{...process.env,CLAUDE_CONFIG_DIR:b,CONSTELLA_ORG_ID:a.orgId,CONSTELLA_TASK_ID:a.token||"",CONSTELLA_AGENT_ID:a.agentId||"",CONSTELLA_AGENT_HANDLE:a.agentHandle||"",CONSTELLA_BASE_URL:process.env.CONSTELLA_BASE_URL||"http://127.0.0.1:3000"}:process.env}function y(a){if(a)return/^[A-Za-z0-9][A-Za-z0-9._:-]{0,63}$/.test(a)?a:void 0}function z(a){if(a&&"(default)"!==a)return/^[A-Za-z0-9][A-Za-z0-9._:/-]{0,79}$/.test(a)?a:void 0}let A=new Map,B=new Set;function C(a){B.add(a);let b=A.get(a);if(!b)return!1;A.delete(a);try{return b.kill("SIGKILL"),!0}catch{return!1}}function D(a,b){if(a){if(B.has(a)){B.delete(a);try{b.kill("SIGKILL")}catch{}return}A.set(a,b)}}function E(a){a&&(A.delete(a),B.delete(a))}function F(a,b,c,e,f,g,h,j=i){return new Promise(i=>{let k=Date.now(),l=(0,d.spawn)(a,b,{cwd:e,shell:j,windowsHide:!0,env:g??process.env});D(h,l);let m="",n="",o=!1,p=setTimeout(()=>{o=!0;try{l.kill("SIGKILL")}catch{}},f);if(l.stdout.on("data",a=>m+=a.toString()),l.stderr.on("data",a=>n+=a.toString()),l.on("error",a=>{clearTimeout(p),E(h),i({code:-1,stdout:m,stderr:n+String(a),durationMs:Date.now()-k,timedOut:o})}),l.on("close",a=>{clearTimeout(p),E(h),i({code:a,stdout:m,stderr:n,durationMs:Date.now()-k,timedOut:o})}),l.stdin.on("error",()=>{}),c)try{l.stdin.write(c)}catch{}try{l.stdin.end()}catch{}})}async function G(a,b){let c=(0,h.HZ)(b.orgId);(0,e.mkdirSync)(c,{recursive:!0});let d=y(b.model),f=p()||s()?v():null,g=["-p","--output-format","json",...w(f),...l()];d&&g.push("--model",d);let i=await F("claude",g,a,c,b.timeoutMs??18e4,x(b,f),b.token);if(i.timedOut)return I("claude",b.model,i.durationMs,"timed out");let j=null;try{j=JSON.parse(i.stdout.trim())}catch{let a=i.stdout.split("\n").reverse().find(a=>a.includes('"type":"result"'));if(a)try{j=JSON.parse(a)}catch{}}if(!j)return I("claude",b.model,i.durationMs,i.stderr.slice(-300)||"no JSON output (code "+i.code+")");let k=j.usage??{};return{ok:!0!==j.is_error&&"success"===j.subtype,text:String(j.result??""),usd:Number(j.total_cost_usd??0),inputTokens:Number(k.input_tokens??0)+Number(k.cache_read_input_tokens??0)+Number(k.cache_creation_input_tokens??0),outputTokens:Number(k.output_tokens??0),durationMs:i.durationMs,binary:"claude",model:b.model,error:!0===j.is_error?String(j.result??"error"):void 0}}async function H(a,b){let c=(0,h.HZ)(b.orgId);(0,e.mkdirSync)(c,{recursive:!0});let d=y(b.model),f=["exec","--json","--skip-git-repo-check","-s",k?"danger-full-access":"workspace-write"];d&&f.push("-m",d);let g=await F("codex",f,a,c,b.timeoutMs??18e4,void 0,b.token);if(g.timedOut)return I("codex",b.model,g.durationMs,"timed out");let i="",j=0,l=0,m=0;for(let a of g.stdout.split("\n")){let b=a.trim();if(b.startsWith("{"))try{let a=JSON.parse(b),c=a.item??a.msg??{};"string"==typeof c.text&&c.text&&(i=c.text),"string"==typeof a.text&&(i=a.text);let d=a.usage??a.token_usage??c.usage??{};d.input_tokens&&(j=Number(d.input_tokens)),d.output_tokens&&(l=Number(d.output_tokens)),"number"==typeof a.cost_usd&&(m=a.cost_usd)}catch{}}return{ok:0===g.code,text:i,usd:m,inputTokens:j,outputTokens:l,durationMs:g.durationMs,binary:"codex",model:b.model,error:0===g.code?void 0:g.stderr.slice(-300)||"codex exit "+g.code}}function I(a,b,c,d){return{ok:!1,text:"",usd:0,inputTokens:0,outputTokens:0,durationMs:c,binary:a,model:b,error:d}}async function J(a,b){let c=(0,h.HZ)(b.orgId);(0,e.mkdirSync)(c,{recursive:!0});let d=z(b.model),f=["-z",a];if(d){let a=d.indexOf("/");a>0?f.push("--provider",d.slice(0,a),"--model",d.slice(a+1)):f.push("--model",d)}let g=await F("hermes",f,"",c,b.timeoutMs??18e4,void 0,b.token);if(g.timedOut)return I("hermes",b.model,g.durationMs,"timed out");let i=(g.stdout||"").trim();return{ok:0===g.code&&!!i,text:i,usd:0,inputTokens:0,outputTokens:0,durationMs:g.durationMs,binary:"hermes",model:b.model,error:0===g.code?void 0:g.stderr.slice(-300)||"hermes exit "+g.code}}async function K(a,b){let c=(0,h.HZ)(b.orgId);(0,e.mkdirSync)(c,{recursive:!0});let d=z(b.model),f=["infer","model","run","--prompt",a,"--json"];d&&f.push("--model",d);let g=await F("openclaw",f,"",c,b.timeoutMs??18e4,void 0,b.token);if(g.timedOut)return I("openclaw",b.model,g.durationMs,"timed out");let i="",j=0===g.code,k;try{var l;let a=JSON.parse(g.stdout.trim());j=!1!==a.ok&&0===g.code,i=(l=a.outputs)?"string"==typeof l?l:Array.isArray(l)?l.map(a=>"string"==typeof a?a:a&&"object"==typeof a?String(a.text??a.content??a.output??a.message??""):"").filter(Boolean).join("\n"):"object"==typeof l?String(l.text??l.content??""):"":"",a.error&&(k=String(a.error?.message??a.error))}catch{i=g.stdout.trim(),0!==g.code&&(j=!1,k=g.stderr.slice(-300)||"openclaw exit "+g.code)}return i||k||(k=g.stderr.slice(-300)||"no output (code "+g.code+")"),{ok:j&&!!i,text:i,usd:0,inputTokens:0,outputTokens:0,durationMs:g.durationMs,binary:"openclaw",model:b.model,error:k}}async function L(a,b,c){let d=(0,h.HZ)(c.orgId);(0,e.mkdirSync)(d,{recursive:!0});let f=await F(a,b,"",d,c.timeoutMs??18e4,void 0,c.token);if(f.timedOut)return I(a,c.model,f.durationMs,"timed out");let g=function(a){let b=a.trim();if(!b)return"";if(b.startsWith("{")||b.startsWith("["))try{let a=JSON.parse(b),c=a.result??a.text??a.response??a.content??a.message??a.output;if("string"==typeof c&&c)return c;if(c&&"object"==typeof c){let a=c.text??c.content;if("string"==typeof a)return a}}catch{}return b}(f.stdout),i=0===f.code?g?void 0:f.stderr.slice(-300)||"no output (code "+f.code+")":f.stderr.slice(-300)||`${a} exit ${f.code}`;return{ok:0===f.code&&!!g,text:g,usd:0,inputTokens:0,outputTokens:0,durationMs:f.durationMs,binary:a,model:c.model,error:i}}async function M(a,b){let c=z(b.model),d=["--message",a,"--yes-always","--no-auto-commits","--no-stream"];return c&&d.push("--model",c),L("aider",d,b)}async function N(a,b){let c=z(b.model),d=["run",a];return c&&d.push("--model",c),L("opencode",d,b)}async function O(a,b){let c=z(b.model),d=["-p",a,"--allow-all-tools"];return c&&d.push("--model",c),L("copilot",d,b)}async function P(a,b){let c=z(b.model),d=["-p",a,"--output-format","json"];return c&&d.push("--model",c),L("cursor-agent",d,{...b,timeoutMs:b.timeoutMs??15e4})}async function Q(a,b){let c=z(b.model),d=["--json","-y",a];return c&&d.push("--model",c),L("cline",d,b)}async function R(a,b){let c=z(b.model),d=["--yes",a];return c&&d.push("--model",c),L("kilocode",d,b)}async function S(a){try{if("opencode"===a){let a=await F("opencode",["models"],"",process.cwd(),2e4);if(0!==a.code)return[];return a.stdout.split("\n").map(a=>a.trim()).filter(a=>/^[\w.-]+\/[\w./:-]+$/.test(a)).slice(0,200)}if("aider"===a){let a=await F("aider",["--list-models","/"],"",process.cwd(),25e3);if(0!==a.code)return[];return a.stdout.split("\n").map(a=>a.replace(/^[-*\s]+/,"").trim()).filter(a=>/^[\w.-]+\/[\w./:-]+$/.test(a)).slice(0,200)}}catch{}return[]}async function T(a,b,c){return F(a,b,c.input??"",c.cwd,c.timeoutMs??6e4,c.env?{...process.env,...c.env}:void 0,void 0,!1)}async function U(a){let b=await F(a,["--version"],"",process.cwd(),15e3);return -1===b.code?null:(b.stdout||b.stderr).trim().split("\n")[0]||"ok"}async function V(a){let b=(0,f.homedir)(),c=(...a)=>a.some(a=>(0,e.existsSync)((0,g.join)(b,a)));try{switch(a){case"claude":return c(".claude/.credentials.json",".claude.json",".config/claude")?"ready":"needs_login";case"codex":return c(".codex/auth.json",".codex")?"ready":"needs_login";case"aider":return process.env.OPENAI_API_KEY||process.env.ANTHROPIC_API_KEY||process.env.DEEPSEEK_API_KEY||process.env.GEMINI_API_KEY||process.env.OPENROUTER_API_KEY||process.env.GROQ_API_KEY?"ready":"needs_login";case"opencode":{let a=await F("opencode",["auth","list"],"",process.cwd(),8e3);if(0===a.code&&/\w/.test(a.stdout)&&!/\b(no|none|not)\b.*(auth|provider|credential|logged)/i.test(a.stdout))return"ready";return c(".local/share/opencode/auth.json",".config/opencode")?"ready":"needs_login"}case"copilot":return c(".config/github-copilot/apps.json",".config/github-copilot",".copilot")?"ready":"needs_login";case"cursor-agent":return c(".config/cursor-agent",".cursor-agent",".cursor")?"ready":"needs_login";case"openclaw":return c(".openclaw",".config/openclaw")?"ready":"unknown";case"hermes":return c(".hermes",".config/hermes")?"ready":"unknown";case"cline":return c(".cline",".config/cline")?"ready":"unknown";case"kilocode":return c(".kilocode",".config/kilocode")?"ready":"unknown"}}catch{}return"unknown"}let W={cli_claude_code:["opus","sonnet","haiku"],cli_codex:["gpt-5-codex","o4-mini"],cli_openclaw:["(default)","openai/gpt-5.4","anthropic/claude-sonnet-4"],cli_hermes:["(default)","anthropic/claude-sonnet-4.6","openai/gpt-5.5"],cli_aider:["(default)","anthropic/claude-sonnet-4-6","openai/gpt-5.2","deepseek/deepseek-chat"],cli_opencode:["(default)","anthropic/claude-sonnet-4-6","openai/gpt-5.2"],cli_copilot:["(default)","claude-sonnet-4.5","gpt-5"],cli_cursor:["(default)","claude-4.5-sonnet","gpt-5"],cli_cline:["(default)"],cli_kilo:["(default)"]};function X(a,b){if("cli_codex"===a||"cli_codex_cli"===a)return"codex";if("cli_openclaw"===a)return"openclaw";if("cli_hermes"===a)return"hermes";if("cli_aider"===a)return"aider";if("cli_opencode"===a)return"opencode";if("cli_copilot"===a||"cli_copilot_cli"===a)return"copilot";if("cli_cursor"===a||"cli_cursor_cli"===a)return"cursor-agent";if("cli_cline"===a||"cli_cline_cli"===a)return"cline";if("cli_kilo"===a||"cli_kilo_code"===a)return"kilocode";if("cli_claude_code"===a)return"claude";let c=(b??"").toLowerCase();return c.startsWith("codex")||c.startsWith("gpt")||c.startsWith("o1")||c.startsWith("o3")||c.startsWith("o4")?"codex":"claude"}function Y(a){let b=X(a);return"claude"===b?"opus":"codex"!==b?(W[a??""]??[]).find(a=>"(default)"!==a):void 0}async function Z(a,b){let c=b.binary??"claude",d={model:b.model,orgId:b.orgId,timeoutMs:b.timeoutMs,token:b.token,agentId:b.agentId,agentHandle:b.agentHandle};return"codex"===c?H(a,d):"openclaw"===c?K(a,d):"hermes"===c?J(a,d):"aider"===c?M(a,d):"opencode"===c?N(a,d):"copilot"===c?O(a,d):"cursor-agent"===c?P(a,d):"cline"===c?Q(a,d):"kilocode"===c?R(a,d):G(a,d)}async function $(a,b,c){let f=(0,h.HZ)(b.orgId);(0,e.mkdirSync)(f,{recursive:!0});let g=y(b.model),j=p()||s()?v():null,k=["-p","--output-format","stream-json","--include-partial-messages","--verbose",...w(j),...l(),...t??"0"!==process.env.CONSTELLA_WEB_RESEARCH?["--allowedTools","WebSearch","WebFetch"]:[]];return g&&k.push("--model",g),new Promise(e=>{let g=Date.now(),h=(0,d.spawn)("claude",k,{cwd:f,shell:i,windowsHide:!0,env:x(b,j)});D(b.token,h);let l="",m="",n=0,o=0,p=0,q=!1,r,s="",t=0,u=!1,v=()=>{s.length>t&&(c({kind:"text",detail:s.slice(t,t+8e3)}),t=s.length)},w=setTimeout(()=>{try{h.kill("SIGKILL")}catch{}},b.timeoutMs??24e4);h.stdout.on("data",a=>{let b;for(l+=a.toString();(b=l.indexOf("\n"))>=0;){let a=l.slice(0,b).trim();if(l=l.slice(b+1),a.startsWith("{"))try{!function(a){if("stream_event"===a.type){let b=a.event;b?.type==="content_block_start"&&b.content_block?.type==="text"&&s?s+="\n\n":b?.type==="content_block_delta"&&b.delta?.type==="text_delta"&&b.delta.text&&(u=!0,(s+=b.delta.text).length-t>=120&&v())}else if("assistant"===a.type){for(let b of a.message?.content??[])"tool_use"===b.type&&b.name?c(function(a,b){if("Read"===a)return{kind:"read",target:String(b.file_path??"")};if("Write"===a)return{kind:"create",target:String(b.file_path??""),detail:String(b.content??"").slice(0,4e3)};if("Edit"===a||"NotebookEdit"===a){let a=String(b.old_string??"").split("\n"),c=String(b.new_string??"").split("\n"),d=[...a.map(a=>"-"+a),...c.map(a=>"+"+a)].slice(0,80).join("\n");return{kind:"edit",target:String(b.file_path??""),detail:d}}return"Bash"===a||"PowerShell"===a?{kind:"run",target:String(b.command??"").slice(0,200)}:"Glob"===a||"Grep"===a?{kind:"search",target:String(b.pattern??"")}:{kind:"read",target:a}}(b.name,b.input??{})):"text"===b.type&&b.text?(m=b.text,u||c({kind:"text",detail:b.text.slice(0,8e3)})):"thinking"===b.type&&b.thinking&&c({kind:"thinking",detail:b.thinking.slice(0,200)});v()}else if("result"===a.type){q=!0!==a.is_error&&"success"===a.subtype,"string"==typeof a.result&&(m=a.result),n=Number(a.total_cost_usd??0);let b=a.usage??{};o=Number(b.input_tokens??0)+Number(b.cache_read_input_tokens??0)+Number(b.cache_creation_input_tokens??0),p=Number(b.output_tokens??0),a.is_error&&(r=String(a.result??"error"))}}(JSON.parse(a))}catch{}}}),h.on("error",a=>{clearTimeout(w),E(b.token),e(I("claude",b.model,Date.now()-g,String(a)))}),h.on("close",()=>{clearTimeout(w),E(b.token),c({kind:"done"}),e({ok:q,text:m,usd:n,inputTokens:o,outputTokens:p,durationMs:Date.now()-g,binary:"claude",model:b.model,error:r})}),h.stdin.write(a),h.stdin.end()})}let _=[6e4,3e5,9e5],aa=a=>new Promise(b=>setTimeout(b,a));async function ab(a,b,c){let d=null;for(let f=0;f<=_.length;f++){var e;let g=await ac(a,b,c);if(g.ok||!((e=g.error)&&/(\b429\b|overloaded|rate[\s_-]?limit|usage limit|\bquota\b|too many requests|service unavailable|\b50[0-3]\b|\bupstream\b|fetch failed|network error|econnreset|enotfound|etimedout|econnrefused|socket hang up)/i.test(e)))return g;if(d=g,f<_.length){let a=_[f];c({kind:"thinking",target:`Provider limit / network — retrying in ${Math.round(a/6e4)} min (attempt ${f+2}/${_.length+1})…`,detail:(g.error||"").slice(0,160)}),await aa(a)}}return d}async function ac(a,b,c){let d=b.binary??"claude";if("claude"===d)return $(a,{model:b.model,orgId:b.orgId,timeoutMs:b.timeoutMs,token:b.token,agentId:b.agentId,agentHandle:b.agentHandle},c);let e={model:b.model,orgId:b.orgId,timeoutMs:b.timeoutMs,token:b.token},f="openclaw"===d?await K(a,e):"hermes"===d?await J(a,e):"aider"===d?await M(a,e):"opencode"===d?await N(a,e):"copilot"===d?await O(a,e):"cursor-agent"===d?await P(a,e):"cline"===d?await Q(a,e):"kilocode"===d?await R(a,e):await H(a,e);return c({kind:"done"}),f}},76158:(a,b,c)=>{c.d(b,{J$:()=>k,fR:()=>j});var d=c(77598),e=c(97603),f=c(65705),g=c(1890),h=c(57086),i=c(93571);function j(a){let{orgId:b,wsId:c,names:j,agentIds:k}=a,l=a.linkNames?new Set(a.linkNames):null,m=0;for(let a of j){let j=(0,i.fi)(a);if(!j||f.db.select({id:g.skill.id}).from(g.skill).where((0,e.Uo)((0,e.eq)(g.skill.workspaceId,c),(0,e.eq)(g.skill.name,a))).get())continue;let n=(0,i.qg)(a);if(!n)continue;let o=(0,i.BC)(n),p=`When working with ${a} in this project.`,q=`# Skill — ${a}
|
|
862
862
|
|
|
863
863
|
**Trigger:** ${p}
|
|
864
864
|
|