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
|
+
[← Índice](./README.md) · [🇬🇧 English](../en/PORTABLE_MODE.md) · [✦ Constella](../../README.pt-BR.md)
|
|
2
|
+
|
|
3
|
+
# Modo Portátil 🛰️
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
Leve a nave de controle inteira em um pen drive. O Modo Portátil inicializa o Constella — app, banco de dados, vault, modelos locais, projetos — direto de um drive removível, para que a mesma constelação te acompanhe de máquina em máquina sem deixar rastro no host.
|
|
8
|
+
|
|
9
|
+
> Modo de execução `portable` (`src/lib/run-mode.ts`): `requiresLogin: true`, nota *"USB drive mounted as root across machines."*
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Quando usar 🌌
|
|
14
|
+
|
|
15
|
+
Use o Modo Portátil quando quiser que todo o runtime — segredos, agentes, nebulosa de memória e projetos — viva em um drive que você carrega fisicamente, e não no computador host:
|
|
16
|
+
|
|
17
|
+
- Uma estação compartilhada / emprestada / restrita onde você **não** quer um runtime root em `~`.
|
|
18
|
+
- Mover-se entre um desktop, um notebook e uma máquina de bancada mantendo uma identidade e um banco de dados.
|
|
19
|
+
- Um setup air-gapped ou de campo onde você carrega modelos GGUF locais no mesmo drive.
|
|
20
|
+
- Demos e resposta a incidentes onde "plugar, iniciar, desplugar" é a história inteira.
|
|
21
|
+
|
|
22
|
+
Prefira outro modo quando:
|
|
23
|
+
|
|
24
|
+
| Você quer | Use no lugar |
|
|
25
|
+
| --- | --- |
|
|
26
|
+
| Local apenas, sem login, início mais rápido | [START_MODE](./START_MODE.md) |
|
|
27
|
+
| Login real no diretório home desta máquina | [AUTH_MODE](./AUTH_MODE.md) |
|
|
28
|
+
| Servidor sempre-ligado acessível por uma tailnet | [VPS_MODE](./VPS_MODE.md) |
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Como funciona 🪐
|
|
33
|
+
|
|
34
|
+
O Modo Portátil é um dos quatro modos de execução (`RunMode = "start" | "auth" | "vps" | "portable"`). O launcher `bin/constella.mjs` o seleciona, valida um drive removível, aponta o **runtime root** para `<USB>/.constella`, e então inicializa o mesmo runtime de processo duplo (web + worker) de todos os outros modos.
|
|
35
|
+
|
|
36
|
+
As diferenças que definem `portable`:
|
|
37
|
+
|
|
38
|
+
- **Login obrigatório** — `RUN_MODES.portable.requiresLogin === true`. Não há operador automático; você entra com e-mail + senha (better-auth).
|
|
39
|
+
- **Runtime root no drive** — `CONSTELLA_HOME = <USB>/.constella`, então o banco de dados, segredos, vault, workspaces e caches vivem todos no drive.
|
|
40
|
+
- **Faz bind em `0.0.0.0`** — assim como `vps`, o host por padrão escuta em todas as interfaces para que a instância portátil seja acessível na máquina onde está plugada (`host = ... runMode === "vps" || runMode === "portable" ? "0.0.0.0" : "127.0.0.1"`).
|
|
41
|
+
- **O tamanho do drive é validado** — `< 32 GB` livres é **fatal**; `≥ 32 GB` é **bom** (constantes `PORTABLE_MIN_GB = 32`, `PORTABLE_RECOMMENDED_GB = 32` em `src/server/portable.ts`). Mais folga só ajuda se você carregar modelos locais — nunca é um aviso nem uma barreira.
|
|
42
|
+
|
|
43
|
+
### Selecionando o modo
|
|
44
|
+
|
|
45
|
+
`bin/constella.mjs` resolve o modo de execução a partir de flags, com um fallback legado:
|
|
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
|
+
Assim, `--portable` (ou o legado `--bind portable`) seleciona o Modo Portátil. O modo escolhido é exportado como `CONSTELLA_RUN_MODE=portable`, lido em runtime por `getRunMode()`, e persistido em `organization.runMode` durante o onboarding (a coluna `runMode` é `text(... { enum: ["start", "auth", "vps", "portable"] })` em `src/db/schema.ts`).
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## Fluxo principal 🌠
|
|
60
|
+
|
|
61
|
+
```mermaid
|
|
62
|
+
flowchart TD
|
|
63
|
+
A["npx constella --portable [--path <drive>]"] --> B{"--path ou CONSTELLA_HOME definido?"}
|
|
64
|
+
B -- "sim" --> H["HOME = caminho explícito"]
|
|
65
|
+
B -- "não" --> C["pickUsbHome()"]
|
|
66
|
+
C --> D["detectRemovableDrives()"]
|
|
67
|
+
D -- "nenhum" --> X["✖ exit 1: nenhum drive USB removível"]
|
|
68
|
+
D -- "1 drive" --> E["seleciona esse drive automaticamente"]
|
|
69
|
+
D -- "vários" --> F["pergunta: 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["persiste segredos em HOME/.env (chmod 600)"]
|
|
75
|
+
J --> K{"espaço livre em HOME"}
|
|
76
|
+
K -- "< 32 GB" --> Y["✖ exit 1: precisa de ≥ 32 GB"]
|
|
77
|
+
K -- "≥ 32 GB" --> OK["• bom"]
|
|
78
|
+
OK --> M["drizzle migrate → DB no drive"]
|
|
79
|
+
M --> N["inicializa web (0.0.0.0) + worker (supervisionado)"]
|
|
80
|
+
N --> Z["login (e-mail + senha) → Planner"]
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
1. **Iniciar** — `npx constella --portable`, opcionalmente `--path <drive>` para pular a detecção.
|
|
84
|
+
2. **Escolher o drive** — sem caminho explícito, `pickUsbHome()` chama `detectRemovableDrives()` e usa automaticamente o único drive ou pede que você escolha.
|
|
85
|
+
3. **Definir o runtime root** — `HOME = join(chosen.mount, ".constella")`, exportado como `CONSTELLA_HOME`.
|
|
86
|
+
4. **Persistir segredos** — `BETTER_AUTH_SECRET`, `CONSTELLA_VAULT_KEY`, `CONSTELLA_WORKER_SECRET` gravados uma vez em `<USB>/.constella/.env` (`mode: 0o600`).
|
|
87
|
+
5. **Validar espaço livre** — recusa `< 32 GB`; `≥ 32 GB` é bom.
|
|
88
|
+
6. **Aplicar schema** — `drizzle-kit migrate` constrói o banco em `<USB>/.constella/constella.db`.
|
|
89
|
+
7. **Inicializar** — web supervisionado (`next start -H 0.0.0.0`) + worker (`bin/worker.mjs`), com reinício automático em caso de crash.
|
|
90
|
+
8. **Entrar** — e-mail + senha, depois onboarding (primeira execução) ou direto para o Planner.
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Conceitos-chave ⭐
|
|
95
|
+
|
|
96
|
+
### Detecção de drive USB (`detectRemovableDrives`)
|
|
97
|
+
|
|
98
|
+
`bin/constella.mjs` enumera os drives **removíveis** montados por SO, sem dependências, retornando `[{ mount, label, freeBytes }]`:
|
|
99
|
+
|
|
100
|
+
| SO | Sonda | Filtro de removível |
|
|
101
|
+
| --- | --- | --- |
|
|
102
|
+
| Windows (`win32`) | `Get-CimInstance Win32_Volume -Filter "DriveType=2"` via `powershell -NoProfile` | `DriveType=2` (removível) + tem `DriveLetter`; mount = `<letra>:\` |
|
|
103
|
+
| macOS (`darwin`) | lista `/Volumes`, depois `diskutil info <vol>` | bate `Removable Media: (Removable|Yes)` **ou** `Protocol: USB`, e **não** `Internal: Yes` |
|
|
104
|
+
| Linux | `lsblk -rpno NAME,RM,MOUNTPOINT,LABEL` | `RM == "1"` (removível) **e** tem um mountpoint |
|
|
105
|
+
|
|
106
|
+
O espaço livre de cada entrada vem da mesma sonda sem dependências usada no gate de tamanho (`Get-PSDrive` no Windows, `df -k` em POSIX).
|
|
107
|
+
|
|
108
|
+
### Seleção em `pickUsbHome()`
|
|
109
|
+
|
|
110
|
+
```text
|
|
111
|
+
nenhum drive → ✖ "Portable mode: no removable USB drive detected. Insert a pen-drive (or pass --path <drive>)." → exit 1
|
|
112
|
+
exatamente um → "• Using the only USB drive: <label> (<mount>, <N> GB free)"
|
|
113
|
+
dois ou mais → lista "[1] <label> <mount> · <N> GB free", pergunta "Choose a drive [1-N]:"
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
O resultado é sempre `<mount>/.constella` — o runtime root no drive.
|
|
117
|
+
|
|
118
|
+
### `--path` e `CONSTELLA_HOME` — pular a detecção
|
|
119
|
+
|
|
120
|
+
Você não precisa depender da detecção. Um runtime root explícito vence:
|
|
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
|
+
Assim, `--path E:\` (ou `CONSTELLA_HOME=E:\.constella`) fixa o root diretamente e `pickUsbHome()` é totalmente pulado. Esse é o jeito de usar um drive que a detecção não consegue classificar como removível (alguns gabinetes SSD, imagens montadas, drives de rede) — ao custo de pular a verificação de removível, embora o gate de espaço livre ainda rode contra o caminho escolhido.
|
|
129
|
+
|
|
130
|
+
### Gate de espaço livre (`32 GB` mínimo fatal)
|
|
131
|
+
|
|
132
|
+
O launcher verifica o drive **antes** de instalar ou inicializar:
|
|
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
|
+
O mesmo limiar é exportado de `src/server/portable.ts` para a UI reutilizar:
|
|
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` retorna `{ ok, warn, freeGb, minGb, recommendedGb, message }` (com `warn` sempre `false`) para que o app possa renderizar o mesmo veredicto que o launcher imprime.
|
|
153
|
+
|
|
154
|
+
> Note que o guard é `if (free && free < …)` — quando a sonda **falha** e retorna `0`, o gate é pulado (não bloqueia o boot diante de uma sonda ilegível). A detecção imprime um tamanho diferente de zero para um drive real; um `0` significa que a sonda `Get-PSDrive`/`df` não conseguiu ler o volume.
|
|
155
|
+
|
|
156
|
+
### Carregar app + modelos + projetos
|
|
157
|
+
|
|
158
|
+
Como `CONSTELLA_HOME` está no drive, tudo que pende do runtime root vai junto:
|
|
159
|
+
|
|
160
|
+
- **Banco de dados** — `DATABASE_URL = file:<USB>/.constella/constella.db` (definido em `bin/constella.mjs`).
|
|
161
|
+
- **Segredos + vault** — `<USB>/.constella/.env` (`chmod 600`); as chaves de provider são criptografadas com AES-256-GCM na tabela `vault` usando `CONSTELLA_VAULT_KEY`.
|
|
162
|
+
- **Organizações & workspaces** — `<USB>/.constella/organizations/<orgId>/workspace/` (a árvore de projeto FS-como-verdade; veja [ARCHITECTURE](./ARCHITECTURE.md)).
|
|
163
|
+
- **Caches** — ex. `<USB>/.constella/cache/models-dev.json` (catálogo de modelos), backups de update em `<USB>/.constella/backups/`.
|
|
164
|
+
- **Modelos locais** — os arquivos GGUF que você baixa para os servidores de embed/chat vivem sob o runtime root, então o RAG ([MEMORY_RAG](./MEMORY_RAG.md)) e a inferência local ([MODELS](./MODELS.md)) viajam com o drive. Só **32 GB** livres são necessários para dar boot; **modelos, engine, CUDA, npm, projetos** somam rápido, então leve mais folga se pretende rodar modelos locais — mas é informativo, não uma barreira.
|
|
165
|
+
|
|
166
|
+
Acima do mínimo de 32 GB, mais espaço é puramente informativo — só importa se você carregar modelos locais (**modelos, engine, CUDA, npm, projetos** somam rápido).
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
## Tabelas 🪐
|
|
171
|
+
|
|
172
|
+
### Constantes & funções do portátil
|
|
173
|
+
|
|
174
|
+
| Símbolo | Arquivo | Significado |
|
|
175
|
+
| --- | --- | --- |
|
|
176
|
+
| `PORTABLE_MIN_GB = 32` | `src/server/portable.ts` | Piso rígido — abaixo disso, o portátil se recusa a iniciar. |
|
|
177
|
+
| `PORTABLE_RECOMMENDED_GB = 32` | `src/server/portable.ts` | Igual ao mínimo — não há tier de aviso separado; mais espaço só ajuda se você carregar modelos locais. |
|
|
178
|
+
| `freeBytes(path)` | `src/server/portable.ts` & `bin/constella.mjs` | Bytes livres no volume que contém `path`; `0` se a sonda falhar. |
|
|
179
|
+
| `checkUsbFreeSpace(path)` | `src/server/portable.ts` | `{ ok, warn, freeGb, minGb, recommendedGb, message }` para a UI. |
|
|
180
|
+
| `verifyDownloadedFileSize(path, expected)` | `src/server/portable.ts` | Detecta downloads truncados/corrompidos (tolerância de 2%) — protege fetches de modelo/arquivo no drive. |
|
|
181
|
+
| `detectRemovableDrives()` | `bin/constella.mjs` | Lista por SO dos drives USB montados `[{ mount, label, freeBytes }]`. |
|
|
182
|
+
| `pickUsbHome()` | `bin/constella.mjs` | Escolha de drive interativa/automática → `<mount>/.constella`. |
|
|
183
|
+
|
|
184
|
+
### Ambiente exportado pelo launcher (portátil)
|
|
185
|
+
|
|
186
|
+
| Variável | Valor no portátil | Origem |
|
|
187
|
+
| --- | --- | --- |
|
|
188
|
+
| `CONSTELLA_RUN_MODE` | `portable` | a partir da flag `--portable` |
|
|
189
|
+
| `CONSTELLA_HOME` | `<USB>/.constella` | `pickUsbHome()` ou `--path` / env explícito |
|
|
190
|
+
| `DATABASE_URL` | `file:<USB>/.constella/constella.db` | derivado de `CONSTELLA_HOME` |
|
|
191
|
+
| `CONSTELLA_PUBLIC` | `1` | um launch via CLI é o runtime público |
|
|
192
|
+
| `CONSTELLA_VERSION` | versão instalada | `package.json` |
|
|
193
|
+
| `CONSTELLA_PKG_ROOT` | o root do pacote instalado | `bin/constella.mjs` |
|
|
194
|
+
| host | `0.0.0.0` (override `--host`) | `runMode === "portable"` |
|
|
195
|
+
| port | `3000` (override `--port` / `PORT`) | padrão |
|
|
196
|
+
|
|
197
|
+
### Segredos persistidos (`<USB>/.constella/.env`, `mode 0o600`)
|
|
198
|
+
|
|
199
|
+
| Segredo | Propósito |
|
|
200
|
+
| --- | --- |
|
|
201
|
+
| `BETTER_AUTH_SECRET` | assinatura de sessão — uma chave real, nunca o default público (login obrigatório no portátil) |
|
|
202
|
+
| `CONSTELLA_VAULT_KEY` | chave AES-256-GCM para a tabela `vault` criptografada |
|
|
203
|
+
| `CONSTELLA_WORKER_SECRET` | cabeçalho `x-worker-secret` que o worker usa para alcançar o processo web |
|
|
204
|
+
|
|
205
|
+
---
|
|
206
|
+
|
|
207
|
+
## Layout de caminhos do portátil 🌌
|
|
208
|
+
|
|
209
|
+
```mermaid
|
|
210
|
+
flowchart TD
|
|
211
|
+
USB["<drive USB> (ex. E:\\ ou /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/ (snapshots de .env + db pré-update)"]
|
|
216
|
+
ROOT --> ORGS["organizations/"]
|
|
217
|
+
ORGS --> ORG["<orgId>/"]
|
|
218
|
+
ORG --> WS["workspace/ (árvore de projeto FS-como-verdade)"]
|
|
219
|
+
WS --> CLAUDE[".claude/ (agents, skills, BRIEF.md)"]
|
|
220
|
+
WS --> SPECS["specs/ · issues/ · DOCS/ · PO/ · Reports/"]
|
|
221
|
+
WS --> PROJ["(o código real do seu produto)"]
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
Tudo dentro de `.constella/` está no drive; nada é gravado no `~` do host. Desplugue o drive e o host fica limpo.
|
|
225
|
+
|
|
226
|
+
---
|
|
227
|
+
|
|
228
|
+
## Passo a passo 🚀
|
|
229
|
+
|
|
230
|
+
### 1. Escolha um drive
|
|
231
|
+
|
|
232
|
+
**≥ 32 GB** livres é o mínimo e já basta para dar boot. Se pretende carregar modelos locais, deixe mais folga — mas isso é uma preferência de dimensionamento, não um requisito. Um drive USB 3.x / USB-C rápido importa — agentes, builds e o banco SQLite fazem I/O real.
|
|
233
|
+
|
|
234
|
+
### 2. Inicialize a partir do drive
|
|
235
|
+
|
|
236
|
+
Detectar o drive USB automaticamente:
|
|
237
|
+
|
|
238
|
+
```bash
|
|
239
|
+
npx constella --portable
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
- Um drive → é usado automaticamente.
|
|
243
|
+
- Vários drives → você é questionado: `Choose a drive [1-N]:`.
|
|
244
|
+
|
|
245
|
+
Ou fixe o runtime root explicitamente (pula a detecção):
|
|
246
|
+
|
|
247
|
+
```bash
|
|
248
|
+
npx constella --portable --path E:\
|
|
249
|
+
# ou, no macOS / Linux:
|
|
250
|
+
npx constella --portable --path /Volumes/CONSTELLA
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
Você também pode definir via env:
|
|
254
|
+
|
|
255
|
+
```bash
|
|
256
|
+
CONSTELLA_HOME=/Volumes/CONSTELLA/.constella npx constella --portable
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
### 3. Observe a saída do boot
|
|
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. Faça login
|
|
270
|
+
|
|
271
|
+
Abra `http://localhost:3000` (ou `http://<host-ip>:3000` de outro dispositivo na rede, já que faz bind em `0.0.0.0`). O portátil exige e-mail + senha — o primeiro boot roda o [ONBOARDING](./ONBOARDING.md); depois você vai para o Planner.
|
|
272
|
+
|
|
273
|
+
### 5. Mude para outra máquina
|
|
274
|
+
|
|
275
|
+
Ejete o drive de forma limpa, plugue na próxima máquina e rode `npx constella --portable` novamente. O mesmo `CONSTELLA_HOME` no drive carrega seu banco de dados, vault, segredos, workspaces e quaisquer modelos locais — mesma identidade, mesmo histórico.
|
|
276
|
+
|
|
277
|
+
---
|
|
278
|
+
|
|
279
|
+
## Exemplos 🛰️
|
|
280
|
+
|
|
281
|
+
Auto-detecção, único 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
|
+
Múltiplos 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
|
+
Drive pequeno demais (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
|
+
Drive modesto-mas-suficiente (dá boot, sem aviso):
|
|
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
|
+
Nenhum drive presente:
|
|
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
|
+
## Estados possíveis ⭐
|
|
326
|
+
|
|
327
|
+
| Condição | Comportamento |
|
|
328
|
+
| --- | --- |
|
|
329
|
+
| Nenhum drive removível, sem `--path` | `pickUsbHome()` dá erro → **exit 1** |
|
|
330
|
+
| Exatamente um drive removível | auto-selecionado, registrado no log |
|
|
331
|
+
| Múltiplos drives removíveis | prompt interativo `Choose a drive [1-N]` |
|
|
332
|
+
| `--path` / `CONSTELLA_HOME` definido | detecção pulada, esse caminho é o root |
|
|
333
|
+
| Livre `< 32 GB` (sonda teve sucesso) | **fatal**, exit 1 |
|
|
334
|
+
| Livre `≥ 32 GB` | `• good`, continua (sem tier de aviso) |
|
|
335
|
+
| Sonda retornou `0` (ilegível) | gate pulado — inicializa sem verificação de espaço |
|
|
336
|
+
| DB novo no drive | `drizzle-kit migrate` constrói as tabelas; falha em um DB novo é fatal |
|
|
337
|
+
| DB existente no drive | migrate é idempotente; uma re-execução falha em um DB existente é um aviso não-fatal |
|
|
338
|
+
| `BETTER_AUTH_SECRET` ausente em runtime | `reconcileOnBoot()` → `assertAuthSecret()` falha fechado → **o processo encerra** (portátil é um modo de rede) |
|
|
339
|
+
|
|
340
|
+
---
|
|
341
|
+
|
|
342
|
+
## Integrações relacionadas 🪐
|
|
343
|
+
|
|
344
|
+
- **Update** ([UPDATE](./UPDATE.md)) — `detectRunContext()` retorna `"portable"`; `startUpdate()` **não** roda automaticamente no portátil. Faz backup de `.env` + db em `<USB>/.constella/backups/<timestamp>/`, depois retorna o comando e *"Portable: ensure free space, back up the drive, then run: `npm install -g constella@latest`"* com `needsRestart: true`.
|
|
345
|
+
- **Modelos locais / RAG** ([MODELS](./MODELS.md), [MEMORY_RAG](./MEMORY_RAG.md)) — modelos GGUF e servidores de embed/chat rodam a partir do runtime root no drive; o mínimo de 32 GB dá boot, mas os modelos locais são o motivo para levar um drive maior.
|
|
346
|
+
- **Auth** ([AUTH_MODE](./AUTH_MODE.md)) — o portátil compartilha a exigência de login por e-mail+senha e o `BETTER_AUTH_SECRET` persistido.
|
|
347
|
+
- **VPS** ([VPS_MODE](./VPS_MODE.md)) — compartilha o bind em `0.0.0.0`; difere por o VPS rodar em Docker sobre uma tailnet, enquanto o portátil roda a partir de um drive.
|
|
348
|
+
- **Configuração** ([CONFIGURATION](./CONFIGURATION.md)) — `CONSTELLA_HOME`, `CONSTELLA_RUN_MODE`, `DATABASE_URL` e as variáveis de env de segredo estão documentadas lá.
|
|
349
|
+
|
|
350
|
+
---
|
|
351
|
+
|
|
352
|
+
## Segurança 🕳️
|
|
353
|
+
|
|
354
|
+
- **Login é obrigatório.** `requiresLogin: true`; não há operador automático. O boot falha fechado se `BETTER_AUTH_SECRET` estiver ausente (`reconcileOnBoot → assertAuthSecret`), então uma instância portátil nunca pode assinar sessões com a chave pública default forjável do better-auth.
|
|
355
|
+
- **Faz bind em `0.0.0.0`.** A instância portátil é acessível na rede do host. Trate a rede do host como parte da sua fronteira de confiança — prefira uma LAN confiável, ou faça override com `--host 127.0.0.1` se só precisar de acesso local na máquina plugada.
|
|
356
|
+
- **Segredos ficam no drive.** `<USB>/.constella/.env` é gravado `mode 0o600`; tokens de provider são criptografados com AES-256-GCM na tabela `vault` usando `CONSTELLA_VAULT_KEY` (que está, ela própria, no drive). **O drive é o chaveiro** — a perda física do drive é a perda dos segredos, então criptografe o drive em repouso (BitLocker / FileVault / LUKS) e faça backup.
|
|
357
|
+
- **A jaula do workspace continua valendo.** O acesso a arquivos pelos agentes passa por `safe()` em `src/lib/fs-workspace.ts` (verificações léxica + de symlink) — agentes não conseguem escapar de `<USB>/.constella/organizations/<orgId>/workspace/` para o filesystem do host.
|
|
358
|
+
- **Sem resíduo no host.** Nada é gravado no `~/.constella` do host; retirar o drive deixa o host limpo.
|
|
359
|
+
|
|
360
|
+
Veja [SECURITY](./SECURITY.md) para o modelo completo.
|
|
361
|
+
|
|
362
|
+
---
|
|
363
|
+
|
|
364
|
+
## Solução de problemas 🌠
|
|
365
|
+
|
|
366
|
+
| Sintoma | Causa / correção |
|
|
367
|
+
| --- | --- |
|
|
368
|
+
| `✖ no removable USB drive detected` | O drive não é classificado como removível (gabinete/SSD/montagem de rede). Passe `--path <drive>` para pular a detecção. |
|
|
369
|
+
| `✖ Portable needs at least 32 GB free` | O volume escolhido tem `< 32 GB` livres — use um drive maior ou libere espaço. |
|
|
370
|
+
| `• … GB free on the drive — good` | No mínimo de 32 GB ou acima; o boot continua. Leve um drive maior se pretende manter modelos locais. |
|
|
371
|
+
| Nenhuma mensagem de espaço | A sonda `freeBytes` retornou `0` (não conseguiu ler o volume) → o gate é pulado. Verifique se o drive monta e se `Get-PSDrive`/`df` o enxerga. |
|
|
372
|
+
| Drive errado auto-selecionado | Mais de um drive removível — rode de novo e escolha o índice, ou fixe com `--path`. |
|
|
373
|
+
| Não consigo acessar de outra máquina | Faz bind em `0.0.0.0`; verifique o firewall do host e use `http://<host-ip>:3000`. Para local apenas, adicione `--host 127.0.0.1`. |
|
|
374
|
+
| `✖ Database schema migration failed on a fresh database` | O filesystem do drive pode não suportar as gravações do DB (algumas peculiaridades de FAT/exFAT) ou está cheio/somente-leitura — tente outro drive ou filesystem. |
|
|
375
|
+
| Schema migrate *skipped/failed on an existing DB* | Aviso não-fatal em um DB já construído; o boot continua. |
|
|
376
|
+
| `update` diz que não pode rodar automaticamente | Esperado no portátil — faça backup, garanta espaço livre, rode o `npm install -g constella@latest` impresso e reinicie. |
|
|
377
|
+
|
|
378
|
+
Mais: [TROUBLESHOOTING](./TROUBLESHOOTING.md) · [FAQ](./FAQ.md).
|
|
379
|
+
|
|
380
|
+
---
|
|
381
|
+
|
|
382
|
+
## Links relacionados ⭐
|
|
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)
|