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,95 @@
|
|
|
1
|
+
[β¦ Constella](../../README.md) Β· [π§π· PortuguΓͺs](../pt/README.md)
|
|
2
|
+
|
|
3
|
+

|
|
4
|
+
|
|
5
|
+
# π Constella Documentation
|
|
6
|
+
|
|
7
|
+
> The complete map of the Constella control plane. Every page follows the same structure β purpose, how it
|
|
8
|
+
> works, flows, concepts, tables, Mermaid diagrams, step-by-step, examples, states, integrations, security,
|
|
9
|
+
> troubleshooting and related links.
|
|
10
|
+
|
|
11
|
+
**New here?** Start with [Installation](INSTALLATION.md) β [Onboarding](ONBOARDING.md) β
|
|
12
|
+
[Configuration](CONFIGURATION.md), then pick a run mode.
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## π± Getting started
|
|
17
|
+
|
|
18
|
+
| Doc | What it covers |
|
|
19
|
+
|-----|----------------|
|
|
20
|
+
| [Installation](INSTALLATION.md) | Run via `npx` or a global `npm` install; requirements; first boot |
|
|
21
|
+
| [Onboarding](ONBOARDING.md) | The setup wizard, importing a project, the SUPER-SPEC and runnable starter |
|
|
22
|
+
| [Configuration](CONFIGURATION.md) | Every environment variable, ports, the `<HOME>/.env` file, the vault |
|
|
23
|
+
|
|
24
|
+
## π Run modes
|
|
25
|
+
|
|
26
|
+
| Doc | What it covers |
|
|
27
|
+
|-----|----------------|
|
|
28
|
+
| [Start Mode](START_MODE.md) | Auto local operator, no login, `127.0.0.1` |
|
|
29
|
+
| [Auth Mode](AUTH_MODE.md) | Email + password on a local/shared machine |
|
|
30
|
+
| [VPS Mode](VPS_MODE.md) | Network bind over a Tailscale tailnet, Docker |
|
|
31
|
+
| [Portable Mode](PORTABLE_MODE.md) | Carry app + models + projects on a USB drive |
|
|
32
|
+
|
|
33
|
+
## π°οΈ Architecture
|
|
34
|
+
|
|
35
|
+
| Doc | What it covers |
|
|
36
|
+
|-----|----------------|
|
|
37
|
+
| [Architecture](ARCHITECTURE.md) | Web + worker, runtime root, FS jail, SQLite, sync engine |
|
|
38
|
+
| [AI Architecture](AI_ARCHITECTURE.md) | CLI adapters, agent spawning, context assembly, cost |
|
|
39
|
+
| [Security](SECURITY.md) | Jail, vault, scrubbing, locks, command guard, auth |
|
|
40
|
+
|
|
41
|
+
## β¦ Agents & work
|
|
42
|
+
|
|
43
|
+
| Doc | What it covers |
|
|
44
|
+
|-----|----------------|
|
|
45
|
+
| [Agents](AGENTS.md) | The 10-agent roster, personas, hierarchy, models, caps |
|
|
46
|
+
| [KB Agent (Vannevar)](KB_AGENT.md) | The Knowledge agent: indexing, curation, skill proposals |
|
|
47
|
+
| [PO Agent (Donald)](PO_AGENT.md) | Backlog grooming, story points, MoSCoW |
|
|
48
|
+
| [Workflow](WORKFLOW.md) | Goal β Spec β Issue β Plan β Execution β Review β Test β Done |
|
|
49
|
+
| [Goals, Specs, Issues, Plans](GOALS_SPECS_ISSUES.md) | The work data model and state machines |
|
|
50
|
+
| [Team Room](TEAM_ROOM.md) | Multi-agent coordination by `@mention` |
|
|
51
|
+
| [DM](DM.md) | Direct-message channels and sessions |
|
|
52
|
+
| [Chat Commands](CHAT_COMMANDS.md) | Every slash command |
|
|
53
|
+
| [Inbox](INBOX.md) | Surfaced duplicates, gaps and proposals |
|
|
54
|
+
|
|
55
|
+
## π Knowledge
|
|
56
|
+
|
|
57
|
+
| Doc | What it covers |
|
|
58
|
+
|-----|----------------|
|
|
59
|
+
| [Knowledge Base & RAG](KB_RAG.md) | Curated KB, taxonomy, embeddings, retrieval |
|
|
60
|
+
| [Memory RAG](MEMORY_RAG.md) | Retrieval over files and conversations |
|
|
61
|
+
| [Synced Blocks](SYNCED_BLOCKS.md) | Canonical blocks and agent proposals |
|
|
62
|
+
|
|
63
|
+
## πͺ Capabilities
|
|
64
|
+
|
|
65
|
+
| Doc | What it covers |
|
|
66
|
+
|-----|----------------|
|
|
67
|
+
| [Skills](SKILLS.md) | The Markdown skills library and agent linking |
|
|
68
|
+
| [Project Stacks](PROJECT_STACKS.md) | How your stack drives skills, research and RAG |
|
|
69
|
+
| [Plugins](PLUGINS.md) | Native integrations and the plugin model |
|
|
70
|
+
| [Models](MODELS.md) | Cloud + CLI adapters, local GGUF, GPU fit-check |
|
|
71
|
+
|
|
72
|
+
## π€ Integrations
|
|
73
|
+
|
|
74
|
+
| Doc | What it covers |
|
|
75
|
+
|-----|----------------|
|
|
76
|
+
| [Telegram](TELEGRAM.md) | Remote control from your phone |
|
|
77
|
+
| [GitHub](GITHUB.md) | Repo binding, commit vs clean export |
|
|
78
|
+
| [Public API](PUBLIC_API.md) | The PAT-secured REST API |
|
|
79
|
+
| [MCP](MCP.md) | The MCP server that lets AI hosts drive Constella |
|
|
80
|
+
|
|
81
|
+
## π Delivery & ops
|
|
82
|
+
|
|
83
|
+
| Doc | What it covers |
|
|
84
|
+
|-----|----------------|
|
|
85
|
+
| [Test Dev](TEST_DEV.md) | Boot and headlessly test your project |
|
|
86
|
+
| [Prepare Deploy](PREPARE_DEPLOY.md) | Clean-tree build and export pipeline |
|
|
87
|
+
| [Deploy](DEPLOY.md) | Deploying Constella itself to production |
|
|
88
|
+
| [Publishing](PUBLISHING.md) | npm packaging and clean public publishing |
|
|
89
|
+
| [Update](UPDATE.md) | Version checks and context-aware updates |
|
|
90
|
+
| [Troubleshooting](TROUBLESHOOTING.md) | Symptoms, causes and fixes |
|
|
91
|
+
| [FAQ](FAQ.md) | Frequently asked questions |
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
Project history: [Changelog](../../CHANGELOG.md) Β· Main portal: [β¦ Constella README](../../README.md)
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
[β Docs index](./README.md) Β· [π§π· PortuguΓͺs](../pt/SECURITY.md) Β· [β¦ Constella](../../README.md)
|
|
2
|
+
|
|
3
|
+
# Security π³οΈ
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
> The shields around the central ship. Autonomous agents run *real* CLIs in a *real* workspace, so every layer here is load-bearing β a filesystem jail keeps each constellation in its own orbit, a vault encrypts secrets at rest, scrubbers strip credentials before they ever leave gravity, and hardened auth guards the front door.
|
|
8
|
+
|
|
9
|
+
Constella runs autonomous agents that drive `claude` / `codex` (and other) CLIs as subprocesses, with edit and (in `start` mode) full shell access to a real project directory. Nothing is sandboxed by pretending β security is achieved with concrete, layered controls. This page documents what the code actually enforces, file by file.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## β¦ When to use this page
|
|
14
|
+
|
|
15
|
+
- You are deploying Constella where more than one human (or the open internet) can reach it β read **Auth**, **Worker secret**, **SSRF guard**.
|
|
16
|
+
- You want to understand the **agent blast radius**: what an agent can and cannot do to the host (FS jail, command guard, run-mode sandbox).
|
|
17
|
+
- You are auditing how **secrets** are stored, encrypted, and prevented from leaking (Vault, scrub, secret-scan gates).
|
|
18
|
+
- You are reviewing the threat model before shipping (`vps` / `portable` modes).
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## π How it works β defense in depth
|
|
23
|
+
|
|
24
|
+
Constella layers independent controls so no single failure is catastrophic. The model an agent runs through is already told (prompt-injection clause) never to reveal secrets or run destructive commands; every control below is *belt-and-suspenders* applied at the boundary, never trusting the model alone.
|
|
25
|
+
|
|
26
|
+
```mermaid
|
|
27
|
+
flowchart TB
|
|
28
|
+
subgraph Edge["π°οΈ Network edge"]
|
|
29
|
+
A1["Run-mode bind: start/auth = 127.0.0.1 Β· vps/portable = 0.0.0.0 + Tailscale/Docker"]
|
|
30
|
+
A2["better-auth session gate (email+password Β· TOTP 2FA Β· WebAuthn passkeys)"]
|
|
31
|
+
A3["Worker endpoints: x-worker-secret, fail CLOSED"]
|
|
32
|
+
end
|
|
33
|
+
subgraph App["π Application boundary"]
|
|
34
|
+
B1["Org isolation: member.role + requireWorkspace β per-org workspace"]
|
|
35
|
+
B2["Public API: cn_ PAT (SHA-256), scope read|write, 120 req/min"]
|
|
36
|
+
B3["scrubSecrets() at every agentβoperator sink"]
|
|
37
|
+
end
|
|
38
|
+
subgraph Agent["stars Agent sandbox"]
|
|
39
|
+
C1["FS jail safe(): lexical + symlink, no traversal"]
|
|
40
|
+
C2["Run-mode permission: start=bypassPermissions Β· prod=acceptEdits / workspace-write"]
|
|
41
|
+
C3["guard-hook.mjs: block catastrophic shell"]
|
|
42
|
+
C4["lock-hook.mjs: per-file locks (opt-in)"]
|
|
43
|
+
C5["safeModel(): no shell injection via model id"]
|
|
44
|
+
end
|
|
45
|
+
subgraph Rest["π³οΈ At rest"]
|
|
46
|
+
D1["Vault: AES-256-GCM (CONSTELLA_VAULT_KEY)"]
|
|
47
|
+
D2["<HOME>/.env chmod 600 (secrets never printed)"]
|
|
48
|
+
D3["Secret-scan gate on export / publish"]
|
|
49
|
+
end
|
|
50
|
+
Edge --> App --> Agent
|
|
51
|
+
App --> Rest
|
|
52
|
+
Agent --> Rest
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## πͺ Main flow
|
|
58
|
+
|
|
59
|
+
1. **Boot** β the launcher (`bin/constella.mjs`) generates and persists three real secrets to `<HOME>/.env` (mode `0600`): `BETTER_AUTH_SECRET`, `CONSTELLA_VAULT_KEY`, `CONSTELLA_WORKER_SECRET`. They are never printed.
|
|
60
|
+
2. **Auth gate** β `start` mode auto-signs-in a local operator (loopback only); `auth` / `vps` / `portable` require a real credential (`assertAuthSecret()` fails closed without a signing secret).
|
|
61
|
+
3. **Request β workspace** β `requireWorkspace()` resolves the active org via a `member` join; all filesystem access goes through `safe()`, which keys by the stable `organization.id` and refuses traversal.
|
|
62
|
+
4. **Agent run** β the runner spawns the CLI inside the org workspace `cwd`. Run-mode picks the permission level; PreToolUse hooks (`guard-hook.mjs`, optional `lock-hook.mjs`) sit in front of every Bash/Write/Edit.
|
|
63
|
+
5. **Reply β operator** β any text an agent could echo is passed through `scrubSecrets()` before it reaches Telegram, the Team Room, DMs, notifications, or the public API.
|
|
64
|
+
6. **Export / publish** β a clean tree is built and a secret-scan gate blocks the operation on *any* finding.
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## π Key concepts
|
|
69
|
+
|
|
70
|
+
| Concept | Where | One-line guarantee |
|
|
71
|
+
| --- | --- | --- |
|
|
72
|
+
| **FS jail** | `src/lib/fs-workspace.ts` `safe()` | No path escapes the org workspace β lexically *and* through symlinks. |
|
|
73
|
+
| **Vault** | `src/lib/vault.ts` | API keys / PATs are AES-256-GCM encrypted at rest; never reach the client. |
|
|
74
|
+
| **Secret scrub** | `src/lib/scrub.ts` `scrubSecrets()` | Strips known env secrets + credential shapes from every agentβoperator sink. |
|
|
75
|
+
| **Command guard** | `bin/guard-hook.mjs` | Blocks catastrophic shell (`rm -rf /`, force-push, `mkfs`, fork-bombβ¦). |
|
|
76
|
+
| **File locks** | `src/server/file-locks.ts` + `bin/lock-hook.mjs` | Parallel agents can't clobber the same file. |
|
|
77
|
+
| **Run-mode sandbox** | `src/server/adapters/cli.ts` | `start` = full shell; prod = edits-only (`acceptEdits` / `workspace-write`). |
|
|
78
|
+
| **Auth** | `src/lib/auth.ts` | better-auth email+password, TOTP 2FA, WebAuthn passkeys, 30-day sessions. |
|
|
79
|
+
| **Org roles** | `src/db/schema.ts` `member` | `owner` \| `admin` \| `member`. |
|
|
80
|
+
| **Worker secret** | `bin/worker.mjs` + endpoints | Privileged cron/sync/poll endpoints require `x-worker-secret`. |
|
|
81
|
+
| **SSRF guard** | `bin/worker.mjs` | The worker secret only ever travels to a loopback host. |
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## π°οΈ The filesystem jail
|
|
86
|
+
|
|
87
|
+
Every organization owns one isolated directory: `<constellaHome>/organizations/<orgId>/workspace/`. Access is funneled through `safe(root, rel)` in `src/lib/fs-workspace.ts`, which enforces **two** independent checks:
|
|
88
|
+
|
|
89
|
+
1. **Lexical** β `join(root, rel)` is normalized; if the result is not `root` and does not start with `root + sep`, it throws `Path escapes workspace`. Because `join` re-roots absolute, drive-letter and UNC inputs under `root`, those collapse harmlessly.
|
|
90
|
+
2. **Symlink** β even a lexically-clean path is re-checked against the *real* path of its nearest existing ancestor (`realAncestor` + `realpathSync.native`). A prompt-injected agent that plants a symlink inside the workspace cannot tunnel out to another org's root or the wider disk.
|
|
91
|
+
|
|
92
|
+
The org id itself is validated by `assertOrgId()` (`/^[A-Za-z0-9_-]{6,64}$/`) before it ever reaches a path β `.`, `/`, `\`, `..` are rejected at the door. The workspace key is the **stable** `organization.id`, never the renameable slug, so renames never re-home or leak data.
|
|
93
|
+
|
|
94
|
+
> π *Each constellation orbits inside its own gravity well; `safe()` is the event horizon nothing crosses.*
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## π Vault β secrets at rest (AES-256-GCM)
|
|
99
|
+
|
|
100
|
+
`src/lib/vault.ts` encrypts every stored secret (provider API keys, the GitHub PAT, the Telegram bot token, allowlists) with **AES-256-GCM**:
|
|
101
|
+
|
|
102
|
+
- The key comes from `CONSTELLA_VAULT_KEY` β a 32-byte value, base64-decoded; `key()` throws if it is missing or not exactly 32 bytes.
|
|
103
|
+
- `putSecret()` generates a fresh 12-byte random IV per write, appends the GCM auth tag to the ciphertext, and stores base64 in the `vault` table (`ciphertext`, `iv`). It is **single-valued per `(workspaceId, ref)`**: the old row is deleted before insert, so `getSecret()`'s first-row read can never serve a stale token.
|
|
104
|
+
- `getSecret()` splits off the 16-byte tag, sets it, and decrypts β a tampered ciphertext fails the GCM tag check.
|
|
105
|
+
- `delSecret()` backs the revoke-token path. `maskSecret()` is the only thing the UI ever sees (`abcβ’β’β’β’β’β’wxyz`); **plaintext never reaches the client and never lands on a `provider` row.**
|
|
106
|
+
|
|
107
|
+
| Column | Meaning |
|
|
108
|
+
| --- | --- |
|
|
109
|
+
| `workspaceId` | Owning workspace (cascade-deleted with the org). |
|
|
110
|
+
| `providerId` | Optional link to a `provider` row. |
|
|
111
|
+
| `ref` | Logical name, e.g. `openai_api_key`, `github_pat`, `telegram_bot_token`. |
|
|
112
|
+
| `ciphertext` | Base64 of `encβtag`. |
|
|
113
|
+
| `iv` | Base64 of the 12-byte GCM nonce. |
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## π§Ή Secret scrubbing
|
|
118
|
+
|
|
119
|
+
`src/lib/scrub.ts` is the last line before any agent text reaches a human-facing sink (Telegram, Team Room, DMs, notifications, public API, logs). `scrubSecrets(text, extra)`:
|
|
120
|
+
|
|
121
|
+
- Redacts the three env secrets `CONSTELLA_VAULT_KEY`, `BETTER_AUTH_SECRET`, `CONSTELLA_WORKER_SECRET` (plus any caller-supplied `extra` values β₯ 8 chars) by literal replacement β `[redacted]`.
|
|
122
|
+
- Redacts high-confidence inline **credential shapes** via one combined regex: OpenAI/Anthropic `sk-β¦`, GitHub `gh[posru]_β¦` and `github_pat_β¦`, AWS `AKIAβ¦`, Google `AIzaβ¦`, Slack `xox[baprs]-β¦`, JWTs, PEM private keys, the Constella PAT `cn_β¦`, and Telegram bot tokens.
|
|
123
|
+
- **Never throws.** `redactForLog()` is the same scrub for log lines that interpolate tool output.
|
|
124
|
+
|
|
125
|
+
The same shapes drive the git/export/publish secret-scan gates, so a credential pattern is treated identically whether it would be *echoed* or *committed*.
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## π‘οΈ Command guard
|
|
130
|
+
|
|
131
|
+
`bin/guard-hook.mjs` is a Claude Code **PreToolUse** hook injected (when `cmdGuard` is on β default) by `src/server/adapters/cli.ts`. Before any `Bash` run it matches the command against a narrow deny-list and, on a hit, writes a reason to stderr and exits `2` (Claude Code feeds stderr back to the model as a block):
|
|
132
|
+
|
|
133
|
+
| Blocked pattern | Reason |
|
|
134
|
+
| --- | --- |
|
|
135
|
+
| `rm -rf /` Β· `~` Β· `$HOME` Β· `/*` Β· `..` | recursive force-delete of a root / home / cwd path |
|
|
136
|
+
| `git push β¦ --force` / `-f` / `--force-with-lease` | force-push to a git remote |
|
|
137
|
+
| `git reset --hard β¦ origin/` | hard reset onto a remote ref |
|
|
138
|
+
| `:(){ :|:& };:` | fork bomb |
|
|
139
|
+
| `mkfs[.fs]` | filesystem format |
|
|
140
|
+
| `dd β¦ of=/dev/β¦` | raw write to a device |
|
|
141
|
+
| `> /dev/sdβ¦|nvmeβ¦|diskβ¦|mapperβ¦` | redirect over a raw disk device |
|
|
142
|
+
| `chmod -R 000` | recursive chmod 000 |
|
|
143
|
+
| `shutdown` / `reboot` / `halt` / `poweroff` | power / shutdown command |
|
|
144
|
+
| `curl\|wget β¦ \| sh/bash/zsh` | pipe a downloaded script straight into a shell |
|
|
145
|
+
|
|
146
|
+
It is **intentionally narrow** (only unambiguous, low-false-positive shapes) and **fails open** on everything else, so a legit run is never hard-stalled. Denials are appended to `.claude/guard-denials.jsonl` (a `.jsonl`, so RAG β which indexes only `.md` β never retrieves it). Toggle via per-workspace `settings.agents.cmdGuard` or env `CONSTELLA_AGENT_CMD_GUARD` (default on; `=0` disables).
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## π File locks (parallel-agent safety)
|
|
151
|
+
|
|
152
|
+
`bin/lock-hook.mjs` (PreToolUse on `Write|Edit|MultiEdit|NotebookEdit`) is injected only when `CONSTELLA_AGENT_LOCK_HOOK=1` (or per-workspace `settings.agents.fileLocks`). Before an edit it POSTs to `/api/locks/acquire` (loopback, `x-worker-secret`). The server side (`src/server/file-locks.ts`):
|
|
153
|
+
|
|
154
|
+
- `acquireLock()` is one row per `(workspaceId, path)`. The **same** task or agent re-acquires (heartbeat); anyone else gets a `423` with `heldBy`, and the hook tells the model to edit a different file.
|
|
155
|
+
- `normalizeLockPath()` skips base/config dirs (`.git/`, `.claude/`, `archives/`) and rejects anything outside the workspace.
|
|
156
|
+
- `releaseLocksForTask()` frees locks on task completion; `reclaimStaleLocks(ttlMs = 5min)` reclaims locks from a crashed run by heartbeat TTL (crash safety).
|
|
157
|
+
|
|
158
|
+
Both hooks **fail open** on any unexpected condition (no context, network glitch, non-edit tool) β a hook problem must never hard-stall a run.
|
|
159
|
+
|
|
160
|
+
> πͺ *Two agents in the same orbit can't collide on the same file β the lock is the right-of-way.*
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## stars Agent sandbox by run-mode
|
|
165
|
+
|
|
166
|
+
`src/server/adapters/cli.ts` decides how much power an agent's CLI gets, **driven by `CONSTELLA_RUN_MODE`** (overridable with `CONSTELLA_AGENT_FULL_ACCESS=1|0`):
|
|
167
|
+
|
|
168
|
+
| Run mode | Bind | `AGENT_FULL_ACCESS` | claude `--permission-mode` | codex `-s` sandbox | Network/exec |
|
|
169
|
+
| --- | --- | --- | --- | --- | --- |
|
|
170
|
+
| `start` (local) | `127.0.0.1` | **on** (default) | `bypassPermissions` | `danger-full-access` | full: install deps + run tests |
|
|
171
|
+
| `auth` | `127.0.0.1` | off | `acceptEdits` | `workspace-write` | edits-only, no network |
|
|
172
|
+
| `vps` | `0.0.0.0` | off | `acceptEdits` | `workspace-write` | edits-only β *plus* the Docker container + Tailscale are the hard jail |
|
|
173
|
+
| `portable` | `0.0.0.0` | off | `acceptEdits` | `workspace-write` | edits-only |
|
|
174
|
+
|
|
175
|
+
Defense-in-depth: prod modes already run inside Docker + Tailscale (the container is the real jail); the CLI stays restricted on top. Two more agent-spawn protections:
|
|
176
|
+
|
|
177
|
+
- **Vanilla agents** β agents run independent of the operator's personal `~/.claude` hooks/plugins via a `--settings {disableAllHooks:true}` overlay (or a clean `CLAUDE_CONFIG_DIR` carrying only Constella's lock/guard hooks). Auth stays intact (the operator's credentials are copied in).
|
|
178
|
+
- **No shell injection via model id** β `safeModel()` / `safeModelSlash()` validate the model string (which originates from agent-writable `Agent.md` frontmatter) against a strict charset before it reaches argv on a `shell: true` spawn, so `sonnet"; rm -rf ~` can't be re-parsed by the shell. Git/`gh` calls use `shell: false` so branch/message/path args are passed literally.
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
|
|
182
|
+
## π Auth, 2FA, passkeys & roles
|
|
183
|
+
|
|
184
|
+
`src/lib/auth.ts` configures **better-auth** over the drizzle adapter:
|
|
185
|
+
|
|
186
|
+
- **Email + password** β always enabled (`autoSignIn: true`, no email verification). Required for `auth` / `vps` / `portable`.
|
|
187
|
+
- **`start` mode** auto-creates and auto-signs-in a local operator (`operator@constella.dev` / `operator123`), so the login screen is skipped β local, loopback-only.
|
|
188
|
+
- **TOTP 2FA** β the `twoFactor()` plugin powers real TOTP; secrets live in the `two_factor` table (TOTP secret + backup codes).
|
|
189
|
+
- **WebAuthn passkeys** β custom `/api/passkey/*` routes on `@simplewebauthn`; credentials in the `passkey` table (base64url COSE public key, counter, transports). `src/lib/passkey.ts` keeps the relying-party id = bare hostname (`rpID()`), expected origin = full base URL, and stashes challenges in short-lived (`maxAge: 300`) httpOnly cookies between options/verify round-trips.
|
|
190
|
+
- **Sessions** β `expiresIn` 30 days. Cookies are marked `Secure` whenever the app is served over HTTPS (`useSecureCookies` keyed off the base URL) β so an `auth`/`portable` install behind an HTTPS proxy or Tailscale is protected, while local `start` http stays relaxed.
|
|
191
|
+
- **Fail-closed signing** β `assertAuthSecret()` (called once at boot) **throws** in any network mode without `BETTER_AUTH_SECRET`; without it, sessions would be forgeable. `start` is exempt (loopback, auto-login).
|
|
192
|
+
- **Org roles** β the `member` table carries `role: owner | admin | member` (default `owner`). After login, `requireWorkspace()` resolves the active org via a `member` join, so a session never points at another tenant's org.
|
|
193
|
+
|
|
194
|
+
Social providers (`github`, `google`) are only registered when their `*_CLIENT_ID` / `*_CLIENT_SECRET` env vars are present; the GitHub OAuth `repo` scope lets a login double as a commit/push token (stored on the `account` row).
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## π°οΈ Worker secret & SSRF guard
|
|
199
|
+
|
|
200
|
+
The worker (`bin/worker.mjs`) holds the privileged `CONSTELLA_WORKER_SECRET` and attaches it as the `x-worker-secret` header to its calls. Two safety properties:
|
|
201
|
+
|
|
202
|
+
1. **Privileged endpoints fail CLOSED.** `/api/cron/tick`, `/api/sync/file`, `/api/locks/acquire`, `/api/telegram/poll` all reject (`401`) unless `x-worker-secret` matches the configured secret. Without a configured secret, `/api/cron/tick` refuses to run at all β otherwise anyone could trigger real, token-spending agent execution across every workspace.
|
|
203
|
+
2. **SSRF / secret-exfil guard.** Whoever controls the env (systemd unit, Docker env, shell) could point `CONSTELLA_BASE_URL` at an attacker host and harvest the secret. So the worker computes `baseHost` and refuses to send the secret to any non-loopback host (`localhost`, `127.0.0.1`, `::1`) unless `CONSTELLA_ALLOW_REMOTE_WORKER_BASE_URL=1` is set explicitly. A remote `http://` base (with the override on) prints a cleartext warning. The launcher always sets the worker's base to `http://127.0.0.1:<port>` β loopback even in `vps` / `portable` β so the default is safe.
|
|
204
|
+
|
|
205
|
+
---
|
|
206
|
+
|
|
207
|
+
## π The boot secrets
|
|
208
|
+
|
|
209
|
+
`bin/constella.mjs` persists three secrets under the runtime root, generating each once and reusing it across restarts (so sessions and the encrypted vault survive a restart):
|
|
210
|
+
|
|
211
|
+
| Secret | Generator | Used for |
|
|
212
|
+
| --- | --- | --- |
|
|
213
|
+
| `BETTER_AUTH_SECRET` | `randomBytes(32).base64url` | Signs better-auth sessions (forgeable without it). |
|
|
214
|
+
| `CONSTELLA_VAULT_KEY` | `randomBytes(32).base64` | AES-256-GCM key for the vault. |
|
|
215
|
+
| `CONSTELLA_WORKER_SECRET` | `randomBytes(24).base64url` | Authorizes the privileged worker endpoints. |
|
|
216
|
+
|
|
217
|
+
They are written to `<HOME>/.env` with `mode: 0600` (then `chmodSync(0o600)` best-effort on Windows) and **never printed** β boot logs only `Secrets ready (stored in <ENV_FILE>, never printed).`
|
|
218
|
+
|
|
219
|
+
---
|
|
220
|
+
|
|
221
|
+
## β¦ Public API surface
|
|
222
|
+
|
|
223
|
+
The Public API (`/api/v1/*`) authenticates with a **Personal Access Token** `cn_<token>` β only its **SHA-256 hash** is stored in `personal_access_token` (plaintext shown once at creation). Tokens carry a `scope` (`read` | `write`), are rate-limited to **120 req/min/token**, and an optional `X-Constella-Org` header selects the org. See [PUBLIC_API.md](./PUBLIC_API.md) and [MCP.md](./MCP.md).
|
|
224
|
+
|
|
225
|
+
---
|
|
226
|
+
|
|
227
|
+
## πͺ Possible states
|
|
228
|
+
|
|
229
|
+
| State | Trigger | Effect |
|
|
230
|
+
| --- | --- | --- |
|
|
231
|
+
| **Boot refused** | network mode, no `BETTER_AUTH_SECRET` | `assertAuthSecret()` throws β server won't start. |
|
|
232
|
+
| **Worker refused** | non-loopback base, no override | Worker exits 1 (SSRF guard). |
|
|
233
|
+
| **401 unauthorized** | missing/wrong `x-worker-secret` | Cron/sync/lock/telegram endpoint rejects. |
|
|
234
|
+
| **Path escape blocked** | traversal or symlink escape | `safe()` throws `Path escapes workspace`. |
|
|
235
|
+
| **Command blocked** | catastrophic shell | guard-hook exits 2, model reads the reason. |
|
|
236
|
+
| **423 file locked** | another agent holds the file | lock-hook tells the model to edit elsewhere. |
|
|
237
|
+
| **Export/publish blocked** | secret-scan finding | export/publish aborts before pushing. |
|
|
238
|
+
| **Vault key invalid** | missing / wrong-length key | `key()` throws; secrets can't be read/written. |
|
|
239
|
+
|
|
240
|
+
---
|
|
241
|
+
|
|
242
|
+
## π°οΈ Related integrations
|
|
243
|
+
|
|
244
|
+
- [AUTH_MODE.md](./AUTH_MODE.md) Β· [VPS_MODE.md](./VPS_MODE.md) Β· [PORTABLE_MODE.md](./PORTABLE_MODE.md) β the network-exposed run modes and their gating.
|
|
245
|
+
- [ARCHITECTURE.md](./ARCHITECTURE.md) β the org isolation, sync engine and worker process.
|
|
246
|
+
- [AGENTS.md](./AGENTS.md) Β· [AI_ARCHITECTURE.md](./AI_ARCHITECTURE.md) β how agents execute (the sandbox lives here).
|
|
247
|
+
- [PUBLIC_API.md](./PUBLIC_API.md) Β· [MCP.md](./MCP.md) β PATs, scopes and rate limits.
|
|
248
|
+
- [PREPARE_DEPLOY.md](./PREPARE_DEPLOY.md) Β· [DEPLOY.md](./DEPLOY.md) Β· [PUBLISHING.md](./PUBLISHING.md) β clean-tree builds and the secret-scan gates.
|
|
249
|
+
|
|
250
|
+
---
|
|
251
|
+
|
|
252
|
+
## π³οΈ Troubleshooting
|
|
253
|
+
|
|
254
|
+
| Symptom | Likely cause | Fix |
|
|
255
|
+
| --- | --- | --- |
|
|
256
|
+
| Server won't boot in `auth`/`vps`/`portable` | `BETTER_AUTH_SECRET` not set | Let the launcher generate it, or set it in `<HOME>/.env`. |
|
|
257
|
+
| Worker exits with "Refusing to send the worker secretβ¦" | `CONSTELLA_BASE_URL` is non-loopback | Use `127.0.0.1`, or set `CONSTELLA_ALLOW_REMOTE_WORKER_BASE_URL=1` (and prefer `https://`). |
|
|
258
|
+
| Agent can't run `npm install` / tests | prod mode (`acceptEdits` jail) | Expected; set `CONSTELLA_AGENT_FULL_ACCESS=1` only if you accept the risk. |
|
|
259
|
+
| A legit command is blocked | guard-hook deny match | Run it yourself, or disable via `settings.agents.cmdGuard` / `CONSTELLA_AGENT_CMD_GUARD=0`. |
|
|
260
|
+
| Agents talk in the operator's voice | operator `~/.claude` hooks leaked in | Ensure the vanilla `disableAllHooks` overlay applies (default); check creds copy. |
|
|
261
|
+
| "Path escapes workspace" error | symlink or traversal in a workspace path | Intentional β the FS jail blocked it. |
|
|
262
|
+
| Cron endpoint returns 401 | missing/stale `x-worker-secret` | Confirm the worker inherits `CONSTELLA_WORKER_SECRET` from the same process env. |
|
|
263
|
+
| Passkey button fails | mismatched `BETTER_AUTH_URL` (RP id) | Set `BETTER_AUTH_URL` to the exact origin you browse to. |
|
|
264
|
+
|
|
265
|
+
---
|
|
266
|
+
|
|
267
|
+
## β¦ Related links
|
|
268
|
+
|
|
269
|
+
- [AUTH_MODE.md](./AUTH_MODE.md)
|
|
270
|
+
- [VPS_MODE.md](./VPS_MODE.md)
|
|
271
|
+
- [PORTABLE_MODE.md](./PORTABLE_MODE.md)
|
|
272
|
+
- [ARCHITECTURE.md](./ARCHITECTURE.md)
|
|
273
|
+
- [AI_ARCHITECTURE.md](./AI_ARCHITECTURE.md)
|
|
274
|
+
- [AGENTS.md](./AGENTS.md)
|
|
275
|
+
- [PUBLIC_API.md](./PUBLIC_API.md)
|
|
276
|
+
- [MCP.md](./MCP.md)
|
|
277
|
+
- [PREPARE_DEPLOY.md](./PREPARE_DEPLOY.md)
|
|
278
|
+
- [PUBLISHING.md](./PUBLISHING.md)
|
|
279
|
+
- [CONFIGURATION.md](./CONFIGURATION.md)
|
|
280
|
+
- [TROUBLESHOOTING.md](./TROUBLESHOOTING.md)
|