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,329 @@
|
|
|
1
|
+
[← Índice](./README.md) · [🇬🇧 English](../en/INSTALLATION.md) · [✦ Constella](../../README.pt-BR.md)
|
|
2
|
+
|
|
3
|
+
# 🚀 Instalação — embarcando na nave central
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
O Constella é um plano de controle local-first que executa empresas-de-agentes de IA autônomas. Instalá-lo é acender a nave central: um único lançador (`bin/constella.mjs`) instala o runtime compilado, aplica o schema do banco e sobe um servidor web supervisionado mais um worker 24/7 — tudo sob uma raiz de runtime no seu diretório de usuário. ✦
|
|
8
|
+
|
|
9
|
+
> **Resumo** — `npx constella` se você tem Node ≥ 20 e os CLIs `claude`/`codex`. Os dados ficam em `~/.constella`. Nada é falso.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Quando usar
|
|
14
|
+
|
|
15
|
+
| Você quer… | Use |
|
|
16
|
+
| --- | --- |
|
|
17
|
+
| Experimentar o Constella uma vez, sem deixar nada instalado globalmente | `npx constella` |
|
|
18
|
+
| Rodar diariamente na sua própria máquina | `npm install -g constella` e depois `constella` |
|
|
19
|
+
| Forçar de novo o assistente de configuração inicial | `npx constella --onboarding` |
|
|
20
|
+
| Rodar num servidor acessível via Tailscale, em Docker | `npx constella --vps` → veja [VPS_MODE](./VPS_MODE.md) |
|
|
21
|
+
| Rodar inteiramente a partir de um pen-drive | `npx constella --portable` → veja [PORTABLE_MODE](./PORTABLE_MODE.md) |
|
|
22
|
+
| Desenvolver no código-fonte | `git clone` + `pnpm install` + `pnpm dev:all` (veja [TEST_DEV](./TEST_DEV.md)) |
|
|
23
|
+
|
|
24
|
+
Esta página cobre como colocar o runtime numa máquina e dar boot. Para *o que cada modo faz*, leia [START_MODE](./START_MODE.md), [AUTH_MODE](./AUTH_MODE.md), [VPS_MODE](./VPS_MODE.md) e [PORTABLE_MODE](./PORTABLE_MODE.md). Para o assistente pós-instalação, leia [ONBOARDING](./ONBOARDING.md).
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Pré-requisitos 🛰️
|
|
29
|
+
|
|
30
|
+
| Requisito | Detalhe | Onde é verificado |
|
|
31
|
+
| --- | --- | --- |
|
|
32
|
+
| **Node.js ≥ 20** | O `package.json` declara `"engines": { "node": ">=20" }`. O lançador é um módulo ES e usa `--env-file`, APIs modernas de `node:fs` e o `fetch` global. | `package.json` |
|
|
33
|
+
| **CLI `claude` e/ou `codex`** | Os agentes são instanciados como processos de CLI **reais** (`claude -p …`, `codex …`). Sem ao menos um instalado e autenticado, os agentes planejam mas não executam. | `src/server/adapters/cli.ts` |
|
|
34
|
+
| **Espaço em disco** | A raiz de runtime guarda o banco, os workspaces por organização, o índice RAG, caches e (opcionalmente) pesos de modelos locais. O modo portátil **recusa < 32 GB livres**; `≥ 32 GB` está ok (mais folga só ajuda se você carregar modelos locais). | `bin/constella.mjs` (`freeBytes`) |
|
|
35
|
+
| **Um terminal** | O lançador imprime a URL; você a abre no navegador. | — |
|
|
36
|
+
|
|
37
|
+
> O Constella **não** empacota os CLIs dos agentes. Ele chama o `claude`/`codex` que estiver no seu `PATH` e herda sua configuração `~/.claude`. Veja [AGENTS](./AGENTS.md) e [MODELS](./MODELS.md).
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Como funciona 🌌
|
|
42
|
+
|
|
43
|
+
`bin/constella.mjs` é um lançador leve em dependências que espelha como o `claude` e o `codex` se instalam — **tudo vive sob uma raiz de runtime no diretório de usuário**, nunca no diretório de onde você executou o comando.
|
|
44
|
+
|
|
45
|
+
O lançador, em ordem:
|
|
46
|
+
|
|
47
|
+
1. **Lê a flag de lançamento** para escolher o modo de execução (`start` | `auth` | `vps` | `portable`). A flag — não a UI — decide o modo num build público.
|
|
48
|
+
2. **Resolve a raiz de runtime** (`CONSTELLA_HOME` → `--path` → `~/.constella`; portátil sem path pede que você escolha um pen-drive) e cria `<HOME>/organizations`.
|
|
49
|
+
3. **Resolve a raiz do pacote** (`PKG_ROOT`) — onde o `.next` compilado, as migrations em `drizzle/` e os configs são distribuídos — porque, instalados, eles **não** ficam no seu diretório atual.
|
|
50
|
+
4. **Persiste segredos** em `<HOME>/.env` (`chmod 600`): `BETTER_AUTH_SECRET`, `CONSTELLA_VAULT_KEY`, `CONSTELLA_WORKER_SECRET` — gerados uma vez, reutilizados para sempre.
|
|
51
|
+
5. **Valida o drive** no modo portátil (recusa < 32 GB; ≥ 32 GB está ok).
|
|
52
|
+
6. **Aplica o schema do banco** rodando o `drizzle-kit migrate` distribuído contra um `<HOME>/constella.db` possivelmente novo. Idempotente; fatal apenas num banco novo.
|
|
53
|
+
7. **Faz build no primeiro run apenas como fallback** — o pacote publicado já distribui um `.next` pré-compilado, então isso é pulado para usuários finais.
|
|
54
|
+
8. **Sobe dois filhos supervisionados**: o servidor web (`next start`) e o worker (`bin/worker.mjs`), reiniciando automaticamente qualquer um deles num crash inesperado.
|
|
55
|
+
|
|
56
|
+
### O que de fato é instalado
|
|
57
|
+
|
|
58
|
+
Você recebe um **runtime compilado e minificado — nunca o código-fonte**. O campo `files` do `package.json` distribui:
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
.next # o build de produção do Next.js, pré-compilado
|
|
62
|
+
bin # constella.mjs (lançador) + worker.mjs
|
|
63
|
+
scripts # start-all.mjs, dev-all.mjs, trim-next.mjs, …
|
|
64
|
+
skills # a biblioteca nativa de skills (semeada por workspace)
|
|
65
|
+
docs # esta documentação
|
|
66
|
+
drizzle # migrations SQL geradas (o schema, sem TS de fonte)
|
|
67
|
+
next.config.mjs # .mjs para que `next start` não precise de TypeScript em runtime
|
|
68
|
+
drizzle.config.mjs
|
|
69
|
+
README.md LICENSE CHANGELOG.md
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
`src/` é intencionalmente **não** distribuído. O schema chega ao usuário final como SQL gerado em `drizzle/`, aplicado via `drizzle-kit migrate` — assim um banco totalmente novo é construído sem nenhum arquivo de schema-fonte presente.
|
|
73
|
+
|
|
74
|
+
### Onde seus dados vivem 🪐
|
|
75
|
+
|
|
76
|
+
| Caminho | O quê |
|
|
77
|
+
| --- | --- |
|
|
78
|
+
| `~/.constella/` | Raiz de runtime (sobrescreva com `CONSTELLA_HOME` ou `--path <dir>`). |
|
|
79
|
+
| `~/.constella/constella.db` | O banco SQLite (`DATABASE_URL=file:<HOME>/constella.db`). |
|
|
80
|
+
| `~/.constella/.env` | Segredos persistidos, `chmod 600`, **nunca impressos**. |
|
|
81
|
+
| `~/.constella/organizations/<orgId>/workspace/` | O workspace isolado de cada empresa-de-agentes (a jaula de FS). |
|
|
82
|
+
| `~/.constella/cache/` | Cache do catálogo de modelos (`models-dev.json`, TTL de 24 h). |
|
|
83
|
+
| `~/.constella/backups/` | Backups pré-atualização do `.env` + banco. |
|
|
84
|
+
|
|
85
|
+
> A raiz de runtime é a **única fonte de verdade**. O diretório é canônico; o banco o indexa. Veja [ARCHITECTURE](./ARCHITECTURE.md).
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## Fluxo principal 🌠
|
|
90
|
+
|
|
91
|
+
```mermaid
|
|
92
|
+
flowchart TD
|
|
93
|
+
A["npx constella / constella"] --> B{"Subcomando?"}
|
|
94
|
+
B -->|"update [--check]"| U["Consulta o registry npmjs,<br/>talvez npm i -g constella@latest"]
|
|
95
|
+
B -->|"start (padrão)"| C["Resolve o modo<br/>start | auth | vps | portable"]
|
|
96
|
+
C --> D["Resolve a raiz de runtime<br/>CONSTELLA_HOME → --path → ~/.constella"]
|
|
97
|
+
D --> E["Resolve PKG_ROOT<br/>(.next compilado, drizzle/, configs)"]
|
|
98
|
+
E --> F["Persiste segredos em HOME/.env (chmod 600)"]
|
|
99
|
+
F --> G{"Portátil?"}
|
|
100
|
+
G -->|sim| H["Checa o drive:<br/>recusa < 32 GB · senão bom"]
|
|
101
|
+
G -->|não| I
|
|
102
|
+
H --> I["drizzle-kit migrate → HOME/constella.db"]
|
|
103
|
+
I --> J{".next/BUILD_ID presente?"}
|
|
104
|
+
J -->|"sim (distribuído)"| L
|
|
105
|
+
J -->|não| K["next build (primeiro run, uma vez)"]
|
|
106
|
+
K --> L["Supervisor sobe os filhos"]
|
|
107
|
+
L --> M["web: next start -H host -p port"]
|
|
108
|
+
L --> N["worker: bin/worker.mjs"]
|
|
109
|
+
M --> O["Abra http://host:port"]
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## Conceitos-chave
|
|
115
|
+
|
|
116
|
+
| Conceito | Significado |
|
|
117
|
+
| --- | --- |
|
|
118
|
+
| **Raiz de runtime** (`CONSTELLA_HOME`) | O diretório no home que guarda o banco, os workspaces, os caches e os segredos. Padrão `~/.constella`. |
|
|
119
|
+
| **Raiz do pacote** (`PKG_ROOT`) | O diretório próprio do pacote instalado (`fileURLToPath(new URL("../", import.meta.url))`) com `.next`, `drizzle/`, configs. Exportado como `CONSTELLA_PKG_ROOT`. |
|
|
120
|
+
| **Modo de execução** | `start` \| `auth` \| `vps` \| `portable`, gravado em `CONSTELLA_RUN_MODE` e armazenado em `organization.runMode`. A flag de lançamento o decide. |
|
|
121
|
+
| **Runtime público** | Um lançamento via CLI define `CONSTELLA_PUBLIC=1`, que esconde o seletor de modo na UI e os chips de Config. |
|
|
122
|
+
| **Processo duplo** | Todo boot roda um servidor **web** e um **worker** — supervisionados, com reinício automático. |
|
|
123
|
+
| **Build no primeiro run** | Um fallback que só dispara numa árvore de fonte sem `.next/BUILD_ID`; nunca para o pacote distribuído. |
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## Tabelas
|
|
128
|
+
|
|
129
|
+
### Flags e subcomandos do lançador
|
|
130
|
+
|
|
131
|
+
| Flag / subcomando | Efeito | Fonte |
|
|
132
|
+
| --- | --- | --- |
|
|
133
|
+
| *(nenhuma)* / `start` | Modo padrão — operador local automático, bind `127.0.0.1`. | `cmd = "start"`, `runMode = "start"` |
|
|
134
|
+
| `--onboarding` (ou `onboard`/`onboarding`) | Define `CONSTELLA_FORCE_ONBOARDING=1` para reexecutar o assistente. | linha 181 |
|
|
135
|
+
| `--start` | Modo local (auto-login, `127.0.0.1`). | flag de modo |
|
|
136
|
+
| `--auth` | E-mail + senha, `127.0.0.1`. | flag de modo |
|
|
137
|
+
| `--vps` | Servidor via Tailscale, em Docker, `0.0.0.0`. | flag de modo |
|
|
138
|
+
| `--portable` | Roda a partir de um pen-drive, `0.0.0.0`. | flag de modo |
|
|
139
|
+
| `--path <dir>` | Raiz de runtime explícita (também aponta o portátil para um drive). | `flag("--path")` |
|
|
140
|
+
| `--host <h>` | Sobrescreve o host de bind. Padrões: vps/portable → `0.0.0.0`, senão `127.0.0.1`. | linha 176 |
|
|
141
|
+
| `--port <p>` | Sobrescreve a porta (senão env `PORT`, senão `3000`). | linha 177 |
|
|
142
|
+
| `--bind <local\|tailnet\|portable>` | Compatibilidade **legada** que mapeia para um modo. | linhas 118–120 |
|
|
143
|
+
| `update` | Detecta uma versão publicada mais nova e a aplica. | linha 136 |
|
|
144
|
+
| `update --check` | Apenas imprime atual vs mais recente, depois sai. | linha 140 |
|
|
145
|
+
|
|
146
|
+
### Ambiente que o lançador define / lê
|
|
147
|
+
|
|
148
|
+
| Variável | Papel |
|
|
149
|
+
| --- | --- |
|
|
150
|
+
| `CONSTELLA_HOME` | Sobrescreve a raiz de runtime. |
|
|
151
|
+
| `CONSTELLA_RUN_MODE` | O modo resolvido (`start`/`auth`/`vps`/`portable`). |
|
|
152
|
+
| `CONSTELLA_PUBLIC=1` | Marca um lançamento via CLI como o runtime público/produção. |
|
|
153
|
+
| `CONSTELLA_VERSION` | A versão instalada confiável, para a verificação de Update no app. |
|
|
154
|
+
| `CONSTELLA_PKG_ROOT` | A raiz do pacote, para o servidor encontrar `skills/` + assets distribuídos. |
|
|
155
|
+
| `CONSTELLA_FORCE_ONBOARDING` | Definido por `--onboarding` para reexecutar o assistente. |
|
|
156
|
+
| `DATABASE_URL` | `file:<HOME>/constella.db` (absoluto, definido só se ausente). |
|
|
157
|
+
| `CONSTELLA_DEV=1` | Opt-in para cair em `next dev` quando não há build (somente árvore de fonte). |
|
|
158
|
+
| `CONSTELLA_WEB_HEAP_MB` | `--max-old-space-size` opcional para o filho web. |
|
|
159
|
+
| `BETTER_AUTH_SECRET` · `CONSTELLA_VAULT_KEY` · `CONSTELLA_WORKER_SECRET` | Persistidos em `<HOME>/.env`. |
|
|
160
|
+
|
|
161
|
+
> Referência completa de configuração: [CONFIGURATION](./CONFIGURATION.md).
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## Passo a passo
|
|
166
|
+
|
|
167
|
+
### A) Experimento rápido — `npx` (nada instalado globalmente)
|
|
168
|
+
|
|
169
|
+
```bash
|
|
170
|
+
# Requer Node ≥ 20 no seu PATH
|
|
171
|
+
npx constella
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
O que acontece:
|
|
175
|
+
|
|
176
|
+
1. O npm baixa o `constella` mais recente para o cache `_npx`.
|
|
177
|
+
2. O lançador cria `~/.constella/organizations`, persiste segredos em `~/.constella/.env`, aplica o schema do banco e sobe web + worker.
|
|
178
|
+
3. O `.next` pré-compilado vem no pacote, então **nenhum build roda** — sobe rápido.
|
|
179
|
+
4. Abra a URL impressa (padrão `http://127.0.0.1:3000`). O primeiro run te leva ao [ONBOARDING](./ONBOARDING.md).
|
|
180
|
+
|
|
181
|
+
> Como `npx` é efêmero, `detectRunContext()` reporta `npx` e o fluxo de Update no app reexecuta `npx constella@latest` em vez de uma instalação global. Veja [UPDATE](./UPDATE.md).
|
|
182
|
+
|
|
183
|
+
### B) Uso diário — instalação global
|
|
184
|
+
|
|
185
|
+
```bash
|
|
186
|
+
npm install -g constella
|
|
187
|
+
constella # padrão = modo start
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
Depois, de qualquer lugar:
|
|
191
|
+
|
|
192
|
+
```bash
|
|
193
|
+
constella --auth # e-mail + senha, 127.0.0.1
|
|
194
|
+
constella --onboarding # reexecuta o assistente de configuração
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
Uma instalação global reporta `detectRunContext()` → `global`, então o Update roda `npm install -g constella@latest`.
|
|
198
|
+
|
|
199
|
+
### C) Fixar a raiz de runtime
|
|
200
|
+
|
|
201
|
+
```bash
|
|
202
|
+
# Aponta todo o runtime para um diretório customizado
|
|
203
|
+
CONSTELLA_HOME=/srv/constella constella
|
|
204
|
+
# …ou via flag
|
|
205
|
+
constella --path /srv/constella
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
O banco passa a ser `file:/srv/constella/constella.db` e os workspaces vivem em `/srv/constella/organizations/<orgId>/workspace/`.
|
|
209
|
+
|
|
210
|
+
### D) A partir do código-fonte (desenvolvedores) 🕳️
|
|
211
|
+
|
|
212
|
+
```bash
|
|
213
|
+
git clone https://github.com/gabriel7silva/constella
|
|
214
|
+
cd constella
|
|
215
|
+
pnpm install
|
|
216
|
+
pnpm dev:all # next dev + worker juntos (o poll do Telegram funciona em dev)
|
|
217
|
+
# ou, com formato de produção:
|
|
218
|
+
pnpm build && pnpm start # next start + worker (scripts/start-all.mjs)
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
`scripts/dev-all.mjs` e `scripts/start-all.mjs` ambos sobem o servidor web **e** o worker, para que o tick do cron, o file watcher e o poll do Telegram rodem. Rodar a partir da fonte define `CONSTELLA_DEV=1` (quando `CONSTELLA_PUBLIC` não está definido), o que exibe o seletor de modo + os chips de Config. Veja [TEST_DEV](./TEST_DEV.md).
|
|
222
|
+
|
|
223
|
+
---
|
|
224
|
+
|
|
225
|
+
## Exemplos
|
|
226
|
+
|
|
227
|
+
### Blocos de comando literais
|
|
228
|
+
|
|
229
|
+
```bash
|
|
230
|
+
# Uma vez, efêmero
|
|
231
|
+
npx constella
|
|
232
|
+
|
|
233
|
+
# Forçar o assistente de configuração inicial
|
|
234
|
+
npx constella --onboarding
|
|
235
|
+
|
|
236
|
+
# Modo local (auto-login, 127.0.0.1)
|
|
237
|
+
npx constella --start
|
|
238
|
+
|
|
239
|
+
# E-mail + senha reais (127.0.0.1)
|
|
240
|
+
npx constella --auth
|
|
241
|
+
|
|
242
|
+
# Servidor via Tailscale, em Docker (0.0.0.0)
|
|
243
|
+
npx constella --vps
|
|
244
|
+
|
|
245
|
+
# Roda a partir de um pen-drive (0.0.0.0); escolha um drive ou passe --path
|
|
246
|
+
npx constella --portable
|
|
247
|
+
npx constella --portable --path E:\
|
|
248
|
+
|
|
249
|
+
# Detecta / aplica uma nova versão
|
|
250
|
+
npx constella update
|
|
251
|
+
npx constella update --check
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
### Console do primeiro boot (resumido)
|
|
255
|
+
|
|
256
|
+
```
|
|
257
|
+
• Secrets ready (stored in /home/you/.constella/.env, never printed).
|
|
258
|
+
Constella runtime root : /home/you/.constella
|
|
259
|
+
Mode : start · 127.0.0.1:3000
|
|
260
|
+
• Starting: next start -H 127.0.0.1 -p 3000 (from /…/constella) + worker
|
|
261
|
+
Constella worker → tick http://127.0.0.1:3000/api/cron/tick every 60000ms; telegram poll; watching /home/you/.constella/organizations
|
|
262
|
+
watching /home/you/.constella/organizations
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
---
|
|
266
|
+
|
|
267
|
+
## Estados possíveis
|
|
268
|
+
|
|
269
|
+
| Estado | O que você vê | Significado / correção |
|
|
270
|
+
| --- | --- | --- |
|
|
271
|
+
| **Instalação nova, pré-compilada** | Sem linha de "building"; sobe em segundos. | `.next/BUILD_ID` distribuído — normal. |
|
|
272
|
+
| **Primeiro run, árvore de fonte, sem build** | `• No build found — building (first run, one-time)…` | `next build` único. |
|
|
273
|
+
| **Build falhou, modo público** | `✖ No production build and the build failed.` e sai. | Não sobe silenciosamente o `next dev` num modo público. Instale um pacote já compilado ou rode `pnpm build` (ou defina `CONSTELLA_DEV=1` para permitir o fallback de dev). |
|
|
274
|
+
| **Banco novo, migrate falhou** | `✖ Database schema migration failed on a fresh database — aborting.` | O app precisa das tabelas. Reinstale o pacote. |
|
|
275
|
+
| **Banco existente, migrate pulado** | `• schema migrate skipped/failed on an existing DB — continuing` | No-op idempotente tolerado. |
|
|
276
|
+
| **Portátil, drive pequeno demais** | `✖ Portable needs at least 32 GB free …` e sai | Use um drive maior. |
|
|
277
|
+
| **Portátil, nenhum USB encontrado** | `✖ Portable mode: no removable USB drive detected.` | Insira um pen-drive ou passe `--path <drive>`. |
|
|
278
|
+
| **Crash-loop de filho** | `✖ [web] exited … crashed 5x within 60s — giving up.` | Crash real e repetido. Limite agentes concorrentes ou aumente `CONSTELLA_WEB_HEAP_MB`. |
|
|
279
|
+
| **`drizzle-kit`/`next` ausente** | `✖ drizzle-kit not found …` / `✖ next not found …` | Instalação quebrada — reinstale. |
|
|
280
|
+
|
|
281
|
+
---
|
|
282
|
+
|
|
283
|
+
## Integrações relacionadas 🛰️
|
|
284
|
+
|
|
285
|
+
- **O worker** (`bin/worker.mjs`) é iniciado automaticamente e roda o tick do cron (`POST /api/cron/tick` a cada ~60 s), o file watcher do chokidar (debounce de 400 ms → `POST /api/sync/file`) e o long-poll do Telegram. Ele se comunica de volta por loopback com um header `x-worker-secret` e recusa hosts fora do loopback. Veja [ARCHITECTURE](./ARCHITECTURE.md) e [TELEGRAM](./TELEGRAM.md).
|
|
286
|
+
- **Agentes** rodam como processos de CLI `claude`/`codex` reais dentro da jaula do workspace de cada organização. Veja [AGENTS](./AGENTS.md) e [AI_ARCHITECTURE](./AI_ARCHITECTURE.md).
|
|
287
|
+
- **Modelos** são resolvidos de um catálogo em cache; modelos GGUF locais rodam via servidores llama.cpp. Veja [MODELS](./MODELS.md).
|
|
288
|
+
- **Onboarding** roda no primeiro boot (ou com `--onboarding`). Veja [ONBOARDING](./ONBOARDING.md).
|
|
289
|
+
|
|
290
|
+
---
|
|
291
|
+
|
|
292
|
+
## Segurança 🕳️
|
|
293
|
+
|
|
294
|
+
- **Os segredos são gerados e persistidos uma vez** em `<HOME>/.env` com modo `0o600`, e **nunca impressos** — o console só confirma o caminho. Modos de rede (`auth`/`vps`/`portable`) exigem um `BETTER_AUTH_SECRET` real; `next start` roda sob `NODE_ENV=production`, onde o better-auth **lança erro** com sua chave padrão, então até o `start` local recebe um real.
|
|
295
|
+
- **Sem execução por nome puro.** O lançador resolve `next` e `drizzle-kit` para caminhos JS absolutos e os roda com `node` diretamente — sem `shell: true`, sem busca no PATH — para que um `npx`/`next`/`drizzle-kit` sequestrado não os sombreie.
|
|
296
|
+
- **Modo público falha-fechado.** Um lançamento de `bin/constella.mjs` é sempre tratado como produção (`CONSTELLA_PUBLIC=1`); recusa cair para o servidor `next dev` não-endurecido, a menos que um desenvolvedor opte explicitamente com `CONSTELLA_DEV=1`.
|
|
297
|
+
- **Guarda anti-SSRF do worker.** O worker carrega o `x-worker-secret` privilegiado e recusa enviá-lo a qualquer host fora do loopback a menos que `CONSTELLA_ALLOW_REMOTE_WORKER_BASE_URL=1` esteja definido.
|
|
298
|
+
- O caminho de update do lançador passa o nome do binário da plataforma (`npm.cmd` no Windows) diretamente, sem interpretação de shell.
|
|
299
|
+
|
|
300
|
+
Modelo mais profundo: [SECURITY](./SECURITY.md).
|
|
301
|
+
|
|
302
|
+
---
|
|
303
|
+
|
|
304
|
+
## Solução de problemas
|
|
305
|
+
|
|
306
|
+
| Sintoma | Causa | Correção |
|
|
307
|
+
| --- | --- | --- |
|
|
308
|
+
| `Unsupported engine` / erros de sintaxe no boot | Node < 20 | Instale Node ≥ 20; `node -v`. |
|
|
309
|
+
| Navegador mostra 500 em toda página após o primeiro boot | Schema do banco não aplicado | Procure o erro de migrate no console; reinstale se o `drizzle-kit` estiver ausente. |
|
|
310
|
+
| Agentes planejam mas nunca editam arquivos | `claude`/`codex` não instalado/autenticado | Instale e faça login no CLI do agente; verifique o `PATH`. Veja [AGENTS](./AGENTS.md). |
|
|
311
|
+
| Dados aparecem na pasta errada | `CONSTELLA_HOME` relativo / `INIT_CWD` ausente sob `.next/standalone` | Use um `CONSTELLA_HOME` absoluto ou lance via CLI / `pnpm start`. Veja `src/lib/runtime-root.ts`. |
|
|
312
|
+
| Porta já em uso | `3000` ocupada | `--port 3100` ou defina `PORT`. |
|
|
313
|
+
| Mensagens do Telegram ignoradas | Worker não rodando | O CLI/`start`/`dev:all` o iniciam; confirme que subiu. Veja [TELEGRAM](./TELEGRAM.md). |
|
|
314
|
+
| Web reinicia repetidamente e depois "desiste" | OOM no nível do SO ou crash nativo | Limite agentes concorrentes; aumente `CONSTELLA_WEB_HEAP_MB`. |
|
|
315
|
+
| `update` diz "Running from source" | Árvore com `.git` + `src/` | Atualize com `git pull && pnpm install && pnpm build`. Veja [UPDATE](./UPDATE.md). |
|
|
316
|
+
|
|
317
|
+
Mais: [TROUBLESHOOTING](./TROUBLESHOOTING.md) · [FAQ](./FAQ.md).
|
|
318
|
+
|
|
319
|
+
---
|
|
320
|
+
|
|
321
|
+
## Links relacionados
|
|
322
|
+
|
|
323
|
+
- [ONBOARDING](./ONBOARDING.md) — o assistente de configuração inicial
|
|
324
|
+
- [CONFIGURATION](./CONFIGURATION.md) — cada variável de ambiente e flag
|
|
325
|
+
- [START_MODE](./START_MODE.md) · [AUTH_MODE](./AUTH_MODE.md) · [VPS_MODE](./VPS_MODE.md) · [PORTABLE_MODE](./PORTABLE_MODE.md)
|
|
326
|
+
- [ARCHITECTURE](./ARCHITECTURE.md) — raiz de runtime, processo duplo, motor de sync
|
|
327
|
+
- [UPDATE](./UPDATE.md) — atualizações cientes do contexto
|
|
328
|
+
- [TEST_DEV](./TEST_DEV.md) — rodando a partir da fonte
|
|
329
|
+
- [TROUBLESHOOTING](./TROUBLESHOOTING.md) · [FAQ](./FAQ.md)
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
[← Índice](./README.md) · [🇬🇧 English](../en/KB_AGENT.md) · [✦ Constella](../../README.pt-BR.md)
|
|
2
|
+
|
|
3
|
+
# Agente de KB — Vannevar 🌌🛰️
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
Vannevar é o agente de Conhecimento: o guardião da fonte única de verdade da Constella. Tudo de reutilizável que a constelação aprende passa por esta estrela — classificado, deduplicado, mantido atualizado e devolvido com referências. Vannevar é dono da **camada curada, classificada e ciente de estado** que fica sobre a nebulosa de memória bruta do RAG.
|
|
8
|
+
|
|
9
|
+
> Fonte da verdade: `src/server/kb.ts` (motor) e `src/data/kb-prompt.ts` (prompt da persona de Vannevar + taxonomia). A camada bruta de embedding/índice está documentada em [KB_RAG.md](./KB_RAG.md).
|
|
10
|
+
|
|
11
|
+
## Quando usar 🪐
|
|
12
|
+
|
|
13
|
+
- Você quer entender **como o conhecimento é capturado** enquanto os agentes trabalham (os tokens `[[REMEMBER]]` / `[[CONSULT]]` / `[[KB:]]`).
|
|
14
|
+
- Você precisa saber **o que `/curate` faz** e onde ele grava o relatório de saúde (`Reports/kb-health.md`).
|
|
15
|
+
- Você quer saber **como o conhecimento é aposentado** (superseded / obsolete) e por que uma goal cancelada para de aparecer.
|
|
16
|
+
- Você está integrando **`proposeSkillsFromLearnings`** (P3 aprendizado → skills) ou depurando por que a curadoria não roda.
|
|
17
|
+
- Você quer a **taxonomia da KB** (`kb_entry.type`) e a máquina de estados do ciclo de vida.
|
|
18
|
+
|
|
19
|
+
## Como funciona 🌠
|
|
20
|
+
|
|
21
|
+
A KB da Constella é um **híbrido** de duas metades:
|
|
22
|
+
|
|
23
|
+
| Metade | Caminho | Custo | O que faz |
|
|
24
|
+
|---|---|---|---|
|
|
25
|
+
| **Captura determinística** | `ingestKnowledge()` | Sem LLM (caminho quente) | Classifica pelo type fornecido, deduplica por hash de conteúdo, atualiza no lugar no mesmo slot de origem, faz upsert de um `kb_entry`, (re)embeda seus `rag_chunk`(s). |
|
|
26
|
+
| **Curadoria por LLM** | `runKbCuration()` (Vannevar) | LLM pago/local (fora do caminho quente) | Funde quase-duplicatas, aposenta entradas contraditas, aperta resumos, expõe lacunas de cobertura → `Reports/kb-health.md`. |
|
|
27
|
+
|
|
28
|
+
O caminho determinístico **sempre funciona**; a curadoria é um refinamento best-effort que roda atrás de um gate de debounce + cooldown + teto diário. Tudo é fire-and-forget — a captura de KB **nunca** pode quebrar a execução de uma tarefa.
|
|
29
|
+
|
|
30
|
+
A persona de Vannevar (`src/data/kb-prompt.ts`):
|
|
31
|
+
|
|
32
|
+
- **Identidade** (`KB_IDENTITY`): *"Keeper of the company's single source of truth. Every reusable thing the team learns flows through me…"*
|
|
33
|
+
- **Ritual** (`KB_RITUAL`): *"Ingest new knowledge, retire what's superseded or obsolete, keep summaries tight, surface gaps, and answer any teammate's question with the most recent, active, referenced truth — or say plainly when we don't know yet."*
|
|
34
|
+
- **System prompt** (`KB_AGENT_PROMPT`): o manual de operação completo, semeado em `agent.persona.systemPrompt` no boot por `seedKbAgent()` e espelhado em disco como `.claude/kb/TAXONOMY.md` (de modo que ele próprio é indexado pelo RAG).
|
|
35
|
+
|
|
36
|
+
Fatos de roster de Vannevar (de `src/data/scaffold.ts`): handle `vannevar`, papel **Knowledge**, reporta a `ada`, modelo `haiku`, teto diário **$10 USD**, tier **light**. Veja [AGENTS.md](./AGENTS.md).
|
|
37
|
+
|
|
38
|
+
## Fluxo principal — os três tokens do agente 🛰️
|
|
39
|
+
|
|
40
|
+
Os agentes acionam a KB **inline** emitindo tokens entre colchetes duplos em suas respostas. O sistema os interpreta, executa a ação e remove o token antes de a mensagem ser armazenada/exibida. Isso acontece tanto em **execuções de tarefa** (`src/server/runner.ts`) quanto em **respostas de chat** (`src/server/collab.ts`).
|
|
41
|
+
|
|
42
|
+
```mermaid
|
|
43
|
+
flowchart LR
|
|
44
|
+
A["Texto da resposta do agente"] --> B{"Varre tokens"}
|
|
45
|
+
B -->|"[[REMEMBER type=…: …]]"| C["extractRemembered()<br/>→ ingestKnowledge()"]
|
|
46
|
+
B -->|"[[CONSULT: …]]"| D["answerConsults()<br/>→ kbQuery() → posta resposta"]
|
|
47
|
+
B -->|"[[KB: reindex / index-chat / health]]"| E["runKbTools()<br/>→ indexRag / indexChat / health"]
|
|
48
|
+
C --> F["kb_entry + rag_chunk<br/>(deduplicado, embedado)"]
|
|
49
|
+
D --> G["Resposta postada de volta<br/>como @vannevar (em contexto no próximo turno)"]
|
|
50
|
+
E --> H["Linha de status postada de volta<br/>como @vannevar"]
|
|
51
|
+
B --> I["Tokens removidos → resposta limpa armazenada"]
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### `[[REMEMBER type=<t>: <fact>]]` — o produtor
|
|
55
|
+
|
|
56
|
+
`extractRemembered()` extrai cada token `[[REMEMBER …]]` de uma resposta e transforma cada um em um `KbItem` tipado a ser ingerido.
|
|
57
|
+
|
|
58
|
+
- Regex: `/\[\[REMEMBER(?:\s+type=([a-z-]+))?\s*:?\s*([\s\S]*?)\]\]/gi`.
|
|
59
|
+
- O `type=` é validado contra `KB_LEARN_TYPES` (`decision`, `architecture`, `business-rule`, `integration`, `dependency`, `bug`, `fix`, `test`, `review`, `vuln`, `ui-pattern`, `stack`, `env-config`, `command`, `note`). Um type desconhecido vira `note`.
|
|
60
|
+
- O fato precisa ter **≥ 8 caracteres** ou é descartado. O título é a primeira linha (≤ 80 caracteres); o resumo são os primeiros 1200 caracteres.
|
|
61
|
+
- Numa execução de tarefa o contexto carrega `goalId` / `issueId` / `taskId` (`sourceKind: "task"`, `sourceRef: "<taskId>:learn"`); no chat carrega o id da mensagem (`sourceKind: "chat"`).
|
|
62
|
+
- Os itens capturados são enviados **fire-and-forget** a `ingestKnowledge()`; os tokens são removidos da resposta exibida.
|
|
63
|
+
|
|
64
|
+
### `[[CONSULT: <question>]]` — o consumidor
|
|
65
|
+
|
|
66
|
+
`answerConsults()` resolve uma pergunta pré-ação contra a KB **ciente de estado** para que a resposta esteja no contexto no próximo turno do agente. É o complemento de `[[REMEMBER]]`.
|
|
67
|
+
|
|
68
|
+
- Regex: `/\[\[CONSULT:\s*([\s\S]*?)\]\]/gi`. Consultas com menos de 4 caracteres são ignoradas.
|
|
69
|
+
- Cada pergunta passa por `kbQuery(orgId, q, { agentHandle, k: 6 })`; a resposta é o contexto curado (ou `"(no relevant knowledge in the KB yet)"`).
|
|
70
|
+
- No chat, cada resposta é **postada de volta na thread como `@vannevar`** (`🔎 KB consult — "…"`), de modo que o agente que perguntou a lê no próximo turno.
|
|
71
|
+
|
|
72
|
+
### `[[KB: reindex|index-chat|health]]` — ferramentas de manutenção
|
|
73
|
+
|
|
74
|
+
`runKbTools()` permite que qualquer agente acione manutenção explícita de KB no meio da execução.
|
|
75
|
+
|
|
76
|
+
| Verbo | Ação | Linha de resultado |
|
|
77
|
+
|---|---|---|
|
|
78
|
+
| `reindex` | `indexRag(orgId)` | `reindex → N chunk(s) (semantic)` |
|
|
79
|
+
| `index-chat` (ou `indexchat`) | `indexChat(orgId)` | `index-chat → N chunk(s)` |
|
|
80
|
+
| `health` | `llamaServerStatus()` | `embed health → up (model) \| down` |
|
|
81
|
+
|
|
82
|
+
Verbos desconhecidos/falhos são silenciosamente ignorados. No chat os resultados são postados de volta como `@vannevar` (`🛠️ KB tools — …`).
|
|
83
|
+
|
|
84
|
+
## Laço de curadoria 🕳️
|
|
85
|
+
|
|
86
|
+
`runKbCuration()` é a metade por LLM da ingestão híbrida. Roda **atrás de um gate de debounce + cooldown + teto** e é best-effort.
|
|
87
|
+
|
|
88
|
+
```mermaid
|
|
89
|
+
flowchart TD
|
|
90
|
+
I["ingestKnowledge() sucede<br/>(ingested > 0)"] --> S["scheduleKbCuration(orgId)"]
|
|
91
|
+
S -->|"debounce 4 min"| T{"Dentro do cooldown<br/>de 30 min?"}
|
|
92
|
+
T -->|sim| X["pula esta rodada"]
|
|
93
|
+
T -->|não| C["runKbCuration(orgId)"]
|
|
94
|
+
C --> CAP{"Vannevar acima<br/>do teto diário?"}
|
|
95
|
+
CAP -->|sim| X
|
|
96
|
+
CAP -->|não| N{"≥ 4 entradas<br/>active/superseded?"}
|
|
97
|
+
N -->|não| X
|
|
98
|
+
N -->|sim| L["Monta prompt sobre ≤ 60 entradas recentes<br/>→ runLocalRag (llama.cpp :8082)<br/>→ fallback para CLI do agente"]
|
|
99
|
+
L --> P["Parseia plano JSON<br/>(merges · obsolete · summaries · gaps)"]
|
|
100
|
+
P --> M["Funde dups → status=superseded<br/>+ supersedesId, flag rag_chunk obsolete"]
|
|
101
|
+
P --> R["Aposenta → status=obsolete<br/>flag rag_chunk obsolete"]
|
|
102
|
+
P --> U["Aperta resumos → re-embeda entrada"]
|
|
103
|
+
P --> G["Coleta lacunas de cobertura"]
|
|
104
|
+
M --> H["writeDoc Reports/kb-health.md"]
|
|
105
|
+
R --> H
|
|
106
|
+
U --> H
|
|
107
|
+
G --> H
|
|
108
|
+
H --> O["notifyOps (se algo mudou)"]
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
O que cada passo faz:
|
|
112
|
+
|
|
113
|
+
1. **Gate.** Resolve Vannevar (`handle === "vannevar"`, senão o primeiro papel que casa `/knowledge/i`). Aborta se ausente ou acima do `dailyCapUsd` (`overCap()`).
|
|
114
|
+
2. **Amostra.** Seleciona as 60 entradas atualizadas mais recentemente com `status in (active, superseded)`. Menos de **4** → não vale uma execução paga, aborta. Compacta cada uma para `{ id, type, title, summary (≤300), ref, goalId, status }`.
|
|
115
|
+
3. **Raciocina.** Monta um prompt a partir de `KB_AGENT_PROMPT` + as entradas JSON, pedindo um objeto JSON estrito. Roda no **modelo local primeiro** (`runLocalRag` → servidor de chat llama.cpp em `LLAMACPP_URL`, padrão `http://127.0.0.1:8082`), com fallback para o CLI de Vannevar (`runAgent`) apenas se o servidor local estiver fora. O custo é lançado em `cost_entry` quando não-zero.
|
|
116
|
+
4. **Aplica** (limitado aos ids realmente presentes no lote):
|
|
117
|
+
- **merges** → cada id descartado vira `status="superseded"`, `supersedesId=<keep>`, seus `rag_chunk`s marcados `obsolete=1`.
|
|
118
|
+
- **obsolete** → `status="obsolete"`, `rag_chunk`s marcados `obsolete=1`.
|
|
119
|
+
- **summaries** → aperta `kb_entry.summary` (≤ 1200) e **re-embeda** a entrada; aplicado apenas a entradas `active`.
|
|
120
|
+
- **gaps** → coletadas (máx 30) como strings simples.
|
|
121
|
+
5. **Relata.** Grava `Reports/kb-health.md` via `writeDoc` (write-through em disco + indexado pelo RAG, então aparece em `/reports`), depois `notifyOps` se algo mudou.
|
|
122
|
+
|
|
123
|
+
`runKbCuration()` retorna `{ ok, merged, retired, summarized, gaps }`.
|
|
124
|
+
|
|
125
|
+
### O relatório de saúde da KB
|
|
126
|
+
|
|
127
|
+
`Reports/kb-health.md` (gravado por `writeDoc`) fica assim:
|
|
128
|
+
|
|
129
|
+
```markdown
|
|
130
|
+
# KB health
|
|
131
|
+
|
|
132
|
+
_Curated by @vannevar · 42 active · 7 retired entr(y/ies)_
|
|
133
|
+
|
|
134
|
+
This pass: merged 3, retired 1, re-summarised 5.
|
|
135
|
+
|
|
136
|
+
## Coverage gaps
|
|
137
|
+
- Module "billing/" has produced files but no captured knowledge yet
|
|
138
|
+
- …
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### Gatilhos
|
|
142
|
+
|
|
143
|
+
| Gatilho | Caminho | Notas |
|
|
144
|
+
|---|---|---|
|
|
145
|
+
| Automático | `scheduleKbCuration(orgId)` após um `ingestKnowledge` bem-sucedido | Debounce de 4 min coalesce uma rajada de ingestões; cooldown de 30 min por workspace; opt-out com `CONSTELLA_KB_CURATION=0`. |
|
|
146
|
+
| Comando do operador | `/curate` (`src/server/commands.ts`) | Roda `runKbCuration` sincronamente; Vannevar reporta o resultado no canal. |
|
|
147
|
+
| Ação de UI | `curateKb()` (`src/server/actions/kb-actions.ts`) | Mesma chamada de motor a partir do módulo Knowledge. |
|
|
148
|
+
|
|
149
|
+
## P3 — aprendizado → skills 🚀
|
|
150
|
+
|
|
151
|
+
`proposeSkillsFromLearnings()` é Vannevar lendo o conhecimento **validado e recorrente** do time e destilando-o em **0–3 novas skills reutilizáveis**.
|
|
152
|
+
|
|
153
|
+
- Lê entradas `active` cujo `type` está em `REUSABLE` (`doc`, `research`, `ui-pattern`, `stack`, `integration`, `fix`, `decision`, `architecture`, `business-rule`), mantendo apenas entradas com `confidence >= 60` (`strong`). Precisa de **≥ 4** entradas fortes ou aborta.
|
|
154
|
+
- Deduplica contra `skill.name`s existentes; monta um prompt pedindo um array JSON de `{ name, role, trigger, summary, instructions }`.
|
|
155
|
+
- Cada proposta aceita aterrissa como uma skill **provisória**: `native=false`, `provisional=true`, `indexed="pending"`, `proposedRole=<role>` — **não vinculada a nenhum agente** até o operador aprová-la em `/skills` (`approveProvisional` a vincula por papel). Um arquivo `.claude/skills/<name>.md` é gravado em disco.
|
|
156
|
+
- Notifica o operador (`notifyOps`, kind `review`) quando algo foi proposto.
|
|
157
|
+
- Acionada pelo operador via página de Skills (`suggestSkillsFromLearnings` em `src/server/skills.ts`). Retorna `{ ok, proposed }`.
|
|
158
|
+
|
|
159
|
+
Veja [SKILLS.md](./SKILLS.md) para o ciclo de vida de skills e `approveProvisional`.
|
|
160
|
+
|
|
161
|
+
## Conceitos-chave ✦
|
|
162
|
+
|
|
163
|
+
- **Recuperação ciente de estado.** `kbQuery()` só retorna `rag_chunk`s com `obsolete=0`, o que exclui entradas superseded/obsolete e o conhecimento de goals canceladas/arquivadas. Retorna uma flag `sufficient` (um sinal explícito de *"conhecimento insuficiente"*) e registra cada consulta em `kb_query_log`.
|
|
164
|
+
- **Gate de política de conteúdo.** `ingestKnowledge` roda `scrubSecrets()` sobre cada item; se a limpeza altera o texto, havia um segredo, e o item é **recusado** (nunca indexado). Veja [SECURITY.md](./SECURITY.md).
|
|
165
|
+
- **Cascata de estado.** `markKbObsoleteForGoal(wsId, goalId)` aposenta o conhecimento de uma goal quando ela é cancelada/arquivada (marca `kb_entry` obsolete + flag `rag_chunk` `obsolete=1`).
|
|
166
|
+
- **Grafo multi-hop.** `relatedKnowledge()` percorre as colunas de link `goalId/specId/issueId` + a cadeia `supersedes` (padrão 2 hops) a partir de um item de trabalho semente, retornando o conhecimento conectado agrupado por type. Decisions são elas próprias linhas `kb_entry`, então isso liga decisions ↔ specs ↔ issues ↔ fixes/reviews/patterns anteriores.
|
|
167
|
+
- **Respostas curadas.** `kbAnswer()` é o caminho limpo de *"Pergunte à KB"* (chat da home + `/kb`). Perguntas meta/status (`KB_META_RE`) recebem um cartão de visão geral determinístico a partir de números reais; perguntas de conteúdo recebem uma resposta curta escrita pelo modelo via `summarizeWithKbAgent()` (modelo local primeiro, nunca um despejo bruto de contexto) mais uma linha de Sources organizada.
|
|
168
|
+
|
|
169
|
+
## Tabelas 🪐
|
|
170
|
+
|
|
171
|
+
| Tabela | Colunas-chave | Papel |
|
|
172
|
+
|---|---|---|
|
|
173
|
+
| `kb_entry` | `type`, `title`, `summary`, `body`, `status`, `goal_id`, `spec_id`, `issue_id`, `task_id`, `module`, `paths`, `agent_handle`, `source_kind`, `source_ref`, `supersedes_id`, `hash`, `confidence` | A unidade de conhecimento curada, classificada e com ciclo de vida rastreado. |
|
|
174
|
+
| `rag_chunk` | `path`, `chunk`, `vector`, `kb_entry_id`, `obsolete` | Os chunks de recuperação embedados. Entradas de KB emitem chunks em `path = kb/<type>/<id>`. |
|
|
175
|
+
| `kb_query_log` | `agent_handle`, `query`, `hits`, `mode`, `refs`, `answered_at` | Cada consulta (quem perguntou, como foi respondida). |
|
|
176
|
+
| `synced_block` | `slug`, `kind`, `title`, `body`, `version` | Blocos canônicos centrais (ex.: `mission`, `official-stack`, `business-rules`). Veja [SYNCED_BLOCKS.md](./SYNCED_BLOCKS.md). |
|
|
177
|
+
| `block_proposal` | `slug`, `kind`, `body`, `by_agent_handle`, `status` | Fila de propostas para synced blocks. |
|
|
178
|
+
|
|
179
|
+
Todas as tabelas de KB são criadas idempotentemente no boot por `ensureKbTables()` (DDL sem migração, seguro a cada boot).
|
|
180
|
+
|
|
181
|
+
### Taxonomia `kb_entry.type` (~24 tipos)
|
|
182
|
+
|
|
183
|
+
| Type | Significado |
|
|
184
|
+
|---|---|
|
|
185
|
+
| `decision` | Decisões técnicas/arquiteturais + justificativa |
|
|
186
|
+
| `spec` / `issue` / `goal` / `plan` | Artefatos de trabalho e sua intenção |
|
|
187
|
+
| `architecture` | Estrutura do sistema, fronteiras, fluxo de dados |
|
|
188
|
+
| `business-rule` | Regras de produto/domínio que restringem a implementação |
|
|
189
|
+
| `code-change` | O que uma tarefa produziu (arquivos + resumo) |
|
|
190
|
+
| `dependency` / `integration` | Bibliotecas, serviços, sistemas externos |
|
|
191
|
+
| `bug` / `fix` | Defeitos encontrados + correções aplicadas |
|
|
192
|
+
| `test` / `review` | Veredictos de teste + resultados de code-review |
|
|
193
|
+
| `vuln` | Achados e riscos de segurança |
|
|
194
|
+
| `doc` | Documentação escrita/atualizada |
|
|
195
|
+
| `user-context` | O que o operador quer; restrições, preferências |
|
|
196
|
+
| `history` | Marcos e história do projeto |
|
|
197
|
+
| `command` | Comandos executados úteis / passos de runbook |
|
|
198
|
+
| `file-structure` | Onde as coisas ficam no workspace |
|
|
199
|
+
| `ui-pattern` | Convenções de UI/UX a manter consistentes |
|
|
200
|
+
| `stack` | A stack tecnológica oficial |
|
|
201
|
+
| `env-config` | Fatos de ambiente e configuração |
|
|
202
|
+
| `note` | Coringa |
|
|
203
|
+
|
|
204
|
+
## Estados possíveis 🌠
|
|
205
|
+
|
|
206
|
+
`kb_entry.status` é um ciclo de vida de quatro estados:
|
|
207
|
+
|
|
208
|
+
| Estado | Definido por | Aparece na recuperação? |
|
|
209
|
+
|---|---|---|
|
|
210
|
+
| `active` | `ingestKnowledge` (captura) | ✅ sim |
|
|
211
|
+
| `superseded` | merge de curadoria (`supersedesId` → a entrada canônica mantida) | ❌ não (`obsolete=1`) |
|
|
212
|
+
| `obsolete` | aposentadoria de curadoria, ou `markKbObsoleteForGoal` numa goal cancelada/arquivada, ou contradito por verdade mais nova | ❌ não (`obsolete=1`) |
|
|
213
|
+
| `archived` | reservado (contado em `kbOverview.lifecycle`) | ❌ não |
|
|
214
|
+
|
|
215
|
+
```mermaid
|
|
216
|
+
stateDiagram-v2
|
|
217
|
+
[*] --> active: ingestKnowledge
|
|
218
|
+
active --> superseded: merge de curadoria (dup)
|
|
219
|
+
active --> obsolete: aposentadoria / goal cancelada
|
|
220
|
+
superseded --> obsolete: goal cancelada
|
|
221
|
+
active --> archived: (reservado)
|
|
222
|
+
superseded --> [*]
|
|
223
|
+
obsolete --> [*]
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
## Passo a passo — da captura à recordação
|
|
227
|
+
|
|
228
|
+
1. Um agente termina uma tarefa e emite `[[REMEMBER type=fix: bumped chokidar to v4, watcher debounce moved to 400ms]]` em sua resposta.
|
|
229
|
+
2. O runner chama `extractRemembered()` → um `KbItem{ type: "fix", title: "bumped chokidar to v4…" }` com `goalId/issueId/taskId` preenchidos.
|
|
230
|
+
3. `ingestKnowledge()` faz hash do conteúdo, não encontra duplicata, insere um `kb_entry` e embeda seu `rag_chunk` em `kb/fix/<id>`. O token `[[REMEMBER]]` é removido da resposta armazenada.
|
|
231
|
+
4. Como algo foi ingerido, `scheduleKbCuration(orgId)` arma um debounce de 4 minutos. Quando dispara (e o cooldown passou e Vannevar está abaixo do teto), `runKbCuration` funde, aposenta, aperta e grava `Reports/kb-health.md`.
|
|
232
|
+
5. Mais tarde, outro agente emite `[[CONSULT: how is the file watcher configured?]]`. `answerConsults()` roda `kbQuery()`, que retorna a entrada de fix (ainda ativa); Vannevar posta a resposta de volta na thread, de modo que o agente que perguntou a lê no próximo turno.
|
|
233
|
+
|
|
234
|
+
## Exemplos
|
|
235
|
+
|
|
236
|
+
Pergunte à KB pelo chat ou via slash command:
|
|
237
|
+
|
|
238
|
+
```text
|
|
239
|
+
/kb how is the file watcher configured?
|
|
240
|
+
/curate
|
|
241
|
+
/reindex
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
Proposta de skills acionada pelo operador (página de Skills → `suggestSkillsFromLearnings`):
|
|
245
|
+
|
|
246
|
+
```text
|
|
247
|
+
# retorna { ok: true, proposed: 2 } → duas skills provisórias na fila para aprovação em /skills
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
Opt-out da curadoria automática (ex.: orçamento minúsculo):
|
|
251
|
+
|
|
252
|
+
```bash
|
|
253
|
+
CONSTELLA_KB_CURATION=0
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
Aponte o modelo local de RAG/curadoria para um servidor de chat llama.cpp não-padrão:
|
|
257
|
+
|
|
258
|
+
```bash
|
|
259
|
+
LLAMACPP_URL=http://127.0.0.1:8082
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
## Integrações relacionadas 🛰️
|
|
263
|
+
|
|
264
|
+
- **Camada RAG** — embeddings, `chunksOf`, o servidor de embed. Veja [KB_RAG.md](./KB_RAG.md).
|
|
265
|
+
- **Memória & contexto** — como a recordação alimenta o prompt de um agente. Veja [MEMORY_RAG.md](./MEMORY_RAG.md).
|
|
266
|
+
- **Synced blocks** — os blocos canônicos centrais que o cartão da KB verifica. Veja [SYNCED_BLOCKS.md](./SYNCED_BLOCKS.md).
|
|
267
|
+
- **Skills** — skills provisórias propostas a partir de aprendizados. Veja [SKILLS.md](./SKILLS.md).
|
|
268
|
+
- **Team Room / DM** — onde as respostas de `[[CONSULT]]` são postadas. Veja [TEAM_ROOM.md](./TEAM_ROOM.md), [DM.md](./DM.md).
|
|
269
|
+
- **Slash commands** — `/kb`, `/curate`, `/reindex`. Veja [CHAT_COMMANDS.md](./CHAT_COMMANDS.md).
|
|
270
|
+
- **Models** — modelo local para geração de RAG gratuita. Veja [MODELS.md](./MODELS.md).
|
|
271
|
+
|
|
272
|
+
## Segurança 🕳️
|
|
273
|
+
|
|
274
|
+
- **Recusa de segredo na ingestão.** `ingestKnowledge` recusa qualquer item cujo conteúdo muda sob `scrubSecrets()` (chaves de API, tokens, PEM, bearer, URLs de DB com credenciais). O aprendizado é logado-e-descartado, nunca indexado.
|
|
275
|
+
- **Scrub na saída.** As respostas de chat (e as respostas de `[[CONSULT]]` postadas como Vannevar) são limpas novamente antes de serem armazenadas/exibidas (`collab.ts`).
|
|
276
|
+
- **Ciente de estado por padrão.** Conhecimento cancelado/arquivado/superseded/obsolete não pode aparecer via `kbQuery` — os agentes nunca agem sobre verdade aposentada.
|
|
277
|
+
- **Gate de orçamento.** Tanto `runKbCuration` quanto `proposeSkillsFromLearnings` abortam quando Vannevar está acima do seu `dailyCapUsd`, de modo que a curadoria nunca estoura o orçamento.
|
|
278
|
+
|
|
279
|
+
Veja [SECURITY.md](./SECURITY.md).
|
|
280
|
+
|
|
281
|
+
## Solução de problemas
|
|
282
|
+
|
|
283
|
+
| Sintoma | Causa provável | Correção |
|
|
284
|
+
|---|---|---|
|
|
285
|
+
| `/curate` diz *"Nothing to curate right now"* | Menos de 4 entradas active/superseded, ou Vannevar acima do teto | Deixe os agentes completarem mais trabalho; verifique o teto diário de Vannevar. |
|
|
286
|
+
| A curadoria nunca roda automaticamente | `CONSTELLA_KB_CURATION=0`, dentro do cooldown de 30 min, ou nenhuma ingestão | Remova o opt-out; espere o cooldown passar. |
|
|
287
|
+
| `[[REMEMBER]]` não capturado | Fato com menos de 8 caracteres, ou o texto carregava forma de segredo (recusado) | Escreva um fato mais longo e sem segredos. |
|
|
288
|
+
| Resposta de `[[CONSULT]]` é *"(no relevant knowledge…)"* | KB vazia ou consulta com menos de 4 caracteres | Rode `/reindex`; faça uma pergunta mais longa. |
|
|
289
|
+
| As respostas da KB parecem desatualizadas | Chunks superseded/obsolete ainda marcados ativos, ou índice nunca reconstruído | Rode `/reindex`; rode `/curate`; verifique `Reports/kb-health.md`. |
|
|
290
|
+
| Nenhum relatório de saúde da KB | A curadoria nunca produziu mudanças, ou erro de disco no `writeDoc` | Verifique permissões de disco; rode `/curate` após algumas ingestões. |
|
|
291
|
+
| Skills propostas = 0 | Menos de 4 entradas reutilizáveis fortes (`confidence ≥ 60`) | Acumule mais aprendizados validados primeiro. |
|
|
292
|
+
|
|
293
|
+
Veja [TROUBLESHOOTING.md](./TROUBLESHOOTING.md).
|
|
294
|
+
|
|
295
|
+
## Links relacionados
|
|
296
|
+
|
|
297
|
+
- [KB_RAG.md](./KB_RAG.md) — a camada bruta de RAG/índice sob a KB.
|
|
298
|
+
- [MEMORY_RAG.md](./MEMORY_RAG.md) — memória & montagem de contexto.
|
|
299
|
+
- [SYNCED_BLOCKS.md](./SYNCED_BLOCKS.md) — blocos canônicos centrais.
|
|
300
|
+
- [SKILLS.md](./SKILLS.md) — skills + aprovação de provisórias.
|
|
301
|
+
- [AGENTS.md](./AGENTS.md) — o roster (papel/modelo/teto de Vannevar).
|
|
302
|
+
- [CHAT_COMMANDS.md](./CHAT_COMMANDS.md) — `/kb`, `/curate`, `/reindex`.
|
|
303
|
+
- [TEAM_ROOM.md](./TEAM_ROOM.md) · [DM.md](./DM.md) — onde as respostas de consult aterrissam.
|
|
304
|
+
- [MODELS.md](./MODELS.md) — modelo local para geração de RAG gratuita.
|
|
305
|
+
- [SECURITY.md](./SECURITY.md) · [TROUBLESHOOTING.md](./TROUBLESHOOTING.md)
|