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,387 @@
|
|
|
1
|
+
[← Docs index](./README.md) · [🇧🇷 Português](../pt/PORTABLE_MODE.md) · [✦ Constella](../../README.md)
|
|
2
|
+
|
|
3
|
+
# Portable Mode 🛰️
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
Carry the entire control ship on a USB drive. Portable Mode boots Constella — app, database, vault, local models, projects — straight off a removable drive, so the same constellation follows you from machine to machine without leaving a trace on the host.
|
|
8
|
+
|
|
9
|
+
> Run mode `portable` (`src/lib/run-mode.ts`): `requiresLogin: true`, note *"USB drive mounted as root across machines."*
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## When to use 🌌
|
|
14
|
+
|
|
15
|
+
Use Portable Mode when you want the whole runtime — secrets, agents, knowledge nebula and projects — to live on a drive you physically carry, not on the host computer:
|
|
16
|
+
|
|
17
|
+
- A shared / borrowed / locked-down workstation where you do **not** want a runtime root in `~`.
|
|
18
|
+
- Moving between a desktop, a laptop and a workshop machine while keeping one identity and one database.
|
|
19
|
+
- An air-gapped or field setup where you carry local GGUF models on the same drive.
|
|
20
|
+
- Demos and incident response where "plug in, boot, unplug" is the whole story.
|
|
21
|
+
|
|
22
|
+
Prefer a different mode when:
|
|
23
|
+
|
|
24
|
+
| Want | Use instead |
|
|
25
|
+
| --- | --- |
|
|
26
|
+
| Local-only, no login, fastest start | [START_MODE](./START_MODE.md) |
|
|
27
|
+
| Real login on this machine's home dir | [AUTH_MODE](./AUTH_MODE.md) |
|
|
28
|
+
| Always-on server reachable over a tailnet | [VPS_MODE](./VPS_MODE.md) |
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## How it works 🪐
|
|
33
|
+
|
|
34
|
+
Portable Mode is one of four run modes (`RunMode = "start" | "auth" | "vps" | "portable"`). The launcher `bin/constella.mjs` selects it, validates a removable drive, points the **runtime root** at `<USB>/.constella`, and then boots the same dual-process runtime (web + worker) as every other mode.
|
|
35
|
+
|
|
36
|
+
The defining differences of `portable`:
|
|
37
|
+
|
|
38
|
+
- **Login required** — `RUN_MODES.portable.requiresLogin === true`. There is no auto-operator; you sign in with email + password (better-auth).
|
|
39
|
+
- **Runtime root on the drive** — `CONSTELLA_HOME = <USB>/.constella`, so the database, secrets, vault, workspaces and caches all live on the drive.
|
|
40
|
+
- **Binds `0.0.0.0`** — like `vps`, the host defaults to all interfaces so the portable instance is reachable on the machine it's plugged into (`host = ... runMode === "vps" || runMode === "portable" ? "0.0.0.0" : "127.0.0.1"`).
|
|
41
|
+
- **Drive size is gated** — `< 32 GB` free is **fatal**; `≥ 32 GB` is **good** (constants `PORTABLE_MIN_GB = 32`, `PORTABLE_RECOMMENDED_GB = 32` in `src/server/portable.ts`). More headroom only helps if you carry local models — it is never a warning or a gate.
|
|
42
|
+
|
|
43
|
+
### Selecting the mode
|
|
44
|
+
|
|
45
|
+
`bin/constella.mjs` resolves the run mode from flags, with a legacy fallback:
|
|
46
|
+
|
|
47
|
+
```js
|
|
48
|
+
const modeFlags = ["start", "auth", "vps", "portable"].filter((m) => has(`--${m}`));
|
|
49
|
+
const bind = flag("--bind");
|
|
50
|
+
const runMode = modeFlags[0]
|
|
51
|
+
?? (bind === "tailnet" ? "vps" : bind === "portable" ? "portable" : bind === "local" ? "start" : undefined)
|
|
52
|
+
?? "start";
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
So `--portable` (or the legacy `--bind portable`) selects Portable Mode. The chosen mode is exported as `CONSTELLA_RUN_MODE=portable`, read back at runtime by `getRunMode()`, and persisted to `organization.runMode` during onboarding (`runMode` column is `text(... { enum: ["start", "auth", "vps", "portable"] })` in `src/db/schema.ts`).
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## Main flow 🌠
|
|
60
|
+
|
|
61
|
+
```mermaid
|
|
62
|
+
flowchart TD
|
|
63
|
+
A["npx constella --portable [--path <drive>]"] --> B{"--path or CONSTELLA_HOME set?"}
|
|
64
|
+
B -- "yes" --> H["HOME = explicit path"]
|
|
65
|
+
B -- "no" --> C["pickUsbHome()"]
|
|
66
|
+
C --> D["detectRemovableDrives()"]
|
|
67
|
+
D -- "none" --> X["✖ exit 1: no removable USB drive"]
|
|
68
|
+
D -- "1 drive" --> E["auto-pick that drive"]
|
|
69
|
+
D -- "many" --> F["prompt: Choose a drive [1-N]"]
|
|
70
|
+
E --> G["HOME = <mount>/.constella"]
|
|
71
|
+
F --> G
|
|
72
|
+
H --> I["mkdir HOME/organizations"]
|
|
73
|
+
G --> I
|
|
74
|
+
I --> J["persist secrets to HOME/.env (chmod 600)"]
|
|
75
|
+
J --> K{"free space on HOME"}
|
|
76
|
+
K -- "< 32 GB" --> Y["✖ exit 1: needs ≥ 32 GB"]
|
|
77
|
+
K -- "≥ 32 GB" --> OK["• good"]
|
|
78
|
+
OK --> M["drizzle migrate → DB on the drive"]
|
|
79
|
+
M --> N["boot web (0.0.0.0) + worker (supervised)"]
|
|
80
|
+
N --> Z["login (email + password) → Planner"]
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
1. **Launch** — `npx constella --portable`, optionally `--path <drive>` to skip detection.
|
|
84
|
+
2. **Pick the drive** — with no explicit path, `pickUsbHome()` calls `detectRemovableDrives()` and either auto-uses the single drive or prompts you to choose.
|
|
85
|
+
3. **Set the runtime root** — `HOME = join(chosen.mount, ".constella")`, exported as `CONSTELLA_HOME`.
|
|
86
|
+
4. **Persist secrets** — `BETTER_AUTH_SECRET`, `CONSTELLA_VAULT_KEY`, `CONSTELLA_WORKER_SECRET` written once to `<USB>/.constella/.env` (`mode: 0o600`).
|
|
87
|
+
5. **Validate free space** — refuse `< 32 GB`; `≥ 32 GB` is good.
|
|
88
|
+
6. **Apply schema** — `drizzle-kit migrate` builds the database at `<USB>/.constella/constella.db`.
|
|
89
|
+
7. **Boot** — supervised web (`next start -H 0.0.0.0`) + worker (`bin/worker.mjs`), with auto-restart on crash.
|
|
90
|
+
8. **Log in** — email + password, then onboarding (first run) or straight to the Planner.
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Key concepts ⭐
|
|
95
|
+
|
|
96
|
+
### USB drive detection (`detectRemovableDrives`)
|
|
97
|
+
|
|
98
|
+
`bin/constella.mjs` enumerates mounted **removable** drives per OS, dependency-free, returning `[{ mount, label, freeBytes }]`:
|
|
99
|
+
|
|
100
|
+
| OS | Probe | Removable filter |
|
|
101
|
+
| --- | --- | --- |
|
|
102
|
+
| Windows (`win32`) | `Get-CimInstance Win32_Volume -Filter "DriveType=2"` via `powershell -NoProfile` | `DriveType=2` (removable) + has a `DriveLetter`; mount = `<letter>:\` |
|
|
103
|
+
| macOS (`darwin`) | list `/Volumes`, then `diskutil info <vol>` | matches `Removable Media: (Removable|Yes)` **or** `Protocol: USB`, and **not** `Internal: Yes` |
|
|
104
|
+
| Linux | `lsblk -rpno NAME,RM,MOUNTPOINT,LABEL` | `RM == "1"` (removable) **and** has a mountpoint |
|
|
105
|
+
|
|
106
|
+
Each entry's free space comes from the same dependency-free probe used for the size gate (`Get-PSDrive` on Windows, `df -k` on POSIX).
|
|
107
|
+
|
|
108
|
+
### `pickUsbHome()` selection
|
|
109
|
+
|
|
110
|
+
```text
|
|
111
|
+
no drives → ✖ "Portable mode: no removable USB drive detected. Insert a pen-drive (or pass --path <drive>)." → exit 1
|
|
112
|
+
exactly one → "• Using the only USB drive: <label> (<mount>, <N> GB free)"
|
|
113
|
+
two or more → list "[1] <label> <mount> · <N> GB free", prompt "Choose a drive [1-N]:"
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
The result is always `<mount>/.constella` — the runtime root on the drive.
|
|
117
|
+
|
|
118
|
+
### `--path` and `CONSTELLA_HOME` — skip detection
|
|
119
|
+
|
|
120
|
+
You don't have to rely on detection. An explicit runtime root wins:
|
|
121
|
+
|
|
122
|
+
```js
|
|
123
|
+
const explicitHome = process.env.CONSTELLA_HOME ?? flag("--path");
|
|
124
|
+
let HOME = explicitHome ?? join(homedir(), ".constella");
|
|
125
|
+
if (runMode === "portable" && !explicitHome) HOME = await pickUsbHome();
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
So `--path E:\` (or `CONSTELLA_HOME=E:\.constella`) pins the root directly and `pickUsbHome()` is skipped entirely. This is the way to use a drive that detection can't classify as removable (some SSD enclosures, mounted images, network drives) — at the cost of skipping the removable check, though the free-space gate still runs against the chosen path.
|
|
129
|
+
|
|
130
|
+
### Free-space gate (`32 GB` fatal minimum)
|
|
131
|
+
|
|
132
|
+
The launcher checks the drive **before** installing or booting:
|
|
133
|
+
|
|
134
|
+
```js
|
|
135
|
+
// Portable: validate the drive BEFORE installing/booting (minimum 32 GB free; no upper recommendation).
|
|
136
|
+
if (runMode === "portable") {
|
|
137
|
+
const free = freeBytes(HOME);
|
|
138
|
+
const gb = Math.round((free / 1e9) * 10) / 10;
|
|
139
|
+
if (free && free < 32e9) { console.error(`✖ Portable needs at least 32 GB free — only ${gb} GB on ${HOME}. Use a bigger drive.`); process.exit(1); }
|
|
140
|
+
else if (free) console.log(`• ${gb} GB free on the drive — good (32 GB minimum; more headroom only helps if you carry local models).`);
|
|
141
|
+
}
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
The same threshold is exported from `src/server/portable.ts` for the UI to reuse:
|
|
145
|
+
|
|
146
|
+
```ts
|
|
147
|
+
export const PORTABLE_MIN_GB = 32;
|
|
148
|
+
export const PORTABLE_RECOMMENDED_GB = 32; // recommended == minimum; there is no separate warn tier
|
|
149
|
+
export function checkUsbFreeSpace(path: string): UsbSpace { /* ok / freeGb / message */ }
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
`checkUsbFreeSpace` returns `{ ok, warn, freeGb, minGb, recommendedGb, message }` (with `warn` always `false`) so the app can render the same verdict the launcher prints.
|
|
153
|
+
|
|
154
|
+
> Note the guard is `if (free && free < …)` — when the probe **fails** and returns `0`, the gate is skipped (it does not block boot on an unreadable probe). Detection prints a non-zero size for a real drive; a `0` means the `Get-PSDrive`/`df` probe couldn't read the volume.
|
|
155
|
+
|
|
156
|
+
### Carry app + models + projects
|
|
157
|
+
|
|
158
|
+
Because `CONSTELLA_HOME` is on the drive, everything that hangs off the runtime root rides along:
|
|
159
|
+
|
|
160
|
+
- **Database** — `DATABASE_URL = file:<USB>/.constella/constella.db` (set in `bin/constella.mjs`).
|
|
161
|
+
- **Secrets + vault** — `<USB>/.constella/.env` (`chmod 600`); provider keys are AES-256-GCM-encrypted in the `vault` table with `CONSTELLA_VAULT_KEY`.
|
|
162
|
+
- **Organizations & workspaces** — `<USB>/.constella/organizations/<orgId>/workspace/` (the FS-as-truth project tree; see [ARCHITECTURE](./ARCHITECTURE.md)).
|
|
163
|
+
- **Caches** — e.g. `<USB>/.constella/cache/models-dev.json` (models catalog), update backups under `<USB>/.constella/backups/`.
|
|
164
|
+
- **Local models** — GGUF files you download for the embed/chat servers live under the runtime root, so RAG ([MEMORY_RAG](./MEMORY_RAG.md)) and local inference ([MODELS](./MODELS.md)) travel with the drive. Only **32 GB** free is required to boot; **models, engine, CUDA, npm, projects** add up fast, so carry more headroom if you intend to run local models — but it is informational, not a gate.
|
|
165
|
+
|
|
166
|
+
Beyond the 32 GB minimum, more space is purely informational — it only matters if you carry local models (**models, engine, CUDA, npm, projects** add up fast).
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
## Tables 🪐
|
|
171
|
+
|
|
172
|
+
### Portable constants & functions
|
|
173
|
+
|
|
174
|
+
| Symbol | File | Meaning |
|
|
175
|
+
| --- | --- | --- |
|
|
176
|
+
| `PORTABLE_MIN_GB = 32` | `src/server/portable.ts` | Hard floor — below this, portable refuses to start. |
|
|
177
|
+
| `PORTABLE_RECOMMENDED_GB = 32` | `src/server/portable.ts` | Equal to the minimum — there is no separate warn tier; more space only helps if you carry local models. |
|
|
178
|
+
| `freeBytes(path)` | `src/server/portable.ts` & `bin/constella.mjs` | Free bytes on the volume holding `path`; `0` if the probe fails. |
|
|
179
|
+
| `checkUsbFreeSpace(path)` | `src/server/portable.ts` | `{ ok, warn, freeGb, minGb, recommendedGb, message }` for the UI. |
|
|
180
|
+
| `verifyDownloadedFileSize(path, expected)` | `src/server/portable.ts` | Catches truncated/corrupt downloads (2% tolerance) — guards model/file fetches on the drive. |
|
|
181
|
+
| `detectRemovableDrives()` | `bin/constella.mjs` | Per-OS list of mounted USB drives `[{ mount, label, freeBytes }]`. |
|
|
182
|
+
| `pickUsbHome()` | `bin/constella.mjs` | Interactive/auto drive pick → `<mount>/.constella`. |
|
|
183
|
+
|
|
184
|
+
### Environment exported by the launcher (portable)
|
|
185
|
+
|
|
186
|
+
| Variable | Value in portable | Source |
|
|
187
|
+
| --- | --- | --- |
|
|
188
|
+
| `CONSTELLA_RUN_MODE` | `portable` | from the `--portable` flag |
|
|
189
|
+
| `CONSTELLA_HOME` | `<USB>/.constella` | `pickUsbHome()` or `--path` / explicit env |
|
|
190
|
+
| `DATABASE_URL` | `file:<USB>/.constella/constella.db` | derived from `CONSTELLA_HOME` |
|
|
191
|
+
| `CONSTELLA_PUBLIC` | `1` | a CLI launch is the public runtime |
|
|
192
|
+
| `CONSTELLA_VERSION` | installed version | `package.json` |
|
|
193
|
+
| `CONSTELLA_PKG_ROOT` | the installed package root | `bin/constella.mjs` |
|
|
194
|
+
| host | `0.0.0.0` (override `--host`) | `runMode === "portable"` |
|
|
195
|
+
| port | `3000` (override `--port` / `PORT`) | default |
|
|
196
|
+
|
|
197
|
+
### Persisted secrets (`<USB>/.constella/.env`, `mode 0o600`)
|
|
198
|
+
|
|
199
|
+
| Secret | Purpose |
|
|
200
|
+
| --- | --- |
|
|
201
|
+
| `BETTER_AUTH_SECRET` | session signing — a real key, never the public default (login required in portable) |
|
|
202
|
+
| `CONSTELLA_VAULT_KEY` | AES-256-GCM key for the encrypted `vault` table |
|
|
203
|
+
| `CONSTELLA_WORKER_SECRET` | `x-worker-secret` header the worker uses to reach the web process |
|
|
204
|
+
|
|
205
|
+
---
|
|
206
|
+
|
|
207
|
+
## Portable path layout 🌌
|
|
208
|
+
|
|
209
|
+
```mermaid
|
|
210
|
+
flowchart TD
|
|
211
|
+
USB["<USB drive> (e.g. E:\\ or /Volumes/CONSTELLA)"] --> ROOT[".constella/ (= CONSTELLA_HOME)"]
|
|
212
|
+
ROOT --> ENV[".env (chmod 600: BETTER_AUTH_SECRET, CONSTELLA_VAULT_KEY, CONSTELLA_WORKER_SECRET)"]
|
|
213
|
+
ROOT --> DB["constella.db (DATABASE_URL = file:<USB>/.constella/constella.db)"]
|
|
214
|
+
ROOT --> CACHE["cache/ (models-dev.json, …)"]
|
|
215
|
+
ROOT --> BK["backups/ (pre-update .env + db snapshots)"]
|
|
216
|
+
ROOT --> ORGS["organizations/"]
|
|
217
|
+
ORGS --> ORG["<orgId>/"]
|
|
218
|
+
ORG --> WS["workspace/ (FS-as-truth project tree)"]
|
|
219
|
+
WS --> CLAUDE[".claude/ (agents, skills, BRIEF.md)"]
|
|
220
|
+
WS --> SPECS["specs/ · issues/ · DOCS/ · PO/ · Reports/"]
|
|
221
|
+
WS --> PROJ["(your real product source)"]
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
Everything inside `.constella/` is on the drive; nothing is written to the host's `~`. Unplug the drive and the host is clean.
|
|
225
|
+
|
|
226
|
+
---
|
|
227
|
+
|
|
228
|
+
## Step-by-step 🚀
|
|
229
|
+
|
|
230
|
+
### 1. Pick a drive
|
|
231
|
+
|
|
232
|
+
**≥ 32 GB** free is the minimum and is enough to boot. If you intend to carry local models, give yourself more headroom — but that is a sizing preference, not a requirement. A fast USB 3.x / USB-C drive matters — agents, builds and the SQLite database all do real I/O.
|
|
233
|
+
|
|
234
|
+
### 2. Boot from the drive
|
|
235
|
+
|
|
236
|
+
Auto-detect the USB drive:
|
|
237
|
+
|
|
238
|
+
```bash
|
|
239
|
+
npx constella --portable
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
- One drive → it's used automatically.
|
|
243
|
+
- Many drives → you're prompted: `Choose a drive [1-N]:`.
|
|
244
|
+
|
|
245
|
+
Or pin the runtime root explicitly (skips detection):
|
|
246
|
+
|
|
247
|
+
```bash
|
|
248
|
+
npx constella --portable --path E:\
|
|
249
|
+
# or, on macOS / Linux:
|
|
250
|
+
npx constella --portable --path /Volumes/CONSTELLA
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
You can also set it via env:
|
|
254
|
+
|
|
255
|
+
```bash
|
|
256
|
+
CONSTELLA_HOME=/Volumes/CONSTELLA/.constella npx constella --portable
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
### 3. Watch the boot output
|
|
260
|
+
|
|
261
|
+
```text
|
|
262
|
+
• Secrets ready (stored in E:\.constella\.env, never printed).
|
|
263
|
+
• 240.0 GB free on the drive — good (32 GB minimum; more headroom only helps if you carry local models).
|
|
264
|
+
Constella runtime root : E:\.constella
|
|
265
|
+
Mode : portable · 0.0.0.0:3000
|
|
266
|
+
• Starting: next start -H 0.0.0.0 -p 3000 … + worker
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
### 4. Log in
|
|
270
|
+
|
|
271
|
+
Open `http://localhost:3000` (or `http://<host-ip>:3000` from another device on the network, since it binds `0.0.0.0`). Portable requires email + password — first boot runs [ONBOARDING](./ONBOARDING.md); after that you're taken to the Planner.
|
|
272
|
+
|
|
273
|
+
### 5. Move to another machine
|
|
274
|
+
|
|
275
|
+
Eject the drive cleanly, plug it into the next machine, and run `npx constella --portable` again. The same `CONSTELLA_HOME` on the drive carries your database, vault, secrets, workspaces and any local models — same identity, same history.
|
|
276
|
+
|
|
277
|
+
---
|
|
278
|
+
|
|
279
|
+
## Examples 🛰️
|
|
280
|
+
|
|
281
|
+
Auto-detect, single drive:
|
|
282
|
+
|
|
283
|
+
```bash
|
|
284
|
+
$ npx constella --portable
|
|
285
|
+
• Using the only USB drive: CONSTELLA (E:\, 240.0 GB free)
|
|
286
|
+
• Secrets ready (stored in E:\.constella\.env, never printed).
|
|
287
|
+
• 240.0 GB free on the drive — good (32 GB minimum; more headroom only helps if you carry local models).
|
|
288
|
+
Constella runtime root : E:\.constella
|
|
289
|
+
Mode : portable · 0.0.0.0:3000
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
Multiple drives:
|
|
293
|
+
|
|
294
|
+
```bash
|
|
295
|
+
$ npx constella --portable
|
|
296
|
+
Detected USB drives:
|
|
297
|
+
[1] CONSTELLA E:\ · 240.0 GB free
|
|
298
|
+
[2] BACKUP F:\ · 64.0 GB free
|
|
299
|
+
Choose a drive [1-2]: 1
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
Too-small drive (fatal):
|
|
303
|
+
|
|
304
|
+
```bash
|
|
305
|
+
$ npx constella --portable --path G:\
|
|
306
|
+
✖ Portable needs at least 32 GB free — only 14.6 GB on G:\.constella. Use a bigger drive.
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
Modest-but-sufficient drive (boots, no warning):
|
|
310
|
+
|
|
311
|
+
```bash
|
|
312
|
+
$ npx constella --portable --path F:\
|
|
313
|
+
• 64.0 GB free on the drive — good (32 GB minimum; more headroom only helps if you carry local models).
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
No drive present:
|
|
317
|
+
|
|
318
|
+
```bash
|
|
319
|
+
$ npx constella --portable
|
|
320
|
+
✖ Portable mode: no removable USB drive detected. Insert a pen-drive (or pass --path <drive>).
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
---
|
|
324
|
+
|
|
325
|
+
## Possible states ⭐
|
|
326
|
+
|
|
327
|
+
| Condition | Behaviour |
|
|
328
|
+
| --- | --- |
|
|
329
|
+
| No removable drive, no `--path` | `pickUsbHome()` errors → **exit 1** |
|
|
330
|
+
| Exactly one removable drive | auto-selected, logged |
|
|
331
|
+
| Multiple removable drives | interactive prompt `Choose a drive [1-N]` |
|
|
332
|
+
| `--path` / `CONSTELLA_HOME` set | detection skipped, that path is the root |
|
|
333
|
+
| Free `< 32 GB` (probe succeeded) | **fatal**, exit 1 |
|
|
334
|
+
| Free `≥ 32 GB` | `• good`, continue (no warn tier) |
|
|
335
|
+
| Probe returned `0` (unreadable) | gate skipped — boots without a space check |
|
|
336
|
+
| Fresh DB on the drive | `drizzle-kit migrate` builds tables; failure on a fresh DB is fatal |
|
|
337
|
+
| Existing DB on the drive | migrate is idempotent; a failed re-run on an existing DB is a non-fatal warning |
|
|
338
|
+
| Missing `BETTER_AUTH_SECRET` at runtime | `reconcileOnBoot()` → `assertAuthSecret()` fails closed → **process exits** (portable is a network mode) |
|
|
339
|
+
|
|
340
|
+
---
|
|
341
|
+
|
|
342
|
+
## Related integrations 🪐
|
|
343
|
+
|
|
344
|
+
- **Update** ([UPDATE](./UPDATE.md)) — `detectRunContext()` returns `"portable"`; `startUpdate()` does **not** auto-run on portable. It backs up `.env` + db to `<USB>/.constella/backups/<timestamp>/`, then returns the command and *"Portable: ensure free space, back up the drive, then run: `npm install -g constella@latest`"* with `needsRestart: true`.
|
|
345
|
+
- **Local models / RAG** ([MODELS](./MODELS.md), [MEMORY_RAG](./MEMORY_RAG.md)) — GGUF models and embed/chat servers run off the drive's runtime root; the 32 GB minimum boots, but local models are why you'd carry a larger drive.
|
|
346
|
+
- **Auth** ([AUTH_MODE](./AUTH_MODE.md)) — portable shares the email+password login requirement and the persisted `BETTER_AUTH_SECRET`.
|
|
347
|
+
- **VPS** ([VPS_MODE](./VPS_MODE.md)) — shares the `0.0.0.0` bind; differs in that VPS runs in Docker over a tailnet, portable runs off a drive.
|
|
348
|
+
- **Configuration** ([CONFIGURATION](./CONFIGURATION.md)) — `CONSTELLA_HOME`, `CONSTELLA_RUN_MODE`, `DATABASE_URL` and the secret env vars are documented there.
|
|
349
|
+
|
|
350
|
+
---
|
|
351
|
+
|
|
352
|
+
## Security 🕳️
|
|
353
|
+
|
|
354
|
+
- **Login is mandatory.** `requiresLogin: true`; there is no auto-operator. Boot fails closed if `BETTER_AUTH_SECRET` is missing (`reconcileOnBoot → assertAuthSecret`), so a portable instance can never sign sessions with better-auth's forgeable public default key.
|
|
355
|
+
- **Binds `0.0.0.0`.** The portable instance is reachable on the host's network. Treat the host network as part of your trust boundary — prefer a trusted LAN, or override with `--host 127.0.0.1` if you only need local access on the plugged-in machine.
|
|
356
|
+
- **Secrets stay on the drive.** `<USB>/.constella/.env` is written `mode 0o600`; provider tokens are AES-256-GCM-encrypted in the `vault` table with `CONSTELLA_VAULT_KEY` (which is itself on the drive). **The drive is the keyring** — physical loss of the drive is loss of the secrets, so encrypt the drive at rest (BitLocker / FileVault / LUKS) and back it up.
|
|
357
|
+
- **Workspace jail still applies.** Agent file access goes through `safe()` in `src/lib/fs-workspace.ts` (lexical + symlink checks) — agents cannot escape `<USB>/.constella/organizations/<orgId>/workspace/` onto the host filesystem.
|
|
358
|
+
- **No host residue.** Nothing is written to the host's `~/.constella`; pulling the drive leaves the host clean.
|
|
359
|
+
|
|
360
|
+
See [SECURITY](./SECURITY.md) for the full model.
|
|
361
|
+
|
|
362
|
+
---
|
|
363
|
+
|
|
364
|
+
## Troubleshooting 🌠
|
|
365
|
+
|
|
366
|
+
| Symptom | Cause / fix |
|
|
367
|
+
| --- | --- |
|
|
368
|
+
| `✖ no removable USB drive detected` | The drive isn't classified as removable (enclosure/SSD/network mount). Pass `--path <drive>` to skip detection. |
|
|
369
|
+
| `✖ Portable needs at least 32 GB free` | The chosen volume has `< 32 GB` free — use a bigger drive or free space. |
|
|
370
|
+
| `• … GB free on the drive — good` | At or above the 32 GB minimum; boot continues. Carry a larger drive if you intend to keep local models. |
|
|
371
|
+
| No space message at all | The `freeBytes` probe returned `0` (couldn't read the volume) → the gate is skipped. Verify the drive mounts and `Get-PSDrive`/`df` can see it. |
|
|
372
|
+
| Wrong drive auto-picked | More than one removable drive — re-run and choose the index, or pin with `--path`. |
|
|
373
|
+
| Can't reach it from another machine | It binds `0.0.0.0`; check host firewall and use `http://<host-ip>:3000`. For local-only, add `--host 127.0.0.1`. |
|
|
374
|
+
| `✖ Database schema migration failed on a fresh database` | The drive's filesystem may not support the DB writes (some FAT/exFAT quirks) or is full/read-only — try another drive or filesystem. |
|
|
375
|
+
| Schema migrate *skipped/failed on an existing DB* | Non-fatal warning on an already-built DB; boot continues. |
|
|
376
|
+
| `update` says it can't auto-run | Expected on portable — back up, ensure free space, run the printed `npm install -g constella@latest`, then restart. |
|
|
377
|
+
|
|
378
|
+
More: [TROUBLESHOOTING](./TROUBLESHOOTING.md) · [FAQ](./FAQ.md).
|
|
379
|
+
|
|
380
|
+
---
|
|
381
|
+
|
|
382
|
+
## Related links ⭐
|
|
383
|
+
|
|
384
|
+
- [START_MODE](./START_MODE.md) · [AUTH_MODE](./AUTH_MODE.md) · [VPS_MODE](./VPS_MODE.md)
|
|
385
|
+
- [INSTALLATION](./INSTALLATION.md) · [ONBOARDING](./ONBOARDING.md) · [CONFIGURATION](./CONFIGURATION.md)
|
|
386
|
+
- [ARCHITECTURE](./ARCHITECTURE.md) · [MODELS](./MODELS.md) · [MEMORY_RAG](./MEMORY_RAG.md)
|
|
387
|
+
- [UPDATE](./UPDATE.md) · [SECURITY](./SECURITY.md) · [TROUBLESHOOTING](./TROUBLESHOOTING.md) · [FAQ](./FAQ.md)
|