@jlongo78/agent-spaces 1.0.7 → 1.0.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/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/build-manifest.json +3 -3
- package/.next/standalone/.next/prerender-manifest.json +3 -3
- package/.next/standalone/.next/server/app/(desktop)/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/_global-error.html +1 -1
- 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/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +1 -1
- package/.next/standalone/.next/server/app/_not-found.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- 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/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/admin/analytics.html +1 -1
- package/.next/standalone/.next/server/app/admin/analytics.rsc +1 -1
- package/.next/standalone/.next/server/app/admin/analytics.segments/!KGRlc2t0b3Ap/admin/analytics/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/admin/analytics.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/admin/analytics.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/admin/users.html +1 -1
- package/.next/standalone/.next/server/app/admin/users.rsc +1 -1
- 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/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/admin/users.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/analytics.html +1 -1
- package/.next/standalone/.next/server/app/analytics.rsc +1 -1
- package/.next/standalone/.next/server/app/analytics.segments/!KGRlc2t0b3Ap/analytics/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/analytics.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/analytics.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/api/admin/analytics/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/admin/os-users/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/admin/users/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/admin/users/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/analytics/overview/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/login/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/logout/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/me/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/totp/setup/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/totp/status/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/totp/verify/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/bulk/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/chat/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/claude/usage/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/config/route.js.nft.json +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.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/folders/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/network/discovered/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/network/handshake/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/network/health/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/network/identity/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/network/keys/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/network/keys/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/network/nodes/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/network/nodes/check/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/network/nodes/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/network/panes/[id]/route.js.nft.json +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.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/network/proxy/[nodeId]/[...path]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/network/search/route.js.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/server-config/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/sessions/[id]/chat/route.js.nft.json +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.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/sessions/route.js.nft.json +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.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/tier/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/updates/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/chat/route.js.nft.json +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.nft.json +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.nft.json +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.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/workspaces/[id]/todos/[todoId]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/workspaces/[id]/todos/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/workspaces/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/login.html +1 -1
- package/.next/standalone/.next/server/app/login.rsc +1 -1
- package/.next/standalone/.next/server/app/login.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/login.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/login.segments/login/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/m/projects.html +1 -1
- package/.next/standalone/.next/server/app/m/projects.rsc +1 -1
- package/.next/standalone/.next/server/app/m/projects.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/m/projects.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/m/projects.segments/m/projects/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/m/sessions.html +1 -1
- package/.next/standalone/.next/server/app/m/sessions.rsc +1 -1
- package/.next/standalone/.next/server/app/m/sessions.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/m/sessions.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/m/sessions.segments/m/sessions/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/m/settings.html +1 -1
- package/.next/standalone/.next/server/app/m/settings.rsc +1 -1
- package/.next/standalone/.next/server/app/m/settings.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/m/settings.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/m/settings.segments/m/settings/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/m/terminal.html +1 -1
- package/.next/standalone/.next/server/app/m/terminal.rsc +1 -1
- package/.next/standalone/.next/server/app/m/terminal.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/m/terminal.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/m/terminal.segments/m/terminal/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/m.html +1 -1
- package/.next/standalone/.next/server/app/m.rsc +1 -1
- package/.next/standalone/.next/server/app/m.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/m.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/m.segments/m/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/network.html +1 -1
- package/.next/standalone/.next/server/app/network.rsc +1 -1
- package/.next/standalone/.next/server/app/network.segments/!KGRlc2t0b3Ap/network/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/network.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/network.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/projects.html +1 -1
- package/.next/standalone/.next/server/app/projects.rsc +1 -1
- package/.next/standalone/.next/server/app/projects.segments/!KGRlc2t0b3Ap/projects/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/projects.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/projects.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/sessions.html +1 -1
- package/.next/standalone/.next/server/app/sessions.rsc +1 -1
- package/.next/standalone/.next/server/app/sessions.segments/!KGRlc2t0b3Ap/sessions/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/sessions.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/sessions.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/settings.html +1 -1
- package/.next/standalone/.next/server/app/settings.rsc +1 -1
- package/.next/standalone/.next/server/app/settings.segments/!KGRlc2t0b3Ap/settings/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/settings.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/terminal.html +1 -1
- package/.next/standalone/.next/server/app/terminal.rsc +1 -1
- package/.next/standalone/.next/server/app/terminal.segments/!KGRlc2t0b3Ap/terminal/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/terminal.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/terminal.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/vr.html +1 -1
- package/.next/standalone/.next/server/app/vr.rsc +1 -1
- package/.next/standalone/.next/server/app/vr.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/vr.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/vr.segments/vr/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/workspaces.html +1 -1
- package/.next/standalone/.next/server/app/workspaces.rsc +1 -1
- package/.next/standalone/.next/server/app/workspaces.segments/!KGRlc2t0b3Ap/workspaces/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/workspaces.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/workspaces.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/chunks/_1-inpovedul0t._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_1yl1yt70hdi7k._.js +1 -1
- package/.next/standalone/.next/server/edge/chunks/[root-of-the-server]__00lhc9vpmf8oy._.js +2 -2
- package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
- 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 +1 -1
- package/.next/standalone/.next/server/preview-props.json +3 -3
- 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/package.json +6 -6
- package/README.md +38 -38
- package/bin/lib/cli-flags.js +1 -1
- package/bin/lib/desktop-auth.js +2 -2
- package/bin/lib/remote.js +1 -1
- package/bin/spaces-install.js +104 -11
- package/bin/spaces.js +22 -19
- package/package.json +6 -6
- /package/.next/standalone/.next/static/{azrK2W2Y6LLwO8lE1ZBlb → TUBrOcHqnnSk2PWe-0LXB}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{azrK2W2Y6LLwO8lE1ZBlb → TUBrOcHqnnSk2PWe-0LXB}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{azrK2W2Y6LLwO8lE1ZBlb → TUBrOcHqnnSk2PWe-0LXB}/_ssgManifest.js +0 -0
|
@@ -7,9 +7,9 @@ globalThis.__BUILD_MANIFEST = {
|
|
|
7
7
|
"static/chunks/0cz1d0mv5g_q7.js"
|
|
8
8
|
],
|
|
9
9
|
"lowPriorityFiles": [
|
|
10
|
-
"static/
|
|
11
|
-
"static/
|
|
12
|
-
"static/
|
|
10
|
+
"static/TUBrOcHqnnSk2PWe-0LXB/_buildManifest.js",
|
|
11
|
+
"static/TUBrOcHqnnSk2PWe-0LXB/_ssgManifest.js",
|
|
12
|
+
"static/TUBrOcHqnnSk2PWe-0LXB/_clientMiddlewareManifest.js"
|
|
13
13
|
],
|
|
14
14
|
"rootMainFiles": [
|
|
15
15
|
"static/chunks/2y6thg-ascuxk.js",
|
|
@@ -23,11 +23,11 @@
|
|
|
23
23
|
"wasm": [],
|
|
24
24
|
"assets": [],
|
|
25
25
|
"env": {
|
|
26
|
-
"__NEXT_BUILD_ID": "
|
|
27
|
-
"NEXT_SERVER_ACTIONS_ENCRYPTION_KEY": "
|
|
28
|
-
"__NEXT_PREVIEW_MODE_ID": "
|
|
29
|
-
"__NEXT_PREVIEW_MODE_ENCRYPTION_KEY": "
|
|
30
|
-
"__NEXT_PREVIEW_MODE_SIGNING_KEY": "
|
|
26
|
+
"__NEXT_BUILD_ID": "TUBrOcHqnnSk2PWe-0LXB",
|
|
27
|
+
"NEXT_SERVER_ACTIONS_ENCRYPTION_KEY": "EMYrnUwlDpHeQvGU50yYbOTGYjjhe2S8a7Yi/BalNJ0=",
|
|
28
|
+
"__NEXT_PREVIEW_MODE_ID": "f09dddf74fcd19208280d681c7f62cdb",
|
|
29
|
+
"__NEXT_PREVIEW_MODE_ENCRYPTION_KEY": "7c20f05a1c279ed82a0244e59513287e5c4a71fcc6d69176f15a2bf6f5e3bdff",
|
|
30
|
+
"__NEXT_PREVIEW_MODE_SIGNING_KEY": "9a275ad2f919f295e599cc554ffae0165d1875a5b29f8705df98ff53c3ce4c7f"
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
33
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="en" class="dark"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/><link rel="stylesheet" href="/_next/static/chunks/07t-bv_pwp3nh.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/2y6thg-ascuxk.js"/><script src="/_next/static/chunks/1oizlhl9fdqt_.js" async=""></script><script src="/_next/static/chunks/1hh1kjczjaem_.js" async=""></script><script src="/_next/static/chunks/2nii411saqstq.js" async=""></script><script src="/_next/static/chunks/319md_gnd8h_q.js" async=""></script><script src="/_next/static/chunks/turbopack-2c3mg3r-05n1w.js" async=""></script><script src="/_next/static/chunks/3wsek2shhl8h9.js" async=""></script><script src="/_next/static/chunks/1p4gjn76qfpfh.js" async=""></script><meta name="robots" content="noindex"/><title>Spaces</title><meta name="description" content="Agent workspace manager for Claude, Codex, Gemini, and more"/><link rel="icon" href="/icon.png"/><meta name="next-size-adjust" content=""/><title>404: This page could not be found.</title><script src="/_next/static/chunks/0cz1d0mv5g_q7.js" noModule=""></script></head><body class="Ur3q_a_variable iaM1Ya_variable antialiased bg-zinc-950 text-zinc-100"><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script id="_R_">(globalThis["TURBOPACK"] || (globalThis["TURBOPACK"] = [])).push({"otherChunks":["static/chunks/2y6thg-ascuxk.js","static/chunks/1oizlhl9fdqt_.js","static/chunks/1hh1kjczjaem_.js","static/chunks/2nii411saqstq.js","static/chunks/319md_gnd8h_q.js"],"runtimeModuleIds":[94553]});</script><script src="/_next/static/chunks/2y6thg-ascuxk.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:\"/_next/static/chunks/3wsek2shhl8h9.js\"\n3:\"/_next/static/chunks/1p4gjn76qfpfh.js\"\n4:I[12524,[\"$2\",\"$3\"],\"Providers\"]\n5:I[39756,[\"$2\",\"$3\"],\"default\"]\n6:I[37457,[\"$2\",\"$3\"],\"default\"]\na:I[97367,[\"$2\",\"$3\"],\"OutletBoundary\"]\nb:\"$Sreact.suspense\"\nd:\"ViewportBoundary\"\ne:I[97367,[\"$2\",\"$3\"],\"$d\"]\n10:\"MetadataBoundary\"\n11:I[97367,[\"$2\",\"$3\"],\"$10\"]\n13:I[68027,[\"$2\",\"$3\"],\"default\",1]\n:HL[\"/_next/static/chunks/07t-bv_pwp3nh.css\",\"style\"]\n8:X\n9:[[\"children\",{\"s\":\"__PAGE__\",\"h\":512,\"d\":{\"r\":[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$0:t:t:d:r:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:style\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$0:t:t:d:r:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style\",\"children\":404}],[\"$\",\"div\",null,{\"style\":\"$0:t:t:d:r:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$0:t:t:d:r:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style\",\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$La\",null,{\"children\":[\"$\",\"$b\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@c\"}]}]]}],\"p\":false,\"v\":null}}]]\n7:[[\"children\",{\"s\":\"/_not-found\",\"h\":512,\"d\":{\"r\":[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],\"p\":false,\"v\":\"$8\"},\"c\":\"$Q9\"}]]\n0:{\"P\":null,\"c\":[\"\",\"_not-found\",\"\"],\"q\":\"\",\"i\":false,\"t\":{\"t\":{\"s\":\"\",\"h\":528,\"d\":{\"r\":[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/07t-bv_pwp3nh.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/3wsek2shhl8h9.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/1p4gjn76qfpfh.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"dark\",\"suppressHydrationWarning\":true,\"children\":[\"$\",\"body\",null,{\"className\":\"Ur3q_a_variable iaM1Ya_variable antialiased bg-zinc-950 text-zinc-100\",\"suppressHydrationWarning\":true,\"children\":[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]}]]}],\"p\":false,\"v\":null},\"c\":\"$Q7\"},\"h\":{\"r\":[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$Le\",null,{\"children\":\"$Lf\"}],[\"$\",\"$L11\",null,{\"children\":[[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$b\",null,{\"name\":\"Next.Metadata\",\"children\":\"$L12\"}]}],null]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],\"p\":false,\"v\":null}},\"m\":\"$undefined\",\"G\":[\"$13\",[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/07t-bv_pwp3nh.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]]],\"S\":true,\"r\":\"$undefined\",\"s\":\"$undefined\",\"a\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"
|
|
1
|
+
<!DOCTYPE html><html lang="en" class="dark"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/><link rel="stylesheet" href="/_next/static/chunks/07t-bv_pwp3nh.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/2y6thg-ascuxk.js"/><script src="/_next/static/chunks/1oizlhl9fdqt_.js" async=""></script><script src="/_next/static/chunks/1hh1kjczjaem_.js" async=""></script><script src="/_next/static/chunks/2nii411saqstq.js" async=""></script><script src="/_next/static/chunks/319md_gnd8h_q.js" async=""></script><script src="/_next/static/chunks/turbopack-2c3mg3r-05n1w.js" async=""></script><script src="/_next/static/chunks/3wsek2shhl8h9.js" async=""></script><script src="/_next/static/chunks/1p4gjn76qfpfh.js" async=""></script><meta name="robots" content="noindex"/><title>Spaces</title><meta name="description" content="Agent workspace manager for Claude, Codex, Gemini, and more"/><link rel="icon" href="/icon.png"/><meta name="next-size-adjust" content=""/><title>404: This page could not be found.</title><script src="/_next/static/chunks/0cz1d0mv5g_q7.js" noModule=""></script></head><body class="Ur3q_a_variable iaM1Ya_variable antialiased bg-zinc-950 text-zinc-100"><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script id="_R_">(globalThis["TURBOPACK"] || (globalThis["TURBOPACK"] = [])).push({"otherChunks":["static/chunks/2y6thg-ascuxk.js","static/chunks/1oizlhl9fdqt_.js","static/chunks/1hh1kjczjaem_.js","static/chunks/2nii411saqstq.js","static/chunks/319md_gnd8h_q.js"],"runtimeModuleIds":[94553]});</script><script src="/_next/static/chunks/2y6thg-ascuxk.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:\"/_next/static/chunks/3wsek2shhl8h9.js\"\n3:\"/_next/static/chunks/1p4gjn76qfpfh.js\"\n4:I[12524,[\"$2\",\"$3\"],\"Providers\"]\n5:I[39756,[\"$2\",\"$3\"],\"default\"]\n6:I[37457,[\"$2\",\"$3\"],\"default\"]\na:I[97367,[\"$2\",\"$3\"],\"OutletBoundary\"]\nb:\"$Sreact.suspense\"\nd:\"ViewportBoundary\"\ne:I[97367,[\"$2\",\"$3\"],\"$d\"]\n10:\"MetadataBoundary\"\n11:I[97367,[\"$2\",\"$3\"],\"$10\"]\n13:I[68027,[\"$2\",\"$3\"],\"default\",1]\n:HL[\"/_next/static/chunks/07t-bv_pwp3nh.css\",\"style\"]\n8:X\n9:[[\"children\",{\"s\":\"__PAGE__\",\"h\":512,\"d\":{\"r\":[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$0:t:t:d:r:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:style\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$0:t:t:d:r:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style\",\"children\":404}],[\"$\",\"div\",null,{\"style\":\"$0:t:t:d:r:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$0:t:t:d:r:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style\",\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$La\",null,{\"children\":[\"$\",\"$b\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@c\"}]}]]}],\"p\":false,\"v\":null}}]]\n7:[[\"children\",{\"s\":\"/_not-found\",\"h\":512,\"d\":{\"r\":[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],\"p\":false,\"v\":\"$8\"},\"c\":\"$Q9\"}]]\n0:{\"P\":null,\"c\":[\"\",\"_not-found\",\"\"],\"q\":\"\",\"i\":false,\"t\":{\"t\":{\"s\":\"\",\"h\":528,\"d\":{\"r\":[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/07t-bv_pwp3nh.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/3wsek2shhl8h9.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/1p4gjn76qfpfh.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"dark\",\"suppressHydrationWarning\":true,\"children\":[\"$\",\"body\",null,{\"className\":\"Ur3q_a_variable iaM1Ya_variable antialiased bg-zinc-950 text-zinc-100\",\"suppressHydrationWarning\":true,\"children\":[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]}]]}],\"p\":false,\"v\":null},\"c\":\"$Q7\"},\"h\":{\"r\":[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$Le\",null,{\"children\":\"$Lf\"}],[\"$\",\"$L11\",null,{\"children\":[[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$b\",null,{\"name\":\"Next.Metadata\",\"children\":\"$L12\"}]}],null]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],\"p\":false,\"v\":null}},\"m\":\"$undefined\",\"G\":[\"$13\",[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/07t-bv_pwp3nh.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]]],\"S\":true,\"r\":\"$undefined\",\"s\":\"$undefined\",\"a\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"TUBrOcHqnnSk2PWe-0LXB\"}\n8:C\nf:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1, maximum-scale=1\"}]]\n14:I[27201,[\"$2\",\"$3\"],\"IconMark\"]\nc:null\n12:[[\"$\",\"title\",\"0\",{\"children\":\"Spaces\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Agent workspace manager for Claude, Codex, Gemini, and more\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/icon.png\"}],[\"$\",\"$L14\",\"3\",{}]]\n"])</script></body></html>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/2y6thg-ascuxk.js"/><script src="/_next/static/chunks/1oizlhl9fdqt_.js" async=""></script><script src="/_next/static/chunks/1hh1kjczjaem_.js" async=""></script><script src="/_next/static/chunks/2nii411saqstq.js" async=""></script><script src="/_next/static/chunks/319md_gnd8h_q.js" async=""></script><script src="/_next/static/chunks/turbopack-2c3mg3r-05n1w.js" async=""></script><script src="/_next/static/chunks/30g0jo299pr8e.js" async=""></script><meta name="next-size-adjust" content=""/><title>500: This page couldn’t load</title><style>:root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }</style><script src="/_next/static/chunks/0cz1d0mv5g_q7.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;display:flex;align-items:center;justify-content:center"><div style="margin-top:-32px;max-width:325px;padding:32px 28px;text-align:left"><svg width="32" height="32" viewBox="-0.2 -1.5 32 32" fill="none" style="margin-bottom:24px"><path d="M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z" fill="var(--next-error-title)"></path></svg><h1 style="font-size:24px;font-weight:500;letter-spacing:-0.02em;line-height:32px;margin:0 0 12px 0;color:var(--next-error-title)">This page couldn’t load</h1><p style="font-size:14px;font-weight:400;line-height:21px;margin:0 0 20px 0;color:var(--next-error-message)">A server error occurred. Reload to try again.</p><form style="margin:0"><button type="submit" style="display:inline-flex;align-items:center;justify-content:center;height:32px;padding:0 12px;font-size:14px;font-weight:500;line-height:20px;border-radius:6px;cursor:pointer;color:var(--next-error-btn-text);background:var(--next-error-btn-bg);border:var(--next-error-btn-border)">Reload</button></form></div></div><!--$--><!--/$--><script id="_R_">(globalThis["TURBOPACK"] || (globalThis["TURBOPACK"] = [])).push({"otherChunks":["static/chunks/2y6thg-ascuxk.js","static/chunks/1oizlhl9fdqt_.js","static/chunks/1hh1kjczjaem_.js","static/chunks/2nii411saqstq.js","static/chunks/319md_gnd8h_q.js"],"runtimeModuleIds":[94553]});</script><script src="/_next/static/chunks/2y6thg-ascuxk.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:\"/_next/static/chunks/30g0jo299pr8e.js\"\n3:I[39756,[\"$2\"],\"default\"]\n4:I[37457,[\"$2\"],\"default\"]\n7:I[97367,[\"$2\"],\"OutletBoundary\"]\n8:\"$Sreact.suspense\"\na:\"ViewportBoundary\"\nb:I[97367,[\"$2\"],\"$a\"]\nd:\"MetadataBoundary\"\ne:I[97367,[\"$2\"],\"$d\"]\n10:I[68027,[\"$2\"],\"default\",1]\n5:X\n6:[[\"children\",{\"s\":\"__PAGE__\",\"h\":528,\"d\":{\"r\":[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"title\",null,{\"children\":\"500: This page couldn’t load\"}],[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }\"}}]]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"display\":\"flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"marginTop\":\"-32px\",\"maxWidth\":\"325px\",\"padding\":\"32px 28px\",\"textAlign\":\"left\"},\"children\":[[\"$\",\"svg\",null,{\"width\":\"32\",\"height\":\"32\",\"viewBox\":\"-0.2 -1.5 32 32\",\"fill\":\"none\",\"style\":{\"marginBottom\":\"24px\"},\"children\":[\"$\",\"path\",null,{\"d\":\"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z\",\"fill\":\"var(--next-error-title)\"}]}],[\"$\",\"h1\",null,{\"style\":{\"fontSize\":\"24px\",\"fontWeight\":500,\"letterSpacing\":\"-0.02em\",\"lineHeight\":\"32px\",\"margin\":\"0 0 12px 0\",\"color\":\"var(--next-error-title)\"},\"children\":\"This page couldn’t load\"}],[\"$\",\"p\",null,{\"style\":{\"fontSize\":\"14px\",\"fontWeight\":400,\"lineHeight\":\"21px\",\"margin\":\"0 0 20px 0\",\"color\":\"var(--next-error-message)\"},\"children\":\"A server error occurred. Reload to try again.\"}],[\"$\",\"form\",null,{\"style\":{\"margin\":0},\"children\":[\"$\",\"button\",null,{\"type\":\"submit\",\"style\":{\"display\":\"inline-flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\",\"height\":\"32px\",\"padding\":\"0 12px\",\"fontSize\":\"14px\",\"fontWeight\":500,\"lineHeight\":\"20px\",\"borderRadius\":\"6px\",\"cursor\":\"pointer\",\"color\":\"var(--next-error-btn-text)\",\"background\":\"var(--next-error-btn-bg)\",\"border\":\"var(--next-error-btn-border)\"},\"children\":\"Reload\"}]}]]}]}]}]]}],null,[\"$\",\"$L7\",null,{\"children\":[\"$\",\"$8\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@9\"}]}]]}],\"p\":false,\"v\":null}}]]\n0:{\"P\":null,\"c\":[\"\",\"_global-error\",\"\"],\"q\":\"\",\"i\":false,\"t\":{\"t\":{\"s\":\"\",\"h\":528,\"d\":{\"r\":[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],\"p\":false,\"v\":\"$5\"},\"c\":\"$Q6\"},\"h\":{\"r\":[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$Lb\",null,{\"children\":\"$Lc\"}],[\"$\",\"$Le\",null,{\"children\":[[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$8\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lf\"}]}],null]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],\"p\":false,\"v\":null}},\"m\":\"$undefined\",\"G\":[\"$10\",[]],\"S\":true,\"r\":\"$undefined\",\"s\":\"$undefined\",\"a\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"
|
|
1
|
+
<!DOCTYPE html><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/2y6thg-ascuxk.js"/><script src="/_next/static/chunks/1oizlhl9fdqt_.js" async=""></script><script src="/_next/static/chunks/1hh1kjczjaem_.js" async=""></script><script src="/_next/static/chunks/2nii411saqstq.js" async=""></script><script src="/_next/static/chunks/319md_gnd8h_q.js" async=""></script><script src="/_next/static/chunks/turbopack-2c3mg3r-05n1w.js" async=""></script><script src="/_next/static/chunks/30g0jo299pr8e.js" async=""></script><meta name="next-size-adjust" content=""/><title>500: This page couldn’t load</title><style>:root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }</style><script src="/_next/static/chunks/0cz1d0mv5g_q7.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;display:flex;align-items:center;justify-content:center"><div style="margin-top:-32px;max-width:325px;padding:32px 28px;text-align:left"><svg width="32" height="32" viewBox="-0.2 -1.5 32 32" fill="none" style="margin-bottom:24px"><path d="M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z" fill="var(--next-error-title)"></path></svg><h1 style="font-size:24px;font-weight:500;letter-spacing:-0.02em;line-height:32px;margin:0 0 12px 0;color:var(--next-error-title)">This page couldn’t load</h1><p style="font-size:14px;font-weight:400;line-height:21px;margin:0 0 20px 0;color:var(--next-error-message)">A server error occurred. Reload to try again.</p><form style="margin:0"><button type="submit" style="display:inline-flex;align-items:center;justify-content:center;height:32px;padding:0 12px;font-size:14px;font-weight:500;line-height:20px;border-radius:6px;cursor:pointer;color:var(--next-error-btn-text);background:var(--next-error-btn-bg);border:var(--next-error-btn-border)">Reload</button></form></div></div><!--$--><!--/$--><script id="_R_">(globalThis["TURBOPACK"] || (globalThis["TURBOPACK"] = [])).push({"otherChunks":["static/chunks/2y6thg-ascuxk.js","static/chunks/1oizlhl9fdqt_.js","static/chunks/1hh1kjczjaem_.js","static/chunks/2nii411saqstq.js","static/chunks/319md_gnd8h_q.js"],"runtimeModuleIds":[94553]});</script><script src="/_next/static/chunks/2y6thg-ascuxk.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:\"/_next/static/chunks/30g0jo299pr8e.js\"\n3:I[39756,[\"$2\"],\"default\"]\n4:I[37457,[\"$2\"],\"default\"]\n7:I[97367,[\"$2\"],\"OutletBoundary\"]\n8:\"$Sreact.suspense\"\na:\"ViewportBoundary\"\nb:I[97367,[\"$2\"],\"$a\"]\nd:\"MetadataBoundary\"\ne:I[97367,[\"$2\"],\"$d\"]\n10:I[68027,[\"$2\"],\"default\",1]\n5:X\n6:[[\"children\",{\"s\":\"__PAGE__\",\"h\":528,\"d\":{\"r\":[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"title\",null,{\"children\":\"500: This page couldn’t load\"}],[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }\"}}]]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"display\":\"flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"marginTop\":\"-32px\",\"maxWidth\":\"325px\",\"padding\":\"32px 28px\",\"textAlign\":\"left\"},\"children\":[[\"$\",\"svg\",null,{\"width\":\"32\",\"height\":\"32\",\"viewBox\":\"-0.2 -1.5 32 32\",\"fill\":\"none\",\"style\":{\"marginBottom\":\"24px\"},\"children\":[\"$\",\"path\",null,{\"d\":\"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z\",\"fill\":\"var(--next-error-title)\"}]}],[\"$\",\"h1\",null,{\"style\":{\"fontSize\":\"24px\",\"fontWeight\":500,\"letterSpacing\":\"-0.02em\",\"lineHeight\":\"32px\",\"margin\":\"0 0 12px 0\",\"color\":\"var(--next-error-title)\"},\"children\":\"This page couldn’t load\"}],[\"$\",\"p\",null,{\"style\":{\"fontSize\":\"14px\",\"fontWeight\":400,\"lineHeight\":\"21px\",\"margin\":\"0 0 20px 0\",\"color\":\"var(--next-error-message)\"},\"children\":\"A server error occurred. Reload to try again.\"}],[\"$\",\"form\",null,{\"style\":{\"margin\":0},\"children\":[\"$\",\"button\",null,{\"type\":\"submit\",\"style\":{\"display\":\"inline-flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\",\"height\":\"32px\",\"padding\":\"0 12px\",\"fontSize\":\"14px\",\"fontWeight\":500,\"lineHeight\":\"20px\",\"borderRadius\":\"6px\",\"cursor\":\"pointer\",\"color\":\"var(--next-error-btn-text)\",\"background\":\"var(--next-error-btn-bg)\",\"border\":\"var(--next-error-btn-border)\"},\"children\":\"Reload\"}]}]]}]}]}]]}],null,[\"$\",\"$L7\",null,{\"children\":[\"$\",\"$8\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@9\"}]}]]}],\"p\":false,\"v\":null}}]]\n0:{\"P\":null,\"c\":[\"\",\"_global-error\",\"\"],\"q\":\"\",\"i\":false,\"t\":{\"t\":{\"s\":\"\",\"h\":528,\"d\":{\"r\":[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],\"p\":false,\"v\":\"$5\"},\"c\":\"$Q6\"},\"h\":{\"r\":[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$Lb\",null,{\"children\":\"$Lc\"}],[\"$\",\"$Le\",null,{\"children\":[[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$8\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lf\"}]}],null]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],\"p\":false,\"v\":null}},\"m\":\"$undefined\",\"G\":[\"$10\",[]],\"S\":true,\"r\":\"$undefined\",\"s\":\"$undefined\",\"a\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"TUBrOcHqnnSk2PWe-0LXB\"}\n5:C\nc:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n9:null\nf:[]\n"])</script></body></html>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"previewModeId": "
|
|
3
|
-
"previewModeSigningKey": "
|
|
4
|
-
"previewModeEncryptionKey": "
|
|
2
|
+
"previewModeId": "f09dddf74fcd19208280d681c7f62cdb",
|
|
3
|
+
"previewModeSigningKey": "9a275ad2f919f295e599cc554ffae0165d1875a5b29f8705df98ff53c3ce4c7f",
|
|
4
|
+
"previewModeEncryptionKey": "7c20f05a1c279ed82a0244e59513287e5c4a71fcc6d69176f15a2bf6f5e3bdff"
|
|
5
5
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
self.__RSC_SERVER_MANIFEST="{\n \"node\": {},\n \"edge\": {},\n \"encryptionKey\": \"
|
|
1
|
+
self.__RSC_SERVER_MANIFEST="{\n \"node\": {},\n \"edge\": {},\n \"encryptionKey\": \"EMYrnUwlDpHeQvGU50yYbOTGYjjhe2S8a7Yi/BalNJ0=\"\n}"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jlongo78/agent-spaces",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.9",
|
|
4
4
|
"description": "Agent workspace manager for Claude, Codex, Gemini, and more",
|
|
5
5
|
"bin": {
|
|
6
6
|
"spaces": "./bin/spaces.js",
|
|
@@ -122,11 +122,11 @@
|
|
|
122
122
|
"xterm": "^5.3.0"
|
|
123
123
|
},
|
|
124
124
|
"optionalDependencies": {
|
|
125
|
-
"@jlongo78/agent-spaces-tui-darwin-arm64": "1.0.
|
|
126
|
-
"@jlongo78/agent-spaces-tui-darwin-x64": "1.0.
|
|
127
|
-
"@jlongo78/agent-spaces-tui-linux-arm64": "1.0.
|
|
128
|
-
"@jlongo78/agent-spaces-tui-linux-x64": "1.0.
|
|
129
|
-
"@jlongo78/agent-spaces-tui-win32-x64": "1.0.
|
|
125
|
+
"@jlongo78/agent-spaces-tui-darwin-arm64": "1.0.9",
|
|
126
|
+
"@jlongo78/agent-spaces-tui-darwin-x64": "1.0.9",
|
|
127
|
+
"@jlongo78/agent-spaces-tui-linux-arm64": "1.0.9",
|
|
128
|
+
"@jlongo78/agent-spaces-tui-linux-x64": "1.0.9",
|
|
129
|
+
"@jlongo78/agent-spaces-tui-win32-x64": "1.0.9",
|
|
130
130
|
"otpauth": "^9.5.0",
|
|
131
131
|
"qrcode": "^1.5.4"
|
|
132
132
|
}
|
package/README.md
CHANGED
|
@@ -1,23 +1,16 @@
|
|
|
1
1
|
<p align="center">
|
|
2
|
-
<img src="public/spaces_logo.png" alt="Spaces" width="
|
|
2
|
+
<img src="public/spaces_logo.png" alt="Spaces" width="240" />
|
|
3
3
|
</p>
|
|
4
4
|
|
|
5
|
-
<h3 align="center">
|
|
5
|
+
<h3 align="center">Run your coding agents side by side, see which one needs you,<br/>and pick them up from your terminal, browser or phone.</h3>
|
|
6
6
|
|
|
7
7
|
<p align="center">
|
|
8
|
-
|
|
9
|
-
<a href="#quick-start">Quick start</a> ·
|
|
10
|
-
<a href="#the-terminal-client">Terminal client</a> ·
|
|
11
|
-
<a href="#the-web-app">Web app</a> ·
|
|
12
|
-
<a href="#security">Security</a> ·
|
|
13
|
-
<a href="docs/getting-started.md">Docs</a>
|
|
8
|
+
Claude Code, Codex, Gemini CLI and more, on your machine or a server you reach over SSH. Open source, no telemetry.
|
|
14
9
|
</p>
|
|
15
10
|
|
|
16
11
|
<p align="center">
|
|
17
12
|
<a href="https://www.npmjs.com/package/@jlongo78/agent-spaces"><img src="https://img.shields.io/npm/v/@jlongo78/agent-spaces?style=flat-square&color=cb3837" alt="npm" /></a>
|
|
18
|
-
<a href="https://github.com/jlongo78/spaces/actions/workflows/ci.yml"><img src="https://img.shields.io/github/actions/workflow/status/jlongo78/spaces/ci.yml?style=flat-square&label=CI" alt="CI" /></a>
|
|
19
13
|
<a href="LICENSE"><img src="https://img.shields.io/badge/license-Apache--2.0-blue?style=flat-square" alt="Apache-2.0 License" /></a>
|
|
20
|
-
<img src="https://img.shields.io/badge/node-%3E%3D20.9-brightgreen?style=flat-square" alt="Node 20.9+" />
|
|
21
14
|
<img src="https://img.shields.io/badge/platform-Windows%20%7C%20macOS%20%7C%20Linux-lightgrey?style=flat-square" alt="Platforms" />
|
|
22
15
|
</p>
|
|
23
16
|
|
|
@@ -25,33 +18,40 @@
|
|
|
25
18
|
<img src="docs/images/terminal-client.gif" alt="The Spaces terminal client: Claude Code and Codex working in two spaces, split side by side; Codex stops to ask for approval, gets it from the menu, then the Files tab, a detach and a reattach" width="900" />
|
|
26
19
|
</p>
|
|
27
20
|
|
|
28
|
-
<p align="center"><sub>Recorded live: Claude Code and Codex working on a small app
|
|
21
|
+
<p align="center"><sub>Recorded live: Claude Code and Codex working on a small app. Nothing is staged except the prompts.</sub></p>
|
|
29
22
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
23
|
+
```bash
|
|
24
|
+
curl -fsSL https://agentspaces.co/install.sh | sh # macOS, Linux
|
|
25
|
+
irm https://agentspaces.co/install.ps1 | iex # Windows (PowerShell)
|
|
26
|
+
```
|
|
33
27
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
28
|
+
<p align="center">
|
|
29
|
+
<a href="#install">Install</a> ·
|
|
30
|
+
<a href="#quick-start">Quick start</a> ·
|
|
31
|
+
<a href="#on-another-machine">On a server</a> ·
|
|
32
|
+
<a href="#the-terminal-client">Terminal client</a> ·
|
|
33
|
+
<a href="#the-web-app">Web app</a> ·
|
|
34
|
+
<a href="#security">Security</a> ·
|
|
35
|
+
<a href="https://agentspaces.co">Website</a>
|
|
36
|
+
</p>
|
|
37
37
|
|
|
38
|
-
|
|
39
|
-
named, persistent workspaces ("spaces"). Every pane is a real terminal that
|
|
40
|
-
keeps running whether or not anything is looking at it. Spaces watches each
|
|
41
|
-
agent and tells you which one is working (`◐`), done (`✓`) or blocked
|
|
42
|
-
waiting for you (`×`).
|
|
38
|
+
## What is Spaces?
|
|
43
39
|
|
|
44
|
-
|
|
40
|
+
Five agents in five terminal tabs is a mess: look away and you lose track of
|
|
41
|
+
which one finished and which one is waiting on you. Spaces keeps them in
|
|
42
|
+
named, persistent workspaces and fixes that:
|
|
45
43
|
|
|
46
|
-
- **
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
44
|
+
- **It knows who needs you.** Every agent shows as working (`◐`), done
|
|
45
|
+
(`✓`) or blocked waiting for you (`×`), and the one that stops tells you.
|
|
46
|
+
- **The same live agents, wherever you are.** The terminal client
|
|
47
|
+
(`spaces`), the web app (`spaces web`) and a phone layout are views of
|
|
48
|
+
the same running sessions. Detach, and they keep going.
|
|
49
|
+
- **One command puts it on a server.** `spaces --remote you@box` installs
|
|
50
|
+
Spaces there, sets up your SSH key and connects. Nothing is exposed
|
|
51
|
+
beyond SSH.
|
|
52
52
|
|
|
53
|
-
|
|
54
|
-
|
|
53
|
+
Claude Code panes come back in the same conversation after a restart, and
|
|
54
|
+
every past Claude Code, Codex, Gemini CLI and Aider session is searchable.
|
|
55
55
|
|
|
56
56
|
## Install
|
|
57
57
|
|
|
@@ -105,12 +105,12 @@ menu, create a space, and start an agent in it. `ctrl+space d` detaches and
|
|
|
105
105
|
leaves everything running.
|
|
106
106
|
|
|
107
107
|
```bash
|
|
108
|
-
spaces
|
|
108
|
+
spaces web # open the web app in your browser, already signed in
|
|
109
109
|
spaces stop # stop the server, and every pane with it
|
|
110
110
|
```
|
|
111
111
|
|
|
112
112
|
The server answers only you. Opening `http://localhost:3457` directly shows
|
|
113
|
-
a "not signed in" page; `spaces
|
|
113
|
+
a "not signed in" page; `spaces web` signs the browser in with a link that
|
|
114
114
|
works once, for two minutes. See [Security](#security).
|
|
115
115
|
|
|
116
116
|
### On another machine
|
|
@@ -147,7 +147,7 @@ it works. A "no" is remembered for that machine.
|
|
|
147
147
|
For the web app instead of the terminal client:
|
|
148
148
|
|
|
149
149
|
```bash
|
|
150
|
-
spaces
|
|
150
|
+
spaces web --remote you@devbox
|
|
151
151
|
```
|
|
152
152
|
|
|
153
153
|
This does the same, then signs your browser in through the tunnel and opens
|
|
@@ -164,8 +164,8 @@ offers to install.
|
|
|
164
164
|
| `spaces tui` | The terminal client, explicitly. Never falls back to the browser. |
|
|
165
165
|
| `spaces --remote <dest>` | The terminal client for Spaces on another machine, over SSH. Offers to install or update Spaces there first; `--yes` skips the questions. |
|
|
166
166
|
| `spaces start` | Start the server in the background, if it is not running. |
|
|
167
|
-
| `spaces
|
|
168
|
-
| `spaces
|
|
167
|
+
| `spaces web` | Open the web app in your browser, signed in. |
|
|
168
|
+
| `spaces web --remote <dest>` | The web app for Spaces on another machine, through an SSH tunnel, signed in. |
|
|
169
169
|
| `spaces stop` | Stop the server. |
|
|
170
170
|
| `spaces restart` | Restart the server, through the service when one is installed. Running agents stop with it. |
|
|
171
171
|
| `spaces status` | The installed version, whether the server runs, and how many agents are live in it. |
|
|
@@ -237,7 +237,7 @@ More in [tui/README.md](tui/README.md).
|
|
|
237
237
|
<img src="docs/images/web-app.png" alt="The Spaces web app showing the todo-api space: the Claude Code pane has finished and the Codex pane is still working" width="900" />
|
|
238
238
|
</p>
|
|
239
239
|
|
|
240
|
-
`spaces
|
|
240
|
+
`spaces web` signs your browser in and shows the same spaces and panes as
|
|
241
241
|
a grid of browser terminals: the very same agents, not copies, so you can
|
|
242
242
|
start something in the terminal client and finish it here, or the other way
|
|
243
243
|
round. On top of that it has things that suit a bigger screen:
|
|
@@ -340,7 +340,7 @@ Desktop mode, the default and the only supported mode, has a single owner:
|
|
|
340
340
|
with a secret in `~/.spaces/internal_token` that only that account can
|
|
341
341
|
read. Other accounts on the same machine get nothing; arriving over
|
|
342
342
|
loopback proves nothing.
|
|
343
|
-
- Browsers sign in through a one-time link from `spaces
|
|
343
|
+
- Browsers sign in through a one-time link from `spaces web` and get an
|
|
344
344
|
HttpOnly, SameSite=Strict cookie. Requests naming any host other than this
|
|
345
345
|
machine's loopback are refused, which stops DNS-rebinding attacks.
|
|
346
346
|
Credentials never go in URLs.
|
package/bin/lib/cli-flags.js
CHANGED
|
@@ -31,7 +31,7 @@ const SWITCHES = new Set([
|
|
|
31
31
|
'--version', '-v',
|
|
32
32
|
// spaces start (what --remote runs on the other machine).
|
|
33
33
|
'--print-token',
|
|
34
|
-
// spaces start, for spaces
|
|
34
|
+
// spaces start, for spaces web --remote.
|
|
35
35
|
'--print-login',
|
|
36
36
|
// spaces --remote: install or update the other machine without asking.
|
|
37
37
|
'--yes', '-y',
|
package/bin/lib/desktop-auth.js
CHANGED
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
* - The `spaces-desktop` cookie: the browser. A token signed with the
|
|
25
25
|
* secret, HttpOnly (no script reads it) and SameSite=Strict (no other
|
|
26
26
|
* site sends it). It is never the secret itself.
|
|
27
|
-
* - A login code, once: `spaces
|
|
27
|
+
* - A login code, once: `spaces web` mints one and opens the browser on
|
|
28
28
|
* it; the server swaps it for the cookie. Single use, two minutes.
|
|
29
29
|
*
|
|
30
30
|
* And before any of that, the Host header must name this machine's loopback
|
|
@@ -149,7 +149,7 @@ function verifyDesktop(secret, token, kind, now = Math.floor(Date.now() / 1000))
|
|
|
149
149
|
}
|
|
150
150
|
|
|
151
151
|
/**
|
|
152
|
-
* Login codes: minted by whoever holds the secret (`spaces
|
|
152
|
+
* Login codes: minted by whoever holds the secret (`spaces web`, or the
|
|
153
153
|
* server opening a browser itself), redeemed by the server exactly once.
|
|
154
154
|
* The used-set only has to outlive a code's two minutes.
|
|
155
155
|
*/
|
package/bin/lib/remote.js
CHANGED
|
@@ -318,7 +318,7 @@ function parseStartBasePath(stdout) {
|
|
|
318
318
|
}
|
|
319
319
|
|
|
320
320
|
/**
|
|
321
|
-
* The local port `spaces
|
|
321
|
+
* The local port `spaces web --remote` tunnels from, the same each time for
|
|
322
322
|
* the same destination, so the address stays put in the browser's history.
|
|
323
323
|
* Within 41000–41999; another is used when this one is taken.
|
|
324
324
|
*/
|
package/bin/spaces-install.js
CHANGED
|
@@ -55,16 +55,17 @@ function samePlaceArgs() {
|
|
|
55
55
|
}
|
|
56
56
|
|
|
57
57
|
function run(cmd, args, opts = {}) {
|
|
58
|
-
const
|
|
59
|
-
const safeArgs = isWin
|
|
60
|
-
? args.map(a => (a.includes(' ') ? '"' + a + '"' : a))
|
|
61
|
-
: args;
|
|
62
|
-
return execFileSync(cmd, safeArgs, {
|
|
58
|
+
const options = {
|
|
63
59
|
encoding: 'utf-8',
|
|
64
60
|
stdio: opts.quiet ? ['pipe', 'pipe', 'pipe'] : 'inherit',
|
|
65
|
-
shell: isWin,
|
|
66
61
|
...opts,
|
|
67
|
-
}
|
|
62
|
+
};
|
|
63
|
+
if (process.platform !== 'win32') return execFileSync(cmd, args, options);
|
|
64
|
+
// npm is a .cmd on Windows, which only runs through the shell. One
|
|
65
|
+
// command line rather than a list of arguments: Node warns (DEP0190)
|
|
66
|
+
// about passing a list to a shell, which joins it unescaped anyway.
|
|
67
|
+
const line = [cmd, ...args].map((a) => (/[\s&|<>^"]/.test(a) ? `"${a.replace(/"/g, '""')}"` : a)).join(' ');
|
|
68
|
+
return execFileSync(line, { ...options, shell: true });
|
|
68
69
|
}
|
|
69
70
|
|
|
70
71
|
function restartServiceIfRunning() {
|
|
@@ -111,29 +112,121 @@ function upgradeCorePackage() {
|
|
|
111
112
|
}
|
|
112
113
|
|
|
113
114
|
log(`Upgrading ${CORE_PACKAGE}: ${currentVersion} → ${latestVersion}`);
|
|
115
|
+
const stopped = stopForUpdate();
|
|
116
|
+
if (stopped === null) return;
|
|
114
117
|
try {
|
|
115
118
|
run('npm', ['install', '-g', ...samePlaceArgs(), `${CORE_PACKAGE}@latest`]);
|
|
116
119
|
logOk(`${CORE_PACKAGE} upgraded to ${latestVersion}`);
|
|
117
120
|
} catch (err) {
|
|
118
121
|
logErr(`Failed to upgrade ${CORE_PACKAGE}: ${err.message}`);
|
|
119
122
|
log('You may need to run with elevated permissions (sudo / admin shell)');
|
|
123
|
+
if (stopped) startAgain();
|
|
120
124
|
return;
|
|
121
125
|
}
|
|
122
126
|
|
|
123
127
|
// Clear stale update-check cache so the UI shows the correct version.
|
|
124
128
|
try { fs.unlinkSync(path.join(SPACES_DIR, 'update-check.json')); } catch {}
|
|
125
129
|
|
|
126
|
-
|
|
130
|
+
if (stopped) startAgain();
|
|
131
|
+
else restartServiceIfRunning();
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// ─── Updating under a running Spaces on Windows ───────────────
|
|
135
|
+
// Windows will not replace the files of a running program, and the server
|
|
136
|
+
// and every open terminal client run from this package's folder: npm's
|
|
137
|
+
// update fails with EBUSY. So on Windows they stop first, and the server
|
|
138
|
+
// starts again after, on the new version. Elsewhere files can be replaced
|
|
139
|
+
// in place, and nothing changes.
|
|
140
|
+
|
|
141
|
+
const LAUNCHER = path.join(__dirname, 'spaces.js');
|
|
142
|
+
|
|
143
|
+
function launcher(args, opts = {}) {
|
|
144
|
+
return require('child_process').spawnSync(process.execPath, [LAUNCHER, ...args], { encoding: 'utf-8', windowsHide: true, ...opts });
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/** Terminal clients running from this package, by pid. */
|
|
148
|
+
function openClients() {
|
|
149
|
+
const pkg = path.join(__dirname, '..');
|
|
150
|
+
try {
|
|
151
|
+
const out = execFileSync('powershell.exe', ['-NoProfile', '-NonInteractive', '-Command',
|
|
152
|
+
"Get-Process spaces-tui -ErrorAction SilentlyContinue | Where-Object { $_.Path -and $_.Path.StartsWith($env:SPACES_PKG, 'OrdinalIgnoreCase') } | ForEach-Object { $_.Id }"],
|
|
153
|
+
{ encoding: 'utf-8', timeout: 15000, windowsHide: true, env: { ...process.env, SPACES_PKG: pkg } });
|
|
154
|
+
return out.split(/\s+/).map(Number).filter((n) => Number.isInteger(n) && n > 0);
|
|
155
|
+
} catch {
|
|
156
|
+
return [];
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Stops what would block the update. Returns true when the server was
|
|
162
|
+
* running (so it should start again), false when nothing needed stopping,
|
|
163
|
+
* and null when the update should not go ahead.
|
|
164
|
+
*/
|
|
165
|
+
function stopForUpdate({ platform = process.platform, uninstalling = false } = {}) {
|
|
166
|
+
if (platform !== 'win32' && !uninstalling) return false;
|
|
167
|
+
const status = launcher(['status', '--porcelain']).stdout || '';
|
|
168
|
+
const running = /SPACES_RUNNING=1/.test(status);
|
|
169
|
+
const agents = Number((status.match(/SPACES_LIVE_AGENTS=(\d+)/) || [])[1] || 0);
|
|
170
|
+
const clients = platform === 'win32' ? openClients() : [];
|
|
171
|
+
if (!running && !clients.length) return false;
|
|
172
|
+
if (process.env.SPACES_PANE_ID) {
|
|
173
|
+
logErr(`This terminal runs inside Spaces, which has to stop for the ${uninstalling ? 'uninstall' : 'update'}.`);
|
|
174
|
+
log(`Run "spaces ${uninstalling ? 'uninstall' : 'upgrade'}" from a terminal outside Spaces.`);
|
|
175
|
+
return null;
|
|
176
|
+
}
|
|
177
|
+
const parts = [];
|
|
178
|
+
if (running) parts.push(agents ? `the server, with ${agents} live agent${agents === 1 ? '' : 's'}` : 'the server');
|
|
179
|
+
if (clients.length) parts.push(`${clients.length} open terminal client${clients.length === 1 ? '' : 's'}`);
|
|
180
|
+
log(uninstalling
|
|
181
|
+
? `Spaces is running (${parts.join(', ')}); it stops before it is removed.`
|
|
182
|
+
: `Spaces is running (${parts.join(', ')}), and Windows cannot update it while it runs.`);
|
|
183
|
+
if (agents) log('Stopping ends the agents; Claude Code panes resume their conversation afterwards.');
|
|
184
|
+
const yes = process.argv.includes('--yes') || process.argv.includes('-y');
|
|
185
|
+
if (!yes) {
|
|
186
|
+
if (!require('tty').isatty(0)) {
|
|
187
|
+
log(`Run "spaces ${uninstalling ? 'uninstall' : 'upgrade'} --yes" to go ahead without asking.`);
|
|
188
|
+
return null;
|
|
189
|
+
}
|
|
190
|
+
const { ask } = require('./lib/prompt');
|
|
191
|
+
const question = uninstalling ? ' Stop Spaces and uninstall it? [Y/n] ' : ' Stop Spaces, update it, and start it again? [Y/n] ';
|
|
192
|
+
if (ask(question, ['y', 'n'], 'y') !== 'y') {
|
|
193
|
+
log('Left as is.');
|
|
194
|
+
return null;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
for (const pid of clients) { try { process.kill(pid); } catch { /* already gone */ } }
|
|
198
|
+
if (running) {
|
|
199
|
+
log('Stopping Spaces...');
|
|
200
|
+
launcher(['stop']);
|
|
201
|
+
}
|
|
202
|
+
// The processes take a moment to let go of their files.
|
|
203
|
+
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 2000);
|
|
204
|
+
return running;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/** Starts the server again, on whatever version is now installed. */
|
|
208
|
+
function startAgain() {
|
|
209
|
+
log('Starting Spaces again...');
|
|
210
|
+
const r = launcher(['restart'], { stdio: 'inherit' });
|
|
211
|
+
if (r.status !== 0) log('Run "spaces restart" to start it.');
|
|
127
212
|
}
|
|
128
213
|
|
|
129
214
|
// ─── Uninstall ────────────────────────────────────────────────
|
|
130
215
|
function uninstall() {
|
|
131
216
|
console.log(`\n Uninstalling ${CORE_PACKAGE}...\n`);
|
|
217
|
+
// A server left running would go on without its files.
|
|
218
|
+
if (stopForUpdate({ uninstalling: true }) === null) return;
|
|
132
219
|
try {
|
|
133
|
-
|
|
220
|
+
// npm succeeds when the package is not installed, so a failure here is
|
|
221
|
+
// a real one (on Windows, usually a Spaces process still holding files).
|
|
222
|
+
run('npm', ['uninstall', '-g', ...samePlaceArgs(), CORE_PACKAGE], { quiet: true });
|
|
134
223
|
logOk('Removed the global spaces CLI');
|
|
135
|
-
} catch {
|
|
136
|
-
|
|
224
|
+
} catch (err) {
|
|
225
|
+
const why = String(err.stderr || err.message).split('\n').find((l) => /npm error .*(EBUSY|EPERM|EACCES|code)/.test(l)) || '';
|
|
226
|
+
logErr(`npm uninstall -g ${CORE_PACKAGE} failed${why ? `: ${why.replace(/^npm error\s*/, '')}` : ''}`);
|
|
227
|
+
log('Close every Spaces window, run "spaces stop", and try again.');
|
|
228
|
+
process.exitCode = 1;
|
|
229
|
+
return;
|
|
137
230
|
}
|
|
138
231
|
logOk('Spaces uninstalled');
|
|
139
232
|
log('User data remains at ~/.spaces/ — remove manually if desired');
|