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,331 @@
|
|
|
1
|
+
[← Índice](./README.md) · [🇬🇧 English](../en/DEPLOY.md) · [✦ Constella](../../README.pt-BR.md)
|
|
2
|
+
|
|
3
|
+
# Deploy (Produção) 🚀
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
Como **lançar a própria nave central** — colocar o plano de controle Constella em uma órbita durável, de produção. Esta página trata do deploy do *Constella enquanto plataforma*: Docker em uma VPS, o bootstrap `vps-install.sh`, Tailscale, boot supervisionado de dois processos e instalações portátil/global.
|
|
8
|
+
|
|
9
|
+
> **Não confundir com [PREPARE_DEPLOY](./PREPARE_DEPLOY.md) / [DEPLOY do seu projeto].** Aqueles fazem o deploy do **projeto do usuário** que os agentes constroem (exportação de árvore limpa para um repositório separado). *Esta* página faz o deploy do **próprio Constella** — a nave, não a carga.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Quando usar 🌌
|
|
14
|
+
|
|
15
|
+
| Você quer… | Use |
|
|
16
|
+
| --- | --- |
|
|
17
|
+
| Rodar o Constella 24/7 em um servidor remoto, privado para o seu tailnet | **VPS / Docker** (`Dockerfile` + `docker-compose.yml`) |
|
|
18
|
+
| Provisionar uma VPS Ubuntu nova em um comando | **`scripts/vps-install.sh`** |
|
|
19
|
+
| Carregar todo o plano de controle em um pen-drive | **Portátil** (`constella --portable`) |
|
|
20
|
+
| Instalar uma vez na sua máquina sempre ligada | **npm global** (`npm i -g constella`) |
|
|
21
|
+
| Uma execução efêmera rápida | **`npx constella`** |
|
|
22
|
+
|
|
23
|
+
Se você só quer uma instância local no seu notebook, veja [START_MODE](./START_MODE.md) e [AUTH_MODE](./AUTH_MODE.md). Para os detalhes do tailnet, veja [VPS_MODE](./VPS_MODE.md); para o pen-drive, [PORTABLE_MODE](./PORTABLE_MODE.md).
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Como funciona 🪐
|
|
28
|
+
|
|
29
|
+
Toda inicialização do Constella — local, VPS, portátil — passa pelo mesmo lançador, **`bin/constella.mjs`**. O lançador:
|
|
30
|
+
|
|
31
|
+
1. Resolve o **modo de execução** (`start | auth | vps | portable`) a partir da flag de lançamento.
|
|
32
|
+
2. Resolve a **raiz de runtime** `HOME` (`CONSTELLA_HOME` / `--path`, padrão `~/.constella`).
|
|
33
|
+
3. Gera + persiste segredos em `<HOME>/.env` (`chmod 600`): `BETTER_AUTH_SECRET`, `CONSTELLA_VAULT_KEY`, `CONSTELLA_WORKER_SECRET`.
|
|
34
|
+
4. Fixa `DATABASE_URL=file:<HOME>/constella.db` e aplica as migrações Drizzle empacotadas (`drizzle-kit migrate`).
|
|
35
|
+
5. Inicia **dois processos supervisionados**: o servidor **web** (`next start`) e o **worker** (`bin/worker.mjs`).
|
|
36
|
+
|
|
37
|
+
Um deploy é "o mesmo lançador, em um lugar mais durável" — dentro de um container, em um pen-drive ou sob uma instalação global. O modo define o host de bind e a postura de autenticação; o destino do deploy define a durabilidade.
|
|
38
|
+
|
|
39
|
+
```mermaid
|
|
40
|
+
flowchart TD
|
|
41
|
+
A["operador"] --> B["bin/constella.mjs (lançador)"]
|
|
42
|
+
B --> C{"modo de execução"}
|
|
43
|
+
C -->|"--vps"| D["Docker + Tailscale<br/>(0.0.0.0, só no tailnet)"]
|
|
44
|
+
C -->|"--portable"| E["raiz no pen-drive<br/>(0.0.0.0)"]
|
|
45
|
+
C -->|"--start / --auth"| F["host local<br/>(127.0.0.1)"]
|
|
46
|
+
B --> G["next start (web :3000)"]
|
|
47
|
+
B --> H["bin/worker.mjs (cron + watcher + Telegram)"]
|
|
48
|
+
G -. "supervisionado, auto-restart" .- B
|
|
49
|
+
H -. "supervisionado, auto-restart" .- B
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## Fluxo principal — VPS via Docker + Tailscale 🛰️
|
|
55
|
+
|
|
56
|
+
O deploy recomendado para produção. O Constella roda em um container, faz bind em `0.0.0.0` e é alcançável **apenas** pelo seu tailnet Tailscale — nunca pela internet aberta.
|
|
57
|
+
|
|
58
|
+
### A imagem — `Dockerfile`
|
|
59
|
+
|
|
60
|
+
Um build multi-estágio sobre `node:22-bookworm-slim`:
|
|
61
|
+
|
|
62
|
+
| Estágio | O que faz |
|
|
63
|
+
| --- | --- |
|
|
64
|
+
| `base` | `corepack enable`; instala `git ca-certificates` |
|
|
65
|
+
| `deps` | `pnpm install --frozen-lockfile` |
|
|
66
|
+
| `build` | `pnpm build` (com `NEXT_TELEMETRY_DISABLED=1`) |
|
|
67
|
+
| `runtime` | define `NODE_ENV=production`, `CONSTELLA_RUN_MODE=vps`, `CONSTELLA_PUBLIC=1`, `CONSTELLA_HOME=/data`; roda como o usuário não-privilegiado `node`; `VOLUME ["/data"]`; `EXPOSE 3000` |
|
|
68
|
+
|
|
69
|
+
Entrypoint:
|
|
70
|
+
|
|
71
|
+
```dockerfile
|
|
72
|
+
CMD ["node", "bin/constella.mjs", "--vps", "--host", "0.0.0.0", "--port", "3000"]
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
> **As CLIs dos agentes NÃO vêm na imagem.** A nota do Dockerfile é explícita: para agentes em uma VPS, ou adicione um passo `RUN` que instale uma CLI (`claude` / `codex`), ou use **provedores de API na nuvem** configurados no módulo [MODELS](./MODELS.md). Veja [Segurança](#segurança-).
|
|
76
|
+
|
|
77
|
+
### O stack — `docker-compose.yml`
|
|
78
|
+
|
|
79
|
+
Dois serviços compartilham um único namespace de rede, então o Constella nunca ganha sua própria porta pública:
|
|
80
|
+
|
|
81
|
+
| Serviço | Imagem / build | Papel |
|
|
82
|
+
| --- | --- | --- |
|
|
83
|
+
| `tailscale` | `tailscale/tailscale:latest` | Sidecar; entra no seu tailnet de forma headless via `TS_AUTHKEY`; `hostname: constella`; persiste estado no volume `tailscale-state` |
|
|
84
|
+
| `constella` | `build: .` | A aplicação; `network_mode: service:tailscale` (compartilha a rede do sidecar); persiste `/data` no volume `constella-data` |
|
|
85
|
+
|
|
86
|
+
`network_mode: service:tailscale` é o pivô de segurança: o Constella fica alcançável **no IP do Tailscale na porta 3000** e em nenhum outro lugar. Ambos os serviços usam `restart: unless-stopped`.
|
|
87
|
+
|
|
88
|
+
```mermaid
|
|
89
|
+
flowchart LR
|
|
90
|
+
subgraph host["host VPS"]
|
|
91
|
+
subgraph ns["namespace de rede compartilhado"]
|
|
92
|
+
TS["sidecar tailscale<br/>(entra no tailnet)"]
|
|
93
|
+
CN["app constella<br/>:3000, 0.0.0.0"]
|
|
94
|
+
end
|
|
95
|
+
V1[("constella-data<br/>volume /data")]
|
|
96
|
+
V2[("tailscale-state")]
|
|
97
|
+
end
|
|
98
|
+
CN --- V1
|
|
99
|
+
TS --- V2
|
|
100
|
+
Dev["seu dispositivo<br/>(mesmo tailnet)"] -. "http://<ts-ip>:3000" .-> TS
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### Bootstrap em um comando — `scripts/vps-install.sh`
|
|
104
|
+
|
|
105
|
+
Para um Ubuntu Server novo. O script (`set -euo pipefail`) faz, em ordem:
|
|
106
|
+
|
|
107
|
+
1. **Docker** — `curl -fsSL https://get.docker.com | sh` (só se `docker` estiver ausente).
|
|
108
|
+
2. **Tailscale** — `curl -fsSL https://tailscale.com/install.sh | sh` (só se ausente).
|
|
109
|
+
3. `sudo tailscale up` — entra no seu tailnet (imprime uma URL de auth no navegador se necessário).
|
|
110
|
+
4. **Chave de auth** — se o `.env` não tiver `TS_AUTHKEY=`, ele pede para você colar uma chave `tskey-auth-…` (criada em `https://login.tailscale.com/admin/settings/keys`) e a anexa ao `.env`.
|
|
111
|
+
5. **Up** — `sudo docker compose up -d --build`.
|
|
112
|
+
6. Imprime a URL alcançável: `http://<tailscale-ip>:3000`.
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## Passo a passo
|
|
117
|
+
|
|
118
|
+
### A) Deploy VPS a partir de um clone
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
# na VPS, com o repositório clonado
|
|
122
|
+
bash scripts/vps-install.sh
|
|
123
|
+
# → instala Docker + Tailscale, pede o TS_AUTHKEY, sobe o stack
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
Ou faça manualmente (espelha o cabeçalho do compose):
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
# 1. Obtenha uma chave de auth do Tailscale:
|
|
130
|
+
# https://login.tailscale.com/admin/settings/keys
|
|
131
|
+
echo "TS_AUTHKEY=tskey-auth-..." > .env
|
|
132
|
+
# 2. Build + start
|
|
133
|
+
docker compose up -d --build
|
|
134
|
+
# 3. Alcance o Constella no IP Tailscale do node:
|
|
135
|
+
# http://<ip-tailscale-deste-node>:3000
|
|
136
|
+
tailscale ip -4 # descubra o IP
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
No primeiro boot o lançador gera e persiste o `BETTER_AUTH_SECRET` (e os segredos de vault + worker) em `/data/.env`. Como `/data` é o volume nomeado `constella-data`, esses segredos — e as sessões de login e o vault criptografado — **sobrevivem a reinícios e rebuilds**.
|
|
140
|
+
|
|
141
|
+
### B) Deploy portátil (USB)
|
|
142
|
+
|
|
143
|
+
```bash
|
|
144
|
+
npx constella --portable # detecta e escolhe um pen-drive
|
|
145
|
+
npx constella --portable --path /Volumes/MYUSB # ou nomeie o drive
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
O lançador valida o drive **antes** de iniciar: ele **recusa < 32 GB livres** (fatal); `≥ 32 GB` dá boot. Faz bind em `0.0.0.0`. Toda a raiz de runtime fica em `<drive>/.constella`. Veja [PORTABLE_MODE](./PORTABLE_MODE.md).
|
|
149
|
+
|
|
150
|
+
### C) Instalação global (máquina própria sempre ligada)
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
npm i -g constella
|
|
154
|
+
constella --auth # email+senha, 127.0.0.1
|
|
155
|
+
# ou --start para auto-login local, ou --vps em um servidor que você administra
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### D) Efêmera
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
npx constella # modo padrão = start
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
## Boot supervisionado de dois processos 🌠
|
|
167
|
+
|
|
168
|
+
Um plano de controle 24/7 precisa sobreviver a uma falha transitória. O `bin/constella.mjs` inicia **dois filhos** e supervisiona cada um:
|
|
169
|
+
|
|
170
|
+
| Processo | Comando | Hospeda |
|
|
171
|
+
| --- | --- | --- |
|
|
172
|
+
| **web** | `next start -H <host> -p <port>` (a partir de `PKG_ROOT`) | o dashboard + todas as rotas de API |
|
|
173
|
+
| **worker** | `node bin/worker.mjs` | cron tick (~60s → `POST /api/cron/tick`), file-watcher chokidar (debounce 400ms → `/api/sync/file`), long-poll do Telegram |
|
|
174
|
+
|
|
175
|
+
Regras de supervisão (de `supervise()`):
|
|
176
|
+
|
|
177
|
+
- Em uma saída inesperada de um filho, **auto-restart após 2s** — não um shutdown completo.
|
|
178
|
+
- **Guarda anti-crash-loop:** no máximo **5 reinícios em 60s** por filho; além disso, desiste e desliga (para que uma falha real e repetida não seja mascarada para sempre).
|
|
179
|
+
- Web e worker são **independentes**: uma falha do web reinicia só o web; o worker re-tenta seu tick sozinho até o servidor responder.
|
|
180
|
+
- Aumento de heap opcional: `CONSTELLA_WEB_HEAP_MB` adiciona `--max-old-space-size` ao filho web (útil quando uma execução de agente causa OOM de heap JS).
|
|
181
|
+
|
|
182
|
+
> **Não há unidade systemd empacotada no repositório** — *não encontrado no código atual*. O próprio supervisor do lançador + o `restart: unless-stopped` do Docker são a camada de durabilidade. Se você quiser supervisão no nível do SO, envelope `constella --vps` (ou `--auth`) na sua própria unidade; o processo é um comando de longa duração em foreground normal e trata `SIGINT`/`SIGTERM` de forma limpa (mata ambos os filhos, depois sai).
|
|
183
|
+
|
|
184
|
+
O worker carrega o header privilegiado `x-worker-secret`, então tem uma **guarda SSRF**: ele se recusa a falar com qualquer `CONSTELLA_BASE_URL` que não seja loopback, a menos que `CONSTELLA_ALLOW_REMOTE_WORKER_BASE_URL=1`. O lançador sempre o aponta para `http://127.0.0.1:<port>` (loopback mesmo em vps/portable), então isso é invisível em deploys normais.
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
188
|
+
## Modos de execução vs destinos de deploy
|
|
189
|
+
|
|
190
|
+
O **modo** (de `src/lib/run-mode.ts`) define o host de bind e a postura de login; o **destino de deploy** define onde ele roda fisicamente. Eles se combinam:
|
|
191
|
+
|
|
192
|
+
| Modo | `requiresLogin` | Host de bind | Destino de deploy típico | Permissão da CLI do agente |
|
|
193
|
+
| --- | --- | --- | --- | --- |
|
|
194
|
+
| `start` | false (auto-login `operator@constella.dev`) | `127.0.0.1` | máquina local / npx | `bypassPermissions` (total) |
|
|
195
|
+
| `auth` | true (email+senha) | `127.0.0.1` | local sempre ligado / instalação global | `acceptEdits` (no jail) |
|
|
196
|
+
| `vps` | true | `0.0.0.0` | **Docker + Tailscale** | `acceptEdits` (no jail) |
|
|
197
|
+
| `portable` | true | `0.0.0.0` | **pen-drive USB** | `acceptEdits` (no jail) |
|
|
198
|
+
|
|
199
|
+
O modo é persistido em `organization.runMode`. Em um build publicado `CONSTELLA_PUBLIC=1`, então a **UI nunca escolhe o modo** — a flag de lançamento escolhe.
|
|
200
|
+
|
|
201
|
+
---
|
|
202
|
+
|
|
203
|
+
## Conceitos-chave
|
|
204
|
+
|
|
205
|
+
- **`CONSTELLA_HOME` / raiz de runtime** — o diretório durável único. No Docker é `/data` (um volume nomeado); no USB é `<drive>/.constella`; caso contrário `~/.constella`. Guarda `constella.db`, `.env`, `organizations/<orgId>/workspace/`, `backups/`, `cache/`.
|
|
206
|
+
- **`PKG_ROOT`** — a raiz do *pacote instalado* (`.next` compilado, migrações `drizzle/`, configs). O lançador roda `next` e `drizzle-kit` a partir daqui, não do CWD de lançamento.
|
|
207
|
+
- **Persistência de segredos** — todo modo persiste segredos reais em `<HOME>/.env` (`mode 0600`). O `next start` roda sob `NODE_ENV=production`, onde o better-auth **lança erro com um segredo padrão**, então um `BETTER_AUTH_SECRET` real é obrigatório mesmo localmente.
|
|
208
|
+
- **Schema no primeiro boot** — `drizzle-kit migrate` é idempotente. Um **DB novo que falha na migração aborta** (sem tabelas = a app dá 500); um DB existente tolera uma reexecução no-op.
|
|
209
|
+
- **Build no primeiro boot (só fallback)** — o pacote publicado já traz um `.next` pré-construído, então o build é pulado. A partir de uma árvore de código sem build ele constrói uma vez; se o build falhar ele **se recusa a cair para `next dev`** em um modo público/de rede, a menos que `CONSTELLA_DEV=1`.
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## Ambiente do lançador
|
|
214
|
+
|
|
215
|
+
O lançador exporta isto para ambos os filhos:
|
|
216
|
+
|
|
217
|
+
| Variável | Valor |
|
|
218
|
+
| --- | --- |
|
|
219
|
+
| `CONSTELLA_RUN_MODE` | `start \| auth \| vps \| portable` |
|
|
220
|
+
| `CONSTELLA_PUBLIC` | `1` (lançamento por CLI é o runtime público) |
|
|
221
|
+
| `CONSTELLA_VERSION` | a versão do pacote instalado |
|
|
222
|
+
| `CONSTELLA_HOME` | raiz de runtime resolvida |
|
|
223
|
+
| `DATABASE_URL` | `file:<HOME>/constella.db` |
|
|
224
|
+
| `CONSTELLA_PKG_ROOT` | a raiz do pacote instalado |
|
|
225
|
+
| `PORT` / `--port` | `3000` (padrão) |
|
|
226
|
+
| `--host` | `0.0.0.0` para vps/portable, senão `127.0.0.1` |
|
|
227
|
+
|
|
228
|
+
Persistidos em `<HOME>/.env` (`chmod 600`): `BETTER_AUTH_SECRET`, `CONSTELLA_VAULT_KEY`, `CONSTELLA_WORKER_SECRET`. Só do compose: `TS_AUTHKEY` (chave de entrada do sidecar Tailscale) no `.env` da raiz do repositório.
|
|
229
|
+
|
|
230
|
+
Ajustes opt-in:
|
|
231
|
+
|
|
232
|
+
| Variável | Efeito |
|
|
233
|
+
| --- | --- |
|
|
234
|
+
| `CONSTELLA_WEB_HEAP_MB` | `--max-old-space-size` para o filho web (padrão: padrão do Node) |
|
|
235
|
+
| `CONSTELLA_DEV=1` | permite o fallback `next dev` quando não há build de produção |
|
|
236
|
+
| `CONSTELLA_ALLOW_REMOTE_WORKER_BASE_URL=1` | deixa o worker falar com uma base URL não-loopback (desligado por padrão) |
|
|
237
|
+
| `CONSTELLA_WORKER_INTERVAL_MS` | intervalo do cron tick (padrão `60000`) |
|
|
238
|
+
|
|
239
|
+
---
|
|
240
|
+
|
|
241
|
+
## Atualizando um deploy 🛰️
|
|
242
|
+
|
|
243
|
+
`detectRunContext()` (`src/lib/run-context.ts`) classifica o processo em execução para que o **método de atualização combine com o deploy**:
|
|
244
|
+
|
|
245
|
+
| Contexto | Detectado quando | Método de atualização |
|
|
246
|
+
| --- | --- | --- |
|
|
247
|
+
| `dev` | rodando do código (`isDevMode()`) | `git pull && pnpm install && pnpm build` |
|
|
248
|
+
| `vps` | `getRunMode() === "vps"` **ou** `/.dockerenv` existe | `docker compose pull && docker compose up -d` |
|
|
249
|
+
| `portable` | `getRunMode() === "portable"` | garantir espaço livre, fazer backup do drive, então `npm install -g constella@latest` |
|
|
250
|
+
| `npx` | o diretório de lançamento é o cache `_npx` do npm | reexecutar `npx constella@latest` |
|
|
251
|
+
| `global` | nenhum dos acima | `npm install -g constella@latest` (auto-executa, destacado) |
|
|
252
|
+
|
|
253
|
+
`startUpdate()` (`src/server/update-run.ts`) **sempre faz backup primeiro** — copia `.env`, `constella.db`, `constella.db-wal`, `constella.db-shm` para `<HOME>/backups/<timestamp>/`. Apenas o caminho `global` auto-executa (um processo destacado escreve `<HOME>/backups/last-update.json` que a UI consulta); `vps` / `portable` / `dev` / `npx` retornam o **comando exato** a rodar, porque executá-los de dentro do servidor web é específico do ambiente. Veja [UPDATE](./UPDATE.md).
|
|
254
|
+
|
|
255
|
+
```bash
|
|
256
|
+
# em uma VPS:
|
|
257
|
+
docker compose pull && docker compose up -d
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
Como `/data` (ou o `.constella` do USB) é um volume persistente, o DB e os segredos atravessam a atualização; o `drizzle-kit migrate` idempotente do lançador avança o schema no próximo boot.
|
|
261
|
+
|
|
262
|
+
---
|
|
263
|
+
|
|
264
|
+
## Estados possíveis
|
|
265
|
+
|
|
266
|
+
| Sinal | Significado |
|
|
267
|
+
| --- | --- |
|
|
268
|
+
| `• Secrets ready (stored in <HOME>/.env, never printed).` | geração/reuso de segredos no primeiro boot OK |
|
|
269
|
+
| `✖ Portable needs at least 32 GB free …` | drive portátil pequeno demais (fatal) |
|
|
270
|
+
| `• N GB free on the drive — good …` | drive portátil com espaço suficiente, dá boot |
|
|
271
|
+
| `✖ Database schema migration failed on a fresh database — aborting` | DB novo não conseguiu suas tabelas |
|
|
272
|
+
| `• schema migrate skipped/failed on an existing DB — continuing` | reexecução benigna em um DB já construído |
|
|
273
|
+
| `✖ No production build … Refusing to start a dev server in a public/network mode.` | sem `.next` e sem `CONSTELLA_DEV=1` |
|
|
274
|
+
| `• [web] exited (…) — auto-restarting in 2s (n/5 …)` | reinício supervisionado dentro da janela |
|
|
275
|
+
| `✖ [web] exited … crashed 5x within 60s — giving up.` | limite de crash-loop atingido; desligando |
|
|
276
|
+
| `✓ Constella is starting. Reach it on your tailnet at: http://<ip>:3000` | `vps-install.sh` terminou |
|
|
277
|
+
|
|
278
|
+
---
|
|
279
|
+
|
|
280
|
+
## Integrações relacionadas 🪐
|
|
281
|
+
|
|
282
|
+
- **Tailscale** — o plano de rede privada para o modo VPS (container sidecar + IP do tailnet). Veja [VPS_MODE](./VPS_MODE.md).
|
|
283
|
+
- **Docker / docker compose** — o runtime + política de restart.
|
|
284
|
+
- **better-auth** — email+senha (+ 2FA/passkeys) para todo modo de rede; respaldado por `BETTER_AUTH_SECRET`. Veja [AUTH_MODE](./AUTH_MODE.md).
|
|
285
|
+
- **Vault** — chaves de provedores criptografadas com `CONSTELLA_VAULT_KEY`. Veja [SECURITY](./SECURITY.md).
|
|
286
|
+
- **Worker** — cron + watcher + Telegram, supervisionado junto ao web. Veja [TELEGRAM](./TELEGRAM.md), [ARCHITECTURE](./ARCHITECTURE.md).
|
|
287
|
+
- **Update** — auto-atualização ciente do contexto. Veja [UPDATE](./UPDATE.md).
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
|
|
291
|
+
## Segurança 🕳️
|
|
292
|
+
|
|
293
|
+
- **Exposição só no tailnet.** Com o compose, o Constella compartilha o namespace de rede do sidecar Tailscale, então o dashboard é alcançável **apenas no IP Tailscale na :3000**, nunca na internet aberta. A porta do host nunca é publicada diretamente.
|
|
294
|
+
- **Usuário de container não-privilegiado.** O estágio `runtime` roda como o usuário interno `node` (uid 1000), não root — um RCE no nível da app não pode agir como root sobre `/data`.
|
|
295
|
+
- **Login obrigatório em todo modo de rede.** `vps`, `auth` e `portable` definem `requiresLogin: true` (better-auth email+senha, 2FA TOTP / passkeys WebAuthn opcionais, sessão de 30 dias).
|
|
296
|
+
- **Agentes em jail fora do local.** Em `vps`/`auth`/`portable` a CLI do agente roda em `acceptEdits` (edições confinadas ao FS jail do workspace), não no `bypassPermissions` do modo local `start`.
|
|
297
|
+
- **CLIs dos agentes não empacotadas.** A imagem omite `claude`/`codex` de propósito. Para rodar agentes em uma VPS, adicione uma CLI em um passo `RUN` ou use provedores de API na nuvem em [MODELS](./MODELS.md). Sem nenhum dos dois, planejamento/Team-Room funcionam, mas a execução de agentes não tem runtime.
|
|
298
|
+
- **Segredos nunca impressos.** `<HOME>/.env` é `chmod 600`; o lançador só registra sua localização. O `scrubSecrets` remove segredos antes do ingest na KB / Telegram / logs.
|
|
299
|
+
- **Guarda SSRF do worker.** O worker se recusa a enviar seu segredo privilegiado para qualquer base URL não-loopback, a menos que explicitamente habilitado.
|
|
300
|
+
|
|
301
|
+
---
|
|
302
|
+
|
|
303
|
+
## Solução de problemas 🛰️
|
|
304
|
+
|
|
305
|
+
| Sintoma | Causa / correção |
|
|
306
|
+
| --- | --- |
|
|
307
|
+
| Não alcança `http://<ip>:3000` de outro dispositivo | o dispositivo não está no mesmo tailnet; rode `tailscale up` nele, confirme com `tailscale status` |
|
|
308
|
+
| O sidecar não entra | `TS_AUTHKEY` inválida/expirada; gere uma nova chave e `docker compose up -d` |
|
|
309
|
+
| A app reinicia em loop | verifique a RAM do host — uma execução de agente causando OOM no nível do SO mata o `next start`; aumente `CONSTELLA_WEB_HEAP_MB` para OOM de heap JS, ou limite os agentes concorrentes |
|
|
310
|
+
| `✖ drizzle-kit not found …` | a instalação está incompleta; reinstale o pacote/reconstrua a imagem |
|
|
311
|
+
| DB novo aborta na migração | migrações `drizzle/` empacotadas ausentes ou `/data` sem permissão de escrita; confirme que o volume é de dono `node:node` |
|
|
312
|
+
| Agentes não executam na VPS | sem CLI de agente na imagem e sem provedor na nuvem configurado — adicione um passo `RUN` de CLI ou configure [MODELS](./MODELS.md) |
|
|
313
|
+
| Sessões/vault perdidos após rebuild | `/data` (ou `.constella` do USB) não era um volume persistente; segredos regenerados. Mantenha o volume nomeado |
|
|
314
|
+
| Portátil se recusa a dar boot | drive com menos de 32 GB livres — use um drive maior (`--path`) |
|
|
315
|
+
| Update não fez nada em uma VPS | por design: rode `docker compose pull && docker compose up -d` você mesmo (a UI retorna o comando) |
|
|
316
|
+
|
|
317
|
+
---
|
|
318
|
+
|
|
319
|
+
## Links relacionados
|
|
320
|
+
|
|
321
|
+
- [VPS_MODE](./VPS_MODE.md) — o modo de execução por tailnet em detalhe
|
|
322
|
+
- [PORTABLE_MODE](./PORTABLE_MODE.md) — deploy por pen-drive USB
|
|
323
|
+
- [START_MODE](./START_MODE.md) · [AUTH_MODE](./AUTH_MODE.md) — modos de execução locais
|
|
324
|
+
- [INSTALLATION](./INSTALLATION.md) — primeira instalação
|
|
325
|
+
- [CONFIGURATION](./CONFIGURATION.md) — variáveis de ambiente + raiz de runtime
|
|
326
|
+
- [UPDATE](./UPDATE.md) — auto-atualização ciente do contexto
|
|
327
|
+
- [PREPARE_DEPLOY](./PREPARE_DEPLOY.md) — deploy do **projeto do usuário** (exportação de árvore limpa), não do Constella
|
|
328
|
+
- [ARCHITECTURE](./ARCHITECTURE.md) — web + worker, motor de sync
|
|
329
|
+
- [SECURITY](./SECURITY.md) — FS jail, vault, scrubbing
|
|
330
|
+
- [MODELS](./MODELS.md) — provedores na nuvem/locais para agentes em um servidor
|
|
331
|
+
- [TROUBLESHOOTING](./TROUBLESHOOTING.md) · [FAQ](./FAQ.md)
|
package/docs/pt/DM.md
ADDED
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
[← Índice](./README.md) · [🇬🇧 English](../en/DM.md) · [✦ Constella](../../README.pt-BR.md)
|
|
2
|
+
|
|
3
|
+
# Mensagens Diretas — Órbitas Privadas 🛰️✦
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
Uma **Mensagem Direta** (DM) é um canal privado 1:1 entre você (o operador) e um único agente — uma pequena órbita própria, separada da [Sala da Equipe](./TEAM_ROOM.md). DMs carregam sessões (contextos novos sob demanda), compactação por sessão, anexos, captura na Base de Conhecimento e — quando você fala com um **planejador** como a Ada — a capacidade de transformar um pedido em trabalho real, com aprovação obrigatória.
|
|
8
|
+
|
|
9
|
+
## Quando usar
|
|
10
|
+
|
|
11
|
+
- Você quer uma conversa **1:1 focada** com um agente (a CEO, o CTO, a líder de QA, o redator de Docs) sem acionar a sala inteira.
|
|
12
|
+
- Você quer **iniciar novo trabalho** simplesmente descrevendo-o para a **@ada** (ou outro planejador) — sem botão solto de "novo trabalho".
|
|
13
|
+
- Você quer **múltiplos fios paralelos** com o mesmo agente, cada um com seu próprio contexto novo (as **sessões** de DM).
|
|
14
|
+
- Você quer **anexar arquivos** (imagens / PDFs / documentos) para um agente ler em privado.
|
|
15
|
+
- Você quer manter uma conversa **fora da cadeia autônoma de repasse** — DMs nunca repassam para colegas de equipe.
|
|
16
|
+
|
|
17
|
+
> 🪐 Canais num relance: `room` (todos, exige @menção), `dm:<handle>` (1:1 privado, este documento), `telegram` (fio remoto isolado → Ada). Veja [Sala da Equipe](./TEAM_ROOM.md), [Comandos de Chat](./CHAT_COMMANDS.md) e [Telegram](./TELEGRAM.md).
|
|
18
|
+
|
|
19
|
+
## Como funciona
|
|
20
|
+
|
|
21
|
+
Toda conversa no Constella vive em um **canal** — uma string simples na tabela `message`. Um canal de DM é literalmente a string `dm:<handle>`, ex.: `dm:ada`, `dm:linus`, `dm:edsger`. O handle depois de `dm:` é o handle do agente no elenco (veja [Agentes](./AGENTS.md)).
|
|
22
|
+
|
|
23
|
+
A maquinaria de DM vive em três arquivos:
|
|
24
|
+
|
|
25
|
+
| Arquivo | Responsabilidade |
|
|
26
|
+
| --- | --- |
|
|
27
|
+
| `src/server/chat.ts` | Ações voltadas ao operador: `sendMessage`, `agentRespond`, ações de **sessão** de DM, limpar/prévias. |
|
|
28
|
+
| `src/server/collab.ts` | O turno real do agente (`replyInChannel`): monta o prompt, roda a CLI, contabiliza custo, captura KB. |
|
|
29
|
+
| `src/server/sessions.ts` | Ciclo de vida das sessões de DM: `ensureActiveSession`, `sessionsFor`, `newSession`, `activateSession`, `renameSessionRow`, `deleteSessionRow`. |
|
|
30
|
+
| `src/server/compaction.ts` | `buildChannelContext` — dobra mensagens antigas em um resumo por sessão quando o canal excede a janela do modelo. |
|
|
31
|
+
|
|
32
|
+
### Roteando uma mensagem até um respondente
|
|
33
|
+
|
|
34
|
+
Quando você envia para um canal `dm:<handle>`, `sendMessage` decide quem responde (`src/server/chat.ts`):
|
|
35
|
+
|
|
36
|
+
```ts
|
|
37
|
+
if (channel.startsWith("dm:")) {
|
|
38
|
+
const h = channel.slice(3); if (handles.has(h)) responders = [h];
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Logo, uma DM resolve para **exatamente um respondente** — o agente nomeado pelo canal. Compare com:
|
|
43
|
+
|
|
44
|
+
- **`room`** — a mensagem precisa `@mencionar` um colega real; até **3** respondentes (`mentions(...).slice(0, 3)`); uma mensagem na sala sem menção é descartada (nada de post sem saída).
|
|
45
|
+
- **`telegram`** — sempre roteia para **ada** (a CEO), caindo para o primeiro agente se não houver handle `ada`.
|
|
46
|
+
|
|
47
|
+
Após persistir sua mensagem, `sendMessage` ainda: acorda qualquer stream SSE aberto (`wake`), agenda uma reindexação RAG da conversa (`scheduleChatReindex`) e — **somente na `room`** para texto substantivo (≥15 chars) — registra uma decisão do operador. (DMs **não** registram decisões.)
|
|
48
|
+
|
|
49
|
+
### A resposta real do agente
|
|
50
|
+
|
|
51
|
+
`agentRespond(channel, handle)` muda o agente para `working`, depois chama `replyInChannel` em `collab.ts`, onde o trabalho real acontece:
|
|
52
|
+
|
|
53
|
+
1. Monta uma instrução em **modo chat** (DMs são sempre `mode: "chat"` — conversacional, *sem edição de arquivos*; só a cadeia de repasse da sala usa `mode: "work"`).
|
|
54
|
+
2. Anexa blocos de cláusulas: uma **cláusula de plano** (token de novo trabalho, abaixo), uma **cláusula de anexos** (ler arquivos enviados), uma **cláusula de idioma** (espelhar o idioma do operador só no chat — tudo escrito no workspace permanece em inglês), além das cláusulas de conhecimento **REMEMBER** / **CONSULT** / **KB** e uma **cláusula de segurança do Telegram** (canais de DM pulam essa — é exclusiva do `telegram`).
|
|
55
|
+
3. Monta UM pacote de contexto ajustado ao modelo (`assembleAgentPrompt`) — missão, estado do projeto, decisões, conversa **desta sessão** (compactada), RAG, memória.
|
|
56
|
+
4. Resolve o runtime (`resolveRuntime`) e roda a CLI / API HTTP (`runAgentRuntime`, timeout de 180 s), transmitindo eventos ao vivo para sua visão.
|
|
57
|
+
5. Remove o token de novo trabalho, extrai aprendizados `[[REMEMBER …]]` para a KB, responde consultas `[[CONSULT: …]]` (devolvidas como **Vannevar**), roda ferramentas `[[KB: …]]`, **filtra segredos** e persiste a resposta na **sessão ativa**.
|
|
58
|
+
6. Contabiliza custo real em `costEntry`.
|
|
59
|
+
|
|
60
|
+
> 🕳️ Diferença crucial em relação à sala: ao final, a sala dispara a cadeia de repasse (`relayRoomMentions`), mas **DMs permanecem 1:1** — `if (!channel.startsWith("dm:")) await relayRoomMentions(...)`. Uma `@menção` dentro de uma resposta de DM **não** acorda outro agente.
|
|
61
|
+
|
|
62
|
+
## Fluxo principal
|
|
63
|
+
|
|
64
|
+
```mermaid
|
|
65
|
+
sequenceDiagram
|
|
66
|
+
actor Op as Operador
|
|
67
|
+
participant Chat as chat.ts
|
|
68
|
+
participant Sess as sessions.ts
|
|
69
|
+
participant Collab as collab.ts (replyInChannel)
|
|
70
|
+
participant CLI as Runtime do agente (claude/codex)
|
|
71
|
+
participant DB as message / costEntry
|
|
72
|
+
|
|
73
|
+
Op->>Chat: sendMessage("dm:linus", text, attachments?)
|
|
74
|
+
Chat->>Chat: responder = "linus" (único)
|
|
75
|
+
Chat->>Sess: ensureActiveSession(ws, "dm:linus")
|
|
76
|
+
Chat->>DB: insere mensagem do operador (sessionId)
|
|
77
|
+
Chat-->>Op: { responders: ["linus"] }
|
|
78
|
+
Op->>Chat: agentRespond("dm:linus", "linus")
|
|
79
|
+
Chat->>Collab: replyInChannel(..., mode "chat")
|
|
80
|
+
Collab->>CLI: roda com pacote de contexto montado
|
|
81
|
+
CLI-->>Collab: texto da resposta (+ tokens REMEMBER/CONSULT/KB)
|
|
82
|
+
Collab->>DB: insere mensagem do agente (sessão ativa) + costEntry
|
|
83
|
+
Note over Collab: DM → SEM relayRoomMentions (permanece 1:1)
|
|
84
|
+
Collab-->>Op: resposta transmitida
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Conceitos-chave
|
|
88
|
+
|
|
89
|
+
### Sessões de DM 🌠
|
|
90
|
+
|
|
91
|
+
Um canal de DM pode conter **múltiplas sessões**. Uma sessão é uma linha em `chat_session` escopada a `(workspaceId, channel)`; exatamente **uma fica ativa** por canal. Iniciar uma nova sessão dá ao agente um **contexto novo** enquanto você mantém todas as mensagens passadas visíveis — você apenas troca qual fio está vendo.
|
|
92
|
+
|
|
93
|
+
- `ensureActiveSession(ws, channel)` retorna o id da sessão ativa, criando preguiçosamente a **"Session 1"** na primeira vez que uma DM é tocada, e **adotando** quaisquer mensagens legadas sem sessão para ela. Retorna `null` para canais não-DM (a sala e o Telegram são de fio único e nunca recebem sessões).
|
|
94
|
+
- `newSession` desativa as outras e cria `Session N` (ativa).
|
|
95
|
+
- `activateSession` troca qual sessão está ativa.
|
|
96
|
+
- `renameSessionRow` renomeia (≤60 chars).
|
|
97
|
+
- `deleteSessionRow` apaga a sessão **e suas mensagens**; se ela era a ativa, ativa a sessão remanescente mais nova (ou nenhuma — `ensureActiveSession` recria a "Session 1" no próximo toque).
|
|
98
|
+
|
|
99
|
+
`getMessages("dm:<handle>")` e `clearConversation` ambos escopam à **sessão ativa** para DMs, então uma nova sessão é uma página genuinamente em branco.
|
|
100
|
+
|
|
101
|
+
### Compactação (por sessão) 🌌
|
|
102
|
+
|
|
103
|
+
Quando uma conversa excede a janela de contexto do modelo ativo, `buildChannelContext` (`compaction.ts`) dobra as mensagens **mais antigas** em um resumo estruturado e mantém apenas as mais recentes na íntegra. Para DMs isso é **escopado à sessão ativa** (`sessionId`), então cada fio compacta de forma independente:
|
|
104
|
+
|
|
105
|
+
```ts
|
|
106
|
+
const msgConds = [eq(message.workspaceId, workspaceId), eq(message.channel, channel)];
|
|
107
|
+
if (sessionId) msgConds.push(eq(message.sessionId, sessionId));
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
- O resumo é **ciente do modelo** — modelos menores recebem um resumo mais enxuto (~150 palavras), maiores mantêm mais detalhe (~350 palavras).
|
|
111
|
+
- As seções são fixas: `## Decisions`, `## Requirements`, `## Open issues`, `## Files`, `## Pending by agent`, `## Next steps`.
|
|
112
|
+
- A sumarização roda em um **modelo barato (`haiku`)** e contabiliza custo real.
|
|
113
|
+
- Uma linha `message_summary` por `(workspace, channel, session)`; ela guarda `throughId` (última mensagem dobrada) para que uma janela inalterada seja reaproveitada, não re-resumida.
|
|
114
|
+
- O bloco compactado também é vinculado em `.claude/memory.md` (uma seção por canal), best-effort.
|
|
115
|
+
|
|
116
|
+
### Novo trabalho a partir de uma DM 🚀
|
|
117
|
+
|
|
118
|
+
Este é o recurso assinatura das DMs. **Novo trabalho nasce da conversa com a CEO — não de um botão solto.** Em **modo chat**, o prompt de qualquer agente inclui uma **cláusula de plano**: se o operador estiver pedindo para **CONSTRUIR / IMPLEMENTAR / ADICIONAR / CORRIGIR / MUDAR** algo (uma nova unidade de trabalho), o agente confirma em 1–2 frases e emite, numa linha final separada, o token de máquina:
|
|
119
|
+
|
|
120
|
+
```
|
|
121
|
+
[[CREATE_WORK]]
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
`collab.ts` define isso como `const CREATE_WORK = "[[CREATE_WORK]]"`. `replyInChannel` o detecta (`planRequested`) e **o remove** antes de a resposta ser armazenada ou mostrada. De volta em `chat.ts`, `agentRespond` reage:
|
|
125
|
+
|
|
126
|
+
```ts
|
|
127
|
+
if (planRequested) {
|
|
128
|
+
const r = await planFromConversation(channel);
|
|
129
|
+
// posta uma breve confirmação "registrando isto como novo trabalho…" de volta na DM
|
|
130
|
+
}
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
`planFromConversation(channel)` (em `src/server/planner.ts`) pega as **últimas 30 mensagens** do canal e roda o **mesmo ritual de planejamento do primeiro plano** — a Ada (a CEO) rascunha um Goal → specs → issues → TODOs, anexados ao **CEO Planner** para sua aprovação. (Para o remoto do Telegram, o gêmeo off-session é `planFromConversationFor` em `planner-core.ts`.)
|
|
134
|
+
|
|
135
|
+
> 🌠 Planejador vs não-planejador. A cláusula de plano é oferecida a **todos** os agentes, mas a redação difere:
|
|
136
|
+
> - **Planejadores** (`isPlanner`: a CEO **ada**, o Product Owner **donald**, o CTO **linus** — ou qualquer papel que case com *product owner* / *CTO* / *chief tech*) recebem uma instrução direta "transforme isto em um spec + issues".
|
|
137
|
+
> - **Não-planejadores** recebem uma garantia extra: isso *"runs through the CEO's planning ritual and waits for the operator's approval, so you're not committing anyone to build immediately."*
|
|
138
|
+
>
|
|
139
|
+
> De qualquer modo o pedido é **roteado pelo planner da CEO e travado pela sua aprovação** — nada de código construído diretamente de uma DM. Veja [Metas, Specs e Issues](./GOALS_SPECS_ISSUES.md) e [Fluxo de Trabalho](./WORKFLOW.md).
|
|
140
|
+
|
|
141
|
+
### Captura de conhecimento numa DM 🌌
|
|
142
|
+
|
|
143
|
+
Mesmo numa DM privada o agente pode fazer crescer o cérebro compartilhado (veja [Agente de KB](./KB_AGENT.md) e [KB & RAG](./KB_RAG.md)):
|
|
144
|
+
|
|
145
|
+
| Token (linha própria) | Efeito |
|
|
146
|
+
| --- | --- |
|
|
147
|
+
| `[[REMEMBER type=<decision\|architecture\|business-rule\|integration\|fix\|note>: <fato>]]` | Salvo automaticamente na KB (deduplicado), token removido da resposta exibida. |
|
|
148
|
+
| `[[CONSULT: <pergunta>]]` | Respondido pela KB ciente de estado; a resposta é postada de volta na DM **como Vannevar**. |
|
|
149
|
+
| `[[KB: reindex \| index-chat \| health]]` | Manutenção do agente de KB (só o papel de Conhecimento recebe essa cláusula); resultado reportado de volta no fio. |
|
|
150
|
+
|
|
151
|
+
Você também pode promover uma única linha de chat para a KB com `sendMessageToKb(messageId)` (capturada como `note`), ou puxar contexto da KB para o compositor com `pullKbForComposer(query)` (apenas rascunho — nunca envia).
|
|
152
|
+
|
|
153
|
+
## Tabelas
|
|
154
|
+
|
|
155
|
+
### `chat_session` (`src/db/schema.ts`)
|
|
156
|
+
|
|
157
|
+
| Coluna | Tipo | Notas |
|
|
158
|
+
| --- | --- | --- |
|
|
159
|
+
| `id` | text PK | |
|
|
160
|
+
| `workspaceId` | text | FK → `workspace`, delete em cascata. |
|
|
161
|
+
| `channel` | text | Sempre `dm:<handle>` (apenas DM). |
|
|
162
|
+
| `title` | text | Padrão `Session N`; renomeia ≤60 chars. |
|
|
163
|
+
| `active` | boolean | Exatamente uma ativa por `(workspace, channel)`. |
|
|
164
|
+
| `createdAt` | timestamp | Ordenação mais-nova-primeiro na lista de sessões. |
|
|
165
|
+
|
|
166
|
+
### `message` (colunas relevantes a DM)
|
|
167
|
+
|
|
168
|
+
| Coluna | Notas |
|
|
169
|
+
| --- | --- |
|
|
170
|
+
| `channel` | `room` \| `dm:<handle>` \| `telegram`. |
|
|
171
|
+
| `fromKind` | `operator` \| `agent`. |
|
|
172
|
+
| `fromHandle` | O handle do agente (null para operador). |
|
|
173
|
+
| `text` | Corpo da mensagem (respostas do agente armazenadas ≤4000 chars). |
|
|
174
|
+
| `sessionId` | A `chat_session` a que esta mensagem pertence. **NULL** para room/Telegram e mensagens de DM legadas (retroalimentadas para a "Session 1"). |
|
|
175
|
+
| `sources` | Chips de fonte RAG para a resposta de um agente. |
|
|
176
|
+
| `attachments` | Uploads do operador (≤10/mensagem): `{ name, type, size, path }`. |
|
|
177
|
+
| `taskId` / `kind` / `blocks` | Chip de rastreabilidade / dica de render / slugs de synced-block. |
|
|
178
|
+
|
|
179
|
+
### `message_summary`
|
|
180
|
+
|
|
181
|
+
| Coluna | Notas |
|
|
182
|
+
| --- | --- |
|
|
183
|
+
| `channel` | A conversa sumarizada. |
|
|
184
|
+
| `sessionId` | Sessão de DM que este resumo cobre; **NULL** para room/Telegram. |
|
|
185
|
+
| `summary` | Contexto compactado estruturado. |
|
|
186
|
+
| `throughId` | Última mensagem dobrada (guarda de reaproveitamento). |
|
|
187
|
+
| `msgCount` | Número de mensagens dobradas. |
|
|
188
|
+
|
|
189
|
+
## Diagrama de novo-trabalho-a-partir-de-DM
|
|
190
|
+
|
|
191
|
+
```mermaid
|
|
192
|
+
flowchart TD
|
|
193
|
+
A["Operador manda DM @ada:\n'construir um export CSV'"] --> B["sendMessage('dm:ada', …)\nresponder = ada"]
|
|
194
|
+
B --> C["agentRespond → replyInChannel\n(mode: chat, cláusula de plano ON)"]
|
|
195
|
+
C --> D{"Operador pedindo para\nCONSTRUIR / CORRIGIR / MUDAR?"}
|
|
196
|
+
D -- "Não" --> E["Resposta 1:1 normal\n(permanece na DM)"]
|
|
197
|
+
D -- "Sim" --> F["Resposta confirma + emite\n[[CREATE_WORK]] na última linha"]
|
|
198
|
+
F --> G["token removido\nplanRequested = true"]
|
|
199
|
+
G --> H["planFromConversation(channel)\núltimas 30 mensagens → brief"]
|
|
200
|
+
H --> I["Ritual de planejamento da CEO:\nGoal → specs → issues → TODOs"]
|
|
201
|
+
I --> J["Anexado ao CEO Planner\n(aguarda aprovação do operador)"]
|
|
202
|
+
J --> K["'Plan ready' volta\ntransmitido para a DM"]
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
## Passo a passo
|
|
206
|
+
|
|
207
|
+
### Iniciar novo trabalho a partir de uma DM
|
|
208
|
+
|
|
209
|
+
1. Abra a DM com a **@ada** (CEO) — ou outro planejador como **@linus** / **@donald**.
|
|
210
|
+
2. Descreva o trabalho de forma simples: *"Construir uma página de configurações com um interruptor de modo escuro."*
|
|
211
|
+
3. A Ada confirma ("registrando isto como novo trabalho…") e a rodada pesada de plano começa destacada.
|
|
212
|
+
4. Uma mensagem **"Plan ready"** volta transmitida para a DM quando specs + issues são rascunhados.
|
|
213
|
+
5. Aprove no **CEO Planner** (ou via `/approve` — veja [Comandos de Chat](./CHAT_COMMANDS.md)). A aprovação é o que autoriza a equipe a construir.
|
|
214
|
+
|
|
215
|
+
### Gerenciar sessões de DM
|
|
216
|
+
|
|
217
|
+
1. Numa DM, abra a lista de sessões (mais-nova-primeiro; uma ativa).
|
|
218
|
+
2. **Nova sessão** → contexto novo do agente, fios antigos preservados (`createSession`).
|
|
219
|
+
3. **Trocar** entre sessões (`switchSession`); **renomear** (`renameSession`); **apagar** (`deleteSession`, confirmado por um modal).
|
|
220
|
+
4. **Limpar conversa** numa DM apaga só as mensagens da **sessão ativa** + seu resumo — outras sessões ficam intactas.
|
|
221
|
+
|
|
222
|
+
### Anexar um arquivo a uma DM
|
|
223
|
+
|
|
224
|
+
1. Adicione até 10 arquivos ao compositor; eles são salvos em `uploads/` no workspace.
|
|
225
|
+
2. O prompt do agente ganha uma cláusula de anexos apontando para os **caminhos** em disco; ele os lê com suas ferramentas de arquivo (imagens/PDFs suportados).
|
|
226
|
+
3. Nomes de arquivo são tratados como **dados, não instruções** (guarda contra prompt-injection).
|
|
227
|
+
|
|
228
|
+
## Exemplos
|
|
229
|
+
|
|
230
|
+
```text
|
|
231
|
+
# DM com @ada — dispara novo trabalho
|
|
232
|
+
Você → @ada: Precisamos de um export CSV na página de relatórios.
|
|
233
|
+
Ada → Got it — I'll turn this into a spec + issues and register it for approval. [[CREATE_WORK]] (removido)
|
|
234
|
+
Ada → Got it — registering this as new work. I'm drafting the plan now…
|
|
235
|
+
|
|
236
|
+
# DM com @edsger (líder de QA) — uma pergunta, NÃO novo trabalho → resposta normal, sem token
|
|
237
|
+
Você → @edsger: O que a última rodada de testes apontou em /login?
|
|
238
|
+
Edsger → A última rodada apontou 1 erro de console em /login (uncaught TypeError)…
|
|
239
|
+
|
|
240
|
+
# Não-planejador roteando um pedido de build ainda passa pelo planner da Ada
|
|
241
|
+
Você → @grace: Adicionar um spinner de carregamento ao dashboard.
|
|
242
|
+
Grace → I'll register this as new work — it runs through the CEO's planning ritual and waits for your approval. [[CREATE_WORK]] (removido)
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
## Estados possíveis
|
|
246
|
+
|
|
247
|
+
| Estado | Significado |
|
|
248
|
+
| --- | --- |
|
|
249
|
+
| Respondente resolvido | Canal de DM `dm:<h>` → respondente único `h` se o handle existir; senão `responders: []`. |
|
|
250
|
+
| `mode: "chat"` | Respostas de DM são conversacionais — **sem edição de arquivos**, sem cadeia de repasse. |
|
|
251
|
+
| `planRequested = true` | O agente emitiu `[[CREATE_WORK]]`; `planFromConversation` roda o ritual. |
|
|
252
|
+
| Sessão ativa | Uma `chat_session.active = true` por DM; dirige leituras, escritas, compactação, limpeza. |
|
|
253
|
+
| Compactado | Mensagens antigas dobradas em `message_summary` para a sessão ativa. |
|
|
254
|
+
| Agente `working` / `idle` | `agentRespond` define `working` durante o turno, de volta a `idle` depois. |
|
|
255
|
+
|
|
256
|
+
## Integrações relacionadas
|
|
257
|
+
|
|
258
|
+
- **[Sala da Equipe](./TEAM_ROOM.md)** — o canal compartilhado; a cadeia de repasse por `@menção` (que as DMs deliberadamente evitam).
|
|
259
|
+
- **[Telegram](./TELEGRAM.md)** — o fio remoto isolado que sempre fala com a Ada; espelha de volta a partir da aba Telegram no app.
|
|
260
|
+
- **[Comandos de Chat](./CHAT_COMMANDS.md)** — comandos slash funcionam em DMs também (interceptados antes do caminho de mensagem; não no Telegram).
|
|
261
|
+
- **[Metas, Specs e Issues](./GOALS_SPECS_ISSUES.md)** / **[Fluxo de Trabalho](./WORKFLOW.md)** — onde o trabalho nascido em DM aterrissa e é aprovado.
|
|
262
|
+
- **[KB & RAG](./KB_RAG.md)** / **[Memória & RAG](./MEMORY_RAG.md)** — captura REMEMBER/CONSULT e reindexação da conversa.
|
|
263
|
+
- **[Inbox](./INBOX.md)** — pings ao operador levantados quando um agente o endereça (pulados no Telegram).
|
|
264
|
+
|
|
265
|
+
## Segurança
|
|
266
|
+
|
|
267
|
+
- **Filtragem de segredos** — toda resposta (room, DM, Telegram) passa por `scrubSecrets` antes de ser armazenada, mostrada ou notificada.
|
|
268
|
+
- **Anexos são dados** — nomes/caminhos de arquivos enviados são envoltos como dados; o prompt diz ao modelo para ignorar qualquer diretiva embutida num nome de arquivo.
|
|
269
|
+
- **Endurecimento contra prompt-injection** é mais forte no `telegram` (entrada remota não confiável); DMs são entrada local do operador mas ainda assim filtradas e presas por idioma/workspace.
|
|
270
|
+
- **DMs não se ramificam** — uma `@menção` numa resposta de DM nunca acorda outro agente, então um fio privado não pode disparar uma cadeia autônoma.
|
|
271
|
+
- **Sem build direto do chat** — uma DM só pode *registrar* trabalho; nada executa até você aprovar o plano. Veja [Segurança](./SECURITY.md) e [Arquitetura de IA](./AI_ARCHITECTURE.md) para a prisão de FS e os modos de permissão.
|
|
272
|
+
|
|
273
|
+
## Solução de problemas
|
|
274
|
+
|
|
275
|
+
| Sintoma | Causa provável / correção |
|
|
276
|
+
| --- | --- |
|
|
277
|
+
| O agente não respondeu na minha DM | O handle depois de `dm:` precisa existir no elenco; uma string de canal errada produz `responders: []`. Confira o handle em [Agentes](./AGENTS.md). |
|
|
278
|
+
| Pedi um build mas nenhum plano apareceu | O modelo julgou que era uma pergunta, não novo trabalho, então não emitiu `[[CREATE_WORK]]`. Seja explícito: *"Construir/implementar/corrigir …"*. A DM deve então postar uma linha "registrando isto como novo trabalho…". |
|
|
279
|
+
| Nova sessão ainda mostra mensagens antigas | Você está vendo uma sessão anterior — troque para a ativa. Leituras são escopadas à `chat_session` ativa. |
|
|
280
|
+
| "Limpar conversa" não limpou tudo | Numa DM, limpar só apaga a **sessão ativa**; outras sessões persistem por design. |
|
|
281
|
+
| Uma `@menção` na minha DM não fez nada | Correto — DMs são 1:1 e nunca repassam. Use a [Sala da Equipe](./TEAM_ROOM.md) para repasses. |
|
|
282
|
+
| Contexto antigo continua voltando | É o resumo compactado por sessão (`message_summary`) sendo injetado. Inicie uma sessão nova para um contexto limpo. |
|
|
283
|
+
| Resposta deu timeout | O limite do runtime é 180 s; turnos únicos muito pesados podem atingi-lo. |
|
|
284
|
+
|
|
285
|
+
## Links relacionados
|
|
286
|
+
|
|
287
|
+
- [Sala da Equipe](./TEAM_ROOM.md)
|
|
288
|
+
- [Comandos de Chat](./CHAT_COMMANDS.md)
|
|
289
|
+
- [Telegram](./TELEGRAM.md)
|
|
290
|
+
- [Agentes](./AGENTS.md)
|
|
291
|
+
- [Metas, Specs e Issues](./GOALS_SPECS_ISSUES.md)
|
|
292
|
+
- [Fluxo de Trabalho](./WORKFLOW.md)
|
|
293
|
+
- [KB & RAG](./KB_RAG.md)
|
|
294
|
+
- [Memória & RAG](./MEMORY_RAG.md)
|
|
295
|
+
- [Inbox](./INBOX.md)
|
|
296
|
+
- [Arquitetura de IA](./AI_ARCHITECTURE.md)
|
|
297
|
+
- [Segurança](./SECURITY.md)
|