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,340 @@
|
|
|
1
|
+
[β Docs index](./README.md) Β· [π§π· PortuguΓͺs](../pt/START_MODE.md) Β· [β¦ Constella](../../README.md)
|
|
2
|
+
|
|
3
|
+
# Start Mode β¦ β the launch pad
|
|
4
|
+
|
|
5
|
+
> The default ignition for a single-pilot ship: Constella boots on `127.0.0.1`, auto-provisions a local operator, signs you in with no login screen, and lets the agent constellation run with full local permissions.
|
|
6
|
+
|
|
7
|
+
Start Mode is the run mode you get when you launch Constella with no mode flag (or with `--start`). It optimizes for a single operator on their own machine: zero friction, no passwords, full agent autonomy.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## π°οΈ When to use
|
|
12
|
+
|
|
13
|
+
| Use Start Mode when⦠| Prefer another mode when⦠|
|
|
14
|
+
| --- | --- |
|
|
15
|
+
| You run Constella **on your own laptop / workstation** | You expose it on a network β [AUTH_MODE](./AUTH_MODE.md) / [VPS_MODE](./VPS_MODE.md) |
|
|
16
|
+
| You want **no login screen**, always signed in | Multiple humans need accounts / 2FA β [AUTH_MODE](./AUTH_MODE.md) |
|
|
17
|
+
| You want agents that can **install deps + run tests** (full shell) | You want agents jailed to edits-only β [AUTH_MODE](./AUTH_MODE.md) |
|
|
18
|
+
| You're developing, demoing, or running a personal agent-company | You boot from a USB drive across machines β [PORTABLE_MODE](./PORTABLE_MODE.md) |
|
|
19
|
+
|
|
20
|
+
Start Mode is **local-only by design**. It binds the loopback interface and uses a predictable operator credential β both safe on one machine, both unsafe on a network. The code refuses to provision that credential in any other mode.
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## π How it works
|
|
25
|
+
|
|
26
|
+
Start Mode is one of four values of `RunMode` (`src/lib/run-mode.ts`):
|
|
27
|
+
|
|
28
|
+
```ts
|
|
29
|
+
export type RunMode = "start" | "auth" | "vps" | "portable";
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
The launcher (`bin/constella.mjs`) selects the mode from the launch flag and exports it as `CONSTELLA_RUN_MODE`. The whole server reads it back through `getRunMode()`, which **defaults to `start`** when the env var is missing or unknown:
|
|
33
|
+
|
|
34
|
+
```ts
|
|
35
|
+
// src/lib/run-mode.ts
|
|
36
|
+
export function getRunMode(): RunMode {
|
|
37
|
+
const m = process.env.CONSTELLA_RUN_MODE as RunMode | undefined;
|
|
38
|
+
return m && m in RUN_MODES ? m : "start";
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
The `RUN_MODES` registry marks `start` as the only mode that does **not** require a login:
|
|
43
|
+
|
|
44
|
+
```ts
|
|
45
|
+
start: { label: "Start", requiresLogin: false, note: "Local auto-created account Β· always signed in." },
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Three behaviours flow from that single fact:
|
|
49
|
+
|
|
50
|
+
1. **No login screen.** The workspace guard sends unauthenticated requests to the silent auto-login route instead of `/login`.
|
|
51
|
+
2. **Auto-provisioned operator.** A real local user + a real better-auth password hash are created idempotently, and signed in.
|
|
52
|
+
3. **Full-access agents.** The CLI adapter runs agents with `--permission-mode bypassPermissions` (install deps, run tests, full shell) because you're on your own machine.
|
|
53
|
+
|
|
54
|
+
The chosen mode is also **persisted on the organization** at onboarding time (`organization.runMode`), so the org record remembers it was born in Start Mode.
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## π Main flow
|
|
59
|
+
|
|
60
|
+
```mermaid
|
|
61
|
+
flowchart TD
|
|
62
|
+
A["constella (no flag) or constella --start"] --> B["bin/constella.mjs"]
|
|
63
|
+
B --> C["CONSTELLA_RUN_MODE=start<br/>host=127.0.0.1 port=3000"]
|
|
64
|
+
C --> D["Persist secrets to <HOME>/.env (chmod 600)<br/>BETTER_AUTH_SECRET Β· VAULT_KEY Β· WORKER_SECRET"]
|
|
65
|
+
D --> E["drizzle-kit migrate (fresh DB gets its tables)"]
|
|
66
|
+
E --> F["next start + worker (supervised)"]
|
|
67
|
+
F --> G["Browser hits any (app) page"]
|
|
68
|
+
G --> H{"requireWorkspace():<br/>session cookie?"}
|
|
69
|
+
H -- "yes" --> Z["Render the app"]
|
|
70
|
+
H -- "no (start mode)" --> I["redirect /api/dev-login"]
|
|
71
|
+
I --> J["ensureLocalOperator()"]
|
|
72
|
+
J --> K["auth.signInEmail(operator@constella.dev)"]
|
|
73
|
+
K --> L["Set-Cookie + redirect /"]
|
|
74
|
+
L --> Z
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Auto-login flow (the heart of Start Mode) π
|
|
78
|
+
|
|
79
|
+
```mermaid
|
|
80
|
+
sequenceDiagram
|
|
81
|
+
participant U as Browser
|
|
82
|
+
participant W as requireWorkspace()
|
|
83
|
+
participant R as /api/dev-login
|
|
84
|
+
participant D as dev-auth.ts
|
|
85
|
+
participant A as better-auth
|
|
86
|
+
|
|
87
|
+
U->>W: GET /(app)/...
|
|
88
|
+
W->>W: getSession()
|
|
89
|
+
Note over W: no session cookie
|
|
90
|
+
W-->>U: 307 β /api/dev-login
|
|
91
|
+
U->>R: GET /api/dev-login
|
|
92
|
+
R->>R: getRunMode() === "start" ?
|
|
93
|
+
alt not start mode
|
|
94
|
+
R-->>U: 307 β /login
|
|
95
|
+
else start mode
|
|
96
|
+
R->>D: ensureLocalOperator()
|
|
97
|
+
D->>D: upsert user_operator + credential hash
|
|
98
|
+
R->>A: signInEmail(operator@constella.dev / operator123)
|
|
99
|
+
A-->>R: session cookie (nextCookies plugin)
|
|
100
|
+
R-->>U: 307 β / (now authenticated)
|
|
101
|
+
end
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## πͺ Key concepts
|
|
107
|
+
|
|
108
|
+
### The local operator
|
|
109
|
+
|
|
110
|
+
`src/server/dev-auth.ts` defines the predictable account:
|
|
111
|
+
|
|
112
|
+
```ts
|
|
113
|
+
export const DEV_OPERATOR = {
|
|
114
|
+
id: "user_operator",
|
|
115
|
+
email: "operator@constella.dev",
|
|
116
|
+
password: "operator123",
|
|
117
|
+
name: "Operator",
|
|
118
|
+
};
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
`ensureLocalOperator()` is **idempotent** and safe to call on every request:
|
|
122
|
+
|
|
123
|
+
- It looks up the user by email; if absent, inserts `user_operator` (with `emailVerified: true`).
|
|
124
|
+
- It looks up the `credential` account; if absent, hashes `operator123` through better-auth's own `ctx.password.hash` and inserts a real credential row.
|
|
125
|
+
- It returns the user id.
|
|
126
|
+
|
|
127
|
+
Because the id is fixed (`user_operator`) and matches the seed owner, a seeded demo org is owned by the auto-provisioned operator β so a **from-scratch DB wipe self-heals**: the next page load re-creates the operator and signs in, no manual step.
|
|
128
|
+
|
|
129
|
+
> π³οΈ **Defense-in-depth gate:** `ensureLocalOperator()` throws `"ensureLocalOperator is start-mode only"` if `getRunMode() !== "start"`. The predictable `operator/operator123` credential can therefore **never** exist in a network-exposed mode where the default password would be a remote login.
|
|
130
|
+
|
|
131
|
+
### The auto-login route
|
|
132
|
+
|
|
133
|
+
`src/app/api/dev-login/route.ts` is a `GET` handler:
|
|
134
|
+
|
|
135
|
+
- Outside Start Mode β `redirect("/login")` (the normal screen).
|
|
136
|
+
- In Start Mode β `ensureLocalOperator()` β `auth.api.signInEmail({ email, password })` (the cookie is set by the `nextCookies()` better-auth plugin) β `redirect("/")`.
|
|
137
|
+
- On any failure β `redirect("/login?autologin=failed")` so the guard never loops.
|
|
138
|
+
|
|
139
|
+
### The workspace guard
|
|
140
|
+
|
|
141
|
+
`src/lib/workspace.ts` `requireWorkspace()` is the gate every `(app)` page and server action passes through. The Start-Mode branch:
|
|
142
|
+
|
|
143
|
+
```ts
|
|
144
|
+
if (!session) redirect(getRunMode() === "start" ? "/api/dev-login" : "/login");
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
That single line is what turns "no session" into "auto sign-in" in Start Mode, and "show the login screen" everywhere else.
|
|
148
|
+
|
|
149
|
+
### Full-access agents (`bypassPermissions`)
|
|
150
|
+
|
|
151
|
+
`src/server/adapters/cli.ts` decides how much shell power agents get:
|
|
152
|
+
|
|
153
|
+
```ts
|
|
154
|
+
const RUN_MODE = process.env.CONSTELLA_RUN_MODE ?? "start";
|
|
155
|
+
const AGENT_FULL_ACCESS = process.env.CONSTELLA_AGENT_FULL_ACCESS != null
|
|
156
|
+
? process.env.CONSTELLA_AGENT_FULL_ACCESS !== "0"
|
|
157
|
+
: RUN_MODE === "start";
|
|
158
|
+
|
|
159
|
+
function claudePermArgs(): string[] {
|
|
160
|
+
return AGENT_FULL_ACCESS
|
|
161
|
+
? ["--permission-mode", "bypassPermissions"] // start β full: install + test
|
|
162
|
+
: ["--permission-mode", "acceptEdits"]; // network modes β jailed: edits only
|
|
163
|
+
}
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
So in Start Mode the `claude` / `codex` CLIs run with `bypassPermissions` β they can install dependencies and run tests in the workspace β because you're on your own machine. Network modes (`auth` / `vps` / `portable`) default to `acceptEdits` (edits-only, jailed). Override either way with `CONSTELLA_AGENT_FULL_ACCESS=1|0`. Agents still always run **vanilla** (a temp settings overlay sets `disableAllHooks: true`) so the operator's personal `~/.claude` hooks/plugins never bleed into agent runs. See [AGENTS](./AGENTS.md) and [AI_ARCHITECTURE](./AI_ARCHITECTURE.md).
|
|
167
|
+
|
|
168
|
+
### The auth secret in Start Mode
|
|
169
|
+
|
|
170
|
+
`next start` runs under `NODE_ENV=production`, where better-auth **throws on its default secret**. So even local Start Mode needs a real `BETTER_AUTH_SECRET` β the launcher generates and persists one to `<HOME>/.env` (`chmod 600`). The only relaxation: `assertAuthSecret()` accepts a missing secret **only** when `RUN_MODE === "start"`; every network mode hard-fails closed without one (`src/lib/auth.ts`). Session cookies stay non-`Secure` in Start Mode because it's local `http` only.
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
## Tables π
|
|
175
|
+
|
|
176
|
+
### Start Mode vs the other run modes
|
|
177
|
+
|
|
178
|
+
| Property | **start** | auth | vps | portable |
|
|
179
|
+
| --- | --- | --- | --- | --- |
|
|
180
|
+
| `requiresLogin` | **false** | true | true | true |
|
|
181
|
+
| Login screen | none (auto) | email + password | email + password | email + password |
|
|
182
|
+
| Bind host | `127.0.0.1` | `127.0.0.1` | `0.0.0.0` | `0.0.0.0` |
|
|
183
|
+
| Operator | auto `operator@constella.dev` | you create it | you create it | you create it |
|
|
184
|
+
| Agent permission | `bypassPermissions` | `acceptEdits` | `acceptEdits` | `acceptEdits` |
|
|
185
|
+
| `BETTER_AUTH_SECRET` required | persisted, not enforced | enforced | enforced | enforced |
|
|
186
|
+
| Secure cookies | no (local http) | if behind https | yes | if behind https |
|
|
187
|
+
| Typical use | own machine / dev | shared box, local net | server over Tailscale | USB across machines |
|
|
188
|
+
|
|
189
|
+
### Launch commands β Start Mode
|
|
190
|
+
|
|
191
|
+
| Command | Result |
|
|
192
|
+
| --- | --- |
|
|
193
|
+
| `constella` | Start Mode (default `cmd === "start"`) |
|
|
194
|
+
| `constella --start` | Start Mode (explicit) |
|
|
195
|
+
| `constella --bind local` | Start Mode (legacy `--bind` back-compat) |
|
|
196
|
+
| `CONSTELLA_RUN_MODE=start` | Forces Start Mode for the server process |
|
|
197
|
+
|
|
198
|
+
### Env vars that shape Start Mode
|
|
199
|
+
|
|
200
|
+
| Variable | Default in Start Mode | Effect |
|
|
201
|
+
| --- | --- | --- |
|
|
202
|
+
| `CONSTELLA_RUN_MODE` | `start` | The run mode the server reads |
|
|
203
|
+
| `CONSTELLA_HOME` | `~/.constella` | Runtime root (DB, secrets, orgs) |
|
|
204
|
+
| `--host` / host | `127.0.0.1` | Loopback bind |
|
|
205
|
+
| `--port` / `PORT` | `3000` | Web port |
|
|
206
|
+
| `CONSTELLA_AGENT_FULL_ACCESS` | `1` (implied by start) | `0` re-jails agents to edits-only |
|
|
207
|
+
| `CONSTELLA_WEB_RESEARCH` | on | `0` disables agent WebSearch/WebFetch |
|
|
208
|
+
| `BETTER_AUTH_SECRET` | generated β `<HOME>/.env` | Session signing key |
|
|
209
|
+
|
|
210
|
+
### Key files
|
|
211
|
+
|
|
212
|
+
| File | Role |
|
|
213
|
+
| --- | --- |
|
|
214
|
+
| `src/lib/run-mode.ts` | `RunMode` type, `RUN_MODES`, `getRunMode()`, `requiresLogin()` |
|
|
215
|
+
| `bin/constella.mjs` | Launcher: picks mode, sets host/port, persists secrets, boots web + worker |
|
|
216
|
+
| `src/lib/workspace.ts` | `requireWorkspace()` β redirects to `/api/dev-login` in Start Mode |
|
|
217
|
+
| `src/app/api/dev-login/route.ts` | Silent auto sign-in route |
|
|
218
|
+
| `src/server/dev-auth.ts` | `DEV_OPERATOR`, `ensureLocalOperator()` |
|
|
219
|
+
| `src/lib/auth.ts` | better-auth config; `assertAuthSecret()` relaxes only for `start` |
|
|
220
|
+
| `src/server/adapters/cli.ts` | `claudePermArgs()` β `bypassPermissions` in Start Mode |
|
|
221
|
+
| `src/lib/run-context.ts` | `detectRunContext()` for the Update path |
|
|
222
|
+
|
|
223
|
+
---
|
|
224
|
+
|
|
225
|
+
## Step-by-step π§
|
|
226
|
+
|
|
227
|
+
### Start a fresh ship in Start Mode
|
|
228
|
+
|
|
229
|
+
1. **Launch** with no flag (or `--start`):
|
|
230
|
+
```bash
|
|
231
|
+
npx constella
|
|
232
|
+
# or, installed globally:
|
|
233
|
+
constella --start
|
|
234
|
+
```
|
|
235
|
+
2. The launcher prints the runtime root and `Mode : start Β· 127.0.0.1:3000`, persists secrets to `<HOME>/.env`, applies migrations, and boots `next start` + the worker.
|
|
236
|
+
3. **Open** `http://127.0.0.1:3000`.
|
|
237
|
+
4. `requireWorkspace()` finds no session β redirects to `/api/dev-login`.
|
|
238
|
+
5. The route provisions `operator@constella.dev`, signs it in, sets the cookie, and bounces to `/`.
|
|
239
|
+
6. If no org exists yet, you land in [ONBOARDING](./ONBOARDING.md); otherwise you're in the app, already signed in.
|
|
240
|
+
|
|
241
|
+
### Wipe and self-heal
|
|
242
|
+
|
|
243
|
+
```bash
|
|
244
|
+
# stop Constella, then:
|
|
245
|
+
rm ~/.constella/constella.db
|
|
246
|
+
constella
|
|
247
|
+
```
|
|
248
|
+
The next page load re-runs `ensureLocalOperator()` and re-creates the operator β no manual account step.
|
|
249
|
+
|
|
250
|
+
### Re-jail agents in Start Mode (extra caution)
|
|
251
|
+
|
|
252
|
+
```bash
|
|
253
|
+
CONSTELLA_AGENT_FULL_ACCESS=0 constella --start
|
|
254
|
+
```
|
|
255
|
+
Agents now run `acceptEdits` (edits-only, no arbitrary shell), while you keep the no-login convenience.
|
|
256
|
+
|
|
257
|
+
---
|
|
258
|
+
|
|
259
|
+
## Examples π
|
|
260
|
+
|
|
261
|
+
**Default launch (Start Mode):**
|
|
262
|
+
```bash
|
|
263
|
+
$ constella
|
|
264
|
+
Constella runtime root : /home/you/.constella
|
|
265
|
+
Mode : start Β· 127.0.0.1:3000
|
|
266
|
+
β’ Secrets ready (stored in /home/you/.constella/.env, never printed).
|
|
267
|
+
β’ Starting: next start -H 127.0.0.1 -p 3000 (β¦) + worker
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
**Custom port, still Start Mode:**
|
|
271
|
+
```bash
|
|
272
|
+
$ constella --start --port 4000
|
|
273
|
+
# β http://127.0.0.1:4000, auto-login, full-access agents
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
**Pin a different runtime root:**
|
|
277
|
+
```bash
|
|
278
|
+
$ CONSTELLA_HOME=/data/constella constella --start
|
|
279
|
+
# DB at /data/constella/constella.db; secrets at /data/constella/.env
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
---
|
|
283
|
+
|
|
284
|
+
## Possible states π°οΈ
|
|
285
|
+
|
|
286
|
+
| Situation | Behaviour |
|
|
287
|
+
| --- | --- |
|
|
288
|
+
| No session cookie, Start Mode | Redirect `/api/dev-login` β auto sign-in β `/` |
|
|
289
|
+
| No session cookie, **not** Start Mode | Redirect `/login` |
|
|
290
|
+
| Auto sign-in succeeds | Cookie set, land on `/` (or `/onboarding` if no org) |
|
|
291
|
+
| Auto sign-in **fails** | Redirect `/login?autologin=failed` (no loop) |
|
|
292
|
+
| `CONSTELLA_FORCE_ONBOARDING=1` | After session, redirect `/onboarding` (one-shot, cleared by `completeOnboarding`) |
|
|
293
|
+
| Org missing / workspace missing | Redirect `/onboarding` |
|
|
294
|
+
| `ensureLocalOperator()` called outside start | Throws `"ensureLocalOperator is start-mode only"` |
|
|
295
|
+
| Agent run, Start Mode | `claude --permission-mode bypassPermissions` (full shell) |
|
|
296
|
+
| Agent run, `CONSTELLA_AGENT_FULL_ACCESS=0` | `claude --permission-mode acceptEdits` (jailed) |
|
|
297
|
+
|
|
298
|
+
---
|
|
299
|
+
|
|
300
|
+
## Related integrations πͺ
|
|
301
|
+
|
|
302
|
+
- **Onboarding** persists the active mode onto `organization.runMode` (`src/server/onboarding.ts`). See [ONBOARDING](./ONBOARDING.md).
|
|
303
|
+
- **Worker** (`bin/worker.mjs`) connects back over `127.0.0.1` regardless of bind host; in Start Mode that's also the web bind. See [ARCHITECTURE](./ARCHITECTURE.md).
|
|
304
|
+
- **Vault** still needs `CONSTELLA_VAULT_KEY` even in Start Mode (provider keys are encrypted). See [SECURITY](./SECURITY.md).
|
|
305
|
+
- **Update** path is mode-aware via `detectRunContext()`. See [UPDATE](./UPDATE.md).
|
|
306
|
+
|
|
307
|
+
---
|
|
308
|
+
|
|
309
|
+
## Security π³οΈ
|
|
310
|
+
|
|
311
|
+
Start Mode trades network hardening for local convenience β safe precisely because it is local:
|
|
312
|
+
|
|
313
|
+
- **Loopback only.** Host binds `127.0.0.1`; nothing is reachable off-box.
|
|
314
|
+
- **Predictable credential is gated.** `operator@constella.dev / operator123` is provisioned **only** when `getRunMode() === "start"`; `ensureLocalOperator()` throws otherwise. The dev-login route also returns `/login` outside Start Mode.
|
|
315
|
+
- **Real auth secret persisted.** A real `BETTER_AUTH_SECRET` is generated to `<HOME>/.env` (`chmod 600`) so sessions aren't forgeable; cookies are non-`Secure` only because the local transport is plain `http`.
|
|
316
|
+
- **Full-access agents are local-only.** `bypassPermissions` lets agents run shell, but the workspace is still an FS jail (`safe()` lexical + symlink checks), and the guard/lock hooks still apply. Set `CONSTELLA_AGENT_FULL_ACCESS=0` to re-jail.
|
|
317
|
+
- **Do not port-forward Start Mode.** If you need remote access, switch to [VPS_MODE](./VPS_MODE.md) (Tailscale + Docker) or [AUTH_MODE](./AUTH_MODE.md) β never expose the loopback Start Mode to a network, where the default password becomes a remote login.
|
|
318
|
+
|
|
319
|
+
---
|
|
320
|
+
|
|
321
|
+
## Troubleshooting π§°
|
|
322
|
+
|
|
323
|
+
| Symptom | Likely cause | Fix |
|
|
324
|
+
| --- | --- | --- |
|
|
325
|
+
| Stuck on `/login` despite `--start` | `CONSTELLA_RUN_MODE` not `start` for the server | Verify launch flag; check the `Mode : start` line at boot |
|
|
326
|
+
| `/login?autologin=failed` | Auto sign-in threw (DB locked, schema not migrated) | Check console `[dev-login] auto sign-in failed`; ensure migrations ran |
|
|
327
|
+
| Login loop | Guard β dev-login bouncing | The route falls back to `/login?autologin=failed` by design; inspect the logged error |
|
|
328
|
+
| Agents can't install deps / run tests | `CONSTELLA_AGENT_FULL_ACCESS=0` set, or not Start Mode | Unset the override, or relaunch with `--start` |
|
|
329
|
+
| Reachable from another machine | You overrode `--host` to `0.0.0.0` | Drop `--host`; Start Mode binds `127.0.0.1` |
|
|
330
|
+
| better-auth secret error at boot | Forced a network mode without a secret | Network modes require `BETTER_AUTH_SECRET`; the launcher persists one β let it run, or set it |
|
|
331
|
+
| Operator vanished after DB reset | Expected | Reload any page β `ensureLocalOperator()` re-creates it |
|
|
332
|
+
|
|
333
|
+
---
|
|
334
|
+
|
|
335
|
+
## Related links π
|
|
336
|
+
|
|
337
|
+
- [INSTALLATION](./INSTALLATION.md) Β· [ONBOARDING](./ONBOARDING.md) Β· [CONFIGURATION](./CONFIGURATION.md)
|
|
338
|
+
- [AUTH_MODE](./AUTH_MODE.md) Β· [VPS_MODE](./VPS_MODE.md) Β· [PORTABLE_MODE](./PORTABLE_MODE.md)
|
|
339
|
+
- [ARCHITECTURE](./ARCHITECTURE.md) Β· [AI_ARCHITECTURE](./AI_ARCHITECTURE.md) Β· [AGENTS](./AGENTS.md)
|
|
340
|
+
- [SECURITY](./SECURITY.md) Β· [UPDATE](./UPDATE.md) Β· [TROUBLESHOOTING](./TROUBLESHOOTING.md) Β· [FAQ](./FAQ.md)
|
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
[β Docs index](./README.md) Β· [π§π· PortuguΓͺs](../pt/SYNCED_BLOCKS.md) Β· [β¦ Constella](../../README.md)
|
|
2
|
+
|
|
3
|
+
# π Synced Blocks β the canonical memory nebula
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
Synced blocks are the **single source of truth** for durable project knowledge: one named unit (`slug` + Markdown `body`) edited in exactly one place and surfaced by reference everywhere β agent prompts, the welcome home, and transcluded into reports. Edit a block once and every surface reflects the latest, with no copy-paste drift. They are distinct from auto-captured `kb_entry` knowledge: a synced block is **curated, canonical, and versioned**; agents can only *propose* edits to it.
|
|
8
|
+
|
|
9
|
+
Source of truth in code: `src/server/blocks.ts`, schema `src/db/schema.ts` (`synced_block`, `block_proposal`).
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 1. When to use πͺ
|
|
14
|
+
|
|
15
|
+
Use synced blocks for facts that:
|
|
16
|
+
|
|
17
|
+
- are **durable** and **reused** across many runs and surfaces (the official stack, business rules, security patterns, the architecture every agent must treat as canonical);
|
|
18
|
+
- must stay **consistent** everywhere they appear (no drift between the persona file, a report, and a chat answer);
|
|
19
|
+
- benefit from **operator/KB-agent review** before changing the shared truth.
|
|
20
|
+
|
|
21
|
+
Do **not** use them for transient, run-specific learnings. Those flow into the auto-captured KB via the `[[REMEMBER type=<t>: <fact>]]` token (no approval) β see [KB_RAG.md](./KB_RAG.md) and [MEMORY_RAG.md](./MEMORY_RAG.md).
|
|
22
|
+
|
|
23
|
+
| Knowledge kind | Mechanism | Approval | Versioned | Doc |
|
|
24
|
+
|---|---|---|---|---|
|
|
25
|
+
| Canonical, curated fact | Synced block (`synced_block`) | Operator / KB agent merges proposals | Yes (`version`) | this doc |
|
|
26
|
+
| Auto-captured learning | `kb_entry` via `[[REMEMBER β¦]]` | None (ingested directly) | No (status lifecycle) | [KB_RAG.md](./KB_RAG.md) |
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## 2. How it works π°οΈ
|
|
31
|
+
|
|
32
|
+
A synced block lives in the `synced_block` table, keyed by `(workspaceId, slug)`. Its `body` is canonical Markdown. Two things happen whenever a block is written via `upsertBlock`:
|
|
33
|
+
|
|
34
|
+
1. The row is **upserted** β on create `version = 1`; on update `version` is incremented (`cur.version + 1`), `updatedBy` and `updatedAt` are refreshed.
|
|
35
|
+
2. The body is **re-embedded** into `rag_chunk` at path `block/<slug>` (`embedBlock`), so agents also *retrieve* the current block through RAG, not just receive it injected. The old chunks at that path are deleted first, so embeddings never go stale.
|
|
36
|
+
|
|
37
|
+
The block then reaches agents through **three** distinct surfaces:
|
|
38
|
+
|
|
39
|
+
- **Injected** β `canonicalFactsSection(wsId)` builds a compact "Canonical project facts" section (up to 20 most-recently-updated blocks, each title + kind + first 800 chars, capped at 5000 chars total) that the context manager injects near the top of every agent prompt.
|
|
40
|
+
- **Transcluded** β `resolveBlocks(orgId, text)` replaces `{{kb:slug}}` markers anywhere in text (persona files, instructions, report bodies) with the block's current `body`. A missing slug renders a LOUD visible marker `[[missing block: <slug>]]` rather than silently vanishing.
|
|
41
|
+
- **Retrieved** β the RAG chunks at `block/<slug>` are returned by ordinary `kbQuery` retrieval, so a block can surface even when it isn't in the always-injected window.
|
|
42
|
+
|
|
43
|
+
### Slug rules
|
|
44
|
+
|
|
45
|
+
Slugs are normalized (`normSlug`): lowercased, trimmed, non-`[a-z0-9-]` collapsed to `-`, leading/trailing dashes stripped, truncated to 60 chars, and validated against `/^[a-z0-9][a-z0-9-]{0,60}$/`. An invalid slug fails the upsert (`{ ok: false }`).
|
|
46
|
+
|
|
47
|
+
### Field bounds (enforced in `upsertBlock`)
|
|
48
|
+
|
|
49
|
+
| Field | Bound |
|
|
50
|
+
|---|---|
|
|
51
|
+
| `title` | sliced to 200 chars |
|
|
52
|
+
| `body` | sliced to 20000 chars |
|
|
53
|
+
| `kind` | sliced to 40 chars (default `note`) |
|
|
54
|
+
| `updatedBy` | sliced to 60 chars (default `operator`) |
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## 3. Main flow π
|
|
59
|
+
|
|
60
|
+
```mermaid
|
|
61
|
+
flowchart TD
|
|
62
|
+
subgraph Authoring
|
|
63
|
+
OP["Operator edits in Knowledge UI"] -->|saveBlockAction| UP["upsertBlock()"]
|
|
64
|
+
SEED["Boot / KB card seeding"] -->|seedDefaultBlocks Β· seedCanonicalBlocks| UP
|
|
65
|
+
AG["Agent proposes [[KB-BLOCK]]"] -->|proposeBlockEdit| PQ["block_proposal (pending)"]
|
|
66
|
+
PQ -->|mergeProposal| UP
|
|
67
|
+
end
|
|
68
|
+
UP -->|version++| TBL["synced_block (workspaceId, slug)"]
|
|
69
|
+
UP -->|re-embed| RC["rag_chunk path=block/<slug>"]
|
|
70
|
+
TBL -->|canonicalFactsSection| PROMPT["Agent prompt: Canonical project facts"]
|
|
71
|
+
TBL -->|"resolveBlocks {{kb:slug}}"| SURF["Reports Β· persona Β· instructions"]
|
|
72
|
+
RC -->|kbQuery retrieval| PROMPT
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## 4. Key concepts β¦
|
|
78
|
+
|
|
79
|
+
| Concept | What it is |
|
|
80
|
+
|---|---|
|
|
81
|
+
| **Block** | `typeof syncedBlock.$inferSelect` β one canonical knowledge unit `(slug, kind, title, body, version, updatedBy)`. |
|
|
82
|
+
| **Proposal** | `typeof blockProposal.$inferSelect` β an agent's *suggested* edit awaiting merge/reject. |
|
|
83
|
+
| **`{{kb:slug}}` marker** | A transclusion token resolved at read time to the block's current body. |
|
|
84
|
+
| **`[[KB-BLOCK slug]]β¦[[/KB-BLOCK]]`** | The token an agent emits in its run output to *propose* a block edit. |
|
|
85
|
+
| **Canonical facts section** | The bounded block digest injected into every agent prompt as the authoritative source of truth. |
|
|
86
|
+
| **Re-embedding** | Each save refreshes `rag_chunk` at `block/<slug>` so RAG retrieval stays current. |
|
|
87
|
+
| **Versioning** | `version` starts at 1, increments on every update; the UI shows `v<n>` and `updatedBy`. |
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## 5. Tables ποΈ
|
|
92
|
+
|
|
93
|
+
### `synced_block` (PK `(workspaceId, slug)`)
|
|
94
|
+
|
|
95
|
+
| Column | Type | Notes |
|
|
96
|
+
|---|---|---|
|
|
97
|
+
| `workspace_id` | text | FK β `workspace.id`, `onDelete: cascade` |
|
|
98
|
+
| `slug` | text | stable handle, e.g. `official-stack` |
|
|
99
|
+
| `kind` | text | default `note`; see kinds below |
|
|
100
|
+
| `title` | text | default `""` |
|
|
101
|
+
| `body` | text | canonical Markdown β the single source of truth |
|
|
102
|
+
| `version` | integer | default `1`, bumped on every update |
|
|
103
|
+
| `updated_by` | text | agent handle or `operator` (or `system` for seeded) |
|
|
104
|
+
| `created_at` | timestamp | `unixepoch()` |
|
|
105
|
+
| `updated_at` | timestamp | `unixepoch()`; blocks are listed/digested in `desc(updatedAt)` |
|
|
106
|
+
|
|
107
|
+
**`kind` values** (from the schema comment): `mission`, `objective`, `stack`, `architecture`, `business-rule`, `ui-pattern`, `security`, `commands`, `deploy-checklist`, `review-checklist`, `glossary`, `policy`, `note`. `kind` is free text (sliced to 40 chars), so these are conventions, not a DB enum.
|
|
108
|
+
|
|
109
|
+
### `block_proposal` (PK `id`, index `block_prop_ws_idx` on `(workspaceId, status)`)
|
|
110
|
+
|
|
111
|
+
| Column | Type | Notes |
|
|
112
|
+
|---|---|---|
|
|
113
|
+
| `id` | text | `randomUUID()` |
|
|
114
|
+
| `workspace_id` | text | FK β `workspace.id`, `onDelete: cascade` |
|
|
115
|
+
| `slug` | text | target block slug (normalized) |
|
|
116
|
+
| `kind` | text | default `note` |
|
|
117
|
+
| `title` | text | default `""` |
|
|
118
|
+
| `body` | text | proposed Markdown body |
|
|
119
|
+
| `by_agent_handle` | text | who proposed it |
|
|
120
|
+
| `status` | text enum | `pending` \| `merged` \| `rejected` (default `pending`) |
|
|
121
|
+
| `created_at` | timestamp | `unixepoch()` |
|
|
122
|
+
| `decided_at` | timestamp | set on merge/reject |
|
|
123
|
+
| `decided_by` | text | default `""`; `operator` from the action |
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## 6. The canonical block set π
|
|
128
|
+
|
|
129
|
+
`seedCanonicalBlocks(orgId)` (wired to the KB card and the Welcome Home "Create central blocks" button via `seedDefaultBlocksAction`) ensures the full curated set exists. `mission`, `objective`, and `official-stack` are filled from the workspace's own fields; the rest are created as **editable starter placeholders** so they show up to be filled in. It is **idempotent** β it never overwrites an existing block, and returns how many were newly created.
|
|
130
|
+
|
|
131
|
+
| slug | kind | source of body |
|
|
132
|
+
|---|---|---|
|
|
133
|
+
| `mission` | `mission` | `workspace.mission` |
|
|
134
|
+
| `objective` | `objective` | `workspace.objective` |
|
|
135
|
+
| `official-stack` | `stack` | rendered from `workspace.stack` (`- **key:** value`, skips `None`) |
|
|
136
|
+
| `current-architecture` | `architecture` | starter placeholder |
|
|
137
|
+
| `business-rules` | `business-rule` | starter placeholder |
|
|
138
|
+
| `ui-patterns` | `ui-pattern` | starter placeholder |
|
|
139
|
+
| `security-patterns` | `security` | starter placeholder |
|
|
140
|
+
| `deploy-checklist` | `deploy-checklist` | starter placeholder |
|
|
141
|
+
| `code-review-checklist` | `review-checklist` | starter placeholder |
|
|
142
|
+
| `glossary` | `glossary` | starter placeholder |
|
|
143
|
+
| `technical-decisions` | `note` | starter placeholder |
|
|
144
|
+
|
|
145
|
+
A lighter `seedDefaultBlocks(orgId)` seeds only `mission` / `objective` / `official-stack` and only if absent **and** non-empty. It runs at boot for every workspace via `seedDefaultBlocksForExistingWorkspaces()` (called from `src/server/boot.ts`).
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## 7. Agent proposals: propose β review β merge β¦
|
|
150
|
+
|
|
151
|
+
Agents never write blocks directly. The runner instruction tells them:
|
|
152
|
+
|
|
153
|
+
> If you discover a DURABLE canonical fact that belongs in the shared knowledge β¦ you MAY propose a synced-block edit by emitting on their own lines: `[[KB-BLOCK <kebab-slug>]]` then the new Markdown body then `[[/KB-BLOCK]]` β the operator / Knowledge agent reviews and merges it. Use sparingly, only for reusable facts (e.g. `official-stack`, `security-patterns`).
|
|
154
|
+
|
|
155
|
+
After a successful run, `src/server/runner.ts` scans the output for `[[KB-BLOCK slug]]β¦[[/KB-BLOCK]]` blocks, calls `proposeBlockEdit` for each (queuing a `block_proposal` with `status = pending`), records the touched slugs (β room chips), and **strips the tokens** from the visible text. Each proposal also:
|
|
156
|
+
|
|
157
|
+
- pushes an **Inbox** item (`kind: review`, `refType: validation`, `refId = proposalId`) titled `Block edit proposed β <slug>`;
|
|
158
|
+
- fires an operator notification via `notifyOps`.
|
|
159
|
+
|
|
160
|
+
The operator (or the Knowledge agent, Vannevar) then **merges** or **rejects** from the Knowledge module's `BlocksPanel`.
|
|
161
|
+
|
|
162
|
+
```mermaid
|
|
163
|
+
sequenceDiagram
|
|
164
|
+
participant A as Agent
|
|
165
|
+
participant R as runner.ts
|
|
166
|
+
participant P as block_proposal
|
|
167
|
+
participant I as Inbox / notifyOps
|
|
168
|
+
participant OP as Operator / KB agent
|
|
169
|
+
participant B as synced_block
|
|
170
|
+
|
|
171
|
+
A->>R: run output with [[KB-BLOCK slug]]β¦[[/KB-BLOCK]]
|
|
172
|
+
R->>P: proposeBlockEdit() β status=pending
|
|
173
|
+
R->>I: pushInbox(review/validation) + notifyOps
|
|
174
|
+
Note over OP: reviews in Knowledge β BlocksPanel
|
|
175
|
+
alt merge
|
|
176
|
+
OP->>P: mergeProposalAction(id)
|
|
177
|
+
P->>B: upsertBlock(body, updatedBy=byAgentHandle) β version++
|
|
178
|
+
B->>B: re-embed rag_chunk block/<slug>
|
|
179
|
+
P->>P: status=merged, decidedAt, decidedBy
|
|
180
|
+
P->>I: resolveInboxFor(validation, id)
|
|
181
|
+
else reject
|
|
182
|
+
OP->>P: rejectProposalAction(id)
|
|
183
|
+
P->>P: status=rejected, decidedAt, decidedBy
|
|
184
|
+
P->>I: resolveInboxFor(validation, id)
|
|
185
|
+
end
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
On **merge**, `mergeProposal(wsId, id, by)` only proceeds if the proposal is still `pending`; it then runs `upsertBlock` with `updatedBy` set to the proposing agent's handle (so authorship is preserved), marks the proposal `merged`, and resolves the Inbox item. On **reject**, `rejectProposal` marks it `rejected` and resolves the Inbox item without touching the block.
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
## 8. Step-by-step π οΈ
|
|
193
|
+
|
|
194
|
+
**Seed the canonical set**
|
|
195
|
+
|
|
196
|
+
1. Open the **Knowledge** module (or the Welcome Home / dashboard KB card).
|
|
197
|
+
2. Click **Create central blocks** β `seedDefaultBlocksAction` β `seedCanonicalBlocks`.
|
|
198
|
+
3. `mission` / `objective` / `official-stack` come pre-filled from the workspace; the rest appear as starter placeholders to edit.
|
|
199
|
+
|
|
200
|
+
**Edit a block as operator**
|
|
201
|
+
|
|
202
|
+
1. In `BlocksPanel`, click **Edit** on a block (or **New**).
|
|
203
|
+
2. Set `slug`, `title`, `kind`, `body` (Markdown).
|
|
204
|
+
3. Save β `saveBlockAction` β `upsertBlock(β¦, updatedBy: "operator")` β `version++` + re-embed.
|
|
205
|
+
|
|
206
|
+
**Transclude a block into a report or persona**
|
|
207
|
+
|
|
208
|
+
1. Write `{{kb:official-stack}}` anywhere in the text.
|
|
209
|
+
2. At read time, `resolveBlocks` swaps it for the block's current body (reports resolve in `src/app/(app)/reports/[id]/page.tsx`; prompts resolve at the end of context assembly).
|
|
210
|
+
|
|
211
|
+
**Let an agent propose a change**
|
|
212
|
+
|
|
213
|
+
1. The agent emits `[[KB-BLOCK security-patterns]] β¦new bodyβ¦ [[/KB-BLOCK]]` in its run output.
|
|
214
|
+
2. The proposal lands in the Knowledge module's pending list + the Inbox.
|
|
215
|
+
3. You **Merge** (applies + bumps version) or **Reject**.
|
|
216
|
+
|
|
217
|
+
---
|
|
218
|
+
|
|
219
|
+
## 9. Examples π‘
|
|
220
|
+
|
|
221
|
+
**Transclusion marker** (in a report or `.claude/agents/<handle>/Agent.md`):
|
|
222
|
+
|
|
223
|
+
```markdown
|
|
224
|
+
## Stack you must use
|
|
225
|
+
{{kb:official-stack}}
|
|
226
|
+
|
|
227
|
+
## Rules you must never break
|
|
228
|
+
{{kb:business-rules}}
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
A missing slug stays loudly visible:
|
|
232
|
+
|
|
233
|
+
```markdown
|
|
234
|
+
{{kb:does-not-exist}} β [[missing block: does-not-exist]]
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
**Agent proposal token** (emitted by the agent, stripped from chat after capture):
|
|
238
|
+
|
|
239
|
+
```text
|
|
240
|
+
[[KB-BLOCK official-stack]]
|
|
241
|
+
- **language:** TypeScript
|
|
242
|
+
- **framework:** Next.js 16
|
|
243
|
+
- **db:** SQLite via drizzle-orm
|
|
244
|
+
[[/KB-BLOCK]]
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
**Injected digest** (what `canonicalFactsSection` produces, abbreviated):
|
|
248
|
+
|
|
249
|
+
```text
|
|
250
|
+
### Official stack (stack)
|
|
251
|
+
- **framework:** Next.js 16
|
|
252
|
+
- **db:** SQLite
|
|
253
|
+
|
|
254
|
+
### Business rules (business-rule)
|
|
255
|
+
...first 800 chars...
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
---
|
|
259
|
+
|
|
260
|
+
## 10. Possible states π³οΈ
|
|
261
|
+
|
|
262
|
+
**Block** β has no status column; its lifecycle is the `version` counter. A block exists, is edited (version bumps), or is deleted (`deleteBlock` removes the row **and** its `rag_chunk` entries at `block/<slug>`).
|
|
263
|
+
|
|
264
|
+
**Proposal** (`block_proposal.status`):
|
|
265
|
+
|
|
266
|
+
| State | Meaning | Set by |
|
|
267
|
+
|---|---|---|
|
|
268
|
+
| `pending` | awaiting operator/KB-agent decision; appears in `listProposals` + Inbox | `proposeBlockEdit` (default) |
|
|
269
|
+
| `merged` | applied to the block (version bumped), Inbox resolved | `mergeProposal` |
|
|
270
|
+
| `rejected` | discarded, block untouched, Inbox resolved | `rejectProposal` |
|
|
271
|
+
|
|
272
|
+
`listProposals(wsId)` returns only `pending` proposals, newest first.
|
|
273
|
+
|
|
274
|
+
---
|
|
275
|
+
|
|
276
|
+
## 11. Related integrations π
|
|
277
|
+
|
|
278
|
+
- **RAG** ([KB_RAG.md](./KB_RAG.md), [MEMORY_RAG.md](./MEMORY_RAG.md)) β every save re-embeds the block into `rag_chunk` (`embed` + `chunksOf`) at path `block/<slug>`, so blocks participate in ordinary retrieval. A keyword fallback applies if the embed server is down.
|
|
279
|
+
- **Context manager** ([AI_ARCHITECTURE.md](./AI_ARCHITECTURE.md)) β `canonicalFactsSection` is injected as the top-priority "Canonical project facts" section; `resolveBlocks` runs last over the assembled prompt.
|
|
280
|
+
- **Inbox** ([INBOX.md](./INBOX.md)) β proposals raise and resolve `validation` review items.
|
|
281
|
+
- **Agents / Knowledge agent** ([AGENTS.md](./AGENTS.md), [KB_AGENT.md](./KB_AGENT.md)) β agents propose; Vannevar / the operator merge.
|
|
282
|
+
- **Reports & specs** ([GOALS_SPECS_ISSUES.md](./GOALS_SPECS_ISSUES.md)) β report bodies transclude `{{kb:slug}}` at read time.
|
|
283
|
+
- **Knowledge tokens** ([CHAT_COMMANDS.md](./CHAT_COMMANDS.md)) β `[[KB-BLOCK β¦]]` sits alongside `[[REMEMBER β¦]]` / `[[CONSULT β¦]]` in the agent token vocabulary.
|
|
284
|
+
|
|
285
|
+
---
|
|
286
|
+
|
|
287
|
+
## 12. Security π‘οΈ
|
|
288
|
+
|
|
289
|
+
- **No direct agent writes.** Agents can only *propose*; the canonical body changes only through `mergeProposal` / `saveBlockAction` (operator or KB agent). This keeps the shared source of truth under human/curator control.
|
|
290
|
+
- **Workspace isolation.** Every query is scoped by `workspaceId`; the PK is `(workspaceId, slug)` and FKs cascade on workspace delete.
|
|
291
|
+
- **Bounded input.** `title`/`body`/`kind`/`updatedBy` are length-capped; slugs are normalized and regex-validated before any write.
|
|
292
|
+
- **Secret hygiene.** Blocks are curated knowledge, but treat bodies like any shared surface β do not paste secrets; the platform scrubs secrets on KB ingest, Telegram and logs (`scrubSecrets`, see [SECURITY.md](./SECURITY.md)).
|
|
293
|
+
- **Resilience.** All block functions wrap their DB work in `try/catch` and degrade gracefully (`listBlocks` β `[]`, `resolveBlocks` β original text), so a transient failure never breaks prompt assembly.
|
|
294
|
+
|
|
295
|
+
---
|
|
296
|
+
|
|
297
|
+
## 13. Troubleshooting π§
|
|
298
|
+
|
|
299
|
+
| Symptom | Likely cause | Fix |
|
|
300
|
+
|---|---|---|
|
|
301
|
+
| `[[missing block: <slug>]]` in a report/prompt | the referenced block does not exist (or slug typo) | create the block, or fix the `{{kb:slug}}` marker; slugs are lowercase kebab |
|
|
302
|
+
| Block save silently fails (`{ ok: false }`) | invalid slug (fails `SLUG_RE`) or empty after normalization | use `[a-z0-9-]`, start with alphanumeric, β€ 60 chars |
|
|
303
|
+
| Agent's proposal never appears | the agent didn't wrap it correctly, or the body was empty | tokens must be exactly `[[KB-BLOCK <slug>]]` β¦ `[[/KB-BLOCK]]` with a non-empty body |
|
|
304
|
+
| Merge button does nothing | the proposal is no longer `pending` (already decided) | refresh; `mergeProposal` ignores non-pending proposals |
|
|
305
|
+
| Edited block doesn't show in agent answers | RAG retrieval cold / embed server down | the block is still injected via `canonicalFactsSection`; check the embed server (see [MODELS.md](./MODELS.md)) |
|
|
306
|
+
| No blocks at all after onboarding | workspace `mission`/`objective`/`stack` were empty (nothing to seed) | click **Create central blocks** to seed the full set with starters |
|
|
307
|
+
|
|
308
|
+
---
|
|
309
|
+
|
|
310
|
+
## 14. Related links β¦
|
|
311
|
+
|
|
312
|
+
- [KB_RAG.md](./KB_RAG.md) β the knowledge base, ingestion, and `kbQuery`
|
|
313
|
+
- [MEMORY_RAG.md](./MEMORY_RAG.md) β embeddings, the memory nebula
|
|
314
|
+
- [KB_AGENT.md](./KB_AGENT.md) β Vannevar, the Knowledge agent
|
|
315
|
+
- [AI_ARCHITECTURE.md](./AI_ARCHITECTURE.md) β how context is assembled for agents
|
|
316
|
+
- [AGENTS.md](./AGENTS.md) β the agent roster and how they run
|
|
317
|
+
- [INBOX.md](./INBOX.md) β review items and resolution
|
|
318
|
+
- [GOALS_SPECS_ISSUES.md](./GOALS_SPECS_ISSUES.md) β specs, reports, transclusion targets
|
|
319
|
+
- [CHAT_COMMANDS.md](./CHAT_COMMANDS.md) β agent token vocabulary
|
|
320
|
+
- [SECURITY.md](./SECURITY.md) β isolation, scrubbing, vault
|