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
|
+
[β Docs index](./README.md) Β· [π§π· PortuguΓͺs](../pt/INSTALLATION.md) Β· [β¦ Constella](../../README.md)
|
|
2
|
+
|
|
3
|
+
# π Installation β boarding the central ship
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
Constella is a local-first control plane that runs autonomous AI agent-companies. Installing it means lighting up the central ship: one launcher (`bin/constella.mjs`) installs the compiled runtime, applies the database schema, and boots a supervised web server plus a 24/7 worker β all under a single runtime root in your home directory. β¦
|
|
8
|
+
|
|
9
|
+
> **TL;DR** β `npx constella` if you have Node β₯ 20 and the `claude`/`codex` CLIs. Data lives in `~/.constella`. Nothing is faked.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## When to use
|
|
14
|
+
|
|
15
|
+
| You want to⦠| Use |
|
|
16
|
+
| --- | --- |
|
|
17
|
+
| Try Constella once, nothing left behind globally | `npx constella` |
|
|
18
|
+
| Run it daily on your own machine | `npm install -g constella` then `constella` |
|
|
19
|
+
| Force the first-run setup wizard again | `npx constella --onboarding` |
|
|
20
|
+
| Run on a server reachable over Tailscale, in Docker | `npx constella --vps` β see [VPS_MODE](./VPS_MODE.md) |
|
|
21
|
+
| Run entirely off a USB drive | `npx constella --portable` β see [PORTABLE_MODE](./PORTABLE_MODE.md) |
|
|
22
|
+
| Hack on the source tree | `git clone` + `pnpm install` + `pnpm dev:all` (see [TEST_DEV](./TEST_DEV.md)) |
|
|
23
|
+
|
|
24
|
+
This page covers getting the runtime onto a machine and booting it. For *which mode does what*, read [START_MODE](./START_MODE.md), [AUTH_MODE](./AUTH_MODE.md), [VPS_MODE](./VPS_MODE.md), and [PORTABLE_MODE](./PORTABLE_MODE.md). For the post-install setup wizard, read [ONBOARDING](./ONBOARDING.md).
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Prerequisites π°οΈ
|
|
29
|
+
|
|
30
|
+
| Requirement | Detail | Where it is checked |
|
|
31
|
+
| --- | --- | --- |
|
|
32
|
+
| **Node.js β₯ 20** | `package.json` declares `"engines": { "node": ">=20" }`. The launcher is an ES module and uses `--env-file`, `node:fs` modern APIs, and global `fetch`. | `package.json` |
|
|
33
|
+
| **`claude` and/or `codex` CLI** | Agents are spawned as **real** CLI processes (`claude -p β¦`, `codex β¦`). Without at least one installed and authenticated, agents can plan but cannot execute. | `src/server/adapters/cli.ts` |
|
|
34
|
+
| **Disk space** | The runtime root holds the database, per-org workspaces, RAG index, caches and (optionally) local model weights. Portable mode **refuses < 32 GB free**; `β₯ 32 GB` is fine (more headroom only helps if you carry local models). | `bin/constella.mjs` (`freeBytes`) |
|
|
35
|
+
| **A terminal** | The launcher prints the URL; you open it in a browser. | β |
|
|
36
|
+
|
|
37
|
+
> Constella does **not** bundle the agent CLIs. It calls whatever `claude`/`codex` is on your `PATH` and inherits your `~/.claude` configuration. See [AGENTS](./AGENTS.md) and [MODELS](./MODELS.md).
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## How it works π
|
|
42
|
+
|
|
43
|
+
`bin/constella.mjs` is a dependency-light launcher that mirrors how `claude` and `codex` install themselves β **everything lives under a user-home runtime root**, never in the directory you happen to run the command from.
|
|
44
|
+
|
|
45
|
+
The launcher, in order:
|
|
46
|
+
|
|
47
|
+
1. **Parses the launch flag** to choose a run mode (`start` | `auth` | `vps` | `portable`). The flag β not the UI β picks the mode in a public build.
|
|
48
|
+
2. **Resolves the runtime root** (`CONSTELLA_HOME` β `--path` β `~/.constella`; portable with no path prompts you to pick a USB drive) and creates `<HOME>/organizations`.
|
|
49
|
+
3. **Resolves the package root** (`PKG_ROOT`) β where the compiled `.next`, the `drizzle/` migrations and configs ship β because when installed these are **not** in your current directory.
|
|
50
|
+
4. **Persists secrets** to `<HOME>/.env` (`chmod 600`): `BETTER_AUTH_SECRET`, `CONSTELLA_VAULT_KEY`, `CONSTELLA_WORKER_SECRET` β generated once, reused forever.
|
|
51
|
+
5. **Validates the drive** in portable mode (refuse < 32 GB; β₯ 32 GB is fine).
|
|
52
|
+
6. **Applies the database schema** by running the shipped `drizzle-kit migrate` against a possibly-fresh `<HOME>/constella.db`. Idempotent; fatal only on a fresh DB.
|
|
53
|
+
7. **Builds on first run only as a fallback** β the published package already ships a prebuilt `.next`, so this is skipped for end users.
|
|
54
|
+
8. **Boots two supervised children**: the web server (`next start`) and the worker (`bin/worker.mjs`), auto-restarting either on an unexpected crash.
|
|
55
|
+
|
|
56
|
+
### What actually gets installed
|
|
57
|
+
|
|
58
|
+
You receive a **compiled, minified runtime β never the source**. `package.json` `files` ships:
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
.next # the prebuilt Next.js production build
|
|
62
|
+
bin # constella.mjs (launcher) + worker.mjs
|
|
63
|
+
scripts # start-all.mjs, dev-all.mjs, trim-next.mjs, β¦
|
|
64
|
+
skills # the native skills library (seeded per workspace)
|
|
65
|
+
docs # this documentation
|
|
66
|
+
drizzle # generated SQL migrations (the schema, no source TS)
|
|
67
|
+
next.config.mjs # .mjs so `next start` needs no TypeScript at runtime
|
|
68
|
+
drizzle.config.mjs
|
|
69
|
+
README.md LICENSE CHANGELOG.md
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
`src/` is intentionally **not** shipped. The schema reaches the end user as generated SQL under `drizzle/`, applied via `drizzle-kit migrate` β so a brand-new database is built with no source schema file present.
|
|
73
|
+
|
|
74
|
+
### Where your data lives πͺ
|
|
75
|
+
|
|
76
|
+
| Path | What |
|
|
77
|
+
| --- | --- |
|
|
78
|
+
| `~/.constella/` | Runtime root (override with `CONSTELLA_HOME` or `--path <dir>`). |
|
|
79
|
+
| `~/.constella/constella.db` | The SQLite database (`DATABASE_URL=file:<HOME>/constella.db`). |
|
|
80
|
+
| `~/.constella/.env` | Persisted secrets, `chmod 600`, **never printed**. |
|
|
81
|
+
| `~/.constella/organizations/<orgId>/workspace/` | Each agent-company's isolated workspace (the FS jail). |
|
|
82
|
+
| `~/.constella/cache/` | Model catalog cache (`models-dev.json`, 24 h TTL). |
|
|
83
|
+
| `~/.constella/backups/` | Pre-update backups of `.env` + DB. |
|
|
84
|
+
|
|
85
|
+
> The runtime root is the **single source of truth**. The directory is canonical; the database indexes it. See [ARCHITECTURE](./ARCHITECTURE.md).
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## Main flow π
|
|
90
|
+
|
|
91
|
+
```mermaid
|
|
92
|
+
flowchart TD
|
|
93
|
+
A["npx constella / constella"] --> B{"Subcommand?"}
|
|
94
|
+
B -->|"update [--check]"| U["Check npmjs registry,<br/>maybe npm i -g constella@latest"]
|
|
95
|
+
B -->|"start (default)"| C["Resolve run mode<br/>start | auth | vps | portable"]
|
|
96
|
+
C --> D["Resolve runtime root<br/>CONSTELLA_HOME β --path β ~/.constella"]
|
|
97
|
+
D --> E["Resolve PKG_ROOT<br/>(compiled .next, drizzle/, configs)"]
|
|
98
|
+
E --> F["Persist secrets to HOME/.env (chmod 600)"]
|
|
99
|
+
F --> G{"Portable?"}
|
|
100
|
+
G -->|yes| H["Drive check:<br/>refuse < 32 GB Β· else good"]
|
|
101
|
+
G -->|no| I
|
|
102
|
+
H --> I["drizzle-kit migrate β HOME/constella.db"]
|
|
103
|
+
I --> J{".next/BUILD_ID present?"}
|
|
104
|
+
J -->|"yes (shipped)"| L
|
|
105
|
+
J -->|no| K["next build (first run, one-time)"]
|
|
106
|
+
K --> L["Supervisor boots children"]
|
|
107
|
+
L --> M["web: next start -H host -p port"]
|
|
108
|
+
L --> N["worker: bin/worker.mjs"]
|
|
109
|
+
M --> O["Open http://host:port"]
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## Key concepts
|
|
115
|
+
|
|
116
|
+
| Concept | Meaning |
|
|
117
|
+
| --- | --- |
|
|
118
|
+
| **Runtime root** (`CONSTELLA_HOME`) | The home-dir directory that holds the DB, workspaces, caches and secrets. Default `~/.constella`. |
|
|
119
|
+
| **Package root** (`PKG_ROOT`) | The installed package's own directory (`fileURLToPath(new URL("../", import.meta.url))`) holding `.next`, `drizzle/`, configs. Exported as `CONSTELLA_PKG_ROOT`. |
|
|
120
|
+
| **Run mode** | `start` \| `auth` \| `vps` \| `portable`, written to `CONSTELLA_RUN_MODE` and stored in `organization.runMode`. The launch flag decides it. |
|
|
121
|
+
| **Public runtime** | A CLI launch sets `CONSTELLA_PUBLIC=1`, which hides the in-UI mode picker and Config chips. |
|
|
122
|
+
| **Dual process** | Every boot runs a **web** server and a **worker** β supervised, auto-restarting. |
|
|
123
|
+
| **Build-on-first-run** | A fallback that only triggers in a source tree with no `.next/BUILD_ID`; never for the shipped package. |
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## Tables
|
|
128
|
+
|
|
129
|
+
### Launcher flags & subcommands
|
|
130
|
+
|
|
131
|
+
| Flag / subcommand | Effect | Source |
|
|
132
|
+
| --- | --- | --- |
|
|
133
|
+
| *(none)* / `start` | Default mode β local auto-operator, bind `127.0.0.1`. | `cmd = "start"`, `runMode = "start"` |
|
|
134
|
+
| `--onboarding` (or `onboard`/`onboarding`) | Sets `CONSTELLA_FORCE_ONBOARDING=1` to re-run the setup wizard. | line 181 |
|
|
135
|
+
| `--start` | Local mode (auto-login, `127.0.0.1`). | mode flag |
|
|
136
|
+
| `--auth` | Email + password, `127.0.0.1`. | mode flag |
|
|
137
|
+
| `--vps` | Server over Tailscale, in Docker, `0.0.0.0`. | mode flag |
|
|
138
|
+
| `--portable` | Run from a USB drive, `0.0.0.0`. | mode flag |
|
|
139
|
+
| `--path <dir>` | Explicit runtime root (also used to point portable at a drive). | `flag("--path")` |
|
|
140
|
+
| `--host <h>` | Override bind host. Defaults: vps/portable β `0.0.0.0`, else `127.0.0.1`. | line 176 |
|
|
141
|
+
| `--port <p>` | Override port (else `PORT` env, else `3000`). | line 177 |
|
|
142
|
+
| `--bind <local\|tailnet\|portable>` | **Legacy** back-compat that maps to a mode. | line 118β120 |
|
|
143
|
+
| `update` | Detect a newer published version and apply it. | line 136 |
|
|
144
|
+
| `update --check` | Only print current vs latest, then exit. | line 140 |
|
|
145
|
+
|
|
146
|
+
### Environment the launcher sets / reads
|
|
147
|
+
|
|
148
|
+
| Variable | Role |
|
|
149
|
+
| --- | --- |
|
|
150
|
+
| `CONSTELLA_HOME` | Runtime root override. |
|
|
151
|
+
| `CONSTELLA_RUN_MODE` | The resolved mode (`start`/`auth`/`vps`/`portable`). |
|
|
152
|
+
| `CONSTELLA_PUBLIC=1` | Marks a CLI launch as the public/production runtime. |
|
|
153
|
+
| `CONSTELLA_VERSION` | The reliable installed version, for the in-app Update check. |
|
|
154
|
+
| `CONSTELLA_PKG_ROOT` | The package root so the server finds bundled `skills/` + assets. |
|
|
155
|
+
| `CONSTELLA_FORCE_ONBOARDING` | Set by `--onboarding` to re-run the wizard. |
|
|
156
|
+
| `DATABASE_URL` | `file:<HOME>/constella.db` (absolute, set only if unset). |
|
|
157
|
+
| `CONSTELLA_DEV=1` | Opt-in to fall back to `next dev` when no build exists (source tree only). |
|
|
158
|
+
| `CONSTELLA_WEB_HEAP_MB` | Optional `--max-old-space-size` for the web child. |
|
|
159
|
+
| `BETTER_AUTH_SECRET` Β· `CONSTELLA_VAULT_KEY` Β· `CONSTELLA_WORKER_SECRET` | Persisted to `<HOME>/.env`. |
|
|
160
|
+
|
|
161
|
+
> Full configuration reference: [CONFIGURATION](./CONFIGURATION.md).
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## Step-by-step
|
|
166
|
+
|
|
167
|
+
### A) Quick try β `npx` (nothing installed globally)
|
|
168
|
+
|
|
169
|
+
```bash
|
|
170
|
+
# Requires Node β₯ 20 on your PATH
|
|
171
|
+
npx constella
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
What happens:
|
|
175
|
+
|
|
176
|
+
1. npm fetches the latest `constella` into its `_npx` cache.
|
|
177
|
+
2. The launcher creates `~/.constella/organizations`, persists secrets to `~/.constella/.env`, applies the DB schema, and boots web + worker.
|
|
178
|
+
3. The prebuilt `.next` ships in the package, so **no build runs** β it starts fast.
|
|
179
|
+
4. Open the printed URL (default `http://127.0.0.1:3000`). First run lands you in [ONBOARDING](./ONBOARDING.md).
|
|
180
|
+
|
|
181
|
+
> Because `npx` is ephemeral, `detectRunContext()` reports `npx` and the in-app Update flow re-runs `npx constella@latest` rather than a global install. See [UPDATE](./UPDATE.md).
|
|
182
|
+
|
|
183
|
+
### B) Daily use β global install
|
|
184
|
+
|
|
185
|
+
```bash
|
|
186
|
+
npm install -g constella
|
|
187
|
+
constella # default = start mode
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
Then anywhere:
|
|
191
|
+
|
|
192
|
+
```bash
|
|
193
|
+
constella --auth # email + password, 127.0.0.1
|
|
194
|
+
constella --onboarding # re-run the setup wizard
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
A global install reports `detectRunContext()` β `global`, so Update runs `npm install -g constella@latest`.
|
|
198
|
+
|
|
199
|
+
### C) Pin the runtime root
|
|
200
|
+
|
|
201
|
+
```bash
|
|
202
|
+
# Point the whole runtime at a custom directory
|
|
203
|
+
CONSTELLA_HOME=/srv/constella constella
|
|
204
|
+
# β¦or via flag
|
|
205
|
+
constella --path /srv/constella
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
The database becomes `file:/srv/constella/constella.db` and workspaces live under `/srv/constella/organizations/<orgId>/workspace/`.
|
|
209
|
+
|
|
210
|
+
### D) From source (developers) π³οΈ
|
|
211
|
+
|
|
212
|
+
```bash
|
|
213
|
+
git clone https://github.com/gabriel7silva/constella
|
|
214
|
+
cd constella
|
|
215
|
+
pnpm install
|
|
216
|
+
pnpm dev:all # next dev + worker together (Telegram poll works in dev)
|
|
217
|
+
# or, production-shaped:
|
|
218
|
+
pnpm build && pnpm start # next start + worker (scripts/start-all.mjs)
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
`scripts/dev-all.mjs` and `scripts/start-all.mjs` both spawn the web server **and** the worker, so the cron tick, file watcher and Telegram poll all run. Running from source sets `CONSTELLA_DEV=1` (when `CONSTELLA_PUBLIC` is unset), which surfaces the run-mode picker + Config chips. See [TEST_DEV](./TEST_DEV.md).
|
|
222
|
+
|
|
223
|
+
---
|
|
224
|
+
|
|
225
|
+
## Examples
|
|
226
|
+
|
|
227
|
+
### Verbatim command blocks
|
|
228
|
+
|
|
229
|
+
```bash
|
|
230
|
+
# One-shot, ephemeral
|
|
231
|
+
npx constella
|
|
232
|
+
|
|
233
|
+
# Force the first-time setup wizard
|
|
234
|
+
npx constella --onboarding
|
|
235
|
+
|
|
236
|
+
# Local mode (auto-login, 127.0.0.1)
|
|
237
|
+
npx constella --start
|
|
238
|
+
|
|
239
|
+
# Real email + password (127.0.0.1)
|
|
240
|
+
npx constella --auth
|
|
241
|
+
|
|
242
|
+
# Server over Tailscale, in Docker (0.0.0.0)
|
|
243
|
+
npx constella --vps
|
|
244
|
+
|
|
245
|
+
# Run from a USB drive (0.0.0.0); pick a drive or pass --path
|
|
246
|
+
npx constella --portable
|
|
247
|
+
npx constella --portable --path E:\
|
|
248
|
+
|
|
249
|
+
# Detect / apply a new version
|
|
250
|
+
npx constella update
|
|
251
|
+
npx constella update --check
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
### First-boot console (abridged)
|
|
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
|
+
## Possible states
|
|
268
|
+
|
|
269
|
+
| State | What you see | Meaning / fix |
|
|
270
|
+
| --- | --- | --- |
|
|
271
|
+
| **Fresh install, prebuilt** | No "building" line; boots in seconds. | `.next/BUILD_ID` shipped β normal. |
|
|
272
|
+
| **First run, source tree, no build** | `β’ No build found β building (first run, one-time)β¦` | One-time `next build`. |
|
|
273
|
+
| **Build failed, public mode** | `β No production build and the build failed.` then exit. | Won't silently start `next dev` in a public mode. Install a built package or run `pnpm build` (or set `CONSTELLA_DEV=1` to allow the dev fallback). |
|
|
274
|
+
| **Fresh DB, migrate failed** | `β Database schema migration failed on a fresh database β aborting.` | The app needs its tables. Reinstall the package. |
|
|
275
|
+
| **Existing DB, migrate skipped** | `β’ schema migrate skipped/failed on an existing DB β continuing` | Idempotent no-op tolerated. |
|
|
276
|
+
| **Portable, drive too small** | `β Portable needs at least 32 GB free β¦` then exit | Use a bigger drive. |
|
|
277
|
+
| **Portable, no USB found** | `β Portable mode: no removable USB drive detected.` | Insert a pen-drive or pass `--path <drive>`. |
|
|
278
|
+
| **Child crash-loop** | `β [web] exited β¦ crashed 5x within 60s β giving up.` | Real, repeated crash. Cap concurrent agents or raise `CONSTELLA_WEB_HEAP_MB`. |
|
|
279
|
+
| **`drizzle-kit`/`next` missing** | `β drizzle-kit not found β¦` / `β next not found β¦` | Broken install β reinstall. |
|
|
280
|
+
|
|
281
|
+
---
|
|
282
|
+
|
|
283
|
+
## Related integrations π°οΈ
|
|
284
|
+
|
|
285
|
+
- **The worker** (`bin/worker.mjs`) is started automatically and runs the cron tick (`POST /api/cron/tick` every ~60 s), the chokidar file watcher (debounce 400 ms β `POST /api/sync/file`), and the Telegram long-poll. It talks back over loopback with an `x-worker-secret` header and refuses non-loopback hosts. See [ARCHITECTURE](./ARCHITECTURE.md) and [TELEGRAM](./TELEGRAM.md).
|
|
286
|
+
- **Agents** run as real `claude`/`codex` CLI processes inside each org's workspace jail. See [AGENTS](./AGENTS.md) and [AI_ARCHITECTURE](./AI_ARCHITECTURE.md).
|
|
287
|
+
- **Models** are resolved from a cached catalog; local GGUF models run via llama.cpp servers. See [MODELS](./MODELS.md).
|
|
288
|
+
- **Onboarding** runs on first boot (or with `--onboarding`). See [ONBOARDING](./ONBOARDING.md).
|
|
289
|
+
|
|
290
|
+
---
|
|
291
|
+
|
|
292
|
+
## Security π³οΈ
|
|
293
|
+
|
|
294
|
+
- **Secrets are generated and persisted once** under `<HOME>/.env` with mode `0o600`, and **never printed** β the console only confirms the path. Network modes (`auth`/`vps`/`portable`) require a real `BETTER_AUTH_SECRET`; `next start` runs under `NODE_ENV=production`, where better-auth **throws** on its default key, so even local `start` gets a real one.
|
|
295
|
+
- **No bare-name execution.** The launcher resolves `next` and `drizzle-kit` to absolute JS entry paths and runs them with `node` directly β no `shell: true`, no PATH lookup β so a hijacked `npx`/`next`/`drizzle-kit` can't shadow them.
|
|
296
|
+
- **Public mode is fail-closed.** A `bin/constella.mjs` launch is always treated as production (`CONSTELLA_PUBLIC=1`); it refuses to downgrade to the unhardened `next dev` server unless a developer explicitly opts in with `CONSTELLA_DEV=1`.
|
|
297
|
+
- **Worker SSRF guard.** The worker carries the privileged `x-worker-secret` and refuses to send it to any non-loopback host unless `CONSTELLA_ALLOW_REMOTE_WORKER_BASE_URL=1` is set.
|
|
298
|
+
- The launcher's update path passes the platform binary name (`npm.cmd` on Windows) directly, with no shell interpretation.
|
|
299
|
+
|
|
300
|
+
Deeper model: [SECURITY](./SECURITY.md).
|
|
301
|
+
|
|
302
|
+
---
|
|
303
|
+
|
|
304
|
+
## Troubleshooting
|
|
305
|
+
|
|
306
|
+
| Symptom | Cause | Fix |
|
|
307
|
+
| --- | --- | --- |
|
|
308
|
+
| `Unsupported engine` / syntax errors on boot | Node < 20 | Install Node β₯ 20; `node -v`. |
|
|
309
|
+
| Browser shows 500 on every page after first boot | DB schema not applied | Look for the migrate error in the console; reinstall if `drizzle-kit` is missing. |
|
|
310
|
+
| Agents plan but never edit files | `claude`/`codex` not installed/authenticated | Install and log in to the agent CLI; check `PATH`. See [AGENTS](./AGENTS.md). |
|
|
311
|
+
| Data appears in the wrong folder | Relative `CONSTELLA_HOME` / `INIT_CWD` unset under `.next/standalone` | Use an absolute `CONSTELLA_HOME` or launch via the CLI / `pnpm start`. See `src/lib/runtime-root.ts`. |
|
|
312
|
+
| Port already in use | `3000` taken | `--port 3100` or set `PORT`. |
|
|
313
|
+
| Telegram messages ignored | Worker not running | The CLI/`start`/`dev:all` start it; ensure it booted. See [TELEGRAM](./TELEGRAM.md). |
|
|
314
|
+
| Web keeps restarting then "giving up" | OS-level OOM or native crash | Cap concurrent agents; raise `CONSTELLA_WEB_HEAP_MB`. |
|
|
315
|
+
| `update` says "Running from source" | A `.git` + `src/` tree | Update with `git pull && pnpm install && pnpm build`. See [UPDATE](./UPDATE.md). |
|
|
316
|
+
|
|
317
|
+
More: [TROUBLESHOOTING](./TROUBLESHOOTING.md) Β· [FAQ](./FAQ.md).
|
|
318
|
+
|
|
319
|
+
---
|
|
320
|
+
|
|
321
|
+
## Related links
|
|
322
|
+
|
|
323
|
+
- [ONBOARDING](./ONBOARDING.md) β the first-run setup wizard
|
|
324
|
+
- [CONFIGURATION](./CONFIGURATION.md) β every env var and 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) β runtime root, dual process, sync engine
|
|
327
|
+
- [UPDATE](./UPDATE.md) β context-aware updates
|
|
328
|
+
- [TEST_DEV](./TEST_DEV.md) β running from source
|
|
329
|
+
- [TROUBLESHOOTING](./TROUBLESHOOTING.md) Β· [FAQ](./FAQ.md)
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
[β Docs index](./README.md) Β· [π§π· PortuguΓͺs](../pt/KB_AGENT.md) Β· [β¦ Constella](../../README.md)
|
|
2
|
+
|
|
3
|
+
# KB Agent β Vannevar ππ°οΈ
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
Vannevar is the Knowledge agent: the keeper of Constella's single source of truth. Every reusable thing the constellation learns flows through this star β classified, deduped, kept current, and served back with references. Vannevar owns the **curated, classified, state-aware layer** that sits on top of the raw RAG memory nebula.
|
|
8
|
+
|
|
9
|
+
> Source of truth: `src/server/kb.ts` (engine) and `src/data/kb-prompt.ts` (Vannevar's persona prompt + taxonomy). The raw embedding/index layer is documented in [KB_RAG.md](./KB_RAG.md).
|
|
10
|
+
|
|
11
|
+
## When to use πͺ
|
|
12
|
+
|
|
13
|
+
- You want to understand **how knowledge is captured** as agents work (the `[[REMEMBER]]` / `[[CONSULT]]` / `[[KB:]]` tokens).
|
|
14
|
+
- You need to know **what `/curate` does** and where it writes its health report (`Reports/kb-health.md`).
|
|
15
|
+
- You want to know **how knowledge is retired** (superseded / obsolete) and why a cancelled goal stops surfacing.
|
|
16
|
+
- You are wiring **`proposeSkillsFromLearnings`** (P3 learning β skills) or debugging why curation is not running.
|
|
17
|
+
- You want the **KB taxonomy** (`kb_entry.type`) and the lifecycle state machine.
|
|
18
|
+
|
|
19
|
+
## How it works π
|
|
20
|
+
|
|
21
|
+
Constella's KB is a **hybrid** of two halves:
|
|
22
|
+
|
|
23
|
+
| Half | Path | Cost | What it does |
|
|
24
|
+
|---|---|---|---|
|
|
25
|
+
| **Deterministic capture** | `ingestKnowledge()` | No LLM (hot path) | Classify by caller-provided type, dedup by content hash, update-in-place on the same source slot, upsert a `kb_entry`, (re)embed its `rag_chunk`(s). |
|
|
26
|
+
| **LLM curation** | `runKbCuration()` (Vannevar) | Paid/local LLM (off the hot path) | Merge near-duplicates, retire contradicted entries, tighten summaries, surface coverage gaps β `Reports/kb-health.md`. |
|
|
27
|
+
|
|
28
|
+
The deterministic path **always works**; curation is a best-effort refinement that runs behind a debounce + cooldown + daily-cap gate. Everything is fire-and-forget β KB capture must **never** break a task run.
|
|
29
|
+
|
|
30
|
+
Vannevar's persona (`src/data/kb-prompt.ts`):
|
|
31
|
+
|
|
32
|
+
- **Identity** (`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`): the full operating manual, seeded into `agent.persona.systemPrompt` at boot by `seedKbAgent()` and mirrored to disk as `.claude/kb/TAXONOMY.md` (so it is itself RAG-indexed).
|
|
35
|
+
|
|
36
|
+
Vannevar's roster facts (from `src/data/scaffold.ts`): handle `vannevar`, role **Knowledge**, reports to `ada`, model `haiku`, daily cap **$10 USD**, tier **light**. See [AGENTS.md](./AGENTS.md).
|
|
37
|
+
|
|
38
|
+
## Main flow β the three agent tokens π°οΈ
|
|
39
|
+
|
|
40
|
+
Agents drive the KB **inline** by emitting double-square-bracket tokens in their replies. The system parses them out, runs the action, and strips the token before the message is stored/shown. This happens in both **task runs** (`src/server/runner.ts`) and **chat replies** (`src/server/collab.ts`).
|
|
41
|
+
|
|
42
|
+
```mermaid
|
|
43
|
+
flowchart LR
|
|
44
|
+
A["Agent reply text"] --> B{"Scan tokens"}
|
|
45
|
+
B -->|"[[REMEMBER type=β¦: β¦]]"| C["extractRemembered()<br/>β ingestKnowledge()"]
|
|
46
|
+
B -->|"[[CONSULT: β¦]]"| D["answerConsults()<br/>β kbQuery() β post answer"]
|
|
47
|
+
B -->|"[[KB: reindex / index-chat / health]]"| E["runKbTools()<br/>β indexRag / indexChat / health"]
|
|
48
|
+
C --> F["kb_entry + rag_chunk<br/>(deduped, embedded)"]
|
|
49
|
+
D --> G["Answer posted back<br/>as @vannevar (in context next turn)"]
|
|
50
|
+
E --> H["Status line posted back<br/>as @vannevar"]
|
|
51
|
+
B --> I["Tokens stripped β clean reply stored"]
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### `[[REMEMBER type=<t>: <fact>]]` β the producer
|
|
55
|
+
|
|
56
|
+
`extractRemembered()` pulls every `[[REMEMBER β¦]]` token out of a reply and turns each into a typed `KbItem` to ingest.
|
|
57
|
+
|
|
58
|
+
- Regex: `/\[\[REMEMBER(?:\s+type=([a-z-]+))?\s*:?\s*([\s\S]*?)\]\]/gi`.
|
|
59
|
+
- The `type=` is validated against `KB_LEARN_TYPES` (`decision`, `architecture`, `business-rule`, `integration`, `dependency`, `bug`, `fix`, `test`, `review`, `vuln`, `ui-pattern`, `stack`, `env-config`, `command`, `note`). An unknown type falls back to `note`.
|
|
60
|
+
- The fact must be **β₯ 8 chars** or it is dropped. The title is the first line (β€ 80 chars); the summary is the first 1200 chars.
|
|
61
|
+
- In a task run the context carries `goalId` / `issueId` / `taskId` (`sourceKind: "task"`, `sourceRef: "<taskId>:learn"`); in chat it carries the message id (`sourceKind: "chat"`).
|
|
62
|
+
- The captured items are sent **fire-and-forget** to `ingestKnowledge()`; the tokens are stripped from the shown reply.
|
|
63
|
+
|
|
64
|
+
### `[[CONSULT: <question>]]` β the consumer
|
|
65
|
+
|
|
66
|
+
`answerConsults()` resolves a before-action question against the **state-aware** KB so the answer is in context on the agent's next turn. It is the complement to `[[REMEMBER]]`.
|
|
67
|
+
|
|
68
|
+
- Regex: `/\[\[CONSULT:\s*([\s\S]*?)\]\]/gi`. Queries shorter than 4 chars are skipped.
|
|
69
|
+
- Each question is run through `kbQuery(orgId, q, { agentHandle, k: 6 })`; the answer is the curated context (or `"(no relevant knowledge in the KB yet)"`).
|
|
70
|
+
- In chat, each answer is **posted back into the thread as `@vannevar`** (`π KB consult β "β¦"`), so the asking agent reads it next turn.
|
|
71
|
+
|
|
72
|
+
### `[[KB: reindex|index-chat|health]]` β maintenance tools
|
|
73
|
+
|
|
74
|
+
`runKbTools()` lets any agent trigger explicit KB maintenance mid-run.
|
|
75
|
+
|
|
76
|
+
| Verb | Action | Result line |
|
|
77
|
+
|---|---|---|
|
|
78
|
+
| `reindex` | `indexRag(orgId)` | `reindex β N chunk(s) (semantic)` |
|
|
79
|
+
| `index-chat` (or `indexchat`) | `indexChat(orgId)` | `index-chat β N chunk(s)` |
|
|
80
|
+
| `health` | `llamaServerStatus()` | `embed health β up (model) \| down` |
|
|
81
|
+
|
|
82
|
+
Unknown/failed verbs are silently skipped. In chat the results are posted back as `@vannevar` (`π οΈ KB tools β β¦`).
|
|
83
|
+
|
|
84
|
+
## Curation loop π³οΈ
|
|
85
|
+
|
|
86
|
+
`runKbCuration()` is the LLM half of hybrid ingestion. It runs **behind a debounce + cooldown + cap gate** and is best-effort.
|
|
87
|
+
|
|
88
|
+
```mermaid
|
|
89
|
+
flowchart TD
|
|
90
|
+
I["ingestKnowledge() succeeds<br/>(ingested > 0)"] --> S["scheduleKbCuration(orgId)"]
|
|
91
|
+
S -->|"4-min debounce"| T{"Within 30-min<br/>cooldown?"}
|
|
92
|
+
T -->|yes| X["skip this round"]
|
|
93
|
+
T -->|no| C["runKbCuration(orgId)"]
|
|
94
|
+
C --> CAP{"Vannevar over<br/>daily cap?"}
|
|
95
|
+
CAP -->|yes| X
|
|
96
|
+
CAP -->|no| N{"β₯ 4 active/superseded<br/>entries?"}
|
|
97
|
+
N -->|no| X
|
|
98
|
+
N -->|yes| L["Build prompt over β€ 60 recent entries<br/>β runLocalRag (llama.cpp :8082)<br/>β fallback to agent CLI"]
|
|
99
|
+
L --> P["Parse JSON plan<br/>(merges Β· obsolete Β· summaries Β· gaps)"]
|
|
100
|
+
P --> M["Merge dups β status=superseded<br/>+ supersedesId, flag rag_chunk obsolete"]
|
|
101
|
+
P --> R["Retire β status=obsolete<br/>flag rag_chunk obsolete"]
|
|
102
|
+
P --> U["Tighten summaries β re-embed entry"]
|
|
103
|
+
P --> G["Collect coverage gaps"]
|
|
104
|
+
M --> H["writeDoc Reports/kb-health.md"]
|
|
105
|
+
R --> H
|
|
106
|
+
U --> H
|
|
107
|
+
G --> H
|
|
108
|
+
H --> O["notifyOps (if anything changed)"]
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
What each step does:
|
|
112
|
+
|
|
113
|
+
1. **Gate.** Resolve Vannevar (`handle === "vannevar"`, else first role matching `/knowledge/i`). Bail if missing or over `dailyCapUsd` (`overCap()`).
|
|
114
|
+
2. **Sample.** Select the 60 most recently updated entries with `status in (active, superseded)`. Fewer than **4** β not worth a paid run, bail. Compact each to `{ id, type, title, summary (β€300), ref, goalId, status }`.
|
|
115
|
+
3. **Reason.** Build a prompt from `KB_AGENT_PROMPT` + the JSON entries, asking for a strict JSON object. Run on the **local model first** (`runLocalRag` β llama.cpp chat server at `LLAMACPP_URL`, default `http://127.0.0.1:8082`), falling back to Vannevar's CLI (`runAgent`) only if the local server is down. Cost is booked to `cost_entry` when non-zero.
|
|
116
|
+
4. **Apply** (guarded to ids actually present in the batch):
|
|
117
|
+
- **merges** β each dropped id becomes `status="superseded"`, `supersedesId=<keep>`, its `rag_chunk`s flagged `obsolete=1`.
|
|
118
|
+
- **obsolete** β `status="obsolete"`, `rag_chunk`s flagged `obsolete=1`.
|
|
119
|
+
- **summaries** β tighten `kb_entry.summary` (β€ 1200) and **re-embed** the entry; only applied to `active` entries.
|
|
120
|
+
- **gaps** β collected (max 30) as plain strings.
|
|
121
|
+
5. **Report.** Write `Reports/kb-health.md` via `writeDoc` (write-through to disk + RAG-indexed, so it shows in `/reports`), then `notifyOps` if anything changed.
|
|
122
|
+
|
|
123
|
+
`runKbCuration()` returns `{ ok, merged, retired, summarized, gaps }`.
|
|
124
|
+
|
|
125
|
+
### The KB health report
|
|
126
|
+
|
|
127
|
+
`Reports/kb-health.md` (written by `writeDoc`) looks like:
|
|
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
|
+
### Triggers
|
|
142
|
+
|
|
143
|
+
| Trigger | Path | Notes |
|
|
144
|
+
|---|---|---|
|
|
145
|
+
| Automatic | `scheduleKbCuration(orgId)` after a successful `ingestKnowledge` | 4-min debounce coalesces a burst of ingests; 30-min cooldown per workspace; opt out with `CONSTELLA_KB_CURATION=0`. |
|
|
146
|
+
| Operator command | `/curate` (`src/server/commands.ts`) | Runs `runKbCuration` synchronously; Vannevar reports the result in the channel. |
|
|
147
|
+
| UI action | `curateKb()` (`src/server/actions/kb-actions.ts`) | Same engine call from the Knowledge module. |
|
|
148
|
+
|
|
149
|
+
## P3 β learning β skills π
|
|
150
|
+
|
|
151
|
+
`proposeSkillsFromLearnings()` is Vannevar reading the team's **validated, recurring** knowledge and distilling it into **0β3 new reusable skills**.
|
|
152
|
+
|
|
153
|
+
- Reads `active` entries whose `type` is in `REUSABLE` (`doc`, `research`, `ui-pattern`, `stack`, `integration`, `fix`, `decision`, `architecture`, `business-rule`), keeping only entries with `confidence >= 60` (`strong`). Needs **β₯ 4** strong entries or it bails.
|
|
154
|
+
- Dedups against existing `skill.name`s; builds a prompt asking for a JSON array of `{ name, role, trigger, summary, instructions }`.
|
|
155
|
+
- Each accepted proposal lands as a **provisional** skill: `native=false`, `provisional=true`, `indexed="pending"`, `proposedRole=<role>` β **not linked to any agent** until the operator approves it in `/skills` (`approveProvisional` links it by role). A `.claude/skills/<name>.md` file is written to disk.
|
|
156
|
+
- Notifies the operator (`notifyOps`, kind `review`) when anything was proposed.
|
|
157
|
+
- Triggered by the operator via the Skills page (`suggestSkillsFromLearnings` in `src/server/skills.ts`). Returns `{ ok, proposed }`.
|
|
158
|
+
|
|
159
|
+
See [SKILLS.md](./SKILLS.md) for the skills lifecycle and `approveProvisional`.
|
|
160
|
+
|
|
161
|
+
## Key concepts β¦
|
|
162
|
+
|
|
163
|
+
- **State-aware retrieval.** `kbQuery()` only returns `rag_chunk`s with `obsolete=0`, which excludes superseded/obsolete entries and the knowledge of cancelled/archived goals. It returns a `sufficient` flag (an explicit *"insufficient knowledge"* signal) and logs every consultation to `kb_query_log`.
|
|
164
|
+
- **Content-policy gate.** `ingestKnowledge` runs `scrubSecrets()` over each item; if scrubbing changes the text a secret was present, and the item is **refused** (never indexed). See [SECURITY.md](./SECURITY.md).
|
|
165
|
+
- **State cascade.** `markKbObsoleteForGoal(wsId, goalId)` retires a goal's knowledge when the goal is cancelled/archived (marks `kb_entry` obsolete + flags `rag_chunk` `obsolete=1`).
|
|
166
|
+
- **Multi-hop graph.** `relatedKnowledge()` walks the `goalId/specId/issueId` link columns + the `supersedes` chain (default 2 hops) from a seed work item, returning connected knowledge grouped by type. Decisions are themselves `kb_entry` rows, so this links decisions β specs β issues β prior fixes/reviews/patterns.
|
|
167
|
+
- **Curated answers.** `kbAnswer()` is the clean *"Ask the KB"* path (home chat + `/kb`). Meta/status questions (`KB_META_RE`) get a deterministic overview card from real numbers; content questions get a short model-written answer via `summarizeWithKbAgent()` (local model first, never a raw context dump) plus a tidy Sources line.
|
|
168
|
+
|
|
169
|
+
## Tables πͺ
|
|
170
|
+
|
|
171
|
+
| Table | Key columns | Role |
|
|
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` | The curated, classified, lifecycle-tracked knowledge unit. |
|
|
174
|
+
| `rag_chunk` | `path`, `chunk`, `vector`, `kb_entry_id`, `obsolete` | The embedded retrieval chunks. KB entries emit chunks at `path = kb/<type>/<id>`. |
|
|
175
|
+
| `kb_query_log` | `agent_handle`, `query`, `hits`, `mode`, `refs`, `answered_at` | Every consultation (who asked, how it was answered). |
|
|
176
|
+
| `synced_block` | `slug`, `kind`, `title`, `body`, `version` | Central canonical blocks (e.g. `mission`, `official-stack`, `business-rules`). See [SYNCED_BLOCKS.md](./SYNCED_BLOCKS.md). |
|
|
177
|
+
| `block_proposal` | `slug`, `kind`, `body`, `by_agent_handle`, `status` | Proposal queue for synced blocks. |
|
|
178
|
+
|
|
179
|
+
All KB tables are created idempotently at boot by `ensureKbTables()` (migration-free DDL, safe every boot).
|
|
180
|
+
|
|
181
|
+
### `kb_entry.type` taxonomy (~24 types)
|
|
182
|
+
|
|
183
|
+
| Type | Meaning |
|
|
184
|
+
|---|---|
|
|
185
|
+
| `decision` | Technical/architectural decisions + rationale |
|
|
186
|
+
| `spec` / `issue` / `goal` / `plan` | Work artifacts and their intent |
|
|
187
|
+
| `architecture` | System structure, boundaries, data flow |
|
|
188
|
+
| `business-rule` | Product/domain rules constraining implementation |
|
|
189
|
+
| `code-change` | What a task produced (files + summary) |
|
|
190
|
+
| `dependency` / `integration` | Libraries, services, external systems |
|
|
191
|
+
| `bug` / `fix` | Defects found + corrections applied |
|
|
192
|
+
| `test` / `review` | Test verdicts + code-review outcomes |
|
|
193
|
+
| `vuln` | Security findings and risks |
|
|
194
|
+
| `doc` | Documentation written/updated |
|
|
195
|
+
| `user-context` | What the operator wants; constraints, preferences |
|
|
196
|
+
| `history` | Milestones and project history |
|
|
197
|
+
| `command` | Useful executed commands / runbook steps |
|
|
198
|
+
| `file-structure` | Where things live in the workspace |
|
|
199
|
+
| `ui-pattern` | UI/UX conventions to keep consistent |
|
|
200
|
+
| `stack` | The official technology stack |
|
|
201
|
+
| `env-config` | Environment and configuration facts |
|
|
202
|
+
| `note` | Catch-all |
|
|
203
|
+
|
|
204
|
+
## Possible states π
|
|
205
|
+
|
|
206
|
+
`kb_entry.status` is a four-state lifecycle:
|
|
207
|
+
|
|
208
|
+
| State | Set by | Surfaces in retrieval? |
|
|
209
|
+
|---|---|---|
|
|
210
|
+
| `active` | `ingestKnowledge` (capture) | β
yes |
|
|
211
|
+
| `superseded` | curation merge (`supersedesId` β the canonical keep) | β no (`obsolete=1`) |
|
|
212
|
+
| `obsolete` | curation retire, or `markKbObsoleteForGoal` on a cancelled/archived goal, or contradicted by newer truth | β no (`obsolete=1`) |
|
|
213
|
+
| `archived` | reserved (counted in `kbOverview.lifecycle`) | β no |
|
|
214
|
+
|
|
215
|
+
```mermaid
|
|
216
|
+
stateDiagram-v2
|
|
217
|
+
[*] --> active: ingestKnowledge
|
|
218
|
+
active --> superseded: curation merge (dup)
|
|
219
|
+
active --> obsolete: curation retire / goal cancelled
|
|
220
|
+
superseded --> obsolete: goal cancelled
|
|
221
|
+
active --> archived: (reserved)
|
|
222
|
+
superseded --> [*]
|
|
223
|
+
obsolete --> [*]
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
## Step-by-step β capture to recall
|
|
227
|
+
|
|
228
|
+
1. An agent finishes a task and emits `[[REMEMBER type=fix: bumped chokidar to v4, watcher debounce moved to 400ms]]` in its reply.
|
|
229
|
+
2. The runner calls `extractRemembered()` β one `KbItem{ type: "fix", title: "bumped chokidar to v4β¦" }` with `goalId/issueId/taskId` filled in.
|
|
230
|
+
3. `ingestKnowledge()` hashes the content, finds no duplicate, inserts a `kb_entry`, and embeds its `rag_chunk` at `kb/fix/<id>`. The `[[REMEMBER]]` token is stripped from the stored reply.
|
|
231
|
+
4. Because something was ingested, `scheduleKbCuration(orgId)` arms a 4-minute debounce. After it fires (and the cooldown has elapsed and Vannevar is under cap), `runKbCuration` merges, retires, tightens and writes `Reports/kb-health.md`.
|
|
232
|
+
5. Later, another agent emits `[[CONSULT: how is the file watcher configured?]]`. `answerConsults()` runs `kbQuery()`, which returns the (still active) fix entry; Vannevar posts the answer back into the thread, so the asking agent reads it next turn.
|
|
233
|
+
|
|
234
|
+
## Examples
|
|
235
|
+
|
|
236
|
+
Ask the KB from chat or via a slash command:
|
|
237
|
+
|
|
238
|
+
```text
|
|
239
|
+
/kb how is the file watcher configured?
|
|
240
|
+
/curate
|
|
241
|
+
/reindex
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
Operator-driven skill proposal (Skills page β `suggestSkillsFromLearnings`):
|
|
245
|
+
|
|
246
|
+
```text
|
|
247
|
+
# returns { ok: true, proposed: 2 } β two provisional skills queued for /skills approval
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
Opt out of automatic curation (e.g. on a tiny budget):
|
|
251
|
+
|
|
252
|
+
```bash
|
|
253
|
+
CONSTELLA_KB_CURATION=0
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
Point the local RAG/curation model at a non-default llama.cpp chat server:
|
|
257
|
+
|
|
258
|
+
```bash
|
|
259
|
+
LLAMACPP_URL=http://127.0.0.1:8082
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
## Related integrations π°οΈ
|
|
263
|
+
|
|
264
|
+
- **RAG layer** β embeddings, `chunksOf`, the embed server. See [KB_RAG.md](./KB_RAG.md).
|
|
265
|
+
- **Memory & context** β how recall feeds an agent's prompt. See [MEMORY_RAG.md](./MEMORY_RAG.md).
|
|
266
|
+
- **Synced blocks** β the canonical central blocks the KB card checks for. See [SYNCED_BLOCKS.md](./SYNCED_BLOCKS.md).
|
|
267
|
+
- **Skills** β provisional skills proposed from learnings. See [SKILLS.md](./SKILLS.md).
|
|
268
|
+
- **Team Room / DM** β where `[[CONSULT]]` answers are posted. See [TEAM_ROOM.md](./TEAM_ROOM.md), [DM.md](./DM.md).
|
|
269
|
+
- **Slash commands** β `/kb`, `/curate`, `/reindex`. See [CHAT_COMMANDS.md](./CHAT_COMMANDS.md).
|
|
270
|
+
- **Models** β local model for free RAG generation. See [MODELS.md](./MODELS.md).
|
|
271
|
+
|
|
272
|
+
## Security π³οΈ
|
|
273
|
+
|
|
274
|
+
- **Secret refusal at ingest.** `ingestKnowledge` refuses any item whose content changes under `scrubSecrets()` (API keys, tokens, PEM, bearer, DB URLs with creds). The learning is logged-and-dropped, never indexed.
|
|
275
|
+
- **Scrub on the way out.** Chat replies (and the `[[CONSULT]]` answers posted as Vannevar) are scrubbed again before being stored/shown (`collab.ts`).
|
|
276
|
+
- **State-aware by default.** Cancelled/archived/superseded/obsolete knowledge cannot surface through `kbQuery` β agents never act on retired truth.
|
|
277
|
+
- **Budget gate.** Both `runKbCuration` and `proposeSkillsFromLearnings` bail when Vannevar is over its `dailyCapUsd`, so curation can never blow the budget.
|
|
278
|
+
|
|
279
|
+
See [SECURITY.md](./SECURITY.md).
|
|
280
|
+
|
|
281
|
+
## Troubleshooting
|
|
282
|
+
|
|
283
|
+
| Symptom | Likely cause | Fix |
|
|
284
|
+
|---|---|---|
|
|
285
|
+
| `/curate` says *"Nothing to curate right now"* | Fewer than 4 active/superseded entries, or Vannevar over cap | Let agents complete more work; check Vannevar's daily cap. |
|
|
286
|
+
| Curation never runs automatically | `CONSTELLA_KB_CURATION=0`, within the 30-min cooldown, or no ingests | Unset the opt-out; wait out the cooldown. |
|
|
287
|
+
| `[[REMEMBER]]` not captured | Fact under 8 chars, or text carried a secret shape (refused) | Write a longer, secret-free fact. |
|
|
288
|
+
| `[[CONSULT]]` answer is *"(no relevant knowledgeβ¦)"* | KB empty or query under 4 chars | Run `/reindex`; ask a longer question. |
|
|
289
|
+
| KB answers feel stale | Superseded/obsolete chunks still flagged active, or index never rebuilt | Run `/reindex`; run `/curate`; check `Reports/kb-health.md`. |
|
|
290
|
+
| No KB health report | Curation never produced changes, or `writeDoc` disk error | Check disk perms; run `/curate` after a few ingests. |
|
|
291
|
+
| Proposed skills = 0 | Fewer than 4 strong (`confidence β₯ 60`) reusable entries | Accumulate more validated learnings first. |
|
|
292
|
+
|
|
293
|
+
See [TROUBLESHOOTING.md](./TROUBLESHOOTING.md).
|
|
294
|
+
|
|
295
|
+
## Related links
|
|
296
|
+
|
|
297
|
+
- [KB_RAG.md](./KB_RAG.md) β the raw RAG/index layer beneath the KB.
|
|
298
|
+
- [MEMORY_RAG.md](./MEMORY_RAG.md) β memory & context assembly.
|
|
299
|
+
- [SYNCED_BLOCKS.md](./SYNCED_BLOCKS.md) β canonical central blocks.
|
|
300
|
+
- [SKILLS.md](./SKILLS.md) β skills + provisional approval.
|
|
301
|
+
- [AGENTS.md](./AGENTS.md) β the roster (Vannevar's role/model/cap).
|
|
302
|
+
- [CHAT_COMMANDS.md](./CHAT_COMMANDS.md) β `/kb`, `/curate`, `/reindex`.
|
|
303
|
+
- [TEAM_ROOM.md](./TEAM_ROOM.md) Β· [DM.md](./DM.md) β where consult answers land.
|
|
304
|
+
- [MODELS.md](./MODELS.md) β local model for free RAG generation.
|
|
305
|
+
- [SECURITY.md](./SECURITY.md) Β· [TROUBLESHOOTING.md](./TROUBLESHOOTING.md)
|