@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
|
@@ -58,7 +58,7 @@ setInterval(() => logMemory(), 60000);
|
|
|
58
58
|
const SPACES_DIR = path.join(os.homedir(), '.spaces');
|
|
59
59
|
const CONFIG_PATH = path.join(SPACES_DIR, 'server.json');
|
|
60
60
|
const SESSION_SECRET_PATH = path.join(SPACES_DIR, 'session_secret');
|
|
61
|
-
|
|
61
|
+
let NEXT_INTERNAL_PORT = 3400;
|
|
62
62
|
const projectDir = path.join(__dirname, '..');
|
|
63
63
|
const MANAGED_PACKAGES = path.join(SPACES_DIR, 'packages');
|
|
64
64
|
const MANAGED_NODE_MODULES = path.join(MANAGED_PACKAGES, 'node_modules');
|
|
@@ -227,8 +227,11 @@ function startServer() {
|
|
|
227
227
|
|| savedConfig.allowedOrigins
|
|
228
228
|
|| '';
|
|
229
229
|
|
|
230
|
+
// Use a unique internal port so multiple instances don't collide
|
|
231
|
+
NEXT_INTERNAL_PORT = PORT - 57; // 3457→3400, 3458→3401, etc.
|
|
232
|
+
|
|
230
233
|
// ─── Kill any existing server on this port ───────────────────
|
|
231
|
-
stopServer();
|
|
234
|
+
stopServer(PORT);
|
|
232
235
|
|
|
233
236
|
// ─── Resolve optional packages once ─────────────────────────
|
|
234
237
|
const proPath = resolveSpacesPro();
|
|
@@ -704,12 +707,12 @@ function findPidsOnPort(port) {
|
|
|
704
707
|
return [...pids].filter(p => !isNaN(p) && p > 0);
|
|
705
708
|
}
|
|
706
709
|
|
|
707
|
-
function stopServer() {
|
|
710
|
+
function stopServer(overridePort) {
|
|
708
711
|
let savedConfig = {};
|
|
709
712
|
if (fs.existsSync(CONFIG_PATH)) {
|
|
710
713
|
try { savedConfig = JSON.parse(fs.readFileSync(CONFIG_PATH, 'utf-8')); } catch {}
|
|
711
714
|
}
|
|
712
|
-
const port = parseInt(process.env.SPACES_PORT || '', 10) || savedConfig.port || 3457;
|
|
715
|
+
const port = overridePort || parseInt(process.env.SPACES_PORT || '', 10) || savedConfig.port || 3457;
|
|
713
716
|
const ports = [port, NEXT_INTERNAL_PORT];
|
|
714
717
|
let killed = 0;
|
|
715
718
|
|
|
@@ -479,7 +479,7 @@ const AGENTS = {
|
|
|
479
479
|
gemini: { command: 'gemini', resumeFlag: '--resume', resumeStyle: 'flag' },
|
|
480
480
|
aider: { command: 'aider', resumeFlag: '', resumeStyle: '' },
|
|
481
481
|
forge: { command: 'forge', resumeFlag: '--cid', resumeStyle: 'flag' },
|
|
482
|
-
pi: { command: 'pi', resumeFlag: '--
|
|
482
|
+
pi: { command: 'pi', resumeFlag: '--session', resumeStyle: 'flag' },
|
|
483
483
|
custom: { command: '', resumeFlag: '', resumeStyle: '' },
|
|
484
484
|
};
|
|
485
485
|
|
|
@@ -1441,6 +1441,14 @@ function handleConnection(wss, ws, req) {
|
|
|
1441
1441
|
// Check for existing session to reattach
|
|
1442
1442
|
const existing = sessions.get(paneId);
|
|
1443
1443
|
if (existing && existing.pty && !existing.exited) {
|
|
1444
|
+
// SECURITY: only the original owner may reattach. Without this, any
|
|
1445
|
+
// authenticated user who learns a paneId could hijack another user's PTY.
|
|
1446
|
+
if (existing.username !== username) {
|
|
1447
|
+
console.log(`[WS] REJECTED reattach pane=${paneId.slice(0,8)} — owner=${existing.username} requester=${username}`);
|
|
1448
|
+
ws.send(JSON.stringify({ type: 'error', data: 'Pane belongs to a different user' }));
|
|
1449
|
+
ws.close();
|
|
1450
|
+
return;
|
|
1451
|
+
}
|
|
1444
1452
|
console.log(`[WS] Reattach pane=${paneId.slice(0,8)} buffer=${existing.buffer.length} chunks`);
|
|
1445
1453
|
existing.ws = ws;
|
|
1446
1454
|
|
|
@@ -1732,15 +1740,22 @@ function handleConnection(wss, ws, req) {
|
|
|
1732
1740
|
|
|
1733
1741
|
if (agentSession && agentSession !== 'new' && agent.resumeFlag) {
|
|
1734
1742
|
// Resume an existing session
|
|
1735
|
-
if (agentType === 'claude') {
|
|
1736
|
-
|
|
1737
|
-
|
|
1738
|
-
|
|
1739
|
-
|
|
1740
|
-
|
|
1741
|
-
|
|
1742
|
-
|
|
1743
|
-
|
|
1743
|
+
if (agentType === 'claude' || agentType === 'pi') {
|
|
1744
|
+
let sessionCwd = null;
|
|
1745
|
+
let sessionExists = false;
|
|
1746
|
+
|
|
1747
|
+
if (agentType === 'claude') {
|
|
1748
|
+
// Claude needs to be run from the correct project CWD
|
|
1749
|
+
sessionCwd = findSessionCwd(agentSession, username);
|
|
1750
|
+
|
|
1751
|
+
// Verify the session actually exists on disk before attempting resume.
|
|
1752
|
+
// If the .jsonl file is gone (cleanup, etc.), fall back to `--continue`
|
|
1753
|
+
// which resumes the most recent conversation in this project — much
|
|
1754
|
+
// better than starting completely fresh.
|
|
1755
|
+
sessionExists = sessionCwd !== null || findSessionFile(agentSession, username);
|
|
1756
|
+
} else if (agentType === 'pi') {
|
|
1757
|
+
sessionExists = findPiSessionFile(agentSession, username, safeCwd);
|
|
1758
|
+
}
|
|
1744
1759
|
|
|
1745
1760
|
if (!sessionExists) {
|
|
1746
1761
|
console.log(`[Resume] Session ${agentSession.slice(0, 8)} not found on disk for pane ${paneId.slice(0, 8)} — falling back to --continue`);
|
|
@@ -1915,6 +1930,29 @@ function findSessionFile(sessionId, username) {
|
|
|
1915
1930
|
return false;
|
|
1916
1931
|
}
|
|
1917
1932
|
|
|
1933
|
+
function findPiSessionFile(sessionId, username, cwd) {
|
|
1934
|
+
const homeDir = getUserHome(username);
|
|
1935
|
+
const globalSessionsDir = path.join(homeDir, '.pi', 'agent', 'sessions');
|
|
1936
|
+
const projectSessionsDir = path.join(cwd, '.pi', 'sessions');
|
|
1937
|
+
|
|
1938
|
+
for (const dir of [globalSessionsDir, projectSessionsDir]) {
|
|
1939
|
+
try {
|
|
1940
|
+
if (fs.existsSync(dir)) {
|
|
1941
|
+
for (const sub of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
1942
|
+
if (sub.isDirectory()) {
|
|
1943
|
+
for (const file of fs.readdirSync(path.join(dir, sub.name))) {
|
|
1944
|
+
if (file.endsWith('.jsonl') && file.includes(sessionId)) return true;
|
|
1945
|
+
}
|
|
1946
|
+
} else if (sub.isFile() && sub.name.endsWith('.jsonl') && sub.name.includes(sessionId)) {
|
|
1947
|
+
return true;
|
|
1948
|
+
}
|
|
1949
|
+
}
|
|
1950
|
+
}
|
|
1951
|
+
} catch { /* ignore */ }
|
|
1952
|
+
}
|
|
1953
|
+
return false;
|
|
1954
|
+
}
|
|
1955
|
+
|
|
1918
1956
|
function findSessionCwd(sessionId, username) {
|
|
1919
1957
|
const claudeProjectsDir = path.join(getUserHome(username), '.claude', 'projects');
|
|
1920
1958
|
try {
|
|
@@ -1,23 +1,118 @@
|
|
|
1
|
-
[2026-04-
|
|
2
|
-
[2026-04-
|
|
3
|
-
[2026-04-
|
|
4
|
-
[2026-04-
|
|
5
|
-
[2026-04-
|
|
6
|
-
[2026-04-
|
|
7
|
-
[2026-04-
|
|
8
|
-
[2026-04-
|
|
9
|
-
[2026-04-
|
|
10
|
-
[2026-04-
|
|
11
|
-
[2026-04-
|
|
12
|
-
[2026-04-
|
|
13
|
-
[2026-04-
|
|
14
|
-
[2026-04-
|
|
15
|
-
[2026-04-
|
|
16
|
-
[2026-04-
|
|
17
|
-
[2026-04-
|
|
18
|
-
[2026-04-
|
|
19
|
-
[2026-04-
|
|
20
|
-
[2026-04-
|
|
21
|
-
[2026-04-
|
|
22
|
-
[2026-04-
|
|
23
|
-
[2026-04-
|
|
1
|
+
[2026-04-17T18:44:07.219Z] [LEARN] Learn hook started
|
|
2
|
+
[2026-04-17T18:44:07.226Z] [LEARN] Input length: 857
|
|
3
|
+
[2026-04-17T18:44:07.236Z] [LEARN] Sending POST to http://localhost:3457/api/cortex/knowledge/
|
|
4
|
+
[2026-04-17T18:44:07.274Z] [LEARN] Response: 307
|
|
5
|
+
[2026-04-17T18:45:18.172Z] Hook started
|
|
6
|
+
[2026-04-17T18:45:18.178Z] Input length: 423
|
|
7
|
+
[2026-04-17T18:45:18.179Z] Querying: http://localhost:3457/api/cortex/context/?q=tell%20me%20how%20the%20project%20wizard%20%20harness%20works%20from%20a%20high%20level.%20%20i%20need%20to%20talk%20about%20the%20functionality%20for%20another%20project%20i'm%20working%20on&limit=5&workspace_id=2 (event: UserPromptSubmit)
|
|
8
|
+
[2026-04-17T18:45:18.212Z] Main error: 307
|
|
9
|
+
[2026-04-17T18:45:18.212Z] Hook finished
|
|
10
|
+
[2026-04-17T18:45:37.672Z] [LEARN] Learn hook started
|
|
11
|
+
[2026-04-17T18:45:37.681Z] [LEARN] Input length: 3392
|
|
12
|
+
[2026-04-17T18:45:37.688Z] [LEARN] Sending POST to http://localhost:3457/api/cortex/knowledge/
|
|
13
|
+
[2026-04-17T18:45:37.722Z] [LEARN] Response: 307
|
|
14
|
+
[2026-04-17T18:52:27.655Z] Hook started
|
|
15
|
+
[2026-04-17T18:52:27.661Z] Input length: 319
|
|
16
|
+
[2026-04-17T18:52:27.662Z] Querying: http://localhost:3457/api/cortex/context/?q=does%20it%20use%20skills%20and%20tools%20or%20no%3F&limit=5&workspace_id=2 (event: UserPromptSubmit)
|
|
17
|
+
[2026-04-17T18:52:27.697Z] Main error: 307
|
|
18
|
+
[2026-04-17T18:52:27.697Z] Hook finished
|
|
19
|
+
[2026-04-17T18:52:39.328Z] [LEARN] Learn hook started
|
|
20
|
+
[2026-04-17T18:52:39.336Z] [LEARN] Input length: 2048
|
|
21
|
+
[2026-04-17T18:52:39.344Z] [LEARN] Sending POST to http://localhost:3457/api/cortex/knowledge/
|
|
22
|
+
[2026-04-17T18:52:39.385Z] [LEARN] Response: 307
|
|
23
|
+
[2026-04-19T13:26:25.015Z] Hook started
|
|
24
|
+
[2026-04-19T13:26:25.022Z] Input length: 413
|
|
25
|
+
[2026-04-19T13:26:25.023Z] Querying: http://localhost:3457/api/cortex/context/?q=pull%20the%20latest%20from%20github%20so%20we%20can%20do%20an%20npm%20release.%20%20can%20we%20use%20this%20access%20token%3F%20%20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&limit=5&workspace_id=2 (event: UserPromptSubmit)
|
|
26
|
+
[2026-04-19T13:26:25.063Z] Main error: 307
|
|
27
|
+
[2026-04-19T13:26:25.063Z] Hook finished
|
|
28
|
+
[2026-04-19T13:26:59.700Z] [LEARN] Learn hook started
|
|
29
|
+
[2026-04-19T13:26:59.707Z] [LEARN] Input length: 976
|
|
30
|
+
[2026-04-19T13:26:59.716Z] [LEARN] Sending POST to http://localhost:3457/api/cortex/knowledge/
|
|
31
|
+
[2026-04-19T13:26:59.762Z] [LEARN] Response: 307
|
|
32
|
+
[2026-04-19T13:27:33.753Z] Hook started
|
|
33
|
+
[2026-04-19T13:27:33.759Z] Input length: 287
|
|
34
|
+
[2026-04-19T13:27:33.760Z] Prompt too short
|
|
35
|
+
[2026-04-19T13:27:51.049Z] Hook started
|
|
36
|
+
[2026-04-19T13:27:51.058Z] Input length: 335
|
|
37
|
+
[2026-04-19T13:27:51.059Z] Querying: http://localhost:3457/api/cortex/context/?q=yesyou'll%20have%20to%20bump%20again.%20%200.9.7%20is%20live%20on%20npm&limit=5&workspace_id=2 (event: UserPromptSubmit)
|
|
38
|
+
[2026-04-19T13:27:51.100Z] Main error: 307
|
|
39
|
+
[2026-04-19T13:27:51.100Z] Hook finished
|
|
40
|
+
[2026-04-19T13:31:43.687Z] [LEARN] Learn hook started
|
|
41
|
+
[2026-04-19T13:31:43.698Z] [LEARN] Input length: 508
|
|
42
|
+
[2026-04-19T13:31:43.707Z] [LEARN] Sending POST to http://localhost:3457/api/cortex/knowledge/
|
|
43
|
+
[2026-04-19T13:31:43.747Z] [LEARN] Response: 307
|
|
44
|
+
[2026-04-19T13:35:50.269Z] Hook started
|
|
45
|
+
[2026-04-19T13:35:50.277Z] Input length: 307
|
|
46
|
+
[2026-04-19T13:35:50.278Z] Querying: http://localhost:3457/api/cortex/context/?q=try%20now%2C%20i%20disabled%202fa&limit=5&workspace_id=2 (event: UserPromptSubmit)
|
|
47
|
+
[2026-04-19T13:35:50.316Z] Main error: 307
|
|
48
|
+
[2026-04-19T13:35:50.316Z] Hook finished
|
|
49
|
+
[2026-04-19T13:38:15.302Z] [LEARN] Learn hook started
|
|
50
|
+
[2026-04-19T13:38:15.309Z] [LEARN] Input length: 943
|
|
51
|
+
[2026-04-19T13:38:15.318Z] [LEARN] Sending POST to http://localhost:3457/api/cortex/knowledge/
|
|
52
|
+
[2026-04-19T13:38:15.356Z] [LEARN] Response: 307
|
|
53
|
+
[2026-04-19T13:39:55.427Z] Hook started
|
|
54
|
+
[2026-04-19T13:39:55.432Z] Input length: 324
|
|
55
|
+
[2026-04-19T13:39:55.433Z] Querying: http://localhost:3457/api/cortex/context/?q=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&limit=5&workspace_id=2 (event: UserPromptSubmit)
|
|
56
|
+
[2026-04-19T13:39:55.467Z] Main error: 307
|
|
57
|
+
[2026-04-19T13:39:55.467Z] Hook finished
|
|
58
|
+
[2026-04-19T13:42:05.596Z] [LEARN] Learn hook started
|
|
59
|
+
[2026-04-19T13:42:05.605Z] [LEARN] Input length: 573
|
|
60
|
+
[2026-04-19T13:42:05.615Z] [LEARN] Sending POST to http://localhost:3457/api/cortex/knowledge/
|
|
61
|
+
[2026-04-19T13:42:05.657Z] [LEARN] Response: 307
|
|
62
|
+
[2026-04-19T13:42:36.645Z] Hook started
|
|
63
|
+
[2026-04-19T13:42:36.651Z] Input length: 356
|
|
64
|
+
[2026-04-19T13:42:36.652Z] Querying: http://localhost:3457/api/cortex/context/?q=this%20is%20my%20pc%20--%20why%20does%20it%20matter%20if%20it's%20exposed%20in%20the%20conversation%3F&limit=5&workspace_id=2 (event: UserPromptSubmit)
|
|
65
|
+
[2026-04-19T13:42:36.692Z] Main error: 307
|
|
66
|
+
[2026-04-19T13:42:36.693Z] Hook finished
|
|
67
|
+
[2026-04-19T13:42:48.628Z] [LEARN] Learn hook started
|
|
68
|
+
[2026-04-19T13:42:48.803Z] [LEARN] Input length: 1549
|
|
69
|
+
[2026-04-19T13:42:48.814Z] [LEARN] Sending POST to http://localhost:3457/api/cortex/knowledge/
|
|
70
|
+
[2026-04-19T13:42:48.851Z] [LEARN] Response: 307
|
|
71
|
+
[2026-04-19T13:43:13.309Z] Hook started
|
|
72
|
+
[2026-04-19T13:43:13.315Z] Input length: 325
|
|
73
|
+
[2026-04-19T13:43:13.315Z] Querying: http://localhost:3457/api/cortex/context/?q=how%20do%20I%20check%20to%20see%20if%20telemetry%20is%20on%3F&limit=5&workspace_id=2 (event: UserPromptSubmit)
|
|
74
|
+
[2026-04-19T13:43:13.350Z] Main error: 307
|
|
75
|
+
[2026-04-19T13:43:13.350Z] Hook finished
|
|
76
|
+
[2026-04-19T13:43:53.691Z] [LEARN] Learn hook started
|
|
77
|
+
[2026-04-19T13:43:53.703Z] [LEARN] Input length: 1307
|
|
78
|
+
[2026-04-19T13:43:53.713Z] [LEARN] Sending POST to http://localhost:3457/api/cortex/knowledge/
|
|
79
|
+
[2026-04-19T13:43:53.750Z] [LEARN] Response: 307
|
|
80
|
+
[2026-04-19T13:48:18.876Z] Hook started
|
|
81
|
+
[2026-04-19T13:48:18.882Z] Input length: 287
|
|
82
|
+
[2026-04-19T13:48:18.882Z] Prompt too short
|
|
83
|
+
[2026-04-19T13:52:11.498Z] [LEARN] Learn hook started
|
|
84
|
+
[2026-04-19T13:52:11.505Z] [LEARN] Input length: 354
|
|
85
|
+
[2026-04-19T13:52:11.514Z] [LEARN] Sending POST to http://localhost:3457/api/cortex/knowledge/
|
|
86
|
+
[2026-04-19T13:52:11.557Z] [LEARN] Response: 307
|
|
87
|
+
[2026-04-19T13:52:37.908Z] Hook started
|
|
88
|
+
[2026-04-19T13:52:37.914Z] Input length: 314
|
|
89
|
+
[2026-04-19T13:52:37.916Z] Querying: http://localhost:3457/api/cortex/context/?q=add%20that%20to%20my%20claude%20settings&limit=5&workspace_id=2 (event: UserPromptSubmit)
|
|
90
|
+
[2026-04-19T13:52:37.948Z] Main error: 307
|
|
91
|
+
[2026-04-19T13:52:37.949Z] Hook finished
|
|
92
|
+
[2026-04-19T13:53:23.519Z] [LEARN] Learn hook started
|
|
93
|
+
[2026-04-19T13:53:23.529Z] [LEARN] Input length: 532
|
|
94
|
+
[2026-04-19T13:53:23.541Z] [LEARN] Sending POST to http://localhost:3457/api/cortex/knowledge/
|
|
95
|
+
[2026-04-19T13:53:23.579Z] [LEARN] Response: 307
|
|
96
|
+
[2026-04-22T17:51:18.661Z] Hook started
|
|
97
|
+
[2026-04-22T17:51:18.668Z] Input length: 326
|
|
98
|
+
[2026-04-22T17:51:18.669Z] Querying: http://localhost:3457/api/cortex/context/?q=update%20ffrom%20github%20and%20push%20a%20new%20npm%20release&limit=5&workspace_id=2 (event: UserPromptSubmit)
|
|
99
|
+
[2026-04-22T17:51:18.696Z] Main error:
|
|
100
|
+
[2026-04-22T17:51:18.696Z] Hook finished
|
|
101
|
+
[2026-04-22T17:51:58.962Z] [LEARN] Learn hook started
|
|
102
|
+
[2026-04-22T17:51:58.968Z] [LEARN] Input length: 559
|
|
103
|
+
[2026-04-22T17:51:58.976Z] [LEARN] Sending POST to http://localhost:3457/api/cortex/knowledge/
|
|
104
|
+
[2026-04-22T17:51:59.003Z] [LEARN] Request error:
|
|
105
|
+
[2026-04-22T18:06:02.839Z] Hook started
|
|
106
|
+
[2026-04-22T18:06:02.845Z] Input length: 1514
|
|
107
|
+
[2026-04-22T18:06:02.846Z] Querying: http://localhost:3457/api/cortex/context/?q=npm%20notice%201.4kB%20bin%2Fspaces-reset-totp.js%0Anpm%20notice%2036.8kB%20bin%2Fspaces-service.js%0Anpm%20notice%208.9kB%20bin%2Fspaces-setup.js%0Anpm%20notice%2033.6kB%20bin%2Fspaces.js%0Anpm%20notice%202.3kB%20bin%2Fssh-auth-keys.sh%0Anpm%20notice%20108.5kB%20bin%2Fterminal-server.js%0Anpm%20notice%203.4kB%20package.json%0Anpm%20notice%20Tarball%20Details%0Anpm%20notice%20name%3A%20%40jlongo78%2Fagent-spaces%0Anpm%20notice%20version%3A%200.9.9%0Anpm%20notice%20filename%3A%20jlongo78-agent-spaces-0.9.9.tgz%0Anpm%20notice%20package%20size%3A%2018.5%20MB%0Anpm%20notice%20unpacked%20size%3A%2089.8%20MB%0Anpm%20notice%20shasum%3A%2051e72b721f4acb1c8310031c78f24475639d870c%0Anpm%20notice%20integrity%3A%20sha512-L3MTwHtZpUSCN%5B...%5DY1n6%2FUIyMlpYA%3D%3D%0Anpm%20notice%20total%20files%3A%203341%0Anpm%20notice%0Anpm%20notice%20Publishing%20to%20https%3A%2F%2Fregistry.npmjs.org%2F%20with%20tag%20latest%20and%20public%20access%0Anpm%20error%20code%20E404%0Anpm%20error%20404%20Not%20Found%20-%20PUT%20https%3A%2F%2Fregistry.npmjs.org%2F%40jlongo78%252fagent-spaces%20-%20Not%20found%0Anpm%20error%20404%0Anpm%20error%20404%20%20'%40jlongo78%2Fagent-spaces%400.9.9'%20is%20not%20in%20this%20registry.%0Anpm%20error%20404%0Anpm%20error%20404%20Note%20that%20you%20can%20also%20install%20from%20a%0Anpm%20error%20404%20tarball%2C%20folder%2C%20http%20url%2C%20or%20git%20url.%0Anpm%20error%20A%20complete%20log%20of%20this%20run%20can%20be%20found%20in%3A%20C%3A%5CUsers%5Cjohns%5CAppData%5CLocal%5Cnpm-cache%5C_logs%5C2026-04-22T18_01_12_712Z-debug-0.log%0A%0AD%3A%5Cprojects%5Cspaces%3E&limit=5&workspace_id=2 (event: UserPromptSubmit)
|
|
108
|
+
[2026-04-22T18:06:02.872Z] Main error:
|
|
109
|
+
[2026-04-22T18:06:02.873Z] Hook finished
|
|
110
|
+
[2026-04-22T18:06:14.831Z] [LEARN] Learn hook started
|
|
111
|
+
[2026-04-22T18:06:14.838Z] [LEARN] Input length: 960
|
|
112
|
+
[2026-04-22T18:06:14.847Z] [LEARN] Sending POST to http://localhost:3457/api/cortex/knowledge/
|
|
113
|
+
[2026-04-22T18:06:14.877Z] [LEARN] Request error:
|
|
114
|
+
[2026-04-22T18:07:49.032Z] Hook started
|
|
115
|
+
[2026-04-22T18:07:49.039Z] Input length: 320
|
|
116
|
+
[2026-04-22T18:07:49.041Z] Querying: http://localhost:3457/api/cortex/context/?q=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&limit=5&workspace_id=2 (event: UserPromptSubmit)
|
|
117
|
+
[2026-04-22T18:07:49.071Z] Main error:
|
|
118
|
+
[2026-04-22T18:07:49.071Z] Hook finished
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# Claude Plan-Usage Display
|
|
2
|
+
|
|
3
|
+
**Status:** stable
|
|
4
|
+
**Owner:** jlongo
|
|
5
|
+
**Last updated:** 2026-04-22
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
A compact readout of the user's Anthropic plan-usage rate limits, surfaced in the terminal page header whenever the active workspace has at least one Claude pane. Shows 5-hour, 7-day Opus, and 7-day Sonnet windows at a glance; click expands to all windows plus overage credits. Data matches what `/usage` shows inside Claude Code.
|
|
10
|
+
|
|
11
|
+
## User-facing behavior
|
|
12
|
+
|
|
13
|
+
- Open any workspace on `/terminal` that has a Claude pane.
|
|
14
|
+
- A horizontal strip appears in the header (right side, before Files / Collab / Close / Add Pane).
|
|
15
|
+
- Three thin progress bars: **5h**, **Opus**, **Sonnet** — each with a percent label and a color that escalates green → amber → red.
|
|
16
|
+
- Hover a bar → tooltip `{label}: X% used · resets in 2h 14m`.
|
|
17
|
+
- Click the strip → popover with all five rate-limit windows + an overage-credits block if the account has overage enabled.
|
|
18
|
+
- If the OAuth token is missing or expired, the strip shows `sign in via Claude Code` with a small login icon. No auto-refresh.
|
|
19
|
+
- If the Anthropic endpoint fails or times out, the strip hides silently.
|
|
20
|
+
|
|
21
|
+
## Architecture
|
|
22
|
+
|
|
23
|
+
UI (`src/components/claude/claude-usage-strip.tsx`) → polling hook (`src/hooks/use-claude-usage.ts`) → API route (`src/app/api/claude/usage/route.ts`) → credentials reader (`src/lib/claude/credentials.ts`) + Anthropic fetcher with 30s cache (`src/lib/claude/usage.ts`) → `https://api.anthropic.com/api/oauth/usage`.
|
|
24
|
+
|
|
25
|
+
Polling: hook calls the route on mount and every 60s while the strip is enabled. Server caches the Anthropic response 30s per access-token prefix so rapid re-polls don't hammer Anthropic.
|
|
26
|
+
|
|
27
|
+
## Key files
|
|
28
|
+
|
|
29
|
+
| Path | Role |
|
|
30
|
+
|---|---|
|
|
31
|
+
| `src/lib/claude/credentials.ts` | Reads `~/.claude/.credentials.json`, extracts `claudeAiOauth`, exposes `isTokenExpired()`. |
|
|
32
|
+
| `src/lib/claude/usage.ts` | Calls Anthropic's `/api/oauth/usage`, 5s timeout, 30s in-memory cache. |
|
|
33
|
+
| `src/app/api/claude/usage/route.ts` | `GET` handler; returns one of `ok` / `unauthenticated` / `expired` / `upstream_error`. |
|
|
34
|
+
| `src/hooks/use-claude-usage.ts` | 60s polling hook, toggled by `enabled` arg. |
|
|
35
|
+
| `src/components/claude/claude-usage-strip.tsx` | Compact 3-bar strip + expanded popover. |
|
|
36
|
+
| `src/app/(desktop)/terminal/page.tsx` | Mounts the strip conditionally in the header. |
|
|
37
|
+
| `src/types/claude.ts` | `RateLimit`, `ExtraUsage`, `Utilization`, `UsageResponse`. |
|
|
38
|
+
|
|
39
|
+
## Data model
|
|
40
|
+
|
|
41
|
+
No DB tables. All state is transient:
|
|
42
|
+
- Server-side: in-memory `Map<tokenPrefix, { fetchedAt, data }>` in `src/lib/claude/usage.ts` with 30s TTL. Process-local; resets on server restart.
|
|
43
|
+
- Client-side: React state in the hook.
|
|
44
|
+
|
|
45
|
+
## APIs / contracts
|
|
46
|
+
|
|
47
|
+
### Internal endpoints
|
|
48
|
+
|
|
49
|
+
- `GET /api/claude/usage` — returns `UsageResponse`:
|
|
50
|
+
- `200 { status: "ok", data: Utilization }` — happy path.
|
|
51
|
+
- `200 { status: "unauthenticated" }` — no credentials file or no `claudeAiOauth`.
|
|
52
|
+
- `200 { status: "expired" }` — access token past `expiresAt`.
|
|
53
|
+
- `200 { status: "upstream_error" }` — Anthropic non-2xx or timeout.
|
|
54
|
+
|
|
55
|
+
Auth: same `withUser`/`getAuthUser` wrapping as every other `/api/*` route.
|
|
56
|
+
|
|
57
|
+
### External calls
|
|
58
|
+
|
|
59
|
+
- **Anthropic `GET https://api.anthropic.com/api/oauth/usage`** — uses the user's own OAuth access token read from `~/.claude/.credentials.json`. No secret of our own. User-Agent `claude-code/spaces-integration`.
|
|
60
|
+
|
|
61
|
+
## Configuration & environment
|
|
62
|
+
|
|
63
|
+
- `CLAUDE_CONFIG_DIR` — respected (defaults to `~/.claude`). Same semantics as Claude Code.
|
|
64
|
+
- No env vars, feature flags, or tier gates specific to this feature.
|
|
65
|
+
|
|
66
|
+
## How to run / test locally
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
npm install
|
|
70
|
+
npm run build
|
|
71
|
+
npm start
|
|
72
|
+
# visit http://localhost:3457/terminal, enter a workspace, add a Claude pane
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Manual QA checklist:
|
|
76
|
+
|
|
77
|
+
1. With a valid OAuth session (logged in via any recent Claude Code run): the strip appears in the header; percents match `/usage` inside Claude Code.
|
|
78
|
+
2. Hover each bar → tooltip shows the reset timing.
|
|
79
|
+
3. Click → popover with all five windows and overage block (if applicable).
|
|
80
|
+
4. Delete the Claude pane from the workspace → strip disappears.
|
|
81
|
+
5. Set `claudeAiOauth.expiresAt` to a past timestamp in `.credentials.json`, reload → strip shows "sign in via Claude Code".
|
|
82
|
+
6. Move `.credentials.json` aside temporarily, reload → same sign-in hint.
|
|
83
|
+
7. Disconnect network → within ~90s the strip silently hides (`upstream_error` → null render).
|
|
84
|
+
|
|
85
|
+
No automated tests for v1.
|
|
86
|
+
|
|
87
|
+
## Known quirks & decisions
|
|
88
|
+
|
|
89
|
+
- **Passive refresh.** We do not refresh the OAuth access token. Claude Code owns the refresh lifecycle and writes `.credentials.json`; racing with it would corrupt the shared file.
|
|
90
|
+
- **Account-wide data, not per-pane.** The Anthropic endpoint returns account-level rate limits. Rendering once in the header (not per-pane) is intentional.
|
|
91
|
+
- **User-Agent and anthropic-beta header.** The Anthropic `/api/oauth/usage` endpoint requires the `anthropic-beta: oauth-2025-04-20` header in addition to the Bearer token — without it the call 4xx-errors out. Both the UA (`claude-code/spaces`) and the beta header are constants in `src/lib/claude/usage.ts`; if upstream ever rotates the beta header, bump it there.
|
|
92
|
+
- **30s cache + 60s poll.** Outer-bound staleness is ~90s; fine for windows that move in hours.
|
|
93
|
+
- **Token-prefix cache key.** First 16 chars of `accessToken`. Collision probability is effectively nil; avoids holding full tokens in the cache structure beyond the single request.
|
|
94
|
+
- **Silent upstream failure.** Errors hide the strip rather than showing a red toast — rate-limit info is nice-to-have, not mission-critical.
|
|
95
|
+
- **Ships direct to `main`.** Per repo convention.
|
|
96
|
+
|
|
97
|
+
## Open questions / TODOs
|
|
98
|
+
|
|
99
|
+
- [ ] Active OAuth refresh — mirror Claude Code's `/oauth/token` dance to keep the widget live past expiry. Deferred for v1.
|
|
100
|
+
- [ ] Session-cost complement using local JSONL token counts (different data source).
|
|
101
|
+
- [ ] Consider surfacing 7-day-overall alongside the current three for users who care.
|
|
102
|
+
|
|
103
|
+
## Changelog
|
|
104
|
+
|
|
105
|
+
- 2026-04-22 — Initial implementation. v1 ships direct to `main`.
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
# Workspace Todos
|
|
2
|
+
|
|
3
|
+
**Status:** stable
|
|
4
|
+
**Owner:** jlongo
|
|
5
|
+
**Last updated:** 2026-04-21
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
A lightweight todo list attached to each workspace. Renders inline at the top of `/terminal` above the pane grid, always visible. Minimal model: text + checkbox + delete. Scoped per-workspace — switching workspaces swaps the list. Not in scope: agent read/write, drag-reorder, priorities/due dates, cross-workspace views.
|
|
10
|
+
|
|
11
|
+
## User-facing behavior
|
|
12
|
+
|
|
13
|
+
- Visit `/terminal`, enter any workspace.
|
|
14
|
+
- A "Todos" bar renders above the pane grid with an "Add todo…" input.
|
|
15
|
+
- Enter adds a todo at the bottom of the uncompleted list. Input stays focused.
|
|
16
|
+
- Click the checkbox → strike-through + sink to the completed section.
|
|
17
|
+
- Click text → inline edit. Enter saves, Esc cancels, blur saves.
|
|
18
|
+
- Hover row → `×` delete button.
|
|
19
|
+
- Eye icon in the header toggles visibility of completed todos (ephemeral, resets on reload).
|
|
20
|
+
|
|
21
|
+
## Architecture
|
|
22
|
+
|
|
23
|
+
UI (`src/components/workspace/workspace-todos.tsx`) → API routes (`src/app/api/workspaces/[id]/todos/*`) → DB helpers (`src/lib/db/queries.ts`) → SQLite (`workspace_todos` table in the per-user DB at `~/.spaces/<user>.db`).
|
|
24
|
+
|
|
25
|
+
Mutations are optimistic client-side with rollback on failure. Workspace switch triggers a fresh refetch keyed on `workspaceId`.
|
|
26
|
+
|
|
27
|
+
## Key files
|
|
28
|
+
|
|
29
|
+
| Path | Role |
|
|
30
|
+
|---|---|
|
|
31
|
+
| `src/components/workspace/workspace-todos.tsx` | Inline UI component — fetching, optimistic CRUD, rendering |
|
|
32
|
+
| `src/app/api/workspaces/[id]/todos/route.ts` | `GET` list, `POST` create |
|
|
33
|
+
| `src/app/api/workspaces/[id]/todos/[todoId]/route.ts` | `PATCH` update, `DELETE` remove |
|
|
34
|
+
| `src/lib/db/schema.ts` | `workspace_todos` table declaration inside `initSchema()` |
|
|
35
|
+
| `src/lib/db/queries.ts` | `getWorkspaceTodos`, `addWorkspaceTodo`, `updateWorkspaceTodo`, `deleteWorkspaceTodo` |
|
|
36
|
+
| `src/types/claude.ts` | `WorkspaceTodo` type |
|
|
37
|
+
| `src/app/(desktop)/terminal/page.tsx` | Mounts `<WorkspaceTodos>` above the pane grid |
|
|
38
|
+
| `tests/db/workspace-todos.test.ts` | Query-layer tests — ordering, cascade, scoping |
|
|
39
|
+
|
|
40
|
+
## Data model
|
|
41
|
+
|
|
42
|
+
### `workspace_todos`
|
|
43
|
+
|
|
44
|
+
| Column | Type | Notes |
|
|
45
|
+
|---|---|---|
|
|
46
|
+
| `id` | INTEGER PK | autoincrement |
|
|
47
|
+
| `workspace_id` | INTEGER NOT NULL | FK → `workspaces(id)` ON DELETE CASCADE |
|
|
48
|
+
| `text` | TEXT NOT NULL | trimmed on insert/update; empty rejected |
|
|
49
|
+
| `completed` | INTEGER NOT NULL DEFAULT 0 | 0 or 1 |
|
|
50
|
+
| `sort_order` | INTEGER NOT NULL DEFAULT 0 | meaningful only among uncompleted rows |
|
|
51
|
+
| `created` | TEXT NOT NULL DEFAULT datetime('now') | |
|
|
52
|
+
| `completed_at` | TEXT | set when completed flips 0→1, cleared on 1→0 |
|
|
53
|
+
|
|
54
|
+
Index: `idx_workspace_todos_workspace` on `workspace_id`.
|
|
55
|
+
|
|
56
|
+
### TypeScript
|
|
57
|
+
|
|
58
|
+
```ts
|
|
59
|
+
interface WorkspaceTodo {
|
|
60
|
+
id: number;
|
|
61
|
+
workspaceId: number;
|
|
62
|
+
text: string;
|
|
63
|
+
completed: boolean;
|
|
64
|
+
sortOrder: number;
|
|
65
|
+
created: string;
|
|
66
|
+
completedAt: string | null;
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Invariants
|
|
71
|
+
|
|
72
|
+
- Listing order: uncompleted first by `sort_order` ASC, then completed by `completed_at` DESC.
|
|
73
|
+
- New todos get `sort_order = MAX(sort_order WHERE completed=0) + 1`.
|
|
74
|
+
- `completed_at` is `NULL` iff `completed = 0`.
|
|
75
|
+
- Deleting a workspace deletes its todos via FK cascade.
|
|
76
|
+
|
|
77
|
+
## APIs / contracts
|
|
78
|
+
|
|
79
|
+
### Internal endpoints
|
|
80
|
+
|
|
81
|
+
| Method | Path | Request | Response |
|
|
82
|
+
|---|---|---|---|
|
|
83
|
+
| `GET` | `/api/workspaces/:id/todos` | — | `WorkspaceTodo[]` |
|
|
84
|
+
| `POST` | `/api/workspaces/:id/todos` | `{ text: string }` | `201 WorkspaceTodo` or `400 { error }` |
|
|
85
|
+
| `PATCH` | `/api/workspaces/:id/todos/:todoId` | `{ text?, completed? }` | `WorkspaceTodo` or `400`/`404` |
|
|
86
|
+
| `DELETE` | `/api/workspaces/:id/todos/:todoId` | — | `{ ok: true }` |
|
|
87
|
+
|
|
88
|
+
Auth via `getAuthUser` + `withUser`, same pattern as sibling workspace routes.
|
|
89
|
+
|
|
90
|
+
### External calls
|
|
91
|
+
N/A.
|
|
92
|
+
|
|
93
|
+
## Configuration & environment
|
|
94
|
+
None. Always-on Community-tier feature. No env vars, flags, or tier gates.
|
|
95
|
+
|
|
96
|
+
## How to run / test locally
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
npm install
|
|
100
|
+
npm run build
|
|
101
|
+
npm start
|
|
102
|
+
# visit http://localhost:3457/terminal, enter any workspace
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Automated:
|
|
106
|
+
```bash
|
|
107
|
+
npx vitest run tests/db/workspace-todos.test.ts
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Known quirks & decisions
|
|
111
|
+
|
|
112
|
+
- **Schema lives in `initSchema()`, no migration file.** Matches the pattern in `src/lib/db/schema.ts`; the repo has no separate migration system.
|
|
113
|
+
- **No agent write path in v1.** The coworker's "pi /todos" plugin that inspired this lets agents add todos from inside the session — deferred because it requires an MCP tool or CLI surface.
|
|
114
|
+
- **Optimistic updates without toasts.** Failures `console.error` and revert local state; this is a local-only app, so silent revert is acceptable for v1.
|
|
115
|
+
- **`sort_order = Number.MAX_SAFE_INTEGER` for optimistic inserts.** The temp row sorts to the bottom of uncompleted; the server returns the real `sort_order` on response and replaces the temp.
|
|
116
|
+
- **No confirm on delete.** Minimal ethos. Add undo toast in a follow-up if this proves painful.
|
|
117
|
+
- **Direct-to-main workflow.** Per repo convention for this codebase; no PR flow.
|
|
118
|
+
|
|
119
|
+
## Open questions / TODOs
|
|
120
|
+
|
|
121
|
+
- [ ] Agent write access via MCP tool once UI v1 proves out.
|
|
122
|
+
- [ ] Optional: persist the "show completed" toggle in localStorage.
|
|
123
|
+
- [ ] Optional: keyboard shortcut to focus the add-input from anywhere on `/terminal`.
|
|
124
|
+
|
|
125
|
+
## Changelog
|
|
126
|
+
|
|
127
|
+
- 2026-04-21 — Initial implementation. v1 ships direct to `main`.
|