constella 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -0
- package/.next/app-path-routes-manifest.json +53 -0
- package/.next/build-manifest.json +20 -0
- package/.next/diagnostics/build-diagnostics.json +6 -0
- package/.next/diagnostics/framework.json +1 -0
- package/.next/export-marker.json +6 -0
- package/.next/images-manifest.json +68 -0
- package/.next/next-minimal-server.js.nft.json +1 -0
- package/.next/next-server.js.nft.json +1 -0
- package/.next/package.json +1 -0
- package/.next/prerender-manifest.json +36 -0
- package/.next/react-loadable-manifest.json +14 -0
- package/.next/required-server-files.js +343 -0
- package/.next/required-server-files.json +343 -0
- package/.next/routes-manifest.json +362 -0
- package/.next/server/app/(app)/activity/page.js +2 -0
- package/.next/server/app/(app)/activity/page.js.nft.json +1 -0
- package/.next/server/app/(app)/activity/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/agents/[handle]/page.js +18 -0
- package/.next/server/app/(app)/agents/[handle]/page.js.nft.json +1 -0
- package/.next/server/app/(app)/agents/[handle]/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/code/page.js +2 -0
- package/.next/server/app/(app)/code/page.js.nft.json +1 -0
- package/.next/server/app/(app)/code/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/config/page.js +2 -0
- package/.next/server/app/(app)/config/page.js.nft.json +1 -0
- package/.next/server/app/(app)/config/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/costs/page.js +2 -0
- package/.next/server/app/(app)/costs/page.js.nft.json +1 -0
- package/.next/server/app/(app)/costs/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/cron/page.js +2 -0
- package/.next/server/app/(app)/cron/page.js.nft.json +1 -0
- package/.next/server/app/(app)/cron/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/dashboard/page.js +2 -0
- package/.next/server/app/(app)/dashboard/page.js.nft.json +1 -0
- package/.next/server/app/(app)/dashboard/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/docs/[id]/page.js +2 -0
- package/.next/server/app/(app)/docs/[id]/page.js.nft.json +1 -0
- package/.next/server/app/(app)/docs/[id]/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/docs/page.js +2 -0
- package/.next/server/app/(app)/docs/page.js.nft.json +1 -0
- package/.next/server/app/(app)/docs/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/github/page.js +2 -0
- package/.next/server/app/(app)/github/page.js.nft.json +1 -0
- package/.next/server/app/(app)/github/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/goals/page.js +2 -0
- package/.next/server/app/(app)/goals/page.js.nft.json +1 -0
- package/.next/server/app/(app)/goals/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/inbox/page.js +2 -0
- package/.next/server/app/(app)/inbox/page.js.nft.json +1 -0
- package/.next/server/app/(app)/inbox/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/knowledge/page.js +3 -0
- package/.next/server/app/(app)/knowledge/page.js.nft.json +1 -0
- package/.next/server/app/(app)/knowledge/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/models/page.js +2 -0
- package/.next/server/app/(app)/models/page.js.nft.json +1 -0
- package/.next/server/app/(app)/models/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/notifications/page.js +2 -0
- package/.next/server/app/(app)/notifications/page.js.nft.json +1 -0
- package/.next/server/app/(app)/notifications/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/org/page.js +2 -0
- package/.next/server/app/(app)/org/page.js.nft.json +1 -0
- package/.next/server/app/(app)/org/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/organizations/page.js +2 -0
- package/.next/server/app/(app)/organizations/page.js.nft.json +1 -0
- package/.next/server/app/(app)/organizations/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/page.js +3 -0
- package/.next/server/app/(app)/page.js.nft.json +1 -0
- package/.next/server/app/(app)/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/planner/page.js +2 -0
- package/.next/server/app/(app)/planner/page.js.nft.json +1 -0
- package/.next/server/app/(app)/planner/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/plugins/page.js +2 -0
- package/.next/server/app/(app)/plugins/page.js.nft.json +1 -0
- package/.next/server/app/(app)/plugins/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/pm/page.js +2 -0
- package/.next/server/app/(app)/pm/page.js.nft.json +1 -0
- package/.next/server/app/(app)/pm/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/prepare-deploy/page.js +19 -0
- package/.next/server/app/(app)/prepare-deploy/page.js.nft.json +1 -0
- package/.next/server/app/(app)/prepare-deploy/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/profile/page.js +2 -0
- package/.next/server/app/(app)/profile/page.js.nft.json +1 -0
- package/.next/server/app/(app)/profile/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/pulse/page.js +2 -0
- package/.next/server/app/(app)/pulse/page.js.nft.json +1 -0
- package/.next/server/app/(app)/pulse/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/reports/[id]/page.js +3 -0
- package/.next/server/app/(app)/reports/[id]/page.js.nft.json +1 -0
- package/.next/server/app/(app)/reports/[id]/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/reports/page.js +5 -0
- package/.next/server/app/(app)/reports/page.js.nft.json +1 -0
- package/.next/server/app/(app)/reports/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/routines/page.js +2 -0
- package/.next/server/app/(app)/routines/page.js.nft.json +1 -0
- package/.next/server/app/(app)/routines/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/search/page.js +2 -0
- package/.next/server/app/(app)/search/page.js.nft.json +1 -0
- package/.next/server/app/(app)/search/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/security/page.js +2 -0
- package/.next/server/app/(app)/security/page.js.nft.json +1 -0
- package/.next/server/app/(app)/security/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/skills/page.js +18 -0
- package/.next/server/app/(app)/skills/page.js.nft.json +1 -0
- package/.next/server/app/(app)/skills/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/tasks/page.js +2 -0
- package/.next/server/app/(app)/tasks/page.js.nft.json +1 -0
- package/.next/server/app/(app)/tasks/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/test-dev/page.js +2 -0
- package/.next/server/app/(app)/test-dev/page.js.nft.json +1 -0
- package/.next/server/app/(app)/test-dev/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/update/page.js +2 -0
- package/.next/server/app/(app)/update/page.js.nft.json +1 -0
- package/.next/server/app/(app)/update/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(auth)/login/page.js +2 -0
- package/.next/server/app/(auth)/login/page.js.nft.json +1 -0
- package/.next/server/app/(auth)/login/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(auth)/onboarding/page.js +18 -0
- package/.next/server/app/(auth)/onboarding/page.js.nft.json +1 -0
- package/.next/server/app/(auth)/onboarding/page_client-reference-manifest.js +1 -0
- package/.next/server/app/_global-error/page.js +32 -0
- package/.next/server/app/_global-error/page.js.nft.json +1 -0
- package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -0
- package/.next/server/app/_global-error.html +1 -0
- package/.next/server/app/_global-error.meta +16 -0
- package/.next/server/app/_global-error.rsc +15 -0
- package/.next/server/app/_global-error.segments/_full.segment.rsc +15 -0
- package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +5 -0
- package/.next/server/app/_global-error.segments/_global-error.segment.rsc +5 -0
- package/.next/server/app/_global-error.segments/_head.segment.rsc +5 -0
- package/.next/server/app/_global-error.segments/_index.segment.rsc +6 -0
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -0
- package/.next/server/app/_not-found/page.js +2 -0
- package/.next/server/app/_not-found/page.js.nft.json +1 -0
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -0
- package/.next/server/app/api/auth/[...all]/route.js +1 -0
- package/.next/server/app/api/auth/[...all]/route.js.nft.json +1 -0
- package/.next/server/app/api/auth/[...all]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/cron/tick/route.js +52 -0
- package/.next/server/app/api/cron/tick/route.js.nft.json +1 -0
- package/.next/server/app/api/cron/tick/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/dev-login/route.js +1 -0
- package/.next/server/app/api/dev-login/route.js.nft.json +1 -0
- package/.next/server/app/api/dev-login/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/locks/acquire/route.js +1 -0
- package/.next/server/app/api/locks/acquire/route.js.nft.json +1 -0
- package/.next/server/app/api/locks/acquire/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/models/progress/route.js +1 -0
- package/.next/server/app/api/models/progress/route.js.nft.json +1 -0
- package/.next/server/app/api/models/progress/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/passkey/authenticate/options/route.js +1 -0
- package/.next/server/app/api/passkey/authenticate/options/route.js.nft.json +1 -0
- package/.next/server/app/api/passkey/authenticate/options/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/passkey/authenticate/verify/route.js +1 -0
- package/.next/server/app/api/passkey/authenticate/verify/route.js.nft.json +1 -0
- package/.next/server/app/api/passkey/authenticate/verify/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/passkey/register/options/route.js +1 -0
- package/.next/server/app/api/passkey/register/options/route.js.nft.json +1 -0
- package/.next/server/app/api/passkey/register/options/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/passkey/register/verify/route.js +1 -0
- package/.next/server/app/api/passkey/register/verify/route.js.nft.json +1 -0
- package/.next/server/app/api/passkey/register/verify/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/stream/route.js +4 -0
- package/.next/server/app/api/stream/route.js.nft.json +1 -0
- package/.next/server/app/api/stream/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sync/file/route.js +2 -0
- package/.next/server/app/api/sync/file/route.js.nft.json +1 -0
- package/.next/server/app/api/sync/file/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/telegram/poll/route.js +15 -0
- package/.next/server/app/api/telegram/poll/route.js.nft.json +1 -0
- package/.next/server/app/api/telegram/poll/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/upload/route.js +1 -0
- package/.next/server/app/api/upload/route.js.nft.json +1 -0
- package/.next/server/app/api/upload/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/v1/[[...path]]/route.js +1 -0
- package/.next/server/app/api/v1/[[...path]]/route.js.nft.json +1 -0
- package/.next/server/app/api/v1/[[...path]]/route_client-reference-manifest.js +1 -0
- package/.next/server/app-paths-manifest.json +53 -0
- package/.next/server/chunks/1003.js +1 -0
- package/.next/server/chunks/127.js +26 -0
- package/.next/server/chunks/1388.js +1 -0
- package/.next/server/chunks/1408.js +21 -0
- package/.next/server/chunks/1572.js +1 -0
- package/.next/server/chunks/1591.js +24 -0
- package/.next/server/chunks/1619.js +188 -0
- package/.next/server/chunks/162.js +1 -0
- package/.next/server/chunks/1881.js +1 -0
- package/.next/server/chunks/1968.js +1 -0
- package/.next/server/chunks/2297.js +348 -0
- package/.next/server/chunks/2341.js +1 -0
- package/.next/server/chunks/2517.js +1 -0
- package/.next/server/chunks/2549.js +1 -0
- package/.next/server/chunks/259.js +14 -0
- package/.next/server/chunks/2599.js +1 -0
- package/.next/server/chunks/260.js +1 -0
- package/.next/server/chunks/2867.js +147 -0
- package/.next/server/chunks/3018.js +1 -0
- package/.next/server/chunks/3050.js +18 -0
- package/.next/server/chunks/3085.js +12 -0
- package/.next/server/chunks/3131.js +1 -0
- package/.next/server/chunks/3242.js +1 -0
- package/.next/server/chunks/3266.js +15 -0
- package/.next/server/chunks/3524.js +1 -0
- package/.next/server/chunks/3527.js +479 -0
- package/.next/server/chunks/3533.js +869 -0
- package/.next/server/chunks/3550.js +1 -0
- package/.next/server/chunks/3609.js +2 -0
- package/.next/server/chunks/3667.js +462 -0
- package/.next/server/chunks/3760.js +4 -0
- package/.next/server/chunks/4679.js +1 -0
- package/.next/server/chunks/4804.js +1 -0
- package/.next/server/chunks/4832.js +2 -0
- package/.next/server/chunks/4853.js +1 -0
- package/.next/server/chunks/4979.js +67 -0
- package/.next/server/chunks/5060.js +1 -0
- package/.next/server/chunks/5278.js +1 -0
- package/.next/server/chunks/5614.js +1 -0
- package/.next/server/chunks/5818.js +1 -0
- package/.next/server/chunks/6479.js +1 -0
- package/.next/server/chunks/6658.js +1 -0
- package/.next/server/chunks/6706.js +1 -0
- package/.next/server/chunks/6719.js +1 -0
- package/.next/server/chunks/678.js +1 -0
- package/.next/server/chunks/683.js +1 -0
- package/.next/server/chunks/6862.js +1 -0
- package/.next/server/chunks/6882.js +1 -0
- package/.next/server/chunks/7037.js +1 -0
- package/.next/server/chunks/7107.js +741 -0
- package/.next/server/chunks/73.js +17 -0
- package/.next/server/chunks/7327.js +1 -0
- package/.next/server/chunks/7514.js +1 -0
- package/.next/server/chunks/7622.js +1 -0
- package/.next/server/chunks/7778.js +1 -0
- package/.next/server/chunks/7912.js +1 -0
- package/.next/server/chunks/7949.js +1 -0
- package/.next/server/chunks/7971.js +1 -0
- package/.next/server/chunks/7989.js +1 -0
- package/.next/server/chunks/842.js +22 -0
- package/.next/server/chunks/8762.js +15 -0
- package/.next/server/chunks/8823.js +77 -0
- package/.next/server/chunks/9146.js +4 -0
- package/.next/server/chunks/9676.js +1 -0
- package/.next/server/chunks/9783.js +22 -0
- package/.next/server/chunks/9969.js +3 -0
- package/.next/server/functions-config-manifest.json +18 -0
- package/.next/server/instrumentation.js +1 -0
- package/.next/server/instrumentation.js.nft.json +1 -0
- package/.next/server/interception-route-rewrite-manifest.js +1 -0
- package/.next/server/middleware-build-manifest.js +1 -0
- package/.next/server/middleware-manifest.json +6 -0
- package/.next/server/middleware-react-loadable-manifest.js +1 -0
- package/.next/server/middleware.js +18 -0
- package/.next/server/middleware.js.nft.json +1 -0
- package/.next/server/next-font-manifest.js +1 -0
- package/.next/server/next-font-manifest.json +1 -0
- package/.next/server/pages/500.html +1 -0
- package/.next/server/pages-manifest.json +3 -0
- package/.next/server/prefetch-hints.json +1 -0
- package/.next/server/server-reference-manifest.js +1 -0
- package/.next/server/server-reference-manifest.json +1 -0
- package/.next/server/webpack-runtime.js +1 -0
- package/.next/static/chunks/1858-339516f78a4b00da.js +1 -0
- package/.next/static/chunks/2320-fc8b39380e69d465.js +2 -0
- package/.next/static/chunks/23550918-ff694f70f4b0648c.js +1 -0
- package/.next/static/chunks/3219-ebb3c23be38c838d.js +1 -0
- package/.next/static/chunks/4263-adecb5b466380b6e.js +1 -0
- package/.next/static/chunks/5479-0cceab68cd0ca9c7.js +1 -0
- package/.next/static/chunks/5701-665b927b06158b76.js +1 -0
- package/.next/static/chunks/5920.6451a68b63918988.js +1 -0
- package/.next/static/chunks/6575-5c9139720bb0f5bf.js +4 -0
- package/.next/static/chunks/6834-4759af1ce7d95fb6.js +32 -0
- package/.next/static/chunks/7509.721cd47a931c5518.js +1 -0
- package/.next/static/chunks/8264-1ca011989ee2b231.js +1 -0
- package/.next/static/chunks/9219-4a39a98b5502d9d1.js +1 -0
- package/.next/static/chunks/9690-53d5222618cbeddb.js +1 -0
- package/.next/static/chunks/app/(app)/activity/page-3973534281ecea81.js +1 -0
- package/.next/static/chunks/app/(app)/agents/[handle]/page-83662a175c098282.js +1 -0
- package/.next/static/chunks/app/(app)/code/page-33979545192cd137.js +1 -0
- package/.next/static/chunks/app/(app)/config/page-9933aed1ca8a85c1.js +1 -0
- package/.next/static/chunks/app/(app)/costs/page-131c4dc580efcc19.js +1 -0
- package/.next/static/chunks/app/(app)/cron/page-53ea1aff998a87ca.js +1 -0
- package/.next/static/chunks/app/(app)/dashboard/page-deed83aaa9d0d447.js +1 -0
- package/.next/static/chunks/app/(app)/docs/[id]/page-38c993d73c0eab4f.js +1 -0
- package/.next/static/chunks/app/(app)/docs/page-bf463b55d0554e86.js +1 -0
- package/.next/static/chunks/app/(app)/error-988cd28480809861.js +1 -0
- package/.next/static/chunks/app/(app)/github/page-62678b4e82dfecb6.js +1 -0
- package/.next/static/chunks/app/(app)/goals/page-4adb426fe1c96106.js +1 -0
- package/.next/static/chunks/app/(app)/inbox/page-e347dc55ab467310.js +1 -0
- package/.next/static/chunks/app/(app)/knowledge/page-65393a045b4349be.js +1 -0
- package/.next/static/chunks/app/(app)/layout-7f65675705b011d8.js +1 -0
- package/.next/static/chunks/app/(app)/models/page-e01f1dd7e49a2951.js +1 -0
- package/.next/static/chunks/app/(app)/notifications/page-56548ac87aef00da.js +1 -0
- package/.next/static/chunks/app/(app)/org/page-699e6a6dc0db7d81.js +1 -0
- package/.next/static/chunks/app/(app)/organizations/page-36051a380a7e8eb7.js +1 -0
- package/.next/static/chunks/app/(app)/page-7d1011a566f81520.js +1 -0
- package/.next/static/chunks/app/(app)/planner/page-dab7ced94083373a.js +1 -0
- package/.next/static/chunks/app/(app)/plugins/page-5b5a1f53389be42e.js +1 -0
- package/.next/static/chunks/app/(app)/pm/page-0de5c08c0b227bb0.js +1 -0
- package/.next/static/chunks/app/(app)/prepare-deploy/page-e426038552df8d41.js +1 -0
- package/.next/static/chunks/app/(app)/profile/page-608dfcaf8aae0a69.js +1 -0
- package/.next/static/chunks/app/(app)/pulse/page-309ccaca91de1faa.js +1 -0
- package/.next/static/chunks/app/(app)/reports/[id]/page-53ea1aff998a87ca.js +1 -0
- package/.next/static/chunks/app/(app)/reports/page-68cdc6dcfa472d86.js +1 -0
- package/.next/static/chunks/app/(app)/routines/page-bcc55550b197a9fa.js +1 -0
- package/.next/static/chunks/app/(app)/search/page-5c5f67558d0dbf0d.js +1 -0
- package/.next/static/chunks/app/(app)/security/page-a7d41e36aa366b45.js +1 -0
- package/.next/static/chunks/app/(app)/skills/page-c5b21e89593b8336.js +1 -0
- package/.next/static/chunks/app/(app)/tasks/page-08ae079e3e54d2ce.js +1 -0
- package/.next/static/chunks/app/(app)/test-dev/page-633f82dfd9c3ce23.js +1 -0
- package/.next/static/chunks/app/(app)/update/page-4be019054351bfac.js +1 -0
- package/.next/static/chunks/app/(auth)/login/page-6e85d3377062acae.js +1 -0
- package/.next/static/chunks/app/(auth)/onboarding/page-ebb10c175abf3b85.js +1 -0
- package/.next/static/chunks/app/_global-error/page-23fe50a6bf589c97.js +1 -0
- package/.next/static/chunks/app/_not-found/page-dc38b02aebeab535.js +1 -0
- package/.next/static/chunks/app/api/auth/[...all]/route-23fe50a6bf589c97.js +1 -0
- package/.next/static/chunks/app/api/cron/tick/route-23fe50a6bf589c97.js +1 -0
- package/.next/static/chunks/app/api/dev-login/route-23fe50a6bf589c97.js +1 -0
- package/.next/static/chunks/app/api/locks/acquire/route-23fe50a6bf589c97.js +1 -0
- package/.next/static/chunks/app/api/models/progress/route-23fe50a6bf589c97.js +1 -0
- package/.next/static/chunks/app/api/passkey/authenticate/options/route-23fe50a6bf589c97.js +1 -0
- package/.next/static/chunks/app/api/passkey/authenticate/verify/route-23fe50a6bf589c97.js +1 -0
- package/.next/static/chunks/app/api/passkey/register/options/route-23fe50a6bf589c97.js +1 -0
- package/.next/static/chunks/app/api/passkey/register/verify/route-23fe50a6bf589c97.js +1 -0
- package/.next/static/chunks/app/api/stream/route-23fe50a6bf589c97.js +1 -0
- package/.next/static/chunks/app/api/sync/file/route-23fe50a6bf589c97.js +1 -0
- package/.next/static/chunks/app/api/telegram/poll/route-23fe50a6bf589c97.js +1 -0
- package/.next/static/chunks/app/api/upload/route-23fe50a6bf589c97.js +1 -0
- package/.next/static/chunks/app/api/v1/[[...path]]/route-23fe50a6bf589c97.js +1 -0
- package/.next/static/chunks/app/error-09899a13c38b6e89.js +1 -0
- package/.next/static/chunks/app/global-error-b8050d4d886f448c.js +1 -0
- package/.next/static/chunks/app/layout-ab9deed1e7e2e9df.js +1 -0
- package/.next/static/chunks/framework-4b2c6b6043dd203f.js +1 -0
- package/.next/static/chunks/main-722e16032e7764d1.js +5 -0
- package/.next/static/chunks/main-app-761880af2b6f1962.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/app-error-23fe50a6bf589c97.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/forbidden-23fe50a6bf589c97.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/not-found-23fe50a6bf589c97.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-23fe50a6bf589c97.js +1 -0
- package/.next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
- package/.next/static/chunks/webpack-222e3894b78c67db.js +1 -0
- package/.next/static/css/0a9b5805594444e3.css +1 -0
- package/.next/static/yztMvBwyrWWkSqP6jfXoa/_buildManifest.js +1 -0
- package/.next/static/yztMvBwyrWWkSqP6jfXoa/_ssgManifest.js +1 -0
- package/.next/trace-build +1 -0
- package/.next/types/app/(app)/activity/page.ts +87 -0
- package/.next/types/app/(app)/agents/[handle]/page.ts +87 -0
- package/.next/types/app/(app)/code/page.ts +87 -0
- package/.next/types/app/(app)/config/page.ts +87 -0
- package/.next/types/app/(app)/costs/page.ts +87 -0
- package/.next/types/app/(app)/cron/page.ts +87 -0
- package/.next/types/app/(app)/dashboard/page.ts +87 -0
- package/.next/types/app/(app)/docs/[id]/page.ts +87 -0
- package/.next/types/app/(app)/docs/page.ts +87 -0
- package/.next/types/app/(app)/github/page.ts +87 -0
- package/.next/types/app/(app)/goals/page.ts +87 -0
- package/.next/types/app/(app)/inbox/page.ts +87 -0
- package/.next/types/app/(app)/knowledge/page.ts +87 -0
- package/.next/types/app/(app)/models/page.ts +87 -0
- package/.next/types/app/(app)/notifications/page.ts +87 -0
- package/.next/types/app/(app)/org/page.ts +87 -0
- package/.next/types/app/(app)/organizations/page.ts +87 -0
- package/.next/types/app/(app)/page.ts +87 -0
- package/.next/types/app/(app)/planner/page.ts +87 -0
- package/.next/types/app/(app)/plugins/page.ts +87 -0
- package/.next/types/app/(app)/pm/page.ts +87 -0
- package/.next/types/app/(app)/prepare-deploy/page.ts +87 -0
- package/.next/types/app/(app)/profile/page.ts +87 -0
- package/.next/types/app/(app)/pulse/page.ts +87 -0
- package/.next/types/app/(app)/reports/[id]/page.ts +87 -0
- package/.next/types/app/(app)/reports/page.ts +87 -0
- package/.next/types/app/(app)/routines/page.ts +87 -0
- package/.next/types/app/(app)/search/page.ts +87 -0
- package/.next/types/app/(app)/security/page.ts +87 -0
- package/.next/types/app/(app)/skills/page.ts +87 -0
- package/.next/types/app/(app)/tasks/page.ts +87 -0
- package/.next/types/app/(app)/test-dev/page.ts +87 -0
- package/.next/types/app/(app)/update/page.ts +87 -0
- package/.next/types/app/(auth)/login/page.ts +87 -0
- package/.next/types/app/(auth)/onboarding/page.ts +87 -0
- package/.next/types/app/api/auth/[...all]/route.ts +351 -0
- package/.next/types/app/api/cron/tick/route.ts +351 -0
- package/.next/types/app/api/dev-login/route.ts +351 -0
- package/.next/types/app/api/locks/acquire/route.ts +351 -0
- package/.next/types/app/api/models/progress/route.ts +351 -0
- package/.next/types/app/api/passkey/authenticate/options/route.ts +351 -0
- package/.next/types/app/api/passkey/authenticate/verify/route.ts +351 -0
- package/.next/types/app/api/passkey/register/options/route.ts +351 -0
- package/.next/types/app/api/passkey/register/verify/route.ts +351 -0
- package/.next/types/app/api/stream/route.ts +351 -0
- package/.next/types/app/api/sync/file/route.ts +351 -0
- package/.next/types/app/api/telegram/poll/route.ts +351 -0
- package/.next/types/app/api/upload/route.ts +351 -0
- package/.next/types/app/api/v1/[[...path]]/route.ts +351 -0
- package/.next/types/cache-life.d.ts +145 -0
- package/.next/types/link.d.ts +210 -0
- package/.next/types/package.json +1 -0
- package/.next/types/routes.d.ts +120 -0
- package/.next/types/validator.ts +511 -0
- package/CHANGELOG.md +312 -0
- package/LICENSE +21 -0
- package/README.md +382 -0
- package/README.pt-BR.md +391 -0
- package/bin/constella.mjs +329 -0
- package/bin/guard-hook.mjs +44 -0
- package/bin/lock-hook.mjs +49 -0
- package/bin/worker.mjs +142 -0
- package/docs/assets/arch-orbit.svg +56 -0
- package/docs/assets/blackhole.svg +37 -0
- package/docs/assets/divider-orbit.svg +23 -0
- package/docs/assets/hero-constella.svg +72 -0
- package/docs/en/AGENTS.md +279 -0
- package/docs/en/AI_ARCHITECTURE.md +373 -0
- package/docs/en/ARCHITECTURE.md +334 -0
- package/docs/en/AUTH_MODE.md +247 -0
- package/docs/en/CHAT_COMMANDS.md +305 -0
- package/docs/en/CONFIGURATION.md +340 -0
- package/docs/en/DEPLOY.md +331 -0
- package/docs/en/DM.md +297 -0
- package/docs/en/FAQ.md +258 -0
- package/docs/en/GITHUB.md +341 -0
- package/docs/en/GOALS_SPECS_ISSUES.md +303 -0
- package/docs/en/INBOX.md +340 -0
- package/docs/en/INSTALLATION.md +329 -0
- package/docs/en/KB_AGENT.md +305 -0
- package/docs/en/KB_RAG.md +356 -0
- package/docs/en/MCP.md +313 -0
- package/docs/en/MEMORY_RAG.md +289 -0
- package/docs/en/MODELS.md +341 -0
- package/docs/en/ONBOARDING.md +327 -0
- package/docs/en/PLUGINS.md +290 -0
- package/docs/en/PORTABLE_MODE.md +387 -0
- package/docs/en/PO_AGENT.md +379 -0
- package/docs/en/PREPARE_DEPLOY.md +308 -0
- package/docs/en/PROJECT_STACKS.md +258 -0
- package/docs/en/PUBLIC_API.md +315 -0
- package/docs/en/PUBLISHING.md +343 -0
- package/docs/en/README.md +95 -0
- package/docs/en/SECURITY.md +280 -0
- package/docs/en/SKILLS.md +349 -0
- package/docs/en/START_MODE.md +340 -0
- package/docs/en/SYNCED_BLOCKS.md +320 -0
- package/docs/en/TEAM_ROOM.md +285 -0
- package/docs/en/TELEGRAM.md +294 -0
- package/docs/en/TEST_DEV.md +321 -0
- package/docs/en/TROUBLESHOOTING.md +294 -0
- package/docs/en/UPDATE.md +301 -0
- package/docs/en/VPS_MODE.md +334 -0
- package/docs/en/WORKFLOW.md +321 -0
- package/docs/pt/AGENTS.md +279 -0
- package/docs/pt/AI_ARCHITECTURE.md +373 -0
- package/docs/pt/ARCHITECTURE.md +334 -0
- package/docs/pt/AUTH_MODE.md +247 -0
- package/docs/pt/CHAT_COMMANDS.md +307 -0
- package/docs/pt/CONFIGURATION.md +340 -0
- package/docs/pt/DEPLOY.md +331 -0
- package/docs/pt/DM.md +297 -0
- package/docs/pt/FAQ.md +258 -0
- package/docs/pt/GITHUB.md +341 -0
- package/docs/pt/GOALS_SPECS_ISSUES.md +303 -0
- package/docs/pt/INBOX.md +340 -0
- package/docs/pt/INSTALLATION.md +329 -0
- package/docs/pt/KB_AGENT.md +305 -0
- package/docs/pt/KB_RAG.md +356 -0
- package/docs/pt/MCP.md +313 -0
- package/docs/pt/MEMORY_RAG.md +289 -0
- package/docs/pt/MODELS.md +341 -0
- package/docs/pt/ONBOARDING.md +327 -0
- package/docs/pt/PLUGINS.md +290 -0
- package/docs/pt/PORTABLE_MODE.md +387 -0
- package/docs/pt/PO_AGENT.md +379 -0
- package/docs/pt/PREPARE_DEPLOY.md +308 -0
- package/docs/pt/PROJECT_STACKS.md +258 -0
- package/docs/pt/PUBLIC_API.md +315 -0
- package/docs/pt/PUBLISHING.md +343 -0
- package/docs/pt/README.md +95 -0
- package/docs/pt/SECURITY.md +280 -0
- package/docs/pt/SKILLS.md +349 -0
- package/docs/pt/START_MODE.md +340 -0
- package/docs/pt/SYNCED_BLOCKS.md +320 -0
- package/docs/pt/TEAM_ROOM.md +285 -0
- package/docs/pt/TELEGRAM.md +294 -0
- package/docs/pt/TEST_DEV.md +321 -0
- package/docs/pt/TROUBLESHOOTING.md +294 -0
- package/docs/pt/UPDATE.md +301 -0
- package/docs/pt/VPS_MODE.md +334 -0
- package/docs/pt/WORKFLOW.md +321 -0
- package/drizzle/0000_regular_nightshade.sql +644 -0
- package/drizzle/0001_mixed_zombie.sql +106 -0
- package/drizzle/meta/0000_snapshot.json +4650 -0
- package/drizzle/meta/0001_snapshot.json +5418 -0
- package/drizzle/meta/_journal.json +20 -0
- package/drizzle.config.mjs +16 -0
- package/next.config.mjs +18 -0
- package/package.json +130 -0
- package/scripts/clean-repo.mjs +20 -0
- package/scripts/dev-all.mjs +46 -0
- package/scripts/i18n-parity.mjs +57 -0
- package/scripts/mcp-server.mjs +100 -0
- package/scripts/postbuild.mjs +11 -0
- package/scripts/publish-public.mjs +116 -0
- package/scripts/start-all.mjs +45 -0
- package/scripts/trim-next.mjs +23 -0
- package/scripts/vps-install.sh +39 -0
- package/skills/CONTRIBUTING.md +122 -0
- package/skills/COVERAGE.md +129 -0
- package/skills/INDEX.json +3443 -0
- package/skills/README.md +57 -0
- package/skills/design/animation-motion/SKILL.md +60 -0
- package/skills/design/color-and-typography/SKILL.md +60 -0
- package/skills/design/css-techniques/SKILL.md +58 -0
- package/skills/design/design-systems/SKILL.md +60 -0
- package/skills/design/gradients/SKILL.md +59 -0
- package/skills/design/graphic-design-basics/SKILL.md +55 -0
- package/skills/design/microinteractions/SKILL.md +58 -0
- package/skills/design/responsive-layout/SKILL.md +59 -0
- package/skills/design/ui-ux-principles/SKILL.md +58 -0
- package/skills/engineering/architecture/api-design-rest-graphql/SKILL.md +67 -0
- package/skills/engineering/architecture/caching-strategies/SKILL.md +59 -0
- package/skills/engineering/architecture/data-modeling/SKILL.md +64 -0
- package/skills/engineering/architecture/message-queues-async/SKILL.md +58 -0
- package/skills/engineering/architecture/scalability-reliability/SKILL.md +62 -0
- package/skills/engineering/architecture/software-architecture-patterns/SKILL.md +56 -0
- package/skills/engineering/architecture/system-design-fundamentals/SKILL.md +56 -0
- package/skills/engineering/backend/auth-and-authorization/SKILL.md +62 -0
- package/skills/engineering/backend/backend-fundamentals/SKILL.md +65 -0
- package/skills/engineering/backend/observability-logging/SKILL.md +60 -0
- package/skills/engineering/frontend/accessibility-wcag/SKILL.md +57 -0
- package/skills/engineering/frontend/frontend-architecture/SKILL.md +65 -0
- package/skills/engineering/frontend/rendering-strategies-ssr-csr/SKILL.md +60 -0
- package/skills/engineering/frontend/state-management/SKILL.md +69 -0
- package/skills/engineering/performance/backend-performance/SKILL.md +69 -0
- package/skills/engineering/performance/database-query-optimization/SKILL.md +64 -0
- package/skills/engineering/performance/profiling-and-benchmarking/SKILL.md +60 -0
- package/skills/engineering/performance/web-performance-core-vitals/SKILL.md +72 -0
- package/skills/engineering/practices/clean-code/SKILL.md +61 -0
- package/skills/engineering/practices/code-optimization/SKILL.md +60 -0
- package/skills/engineering/practices/code-review-practices/SKILL.md +58 -0
- package/skills/engineering/practices/git-workflow/SKILL.md +62 -0
- package/skills/engineering/practices/refactoring/SKILL.md +58 -0
- package/skills/engineering/security/appsec-fundamentals/SKILL.md +70 -0
- package/skills/engineering/security/dependency-supply-chain/SKILL.md +77 -0
- package/skills/engineering/security/owasp-asvs/SKILL.md +54 -0
- package/skills/engineering/security/owasp-top-10/SKILL.md +63 -0
- package/skills/engineering/security/secrets-management/SKILL.md +58 -0
- package/skills/engineering/security/secure-auth-sessions/SKILL.md +56 -0
- package/skills/engineering/testing/tdd-and-coverage/SKILL.md +62 -0
- package/skills/engineering/testing/testing-strategy-pyramid/SKILL.md +56 -0
- package/skills/engineering/testing/unit-integration-e2e/SKILL.md +75 -0
- package/skills/languages/c/SKILL.md +74 -0
- package/skills/languages/clojure/SKILL.md +73 -0
- package/skills/languages/cpp/SKILL.md +75 -0
- package/skills/languages/csharp/SKILL.md +75 -0
- package/skills/languages/dart/SKILL.md +82 -0
- package/skills/languages/elixir/SKILL.md +74 -0
- package/skills/languages/erlang/SKILL.md +76 -0
- package/skills/languages/go/SKILL.md +83 -0
- package/skills/languages/haskell/SKILL.md +70 -0
- package/skills/languages/java/SKILL.md +71 -0
- package/skills/languages/javascript/SKILL.md +62 -0
- package/skills/languages/kotlin/SKILL.md +68 -0
- package/skills/languages/lua/SKILL.md +79 -0
- package/skills/languages/objectivec/SKILL.md +83 -0
- package/skills/languages/php/SKILL.md +74 -0
- package/skills/languages/python/SKILL.md +68 -0
- package/skills/languages/r/SKILL.md +70 -0
- package/skills/languages/ruby/SKILL.md +67 -0
- package/skills/languages/rust/SKILL.md +72 -0
- package/skills/languages/scala/SKILL.md +73 -0
- package/skills/languages/swift/SKILL.md +73 -0
- package/skills/languages/typescript/SKILL.md +69 -0
- package/skills/meta/authoring-agent-skills/SKILL.md +73 -0
- package/skills/meta/progressive-disclosure/SKILL.md +65 -0
- package/skills/meta/skill-frontmatter-spec/SKILL.md +65 -0
- package/skills/process/adr-technical-decisions/SKILL.md +59 -0
- package/skills/process/app-planning/SKILL.md +63 -0
- package/skills/process/architecture-before-code/SKILL.md +52 -0
- package/skills/process/breaking-work-into-sprints/SKILL.md +53 -0
- package/skills/process/idea-to-product/SKILL.md +50 -0
- package/skills/process/mocks-and-screen-flows/SKILL.md +52 -0
- package/skills/process/prioritization-moscow-rice/SKILL.md +64 -0
- package/skills/process/problem-framing/SKILL.md +51 -0
- package/skills/process/product-discovery/SKILL.md +53 -0
- package/skills/process/readme-generation/SKILL.md +90 -0
- package/skills/process/requirements-to-specs/SKILL.md +53 -0
- package/skills/process/research-official-docs/SKILL.md +58 -0
- package/skills/process/review-code-perf-security/SKILL.md +65 -0
- package/skills/process/security-by-design/SKILL.md +68 -0
- package/skills/process/specs-to-issues/SKILL.md +53 -0
- package/skills/process/testing-before-done/SKILL.md +61 -0
- package/skills/process/validating-ux-navigation/SKILL.md +63 -0
- package/skills/references/ai-attachments-ui/SKILL.md +66 -0
- package/skills/references/ai-in-browser-webllm/SKILL.md +74 -0
- package/skills/references/ai-tool-ui-patterns/SKILL.md +63 -0
- package/skills/references/component-patterns-gallery/SKILL.md +62 -0
- package/skills/references/gradient-resources/SKILL.md +66 -0
- package/skills/references/react-component-libraries/SKILL.md +61 -0
- package/skills/references/saas-landing-patterns/SKILL.md +67 -0
- package/skills/references/shadcn-tailwind-theming/SKILL.md +74 -0
- package/skills/references/vercel-ai-sdk-elements/SKILL.md +66 -0
- package/skills/references/web-animation-codrops/SKILL.md +68 -0
- package/skills/stacks/aiml/jupyter/SKILL.md +68 -0
- package/skills/stacks/aiml/keras/SKILL.md +77 -0
- package/skills/stacks/aiml/numpy/SKILL.md +69 -0
- package/skills/stacks/aiml/pandas/SKILL.md +72 -0
- package/skills/stacks/aiml/pytorch/SKILL.md +77 -0
- package/skills/stacks/aiml/scikit-learn/SKILL.md +74 -0
- package/skills/stacks/aiml/tensorflow/SKILL.md +79 -0
- package/skills/stacks/auth/auth0/SKILL.md +63 -0
- package/skills/stacks/auth/authjs/SKILL.md +69 -0
- package/skills/stacks/auth/clerk/SKILL.md +72 -0
- package/skills/stacks/auth/keycloak/SKILL.md +63 -0
- package/skills/stacks/auth/lucia/SKILL.md +56 -0
- package/skills/stacks/auth/passport/SKILL.md +70 -0
- package/skills/stacks/auth/supabase-auth/SKILL.md +66 -0
- package/skills/stacks/baas/amplify/SKILL.md +71 -0
- package/skills/stacks/baas/appwrite/SKILL.md +79 -0
- package/skills/stacks/baas/firebase/SKILL.md +73 -0
- package/skills/stacks/baas/heroku/SKILL.md +71 -0
- package/skills/stacks/backend/actix/SKILL.md +77 -0
- package/skills/stacks/backend/adonisjs/SKILL.md +65 -0
- package/skills/stacks/backend/aspnet-core/SKILL.md +75 -0
- package/skills/stacks/backend/codeigniter/SKILL.md +76 -0
- package/skills/stacks/backend/django/SKILL.md +62 -0
- package/skills/stacks/backend/express/SKILL.md +65 -0
- package/skills/stacks/backend/fastapi/SKILL.md +64 -0
- package/skills/stacks/backend/fastify/SKILL.md +64 -0
- package/skills/stacks/backend/fiber/SKILL.md +68 -0
- package/skills/stacks/backend/flask/SKILL.md +71 -0
- package/skills/stacks/backend/gin/SKILL.md +68 -0
- package/skills/stacks/backend/graphql/SKILL.md +70 -0
- package/skills/stacks/backend/hono/SKILL.md +64 -0
- package/skills/stacks/backend/koa/SKILL.md +63 -0
- package/skills/stacks/backend/laravel/SKILL.md +73 -0
- package/skills/stacks/backend/nestjs/SKILL.md +70 -0
- package/skills/stacks/backend/nginx/SKILL.md +77 -0
- package/skills/stacks/backend/phoenix/SKILL.md +68 -0
- package/skills/stacks/backend/rails/SKILL.md +67 -0
- package/skills/stacks/backend/spring/SKILL.md +70 -0
- package/skills/stacks/backend/spring-boot/SKILL.md +70 -0
- package/skills/stacks/backend/symfony/SKILL.md +77 -0
- package/skills/stacks/container/containerd/SKILL.md +75 -0
- package/skills/stacks/container/docker/SKILL.md +90 -0
- package/skills/stacks/container/podman/SKILL.md +93 -0
- package/skills/stacks/database/cassandra/SKILL.md +74 -0
- package/skills/stacks/database/cockroachdb/SKILL.md +69 -0
- package/skills/stacks/database/dynamodb/SKILL.md +62 -0
- package/skills/stacks/database/mariadb/SKILL.md +71 -0
- package/skills/stacks/database/mongodb/SKILL.md +71 -0
- package/skills/stacks/database/mysql/SKILL.md +72 -0
- package/skills/stacks/database/neon/SKILL.md +68 -0
- package/skills/stacks/database/planetscale/SKILL.md +70 -0
- package/skills/stacks/database/postgresql/SKILL.md +81 -0
- package/skills/stacks/database/redis/SKILL.md +78 -0
- package/skills/stacks/database/sqlite/SKILL.md +70 -0
- package/skills/stacks/database/supabase/SKILL.md +79 -0
- package/skills/stacks/dataviz/chart-js/SKILL.md +72 -0
- package/skills/stacks/dataviz/d3/SKILL.md +77 -0
- package/skills/stacks/dataviz/grafana/SKILL.md +69 -0
- package/skills/stacks/dataviz/plotly/SKILL.md +71 -0
- package/skills/stacks/frontend/alpine/SKILL.md +75 -0
- package/skills/stacks/frontend/angular/SKILL.md +75 -0
- package/skills/stacks/frontend/backbone/SKILL.md +82 -0
- package/skills/stacks/frontend/ember/SKILL.md +85 -0
- package/skills/stacks/frontend/htmx/SKILL.md +73 -0
- package/skills/stacks/frontend/lit/SKILL.md +76 -0
- package/skills/stacks/frontend/preact/SKILL.md +74 -0
- package/skills/stacks/frontend/qwik/SKILL.md +65 -0
- package/skills/stacks/frontend/react/SKILL.md +77 -0
- package/skills/stacks/frontend/solidjs/SKILL.md +75 -0
- package/skills/stacks/frontend/svelte/SKILL.md +70 -0
- package/skills/stacks/frontend/vue/SKILL.md +69 -0
- package/skills/stacks/infra/ansible/SKILL.md +76 -0
- package/skills/stacks/infra/aws/SKILL.md +66 -0
- package/skills/stacks/infra/azure/SKILL.md +72 -0
- package/skills/stacks/infra/circleci/SKILL.md +78 -0
- package/skills/stacks/infra/cloudflare/SKILL.md +65 -0
- package/skills/stacks/infra/fly-io/SKILL.md +63 -0
- package/skills/stacks/infra/gcp/SKILL.md +66 -0
- package/skills/stacks/infra/jenkins/SKILL.md +73 -0
- package/skills/stacks/infra/kubernetes/SKILL.md +64 -0
- package/skills/stacks/infra/netlify/SKILL.md +60 -0
- package/skills/stacks/infra/railway/SKILL.md +63 -0
- package/skills/stacks/infra/tailscale/SKILL.md +65 -0
- package/skills/stacks/infra/terraform/SKILL.md +75 -0
- package/skills/stacks/infra/vagrant/SKILL.md +70 -0
- package/skills/stacks/infra/vercel/SKILL.md +60 -0
- package/skills/stacks/meta/astro/SKILL.md +64 -0
- package/skills/stacks/meta/docusaurus/SKILL.md +71 -0
- package/skills/stacks/meta/eleventy/SKILL.md +69 -0
- package/skills/stacks/meta/gatsby/SKILL.md +63 -0
- package/skills/stacks/meta/hugo/SKILL.md +73 -0
- package/skills/stacks/meta/jekyll/SKILL.md +70 -0
- package/skills/stacks/meta/nextjs/SKILL.md +62 -0
- package/skills/stacks/meta/nuxt/SKILL.md +66 -0
- package/skills/stacks/meta/remix/SKILL.md +67 -0
- package/skills/stacks/meta/sveltekit/SKILL.md +70 -0
- package/skills/stacks/meta/vite/SKILL.md +63 -0
- package/skills/stacks/mobile/android/SKILL.md +77 -0
- package/skills/stacks/mobile/flutter/SKILL.md +77 -0
- package/skills/stacks/mobile/ionic/SKILL.md +72 -0
- package/skills/stacks/mobile/nativescript/SKILL.md +71 -0
- package/skills/stacks/mobile/react-native/SKILL.md +75 -0
- package/skills/stacks/mobile/xamarin/SKILL.md +73 -0
- package/skills/stacks/orm/diesel/SKILL.md +72 -0
- package/skills/stacks/orm/django-orm/SKILL.md +58 -0
- package/skills/stacks/orm/drizzle/SKILL.md +67 -0
- package/skills/stacks/orm/gorm/SKILL.md +73 -0
- package/skills/stacks/orm/knex/SKILL.md +64 -0
- package/skills/stacks/orm/mongoose/SKILL.md +64 -0
- package/skills/stacks/orm/prisma/SKILL.md +64 -0
- package/skills/stacks/orm/sequelize/SKILL.md +65 -0
- package/skills/stacks/orm/sqlalchemy/SKILL.md +71 -0
- package/skills/stacks/orm/typeorm/SKILL.md +70 -0
- package/skills/stacks/queue/bullmq/SKILL.md +69 -0
- package/skills/stacks/queue/celery/SKILL.md +68 -0
- package/skills/stacks/queue/kafka/SKILL.md +66 -0
- package/skills/stacks/queue/nats/SKILL.md +66 -0
- package/skills/stacks/queue/rabbitmq/SKILL.md +64 -0
- package/skills/stacks/queue/redis/SKILL.md +66 -0
- package/skills/stacks/runtime/beam/SKILL.md +72 -0
- package/skills/stacks/runtime/bun/SKILL.md +80 -0
- package/skills/stacks/runtime/deno/SKILL.md +74 -0
- package/skills/stacks/runtime/dotnet/SKILL.md +64 -0
- package/skills/stacks/runtime/jvm/SKILL.md +66 -0
- package/skills/stacks/runtime/node/SKILL.md +70 -0
- package/skills/stacks/runtime/pypy/SKILL.md +69 -0
- package/skills/stacks/runtime/python3/SKILL.md +70 -0
- package/skills/stacks/styling/bootstrap/SKILL.md +74 -0
- package/skills/stacks/styling/bulma/SKILL.md +80 -0
- package/skills/stacks/styling/chakra-ui/SKILL.md +61 -0
- package/skills/stacks/styling/css-modules/SKILL.md +54 -0
- package/skills/stacks/styling/mui/SKILL.md +60 -0
- package/skills/stacks/styling/sass/SKILL.md +63 -0
- package/skills/stacks/styling/shadcn-ui/SKILL.md +58 -0
- package/skills/stacks/styling/styled-components/SKILL.md +62 -0
- package/skills/stacks/styling/tailwind/SKILL.md +59 -0
- package/skills/stacks/styling/unocss/SKILL.md +64 -0
- package/skills/stacks/styling/vanilla-extract/SKILL.md +64 -0
- package/skills/stacks/styling/vuetify/SKILL.md +89 -0
- package/skills/stacks/testing/cypress/SKILL.md +68 -0
- package/skills/stacks/testing/jasmine/SKILL.md +67 -0
- package/skills/stacks/testing/jest/SKILL.md +67 -0
- package/skills/stacks/testing/mocha/SKILL.md +71 -0
- package/skills/stacks/testing/playwright/SKILL.md +68 -0
- package/skills/stacks/testing/puppeteer/SKILL.md +70 -0
- package/skills/stacks/testing/selenium/SKILL.md +70 -0
- package/skills/stacks/testing/vitest/SKILL.md +68 -0
|
@@ -0,0 +1,869 @@
|
|
|
1
|
+
"use strict";exports.id=3533,exports.ids=[3533],exports.modules={1250:(a,b,c)=>{c.d(b,{Lb:()=>J,bP:()=>K,tt:()=>L,GA:()=>M});var d=c(56663);let e={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"}},f=Object.fromEntries([{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"]}].map(a=>[a.key,a.label])),g={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"}},h=[{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 i(a){return a.toLowerCase().replace(/[^\w\s-]/g,"").trim().replace(/\s+/g,"-")}function j(a){let b=g[a],c=a.replace(/-/g,"--").replace(/_/g,"__").replace(/ /g,"_");return b?``:``}function k(a){return Object.entries(a||{}).filter(([,a])=>a&&"None"!==a&&a.trim())}let l=[{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 m(a){let b=0;for(let c=0;c<a.length;c++)b=31*b+a.charCodeAt(c)>>>0;return l[b%l.length]}let n=a=>(a||"").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">");function o(a){return Object.values(a||{}).filter(a=>a&&"None"!==a).slice(0,10).join(" \xb7 ")}function p(a){let b=m(a.company),c=a.objective?.trim()||"this product",d=o(a.stack);return`<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
|
+
<title>${n(a.company)}</title>
|
|
7
|
+
<style>
|
|
8
|
+
:root { color-scheme: dark; }
|
|
9
|
+
* { box-sizing: border-box; }
|
|
10
|
+
body { margin: 0; min-height: 100vh; display: grid; place-items: center; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
|
|
11
|
+
background: radial-gradient(1200px 800px at 70% -10%, #${b.c2}33, transparent), linear-gradient(160deg, #${b.c1}, #05060d); color: #e8eaf2; }
|
|
12
|
+
.card { max-width: 680px; padding: 48px 44px; text-align: center; }
|
|
13
|
+
.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; }
|
|
14
|
+
h1 { font-size: 52px; margin: 0 0 14px; background: linear-gradient(120deg, #fff, #${b.c2}); -webkit-background-clip: text; background-clip: text; color: transparent; }
|
|
15
|
+
.mission { font-size: 17px; line-height: 1.6; color: #c3c7d6; margin: 0 0 26px; }
|
|
16
|
+
.build { font-size: 14px; color: #9aa0b8; background: #ffffff0a; border: 1px solid #ffffff14; border-radius: 12px; padding: 14px 18px; margin-bottom: 22px; }
|
|
17
|
+
.build b { color: #${b.c2}; }
|
|
18
|
+
.chips { font-size: 12px; color: #8b90a8; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; margin-bottom: 30px; }
|
|
19
|
+
.foot { font-size: 12px; color: #6b7088; }
|
|
20
|
+
.dot { display: inline-block; width: 8px; height: 8px; border-radius: 50%; background: #${b.c2}; margin-right: 7px; box-shadow: 0 0 12px #${b.c2}; animation: pulse 1.8s ease-in-out infinite; }
|
|
21
|
+
@keyframes pulse { 0%,100% { opacity: 1; } 50% { opacity: .4; } }
|
|
22
|
+
</style>
|
|
23
|
+
</head>
|
|
24
|
+
<body>
|
|
25
|
+
<div class="card">
|
|
26
|
+
<span class="badge">● Live starter</span>
|
|
27
|
+
<h1>${n(a.company)}</h1>
|
|
28
|
+
<p class="mission">${n(a.mission||"Your project, scaffolded and running.")}</p>
|
|
29
|
+
<div class="build"><span class="dot"></span>Your AI team is building <b>${n(c)}</b> on top of this starter.</div>
|
|
30
|
+
${d?`<div class="chips">${n(d)}</div>`:""}
|
|
31
|
+
<div class="foot">Runnable starter scaffolded by Constella \xb7 edit these files to build the product.</div>
|
|
32
|
+
</div>
|
|
33
|
+
</body>
|
|
34
|
+
</html>`}let q=`node_modules
|
|
35
|
+
.next
|
|
36
|
+
dist
|
|
37
|
+
build
|
|
38
|
+
.env
|
|
39
|
+
.env.local
|
|
40
|
+
*.log
|
|
41
|
+
.DS_Store
|
|
42
|
+
`,r=`__pycache__/
|
|
43
|
+
*.pyc
|
|
44
|
+
.venv/
|
|
45
|
+
venv/
|
|
46
|
+
.env
|
|
47
|
+
*.log
|
|
48
|
+
.constella-pyinstalled
|
|
49
|
+
`,s=`/bin/
|
|
50
|
+
*.exe
|
|
51
|
+
.env
|
|
52
|
+
*.log
|
|
53
|
+
`,t=`/target
|
|
54
|
+
.env
|
|
55
|
+
*.log
|
|
56
|
+
`,u=`# Copy to .env and fill in. The dev server binds the PORT chosen by Test Dev.
|
|
57
|
+
PORT=
|
|
58
|
+
`,v=(a,b)=>JSON.stringify({name:a||"project",version:"0.1.0",private:!0,...b},null,2)+"\n";function w(a,b){let c,d,e="static"===b?"http":"node-express"===b?"express":"node-fastify"===b?"fastify":"node-koa"===b?"koa":"hono",f="express"===e?{express:"^4.19.2"}:"fastify"===e?{fastify:"^4.28.1"}:"koa"===e?{koa:"^2.15.3"}:"hono"===e?{hono:"^4.5.0","@hono/node-server":"^1.12.0"}:{};return[["package.json",v(a.slug,{scripts:{dev:"node server.js",start:"node server.js"},...Object.keys(f).length?{dependencies:f}:{}})],["server.js",(c=JSON.stringify(p(a)),d=`const PORT = Number(process.env.PORT) || 3000;
|
|
59
|
+
const HTML = ${c};
|
|
60
|
+
`,"http"===e?`const http = require("http");
|
|
61
|
+
${d}http.createServer((req, res) => { res.writeHead(200, { "Content-Type": "text/html; charset=utf-8" }); res.end(HTML); }).listen(PORT, "127.0.0.1", () => console.log("listening on http://127.0.0.1:" + PORT));
|
|
62
|
+
`:"express"===e?`const express = require("express");
|
|
63
|
+
${d}const app = express();
|
|
64
|
+
app.get("/", (_req, res) => res.type("html").send(HTML));
|
|
65
|
+
app.listen(PORT, "127.0.0.1", () => console.log("listening on http://127.0.0.1:" + PORT));
|
|
66
|
+
`:"fastify"===e?`const Fastify = require("fastify");
|
|
67
|
+
${d}const app = Fastify();
|
|
68
|
+
app.get("/", (_req, reply) => reply.type("text/html").send(HTML));
|
|
69
|
+
app.listen({ port: PORT, host: "127.0.0.1" }).then(() => console.log("listening on http://127.0.0.1:" + PORT));
|
|
70
|
+
`:"koa"===e?`const Koa = require("koa");
|
|
71
|
+
${d}const app = new Koa();
|
|
72
|
+
app.use((ctx) => { ctx.type = "html"; ctx.body = HTML; });
|
|
73
|
+
app.listen(PORT, "127.0.0.1", () => console.log("listening on http://127.0.0.1:" + PORT));
|
|
74
|
+
`:`const { serve } = require("@hono/node-server");
|
|
75
|
+
const { Hono } = require("hono");
|
|
76
|
+
${d}const app = new Hono();
|
|
77
|
+
app.get("/", (c) => c.html(HTML));
|
|
78
|
+
serve({ fetch: app.fetch, port: PORT, hostname: "127.0.0.1" }, () => console.log("listening on http://127.0.0.1:" + PORT));
|
|
79
|
+
`)],[".gitignore",q],[".env.example",u]]}function x(a){return{p:m(a.company),obj:a.objective?.trim()||"this product",chips:o(a.stack)}}function y(a){let b=m(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
|
+
`}function z(a){return`HTML = """${p(a)}"""
|
|
81
|
+
`}let A=new Set(["Next.js","Nuxt","Remix","SvelteKit","Astro","Gatsby"]);function B(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||A.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"}var C=c(35745);let D=[{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."}],E=[{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"]}],F=E.filter(a=>"telegram-notify"!==a.name&&"gguf-validate"!==a.name).map(a=>a.name);function G(a,b){return`# ${a}
|
|
82
|
+
|
|
83
|
+
${b}
|
|
84
|
+
`}function H(a){let b,c,d,g=[[".claude/organization.md",`---
|
|
85
|
+
orgId: ${a.orgId}
|
|
86
|
+
slug: ${a.slug}
|
|
87
|
+
name: ${a.company}
|
|
88
|
+
runMode: ${a.runMode??"start"}
|
|
89
|
+
created: ${a.createdAt??"(set at creation)"}
|
|
90
|
+
---
|
|
91
|
+
# ${a.company} — Organization
|
|
92
|
+
|
|
93
|
+
- **Organization ID:** \`${a.orgId}\` (stable; never changes even if the name does)
|
|
94
|
+
- **Workspace path:** \`~/.constella/organizations/${a.orgId}/workspace/\`
|
|
95
|
+
- **Runtime mode:** ${a.runMode??"start"} (local \xb7 auth \xb7 vps \xb7 portable)
|
|
96
|
+
|
|
97
|
+
## Mission
|
|
98
|
+
${a.mission||"_Define the company mission._"}
|
|
99
|
+
|
|
100
|
+
## Objective
|
|
101
|
+
${a.objective||"_Define the current objective._"}
|
|
102
|
+
|
|
103
|
+
## Active modules
|
|
104
|
+
Dashboard \xb7 Agents \xb7 Skills \xb7 Product \xb7 Planner \xb7 Docs \xb7 Reports \xb7 Code \xb7 Costs \xb7 Models \xb7 Security \xb7 Pulse \xb7 Chat.
|
|
105
|
+
|
|
106
|
+
## Default agents
|
|
107
|
+
${D.map(a=>`- **${a.name}** (@${a.handle}) — ${a.role}${a.reportsTo?`, reports to @${a.reportsTo}`:""}`).join("\n")}
|
|
108
|
+
|
|
109
|
+
## Organization rules
|
|
110
|
+
1. The directory is the source of truth; the database only indexes it.
|
|
111
|
+
2. Every agent and the Code editor are locked to THIS workspace — no access outside it.
|
|
112
|
+
3. Plan before building; every change passes a security review before merge.
|
|
113
|
+
4. Respect per-agent daily budget ceilings; stop at the cap.
|
|
114
|
+
`],[".claude/workspace.md",`# Workspace structure
|
|
115
|
+
|
|
116
|
+
This workspace is the operational brain of **${a.company}**. The platform reads these
|
|
117
|
+
files to operate; editing a file in the UI writes it back here, and editing it here is
|
|
118
|
+
picked up by the sync engine.
|
|
119
|
+
|
|
120
|
+
## Folders
|
|
121
|
+
| Path | Responsibility |
|
|
122
|
+
|---|---|
|
|
123
|
+
| \`.claude/\` | Control layer — org/workspace config, permissions, memory, routing, indexing, settings; agents & skills (read by the Claude CLI). |
|
|
124
|
+
| \`DOCS/\` | Documentation — architecture, API, database, standards, onboarding. |
|
|
125
|
+
| \`PO/\` | Product ownership — roadmap, backlog, sprint, requirements, user stories. |
|
|
126
|
+
| \`Reports/\` | System & agent reports — status, health, pulse, daily/weekly, errors. |
|
|
127
|
+
| \`specs/\` \`issues/\` | Planner output — specs and the issues agents implement. |
|
|
128
|
+
| _(project source)_ | The product the agents build. |
|
|
129
|
+
|
|
130
|
+
## File naming & Markdown rules
|
|
131
|
+
- Lower-case, hyphenated file names (\`sprint-plan.md\`).
|
|
132
|
+
- Each document opens with a single H1 title; use \`## Section\` headings the loaders parse.
|
|
133
|
+
- Optional YAML front-matter (\`---\`) for machine-readable fields.
|
|
134
|
+
|
|
135
|
+
## Sync behavior
|
|
136
|
+
- **Write-through:** UI edits write the \`.md\` immediately, then re-index.
|
|
137
|
+
- **Watcher:** external/agent edits are detected and re-indexed disk → DB.
|
|
138
|
+
- The DB is an index/cache only; this directory wins on conflict.
|
|
139
|
+
|
|
140
|
+
## Code module binding & isolation
|
|
141
|
+
The Code module opens ONLY this organization's workspace. The editor and every agent
|
|
142
|
+
are sandboxed here and cannot read, write or delete anything outside it.
|
|
143
|
+
`],[".claude/permissions.md",`# Permissions
|
|
144
|
+
|
|
145
|
+
Defines who may do what inside this workspace. The agent CLI sandbox (\`.claude/settings.json\`)
|
|
146
|
+
and the runner enforce these boundaries.
|
|
147
|
+
|
|
148
|
+
## File access boundary
|
|
149
|
+
- **Allowed root:** \`~/.constella/organizations/${a.orgId}/workspace/\` and everything beneath it.
|
|
150
|
+
- **Forbidden paths:** the user home, \`Documents\`, \`Desktop\`, any other organization's
|
|
151
|
+
directory, and anything outside the allowed root. Path traversal is rejected.
|
|
152
|
+
|
|
153
|
+
## User permissions
|
|
154
|
+
- Full read/write across this workspace via the UI.
|
|
155
|
+
- May connect providers, approve plans, manage budgets, switch organizations.
|
|
156
|
+
|
|
157
|
+
## Agent permissions
|
|
158
|
+
- Read / create / edit / delete / search **only inside this workspace** (cwd-jailed).
|
|
159
|
+
- Spend up to the agent's daily budget cap, then stop.
|
|
160
|
+
- Never exfiltrate secrets; secrets are referenced from the vault, never inlined.
|
|
161
|
+
|
|
162
|
+
## Tool permissions
|
|
163
|
+
- File tools auto-accept edits **within the workspace** (\`acceptEdits\`); no outside access.
|
|
164
|
+
- Bash is workspace-scoped; network/deploy tools require an explicit, configured integration.
|
|
165
|
+
|
|
166
|
+
## Deletion & security rules
|
|
167
|
+
- Deletions are workspace-scoped and revalidated; the runtime root is never deleted.
|
|
168
|
+
- No plaintext keys in any file or log; use vault references.
|
|
169
|
+
`],[".claude/memory.md",`# Memory
|
|
170
|
+
|
|
171
|
+
How the workspace remembers context across sessions, chats and DMs.
|
|
172
|
+
|
|
173
|
+
## What may be remembered
|
|
174
|
+
- Decisions, requirements, task state, files referenced, agent actions, pending work,
|
|
175
|
+
and explicit operator instructions.
|
|
176
|
+
|
|
177
|
+
## What must NOT be remembered
|
|
178
|
+
- Secrets, tokens, API keys, passwords, or any vault material.
|
|
179
|
+
- Personal data not required to do the work.
|
|
180
|
+
|
|
181
|
+
## Storage & linkage
|
|
182
|
+
- Long-lived context lives in this workspace (linked from here), not in an isolated store.
|
|
183
|
+
- The database indexes summaries for fast recall; the directory holds the canonical text.
|
|
184
|
+
|
|
185
|
+
## Chat & DM compaction
|
|
186
|
+
- When a conversation grows past the active model's context budget, older messages are
|
|
187
|
+
summarized into a compact context that PRESERVES decisions, tasks, files and instructions.
|
|
188
|
+
- Compaction is **model-aware**: a smaller model receives a more aggressive summary; a larger
|
|
189
|
+
model keeps more detail. The compacted context is linked back to this workspace.
|
|
190
|
+
`],[".claude/routing.md",`# Routing
|
|
191
|
+
|
|
192
|
+
How work is routed to agents, skills and tools.
|
|
193
|
+
|
|
194
|
+
## Task → agent
|
|
195
|
+
| Work type | Owner |
|
|
196
|
+
|---|---|
|
|
197
|
+
| Strategy / goals / approvals | @ada (CEO) |
|
|
198
|
+
| Architecture / tickets / PR review | @linus (CTO) |
|
|
199
|
+
| Backlog / sprint / priorities | @donald (Product Owner) |
|
|
200
|
+
| Server / API / data | @margaret (Backend) |
|
|
201
|
+
| UI / components | @grace (Frontend) |
|
|
202
|
+
| Tests / sign-off | @edsger (QA) |
|
|
203
|
+
| Build / deploy / infra | @werner (DevOps) |
|
|
204
|
+
| Docs | @barbara (Docs) |
|
|
205
|
+
| Security review | @whitfield (CyberSec) |
|
|
206
|
+
| Knowledge / RAG / embeddings / memory | @vannevar (Knowledge) |
|
|
207
|
+
|
|
208
|
+
## Skill & tool selection
|
|
209
|
+
- An agent selects a skill when its **trigger** matches the task (see \`.claude/skills/\`).
|
|
210
|
+
- Tools are chosen from the agent's \`tools.md\`; only workspace-scoped tools are permitted.
|
|
211
|
+
|
|
212
|
+
## Escalation & blocked tasks
|
|
213
|
+
- A blocked task is raised to the agent's \`reportsTo\`; budget blocks raise an inbox item.
|
|
214
|
+
- Unrecoverable failures are logged to \`Reports/error-report.md\` and surfaced to the operator.
|
|
215
|
+
`],[".claude/index.md","# Index\n\nHow the workspace is indexed into the database for search and recall.\n\n## Indexed folders & types\n- `.claude/skills/*.md`, `.claude/agents/*/Agent.md` + `skills.md`, `DOCS/*.md`, `PO/*.md`, `Reports/*.md`.\n- Markdown only for documents; code files are indexed for path + language + git status.\n\n## Parsing\n- YAML front-matter → structured fields; `## Section` blocks → addressable sections.\n- First non-heading line → summary; `**Trigger:**` lines → skill triggers.\n\n## Embeddings & ranking\n- Document summaries are embedded for semantic search; results rank by relevance then recency.\n\n## Stale-index refresh\n- Write-through re-indexes on every UI edit; the watcher re-indexes external edits.\n- A full `indexWorkspace()` reconciles everything on demand / on workspace load.\n"],[".claude/CLAUDE.md",(b=Object.entries(a.stack).map(([a,b])=>`- **${a}**: ${b}`).join("\n")||"- _(declare the stack)_",`# ${a.company} — Operating Manual
|
|
216
|
+
|
|
217
|
+
## Mission
|
|
218
|
+
${a.mission||"_Define the mission._"}
|
|
219
|
+
|
|
220
|
+
## Objective
|
|
221
|
+
${a.objective||"_Define the objective._"}
|
|
222
|
+
|
|
223
|
+
## Stack
|
|
224
|
+
${b}
|
|
225
|
+
|
|
226
|
+
## How this workspace works
|
|
227
|
+
Agents read their persona from \`.claude/agents/<handle>/\`. Skills live in \`.claude/skills/\`.
|
|
228
|
+
Plan before building; every change passes a security review before merge. All file work is
|
|
229
|
+
restricted to this organization's workspace directory.
|
|
230
|
+
`)],[".claude/settings.json",JSON.stringify({permissions:{defaultMode:"acceptEdits",allow:["Read","Edit","Write","Bash"],deny:[],additionalDirectories:[]},note:"Agents are jailed to this workspace (cwd). Do not add additionalDirectories outside it."},null,2)+"\n"]];for(let b of D){let c=`.claude/agents/${b.handle}`;g.push([`${c}/Agent.md`,`---
|
|
231
|
+
handle: ${b.handle}
|
|
232
|
+
name: ${b.name}
|
|
233
|
+
role: ${b.role}
|
|
234
|
+
reportsTo: ${b.reportsTo??"null"}
|
|
235
|
+
provider: ${b.provider}
|
|
236
|
+
model: ${b.model}
|
|
237
|
+
temperature: ${b.temperature}
|
|
238
|
+
dailyCapUsd: ${b.dailyCapUsd}
|
|
239
|
+
tierFloor: ${b.tier}
|
|
240
|
+
---
|
|
241
|
+
# ${b.name} — ${b.role}
|
|
242
|
+
|
|
243
|
+
**Identity:** ${b.identity}
|
|
244
|
+
|
|
245
|
+
**Ritual:** ${b.ritual}
|
|
246
|
+
|
|
247
|
+
## Responsibilities
|
|
248
|
+
- Own the ${b.role} function for ${a.company}; deliver outcomes, not busywork.
|
|
249
|
+
- Follow the rituals above every working cycle.
|
|
250
|
+
|
|
251
|
+
## Communication style
|
|
252
|
+
- Concise and direct. Lead with the decision or result, then the reasoning.
|
|
253
|
+
|
|
254
|
+
## Behavior
|
|
255
|
+
${(0,C.T)(b.temperature)}
|
|
256
|
+
|
|
257
|
+
## Decision-making rules
|
|
258
|
+
- Optimise for the company objective: "${a.objective||"ship value"}".
|
|
259
|
+
- Prefer the smallest change that works; escalate when blocked${b.reportsTo?` to @${b.reportsTo}`:""}.
|
|
260
|
+
|
|
261
|
+
## Execution rules
|
|
262
|
+
- Work one item at a time to completion. Stop at the daily budget cap ($${b.dailyCapUsd}).
|
|
263
|
+
- Use the skills listed in \`skills.md\`; use only the tools listed in \`tools.md\`.
|
|
264
|
+
|
|
265
|
+
## Workspace boundaries
|
|
266
|
+
- All file operations are restricted to this organization's workspace directory.
|
|
267
|
+
- Never read, write or delete anything outside it.
|
|
268
|
+
|
|
269
|
+
## Working with the Code module
|
|
270
|
+
- Read context from the workspace before editing; make small, reviewable diffs.
|
|
271
|
+
- Edit and create files directly on disk (the directory is the source of truth).
|
|
272
|
+
|
|
273
|
+
## Collaboration
|
|
274
|
+
- Coordinate via the team room / DMs; hand off across roles per \`.claude/routing.md\`.
|
|
275
|
+
|
|
276
|
+
## Allowed
|
|
277
|
+
- Read, create, edit, delete and search files **inside this workspace**.
|
|
278
|
+
|
|
279
|
+
## Not allowed
|
|
280
|
+
- Touch any path outside the workspace; inline secrets; exceed the budget cap.
|
|
281
|
+
|
|
282
|
+
## System prompt
|
|
283
|
+
You are ${b.name}, the ${b.role} of ${a.company}. ${b.identity} Ritual: ${b.ritual} Always
|
|
284
|
+
follow the skill procedures, stay within this workspace directory, and stop at your budget ceiling.
|
|
285
|
+
`]),g.push([`${c}/pulse.md`,`# Pulse — ${b.name}
|
|
286
|
+
|
|
287
|
+
intervalSec: 30
|
|
288
|
+
maxMissed: 2
|
|
289
|
+
wakeOn:
|
|
290
|
+
- queued_task
|
|
291
|
+
- mention
|
|
292
|
+
healthCheck: 1-token ping to ${b.provider} (${b.model})
|
|
293
|
+
|
|
294
|
+
## Liveness checks
|
|
295
|
+
- **Alive:** a pulse was recorded within \`intervalSec * maxMissed\`.
|
|
296
|
+
- **Functional:** the agent's executor (CLI/provider) responds to the health ping.
|
|
297
|
+
- **Blocked:** the agent has work but cannot proceed (budget, dependency, error).
|
|
298
|
+
|
|
299
|
+
## Wake / recover
|
|
300
|
+
- The sweep wakes a stale agent when it has a \`queued_task\` or is \`@mentioned\`.
|
|
301
|
+
- On repeated failure, mark **down**, log to \`Reports/error-report.md\`, and recover on the next healthy ping.
|
|
302
|
+
|
|
303
|
+
## Status values
|
|
304
|
+
\`idle\` \xb7 \`working\` \xb7 \`review\` \xb7 \`blocked\` (status) — \`alive\` \xb7 \`stale\` \xb7 \`down\` (health).
|
|
305
|
+
|
|
306
|
+
## Reporting
|
|
307
|
+
- Each sweep writes \`Reports/agent-status.md\` and \`Reports/system-health.md\`.
|
|
308
|
+
- Errors are appended to \`Reports/error-report.md\`.
|
|
309
|
+
`]),g.push([`${c}/tools.md`,function(a){let b="CyberSec"===a.role?["secret-scan","review.signoff","fs.read"]:"DevOps"===a.role?["run-suite","deploy.preview","telegram-notify"]:"Backend"===a.role||"Frontend"===a.role?["fs.read","fs.write","run-suite","open-pr"]:"QA"===a.role?["run-suite","review.gate"]:"Docs"===a.role?["fs.read","fs.write"]:"Knowledge"===a.role?["fs.read","rag.reindex","rag.index-chat","embed.health"]:["core.delegate","core.approve"];return`# Tools — ${a.name}
|
|
310
|
+
|
|
311
|
+
Provider: ${a.provider} \xb7 Model: ${a.model}
|
|
312
|
+
|
|
313
|
+
| Tool | Purpose | Allowed | Forbidden |
|
|
314
|
+
|---|---|---|---|
|
|
315
|
+
${b.map(a=>`| \`${a}\` | ${a.includes("fs")?"Workspace file access":a.includes("run")?"Run the test suite":a.includes("deploy")?"Preview deploy":a.includes("review")?"Review / sign-off":"Core action"} | inside this workspace | any path outside the workspace |`).join("\n")}
|
|
316
|
+
|
|
317
|
+
## File access rules
|
|
318
|
+
- All file operations are restricted to this organization's workspace (cwd-jailed).
|
|
319
|
+
- Reads/edits/writes auto-accept **inside** the workspace; nothing outside is reachable.
|
|
320
|
+
|
|
321
|
+
## Execution limits & safety
|
|
322
|
+
- Stop at the daily budget cap ($${a.dailyCapUsd}). Never inline or echo secrets.
|
|
323
|
+
- Use a tool only when its purpose matches the task; otherwise skip it.
|
|
324
|
+
`}(b)]),g.push([`${c}/skills.md`,function(a){var b;let c=[...new Set([...F,..."DevOps"===(b=a.role)?["telegram-notify"]:"Backend"===b||"DevOps"===b?["gguf-validate"]:[]])];return`# Skills — ${a.name}
|
|
325
|
+
|
|
326
|
+
Assigned procedures. Each links to a real file in \`../../skills/\`.
|
|
327
|
+
|
|
328
|
+
${c.map(a=>{let b=E.find(b=>b.name===a);return`## \`${a}\`
|
|
329
|
+
- **File:** \`.claude/skills/${a}.md\`
|
|
330
|
+
- **Use when:** ${b?.trigger??"as appropriate"}
|
|
331
|
+
- **Summary:** ${b?.summary??""}`}).join("\n\n")}
|
|
332
|
+
|
|
333
|
+
## Rituals
|
|
334
|
+
${a.ritual}
|
|
335
|
+
`}(b)])}for(let a of E)g.push([`.claude/skills/${a.name}.md`,`# Skill — ${a.name}
|
|
336
|
+
|
|
337
|
+
**Trigger:** ${a.trigger}
|
|
338
|
+
|
|
339
|
+
${a.summary}
|
|
340
|
+
|
|
341
|
+
## When to use
|
|
342
|
+
${a.trigger}.
|
|
343
|
+
|
|
344
|
+
## When NOT to use
|
|
345
|
+
- When the trigger condition is absent, or a more specific skill applies.
|
|
346
|
+
|
|
347
|
+
## Required context & inputs
|
|
348
|
+
- Read the relevant workspace files first; gather the inputs each step needs.
|
|
349
|
+
|
|
350
|
+
## Procedure
|
|
351
|
+
${a.steps.map((a,b)=>`${b+1}. ${a}`).join("\n")}
|
|
352
|
+
|
|
353
|
+
## Output format
|
|
354
|
+
- A concise result plus any files created/edited (paths relative to the workspace).
|
|
355
|
+
|
|
356
|
+
## Quality & validation rules
|
|
357
|
+
- Verify each step succeeded before the next; never report success on a failed step.
|
|
358
|
+
|
|
359
|
+
## Failure handling
|
|
360
|
+
- Stop, record what failed and why, and surface it (inbox / \`Reports/error-report.md\`).
|
|
361
|
+
|
|
362
|
+
## Related
|
|
363
|
+
- Files: this workspace. Agents: whoever owns the matching role in \`.claude/routing.md\`.
|
|
364
|
+
`]);return g.push(...(c=a.stack,[["DOCS/architecture.md",G("Architecture",`Runtime: ${c.runtime??"Node.js"} \xb7 Frontend: ${c.frontend??"React"} \xb7 Backend: ${c.backend??"—"}
|
|
365
|
+
Database: ${c.database??"SQLite"} \xb7 ORM: ${c.orm??"Drizzle"}
|
|
366
|
+
|
|
367
|
+
## Overview
|
|
368
|
+
${a.company} is built to: ${a.mission||"deliver value"}.
|
|
369
|
+
|
|
370
|
+
## Layout
|
|
371
|
+
- server/ API + scheduler
|
|
372
|
+
- ui/ dashboard
|
|
373
|
+
- packages/ shared + adapters
|
|
374
|
+
|
|
375
|
+
## Key decisions
|
|
376
|
+
- The workspace directory is the source of truth; the DB indexes it.`)],["DOCS/api.md",G("API",`## Conventions
|
|
377
|
+
- REST/RPC endpoints are documented here as they are built.
|
|
378
|
+
- Request/response shapes, auth, and error codes go in this file.
|
|
379
|
+
|
|
380
|
+
## Endpoints
|
|
381
|
+
_(none yet — agents document endpoints here as they ship.)_`)],["DOCS/database.md",G("Database",`Engine: ${c.database??"SQLite"} \xb7 ORM: ${c.orm??"Drizzle"}
|
|
382
|
+
|
|
383
|
+
## Schema
|
|
384
|
+
_(document tables, columns and relationships here as the data layer is built.)_
|
|
385
|
+
|
|
386
|
+
## Migrations
|
|
387
|
+
- Never wipe to apply changes; use surgical, additive migrations.`)],["DOCS/code-standards.md",G("Code standards",`- Match the surrounding code's style, naming and idioms.
|
|
388
|
+
- Small, reviewable diffs; typecheck before every PR.
|
|
389
|
+
- Every change passes a security review before merge.
|
|
390
|
+
- No plaintext secrets; reference the vault.`)],["DOCS/onboarding.md",G("Onboarding",`Welcome to ${a.company}.
|
|
391
|
+
|
|
392
|
+
## First steps
|
|
393
|
+
1. Read \`.claude/CLAUDE.md\` (the operating manual).
|
|
394
|
+
2. Skim \`DOCS/architecture.md\` and \`PO/roadmap.md\`.
|
|
395
|
+
3. Pull a task from the board and follow your agent ritual.`)],["DOCS/system-operation.md",G("System operation guide",`## Runtime modes
|
|
396
|
+
- start (local) \xb7 auth \xb7 vps \xb7 portable.
|
|
397
|
+
|
|
398
|
+
## Pulse
|
|
399
|
+
- Agents are health-checked on an interval; status lands in \`Reports/\`.
|
|
400
|
+
|
|
401
|
+
## Budgets
|
|
402
|
+
- Each agent has a daily cap; the system stops it at the ceiling.`)],["DOCS/workspace-structure.md",G("Workspace structure guide",`See \`.claude/workspace.md\` for the authoritative structure. This workspace lives at
|
|
403
|
+
\`~/.constella/organizations/${a.orgId}/workspace/\` and is isolated from every other org.`)]]),["PO/roadmap.md",G("Roadmap",`## Now
|
|
404
|
+
- Ship ${a.company} v0.1 — ${a.objective||"first release"}.
|
|
405
|
+
|
|
406
|
+
## Next
|
|
407
|
+
- Harden, document, and gather feedback.
|
|
408
|
+
|
|
409
|
+
## Later
|
|
410
|
+
- Scale and expand per the mission: ${a.mission||"—"}.`)],["PO/backlog.md",G("Backlog (MoSCoW)",`- [Must] Ship ${a.company} v0.1
|
|
411
|
+
- [Must] Pass the security gate
|
|
412
|
+
- [Should] Portable build
|
|
413
|
+
- [Could] Self-update with rollback
|
|
414
|
+
- [Won't] (track out-of-scope items here)`)],["PO/sprint-plan.md",G("Sprint plan",`## Sprint 1 — goal
|
|
415
|
+
Stand up the foundation of ${a.company}.
|
|
416
|
+
|
|
417
|
+
## Committed
|
|
418
|
+
_(the Product Owner pulls Must items here and assigns owners.)_`)],["PO/user-stories.md",G("User stories",`- As an operator, I can create an organization and get a working workspace immediately.
|
|
419
|
+
- As an operator, I can watch agents do real work inside my workspace.
|
|
420
|
+
- _(add stories as the product takes shape.)_`)],["PO/requirements.md",G("Requirements",`## Functional
|
|
421
|
+
- The directory is the source of truth; the DB indexes it.
|
|
422
|
+
- Agents and the editor are isolated to the active workspace.
|
|
423
|
+
|
|
424
|
+
## Non-functional
|
|
425
|
+
- No fabricated data; honest empty states; budget ceilings respected.`)],["PO/priorities.md",G("Priorities",`1. Correctness & isolation
|
|
426
|
+
2. Real, working features (no fakes)
|
|
427
|
+
3. Developer/operator clarity
|
|
428
|
+
4. Polish`)],["PO/acceptance-criteria.md",G("Acceptance criteria",`- A new workspace is never empty and passes validation.
|
|
429
|
+
- Editing a doc in the UI writes it to disk and re-indexes.
|
|
430
|
+
- Agents cannot touch anything outside the workspace.`)],["PO/status.md",G("Execution status","_(the Product Owner updates delivery status here each cycle.)_")],...(d=a.createdAt??"(creation)",[["Reports/agent-status.md",G("Agent status",`_Snapshot at scaffold; refreshed by the pulse sweep._
|
|
431
|
+
|
|
432
|
+
| Agent | Status | Health | Last pulse |
|
|
433
|
+
|---|---|---|---|
|
|
434
|
+
${D.map(a=>`| @${a.handle} | idle | alive | ${d} |`).join("\n")}`)],["Reports/system-health.md",G("System health",`_Snapshot at scaffold; refreshed by the pulse sweep._
|
|
435
|
+
|
|
436
|
+
- Status: awaiting first pulse sweep
|
|
437
|
+
- Agents: ${D.length}
|
|
438
|
+
- Created: ${d}`)],["Reports/pulse-history.md",G("Pulse history",`_Append-only log of pulse sweeps._
|
|
439
|
+
|
|
440
|
+
- ${d} — workspace bootstrapped.`)],["Reports/daily-report.md",G("Daily report",`_Template — an agent fills this each day._
|
|
441
|
+
|
|
442
|
+
## Wins
|
|
443
|
+
## Blockers
|
|
444
|
+
## Next`)],["Reports/weekly-report.md",G("Weekly report",`_Template — filled each week._
|
|
445
|
+
|
|
446
|
+
## Shipped
|
|
447
|
+
## Metrics
|
|
448
|
+
## Next week`)],["Reports/error-report.md",G("Error report","_Append-only log of failures and recoveries._")],["Reports/task-execution.md",G("Task execution report","_Append-only log of task runs (agent, task, result, cost)._")]])),g.push(["specs/README.md",G("Specs","The CEO Planner writes detailed specs here, then breaks them into issues.")]),g.push(["issues/README.md",G("Issues","Approved issues the agents implement (1–999).")]),a.preserveReadme||g.push(["README.md",function(a){let b,c,d,g,l,m,n,o,{company:p,mission:q,objective:r,stack:s}=a,t=function(a){let b=0;for(let c=0;c<a.length;c++)b=31*b+a.charCodeAt(c)>>>0;return h[b%h.length]}(p),u=(b=s.runtime||"",c=s.language||"","Bun"===b?{install:"bun install",dev:"bun run dev",build:"bun run build",test:"bun test"}:"Deno"===b?{install:"deno install",dev:"deno task dev",build:"deno task build",test:"deno test"}:/Python/.test(b)||"Python"===c?{install:"pip install -r requirements.txt",dev:"python main.py",build:"python -m build",test:"pytest"}:"Go"===c?{install:"go mod download",dev:"go run .",build:"go build ./...",test:"go test ./..."}:"Rust"===c?{install:"cargo build",dev:"cargo run",build:"cargo build --release",test:"cargo test"}:{install:"npm install",dev:"npm run dev",build:"npm run build",test:"npm test"}),v=k(s),w=`https://capsule-render.vercel.app/api?type=waving&height=200&color=0:${t.c1},100:${t.c2}&text=${encodeURIComponent(p)}&fontColor=ffffff&fontSize=64&fontAlignY=38&desc=${encodeURIComponent((q||"").slice(0,90))}&descAlignY=58&descSize=16&descColor=ffffff`,x=["language","runtime","meta","frontend","backend","mobile","database","orm","styling","container"].map(a=>s[a]).filter(a=>!!a&&"None"!==a).filter((a,b,c)=>c.indexOf(a)===b).slice(0,8).map(j).join("\n");return`<div align="center">
|
|
449
|
+
|
|
450
|
+
<img src="${w}" alt="${p}" />
|
|
451
|
+
|
|
452
|
+
# ${p}
|
|
453
|
+
|
|
454
|
+
**${(q||`${p} — built with Constella.`).trim()}**
|
|
455
|
+
|
|
456
|
+
${x}
|
|
457
|
+

|
|
458
|
+

|
|
459
|
+
|
|
460
|
+
</div>
|
|
461
|
+
|
|
462
|
+
---
|
|
463
|
+
|
|
464
|
+
## 📑 Table of Contents
|
|
465
|
+
|
|
466
|
+
- [About](#-about)
|
|
467
|
+
- [Tech Stack](#-tech-stack)
|
|
468
|
+
- [Architecture](#-architecture)
|
|
469
|
+
- [Getting Started](#-getting-started)
|
|
470
|
+
- [Usage](#-usage)
|
|
471
|
+
- [Configuration](#-configuration)
|
|
472
|
+
- [Commands](#-commands)
|
|
473
|
+
- [Project Structure](#-project-structure)
|
|
474
|
+
- [Roadmap](#-roadmap)
|
|
475
|
+
- [Contributing](#-contributing)
|
|
476
|
+
- [License](#-license)
|
|
477
|
+
|
|
478
|
+
---
|
|
479
|
+
|
|
480
|
+
## 🎯 About
|
|
481
|
+
|
|
482
|
+
> ${(q||"Mission to be defined.").trim()}
|
|
483
|
+
|
|
484
|
+
${r?`**Objective —** ${r.trim()}
|
|
485
|
+
`:""}
|
|
486
|
+
This repository is operated by an autonomous AI team (a CEO plus specialists) scaffolded with **[Constella](#)**. The working directory is the source of truth.
|
|
487
|
+
|
|
488
|
+
---
|
|
489
|
+
|
|
490
|
+
## 🧩 Tech Stack
|
|
491
|
+
|
|
492
|
+
${v.length?(d=k(s).map(([a,b])=>{let c,d=(c=e[b])?`https://cdn.jsdelivr.net/gh/devicons/devicon/icons/${c.slug}/${c.slug}-${c.variant??"original"}.svg`:null,g=d?`<img src="${d}" width="18" height="18" align="center" /> `:"";return`| **${f[a]??a}** | ${g}${b} |`}),`| Layer | Technology |
|
|
493
|
+
| :-- | :-- |
|
|
494
|
+
${d.join("\n")}`):"_No stack selected yet._"}
|
|
495
|
+
|
|
496
|
+
---
|
|
497
|
+
|
|
498
|
+
## 🏗️ Architecture
|
|
499
|
+
|
|
500
|
+
${g=s.frontend||s.mobile||"—",l=s.meta&&"None"!==s.meta?` \xb7 ${s.meta}`:"",m=s.backend&&"None"!==s.backend?s.backend:s.runtime||"—",n=s.database||"—",o=s.orm&&"None"!==s.orm?` (${s.orm})`:"",["```\n┌──────────────────────────────────────────────────────────┐",`│ CLIENT ${g}${l}`.padEnd(59)+"│","├──────────────────────────────────────────────────────────┤",`│ SERVER ${m} \xb7 runtime: ${s.runtime||"—"}`.padEnd(59)+"│","├──────────────────────────────────────────────────────────┤",`│ DATA ${n}${o}`.padEnd(59)+"│","└──────────────────────────────────────────────────────────┘\n```"].join("\n")}
|
|
501
|
+
|
|
502
|
+
---
|
|
503
|
+
|
|
504
|
+
## 🚀 Getting Started
|
|
505
|
+
|
|
506
|
+
> **Prerequisites:** ${s.runtime||s.language||"the project runtime"}${s.container&&"None"!==s.container?` \xb7 ${s.container} (optional)`:""}
|
|
507
|
+
|
|
508
|
+
\`\`\`bash
|
|
509
|
+
# 1. Clone
|
|
510
|
+
git clone <your-repo-url>
|
|
511
|
+
cd ${a.slug||i(p)||"project"}
|
|
512
|
+
|
|
513
|
+
# 2. Install dependencies
|
|
514
|
+
${u.install}
|
|
515
|
+
|
|
516
|
+
# 3. Configure environment
|
|
517
|
+
cp .env.example .env # then fill in the values below
|
|
518
|
+
|
|
519
|
+
# 4. Run the dev server
|
|
520
|
+
${u.dev}
|
|
521
|
+
\`\`\`
|
|
522
|
+
|
|
523
|
+
---
|
|
524
|
+
|
|
525
|
+
## 💡 Usage
|
|
526
|
+
|
|
527
|
+
After \`${u.dev}\`, open the app and follow the in-product flow. See [\`DOCS/\`](./DOCS) for module-level guides and [\`PO/roadmap.md\`](./PO/roadmap.md) for what's planned.
|
|
528
|
+
|
|
529
|
+
---
|
|
530
|
+
|
|
531
|
+
## ⚙️ Configuration
|
|
532
|
+
|
|
533
|
+
Environment variables live in \`.env\` (never commit it — secrets belong in the vault).
|
|
534
|
+
|
|
535
|
+
| Variable | Description | Required |
|
|
536
|
+
| :-- | :-- | :--: |
|
|
537
|
+
| \`NODE_ENV\` | \`development\` / \`production\` | ✅ |
|
|
538
|
+
${s.database&&"None"!==s.database?`| \`DATABASE_URL\` | ${s.database} connection string | ✅ |
|
|
539
|
+
`:""}| \`PORT\` | Port the server listens on | ⬜ |
|
|
540
|
+
|
|
541
|
+
> 🔒 Never hard-code API keys, tokens or passwords. A pre-commit secret scan blocks any commit that contains them.
|
|
542
|
+
|
|
543
|
+
---
|
|
544
|
+
|
|
545
|
+
## 🛠️ Commands
|
|
546
|
+
|
|
547
|
+
| Command | What it does |
|
|
548
|
+
| :-- | :-- |
|
|
549
|
+
| \`${u.dev}\` | Start the dev server |
|
|
550
|
+
| \`${u.build}\` | Production build |
|
|
551
|
+
| \`${u.test}\` | Run the test suite |
|
|
552
|
+
|
|
553
|
+
---
|
|
554
|
+
|
|
555
|
+
## 📁 Project Structure
|
|
556
|
+
|
|
557
|
+
\`\`\`
|
|
558
|
+
${a.slug||i(p)||"project"}/
|
|
559
|
+
├── .claude/ # agent personas, skills, operating manual (the brain)
|
|
560
|
+
├── DOCS/ # architecture, API, database, standards
|
|
561
|
+
├── PO/ # roadmap, backlog, sprint plan, requirements
|
|
562
|
+
├── specs/ # detailed specs written by the CEO planner
|
|
563
|
+
├── issues/ # approved issues the agents implement
|
|
564
|
+
├── Reports/ # status, health, pulse, daily/weekly reports
|
|
565
|
+
└── README.md # this file
|
|
566
|
+
\`\`\`
|
|
567
|
+
|
|
568
|
+
---
|
|
569
|
+
|
|
570
|
+
## 🗺️ Roadmap
|
|
571
|
+
|
|
572
|
+
- [x] Project scaffolded & team assembled
|
|
573
|
+
- [ ] Core feature set (see [\`PO/roadmap.md\`](./PO/roadmap.md))
|
|
574
|
+
- [ ] Tests green & CI wired
|
|
575
|
+
- [ ] First release
|
|
576
|
+
|
|
577
|
+

|
|
578
|
+
|
|
579
|
+
---
|
|
580
|
+
|
|
581
|
+
## 🤝 Contributing
|
|
582
|
+
|
|
583
|
+
Contributions are welcome. Read [\`DOCS/code-standards.md\`](./DOCS/code-standards.md) first, branch from \`main\`, keep PRs small with a clear test plan, and ensure \`${u.test}\` passes before requesting review.
|
|
584
|
+
|
|
585
|
+
---
|
|
586
|
+
|
|
587
|
+
## 📄 License
|
|
588
|
+
|
|
589
|
+
Released under the **MIT License** — see [\`LICENSE\`](./LICENSE).
|
|
590
|
+
|
|
591
|
+
<div align="center">
|
|
592
|
+
<sub>Scaffolded & maintained by an autonomous AI team \xb7 🤖 <a href="#">Constella</a></sub>
|
|
593
|
+
</div>
|
|
594
|
+
`}({company:a.company,mission:a.mission,objective:a.objective,stack:a.stack,slug:a.slug})]),g}let I=/^(\.claude\/organization\.md|\.claude\/CLAUDE\.md|README\.md|DOCS\/architecture\.md|DOCS\/onboarding\.md|PO\/roadmap\.md|\.claude\/agents\/[^/]+\/Agent\.md)$/;function J(a){let b=[];for(let[c,e]of H(a))I.test(c)&&((0,d.dx)(a.orgId,c,e),b.push(c));return b}function K(a){let b=[];for(let[c,e]of H(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(...L(a).written),b}function L(a){let b=[];try{var c;let{id:e,files:f}=(c={company:a.company,mission:a.mission,objective:a.objective,slug:a.slug,stack:a.stack},{id:B(c.stack),files:function(a){var b,c;let d=B(a.stack);switch(d){case"next":return function(a){let{obj:b,chips:c}=x(a),d=`export default function Home() {
|
|
595
|
+
return (
|
|
596
|
+
<main className="card">
|
|
597
|
+
<span className="badge">● Live starter</span>
|
|
598
|
+
<h1>${JSON.stringify(a.company).slice(1,-1)}</h1>
|
|
599
|
+
<p className="mission">${JSON.stringify(a.mission||"Your project, scaffolded and running.").slice(1,-1)}</p>
|
|
600
|
+
<div className="build">Your AI team is building <b>${JSON.stringify(b).slice(1,-1)}</b> on top of this starter.</div>
|
|
601
|
+
${c?`<div className="chips">${JSON.stringify(c).slice(1,-1)}</div>`:""}
|
|
602
|
+
<div className="foot">Runnable starter scaffolded by Constella — edit app/page.tsx to build the product.</div>
|
|
603
|
+
</main>
|
|
604
|
+
);
|
|
605
|
+
}
|
|
606
|
+
`;return[["package.json",v(a.slug,{scripts:{dev:"next dev",build:"next build",start:"next start"},dependencies:{next:"^14.2.5",react:"^18.3.1","react-dom":"^18.3.1"},devDependencies:{typescript:"^5.5.4","@types/react":"^18.3.3","@types/node":"^20.14.0"}})],["next.config.mjs",`/** @type {import('next').NextConfig} */
|
|
607
|
+
export default { reactStrictMode: true };
|
|
608
|
+
`],["tsconfig.json",JSON.stringify({compilerOptions:{target:"ES2021",lib:["dom","dom.iterable","esnext"],jsx:"preserve",module:"esnext",moduleResolution:"bundler",strict:!1,skipLibCheck:!0,esModuleInterop:!0,plugins:[{name:"next"}],incremental:!0},include:["next-env.d.ts","**/*.ts","**/*.tsx"],exclude:["node_modules"]},null,2)+"\n"],["next-env.d.ts",`/// <reference types="next" />
|
|
609
|
+
/// <reference types="next/image-types/global" />
|
|
610
|
+
`],["app/layout.tsx",`import "./globals.css";
|
|
611
|
+
export const metadata = { title: ${JSON.stringify(a.company)} };
|
|
612
|
+
export default function RootLayout({ children }: { children: React.ReactNode }) {
|
|
613
|
+
return (<html lang="en"><body>{children}</body></html>);
|
|
614
|
+
}
|
|
615
|
+
`],["app/page.tsx",d],["app/globals.css",y(a)],[".gitignore",q],[".env.example",u]]}(a);case"vite-react":return function(a){let{p:b,obj:c,chips:d}=x(a),e=`: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}`,f=`export default function App() {
|
|
616
|
+
return (
|
|
617
|
+
<div className="card">
|
|
618
|
+
<span className="badge">● Live starter</span>
|
|
619
|
+
<h1>${JSON.stringify(a.company).slice(1,-1)}</h1>
|
|
620
|
+
<p className="mission">${JSON.stringify(a.mission||"Your project, scaffolded and running.").slice(1,-1)}</p>
|
|
621
|
+
<div className="build">Your AI team is building <b>${JSON.stringify(c).slice(1,-1)}</b> on top of this starter.</div>
|
|
622
|
+
${d?`<div className="chips">${JSON.stringify(d).slice(1,-1)}</div>`:""}
|
|
623
|
+
<div className="foot">Runnable starter scaffolded by Constella — edit src/App.tsx to build the product.</div>
|
|
624
|
+
</div>
|
|
625
|
+
);
|
|
626
|
+
}
|
|
627
|
+
`;return[["package.json",v(a.slug,{scripts:{dev:"vite",build:"vite build",preview:"vite preview"},dependencies:{react:"^18.3.1","react-dom":"^18.3.1"},devDependencies:{vite:"^5.4.0","@vitejs/plugin-react":"^4.3.1",typescript:"^5.5.4","@types/react":"^18.3.3","@types/react-dom":"^18.3.0"}})],["vite.config.ts",`import { defineConfig } from "vite";
|
|
628
|
+
import react from "@vitejs/plugin-react";
|
|
629
|
+
export default defineConfig({ plugins: [react()], server: { host: "127.0.0.1", port: Number(process.env.PORT) || 5173, strictPort: false } });
|
|
630
|
+
`],["index.html",`<!doctype html>
|
|
631
|
+
<html lang="en"><head><meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" /><title>${n(a.company)}</title></head>
|
|
632
|
+
<body><div id="root"></div><script type="module" src="/src/main.tsx"></script></body></html>
|
|
633
|
+
`],["src/main.tsx",`import React from "react";
|
|
634
|
+
import { createRoot } from "react-dom/client";
|
|
635
|
+
import App from "./App";
|
|
636
|
+
import "./index.css";
|
|
637
|
+
createRoot(document.getElementById("root")!).render(<React.StrictMode><App /></React.StrictMode>);
|
|
638
|
+
`],["src/App.tsx",f],["src/index.css",e+"\n"],["tsconfig.json",JSON.stringify({compilerOptions:{target:"ES2021",lib:["ES2021","DOM","DOM.Iterable"],jsx:"react-jsx",module:"ESNext",moduleResolution:"bundler",strict:!1,skipLibCheck:!0,esModuleInterop:!0},include:["src"]},null,2)+"\n"],[".gitignore",q],[".env.example",u]]}(a);case"vite-vue":return function(a){let{obj:b,chips:c}=x(a),d=`<template>
|
|
639
|
+
<div class="card">
|
|
640
|
+
<span class="badge">● Live starter</span>
|
|
641
|
+
<h1>{{ company }}</h1>
|
|
642
|
+
<p class="mission">{{ mission }}</p>
|
|
643
|
+
<div class="build">Your AI team is building <b>{{ objective }}</b> on top of this starter.</div>
|
|
644
|
+
<div v-if="chips" class="chips">{{ chips }}</div>
|
|
645
|
+
<div class="foot">Runnable starter scaffolded by Constella — edit src/App.vue to build the product.</div>
|
|
646
|
+
</div>
|
|
647
|
+
</template>
|
|
648
|
+
<script setup>
|
|
649
|
+
const company = ${JSON.stringify(a.company)};
|
|
650
|
+
const mission = ${JSON.stringify(a.mission||"Your project, scaffolded and running.")};
|
|
651
|
+
const objective = ${JSON.stringify(b)};
|
|
652
|
+
const chips = ${JSON.stringify(c)};
|
|
653
|
+
</script>
|
|
654
|
+
`;return[["package.json",v(a.slug,{scripts:{dev:"vite",build:"vite build",preview:"vite preview"},dependencies:{vue:"^3.4.38"},devDependencies:{vite:"^5.4.0","@vitejs/plugin-vue":"^5.1.2"}})],["vite.config.js",`import { defineConfig } from "vite";
|
|
655
|
+
import vue from "@vitejs/plugin-vue";
|
|
656
|
+
export default defineConfig({ plugins: [vue()], server: { host: "127.0.0.1", port: Number(process.env.PORT) || 5173, strictPort: false } });
|
|
657
|
+
`],["index.html",`<!doctype html>
|
|
658
|
+
<html lang="en"><head><meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" /><title>${n(a.company)}</title></head>
|
|
659
|
+
<body><div id="app"></div><script type="module" src="/src/main.js"></script></body></html>
|
|
660
|
+
`],["src/main.js",`import { createApp } from "vue";
|
|
661
|
+
import App from "./App.vue";
|
|
662
|
+
import "./index.css";
|
|
663
|
+
createApp(App).mount("#app");
|
|
664
|
+
`],["src/App.vue",d],["src/index.css",y(a)],[".gitignore",q],[".env.example",u]]}(a);case"vite-svelte":return function(a){let{obj:b,chips:c}=x(a),d=`<script>
|
|
665
|
+
const company = ${JSON.stringify(a.company)};
|
|
666
|
+
const mission = ${JSON.stringify(a.mission||"Your project, scaffolded and running.")};
|
|
667
|
+
const objective = ${JSON.stringify(b)};
|
|
668
|
+
const chips = ${JSON.stringify(c)};
|
|
669
|
+
</script>
|
|
670
|
+
<div class="card">
|
|
671
|
+
<span class="badge">● Live starter</span>
|
|
672
|
+
<h1>{company}</h1>
|
|
673
|
+
<p class="mission">{mission}</p>
|
|
674
|
+
<div class="build">Your AI team is building <b>{objective}</b> on top of this starter.</div>
|
|
675
|
+
{#if chips}<div class="chips">{chips}</div>{/if}
|
|
676
|
+
<div class="foot">Runnable starter scaffolded by Constella — edit src/App.svelte to build the product.</div>
|
|
677
|
+
</div>
|
|
678
|
+
`;return[["package.json",v(a.slug,{scripts:{dev:"vite",build:"vite build",preview:"vite preview"},dependencies:{},devDependencies:{vite:"^5.4.0",svelte:"^4.2.19","@sveltejs/vite-plugin-svelte":"^3.1.1"}})],["vite.config.js",`import { defineConfig } from "vite";
|
|
679
|
+
import { svelte } from "@sveltejs/vite-plugin-svelte";
|
|
680
|
+
export default defineConfig({ plugins: [svelte()], server: { host: "127.0.0.1", port: Number(process.env.PORT) || 5173, strictPort: false } });
|
|
681
|
+
`],["svelte.config.js",`import { vitePreprocess } from "@sveltejs/vite-plugin-svelte";
|
|
682
|
+
export default { preprocess: vitePreprocess() };
|
|
683
|
+
`],["index.html",`<!doctype html>
|
|
684
|
+
<html lang="en"><head><meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" /><title>${n(a.company)}</title></head>
|
|
685
|
+
<body><div id="app"></div><script type="module" src="/src/main.js"></script></body></html>
|
|
686
|
+
`],["src/main.js",`import App from "./App.svelte";
|
|
687
|
+
import "./index.css";
|
|
688
|
+
const app = new App({ target: document.getElementById("app") });
|
|
689
|
+
export default app;
|
|
690
|
+
`],["src/App.svelte",d],["src/index.css",y(a)],[".gitignore",q],[".env.example",u]]}(a);case"node-express":case"node-fastify":case"node-koa":case"node-hono":return w(a,d);case"node-nest":let e,f,g;return e=JSON.stringify(p(a)),f=`import "reflect-metadata";
|
|
691
|
+
import { Controller, Get, Module, Header } from "@nestjs/common";
|
|
692
|
+
import { NestFactory } from "@nestjs/core";
|
|
693
|
+
|
|
694
|
+
const HTML = ${e};
|
|
695
|
+
|
|
696
|
+
@Controller()
|
|
697
|
+
class AppController {
|
|
698
|
+
@Get()
|
|
699
|
+
@Header("Content-Type", "text/html")
|
|
700
|
+
home(): string { return HTML; }
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
@Module({ controllers: [AppController] })
|
|
704
|
+
class AppModule {}
|
|
705
|
+
|
|
706
|
+
async function bootstrap() {
|
|
707
|
+
const app = await NestFactory.create(AppModule, { logger: ["error", "warn"] });
|
|
708
|
+
const port = Number(process.env.PORT) || 3000;
|
|
709
|
+
await app.listen(port, "127.0.0.1");
|
|
710
|
+
console.log("listening on http://127.0.0.1:" + port);
|
|
711
|
+
}
|
|
712
|
+
bootstrap();
|
|
713
|
+
`,g=JSON.stringify({compilerOptions:{module:"commonjs",target:"ES2021",experimentalDecorators:!0,emitDecoratorMetadata:!0,esModuleInterop:!0,skipLibCheck:!0,strict:!1,outDir:"dist"}},null,2)+"\n",[["package.json",v(a.slug,{scripts:{dev:"tsx watch src/main.ts",start:"tsx src/main.ts"},dependencies:{"@nestjs/common":"^10.4.1","@nestjs/core":"^10.4.1","@nestjs/platform-express":"^10.4.1","reflect-metadata":"^0.2.2",rxjs:"^7.8.1"},devDependencies:{tsx:"^4.19.2",typescript:"^5.5.4"}})],["src/main.ts",f],["tsconfig.json",g],[".gitignore",q],[".env.example",u]];case"fastapi":return[["requirements.txt","fastapi>=0.111\nuvicorn[standard]>=0.30\n"],["main.py",`from fastapi import FastAPI
|
|
714
|
+
from fastapi.responses import HTMLResponse
|
|
715
|
+
|
|
716
|
+
${z(a)}
|
|
717
|
+
app = FastAPI()
|
|
718
|
+
|
|
719
|
+
@app.get("/", response_class=HTMLResponse)
|
|
720
|
+
def home():
|
|
721
|
+
return HTML
|
|
722
|
+
`],[".gitignore",r],[".env.example",u]];case"flask":return[["requirements.txt","flask>=3.0\n"],["main.py",`import os
|
|
723
|
+
from flask import Flask
|
|
724
|
+
|
|
725
|
+
${z(a)}
|
|
726
|
+
app = Flask(__name__)
|
|
727
|
+
|
|
728
|
+
@app.get("/")
|
|
729
|
+
def home():
|
|
730
|
+
return HTML
|
|
731
|
+
|
|
732
|
+
if __name__ == "__main__":
|
|
733
|
+
port = int(os.environ.get("PORT", 5000))
|
|
734
|
+
print("listening on http://127.0.0.1:" + str(port))
|
|
735
|
+
app.run(host="127.0.0.1", port=port)
|
|
736
|
+
`],[".gitignore",r],[".env.example",u]];case"django":let h;return h="django-insecure-"+m(a.company).c2+"-starter-key-change-me",[["requirements.txt","django>=5.0\n"],["manage.py",`#!/usr/bin/env python
|
|
737
|
+
import os, sys
|
|
738
|
+
if __name__ == "__main__":
|
|
739
|
+
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings")
|
|
740
|
+
from django.core.management import execute_from_command_line
|
|
741
|
+
execute_from_command_line(sys.argv)
|
|
742
|
+
`],["config/__init__.py",""],["config/settings.py",`from pathlib import Path
|
|
743
|
+
BASE_DIR = Path(__file__).resolve().parent.parent
|
|
744
|
+
SECRET_KEY = ${JSON.stringify(h)}
|
|
745
|
+
DEBUG = True
|
|
746
|
+
ALLOWED_HOSTS = ["*"]
|
|
747
|
+
INSTALLED_APPS = ["django.contrib.contenttypes", "django.contrib.staticfiles"]
|
|
748
|
+
MIDDLEWARE = ["django.middleware.common.CommonMiddleware"]
|
|
749
|
+
ROOT_URLCONF = "config.urls"
|
|
750
|
+
TEMPLATES = [{"BACKEND": "django.template.backends.django.DjangoTemplates", "DIRS": [], "APP_DIRS": True, "OPTIONS": {}}]
|
|
751
|
+
WSGI_APPLICATION = "config.wsgi.application"
|
|
752
|
+
STATIC_URL = "static/"
|
|
753
|
+
DATABASES = {}
|
|
754
|
+
`],["config/urls.py",`from django.http import HttpResponse
|
|
755
|
+
from django.urls import path
|
|
756
|
+
|
|
757
|
+
${z(a)}
|
|
758
|
+
def home(_request):
|
|
759
|
+
return HttpResponse(HTML)
|
|
760
|
+
|
|
761
|
+
urlpatterns = [path("", home)]
|
|
762
|
+
`],["config/wsgi.py",`import os
|
|
763
|
+
from django.core.wsgi import get_wsgi_application
|
|
764
|
+
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings")
|
|
765
|
+
application = get_wsgi_application()
|
|
766
|
+
`],[".gitignore",r],[".env.example",u]];case"go-http":let i;return i=p(a),[["go.mod",`module ${a.slug||"project"}
|
|
767
|
+
|
|
768
|
+
go 1.21
|
|
769
|
+
`],["main.go",`package main
|
|
770
|
+
|
|
771
|
+
import (
|
|
772
|
+
"log"
|
|
773
|
+
"net/http"
|
|
774
|
+
"os"
|
|
775
|
+
)
|
|
776
|
+
|
|
777
|
+
const html = \`${i}\`
|
|
778
|
+
|
|
779
|
+
func main() {
|
|
780
|
+
port := os.Getenv("PORT")
|
|
781
|
+
if port == "" {
|
|
782
|
+
port = "8080"
|
|
783
|
+
}
|
|
784
|
+
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
|
|
785
|
+
w.Header().Set("Content-Type", "text/html; charset=utf-8")
|
|
786
|
+
w.Write([]byte(html))
|
|
787
|
+
})
|
|
788
|
+
log.Println("listening on http://127.0.0.1:" + port)
|
|
789
|
+
log.Fatal(http.ListenAndServe("127.0.0.1:"+port, nil))
|
|
790
|
+
}
|
|
791
|
+
`],[".gitignore",s],[".env.example",u]];case"go-gin":let j;return j=p(a),[["go.mod",`module ${a.slug||"project"}
|
|
792
|
+
|
|
793
|
+
go 1.21
|
|
794
|
+
|
|
795
|
+
require github.com/gin-gonic/gin v1.10.0
|
|
796
|
+
`],["main.go",`package main
|
|
797
|
+
|
|
798
|
+
import (
|
|
799
|
+
"net/http"
|
|
800
|
+
"os"
|
|
801
|
+
|
|
802
|
+
"github.com/gin-gonic/gin"
|
|
803
|
+
)
|
|
804
|
+
|
|
805
|
+
const html = \`${j}\`
|
|
806
|
+
|
|
807
|
+
func main() {
|
|
808
|
+
port := os.Getenv("PORT")
|
|
809
|
+
if port == "" {
|
|
810
|
+
port = "8080"
|
|
811
|
+
}
|
|
812
|
+
r := gin.Default()
|
|
813
|
+
r.GET("/", func(c *gin.Context) {
|
|
814
|
+
c.Data(http.StatusOK, "text/html; charset=utf-8", []byte(html))
|
|
815
|
+
})
|
|
816
|
+
r.Run("127.0.0.1:" + port)
|
|
817
|
+
}
|
|
818
|
+
`],[".gitignore",s],[".env.example",u]];case"rust-axum":return[["Cargo.toml",`[package]
|
|
819
|
+
name = "${(a.slug||"project").replace(/[^a-z0-9_-]/gi,"-")}"
|
|
820
|
+
version = "0.1.0"
|
|
821
|
+
edition = "2021"
|
|
822
|
+
|
|
823
|
+
[dependencies]
|
|
824
|
+
axum = "0.7"
|
|
825
|
+
tokio = { version = "1", features = ["full"] }
|
|
826
|
+
`],["src/main.rs",`use axum::{routing::get, Router, response::Html};
|
|
827
|
+
use std::env;
|
|
828
|
+
|
|
829
|
+
async fn home() -> Html<&'static str> { Html(${(b=p(a),`r#"${b}"#`)}) }
|
|
830
|
+
|
|
831
|
+
#[tokio::main]
|
|
832
|
+
async fn main() {
|
|
833
|
+
let port = env::var("PORT").unwrap_or_else(|_| "8080".to_string());
|
|
834
|
+
let app = Router::new().route("/", get(home));
|
|
835
|
+
let addr = format!("127.0.0.1:{}", port);
|
|
836
|
+
println!("listening on http://{}", addr);
|
|
837
|
+
let listener = tokio::net::TcpListener::bind(&addr).await.unwrap();
|
|
838
|
+
axum::serve(listener, app).await.unwrap();
|
|
839
|
+
}
|
|
840
|
+
`],[".gitignore",t],[".env.example",u]];case"rust-actix":return[["Cargo.toml",`[package]
|
|
841
|
+
name = "${(a.slug||"project").replace(/[^a-z0-9_-]/gi,"-")}"
|
|
842
|
+
version = "0.1.0"
|
|
843
|
+
edition = "2021"
|
|
844
|
+
|
|
845
|
+
[dependencies]
|
|
846
|
+
actix-web = "4"
|
|
847
|
+
`],["src/main.rs",`use actix_web::{get, App, HttpServer, HttpResponse};
|
|
848
|
+
use std::env;
|
|
849
|
+
|
|
850
|
+
#[get("/")]
|
|
851
|
+
async fn home() -> HttpResponse { HttpResponse::Ok().content_type("text/html; charset=utf-8").body(${(c=p(a),`r#"${c}"#`)}) }
|
|
852
|
+
|
|
853
|
+
#[actix_web::main]
|
|
854
|
+
async fn main() -> std::io::Result<()> {
|
|
855
|
+
let port: u16 = env::var("PORT").ok().and_then(|p| p.parse().ok()).unwrap_or(8080);
|
|
856
|
+
println!("listening on http://127.0.0.1:{}", port);
|
|
857
|
+
HttpServer::new(|| App::new().service(home)).bind(("127.0.0.1", port))?.run().await
|
|
858
|
+
}
|
|
859
|
+
`],[".gitignore",t],[".env.example",u]];default:return w(a,"static")}}(c)});for(let[c,e]of f)null==(0,d.sL)(a.orgId,c)&&((0,d.dx)(a.orgId,c,e),b.push(c));return{id:e,written:b}}catch(a){return console.error("[scaffold] project starter failed:",a),{id:"static",written:b}}}function M(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 H(c))(0,d.dx)(c.orgId,a,b)}},24701:(a,b,c)=>{c.d(b,{I:()=>k});var d=c(77598),e=c(19202),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"]);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}
|
|
860
|
+
${b.text}${b.detail?`
|
|
861
|
+
${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"}]]:[[{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(19202),p=c(31371),q=c(65705),r=c(1890),s=c(53993),t=c(56663),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,"000911a332ed4e8c11185b59a924359e4a0f6c390d",null),(0,d.A)(G,"00bae47d888f4b3bf4c9a20f29c31510a0cbc92fad",null),(0,d.A)(H,"409ceb256bb4d7cdf0bdc9bf3eb07ed3e593b50ee7",null),(0,d.A)(I,"005af7b0b6152b36052f976ee5872cabdcb0601110",null),(0,d.A)(J,"40759d10169a9e1ce2ce147d6e907961a78c56c919",null),(0,d.A)(K,"0089ffbe108a72b6a822fca7c02bf50eeb3e707d16",null),(0,d.A)(M,"40eda67e3953ca06a8de7e1e89ce192f8f3f845c2c",null),(0,d.A)(N,"40396805f615607165c344c07c5a16fc0b680f8f5e",null),(0,d.A)(O,"409c7634f3d98b4f9b9b11d9f1b06f129f8ee477da",null),(0,d.A)(P,"40124108057342c612c2f357a7e8190a76aeca2758",null),(0,d.A)(Q,"40542ac1b1eca7bab158a31b48910ebdfae0c41136",null),(0,d.A)(X,"00d4d2587dceadf689c62e230f0fade2ff16d91a98",null),(0,d.A)(Y,"00e318bbd05ffdc87e3b0e7289a07686109da77f01",null),(0,d.A)(Z,"00952f0a7cb615f33b4b79eb7a467467281a5af3fe",null),(0,d.A)(ab,"00f24a176e753da0c54b460d5733d3d22e2eda478a",null),(0,d.A)(ac,"00510f5a6050a4b0ade51541d5d9e16ec0f020a374",null),(0,d.A)(ad,"008f263120259e54c66f16a365a0252bf2fc3c4a90",null),(0,d.A)(ae,"00246beed3841520b6281529abd4b518e33fe5e86f",null),(0,d.A)(af,"0012006a55cfe2592f83591f9000342265af6934bc",null),(0,d.A)(ag,"00533b64ea6f4a2acbd0745ed94cae49abc4cad513",null),(0,d.A)(ah,"00d8163946f7329359c5b20bbbf7009692d192bcf0",null),(0,d.A)(ai,"4087db27a0971eec3d866e787e2fdc1e5469606ebc",null),(0,d.A)(aj,"0017cc8a4ad40128920f52b25416e9396cee2630a7",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(19202),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:()=>k,O5:()=>n,Yv:()=>p,nP:()=>o});var d=c(44013),e=c(84988),f=c(19202),g=c(65705),h=c(1890),i=c(37296),j=c(64567);async function k(){return i.j2.api.getSession({headers:await (0,d.headers)()})}async function l(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 m(a){let[b]=await g.db.select().from(h.workspace).where((0,f.eq)(h.workspace.orgId,a));return b??null}async function n(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 o(){let a=await k();a||(0,e.redirect)("start"===(0,j.TQ)()?"/api/dev-login":"/login"),"1"===process.env.CONSTELLA_FORCE_ONBOARDING&&(0,e.redirect)("/onboarding");let b=await l(a.user.id,a.session.activeOrgId);b||(0,e.redirect)("/onboarding");let c=await m(b.id);return c||(0,e.redirect)("/onboarding"),{session:a,org:b,workspace:c}}function p(a){return(a||"org").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"")}},56663:(a,b,c)=>{c.d(b,{CS:()=>function a(b,c=""){let d=[];for(let e of l(b,c))if(e.isDir){if(m.has(e.name))continue;d.push(...a(b,e.path))}else d.push(e.path);return d},Ci:()=>l,EX:()=>p,HZ:()=>j,V8:()=>m,dx:()=>o,r$:()=>h,sL:()=>n});var d=c(73024),e=c(76760),f=c(48161),g=c(30043);function h(){return process.env.CONSTELLA_HOME?(0,g.Y)(process.env.CONSTELLA_HOME):(0,e.join)((0,f.homedir)(),".constella")}let i=new Set;function j(a){if(!/^[A-Za-z0-9_-]{6,64}$/.test(a))throw Error("Invalid orgId");let b=(0,e.join)(h(),"organizations",a,"workspace");if(!i.has(a)){i.add(a);try{let c=(0,e.join)(h(),"organizations",a,"constella"),f=!(0,d.existsSync)(b)||0===(0,d.readdirSync)(b).length;if((0,d.existsSync)(c)&&f)try{(0,d.renameSync)(c,b)}catch{(0,d.mkdirSync)(b,{recursive:!0}),0===(0,d.readdirSync)(b).length&&(0,d.cpSync)(c,b,{recursive:!0})}}catch{}}return b}function k(a,b){let c=(0,e.normalize)((0,e.join)(a,b));if(c!==a&&!c.startsWith(a+e.sep))throw Error("Path escapes workspace: "+b);if((0,d.existsSync)(a)){let f;try{f=d.realpathSync.native(a)}catch{f=a}let g=function(a){let b=a;for(;;){if((0,d.existsSync)(b))try{return d.realpathSync.native(b)}catch{return b}let a=(0,e.dirname)(b);if(a===b)return b;b=a}}(c);if(g!==f&&!g.startsWith(f+e.sep))throw Error("Path escapes workspace (symlink): "+b)}return c}function l(a,b=""){let c=k(j(a),b);return(0,d.existsSync)(c)?(0,d.readdirSync)(c).map(a=>{let f=(0,e.join)(c,a),g=(b?b+"/":"")+a;return{name:a,path:g,isDir:(0,d.statSync)(f).isDirectory()}}).sort((a,b)=>a.isDir===b.isDir?a.name.localeCompare(b.name):a.isDir?-1:1):[]}let m=new Set(["node_modules",".git",".next",".turbo","dist","build","out","coverage",".cache","archives",".testdev",".pnpm-store",".vercel","vendor"]);function n(a,b){let c=k(j(a),b);return(0,d.existsSync)(c)?(0,d.readFileSync)(c,"utf8"):null}function o(a,b,c){let f=k(j(a),b);(0,d.mkdirSync)((0,e.dirname)(f),{recursive:!0}),(0,d.writeFileSync)(f,c,"utf8")}function p(a,b){let c=k(j(a),b);(0,d.existsSync)(c)&&(0,d.rmSync)(c,{recursive:!0,force:!0})}},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(19202),f=c(33068),g=c(65705),h=c(1890),i=c(56663);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"];function p(a){let b=a.replace(/\\/g,"/");return!(b.startsWith(".claude/kb/")||b.startsWith(".claude/skills/"))&&(b.startsWith("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))}},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:()=>_,qX:()=>Y,w5:()=>W});var d=c(31421),e=c(73024),f=c(48161),g=c(76760),h=c(56663);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??"0"!==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=process.env.CONSTELLA_PKG_ROOT||process.cwd(),d=[];return p()&&d.push({matcher:"Write|Edit|MultiEdit|NotebookEdit",hooks:[{type:"command",command:`node "${(0,g.join)(c,"bin","lock-hook.mjs")}"`}]}),s()&&d.push({matcher:"Bash",hooks:[{type:"command",command:`node "${(0,g.join)(c,"bin","guard-hook.mjs")}"`}]}),(0,e.writeFileSync)((0,g.join)(a,"settings.json"),JSON.stringify({hooks:{PreToolUse:d}}),"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()})}async function _(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(19202),f=c(65705),g=c(1890),h=c(56663),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
|
+
|
|
863
|
+
**Trigger:** ${p}
|
|
864
|
+
|
|
865
|
+
${j.description}
|
|
866
|
+
|
|
867
|
+
## Procedure
|
|
868
|
+
${o}
|
|
869
|
+
`;(0,h.dx)(b,`.claude/skills/${a}.md`,q);let r=(0,d.randomUUID)();if(f.db.insert(g.skill).values({id:r,workspaceId:c,name:a,summary:j.description,trigger:p,instructions:o,native:!0,provisional:!1,indexed:"indexed"}).run(),!l||l.has(a))for(let a of Object.keys(k))f.db.insert(g.agentSkill).values({agentId:k[a],skillId:r}).run();m++}return{seeded:m}}function k(a){let b=f.db.select({stack:g.workspace.stack}).from(g.workspace).where((0,e.eq)(g.workspace.id,a)).get();if(!b)return{agents:0,linked:0,unlinked:0};let c=b.stack??{},d=new Set((0,i.Cg)().keys()),h=f.db.select({id:g.skill.id,name:g.skill.name}).from(g.skill).where((0,e.eq)(g.skill.workspaceId,a)).all(),j=new Map(h.map(a=>[a.name,a.id])),k=new Map(h.map(a=>[a.id,a.name])),l=f.db.select({id:g.agent.id,role:g.agent.role}).from(g.agent).where((0,e.eq)(g.agent.workspaceId,a)).all(),m=0,n=0;for(let a of l){let b=new Set((0,i.x4)(c,a.role).filter(a=>j.has(a))),h=f.db.select({skillId:g.agentSkill.skillId,auto:g.agentSkill.auto}).from(g.agentSkill).where((0,e.eq)(g.agentSkill.agentId,a.id)).all(),l=new Set(h.map(a=>a.skillId));for(let c of h){let h=k.get(c.skillId);c.auto&&h&&d.has(h)&&!b.has(h)&&(f.db.delete(g.agentSkill).where((0,e.Uo)((0,e.eq)(g.agentSkill.agentId,a.id),(0,e.eq)(g.agentSkill.skillId,c.skillId))).run(),n++)}for(let c of b){let b=j.get(c);b&&!l.has(b)&&(f.db.insert(g.agentSkill).values({agentId:a.id,skillId:b,auto:!0}).onConflictDoNothing().run(),m++)}}return{agents:l.length,linked:m,unlinked:n}}},77558:(a,b,c)=>{c.d(b,{TC:()=>k,W_:()=>i,vE:()=>h,vG:()=>j});var d=c(77598),e=c(19202),f=c(65705),g=c(1890);async function h(a,b){try{if(b.refType&&b.refId){let[c]=await f.db.select({id:g.inboxItem.id}).from(g.inboxItem).where((0,e.Uo)((0,e.eq)(g.inboxItem.workspaceId,a),(0,e.eq)(g.inboxItem.refType,b.refType),(0,e.eq)(g.inboxItem.refId,b.refId),(0,e.eq)(g.inboxItem.resolved,!1)));if(c)return void await f.db.update(g.inboxItem).set({title:b.title,detail:b.detail??"",goalId:b.goalId??null,channel:b.channel??null,messageId:b.messageId??null,createdAt:new Date}).where((0,e.eq)(g.inboxItem.id,c.id))}await f.db.insert(g.inboxItem).values({id:(0,d.randomUUID)(),workspaceId:a,kind:b.kind,title:b.title,detail:b.detail??"",fromAgentId:b.fromAgentId??null,resolved:!1,refType:b.refType??null,refId:b.refId??null,goalId:b.goalId??null,channel:b.channel??null,messageId:b.messageId??null})}catch(a){console.error("[inbox] pushInbox failed:",a)}}async function i(a,b,c){try{await f.db.update(g.inboxItem).set({resolved:!0}).where((0,e.Uo)((0,e.eq)(g.inboxItem.workspaceId,a),(0,e.eq)(g.inboxItem.refType,b),(0,e.eq)(g.inboxItem.refId,c),(0,e.eq)(g.inboxItem.resolved,!1)))}catch(a){console.error("[inbox] resolveInboxFor failed:",a)}}async function j(a,b){try{await f.db.update(g.inboxItem).set({resolved:!0}).where((0,e.Uo)((0,e.eq)(g.inboxItem.workspaceId,a),(0,e.RV)(g.inboxItem.refType,b),(0,e.eq)(g.inboxItem.resolved,!1)))}catch(a){console.error("[inbox] resolveInboxRefTypes failed:",a)}}async function k(a,b){try{await f.db.update(g.inboxItem).set({resolved:!0}).where((0,e.Uo)((0,e.eq)(g.inboxItem.workspaceId,a),(0,e.eq)(g.inboxItem.goalId,b),(0,e.eq)(g.inboxItem.resolved,!1)))}catch(a){console.error("[inbox] resolveInboxForGoal failed:",a)}}},88007:(a,b,c)=>{c.d(b,{A3:()=>j,Py:()=>e,_9:()=>g,bT:()=>l,gg:()=>h,vH:()=>k});var d=c(38926);function e(a){return/^\d{6,}:[A-Za-z0-9_-]{30,}$/.test(a)}let f="https://api.telegram.org";async function g(a){let b=await (0,d.r6)(a,"telegram_bot");if(!b)return null;try{let a=JSON.parse(b);if(a.botToken&&a.chatId&&e(a.botToken))return a}catch{}return null}async function h(a){if(!e(a))return{ok:!1};try{let b=await fetch(`${f}/bot${a}/getMe`,{signal:AbortSignal.timeout(8e3)}),c=await b.json();return{ok:!!c.ok,username:c.result?.username}}catch{return{ok:!1}}}let i=[{command:"help",description:"Show the remote-control commands"},{command:"status",description:"Quick project status"},{command:"review",description:"Plan / issues / tasks summary"},{command:"tasks",description:"What's in flight right now"},{command:"approve",description:"Approve the pending plan"},{command:"start_execution",description:"Approve + run 24/7"},{command:"pause",description:"Pause 24/7 execution"},{command:"resume",description:"Resume 24/7 execution"},{command:"reject",description:"Send the plan back to the CEO"},{command:"new",description:"Start new work — describe it"},{command:"cancel",description:"Cancel the active goal"},{command:"archive",description:"Archive the active goal"},{command:"kb",description:"Ask the Knowledge Base"}];async function j(a,b=i){if(!e(a))return!1;try{let c=await fetch(`${f}/bot${a}/setMyCommands`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({commands:b}),signal:AbortSignal.timeout(8e3)});return!!(await c.json()).ok}catch{return!1}}async function k(a,b,c){if(!e(a))return!1;try{return(await fetch(`${f}/bot${a}/sendMessage`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({chat_id:b,text:c.slice(0,3800),disable_web_page_preview:!0})})).ok}catch{return!1}}async function l(a,b,c,d){if(!e(a))return{ok:!1};try{let e=await fetch(`${f}/bot${a}/sendMessage`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({chat_id:b,text:c.slice(0,3500),disable_web_page_preview:!0,reply_markup:{inline_keyboard:d.map(a=>a.map(a=>({text:a.text,callback_data:a.data.slice(0,64)})))}}),signal:AbortSignal.timeout(12e3)});if(!e.ok)return{ok:!1};let g=await e.json().catch(()=>({}));return{ok:!!g.ok,messageId:g.result?.message_id}}catch{return{ok:!1}}}},93571:(a,b,c)=>{c.d(b,{Ws:()=>t,IT:()=>v,fi:()=>o,AQ:()=>s,Cg:()=>n,qg:()=>p,x4:()=>u,et:()=>w,BC:()=>r});var d=c(73024),e=c(76760),f=c(30043);let g={TypeScript:"typescript",JavaScript:"javascript",Python:"python",Go:"go",Rust:"rust",Java:"java",Kotlin:"kotlin","C#":"csharp",Ruby:"ruby",PHP:"php",Elixir:"elixir",Swift:"swift","C++":"cpp",Scala:"scala",Dart:"dart",C:"c",Clojure:"clojure",Haskell:"haskell",Lua:"lua","Objective-C":"objectivec",Erlang:"erlang","Node.js":"node",Bun:"bun",Deno:"deno","Python 3":"python3",PyPy:"pypy",JVM:"jvm",".NET":"dotnet","BEAM (Erlang VM)":"beam",React:"react",Vue:"vue",Svelte:"svelte",Angular:"angular",SolidJS:"solidjs",Preact:"preact",Qwik:"qwik",Lit:"lit","Alpine.js":"alpine","Next.js":"nextjs",Nuxt:"nuxt",Remix:"remix",SvelteKit:"sveltekit",Astro:"astro",Gatsby:"gatsby","Vite (SPA)":"vite",NestJS:"nestjs",Fastify:"fastify",Express:"express",Hono:"hono",Koa:"koa",Django:"django",Flask:"flask",FastAPI:"fastapi","Spring Boot":"spring-boot",Spring:"spring",Laravel:"laravel",Symfony:"symfony","Ruby on Rails":"rails",Gin:"gin",Fiber:"fiber",Actix:"actix",Phoenix:"phoenix","ASP.NET Core":"aspnet-core",AdonisJS:"adonisjs","React Native":"react-native",Flutter:"flutter",PostgreSQL:"postgresql",MySQL:"mysql",MariaDB:"mariadb",SQLite:"sqlite",MongoDB:"mongodb",Redis:"redis",Supabase:"supabase",Prisma:"prisma",Drizzle:"drizzle",TypeORM:"typeorm",Sequelize:"sequelize",SQLAlchemy:"sqlalchemy","Django ORM":"django-orm",Mongoose:"mongoose",GORM:"gorm","Tailwind CSS":"tailwind","CSS Modules":"css-modules","styled-components":"styled-components",Sass:"sass",Jest:"jest",Vitest:"vitest",Cypress:"cypress",Playwright:"playwright",Docker:"docker",Podman:"podman",BullMQ:"bullmq",RabbitMQ:"rabbitmq",Kafka:"kafka",Celery:"celery","Auth.js":"authjs",Keycloak:"keycloak",R:"r",Ember:"ember",Backbone:"backbone",Hugo:"hugo",Jekyll:"jekyll",Eleventy:"eleventy",Docusaurus:"docusaurus",CodeIgniter:"codeigniter",GraphQL:"graphql",Nginx:"nginx",Android:"android",Ionic:"ionic",Xamarin:"xamarin",NativeScript:"nativescript",Bootstrap:"bootstrap",Bulma:"bulma",Vuetify:"vuetify",Selenium:"selenium",Mocha:"mocha",Jasmine:"jasmine",Puppeteer:"puppeteer",TensorFlow:"tensorflow",PyTorch:"pytorch","scikit-learn":"scikit-learn",Keras:"keras",Pandas:"pandas",NumPy:"numpy",Jupyter:"jupyter",D3:"d3","Chart.js":"chart-js",Grafana:"grafana",Plotly:"plotly",Azure:"azure",Jenkins:"jenkins",CircleCI:"circleci",Terraform:"terraform",Ansible:"ansible",Vagrant:"vagrant",Firebase:"firebase",Appwrite:"appwrite",Amplify:"amplify",Heroku:"heroku"},h=[{match:/\bceo\b|chief exec/i,profile:{stackPrefixes:[],allPrefixes:["process/","design/","engineering/architecture/"],core:["app-planning","requirements-to-specs","specs-to-issues","architecture-before-code"]}},{match:/product owner|\bpo\b|product manager/i,profile:{stackPrefixes:[],allPrefixes:["process/"],core:["product-discovery","requirements-to-specs","specs-to-issues","prioritization-moscow-rice"]}},{match:/\bcto\b|chief tech|tech lead|architect/i,profile:{stackPrefixes:["stacks/"],allPrefixes:["engineering/architecture/","engineering/security/","engineering/performance/","process/architecture-before-code","process/adr-technical-decisions"],core:["system-design-fundamentals","software-architecture-patterns","architecture-before-code","api-design-rest-graphql"]}},{match:/front\s?end|\bui\b|\bux\b|web designer/i,profile:{stackPrefixes:["stacks/frontend/","stacks/styling/","stacks/meta/","stacks/mobile/","stacks/testing/"],allPrefixes:["design/","engineering/frontend/","engineering/performance/web-performance-core-vitals"],core:["design-systems","ui-ux-principles","responsive-layout","color-and-typography","accessibility-wcag"]}},{match:/back\s?end|server|\bapi\b/i,profile:{stackPrefixes:["stacks/backend/","stacks/database/","stacks/orm/","stacks/queue/","stacks/runtime/","stacks/baas/","stacks/auth/"],allPrefixes:["engineering/backend/","engineering/architecture/","engineering/performance/"],core:["backend-fundamentals","api-design-rest-graphql","data-modeling","auth-and-authorization"]}},{match:/cyber\s?sec|security|appsec|\bsec\b/i,profile:{stackPrefixes:["stacks/auth/"],allPrefixes:["engineering/security/","process/security-by-design","process/review-code-perf-security"],core:["owasp-top-10","owasp-asvs","secrets-management","secure-auth-sessions"]}},{match:/\bqa\b|quality|test/i,profile:{stackPrefixes:["stacks/testing/"],allPrefixes:["engineering/testing/","process/testing-before-done"],core:["testing-strategy-pyramid","tdd-and-coverage","unit-integration-e2e"]}},{match:/devops|\bops\b|infra|platform|sre|deploy/i,profile:{stackPrefixes:["stacks/infra/","stacks/container/","stacks/runtime/"],allPrefixes:["engineering/architecture/scalability-reliability","engineering/security/secrets-management"],core:["scalability-reliability","secrets-management"]}},{match:/\bdocs?\b|documentation|technical writer/i,profile:{stackPrefixes:["stacks/"],allPrefixes:["process/readme-generation"],core:["readme-generation"]}}],i={stackPrefixes:["stacks/"],allPrefixes:["process/","engineering/practices/"],core:[]};function j(a){let b=(a??"").trim();for(let a of h)if(a.match.test(b))return a.profile;return i}function k(){let a=[process.env.CONSTELLA_PKG_ROOT,(0,f.v)(),process.cwd()].filter(Boolean).map(a=>(0,e.join)(a,"skills"));for(let b of a)try{if((0,d.statSync)(b).isDirectory())return b}catch{}return a[0]??(0,e.join)((0,f.v)(),"skills")}function l(a,b){let c=a.match(RegExp(`^${b}:\\s*(.+)$`,"m"));return c?c[1].trim().replace(/^["']|["']$/g,"").trim():""}let m=null;function n(){if(m)return m;let a=k(),b=new Map;try{(0,d.statSync)(a).isDirectory()&&function c(f,g){let h;if(!(g>8)){try{h=(0,d.readdirSync)(f,{withFileTypes:!0})}catch{return}for(let i of h){let h=(0,e.join)(f,i.name);if(i.isDirectory()){c(h,g+1);continue}if("SKILL.md"!==i.name)continue;let j="";try{j=(0,d.readFileSync)(h,"utf8")}catch{continue}let k=j.match(/^---\n([\s\S]*?)\n---/),m=k?.[1]??"",n=h.split(/[\\/]/).slice(-2,-1)[0]||l(m,"name");if(!n||b.has(n))continue;let o=h.slice(a.length).replace(/^[\\/]+/,"").replace(/\\/g,"/");b.set(n,{name:n,relPath:o,description:l(m,"description")||`${n} skill.`,domain:l(m,"domain")||o.split("/")[0]||"",category:l(m,"category")||"",sources:function(a,b){let c=a.match(RegExp(`(?:^|\\n)${b}:\\s*\\n([\\s\\S]*?)(?=\\n\\S|$)`));return c?c[1].split("\n").map(a=>a.match(/^\s*-\s+(.+?)\s*$/)?.[1]?.replace(/^["']|["']$/g,"").trim()).filter(a=>!!a):[]}(m,"official_sources")})}}}(a,0)}catch{}return m=b,b}function o(a){return n().get(a)??null}function p(a){let b=o(a);if(!b)return null;try{return(0,d.readFileSync)((0,e.join)(k(),b.relPath),"utf8")}catch{return null}}let q=["clean-code","git-workflow","code-review-practices","refactoring","code-optimization","owasp-top-10","secrets-management","appsec-fundamentals","testing-strategy-pyramid","tdd-and-coverage","unit-integration-e2e","ui-ux-principles","responsive-layout","accessibility-wcag","architecture-before-code","requirements-to-specs","specs-to-issues","testing-before-done","security-by-design","review-code-perf-security","research-official-docs","authoring-agent-skills","readme-generation"];function r(a){return a.replace(/^---\n[\s\S]*?\n---\n?/,"").trim()}function s(a){let b=n(),c=[...q];for(let b of Object.values(a??{})){let a=g[b];a&&c.push(a)}return[...new Set(c)].filter(a=>b.has(a))}function t(){return[...n().keys()]}function u(a,b){let c=n(),d=j(b),e=new Set(s(a)),f=new Set(q.filter(a=>c.has(a)));for(let[a,b]of c)d.allPrefixes.some(a=>b.relPath.startsWith(a))?f.add(a):d.stackPrefixes.some(a=>b.relPath.startsWith(a))&&e.has(a)&&f.add(a);return[...f]}function v(a,b){let c=n(),d=j(b),e=new Set(s(a)),f=new Set(d.core.filter(a=>c.has(a)));for(let[a,b]of c)d.stackPrefixes.some(a=>b.relPath.startsWith(a))&&e.has(a)&&f.add(a);return[...f]}function w(a){let b=n(),c=new Set;for(let d of s(a))for(let a of b.get(d)?.sources??[])try{c.add(new URL(a).host.toLowerCase())}catch{}return[...c]}}};
|