@jlongo78/agent-spaces 0.10.0-beta.2 → 0.10.0-beta.4
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/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/build-manifest.json +2 -2
- 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_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_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/admin/analytics/route.js +4 -2
- package/.next/standalone/.next/server/app/api/admin/analytics/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/admin/users/[id]/route.js +4 -2
- package/.next/standalone/.next/server/app/api/admin/users/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/admin/users/route.js +4 -2
- package/.next/standalone/.next/server/app/api/admin/users/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/analytics/overview/route.js +5 -4
- package/.next/standalone/.next/server/app/api/analytics/overview/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/login/route.js +3 -2
- package/.next/standalone/.next/server/app/api/auth/login/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/logout/route.js +2 -2
- package/.next/standalone/.next/server/app/api/auth/logout/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/me/route.js +3 -2
- package/.next/standalone/.next/server/app/api/auth/me/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/totp/setup/route.js +2 -2
- package/.next/standalone/.next/server/app/api/auth/totp/setup/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/totp/status/route.js +2 -2
- package/.next/standalone/.next/server/app/api/auth/totp/status/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/totp/verify/route.js +3 -2
- package/.next/standalone/.next/server/app/api/auth/totp/verify/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/benchmark/lobes/route.js +4 -3
- 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 +4 -3
- 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 +4 -3
- 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 +4 -3
- 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 +4 -3
- 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 +5 -4
- package/.next/standalone/.next/server/app/api/bulk/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/chat/route.js +4 -2
- package/.next/standalone/.next/server/app/api/chat/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/claude/usage/route.js +5 -4
- package/.next/standalone/.next/server/app/api/claude/usage/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/config/route.js +3 -3
- 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 +4 -3
- 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 +4 -3
- 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 +4 -3
- 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 +4 -3
- 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 +4 -3
- 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 +4 -3
- 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 +4 -3
- 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 +4 -3
- 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 +4 -3
- 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 +4 -3
- 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 +4 -3
- 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 +4 -3
- 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 +4 -3
- 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 +4 -3
- 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 +4 -3
- 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 +4 -3
- 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 +4 -3
- 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 +4 -3
- 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 +4 -3
- 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 +4 -3
- 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 +4 -3
- 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 +4 -3
- 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 +4 -3
- 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 +4 -3
- 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 +3 -3
- 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 +3 -3
- 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 +4 -3
- 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 +4 -3
- 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 +4 -3
- 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 +4 -3
- 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 +4 -3
- 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 +4 -3
- 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 +4 -3
- 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 +4 -3
- 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 +5 -3
- package/.next/standalone/.next/server/app/api/events/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/files/route.js +3 -2
- package/.next/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/folders/route.js +3 -3
- package/.next/standalone/.next/server/app/api/folders/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/network/connect-callback/route.js +2 -2
- package/.next/standalone/.next/server/app/api/network/connect-callback/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/network/connect-request/[id]/route.js +2 -2
- package/.next/standalone/.next/server/app/api/network/connect-request/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/network/connect-request/route.js +2 -2
- package/.next/standalone/.next/server/app/api/network/connect-request/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/network/discovered/route.js +2 -2
- package/.next/standalone/.next/server/app/api/network/discovered/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/network/handshake/route.js +4 -3
- package/.next/standalone/.next/server/app/api/network/handshake/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/network/health/route.js +2 -2
- package/.next/standalone/.next/server/app/api/network/health/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/network/identity/route.js +2 -2
- package/.next/standalone/.next/server/app/api/network/identity/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/network/keys/[id]/route.js +2 -2
- package/.next/standalone/.next/server/app/api/network/keys/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/network/keys/route.js +2 -2
- package/.next/standalone/.next/server/app/api/network/keys/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/network/nodes/[id]/route.js +2 -2
- package/.next/standalone/.next/server/app/api/network/nodes/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/network/nodes/check/route.js +2 -2
- package/.next/standalone/.next/server/app/api/network/nodes/check/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/network/nodes/route.js +2 -2
- package/.next/standalone/.next/server/app/api/network/nodes/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/network/panes/[id]/route.js +6 -5
- 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 +6 -5
- 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 +6 -5
- package/.next/standalone/.next/server/app/api/network/projects/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/network/proxy/[nodeId]/[...path]/route.js +2 -2
- package/.next/standalone/.next/server/app/api/network/proxy/[nodeId]/[...path]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/network/search/route.js +6 -5
- 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 +6 -5
- 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 +6 -5
- 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 +6 -5
- package/.next/standalone/.next/server/app/api/network/sessions/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/network/terminal/token/route.js +2 -2
- package/.next/standalone/.next/server/app/api/network/terminal/token/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/network/workspaces/[id]/route.js +6 -5
- 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 +6 -5
- 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 +5 -4
- 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 +5 -4
- 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 +5 -4
- package/.next/standalone/.next/server/app/api/panes/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/projects/route.js +5 -4
- 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 +3 -3
- 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 +3 -3
- 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 +6 -5
- package/.next/standalone/.next/server/app/api/search/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/server-config/route.js +2 -2
- package/.next/standalone/.next/server/app/api/server-config/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/sessions/[id]/chat/route.js +5 -3
- 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 +5 -4
- 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 +5 -4
- 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 +6 -5
- package/.next/standalone/.next/server/app/api/sessions/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/sync/route.js +4 -3
- package/.next/standalone/.next/server/app/api/sync/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/tags/route.js +5 -4
- package/.next/standalone/.next/server/app/api/tags/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/tier/route.js +4 -3
- package/.next/standalone/.next/server/app/api/tier/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/updates/route.js +2 -2
- package/.next/standalone/.next/server/app/api/updates/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/whisper/config/route.js +2 -2
- 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 +2 -2
- package/.next/standalone/.next/server/app/api/whisper/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/wizard/chat/route.js +3 -3
- 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 +5 -3
- 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 +5 -3
- 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 +5 -3
- 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 +5 -3
- 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 +5 -4
- 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 +5 -4
- package/.next/standalone/.next/server/app/api/workspaces/[id]/sessions/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/workspaces/[id]/todos/[todoId]/route.js +5 -4
- package/.next/standalone/.next/server/app/api/workspaces/[id]/todos/[todoId]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/workspaces/[id]/todos/route.js +5 -4
- package/.next/standalone/.next/server/app/api/workspaces/[id]/todos/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/workspaces/route.js +6 -5
- 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 +2 -2
- package/.next/standalone/.next/server/app/cortex.segments/!KGRlc2t0b3Ap/cortex/__PAGE__.segment.rsc +1 -1
- 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 +2 -2
- 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/icon.png/route.js +2 -2
- package/.next/standalone/.next/server/app/icon.png/route.js.nft.json +1 -1
- 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_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 +2 -2
- package/.next/standalone/.next/server/app/m/terminal.segments/_full.segment.rsc +2 -2
- 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 +1 -1
- 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_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/vr.html +1 -1
- package/.next/standalone/.next/server/app/vr.rsc +2 -2
- package/.next/standalone/.next/server/app/vr.segments/_full.segment.rsc +2 -2
- 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 +1 -1
- 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/chunks/[root-of-the-server]__0cf5ebdb._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0f15af1e._.js +78 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__107eab8a._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1094360c._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__118ea5e0._.js +42 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__160e7c73._.js +5 -5
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__16d4da21._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1c542684._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1f23bae4._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1faefa3e._.js +19 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__2145098e._.js +42 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__2748c76c._.js +42 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__2c08d908._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__2e29b4bd._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__e3ecfd17._.js → [root-of-the-server]__34fd47d2._.js} +3 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__366b6cec._.js +78 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__4d51508f._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__5663673e._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__57e0cc31._.js +133 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__57ebbe63._.js +42 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__5d3345e4._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__5ee7aa9d._.js +11 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__60caf825._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__65c9857f._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__678f6823._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__685c95d8._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__41d4d426._.js → [root-of-the-server]__69568dc2._.js} +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__6a0bc4ae._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__6b876561._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__6e89713c._.js +42 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__6f713737._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__725f10f4._.js +78 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__785b0597._.js +38 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__7c728bed._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__7da958b5._.js +42 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__7daed406._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__7f140e4b._.js +78 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__80d826f7._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__83a3c97b._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__84c15a0e._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__85c33341._.js +42 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__88f3d920._.js +78 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__8c916e85._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__8deb2ae3._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__8df5a740._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__8f238bd9._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__955ab668._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__9a061e91._.js +42 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__a04a87d5._.js +42 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__a803051f._.js +42 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__ac0a9b09._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__ac3e37b6._.js +13 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__96685488._.js → [root-of-the-server]__add9e50d._.js} +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__b57f4274._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__b84b3426._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__ba8224a1._.js +42 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__bd1c1d0d._.js +42 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__c1442c38._.js +42 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__c18bdab2._.js +42 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__c1efc6a8._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__c697b87e._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__c6dc43c6._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__ccce7f4f._.js +78 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__d92f347c._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__dac9e21e._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__e3f9ddbc._.js +78 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__e66fc05f._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__e7add82c._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__fa9a5ec0._.js +42 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__ff9f6af0._.js +42 -0
- package/.next/standalone/.next/server/chunks/_0142f96b._.js +3 -0
- package/.next/standalone/.next/server/chunks/_0ebd30d3._.js +3 -0
- package/.next/standalone/.next/server/chunks/_19a59078._.js +3 -0
- package/.next/standalone/.next/server/chunks/_1bc02021._.js +11 -0
- package/.next/standalone/.next/server/chunks/_1e381a28._.js +3 -0
- package/.next/standalone/.next/server/chunks/_2699eda7._.js +3 -0
- package/.next/standalone/.next/server/chunks/_2fd02f70._.js +3 -0
- package/.next/standalone/.next/server/chunks/_373d522f._.js +3 -0
- package/.next/standalone/.next/server/chunks/_43fc1196._.js +3 -0
- package/.next/standalone/.next/server/chunks/_48ec4374._.js +3 -0
- package/.next/standalone/.next/server/chunks/_563d9ecc._.js +3 -0
- package/.next/standalone/.next/server/chunks/_583f9ae2._.js +3 -0
- package/.next/standalone/.next/server/chunks/_5a167705._.js +3 -0
- package/.next/standalone/.next/server/chunks/_5a8cc3a5._.js +3 -0
- package/.next/standalone/.next/server/chunks/_5d894fb4._.js +3 -0
- package/.next/standalone/.next/server/chunks/_6bbf8264._.js +3 -0
- package/.next/standalone/.next/server/chunks/_6c4bcec1._.js +3 -0
- package/.next/standalone/.next/server/chunks/_7a29d111._.js +3 -0
- package/.next/standalone/.next/server/chunks/_7d3bab25._.js +3 -0
- package/.next/standalone/.next/server/chunks/_7ed4d1a4._.js +3 -0
- package/.next/standalone/.next/server/chunks/_8072d20c._.js +3 -0
- package/.next/standalone/.next/server/chunks/_81b87c01._.js +3 -0
- package/.next/standalone/.next/server/chunks/_881b7b28._.js +3 -0
- package/.next/standalone/.next/server/chunks/_902a1d56._.js +3 -0
- package/.next/standalone/.next/server/chunks/_96258f1c._.js +3 -0
- package/.next/standalone/.next/server/chunks/_96f79f8f._.js +3 -0
- package/.next/standalone/.next/server/chunks/_a0379bc2._.js +3 -0
- package/.next/standalone/.next/server/chunks/_a0f604e8._.js +3 -0
- package/.next/standalone/.next/server/chunks/_a959b121._.js +3 -0
- package/.next/standalone/.next/server/chunks/_a975011f._.js +3 -0
- package/.next/standalone/.next/server/chunks/_aa956b66._.js +3 -0
- package/.next/standalone/.next/server/chunks/_ad7e7d57._.js +3 -0
- package/.next/standalone/.next/server/chunks/_aebf2285._.js +3 -0
- package/.next/standalone/.next/server/chunks/_b259dda0._.js +36 -0
- package/.next/standalone/.next/server/chunks/_b7c60fdc._.js +3 -0
- package/.next/standalone/.next/server/chunks/_bd23ddeb._.js +3 -0
- package/.next/standalone/.next/server/chunks/_cd02dfbe._.js +3 -0
- package/.next/standalone/.next/server/chunks/_d3ecca80._.js +3 -0
- package/.next/standalone/.next/server/chunks/_d48dfa43._.js +11 -0
- package/.next/standalone/.next/server/chunks/_dba648d6._.js +3 -0
- package/.next/standalone/.next/server/chunks/_df42ac6e._.js +3 -0
- package/.next/standalone/.next/server/chunks/_dfe0e460._.js +42 -0
- package/.next/standalone/.next/server/chunks/_ead2734e._.js +3 -0
- package/.next/standalone/.next/server/chunks/_eb4efd0a._.js +3 -0
- package/.next/standalone/.next/server/chunks/_eb66a871._.js +3 -0
- package/.next/standalone/.next/server/chunks/_ef715efd._.js +3 -0
- package/.next/standalone/.next/server/chunks/_f361a656._.js +3 -0
- package/.next/standalone/.next/server/chunks/_f54ddbf4._.js +3 -0
- package/.next/standalone/.next/server/chunks/_fe2866f2._.js +3 -0
- package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_4c408326.js +3 -0
- package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_5603adbc.js +3 -0
- package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_7180f8ad.js +3 -0
- package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_b6be66d9.js +3 -0
- package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_f7054fd7.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__66aca5d4._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_app_(desktop)_terminal_page_tsx_de5e8d85._.js +1 -1
- package/.next/standalone/.next/server/edge/chunks/[root-of-the-server]__90eeddae._.js +1 -1
- package/.next/standalone/.next/server/edge/chunks/[root-of-the-server]__ca3f649e._.js +1 -1
- package/.next/standalone/.next/server/middleware-manifest.json +1 -1
- package/.next/standalone/.next/server/pages/404.html +1 -1
- package/.next/standalone/.next/server/pages/500.html +2 -2
- package/.next/standalone/.next/static/chunks/{732b7502f82e7c37.css → 044decb96250e420.css} +1 -1
- package/.next/standalone/.next/static/chunks/{23a9627a951672ed.js → 8b53c673e79b82f1.js} +3 -3
- package/.next/standalone/bin/scrub-standalone.js +5 -0
- package/.next/standalone/bin/spaces-dev.js +13 -3
- package/.next/standalone/bin/spaces.js +25 -4
- package/.next/standalone/package-lock.json +2 -2
- package/.next/standalone/package.json +3 -2
- package/.next/standalone/src/app/(desktop)/terminal/page.tsx +22 -1
- package/.next/standalone/src/app/api/network/discovered/route.ts +2 -2
- package/.next/standalone/src/app/api/network/nodes/check/route.ts +2 -2
- package/.next/standalone/src/app/api/network/nodes/route.ts +2 -2
- package/.next/standalone/src/app/api/server-config/route.ts +9 -18
- package/.next/standalone/src/lib/admin/api/analytics.ts +1 -8
- package/.next/standalone/src/lib/admin/api/users.ts +1 -8
- package/.next/standalone/src/lib/admin/api/usersById.ts +1 -8
- package/.next/standalone/src/lib/auth/guard.ts +46 -0
- package/.next/standalone/src/lib/auth/index.ts +1 -0
- package/.next/standalone/src/lib/db/queries.ts +11 -1
- package/.next/standalone/src/lib/network/api/discovered.ts +4 -1
- package/.next/standalone/src/lib/network/api/identity.ts +6 -0
- package/.next/standalone/src/lib/network/api/keys.ts +6 -0
- package/.next/standalone/src/lib/network/api/keysById.ts +3 -0
- package/.next/standalone/src/lib/network/api/nodes.ts +49 -3
- package/.next/standalone/src/lib/network/api/nodesById.ts +5 -0
- package/.next/standalone/src/lib/network/api/nodesCheck.ts +4 -1
- package/.next/standalone/src/lib/network/api/proxy.ts +5 -0
- package/.next/standalone/src/middleware.ts +24 -10
- package/.next/standalone/tsconfig.tsbuildinfo +1 -1
- package/bin/scrub-standalone.js +5 -0
- package/bin/spaces-dev.js +13 -3
- package/bin/spaces.js +25 -4
- package/package.json +3 -2
- package/.next/standalone/.next/server/chunks/[externals]_next_dist_b89b5a39._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0153ac12._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__01a4559c._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__029ab763._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__037992dc._.js +0 -141
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__06bb204a._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0fd17dcf._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__107439ea._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__12dff461._.js +0 -78
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__13eb511a._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__141c8d34._.js +0 -172
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__151efd48._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__16c141c2._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__17fee60c._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1a525be8._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1aea45f5._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1cb4ee6b._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1e25d3db._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1f7566a3._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__20382bee._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__2082a624._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__2091a7ed._.js +0 -42
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__24525ae7._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__284b02fc._.js +0 -42
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__2a1a1d0f._.js +0 -42
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__2cf17888._.js +0 -42
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__323ae5c9._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__34db98f7._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__39efba69._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__3aeedc57._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__3bbe9d04._.js +0 -78
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__3c2324ba._.js +0 -42
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__40df3f5d._.js +0 -172
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__42a3fe3c._.js +0 -141
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__42d5d5be._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__49821b61._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__49f58cee._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__4b9c38dc._.js +0 -141
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__4c0ee9c7._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__530862c6._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__55504160._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__599f26fe._.js +0 -42
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__5efa69f5._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__60483ece._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__61135659._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__66331034._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__6887294d._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__6b9396b4._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__6cfd7062._.js +0 -166
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__6e8d89e2._.js +0 -149
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__6f5b3cfe._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__71d5b087._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__76434a8e._.js +0 -78
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__798bafa7._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__7b873fdb._.js +0 -78
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__7d73f791._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__7dc76d0e._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__80a85d1f._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__81f2a9b7._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__82f11618._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__834efefe._.js +0 -42
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__853663ea._.js +0 -42
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__861f2472._.js +0 -172
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__882d0924._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__88959e7f._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__8b6c05dc._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__912a22a4._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__93d21ad1._.js +0 -42
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__94532b09._.js +0 -42
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__97e87518._.js +0 -78
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__9c13c8d0._.js +0 -78
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__9cb13212._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__9d315363._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__9ec369db._.js +0 -13
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__9f09ade5._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__9f986ad2._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__a35913cf._.js +0 -172
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__a3641117._.js +0 -78
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__a76c75a0._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__a934c48d._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__a9431ac6._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__aa3381a4._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__ab1cc16c._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__ab22ca4f._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__ac20d518._.js +0 -78
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__aee3bf91._.js +0 -172
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__b1114936._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__b15ade1f._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__b2bc7a81._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__b51446e5._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__ba344563._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__c3b2e20c._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__ca93ae79._.js +0 -42
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__cf4a76c0._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__d20bed9e._.js +0 -78
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__d2d59054._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__d4f1c0c0._.js +0 -38
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__d6de7a45._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__da33b519._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__dc820e44._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__e1058e69._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__e1dfb4d4._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__e3606cd1._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__e55b6fc5._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__e6555dc3._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__e65c3971._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__ea9e2d75._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__ec37cbee._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__f3c19e4b._.js +0 -42
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__f445bd01._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__f7b0b4da._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__fb4c016b._.js +0 -133
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__fd86530e._.js +0 -78
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__fef9b1ec._.js +0 -133
- package/.next/standalone/docs/plans/2026-02-24-multi-agent-sessions-design.md +0 -133
- package/.next/standalone/docs/plans/2026-02-24-multi-agent-sessions-plan.md +0 -959
- package/.next/standalone/docs/plans/2026-03-07-service-command-design.md +0 -146
- package/.next/standalone/docs/plans/2026-03-07-service-command-plan.md +0 -254
- package/.next/standalone/docs/plans/2026-04-23-consolidate-addons-design.md +0 -212
- package/.next/standalone/docs/plans/2026-04-23-consolidate-addons-plan.md +0 -1509
- package/.next/standalone/docs/superpowers/plans/2026-03-12-spaces-cortex.md +0 -5270
- package/.next/standalone/docs/superpowers/plans/2026-03-13-cortex-wiring.md +0 -1387
- package/.next/standalone/docs/superpowers/plans/2026-03-14-cortex-v2-entity-graph.md +0 -1923
- package/.next/standalone/docs/superpowers/plans/2026-03-14-cortex-v2-knowledge-evolution.md +0 -1113
- package/.next/standalone/docs/superpowers/plans/2026-03-15-cortex-v2-boundary-engine.md +0 -853
- package/.next/standalone/docs/superpowers/plans/2026-03-15-cortex-v2-context-engine.md +0 -1274
- package/.next/standalone/docs/superpowers/plans/2026-03-15-cortex-v2-signal-ingestion.md +0 -933
- package/.next/standalone/docs/superpowers/plans/2026-03-16-cortex-lobes.md +0 -1080
- package/.next/standalone/docs/superpowers/plans/2026-03-16-cortex-v2-gravity-system.md +0 -768
- package/.next/standalone/docs/superpowers/plans/2026-03-16-cortex-v2-ui.md +0 -1108
- package/.next/standalone/docs/superpowers/plans/2026-03-18-cortex-ui-integration.md +0 -1846
- package/.next/standalone/docs/superpowers/plans/2026-03-19-vr-phase1-shell.md +0 -1639
- package/.next/standalone/docs/superpowers/plans/2026-03-27-dockview-pane-layout.md +0 -98
- package/.next/standalone/docs/superpowers/plans/2026-04-21-workspace-todos.md +0 -1097
- package/.next/standalone/docs/superpowers/plans/2026-04-22-claude-usage-display.md +0 -749
- package/.next/standalone/docs/superpowers/specs/2026-03-11-universe-view-design.md +0 -320
- package/.next/standalone/docs/superpowers/specs/2026-03-12-spaces-brain-design.md +0 -720
- package/.next/standalone/docs/superpowers/specs/2026-03-13-cortex-wiring-design.md +0 -268
- package/.next/standalone/docs/superpowers/specs/2026-03-14-cortex-v2-design.md +0 -623
- package/.next/standalone/docs/superpowers/specs/2026-03-16-cortex-lobes-design.md +0 -263
- package/.next/standalone/docs/superpowers/specs/2026-03-16-cortex-v2-ui-design.md +0 -240
- package/.next/standalone/docs/superpowers/specs/2026-03-16-pane-ux-design.md +0 -77
- package/.next/standalone/docs/superpowers/specs/2026-03-18-cortex-ui-integration-design.md +0 -341
- package/.next/standalone/docs/superpowers/specs/2026-03-19-vr-phase1-shell-design.md +0 -288
- package/.next/standalone/docs/superpowers/specs/2026-03-27-pane-diff-review-and-project-wizard-design.md +0 -322
- package/.next/standalone/docs/superpowers/specs/2026-04-21-workspace-todos-design.md +0 -180
- package/.next/standalone/docs/superpowers/specs/2026-04-22-claude-usage-display-design.md +0 -183
- /package/.next/standalone/.next/static/{Y9EeSGuSi-8qpkLvIBy0a → mimGB6C_ZmJMiVnOe9tqZ}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{Y9EeSGuSi-8qpkLvIBy0a → mimGB6C_ZmJMiVnOe9tqZ}/_clientMiddlewareManifest.json +0 -0
- /package/.next/standalone/.next/static/{Y9EeSGuSi-8qpkLvIBy0a → mimGB6C_ZmJMiVnOe9tqZ}/_ssgManifest.js +0 -0
|
@@ -22,6 +22,11 @@ const DENY_DIRS = [
|
|
|
22
22
|
'.gemini',
|
|
23
23
|
'.pi',
|
|
24
24
|
'logs',
|
|
25
|
+
// Internal planning/design docs — embed maintainer-local paths and were
|
|
26
|
+
// never meant to ship to end users. Keeping them at HEAD (for collaboration)
|
|
27
|
+
// but not in the published tarball.
|
|
28
|
+
'plans',
|
|
29
|
+
'superpowers',
|
|
25
30
|
];
|
|
26
31
|
|
|
27
32
|
const DENY_PATTERNS = [
|
|
@@ -37,6 +37,11 @@ const MANAGED_NODE_MODULES = path.join(MANAGED_PACKAGES, 'node_modules');
|
|
|
37
37
|
const isMultiuser = process.env.SPACES_MULTIUSER === '1' || savedConfig.multiuser === true;
|
|
38
38
|
if (isMultiuser) process.env.SPACES_MULTIUSER = '1';
|
|
39
39
|
|
|
40
|
+
// Default LAN-reachable (0.0.0.0). Management routes are loopback-only in
|
|
41
|
+
// desktop mode via the requireAdmin guard; basic browsing works from anywhere.
|
|
42
|
+
const localhostOnly = process.env.SPACES_LOCALHOST_ONLY === '1' || savedConfig.localhostOnly === true;
|
|
43
|
+
const bindHost = localhostOnly ? '127.0.0.1' : '0.0.0.0';
|
|
44
|
+
|
|
40
45
|
// ─── NODE_PATH for the optional cortex addon ─────────────────
|
|
41
46
|
const nodePaths = [MANAGED_NODE_MODULES];
|
|
42
47
|
const cortexPkgDir = path.join(MANAGED_PACKAGES, 'cortex', 'node_modules');
|
|
@@ -71,7 +76,7 @@ if (isMultiuser) {
|
|
|
71
76
|
|
|
72
77
|
// Spawn Next.js dev server on an internal port
|
|
73
78
|
const childEnv = { ...process.env, PORT: String(NEXT_INTERNAL_PORT) };
|
|
74
|
-
const next = spawn('npx', ['next', 'dev', '--hostname',
|
|
79
|
+
const next = spawn('npx', ['next', 'dev', '--hostname', bindHost, '--port', String(NEXT_INTERNAL_PORT)], {
|
|
75
80
|
cwd: path.join(__dirname, '..'),
|
|
76
81
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
77
82
|
env: childEnv,
|
|
@@ -99,13 +104,18 @@ next.on('exit', (code) => {
|
|
|
99
104
|
|
|
100
105
|
// Create unified HTTP server
|
|
101
106
|
const server = http.createServer((req, res) => {
|
|
107
|
+
// Inject authoritative source IP so handlers can check loopback. Strip any
|
|
108
|
+
// spoofed value first.
|
|
109
|
+
const headersOut = { ...req.headers };
|
|
110
|
+
delete headersOut['x-spaces-remote-ip'];
|
|
111
|
+
headersOut['x-spaces-remote-ip'] = req.socket?.remoteAddress || '';
|
|
102
112
|
const proxyReq = http.request(
|
|
103
113
|
{
|
|
104
114
|
hostname: '127.0.0.1',
|
|
105
115
|
port: NEXT_INTERNAL_PORT,
|
|
106
116
|
path: req.url,
|
|
107
117
|
method: req.method,
|
|
108
|
-
headers:
|
|
118
|
+
headers: headersOut,
|
|
109
119
|
},
|
|
110
120
|
(proxyRes) => {
|
|
111
121
|
res.writeHead(proxyRes.statusCode, proxyRes.headers);
|
|
@@ -169,7 +179,7 @@ server.on('upgrade', (req, socket, head) => {
|
|
|
169
179
|
}
|
|
170
180
|
});
|
|
171
181
|
|
|
172
|
-
server.listen(PORT, () => {
|
|
182
|
+
server.listen(PORT, bindHost, () => {
|
|
173
183
|
console.log(`\n Spaces dev server on http://localhost:${PORT}\n`);
|
|
174
184
|
});
|
|
175
185
|
|
|
@@ -70,6 +70,7 @@ for (let i = 0; i < args.length; i++) {
|
|
|
70
70
|
if (args[i] === '--setup') { cliFlags.setup = true; }
|
|
71
71
|
else if (args[i] === '--port' && args[i + 1]) { cliFlags.port = parseInt(args[++i], 10); }
|
|
72
72
|
else if (args[i] === '--multiuser') { cliFlags.multiuser = true; }
|
|
73
|
+
else if (args[i] === '--localhost-only') { cliFlags.localhostOnly = true; }
|
|
73
74
|
else if (args[i] === '--base-path' && args[i + 1]) { cliFlags.basePath = args[++i]; }
|
|
74
75
|
else if (args[i] === '--help' || args[i] === '-h') { cliFlags.help = true; }
|
|
75
76
|
}
|
|
@@ -88,6 +89,7 @@ if (cliFlags.help) {
|
|
|
88
89
|
spaces --setup Interactive first-time setup wizard
|
|
89
90
|
spaces --port 3457 Override port
|
|
90
91
|
spaces --multiuser Enable multiuser mode (login, admin UI)
|
|
92
|
+
spaces --localhost-only Restrict access to 127.0.0.1 (default: LAN-reachable)
|
|
91
93
|
spaces --base-path /spaces Set base path for reverse proxy
|
|
92
94
|
spaces service install Install as OS service (systemd/launchd/Task Scheduler)
|
|
93
95
|
spaces service uninstall Remove OS service
|
|
@@ -242,11 +244,22 @@ function startServer() {
|
|
|
242
244
|
|| process.env.SPACES_MULTIUSER === '1'
|
|
243
245
|
|| savedConfig.multiuser === true;
|
|
244
246
|
|
|
247
|
+
// Bind to all interfaces by default so the user can reach Spaces from other
|
|
248
|
+
// devices on their LAN. Management endpoints (admin/*, network/keys, etc.)
|
|
249
|
+
// enforce loopback-only access in desktop mode via the requireAdmin guard,
|
|
250
|
+
// so LAN reach exposes the basic browsing surface but not admin operations.
|
|
251
|
+
// Operators who want a strict localhost lockdown can pass --localhost-only.
|
|
252
|
+
const localhostOnly = cliFlags.localhostOnly === true
|
|
253
|
+
|| process.env.SPACES_LOCALHOST_ONLY === '1'
|
|
254
|
+
|| savedConfig.localhostOnly === true;
|
|
255
|
+
const bindHost = localhostOnly ? '127.0.0.1' : '0.0.0.0';
|
|
256
|
+
|
|
245
257
|
console.log('');
|
|
246
258
|
console.log(' Spaces - Agent Workspace Manager');
|
|
247
259
|
console.log(' =================================');
|
|
248
260
|
console.log('');
|
|
249
261
|
console.log(` Mode: ${isMultiuser ? 'multiuser' : 'desktop'}`);
|
|
262
|
+
console.log(` Bind: ${bindHost}${bindHost === '0.0.0.0' ? ' (LAN-reachable)' : ' (localhost only)'}`);
|
|
250
263
|
|
|
251
264
|
const childEnv = { ...process.env };
|
|
252
265
|
|
|
@@ -461,7 +474,7 @@ function startServer() {
|
|
|
461
474
|
env: {
|
|
462
475
|
...childEnv,
|
|
463
476
|
PORT: String(NEXT_INTERNAL_PORT),
|
|
464
|
-
HOSTNAME:
|
|
477
|
+
HOSTNAME: bindHost,
|
|
465
478
|
NODE_ENV: 'production',
|
|
466
479
|
},
|
|
467
480
|
});
|
|
@@ -472,7 +485,7 @@ function startServer() {
|
|
|
472
485
|
env: {
|
|
473
486
|
...childEnv,
|
|
474
487
|
PORT: String(NEXT_INTERNAL_PORT),
|
|
475
|
-
HOSTNAME:
|
|
488
|
+
HOSTNAME: bindHost,
|
|
476
489
|
NODE_ENV: 'production',
|
|
477
490
|
},
|
|
478
491
|
shell: true,
|
|
@@ -534,13 +547,21 @@ function startServer() {
|
|
|
534
547
|
return;
|
|
535
548
|
}
|
|
536
549
|
|
|
550
|
+
// Strip any spoofed x-spaces-remote-ip from the inbound request, then
|
|
551
|
+
// inject the actual TCP peer so handlers can authoritatively check
|
|
552
|
+
// whether a request came from loopback. Handlers see this header set by
|
|
553
|
+
// us; clients cannot influence it.
|
|
554
|
+
const headersOut = { ...req.headers };
|
|
555
|
+
delete headersOut['x-spaces-remote-ip'];
|
|
556
|
+
headersOut['x-spaces-remote-ip'] = req.socket?.remoteAddress || '';
|
|
557
|
+
|
|
537
558
|
const proxyReq = http.request(
|
|
538
559
|
{
|
|
539
560
|
hostname: '127.0.0.1',
|
|
540
561
|
port: NEXT_INTERNAL_PORT,
|
|
541
562
|
path: req.url,
|
|
542
563
|
method: req.method,
|
|
543
|
-
headers:
|
|
564
|
+
headers: headersOut,
|
|
544
565
|
},
|
|
545
566
|
(proxyRes) => {
|
|
546
567
|
// Log cortex context API calls
|
|
@@ -605,7 +626,7 @@ function startServer() {
|
|
|
605
626
|
});
|
|
606
627
|
});
|
|
607
628
|
|
|
608
|
-
dualServer.listen(PORT, () => {
|
|
629
|
+
dualServer.listen(PORT, bindHost, () => {
|
|
609
630
|
// Now that the port is bound, tell the inner servers they're "listening"
|
|
610
631
|
// so terminal-server's mDNS and message watcher start up.
|
|
611
632
|
httpServer.emit('listening');
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jlongo78/agent-spaces",
|
|
3
|
-
"version": "0.10.0-beta.
|
|
3
|
+
"version": "0.10.0-beta.4",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@jlongo78/agent-spaces",
|
|
9
|
-
"version": "0.10.0-beta.
|
|
9
|
+
"version": "0.10.0-beta.4",
|
|
10
10
|
"hasInstallScript": true,
|
|
11
11
|
"license": "AGPL-3.0-only",
|
|
12
12
|
"dependencies": {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jlongo78/agent-spaces",
|
|
3
|
-
"version": "0.10.0-beta.
|
|
3
|
+
"version": "0.10.0-beta.4",
|
|
4
4
|
"description": "Agent workspace manager for Claude, Codex, Gemini, and more",
|
|
5
5
|
"bin": {
|
|
6
6
|
"spaces": "./bin/spaces.js",
|
|
@@ -33,7 +33,8 @@
|
|
|
33
33
|
"dev": "node bin/spaces-dev.js",
|
|
34
34
|
"build": "cross-env STANDALONE=1 next build && node -e \"const fs=require('fs');fs.cpSync('.next/static','.next/standalone/.next/static',{recursive:true});fs.cpSync('public','.next/standalone/public',{recursive:true})\" && node bin/fix-standalone-externals.js",
|
|
35
35
|
"postinstall": "node bin/spaces-postinstall.js || true",
|
|
36
|
-
"prepublishOnly": "npm run build
|
|
36
|
+
"prepublishOnly": "npm run build",
|
|
37
|
+
"prepack": "node bin/scrub-standalone.js",
|
|
37
38
|
"setup": "node bin/spaces-setup.js",
|
|
38
39
|
"setup-admin": "node bin/setup-admin.js",
|
|
39
40
|
"server:build": "next build",
|
|
@@ -1005,7 +1005,28 @@ function TerminalPageInner({ terminalToken }: { terminalToken: string }) {
|
|
|
1005
1005
|
Close
|
|
1006
1006
|
</button>
|
|
1007
1007
|
<button
|
|
1008
|
-
onClick={() =>
|
|
1008
|
+
onClick={() => {
|
|
1009
|
+
// Preseed the form from the most recent pane in this workspace.
|
|
1010
|
+
// Falls back to the workspace color and 'claude' when the workspace is empty.
|
|
1011
|
+
const recent = [...panes].sort((a, b) => (b.created || '').localeCompare(a.created || ''))[0];
|
|
1012
|
+
if (recent) {
|
|
1013
|
+
setNewCwd(recent.cwd || '');
|
|
1014
|
+
setNewColor(recent.color || activeWorkspace?.color || '#6366f1');
|
|
1015
|
+
setNewAgentType(recent.agentType || 'claude');
|
|
1016
|
+
setNewCustomCommand(recent.agentType === 'custom' ? (recent.customCommand || '') : '');
|
|
1017
|
+
setNewNodeId(recent.nodeId || '');
|
|
1018
|
+
} else {
|
|
1019
|
+
setNewCwd('');
|
|
1020
|
+
setNewColor(activeWorkspace?.color || '#6366f1');
|
|
1021
|
+
setNewAgentType('claude');
|
|
1022
|
+
setNewCustomCommand('');
|
|
1023
|
+
setNewNodeId('');
|
|
1024
|
+
}
|
|
1025
|
+
setNewTitle('');
|
|
1026
|
+
setNewClaudeSession('');
|
|
1027
|
+
setNewAgentMode('new');
|
|
1028
|
+
setShowAdd(true);
|
|
1029
|
+
}}
|
|
1009
1030
|
className="flex items-center gap-1.5 px-3 py-1.5 text-xs bg-indigo-600 text-white rounded-md hover:bg-indigo-500 transition-colors"
|
|
1010
1031
|
>
|
|
1011
1032
|
<Plus className="w-3.5 h-3.5" />
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { NextRequest } from 'next/server';
|
|
2
2
|
import * as nodes from '@/lib/network/api/nodes';
|
|
3
3
|
|
|
4
|
-
export async function GET() {
|
|
5
|
-
return nodes.GET();
|
|
4
|
+
export async function GET(req: NextRequest) {
|
|
5
|
+
return nodes.GET(req);
|
|
6
6
|
}
|
|
7
7
|
|
|
8
8
|
export async function POST(req: NextRequest) {
|
|
@@ -1,27 +1,18 @@
|
|
|
1
1
|
import { NextRequest, NextResponse } from 'next/server';
|
|
2
|
-
import {
|
|
2
|
+
import { requireAdmin } from '@/lib/auth/guard';
|
|
3
3
|
import { readServerConfig, writeServerConfig } from '@/lib/server-config';
|
|
4
4
|
|
|
5
5
|
// Server-level config (port, basePath, multiuser) lives in ~/.spaces/server.json
|
|
6
6
|
// and is read by the launcher at boot. This route exposes a small, safe subset
|
|
7
|
-
// and lets the
|
|
8
|
-
// take effect — see the "Restart required" banner
|
|
9
|
-
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
// be bound to localhost for a single user.
|
|
14
|
-
function requireAdminInMultiuser(req: NextRequest): NextResponse | null {
|
|
15
|
-
if (!IS_MULTIUSER) return null;
|
|
16
|
-
const role = req.headers.get('x-auth-role');
|
|
17
|
-
if (role !== 'admin') {
|
|
18
|
-
return NextResponse.json({ error: 'Admin required' }, { status: 403 });
|
|
19
|
-
}
|
|
20
|
-
return null;
|
|
21
|
-
}
|
|
7
|
+
// and lets the local user flip multiuser mode. A restart is required for the
|
|
8
|
+
// change to take effect — see the "Restart required" banner in Settings.
|
|
9
|
+
//
|
|
10
|
+
// Authorization: requireAdmin() in multiuser mode requires a validated admin
|
|
11
|
+
// session; in desktop mode it requires the request to come from loopback (so a
|
|
12
|
+
// LAN attacker cannot flip the victim into multiuser mode and seed a backdoor).
|
|
22
13
|
|
|
23
14
|
export async function GET(req: NextRequest) {
|
|
24
|
-
const denied =
|
|
15
|
+
const denied = requireAdmin(req);
|
|
25
16
|
if (denied) return denied;
|
|
26
17
|
const { port, basePath, multiuser } = readServerConfig();
|
|
27
18
|
return NextResponse.json({
|
|
@@ -32,7 +23,7 @@ export async function GET(req: NextRequest) {
|
|
|
32
23
|
}
|
|
33
24
|
|
|
34
25
|
export async function PATCH(req: NextRequest) {
|
|
35
|
-
const denied =
|
|
26
|
+
const denied = requireAdmin(req);
|
|
36
27
|
if (denied) return denied;
|
|
37
28
|
const body = await req.json().catch(() => ({}));
|
|
38
29
|
const updates: Record<string, unknown> = {};
|
|
@@ -6,14 +6,7 @@ import {
|
|
|
6
6
|
getDailySessionMinutes,
|
|
7
7
|
getUserSessionSummary,
|
|
8
8
|
} from '../db';
|
|
9
|
-
|
|
10
|
-
function requireAdmin(request: Request): Response | null {
|
|
11
|
-
const role = request.headers.get('x-auth-role') || 'user';
|
|
12
|
-
if (role !== 'admin') {
|
|
13
|
-
return Response.json({ error: 'Forbidden' }, { status: 403 });
|
|
14
|
-
}
|
|
15
|
-
return null;
|
|
16
|
-
}
|
|
9
|
+
import { requireAdmin } from '@/lib/auth/guard';
|
|
17
10
|
|
|
18
11
|
export async function GET(request: Request) {
|
|
19
12
|
const denied = requireAdmin(request);
|
|
@@ -1,13 +1,6 @@
|
|
|
1
1
|
import { execFileSync } from 'child_process';
|
|
2
2
|
import { listUsers, createUser } from '../db';
|
|
3
|
-
|
|
4
|
-
function requireAdmin(request: Request): Response | null {
|
|
5
|
-
const role = request.headers.get('x-auth-role') || 'user';
|
|
6
|
-
if (role !== 'admin') {
|
|
7
|
-
return Response.json({ error: 'Forbidden' }, { status: 403 });
|
|
8
|
-
}
|
|
9
|
-
return null;
|
|
10
|
-
}
|
|
3
|
+
import { requireAdmin } from '@/lib/auth/guard';
|
|
11
4
|
|
|
12
5
|
export async function GET(request: Request) {
|
|
13
6
|
const denied = requireAdmin(request);
|
|
@@ -1,18 +1,11 @@
|
|
|
1
1
|
import { execFileSync } from 'child_process';
|
|
2
2
|
import { getUserById, updateUser, deleteUser } from '../db';
|
|
3
|
+
import { requireAdmin } from '@/lib/auth/guard';
|
|
3
4
|
|
|
4
5
|
function getAuthUser(request: Request): string {
|
|
5
6
|
return request.headers.get('x-auth-user') || require('os').userInfo().username;
|
|
6
7
|
}
|
|
7
8
|
|
|
8
|
-
function requireAdmin(request: Request): Response | null {
|
|
9
|
-
const role = request.headers.get('x-auth-role') || 'user';
|
|
10
|
-
if (role !== 'admin') {
|
|
11
|
-
return Response.json({ error: 'Forbidden' }, { status: 403 });
|
|
12
|
-
}
|
|
13
|
-
return null;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
9
|
function formatUser(u: NonNullable<ReturnType<typeof getUserById>>) {
|
|
17
10
|
return {
|
|
18
11
|
id: u.id,
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { NextResponse } from 'next/server';
|
|
2
|
+
import { IS_MULTIUSER } from '@/lib/flags';
|
|
3
|
+
|
|
4
|
+
const LOOPBACK_PREFIXES = ['127.', '::1', '::ffff:127.'];
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* The wrapping HTTP server (bin/spaces.js / bin/spaces-dev.js) injects
|
|
8
|
+
* x-spaces-remote-ip from the actual TCP peer. Middleware strips any client
|
|
9
|
+
* value before forwarding, so this is always either the real source or empty.
|
|
10
|
+
*/
|
|
11
|
+
function isLoopback(req: Request): boolean {
|
|
12
|
+
const ip = req.headers.get('x-spaces-remote-ip') || '';
|
|
13
|
+
return LOOPBACK_PREFIXES.some(p => ip.startsWith(p));
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Require admin authority on a request. The single canonical guard for
|
|
18
|
+
* management endpoints (admin/*, server-config PATCH, network/{keys,nodes,
|
|
19
|
+
* proxy,identity-PUT,discovered}).
|
|
20
|
+
*
|
|
21
|
+
* - Multiuser mode: trusts the `x-auth-role` header. Middleware sets this
|
|
22
|
+
* only after validating a session cookie, and strips any incoming value
|
|
23
|
+
* before forwarding — so an attacker cannot spoof it.
|
|
24
|
+
* - Desktop mode: there is no login, so we authorize based on the actual TCP
|
|
25
|
+
* source IP. Loopback (127.0.0.0/8, ::1) is treated as the local admin;
|
|
26
|
+
* anything else is refused. This keeps the basic browsing routes
|
|
27
|
+
* LAN-reachable while keeping management operations off the LAN.
|
|
28
|
+
*
|
|
29
|
+
* Returns null when the request should proceed, or a Response when denied.
|
|
30
|
+
*/
|
|
31
|
+
export function requireAdmin(req: Request): Response | null {
|
|
32
|
+
if (IS_MULTIUSER) {
|
|
33
|
+
const role = req.headers.get('x-auth-role');
|
|
34
|
+
if (role !== 'admin') {
|
|
35
|
+
return NextResponse.json({ error: 'Admin required' }, { status: 403 });
|
|
36
|
+
}
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
if (!isLoopback(req)) {
|
|
40
|
+
return NextResponse.json(
|
|
41
|
+
{ error: 'Management endpoints are restricted to localhost in desktop mode. Run in multiuser mode (SPACES_MULTIUSER=1) for remote admin.' },
|
|
42
|
+
{ status: 403 }
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
@@ -625,7 +625,17 @@ export function updatePane(id: string, data: {
|
|
|
625
625
|
if (data.winHeight !== undefined) { sets.push('win_height = ?'); vals.push(data.winHeight); }
|
|
626
626
|
if ((data as any).nodeId !== undefined) { sets.push('node_id = ?'); vals.push((data as any).nodeId); }
|
|
627
627
|
if (data.isCollaborating !== undefined) { sets.push('is_collaborating = ?'); vals.push(data.isCollaborating ? 1 : 0); }
|
|
628
|
-
if (data.diffBaselineSha !== undefined) {
|
|
628
|
+
if (data.diffBaselineSha !== undefined) {
|
|
629
|
+
// Whitelist git SHA shape — diffBaselineSha is later passed as a positional
|
|
630
|
+
// argument to `git diff <sha> HEAD`; without this guard a value like
|
|
631
|
+
// "--output=/path/to/file" would be interpreted as a git option and
|
|
632
|
+
// git would write the diff content to an attacker-chosen path.
|
|
633
|
+
const sha = data.diffBaselineSha;
|
|
634
|
+
if (sha !== null && !/^[0-9a-f]{7,40}$/.test(sha)) {
|
|
635
|
+
throw new Error('Invalid diffBaselineSha (must be a git SHA hex)');
|
|
636
|
+
}
|
|
637
|
+
sets.push('diff_baseline_sha = ?'); vals.push(sha);
|
|
638
|
+
}
|
|
629
639
|
if (data.customModelId !== undefined) { sets.push('custom_model_id = ?'); vals.push(data.customModelId); }
|
|
630
640
|
|
|
631
641
|
if (sets.length === 0) return;
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { NextResponse } from 'next/server';
|
|
2
2
|
import { getDiscoveredNodes } from '../db';
|
|
3
|
+
import { requireAdmin } from '@/lib/auth/guard';
|
|
3
4
|
|
|
4
|
-
export async function GET() {
|
|
5
|
+
export async function GET(request: Request) {
|
|
6
|
+
const denied = requireAdmin(request);
|
|
7
|
+
if (denied) return denied;
|
|
5
8
|
const nodes = getDiscoveredNodes();
|
|
6
9
|
return NextResponse.json(nodes);
|
|
7
10
|
}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import { NextRequest, NextResponse } from 'next/server';
|
|
2
2
|
import { getNodeIdentity, setNodeName } from '../identity';
|
|
3
|
+
import { requireAdmin } from '@/lib/auth/guard';
|
|
4
|
+
|
|
5
|
+
// GET is intentionally public (used by remote nodes during handshake).
|
|
6
|
+
// PUT is admin-only — sets the local node's display name in network.db.
|
|
3
7
|
|
|
4
8
|
export async function GET() {
|
|
5
9
|
const identity = getNodeIdentity();
|
|
@@ -7,6 +11,8 @@ export async function GET() {
|
|
|
7
11
|
}
|
|
8
12
|
|
|
9
13
|
export async function PUT(request: NextRequest) {
|
|
14
|
+
const denied = requireAdmin(request);
|
|
15
|
+
if (denied) return denied;
|
|
10
16
|
const { name } = await request.json() as any;
|
|
11
17
|
if (!name || typeof name !== 'string' || !name.trim()) {
|
|
12
18
|
return NextResponse.json({ error: 'Name is required' }, { status: 400 });
|
|
@@ -1,14 +1,20 @@
|
|
|
1
1
|
import { NextRequest, NextResponse } from 'next/server';
|
|
2
2
|
import { listApiKeys, createApiKey } from '../db';
|
|
3
|
+
import { requireAdmin } from '@/lib/auth/guard';
|
|
3
4
|
import os from 'os';
|
|
4
5
|
|
|
5
6
|
export async function GET(request: NextRequest) {
|
|
7
|
+
const denied = requireAdmin(request);
|
|
8
|
+
if (denied) return denied;
|
|
6
9
|
const username = request.headers.get('x-auth-user') || os.userInfo().username;
|
|
7
10
|
const keys = listApiKeys(username);
|
|
8
11
|
return NextResponse.json(keys);
|
|
9
12
|
}
|
|
10
13
|
|
|
11
14
|
export async function POST(request: NextRequest) {
|
|
15
|
+
const denied = requireAdmin(request);
|
|
16
|
+
if (denied) return denied;
|
|
17
|
+
|
|
12
18
|
const { name, permissions } = await request.json() as any;
|
|
13
19
|
|
|
14
20
|
if (!name || typeof name !== 'string' || !name.trim()) {
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import { NextRequest, NextResponse } from 'next/server';
|
|
2
2
|
import { revokeApiKey, getNetworkDb } from '../db';
|
|
3
|
+
import { requireAdmin } from '@/lib/auth/guard';
|
|
3
4
|
import os from 'os';
|
|
4
5
|
|
|
5
6
|
export async function DELETE(request: NextRequest, { params }: { params: Promise<{ id: string }> }) {
|
|
7
|
+
const denied = requireAdmin(request);
|
|
8
|
+
if (denied) return denied;
|
|
6
9
|
const { id } = await params;
|
|
7
10
|
const username = request.headers.get('x-auth-user') || os.userInfo().username;
|
|
8
11
|
|
|
@@ -1,20 +1,65 @@
|
|
|
1
1
|
import { NextRequest, NextResponse } from 'next/server';
|
|
2
2
|
import { listNodes, addNode, updateNodeStatus, getNode } from '../db';
|
|
3
|
+
import { requireAdmin } from '@/lib/auth/guard';
|
|
3
4
|
import type { HandshakeResponse } from '../../../types/network';
|
|
4
5
|
|
|
5
|
-
|
|
6
|
+
// Reject URLs that point at private/loopback networks. Adding a node fetches
|
|
7
|
+
// the URL with the supplied bearer token; without this guard a caller could
|
|
8
|
+
// probe internal services or cloud metadata via SSRF and read the response
|
|
9
|
+
// body in the error path. See vuln 5 in 2026-04-26 audit.
|
|
10
|
+
function rejectPrivateUrl(rawUrl: string): string | null {
|
|
11
|
+
let parsed: URL;
|
|
12
|
+
try { parsed = new URL(rawUrl); } catch { return 'URL is not parseable'; }
|
|
13
|
+
if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {
|
|
14
|
+
return 'URL must be http or https';
|
|
15
|
+
}
|
|
16
|
+
const host = parsed.hostname.toLowerCase();
|
|
17
|
+
// Block by hostname literal first (cheap, catches the obvious cases)
|
|
18
|
+
const blockedHosts = ['localhost', '0.0.0.0'];
|
|
19
|
+
if (blockedHosts.includes(host)) return 'Loopback hostnames are not allowed';
|
|
20
|
+
// Block IPv4 in private/loopback/link-local ranges
|
|
21
|
+
const v4 = host.match(/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/);
|
|
22
|
+
if (v4) {
|
|
23
|
+
const [a, b] = [parseInt(v4[1], 10), parseInt(v4[2], 10)];
|
|
24
|
+
if (a === 127) return 'Loopback IPs are not allowed';
|
|
25
|
+
if (a === 10) return 'Private IPs are not allowed';
|
|
26
|
+
if (a === 192 && b === 168) return 'Private IPs are not allowed';
|
|
27
|
+
if (a === 172 && b >= 16 && b <= 31) return 'Private IPs are not allowed';
|
|
28
|
+
if (a === 169 && b === 254) return 'Link-local IPs are not allowed';
|
|
29
|
+
if (a === 0) return 'Reserved IPs are not allowed';
|
|
30
|
+
}
|
|
31
|
+
// Block IPv6 loopback / link-local / unique-local
|
|
32
|
+
if (host.startsWith('[::1') || host === '::1') return 'Loopback IPs are not allowed';
|
|
33
|
+
if (host.startsWith('[fe80') || host.startsWith('fe80:')) return 'Link-local IPs are not allowed';
|
|
34
|
+
if (host.startsWith('[fc') || host.startsWith('[fd') || host.startsWith('fc') || host.startsWith('fd')) {
|
|
35
|
+
return 'Private IPs are not allowed';
|
|
36
|
+
}
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export async function GET(request: NextRequest) {
|
|
41
|
+
const denied = requireAdmin(request);
|
|
42
|
+
if (denied) return denied;
|
|
6
43
|
const nodes = listNodes();
|
|
7
44
|
return NextResponse.json(nodes);
|
|
8
45
|
}
|
|
9
46
|
|
|
10
47
|
export async function POST(request: NextRequest) {
|
|
48
|
+
const denied = requireAdmin(request);
|
|
49
|
+
if (denied) return denied;
|
|
50
|
+
|
|
11
51
|
const { url, apiKey, name } = await request.json() as any;
|
|
12
52
|
|
|
13
53
|
if (!url || !apiKey) {
|
|
14
54
|
return NextResponse.json({ error: 'URL and API key are required' }, { status: 400 });
|
|
15
55
|
}
|
|
56
|
+
if (typeof url !== 'string') {
|
|
57
|
+
return NextResponse.json({ error: 'URL must be a string' }, { status: 400 });
|
|
58
|
+
}
|
|
16
59
|
|
|
17
60
|
const baseUrl = url.replace(/\/+$/, '');
|
|
61
|
+
const reject = rejectPrivateUrl(baseUrl);
|
|
62
|
+
if (reject) return NextResponse.json({ error: reject }, { status: 400 });
|
|
18
63
|
|
|
19
64
|
let handshake: HandshakeResponse;
|
|
20
65
|
try {
|
|
@@ -25,9 +70,10 @@ export async function POST(request: NextRequest) {
|
|
|
25
70
|
});
|
|
26
71
|
|
|
27
72
|
if (!res.ok) {
|
|
28
|
-
|
|
73
|
+
// Don't echo the upstream response body — it may contain sensitive
|
|
74
|
+
// content (admin pages, cloud metadata) that the attacker probed for.
|
|
29
75
|
return NextResponse.json(
|
|
30
|
-
{ error: `Handshake failed
|
|
76
|
+
{ error: `Handshake failed with status ${res.status}` },
|
|
31
77
|
{ status: 400 }
|
|
32
78
|
);
|
|
33
79
|
}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { NextRequest, NextResponse } from 'next/server';
|
|
2
2
|
import { getNode, updateNode, removeNode } from '../db';
|
|
3
|
+
import { requireAdmin } from '@/lib/auth/guard';
|
|
3
4
|
|
|
4
5
|
export async function PUT(request: NextRequest, { params }: { params: Promise<{ id: string }> }) {
|
|
6
|
+
const denied = requireAdmin(request);
|
|
7
|
+
if (denied) return denied;
|
|
5
8
|
const { id } = await params;
|
|
6
9
|
const data: any = await request.json();
|
|
7
10
|
|
|
@@ -16,6 +19,8 @@ export async function PUT(request: NextRequest, { params }: { params: Promise<{
|
|
|
16
19
|
}
|
|
17
20
|
|
|
18
21
|
export async function DELETE(request: NextRequest, { params }: { params: Promise<{ id: string }> }) {
|
|
22
|
+
const denied = requireAdmin(request);
|
|
23
|
+
if (denied) return denied;
|
|
19
24
|
const { id } = await params;
|
|
20
25
|
|
|
21
26
|
const node = getNode(id);
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { NextResponse } from 'next/server';
|
|
2
2
|
import { listNodes, getNodeApiKey, updateNodeStatus } from '../db';
|
|
3
|
+
import { requireAdmin } from '@/lib/auth/guard';
|
|
3
4
|
|
|
4
|
-
export async function POST() {
|
|
5
|
+
export async function POST(request: Request) {
|
|
6
|
+
const denied = requireAdmin(request);
|
|
7
|
+
if (denied) return denied;
|
|
5
8
|
const nodes = listNodes();
|
|
6
9
|
const results: { nodeId: string; status: string; error?: string }[] = [];
|
|
7
10
|
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import { NextRequest, NextResponse } from 'next/server';
|
|
2
2
|
import { getNode, getNodeApiKey } from '../db';
|
|
3
|
+
import { requireAdmin } from '@/lib/auth/guard';
|
|
3
4
|
|
|
4
5
|
export async function GET(
|
|
5
6
|
request: NextRequest,
|
|
6
7
|
{ params }: { params: Promise<{ nodeId: string; path: string[] }> }
|
|
7
8
|
) {
|
|
9
|
+
const denied = requireAdmin(request);
|
|
10
|
+
if (denied) return denied;
|
|
8
11
|
const { nodeId, path: pathSegments } = await params;
|
|
9
12
|
|
|
10
13
|
const node = getNode(nodeId);
|
|
@@ -41,6 +44,8 @@ export async function POST(
|
|
|
41
44
|
request: NextRequest,
|
|
42
45
|
{ params }: { params: Promise<{ nodeId: string; path: string[] }> }
|
|
43
46
|
) {
|
|
47
|
+
const denied = requireAdmin(request);
|
|
48
|
+
if (denied) return denied;
|
|
44
49
|
const { nodeId, path: pathSegments } = await params;
|
|
45
50
|
|
|
46
51
|
const node = getNode(nodeId);
|