@jlongo78/agent-spaces 0.9.7 → 0.9.9
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 +17 -4
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/app-path-routes-manifest.json +4 -0
- package/.next/standalone/.next/build-manifest.json +2 -2
- package/.next/standalone/.next/prerender-manifest.json +3 -3
- package/.next/standalone/.next/routes-manifest.json +29 -0
- package/.next/standalone/.next/server/app/(desktop)/admin/analytics/page.js.nft.json +1 -1
- 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 +3 -3
- package/.next/standalone/.next/server/app/admin/analytics.segments/!KGRlc2t0b3Ap/admin/analytics/__PAGE__.segment.rsc +2 -2
- 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 +3 -3
- 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/claude/usage/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/claude/usage/route/build-manifest.json +11 -0
- package/.next/standalone/.next/server/app/api/claude/usage/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/claude/usage/route.js +8 -0
- package/.next/standalone/.next/server/app/api/claude/usage/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/claude/usage/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/claude/usage/route_client-reference-manifest.js +2 -0
- 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/[id]/todos/[todoId]/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/workspaces/[id]/todos/[todoId]/route/build-manifest.json +11 -0
- package/.next/standalone/.next/server/app/api/workspaces/[id]/todos/[todoId]/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/workspaces/[id]/todos/[todoId]/route.js +8 -0
- package/.next/standalone/.next/server/app/api/workspaces/[id]/todos/[todoId]/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/workspaces/[id]/todos/[todoId]/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/workspaces/[id]/todos/[todoId]/route_client-reference-manifest.js +2 -0
- package/.next/standalone/.next/server/app/api/workspaces/[id]/todos/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/workspaces/[id]/todos/route/build-manifest.json +11 -0
- package/.next/standalone/.next/server/app/api/workspaces/[id]/todos/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/workspaces/[id]/todos/route.js +8 -0
- package/.next/standalone/.next/server/app/api/workspaces/[id]/todos/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/workspaces/[id]/todos/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/workspaces/[id]/todos/route_client-reference-manifest.js +2 -0
- 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 +3 -3
- package/.next/standalone/.next/server/app/settings.segments/!KGRlc2t0b3Ap/settings/__PAGE__.segment.rsc +2 -2
- 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 +3 -3
- 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 +4 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__00e90fc6._.js +111 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__01ab8675._.js +111 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__03974f05._.js +111 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__bb331da9._.js → [root-of-the-server]__046c9b91._.js} +16 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__04ae6bf0._.js +111 -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 +111 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0facd39e._.js +111 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__10bc76a3._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__115f3934._.js +111 -0
- 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 +50 -33
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__17a3b966._.js +111 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__17d3a2b2._.js +111 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1a86c055._.js +111 -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 +111 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__2a3f866b._.js +119 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__a95bb38b._.js → [root-of-the-server]__316617e7._.js} +3 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__32ad8f71._.js +111 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__35457394._.js +111 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__35de78e6._.js +111 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__3685ffcb._.js +111 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__38954988._.js +111 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__3a32b624._.js +111 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__426ad936._.js +119 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__4985c034._.js +111 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__5c6ce9ed._.js +111 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__5cebe58a._.js +111 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__5d5e4789._.js +111 -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 +111 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__7ebc4280._.js → [root-of-the-server]__6c64af29._.js} +22 -9
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__73aed9f5._.js +111 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__79b6a9bb._.js +111 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__e56abacf._.js → [root-of-the-server]__7db704c6._.js} +18 -5
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__812ca02b._.js +111 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__821f50fa._.js +111 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__8716b86e._.js +111 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__884ef754._.js +111 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__88cdbd68._.js +111 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__89d9aba9._.js +111 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__8c2e1260._.js +111 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__8d536cb5._.js +111 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__8df8c5d1._.js +111 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__8f2ccc41._.js +111 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__95c9d682._.js +111 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__9e5d7774._.js +111 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__9edcff87._.js +111 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__a049dfc2._.js +111 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__a5b4bb9a._.js +111 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__a83262a1._.js +111 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__a9cd1240._.js +111 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__efb8251e._.js → [root-of-the-server]__a9d7f822._.js} +16 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__ad08c221._.js +111 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__ad585f2f._.js +111 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__afcb8f7d._.js +111 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__bc250d43._.js +111 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__bce2a6e7._.js +111 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__c011bf91._.js +111 -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]__c37d6380._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__cae392eb._.js +111 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__cc2616bb._.js +16 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__d501fa9b._.js +111 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__d59c6c15._.js +111 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__d5c1db32._.js +111 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__dba60c86._.js +111 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__de14b9ae._.js +111 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__e10643d1._.js +111 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__e2a996e5._.js +127 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__e3477417._.js +111 -0
- 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]__e4e70b86._.js +111 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__e54925af._.js +111 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__e8cbeaca._.js +111 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__cabaac2b._.js → [root-of-the-server]__e8edc5b0._.js} +16 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__eab4d83b._.js +111 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__ead29015._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__f056fd83._.js +111 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__f0e99572._.js +111 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__fe1e16d0._.js +111 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__ff9cd277._.js +111 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__ffaea2ce._.js +111 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_claude_usage_route_actions_fe002ec1.js +3 -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/_next-internal_server_app_api_workspaces_[id]_todos_route_actions_0d4ffac5.js +3 -0
- package/.next/standalone/.next/server/chunks/ce889_server_app_api_workspaces_[id]_todos_[todoId]_route_actions_754fe6b9.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/_20c2cf3a._.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/_5f55bf8f._.js +3 -0
- 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)_settings_page_tsx_f74824b3._.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/{74d0ac0b1d0a1b79.js → 10b00b4f66102dcf.js} +1 -1
- package/.next/standalone/.next/static/chunks/14216197f9dcbe5b.css +3 -0
- package/.next/standalone/.next/static/chunks/{16eb77953dee9ea3.js → 19c71a8376c23c58.js} +1 -1
- package/.next/standalone/.next/static/chunks/{3e91fc608659c524.js → 350271fe79509caf.js} +1 -1
- package/.next/standalone/.next/static/chunks/4c9fb0a38f041a3d.js +85 -0
- package/.next/standalone/.next/static/chunks/{70423c7afd8abf5f.js → 597847c22200c212.js} +1 -1
- package/.next/standalone/.next/static/chunks/8f6f93ab45a5ff5b.js +1 -0
- 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/{e62bb488d02db247.js → d2566c2dcf53fef3.js} +1 -1
- package/.next/standalone/.next/static/chunks/{180c1b9ff31b979f.js → f7b34c807badf95d.js} +8 -6
- package/.next/standalone/.next/static/chunks/{fb0abd1933b2b2e1.js → ff7d85dade44d1f3.js} +1 -1
- package/.next/standalone/.spaces/cortex-context.md +35 -129
- package/.next/standalone/bin/spaces.js +7 -4
- package/.next/standalone/bin/terminal-server.js +48 -10
- package/.next/standalone/cortex-hook-debug.log +118 -23
- package/.next/standalone/docs/features/claude-usage.md +105 -0
- package/.next/standalone/docs/features/workspace-todos.md +127 -0
- package/.next/standalone/docs/superpowers/plans/2026-04-21-workspace-todos.md +1097 -0
- package/.next/standalone/docs/superpowers/plans/2026-04-22-claude-usage-display.md +749 -0
- package/.next/standalone/docs/superpowers/specs/2026-04-21-workspace-todos-design.md +180 -0
- package/.next/standalone/docs/superpowers/specs/2026-04-22-claude-usage-display-design.md +183 -0
- package/.next/standalone/package-lock.json +2 -2
- package/.next/standalone/package.json +1 -1
- package/.next/standalone/src/app/(desktop)/settings/page.tsx +40 -1
- package/.next/standalone/src/app/(desktop)/terminal/page.tsx +98 -7
- package/.next/standalone/src/app/api/benchmark/run/route.ts +24 -3
- package/.next/standalone/src/app/api/claude/usage/route.ts +33 -0
- package/.next/standalone/src/app/api/config/route.ts +3 -0
- package/.next/standalone/src/app/api/cortex/context/route.ts +1 -1
- package/.next/standalone/src/app/api/cortex/knowledge/route.ts +1 -1
- package/.next/standalone/src/app/api/cortex/search/route.ts +14 -2
- package/.next/standalone/src/app/api/folders/route.ts +16 -6
- package/.next/standalone/src/app/api/network/panes/[id]/route.ts +27 -11
- package/.next/standalone/src/app/api/network/panes/route.ts +25 -14
- package/.next/standalone/src/app/api/network/projects/route.ts +11 -4
- package/.next/standalone/src/app/api/network/search/route.ts +21 -14
- package/.next/standalone/src/app/api/network/sessions/[id]/messages/route.ts +18 -11
- package/.next/standalone/src/app/api/network/sessions/[id]/route.ts +16 -9
- package/.next/standalone/src/app/api/network/sessions/route.ts +25 -18
- package/.next/standalone/src/app/api/network/workspaces/[id]/route.ts +21 -12
- package/.next/standalone/src/app/api/network/workspaces/route.ts +16 -14
- package/.next/standalone/src/app/api/whisper/config/route.ts +16 -8
- package/.next/standalone/src/app/api/wizard/chart/route.ts +129 -0
- package/.next/standalone/src/app/api/workspaces/[id]/todos/[todoId]/route.ts +55 -0
- package/.next/standalone/src/app/api/workspaces/[id]/todos/route.ts +43 -0
- package/.next/standalone/src/components/claude/claude-usage-strip.tsx +175 -0
- package/.next/standalone/src/components/cortex/benchmark-tab.tsx +14 -0
- package/.next/standalone/src/components/terminal/terminal-pane.tsx +78 -12
- package/.next/standalone/src/components/wizard/chart-wizard.tsx +405 -0
- package/.next/standalone/src/components/workspace/workspace-todos.tsx +265 -0
- package/.next/standalone/src/hooks/use-benchmark.ts +1 -0
- package/.next/standalone/src/hooks/use-claude-usage.ts +66 -0
- package/.next/standalone/src/hooks/use-speech-recognition.ts +2 -1
- package/.next/standalone/src/lib/claude/credentials.ts +36 -0
- package/.next/standalone/src/lib/claude/usage.ts +69 -0
- package/.next/standalone/src/lib/config.ts +3 -0
- package/.next/standalone/src/lib/cortex/benchmark.ts +17 -1
- package/.next/standalone/src/lib/cortex/index.ts +54 -1
- package/.next/standalone/src/lib/db/queries.ts +105 -90
- package/.next/standalone/src/lib/db/schema.ts +18 -0
- package/.next/standalone/src/lib/shell-user.ts +101 -0
- package/.next/standalone/src/types/claude.ts +39 -0
- package/.next/standalone/tests/db/workspace-todos.test.ts +156 -0
- package/bin/spaces.js +7 -4
- package/bin/terminal-server.js +48 -10
- package/package.json +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__00fdfbda._.js +0 -114
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__04f04898._.js +0 -106
- 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]__194955d4._.js +0 -98
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1f054c65._.js +0 -98
- 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]__2384f98e._.js +0 -98
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__277d9445._.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]__2a2c5fc5._.js +0 -98
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__2d7a454e._.js +0 -98
- 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]__49e42a3a._.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]__4d903941._.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]__614458b7._.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]__6fe5e6c8._.js +0 -98
- 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]__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]__91e23c96._.js +0 -98
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__929ea03a._.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]__9d68157b._.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]__ac39ecc7._.js +0 -98
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__ac84b704._.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]__cb027619._.js +0 -98
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__cc6e2885._.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]__d95165f0._.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]__eafd040b._.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/_3ba93bdd._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_e84a0c06._.js +0 -3
- package/.next/standalone/.next/static/chunks/074df89a63b6a854.js +0 -1
- package/.next/standalone/.next/static/chunks/9d4164833c2c1fd6.js +0 -85
- package/.next/standalone/.next/static/chunks/bffaf378f7745d59.css +0 -3
- package/.next/standalone/.next/static/chunks/f091f4bf8d80fd07.js +0 -1
- /package/.next/standalone/.next/static/{0KefPNmR9NsrZHWWt9Xr7 → bAQs2gDlFrq3e8w9ni9tr}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{0KefPNmR9NsrZHWWt9Xr7 → bAQs2gDlFrq3e8w9ni9tr}/_clientMiddlewareManifest.json +0 -0
- /package/.next/standalone/.next/static/{0KefPNmR9NsrZHWWt9Xr7 → bAQs2gDlFrq3e8w9ni9tr}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { useEffect, useRef, useState } from 'react';
|
|
4
|
+
import { api } from '@/lib/api';
|
|
5
|
+
import type { UsageResponse } from '@/types/claude';
|
|
6
|
+
|
|
7
|
+
const POLL_INTERVAL_MS = 60_000;
|
|
8
|
+
const TRANSIENT_TOLERANCE = 2; // consecutive bad polls before we clobber good data
|
|
9
|
+
|
|
10
|
+
export function useClaudeUsage(enabled: boolean): UsageResponse | null {
|
|
11
|
+
const [response, setResponse] = useState<UsageResponse | null>(null);
|
|
12
|
+
const badPollsRef = useRef(0);
|
|
13
|
+
|
|
14
|
+
useEffect(() => {
|
|
15
|
+
if (!enabled) {
|
|
16
|
+
badPollsRef.current = 0;
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
let cancelled = false;
|
|
21
|
+
|
|
22
|
+
async function load() {
|
|
23
|
+
try {
|
|
24
|
+
const res = await fetch(api('/api/claude/usage'));
|
|
25
|
+
if (!res.ok || cancelled) return;
|
|
26
|
+
const data: UsageResponse = await res.json();
|
|
27
|
+
if (cancelled) return;
|
|
28
|
+
|
|
29
|
+
const isTransient = data.status === 'upstream_error' || data.status === 'expired';
|
|
30
|
+
if (isTransient) {
|
|
31
|
+
badPollsRef.current += 1;
|
|
32
|
+
setResponse(prev => {
|
|
33
|
+
// If we already have a good response, keep it until the bad state persists.
|
|
34
|
+
if (prev?.status === 'ok' && badPollsRef.current < TRANSIENT_TOLERANCE) {
|
|
35
|
+
return prev;
|
|
36
|
+
}
|
|
37
|
+
return data;
|
|
38
|
+
});
|
|
39
|
+
} else {
|
|
40
|
+
badPollsRef.current = 0;
|
|
41
|
+
setResponse(data);
|
|
42
|
+
}
|
|
43
|
+
} catch {
|
|
44
|
+
// Network error — treat as transient.
|
|
45
|
+
if (cancelled) return;
|
|
46
|
+
badPollsRef.current += 1;
|
|
47
|
+
setResponse(prev => {
|
|
48
|
+
if (prev?.status === 'ok' && badPollsRef.current < TRANSIENT_TOLERANCE) {
|
|
49
|
+
return prev;
|
|
50
|
+
}
|
|
51
|
+
return { status: 'upstream_error' };
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
load();
|
|
57
|
+
const timer = setInterval(load, POLL_INTERVAL_MS);
|
|
58
|
+
|
|
59
|
+
return () => {
|
|
60
|
+
cancelled = true;
|
|
61
|
+
clearInterval(timer);
|
|
62
|
+
};
|
|
63
|
+
}, [enabled]);
|
|
64
|
+
|
|
65
|
+
return response;
|
|
66
|
+
}
|
|
@@ -63,7 +63,8 @@ export function useSpeechRecognition(): UseSpeechRecognitionReturn {
|
|
|
63
63
|
}
|
|
64
64
|
};
|
|
65
65
|
|
|
66
|
-
recognition.onerror = () => {
|
|
66
|
+
recognition.onerror = (event: any) => {
|
|
67
|
+
console.error('[SpeechRecognition] error:', event.error, event.message);
|
|
67
68
|
setIsListening(false);
|
|
68
69
|
};
|
|
69
70
|
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import os from 'os';
|
|
3
|
+
import { readFile } from 'fs/promises';
|
|
4
|
+
|
|
5
|
+
export interface ClaudeAiOAuthTokens {
|
|
6
|
+
accessToken: string;
|
|
7
|
+
refreshToken: string | null;
|
|
8
|
+
expiresAt: number | null; // epoch ms
|
|
9
|
+
scopes?: string[];
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function getCredentialsPath(): string {
|
|
13
|
+
const home = process.env.CLAUDE_CONFIG_DIR || path.join(os.homedir(), '.claude');
|
|
14
|
+
return path.join(home, '.credentials.json');
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Reads ~/.claude/.credentials.json and returns the claudeAiOauth block.
|
|
19
|
+
* Returns null on any read/parse failure or if the block is absent.
|
|
20
|
+
*/
|
|
21
|
+
export async function readClaudeAiOauthTokens(): Promise<ClaudeAiOAuthTokens | null> {
|
|
22
|
+
try {
|
|
23
|
+
const raw = await readFile(getCredentialsPath(), 'utf8');
|
|
24
|
+
const parsed = JSON.parse(raw) as { claudeAiOauth?: ClaudeAiOAuthTokens };
|
|
25
|
+
const tokens = parsed.claudeAiOauth;
|
|
26
|
+
if (!tokens?.accessToken) return null;
|
|
27
|
+
return tokens;
|
|
28
|
+
} catch {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function isTokenExpired(tokens: ClaudeAiOAuthTokens, nowMs = Date.now()): boolean {
|
|
34
|
+
if (!tokens.expiresAt) return false; // no expiry set → treat as valid
|
|
35
|
+
return nowMs >= tokens.expiresAt;
|
|
36
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { createHash } from 'crypto';
|
|
2
|
+
import type { Utilization } from '@/types/claude';
|
|
3
|
+
|
|
4
|
+
const ANTHROPIC_USAGE_URL = 'https://api.anthropic.com/api/oauth/usage';
|
|
5
|
+
const REQUEST_TIMEOUT_MS = 5_000;
|
|
6
|
+
const CACHE_TTL_MS = 30_000;
|
|
7
|
+
|
|
8
|
+
// UA + anthropic-beta header match Claude Code's. The endpoint requires the
|
|
9
|
+
// beta header; see claude-code/src/utils/http.ts (getAuthHeaders) and
|
|
10
|
+
// claude-code/src/constants/oauth.ts (OAUTH_BETA_HEADER).
|
|
11
|
+
const USER_AGENT = 'claude-code/spaces';
|
|
12
|
+
const OAUTH_BETA_HEADER = 'oauth-2025-04-20';
|
|
13
|
+
|
|
14
|
+
interface CacheEntry {
|
|
15
|
+
fetchedAt: number;
|
|
16
|
+
data: Utilization;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const cache = new Map<string, CacheEntry>();
|
|
20
|
+
|
|
21
|
+
function cacheKey(accessToken: string): string {
|
|
22
|
+
// Full SHA-256 of the token so two tokens sharing a prefix cannot collide.
|
|
23
|
+
return createHash('sha256').update(accessToken).digest('hex');
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export type FetchOutcome =
|
|
27
|
+
| { ok: true; data: Utilization }
|
|
28
|
+
| { ok: false; reason: 'upstream_error' };
|
|
29
|
+
|
|
30
|
+
export async function fetchUtilization(accessToken: string): Promise<FetchOutcome> {
|
|
31
|
+
const key = cacheKey(accessToken);
|
|
32
|
+
const cached = cache.get(key);
|
|
33
|
+
if (cached && Date.now() - cached.fetchedAt < CACHE_TTL_MS) {
|
|
34
|
+
return { ok: true, data: cached.data };
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const controller = new AbortController();
|
|
38
|
+
const timer = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);
|
|
39
|
+
|
|
40
|
+
try {
|
|
41
|
+
const res = await fetch(ANTHROPIC_USAGE_URL, {
|
|
42
|
+
method: 'GET',
|
|
43
|
+
headers: {
|
|
44
|
+
'Authorization': `Bearer ${accessToken}`,
|
|
45
|
+
'anthropic-beta': OAUTH_BETA_HEADER,
|
|
46
|
+
'Content-Type': 'application/json',
|
|
47
|
+
'User-Agent': USER_AGENT,
|
|
48
|
+
},
|
|
49
|
+
signal: controller.signal,
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
if (!res.ok) {
|
|
53
|
+
return { ok: false, reason: 'upstream_error' };
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const data = (await res.json()) as Utilization;
|
|
57
|
+
cache.set(key, { fetchedAt: Date.now(), data });
|
|
58
|
+
return { ok: true, data };
|
|
59
|
+
} catch {
|
|
60
|
+
return { ok: false, reason: 'upstream_error' };
|
|
61
|
+
} finally {
|
|
62
|
+
clearTimeout(timer);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** Testing/hot-reload helper. */
|
|
67
|
+
export function __clearUsageCache() {
|
|
68
|
+
cache.clear();
|
|
69
|
+
}
|
|
@@ -90,6 +90,7 @@ export interface SpacesConfig {
|
|
|
90
90
|
installId: string;
|
|
91
91
|
telemetryOptOut: boolean;
|
|
92
92
|
devDirectories: string[];
|
|
93
|
+
todosEnabled: boolean;
|
|
93
94
|
cortex?: CortexConfig;
|
|
94
95
|
customModels?: CustomModelConfig[];
|
|
95
96
|
}
|
|
@@ -103,6 +104,7 @@ export function readConfig(username: string): SpacesConfig {
|
|
|
103
104
|
installId: raw.installId || crypto.randomUUID(),
|
|
104
105
|
telemetryOptOut: !!raw.telemetryOptOut,
|
|
105
106
|
devDirectories: Array.isArray(raw.devDirectories) ? raw.devDirectories.filter((d: unknown) => typeof d === 'string') : [],
|
|
107
|
+
todosEnabled: !!raw.todosEnabled,
|
|
106
108
|
...(raw.cortex && typeof raw.cortex === 'object' ? { cortex: raw.cortex } : {}),
|
|
107
109
|
customModels: Array.isArray(raw.customModels) ? raw.customModels : [],
|
|
108
110
|
};
|
|
@@ -117,6 +119,7 @@ export function readConfig(username: string): SpacesConfig {
|
|
|
117
119
|
installId: crypto.randomUUID(),
|
|
118
120
|
telemetryOptOut: false,
|
|
119
121
|
devDirectories: [],
|
|
122
|
+
todosEnabled: false,
|
|
120
123
|
customModels: [],
|
|
121
124
|
};
|
|
122
125
|
fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
|
|
@@ -6,6 +6,17 @@ import type { ChildProcess } from 'node:child_process';
|
|
|
6
6
|
|
|
7
7
|
let _access: any = null;
|
|
8
8
|
|
|
9
|
+
/** Resolve the installed @spaces/cortex package root (managed install, symlink, etc.). */
|
|
10
|
+
function resolveCortexPackageDir(): string | null {
|
|
11
|
+
try {
|
|
12
|
+
const { createRequire } = require('module') as typeof import('module');
|
|
13
|
+
const req = createRequire(path.join(process.cwd(), 'package.json'));
|
|
14
|
+
return path.dirname(req.resolve('@spaces/cortex/package.json'));
|
|
15
|
+
} catch {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
9
20
|
export function getBenchmarkAccess(): any {
|
|
10
21
|
if (_access) return _access;
|
|
11
22
|
|
|
@@ -14,11 +25,16 @@ export function getBenchmarkAccess(): any {
|
|
|
14
25
|
|
|
15
26
|
const user = getCurrentUser();
|
|
16
27
|
const { spacesDir } = getUserPaths(user);
|
|
28
|
+
const cortexPkgDir = resolveCortexPackageDir();
|
|
17
29
|
|
|
18
|
-
// Check candidate paths
|
|
30
|
+
// Check candidate paths in priority order:
|
|
31
|
+
// 1. User's cortex dir (where the run route could point --output)
|
|
32
|
+
// 2. Next standalone sibling — only meaningful in a dev layout
|
|
33
|
+
// 3. Addon's own results dir — where the CLI writes by default
|
|
19
34
|
const candidates = [
|
|
20
35
|
path.join(spacesDir, 'cortex', 'benchmark.db'),
|
|
21
36
|
path.join(process.cwd(), 'tests', 'benchmark', 'results', 'benchmark.db'),
|
|
37
|
+
...(cortexPkgDir ? [path.join(cortexPkgDir, 'tests', 'benchmark', 'results', 'benchmark.db')] : []),
|
|
22
38
|
];
|
|
23
39
|
|
|
24
40
|
for (const dbPath of candidates) {
|
|
@@ -52,5 +52,58 @@ export function hasCortexAddon(): boolean { return loadAddon() !== null; }
|
|
|
52
52
|
// Re-export engine functions — delegate to addon or return safe fallbacks
|
|
53
53
|
export async function getCortex() { return loadAddon()?.getCortex() ?? null; }
|
|
54
54
|
export function isCortexAvailable(): boolean { return loadAddon()?.isCortexAvailable() ?? false; }
|
|
55
|
-
export function resetCortex(): void { loadAddon()?.resetCortex(); }
|
|
55
|
+
export function resetCortex(): void { _client = null; loadAddon()?.resetCortex(); }
|
|
56
56
|
export type { CortexInstance } from './types';
|
|
57
|
+
|
|
58
|
+
// --- Cortex Client (multi-server support) ---
|
|
59
|
+
let _client: any = null;
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Get a CortexClient that wraps the local embedded engine + any remote connections
|
|
63
|
+
* from ~/.cortex/connections.json. Use this for search/teach/context operations
|
|
64
|
+
* that should fan out across all connected Cortex servers.
|
|
65
|
+
*/
|
|
66
|
+
export async function getCortexClient(): Promise<any | null> {
|
|
67
|
+
if (_client) return _client;
|
|
68
|
+
|
|
69
|
+
const addon = loadAddon();
|
|
70
|
+
if (!addon) return null;
|
|
71
|
+
|
|
72
|
+
const engine = await addon.getCortex();
|
|
73
|
+
if (!engine) return null;
|
|
74
|
+
|
|
75
|
+
try {
|
|
76
|
+
const { createClient, EmbeddedConnection, RemoteConnection, loadConfig } = addon;
|
|
77
|
+
|
|
78
|
+
// Build embedded connection from local engine
|
|
79
|
+
const embeddedConn = new EmbeddedConnection({
|
|
80
|
+
name: 'local',
|
|
81
|
+
domains: engine.domainRegistry.list(),
|
|
82
|
+
writable: true,
|
|
83
|
+
default: true,
|
|
84
|
+
primary: true,
|
|
85
|
+
engine,
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
// Load remote connections from config file
|
|
89
|
+
const connections: any[] = [embeddedConn];
|
|
90
|
+
try {
|
|
91
|
+
const config = loadConfig();
|
|
92
|
+
for (const c of config.connections) {
|
|
93
|
+
if (c.type === 'remote') {
|
|
94
|
+
connections.push(new RemoteConnection(c));
|
|
95
|
+
}
|
|
96
|
+
// Skip embedded configs — we already have our local engine
|
|
97
|
+
}
|
|
98
|
+
} catch {
|
|
99
|
+
// No connections.json or invalid — that's fine, just use embedded
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
_client = createClient({ connections });
|
|
103
|
+
return _client;
|
|
104
|
+
} catch (err) {
|
|
105
|
+
// Cortex client not available (old addon version?) — fall back
|
|
106
|
+
console.warn('[cortex] Client library not available, multi-server disabled:', err);
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
@@ -1,10 +1,6 @@
|
|
|
1
|
-
import path from 'path';
|
|
2
1
|
import crypto from 'crypto';
|
|
3
2
|
import { getDb } from './schema';
|
|
4
|
-
import {
|
|
5
|
-
import { getCurrentUser } from '../auth';
|
|
6
|
-
import { scanCodexSessions } from '../codex/parser';
|
|
7
|
-
import type { SessionWithMeta, Project, Workspace, Tag, SearchResult } from '@/types/claude';
|
|
3
|
+
import type { SessionWithMeta, Project, Workspace, Tag, SearchResult, WorkspaceTodo } from '@/types/claude';
|
|
8
4
|
|
|
9
5
|
// ─── Projects ───────────────────────────────────────────────
|
|
10
6
|
|
|
@@ -517,87 +513,8 @@ function mapPane(row: any): PaneData {
|
|
|
517
513
|
return { ...row, isPopout: !!row.isPopout, isCollaborating: !!row.isCollaborating };
|
|
518
514
|
}
|
|
519
515
|
|
|
520
|
-
function findLatestSessionIdForPane(db: ReturnType<typeof getDb>, cwd: string, agentType: string): string | null {
|
|
521
|
-
if (!cwd || !agentType || agentType === 'shell') return null;
|
|
522
|
-
|
|
523
|
-
try {
|
|
524
|
-
const resolved = path.resolve(cwd);
|
|
525
|
-
const row = db.prepare(`
|
|
526
|
-
SELECT s.session_id as sessionId
|
|
527
|
-
FROM sessions s
|
|
528
|
-
LEFT JOIN projects p ON p.id = s.project_id
|
|
529
|
-
WHERE s.agent_type = ?
|
|
530
|
-
AND (
|
|
531
|
-
s.project_path = ? OR s.project_path = ?
|
|
532
|
-
OR p.path = ? OR p.path = ?
|
|
533
|
-
)
|
|
534
|
-
ORDER BY s.modified DESC
|
|
535
|
-
LIMIT 1
|
|
536
|
-
`).get(agentType, cwd, resolved, cwd, resolved) as { sessionId: string } | undefined;
|
|
537
|
-
|
|
538
|
-
if (row?.sessionId) return row.sessionId;
|
|
539
|
-
|
|
540
|
-
if (agentType === 'codex') {
|
|
541
|
-
const paths = getUserPaths(getCurrentUser());
|
|
542
|
-
const latest = scanCodexSessions(paths.codexSessionsDir).find((session) => {
|
|
543
|
-
try {
|
|
544
|
-
return path.resolve(session.cwd) === resolved;
|
|
545
|
-
} catch {
|
|
546
|
-
return false;
|
|
547
|
-
}
|
|
548
|
-
});
|
|
549
|
-
if (latest?.id) return latest.id;
|
|
550
|
-
}
|
|
551
|
-
|
|
552
|
-
// Pi stores sessions as JSONL in .pi/sessions/ (project) or ~/.pi/agent/sessions/ (global).
|
|
553
|
-
// Check project-level first, then fall back to global.
|
|
554
|
-
if (agentType === 'pi') {
|
|
555
|
-
const fs = require('fs');
|
|
556
|
-
const dirs = [
|
|
557
|
-
path.join(resolved, '.pi', 'sessions'),
|
|
558
|
-
path.join(require('os').homedir(), '.pi', 'agent', 'sessions'),
|
|
559
|
-
];
|
|
560
|
-
for (const dir of dirs) {
|
|
561
|
-
try {
|
|
562
|
-
if (!fs.existsSync(dir)) continue;
|
|
563
|
-
const files: string[] = fs.readdirSync(dir)
|
|
564
|
-
.filter((f: string) => f.endsWith('.jsonl'))
|
|
565
|
-
.sort((a: string, b: string) => {
|
|
566
|
-
// Sort by modification time descending (most recent first)
|
|
567
|
-
const aStat = fs.statSync(path.join(dir, a));
|
|
568
|
-
const bStat = fs.statSync(path.join(dir, b));
|
|
569
|
-
return bStat.mtimeMs - aStat.mtimeMs;
|
|
570
|
-
});
|
|
571
|
-
if (files.length > 0) {
|
|
572
|
-
return path.basename(files[0], '.jsonl');
|
|
573
|
-
}
|
|
574
|
-
} catch { /* ignore */ }
|
|
575
|
-
}
|
|
576
|
-
}
|
|
577
|
-
|
|
578
|
-
return null;
|
|
579
|
-
} catch {
|
|
580
|
-
return null;
|
|
581
|
-
}
|
|
582
|
-
}
|
|
583
|
-
|
|
584
516
|
function normalizePane(row: any): PaneData {
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
if (!pane.claudeSessionId || pane.claudeSessionId === 'new') {
|
|
588
|
-
const db = getDb();
|
|
589
|
-
const sessionId = findLatestSessionIdForPane(db, pane.cwd, pane.agentType);
|
|
590
|
-
if (sessionId) {
|
|
591
|
-
pane.claudeSessionId = sessionId;
|
|
592
|
-
try {
|
|
593
|
-
db.prepare('UPDATE panes SET claude_session_id = ? WHERE id = ?').run(sessionId, pane.id);
|
|
594
|
-
} catch {
|
|
595
|
-
// Ignore best-effort backfill failures during reads.
|
|
596
|
-
}
|
|
597
|
-
}
|
|
598
|
-
}
|
|
599
|
-
|
|
600
|
-
return pane;
|
|
517
|
+
return mapPane(row);
|
|
601
518
|
}
|
|
602
519
|
|
|
603
520
|
export function getPanesByWorkspace(workspaceId: number): PaneData[] {
|
|
@@ -651,11 +568,7 @@ export function createPane(pane: {
|
|
|
651
568
|
baselineSha = execFileSync('git', ['rev-parse', 'HEAD'], { cwd: pane.cwd, encoding: 'utf-8', timeout: 3000 }).trim();
|
|
652
569
|
} catch { /* not a git repo or git not available */ }
|
|
653
570
|
|
|
654
|
-
|
|
655
|
-
let sessId = pane.claudeSessionId || null;
|
|
656
|
-
if (!sessId || sessId === 'new') {
|
|
657
|
-
sessId = findLatestSessionIdForPane(db, pane.cwd, pane.agentType || 'shell');
|
|
658
|
-
}
|
|
571
|
+
const sessId = (pane.claudeSessionId && pane.claudeSessionId !== 'new') ? pane.claudeSessionId : null;
|
|
659
572
|
|
|
660
573
|
db.prepare(`
|
|
661
574
|
INSERT INTO panes (id, title, color, cwd, claude_session_id, agent_type, custom_command, sort_order, workspace_id, node_id, is_collaborating, diff_baseline_sha, custom_model_id)
|
|
@@ -825,3 +738,105 @@ export function getDailyActivity(days = 30): { date: string; sessionCount: numbe
|
|
|
825
738
|
`).all(`-${days} days`) as any[];
|
|
826
739
|
}
|
|
827
740
|
|
|
741
|
+
// ─── Workspace Todos ───────────────────────────────────────
|
|
742
|
+
|
|
743
|
+
interface TodoRow {
|
|
744
|
+
id: number;
|
|
745
|
+
workspace_id: number;
|
|
746
|
+
text: string;
|
|
747
|
+
completed: number;
|
|
748
|
+
sort_order: number;
|
|
749
|
+
created: string;
|
|
750
|
+
completed_at: string | null;
|
|
751
|
+
}
|
|
752
|
+
|
|
753
|
+
function rowToTodo(r: TodoRow): WorkspaceTodo {
|
|
754
|
+
return {
|
|
755
|
+
id: r.id,
|
|
756
|
+
workspaceId: r.workspace_id,
|
|
757
|
+
text: r.text,
|
|
758
|
+
completed: !!r.completed,
|
|
759
|
+
sortOrder: r.sort_order,
|
|
760
|
+
created: r.created,
|
|
761
|
+
completedAt: r.completed_at,
|
|
762
|
+
};
|
|
763
|
+
}
|
|
764
|
+
|
|
765
|
+
export function getWorkspaceTodos(workspaceId: number): WorkspaceTodo[] {
|
|
766
|
+
const db = getDb();
|
|
767
|
+
const rows = db.prepare(`
|
|
768
|
+
SELECT id, workspace_id, text, completed, sort_order, created, completed_at
|
|
769
|
+
FROM workspace_todos
|
|
770
|
+
WHERE workspace_id = ?
|
|
771
|
+
ORDER BY completed ASC,
|
|
772
|
+
CASE WHEN completed = 0 THEN sort_order END ASC,
|
|
773
|
+
completed_at DESC
|
|
774
|
+
`).all(workspaceId) as TodoRow[];
|
|
775
|
+
return rows.map(rowToTodo);
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
export function addWorkspaceTodo(workspaceId: number, text: string): WorkspaceTodo {
|
|
779
|
+
const db = getDb();
|
|
780
|
+
const trimmed = text.trim();
|
|
781
|
+
if (!trimmed) throw new Error('todo text is required');
|
|
782
|
+
|
|
783
|
+
const maxRow = db.prepare(`
|
|
784
|
+
SELECT COALESCE(MAX(sort_order), -1) AS max_order
|
|
785
|
+
FROM workspace_todos
|
|
786
|
+
WHERE workspace_id = ? AND completed = 0
|
|
787
|
+
`).get(workspaceId) as { max_order: number };
|
|
788
|
+
const nextOrder = (maxRow?.max_order ?? -1) + 1;
|
|
789
|
+
|
|
790
|
+
const info = db.prepare(`
|
|
791
|
+
INSERT INTO workspace_todos (workspace_id, text, sort_order)
|
|
792
|
+
VALUES (?, ?, ?)
|
|
793
|
+
`).run(workspaceId, trimmed, nextOrder);
|
|
794
|
+
|
|
795
|
+
const row = db.prepare(`
|
|
796
|
+
SELECT id, workspace_id, text, completed, sort_order, created, completed_at
|
|
797
|
+
FROM workspace_todos WHERE id = ?
|
|
798
|
+
`).get(Number(info.lastInsertRowid)) as TodoRow;
|
|
799
|
+
return rowToTodo(row);
|
|
800
|
+
}
|
|
801
|
+
|
|
802
|
+
export function updateWorkspaceTodo(
|
|
803
|
+
workspaceId: number,
|
|
804
|
+
todoId: number,
|
|
805
|
+
data: { text?: string; completed?: boolean }
|
|
806
|
+
): WorkspaceTodo | null {
|
|
807
|
+
const db = getDb();
|
|
808
|
+
|
|
809
|
+
if (data.text !== undefined) {
|
|
810
|
+
const trimmed = data.text.trim();
|
|
811
|
+
if (!trimmed) throw new Error('todo text cannot be empty');
|
|
812
|
+
db.prepare('UPDATE workspace_todos SET text = ? WHERE id = ? AND workspace_id = ?').run(trimmed, todoId, workspaceId);
|
|
813
|
+
}
|
|
814
|
+
|
|
815
|
+
if (data.completed !== undefined) {
|
|
816
|
+
if (data.completed) {
|
|
817
|
+
db.prepare(`
|
|
818
|
+
UPDATE workspace_todos
|
|
819
|
+
SET completed = 1, completed_at = datetime('now')
|
|
820
|
+
WHERE id = ? AND workspace_id = ?
|
|
821
|
+
`).run(todoId, workspaceId);
|
|
822
|
+
} else {
|
|
823
|
+
db.prepare(`
|
|
824
|
+
UPDATE workspace_todos
|
|
825
|
+
SET completed = 0, completed_at = NULL
|
|
826
|
+
WHERE id = ? AND workspace_id = ?
|
|
827
|
+
`).run(todoId, workspaceId);
|
|
828
|
+
}
|
|
829
|
+
}
|
|
830
|
+
|
|
831
|
+
const row = db.prepare(`
|
|
832
|
+
SELECT id, workspace_id, text, completed, sort_order, created, completed_at
|
|
833
|
+
FROM workspace_todos WHERE id = ? AND workspace_id = ?
|
|
834
|
+
`).get(todoId, workspaceId) as TodoRow | undefined;
|
|
835
|
+
return row ? rowToTodo(row) : null;
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
export function deleteWorkspaceTodo(workspaceId: number, todoId: number): void {
|
|
839
|
+
const db = getDb();
|
|
840
|
+
db.prepare('DELETE FROM workspace_todos WHERE id = ? AND workspace_id = ?').run(todoId, workspaceId);
|
|
841
|
+
}
|
|
842
|
+
|
|
@@ -113,6 +113,19 @@ function initSchema(db: Database.Database) {
|
|
|
113
113
|
enabled INTEGER DEFAULT 0,
|
|
114
114
|
created TEXT DEFAULT (datetime('now'))
|
|
115
115
|
);
|
|
116
|
+
|
|
117
|
+
CREATE TABLE IF NOT EXISTS workspace_todos (
|
|
118
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
119
|
+
workspace_id INTEGER NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE,
|
|
120
|
+
text TEXT NOT NULL,
|
|
121
|
+
completed INTEGER NOT NULL DEFAULT 0,
|
|
122
|
+
sort_order INTEGER NOT NULL DEFAULT 0,
|
|
123
|
+
created TEXT NOT NULL DEFAULT (datetime('now')),
|
|
124
|
+
completed_at TEXT
|
|
125
|
+
);
|
|
126
|
+
|
|
127
|
+
CREATE INDEX IF NOT EXISTS idx_workspace_todos_workspace
|
|
128
|
+
ON workspace_todos(workspace_id);
|
|
116
129
|
`);
|
|
117
130
|
|
|
118
131
|
// Migrate: add workspace and popout columns to existing tables
|
|
@@ -204,3 +217,8 @@ export function closeDb() {
|
|
|
204
217
|
}
|
|
205
218
|
_dbs.clear();
|
|
206
219
|
}
|
|
220
|
+
|
|
221
|
+
// Test-only export. Do not use outside of tests.
|
|
222
|
+
export const __testing = {
|
|
223
|
+
dbs: _dbs,
|
|
224
|
+
};
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import os from 'os';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import { spawnSync } from 'child_process';
|
|
5
|
+
|
|
6
|
+
const ADMIN_DB_PATH = path.join(os.homedir(), '.spaces', 'admin.db');
|
|
7
|
+
const SERVICE_KEY = path.join(os.homedir(), '.spaces', 'service_key');
|
|
8
|
+
const KNOWN_HOSTS = path.join(os.homedir(), '.spaces', 'known_hosts');
|
|
9
|
+
|
|
10
|
+
type AdminDb = {
|
|
11
|
+
prepare: (sql: string) => { get: (...args: unknown[]) => unknown };
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
let _adminDb: AdminDb | null = null;
|
|
15
|
+
|
|
16
|
+
function getAdminDb(): AdminDb | null {
|
|
17
|
+
if (_adminDb) return _adminDb;
|
|
18
|
+
if (!fs.existsSync(ADMIN_DB_PATH)) return null;
|
|
19
|
+
try {
|
|
20
|
+
const Database = require('better-sqlite3');
|
|
21
|
+
_adminDb = new Database(ADMIN_DB_PATH, { readonly: true, fileMustExist: true }) as AdminDb;
|
|
22
|
+
return _adminDb;
|
|
23
|
+
} catch {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** Map an app-level username to the OS shell user (falls back to the same name). */
|
|
29
|
+
export function lookupShellUser(appUsername: string): string {
|
|
30
|
+
const db = getAdminDb();
|
|
31
|
+
if (!db) return appUsername;
|
|
32
|
+
try {
|
|
33
|
+
const row = db.prepare('SELECT shell_user FROM users WHERE username = ?').get(appUsername) as
|
|
34
|
+
| { shell_user?: string }
|
|
35
|
+
| undefined;
|
|
36
|
+
return row?.shell_user || appUsername;
|
|
37
|
+
} catch {
|
|
38
|
+
return appUsername;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** Resolve a shell user's home directory via getent; falls back to platform convention. */
|
|
43
|
+
export function resolveHome(shellUser: string): string {
|
|
44
|
+
if (shellUser === os.userInfo().username) return os.homedir();
|
|
45
|
+
try {
|
|
46
|
+
const r = spawnSync('getent', ['passwd', shellUser], { encoding: 'utf-8', timeout: 5000 });
|
|
47
|
+
const home = (r.stdout || '').split(':')[5];
|
|
48
|
+
if (home) return home.trim();
|
|
49
|
+
} catch { /* fall through */ }
|
|
50
|
+
return process.platform === 'darwin' ? `/Users/${shellUser}` : `/home/${shellUser}`;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function shellQuote(s: string): string {
|
|
54
|
+
return "'" + s.replace(/'/g, "'\\''") + "'";
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export interface ExecResult {
|
|
58
|
+
status: number;
|
|
59
|
+
stdout: string;
|
|
60
|
+
stderr: string;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Run a command as the given shell user.
|
|
65
|
+
* When the target matches the server process user, spawns directly.
|
|
66
|
+
* Otherwise SSHes to localhost using the Spaces service key — the same mechanism terminal panes use.
|
|
67
|
+
*/
|
|
68
|
+
export function execAsUser(shellUser: string, argv: string[], opts: { timeoutMs?: number } = {}): ExecResult {
|
|
69
|
+
const timeout = opts.timeoutMs ?? 10000;
|
|
70
|
+
const processUser = os.userInfo().username;
|
|
71
|
+
|
|
72
|
+
if (shellUser === processUser) {
|
|
73
|
+
const [cmd, ...rest] = argv;
|
|
74
|
+
const r = spawnSync(cmd, rest, { encoding: 'utf-8', timeout });
|
|
75
|
+
return {
|
|
76
|
+
status: r.status ?? (r.error ? 1 : 0),
|
|
77
|
+
stdout: r.stdout || '',
|
|
78
|
+
stderr: r.stderr || (r.error?.message ?? ''),
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const remoteCmd = argv.map(shellQuote).join(' ');
|
|
83
|
+
const r = spawnSync(
|
|
84
|
+
'ssh',
|
|
85
|
+
[
|
|
86
|
+
'-4',
|
|
87
|
+
'-o', 'StrictHostKeyChecking=accept-new',
|
|
88
|
+
'-o', `UserKnownHostsFile=${KNOWN_HOSTS}`,
|
|
89
|
+
'-o', 'BatchMode=yes',
|
|
90
|
+
'-i', SERVICE_KEY,
|
|
91
|
+
`${shellUser}@localhost`,
|
|
92
|
+
remoteCmd,
|
|
93
|
+
],
|
|
94
|
+
{ encoding: 'utf-8', timeout },
|
|
95
|
+
);
|
|
96
|
+
return {
|
|
97
|
+
status: r.status ?? (r.error ? 1 : 0),
|
|
98
|
+
stdout: r.stdout || '',
|
|
99
|
+
stderr: r.stderr || (r.error?.message ?? ''),
|
|
100
|
+
};
|
|
101
|
+
}
|