@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,387 +1,387 @@
|
|
|
1
|
-
# Spaces Architecture
|
|
2
|
-
|
|
3
|
-
Developer reference for the Spaces codebase and the `@spaces/pro` extraction.
|
|
4
|
-
|
|
5
|
-
## System Overview
|
|
6
|
-
|
|
7
|
-
Spaces is a workspace manager for AI coding agents. It runs as two cooperating processes:
|
|
8
|
-
|
|
9
|
-
1. **Next.js app** (port 3457) — Web UI, API routes, SSR pages.
|
|
10
|
-
2. **Terminal server** (port 3458) — WebSocket server that spawns PTY processes via `node-pty` and streams I/O to `xterm.js` in the browser.
|
|
11
|
-
|
|
12
|
-
```
|
|
13
|
-
┌──────────────────────────────────────────────────┐
|
|
14
|
-
│ Browser │
|
|
15
|
-
│ ┌───────────┐ ┌───────────┐ ┌──────────────┐ │
|
|
16
|
-
│ │ xterm.js │ │ React UI │ │ Session │ │
|
|
17
|
-
│ │ (panes) │ │ (sidebar, │ │ browser │ │
|
|
18
|
-
│ │ │ │ dash) │ │ (FTS5) │ │
|
|
19
|
-
│ └─────┬─────┘ └─────┬─────┘ └──────┬───────┘ │
|
|
20
|
-
└────────┼──────────────┼────────────────┼─────────┘
|
|
21
|
-
│ WebSocket │ HTTP │ HTTP
|
|
22
|
-
▼ ▼ ▼
|
|
23
|
-
┌──────────────┐ ┌──────────────────────────┐
|
|
24
|
-
│ terminal- │ │ Next.js API routes │
|
|
25
|
-
│ server.js │ │ (port 3457) │
|
|
26
|
-
│ (port 3458) │ │ │
|
|
27
|
-
│ node-pty │ │ SQLite DB (FTS5) │
|
|
28
|
-
└──────────────┘ └──────────────────────────┘
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
## Open-Core Model
|
|
32
|
-
|
|
33
|
-
The codebase is split into two packages:
|
|
34
|
-
|
|
35
|
-
| Package | Repository | License | Contents |
|
|
36
|
-
|---------|-----------|---------|----------|
|
|
37
|
-
| `agent-spaces` | `jlongo78/spaces` (public) | MIT | Community features, UI, terminal, session browser |
|
|
38
|
-
| `@spaces/pro` | Private | Proprietary | Auth, admin, federation networking |
|
|
39
|
-
|
|
40
|
-
The public repo works standalone for the Community tier. Paid tiers (Server, Team, Federation) require `@spaces/pro` to be installed as an npm dependency.
|
|
41
|
-
|
|
42
|
-
### Extension Bridge (`src/lib/pro.ts`)
|
|
43
|
-
|
|
44
|
-
The bridge uses a lazy `require()` to load `@spaces/pro` at runtime:
|
|
45
|
-
|
|
46
|
-
```typescript
|
|
47
|
-
let _pro: any = null;
|
|
48
|
-
let _checked = false;
|
|
49
|
-
|
|
50
|
-
export function getPro() {
|
|
51
|
-
if (!_checked) {
|
|
52
|
-
try { _pro = require('@spaces/pro'); } catch {}
|
|
53
|
-
_checked = true;
|
|
54
|
-
}
|
|
55
|
-
return _pro;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
export function hasPro(): boolean {
|
|
59
|
-
return getPro() !== null;
|
|
60
|
-
}
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
This allows the public repo to compile and run without `@spaces/pro` present.
|
|
64
|
-
|
|
65
|
-
### Stub Route Pattern
|
|
66
|
-
|
|
67
|
-
API routes that delegate to `@spaces/pro` follow a consistent pattern:
|
|
68
|
-
|
|
69
|
-
```typescript
|
|
70
|
-
import { NextRequest } from 'next/server';
|
|
71
|
-
import { getPro } from '@/lib/pro';
|
|
72
|
-
|
|
73
|
-
const notAvailable = () =>
|
|
74
|
-
Response.json({ error: 'Requires @spaces/pro' }, { status: 404 });
|
|
75
|
-
|
|
76
|
-
export async function POST(req: NextRequest) {
|
|
77
|
-
const pro = getPro();
|
|
78
|
-
return pro?.auth.api.login.POST(req) ?? notAvailable();
|
|
79
|
-
}
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
Routes return 404 with `"Requires @spaces/pro"` when the package is not installed.
|
|
83
|
-
|
|
84
|
-
### Aggregation Pattern
|
|
85
|
-
|
|
86
|
-
Some Community routes have optional federation aggregation. For example, `src/app/api/search/route.ts` returns local results by default, but if `?nodes=all` is passed and `@spaces/pro` is installed, it aggregates results from remote nodes:
|
|
87
|
-
|
|
88
|
-
```typescript
|
|
89
|
-
if (searchParams.get('nodes') === 'all') {
|
|
90
|
-
try {
|
|
91
|
-
const pro = require('@spaces/pro');
|
|
92
|
-
const { aggregateSearch } = pro.network;
|
|
93
|
-
const aggregated = await aggregateSearch(localResults, q, remoteParams);
|
|
94
|
-
return NextResponse.json({ results: aggregated.results, ... });
|
|
95
|
-
} catch { /* return local only */ }
|
|
96
|
-
}
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
## Tier System
|
|
100
|
-
|
|
101
|
-
### How It Works
|
|
102
|
-
|
|
103
|
-
`src/lib/tier.ts` resolves the active tier on startup:
|
|
104
|
-
|
|
105
|
-
1. Read `NEXT_PUBLIC_TIER` env var (fallback: legacy `NEXT_PUBLIC_EDITION`).
|
|
106
|
-
2. If `SPACES_LICENSE` is set, verify the Ed25519 JWT via `src/lib/license.ts`.
|
|
107
|
-
3. Check if `@spaces/pro` is installed via `hasPro()`.
|
|
108
|
-
4. If a paid tier is requested but pro is missing, fall back to `community` with a warning.
|
|
109
|
-
|
|
110
|
-
### Feature Flags
|
|
111
|
-
|
|
112
|
-
| Flag | True when | Controls |
|
|
113
|
-
|------|-----------|----------|
|
|
114
|
-
| `IS_SERVER` | `!= community` | Auth enforcement |
|
|
115
|
-
| `IS_TEAM` | `team \| federation` | Multi-user, admin |
|
|
116
|
-
| `IS_FEDERATION` | `federation` | Networking |
|
|
117
|
-
| `HAS_AUTH` | `= IS_SERVER` | Login required |
|
|
118
|
-
| `HAS_MULTIUSER` | `= IS_TEAM` | User management |
|
|
119
|
-
| `HAS_ADMIN` | `= IS_TEAM` | Admin panel |
|
|
120
|
-
| `HAS_NETWORK` | `= IS_FEDERATION` | Node networking |
|
|
121
|
-
| `IS_DESKTOP` | `= community` | Personal mode |
|
|
122
|
-
|
|
123
|
-
> **Note:** `IS_DESKTOP` is a misnomer. It really means "personal/local mode". Renaming it would touch many files, so it's left as-is with this caveat.
|
|
124
|
-
|
|
125
|
-
### License Verification
|
|
126
|
-
|
|
127
|
-
`src/lib/license.ts` verifies Ed25519-signed JWT tokens offline. The public key is embedded in the source (safe — it's asymmetric). Licenses encode tier, subscriber email, optional `maxUsers`, and expiration.
|
|
128
|
-
|
|
129
|
-
## Database
|
|
130
|
-
|
|
131
|
-
SQLite via `better-sqlite3`, stored at `~/.spaces/spaces.db` (per-user in multi-user mode).
|
|
132
|
-
|
|
133
|
-
### Key Tables
|
|
134
|
-
|
|
135
|
-
- **workspaces** — Named, color-coded workspace groups
|
|
136
|
-
- **sessions** — Agent session metadata (imported from `~/.claude/`, `~/.codex/`, `~/.gemini/`, and project-local `.aider.chat.history.md` files)
|
|
137
|
-
- **messages** — Session messages (FTS5-indexed for full-text search)
|
|
138
|
-
- **projects** — Project directories
|
|
139
|
-
|
|
140
|
-
### Full-Text Search
|
|
141
|
-
|
|
142
|
-
Messages are indexed with SQLite FTS5 for fast search. The search API supports query syntax, project filtering, and pagination.
|
|
143
|
-
|
|
144
|
-
### User-Scoped Data
|
|
145
|
-
|
|
146
|
-
`src/lib/auth.ts` provides `AsyncLocalStorage`-based user context. `withUser(username, fn)` sets the current user for the duration of `fn`, so `getCurrentUser()` resolves correctly in nested calls (e.g., `getDb()` opens the right per-user database).
|
|
147
|
-
|
|
148
|
-
In multi-user mode, `config.ts` resolves the OS shell user via `@spaces/pro`'s `admin.resolveShellUser()` to find the correct `~/.claude/` directory.
|
|
149
|
-
|
|
150
|
-
## Terminal System
|
|
151
|
-
|
|
152
|
-
### Pipeline
|
|
153
|
-
|
|
154
|
-
```
|
|
155
|
-
Browser (xterm.js) ←→ WebSocket ←→ terminal-server.js ←→ node-pty (shell)
|
|
156
|
-
```
|
|
157
|
-
|
|
158
|
-
1. Client opens a WebSocket to `:3458` with query params (cols, rows, shell command, working directory).
|
|
159
|
-
2. `terminal-server.js` spawns a `node-pty` process with the requested shell/agent.
|
|
160
|
-
3. Bidirectional streaming: keystrokes flow in, terminal output flows out.
|
|
161
|
-
4. On disconnect, the PTY is killed after a grace period.
|
|
162
|
-
|
|
163
|
-
### Terminal Tokens
|
|
164
|
-
|
|
165
|
-
In authenticated modes, the terminal server requires a **terminal token** — an HMAC-SHA256 signed payload containing the username, role, and expiration. The secret is stored at `~/.spaces/terminal_secret` (auto-generated, 600 permissions).
|
|
166
|
-
|
|
167
|
-
The Next.js API route `/api/network/terminal/token` issues these tokens (delegated to `@spaces/pro` in paid tiers).
|
|
168
|
-
|
|
169
|
-
### TOTP Gating
|
|
170
|
-
|
|
171
|
-
When TOTP 2FA is enabled, the client-side `<TOTPGate>` component intercepts the UI until the user enters a valid code. The component checks `/api/auth/totp/status` and verifies via `/api/auth/totp/verify`.
|
|
172
|
-
|
|
173
|
-
## Authentication
|
|
174
|
-
|
|
175
|
-
### Session Tokens (Server/Team/Federation)
|
|
176
|
-
|
|
177
|
-
`@spaces/pro` implements cookie-based session auth:
|
|
178
|
-
|
|
179
|
-
1. User POSTs credentials to `/api/auth/login`.
|
|
180
|
-
2. Pro verifies the password hash and issues an HMAC-SHA256 session token.
|
|
181
|
-
3. Token is set as `spaces-session` cookie (24h expiry).
|
|
182
|
-
4. `middleware.ts` (in the public repo) delegates to `@spaces/pro`'s middleware, which:
|
|
183
|
-
- Verifies the cookie signature.
|
|
184
|
-
- Sets `x-auth-user` and `x-auth-role` headers on the forwarded request.
|
|
185
|
-
- Redirects unauthenticated users to `/login`.
|
|
186
|
-
|
|
187
|
-
### Why auth.ts Stays Public
|
|
188
|
-
|
|
189
|
-
`src/lib/auth.ts` provides user context (AsyncLocalStorage), not auth logic. Every API route calls `getAuthUser(request)` and `withUser(user, fn)`. Moving it to pro would break all routes. The actual authentication (password verification, token issuance, middleware enforcement) lives in `@spaces/pro`.
|
|
190
|
-
|
|
191
|
-
## Federation
|
|
192
|
-
|
|
193
|
-
### Node Discovery
|
|
194
|
-
|
|
195
|
-
- **mDNS** (`dns-sd` / Bonjour) — automatic LAN discovery
|
|
196
|
-
- **Manual** — add nodes via `/network` UI or API
|
|
197
|
-
|
|
198
|
-
### API Key Exchange
|
|
199
|
-
|
|
200
|
-
Nodes authenticate to each other using API keys encrypted with AES-256-GCM. The handshake protocol:
|
|
201
|
-
|
|
202
|
-
1. Node A calls `POST /api/network/handshake` on Node B with its identity.
|
|
203
|
-
2. Node B validates, generates an API key, encrypts it, stores the key, and returns the encrypted key.
|
|
204
|
-
3. Node A decrypts and stores. Both nodes can now make authenticated requests.
|
|
205
|
-
|
|
206
|
-
### Cross-Node Aggregation
|
|
207
|
-
|
|
208
|
-
Federation routes aggregate data across nodes. For example, federated search hits local SQLite first, then fans out to all connected nodes via the network client, merges results, and returns a unified response.
|
|
209
|
-
|
|
210
|
-
### Proxy Routing
|
|
211
|
-
|
|
212
|
-
`/api/network/proxy/[nodeId]/[...path]` proxies arbitrary API requests to remote nodes, attaching the stored API key as a Bearer token.
|
|
213
|
-
|
|
214
|
-
## @spaces/pro Module Structure
|
|
215
|
-
|
|
216
|
-
```
|
|
217
|
-
src/
|
|
218
|
-
index.ts # Re-exports: auth, admin, network, middleware
|
|
219
|
-
middleware.ts # Next.js auth middleware (cookie verification)
|
|
220
|
-
auth/
|
|
221
|
-
index.ts # Auth module exports
|
|
222
|
-
session.ts # HMAC-SHA256 session token issuance/verification
|
|
223
|
-
totp.ts # TOTP 2FA (otpauth + qrcode)
|
|
224
|
-
api/ # API route handlers (login, logout, me, totp/*)
|
|
225
|
-
admin/
|
|
226
|
-
index.ts # Admin module exports
|
|
227
|
-
db.ts # Admin SQLite DB (users table, password hashes)
|
|
228
|
-
api/ # API route handlers (users CRUD, analytics)
|
|
229
|
-
network/
|
|
230
|
-
index.ts # Network module exports
|
|
231
|
-
client.ts # HTTP client for inter-node communication
|
|
232
|
-
aggregator.ts # Cross-node data aggregation
|
|
233
|
-
identity.ts # Node identity (nodeId, nodeName)
|
|
234
|
-
auth.ts # API key encryption (AES-256-GCM)
|
|
235
|
-
db.ts # Network SQLite DB (nodes, API keys)
|
|
236
|
-
api/ # 18 API route handlers (nodes, keys, proxy, etc.)
|
|
237
|
-
types/
|
|
238
|
-
network.ts # Shared TypeScript types
|
|
239
|
-
```
|
|
240
|
-
|
|
241
|
-
## What Moved to Pro vs. What Stayed
|
|
242
|
-
|
|
243
|
-
### Moved to `@spaces/pro`
|
|
244
|
-
|
|
245
|
-
| File | Module | Reason |
|
|
246
|
-
|------|--------|--------|
|
|
247
|
-
| `src/lib/session.ts` | `auth` | Session token issuance (auth logic) |
|
|
248
|
-
| `src/lib/totp.ts` | `auth` | TOTP 2FA (auth logic) |
|
|
249
|
-
| `src/lib/db/admin.ts` | `admin` | User management DB |
|
|
250
|
-
| `src/lib/db/network.ts` | `network` | Network/nodes DB |
|
|
251
|
-
| `src/lib/network/client.ts` | `network` | Inter-node HTTP client |
|
|
252
|
-
| `src/lib/network/aggregator.ts` | `network` | Cross-node aggregation |
|
|
253
|
-
| `src/lib/network/identity.ts` | `network` | Node identity management |
|
|
254
|
-
| `src/lib/network/auth.ts` | `network` | API key encryption |
|
|
255
|
-
|
|
256
|
-
### Stayed Public
|
|
257
|
-
|
|
258
|
-
| File | Reason |
|
|
259
|
-
|------|--------|
|
|
260
|
-
| `src/lib/auth.ts` | User context (AsyncLocalStorage), not auth logic. Used by every route. |
|
|
261
|
-
| `src/lib/config.ts` | Path resolution, cost rates. Community needs these. |
|
|
262
|
-
| `src/lib/tier.ts` | Tier resolution. Must run before pro is loaded. |
|
|
263
|
-
| `src/lib/pro.ts` | Bridge to load pro. Must exist in public repo. |
|
|
264
|
-
| `src/lib/license.ts` | License verification. Contains only the public key. |
|
|
265
|
-
| All pages (`src/app/`) | Next.js can't resolve `@/` imports from an npm package. |
|
|
266
|
-
| Client components | Only call API routes (which stub to pro). No server logic. |
|
|
267
|
-
|
|
268
|
-
### Key Decisions
|
|
269
|
-
|
|
270
|
-
- **Pages can't move** — Next.js App Router requires pages in the app directory with `@/` path aliases. An npm package can't use the host app's path aliases.
|
|
271
|
-
- **Client-side network components stay** — Components like the network UI only call API routes. The routes themselves stub to pro. Moving the UI would be unnecessary complexity.
|
|
272
|
-
- **Analytics page is community-tier** — It was previously gated behind auth, but it shows the user's own data. Fixed to be available in all tiers.
|
|
273
|
-
- **`IS_DESKTOP` naming** — Really means "personal/local mode" since Community now runs in the browser too. Left as-is to avoid a large rename.
|
|
274
|
-
- **Server tier value** — Web access is now free in Community. Server's main differentiator is auth/login, which may be thin. Left as 4 tiers for now; could collapse to 3 later.
|
|
275
|
-
|
|
276
|
-
## Development Workflow
|
|
277
|
-
|
|
278
|
-
### Running Both Repos
|
|
279
|
-
|
|
280
|
-
```bash
|
|
281
|
-
# Terminal 1: Build and watch @spaces/pro
|
|
282
|
-
cd spaces-pro
|
|
283
|
-
npm install
|
|
284
|
-
npm run dev # tsc --watch
|
|
285
|
-
|
|
286
|
-
# Terminal 2: Link pro into spaces
|
|
287
|
-
cd spaces
|
|
288
|
-
npm link ../spaces-pro
|
|
289
|
-
|
|
290
|
-
# Terminal 3: Run spaces
|
|
291
|
-
npm run dev # Next.js on :3457
|
|
292
|
-
|
|
293
|
-
# Terminal 4: Run terminal server
|
|
294
|
-
node bin/terminal-server.js # WebSocket on :3458
|
|
295
|
-
```
|
|
296
|
-
|
|
297
|
-
### Building Per Tier
|
|
298
|
-
|
|
299
|
-
```bash
|
|
300
|
-
npm run build # Community (no pro needed)
|
|
301
|
-
npm run build:server # Requires @spaces/pro linked/installed
|
|
302
|
-
npm run build:team # Requires @spaces/pro
|
|
303
|
-
npm run build:federation # Requires @spaces/pro
|
|
304
|
-
```
|
|
305
|
-
|
|
306
|
-
## Debugging
|
|
307
|
-
|
|
308
|
-
### Auth Flow
|
|
309
|
-
|
|
310
|
-
1. Check `NEXT_PUBLIC_TIER` — if `community`, auth is skipped entirely.
|
|
311
|
-
2. Verify `@spaces/pro` is installed: `node -e "require('@spaces/pro')"`.
|
|
312
|
-
3. Check `~/.spaces/session_secret` exists (auto-created on first login).
|
|
313
|
-
4. Inspect the `spaces-session` cookie in browser DevTools.
|
|
314
|
-
5. Look for `x-auth-user` / `x-auth-role` headers in API responses.
|
|
315
|
-
|
|
316
|
-
### Terminal Connection
|
|
317
|
-
|
|
318
|
-
1. Verify terminal server is running on `:3458`.
|
|
319
|
-
2. Check `~/.spaces/terminal_secret` exists.
|
|
320
|
-
3. In authenticated mode, verify terminal token is being issued (check network tab for `/api/network/terminal/token`).
|
|
321
|
-
4. Check browser console for WebSocket connection errors.
|
|
322
|
-
|
|
323
|
-
### Federation
|
|
324
|
-
|
|
325
|
-
1. Both nodes must have completed the handshake (`POST /api/network/handshake`).
|
|
326
|
-
2. Check `~/.spaces/node.json` exists on both nodes.
|
|
327
|
-
3. Verify API keys are stored in the network DB.
|
|
328
|
-
4. Test with `curl -H "Authorization: Bearer <key>" https://node-b/api/network/health`.
|
|
329
|
-
5. For mDNS, ensure `SPACES_TIER=federation` is set on the terminal server.
|
|
330
|
-
|
|
331
|
-
## Deployment
|
|
332
|
-
|
|
333
|
-
### Docker
|
|
334
|
-
|
|
335
|
-
```dockerfile
|
|
336
|
-
FROM node:20-slim
|
|
337
|
-
WORKDIR /app
|
|
338
|
-
COPY package*.json ./
|
|
339
|
-
RUN npm ci --production
|
|
340
|
-
COPY . .
|
|
341
|
-
RUN npm run build:federation
|
|
342
|
-
ENV NEXT_PUBLIC_TIER=federation
|
|
343
|
-
ENV SPACES_TIER=federation
|
|
344
|
-
EXPOSE 3457 3458
|
|
345
|
-
CMD ["node", "bin/spaces.js"]
|
|
346
|
-
```
|
|
347
|
-
|
|
348
|
-
### Nginx Reverse Proxy
|
|
349
|
-
|
|
350
|
-
```nginx
|
|
351
|
-
server {
|
|
352
|
-
listen 443 ssl;
|
|
353
|
-
server_name spaces.example.com;
|
|
354
|
-
|
|
355
|
-
location / {
|
|
356
|
-
proxy_pass http://127.0.0.1:3457;
|
|
357
|
-
proxy_set_header Host $host;
|
|
358
|
-
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
359
|
-
proxy_set_header X-Forwarded-Proto $scheme;
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
location /ws {
|
|
363
|
-
proxy_pass http://127.0.0.1:3458;
|
|
364
|
-
proxy_http_version 1.1;
|
|
365
|
-
proxy_set_header Upgrade $http_upgrade;
|
|
366
|
-
proxy_set_header Connection "upgrade";
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
```
|
|
370
|
-
|
|
371
|
-
### Standalone
|
|
372
|
-
|
|
373
|
-
```bash
|
|
374
|
-
npm run build:federation
|
|
375
|
-
NEXT_PUBLIC_TIER=federation SPACES_TIER=federation node bin/spaces.js
|
|
376
|
-
```
|
|
377
|
-
|
|
378
|
-
`bin/spaces.js` launches both the Next.js server and the terminal server in a single process.
|
|
379
|
-
|
|
380
|
-
## Mobile
|
|
381
|
-
|
|
382
|
-
Routes under `/m/` provide a mobile-optimized layout. The middleware auto-redirects mobile user-agents to `/m/`. Features:
|
|
383
|
-
|
|
384
|
-
- Responsive terminal grid (single pane focus)
|
|
385
|
-
- Voice input (Web Speech API)
|
|
386
|
-
- Touch-friendly session browser
|
|
387
|
-
- Settings at `/m/settings`
|
|
1
|
+
# Spaces Architecture
|
|
2
|
+
|
|
3
|
+
Developer reference for the Spaces codebase and the `@spaces/pro` extraction.
|
|
4
|
+
|
|
5
|
+
## System Overview
|
|
6
|
+
|
|
7
|
+
Spaces is a workspace manager for AI coding agents. It runs as two cooperating processes:
|
|
8
|
+
|
|
9
|
+
1. **Next.js app** (port 3457) — Web UI, API routes, SSR pages.
|
|
10
|
+
2. **Terminal server** (port 3458) — WebSocket server that spawns PTY processes via `node-pty` and streams I/O to `xterm.js` in the browser.
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
┌──────────────────────────────────────────────────┐
|
|
14
|
+
│ Browser │
|
|
15
|
+
│ ┌───────────┐ ┌───────────┐ ┌──────────────┐ │
|
|
16
|
+
│ │ xterm.js │ │ React UI │ │ Session │ │
|
|
17
|
+
│ │ (panes) │ │ (sidebar, │ │ browser │ │
|
|
18
|
+
│ │ │ │ dash) │ │ (FTS5) │ │
|
|
19
|
+
│ └─────┬─────┘ └─────┬─────┘ └──────┬───────┘ │
|
|
20
|
+
└────────┼──────────────┼────────────────┼─────────┘
|
|
21
|
+
│ WebSocket │ HTTP │ HTTP
|
|
22
|
+
▼ ▼ ▼
|
|
23
|
+
┌──────────────┐ ┌──────────────────────────┐
|
|
24
|
+
│ terminal- │ │ Next.js API routes │
|
|
25
|
+
│ server.js │ │ (port 3457) │
|
|
26
|
+
│ (port 3458) │ │ │
|
|
27
|
+
│ node-pty │ │ SQLite DB (FTS5) │
|
|
28
|
+
└──────────────┘ └──────────────────────────┘
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Open-Core Model
|
|
32
|
+
|
|
33
|
+
The codebase is split into two packages:
|
|
34
|
+
|
|
35
|
+
| Package | Repository | License | Contents |
|
|
36
|
+
|---------|-----------|---------|----------|
|
|
37
|
+
| `agent-spaces` | `jlongo78/spaces` (public) | MIT | Community features, UI, terminal, session browser |
|
|
38
|
+
| `@spaces/pro` | Private | Proprietary | Auth, admin, federation networking |
|
|
39
|
+
|
|
40
|
+
The public repo works standalone for the Community tier. Paid tiers (Server, Team, Federation) require `@spaces/pro` to be installed as an npm dependency.
|
|
41
|
+
|
|
42
|
+
### Extension Bridge (`src/lib/pro.ts`)
|
|
43
|
+
|
|
44
|
+
The bridge uses a lazy `require()` to load `@spaces/pro` at runtime:
|
|
45
|
+
|
|
46
|
+
```typescript
|
|
47
|
+
let _pro: any = null;
|
|
48
|
+
let _checked = false;
|
|
49
|
+
|
|
50
|
+
export function getPro() {
|
|
51
|
+
if (!_checked) {
|
|
52
|
+
try { _pro = require('@spaces/pro'); } catch {}
|
|
53
|
+
_checked = true;
|
|
54
|
+
}
|
|
55
|
+
return _pro;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export function hasPro(): boolean {
|
|
59
|
+
return getPro() !== null;
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
This allows the public repo to compile and run without `@spaces/pro` present.
|
|
64
|
+
|
|
65
|
+
### Stub Route Pattern
|
|
66
|
+
|
|
67
|
+
API routes that delegate to `@spaces/pro` follow a consistent pattern:
|
|
68
|
+
|
|
69
|
+
```typescript
|
|
70
|
+
import { NextRequest } from 'next/server';
|
|
71
|
+
import { getPro } from '@/lib/pro';
|
|
72
|
+
|
|
73
|
+
const notAvailable = () =>
|
|
74
|
+
Response.json({ error: 'Requires @spaces/pro' }, { status: 404 });
|
|
75
|
+
|
|
76
|
+
export async function POST(req: NextRequest) {
|
|
77
|
+
const pro = getPro();
|
|
78
|
+
return pro?.auth.api.login.POST(req) ?? notAvailable();
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Routes return 404 with `"Requires @spaces/pro"` when the package is not installed.
|
|
83
|
+
|
|
84
|
+
### Aggregation Pattern
|
|
85
|
+
|
|
86
|
+
Some Community routes have optional federation aggregation. For example, `src/app/api/search/route.ts` returns local results by default, but if `?nodes=all` is passed and `@spaces/pro` is installed, it aggregates results from remote nodes:
|
|
87
|
+
|
|
88
|
+
```typescript
|
|
89
|
+
if (searchParams.get('nodes') === 'all') {
|
|
90
|
+
try {
|
|
91
|
+
const pro = require('@spaces/pro');
|
|
92
|
+
const { aggregateSearch } = pro.network;
|
|
93
|
+
const aggregated = await aggregateSearch(localResults, q, remoteParams);
|
|
94
|
+
return NextResponse.json({ results: aggregated.results, ... });
|
|
95
|
+
} catch { /* return local only */ }
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Tier System
|
|
100
|
+
|
|
101
|
+
### How It Works
|
|
102
|
+
|
|
103
|
+
`src/lib/tier.ts` resolves the active tier on startup:
|
|
104
|
+
|
|
105
|
+
1. Read `NEXT_PUBLIC_TIER` env var (fallback: legacy `NEXT_PUBLIC_EDITION`).
|
|
106
|
+
2. If `SPACES_LICENSE` is set, verify the Ed25519 JWT via `src/lib/license.ts`.
|
|
107
|
+
3. Check if `@spaces/pro` is installed via `hasPro()`.
|
|
108
|
+
4. If a paid tier is requested but pro is missing, fall back to `community` with a warning.
|
|
109
|
+
|
|
110
|
+
### Feature Flags
|
|
111
|
+
|
|
112
|
+
| Flag | True when | Controls |
|
|
113
|
+
|------|-----------|----------|
|
|
114
|
+
| `IS_SERVER` | `!= community` | Auth enforcement |
|
|
115
|
+
| `IS_TEAM` | `team \| federation` | Multi-user, admin |
|
|
116
|
+
| `IS_FEDERATION` | `federation` | Networking |
|
|
117
|
+
| `HAS_AUTH` | `= IS_SERVER` | Login required |
|
|
118
|
+
| `HAS_MULTIUSER` | `= IS_TEAM` | User management |
|
|
119
|
+
| `HAS_ADMIN` | `= IS_TEAM` | Admin panel |
|
|
120
|
+
| `HAS_NETWORK` | `= IS_FEDERATION` | Node networking |
|
|
121
|
+
| `IS_DESKTOP` | `= community` | Personal mode |
|
|
122
|
+
|
|
123
|
+
> **Note:** `IS_DESKTOP` is a misnomer. It really means "personal/local mode". Renaming it would touch many files, so it's left as-is with this caveat.
|
|
124
|
+
|
|
125
|
+
### License Verification
|
|
126
|
+
|
|
127
|
+
`src/lib/license.ts` verifies Ed25519-signed JWT tokens offline. The public key is embedded in the source (safe — it's asymmetric). Licenses encode tier, subscriber email, optional `maxUsers`, and expiration.
|
|
128
|
+
|
|
129
|
+
## Database
|
|
130
|
+
|
|
131
|
+
SQLite via `better-sqlite3`, stored at `~/.spaces/spaces.db` (per-user in multi-user mode).
|
|
132
|
+
|
|
133
|
+
### Key Tables
|
|
134
|
+
|
|
135
|
+
- **workspaces** — Named, color-coded workspace groups
|
|
136
|
+
- **sessions** — Agent session metadata (imported from `~/.claude/`, `~/.codex/`, `~/.gemini/`, and project-local `.aider.chat.history.md` files)
|
|
137
|
+
- **messages** — Session messages (FTS5-indexed for full-text search)
|
|
138
|
+
- **projects** — Project directories
|
|
139
|
+
|
|
140
|
+
### Full-Text Search
|
|
141
|
+
|
|
142
|
+
Messages are indexed with SQLite FTS5 for fast search. The search API supports query syntax, project filtering, and pagination.
|
|
143
|
+
|
|
144
|
+
### User-Scoped Data
|
|
145
|
+
|
|
146
|
+
`src/lib/auth.ts` provides `AsyncLocalStorage`-based user context. `withUser(username, fn)` sets the current user for the duration of `fn`, so `getCurrentUser()` resolves correctly in nested calls (e.g., `getDb()` opens the right per-user database).
|
|
147
|
+
|
|
148
|
+
In multi-user mode, `config.ts` resolves the OS shell user via `@spaces/pro`'s `admin.resolveShellUser()` to find the correct `~/.claude/` directory.
|
|
149
|
+
|
|
150
|
+
## Terminal System
|
|
151
|
+
|
|
152
|
+
### Pipeline
|
|
153
|
+
|
|
154
|
+
```
|
|
155
|
+
Browser (xterm.js) ←→ WebSocket ←→ terminal-server.js ←→ node-pty (shell)
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
1. Client opens a WebSocket to `:3458` with query params (cols, rows, shell command, working directory).
|
|
159
|
+
2. `terminal-server.js` spawns a `node-pty` process with the requested shell/agent.
|
|
160
|
+
3. Bidirectional streaming: keystrokes flow in, terminal output flows out.
|
|
161
|
+
4. On disconnect, the PTY is killed after a grace period.
|
|
162
|
+
|
|
163
|
+
### Terminal Tokens
|
|
164
|
+
|
|
165
|
+
In authenticated modes, the terminal server requires a **terminal token** — an HMAC-SHA256 signed payload containing the username, role, and expiration. The secret is stored at `~/.spaces/terminal_secret` (auto-generated, 600 permissions).
|
|
166
|
+
|
|
167
|
+
The Next.js API route `/api/network/terminal/token` issues these tokens (delegated to `@spaces/pro` in paid tiers).
|
|
168
|
+
|
|
169
|
+
### TOTP Gating
|
|
170
|
+
|
|
171
|
+
When TOTP 2FA is enabled, the client-side `<TOTPGate>` component intercepts the UI until the user enters a valid code. The component checks `/api/auth/totp/status` and verifies via `/api/auth/totp/verify`.
|
|
172
|
+
|
|
173
|
+
## Authentication
|
|
174
|
+
|
|
175
|
+
### Session Tokens (Server/Team/Federation)
|
|
176
|
+
|
|
177
|
+
`@spaces/pro` implements cookie-based session auth:
|
|
178
|
+
|
|
179
|
+
1. User POSTs credentials to `/api/auth/login`.
|
|
180
|
+
2. Pro verifies the password hash and issues an HMAC-SHA256 session token.
|
|
181
|
+
3. Token is set as `spaces-session` cookie (24h expiry).
|
|
182
|
+
4. `middleware.ts` (in the public repo) delegates to `@spaces/pro`'s middleware, which:
|
|
183
|
+
- Verifies the cookie signature.
|
|
184
|
+
- Sets `x-auth-user` and `x-auth-role` headers on the forwarded request.
|
|
185
|
+
- Redirects unauthenticated users to `/login`.
|
|
186
|
+
|
|
187
|
+
### Why auth.ts Stays Public
|
|
188
|
+
|
|
189
|
+
`src/lib/auth.ts` provides user context (AsyncLocalStorage), not auth logic. Every API route calls `getAuthUser(request)` and `withUser(user, fn)`. Moving it to pro would break all routes. The actual authentication (password verification, token issuance, middleware enforcement) lives in `@spaces/pro`.
|
|
190
|
+
|
|
191
|
+
## Federation
|
|
192
|
+
|
|
193
|
+
### Node Discovery
|
|
194
|
+
|
|
195
|
+
- **mDNS** (`dns-sd` / Bonjour) — automatic LAN discovery
|
|
196
|
+
- **Manual** — add nodes via `/network` UI or API
|
|
197
|
+
|
|
198
|
+
### API Key Exchange
|
|
199
|
+
|
|
200
|
+
Nodes authenticate to each other using API keys encrypted with AES-256-GCM. The handshake protocol:
|
|
201
|
+
|
|
202
|
+
1. Node A calls `POST /api/network/handshake` on Node B with its identity.
|
|
203
|
+
2. Node B validates, generates an API key, encrypts it, stores the key, and returns the encrypted key.
|
|
204
|
+
3. Node A decrypts and stores. Both nodes can now make authenticated requests.
|
|
205
|
+
|
|
206
|
+
### Cross-Node Aggregation
|
|
207
|
+
|
|
208
|
+
Federation routes aggregate data across nodes. For example, federated search hits local SQLite first, then fans out to all connected nodes via the network client, merges results, and returns a unified response.
|
|
209
|
+
|
|
210
|
+
### Proxy Routing
|
|
211
|
+
|
|
212
|
+
`/api/network/proxy/[nodeId]/[...path]` proxies arbitrary API requests to remote nodes, attaching the stored API key as a Bearer token.
|
|
213
|
+
|
|
214
|
+
## @spaces/pro Module Structure
|
|
215
|
+
|
|
216
|
+
```
|
|
217
|
+
src/
|
|
218
|
+
index.ts # Re-exports: auth, admin, network, middleware
|
|
219
|
+
middleware.ts # Next.js auth middleware (cookie verification)
|
|
220
|
+
auth/
|
|
221
|
+
index.ts # Auth module exports
|
|
222
|
+
session.ts # HMAC-SHA256 session token issuance/verification
|
|
223
|
+
totp.ts # TOTP 2FA (otpauth + qrcode)
|
|
224
|
+
api/ # API route handlers (login, logout, me, totp/*)
|
|
225
|
+
admin/
|
|
226
|
+
index.ts # Admin module exports
|
|
227
|
+
db.ts # Admin SQLite DB (users table, password hashes)
|
|
228
|
+
api/ # API route handlers (users CRUD, analytics)
|
|
229
|
+
network/
|
|
230
|
+
index.ts # Network module exports
|
|
231
|
+
client.ts # HTTP client for inter-node communication
|
|
232
|
+
aggregator.ts # Cross-node data aggregation
|
|
233
|
+
identity.ts # Node identity (nodeId, nodeName)
|
|
234
|
+
auth.ts # API key encryption (AES-256-GCM)
|
|
235
|
+
db.ts # Network SQLite DB (nodes, API keys)
|
|
236
|
+
api/ # 18 API route handlers (nodes, keys, proxy, etc.)
|
|
237
|
+
types/
|
|
238
|
+
network.ts # Shared TypeScript types
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
## What Moved to Pro vs. What Stayed
|
|
242
|
+
|
|
243
|
+
### Moved to `@spaces/pro`
|
|
244
|
+
|
|
245
|
+
| File | Module | Reason |
|
|
246
|
+
|------|--------|--------|
|
|
247
|
+
| `src/lib/session.ts` | `auth` | Session token issuance (auth logic) |
|
|
248
|
+
| `src/lib/totp.ts` | `auth` | TOTP 2FA (auth logic) |
|
|
249
|
+
| `src/lib/db/admin.ts` | `admin` | User management DB |
|
|
250
|
+
| `src/lib/db/network.ts` | `network` | Network/nodes DB |
|
|
251
|
+
| `src/lib/network/client.ts` | `network` | Inter-node HTTP client |
|
|
252
|
+
| `src/lib/network/aggregator.ts` | `network` | Cross-node aggregation |
|
|
253
|
+
| `src/lib/network/identity.ts` | `network` | Node identity management |
|
|
254
|
+
| `src/lib/network/auth.ts` | `network` | API key encryption |
|
|
255
|
+
|
|
256
|
+
### Stayed Public
|
|
257
|
+
|
|
258
|
+
| File | Reason |
|
|
259
|
+
|------|--------|
|
|
260
|
+
| `src/lib/auth.ts` | User context (AsyncLocalStorage), not auth logic. Used by every route. |
|
|
261
|
+
| `src/lib/config.ts` | Path resolution, cost rates. Community needs these. |
|
|
262
|
+
| `src/lib/tier.ts` | Tier resolution. Must run before pro is loaded. |
|
|
263
|
+
| `src/lib/pro.ts` | Bridge to load pro. Must exist in public repo. |
|
|
264
|
+
| `src/lib/license.ts` | License verification. Contains only the public key. |
|
|
265
|
+
| All pages (`src/app/`) | Next.js can't resolve `@/` imports from an npm package. |
|
|
266
|
+
| Client components | Only call API routes (which stub to pro). No server logic. |
|
|
267
|
+
|
|
268
|
+
### Key Decisions
|
|
269
|
+
|
|
270
|
+
- **Pages can't move** — Next.js App Router requires pages in the app directory with `@/` path aliases. An npm package can't use the host app's path aliases.
|
|
271
|
+
- **Client-side network components stay** — Components like the network UI only call API routes. The routes themselves stub to pro. Moving the UI would be unnecessary complexity.
|
|
272
|
+
- **Analytics page is community-tier** — It was previously gated behind auth, but it shows the user's own data. Fixed to be available in all tiers.
|
|
273
|
+
- **`IS_DESKTOP` naming** — Really means "personal/local mode" since Community now runs in the browser too. Left as-is to avoid a large rename.
|
|
274
|
+
- **Server tier value** — Web access is now free in Community. Server's main differentiator is auth/login, which may be thin. Left as 4 tiers for now; could collapse to 3 later.
|
|
275
|
+
|
|
276
|
+
## Development Workflow
|
|
277
|
+
|
|
278
|
+
### Running Both Repos
|
|
279
|
+
|
|
280
|
+
```bash
|
|
281
|
+
# Terminal 1: Build and watch @spaces/pro
|
|
282
|
+
cd spaces-pro
|
|
283
|
+
npm install
|
|
284
|
+
npm run dev # tsc --watch
|
|
285
|
+
|
|
286
|
+
# Terminal 2: Link pro into spaces
|
|
287
|
+
cd spaces
|
|
288
|
+
npm link ../spaces-pro
|
|
289
|
+
|
|
290
|
+
# Terminal 3: Run spaces
|
|
291
|
+
npm run dev # Next.js on :3457
|
|
292
|
+
|
|
293
|
+
# Terminal 4: Run terminal server
|
|
294
|
+
node bin/terminal-server.js # WebSocket on :3458
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
### Building Per Tier
|
|
298
|
+
|
|
299
|
+
```bash
|
|
300
|
+
npm run build # Community (no pro needed)
|
|
301
|
+
npm run build:server # Requires @spaces/pro linked/installed
|
|
302
|
+
npm run build:team # Requires @spaces/pro
|
|
303
|
+
npm run build:federation # Requires @spaces/pro
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
## Debugging
|
|
307
|
+
|
|
308
|
+
### Auth Flow
|
|
309
|
+
|
|
310
|
+
1. Check `NEXT_PUBLIC_TIER` — if `community`, auth is skipped entirely.
|
|
311
|
+
2. Verify `@spaces/pro` is installed: `node -e "require('@spaces/pro')"`.
|
|
312
|
+
3. Check `~/.spaces/session_secret` exists (auto-created on first login).
|
|
313
|
+
4. Inspect the `spaces-session` cookie in browser DevTools.
|
|
314
|
+
5. Look for `x-auth-user` / `x-auth-role` headers in API responses.
|
|
315
|
+
|
|
316
|
+
### Terminal Connection
|
|
317
|
+
|
|
318
|
+
1. Verify terminal server is running on `:3458`.
|
|
319
|
+
2. Check `~/.spaces/terminal_secret` exists.
|
|
320
|
+
3. In authenticated mode, verify terminal token is being issued (check network tab for `/api/network/terminal/token`).
|
|
321
|
+
4. Check browser console for WebSocket connection errors.
|
|
322
|
+
|
|
323
|
+
### Federation
|
|
324
|
+
|
|
325
|
+
1. Both nodes must have completed the handshake (`POST /api/network/handshake`).
|
|
326
|
+
2. Check `~/.spaces/node.json` exists on both nodes.
|
|
327
|
+
3. Verify API keys are stored in the network DB.
|
|
328
|
+
4. Test with `curl -H "Authorization: Bearer <key>" https://node-b/api/network/health`.
|
|
329
|
+
5. For mDNS, ensure `SPACES_TIER=federation` is set on the terminal server.
|
|
330
|
+
|
|
331
|
+
## Deployment
|
|
332
|
+
|
|
333
|
+
### Docker
|
|
334
|
+
|
|
335
|
+
```dockerfile
|
|
336
|
+
FROM node:20-slim
|
|
337
|
+
WORKDIR /app
|
|
338
|
+
COPY package*.json ./
|
|
339
|
+
RUN npm ci --production
|
|
340
|
+
COPY . .
|
|
341
|
+
RUN npm run build:federation
|
|
342
|
+
ENV NEXT_PUBLIC_TIER=federation
|
|
343
|
+
ENV SPACES_TIER=federation
|
|
344
|
+
EXPOSE 3457 3458
|
|
345
|
+
CMD ["node", "bin/spaces.js"]
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
### Nginx Reverse Proxy
|
|
349
|
+
|
|
350
|
+
```nginx
|
|
351
|
+
server {
|
|
352
|
+
listen 443 ssl;
|
|
353
|
+
server_name spaces.example.com;
|
|
354
|
+
|
|
355
|
+
location / {
|
|
356
|
+
proxy_pass http://127.0.0.1:3457;
|
|
357
|
+
proxy_set_header Host $host;
|
|
358
|
+
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
359
|
+
proxy_set_header X-Forwarded-Proto $scheme;
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
location /ws {
|
|
363
|
+
proxy_pass http://127.0.0.1:3458;
|
|
364
|
+
proxy_http_version 1.1;
|
|
365
|
+
proxy_set_header Upgrade $http_upgrade;
|
|
366
|
+
proxy_set_header Connection "upgrade";
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
### Standalone
|
|
372
|
+
|
|
373
|
+
```bash
|
|
374
|
+
npm run build:federation
|
|
375
|
+
NEXT_PUBLIC_TIER=federation SPACES_TIER=federation node bin/spaces.js
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
`bin/spaces.js` launches both the Next.js server and the terminal server in a single process.
|
|
379
|
+
|
|
380
|
+
## Mobile
|
|
381
|
+
|
|
382
|
+
Routes under `/m/` provide a mobile-optimized layout. The middleware auto-redirects mobile user-agents to `/m/`. Features:
|
|
383
|
+
|
|
384
|
+
- Responsive terminal grid (single pane focus)
|
|
385
|
+
- Voice input (Web Speech API)
|
|
386
|
+
- Touch-friendly session browser
|
|
387
|
+
- Settings at `/m/settings`
|