quadwork 1.10.1 → 1.11.1

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.
Files changed (77) hide show
  1. package/bin/quadwork.js +84 -56
  2. package/out/404.html +1 -1
  3. package/out/__next.__PAGE__.txt +1 -1
  4. package/out/__next._full.txt +1 -1
  5. package/out/__next._head.txt +1 -1
  6. package/out/__next._index.txt +1 -1
  7. package/out/__next._tree.txt +1 -1
  8. package/out/_next/static/chunks/{0gaekhrfy94vz.js → 0a5314ra5t9bs.js} +1 -1
  9. package/out/_next/static/chunks/{0hirada7763yr.js → 0ge87xt6a9j~..js} +1 -1
  10. package/out/_next/static/chunks/{16g.ca89g7fib.js → 0n~dq4kpx9xxx.js} +1 -1
  11. package/out/_next/static/chunks/turbopack-0qm-e3ifrz~2u.js +1 -0
  12. package/out/_not-found/__next._full.txt +1 -1
  13. package/out/_not-found/__next._head.txt +1 -1
  14. package/out/_not-found/__next._index.txt +1 -1
  15. package/out/_not-found/__next._not-found.__PAGE__.txt +1 -1
  16. package/out/_not-found/__next._not-found.txt +1 -1
  17. package/out/_not-found/__next._tree.txt +1 -1
  18. package/out/_not-found.html +1 -1
  19. package/out/_not-found.txt +1 -1
  20. package/out/app-shell/__next._full.txt +1 -1
  21. package/out/app-shell/__next._head.txt +1 -1
  22. package/out/app-shell/__next._index.txt +1 -1
  23. package/out/app-shell/__next._tree.txt +1 -1
  24. package/out/app-shell/__next.app-shell.__PAGE__.txt +1 -1
  25. package/out/app-shell/__next.app-shell.txt +1 -1
  26. package/out/app-shell.html +1 -1
  27. package/out/app-shell.txt +1 -1
  28. package/out/index.html +1 -1
  29. package/out/index.txt +1 -1
  30. package/out/project/_/__next._full.txt +2 -2
  31. package/out/project/_/__next._head.txt +1 -1
  32. package/out/project/_/__next._index.txt +1 -1
  33. package/out/project/_/__next._tree.txt +1 -1
  34. package/out/project/_/__next.project.$d$id.__PAGE__.txt +2 -2
  35. package/out/project/_/__next.project.$d$id.txt +1 -1
  36. package/out/project/_/__next.project.txt +1 -1
  37. package/out/project/_/queue/__next._full.txt +1 -1
  38. package/out/project/_/queue/__next._head.txt +1 -1
  39. package/out/project/_/queue/__next._index.txt +1 -1
  40. package/out/project/_/queue/__next._tree.txt +1 -1
  41. package/out/project/_/queue/__next.project.$d$id.queue.__PAGE__.txt +1 -1
  42. package/out/project/_/queue/__next.project.$d$id.queue.txt +1 -1
  43. package/out/project/_/queue/__next.project.$d$id.txt +1 -1
  44. package/out/project/_/queue/__next.project.txt +1 -1
  45. package/out/project/_/queue.html +1 -1
  46. package/out/project/_/queue.txt +1 -1
  47. package/out/project/_.html +1 -1
  48. package/out/project/_.txt +2 -2
  49. package/out/settings/__next._full.txt +1 -1
  50. package/out/settings/__next._head.txt +1 -1
  51. package/out/settings/__next._index.txt +1 -1
  52. package/out/settings/__next._tree.txt +1 -1
  53. package/out/settings/__next.settings.__PAGE__.txt +1 -1
  54. package/out/settings/__next.settings.txt +1 -1
  55. package/out/settings.html +1 -1
  56. package/out/settings.txt +1 -1
  57. package/out/setup/__next._full.txt +1 -1
  58. package/out/setup/__next._head.txt +1 -1
  59. package/out/setup/__next._index.txt +1 -1
  60. package/out/setup/__next._tree.txt +1 -1
  61. package/out/setup/__next.setup.__PAGE__.txt +1 -1
  62. package/out/setup/__next.setup.txt +1 -1
  63. package/out/setup.html +1 -1
  64. package/out/setup.txt +1 -1
  65. package/package.json +2 -2
  66. package/server/__tests__/bridge-auto-stop-guard.test.js +134 -0
  67. package/server/__tests__/scrub-secrets.test.js +234 -0
  68. package/server/__tests__/v1110-security-qa.test.js +312 -0
  69. package/server/config.js +29 -5
  70. package/server/index.js +45 -27
  71. package/server/install-agentchattr.js +12 -11
  72. package/server/routes.js +27 -30
  73. package/server/scrub-secrets.js +51 -0
  74. package/out/_next/static/chunks/turbopack-0lcwh84lrj9gi.js +0 -1
  75. /package/out/_next/static/{MA2-1YByee5M0-bbLgqQD → QmshV04af9o06krSyFHwf}/_buildManifest.js +0 -0
  76. /package/out/_next/static/{MA2-1YByee5M0-bbLgqQD → QmshV04af9o06krSyFHwf}/_clientMiddlewareManifest.js +0 -0
  77. /package/out/_next/static/{MA2-1YByee5M0-bbLgqQD → QmshV04af9o06krSyFHwf}/_ssgManifest.js +0 -0
package/bin/quadwork.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- const { execSync, spawn } = require("child_process");
3
+ const { execFileSync, spawn } = require("child_process");
4
4
  const fs = require("fs");
5
5
  const path = require("path");
6
6
  const os = require("os");
@@ -29,6 +29,13 @@ const AGENTCHATTR_PIN = "3e71d4267572579e7ffeb83576645f90932c1849";
29
29
  // #444: same pattern for realproject7/agentchattr-telegram.
30
30
  const AGENTCHATTR_TELEGRAM_PIN = "4a6b45f1794c612328b9d5ee6d6fcb3f77015abc";
31
31
 
32
+ // ─── Permission Helpers ────────────────────────────────────────────────────
33
+
34
+ function ensureSecureDir(dir) {
35
+ fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
36
+ try { fs.chmodSync(dir, 0o700); } catch {}
37
+ }
38
+
32
39
  // ─── ANSI Helpers ──────────────────────────────────────────────────────────
33
40
 
34
41
  const isTTY = process.stdout.isTTY;
@@ -67,16 +74,16 @@ function spinner(msg) {
67
74
  };
68
75
  }
69
76
 
70
- function run(cmd, opts = {}) {
77
+ function run(cmd, args = [], opts = {}) {
71
78
  try {
72
- return execSync(cmd, { encoding: "utf-8", stdio: "pipe", ...opts }).trim();
79
+ return execFileSync(cmd, args, { encoding: "utf-8", stdio: "pipe", ...opts }).trim();
73
80
  } catch {
74
81
  return null;
75
82
  }
76
83
  }
77
84
 
78
85
  function which(cmd) {
79
- return run(`which ${cmd}`) !== null;
86
+ return run("which", [cmd]) !== null;
80
87
  }
81
88
 
82
89
  /**
@@ -156,7 +163,7 @@ function installAgentChattr(dir) {
156
163
  // other when two projects (or two web tabs) launch simultaneously. Lock
157
164
  // file lives next to the install dir so it's scoped per-target.
158
165
  const lockFile = `${dir}.install.lock`;
159
- try { fs.mkdirSync(path.dirname(lockFile), { recursive: true }); }
166
+ try { ensureSecureDir(path.dirname(lockFile)); }
160
167
  catch (e) { return setError(`Cannot create parent of ${dir}: ${e.message}`); }
161
168
 
162
169
  let acquired = false;
@@ -164,7 +171,7 @@ function installAgentChattr(dir) {
164
171
  while (!acquired) {
165
172
  try {
166
173
  // Atomic create: fails if file already exists, no TOCTOU race.
167
- fs.writeFileSync(lockFile, `${process.pid}:${Date.now()}`, { flag: "wx" });
174
+ fs.writeFileSync(lockFile, `${process.pid}:${Date.now()}`, { mode: 0o600, flag: "wx" });
168
175
  acquired = true;
169
176
  } catch (e) {
170
177
  if (e.code !== "EEXIST") return setError(`Cannot create install lock ${lockFile}: ${e.message}`);
@@ -201,8 +208,8 @@ function installAgentChattr(dir) {
201
208
  }
202
209
  // Synchronous sleep — installAgentChattr is itself synchronous and
203
210
  // is called from the CLI wizard, where blocking is acceptable.
204
- // Use execSync('sleep') instead of a busy-wait so we don't pin a CPU.
205
- try { require("child_process").execSync(`sleep ${INSTALL_LOCK_POLL_MS / 1000}`); }
211
+ // Use execFileSync('sleep') instead of a busy-wait so we don't pin a CPU.
212
+ try { require("child_process").execFileSync("sleep", [String(INSTALL_LOCK_POLL_MS / 1000)], { stdio: "pipe" }); }
206
213
  catch { /* sleep interrupted; loop will recheck */ }
