@jlongo78/agent-spaces 0.9.6 → 0.9.8
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/standalone/.claude/settings.local.json +68 -0
- package/.next/standalone/.claude/spaces-env.json +1 -0
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/app-path-routes-manifest.json +1 -0
- package/.next/standalone/.next/build-manifest.json +2 -2
- package/.next/standalone/.next/prerender-manifest.json +3 -3
- package/.next/standalone/.next/required-server-files.json +19 -19
- package/.next/standalone/.next/routes-manifest.json +6 -0
- package/.next/standalone/.next/server/app/(desktop)/admin/analytics/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(desktop)/admin/users/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(desktop)/analytics/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(desktop)/cortex/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(desktop)/network/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(desktop)/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(desktop)/projects/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(desktop)/sessions/[id]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(desktop)/sessions/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(desktop)/sessions/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(desktop)/settings/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(desktop)/terminal/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(desktop)/terminal/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(desktop)/terminal/pane/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(desktop)/terminal/remote/[nodeId]/[workspaceId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(desktop)/workspaces/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_global-error.html +2 -2
- package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +1 -1
- package/.next/standalone/.next/server/app/_not-found.rsc +2 -2
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/admin/analytics.html +1 -1
- package/.next/standalone/.next/server/app/admin/analytics.rsc +2 -2
- package/.next/standalone/.next/server/app/admin/analytics.segments/!KGRlc2t0b3Ap/admin/analytics/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/admin/analytics.segments/!KGRlc2t0b3Ap/admin/analytics.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/admin/analytics.segments/!KGRlc2t0b3Ap/admin.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/admin/analytics.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/admin/analytics.segments/_full.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/admin/analytics.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/admin/analytics.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/admin/analytics.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/admin/users.html +1 -1
- package/.next/standalone/.next/server/app/admin/users.rsc +2 -2
- package/.next/standalone/.next/server/app/admin/users.segments/!KGRlc2t0b3Ap/admin/users/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/admin/users.segments/!KGRlc2t0b3Ap/admin/users.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/admin/users.segments/!KGRlc2t0b3Ap/admin.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/admin/users.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/admin/users.segments/_full.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/admin/users.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/admin/users.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/admin/users.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/analytics.html +1 -1
- package/.next/standalone/.next/server/app/analytics.rsc +2 -2
- package/.next/standalone/.next/server/app/analytics.segments/!KGRlc2t0b3Ap/analytics/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/analytics.segments/!KGRlc2t0b3Ap/analytics.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/analytics.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/analytics.segments/_full.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/analytics.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/analytics.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/analytics.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/api/analytics/overview/route.js +1 -1
- package/.next/standalone/.next/server/app/api/analytics/overview/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/benchmark/lobes/route.js +1 -1
- package/.next/standalone/.next/server/app/api/benchmark/lobes/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/benchmark/run/route.js +1 -1
- package/.next/standalone/.next/server/app/api/benchmark/run/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/benchmark/runs/[id]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/benchmark/runs/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/benchmark/runs/route.js +1 -1
- package/.next/standalone/.next/server/app/api/benchmark/runs/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/benchmark/status/route.js +1 -1
- package/.next/standalone/.next/server/app/api/benchmark/status/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/bulk/route.js +1 -1
- package/.next/standalone/.next/server/app/api/bulk/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/config/route.js +1 -1
- package/.next/standalone/.next/server/app/api/config/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/cortex/context/route.js +1 -1
- package/.next/standalone/.next/server/app/api/cortex/context/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/cortex/curation/assess/route.js +1 -1
- package/.next/standalone/.next/server/app/api/cortex/curation/assess/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/cortex/curation/publish/route.js +1 -1
- package/.next/standalone/.next/server/app/api/cortex/curation/publish/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/cortex/curation/refine/route.js +1 -1
- package/.next/standalone/.next/server/app/api/cortex/curation/refine/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/cortex/curation/review/route.js +1 -1
- package/.next/standalone/.next/server/app/api/cortex/curation/review/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/cortex/curation/seed/route.js +1 -1
- package/.next/standalone/.next/server/app/api/cortex/curation/seed/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/cortex/export/route.js +1 -1
- package/.next/standalone/.next/server/app/api/cortex/export/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/cortex/federation/pending/route.js +1 -1
- package/.next/standalone/.next/server/app/api/cortex/federation/pending/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/cortex/federation/resolve/route.js +1 -1
- package/.next/standalone/.next/server/app/api/cortex/federation/resolve/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/cortex/federation/search/route.js +1 -1
- package/.next/standalone/.next/server/app/api/cortex/federation/search/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/cortex/federation/teach/route.js +1 -1
- package/.next/standalone/.next/server/app/api/cortex/federation/teach/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/cortex/graph/edges/route.js +1 -1
- package/.next/standalone/.next/server/app/api/cortex/graph/edges/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/cortex/graph/entities/[id]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/cortex/graph/entities/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/cortex/graph/entities/route.js +1 -1
- package/.next/standalone/.next/server/app/api/cortex/graph/entities/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/cortex/graph/populate/route.js +1 -1
- package/.next/standalone/.next/server/app/api/cortex/graph/populate/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/cortex/import/route.js +1 -1
- package/.next/standalone/.next/server/app/api/cortex/import/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/cortex/import/status/route.js +1 -1
- package/.next/standalone/.next/server/app/api/cortex/import/status/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/cortex/ingest/bootstrap/route.js +1 -1
- package/.next/standalone/.next/server/app/api/cortex/ingest/bootstrap/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/cortex/ingest/status/route.js +1 -1
- package/.next/standalone/.next/server/app/api/cortex/ingest/status/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/cortex/knowledge/[id]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/cortex/knowledge/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/cortex/knowledge/route.js +1 -1
- package/.next/standalone/.next/server/app/api/cortex/knowledge/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/cortex/lobes/[id]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/cortex/lobes/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/cortex/lobes/route.js +1 -1
- package/.next/standalone/.next/server/app/api/cortex/lobes/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/cortex/lobes/share/route.js +1 -1
- package/.next/standalone/.next/server/app/api/cortex/lobes/share/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/cortex/marketplace/browse/route.js +1 -1
- package/.next/standalone/.next/server/app/api/cortex/marketplace/browse/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/cortex/marketplace/preview/route.js +1 -1
- package/.next/standalone/.next/server/app/api/cortex/marketplace/preview/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/cortex/mcp/call/route.js +1 -1
- package/.next/standalone/.next/server/app/api/cortex/mcp/call/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/cortex/mcp/tools/route.js +1 -1
- package/.next/standalone/.next/server/app/api/cortex/mcp/tools/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/cortex/search/route.js +1 -1
- package/.next/standalone/.next/server/app/api/cortex/search/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/cortex/settings/route.js +1 -1
- package/.next/standalone/.next/server/app/api/cortex/settings/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/cortex/status/route.js +1 -1
- package/.next/standalone/.next/server/app/api/cortex/status/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/cortex/timeline/route.js +1 -1
- package/.next/standalone/.next/server/app/api/cortex/timeline/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/cortex/usage/route.js +1 -1
- package/.next/standalone/.next/server/app/api/cortex/usage/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/cortex/workspace/[id]/context/route.js +1 -1
- package/.next/standalone/.next/server/app/api/cortex/workspace/[id]/context/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/events/route.js +1 -1
- package/.next/standalone/.next/server/app/api/events/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/files/route.js +1 -1
- package/.next/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/folders/route.js +1 -1
- package/.next/standalone/.next/server/app/api/folders/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/network/handshake/route.js +1 -1
- package/.next/standalone/.next/server/app/api/network/handshake/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/network/panes/[id]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/network/panes/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/network/panes/route.js +1 -1
- package/.next/standalone/.next/server/app/api/network/panes/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/network/projects/route.js +1 -1
- package/.next/standalone/.next/server/app/api/network/projects/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/network/search/route.js +1 -1
- package/.next/standalone/.next/server/app/api/network/search/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/network/sessions/[id]/messages/route.js +1 -1
- package/.next/standalone/.next/server/app/api/network/sessions/[id]/messages/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/network/sessions/[id]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/network/sessions/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/network/sessions/route.js +1 -1
- package/.next/standalone/.next/server/app/api/network/sessions/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/network/workspaces/[id]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/network/workspaces/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/network/workspaces/route.js +1 -1
- package/.next/standalone/.next/server/app/api/network/workspaces/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/panes/[id]/diff/route.js +1 -1
- package/.next/standalone/.next/server/app/api/panes/[id]/diff/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/panes/[id]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/panes/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/panes/route.js +1 -1
- package/.next/standalone/.next/server/app/api/panes/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/projects/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/proxy/models/[modelId]/[...path]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/proxy/models/[modelId]/[...path]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/proxy/models/[modelId]/status/route.js +1 -1
- package/.next/standalone/.next/server/app/api/proxy/models/[modelId]/status/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/search/route.js +2 -2
- package/.next/standalone/.next/server/app/api/search/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/sessions/[id]/chat/route.js +1 -1
- package/.next/standalone/.next/server/app/api/sessions/[id]/chat/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/sessions/[id]/messages/route.js +1 -1
- package/.next/standalone/.next/server/app/api/sessions/[id]/messages/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/sessions/[id]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/sessions/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/sessions/route.js +2 -2
- package/.next/standalone/.next/server/app/api/sessions/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/sync/route.js +1 -1
- package/.next/standalone/.next/server/app/api/sync/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/tags/route.js +1 -1
- package/.next/standalone/.next/server/app/api/tags/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/tier/route.js +1 -1
- package/.next/standalone/.next/server/app/api/tier/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/whisper/config/route.js +1 -1
- package/.next/standalone/.next/server/app/api/whisper/config/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/whisper/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wizard/chart/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/wizard/chart/route/build-manifest.json +11 -0
- package/.next/standalone/.next/server/app/api/wizard/chart/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/wizard/chart/route.js +7 -0
- package/.next/standalone/.next/server/app/api/wizard/chart/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/wizard/chart/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/wizard/chart/route_client-reference-manifest.js +2 -0
- package/.next/standalone/.next/server/app/api/wizard/chat/route.js +1 -1
- package/.next/standalone/.next/server/app/api/wizard/chat/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/workspaces/[id]/context/[key]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/workspaces/[id]/context/[key]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/workspaces/[id]/context/route.js +1 -1
- package/.next/standalone/.next/server/app/api/workspaces/[id]/context/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/workspaces/[id]/messages/[msgId]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/workspaces/[id]/messages/[msgId]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/workspaces/[id]/messages/route.js +1 -1
- package/.next/standalone/.next/server/app/api/workspaces/[id]/messages/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/workspaces/[id]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/workspaces/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/workspaces/[id]/sessions/route.js +1 -1
- package/.next/standalone/.next/server/app/api/workspaces/[id]/sessions/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/workspaces/route.js +2 -2
- package/.next/standalone/.next/server/app/api/workspaces/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/cortex.html +1 -1
- package/.next/standalone/.next/server/app/cortex.rsc +3 -3
- package/.next/standalone/.next/server/app/cortex.segments/!KGRlc2t0b3Ap/cortex/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/cortex.segments/!KGRlc2t0b3Ap/cortex.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/cortex.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/cortex.segments/_full.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/cortex.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/cortex.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/cortex.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login.html +1 -1
- package/.next/standalone/.next/server/app/login.rsc +2 -2
- package/.next/standalone/.next/server/app/login.segments/_full.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/login.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/login.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/login.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/login.segments/login/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/login.segments/login.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/m/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/m/projects/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/m/projects.html +1 -1
- package/.next/standalone/.next/server/app/m/projects.rsc +2 -2
- package/.next/standalone/.next/server/app/m/projects.segments/_full.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/m/projects.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/m/projects.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/m/projects.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/m/projects.segments/m/projects/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/m/projects.segments/m/projects.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/m/projects.segments/m.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/m/sessions/[id]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/m/sessions/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/m/sessions/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/m/sessions.html +1 -1
- package/.next/standalone/.next/server/app/m/sessions.rsc +2 -2
- package/.next/standalone/.next/server/app/m/sessions.segments/_full.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/m/sessions.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/m/sessions.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/m/sessions.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/m/sessions.segments/m/sessions/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/m/sessions.segments/m/sessions.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/m/sessions.segments/m.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/m/settings/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/m/settings.html +1 -1
- package/.next/standalone/.next/server/app/m/settings.rsc +2 -2
- package/.next/standalone/.next/server/app/m/settings.segments/_full.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/m/settings.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/m/settings.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/m/settings.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/m/settings.segments/m/settings/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/m/settings.segments/m/settings.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/m/settings.segments/m.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/m/terminal/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/m/terminal.html +1 -1
- package/.next/standalone/.next/server/app/m/terminal.rsc +3 -3
- package/.next/standalone/.next/server/app/m/terminal.segments/_full.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/m/terminal.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/m/terminal.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/m/terminal.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/m/terminal.segments/m/terminal/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/m/terminal.segments/m/terminal.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/m/terminal.segments/m.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/m.html +1 -1
- package/.next/standalone/.next/server/app/m.rsc +2 -2
- package/.next/standalone/.next/server/app/m.segments/_full.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/m.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/m.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/m.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/m.segments/m/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/m.segments/m.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/network.html +1 -1
- package/.next/standalone/.next/server/app/network.rsc +2 -2
- package/.next/standalone/.next/server/app/network.segments/!KGRlc2t0b3Ap/network/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/network.segments/!KGRlc2t0b3Ap/network.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/network.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/network.segments/_full.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/network.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/network.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/network.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/projects.html +1 -1
- package/.next/standalone/.next/server/app/projects.rsc +2 -2
- package/.next/standalone/.next/server/app/projects.segments/!KGRlc2t0b3Ap/projects/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/projects.segments/!KGRlc2t0b3Ap/projects.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/projects.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/projects.segments/_full.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/projects.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/projects.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/projects.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/sessions.html +1 -1
- package/.next/standalone/.next/server/app/sessions.rsc +2 -2
- package/.next/standalone/.next/server/app/sessions.segments/!KGRlc2t0b3Ap/sessions/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/sessions.segments/!KGRlc2t0b3Ap/sessions.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/sessions.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/sessions.segments/_full.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/sessions.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/sessions.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/sessions.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/settings.html +1 -1
- package/.next/standalone/.next/server/app/settings.rsc +2 -2
- package/.next/standalone/.next/server/app/settings.segments/!KGRlc2t0b3Ap/settings/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/settings.segments/!KGRlc2t0b3Ap/settings.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/settings.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/settings.segments/_full.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/settings.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/settings.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/terminal.html +1 -1
- package/.next/standalone/.next/server/app/terminal.rsc +3 -3
- package/.next/standalone/.next/server/app/terminal.segments/!KGRlc2t0b3Ap/terminal/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/terminal.segments/!KGRlc2t0b3Ap/terminal.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/terminal.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/terminal.segments/_full.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/terminal.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/terminal.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/terminal.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/vr/page/react-loadable-manifest.json +1 -1
- package/.next/standalone/.next/server/app/vr/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/vr.html +1 -1
- package/.next/standalone/.next/server/app/vr.rsc +3 -3
- package/.next/standalone/.next/server/app/vr.segments/_full.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/vr.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/vr.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/vr.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/vr.segments/vr/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/vr.segments/vr.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/workspaces.html +1 -1
- package/.next/standalone/.next/server/app/workspaces.rsc +2 -2
- package/.next/standalone/.next/server/app/workspaces.segments/!KGRlc2t0b3Ap/workspaces/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/workspaces.segments/!KGRlc2t0b3Ap/workspaces.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/workspaces.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/workspaces.segments/_full.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/workspaces.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/workspaces.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/workspaces.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app-paths-manifest.json +1 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__00e90fc6._.js +98 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__01ab8675._.js +98 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__03974f05._.js +98 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__bb331da9._.js → [root-of-the-server]__046c9b91._.js} +3 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__04ae6bf0._.js +98 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__056fa416._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ac4ea3f._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0b8e64cb._.js +98 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__d95165f0._.js → [root-of-the-server]__0facd39e._.js} +3 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__10bc76a3._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__9d68157b._.js → [root-of-the-server]__115f3934._.js} +3 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__11f155f1._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__160e7c73._.js +22 -33
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__91e23c96._.js → [root-of-the-server]__17a3b966._.js} +3 -3
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__277d9445._.js → [root-of-the-server]__17d3a2b2._.js} +3 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1a86c055._.js +98 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__20b5e9c4._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__28d6fbd8._.js +98 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__04f04898._.js → [root-of-the-server]__2a3f866b._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__a95bb38b._.js → [root-of-the-server]__316617e7._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__32ad8f71._.js +98 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__6fe5e6c8._.js → [root-of-the-server]__35457394._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__1f054c65._.js → [root-of-the-server]__35de78e6._.js} +3 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__3685ffcb._.js +98 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__614458b7._.js → [root-of-the-server]__38954988._.js} +3 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__426ad936._.js +106 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__4985c034._.js +98 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__5c6ce9ed._.js +98 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__5cebe58a._.js +98 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__5d5e4789._.js +98 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__65676930._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__67cab326._.js +58 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__698c6f01._.js +98 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__6c64af29._.js +131 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__73aed9f5._.js +98 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__ac84b704._.js → [root-of-the-server]__79b6a9bb._.js} +3 -3
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__e56abacf._.js → [root-of-the-server]__7db704c6._.js} +4 -4
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__812ca02b._.js +98 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__821f50fa._.js +98 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__8716b86e._.js +98 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__884ef754._.js +98 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__88cdbd68._.js +98 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__89d9aba9._.js +98 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__8d536cb5._.js +98 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__8df8c5d1._.js +98 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__2d7a454e._.js → [root-of-the-server]__8f2ccc41._.js} +3 -3
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__2a2c5fc5._.js → [root-of-the-server]__95c9d682._.js} +4 -4
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__9e5d7774._.js +98 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__cc6e2885._.js → [root-of-the-server]__9edcff87._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__a049dfc2._.js +98 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__a5b4bb9a._.js +98 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__929ea03a._.js → [root-of-the-server]__a83262a1._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__a9cd1240._.js +98 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__a9d7f822._.js +98 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__ad08c221._.js +98 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__ad585f2f._.js +98 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__afcb8f7d._.js +98 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__bc250d43._.js +98 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__bce2a6e7._.js +98 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__c011bf91._.js +98 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__c0ac2895._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__c130a00c._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__c37d6380._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__cae392eb._.js +98 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__cc2616bb._.js +3 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__d501fa9b._.js +98 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__d59c6c15._.js +98 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__d5c1db32._.js +98 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__d5d92527._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__dba60c86._.js +98 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__2384f98e._.js → [root-of-the-server]__de14b9ae._.js} +3 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__e10643d1._.js +98 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__00fdfbda._.js → [root-of-the-server]__e2a996e5._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__4d903941._.js → [root-of-the-server]__e3477417._.js} +3 -3
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__32dc5513._.js → [root-of-the-server]__e4db362e._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__49e42a3a._.js → [root-of-the-server]__e4e70b86._.js} +3 -3
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__ac39ecc7._.js → [root-of-the-server]__e54925af._.js} +3 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__e8edc5b0._.js +98 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__eafd040b._.js → [root-of-the-server]__eab4d83b._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__ead29015._.js +1 -1
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__194955d4._.js → [root-of-the-server]__f056fd83._.js} +3 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__f0e99572._.js +98 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__fe1e16d0._.js +98 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__ff9cd277._.js +98 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__ffaea2ce._.js +98 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_wizard_chart_route_actions_888e2ec1.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__2cffc362._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__f1050870._.js → [root-of-the-server]__47c97637._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__66aca5d4._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_17b946fd._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_2a1d79e7._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_5c3c4cfa._.js +7 -5
- package/.next/standalone/.next/server/chunks/ssr/_ba432382._.js +7 -5
- package/.next/standalone/.next/server/chunks/ssr/src_app_(desktop)_cortex_page_tsx_0f33d8b3._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_app_(desktop)_terminal_page_tsx_de5e8d85._.js +4 -4
- package/.next/standalone/.next/server/edge/chunks/[root-of-the-server]__90eeddae._.js +1 -1
- package/.next/standalone/.next/server/middleware-manifest.json +5 -5
- package/.next/standalone/.next/server/pages/404.html +1 -1
- package/.next/standalone/.next/server/pages/500.html +2 -2
- package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/static/chunks/0852575eb90c1e8d.js +85 -0
- package/.next/standalone/.next/static/chunks/{74d0ac0b1d0a1b79.js → 10b00b4f66102dcf.js} +1 -1
- package/.next/standalone/.next/static/chunks/{16eb77953dee9ea3.js → 19c71a8376c23c58.js} +1 -1
- package/.next/standalone/.next/static/chunks/2b769d1597e4fc1c.css +3 -0
- package/.next/standalone/.next/static/chunks/{3e91fc608659c524.js → 350271fe79509caf.js} +1 -1
- package/.next/standalone/.next/static/chunks/{70423c7afd8abf5f.js → 597847c22200c212.js} +1 -1
- package/.next/standalone/.next/static/chunks/{fb0abd1933b2b2e1.js → 7f6a14f1849fa94d.js} +1 -1
- package/.next/standalone/.next/static/chunks/{7ecd9bbb0ce4d68a.js → b7c8fe9b7275a84f.js} +1 -1
- package/.next/standalone/.next/static/chunks/{6245135a7afb8c7b.js → c9b10fc55516d142.js} +8 -6
- package/.next/standalone/.next/static/chunks/d0065f48eab94944.js +1 -0
- package/.next/standalone/.next/static/chunks/{180c1b9ff31b979f.js → f7b34c807badf95d.js} +8 -6
- package/.next/standalone/.spaces/cortex-context.md +50 -144
- package/.next/standalone/LICENSE +661 -661
- package/.next/standalone/NOTICE +5 -5
- package/.next/standalone/README.md +131 -131
- package/.next/standalone/bin/cortex-hook.js +79 -79
- package/.next/standalone/bin/cortex-hook.sh +62 -62
- package/.next/standalone/bin/cortex-learn-hook.js +138 -138
- package/.next/standalone/bin/cortex-mcp.js +60 -60
- package/.next/standalone/bin/cortex-pi-extension.ts +170 -170
- package/.next/standalone/bin/fix-standalone-externals.js +79 -79
- package/.next/standalone/bin/lib/auto-setup.js +110 -110
- package/.next/standalone/bin/mdns-service.js +171 -171
- package/.next/standalone/bin/postinstall.js +35 -35
- package/.next/standalone/bin/setup-admin.js +195 -195
- package/.next/standalone/bin/spaces-dev.js +247 -247
- package/.next/standalone/bin/spaces-install.js +660 -660
- package/.next/standalone/bin/spaces-postinstall.js +50 -50
- package/.next/standalone/bin/spaces-reset-totp.js +50 -50
- package/.next/standalone/bin/spaces-service.js +1046 -1046
- package/.next/standalone/bin/spaces-setup.js +253 -253
- package/.next/standalone/bin/spaces.js +808 -805
- package/.next/standalone/bin/ssh-auth-keys.sh +68 -68
- package/.next/standalone/bin/terminal-server.js +2819 -2781
- package/.next/standalone/cortex-hook-debug.log +57 -23
- package/.next/standalone/docker-compose.yml +28 -28
- package/.next/standalone/docs/architecture.md +387 -387
- package/.next/standalone/docs/cortex-integration-reference.md +268 -268
- package/.next/standalone/docs/cortex.md +293 -293
- package/.next/standalone/docs/getting-started.md +96 -96
- package/.next/standalone/docs/plans/2026-02-24-multi-agent-sessions-design.md +133 -133
- package/.next/standalone/docs/plans/2026-02-24-multi-agent-sessions-plan.md +959 -959
- package/.next/standalone/docs/plans/2026-03-02-security-audit.md +229 -229
- package/.next/standalone/docs/plans/2026-03-07-service-command-design.md +146 -146
- package/.next/standalone/docs/plans/2026-03-07-service-command-plan.md +254 -254
- package/.next/standalone/docs/server-install.md +564 -564
- package/.next/standalone/docs/social-card.html +150 -150
- package/.next/standalone/docs/superpowers/plans/2026-03-12-spaces-cortex.md +5270 -5270
- package/.next/standalone/docs/superpowers/plans/2026-03-13-cortex-wiring.md +1387 -1387
- package/.next/standalone/docs/superpowers/plans/2026-03-14-cortex-v2-entity-graph.md +1923 -1923
- package/.next/standalone/docs/superpowers/plans/2026-03-14-cortex-v2-knowledge-evolution.md +1113 -1113
- package/.next/standalone/docs/superpowers/plans/2026-03-15-cortex-v2-boundary-engine.md +853 -853
- package/.next/standalone/docs/superpowers/plans/2026-03-15-cortex-v2-context-engine.md +1274 -1274
- package/.next/standalone/docs/superpowers/plans/2026-03-15-cortex-v2-signal-ingestion.md +933 -933
- package/.next/standalone/docs/superpowers/plans/2026-03-16-cortex-lobes.md +1080 -1080
- package/.next/standalone/docs/superpowers/plans/2026-03-16-cortex-v2-gravity-system.md +768 -768
- package/.next/standalone/docs/superpowers/plans/2026-03-16-cortex-v2-ui.md +1108 -1108
- package/.next/standalone/docs/superpowers/plans/2026-03-18-cortex-ui-integration.md +1846 -1846
- package/.next/standalone/docs/superpowers/plans/2026-03-19-vr-phase1-shell.md +1639 -1639
- package/.next/standalone/docs/superpowers/plans/2026-03-27-dockview-pane-layout.md +98 -98
- package/.next/standalone/docs/superpowers/specs/2026-03-11-universe-view-design.md +320 -320
- package/.next/standalone/docs/superpowers/specs/2026-03-12-spaces-brain-design.md +720 -720
- package/.next/standalone/docs/superpowers/specs/2026-03-13-cortex-wiring-design.md +268 -268
- package/.next/standalone/docs/superpowers/specs/2026-03-14-cortex-v2-design.md +623 -623
- package/.next/standalone/docs/superpowers/specs/2026-03-16-cortex-lobes-design.md +263 -263
- package/.next/standalone/docs/superpowers/specs/2026-03-16-cortex-v2-ui-design.md +240 -240
- package/.next/standalone/docs/superpowers/specs/2026-03-16-pane-ux-design.md +77 -77
- package/.next/standalone/docs/superpowers/specs/2026-03-18-cortex-ui-integration-design.md +341 -341
- package/.next/standalone/docs/superpowers/specs/2026-03-19-vr-phase1-shell-design.md +288 -288
- package/.next/standalone/docs/superpowers/specs/2026-03-27-pane-diff-review-and-project-wizard-design.md +322 -322
- package/.next/standalone/docs/tiers.md +104 -104
- package/.next/standalone/eslint.config.mjs +18 -18
- package/.next/standalone/next.config.ts +20 -20
- package/.next/standalone/nginx.conf +53 -53
- package/.next/standalone/node_modules/@img/sharp-win32-x64/lib/sharp-win32-x64.node +0 -0
- package/.next/standalone/node_modules/@img/{sharp-linux-x64 → sharp-win32-x64}/package.json +39 -46
- package/.next/standalone/package-lock.json +14985 -14986
- package/.next/standalone/package.json +111 -111
- package/.next/standalone/postcss.config.mjs +7 -7
- package/.next/standalone/scripts/rebuild.cmd +65 -65
- package/.next/standalone/scripts/rebuild.sh +59 -59
- package/.next/standalone/server.js +1 -1
- package/.next/standalone/src/app/(desktop)/admin/analytics/page.tsx +266 -266
- package/.next/standalone/src/app/(desktop)/admin/users/page.tsx +399 -399
- package/.next/standalone/src/app/(desktop)/analytics/page.tsx +166 -166
- package/.next/standalone/src/app/(desktop)/cortex/page.tsx +81 -81
- package/.next/standalone/src/app/(desktop)/dashboard-client.tsx +56 -56
- package/.next/standalone/src/app/(desktop)/layout.tsx +18 -18
- package/.next/standalone/src/app/(desktop)/network/page.tsx +137 -137
- package/.next/standalone/src/app/(desktop)/page.tsx +17 -17
- package/.next/standalone/src/app/(desktop)/projects/page.tsx +68 -68
- package/.next/standalone/src/app/(desktop)/sessions/[id]/page.tsx +519 -519
- package/.next/standalone/src/app/(desktop)/sessions/page.tsx +145 -145
- package/.next/standalone/src/app/(desktop)/settings/page.tsx +446 -446
- package/.next/standalone/src/app/(desktop)/terminal/layout.tsx +7 -7
- package/.next/standalone/src/app/(desktop)/terminal/page.tsx +1330 -1291
- package/.next/standalone/src/app/(desktop)/terminal/pane/[id]/page.tsx +211 -211
- package/.next/standalone/src/app/(desktop)/terminal/remote/[nodeId]/[workspaceId]/page.tsx +252 -252
- package/.next/standalone/src/app/(desktop)/workspaces/page.tsx +12 -12
- package/.next/standalone/src/app/api/admin/analytics/route.ts +10 -10
- package/.next/standalone/src/app/api/admin/users/[id]/route.ts +20 -20
- package/.next/standalone/src/app/api/admin/users/route.ts +15 -15
- package/.next/standalone/src/app/api/analytics/overview/route.ts +80 -80
- package/.next/standalone/src/app/api/auth/login/route.ts +10 -10
- package/.next/standalone/src/app/api/auth/logout/route.ts +9 -9
- package/.next/standalone/src/app/api/auth/me/route.ts +22 -22
- package/.next/standalone/src/app/api/auth/totp/setup/route.ts +10 -10
- package/.next/standalone/src/app/api/auth/totp/status/route.ts +10 -10
- package/.next/standalone/src/app/api/auth/totp/verify/route.ts +10 -10
- package/.next/standalone/src/app/api/benchmark/lobes/route.ts +16 -16
- package/.next/standalone/src/app/api/benchmark/run/route.ts +113 -92
- package/.next/standalone/src/app/api/benchmark/runs/[id]/route.ts +26 -26
- package/.next/standalone/src/app/api/benchmark/runs/route.ts +16 -16
- package/.next/standalone/src/app/api/benchmark/status/route.ts +35 -35
- package/.next/standalone/src/app/api/bulk/route.ts +34 -34
- package/.next/standalone/src/app/api/chat/route.ts +85 -85
- package/.next/standalone/src/app/api/config/route.ts +30 -30
- package/.next/standalone/src/app/api/cortex/context/route.ts +78 -78
- package/.next/standalone/src/app/api/cortex/curation/assess/route.ts +27 -27
- package/.next/standalone/src/app/api/cortex/curation/publish/route.ts +23 -23
- package/.next/standalone/src/app/api/cortex/curation/refine/route.ts +23 -23
- package/.next/standalone/src/app/api/cortex/curation/review/route.ts +29 -29
- package/.next/standalone/src/app/api/cortex/curation/seed/route.ts +23 -23
- package/.next/standalone/src/app/api/cortex/export/route.ts +40 -40
- package/.next/standalone/src/app/api/cortex/federation/pending/route.ts +20 -20
- package/.next/standalone/src/app/api/cortex/federation/resolve/route.ts +43 -43
- package/.next/standalone/src/app/api/cortex/federation/search/route.ts +35 -35
- package/.next/standalone/src/app/api/cortex/federation/teach/route.ts +76 -76
- package/.next/standalone/src/app/api/cortex/graph/edges/route.ts +112 -112
- package/.next/standalone/src/app/api/cortex/graph/entities/[id]/route.ts +73 -73
- package/.next/standalone/src/app/api/cortex/graph/entities/route.ts +75 -75
- package/.next/standalone/src/app/api/cortex/graph/populate/route.ts +203 -203
- package/.next/standalone/src/app/api/cortex/import/route.ts +75 -75
- package/.next/standalone/src/app/api/cortex/import/status/route.ts +15 -15
- package/.next/standalone/src/app/api/cortex/ingest/bootstrap/route.ts +39 -39
- package/.next/standalone/src/app/api/cortex/ingest/status/route.ts +15 -15
- package/.next/standalone/src/app/api/cortex/knowledge/[id]/route.ts +91 -91
- package/.next/standalone/src/app/api/cortex/knowledge/route.ts +97 -97
- package/.next/standalone/src/app/api/cortex/lobes/[id]/route.ts +67 -67
- package/.next/standalone/src/app/api/cortex/lobes/route.ts +22 -22
- package/.next/standalone/src/app/api/cortex/lobes/share/route.ts +80 -80
- package/.next/standalone/src/app/api/cortex/marketplace/browse/route.ts +43 -43
- package/.next/standalone/src/app/api/cortex/marketplace/preview/route.ts +46 -46
- package/.next/standalone/src/app/api/cortex/mcp/call/route.ts +11 -11
- package/.next/standalone/src/app/api/cortex/mcp/tools/route.ts +8 -8
- package/.next/standalone/src/app/api/cortex/search/route.ts +57 -45
- package/.next/standalone/src/app/api/cortex/settings/route.ts +35 -35
- package/.next/standalone/src/app/api/cortex/status/route.ts +169 -169
- package/.next/standalone/src/app/api/cortex/timeline/route.ts +42 -42
- package/.next/standalone/src/app/api/cortex/usage/route.ts +31 -31
- package/.next/standalone/src/app/api/cortex/workspace/[id]/context/route.ts +41 -41
- package/.next/standalone/src/app/api/events/route.ts +40 -40
- package/.next/standalone/src/app/api/files/route.ts +187 -187
- package/.next/standalone/src/app/api/folders/route.ts +107 -97
- package/.next/standalone/src/app/api/network/connect-callback/route.ts +11 -11
- package/.next/standalone/src/app/api/network/connect-request/[id]/route.ts +11 -11
- package/.next/standalone/src/app/api/network/connect-request/route.ts +17 -17
- package/.next/standalone/src/app/api/network/discovered/route.ts +9 -9
- package/.next/standalone/src/app/api/network/handshake/route.ts +25 -25
- package/.next/standalone/src/app/api/network/health/route.ts +10 -10
- package/.next/standalone/src/app/api/network/identity/route.ts +15 -15
- package/.next/standalone/src/app/api/network/keys/[id]/route.ts +10 -10
- package/.next/standalone/src/app/api/network/keys/route.ts +15 -15
- package/.next/standalone/src/app/api/network/nodes/[id]/route.ts +15 -15
- package/.next/standalone/src/app/api/network/nodes/check/route.ts +9 -9
- package/.next/standalone/src/app/api/network/nodes/route.ts +15 -15
- package/.next/standalone/src/app/api/network/panes/[id]/route.ts +78 -62
- package/.next/standalone/src/app/api/network/panes/route.ts +61 -50
- package/.next/standalone/src/app/api/network/projects/route.ts +32 -25
- package/.next/standalone/src/app/api/network/proxy/[nodeId]/[...path]/route.ts +25 -25
- package/.next/standalone/src/app/api/network/search/route.ts +45 -38
- package/.next/standalone/src/app/api/network/sessions/[id]/messages/route.ts +43 -36
- package/.next/standalone/src/app/api/network/sessions/[id]/route.ts +41 -34
- package/.next/standalone/src/app/api/network/sessions/route.ts +50 -43
- package/.next/standalone/src/app/api/network/terminal/token/route.ts +10 -10
- package/.next/standalone/src/app/api/network/workspaces/[id]/route.ts +80 -71
- package/.next/standalone/src/app/api/network/workspaces/route.ts +87 -85
- package/.next/standalone/src/app/api/panes/[id]/diff/route.ts +121 -121
- package/.next/standalone/src/app/api/panes/[id]/route.ts +60 -60
- package/.next/standalone/src/app/api/panes/route.ts +39 -39
- package/.next/standalone/src/app/api/projects/route.ts +13 -13
- package/.next/standalone/src/app/api/proxy/models/[modelId]/[...path]/route.ts +80 -80
- package/.next/standalone/src/app/api/proxy/models/[modelId]/status/route.ts +33 -33
- package/.next/standalone/src/app/api/search/route.ts +47 -47
- package/.next/standalone/src/app/api/sessions/[id]/chat/route.ts +120 -120
- package/.next/standalone/src/app/api/sessions/[id]/messages/route.ts +34 -34
- package/.next/standalone/src/app/api/sessions/[id]/route.ts +73 -73
- package/.next/standalone/src/app/api/sessions/route.ts +64 -64
- package/.next/standalone/src/app/api/sync/route.ts +24 -24
- package/.next/standalone/src/app/api/tags/route.ts +35 -35
- package/.next/standalone/src/app/api/tier/route.ts +16 -16
- package/.next/standalone/src/app/api/updates/route.ts +65 -65
- package/.next/standalone/src/app/api/whisper/config/route.ts +50 -42
- package/.next/standalone/src/app/api/whisper/route.ts +91 -91
- package/.next/standalone/src/app/api/wizard/chart/route.ts +129 -0
- package/.next/standalone/src/app/api/wizard/chat/route.ts +113 -113
- package/.next/standalone/src/app/api/workspaces/[id]/context/[key]/route.ts +39 -39
- package/.next/standalone/src/app/api/workspaces/[id]/context/route.ts +28 -28
- package/.next/standalone/src/app/api/workspaces/[id]/messages/[msgId]/route.ts +17 -17
- package/.next/standalone/src/app/api/workspaces/[id]/messages/route.ts +39 -39
- package/.next/standalone/src/app/api/workspaces/[id]/route.ts +47 -47
- package/.next/standalone/src/app/api/workspaces/[id]/sessions/route.ts +62 -62
- package/.next/standalone/src/app/api/workspaces/route.ts +79 -79
- package/.next/standalone/src/app/globals.css +88 -88
- package/.next/standalone/src/app/layout.tsx +33 -33
- package/.next/standalone/src/app/login/layout.tsx +7 -7
- package/.next/standalone/src/app/login/page.tsx +315 -315
- package/.next/standalone/src/app/m/layout.tsx +16 -16
- package/.next/standalone/src/app/m/page.tsx +118 -118
- package/.next/standalone/src/app/m/projects/page.tsx +64 -64
- package/.next/standalone/src/app/m/sessions/[id]/page.tsx +168 -168
- package/.next/standalone/src/app/m/sessions/page.tsx +177 -177
- package/.next/standalone/src/app/m/settings/page.tsx +230 -230
- package/.next/standalone/src/app/m/terminal/page.tsx +413 -413
- package/.next/standalone/src/app/vr/page.tsx +21 -21
- package/.next/standalone/src/app/vr/vr-app.tsx +163 -163
- package/.next/standalone/src/app/vr/vr-controls.tsx +139 -139
- package/.next/standalone/src/app/vr/vr-door.tsx +82 -82
- package/.next/standalone/src/app/vr/vr-environment.tsx +71 -71
- package/.next/standalone/src/app/vr/vr-gaze.tsx +89 -89
- package/.next/standalone/src/app/vr/vr-layout.ts +49 -49
- package/.next/standalone/src/app/vr/vr-lobby.tsx +97 -97
- package/.next/standalone/src/app/vr/vr-pane.tsx +195 -195
- package/.next/standalone/src/app/vr/vr-room.tsx +79 -79
- package/.next/standalone/src/app/vr/vr-terminal.tsx +303 -303
- package/.next/standalone/src/components/auth/totp-gate.tsx +183 -183
- package/.next/standalone/src/components/bus/activity-panel.tsx +261 -261
- package/.next/standalone/src/components/common/color-picker.tsx +35 -35
- package/.next/standalone/src/components/common/dev-directory-picker.tsx +339 -339
- package/.next/standalone/src/components/common/folder-picker.tsx +200 -200
- package/.next/standalone/src/components/common/tag-picker.tsx +190 -190
- package/.next/standalone/src/components/common/workspace-picker.tsx +113 -113
- package/.next/standalone/src/components/cortex/benchmark-tab.tsx +894 -880
- package/.next/standalone/src/components/cortex/constants.ts +29 -29
- package/.next/standalone/src/components/cortex/cortex-dashboard.tsx +304 -304
- package/.next/standalone/src/components/cortex/cortex-indicator.tsx +44 -44
- package/.next/standalone/src/components/cortex/cortex-panel.tsx +140 -140
- package/.next/standalone/src/components/cortex/cortex-settings.tsx +280 -280
- package/.next/standalone/src/components/cortex/curation-tab.tsx +810 -810
- package/.next/standalone/src/components/cortex/entity-detail.tsx +101 -101
- package/.next/standalone/src/components/cortex/entity-graph.tsx +382 -382
- package/.next/standalone/src/components/cortex/import-dialog.tsx +212 -212
- package/.next/standalone/src/components/cortex/injection-badge.tsx +72 -72
- package/.next/standalone/src/components/cortex/knowledge-card.tsx +109 -109
- package/.next/standalone/src/components/cortex/knowledge-tab.tsx +158 -158
- package/.next/standalone/src/components/cortex/lobe-settings.tsx +215 -215
- package/.next/standalone/src/components/cortex/marketplace-card.tsx +126 -126
- package/.next/standalone/src/components/cortex/marketplace-tab.tsx +113 -113
- package/.next/standalone/src/components/dashboard/activity-chart.tsx +41 -41
- package/.next/standalone/src/components/dashboard/model-usage-chart.tsx +61 -61
- package/.next/standalone/src/components/dashboard/recent-sessions.tsx +68 -68
- package/.next/standalone/src/components/dashboard/stats-cards.tsx +36 -36
- package/.next/standalone/src/components/files/file-explorer.tsx +703 -703
- package/.next/standalone/src/components/layout/providers.tsx +38 -38
- package/.next/standalone/src/components/layout/sidebar.tsx +170 -170
- package/.next/standalone/src/components/layout/tier-provider.tsx +53 -53
- package/.next/standalone/src/components/layout/update-banner.tsx +92 -92
- package/.next/standalone/src/components/mobile/bottom-nav.tsx +46 -46
- package/.next/standalone/src/components/mobile/immersive-voice-button.tsx +123 -123
- package/.next/standalone/src/components/mobile/mobile-chat-input.tsx +244 -244
- package/.next/standalone/src/components/mobile/mobile-header.tsx +44 -44
- package/.next/standalone/src/components/mobile/mobile-session-card.tsx +56 -56
- package/.next/standalone/src/components/mobile/mobile-terminal-input.tsx +74 -74
- package/.next/standalone/src/components/mobile/mobile-terminal-pane.tsx +302 -302
- package/.next/standalone/src/components/mobile/mobile-terminal-toolbar.tsx +76 -76
- package/.next/standalone/src/components/mobile/pull-to-refresh.tsx +82 -82
- package/.next/standalone/src/components/mobile/voice-input.tsx +53 -53
- package/.next/standalone/src/components/network/api-key-list.tsx +190 -190
- package/.next/standalone/src/components/network/connection-requests.tsx +94 -94
- package/.next/standalone/src/components/network/node-add-dialog.tsx +131 -131
- package/.next/standalone/src/components/network/node-badge.tsx +26 -26
- package/.next/standalone/src/components/network/node-list.tsx +207 -207
- package/.next/standalone/src/components/network/node-selector.tsx +49 -49
- package/.next/standalone/src/components/sessions/session-filters.tsx +116 -116
- package/.next/standalone/src/components/sessions/session-list.tsx +485 -485
- package/.next/standalone/src/components/terminal/pane-diff-panel.tsx +179 -179
- package/.next/standalone/src/components/terminal/terminal-pane.tsx +1530 -1464
- package/.next/standalone/src/components/viewer/chat-input.tsx +275 -275
- package/.next/standalone/src/components/viewer/message-renderer.tsx +551 -551
- package/.next/standalone/src/components/wizard/chart-wizard.tsx +405 -0
- package/.next/standalone/src/components/wizard/project-wizard.tsx +153 -153
- package/.next/standalone/src/components/wizard/wizard-chat.tsx +99 -99
- package/.next/standalone/src/components/wizard/wizard-plan-summary.tsx +103 -103
- package/.next/standalone/src/components/wizard/wizard-review.tsx +225 -225
- package/.next/standalone/src/components/workspace/universe-cluster.tsx +131 -131
- package/.next/standalone/src/components/workspace/universe-orb.tsx +128 -128
- package/.next/standalone/src/components/workspace/universe-types.ts +22 -22
- package/.next/standalone/src/components/workspace/universe-utils.ts +11 -11
- package/.next/standalone/src/components/workspace/universe-view.tsx +397 -397
- package/.next/standalone/src/components/workspace/workspace-chooser.tsx +634 -634
- package/.next/standalone/src/hooks/use-benchmark.ts +72 -71
- package/.next/standalone/src/hooks/use-bus.ts +147 -147
- package/.next/standalone/src/hooks/use-idle-detection.ts +79 -79
- package/.next/standalone/src/hooks/use-network.ts +229 -229
- package/.next/standalone/src/hooks/use-sessions.ts +437 -437
- package/.next/standalone/src/hooks/use-speech-recognition.ts +114 -113
- package/.next/standalone/src/hooks/use-sse.ts +35 -35
- package/.next/standalone/src/hooks/use-tier.ts +39 -39
- package/.next/standalone/src/lib/agents.ts +97 -97
- package/.next/standalone/src/lib/aider/parser.ts +111 -111
- package/.next/standalone/src/lib/api.ts +19 -19
- package/.next/standalone/src/lib/auth.ts +47 -47
- package/.next/standalone/src/lib/claude/parser.ts +212 -212
- package/.next/standalone/src/lib/claude/stats.ts +204 -204
- package/.next/standalone/src/lib/codex/parser.test.ts +111 -111
- package/.next/standalone/src/lib/codex/parser.ts +287 -287
- package/.next/standalone/src/lib/config.ts +132 -132
- package/.next/standalone/src/lib/cortex/benchmark.ts +83 -67
- package/.next/standalone/src/lib/cortex/config.ts +42 -42
- package/.next/standalone/src/lib/cortex/debug.ts +10 -10
- package/.next/standalone/src/lib/cortex/distillation/usage-store.ts +18 -18
- package/.next/standalone/src/lib/cortex/graph/resolver.ts +10 -10
- package/.next/standalone/src/lib/cortex/graph/types.ts +22 -22
- package/.next/standalone/src/lib/cortex/index.ts +109 -56
- package/.next/standalone/src/lib/cortex/ingestion/bootstrap.ts +14 -14
- package/.next/standalone/src/lib/cortex/knowledge/compat.ts +14 -14
- package/.next/standalone/src/lib/cortex/knowledge/contradiction.ts +10 -10
- package/.next/standalone/src/lib/cortex/knowledge/types.ts +67 -67
- package/.next/standalone/src/lib/cortex/lobes/config.ts +16 -16
- package/.next/standalone/src/lib/cortex/lobes/resolver.ts +8 -8
- package/.next/standalone/src/lib/cortex/lobes/shares.ts +14 -14
- package/.next/standalone/src/lib/cortex/mcp/server.ts +12 -12
- package/.next/standalone/src/lib/cortex/portability/exporter.ts +6 -6
- package/.next/standalone/src/lib/cortex/portability/importer.ts +10 -10
- package/.next/standalone/src/lib/cortex/retrieval/context-engine.ts +10 -10
- package/.next/standalone/src/lib/cortex/types.ts +39 -39
- package/.next/standalone/src/lib/cost-calculator.ts +48 -48
- package/.next/standalone/src/lib/db/init.ts +71 -71
- package/.next/standalone/src/lib/db/queries.ts +740 -827
- package/.next/standalone/src/lib/db/schema.ts +206 -206
- package/.next/standalone/src/lib/events/sse.ts +36 -36
- package/.next/standalone/src/lib/forge/parser.ts +52 -52
- package/.next/standalone/src/lib/gemini/parser.ts +258 -258
- package/.next/standalone/src/lib/license.ts +56 -56
- package/.next/standalone/src/lib/pro.ts +31 -31
- package/.next/standalone/src/lib/shell-user.ts +101 -0
- package/.next/standalone/src/lib/sync/indexer.ts +504 -504
- package/.next/standalone/src/lib/sync/watcher.ts +64 -64
- package/.next/standalone/src/lib/teams.ts +31 -31
- package/.next/standalone/src/lib/telemetry.ts +75 -75
- package/.next/standalone/src/lib/terminal/server.ts +188 -188
- package/.next/standalone/src/lib/tier.ts +38 -38
- package/.next/standalone/src/lib/utils.ts +72 -72
- package/.next/standalone/src/lib/vms/manager.ts +121 -121
- package/.next/standalone/src/middleware.ts +133 -133
- package/.next/standalone/src/types/claude.ts +208 -208
- package/.next/standalone/src/types/network.ts +61 -61
- package/.next/standalone/tests/setup.ts +8 -8
- package/.next/standalone/tsconfig.json +34 -34
- package/.next/standalone/vitest.config.ts +24 -24
- package/LICENSE +661 -661
- package/README.md +131 -131
- package/bin/cortex-hook.js +79 -79
- package/bin/cortex-hook.sh +62 -62
- package/bin/cortex-learn-hook.js +138 -138
- package/bin/cortex-mcp.js +60 -60
- package/bin/cortex-pi-extension.ts +170 -170
- package/bin/fix-standalone-externals.js +79 -79
- package/bin/lib/auto-setup.js +110 -110
- package/bin/mdns-service.js +171 -171
- package/bin/postinstall.js +35 -35
- package/bin/setup-admin.js +195 -195
- package/bin/spaces-dev.js +247 -247
- package/bin/spaces-install.js +660 -660
- package/bin/spaces-postinstall.js +50 -50
- package/bin/spaces-reset-totp.js +50 -50
- package/bin/spaces-service.js +1046 -1046
- package/bin/spaces-setup.js +253 -253
- package/bin/spaces.js +808 -805
- package/bin/ssh-auth-keys.sh +68 -68
- package/bin/terminal-server.js +2819 -2781
- package/package.json +111 -111
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0903a426._.js +0 -98
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__09e8ccc9._.js +0 -98
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__11c684b1._.js +0 -98
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1572d4ef._.js +0 -98
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__186cd0bb._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__212760e6._.js +0 -98
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__228595ec._.js +0 -98
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__283c890f._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__2f300a68._.js +0 -98
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__2f452778._.js +0 -98
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__35f8e77e._.js +0 -98
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__379fc2e9._.js +0 -98
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__3b40d79f._.js +0 -98
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__3d3dca2b._.js +0 -98
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__4d5b78d2._.js +0 -98
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__54163e52._.js +0 -98
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__563c0817._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__5812f90a._.js +0 -98
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__5c5e87f5._.js +0 -98
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__60d15b16._.js +0 -98
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__69d315e5._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__71f29038._.js +0 -98
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__74084e07._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__7921aa80._.js +0 -98
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__7e077dd8._.js +0 -98
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__7ebc4280._.js +0 -131
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__857c60bb._.js +0 -98
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__874fe565._.js +0 -98
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__8e2171f7._.js +0 -98
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__95659b2d._.js +0 -98
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__9679b91e._.js +0 -98
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__a90729a1._.js +0 -98
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__ad4346fa._.js +0 -98
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__b0862d69._.js +0 -98
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__b43306ee._.js +0 -98
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__b689ff5e._.js +0 -106
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__ba87daaa._.js +0 -98
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__c0461005._.js +0 -98
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__c1deb5f3._.js +0 -98
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__c8a62f42._.js +0 -98
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__cabaac2b._.js +0 -98
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__cb027619._.js +0 -98
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__cf608218._.js +0 -98
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__cfc1290d._.js +0 -98
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__d0109b9b._.js +0 -98
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__d0125483._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__d048ee6b._.js +0 -98
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__d12644e7._.js +0 -98
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__e3cc946c._.js +0 -98
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__e6fd27f8._.js +0 -98
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__efb8251e._.js +0 -98
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__f44c6882._.js +0 -98
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__f85283de._.js +0 -98
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__feceb3e4._.js +0 -98
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__843070a6._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_e84a0c06._.js +0 -3
- package/.next/standalone/.next/static/chunks/470cade58d4eceeb.css +0 -3
- package/.next/standalone/.next/static/chunks/9d4164833c2c1fd6.js +0 -85
- package/.next/standalone/.next/static/chunks/f091f4bf8d80fd07.js +0 -1
- package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/README.md +0 -46
- package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/lib/glib-2.0/include/glibconfig.h +0 -221
- package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/lib/index.js +0 -1
- package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/lib/libvips-cpp.so.8.17.3 +0 -0
- package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/package.json +0 -42
- package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/README.md +0 -46
- package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/lib/glib-2.0/include/glibconfig.h +0 -221
- package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/lib/index.js +0 -1
- package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/lib/libvips-cpp.so.8.17.3 +0 -0
- package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/package.json +0 -42
- package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/versions.json +0 -30
- package/.next/standalone/node_modules/@img/sharp-linux-x64/lib/sharp-linux-x64.node +0 -0
- package/.next/standalone/node_modules/@img/sharp-linuxmusl-x64/lib/sharp-linuxmusl-x64.node +0 -0
- package/.next/standalone/node_modules/@img/sharp-linuxmusl-x64/package.json +0 -46
- /package/.next/standalone/.next/static/{5S4TviTCiNiTjf6KjXjBo → u1pHON3drz1mBi7owkbBP}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{5S4TviTCiNiTjf6KjXjBo → u1pHON3drz1mBi7owkbBP}/_clientMiddlewareManifest.json +0 -0
- /package/.next/standalone/.next/static/{5S4TviTCiNiTjf6KjXjBo → u1pHON3drz1mBi7owkbBP}/_ssgManifest.js +0 -0
- /package/.next/standalone/node_modules/@img/{sharp-libvips-linux-x64 → sharp-win32-x64}/versions.json +0 -0
|
@@ -1,720 +1,720 @@
|
|
|
1
|
-
# Spaces Cortex — Distributed Intelligence Network
|
|
2
|
-
|
|
3
|
-
**Date:** 2026-03-12
|
|
4
|
-
**Status:** Approved
|
|
5
|
-
**Feature Name:** Cortex
|
|
6
|
-
|
|
7
|
-
## Summary
|
|
8
|
-
|
|
9
|
-
A persistent, self-building knowledge system for Spaces that continuously ingests all AI agent conversations, extracts decisions, patterns, preferences, and error resolutions, stores them as vector embeddings in LanceDB, and automatically injects relevant context into every prompt via hooks. Agents get smarter over time because the Cortex remembers everything you've built, decided, and corrected — across all sessions, all agents, all projects.
|
|
10
|
-
|
|
11
|
-
In federated environments, Cortex nodes actively teach each other — propagating high-confidence knowledge across the network so every node benefits from every other node's experience. The result is a distributed intelligence network that grows smarter with every conversation, on every machine, across every team.
|
|
12
|
-
|
|
13
|
-
The Cortex operates across four knowledge layers (Personal, Workspace, Team, Federation), supports all agent types (Claude Code, Codex, Gemini, Aider), and integrates with Spaces' existing tier model (Community, Pro/Server, Teams, Federation).
|
|
14
|
-
|
|
15
|
-
## Tier Availability
|
|
16
|
-
|
|
17
|
-
Cortex is a **premium feature** available only on Teams and Federation tiers. It is not included in the open-source Community version.
|
|
18
|
-
|
|
19
|
-
- All Cortex API routes check tier before responding (return 403 on Community)
|
|
20
|
-
- All UI components use `useTier()` to conditionally render
|
|
21
|
-
- The `src/lib/cortex/` directory can be excluded from Community builds
|
|
22
|
-
- Federation features (query delegation, active propagation, sync) require the Federation tier specifically
|
|
23
|
-
- Teams tier gets: local Cortex (personal + workspace layers, ingestion, retrieval, MCP, import/export)
|
|
24
|
-
- Federation tier gets: everything in Teams + team layer, federation queries, Cortex-to-Cortex teaching, sync modes
|
|
25
|
-
|
|
26
|
-
## Design Principles
|
|
27
|
-
|
|
28
|
-
- **Zero config** — Cortex works the moment it's enabled. No API keys required (falls back to local embeddings). No manual curation needed.
|
|
29
|
-
- **Fully automatic** — All conversations are ingested passively. The Cortex decides what's worth remembering. Users never need to manually save knowledge.
|
|
30
|
-
- **Invisible when working, inspectable when curious** — The Cortex enhances every prompt silently. But every injection is visible (pane header badge), every knowledge unit is browsable (Cortex panel), and everything can be taught, corrected, or forgotten.
|
|
31
|
-
- **Privacy by default** — Personal knowledge never leaves your node. Workspace knowledge is shareable only if the workspace is collaborative. Team knowledge flows only between paired federation nodes.
|
|
32
|
-
- **Distributed intelligence** — In federated environments, Cortex nodes actively teach each other. High-confidence knowledge propagates across the network automatically. Every node makes every other node smarter.
|
|
33
|
-
|
|
34
|
-
## Architecture
|
|
35
|
-
|
|
36
|
-
### System Overview
|
|
37
|
-
|
|
38
|
-
```
|
|
39
|
-
Input (Conversation Stream)
|
|
40
|
-
│ Claude Code JSONL, Codex, Gemini, Aider sessions, terminal output
|
|
41
|
-
▼
|
|
42
|
-
Ingestion Pipeline
|
|
43
|
-
│ Tier 1: Fast Pass (heuristic, ~10ms) → immediate chunks
|
|
44
|
-
│ Tier 2: Embedding (~50ms) → vectorize and store in LanceDB
|
|
45
|
-
│ Tier 3: Distillation (async) → LLM extracts decisions, patterns, preferences
|
|
46
|
-
▼
|
|
47
|
-
Storage (LanceDB)
|
|
48
|
-
│ Personal layer: ~/.spaces/cortex/personal/
|
|
49
|
-
│ Workspace layer: ~/.spaces/cortex/workspace/{id}/
|
|
50
|
-
│ Team layer: ~/.spaces/cortex/team/ (cache from federation queries)
|
|
51
|
-
▼
|
|
52
|
-
Retrieval & Injection
|
|
53
|
-
│ Hook injection: automatic, every prompt, <200ms
|
|
54
|
-
│ MCP tool: agent-driven deep queries
|
|
55
|
-
│ Federation query: transparent delegation to remote nodes
|
|
56
|
-
▼
|
|
57
|
-
Agent receives prompt + relevant Cortex context
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
### Knowledge Layers
|
|
61
|
-
|
|
62
|
-
Four layers, organized from most specific to most general:
|
|
63
|
-
|
|
64
|
-
| Layer | Scope | Privacy | Storage | Examples |
|
|
65
|
-
|-------|-------|---------|---------|----------|
|
|
66
|
-
| **Personal** | Your preferences and style | Never shared | `~/.spaces/cortex/personal/` | "Prefers Zod", "No ORMs", "Terse output" |
|
|
67
|
-
| **Workspace** | Project-specific knowledge | Shareable if workspace is collaborative | `~/.spaces/cortex/workspace/{id}/` | "Auth uses JWT", "DB schema v3", "Bug #247 fix" |
|
|
68
|
-
| **Team** | Shared conventions | Flows between federation nodes | `~/.spaces/cortex/team/` (local cache) | "API uses /v2/ prefix", "All endpoints return {data, error}" |
|
|
69
|
-
| **Federation** | Org-wide patterns | Query delegation across nodes | Not stored locally — queried on demand | Cross-team patterns, org standards |
|
|
70
|
-
|
|
71
|
-
On every prompt, the Cortex searches: Personal → Workspace → Team → Federation. Most specific wins. Results merged by relevance score.
|
|
72
|
-
|
|
73
|
-
## Ingestion Pipeline
|
|
74
|
-
|
|
75
|
-
### Tier 1: Fast Pass (immediate, heuristic)
|
|
76
|
-
|
|
77
|
-
Runs synchronously as messages are indexed. No LLM calls, no API calls. Pure text processing at ~10ms per message.
|
|
78
|
-
|
|
79
|
-
**Extractors:**
|
|
80
|
-
|
|
81
|
-
- **Message chunking** — Split conversations into semantic chunks at turn boundaries, topic shifts, and tool call boundaries. Each chunk gets metadata: session ID, workspace ID, agent type, timestamp, project path.
|
|
82
|
-
- **Code block extraction** — Pull fenced code blocks as separate chunks. Tag with language, file path (from nearby context), and whether user-provided or agent-generated.
|
|
83
|
-
- **File reference detection** — Regex scan for file paths. Links chunks to the files they discuss.
|
|
84
|
-
- **Error/fix pair detection** — Detect "error → investigation → fix" patterns. Heuristic: error messages followed by successful resolution within the same session.
|
|
85
|
-
- **Command extraction** — Terminal commands with context: what was run, why, what happened.
|
|
86
|
-
- **Conversation summary markers** — When a session ends or reaches a natural break, generate a session-level summary chunk capturing the overall arc.
|
|
87
|
-
- **Git context linking** — Capture git branch, commit hashes, and diff stats. Links knowledge to exact code state.
|
|
88
|
-
- **Tool call analysis** — Parse tool_use/tool_result pairs. File reads = what code was examined. Edits = what changed and why. Bash commands = what was tested.
|
|
89
|
-
|
|
90
|
-
### Tier 2: Embedding (near-realtime)
|
|
91
|
-
|
|
92
|
-
Runs async but fast. Vectorizes chunks from Tier 1:
|
|
93
|
-
|
|
94
|
-
- **Model selection** — Check for API keys in order: Voyage AI → OpenAI → Anthropic → local (all-MiniLM-L6-v2 via ONNX Runtime). Best available wins. Default to most advanced available.
|
|
95
|
-
- **Batch embedding** — Queue chunks, embed in batches (50-100 per API call).
|
|
96
|
-
- **LanceDB storage** — Store vector with full metadata (see schema below).
|
|
97
|
-
- **Deduplication** — Check cosine similarity against recent entries. >0.95 similarity = skip.
|
|
98
|
-
|
|
99
|
-
### Tier 3: Distillation (background, LLM-powered)
|
|
100
|
-
|
|
101
|
-
Runs during idle time. Produces high-quality knowledge units from raw chunks:
|
|
102
|
-
|
|
103
|
-
- **Decision extraction** — "We decided to use X because Y." Structured: decision, rationale, alternatives considered, date.
|
|
104
|
-
- **Pattern recognition** — "This project always does X when Y." Recurring approaches across sessions.
|
|
105
|
-
- **Preference learning** — "User corrected: don't do X, do Y instead." Corrections become personal-layer knowledge.
|
|
106
|
-
- **Error wisdom** — "When error X happens, the fix is Y." Distilled from error/fix pairs.
|
|
107
|
-
- **Staleness scoring** — Each unit gets a freshness score based on source file modification times.
|
|
108
|
-
|
|
109
|
-
The distiller uses whatever LLM is available (Claude API, or delegates to a running Claude Code session). Processes batches of recent chunks, produces structured knowledge units, embeds them, stores with `type: 'distilled'` and higher base confidence.
|
|
110
|
-
|
|
111
|
-
### Bootstrap Ingestion
|
|
112
|
-
|
|
113
|
-
On first enable (or when linking a new workspace to a project), bulk-processes all existing sessions:
|
|
114
|
-
|
|
115
|
-
1. Scan `~/.claude/projects/`, `~/.codex/`, `~/.gemini/`, `.aider.chat.history.md` for all existing sessions
|
|
116
|
-
2. Map sessions to workspaces by project path
|
|
117
|
-
3. Run Tier 1 (fast pass) on all messages
|
|
118
|
-
4. Run Tier 2 (embedding) in batches
|
|
119
|
-
5. Queue Tier 3 (distillation) starting from most recent, working backward
|
|
120
|
-
6. Ingest subagent transcripts (full conversations in `{sessionId}/subagents/`)
|
|
121
|
-
7. Show progress in UI: "Ingesting 172MB across 20 projects... 45%"
|
|
122
|
-
|
|
123
|
-
Bootstrap is incremental — if interrupted, picks up where it left off using sync state tracking.
|
|
124
|
-
|
|
125
|
-
## Knowledge Classification
|
|
126
|
-
|
|
127
|
-
### Knowledge Unit Types
|
|
128
|
-
|
|
129
|
-
| Type | Source | Confidence Base | Staleness Half-life | Example |
|
|
130
|
-
|------|--------|-----------------|---------------------|---------|
|
|
131
|
-
| `decision` | Distillation | 0.8 | 180 days | "Using JWT with refresh rotation for auth" |
|
|
132
|
-
| `pattern` | Distillation + repetition | 0.8 | 90 days | "API routes validate with Zod middleware" |
|
|
133
|
-
| `preference` | User corrections | 0.95 | 180 days | "Don't mock DB in integration tests" |
|
|
134
|
-
| `error_fix` | Error/fix detection | 0.8 | 90 days | "ECONNRESET → exponential backoff with jitter" |
|
|
135
|
-
| `context` | Session summaries | 0.6 | 30 days | "Migrating from v1 to v2 API" |
|
|
136
|
-
| `code_pattern` | Code block analysis | 0.7 | 60 days | "Components use forwardRef + displayName" |
|
|
137
|
-
| `command` | Command extraction | 0.6 | 30 days | "Deploy: npm run deploy:staging" |
|
|
138
|
-
| `conversation` | Raw chunking | 0.4 | 14 days | Fallback: raw conversation segment |
|
|
139
|
-
| `summary` | Session summarization | 0.6 | 60 days | "Session built the Cortex ingestion pipeline" |
|
|
140
|
-
|
|
141
|
-
### Storage Schema (LanceDB)
|
|
142
|
-
|
|
143
|
-
```
|
|
144
|
-
Table: knowledge
|
|
145
|
-
├── id: string (uuid)
|
|
146
|
-
├── vector: float32[dimensions]
|
|
147
|
-
├── text: string
|
|
148
|
-
├── type: string // decision/pattern/preference/error_fix/context/code_pattern/command/conversation/summary
|
|
149
|
-
├── layer: string // personal/workspace/team
|
|
150
|
-
├── workspace_id: number | null
|
|
151
|
-
├── session_id: string | null
|
|
152
|
-
├── agent_type: string // claude/codex/gemini/aider
|
|
153
|
-
├── project_path: string | null
|
|
154
|
-
├── file_refs: string[]
|
|
155
|
-
├── confidence: float32 // 0.0–1.0
|
|
156
|
-
├── created: timestamp
|
|
157
|
-
├── source_timestamp: timestamp
|
|
158
|
-
├── stale_score: float32 // 0.0–1.0
|
|
159
|
-
├── access_count: number
|
|
160
|
-
├── last_accessed: timestamp | null
|
|
161
|
-
└── metadata: json
|
|
162
|
-
```
|
|
163
|
-
|
|
164
|
-
### Confidence Scoring
|
|
165
|
-
|
|
166
|
-
- **Source quality:** Distilled = 0.8 base, raw chunks = 0.4
|
|
167
|
-
- **Repetition:** Same pattern across 3+ sessions → +0.1 per occurrence (cap 0.95)
|
|
168
|
-
- **Recency:** Last 7 days → +0.1 boost
|
|
169
|
-
- **User validation:** Explicit `cortex_teach` → 0.95
|
|
170
|
-
- **Contradiction:** Newer knowledge contradicts older → older gets confidence reduced, gains `superseded_by` pointer
|
|
171
|
-
|
|
172
|
-
### Staleness Detection
|
|
173
|
-
|
|
174
|
-
- **File modification tracking** — Referenced files heavily modified since knowledge created → increase `stale_score`
|
|
175
|
-
- **Git-aware** — Referenced branch merged or deleted → mark potentially stale
|
|
176
|
-
- **Contradiction from newer sessions** — Recent session shows different approach → downrank older
|
|
177
|
-
- **Time decay** — Configurable half-lives per knowledge type (see table above)
|
|
178
|
-
|
|
179
|
-
**Effective retrieval score:** `similarity × confidence × (1 - stale_score) × recency_boost`
|
|
180
|
-
|
|
181
|
-
## Retrieval & Injection
|
|
182
|
-
|
|
183
|
-
### Path 1: Hook Injection (automatic, every prompt)
|
|
184
|
-
|
|
185
|
-
Target latency: <200ms.
|
|
186
|
-
|
|
187
|
-
1. **Extract query signal** — Parse prompt for intent, keywords, file paths, error messages, concept terms
|
|
188
|
-
2. **Multi-layer search** — Query LanceDB across layers with priority weighting:
|
|
189
|
-
- Personal (weight 1.0)
|
|
190
|
-
- Active workspace (weight 0.9)
|
|
191
|
-
- Other workspaces (weight 0.5, if relevant)
|
|
192
|
-
- Team via federation (weight 0.7, if available)
|
|
193
|
-
3. **Reranking** — Score by: vector similarity, recency, confidence, source quality, staleness. Take top-k (default: 5).
|
|
194
|
-
4. **Token budget** — Cap at ~2000 tokens (configurable). Summarize or truncate lower-ranked results if over budget.
|
|
195
|
-
5. **Inject** — Append `<cortex-context>` block to prompt:
|
|
196
|
-
|
|
197
|
-
```
|
|
198
|
-
<cortex-context>
|
|
199
|
-
Relevant context from your workspace history:
|
|
200
|
-
|
|
201
|
-
[Decision] 2026-03-10: Auth uses JWT with httpOnly cookies, refresh token rotation.
|
|
202
|
-
Source: session abc123, workspace "Backend API"
|
|
203
|
-
|
|
204
|
-
[Pattern] This project uses Zod schemas at API boundaries, validated in middleware.
|
|
205
|
-
Source: 4 sessions over 2 weeks, confidence: 0.92
|
|
206
|
-
|
|
207
|
-
[Error Fix] "ECONNRESET on WebSocket reconnect" — Fixed by adding exponential backoff
|
|
208
|
-
with jitter in the reconnect handler. See session def456.
|
|
209
|
-
|
|
210
|
-
[Preference] You previously corrected: "Don't mock the database in integration tests."
|
|
211
|
-
</cortex-context>
|
|
212
|
-
```
|
|
213
|
-
|
|
214
|
-
For Claude Code: uses the `user-prompt-submit` hook.
|
|
215
|
-
|
|
216
|
-
For other agents (Codex, Gemini, Aider): terminal intercept approach — watches PTY input stream and injects context via wrapper script that prepends cortex context to stdin.
|
|
217
|
-
|
|
218
|
-
### Path 2: MCP Tool (agent-driven, on-demand)
|
|
219
|
-
|
|
220
|
-
The Cortex exposes an MCP server with these tools:
|
|
221
|
-
|
|
222
|
-
| Tool | Purpose | Key Params |
|
|
223
|
-
|------|---------|------------|
|
|
224
|
-
| `cortex_search` | Semantic search across layers | query, layers, types, workspace_id, time_range, min_confidence, limit |
|
|
225
|
-
| `cortex_recall` | Retrieve specific unit by ID or exact match | id, exact |
|
|
226
|
-
| `cortex_context` | Full context for a workspace | workspace_id, depth (brief/full) |
|
|
227
|
-
| `cortex_similar` | Find analogous past experiences | input, type (error/code/problem), limit |
|
|
228
|
-
| `cortex_timeline` | Chronological decision/change history | workspace_id, project_path, limit |
|
|
229
|
-
| `cortex_teach` | Explicitly store knowledge (confidence 0.95) | text, type, layer, workspace_id |
|
|
230
|
-
| `cortex_forget` | Remove or downrank knowledge | id, query, action (delete/downrank) |
|
|
231
|
-
| `cortex_status` | Cortex health and stats | — |
|
|
232
|
-
| `cortex_export` | Export cortex to .cortexpack | scope, workspace_id, include_embeddings, format |
|
|
233
|
-
| `cortex_import` | Import .cortexpack archive | path, target_layer, merge_strategy, re_embed |
|
|
234
|
-
|
|
235
|
-
### Path 3: Federation Query (transparent)
|
|
236
|
-
|
|
237
|
-
When team-layer results are needed:
|
|
238
|
-
|
|
239
|
-
1. Local Cortex constructs search request (query embedding + filters)
|
|
240
|
-
2. Request goes to `GET /api/network/proxy/{nodeId}/api/cortex/search`
|
|
241
|
-
3. Remote node runs search locally, returns results
|
|
242
|
-
4. Local Cortex merges remote results with local by relevance score
|
|
243
|
-
5. All connected nodes queried in parallel, configurable timeout (default 500ms)
|
|
244
|
-
|
|
245
|
-
## Federation
|
|
246
|
-
|
|
247
|
-
### Three Sync Modes (per-node-pair setting)
|
|
248
|
-
|
|
249
|
-
| Mode | Behavior | Best For |
|
|
250
|
-
|------|----------|----------|
|
|
251
|
-
| **Query-only** (default) | No data replication. Query remote nodes on demand. | Privacy-conscious teams, intermittent connectivity |
|
|
252
|
-
| **Background sync** | Periodically pull team-layer knowledge and cache locally. Fall back to live query if cache stale. | Better latency, offline capability |
|
|
253
|
-
| **Real-time sync** | Continuous replication via WebSocket. Knowledge appears on all nodes within seconds. | Tight teams, same codebase, full trust |
|
|
254
|
-
|
|
255
|
-
Background sync: polls connected nodes every N minutes (default 5), imports new knowledge units using merge-by-similarity.
|
|
256
|
-
|
|
257
|
-
Real-time sync: persistent WebSocket to `/api/cortex/federation/stream`. New team-layer units pushed as created.
|
|
258
|
-
|
|
259
|
-
### Privacy Model
|
|
260
|
-
|
|
261
|
-
- **Personal layer** — Never leaves your node. Not queryable by remote nodes.
|
|
262
|
-
- **Workspace layer** — Queryable by remote nodes only if the workspace has `collaboration: true`.
|
|
263
|
-
- **Team layer** — Always queryable by paired federation nodes. This is the shared knowledge pool.
|
|
264
|
-
|
|
265
|
-
## Import/Export (Portable Knowledge)
|
|
266
|
-
|
|
267
|
-
### .cortexpack Format
|
|
268
|
-
|
|
269
|
-
```
|
|
270
|
-
my-project.cortexpack (tar.gz)
|
|
271
|
-
├── manifest.json — version, source node, export date, stats
|
|
272
|
-
├── knowledge.jsonl — knowledge units as JSON lines
|
|
273
|
-
├── embeddings.lance/ — LanceDB table snapshot (optional, large)
|
|
274
|
-
└── sessions.json — source session metadata for provenance
|
|
275
|
-
```
|
|
276
|
-
|
|
277
|
-
Without embeddings: ~5-50MB typical. With embeddings: larger but skips re-embedding on import.
|
|
278
|
-
|
|
279
|
-
### Export Options
|
|
280
|
-
|
|
281
|
-
- **Scope:** full, workspace, personal, or custom (filtered by type/time)
|
|
282
|
-
- **Include embeddings:** optional (skip re-embedding on import vs. smaller file)
|
|
283
|
-
|
|
284
|
-
### Import Options
|
|
285
|
-
|
|
286
|
-
- **Target layer:** where to put imported knowledge
|
|
287
|
-
- **Merge strategy:** append (add all), merge (deduplicate by similarity, keep highest confidence), replace (wipe then import)
|
|
288
|
-
- **Re-embed:** regenerate embeddings with local model if embeddings not included
|
|
289
|
-
|
|
290
|
-
### Use Cases
|
|
291
|
-
|
|
292
|
-
- **Cloud ↔ Local sync** — Export from cloud VM, import locally (or vice versa)
|
|
293
|
-
- **Onboarding** — Senior dev exports workspace cortex, new team member imports. Instant ramp-up.
|
|
294
|
-
- **Project handoff** — Export cortex with codebase. Next developer gets the reasoning, not just the code.
|
|
295
|
-
- **Backup/restore** — Periodic export as backup
|
|
296
|
-
- **Machine migration** — Moving to new laptop? Export all cortexes, import on new machine.
|
|
297
|
-
|
|
298
|
-
## REST API
|
|
299
|
-
|
|
300
|
-
```
|
|
301
|
-
# Cortex status and health
|
|
302
|
-
GET /api/cortex/status
|
|
303
|
-
|
|
304
|
-
# Knowledge CRUD
|
|
305
|
-
GET /api/cortex/search?q=...&layer=...&type=...
|
|
306
|
-
GET /api/cortex/knowledge/:id
|
|
307
|
-
POST /api/cortex/knowledge — create (cortex_teach)
|
|
308
|
-
PATCH /api/cortex/knowledge/:id — update confidence/layer/metadata
|
|
309
|
-
DELETE /api/cortex/knowledge/:id — remove (cortex_forget)
|
|
310
|
-
|
|
311
|
-
# Workspace context
|
|
312
|
-
GET /api/cortex/workspace/:id/context
|
|
313
|
-
GET /api/cortex/timeline?workspace_id=...
|
|
314
|
-
|
|
315
|
-
# Bootstrap
|
|
316
|
-
POST /api/cortex/ingest/bootstrap
|
|
317
|
-
GET /api/cortex/ingest/status
|
|
318
|
-
|
|
319
|
-
# Import/Export
|
|
320
|
-
POST /api/cortex/export — body: {scope, workspace_id?, include_embeddings?}
|
|
321
|
-
POST /api/cortex/import — multipart .cortexpack upload
|
|
322
|
-
GET /api/cortex/import/status
|
|
323
|
-
|
|
324
|
-
# Settings
|
|
325
|
-
GET /api/cortex/settings
|
|
326
|
-
POST /api/cortex/settings
|
|
327
|
-
|
|
328
|
-
# Federation (served to remote nodes)
|
|
329
|
-
GET /api/cortex/federation/search — remote search endpoint
|
|
330
|
-
WS /api/cortex/federation/stream — real-time sync WebSocket
|
|
331
|
-
|
|
332
|
-
# Active Knowledge Propagation
|
|
333
|
-
POST /api/cortex/federation/teach — receive propagated knowledge from remote node
|
|
334
|
-
GET /api/cortex/federation/pending — knowledge pending review (contradictions)
|
|
335
|
-
POST /api/cortex/federation/resolve — resolve contradiction
|
|
336
|
-
```
|
|
337
|
-
|
|
338
|
-
## UI Integration
|
|
339
|
-
|
|
340
|
-
### 1. Top Bar — CortexStatus Indicator
|
|
341
|
-
|
|
342
|
-
Small purple "Cortex" badge in the top bar, always visible. Shows knowledge unit count. Pulses gently during active ingestion or retrieval. Colors: green (healthy), amber (ingesting), red (error). Click to open Cortex panel.
|
|
343
|
-
|
|
344
|
-
### 2. CortexPanel — Slide-out Knowledge Explorer
|
|
345
|
-
|
|
346
|
-
Opens from the right when Cortex indicator is clicked:
|
|
347
|
-
|
|
348
|
-
- **Search bar** — Semantic search across all knowledge
|
|
349
|
-
- **Stats row** — Total units, distilled count, average confidence
|
|
350
|
-
- **Layer tabs** — Personal / Workspace / Team
|
|
351
|
-
- **Knowledge list** — Each unit shows: type badge (color-coded), text, confidence, source, age
|
|
352
|
-
- **Actions** — Teach Cortex, Export, Settings
|
|
353
|
-
|
|
354
|
-
Knowledge type colors:
|
|
355
|
-
- Decision: blue (#60a5fa)
|
|
356
|
-
- Preference: pink (#f472b6)
|
|
357
|
-
- Pattern: green (#34d399)
|
|
358
|
-
- Error Fix: amber (#fbbf24)
|
|
359
|
-
- Context: gray (#94a3b8)
|
|
360
|
-
|
|
361
|
-
### 3. Pane Header — CortexActivity Badge
|
|
362
|
-
|
|
363
|
-
Each terminal pane header shows a small badge when the Cortex injected context into the last prompt: "3 items" with a purple dot. Click to see exactly what context was provided. Builds trust through transparency.
|
|
364
|
-
|
|
365
|
-
### 4. Settings Page — CortexConfiguration
|
|
366
|
-
|
|
367
|
-
Settings → Cortex section:
|
|
368
|
-
- Enable/disable toggle
|
|
369
|
-
- Embedding provider (auto-detected, with override)
|
|
370
|
-
- Injection token budget (default 2000)
|
|
371
|
-
- LLM distillation toggle
|
|
372
|
-
- Federation sync mode dropdown (Query Only / Background Sync / Real-time Sync)
|
|
373
|
-
- Bootstrap ingestion trigger with progress bar
|
|
374
|
-
|
|
375
|
-
## Configuration Defaults
|
|
376
|
-
|
|
377
|
-
```json
|
|
378
|
-
{
|
|
379
|
-
"enabled": true,
|
|
380
|
-
"embedding": {
|
|
381
|
-
"provider": "auto",
|
|
382
|
-
"model": null,
|
|
383
|
-
"fallback": "local"
|
|
384
|
-
},
|
|
385
|
-
"injection": {
|
|
386
|
-
"enabled": true,
|
|
387
|
-
"max_tokens": 2000,
|
|
388
|
-
"max_results": 5,
|
|
389
|
-
"min_confidence": 0.3
|
|
390
|
-
},
|
|
391
|
-
"ingestion": {
|
|
392
|
-
"auto_ingest": true,
|
|
393
|
-
"distillation": true,
|
|
394
|
-
"distillation_model": "auto"
|
|
395
|
-
},
|
|
396
|
-
"layers": {
|
|
397
|
-
"personal": true,
|
|
398
|
-
"workspace": true,
|
|
399
|
-
"team": true
|
|
400
|
-
},
|
|
401
|
-
"staleness": {
|
|
402
|
-
"decision_halflife_days": 180,
|
|
403
|
-
"pattern_halflife_days": 90,
|
|
404
|
-
"context_halflife_days": 30,
|
|
405
|
-
"conversation_halflife_days": 14
|
|
406
|
-
},
|
|
407
|
-
"federation": {
|
|
408
|
-
"sync_mode": "query-only",
|
|
409
|
-
"sync_interval_minutes": 5,
|
|
410
|
-
"query_timeout_ms": 500
|
|
411
|
-
}
|
|
412
|
-
}
|
|
413
|
-
```
|
|
414
|
-
|
|
415
|
-
## File Structure
|
|
416
|
-
|
|
417
|
-
```
|
|
418
|
-
src/lib/cortex/
|
|
419
|
-
├── index.ts — Cortex singleton, initialization
|
|
420
|
-
├── config.ts — Cortex settings management
|
|
421
|
-
├── store.ts — LanceDB connection, table management
|
|
422
|
-
├── embeddings/
|
|
423
|
-
│ ├── index.ts — Embedding provider router
|
|
424
|
-
│ ├── voyage.ts — Voyage AI provider
|
|
425
|
-
│ ├── openai.ts — OpenAI provider
|
|
426
|
-
│ └── local.ts — Transformers.js ONNX Runtime local provider
|
|
427
|
-
├── ingestion/
|
|
428
|
-
│ ├── pipeline.ts — Ingestion pipeline orchestrator
|
|
429
|
-
│ ├── chunker.ts — Message chunking logic
|
|
430
|
-
│ ├── extractors.ts — Code blocks, file refs, errors, commands, git context, tool calls
|
|
431
|
-
│ ├── deduplicator.ts — Cosine similarity dedup
|
|
432
|
-
│ ├── bootstrap.ts — Historical session bulk ingestion
|
|
433
|
-
│ └── watcher.ts — Live file watcher for new messages
|
|
434
|
-
├── distillation/
|
|
435
|
-
│ ├── distiller.ts — Background LLM knowledge extraction
|
|
436
|
-
│ ├── prompts.ts — Distillation prompt templates
|
|
437
|
-
│ └── scheduler.ts — Idle-time scheduling
|
|
438
|
-
├── retrieval/
|
|
439
|
-
│ ├── search.ts — Multi-layer vector search with reranking
|
|
440
|
-
│ ├── injection.ts — Prompt augmentation (cortex-context block)
|
|
441
|
-
│ ├── federation.ts — Remote node query delegation
|
|
442
|
-
│ └── scoring.ts — Confidence, staleness, relevance scoring
|
|
443
|
-
├── knowledge/
|
|
444
|
-
│ ├── types.ts — Knowledge unit type definitions
|
|
445
|
-
│ ├── staleness.ts — Staleness detection and decay
|
|
446
|
-
│ └── contradiction.ts — Contradiction detection between units
|
|
447
|
-
├── portability/
|
|
448
|
-
│ ├── exporter.ts — .cortexpack export
|
|
449
|
-
│ └── importer.ts — .cortexpack import with merge strategies
|
|
450
|
-
└── mcp/
|
|
451
|
-
└── server.ts — MCP server exposing cortex tools
|
|
452
|
-
|
|
453
|
-
src/app/api/cortex/
|
|
454
|
-
├── status/route.ts
|
|
455
|
-
├── search/route.ts
|
|
456
|
-
├── knowledge/route.ts
|
|
457
|
-
├── knowledge/[id]/route.ts
|
|
458
|
-
├── workspace/[id]/context/route.ts
|
|
459
|
-
├── timeline/route.ts
|
|
460
|
-
├── ingest/bootstrap/route.ts
|
|
461
|
-
├── ingest/status/route.ts
|
|
462
|
-
├── export/route.ts
|
|
463
|
-
├── import/route.ts
|
|
464
|
-
├── import/status/route.ts
|
|
465
|
-
├── settings/route.ts
|
|
466
|
-
└── federation/
|
|
467
|
-
├── search/route.ts
|
|
468
|
-
├── stream/route.ts
|
|
469
|
-
├── teach/route.ts
|
|
470
|
-
├── pending/route.ts
|
|
471
|
-
└── resolve/route.ts
|
|
472
|
-
|
|
473
|
-
src/components/cortex/
|
|
474
|
-
├── cortex-indicator.tsx — Top bar status badge
|
|
475
|
-
├── cortex-panel.tsx — Slide-out knowledge explorer
|
|
476
|
-
├── cortex-settings.tsx — Settings page section
|
|
477
|
-
├── knowledge-card.tsx — Individual knowledge unit display
|
|
478
|
-
└── injection-badge.tsx — Pane header injection indicator
|
|
479
|
-
|
|
480
|
-
~/.spaces/cortex/
|
|
481
|
-
├── config.json — Cortex settings
|
|
482
|
-
├── personal/ — Personal layer LanceDB tables
|
|
483
|
-
├── workspace/
|
|
484
|
-
│ ├── 1/ — Workspace 1 LanceDB tables
|
|
485
|
-
│ ├── 2/ — Workspace 2 LanceDB tables
|
|
486
|
-
│ └── .../
|
|
487
|
-
└── team/ — Team layer cache (from federation)
|
|
488
|
-
```
|
|
489
|
-
|
|
490
|
-
## Dependencies & Platform Compatibility
|
|
491
|
-
|
|
492
|
-
### LanceDB
|
|
493
|
-
|
|
494
|
-
Use `@lancedb/lancedb` (the official Node.js package). This has native Rust bindings for optimal performance, with a WASM fallback for platforms where native compilation fails.
|
|
495
|
-
|
|
496
|
-
**Installation strategy:**
|
|
497
|
-
|
|
498
|
-
1. Primary: `@lancedb/lancedb` with native bindings (best performance)
|
|
499
|
-
2. Fallback: If native compilation fails during `npm install`, the package provides WASM builds that work everywhere
|
|
500
|
-
3. The package supports Windows (MSVC + MINGW), macOS (Intel + Apple Silicon), and Linux (x64 + ARM64)
|
|
501
|
-
|
|
502
|
-
Since Spaces already depends on `better-sqlite3` (native), users are already set up for native compilation. LanceDB adds ~15MB to the install.
|
|
503
|
-
|
|
504
|
-
### Local Embedding Model
|
|
505
|
-
|
|
506
|
-
For the local embedding fallback, use `@huggingface/transformers` (Transformers.js) which runs models via ONNX Runtime in Node.js. The `all-MiniLM-L6-v2` model is ~23MB and loads once on first use.
|
|
507
|
-
|
|
508
|
-
### Embedding Provider Chain
|
|
509
|
-
|
|
510
|
-
Check for API keys in order: Voyage AI (`VOYAGE_API_KEY`) → OpenAI (`OPENAI_API_KEY`) → local (ONNX). Default to the best available. Anthropic does not offer a public embedding API; Voyage AI is the recommended partner.
|
|
511
|
-
|
|
512
|
-
### Embedding Dimension Management
|
|
513
|
-
|
|
514
|
-
Different providers produce different dimensions (MiniLM: 384, OpenAI: 1536, Voyage: 1024). The Cortex stores the current embedding dimension in config. If the user changes providers:
|
|
515
|
-
|
|
516
|
-
1. Detect dimension mismatch on startup
|
|
517
|
-
2. Warn: "Embedding provider changed. Re-embedding all knowledge units in background."
|
|
518
|
-
3. Queue full re-embedding as a background job (same as bootstrap, but embedding-only)
|
|
519
|
-
4. During transition, old vectors are still searchable (LanceDB handles mixed queries via separate partitions), new results take priority
|
|
520
|
-
|
|
521
|
-
## Error Handling & Resilience
|
|
522
|
-
|
|
523
|
-
### Ingestion Pipeline Failures
|
|
524
|
-
|
|
525
|
-
- **Tier 1 (fast pass):** If a session file is malformed or being actively written to, skip that file and log a warning. Retry on next sync cycle. Never crash the pipeline for a single bad file.
|
|
526
|
-
- **Tier 2 (embedding):** If the embedding API returns an error (rate limit, network, invalid response), move the chunk to a retry queue with exponential backoff (1s, 5s, 30s, 5min). After 5 failures, fall back to local embeddings for that batch. If local also fails, store the chunk as text-only (searchable via FTS but not vector search) and log an error.
|
|
527
|
-
- **Tier 3 (distillation):** If the LLM call fails or returns malformed output, discard that distillation attempt and log. The raw chunks remain searchable. Retry distillation on next idle cycle. Never block ingestion on distillation failures.
|
|
528
|
-
|
|
529
|
-
### LanceDB Corruption Recovery
|
|
530
|
-
|
|
531
|
-
LanceDB uses Arrow IPC format. Partial writes can corrupt tables. Recovery strategy:
|
|
532
|
-
|
|
533
|
-
1. On startup, verify table integrity (LanceDB provides health checks)
|
|
534
|
-
2. If corruption detected, log error, rename corrupt directory to `{layer}.corrupt.{timestamp}/`
|
|
535
|
-
3. Create fresh empty table
|
|
536
|
-
4. Trigger re-ingestion from raw session files (bootstrap in repair mode — embedding-only, no re-parsing)
|
|
537
|
-
5. The raw JSONL session files are the source of truth; LanceDB is a derived index
|
|
538
|
-
|
|
539
|
-
### Graceful Degradation
|
|
540
|
-
|
|
541
|
-
The Cortex continues to function even when components fail:
|
|
542
|
-
|
|
543
|
-
| Failure | Behavior |
|
|
544
|
-
|---------|----------|
|
|
545
|
-
| Embedding API down | Fall back to local embeddings automatically |
|
|
546
|
-
| Local embeddings fail | Store text-only chunks, skip vector search, use FTS keyword matching |
|
|
547
|
-
| LanceDB unavailable | Cortex indicator shows red, injection disabled, MCP tools return empty results |
|
|
548
|
-
| Federation node unreachable | Skip that node's results, merge what's available |
|
|
549
|
-
| Distillation LLM unavailable | Raw chunks still searchable, distillation queued for later |
|
|
550
|
-
| Bootstrap interrupted | Resume from last checkpoint on next run |
|
|
551
|
-
|
|
552
|
-
### Circuit Breaker
|
|
553
|
-
|
|
554
|
-
External API calls (embedding, distillation, federation) use a circuit breaker pattern:
|
|
555
|
-
|
|
556
|
-
- **Closed** (normal): requests flow through
|
|
557
|
-
- **Open** (after 5 consecutive failures): stop calling for 60 seconds, return fallback
|
|
558
|
-
- **Half-open** (after cooldown): try one request, if success → close, if fail → reopen
|
|
559
|
-
|
|
560
|
-
## Non-Claude Agent Injection
|
|
561
|
-
|
|
562
|
-
Claude Code has hook support (`PreToolUse`, `PostToolUse`, `Notification`, `Stop`). However, Claude Code does not currently support a `user-prompt-submit` hook for intercepting prompts before they're sent.
|
|
563
|
-
|
|
564
|
-
**Primary injection strategy (all agents): MCP Tool**
|
|
565
|
-
|
|
566
|
-
The Cortex registers as an MCP server. Claude Code (and any agent that supports MCP) can call `cortex_search` and `cortex_context` as tools. The agent receives cortex context as tool results, which it naturally incorporates.
|
|
567
|
-
|
|
568
|
-
To make this automatic (without the agent needing to know to ask), the Cortex's MCP server description includes instructions telling the agent to query the Cortex at the start of each task. This is how MCP servers like `memory` work today — the server description says "always check memory first."
|
|
569
|
-
|
|
570
|
-
**Secondary injection strategy (future): PTY-level injection**
|
|
571
|
-
|
|
572
|
-
For agents without MCP support, and for the auto-injection experience (user doesn't need to configure anything), a future version could:
|
|
573
|
-
|
|
574
|
-
1. Intercept at the WebSocket layer in `terminal/server.ts` — when a `data` message from the client matches a prompt pattern (newline after text), inject cortex context
|
|
575
|
-
2. This happens before the data reaches node-pty, so the agent sees the enriched prompt
|
|
576
|
-
3. This requires careful handling of escape sequences, binary data, and multi-byte characters
|
|
577
|
-
4. **Deferred to a future phase** — MCP is the v1 approach
|
|
578
|
-
|
|
579
|
-
## Integration with Existing Data Layer
|
|
580
|
-
|
|
581
|
-
### SQLite Cross-References
|
|
582
|
-
|
|
583
|
-
Cortex knowledge units reference SQLite entities via:
|
|
584
|
-
|
|
585
|
-
- `workspace_id` → `workspaces.id` in SQLite
|
|
586
|
-
- `session_id` → `sessions.session_id` in SQLite
|
|
587
|
-
|
|
588
|
-
These are soft references (no foreign key enforcement across databases). The Cortex tolerates dangling references gracefully — if a workspace is deleted from SQLite, its knowledge units remain in LanceDB but are no longer returned in workspace-scoped queries (workspace doesn't exist = no results).
|
|
589
|
-
|
|
590
|
-
### Lifecycle Coupling
|
|
591
|
-
|
|
592
|
-
- **Workspace deleted** → Cortex workspace layer directory is not automatically deleted (knowledge may still be valuable in personal layer). A "Clean up Cortex data" option in UI allows explicit deletion.
|
|
593
|
-
- **Session deleted from SQLite** → Knowledge units sourced from that session remain (the knowledge is independent of the session index).
|
|
594
|
-
- **Bootstrap reads from** → Raw agent JSONL files on disk (not from SQLite). The SQLite index helps map sessions to workspaces, but the actual content comes from the source files.
|
|
595
|
-
|
|
596
|
-
### FTS5 Coexistence
|
|
597
|
-
|
|
598
|
-
The existing FTS5 full-text search (`sessions_fts`) continues to work for session content search. The Cortex adds semantic/vector search on top. The `/api/search` route could be extended to combine FTS5 keyword results with Cortex vector results for hybrid search, but this is not required for v1.
|
|
599
|
-
|
|
600
|
-
## Configuration
|
|
601
|
-
|
|
602
|
-
Cortex settings are stored as a `cortex` key within the existing `~/.spaces/config.json`. This requires adding a `cortex?: CortexConfig` field to the `SpacesConfig` interface in `src/lib/config.ts`, and updating `readConfig`/`writeConfig` to preserve unknown keys (or explicitly handle the `cortex` field). This avoids a separate config file and keeps all Spaces configuration in one place.
|
|
603
|
-
|
|
604
|
-
The `~/.spaces/cortex/` directory contains only LanceDB data files, not configuration.
|
|
605
|
-
|
|
606
|
-
## Performance Budget
|
|
607
|
-
|
|
608
|
-
### Hook/MCP Injection Latency Target: <200ms (local only)
|
|
609
|
-
|
|
610
|
-
| Step | Budget |
|
|
611
|
-
|------|--------|
|
|
612
|
-
| Query signal extraction | 5ms |
|
|
613
|
-
| LanceDB search (personal + workspace) | 20-50ms |
|
|
614
|
-
| Reranking + staleness scoring | 10ms |
|
|
615
|
-
| Result formatting | 5ms |
|
|
616
|
-
| **Total local** | **40-70ms** |
|
|
617
|
-
|
|
618
|
-
Federation queries are fire-and-forget with a 500ms timeout. If federation results arrive before the agent processes the prompt, they're included. If not, local results are sufficient. Federation results may also arrive and be available for the *next* prompt.
|
|
619
|
-
|
|
620
|
-
### Disk Space Management
|
|
621
|
-
|
|
622
|
-
- **Warning threshold:** Cortex UI shows a warning when total Cortex storage exceeds 500MB
|
|
623
|
-
- **Maximum size:** Configurable (default: 2GB). When exceeded, automatic pruning removes lowest-confidence + highest-staleness entries first
|
|
624
|
-
- **Pruning strategy:** Remove `conversation` type chunks first (lowest value), then `command`, then stale `context`. Never auto-prune `decision`, `preference`, or `error_fix` types — these are too valuable.
|
|
625
|
-
|
|
626
|
-
## Active Knowledge Propagation (Cortex-to-Cortex Teaching)
|
|
627
|
-
|
|
628
|
-
In federated environments, Cortex nodes don't just respond to queries — they actively teach each other. High-confidence knowledge propagates across the network automatically, creating a distributed intelligence mesh where every node benefits from every other node's experience.
|
|
629
|
-
|
|
630
|
-
### Propagation Mechanics
|
|
631
|
-
|
|
632
|
-
When a Cortex node produces a knowledge unit that crosses a **propagation threshold**, it becomes a candidate for teaching:
|
|
633
|
-
|
|
634
|
-
| Criteria | Threshold | Rationale |
|
|
635
|
-
|----------|-----------|-----------|
|
|
636
|
-
| Confidence score | ≥ 0.85 | Only propagate knowledge the source node is confident about |
|
|
637
|
-
| Type | `decision`, `pattern`, `preference`, `error_fix` | High-value types only — raw `conversation` and `context` chunks stay local |
|
|
638
|
-
| Layer | `team` | Personal and workspace knowledge are never propagated automatically |
|
|
639
|
-
| Validation | User-validated or repeated 3+ times | Prevents propagation of noise |
|
|
640
|
-
|
|
641
|
-
### Propagation Flow
|
|
642
|
-
|
|
643
|
-
```
|
|
644
|
-
Node A discovers high-confidence pattern
|
|
645
|
-
│
|
|
646
|
-
▼
|
|
647
|
-
Propagation check: confidence ≥ 0.85, team layer, validated type?
|
|
648
|
-
│ yes
|
|
649
|
-
▼
|
|
650
|
-
Package as teaching unit:
|
|
651
|
-
{ knowledge, source_node, confidence, provenance_chain }
|
|
652
|
-
│
|
|
653
|
-
▼
|
|
654
|
-
Push to all paired federation nodes via:
|
|
655
|
-
- Real-time sync: WebSocket push (immediate)
|
|
656
|
-
- Background sync: included in next sync batch
|
|
657
|
-
- Query-only: piggyback on next query response as "suggested knowledge"
|
|
658
|
-
│
|
|
659
|
-
▼
|
|
660
|
-
Receiving node (Node B):
|
|
661
|
-
1. Dedup check — already have this? (cosine similarity > 0.95 → skip)
|
|
662
|
-
2. Contradiction check — conflicts with local knowledge? → flag for review
|
|
663
|
-
3. Confidence adjustment — remote knowledge arrives at 0.8 × source confidence
|
|
664
|
-
(trust but verify — local experience always ranks higher)
|
|
665
|
-
4. Store in team layer with provenance: "Learned from Node A"
|
|
666
|
-
│
|
|
667
|
-
▼
|
|
668
|
-
Node B's agents now benefit from Node A's experience
|
|
669
|
-
```
|
|
670
|
-
|
|
671
|
-
### Provenance Chain
|
|
672
|
-
|
|
673
|
-
Every propagated knowledge unit carries a provenance chain — a record of where the knowledge originated and how it traveled:
|
|
674
|
-
|
|
675
|
-
```json
|
|
676
|
-
{
|
|
677
|
-
"origin_node": "node-abc",
|
|
678
|
-
"origin_timestamp": "2026-03-10T14:30:00Z",
|
|
679
|
-
"hops": [
|
|
680
|
-
{ "node": "node-abc", "confidence": 0.92, "timestamp": "2026-03-10T14:30:00Z" },
|
|
681
|
-
{ "node": "node-def", "confidence": 0.74, "timestamp": "2026-03-10T15:00:00Z" }
|
|
682
|
-
],
|
|
683
|
-
"max_hops": 3
|
|
684
|
-
}
|
|
685
|
-
```
|
|
686
|
-
|
|
687
|
-
**Max hops** prevents knowledge from echoing endlessly across the network. Default: 3 hops. Knowledge that has traveled through 3 nodes is not propagated further (it's available via query delegation if needed).
|
|
688
|
-
|
|
689
|
-
### Confidence Decay Across Hops
|
|
690
|
-
|
|
691
|
-
Each hop multiplies confidence by 0.8 (retains 80%):
|
|
692
|
-
|
|
693
|
-
- **Origin:** 0.92
|
|
694
|
-
- **Hop 1:** 0.92 × 0.8 = 0.74
|
|
695
|
-
- **Hop 2:** 0.74 × 0.8 = 0.59
|
|
696
|
-
- **Hop 3:** 0.59 × 0.8 = 0.47 (no further propagation)
|
|
697
|
-
|
|
698
|
-
This ensures that firsthand knowledge always outranks secondhand knowledge. A node's own direct experience is always the strongest signal.
|
|
699
|
-
|
|
700
|
-
### Contradiction Resolution
|
|
701
|
-
|
|
702
|
-
When propagated knowledge contradicts local knowledge:
|
|
703
|
-
|
|
704
|
-
1. **Local wins by default** — Local knowledge has higher base confidence (no hop decay)
|
|
705
|
-
2. **Flag for review** — The contradiction is surfaced in the Cortex panel: "Node X says Y, but you've been doing Z. Which is correct?"
|
|
706
|
-
3. **User resolves** — User can accept the remote knowledge (updates local), reject it (downranks the remote unit), or mark as "context-dependent" (both valid in different situations)
|
|
707
|
-
4. **Resolution propagates** — If the user explicitly validates remote knowledge, that validation propagates back to the source node as a confidence boost
|
|
708
|
-
|
|
709
|
-
### Rate Limiting
|
|
710
|
-
|
|
711
|
-
- **Per-node-pair:** Max 50 knowledge units pushed per sync cycle
|
|
712
|
-
- **Dedup window:** Knowledge within 0.95 cosine similarity of existing units is silently dropped
|
|
713
|
-
- **Backpressure:** If a receiving node's ingestion queue exceeds 500 items, it signals the sender to slow down
|
|
714
|
-
|
|
715
|
-
## Deferred / Future Considerations
|
|
716
|
-
|
|
717
|
-
- **Knowledge graph visualization** — 3D visualization of how knowledge units relate (could reuse R3F infrastructure)
|
|
718
|
-
- **Auto-CLAUDE.md generation** — Cortex distills its most confident preferences/patterns into a CLAUDE.md file automatically
|
|
719
|
-
- **Multi-modal knowledge** — Screenshots, diagrams, architecture images stored alongside text
|
|
720
|
-
- **Knowledge unit voting** — In teams, members can upvote/downvote knowledge units to improve confidence scoring
|
|
1
|
+
# Spaces Cortex — Distributed Intelligence Network
|
|
2
|
+
|
|
3
|
+
**Date:** 2026-03-12
|
|
4
|
+
**Status:** Approved
|
|
5
|
+
**Feature Name:** Cortex
|
|
6
|
+
|
|
7
|
+
## Summary
|
|
8
|
+
|
|
9
|
+
A persistent, self-building knowledge system for Spaces that continuously ingests all AI agent conversations, extracts decisions, patterns, preferences, and error resolutions, stores them as vector embeddings in LanceDB, and automatically injects relevant context into every prompt via hooks. Agents get smarter over time because the Cortex remembers everything you've built, decided, and corrected — across all sessions, all agents, all projects.
|
|
10
|
+
|
|
11
|
+
In federated environments, Cortex nodes actively teach each other — propagating high-confidence knowledge across the network so every node benefits from every other node's experience. The result is a distributed intelligence network that grows smarter with every conversation, on every machine, across every team.
|
|
12
|
+
|
|
13
|
+
The Cortex operates across four knowledge layers (Personal, Workspace, Team, Federation), supports all agent types (Claude Code, Codex, Gemini, Aider), and integrates with Spaces' existing tier model (Community, Pro/Server, Teams, Federation).
|
|
14
|
+
|
|
15
|
+
## Tier Availability
|
|
16
|
+
|
|
17
|
+
Cortex is a **premium feature** available only on Teams and Federation tiers. It is not included in the open-source Community version.
|
|
18
|
+
|
|
19
|
+
- All Cortex API routes check tier before responding (return 403 on Community)
|
|
20
|
+
- All UI components use `useTier()` to conditionally render
|
|
21
|
+
- The `src/lib/cortex/` directory can be excluded from Community builds
|
|
22
|
+
- Federation features (query delegation, active propagation, sync) require the Federation tier specifically
|
|
23
|
+
- Teams tier gets: local Cortex (personal + workspace layers, ingestion, retrieval, MCP, import/export)
|
|
24
|
+
- Federation tier gets: everything in Teams + team layer, federation queries, Cortex-to-Cortex teaching, sync modes
|
|
25
|
+
|
|
26
|
+
## Design Principles
|
|
27
|
+
|
|
28
|
+
- **Zero config** — Cortex works the moment it's enabled. No API keys required (falls back to local embeddings). No manual curation needed.
|
|
29
|
+
- **Fully automatic** — All conversations are ingested passively. The Cortex decides what's worth remembering. Users never need to manually save knowledge.
|
|
30
|
+
- **Invisible when working, inspectable when curious** — The Cortex enhances every prompt silently. But every injection is visible (pane header badge), every knowledge unit is browsable (Cortex panel), and everything can be taught, corrected, or forgotten.
|
|
31
|
+
- **Privacy by default** — Personal knowledge never leaves your node. Workspace knowledge is shareable only if the workspace is collaborative. Team knowledge flows only between paired federation nodes.
|
|
32
|
+
- **Distributed intelligence** — In federated environments, Cortex nodes actively teach each other. High-confidence knowledge propagates across the network automatically. Every node makes every other node smarter.
|
|
33
|
+
|
|
34
|
+
## Architecture
|
|
35
|
+
|
|
36
|
+
### System Overview
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
Input (Conversation Stream)
|
|
40
|
+
│ Claude Code JSONL, Codex, Gemini, Aider sessions, terminal output
|
|
41
|
+
▼
|
|
42
|
+
Ingestion Pipeline
|
|
43
|
+
│ Tier 1: Fast Pass (heuristic, ~10ms) → immediate chunks
|
|
44
|
+
│ Tier 2: Embedding (~50ms) → vectorize and store in LanceDB
|
|
45
|
+
│ Tier 3: Distillation (async) → LLM extracts decisions, patterns, preferences
|
|
46
|
+
▼
|
|
47
|
+
Storage (LanceDB)
|
|
48
|
+
│ Personal layer: ~/.spaces/cortex/personal/
|
|
49
|
+
│ Workspace layer: ~/.spaces/cortex/workspace/{id}/
|
|
50
|
+
│ Team layer: ~/.spaces/cortex/team/ (cache from federation queries)
|
|
51
|
+
▼
|
|
52
|
+
Retrieval & Injection
|
|
53
|
+
│ Hook injection: automatic, every prompt, <200ms
|
|
54
|
+
│ MCP tool: agent-driven deep queries
|
|
55
|
+
│ Federation query: transparent delegation to remote nodes
|
|
56
|
+
▼
|
|
57
|
+
Agent receives prompt + relevant Cortex context
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Knowledge Layers
|
|
61
|
+
|
|
62
|
+
Four layers, organized from most specific to most general:
|
|
63
|
+
|
|
64
|
+
| Layer | Scope | Privacy | Storage | Examples |
|
|
65
|
+
|-------|-------|---------|---------|----------|
|
|
66
|
+
| **Personal** | Your preferences and style | Never shared | `~/.spaces/cortex/personal/` | "Prefers Zod", "No ORMs", "Terse output" |
|
|
67
|
+
| **Workspace** | Project-specific knowledge | Shareable if workspace is collaborative | `~/.spaces/cortex/workspace/{id}/` | "Auth uses JWT", "DB schema v3", "Bug #247 fix" |
|
|
68
|
+
| **Team** | Shared conventions | Flows between federation nodes | `~/.spaces/cortex/team/` (local cache) | "API uses /v2/ prefix", "All endpoints return {data, error}" |
|
|
69
|
+
| **Federation** | Org-wide patterns | Query delegation across nodes | Not stored locally — queried on demand | Cross-team patterns, org standards |
|
|
70
|
+
|
|
71
|
+
On every prompt, the Cortex searches: Personal → Workspace → Team → Federation. Most specific wins. Results merged by relevance score.
|
|
72
|
+
|
|
73
|
+
## Ingestion Pipeline
|
|
74
|
+
|
|
75
|
+
### Tier 1: Fast Pass (immediate, heuristic)
|
|
76
|
+
|
|
77
|
+
Runs synchronously as messages are indexed. No LLM calls, no API calls. Pure text processing at ~10ms per message.
|
|
78
|
+
|
|
79
|
+
**Extractors:**
|
|
80
|
+
|
|
81
|
+
- **Message chunking** — Split conversations into semantic chunks at turn boundaries, topic shifts, and tool call boundaries. Each chunk gets metadata: session ID, workspace ID, agent type, timestamp, project path.
|
|
82
|
+
- **Code block extraction** — Pull fenced code blocks as separate chunks. Tag with language, file path (from nearby context), and whether user-provided or agent-generated.
|
|
83
|
+
- **File reference detection** — Regex scan for file paths. Links chunks to the files they discuss.
|
|
84
|
+
- **Error/fix pair detection** — Detect "error → investigation → fix" patterns. Heuristic: error messages followed by successful resolution within the same session.
|
|
85
|
+
- **Command extraction** — Terminal commands with context: what was run, why, what happened.
|
|
86
|
+
- **Conversation summary markers** — When a session ends or reaches a natural break, generate a session-level summary chunk capturing the overall arc.
|
|
87
|
+
- **Git context linking** — Capture git branch, commit hashes, and diff stats. Links knowledge to exact code state.
|
|
88
|
+
- **Tool call analysis** — Parse tool_use/tool_result pairs. File reads = what code was examined. Edits = what changed and why. Bash commands = what was tested.
|
|
89
|
+
|
|
90
|
+
### Tier 2: Embedding (near-realtime)
|
|
91
|
+
|
|
92
|
+
Runs async but fast. Vectorizes chunks from Tier 1:
|
|
93
|
+
|
|
94
|
+
- **Model selection** — Check for API keys in order: Voyage AI → OpenAI → Anthropic → local (all-MiniLM-L6-v2 via ONNX Runtime). Best available wins. Default to most advanced available.
|
|
95
|
+
- **Batch embedding** — Queue chunks, embed in batches (50-100 per API call).
|
|
96
|
+
- **LanceDB storage** — Store vector with full metadata (see schema below).
|
|
97
|
+
- **Deduplication** — Check cosine similarity against recent entries. >0.95 similarity = skip.
|
|
98
|
+
|
|
99
|
+
### Tier 3: Distillation (background, LLM-powered)
|
|
100
|
+
|
|
101
|
+
Runs during idle time. Produces high-quality knowledge units from raw chunks:
|
|
102
|
+
|
|
103
|
+
- **Decision extraction** — "We decided to use X because Y." Structured: decision, rationale, alternatives considered, date.
|
|
104
|
+
- **Pattern recognition** — "This project always does X when Y." Recurring approaches across sessions.
|
|
105
|
+
- **Preference learning** — "User corrected: don't do X, do Y instead." Corrections become personal-layer knowledge.
|
|
106
|
+
- **Error wisdom** — "When error X happens, the fix is Y." Distilled from error/fix pairs.
|
|
107
|
+
- **Staleness scoring** — Each unit gets a freshness score based on source file modification times.
|
|
108
|
+
|
|
109
|
+
The distiller uses whatever LLM is available (Claude API, or delegates to a running Claude Code session). Processes batches of recent chunks, produces structured knowledge units, embeds them, stores with `type: 'distilled'` and higher base confidence.
|
|
110
|
+
|
|
111
|
+
### Bootstrap Ingestion
|
|
112
|
+
|
|
113
|
+
On first enable (or when linking a new workspace to a project), bulk-processes all existing sessions:
|
|
114
|
+
|
|
115
|
+
1. Scan `~/.claude/projects/`, `~/.codex/`, `~/.gemini/`, `.aider.chat.history.md` for all existing sessions
|
|
116
|
+
2. Map sessions to workspaces by project path
|
|
117
|
+
3. Run Tier 1 (fast pass) on all messages
|
|
118
|
+
4. Run Tier 2 (embedding) in batches
|
|
119
|
+
5. Queue Tier 3 (distillation) starting from most recent, working backward
|
|
120
|
+
6. Ingest subagent transcripts (full conversations in `{sessionId}/subagents/`)
|
|
121
|
+
7. Show progress in UI: "Ingesting 172MB across 20 projects... 45%"
|
|
122
|
+
|
|
123
|
+
Bootstrap is incremental — if interrupted, picks up where it left off using sync state tracking.
|
|
124
|
+
|
|
125
|
+
## Knowledge Classification
|
|
126
|
+
|
|
127
|
+
### Knowledge Unit Types
|
|
128
|
+
|
|
129
|
+
| Type | Source | Confidence Base | Staleness Half-life | Example |
|
|
130
|
+
|------|--------|-----------------|---------------------|---------|
|
|
131
|
+
| `decision` | Distillation | 0.8 | 180 days | "Using JWT with refresh rotation for auth" |
|
|
132
|
+
| `pattern` | Distillation + repetition | 0.8 | 90 days | "API routes validate with Zod middleware" |
|
|
133
|
+
| `preference` | User corrections | 0.95 | 180 days | "Don't mock DB in integration tests" |
|
|
134
|
+
| `error_fix` | Error/fix detection | 0.8 | 90 days | "ECONNRESET → exponential backoff with jitter" |
|
|
135
|
+
| `context` | Session summaries | 0.6 | 30 days | "Migrating from v1 to v2 API" |
|
|
136
|
+
| `code_pattern` | Code block analysis | 0.7 | 60 days | "Components use forwardRef + displayName" |
|
|
137
|
+
| `command` | Command extraction | 0.6 | 30 days | "Deploy: npm run deploy:staging" |
|
|
138
|
+
| `conversation` | Raw chunking | 0.4 | 14 days | Fallback: raw conversation segment |
|
|
139
|
+
| `summary` | Session summarization | 0.6 | 60 days | "Session built the Cortex ingestion pipeline" |
|
|
140
|
+
|
|
141
|
+
### Storage Schema (LanceDB)
|
|
142
|
+
|
|
143
|
+
```
|
|
144
|
+
Table: knowledge
|
|
145
|
+
├── id: string (uuid)
|
|
146
|
+
├── vector: float32[dimensions]
|
|
147
|
+
├── text: string
|
|
148
|
+
├── type: string // decision/pattern/preference/error_fix/context/code_pattern/command/conversation/summary
|
|
149
|
+
├── layer: string // personal/workspace/team
|
|
150
|
+
├── workspace_id: number | null
|
|
151
|
+
├── session_id: string | null
|
|
152
|
+
├── agent_type: string // claude/codex/gemini/aider
|
|
153
|
+
├── project_path: string | null
|
|
154
|
+
├── file_refs: string[]
|
|
155
|
+
├── confidence: float32 // 0.0–1.0
|
|
156
|
+
├── created: timestamp
|
|
157
|
+
├── source_timestamp: timestamp
|
|
158
|
+
├── stale_score: float32 // 0.0–1.0
|
|
159
|
+
├── access_count: number
|
|
160
|
+
├── last_accessed: timestamp | null
|
|
161
|
+
└── metadata: json
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### Confidence Scoring
|
|
165
|
+
|
|
166
|
+
- **Source quality:** Distilled = 0.8 base, raw chunks = 0.4
|
|
167
|
+
- **Repetition:** Same pattern across 3+ sessions → +0.1 per occurrence (cap 0.95)
|
|
168
|
+
- **Recency:** Last 7 days → +0.1 boost
|
|
169
|
+
- **User validation:** Explicit `cortex_teach` → 0.95
|
|
170
|
+
- **Contradiction:** Newer knowledge contradicts older → older gets confidence reduced, gains `superseded_by` pointer
|
|
171
|
+
|
|
172
|
+
### Staleness Detection
|
|
173
|
+
|
|
174
|
+
- **File modification tracking** — Referenced files heavily modified since knowledge created → increase `stale_score`
|
|
175
|
+
- **Git-aware** — Referenced branch merged or deleted → mark potentially stale
|
|
176
|
+
- **Contradiction from newer sessions** — Recent session shows different approach → downrank older
|
|
177
|
+
- **Time decay** — Configurable half-lives per knowledge type (see table above)
|
|
178
|
+
|
|
179
|
+
**Effective retrieval score:** `similarity × confidence × (1 - stale_score) × recency_boost`
|
|
180
|
+
|
|
181
|
+
## Retrieval & Injection
|
|
182
|
+
|
|
183
|
+
### Path 1: Hook Injection (automatic, every prompt)
|
|
184
|
+
|
|
185
|
+
Target latency: <200ms.
|
|
186
|
+
|
|
187
|
+
1. **Extract query signal** — Parse prompt for intent, keywords, file paths, error messages, concept terms
|
|
188
|
+
2. **Multi-layer search** — Query LanceDB across layers with priority weighting:
|
|
189
|
+
- Personal (weight 1.0)
|
|
190
|
+
- Active workspace (weight 0.9)
|
|
191
|
+
- Other workspaces (weight 0.5, if relevant)
|
|
192
|
+
- Team via federation (weight 0.7, if available)
|
|
193
|
+
3. **Reranking** — Score by: vector similarity, recency, confidence, source quality, staleness. Take top-k (default: 5).
|
|
194
|
+
4. **Token budget** — Cap at ~2000 tokens (configurable). Summarize or truncate lower-ranked results if over budget.
|
|
195
|
+
5. **Inject** — Append `<cortex-context>` block to prompt:
|
|
196
|
+
|
|
197
|
+
```
|
|
198
|
+
<cortex-context>
|
|
199
|
+
Relevant context from your workspace history:
|
|
200
|
+
|
|
201
|
+
[Decision] 2026-03-10: Auth uses JWT with httpOnly cookies, refresh token rotation.
|
|
202
|
+
Source: session abc123, workspace "Backend API"
|
|
203
|
+
|
|
204
|
+
[Pattern] This project uses Zod schemas at API boundaries, validated in middleware.
|
|
205
|
+
Source: 4 sessions over 2 weeks, confidence: 0.92
|
|
206
|
+
|
|
207
|
+
[Error Fix] "ECONNRESET on WebSocket reconnect" — Fixed by adding exponential backoff
|
|
208
|
+
with jitter in the reconnect handler. See session def456.
|
|
209
|
+
|
|
210
|
+
[Preference] You previously corrected: "Don't mock the database in integration tests."
|
|
211
|
+
</cortex-context>
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
For Claude Code: uses the `user-prompt-submit` hook.
|
|
215
|
+
|
|
216
|
+
For other agents (Codex, Gemini, Aider): terminal intercept approach — watches PTY input stream and injects context via wrapper script that prepends cortex context to stdin.
|
|
217
|
+
|
|
218
|
+
### Path 2: MCP Tool (agent-driven, on-demand)
|
|
219
|
+
|
|
220
|
+
The Cortex exposes an MCP server with these tools:
|
|
221
|
+
|
|
222
|
+
| Tool | Purpose | Key Params |
|
|
223
|
+
|------|---------|------------|
|
|
224
|
+
| `cortex_search` | Semantic search across layers | query, layers, types, workspace_id, time_range, min_confidence, limit |
|
|
225
|
+
| `cortex_recall` | Retrieve specific unit by ID or exact match | id, exact |
|
|
226
|
+
| `cortex_context` | Full context for a workspace | workspace_id, depth (brief/full) |
|
|
227
|
+
| `cortex_similar` | Find analogous past experiences | input, type (error/code/problem), limit |
|
|
228
|
+
| `cortex_timeline` | Chronological decision/change history | workspace_id, project_path, limit |
|
|
229
|
+
| `cortex_teach` | Explicitly store knowledge (confidence 0.95) | text, type, layer, workspace_id |
|
|
230
|
+
| `cortex_forget` | Remove or downrank knowledge | id, query, action (delete/downrank) |
|
|
231
|
+
| `cortex_status` | Cortex health and stats | — |
|
|
232
|
+
| `cortex_export` | Export cortex to .cortexpack | scope, workspace_id, include_embeddings, format |
|
|
233
|
+
| `cortex_import` | Import .cortexpack archive | path, target_layer, merge_strategy, re_embed |
|
|
234
|
+
|
|
235
|
+
### Path 3: Federation Query (transparent)
|
|
236
|
+
|
|
237
|
+
When team-layer results are needed:
|
|
238
|
+
|
|
239
|
+
1. Local Cortex constructs search request (query embedding + filters)
|
|
240
|
+
2. Request goes to `GET /api/network/proxy/{nodeId}/api/cortex/search`
|
|
241
|
+
3. Remote node runs search locally, returns results
|
|
242
|
+
4. Local Cortex merges remote results with local by relevance score
|
|
243
|
+
5. All connected nodes queried in parallel, configurable timeout (default 500ms)
|
|
244
|
+
|
|
245
|
+
## Federation
|
|
246
|
+
|
|
247
|
+
### Three Sync Modes (per-node-pair setting)
|
|
248
|
+
|
|
249
|
+
| Mode | Behavior | Best For |
|
|
250
|
+
|------|----------|----------|
|
|
251
|
+
| **Query-only** (default) | No data replication. Query remote nodes on demand. | Privacy-conscious teams, intermittent connectivity |
|
|
252
|
+
| **Background sync** | Periodically pull team-layer knowledge and cache locally. Fall back to live query if cache stale. | Better latency, offline capability |
|
|
253
|
+
| **Real-time sync** | Continuous replication via WebSocket. Knowledge appears on all nodes within seconds. | Tight teams, same codebase, full trust |
|
|
254
|
+
|
|
255
|
+
Background sync: polls connected nodes every N minutes (default 5), imports new knowledge units using merge-by-similarity.
|
|
256
|
+
|
|
257
|
+
Real-time sync: persistent WebSocket to `/api/cortex/federation/stream`. New team-layer units pushed as created.
|
|
258
|
+
|
|
259
|
+
### Privacy Model
|
|
260
|
+
|
|
261
|
+
- **Personal layer** — Never leaves your node. Not queryable by remote nodes.
|
|
262
|
+
- **Workspace layer** — Queryable by remote nodes only if the workspace has `collaboration: true`.
|
|
263
|
+
- **Team layer** — Always queryable by paired federation nodes. This is the shared knowledge pool.
|
|
264
|
+
|
|
265
|
+
## Import/Export (Portable Knowledge)
|
|
266
|
+
|
|
267
|
+
### .cortexpack Format
|
|
268
|
+
|
|
269
|
+
```
|
|
270
|
+
my-project.cortexpack (tar.gz)
|
|
271
|
+
├── manifest.json — version, source node, export date, stats
|
|
272
|
+
├── knowledge.jsonl — knowledge units as JSON lines
|
|
273
|
+
├── embeddings.lance/ — LanceDB table snapshot (optional, large)
|
|
274
|
+
└── sessions.json — source session metadata for provenance
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
Without embeddings: ~5-50MB typical. With embeddings: larger but skips re-embedding on import.
|
|
278
|
+
|
|
279
|
+
### Export Options
|
|
280
|
+
|
|
281
|
+
- **Scope:** full, workspace, personal, or custom (filtered by type/time)
|
|
282
|
+
- **Include embeddings:** optional (skip re-embedding on import vs. smaller file)
|
|
283
|
+
|
|
284
|
+
### Import Options
|
|
285
|
+
|
|
286
|
+
- **Target layer:** where to put imported knowledge
|
|
287
|
+
- **Merge strategy:** append (add all), merge (deduplicate by similarity, keep highest confidence), replace (wipe then import)
|
|
288
|
+
- **Re-embed:** regenerate embeddings with local model if embeddings not included
|
|
289
|
+
|
|
290
|
+
### Use Cases
|
|
291
|
+
|
|
292
|
+
- **Cloud ↔ Local sync** — Export from cloud VM, import locally (or vice versa)
|
|
293
|
+
- **Onboarding** — Senior dev exports workspace cortex, new team member imports. Instant ramp-up.
|
|
294
|
+
- **Project handoff** — Export cortex with codebase. Next developer gets the reasoning, not just the code.
|
|
295
|
+
- **Backup/restore** — Periodic export as backup
|
|
296
|
+
- **Machine migration** — Moving to new laptop? Export all cortexes, import on new machine.
|
|
297
|
+
|
|
298
|
+
## REST API
|
|
299
|
+
|
|
300
|
+
```
|
|
301
|
+
# Cortex status and health
|
|
302
|
+
GET /api/cortex/status
|
|
303
|
+
|
|
304
|
+
# Knowledge CRUD
|
|
305
|
+
GET /api/cortex/search?q=...&layer=...&type=...
|
|
306
|
+
GET /api/cortex/knowledge/:id
|
|
307
|
+
POST /api/cortex/knowledge — create (cortex_teach)
|
|
308
|
+
PATCH /api/cortex/knowledge/:id — update confidence/layer/metadata
|
|
309
|
+
DELETE /api/cortex/knowledge/:id — remove (cortex_forget)
|
|
310
|
+
|
|
311
|
+
# Workspace context
|
|
312
|
+
GET /api/cortex/workspace/:id/context
|
|
313
|
+
GET /api/cortex/timeline?workspace_id=...
|
|
314
|
+
|
|
315
|
+
# Bootstrap
|
|
316
|
+
POST /api/cortex/ingest/bootstrap
|
|
317
|
+
GET /api/cortex/ingest/status
|
|
318
|
+
|
|
319
|
+
# Import/Export
|
|
320
|
+
POST /api/cortex/export — body: {scope, workspace_id?, include_embeddings?}
|
|
321
|
+
POST /api/cortex/import — multipart .cortexpack upload
|
|
322
|
+
GET /api/cortex/import/status
|
|
323
|
+
|
|
324
|
+
# Settings
|
|
325
|
+
GET /api/cortex/settings
|
|
326
|
+
POST /api/cortex/settings
|
|
327
|
+
|
|
328
|
+
# Federation (served to remote nodes)
|
|
329
|
+
GET /api/cortex/federation/search — remote search endpoint
|
|
330
|
+
WS /api/cortex/federation/stream — real-time sync WebSocket
|
|
331
|
+
|
|
332
|
+
# Active Knowledge Propagation
|
|
333
|
+
POST /api/cortex/federation/teach — receive propagated knowledge from remote node
|
|
334
|
+
GET /api/cortex/federation/pending — knowledge pending review (contradictions)
|
|
335
|
+
POST /api/cortex/federation/resolve — resolve contradiction
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
## UI Integration
|
|
339
|
+
|
|
340
|
+
### 1. Top Bar — CortexStatus Indicator
|
|
341
|
+
|
|
342
|
+
Small purple "Cortex" badge in the top bar, always visible. Shows knowledge unit count. Pulses gently during active ingestion or retrieval. Colors: green (healthy), amber (ingesting), red (error). Click to open Cortex panel.
|
|
343
|
+
|
|
344
|
+
### 2. CortexPanel — Slide-out Knowledge Explorer
|
|
345
|
+
|
|
346
|
+
Opens from the right when Cortex indicator is clicked:
|
|
347
|
+
|
|
348
|
+
- **Search bar** — Semantic search across all knowledge
|
|
349
|
+
- **Stats row** — Total units, distilled count, average confidence
|
|
350
|
+
- **Layer tabs** — Personal / Workspace / Team
|
|
351
|
+
- **Knowledge list** — Each unit shows: type badge (color-coded), text, confidence, source, age
|
|
352
|
+
- **Actions** — Teach Cortex, Export, Settings
|
|
353
|
+
|
|
354
|
+
Knowledge type colors:
|
|
355
|
+
- Decision: blue (#60a5fa)
|
|
356
|
+
- Preference: pink (#f472b6)
|
|
357
|
+
- Pattern: green (#34d399)
|
|
358
|
+
- Error Fix: amber (#fbbf24)
|
|
359
|
+
- Context: gray (#94a3b8)
|
|
360
|
+
|
|
361
|
+
### 3. Pane Header — CortexActivity Badge
|
|
362
|
+
|
|
363
|
+
Each terminal pane header shows a small badge when the Cortex injected context into the last prompt: "3 items" with a purple dot. Click to see exactly what context was provided. Builds trust through transparency.
|
|
364
|
+
|
|
365
|
+
### 4. Settings Page — CortexConfiguration
|
|
366
|
+
|
|
367
|
+
Settings → Cortex section:
|
|
368
|
+
- Enable/disable toggle
|
|
369
|
+
- Embedding provider (auto-detected, with override)
|
|
370
|
+
- Injection token budget (default 2000)
|
|
371
|
+
- LLM distillation toggle
|
|
372
|
+
- Federation sync mode dropdown (Query Only / Background Sync / Real-time Sync)
|
|
373
|
+
- Bootstrap ingestion trigger with progress bar
|
|
374
|
+
|
|
375
|
+
## Configuration Defaults
|
|
376
|
+
|
|
377
|
+
```json
|
|
378
|
+
{
|
|
379
|
+
"enabled": true,
|
|
380
|
+
"embedding": {
|
|
381
|
+
"provider": "auto",
|
|
382
|
+
"model": null,
|
|
383
|
+
"fallback": "local"
|
|
384
|
+
},
|
|
385
|
+
"injection": {
|
|
386
|
+
"enabled": true,
|
|
387
|
+
"max_tokens": 2000,
|
|
388
|
+
"max_results": 5,
|
|
389
|
+
"min_confidence": 0.3
|
|
390
|
+
},
|
|
391
|
+
"ingestion": {
|
|
392
|
+
"auto_ingest": true,
|
|
393
|
+
"distillation": true,
|
|
394
|
+
"distillation_model": "auto"
|
|
395
|
+
},
|
|
396
|
+
"layers": {
|
|
397
|
+
"personal": true,
|
|
398
|
+
"workspace": true,
|
|
399
|
+
"team": true
|
|
400
|
+
},
|
|
401
|
+
"staleness": {
|
|
402
|
+
"decision_halflife_days": 180,
|
|
403
|
+
"pattern_halflife_days": 90,
|
|
404
|
+
"context_halflife_days": 30,
|
|
405
|
+
"conversation_halflife_days": 14
|
|
406
|
+
},
|
|
407
|
+
"federation": {
|
|
408
|
+
"sync_mode": "query-only",
|
|
409
|
+
"sync_interval_minutes": 5,
|
|
410
|
+
"query_timeout_ms": 500
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
```
|
|
414
|
+
|
|
415
|
+
## File Structure
|
|
416
|
+
|
|
417
|
+
```
|
|
418
|
+
src/lib/cortex/
|
|
419
|
+
├── index.ts — Cortex singleton, initialization
|
|
420
|
+
├── config.ts — Cortex settings management
|
|
421
|
+
├── store.ts — LanceDB connection, table management
|
|
422
|
+
├── embeddings/
|
|
423
|
+
│ ├── index.ts — Embedding provider router
|
|
424
|
+
│ ├── voyage.ts — Voyage AI provider
|
|
425
|
+
│ ├── openai.ts — OpenAI provider
|
|
426
|
+
│ └── local.ts — Transformers.js ONNX Runtime local provider
|
|
427
|
+
├── ingestion/
|
|
428
|
+
│ ├── pipeline.ts — Ingestion pipeline orchestrator
|
|
429
|
+
│ ├── chunker.ts — Message chunking logic
|
|
430
|
+
│ ├── extractors.ts — Code blocks, file refs, errors, commands, git context, tool calls
|
|
431
|
+
│ ├── deduplicator.ts — Cosine similarity dedup
|
|
432
|
+
│ ├── bootstrap.ts — Historical session bulk ingestion
|
|
433
|
+
│ └── watcher.ts — Live file watcher for new messages
|
|
434
|
+
├── distillation/
|
|
435
|
+
│ ├── distiller.ts — Background LLM knowledge extraction
|
|
436
|
+
│ ├── prompts.ts — Distillation prompt templates
|
|
437
|
+
│ └── scheduler.ts — Idle-time scheduling
|
|
438
|
+
├── retrieval/
|
|
439
|
+
│ ├── search.ts — Multi-layer vector search with reranking
|
|
440
|
+
│ ├── injection.ts — Prompt augmentation (cortex-context block)
|
|
441
|
+
│ ├── federation.ts — Remote node query delegation
|
|
442
|
+
│ └── scoring.ts — Confidence, staleness, relevance scoring
|
|
443
|
+
├── knowledge/
|
|
444
|
+
│ ├── types.ts — Knowledge unit type definitions
|
|
445
|
+
│ ├── staleness.ts — Staleness detection and decay
|
|
446
|
+
│ └── contradiction.ts — Contradiction detection between units
|
|
447
|
+
├── portability/
|
|
448
|
+
│ ├── exporter.ts — .cortexpack export
|
|
449
|
+
│ └── importer.ts — .cortexpack import with merge strategies
|
|
450
|
+
└── mcp/
|
|
451
|
+
└── server.ts — MCP server exposing cortex tools
|
|
452
|
+
|
|
453
|
+
src/app/api/cortex/
|
|
454
|
+
├── status/route.ts
|
|
455
|
+
├── search/route.ts
|
|
456
|
+
├── knowledge/route.ts
|
|
457
|
+
├── knowledge/[id]/route.ts
|
|
458
|
+
├── workspace/[id]/context/route.ts
|
|
459
|
+
├── timeline/route.ts
|
|
460
|
+
├── ingest/bootstrap/route.ts
|
|
461
|
+
├── ingest/status/route.ts
|
|
462
|
+
├── export/route.ts
|
|
463
|
+
├── import/route.ts
|
|
464
|
+
├── import/status/route.ts
|
|
465
|
+
├── settings/route.ts
|
|
466
|
+
└── federation/
|
|
467
|
+
├── search/route.ts
|
|
468
|
+
├── stream/route.ts
|
|
469
|
+
├── teach/route.ts
|
|
470
|
+
├── pending/route.ts
|
|
471
|
+
└── resolve/route.ts
|
|
472
|
+
|
|
473
|
+
src/components/cortex/
|
|
474
|
+
├── cortex-indicator.tsx — Top bar status badge
|
|
475
|
+
├── cortex-panel.tsx — Slide-out knowledge explorer
|
|
476
|
+
├── cortex-settings.tsx — Settings page section
|
|
477
|
+
├── knowledge-card.tsx — Individual knowledge unit display
|
|
478
|
+
└── injection-badge.tsx — Pane header injection indicator
|
|
479
|
+
|
|
480
|
+
~/.spaces/cortex/
|
|
481
|
+
├── config.json — Cortex settings
|
|
482
|
+
├── personal/ — Personal layer LanceDB tables
|
|
483
|
+
├── workspace/
|
|
484
|
+
│ ├── 1/ — Workspace 1 LanceDB tables
|
|
485
|
+
│ ├── 2/ — Workspace 2 LanceDB tables
|
|
486
|
+
│ └── .../
|
|
487
|
+
└── team/ — Team layer cache (from federation)
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
## Dependencies & Platform Compatibility
|
|
491
|
+
|
|
492
|
+
### LanceDB
|
|
493
|
+
|
|
494
|
+
Use `@lancedb/lancedb` (the official Node.js package). This has native Rust bindings for optimal performance, with a WASM fallback for platforms where native compilation fails.
|
|
495
|
+
|
|
496
|
+
**Installation strategy:**
|
|
497
|
+
|
|
498
|
+
1. Primary: `@lancedb/lancedb` with native bindings (best performance)
|
|
499
|
+
2. Fallback: If native compilation fails during `npm install`, the package provides WASM builds that work everywhere
|
|
500
|
+
3. The package supports Windows (MSVC + MINGW), macOS (Intel + Apple Silicon), and Linux (x64 + ARM64)
|
|
501
|
+
|
|
502
|
+
Since Spaces already depends on `better-sqlite3` (native), users are already set up for native compilation. LanceDB adds ~15MB to the install.
|
|
503
|
+
|
|
504
|
+
### Local Embedding Model
|
|
505
|
+
|
|
506
|
+
For the local embedding fallback, use `@huggingface/transformers` (Transformers.js) which runs models via ONNX Runtime in Node.js. The `all-MiniLM-L6-v2` model is ~23MB and loads once on first use.
|
|
507
|
+
|
|
508
|
+
### Embedding Provider Chain
|
|
509
|
+
|
|
510
|
+
Check for API keys in order: Voyage AI (`VOYAGE_API_KEY`) → OpenAI (`OPENAI_API_KEY`) → local (ONNX). Default to the best available. Anthropic does not offer a public embedding API; Voyage AI is the recommended partner.
|
|
511
|
+
|
|
512
|
+
### Embedding Dimension Management
|
|
513
|
+
|
|
514
|
+
Different providers produce different dimensions (MiniLM: 384, OpenAI: 1536, Voyage: 1024). The Cortex stores the current embedding dimension in config. If the user changes providers:
|
|
515
|
+
|
|
516
|
+
1. Detect dimension mismatch on startup
|
|
517
|
+
2. Warn: "Embedding provider changed. Re-embedding all knowledge units in background."
|
|
518
|
+
3. Queue full re-embedding as a background job (same as bootstrap, but embedding-only)
|
|
519
|
+
4. During transition, old vectors are still searchable (LanceDB handles mixed queries via separate partitions), new results take priority
|
|
520
|
+
|
|
521
|
+
## Error Handling & Resilience
|
|
522
|
+
|
|
523
|
+
### Ingestion Pipeline Failures
|
|
524
|
+
|
|
525
|
+
- **Tier 1 (fast pass):** If a session file is malformed or being actively written to, skip that file and log a warning. Retry on next sync cycle. Never crash the pipeline for a single bad file.
|
|
526
|
+
- **Tier 2 (embedding):** If the embedding API returns an error (rate limit, network, invalid response), move the chunk to a retry queue with exponential backoff (1s, 5s, 30s, 5min). After 5 failures, fall back to local embeddings for that batch. If local also fails, store the chunk as text-only (searchable via FTS but not vector search) and log an error.
|
|
527
|
+
- **Tier 3 (distillation):** If the LLM call fails or returns malformed output, discard that distillation attempt and log. The raw chunks remain searchable. Retry distillation on next idle cycle. Never block ingestion on distillation failures.
|
|
528
|
+
|
|
529
|
+
### LanceDB Corruption Recovery
|
|
530
|
+
|
|
531
|
+
LanceDB uses Arrow IPC format. Partial writes can corrupt tables. Recovery strategy:
|
|
532
|
+
|
|
533
|
+
1. On startup, verify table integrity (LanceDB provides health checks)
|
|
534
|
+
2. If corruption detected, log error, rename corrupt directory to `{layer}.corrupt.{timestamp}/`
|
|
535
|
+
3. Create fresh empty table
|
|
536
|
+
4. Trigger re-ingestion from raw session files (bootstrap in repair mode — embedding-only, no re-parsing)
|
|
537
|
+
5. The raw JSONL session files are the source of truth; LanceDB is a derived index
|
|
538
|
+
|
|
539
|
+
### Graceful Degradation
|
|
540
|
+
|
|
541
|
+
The Cortex continues to function even when components fail:
|
|
542
|
+
|
|
543
|
+
| Failure | Behavior |
|
|
544
|
+
|---------|----------|
|
|
545
|
+
| Embedding API down | Fall back to local embeddings automatically |
|
|
546
|
+
| Local embeddings fail | Store text-only chunks, skip vector search, use FTS keyword matching |
|
|
547
|
+
| LanceDB unavailable | Cortex indicator shows red, injection disabled, MCP tools return empty results |
|
|
548
|
+
| Federation node unreachable | Skip that node's results, merge what's available |
|
|
549
|
+
| Distillation LLM unavailable | Raw chunks still searchable, distillation queued for later |
|
|
550
|
+
| Bootstrap interrupted | Resume from last checkpoint on next run |
|
|
551
|
+
|
|
552
|
+
### Circuit Breaker
|
|
553
|
+
|
|
554
|
+
External API calls (embedding, distillation, federation) use a circuit breaker pattern:
|
|
555
|
+
|
|
556
|
+
- **Closed** (normal): requests flow through
|
|
557
|
+
- **Open** (after 5 consecutive failures): stop calling for 60 seconds, return fallback
|
|
558
|
+
- **Half-open** (after cooldown): try one request, if success → close, if fail → reopen
|
|
559
|
+
|
|
560
|
+
## Non-Claude Agent Injection
|
|
561
|
+
|
|
562
|
+
Claude Code has hook support (`PreToolUse`, `PostToolUse`, `Notification`, `Stop`). However, Claude Code does not currently support a `user-prompt-submit` hook for intercepting prompts before they're sent.
|
|
563
|
+
|
|
564
|
+
**Primary injection strategy (all agents): MCP Tool**
|
|
565
|
+
|
|
566
|
+
The Cortex registers as an MCP server. Claude Code (and any agent that supports MCP) can call `cortex_search` and `cortex_context` as tools. The agent receives cortex context as tool results, which it naturally incorporates.
|
|
567
|
+
|
|
568
|
+
To make this automatic (without the agent needing to know to ask), the Cortex's MCP server description includes instructions telling the agent to query the Cortex at the start of each task. This is how MCP servers like `memory` work today — the server description says "always check memory first."
|
|
569
|
+
|
|
570
|
+
**Secondary injection strategy (future): PTY-level injection**
|
|
571
|
+
|
|
572
|
+
For agents without MCP support, and for the auto-injection experience (user doesn't need to configure anything), a future version could:
|
|
573
|
+
|
|
574
|
+
1. Intercept at the WebSocket layer in `terminal/server.ts` — when a `data` message from the client matches a prompt pattern (newline after text), inject cortex context
|
|
575
|
+
2. This happens before the data reaches node-pty, so the agent sees the enriched prompt
|
|
576
|
+
3. This requires careful handling of escape sequences, binary data, and multi-byte characters
|
|
577
|
+
4. **Deferred to a future phase** — MCP is the v1 approach
|
|
578
|
+
|
|
579
|
+
## Integration with Existing Data Layer
|
|
580
|
+
|
|
581
|
+
### SQLite Cross-References
|
|
582
|
+
|
|
583
|
+
Cortex knowledge units reference SQLite entities via:
|
|
584
|
+
|
|
585
|
+
- `workspace_id` → `workspaces.id` in SQLite
|
|
586
|
+
- `session_id` → `sessions.session_id` in SQLite
|
|
587
|
+
|
|
588
|
+
These are soft references (no foreign key enforcement across databases). The Cortex tolerates dangling references gracefully — if a workspace is deleted from SQLite, its knowledge units remain in LanceDB but are no longer returned in workspace-scoped queries (workspace doesn't exist = no results).
|
|
589
|
+
|
|
590
|
+
### Lifecycle Coupling
|
|
591
|
+
|
|
592
|
+
- **Workspace deleted** → Cortex workspace layer directory is not automatically deleted (knowledge may still be valuable in personal layer). A "Clean up Cortex data" option in UI allows explicit deletion.
|
|
593
|
+
- **Session deleted from SQLite** → Knowledge units sourced from that session remain (the knowledge is independent of the session index).
|
|
594
|
+
- **Bootstrap reads from** → Raw agent JSONL files on disk (not from SQLite). The SQLite index helps map sessions to workspaces, but the actual content comes from the source files.
|
|
595
|
+
|
|
596
|
+
### FTS5 Coexistence
|
|
597
|
+
|
|
598
|
+
The existing FTS5 full-text search (`sessions_fts`) continues to work for session content search. The Cortex adds semantic/vector search on top. The `/api/search` route could be extended to combine FTS5 keyword results with Cortex vector results for hybrid search, but this is not required for v1.
|
|
599
|
+
|
|
600
|
+
## Configuration
|
|
601
|
+
|
|
602
|
+
Cortex settings are stored as a `cortex` key within the existing `~/.spaces/config.json`. This requires adding a `cortex?: CortexConfig` field to the `SpacesConfig` interface in `src/lib/config.ts`, and updating `readConfig`/`writeConfig` to preserve unknown keys (or explicitly handle the `cortex` field). This avoids a separate config file and keeps all Spaces configuration in one place.
|
|
603
|
+
|
|
604
|
+
The `~/.spaces/cortex/` directory contains only LanceDB data files, not configuration.
|
|
605
|
+
|
|
606
|
+
## Performance Budget
|
|
607
|
+
|
|
608
|
+
### Hook/MCP Injection Latency Target: <200ms (local only)
|
|
609
|
+
|
|
610
|
+
| Step | Budget |
|
|
611
|
+
|------|--------|
|
|
612
|
+
| Query signal extraction | 5ms |
|
|
613
|
+
| LanceDB search (personal + workspace) | 20-50ms |
|
|
614
|
+
| Reranking + staleness scoring | 10ms |
|
|
615
|
+
| Result formatting | 5ms |
|
|
616
|
+
| **Total local** | **40-70ms** |
|
|
617
|
+
|
|
618
|
+
Federation queries are fire-and-forget with a 500ms timeout. If federation results arrive before the agent processes the prompt, they're included. If not, local results are sufficient. Federation results may also arrive and be available for the *next* prompt.
|
|
619
|
+
|
|
620
|
+
### Disk Space Management
|
|
621
|
+
|
|
622
|
+
- **Warning threshold:** Cortex UI shows a warning when total Cortex storage exceeds 500MB
|
|
623
|
+
- **Maximum size:** Configurable (default: 2GB). When exceeded, automatic pruning removes lowest-confidence + highest-staleness entries first
|
|
624
|
+
- **Pruning strategy:** Remove `conversation` type chunks first (lowest value), then `command`, then stale `context`. Never auto-prune `decision`, `preference`, or `error_fix` types — these are too valuable.
|
|
625
|
+
|
|
626
|
+
## Active Knowledge Propagation (Cortex-to-Cortex Teaching)
|
|
627
|
+
|
|
628
|
+
In federated environments, Cortex nodes don't just respond to queries — they actively teach each other. High-confidence knowledge propagates across the network automatically, creating a distributed intelligence mesh where every node benefits from every other node's experience.
|
|
629
|
+
|
|
630
|
+
### Propagation Mechanics
|
|
631
|
+
|
|
632
|
+
When a Cortex node produces a knowledge unit that crosses a **propagation threshold**, it becomes a candidate for teaching:
|
|
633
|
+
|
|
634
|
+
| Criteria | Threshold | Rationale |
|
|
635
|
+
|----------|-----------|-----------|
|
|
636
|
+
| Confidence score | ≥ 0.85 | Only propagate knowledge the source node is confident about |
|
|
637
|
+
| Type | `decision`, `pattern`, `preference`, `error_fix` | High-value types only — raw `conversation` and `context` chunks stay local |
|
|
638
|
+
| Layer | `team` | Personal and workspace knowledge are never propagated automatically |
|
|
639
|
+
| Validation | User-validated or repeated 3+ times | Prevents propagation of noise |
|
|
640
|
+
|
|
641
|
+
### Propagation Flow
|
|
642
|
+
|
|
643
|
+
```
|
|
644
|
+
Node A discovers high-confidence pattern
|
|
645
|
+
│
|
|
646
|
+
▼
|
|
647
|
+
Propagation check: confidence ≥ 0.85, team layer, validated type?
|
|
648
|
+
│ yes
|
|
649
|
+
▼
|
|
650
|
+
Package as teaching unit:
|
|
651
|
+
{ knowledge, source_node, confidence, provenance_chain }
|
|
652
|
+
│
|
|
653
|
+
▼
|
|
654
|
+
Push to all paired federation nodes via:
|
|
655
|
+
- Real-time sync: WebSocket push (immediate)
|
|
656
|
+
- Background sync: included in next sync batch
|
|
657
|
+
- Query-only: piggyback on next query response as "suggested knowledge"
|
|
658
|
+
│
|
|
659
|
+
▼
|
|
660
|
+
Receiving node (Node B):
|
|
661
|
+
1. Dedup check — already have this? (cosine similarity > 0.95 → skip)
|
|
662
|
+
2. Contradiction check — conflicts with local knowledge? → flag for review
|
|
663
|
+
3. Confidence adjustment — remote knowledge arrives at 0.8 × source confidence
|
|
664
|
+
(trust but verify — local experience always ranks higher)
|
|
665
|
+
4. Store in team layer with provenance: "Learned from Node A"
|
|
666
|
+
│
|
|
667
|
+
▼
|
|
668
|
+
Node B's agents now benefit from Node A's experience
|
|
669
|
+
```
|
|
670
|
+
|
|
671
|
+
### Provenance Chain
|
|
672
|
+
|
|
673
|
+
Every propagated knowledge unit carries a provenance chain — a record of where the knowledge originated and how it traveled:
|
|
674
|
+
|
|
675
|
+
```json
|
|
676
|
+
{
|
|
677
|
+
"origin_node": "node-abc",
|
|
678
|
+
"origin_timestamp": "2026-03-10T14:30:00Z",
|
|
679
|
+
"hops": [
|
|
680
|
+
{ "node": "node-abc", "confidence": 0.92, "timestamp": "2026-03-10T14:30:00Z" },
|
|
681
|
+
{ "node": "node-def", "confidence": 0.74, "timestamp": "2026-03-10T15:00:00Z" }
|
|
682
|
+
],
|
|
683
|
+
"max_hops": 3
|
|
684
|
+
}
|
|
685
|
+
```
|
|
686
|
+
|
|
687
|
+
**Max hops** prevents knowledge from echoing endlessly across the network. Default: 3 hops. Knowledge that has traveled through 3 nodes is not propagated further (it's available via query delegation if needed).
|
|
688
|
+
|
|
689
|
+
### Confidence Decay Across Hops
|
|
690
|
+
|
|
691
|
+
Each hop multiplies confidence by 0.8 (retains 80%):
|
|
692
|
+
|
|
693
|
+
- **Origin:** 0.92
|
|
694
|
+
- **Hop 1:** 0.92 × 0.8 = 0.74
|
|
695
|
+
- **Hop 2:** 0.74 × 0.8 = 0.59
|
|
696
|
+
- **Hop 3:** 0.59 × 0.8 = 0.47 (no further propagation)
|
|
697
|
+
|
|
698
|
+
This ensures that firsthand knowledge always outranks secondhand knowledge. A node's own direct experience is always the strongest signal.
|
|
699
|
+
|
|
700
|
+
### Contradiction Resolution
|
|
701
|
+
|
|
702
|
+
When propagated knowledge contradicts local knowledge:
|
|
703
|
+
|
|
704
|
+
1. **Local wins by default** — Local knowledge has higher base confidence (no hop decay)
|
|
705
|
+
2. **Flag for review** — The contradiction is surfaced in the Cortex panel: "Node X says Y, but you've been doing Z. Which is correct?"
|
|
706
|
+
3. **User resolves** — User can accept the remote knowledge (updates local), reject it (downranks the remote unit), or mark as "context-dependent" (both valid in different situations)
|
|
707
|
+
4. **Resolution propagates** — If the user explicitly validates remote knowledge, that validation propagates back to the source node as a confidence boost
|
|
708
|
+
|
|
709
|
+
### Rate Limiting
|
|
710
|
+
|
|
711
|
+
- **Per-node-pair:** Max 50 knowledge units pushed per sync cycle
|
|
712
|
+
- **Dedup window:** Knowledge within 0.95 cosine similarity of existing units is silently dropped
|
|
713
|
+
- **Backpressure:** If a receiving node's ingestion queue exceeds 500 items, it signals the sender to slow down
|
|
714
|
+
|
|
715
|
+
## Deferred / Future Considerations
|
|
716
|
+
|
|
717
|
+
- **Knowledge graph visualization** — 3D visualization of how knowledge units relate (could reuse R3F infrastructure)
|
|
718
|
+
- **Auto-CLAUDE.md generation** — Cortex distills its most confident preferences/patterns into a CLAUDE.md file automatically
|
|
719
|
+
- **Multi-modal knowledge** — Screenshots, diagrams, architecture images stored alongside text
|
|
720
|
+
- **Knowledge unit voting** — In teams, members can upvote/downvote knowledge units to improve confidence scoring
|