207
214
  }
208
215
  }
@@ -231,7 +238,7 @@ function _installAgentChattrLocked(dir, setError) {
231
238
  catch (e) { return setError(`Cannot remove empty dir ${dir}: ${e.message}`); }
232
239
  } else if (fs.existsSync(path.join(dir, ".git"))) {
233
240
  // Only remove if origin remote positively identifies this as agentchattr.
234
- const remote = run(`git -C "${dir}" remote get-url origin 2>/dev/null`);
241
+ const remote = run("git", ["-C", dir, "remote", "get-url", "origin"]);
235
242
  if (remote && remote.includes("agentchattr")) {
236
243
  try { fs.rmSync(dir, { recursive: true, force: true }); }
237
244
  catch (e) { return setError(`Cannot remove failed clone at ${dir}: ${e.message}`); }
@@ -243,9 +250,9 @@ function _installAgentChattrLocked(dir, setError) {
243
250
  }
244
251
  }
245
252
  // Ensure parent exists before clone (supports arbitrary nested paths).
246
- try { fs.mkdirSync(path.dirname(dir), { recursive: true }); }
253
+ try { ensureSecureDir(path.dirname(dir)); }
247
254
  catch (e) { return setError(`Cannot create parent of ${dir}: ${e.message}`); }
248
- const cloneResult = run(`git clone "${AGENTCHATTR_REPO}" "${dir}" 2>&1`, { timeout: 60000 });
255
+ const cloneResult = run("git", ["clone", AGENTCHATTR_REPO, dir], { timeout: 60000 });
249
256
  if (cloneResult === null) return setError(`git clone of ${AGENTCHATTR_REPO} into ${dir} failed`);
250
257
  if (!fs.existsSync(runPy)) return setError(`Clone completed but run.py missing at ${dir}`);
251
258
  // #348: pin to the known-good AgentChattr commit shipped with
@@ -261,7 +268,7 @@ function _installAgentChattrLocked(dir, setError) {
261
268
  // On failure (commit unreachable / force-pushed away), fall
262
269
  // back to the default branch with a loud warning instead of
263
270
  // hard-failing the install.
264
- const pinResult = run(`git -C "${dir}" checkout -B pinned ${AGENTCHATTR_PIN} 2>&1`, { timeout: 30000 });
271
+ const pinResult = run("git", ["-C", dir, "checkout", "-B", "pinned", AGENTCHATTR_PIN], { timeout: 30000 });
265
272
  if (pinResult === null) {
266
273
  try { console.warn(`[quadwork] WARNING: could not check out AgentChattr pin ${AGENTCHATTR_PIN} at ${dir}; falling back to default branch. The upstream commit may have been force-pushed away — update AGENTCHATTR_PIN in bin/quadwork.js for reproducible installs.`); } catch {}
267
274
  }
@@ -274,10 +281,10 @@ function _installAgentChattrLocked(dir, setError) {
274
281
  // clone is on a different SHA (drift) or already on a named
275
282
  // branch (operator may have set up their own work branch on
276
283
  // top); doctor will flag drift cases.
277
- const headSha = (run(`git -C "${dir}" rev-parse HEAD 2>&1`) || "").trim();
278
- const headRef = (run(`git -C "${dir}" symbolic-ref --quiet HEAD 2>&1`) || "").trim();
284
+ const headSha = (run("git", ["-C", dir, "rev-parse", "HEAD"]) || "").trim();
285
+ const headRef = (run("git", ["-C", dir, "symbolic-ref", "--quiet", "HEAD"]) || "").trim();
279
286
  if (headSha === AGENTCHATTR_PIN && !headRef) {
280
- const migrateResult = run(`git -C "${dir}" checkout -B pinned ${AGENTCHATTR_PIN} 2>&1`, { timeout: 30000 });
287
+ const migrateResult = run("git", ["-C", dir, "checkout", "-B", "pinned", AGENTCHATTR_PIN], { timeout: 30000 });
281
288
  if (migrateResult === null) {
282
289
  try { console.warn(`[quadwork] WARNING: could not migrate ${dir} from detached HEAD to the 'pinned' branch.`); } catch {}
283
290
  }
@@ -286,7 +293,7 @@ function _installAgentChattrLocked(dir, setError) {
286
293
 
287
294
  // 2. Create venv if missing.
288
295
  if (!fs.existsSync(venvPython)) {
289
- const venvResult = run(`python3 -m venv "${path.join(dir, ".venv")}" 2>&1`, { timeout: 60000 });
296
+ const venvResult = run("python3", ["-m", "venv", path.join(dir, ".venv")], { timeout: 60000 });
290
297
  if (venvResult === null) return setError(`python3 -m venv failed at ${dir}/.venv (is python3 installed?)`);
291
298
  if (!fs.existsSync(venvPython)) return setError(`venv created but ${venvPython} missing`);
292
299
  venvJustCreated = true;
@@ -297,7 +304,7 @@ function _installAgentChattrLocked(dir, setError) {
297
304
  if (venvJustCreated) {
298
305
  const reqFile = path.join(dir, "requirements.txt");
299
306
  if (fs.existsSync(reqFile)) {
300
- const pipResult = run(`"${venvPython}" -m pip install -r "${reqFile}" 2>&1`, { timeout: 120000 });
307
+ const pipResult = run(venvPython, ["-m", "pip", "install", "-r", reqFile], { timeout: 120000 });
301
308
  if (pipResult === null) return setError(`pip install -r ${reqFile} failed`);
302
309
  }
303
310
  }
@@ -410,8 +417,9 @@ function readConfig() {
410
417
  }
411
418
 
412
419
  function writeConfig(config) {
413
- if (!fs.existsSync(CONFIG_DIR)) fs.mkdirSync(CONFIG_DIR, { recursive: true });
414
- fs.writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2));
420
+ if (!fs.existsSync(CONFIG_DIR)) ensureSecureDir(CONFIG_DIR);
421
+ fs.writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2), { mode: 0o600 });
422
+ try { fs.chmodSync(CONFIG_PATH, 0o600); } catch {}
415
423
  }
416
424
 
417
425
  // ─── Prerequisites ──────────────────────────────────────────────────────────
@@ -432,8 +440,8 @@ function detectPlatform() {
432
440
  }
433
441
 
434
442
  async function tryInstall(rl, name, description, commands, { platform } = {}) {
435
- const cmd = typeof commands === "function" ? commands(platform) : commands;
436
- if (!cmd) {
443
+ const cmdSpec = typeof commands === "function" ? commands(platform) : commands;
444
+ if (!cmdSpec) {
437
445
  warn(`${name} cannot be auto-installed on your system.`);
438
446
  return false;
439
447
  }
@@ -445,7 +453,8 @@ async function tryInstall(rl, name, description, commands, { platform } = {}) {
445
453
  return false;
446
454
  }
447
455
  const sp = spinner(`Installing ${name}...`);
448
- const result = run(`${cmd} 2>&1`, { timeout: 120000 });
456
+ const [cmd, ...args] = cmdSpec;
457
+ const result = run(cmd, args, { timeout: 120000 });
449
458
  if (result !== null) {
450
459
  sp.stop(true);
451
460
  return true;
@@ -463,7 +472,7 @@ async function checkPrereqs(rl) {
463
472
  let hasPython = false;
464
473
 
465
474
  // ── 1. Node.js 20+ (must already exist — user ran npx) ──
466
- const nodeVer = run("node --version");
475
+ const nodeVer = run("node", ["--version"]);
467
476
  if (nodeVer) {
468
477
  const major = parseInt(nodeVer.replace("v", "").split(".")[0], 10);
469
478
  if (major >= 20) {
@@ -499,7 +508,7 @@ async function checkPrereqs(rl) {
499
508
  }
500
509
 
501
510
  // ── 3. Python 3.10+ (manual install — guide only) ──
502
- const pyVer = run("python3 --version");
511
+ const pyVer = run("python3", ["--version"]);
503
512
  if (pyVer) {
504
513
  const parts = pyVer.replace("Python ", "").split(".");
505
514
  const minor = parseInt(parts[1], 10);
@@ -577,9 +586,9 @@ async function checkPrereqs(rl) {
577
586
  console.log("");
578
587
  warn("GitHub CLI is required for agents to create branches, PRs, and reviews.");
579
588
  const ghCmd = (p) => {
580
- if (p === "macos") return "brew install gh";
581
- if (p === "linux-apt") return "sudo apt install gh -y";
582
- if (p === "linux-dnf") return "sudo dnf install gh -y";
589
+ if (p === "macos") return ["brew", "install", "gh"];
590
+ if (p === "linux-apt") return ["sudo", "apt", "install", "gh", "-y"];
591
+ if (p === "linux-dnf") return ["sudo", "dnf", "install", "gh", "-y"];
583
592
  return null;
584
593
  };
585
594
  const cmd = ghCmd(platform);
@@ -623,7 +632,11 @@ async function checkPrereqs(rl) {
623
632
  if (installClaude) {
624
633
  log(`Running: ${npmPrefix}npm install -g @anthropic-ai/claude-code`);
625
634
  try {
626
- execSync(`${npmPrefix}npm install -g @anthropic-ai/claude-code`, { stdio: "inherit", timeout: 120000 });
635
+ if (npmPrefix) {
636
+ execFileSync("sudo", ["npm", "install", "-g", "@anthropic-ai/claude-code"], { stdio: "inherit", timeout: 120000 });
637
+ } else {
638
+ execFileSync("npm", ["install", "-g", "@anthropic-ai/claude-code"], { stdio: "inherit", timeout: 120000 });
639
+ }
627
640
  hasClaude = which("claude");
628
641
  if (hasClaude) ok("Claude Code installed");
629
642
  else warn(`Install seemed to succeed but 'claude' not found on PATH. Try restarting your terminal.`);
@@ -645,7 +658,11 @@ async function checkPrereqs(rl) {
645
658
  if (installCodex) {
646
659
  log(`Running: ${npmPrefix}npm install -g @openai/codex`);
647
660
  try {
648
- execSync(`${npmPrefix}npm install -g @openai/codex`, { stdio: "inherit", timeout: 120000 });
661
+ if (npmPrefix) {
662
+ execFileSync("sudo", ["npm", "install", "-g", "@openai/codex"], { stdio: "inherit", timeout: 120000 });
663
+ } else {
664
+ execFileSync("npm", ["install", "-g", "@openai/codex"], { stdio: "inherit", timeout: 120000 });
665
+ }
649
666
  hasCodex = which("codex");
650
667
  if (hasCodex) ok("Codex CLI installed");
651
668
  else warn(`Install seemed to succeed but 'codex' not found on PATH. Try restarting your terminal.`);
@@ -668,7 +685,7 @@ async function checkPrereqs(rl) {
668
685
  console.log("");
669
686
 
670
687
  // GitHub CLI auth
671
- const ghAuth = run("gh auth status 2>&1");
688
+ const ghAuth = run("gh", ["auth", "status"]);
672
689
  if (ghAuth && ghAuth.includes("Logged in")) {
673
690
  ok("GitHub CLI — authenticated");
674
691
  } else {
@@ -693,7 +710,7 @@ async function checkPrereqs(rl) {
693
710
 
694
711
  // Claude Code auth
695
712
  if (hasClaude) {
696
- const claudeAuth = run("claude auth status 2>&1") || run("claude --version 2>&1");
713
+ const claudeAuth = run("claude", ["auth", "status"]) || run("claude", ["--version"]);
697
714
  if (claudeAuth && (claudeAuth.includes("authenticated") || claudeAuth.includes("Logged in") || claudeAuth.includes("@"))) {
698
715
  ok("Claude Code — authenticated");
699
716
  } else {
@@ -717,7 +734,7 @@ async function checkPrereqs(rl) {
717
734
 
718
735
  // Codex CLI auth
719
736
  if (hasCodex) {
720
- const codexAuth = run("codex login status 2>&1") || run("codex --version 2>&1");
737
+ const codexAuth = run("codex", ["login", "status"]) || run("codex", ["--version"]);
721
738
  if (codexAuth && (codexAuth.includes("authenticated") || codexAuth.includes("Logged in") || codexAuth.includes("@"))) {
722
739
  ok("Codex CLI — authenticated");
723
740
  } else {
@@ -759,7 +776,7 @@ async function setupGitHub(rl) {
759
776
  header("Step 2: GitHub Connection");
760
777
 
761
778
  // Check auth
762
- const authStatus = run("gh auth status 2>&1");
779
+ const authStatus = run("gh", ["auth", "status"]);
763
780
  if (authStatus && authStatus.includes("Logged in")) {
764
781
  ok("GitHub authenticated");
765
782
  } else {
@@ -776,7 +793,7 @@ async function setupGitHub(rl) {
776
793
 
777
794
  // Verify repo exists
778
795
  const sp = spinner(`Verifying ${repo}...`);
779
- const repoCheck = run(`gh repo view ${repo} --json name 2>&1`);
796
+ const repoCheck = run("gh", ["repo", "view", repo, "--json", "name"]);
780
797
  if (repoCheck && repoCheck.includes('"name"')) {
781
798
  sp.stop(true);
782
799
  } else {
@@ -873,11 +890,11 @@ async function setupAgents(rl, repo) {
873
890
  const wtSpinner = spinner("Creating worktrees and seeding files...");
874
891
 
875
892
  // Empty repos have no commits — git worktree add requires at least one.
876
- const headCheck = run(`git -C "${absDir}" rev-parse HEAD 2>&1`);
893
+ const headCheck = run("git", ["-C", absDir, "rev-parse", "HEAD"]);
877
894
  if (!headCheck || headCheck.includes("fatal")) {
878
- run(`git -C "${absDir}" commit --allow-empty -m "Initial commit (created by QuadWork setup)"`);
879
- const defaultBranch = run(`git -C "${absDir}" symbolic-ref --short HEAD 2>&1`) || "main";
880
- run(`git -C "${absDir}" push origin ${defaultBranch} 2>&1`);
895
+ run("git", ["-C", absDir, "commit", "--allow-empty", "-m", "Initial commit (created by QuadWork setup)"]);
896
+ const defaultBranch = run("git", ["-C", absDir, "symbolic-ref", "--short", "HEAD"]) || "main";
897
+ run("git", ["-C", absDir, "push", "origin", defaultBranch]);
881
898
  }
882
899
 
883
900
  const worktrees = {};
@@ -886,10 +903,10 @@ async function setupAgents(rl, repo) {
886
903
  const wtDir = path.join(path.dirname(absDir), `${projectName}-${agent}`);
887
904
  if (!fs.existsSync(wtDir)) {
888
905
  const branchName = `worktree-${agent}`;
889
- run(`git -C "${absDir}" branch ${branchName} HEAD 2>&1`);
890
- const result = run(`git -C "${absDir}" worktree add "${wtDir}" ${branchName} 2>&1`);
906
+ run("git", ["-C", absDir, "branch", branchName, "HEAD"]);
907
+ const result = run("git", ["-C", absDir, "worktree", "add", wtDir, branchName]);
891
908
  if (!result) {
892
- const result2 = run(`git -C "${absDir}" worktree add --detach "${wtDir}" HEAD 2>&1`);
909
+ const result2 = run("git", ["-C", absDir, "worktree", "add", "--detach", wtDir, "HEAD"]);
893
910
  if (!result2) { wtFailed = agent; break; }
894
911
  }
895
912
  }
@@ -962,7 +979,7 @@ function writeAgentChattrConfig(setup, configTomlPath, { skipInstall = false } =
962
979
 
963
980
  // Per-project: isolated data dir and port
964
981
  const dataDir = path.join(path.dirname(configTomlPath), "data");
965
- if (!fs.existsSync(dataDir)) fs.mkdirSync(dataDir, { recursive: true });
982
+ if (!fs.existsSync(dataDir)) ensureSecureDir(dataDir);
966
983
  // Read assigned port from config (set by writeQuadWorkConfig)
967
984
  const existingConfig = readConfig();
968
985
  const existingProject = existingConfig.projects?.find((p) => p.id === setup.projectName);
@@ -983,7 +1000,7 @@ function writeAgentChattrConfig(setup, configTomlPath, { skipInstall = false } =
983
1000
 
984
1001
  // Write config.toml
985
1002
  const configDir = path.dirname(configTomlPath);
986
- if (!fs.existsSync(configDir)) fs.mkdirSync(configDir, { recursive: true });
1003
+ if (!fs.existsSync(configDir)) ensureSecureDir(configDir);
987
1004
  fs.writeFileSync(configTomlPath, tomlContent);
988
1005
  ok(`Wrote ${configTomlPath}`);
989
1006
 
@@ -1026,7 +1043,7 @@ function writeAgentChattrConfig(setup, configTomlPath, { skipInstall = false } =
1026
1043
  acProc.unref();
1027
1044
  if (acProc.pid) {
1028
1045
  ok(`AgentChattr started (PID: ${acProc.pid})`);
1029
- if (!fs.existsSync(CONFIG_DIR)) fs.mkdirSync(CONFIG_DIR, { recursive: true });
1046
+ if (!fs.existsSync(CONFIG_DIR)) ensureSecureDir(CONFIG_DIR);
1030
1047
  const pidFile = path.join(CONFIG_DIR, `agentchattr-${setup.projectName}.pid`);
1031
1048
  fs.writeFileSync(pidFile, String(acProc.pid));
1032
1049
  } else {
@@ -1055,7 +1072,7 @@ async function setupAddons(rl, setup, configTomlPath) {
1055
1072
  const telegramDir = path.join(path.dirname(setup.absDir), "agentchattr-telegram");
1056
1073
  if (!fs.existsSync(telegramDir)) {
1057
1074
  const cloneSpinner = spinner("Cloning agentchattr-telegram...");
1058
- const cloneResult = run(`git clone https://github.com/realproject7/agentchattr-telegram.git "${telegramDir}" 2>&1`);
1075
+ const cloneResult = run("git", ["clone", "https://github.com/realproject7/agentchattr-telegram.git", telegramDir]);
1059
1076
  cloneSpinner.stop(cloneResult !== null);
1060
1077
  if (!cloneResult) { warn("You can set it up manually later"); }
1061
1078
  } else {
@@ -1065,8 +1082,8 @@ async function setupAddons(rl, setup, configTomlPath) {
1065
1082
  // upgrade (existing clone may be on an older pin with stale
1066
1083
  // bridge_sender defaults).
1067
1084
  if (fs.existsSync(telegramDir)) {
1068
- run(`git -C "${telegramDir}" fetch origin 2>&1`, { timeout: 30000 });
1069
- const pinResult = run(`git -C "${telegramDir}" checkout -B pinned ${AGENTCHATTR_TELEGRAM_PIN} 2>&1`, { timeout: 30000 });
1085
+ run("git", ["-C", telegramDir, "fetch", "origin"], { timeout: 30000 });
1086
+ const pinResult = run("git", ["-C", telegramDir, "checkout", "-B", "pinned", AGENTCHATTR_TELEGRAM_PIN], { timeout: 30000 });
1070
1087
  if (pinResult === null) {
1071
1088
  try { console.warn(`[quadwork] WARNING: could not check out agentchattr-telegram pin ${AGENTCHATTR_TELEGRAM_PIN} at ${telegramDir}; falling back to default branch.`); } catch {}
1072
1089
  }
@@ -1076,7 +1093,7 @@ async function setupAddons(rl, setup, configTomlPath) {
1076
1093
  const reqFile = path.join(telegramDir, "requirements.txt");
1077
1094
  if (fs.existsSync(reqFile)) {
1078
1095
  const tgSpinner = spinner("Installing Telegram Bridge dependencies...");
1079
- const tgResult = run(`pip install -r "${reqFile}" 2>&1`);
1096
+ const tgResult = run("pip", ["install", "-r", reqFile]);
1080
1097
  tgSpinner.stop(tgResult !== null);
1081
1098
  }
1082
1099
 
@@ -1187,7 +1204,7 @@ function writeOvernightQueueFile(projectName, repo) {
1187
1204
  const queueDir = path.join(CONFIG_DIR, projectName);
1188
1205
  const queuePath = path.join(queueDir, "OVERNIGHT-QUEUE.md");
1189
1206
  if (fs.existsSync(queuePath)) return false;
1190
- try { fs.mkdirSync(queueDir, { recursive: true }); }
1207
+ try { ensureSecureDir(queueDir); }
1191
1208
  catch (e) { warn(`Could not create ${queueDir}: ${e.message}`); return false; }
1192
1209
  const templatePath = path.join(TEMPLATES_DIR, "OVERNIGHT-QUEUE.md");
1193
1210
  if (!fs.existsSync(templatePath)) {
@@ -1369,9 +1386,15 @@ async function cmdInit() {
1369
1386
  rl.close();
1370
1387
 
1371
1388
  // Schedule browser open after the server has had a moment to bind.
1372
- const openCmd = process.platform === "darwin" ? "open" : process.platform === "win32" ? "start" : "xdg-open";
1373
1389
  setTimeout(() => {
1374
- try { execSync(`${openCmd} ${dashboardUrl}/setup`, { stdio: "ignore" }); } catch {}
1390
+ try {
1391
+ const url = `${dashboardUrl}/setup`;
1392
+ if (process.platform === "win32") {
1393
+ execFileSync("cmd", ["/c", "start", url], { stdio: "ignore" });
1394
+ } else {
1395
+ execFileSync(process.platform === "darwin" ? "open" : "xdg-open", [url], { stdio: "ignore" });
1396
+ }
1397
+ } catch {}
1375
1398
  }, 1500);
1376
1399
 
1377
1400
  // Run the server in the foreground. require() starts the express
@@ -1677,9 +1700,14 @@ function cmdStart() {
1677
1700
 
1678
1701
  // Open dashboard in browser after a short delay
1679
1702
  const dashboardUrl = `http://127.0.0.1:${port}`;
1680
- const openCmd = process.platform === "darwin" ? "open" : process.platform === "win32" ? "start" : "xdg-open";
1681
1703
  setTimeout(() => {
1682
- try { execSync(`${openCmd} ${dashboardUrl}`, { stdio: "ignore" }); } catch {}
1704
+ try {
1705
+ if (process.platform === "win32") {
1706
+ execFileSync("cmd", ["/c", "start", dashboardUrl], { stdio: "ignore" });
1707
+ } else {
1708
+ execFileSync(process.platform === "darwin" ? "open" : "xdg-open", [dashboardUrl], { stdio: "ignore" });
1709
+ }
1710
+ } catch {}
1683
1711
  }, 1500);
1684
1712
 
1685
1713
  // Run server in foreground. Capture exports so the SIGINT handler
@@ -1749,7 +1777,7 @@ function cmdStop() {
1749
1777
  const cfg = readConfig();
1750
1778
  const qwPort = cfg.port || 8400;
1751
1779
  try {
1752
- const result = run(`curl -s -X POST http://127.0.0.1:${qwPort}/api/caffeinate/stop 2>/dev/null`);
1780
+ const result = run("curl", ["-s", "-X", "POST", `http://127.0.0.1:${qwPort}/api/caffeinate/stop`]);
1753
1781
  if (result && result.includes('"ok":true')) {
1754
1782
  ok("Stopped caffeinate (sleep prevention)");
1755
1783
  stopped++;
@@ -1921,7 +1949,7 @@ function cmdDoctor() {
1921
1949
  console.log("");
1922
1950
  const cloneShaAt = (dir) => {
1923
1951
  if (!fs.existsSync(path.join(dir, ".git"))) return null;
1924
- const sha = run(`git -C "${dir}" rev-parse HEAD 2>&1`);
1952
+ const sha = run("git", ["-C", dir, "rev-parse", "HEAD"]);
1925
1953
  return sha ? sha.trim() : null;
1926
1954
  };
1927
1955
  // #366: surface whether the clone is on the named `pinned`
@@ -1929,7 +1957,7 @@ function cmdDoctor() {
1929
1957
  // Detached-HEAD-but-on-pin gets a soft warning so operators
1930
1958
  // know to re-run install (which auto-migrates) or re-clone.
1931
1959
  const cloneBranchAt = (dir) => {
1932
- const ref = run(`git -C "${dir}" symbolic-ref --quiet HEAD 2>&1`);
1960
+ const ref = run("git", ["-C", dir, "symbolic-ref", "--quiet", "HEAD"]);
1933
1961
  if (!ref) return null; // detached
1934
1962
  return ref.trim().replace(/^refs\/heads\//, "");
1935
1963
  };
package/out/404.html CHANGED
@@ -1 +1 @@
1
- <!DOCTYPE html><html lang="en" class="geist_mono_8d43a2aa-module__8Li5zG__variable h-full"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/chunks/0a4.d381szseh.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/0ze4gu236oq96.js"/><script src="/_next/static/chunks/0.bbxho1vnxin.js" async=""></script><script src="/_next/static/chunks/16g.ca89g7fib.js" async=""></script><script src="/_next/static/chunks/0zfotsowwll1x.js" async=""></script><script src="/_next/static/chunks/0pqt~8bl3ukh4.js" async=""></script><script src="/_next/static/chunks/turbopack-0lcwh84lrj9gi.js" async=""></script><script src="/_next/static/chunks/0rxi-m9onh_sa.js" async=""></script><script src="/_next/static/chunks/0d3shmwh5_nmn.js" async=""></script><meta name="robots" content="noindex"/><meta name="next-size-adjust" content=""/><title>404: This page could not be found.</title><title>QuadWork</title><meta name="description" content="Unified dashboard for multi-agent coding teams"/><link rel="icon" href="/favicon.ico?favicon.05o2q2p4kvnq_.ico" sizes="256x256" type="image/x-icon"/><script src="/_next/static/chunks/03~yq9q893hmn.js" noModule=""></script></head><body class="h-full flex flex-col"><div hidden=""><!--$--><!--/$--></div><header class="sticky top-0 z-40 flex h-12 items-center justify-between border-b border-white/10 bg-neutral-950/90 px-4 backdrop-blur" aria-hidden="true"></header><div class="flex flex-1 min-h-0"><aside class="shrink-0 h-full border-r border-border bg-bg-surface flex flex-col py-3 transition-[width] duration-200 ease-in-out overflow-hidden w-16 items-center"><a class="flex items-center gap-2 rounded-sm transition-colors w-10 h-10 justify-center self-center text-text-muted hover:text-text hover:bg-[#1a1a1a]" title="Home" href="/"><svg width="20" height="20" viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M3 10L10 3l7 7"></path><path d="M5 8.5V16h3.5v-4h3v4H15V8.5"></path></svg></a><div class="h-px bg-border my-2 w-6 self-center"></div><div class="flex-1 flex flex-col gap-2 overflow-y-auto min-h-0 items-center"><a class="flex items-center gap-2 rounded-full transition-colors w-10 h-10 justify-center border border-dashed border-border text-text-muted hover:text-text hover:bg-[#1a1a1a]" title="Add project" href="/setup"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"><path d="M8 3v10M3 8h10"></path></svg></a></div><div class="h-px bg-border my-2 w-6 self-center"></div><button class="flex shrink-0 items-center justify-center w-10 h-10 rounded-sm border border-border text-text-muted hover:text-accent hover:border-accent/50 transition-colors self-center" title="Expand sidebar"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M6 3l5 5-5 5"></path></svg></button><div class="h-1"></div><a class="flex items-center gap-2 rounded-sm transition-colors w-10 h-10 justify-center self-center text-text-muted hover:text-text hover:bg-[#1a1a1a]" title="Settings" href="/settings"><svg width="18" height="18" viewBox="0 0 18 18" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="9" cy="9" r="2.5"></circle><path d="M7.5 1.5h3l.4 2.1a5.5 5.5 0 011.3.7l2-.8 1.5 2.6-1.6 1.3a5.5 5.5 0 010 1.5l1.6 1.3-1.5 2.6-2-.8a5.5 5.5 0 01-1.3.7l-.4 2.1h-3l-.4-2.1a5.5 5.5 0 01-1.3-.7l-2 .8-1.5-2.6 1.6-1.3a5.5 5.5 0 010-1.5L2.3 6.1l1.5-2.6 2 .8a5.5 5.5 0 011.3-.7z"></path></svg></a></aside><main class="flex-1 min-w-0 overflow-auto"><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;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><!--$--><!--/$--></main></div><script src="/_next/static/chunks/0ze4gu236oq96.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[43688,[\"/_next/static/chunks/0rxi-m9onh_sa.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"default\"]\n3:I[26704,[\"/_next/static/chunks/0rxi-m9onh_sa.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"default\"]\n4:I[22140,[\"/_next/static/chunks/0rxi-m9onh_sa.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"default\"]\n5:I[39756,[\"/_next/static/chunks/0rxi-m9onh_sa.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"default\"]\n6:I[37457,[\"/_next/static/chunks/0rxi-m9onh_sa.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"default\"]\n7:I[97367,[\"/_next/static/chunks/0rxi-m9onh_sa.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"OutletBoundary\"]\n8:\"$Sreact.suspense\"\nb:I[97367,[\"/_next/static/chunks/0rxi-m9onh_sa.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"ViewportBoundary\"]\nd:I[97367,[\"/_next/static/chunks/0rxi-m9onh_sa.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"MetadataBoundary\"]\nf:I[68027,[\"/_next/static/chunks/0rxi-m9onh_sa.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"default\",1]\n:HL[\"/_next/static/chunks/0a4.d381szseh.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"_not-found\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",16],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/0a4.d381szseh.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/0rxi-m9onh_sa.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"geist_mono_8d43a2aa-module__8Li5zG__variable h-full\",\"children\":[\"$\",\"body\",null,{\"className\":\"h-full flex flex-col\",\"children\":[[\"$\",\"$L2\",null,{}],[\"$\",\"$L3\",null,{}],[\"$\",\"div\",null,{\"className\":\"flex flex-1 min-h-0\",\"children\":[[\"$\",\"$L4\",null,{}],[\"$\",\"main\",null,{\"className\":\"flex-1 min-w-0 overflow-auto\",\"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\"}]}]]}]]}]}]]}],{\"children\":[[\"$\",\"$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\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:props:children:2:props:children:1: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:f:0:1:0:props:children:1:props:children:props:children:2:props:children:1:props:children:props:notFound:0:1:props:children:props:children:1:props:style\",\"children\":404}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:props:children:2:props:children:1:props:children:props:notFound:0:1:props:children:props:children:2:props:style\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:props:children:2:props:children:1:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style\",\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L7\",null,{\"children\":[\"$\",\"$8\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@9\"}]}]]}],{},null,false,null]},null,false,\"$@a\"]},null,false,null],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$Lb\",null,{\"children\":\"$Lc\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Ld\",null,{\"children\":[\"$\",\"$8\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Le\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$f\",[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/0a4.d381szseh.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"MA2-1YByee5M0-bbLgqQD\"}\n"])</script><script>self.__next_f.push([1,"10:[]\na:\"$W10\"\n"])</script><script>self.__next_f.push([1,"c:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"11:I[27201,[\"/_next/static/chunks/0rxi-m9onh_sa.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"IconMark\"]\n9:null\ne:[[\"$\",\"title\",\"0\",{\"children\":\"QuadWork\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Unified dashboard for multi-agent coding teams\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.05o2q2p4kvnq_.ico\",\"sizes\":\"256x256\",\"type\":\"image/x-icon\"}],[\"$\",\"$L11\",\"3\",{}]]\n"])</script></body></html>
1
+ <!DOCTYPE html><html lang="en" class="geist_mono_8d43a2aa-module__8Li5zG__variable h-full"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/chunks/0a4.d381szseh.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/0ze4gu236oq96.js"/><script src="/_next/static/chunks/0.bbxho1vnxin.js" async=""></script><script src="/_next/static/chunks/0n~dq4kpx9xxx.js" async=""></script><script src="/_next/static/chunks/0zfotsowwll1x.js" async=""></script><script src="/_next/static/chunks/0pqt~8bl3ukh4.js" async=""></script><script src="/_next/static/chunks/turbopack-0qm-e3ifrz~2u.js" async=""></script><script src="/_next/static/chunks/0rxi-m9onh_sa.js" async=""></script><script src="/_next/static/chunks/0d3shmwh5_nmn.js" async=""></script><meta name="robots" content="noindex"/><meta name="next-size-adjust" content=""/><title>404: This page could not be found.</title><title>QuadWork</title><meta name="description" content="Unified dashboard for multi-agent coding teams"/><link rel="icon" href="/favicon.ico?favicon.05o2q2p4kvnq_.ico" sizes="256x256" type="image/x-icon"/><script src="/_next/static/chunks/03~yq9q893hmn.js" noModule=""></script></head><body class="h-full flex flex-col"><div hidden=""><!--$--><!--/$--></div><header class="sticky top-0 z-40 flex h-12 items-center justify-between border-b border-white/10 bg-neutral-950/90 px-4 backdrop-blur" aria-hidden="true"></header><div class="flex flex-1 min-h-0"><aside class="shrink-0 h-full border-r border-border bg-bg-surface flex flex-col py-3 transition-[width] duration-200 ease-in-out overflow-hidden w-16 items-center"><a class="flex items-center gap-2 rounded-sm transition-colors w-10 h-10 justify-center self-center text-text-muted hover:text-text hover:bg-[#1a1a1a]" title="Home" href="/"><svg width="20" height="20" viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M3 10L10 3l7 7"></path><path d="M5 8.5V16h3.5v-4h3v4H15V8.5"></path></svg></a><div class="h-px bg-border my-2 w-6 self-center"></div><div class="flex-1 flex flex-col gap-2 overflow-y-auto min-h-0 items-center"><a class="flex items-center gap-2 rounded-full transition-colors w-10 h-10 justify-center border border-dashed border-border text-text-muted hover:text-text hover:bg-[#1a1a1a]" title="Add project" href="/setup"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"><path d="M8 3v10M3 8h10"></path></svg></a></div><div class="h-px bg-border my-2 w-6 self-center"></div><button class="flex shrink-0 items-center justify-center w-10 h-10 rounded-sm border border-border text-text-muted hover:text-accent hover:border-accent/50 transition-colors self-center" title="Expand sidebar"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M6 3l5 5-5 5"></path></svg></button><div class="h-1"></div><a class="flex items-center gap-2 rounded-sm transition-colors w-10 h-10 justify-center self-center text-text-muted hover:text-text hover:bg-[#1a1a1a]" title="Settings" href="/settings"><svg width="18" height="18" viewBox="0 0 18 18" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="9" cy="9" r="2.5"></circle><path d="M7.5 1.5h3l.4 2.1a5.5 5.5 0 011.3.7l2-.8 1.5 2.6-1.6 1.3a5.5 5.5 0 010 1.5l1.6 1.3-1.5 2.6-2-.8a5.5 5.5 0 01-1.3.7l-.4 2.1h-3l-.4-2.1a5.5 5.5 0 01-1.3-.7l-2 .8-1.5-2.6 1.6-1.3a5.5 5.5 0 010-1.5L2.3 6.1l1.5-2.6 2 .8a5.5 5.5 0 011.3-.7z"></path></svg></a></aside><main class="flex-1 min-w-0 overflow-auto"><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;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><!--$--><!--/$--></main></div><script src="/_next/static/chunks/0ze4gu236oq96.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[43688,[\"/_next/static/chunks/0rxi-m9onh_sa.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"default\"]\n3:I[26704,[\"/_next/static/chunks/0rxi-m9onh_sa.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"default\"]\n4:I[22140,[\"/_next/static/chunks/0rxi-m9onh_sa.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"default\"]\n5:I[39756,[\"/_next/static/chunks/0rxi-m9onh_sa.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"default\"]\n6:I[37457,[\"/_next/static/chunks/0rxi-m9onh_sa.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"default\"]\n7:I[97367,[\"/_next/static/chunks/0rxi-m9onh_sa.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"OutletBoundary\"]\n8:\"$Sreact.suspense\"\nb:I[97367,[\"/_next/static/chunks/0rxi-m9onh_sa.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"ViewportBoundary\"]\nd:I[97367,[\"/_next/static/chunks/0rxi-m9onh_sa.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"MetadataBoundary\"]\nf:I[68027,[\"/_next/static/chunks/0rxi-m9onh_sa.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"default\",1]\n:HL[\"/_next/static/chunks/0a4.d381szseh.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"_not-found\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",16],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/0a4.d381szseh.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/0rxi-m9onh_sa.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"geist_mono_8d43a2aa-module__8Li5zG__variable h-full\",\"children\":[\"$\",\"body\",null,{\"className\":\"h-full flex flex-col\",\"children\":[[\"$\",\"$L2\",null,{}],[\"$\",\"$L3\",null,{}],[\"$\",\"div\",null,{\"className\":\"flex flex-1 min-h-0\",\"children\":[[\"$\",\"$L4\",null,{}],[\"$\",\"main\",null,{\"className\":\"flex-1 min-w-0 overflow-auto\",\"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\"}]}]]}]]}]}]]}],{\"children\":[[\"$\",\"$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\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:props:children:2:props:children:1: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:f:0:1:0:props:children:1:props:children:props:children:2:props:children:1:props:children:props:notFound:0:1:props:children:props:children:1:props:style\",\"children\":404}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:props:children:2:props:children:1:props:children:props:notFound:0:1:props:children:props:children:2:props:style\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:props:children:2:props:children:1:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style\",\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L7\",null,{\"children\":[\"$\",\"$8\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@9\"}]}]]}],{},null,false,null]},null,false,\"$@a\"]},null,false,null],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$Lb\",null,{\"children\":\"$Lc\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Ld\",null,{\"children\":[\"$\",\"$8\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Le\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$f\",[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/0a4.d381szseh.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"QmshV04af9o06krSyFHwf\"}\n"])</script><script>self.__next_f.push([1,"10:[]\na:\"$W10\"\n"])</script><script>self.__next_f.push([1,"c:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"11:I[27201,[\"/_next/static/chunks/0rxi-m9onh_sa.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"IconMark\"]\n9:null\ne:[[\"$\",\"title\",\"0\",{\"children\":\"QuadWork\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Unified dashboard for multi-agent coding teams\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.05o2q2p4kvnq_.ico\",\"sizes\":\"256x256\",\"type\":\"image/x-icon\"}],[\"$\",\"$L11\",\"3\",{}]]\n"])</script></body></html>
@@ -2,5 +2,5 @@
2
2
  2:I[54338,["/_next/static/chunks/0rxi-m9onh_sa.js","/_next/static/chunks/0d3shmwh5_nmn.js","/_next/static/chunks/0aldkx8l9xukk.js"],"default"]
3
3
  3:I[97367,["/_next/static/chunks/0rxi-m9onh_sa.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"OutletBoundary"]
4
4
  4:"$Sreact.suspense"
5
- 0:{"rsc":["$","$1","c",{"children":[["$","$L2",null,{}],[["$","script","script-0",{"src":"/_next/static/chunks/0aldkx8l9xukk.js","async":true}]],["$","$L3",null,{"children":["$","$4",null,{"name":"Next.MetadataOutlet","children":"$@5"}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"MA2-1YByee5M0-bbLgqQD"}
5
+ 0:{"rsc":["$","$1","c",{"children":[["$","$L2",null,{}],[["$","script","script-0",{"src":"/_next/static/chunks/0aldkx8l9xukk.js","async":true}]],["$","$L3",null,{"children":["$","$4",null,{"name":"Next.MetadataOutlet","children":"$@5"}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"QmshV04af9o06krSyFHwf"}
6
6
  5:null
@@ -12,7 +12,7 @@ d:I[97367,["/_next/static/chunks/0rxi-m9onh_sa.js","/_next/static/chunks/0d3shmw
12
12
  f:I[68027,["/_next/static/chunks/0rxi-m9onh_sa.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default",1]
13
13
  :HL["/_next/static/chunks/0a4.d381szseh.css","style"]
14
14
  :HL["/_next/static/media/797e433ab948586e-s.p.0.q-h669a_dqa.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
15
- 0:{"P":null,"c":["",""],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/0a4.d381szseh.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/0rxi-m9onh_sa.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/0d3shmwh5_nmn.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","className":"geist_mono_8d43a2aa-module__8Li5zG__variable h-full","children":["$","body",null,{"className":"h-full flex flex-col","children":[["$","$L2",null,{}],["$","$L3",null,{}],["$","div",null,{"className":"flex flex-1 min-h-0","children":[["$","$L4",null,{}],["$","main",null,{"className":"flex-1 min-w-0 overflow-auto","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"}]}]]}]]}]}]]}],{"children":[["$","$1","c",{"children":[["$","$L7",null,{}],[["$","script","script-0",{"src":"/_next/static/chunks/0aldkx8l9xukk.js","async":true,"nonce":"$undefined"}]],["$","$L8",null,{"children":["$","$9",null,{"name":"Next.MetadataOutlet","children":"$@a"}]}]]}],{},null,false,null]},null,false,null],["$","$1","h",{"children":[null,["$","$Lb",null,{"children":"$Lc"}],["$","div",null,{"hidden":true,"children":["$","$Ld",null,{"children":["$","$9",null,{"name":"Next.Metadata","children":"$Le"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],false]],"m":"$undefined","G":["$f",[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/0a4.d381szseh.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"MA2-1YByee5M0-bbLgqQD"}
15
+ 0:{"P":null,"c":["",""],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/0a4.d381szseh.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/0rxi-m9onh_sa.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/0d3shmwh5_nmn.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","className":"geist_mono_8d43a2aa-module__8Li5zG__variable h-full","children":["$","body",null,{"className":"h-full flex flex-col","children":[["$","$L2",null,{}],["$","$L3",null,{}],["$","div",null,{"className":"flex flex-1 min-h-0","children":[["$","$L4",null,{}],["$","main",null,{"className":"flex-1 min-w-0 overflow-auto","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"}]}]]}]]}]}]]}],{"children":[["$","$1","c",{"children":[["$","$L7",null,{}],[["$","script","script-0",{"src":"/_next/static/chunks/0aldkx8l9xukk.js","async":true,"nonce":"$undefined"}]],["$","$L8",null,{"children":["$","$9",null,{"name":"Next.MetadataOutlet","children":"$@a"}]}]]}],{},null,false,null]},null,false,null],["$","$1","h",{"children":[null,["$","$Lb",null,{"children":"$Lc"}],["$","div",null,{"hidden":true,"children":["$","$Ld",null,{"children":["$","$9",null,{"name":"Next.Metadata","children":"$Le"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],false]],"m":"$undefined","G":["$f",[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/0a4.d381szseh.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"QmshV04af9o06krSyFHwf"}
16
16
  c:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
17
17
  10:I[27201,["/_next/static/chunks/0rxi-m9onh_sa.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"IconMark"]
18
18
  a:null
@@ -3,4 +3,4 @@
3
3
  3:I[97367,["/_next/static/chunks/0rxi-m9onh_sa.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"MetadataBoundary"]
4
4
  4:"$Sreact.suspense"
5
5
  5:I[27201,["/_next/static/chunks/0rxi-m9onh_sa.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"IconMark"]
6
- 0:{"rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"QuadWork"}],["$","meta","1",{"name":"description","content":"Unified dashboard for multi-agent coding teams"}],["$","link","2",{"rel":"icon","href":"/favicon.ico?favicon.05o2q2p4kvnq_.ico","sizes":"256x256","type":"image/x-icon"}],["$","$L5","3",{}]]}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"MA2-1YByee5M0-bbLgqQD"}
6
+ 0:{"rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"QuadWork"}],["$","meta","1",{"name":"description","content":"Unified dashboard for multi-agent coding teams"}],["$","link","2",{"rel":"icon","href":"/favicon.ico?favicon.05o2q2p4kvnq_.ico","sizes":"256x256","type":"image/x-icon"}],["$","$L5","3",{}]]}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"QmshV04af9o06krSyFHwf"}
@@ -5,4 +5,4 @@
5
5
  5:I[39756,["/_next/static/chunks/0rxi-m9onh_sa.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"]
6
6
  6:I[37457,["/_next/static/chunks/0rxi-m9onh_sa.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"]
7
7
  :HL["/_next/static/chunks/0a4.d381szseh.css","style"]
8
- 0:{"rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/0a4.d381szseh.css","precedence":"next"}],["$","script","script-0",{"src":"/_next/static/chunks/0rxi-m9onh_sa.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/0d3shmwh5_nmn.js","async":true}]],["$","html",null,{"lang":"en","className":"geist_mono_8d43a2aa-module__8Li5zG__variable h-full","children":["$","body",null,{"className":"h-full flex flex-col","children":[["$","$L2",null,{}],["$","$L3",null,{}],["$","div",null,{"className":"flex flex-1 min-h-0","children":[["$","$L4",null,{}],["$","main",null,{"className":"flex-1 min-w-0 overflow-auto","children":["$","$L5",null,{"parallelRouterKey":"children","template":["$","$L6",null,{}],"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."}]}]]}]}]],[]]}]}]]}]]}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"MA2-1YByee5M0-bbLgqQD"}
8
+ 0:{"rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/0a4.d381szseh.css","precedence":"next"}],["$","script","script-0",{"src":"/_next/static/chunks/0rxi-m9onh_sa.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/0d3shmwh5_nmn.js","async":true}]],["$","html",null,{"lang":"en","className":"geist_mono_8d43a2aa-module__8Li5zG__variable h-full","children":["$","body",null,{"className":"h-full flex flex-col","children":[["$","$L2",null,{}],["$","$L3",null,{}],["$","div",null,{"className":"flex flex-1 min-h-0","children":[["$","$L4",null,{}],["$","main",null,{"className":"flex-1 min-w-0 overflow-auto","children":["$","$L5",null,{"parallelRouterKey":"children","template":["$","$L6",null,{}],"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."}]}]]}]}]],[]]}]}]]}]]}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"QmshV04af9o06krSyFHwf"}
@@ -1,3 +1,3 @@
1
1
  :HL["/_next/static/chunks/0a4.d381szseh.css","style"]
2
2
  :HL["/_next/static/media/797e433ab948586e-s.p.0.q-h669a_dqa.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
3
- 0:{"tree":{"name":"","param":null,"prefetchHints":16,"slots":{"children":{"name":"__PAGE__","param":null,"prefetchHints":0,"slots":null}}},"staleTime":300,"buildId":"MA2-1YByee5M0-bbLgqQD"}
3
+ 0:{"tree":{"name":"","param":null,"prefetchHints":16,"slots":{"children":{"name":"__PAGE__","param":null,"prefetchHints":0,"slots":null}}},"staleTime":300,"buildId":"QmshV04af9o06krSyFHwf"}
@@ -1 +1 @@
1
- (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,67585,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"BailoutToCSR",{enumerable:!0,get:function(){return l}});let r=e.r(32061);function l({reason:e,children:t}){if("u"<typeof window)throw Object.defineProperty(new r.BailoutToCSRError(e),"__NEXT_ERROR_CODE",{value:"E394",enumerable:!1,configurable:!0});return t}},9885,(e,t,n)=>{"use strict";function r(e){return e.split("/").map(e=>encodeURIComponent(e)).join("/")}Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"encodeURIPath",{enumerable:!0,get:function(){return r}})},52157,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"PreloadChunks",{enumerable:!0,get:function(){return a}});let r=e.r(43476),l=e.r(74080),o=e.r(63599),u=e.r(9885),s=e.r(43369);function a({moduleIds:e}){if("u">typeof window)return null;let t=o.workAsyncStorage.getStore();if(void 0===t)return null;let n=[];if(t.reactLoadableManifest&&e){let r=t.reactLoadableManifest;for(let t of e){if(!r[t])continue;let e=r[t].files;n.push(...e)}}if(0===n.length)return null;let i=(0,s.getAssetTokenQuery)();return(0,r.jsx)(r.Fragment,{children:n.map(e=>{let n=`${t.assetPrefix}/_next/${(0,u.encodeURIPath)(e)}${i}`;return e.endsWith(".css")?(0,r.jsx)("link",{precedence:"dynamic",href:n,rel:"stylesheet",as:"style",nonce:t.nonce},e):((0,l.preload)(n,{as:"script",fetchPriority:"low",nonce:t.nonce}),null)})})}},69093,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"default",{enumerable:!0,get:function(){return i}});let r=e.r(43476),l=e.r(71645),o=e.r(67585),u=e.r(52157);function s(e){return{default:e&&"default"in e?e.default:e}}let a={loader:()=>Promise.resolve(s(()=>null)),loading:null,ssr:!0},i=function(e){let t={...a,...e},n=(0,l.lazy)(()=>t.loader().then(s)),i=t.loading;function d(e){let s=i?(0,r.jsx)(i,{isLoading:!0,pastDelay:!0,error:null}):null,a=!t.ssr||!!t.loading,d=a?l.Suspense:l.Fragment,c=t.ssr?(0,r.jsxs)(r.Fragment,{children:["u"<typeof window?(0,r.jsx)(u.PreloadChunks,{moduleIds:t.modules}):null,(0,r.jsx)(n,{...e})]}):(0,r.jsx)(o.BailoutToCSR,{reason:"next/dynamic",children:(0,r.jsx)(n,{...e})});return(0,r.jsx)(d,{...a?{fallback:s}:{},children:c})}return d.displayName="LoadableComponent",d}},70703,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"default",{enumerable:!0,get:function(){return l}});let r=e.r(55682)._(e.r(69093));function l(e,t){let n={};"function"==typeof e&&(n.loader=e);let l={...n,...t};return(0,r.default)({...l,modules:l.loadableGenerated?.modules})}("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},9530,e=>{"use strict";var t=e.i(43476),n=e.i(70703),r=e.i(18566);let l=(0,n.default)(()=>e.A(65615),{loadableGenerated:{modules:[73766]},ssr:!1});e.s(["default",0,function(){let e=(0,r.usePathname)().split("/")[2]||"";return e&&"_"!==e?(0,t.jsx)("div",{className:"w-full h-full",children:(0,t.jsx)(l,{projectId:e})}):null}])},65615,e=>{e.v(t=>Promise.all(["static/chunks/096899sx89oxq.js","static/chunks/0hirada7763yr.js","static/chunks/17oc2l.ekcs8b.css"].map(t=>e.l(t))).then(()=>t(73766)))}]);
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,67585,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"BailoutToCSR",{enumerable:!0,get:function(){return l}});let r=e.r(32061);function l({reason:e,children:t}){if("u"<typeof window)throw Object.defineProperty(new r.BailoutToCSRError(e),"__NEXT_ERROR_CODE",{value:"E394",enumerable:!1,configurable:!0});return t}},9885,(e,t,n)=>{"use strict";function r(e){return e.split("/").map(e=>encodeURIComponent(e)).join("/")}Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"encodeURIPath",{enumerable:!0,get:function(){return r}})},52157,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"PreloadChunks",{enumerable:!0,get:function(){return a}});let r=e.r(43476),l=e.r(74080),o=e.r(63599),u=e.r(9885),s=e.r(43369);function a({moduleIds:e}){if("u">typeof window)return null;let t=o.workAsyncStorage.getStore();if(void 0===t)return null;let n=[];if(t.reactLoadableManifest&&e){let r=t.reactLoadableManifest;for(let t of e){if(!r[t])continue;let e=r[t].files;n.push(...e)}}if(0===n.length)return null;let i=(0,s.getAssetTokenQuery)();return(0,r.jsx)(r.Fragment,{children:n.map(e=>{let n=`${t.assetPrefix}/_next/${(0,u.encodeURIPath)(e)}${i}`;return e.endsWith(".css")?(0,r.jsx)("link",{precedence:"dynamic",href:n,rel:"stylesheet",as:"style",nonce:t.nonce},e):((0,l.preload)(n,{as:"script",fetchPriority:"low",nonce:t.nonce}),null)})})}},69093,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"default",{enumerable:!0,get:function(){return i}});let r=e.r(43476),l=e.r(71645),o=e.r(67585),u=e.r(52157);function s(e){return{default:e&&"default"in e?e.default:e}}let a={loader:()=>Promise.resolve(s(()=>null)),loading:null,ssr:!0},i=function(e){let t={...a,...e},n=(0,l.lazy)(()=>t.loader().then(s)),i=t.loading;function d(e){let s=i?(0,r.jsx)(i,{isLoading:!0,pastDelay:!0,error:null}):null,a=!t.ssr||!!t.loading,d=a?l.Suspense:l.Fragment,c=t.ssr?(0,r.jsxs)(r.Fragment,{children:["u"<typeof window?(0,r.jsx)(u.PreloadChunks,{moduleIds:t.modules}):null,(0,r.jsx)(n,{...e})]}):(0,r.jsx)(o.BailoutToCSR,{reason:"next/dynamic",children:(0,r.jsx)(n,{...e})});return(0,r.jsx)(d,{...a?{fallback:s}:{},children:c})}return d.displayName="LoadableComponent",d}},70703,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"default",{enumerable:!0,get:function(){return l}});let r=e.r(55682)._(e.r(69093));function l(e,t){let n={};"function"==typeof e&&(n.loader=e);let l={...n,...t};return(0,r.default)({...l,modules:l.loadableGenerated?.modules})}("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},9530,e=>{"use strict";var t=e.i(43476),n=e.i(70703),r=e.i(18566);let l=(0,n.default)(()=>e.A(65615),{loadableGenerated:{modules:[73766]},ssr:!1});e.s(["default",0,function(){let e=(0,r.usePathname)().split("/")[2]||"";return e&&"_"!==e?(0,t.jsx)("div",{className:"w-full h-full",children:(0,t.jsx)(l,{projectId:e})}):null}])},65615,e=>{e.v(t=>Promise.all(["static/chunks/096899sx89oxq.js","static/chunks/0ge87xt6a9j~..js","static/chunks/17oc2l.ekcs8b.css"].map(t=>e.l(t))).then(()=>t(73766)))}]);