runcastle 1.0.18 → 1.0.20

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/index.js CHANGED
@@ -1515,6 +1515,9 @@ function markSessionLive(ctx, id, input = {}) {
1515
1515
  function kickoffLineFor(kind, override) {
1516
1516
  return override ?? KICKOFF_LINES[kind];
1517
1517
  }
1518
+ function resumeKickoffLine(kind) {
1519
+ return RESUME_KICKOFF_PREFIX + KICKOFF_LINES[kind];
1520
+ }
1518
1521
  function setKickoffOverride(sessionId, line) {
1519
1522
  pendingKickoffOverrides.set(sessionId, line);
1520
1523
  }
@@ -1563,15 +1566,15 @@ function markSessionEnded(ctx, id) {
1563
1566
  ctx.db.update(sessions).set({ status: "ended" }).where(eq4(sessions.id, id)).run();
1564
1567
  return getSessionRow(ctx, id);
1565
1568
  }
1566
- function mostRecentResumableSession(ctx, featureId) {
1567
- const row = ctx.db.select().from(sessions).where(and4(eq4(sessions.featureId, featureId), eq4(sessions.status, "ended"), isNotNull(sessions.ccSessionId))).orderBy(desc2(sql2`rowid`)).limit(1).get();
1569
+ function mostRecentResumableSession(ctx, featureId, kind) {
1570
+ const row = ctx.db.select().from(sessions).where(and4(eq4(sessions.featureId, featureId), eq4(sessions.status, "ended"), isNotNull(sessions.ccSessionId), ...kind ? [eq4(sessions.kind, kind)] : [])).orderBy(desc2(sql2`rowid`)).limit(1).get();
1568
1571
  return row ? rowToSession(row) : null;
1569
1572
  }
1570
1573
  function mostRecentLiveSession(ctx) {
1571
1574
  const row = ctx.db.select().from(sessions).where(eq4(sessions.status, "live")).orderBy(desc2(sql2`rowid`)).limit(1).get();
1572
1575
  return row ? rowToSession(row) : null;
1573
1576
  }
1574
- var KICKOFF_DELAY_MS = 1500, KICKOFF_SUBMIT_DELAY_MS = 350, CONVERGE_KICKOFF_LINE, KICKOFF_LINES, pendingKickoffOverrides;
1577
+ var KICKOFF_DELAY_MS = 1500, KICKOFF_SUBMIT_DELAY_MS = 350, CONVERGE_KICKOFF_LINE, KICKOFF_LINES, RESUME_KICKOFF_PREFIX, pendingKickoffOverrides;
1575
1578
  var init_sessions = __esm(() => {
1576
1579
  init_src();
1577
1580
  init_schema();
@@ -1587,6 +1590,7 @@ var init_sessions = __esm(() => {
1587
1590
  converge: CONVERGE_KICKOFF_LINE,
1588
1591
  revisit: "Proceed with your task: invoke the /runcastle:revisit skill and work through what the " + "human brings up."
1589
1592
  };
1593
+ RESUME_KICKOFF_PREFIX = "We are picking this conversation back up \u2014 runcastle restarted and closed the terminal, " + "but this conversation is intact. Do NOT start over: tell me in one or two lines where we " + "left off and what is next, then carry on. Your original instruction was: ";
1590
1594
  pendingKickoffOverrides = new Map;
1591
1595
  });
1592
1596
 
@@ -5123,8 +5127,6 @@ async function launchSession(ctx, input, opts = {}) {
5123
5127
  kind: input.kind,
5124
5128
  worktreePath
5125
5129
  });
5126
- if (input.kickoffLine)
5127
- setKickoffOverride(session.id, input.kickoffLine);
5128
5130
  let waypoint;
5129
5131
  let resumeSessionId;
5130
5132
  let resumeUnavailableFrom;
@@ -5157,11 +5159,24 @@ async function launchSession(ctx, input, opts = {}) {
5157
5159
  resumeUnavailableFrom = "revisit";
5158
5160
  }
5159
5161
  }
5162
+ if (input.kind !== "waypoint" && input.kind !== "revisit") {
5163
+ resumeSessionId = mostRecentResumableSession(ctx, feature.id, input.kind)?.ccSessionId;
5164
+ }
5165
+ const kickoffLine = input.kickoffLine ?? (resumeSessionId ? resumeKickoffLine(input.kind) : undefined);
5166
+ if (kickoffLine)
5167
+ setKickoffOverride(session.id, kickoffLine);
5160
5168
  emit(ctx, feature.id, {
5161
5169
  type: "session.launching",
5162
5170
  message: `launching ${input.kind} session`,
5163
5171
  data: { sessionId: session.id, kind: input.kind, worktreePath, waypointId: waypoint?.id }
5164
5172
  });
5173
+ if (resumeSessionId) {
5174
+ emit(ctx, feature.id, {
5175
+ type: "session.resumed",
5176
+ message: `resuming the previous ${input.kind} conversation`,
5177
+ data: { sessionId: session.id, kind: input.kind, resumeSessionId }
5178
+ });
5179
+ }
5165
5180
  if (input.kind === "revisit" && resumeUnavailableFrom) {
5166
5181
  emit(ctx, feature.id, {
5167
5182
  type: "session.resume_unavailable",
@@ -5430,9 +5445,143 @@ var init_feature = __esm(() => {
5430
5445
  });
5431
5446
  });
5432
5447
 
5448
+ // src/services/fsbrowse.ts
5449
+ import { existsSync as existsSync14, readdirSync as readdirSync5, statSync as statSync2 } from "fs";
5450
+ import { homedir as homedir2 } from "os";
5451
+ import { basename, dirname as dirname6, isAbsolute, join as join14, resolve as resolve8, sep as sep3 } from "path";
5452
+ function expandPath(input, home = homedir2()) {
5453
+ const trimmed = input.trim();
5454
+ if (trimmed === "")
5455
+ return trimmed;
5456
+ let out = trimmed;
5457
+ if (out === "~")
5458
+ out = home;
5459
+ else if (out.startsWith("~/") || out.startsWith("~\\"))
5460
+ out = join14(home, out.slice(2));
5461
+ return resolve8(out);
5462
+ }
5463
+ function looksLikeRepo(dir) {
5464
+ try {
5465
+ return existsSync14(join14(dir, ".git"));
5466
+ } catch {
5467
+ return false;
5468
+ }
5469
+ }
5470
+ function listRoots(home = homedir2()) {
5471
+ const roots = [];
5472
+ if (process.platform === "win32") {
5473
+ for (let code = 67;code <= 90; code++) {
5474
+ const drive = `${String.fromCharCode(code)}:${sep3}`;
5475
+ try {
5476
+ if (existsSync14(drive))
5477
+ roots.push({ label: drive.replace(/\\$/, ""), path: drive, kind: "drive" });
5478
+ } catch {}
5479
+ }
5480
+ } else {
5481
+ roots.push({ label: "/", path: "/", kind: "drive" });
5482
+ }
5483
+ if (existsSync14(home))
5484
+ roots.push({ label: "Home", path: home, kind: "home" });
5485
+ const seen = new Set(roots.map(pathKey));
5486
+ for (const name of COMMON_DIRS) {
5487
+ const candidate = join14(home, name);
5488
+ const key = pathKey({ path: candidate });
5489
+ if (seen.has(key) || !existsSync14(candidate))
5490
+ continue;
5491
+ seen.add(key);
5492
+ roots.push({ label: name, path: candidate, kind: "common" });
5493
+ }
5494
+ return roots;
5495
+ }
5496
+ function pathKey(r) {
5497
+ return process.platform === "win32" ? r.path.toLowerCase() : r.path;
5498
+ }
5499
+ function crumbsFor(dir) {
5500
+ const out = [];
5501
+ let cur = dir;
5502
+ for (;; ) {
5503
+ out.unshift({ name: basename(cur) || cur, path: cur });
5504
+ const parent = dirname6(cur);
5505
+ if (parent === cur)
5506
+ break;
5507
+ cur = parent;
5508
+ }
5509
+ return out;
5510
+ }
5511
+ function parentOf(dir) {
5512
+ const parent = dirname6(dir);
5513
+ return parent === dir ? null : parent;
5514
+ }
5515
+ function browseDir(input, showHidden = false, home = homedir2()) {
5516
+ const target = input && input.trim() !== "" ? expandPath(input, home) : home;
5517
+ if (!isAbsolute(target)) {
5518
+ throw new InvalidInputError(`path is not absolute: ${target}`);
5519
+ }
5520
+ if (!existsSync14(target)) {
5521
+ throw new InvalidInputError(`path does not exist: ${target}`);
5522
+ }
5523
+ let dir = target;
5524
+ try {
5525
+ if (!statSync2(target).isDirectory())
5526
+ dir = dirname6(target);
5527
+ } catch (e) {
5528
+ throw new InvalidInputError(`cannot read path: ${target} (${errMsg2(e)})`);
5529
+ }
5530
+ let dirents;
5531
+ try {
5532
+ dirents = readdirSync5(dir, { withFileTypes: true, encoding: "utf8" });
5533
+ } catch (e) {
5534
+ throw new InvalidInputError(`cannot read directory: ${dir} (${errMsg2(e)})`);
5535
+ }
5536
+ const entries = [];
5537
+ let truncated = false;
5538
+ for (const dirent of dirents) {
5539
+ if (entries.length >= MAX_ENTRIES) {
5540
+ truncated = true;
5541
+ break;
5542
+ }
5543
+ const name = dirent.name;
5544
+ if (SKIP_ALWAYS.has(name))
5545
+ continue;
5546
+ if (!showHidden && name.startsWith("."))
5547
+ continue;
5548
+ const path = join14(dir, name);
5549
+ const isSymlink = dirent.isSymbolicLink();
5550
+ let isDirectory = dirent.isDirectory();
5551
+ if (isSymlink) {
5552
+ try {
5553
+ isDirectory = statSync2(path).isDirectory();
5554
+ } catch {
5555
+ continue;
5556
+ }
5557
+ }
5558
+ if (!isDirectory)
5559
+ continue;
5560
+ entries.push({ name, path, isRepo: looksLikeRepo(path), isSymlink });
5561
+ }
5562
+ entries.sort((a, b) => a.name.localeCompare(b.name, undefined, { sensitivity: "base" }));
5563
+ return {
5564
+ dir,
5565
+ parent: parentOf(dir),
5566
+ crumbs: crumbsFor(dir),
5567
+ entries,
5568
+ isRepo: looksLikeRepo(dir),
5569
+ truncated
5570
+ };
5571
+ }
5572
+ function errMsg2(e) {
5573
+ return e instanceof Error ? e.message : String(e);
5574
+ }
5575
+ var SKIP_ALWAYS, MAX_ENTRIES = 1000, COMMON_DIRS;
5576
+ var init_fsbrowse = __esm(() => {
5577
+ init_errors();
5578
+ SKIP_ALWAYS = new Set(["node_modules", "$RECYCLE.BIN", "System Volume Information"]);
5579
+ COMMON_DIRS = ["Projects", "projects", "code", "Code", "src", "dev", "repos", "git"];
5580
+ });
5581
+
5433
5582
  // src/services/projects.ts
5434
- import { existsSync as existsSync14 } from "fs";
5435
- import { basename, join as join14 } from "path";
5583
+ import { existsSync as existsSync15 } from "fs";
5584
+ import { basename as basename2, join as join15 } from "path";
5436
5585
  import { eq as eq9, isNull } from "drizzle-orm";
5437
5586
  function listProjects(ctx) {
5438
5587
  return ctx.db.select().from(projects).where(isNull(projects.closedAt)).all().map(rowToProject);
@@ -5448,14 +5597,15 @@ function warnIfTranslatedMount(ctx, projectId, repoPath) {
5448
5597
  message: `${repoPath} is a Windows drive mounted into Linux (/mnt) \u2014 git and burns pay a per-file translation tax here; clone the repo into the Linux filesystem (e.g. ~/projects) for native speed`
5449
5598
  });
5450
5599
  }
5451
- async function openProject(ctx, repoPath) {
5600
+ async function openProject(ctx, rawPath) {
5601
+ const repoPath = expandPath(rawPath);
5452
5602
  await assertRepoTolerant(ctx, repoPath);
5453
5603
  const mainBranch = await detectMainBranchTolerant(ctx, repoPath);
5454
- const name = basename(repoPath) || repoPath;
5455
- const existing = getProjectByRepoPath(ctx, repoPath);
5604
+ const name = basename2(repoPath) || repoPath;
5605
+ const existing = getProjectByRepoPath(ctx, repoPath) ?? findProjectByCanonPath(ctx, repoPath);
5456
5606
  if (existing) {
5457
- ctx.db.update(projects).set({ mainBranch, closedAt: null }).where(eq9(projects.id, existing.id)).run();
5458
- const reopened = { ...existing, mainBranch };
5607
+ ctx.db.update(projects).set({ mainBranch, repoPath, closedAt: null }).where(eq9(projects.id, existing.id)).run();
5608
+ const reopened = { ...existing, mainBranch, repoPath };
5459
5609
  emitProject(ctx, existing.id, {
5460
5610
  type: "project.opened",
5461
5611
  message: `project ${existing.name} re-opened at ${repoPath} (${mainBranch})`
@@ -5502,13 +5652,17 @@ function renameProject(ctx, projectId, name) {
5502
5652
  });
5503
5653
  return { ...project, name };
5504
5654
  }
5655
+ function findProjectByCanonPath(ctx, repoPath) {
5656
+ const key = canon(repoPath);
5657
+ return allProjects(ctx).find((p) => canon(p.repoPath) === key) ?? null;
5658
+ }
5505
5659
  async function assertRepoTolerant(ctx, repoPath) {
5506
5660
  try {
5507
5661
  await assertRepo(repoPath);
5508
5662
  } catch (e) {
5509
5663
  if (!isNotImplemented(e))
5510
5664
  throw e;
5511
- if (!existsSync14(join14(repoPath, ".git"))) {
5665
+ if (!existsSync15(join15(repoPath, ".git"))) {
5512
5666
  throw new InvalidInputError(`not a git repository: ${repoPath}`);
5513
5667
  }
5514
5668
  }
@@ -5527,6 +5681,7 @@ var init_projects = __esm(() => {
5527
5681
  init_schema();
5528
5682
  init_errors();
5529
5683
  init_events();
5684
+ init_fsbrowse();
5530
5685
  init_git();
5531
5686
  init_repo();
5532
5687
  });
@@ -5535,12 +5690,15 @@ var init_projects = __esm(() => {
5535
5690
  import * as z7 from "zod";
5536
5691
  var projectRouter;
5537
5692
  var init_project = __esm(() => {
5693
+ init_fsbrowse();
5538
5694
  init_git();
5539
5695
  init_projects();
5540
5696
  init_repo();
5541
5697
  init_context();
5542
5698
  projectRouter = router({
5543
5699
  list: publicProcedure.query(({ ctx }) => listProjects(ctx)),
5700
+ roots: publicProcedure.query(() => listRoots()),
5701
+ browse: publicProcedure.input(z7.object({ dir: z7.string().optional(), showHidden: z7.boolean().optional() }).optional()).query(({ input }) => browseDir(input?.dir, input?.showHidden ?? false)),
5544
5702
  branches: publicProcedure.input(z7.object({ projectId: z7.string() })).query(({ ctx, input }) => listBranches(requireProjectById(ctx, input.projectId))),
5545
5703
  open: publicProcedure.input(z7.object({ repoPath: z7.string().min(1) })).mutation(({ ctx, input }) => openProject(ctx, input.repoPath)),
5546
5704
  close: publicProcedure.input(z7.object({ projectId: z7.string() })).mutation(({ ctx, input }) => closeProject(ctx, input.projectId)),
@@ -5567,12 +5725,12 @@ var init_run = __esm(() => {
5567
5725
  });
5568
5726
 
5569
5727
  // src/services/settings.ts
5570
- import { existsSync as existsSync15, mkdirSync as mkdirSync7, readFileSync as readFileSync6, writeFileSync as writeFileSync3 } from "fs";
5571
- import { dirname as dirname6 } from "path";
5728
+ import { existsSync as existsSync16, mkdirSync as mkdirSync7, readFileSync as readFileSync6, writeFileSync as writeFileSync3 } from "fs";
5729
+ import { dirname as dirname7 } from "path";
5572
5730
  import * as z9 from "zod";
5573
5731
  import { eq as eq10 } from "drizzle-orm";
5574
5732
  function readRawConfig(configFile) {
5575
- if (!existsSync15(configFile))
5733
+ if (!existsSync16(configFile))
5576
5734
  return {};
5577
5735
  try {
5578
5736
  const parsed = JSON.parse(readFileSync6(configFile, "utf8"));
@@ -5694,7 +5852,7 @@ function updateSettings(ctx, input, io = {}) {
5694
5852
  function writeGlobal(configFile, configKey, value) {
5695
5853
  const raw = readRawConfig(configFile);
5696
5854
  raw[configKey] = value;
5697
- mkdirSync7(dirname6(configFile), { recursive: true });
5855
+ mkdirSync7(dirname7(configFile), { recursive: true });
5698
5856
  writeFileSync3(configFile, `${JSON.stringify(raw, null, 2)}
5699
5857
  `);
5700
5858
  }
@@ -5733,7 +5891,7 @@ function writeStepModel(configFile, step, value) {
5733
5891
  else
5734
5892
  stepModels[step] = value;
5735
5893
  raw.stepModels = stepModels;
5736
- mkdirSync7(dirname6(configFile), { recursive: true });
5894
+ mkdirSync7(dirname7(configFile), { recursive: true });
5737
5895
  writeFileSync3(configFile, `${JSON.stringify(raw, null, 2)}
5738
5896
  `);
5739
5897
  }
@@ -6015,7 +6173,7 @@ var init_doctor = __esm(() => {
6015
6173
  // src/doctor/system-exec.ts
6016
6174
  import { spawn as spawn2 } from "child_process";
6017
6175
  function createSystemExec(opts = {}) {
6018
- return (command, args) => new Promise((resolve8) => {
6176
+ return (command, args) => new Promise((resolve9) => {
6019
6177
  const resolved = resolveExecutable(command);
6020
6178
  const isShim = /\.(cmd|bat)$/i.test(resolved);
6021
6179
  const file = isShim ? process.env.ComSpec ?? "cmd.exe" : resolved;
@@ -6030,10 +6188,10 @@ function createSystemExec(opts = {}) {
6030
6188
  stderr += d.toString();
6031
6189
  });
6032
6190
  child.on("error", (err) => {
6033
- resolve8({ ok: false, code: null, stdout, stderr: stderr || String(err) });
6191
+ resolve9({ ok: false, code: null, stdout, stderr: stderr || String(err) });
6034
6192
  });
6035
6193
  child.on("close", (code) => {
6036
- resolve8({ ok: true, code: code ?? 0, stdout, stderr });
6194
+ resolve9({ ok: true, code: code ?? 0, stdout, stderr });
6037
6195
  });
6038
6196
  });
6039
6197
  }
@@ -6042,8 +6200,8 @@ var init_system_exec = __esm(() => {
6042
6200
  });
6043
6201
 
6044
6202
  // src/services/setup.ts
6045
- import { copyFileSync, existsSync as existsSync16, mkdirSync as mkdirSync8, readFileSync as readFileSync7, readdirSync as readdirSync5, writeFileSync as writeFileSync4 } from "fs";
6046
- import { dirname as dirname7, join as join15 } from "path";
6203
+ import { copyFileSync, existsSync as existsSync17, mkdirSync as mkdirSync8, readFileSync as readFileSync7, readdirSync as readdirSync6, writeFileSync as writeFileSync4 } from "fs";
6204
+ import { dirname as dirname8, join as join16 } from "path";
6047
6205
  import { fileURLToPath as fileURLToPath6 } from "url";
6048
6206
  async function writeGitIdentity(exec, identity) {
6049
6207
  const name = identity.name.trim();
@@ -6119,16 +6277,16 @@ async function resolveRuntime(exec, preferred) {
6119
6277
  function resolveSandcastleBin() {
6120
6278
  try {
6121
6279
  const mainUrl = import.meta.resolve("@ai-hero/sandcastle");
6122
- let dir = dirname7(fileURLToPath6(mainUrl));
6280
+ let dir = dirname8(fileURLToPath6(mainUrl));
6123
6281
  for (let hops = 0;hops < 6; hops++) {
6124
- const manifestPath = join15(dir, "package.json");
6125
- if (existsSync16(manifestPath)) {
6282
+ const manifestPath = join16(dir, "package.json");
6283
+ if (existsSync17(manifestPath)) {
6126
6284
  const manifest = JSON.parse(readFileSync7(manifestPath, "utf8"));
6127
6285
  if (manifest.name === "@ai-hero/sandcastle" && manifest.bin?.sandcastle) {
6128
- return join15(dir, manifest.bin.sandcastle);
6286
+ return join16(dir, manifest.bin.sandcastle);
6129
6287
  }
6130
6288
  }
6131
- const parent = dirname7(dir);
6289
+ const parent = dirname8(dir);
6132
6290
  if (parent === dir)
6133
6291
  break;
6134
6292
  dir = parent;
@@ -6153,12 +6311,12 @@ function sandcastleTemplateDir() {
6153
6311
  return resolveAsset(ASSET_ENV.sandcastleTemplate, fileURLToPath6(new URL("../assets/sandcastle", import.meta.url)));
6154
6312
  }
6155
6313
  function scaffoldSandcastleConfig(templateDir, targetDir) {
6156
- const dir = join15(targetDir, ".sandcastle");
6157
- if (existsSync16(dir))
6314
+ const dir = join16(targetDir, ".sandcastle");
6315
+ if (existsSync17(dir))
6158
6316
  return { scaffolded: false, dir };
6159
6317
  mkdirSync8(dir, { recursive: true });
6160
- for (const name of readdirSync5(templateDir)) {
6161
- copyFileSync(join15(templateDir, name), join15(dir, name));
6318
+ for (const name of readdirSync6(templateDir)) {
6319
+ copyFileSync(join16(templateDir, name), join16(dir, name));
6162
6320
  }
6163
6321
  return { scaffolded: true, dir };
6164
6322
  }
@@ -6183,9 +6341,9 @@ function createTokenVerifier(exec) {
6183
6341
  function fileAfkTokenIo(exec) {
6184
6342
  const path = envPath();
6185
6343
  return {
6186
- read: () => existsSync16(path) ? readFileSync7(path, "utf8") : "",
6344
+ read: () => existsSync17(path) ? readFileSync7(path, "utf8") : "",
6187
6345
  write: (content) => {
6188
- mkdirSync8(dirname7(path), { recursive: true });
6346
+ mkdirSync8(dirname8(path), { recursive: true });
6189
6347
  writeFileSync4(path, content, "utf8");
6190
6348
  },
6191
6349
  verify: createTokenVerifier(exec)
@@ -6322,13 +6480,13 @@ var init_update_check = __esm(() => {
6322
6480
 
6323
6481
  // src/version.ts
6324
6482
  import { readFileSync as readFileSync8 } from "fs";
6325
- import { dirname as dirname8, join as join16 } from "path";
6483
+ import { dirname as dirname9, join as join17 } from "path";
6326
6484
  import { fileURLToPath as fileURLToPath7 } from "url";
6327
6485
  function runcastleVersion() {
6328
6486
  if (cached2)
6329
6487
  return cached2;
6330
- const here = dirname8(fileURLToPath7(import.meta.url));
6331
- for (const pkgPath of [join16(here, "..", "package.json"), join16(here, "package.json")]) {
6488
+ const here = dirname9(fileURLToPath7(import.meta.url));
6489
+ for (const pkgPath of [join17(here, "..", "package.json"), join17(here, "package.json")]) {
6332
6490
  try {
6333
6491
  const pkg = JSON.parse(readFileSync8(pkgPath, "utf8"));
6334
6492
  if (typeof pkg.version === "string") {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "runcastle",
3
- "version": "1.0.18",
3
+ "version": "1.0.20",
4
4
  "description": "Burn tickets into shipped features with Claude Code.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -0,0 +1 @@
1
+ .xterm{cursor:text;-webkit-user-select:none;user-select:none;position:relative}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{z-index:5;position:absolute;top:0}.xterm .xterm-helper-textarea{opacity:0;z-index:-5;white-space:nowrap;resize:none;border:0;width:0;height:0;margin:0;padding:0;position:absolute;top:0;left:-9999em;overflow:hidden}.xterm .composition-view{color:#fff;white-space:nowrap;z-index:1;background:#000;display:none;position:absolute}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{cursor:default;background-color:#000;position:absolute;inset:0;overflow-y:scroll}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;top:0;left:0}.xterm-char-measure-element{visibility:hidden;line-height:normal;display:inline-block;position:absolute;top:0;left:-9999em}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility:not(.debug),.xterm .xterm-message{z-index:10;color:#0000;pointer-events:none;position:absolute;inset:0}.xterm .xterm-accessibility-tree:not(.debug) ::selection{color:#0000}.xterm .xterm-accessibility-tree{-webkit-user-select:text;user-select:text;white-space:pre;font-family:monospace}.xterm .xterm-accessibility-tree>div{transform-origin:0;width:fit-content}.xterm .live-region{width:1px;height:1px;position:absolute;left:-9999px;overflow:hidden}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{-webkit-text-decoration:underline double;text-decoration:underline double}.xterm-underline-3{-webkit-text-decoration:underline wavy;text-decoration:underline wavy}.xterm-underline-4{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.xterm-underline-5{-webkit-text-decoration:underline dashed;text-decoration:underline dashed}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:underline overline}.xterm-overline.xterm-underline-2{-webkit-text-decoration:overline double underline;text-decoration:overline double underline}.xterm-overline.xterm-underline-3{-webkit-text-decoration:overline wavy underline;text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{-webkit-text-decoration:overline dotted underline;text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{-webkit-text-decoration:overline dashed underline;text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{z-index:6;position:absolute}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{z-index:8;pointer-events:none;position:absolute;top:0;right:0}.xterm-decoration-top{z-index:2;position:relative}.xterm .xterm-scrollable-element>.scrollbar{cursor:default}.xterm .xterm-scrollable-element>.scrollbar>.scra{cursor:pointer;font-size:11px!important}.xterm .xterm-scrollable-element>.visible{opacity:1;z-index:11;background:0 0;transition:opacity .1s linear}.xterm .xterm-scrollable-element>.invisible{opacity:0;pointer-events:none}.xterm .xterm-scrollable-element>.invisible.fade{transition:opacity .8s linear}.xterm .xterm-scrollable-element>.shadow{display:none;position:absolute}.xterm .xterm-scrollable-element>.shadow.top{width:100%;height:3px;box-shadow:var(--vscode-scrollbar-shadow,#000) 0 6px 6px -6px inset;display:block;top:0;left:3px}.xterm .xterm-scrollable-element>.shadow.left{width:3px;height:100%;box-shadow:var(--vscode-scrollbar-shadow,#000) 6px 0 6px -6px inset;display:block;top:3px;left:0}.xterm .xterm-scrollable-element>.shadow.top-left-corner{width:3px;height:3px;display:block;top:0;left:0}.xterm .xterm-scrollable-element>.shadow.top.left{box-shadow:var(--vscode-scrollbar-shadow,#000) 6px 0 6px -6px inset}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2)format("woff2-variations");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2)format("woff2-variations");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2)format("woff2-variations");unicode-range:U+1F??}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-greek-wght-normal-CkhJZR-_.woff2)format("woff2-variations");unicode-range:U+370-377,U+37A-37F,U+384-38A,U+38C,U+38E-3A1,U+3A3-3FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2)format("woff2-variations");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-latin-wght-normal-Dx4kXJAl.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(data:font/woff2;base64,d09GMgABAAAAAAfsABQAAAAAEAwAAAeCAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhwbHhwoP0hWQVJbBmA/U1RBVIFiJyYAdC9qEQgKhGSEAAsgADCGCAE2AiQDOgQgBYlMB4EUDAcbLQ4onoexrSC/2ZyLAa8p8VHB8/x3Vue+V0hVJalMJg2nx/TCrQXxBeqLjQG7FyM1WEa/X1tEXN7cFz9EJEMmMUz3RihWSSKeQCbcIou0izz/C8v+fq3VfajEa9gDD11CImXS7qL/RJFVzC1qiB6KmKeD6TZdQ6IRGv78dL6uSVVCfgni5mzu7kcgQBgAEAQTQRCoL++STTYybkJxNfQxAAIAGu8OdEB9teW2jh4BpgDqFjAeSEByW3zFP0CBBgNMsMCGEDjgggdhiEAUAeIIED7ABTDUEnkIE9Q9ahFgKttcVhApo4ACB4qobHaccgDfEjFO6aaWUhjMLt2SyIvHKoDqoA4CSUwEIYQCEjhAO9R1G6keDeDZGjNo+AhxOjCEGTr1WeIF3kYBiLAOKvkJSMiKX0VdAyQt3SDJClCkxJCHkCzfqyVTriJZLcolS32JZHUekq2TYNkYtCtjYHMQXSxGjXDz2t/yLWXzDzxz+o3zFwDEaN23F+13pyMdQAEaSKAR9vcGq4A4MTSKCElGW+M7UcY7xqkggITb28ZJhlqc9q2twYKTt0NjixBgYvO9BIihEBLYuOFXQzfIQ7dXGUEEEgFDooBfAzqiQbpJrhiWSuKJCRFKYbHCyJKI2G5GiZbNAvgAu5pc3vwx4G+g3aDkhklABiSz0BICXrYghtYhx/cdJ+44rY2oZ0aMNRFz3VZjb6W33F3gzltqtOCV8tTHSpOeXuItfvr5lCdfzFpqtEitvqdcdGGFd28ZqqC0tPbeChGXgrIlnhSWu/eUso4uKWFLugyDzQJhflY4659+WjQ++6x72WUMv9G8mw6QJl7BVxX5fe/kpUsOvnZwee9uQ0cGXYd0o89XB2748sDSnt8d2VphdOTTgceDVvOds0v9P/s7HPq15aGun/6Vllb56f1dl0t1LejqrNkpdRZsG8TOnM5vkBG5oiVyVGnS8LHps5cfNWJs6qKPfaNSxiQNBUm3cKNWROr0GSur7Za31k1vieq7LH11VF+jXdRIasRKflc7jkobm1Z9te1IyZA0pDkhLR98+H37Zf1c/8at+dB7x+7GfVyTfJMPiYztsnl59Y5l4j+0n1RXlpHnF3Tq7HecmNF/CJodEMAikruxiyJaGLvHOdAfoA+oDvpjBm2b91cHGRZMU9n25xEU0A8fgEEAdKI3Q1iDtc034sug5YVMkE2jsE+BIkwSoQ3gxXMqz9tELp48bd0cFKOKS7xYjEuXBnZP5ia7DyiO/X/YI+PQSbt2uSdqAkWL9nQbV1XB94/+uPfdZz8dnXYFBYrcTl2SIR/ybxJNJPz/Gupb0JaZeens2ekC7EKr8t+Ls/P5VJPYJdHKyqfg2nqU6bhlidzcddQV/7MmecTzJ5VPcKXkNKSEogHjYFx6QZ7rQ+FSe8njaiNuOnXS8H2ScQ619c2mC3VTtauL0rRbXd/CkSOP37FY9Zkjz8+GibYUMOEWF+RdrFS8Ecv1SHOpPUPZGEIpjPvFyU5cXKjd6OXqorTqy9GwRd++HVufPGnVsW+aO3vggKZ18jR9sXaTC1PWTEsVUaK0FkNySbTQDqlm2PfDjZcu4aalnSLKjnOoYQ0nUlqqXcGpPu/4VgV/xU2pAqW4BW3qzhQ8/hFKhV2qE3+BKAtDqBXjfgnVdH4y0wg5tbVNRenNdTWOrenWLcupQdmsbq5b+18piTe/xRdp1xbILxNPJGInm2z6hoB21Lal0i+ePTtd7B45+3XhFJ329evskXm7qurUVREotqSluSo/L29d3qDhI4YOQqWhI4YNvBNfsMHeXKemXrxQfKeuPOGRVayA3JtkJKEgbPp+dXUDluddutRYLFoXGXWX6N3WFaGLbQtRSitVYNacTNSdy7AaG/HSaUEANcBoGXNdcZvZsOqQ1icBDv21/gzAoYPHH/WDW0qNR3QTYKEAEHig6o13NXbND06CQPlRtYjGNnSktRc09k1mAMDvAlDKfQjgy6fssInlfzmNAjKkDxoxHOBLdVRAIVt9j4qo+hA1w9T1aNBNTUOTTNUHLbqokE+UAfJXCIGw/IxCSL5GRUJeR40rL/UxTm4Q08H6MbCs70ObuNyIIXrINHQYInF06UUlevTjbQzTh5upiDMzMMogUtEnjPs/Y7jAHCJeB0GBHh04tC6FiB6ZFB1oArUSIoFoqhzCeAN6lHwm0T4C3VVPWvjpSMXReuWesMEcoqrmgtNBGd2noWeV0hNAz9rFeShNJxHGsPa3HXeKTk8b55hahySYHaYKKFFLpCfN8rsoaJn01CR04Gkc+5k7KVTCmClX8Q10HCrUEkVlSX+XO33oQR9609tJ516H497WSobWs5Up6TLaS10/dessIskgJSLiDlWvHVUywpkQ7hdPZqGyiEF0uVQerVcPamT1A3eKXdyI1vG9OoflrSXihZ1qqGE3nhmAgiIbRCQgPLEPtOM3UQwTLYaYYomNlpA44opnjV6jkD6id80OOrzf6BzmMD6eEa1zKyeYG1fzfEf16V6jw9XYOaar1/b2kP/IYX8oR2mcFvv2GtBV3JXgd437AQAA)format("woff2-variations");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(/assets/jetbrains-mono-cyrillic-wght-normal-D73BlboJ.woff2)format("woff2-variations");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(/assets/jetbrains-mono-greek-wght-normal-Bw9x6K1M.woff2)format("woff2-variations");unicode-range:U+370-377,U+37A-37F,U+384-38A,U+38C,U+38E-3A1,U+3A3-3FF}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(/assets/jetbrains-mono-vietnamese-wght-normal-Bt-aOZkq.woff2)format("woff2-variations");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{--bg:#090b10;--panel:#0e1117;--panel-2:#0b0e14;--panel-3:#12151d;--panel-inset:#07080b;--hairline:#1c2230;--hairline-soft:#151a26;--hairline-strong:#2a3242;--text:#dde3ed;--text-2:#96a0b0;--text-3:#5f6a7a;--text-4:#3a4354;--accent:#7c6cf6;--accent-hi:#a49bff;--accent-2:#8f80f8;--accent-ink:#0d0722;--accent-soft:#161329;--accent-line:#3d3670;--ph-ideation:#8b7cf8;--ph-spec:#8a94a2;--ph-tickets:#d7a94a;--ph-implementation:#f0883e;--ph-review:#58a6ff;--ph-shipped:#3fb950;--danger:#f4594e;--needs:#d7a94a;--ok:#3fb950;--drive:#58a6ff;--mono:"JetBrains Mono Variable", "Cascadia Code", Consolas, ui-monospace, monospace;--sans:"Inter Variable", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;--radius-sm:5px;--radius:7px;--radius-lg:10px;--radius-pill:999px;--control-h:28px;--sidebar-w:252px;--inspector-w:300px;--content-max:1060px;--shadow-menu:0 8px 28px -10px #000000b3, 0 2px 8px -2px #00000080;--shadow-overlay:0 24px 70px -24px #000000d9, 0 8px 24px -12px #0009;--dur-1:.12s;--dur-2:.19s;--dur-3:.32s;--ease:cubic-bezier(.22, .61, .24, 1);--ease-out:cubic-bezier(.16, 1, .3, 1);--ring:0 0 0 2px var(--bg), 0 0 0 4px #7c6cf680}*{box-sizing:border-box}html,body,#root{height:100%;margin:0;padding:0}body{background:var(--bg);color:var(--text);font-family:var(--sans);letter-spacing:.004em;font-feature-settings:"tnum" 1, "cv05" 1;-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;font-size:13px;line-height:1.45;overflow:hidden}button{color:inherit;font-family:inherit}:focus-visible{box-shadow:var(--ring);border-radius:var(--radius-sm);outline:none}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-thumb{background:#1c2230 padding-box padding-box;border:2px solid #0000;border-radius:5px}::-webkit-scrollbar-thumb:hover{background:#2a3242 padding-box padding-box;border:2px solid #0000}::-webkit-scrollbar-track{background:0 0}.empty-state{text-align:center;flex-direction:column;justify-content:center;align-items:center;gap:6px;padding:44px 24px;display:flex}.empty-state.is-compact{padding:26px 20px}.empty-state-icon{width:34px;height:34px;color:var(--text-3);background:var(--panel-3);border:1px solid var(--hairline);border-radius:9px;justify-content:center;align-items:center;margin-bottom:4px;display:flex}.empty-state-title{color:var(--text-2);font-size:13px;font-weight:500}.empty-state-hint{color:var(--text-3);text-wrap:pretty;max-width:42ch;font-size:12px;line-height:1.55}.empty-state-action{margin-top:8px}.mono{font-family:var(--mono);font-size:12.5px}.dim{color:var(--text-3)}.dim-line{color:var(--text-3);font-family:var(--mono);padding:2px 0;font-size:12.5px}.section-title{text-transform:uppercase;letter-spacing:.09em;color:var(--text-3);padding:4px 0;font-size:11px;font-weight:600}.phase-fg-ideation{color:var(--ph-ideation)}.phase-fg-spec{color:var(--ph-spec)}.phase-fg-tickets{color:var(--ph-tickets)}.phase-fg-implementation{color:var(--ph-implementation)}.phase-fg-review{color:var(--ph-review)}.phase-fg-shipped{color:var(--ph-shipped)}.btn{height:var(--control-h);border-radius:var(--radius);border:1px solid var(--hairline);color:var(--text);cursor:pointer;white-space:nowrap;transition:border-color var(--dur-1) var(--ease), background var(--dur-1) var(--ease), color var(--dur-1) var(--ease), transform var(--dur-1) var(--ease), box-shadow var(--dur-2) var(--ease), opacity var(--dur-1);background:0 0;justify-content:center;align-items:center;gap:6px;padding:0 12px;font-size:12.5px;display:inline-flex}.btn:disabled{opacity:.4;cursor:not-allowed}.btn:active:not(:disabled){transform:translateY(.5px)scale(.99)}.btn-ghost:hover:not(:disabled){border-color:var(--hairline-strong);background:var(--panel);color:var(--text)}.btn-solid{background:var(--accent);border-color:var(--accent);color:#fff;font-weight:600}.btn-solid:hover:not(:disabled){background:var(--accent-2);border-color:var(--accent-2);transform:translateY(-1px);box-shadow:0 4px 16px -6px #7c6cf6b3}.btn-solid:active:not(:disabled){box-shadow:none;transform:translateY(0)}.btn-danger{border-color:color-mix(in srgb, var(--danger) 55%, var(--hairline));color:var(--danger)}.btn-danger:hover:not(:disabled){border-color:var(--danger);background:#f4594e1f}.btn-xs{border-radius:var(--radius-sm);height:22px;padding:0 9px;font-size:11.5px}.btn-lg{height:32px;padding:0 16px;font-size:13px}.ghost-link{color:var(--text-2);cursor:pointer;transition:color var(--dur-1) var(--ease);background:0 0;border:none;padding:2px 0;font-size:12.5px}.ghost-link:hover:not(:disabled){color:var(--accent-hi)}.ghost-link:disabled{opacity:.4;cursor:not-allowed}.chip{border-radius:var(--radius-pill);border:1px solid var(--hairline);height:19px;font-family:var(--mono);color:var(--text-2);white-space:nowrap;align-items:center;gap:5px;padding:0 8px;font-size:10.5px;display:inline-flex}.chip-neutral{color:var(--text-2)}.chip-blocked{color:var(--needs);border-color:color-mix(in srgb, var(--needs) 40%, transparent)}.chip-ticket-pending{color:var(--text-3)}.chip-ticket-burning{color:var(--ph-implementation);border-color:color-mix(in srgb, var(--ph-implementation) 45%, transparent);background:color-mix(in srgb, var(--ph-implementation) 8%, transparent);animation:1.5s ease-in-out infinite pulse}.chip-ticket-done{color:var(--ok);border-color:color-mix(in srgb, var(--ok) 40%, transparent)}.chip-ticket-failed{color:var(--danger);border-color:color-mix(in srgb, var(--danger) 45%, transparent)}.chip-ticket-cancelled{color:var(--text-3);text-decoration:line-through}.chip-run-running{color:var(--ph-implementation);border-color:color-mix(in srgb, var(--ph-implementation) 45%, transparent);animation:1.5s ease-in-out infinite pulse}.chip-run-succeeded{color:var(--ok);border-color:color-mix(in srgb, var(--ok) 40%, transparent)}.chip-run-failed{color:var(--danger);border-color:color-mix(in srgb, var(--danger) 45%, transparent)}.chip-run-cancelled{color:var(--text-3)}.tag{font-family:var(--mono);text-transform:lowercase;font-size:12px;font-weight:600}.status-dot{background:var(--text-3);border-radius:50%;flex:none;width:7px;height:7px;display:inline-block}.sess-dot-launching{background:var(--needs);animation:1.3s ease-in-out infinite pulse}.sess-dot-live{background:var(--ok);box-shadow:0 0 0 3px #3fb95029}.sess-dot-ended{background:var(--text-3)}.spinner,.spin-ring{border:1.6px solid var(--ph-implementation);border-top-color:#0000;border-radius:50%;flex:none;width:12px;height:12px;animation:.8s linear infinite spin;display:inline-block}.shell{grid-template-rows:44px 1fr 28px;height:100%;display:grid}.shell-body{grid-template-columns:var(--sidebar-w) 1fr var(--inspector-w);min-height:0;display:grid}.shell.inspector-collapsed .shell-body{grid-template-columns:var(--sidebar-w) 1fr}.titlebar{border-bottom:1px solid var(--hairline);background:var(--panel);align-items:center;gap:9px;padding:0 14px;font-size:13px;display:flex}.tb-logo{flex:none;justify-content:center;align-items:center;display:inline-flex}.tb-app{color:var(--text);letter-spacing:.02em;font-weight:600}.wordmark{font-family:var(--mono);letter-spacing:-.25px;white-space:nowrap;font-size:13px;font-weight:600;line-height:1}.wordmark.is-lg{letter-spacing:-.5px;font-size:21px}.wordmark-run{color:var(--accent-hi)}.wordmark-castle{color:var(--text)}.tb-home:hover .wordmark-castle{color:var(--accent-hi)}.tb-arrow,.tb-dot{color:var(--text-4)}.tb-project{color:var(--text-2)}.tb-branch{color:var(--text-3);font-family:var(--mono);border-radius:var(--radius-pill);background:var(--panel-inset);border:1px solid var(--hairline-soft);align-items:center;gap:5px;padding:3px 8px;font-size:11.5px;display:inline-flex}.tb-spacer{flex:1}.tb-search{background:var(--panel-inset);border:1px solid var(--hairline);border-radius:var(--radius);height:28px;color:var(--text-3);cursor:pointer;transition:border-color var(--dur-1), color var(--dur-1), background var(--dur-1);align-items:center;gap:8px;min-width:220px;padding:0 8px 0 10px;font-size:12px;display:flex}.tb-search:hover{border-color:var(--hairline-strong);color:var(--text-2);background:var(--panel-3)}.tb-search-spacer{flex:1}.kbd{font-family:var(--mono);border:1px solid var(--hairline-strong);color:var(--text-3);border-radius:4px;padding:1px 5px;font-size:10px;line-height:1.4}.tb-runs{border-radius:var(--radius-pill);border:1px solid color-mix(in srgb, var(--ph-implementation) 30%, transparent);background:color-mix(in srgb, var(--ph-implementation) 9%, transparent);height:24px;color:var(--ph-implementation);font-family:var(--mono);animation:fadeUp var(--dur-3) var(--ease-out);align-items:center;gap:7px;padding:0 10px;font-size:11px;display:inline-flex}.health-dot{background:var(--text-3);width:8px;height:8px;transition:background var(--dur-2);border-radius:50%;display:inline-block}.tb-health.is-ok .health-dot,.sb-health.is-ok .health-dot{background:var(--ok)}.tb-health.is-down .health-dot,.sb-health.is-down .health-dot{background:var(--danger);animation:1s ease-in-out infinite pulse}.tb-icon-btn{border-radius:var(--radius);width:28px;height:28px;color:var(--text-3);cursor:pointer;transition:color var(--dur-1), background var(--dur-1);background:0 0;border:none;justify-content:center;align-items:center;display:inline-flex}.tb-icon-btn:hover{color:var(--text);background:var(--panel-3)}.tb-icon-btn.is-on{color:var(--text-2);background:var(--panel-3)}.sidebar{border-right:1px solid var(--hairline);background:var(--panel-2);flex-direction:column;min-height:0;display:flex}.sidebar-head{border-bottom:1px solid var(--hairline-soft);flex:0 0 40px;justify-content:space-between;align-items:center;height:40px;padding:0 12px;display:flex}.sidebar-head .pane-title{text-transform:uppercase;letter-spacing:.09em;color:var(--text-3);font-size:11px;font-weight:600}.new-btn{border:1px solid var(--accent-line);border-radius:var(--radius);height:23px;color:var(--accent-hi);cursor:pointer;transition:background var(--dur-1), border-color var(--dur-1), transform var(--dur-1);background:0 0;align-items:center;gap:4px;padding:0 9px;font-size:11.5px;font-weight:500;display:inline-flex}.new-btn:hover{background:var(--accent-soft);border-color:var(--accent)}.new-btn:active{transform:scale(.96)}.sidebar-empty{color:var(--text-3);padding:14px 10px;font-size:12px;line-height:1.6}.sidebar-list{flex:1;min-height:0;padding:4px 6px 12px;overflow-y:auto}.triage-group+.triage-group{margin-top:4px}.triage-label{letter-spacing:.09em;text-transform:uppercase;align-items:center;gap:6px;padding:11px 8px 5px;font-size:10px;font-weight:700;display:flex}.triage-count{color:var(--text-4);font-family:var(--mono);font-weight:500}.triage-needsYou .triage-label>.triage-name{color:var(--needs)}.triage-agentWorking .triage-label>.triage-name{color:var(--ph-implementation)}.triage-inProgress .triage-label>.triage-name{color:var(--text-3)}.triage-shipped .triage-label>.triage-name{color:var(--ph-shipped)}.feature-row{border-radius:var(--radius-sm);width:100%;transition:background var(--dur-1) var(--ease);align-items:center;display:flex;position:relative}.feature-row-main{cursor:pointer;text-align:left;background:0 0;border:none;flex:1;align-items:center;gap:8px;min-width:0;min-height:30px;padding:0 4px 0 9px;display:flex}.feature-row:before{content:"";background:var(--accent);transform-origin:50%;width:2px;transition:transform var(--dur-2) var(--ease-out);border-radius:2px;position:absolute;top:6px;bottom:6px;left:1px;transform:scaleY(0)}.feature-row:hover,.feature-row.is-active{background:var(--panel-3)}.feature-row.is-active:before{transform:scaleY(1)}.feature-row.is-active .feature-slug{color:var(--text)}.feature-row.is-dim{opacity:.55}.feature-row.is-dim:hover{opacity:.85}.row-actions{flex:none;padding-right:4px;position:relative}.row-actions-btn{color:var(--text-3);cursor:pointer;border-radius:var(--radius-sm);transition:background var(--dur-1) var(--ease), color var(--dur-1) var(--ease);background:0 0;border:none;padding:2px 5px;font-size:15px;line-height:1}.row-actions-btn:hover{background:var(--panel-3);color:var(--text)}.row-actions-menu{z-index:20;background:var(--panel-2);border:1px solid var(--border);border-radius:var(--radius-sm);flex-direction:column;min-width:128px;padding:4px;display:flex;position:absolute;top:calc(100% - 2px);right:4px;box-shadow:0 6px 20px -8px #0009}.row-actions-item{text-align:left;border-radius:var(--radius-sm);cursor:pointer;color:var(--text-2);transition:background var(--dur-1) var(--ease), color var(--dur-1) var(--ease);background:0 0;border:none;padding:5px 8px;font-size:12.5px}.row-actions-item:hover{background:var(--panel-3);color:var(--text)}.row-actions-item.is-danger{color:var(--danger)}.show-archived-toggle{width:100%;color:var(--text-3);cursor:pointer;text-align:left;border-radius:var(--radius-sm);transition:background var(--dur-1) var(--ease), color var(--dur-1) var(--ease);background:0 0;border:none;margin-top:8px;padding:6px 9px;font-size:11.5px}.show-archived-toggle:hover{background:var(--panel-3);color:var(--text-2)}.feature-dot{opacity:.9;border-radius:3px;flex:none;width:8px;height:8px}.phase-bg-ideation{background:var(--ph-ideation)}.phase-bg-spec{background:var(--ph-spec)}.phase-bg-tickets{background:var(--ph-tickets)}.phase-bg-implementation{background:var(--ph-implementation)}.phase-bg-review{background:var(--ph-review)}.phase-bg-shipped{background:var(--ph-shipped)}.feature-slug{min-width:0;color:var(--text-2);text-overflow:ellipsis;white-space:nowrap;transition:color var(--dur-1);flex:1;font-size:12.5px;overflow:hidden}.feature-flag{flex:none;align-items:center;gap:3px;display:flex}.needs-dot{background:var(--needs);border-radius:50%;width:7px;height:7px}.needs-attention{background:var(--danger)}.needs-grill,.needs-burn,.needs-ship{background:var(--needs)}.mini-check{color:var(--ph-shipped);align-items:center;display:inline-flex}.mini-map{align-items:center;gap:2px;display:flex}.mini-seg{background:var(--text-4);width:6px;height:6px;transition:background var(--dur-2);border-radius:2px}.mini-seg.is-done{background:var(--text-3)}.mini-seg.is-current{background:var(--accent);box-shadow:0 0 0 2px #7c6cf638}.mini-seg.is-skipped{border:1px solid var(--text-4);background:0 0}.sidebar-foot{border-top:1px solid var(--hairline-soft);color:var(--text-4);padding:10px 12px;font-size:11px;line-height:1.5}.nf-form{border:1px solid var(--hairline);border-radius:var(--radius);background:var(--panel);animation:fadeUp var(--dur-2) var(--ease-out);flex-direction:column;gap:8px;margin:6px;padding:10px;display:flex}.workspace{background:var(--bg);flex-direction:column;min-width:0;min-height:0;display:flex;position:relative}.ws-empty{height:100%;color:var(--text-3);flex-direction:column;justify-content:center;align-items:center;gap:12px;display:flex}.ws-empty-logo{opacity:.85;justify-content:center;align-items:center;display:flex}.ws-empty-title{color:var(--text-2);font-size:14px;font-weight:500}.ws-empty-sub{color:var(--text-3);text-align:center;max-width:40ch;font-size:12.5px}.ws-head,.nextstep,.readonly-bar,.ws-banner,.ws-body-inner{width:100%;max-width:calc(var(--content-max) + 56px);margin-left:auto;margin-right:auto;padding-left:28px;padding-right:28px}.ws-head{flex:none;padding-top:18px}.ws-title-row{align-items:center;gap:10px;display:flex}.ws-title{letter-spacing:-.01em;color:var(--text);font-size:17px;font-weight:600}.ws-title-spacer{flex:1}.ws-branch{font-family:var(--mono);color:var(--text-3);cursor:pointer;transition:color var(--dur-1);background:0 0;border:none;align-items:center;gap:5px;font-size:11.5px;display:inline-flex}.ws-branch:hover{color:var(--text)}.pipeline{align-items:center;margin-top:16px;display:flex}.pstep{border-radius:var(--radius-pill);cursor:default;height:26px;color:var(--text-3);transition:background var(--dur-1), color var(--dur-1), border-color var(--dur-1), transform var(--dur-1);background:0 0;border:1px solid #0000;align-items:center;gap:7px;padding:0 10px;font-size:12px;display:inline-flex}.pstep.is-clickable{cursor:pointer}.pstep.is-clickable:hover{background:var(--panel);color:var(--text)}.pstep.is-clickable:active{transform:scale(.97)}.pstep-dot{opacity:.5;width:8px;height:8px;transition:opacity var(--dur-2), box-shadow var(--dur-2);background:currentColor;border-radius:50%;flex:none}.pstep-label{text-transform:lowercase}.pstep.is-done{color:var(--text-2)}.pstep.is-done .pstep-dot{opacity:1}.pstep.is-current{color:var(--text);font-weight:600}.pstep.is-current .pstep-dot{opacity:1;background:var(--accent);animation:2.4s ease-in-out infinite dotGlow;box-shadow:0 0 0 3px #7c6cf633}.pstep.is-upcoming,.pstep.is-skipped{color:var(--text-4)}.pstep.is-skipped .pstep-label{opacity:.7;text-decoration:line-through}.pstep.is-viewed{border-color:var(--hairline);background:var(--panel)}.pstep.is-viewed.is-current{border-color:var(--accent-line)}.pconn{background:var(--hairline);width:16px;height:1px;transition:background var(--dur-2);flex:none}.pconn.is-done{background:var(--text-4)}.nextstep{border:1px solid var(--hairline);background:var(--panel);border-radius:var(--radius-lg);animation:fadeUp var(--dur-3) var(--ease-out);align-items:center;gap:14px;margin-top:14px;padding:13px 16px;display:flex}.nextstep-spin{flex:none}.nextstep-main{flex:1;min-width:0}.nextstep-kick{letter-spacing:.1em;color:var(--accent-hi);font-size:10px;font-weight:700}.nextstep-kick.is-progress{color:var(--ph-implementation)}.nextstep-kick.is-shipped{color:var(--ph-shipped)}.nextstep-kick.is-waiting{color:var(--text-3)}.nextstep-title{color:var(--text);margin-top:2px;font-size:13.5px;font-weight:600}.nextstep-desc{color:var(--text-2);text-wrap:pretty;margin-top:2px;font-size:12px;line-height:1.5}.nextstep-actions{flex:none;align-items:center;gap:8px;display:flex}.readonly-bar{border:1px dashed var(--hairline-strong);border-radius:var(--radius);background:var(--panel-2);color:var(--text-2);animation:fadeUp var(--dur-2) var(--ease-out);align-items:center;gap:10px;margin-top:12px;padding:8px 14px;font-size:12px;display:flex}.readonly-tag{font-family:var(--mono);letter-spacing:.06em;color:var(--text-3);border:1px solid var(--hairline);border-radius:4px;padding:1px 6px;font-size:10px}.readonly-back{color:var(--accent-hi);cursor:pointer;background:0 0;border:none;margin-left:auto;font-size:12px}.readonly-back:hover{color:var(--accent-2)}.ws-banner{border:1px solid color-mix(in srgb, var(--danger) 55%, var(--hairline));border-radius:var(--radius);background:color-mix(in srgb, var(--danger) 8%, var(--panel-2));color:var(--danger);cursor:pointer;animation:fadeUp var(--dur-2) var(--ease-out);align-items:center;gap:10px;margin-top:10px;padding:8px 14px;font-size:12.5px;display:flex}.ws-banner.is-offline{cursor:default;border-color:color-mix(in srgb, var(--warn,#d9a441) 45%, var(--hairline));background:color-mix(in srgb, var(--warn,#d9a441) 7%, var(--panel-2));color:var(--warn,#d9a441)}.ws-banner.is-offline .ws-banner-tag{border-color:color-mix(in srgb, var(--warn,#d9a441) 40%, var(--hairline))}.ws-banner-tag{font-family:var(--mono);letter-spacing:.06em;border:1px solid color-mix(in srgb, var(--danger) 45%, var(--hairline));border-radius:4px;flex-shrink:0;padding:1px 6px;font-size:10px}.ws-body{flex:1;min-height:0;padding:18px 0 32px;overflow-y:auto}.ws-body-inner{animation:bodyIn var(--dur-3) var(--ease-out)}.body-title{align-items:baseline;gap:10px;margin-bottom:12px;display:flex}.body-title .section-title{padding:0}.body-hint{color:var(--text-3);text-wrap:pretty;font-size:12px}.body-meta{font-family:var(--mono);color:var(--text-2);font-size:11.5px}.surface{border:1px solid var(--hairline);border-radius:var(--radius-lg);background:var(--panel-2);overflow:hidden}.grill{max-width:none}.grill-panel{border:1px solid var(--hairline);border-radius:var(--radius-lg);background:var(--panel-2);flex-direction:column;display:flex;overflow:hidden}.grill-strip{background:var(--panel);border-bottom:1px solid var(--hairline-soft);flex:0 0 34px;align-items:center;gap:10px;height:34px;padding:0 12px;display:flex}.grill-kind{border-radius:var(--radius-pill);border:1px solid var(--accent-line);background:var(--accent-soft);height:18px;color:var(--accent-hi);font-family:var(--mono);align-items:center;padding:0 8px;font-size:10.5px;display:inline-flex}.grill-sid{font-family:var(--mono);color:var(--text-3);font-size:11px}.grill-strip-spacer{flex:1}.sess-end{color:color-mix(in srgb, var(--danger) 70%, var(--text-2))}.sess-end:hover:not(:disabled){color:var(--danger);border-color:color-mix(in srgb, var(--danger) 55%, var(--hairline))}.grill-term{background:var(--panel-inset);height:clamp(320px,100dvh - 330px,1400px);position:relative}.grill.has-context .grill-term{height:clamp(320px,100dvh - 380px,1400px)}.tickets-session{margin-bottom:18px}.tickets-session .grill-term,.review-session .grill-term{height:clamp(300px,100dvh - 420px,1200px)}.grill-empty{text-align:center;color:var(--text-3);flex-direction:column;align-items:center;gap:10px;padding:40px 24px;display:flex}.grill-live-label{color:var(--text-3);font-size:11.5px}.session-ended-card{border:1px solid var(--hairline);border-radius:var(--radius-lg);background:var(--panel-2);animation:fadeUp var(--dur-2) var(--ease-out);align-items:center;gap:12px;padding:14px 16px;display:flex}.session-ended-dot{background:var(--text-4);border-radius:50%;flex:none;width:8px;height:8px}.session-ended-main{flex:1;min-width:0}.session-ended-title{color:var(--text-2);font-size:13px;font-weight:500}.session-ended-sub{color:var(--text-3);margin-top:1px;font-size:12px}.session-ended-resume{flex:none}.doc-card{border:1px solid var(--hairline);border-radius:var(--radius-lg);background:var(--panel-2);width:100%;color:var(--text-3);cursor:pointer;text-align:left;transition:border-color var(--dur-1), background var(--dur-1);align-items:center;gap:9px;padding:11px 14px;font-size:12.5px;display:flex}.doc-card:hover{border-color:var(--hairline-strong);background:var(--panel-3)}.doc-card:hover .doc-card-open{color:var(--accent-hi)}.doc-card.is-empty{cursor:default}.doc-card.is-empty:hover{border-color:var(--hairline);background:var(--panel-2)}.doc-card-title{color:var(--text);font-weight:500}.doc-card-meta{font-family:var(--mono);color:var(--text-4);font-size:11px}.doc-card-hint{color:var(--text-3);font-size:12px}.doc-card-open{color:var(--text-3);transition:color var(--dur-1);align-items:center;gap:3px;margin-left:auto;font-size:12px;display:inline-flex}.spec-doc{border:1px solid var(--hairline);border-radius:var(--radius-lg);background:var(--panel-2);max-width:780px;padding:22px 26px}.spec-meta{font-family:var(--mono);color:var(--text-3);font-size:11px}.spec-body{font-family:var(--mono);color:var(--text);white-space:pre-wrap;word-break:break-word;margin:10px 0 0;font-size:12.5px;line-height:1.7}.map-panel{max-width:780px;margin-bottom:22px}.map-sections{border:1px solid var(--hairline);border-radius:var(--radius-lg);background:var(--hairline);flex-direction:column;gap:1px;display:flex;overflow:hidden}.map-section{background:var(--panel-2);padding:14px 18px}.map-section-title{font-family:var(--mono);letter-spacing:.06em;text-transform:uppercase;color:var(--accent-hi);margin-bottom:6px;font-size:10.5px}.map-section-body{font-family:var(--mono);color:var(--text);white-space:pre-wrap;word-break:break-word;font-size:12.5px;line-height:1.7}.map-waypoints{margin-top:16px}.map-waypoints:has(.wp-group){border:0;padding:0}.map-waypoints>.dim-line{border:1px dashed var(--hairline);border-radius:var(--radius-lg);text-align:center;padding:18px}.wp-group{margin-bottom:14px}.wp-group-title{font-family:var(--mono);letter-spacing:.06em;text-transform:uppercase;color:var(--text-3);margin-bottom:7px;font-size:10.5px}.wp-group-frontier .wp-group-title{color:var(--accent-hi)}.wp-group-claimed .wp-group-title{color:var(--drive)}details.wp-group-done{border-top:1px solid var(--hairline-soft);padding-top:12px}details.wp-group-done>summary{cursor:pointer;list-style:revert}.wp{border:1px solid var(--hairline);border-radius:var(--radius-sm);background:var(--panel-2);flex-wrap:wrap;align-items:baseline;gap:9px;margin-bottom:6px;padding:9px 12px;display:flex}.wp-frontier{border-color:var(--accent-line)}.wp-blocked{opacity:.55}.wp-claimed{border-color:color-mix(in srgb, var(--drive) 45%, var(--hairline))}.wp-done{opacity:.6}.wp-type{font-family:var(--mono);letter-spacing:.05em;text-transform:uppercase;color:var(--text-2);border:1px solid var(--hairline-strong);border-radius:var(--radius-sm);flex-shrink:0;padding:1px 6px;font-size:10px}.wp-title{color:var(--text);font-size:13px}.wp-blockers,.wp-lineage,.wp-resume,.wp-summary{font-family:var(--mono);color:var(--text-3);font-size:11px}.wp-blockers{color:var(--needs)}.wp-lineage{flex-basis:100%}.wp-resume{color:var(--drive)}.wp-run-note{font-family:var(--mono);color:var(--drive);font-size:11px;font-style:italic}.wp-work{flex-shrink:0;align-self:center;margin-left:auto}.wp-pulse{background:var(--drive);border-radius:50%;flex-shrink:0;width:7px;height:7px;animation:1.4s ease-in-out infinite pulse}.converge-resume{border:1px solid var(--hairline);border-radius:var(--radius);background:var(--panel-2);flex-wrap:wrap;align-items:center;gap:12px;margin-top:14px;padding:10px 14px;display:flex}.converge-resume-text{color:var(--text-2);font-size:12.5px}.converge-bar{border-top:1px solid var(--hairline);flex-direction:column;align-items:flex-start;gap:12px;margin-top:18px;padding-top:16px;display:flex}.converge-fog{font-family:var(--mono);color:var(--needs);align-items:baseline;gap:8px;font-size:11.5px;line-height:1.6;display:flex}.converge-fog-icon{flex-shrink:0}.converge-fog-text{color:color-mix(in srgb, var(--needs) 82%, var(--text))}.converge-btn{min-width:120px}.converge-override{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.converge-blocked{flex-wrap:wrap;align-items:center;gap:12px;display:flex}.ledger{border:1px solid var(--hairline);border-radius:var(--radius-lg);background:var(--panel-2);overflow:hidden}.ledger-row+.ledger-row{border-top:1px solid var(--hairline-soft)}.ledger-head{cursor:pointer;text-align:left;width:100%;transition:background var(--dur-1);background:0 0;border:none;align-items:center;gap:10px;padding:10px 14px;display:flex}.ledger-head:hover{background:var(--panel-3)}.lg-caret{color:var(--text-4);width:12px;transition:transform var(--dur-2) var(--ease);flex:none;align-items:center;display:inline-flex}.ledger-row.is-open .lg-caret{transform:rotate(90deg)}.lg-seq{color:var(--text-3);font-family:var(--mono);flex:none;width:22px;font-size:11.5px}.lg-title{min-width:0;color:var(--text);text-overflow:ellipsis;white-space:nowrap;flex:1;font-size:13px;overflow:hidden}.lg-block{font-family:var(--mono);color:var(--needs);flex:none;font-size:10.5px}.lg-meta{flex:none;align-items:center;gap:8px;display:flex}.lg-commits{color:var(--text-2);font-size:11px}.ledger-detail{background:var(--panel-inset);border-top:1px solid var(--hairline-soft);animation:detailIn var(--dur-2) var(--ease-out);padding:2px 16px 16px 46px;overflow:hidden}.td-section{margin-top:12px}.td-heading{letter-spacing:.07em;text-transform:uppercase;color:var(--text-3);margin-bottom:4px;font-size:10.5px;font-weight:600}.td-body{color:var(--text);white-space:pre-wrap;word-break:break-word;text-wrap:pretty;max-width:640px;line-height:1.55}.td-list{margin:0;padding-left:0;list-style:none}.td-list li{color:var(--text-2);gap:8px;padding:2px 0;line-height:1.5;display:flex}.td-list li:before{content:"—";color:var(--text-4);flex:none}.td-seams{flex-wrap:wrap;gap:6px;display:flex}.seam{font-family:var(--mono);color:var(--text-2);border:1px solid var(--hairline);background:var(--panel-2);border-radius:var(--radius-sm);padding:2px 7px;font-size:11px}.td-commits{flex-wrap:wrap;gap:6px;display:flex}.commit-sha{font-family:var(--mono);color:var(--ph-shipped);border:1px solid var(--hairline);cursor:pointer;transition:border-color var(--dur-1);background:0 0;border-radius:4px;padding:1px 6px;font-size:11px}.commit-sha:hover{border-color:var(--ph-shipped)}.td-error .td-heading{color:var(--danger)}.td-error-body{color:var(--danger);white-space:pre-wrap;word-break:break-word}.td-empty{font-family:var(--mono);color:var(--text-4);font-size:11.5px}.run-split{align-items:stretch;gap:14px;display:flex}.run-lanes-panel{border:1px solid var(--hairline);border-radius:var(--radius-lg);background:var(--panel-2);flex:2;align-self:flex-start;min-width:0;overflow:hidden}.panel-cap{border-bottom:1px solid var(--hairline-soft);letter-spacing:.07em;text-transform:uppercase;color:var(--text-3);padding:8px 12px;font-size:10.5px;font-weight:600}.run-lanes{flex-direction:column;gap:6px;padding:8px;display:flex}.lane{border:1px solid var(--hairline);border-left:2px solid var(--text-4);border-radius:var(--radius-sm);transition:border-color var(--dur-2), background var(--dur-2);padding:8px 10px}.lane.is-clickable{cursor:pointer}.lane.is-clickable:hover{border-color:var(--accent)}.lane.is-selected{background:var(--panel-inset);border-color:var(--accent)}.lane.status-burning{border-left-color:var(--ph-implementation);animation:1.7s ease-in-out infinite pulse}.lane.status-done{border-left-color:var(--ok)}.lane.status-failed{border-left-color:var(--danger)}.lane-head{align-items:center;gap:8px;display:flex}.lane-seq{color:var(--text-3);font-family:var(--mono);flex:none;font-size:11.5px}.lane-title{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;font-size:12.5px;overflow:hidden}.lane-foot{justify-content:space-between;align-items:center;gap:8px;margin-top:6px;display:flex}.lane-commits{flex-wrap:wrap;gap:4px;display:flex}.lane-dur{color:var(--text-3);font-family:var(--mono);font-size:11px}.lane-error{color:var(--danger);font-family:var(--mono);text-overflow:ellipsis;white-space:nowrap;margin-top:5px;font-size:11px;overflow:hidden}.lane-actions{gap:6px;margin-top:6px;display:flex}.lane-btn{border:1px solid var(--hairline);color:var(--text-2);border-radius:var(--radius-pill);cursor:pointer;transition:color var(--dur-1), border-color var(--dur-1);background:0 0;padding:2px 8px;font-size:11px}.lane-btn:hover:not(:disabled){color:var(--text);border-color:var(--accent)}.lane-btn:disabled{opacity:.5;cursor:default}.lane-btn-danger:hover:not(:disabled){color:var(--danger);border-color:var(--danger)}.run-stream-panel{border:1px solid var(--hairline);border-radius:var(--radius-lg);background:var(--panel-inset);flex-direction:column;flex:3;min-width:0;height:clamp(320px,100dvh - 330px,1200px);display:flex;overflow:hidden}.panel-tabs{align-items:center;gap:4px;display:flex}.panel-tab{color:var(--text-3);letter-spacing:.07em;text-transform:uppercase;border-radius:var(--radius-pill);cursor:pointer;transition:color var(--dur-1), background var(--dur-1);background:0 0;border:none;padding:3px 10px;font-size:10.5px;font-weight:600}.panel-tab:hover{color:var(--text)}.panel-tab.is-active{color:var(--text);background:var(--panel-inset)}.panel-tab-ctx{color:var(--accent-hi);font-family:var(--mono);text-transform:none;letter-spacing:0;margin-left:6px}.agent-live-dot{background:var(--ph-implementation);border-radius:50%;width:8px;height:8px;animation:1.7s ease-in-out infinite pulse}.agent-body{font-family:var(--mono);flex:1;padding:12px 16px;font-size:12px;line-height:1.7;overflow-y:auto}.agent-trimmed{color:var(--text-4);text-align:center;padding-bottom:8px;font-size:11px}.agent-turn{animation:lineIn var(--dur-2) var(--ease-out);align-items:flex-start;gap:9px;margin-bottom:10px;display:flex}.agent-turn.is-tool{margin-bottom:6px}.agent-glyph{line-height:inherit;flex:none}.agent-glyph.is-text{color:var(--text-2)}.agent-glyph.is-tool{color:var(--ok)}.agent-prose{min-width:0;color:var(--text);white-space:pre-wrap;word-break:break-word;flex:1}.agent-toolline{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.agent-toolname{color:var(--text);font-weight:600}.agent-toolargs{color:var(--text-3)}.agent-live-row{color:var(--ph-implementation);align-items:center;gap:8px;margin-top:4px;display:flex}.agent-spinner{animation:1.2s linear infinite agentSpin;display:inline-block}.agent-live-label{color:var(--text-3);font-size:11.5px}.agent-cursor{color:var(--text-2);animation:1.1s step-end infinite cursorBlink}@keyframes agentSpin{to{transform:rotate(360deg)}}@keyframes cursorBlink{50%{opacity:0}}.agent-follow{background:var(--panel-2);margin-left:auto;display:block;position:sticky;bottom:6px}.stream-head{border-bottom:1px solid var(--hairline-soft);background:var(--panel-2);justify-content:space-between;align-items:center;padding:8px 12px;display:flex}.follow-pill{border:1px solid var(--accent);color:var(--accent-hi);border-radius:var(--radius-pill);cursor:pointer;animation:fadeUp var(--dur-2) var(--ease-out);background:0 0;padding:1px 10px;font-size:11px}.stream-body{font-family:var(--mono);flex:1;padding:10px 14px;font-size:11.5px;line-height:1.85;overflow-y:auto}.stream-line{animation:lineIn var(--dur-2) var(--ease-out);gap:10px;display:flex}.sl-time{color:var(--text-4);flex:0 0 42px}.sl-type{text-overflow:ellipsis;white-space:nowrap;color:var(--text-2);flex:0 0 118px;overflow:hidden}.sl-msg{min-width:0;color:var(--text-2);text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}.level-error .sl-type{color:var(--danger)}.level-ok .sl-type{color:var(--ok)}.level-active .sl-type{color:var(--ph-implementation)}.level-info .sl-type{color:var(--accent-hi)}.review-grid{grid-template-columns:1fr 1fr;gap:14px;max-width:1000px;display:grid}@media (width<=900px){.review-grid{grid-template-columns:1fr}}.review-card{border:1px solid var(--hairline);border-radius:var(--radius-lg);background:var(--panel-2);padding:14px 16px}.check-row{align-items:center;gap:10px;margin-top:11px;display:flex}.check-dot{border-radius:50%;flex:0 0 7px;width:7px;height:7px}.check-k{font-family:var(--mono);color:var(--text);flex:none;width:92px;font-size:12px}.check-v{font-family:var(--mono);color:var(--text-3);font-size:11.5px}.review-foot{border-top:1px solid var(--hairline-soft);font-family:var(--mono);color:var(--text-2);margin-top:14px;padding-top:12px;font-size:11.5px}.drive-live{align-items:center;gap:9px;margin-top:12px;display:flex}.drive-pulse{background:var(--drive);border-radius:50%;width:8px;height:8px;animation:1.4s ease-in-out infinite pulse}.drive-label{color:var(--drive);font-size:12.5px;font-weight:600}.drive-loc{font-family:var(--mono);color:var(--text-2);font-size:11.5px}.drive-copy{color:var(--text-2);text-wrap:pretty;margin-top:12px;font-size:12.5px;line-height:1.55}.conflict-card{border-color:color-mix(in srgb, var(--danger) 45%, var(--hairline));max-width:1000px}.conflict-files{flex-direction:column;gap:4px;margin:12px 0 0;padding:0;list-style:none;display:flex}.conflict-files li{font-family:var(--mono);color:var(--danger);border-radius:var(--radius-sm);background:color-mix(in srgb, var(--danger) 9%, transparent);padding:3px 8px;font-size:11.5px}.conflict-resolve{margin-top:14px}.review-body{flex-direction:column;gap:14px;display:flex}.drive-pane{border:1px solid var(--hairline);border-radius:var(--radius-lg);background:var(--panel-2);max-width:1000px;overflow:hidden}.drive-pane-strip{background:var(--panel);border-bottom:1px solid var(--hairline-soft);align-items:center;gap:10px;height:38px;padding:0 12px;display:flex}.drive-pane-kind{border-radius:var(--radius-pill);border:1px solid var(--drive-line,var(--accent-line));background:var(--accent-soft);height:18px;color:var(--drive);font-family:var(--mono);align-items:center;padding:0 8px;font-size:10.5px;display:inline-flex}.drive-pane-loc{font-family:var(--mono);color:var(--text-3);font-size:11.5px}.drive-pane-spacer{flex:1}.drive-open{font-family:var(--mono);color:var(--drive);border:1px solid color-mix(in srgb, var(--drive) 40%, var(--hairline));border-radius:var(--radius-pill);background:var(--accent-soft);padding:4px 10px;font-size:11.5px;font-weight:600;text-decoration:none}.drive-open:hover{border-color:var(--drive)}.drive-pane-term{background:var(--bg);height:420px;min-height:260px;position:relative}.drive-pane-empty{color:var(--text-3);padding:20px 16px;font-size:12.5px}.shipped-hero{text-align:center;max-width:560px;animation:fadeUp var(--dur-3) var(--ease-out);margin:36px auto 0}.shipped-check{border:1px solid color-mix(in srgb, var(--ok) 45%, transparent);width:40px;height:40px;color:var(--ok);animation:popIn var(--dur-3) var(--ease-out);border-radius:50%;justify-content:center;align-items:center;margin:0 auto;font-size:17px;display:flex}.shipped-title{margin-top:14px;font-size:16px;font-weight:600}.shipped-meta{font-family:var(--mono);color:var(--text-2);align-items:center;gap:5px;margin-top:6px;font-size:12px;display:inline-flex}.shipped-sub{color:var(--text-3);margin-top:10px;font-size:12.5px;line-height:1.55}.nf-overlay{flex:1;justify-content:center;align-items:center;padding:24px;display:flex}.nf-card{border:1px solid var(--hairline);border-radius:var(--radius-lg);background:var(--panel);width:540px;max-width:100%;animation:popIn var(--dur-3) var(--ease-out);padding:26px 28px}.nf-kick{letter-spacing:.09em;color:var(--accent-hi);font-size:11px;font-weight:700}.nf-h{margin-top:6px;font-size:16px;font-weight:600}.nf-sub{color:var(--text-2);margin-top:5px;font-size:12.5px;line-height:1.55}.nf-input{background:var(--panel-inset);border:1px solid var(--hairline);border-radius:var(--radius);width:100%;height:36px;color:var(--text);transition:border-color var(--dur-1);outline:none;margin-top:18px;padding:0 12px;font-family:inherit;font-size:13px}.nf-input:focus{border-color:var(--accent)}.nf-oneliner{height:32px;margin-top:8px;font-size:12.5px}.size-hint{color:var(--text-3);font-size:12px}.nf-base{flex-wrap:wrap;align-items:center;gap:10px;margin-top:16px;display:flex}.nf-base-label{color:var(--text);font-size:13px}.nf-base-select{background:var(--panel-inset);border:1px solid var(--hairline);border-radius:var(--radius);height:30px;color:var(--text);font-family:var(--mono);cursor:pointer;transition:border-color var(--dur-1);outline:none;padding:0 8px;font-size:11.5px}.nf-base-select:focus{border-color:var(--accent)}.nf-base-select:disabled{opacity:.5;cursor:default}.nf-branch{font-family:var(--mono);color:var(--text-3);margin-top:16px;font-size:11.5px}.nf-actions{justify-content:flex-end;gap:10px;margin-top:22px;display:flex}.nf-advanced{margin-top:16px}.nf-advanced-summary{color:var(--text-2);cursor:pointer;-webkit-user-select:none;user-select:none;width:fit-content;font-size:12.5px}.nf-advanced-summary:hover{color:var(--text)}.nf-advanced[open] .nf-advanced-summary{color:var(--text);margin-bottom:4px}.nf-advanced .nf-base{margin-top:10px}.inspector{border-left:1px solid var(--hairline);background:var(--panel-2);flex-direction:column;min-height:0;display:flex;overflow:hidden}.insp-tabs{border-bottom:1px solid var(--hairline-soft);flex:none;align-items:center;gap:2px;padding:8px 10px 0;display:flex}.insp-tab{color:var(--text-3);cursor:pointer;transition:color var(--dur-1);background:0 0;border:none;border-bottom:2px solid #0000;padding:6px 10px 8px;font-size:12px;font-weight:500}.insp-tab:hover{color:var(--text-2)}.insp-tab.is-active{color:var(--text);border-bottom-color:var(--accent)}.insp-pane{min-height:0;animation:fadeUp var(--dur-2) var(--ease-out);flex-direction:column;flex:1;gap:22px;padding:16px;display:flex;overflow-y:auto}.insp-pane-activity{gap:0;padding:10px 12px}.insp-empty{color:var(--text-3);text-wrap:pretty;font-size:12px;line-height:1.55}.insp-section>.insp-cap{letter-spacing:.09em;text-transform:uppercase;color:var(--text-3);margin-bottom:8px;font-size:10.5px;font-weight:600}.gate-shipped{color:var(--ok);align-items:center;gap:8px;font-size:12.5px;display:flex}.gate-card{border:1px solid var(--hairline);border-radius:var(--radius-lg);background:var(--panel);padding:12px 14px}.gate-override-link{color:var(--text-3);cursor:pointer;transition:color var(--dur-1);background:0 0;border:none;margin-top:10px;padding:0;font-size:11.5px}.gate-override-link:hover{color:var(--accent-hi)}.override-actions{gap:6px;display:flex}.gate-idrow{align-items:center;gap:8px;display:flex}.gate-id{font-family:var(--mono);color:var(--accent-hi);font-size:11px}.gate-name{color:var(--text);font-size:12.5px;font-weight:600}.gate-req{color:var(--text-2);text-wrap:pretty;margin-top:6px;font-size:11.5px;line-height:1.5}.gate-state{align-items:center;gap:8px;margin-top:11px;font-size:12px;display:flex}.gate-state.is-ok{color:var(--ok)}.gate-state.is-block{color:var(--needs)}.gate-state-dot{background:currentColor;border-radius:50%;flex:none;width:7px;height:7px}.gate-hint{color:var(--text-4);margin-top:10px;font-size:11px;line-height:1.5}.gate-empty{border:1px dashed var(--hairline-strong);border-radius:var(--radius);color:var(--text-3);padding:12px 14px;font-size:11.5px}.override-form{flex-direction:column;gap:6px;margin-top:11px;display:flex}.override-input{background:var(--panel-inset);border:1px solid var(--hairline);border-radius:var(--radius-sm);height:26px;color:var(--text);outline:none;padding:0 8px;font-size:12px}.override-input:focus{border-color:var(--accent)}.doc-list{margin:0;padding:0;list-style:none}.doc-link{cursor:pointer;text-align:left;border-radius:var(--radius-sm);width:100%;transition:background var(--dur-1);background:0 0;border:none;align-items:center;gap:8px;margin:0 -8px;padding:7px 8px;display:flex}.doc-link:hover{background:var(--panel-3)}.doc-link-icon{color:var(--text-4);flex:none;display:inline-flex}.doc-title{color:var(--text);text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;font-size:12.5px;overflow:hidden}.doc-meta{color:var(--text-4);flex:none;font-size:11px}.activity-log{flex-direction:column;display:flex}.act-line{border-top:1px solid var(--hairline-soft);gap:10px;padding:8px 4px;display:flex}.act-line:first-child{border-top:none}.act-dot{background:var(--text-4);border-radius:50%;flex:none;width:7px;height:7px;margin-top:5px}.act-dot.is-ok{background:var(--ok)}.act-dot.is-danger{background:var(--danger)}.act-dot.is-accent{background:var(--accent)}.act-body{flex:1;min-width:0}.act-msg{color:var(--text-2);-webkit-line-clamp:2;-webkit-box-orient:vertical;font-size:12px;line-height:1.45;display:-webkit-box;overflow:hidden}.act-sub{align-items:baseline;gap:8px;margin-top:2px;display:flex}.act-type{color:var(--text-4);text-overflow:ellipsis;white-space:nowrap;font-size:10.5px;overflow:hidden}.act-time{color:var(--text-4);flex:none;margin-left:auto;font-size:10.5px}.statusbar{border-top:1px solid var(--hairline);background:var(--panel);color:var(--text-3);align-items:center;gap:16px;padding:0 12px;font-size:11px;display:flex}.sb-item{align-items:center;gap:5px;display:inline-flex}.sb-branch{color:var(--text-3);cursor:pointer;font-family:var(--mono);transition:color var(--dur-1);background:0 0;border:none;align-items:center;gap:5px;padding:0;font-size:11px;display:inline-flex}.sb-branch:hover{color:var(--text)}.sb-driving{color:var(--drive);align-items:center;gap:7px;display:flex}.sb-driving-dot{background:var(--drive);border-radius:50%;width:6px;height:6px;animation:1.4s ease-in-out infinite pulse}.sb-stop{border:1px solid color-mix(in srgb, var(--drive) 40%, transparent);height:16px;color:var(--drive);cursor:pointer;background:0 0;border-radius:4px;padding:0 6px;font-size:10px}.sb-stop:hover:not(:disabled){background:#58a6ff1f}.sb-spacer{flex:1}.sb-notify{color:var(--text-3);cursor:pointer;transition:color var(--dur-1);background:0 0;border:none;align-items:center;gap:5px;padding:0;font-size:11px;display:inline-flex}.sb-notify:hover{color:var(--text)}.sb-notify.is-on{color:var(--ok)}.sb-health{color:var(--ph-shipped);align-items:center;gap:6px;display:inline-flex}.cmdk-backdrop{-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);z-index:300;animation:backdropIn var(--dur-2) var(--ease-out);background:#04060a8c;justify-content:center;align-items:flex-start;padding:12vh 16px 16px;display:flex;position:fixed;inset:0}.cmdk{background:var(--panel);border:1px solid var(--hairline-strong);border-radius:var(--radius-lg);width:100%;max-width:560px;animation:cmdkIn var(--dur-2) var(--ease-out);overflow:hidden;box-shadow:0 24px 60px -20px #000c}.cmdk-input{border:none;border-bottom:1px solid var(--hairline);width:100%;height:46px;color:var(--text);background:0 0;outline:none;padding:0 16px;font-family:inherit;font-size:14px}.cmdk-input::placeholder{color:var(--text-3)}.cmdk-list{max-height:340px;padding:6px;overflow-y:auto}.cmdk-group-label{letter-spacing:.09em;text-transform:uppercase;color:var(--text-4);padding:8px 10px 4px;font-size:10px;font-weight:700}.cmdk-item{border-radius:var(--radius-sm);cursor:pointer;color:var(--text-2);align-items:center;gap:10px;padding:8px 10px;display:flex}.cmdk-item.is-active{background:var(--panel-3);color:var(--text)}.cmdk-item-glyph{width:16px;color:var(--text-3);flex:none;justify-content:center;align-items:center;display:inline-flex}.cmdk-item-label{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;font-size:13px;overflow:hidden}.cmdk-item-slug{font-family:var(--mono);color:var(--text-4);font-size:11px}.cmdk-item-hint{color:var(--text-4);font-size:11px}.cmdk-empty{text-align:center;color:var(--text-3);padding:24px;font-size:13px}.cmdk-foot{border-top:1px solid var(--hairline);color:var(--text-4);align-items:center;gap:14px;padding:8px 14px;font-size:11px;display:flex}.cmdk-foot .kbd{font-size:10px}.peek-backdrop{-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);z-index:200;animation:backdropIn var(--dur-2) var(--ease-out);background:#030508b8;justify-content:center;align-items:flex-start;padding:8vh 16px 16px;display:flex;position:fixed;inset:0}.peek{background:var(--panel);border:1px solid var(--hairline-strong);border-radius:var(--radius-lg);width:100%;max-width:780px;max-height:82vh;animation:cmdkIn var(--dur-2) var(--ease-out);flex-direction:column;display:flex;overflow:hidden}.peek-head{border-bottom:1px solid var(--hairline);justify-content:space-between;align-items:center;padding:10px 14px;display:flex}.peek-path{color:var(--text-2);font-size:12px}.peek-close{color:var(--text-3);cursor:pointer;background:0 0;border:none;font-size:12px}.peek-close:hover{color:var(--text)}.peek-body{padding:14px 18px;overflow:auto}.peek-pre{font-family:var(--mono);white-space:pre-wrap;word-break:break-word;color:var(--text);margin:0;font-size:12.5px;line-height:1.6}.peek.settings{max-width:620px}.settings-title{color:var(--text);font-size:13px;font-weight:600}.settings-body{flex-direction:column;gap:26px;display:flex}.settings-section{flex-direction:column;gap:14px;display:flex}.settings-section-head{border-bottom:1px solid var(--hairline);align-items:baseline;gap:10px;padding-bottom:8px;display:flex}.settings-section-title{letter-spacing:.09em;text-transform:uppercase;color:var(--text-2);margin:0;font-size:11px;font-weight:700}.settings-section-hint{color:var(--text-4);font-size:11.5px}.settings-field{flex-direction:column;gap:5px;display:flex}.settings-field-head{align-items:center;gap:8px;display:flex}.settings-field-label{color:var(--text);font-size:12.5px}.settings-field.is-locked .settings-field-label{color:var(--text-2)}.settings-field-help{color:var(--text-4);font-size:11.5px;line-height:1.4}.settings-badge{letter-spacing:.04em;text-transform:uppercase;border:1px solid var(--hairline-strong);color:var(--text-3);border-radius:999px;padding:1px 6px;font-size:9.5px}.settings-badge.is-warn{color:var(--drive);border-color:color-mix(in srgb, var(--drive) 40%, transparent)}.settings-badge.is-override{color:var(--accent-hi);border-color:var(--accent-line)}.settings-saving{color:var(--text-4);font-size:10.5px;font-style:italic}.settings-input{background:var(--panel-inset);border:1px solid var(--hairline);border-radius:var(--radius);width:100%;height:32px;color:var(--text);transition:border-color var(--dur-1);outline:none;padding:0 10px;font-family:inherit;font-size:12.5px}.settings-input:focus{border-color:var(--accent)}.settings-input:disabled{opacity:.6;cursor:progress}select.settings-input{cursor:pointer}.settings-readonly{background:var(--panel-inset);border:1px dashed var(--hairline);border-radius:var(--radius);min-height:32px;color:var(--text-2);align-items:center;padding:0 10px;font-size:12.5px;display:flex}.settings-field-note{color:var(--text-4);font-size:11px}.settings-clear{color:var(--text-3);cursor:pointer;text-underline-offset:2px;background:0 0;border:none;align-self:flex-start;margin-top:2px;padding:0;font-size:11px;text-decoration:underline}.settings-clear:hover:not(:disabled){color:var(--accent-hi)}.settings-clear:disabled{opacity:.5;cursor:default}.settings-combo{flex-direction:column;gap:6px;display:flex}.settings-advanced-toggle{cursor:pointer;text-align:left;width:100%;color:inherit;background:0 0;border:none;justify-content:space-between;align-items:baseline;gap:8px;padding:0;display:flex}.settings-advanced-toggle:hover .settings-section-title{color:var(--accent-hi)}.settings-advanced-body{border-left:1px solid var(--border-1,var(--text-5,#333));flex-direction:column;gap:14px;margin-top:4px;padding-left:10px;display:flex}.peek.delete-dialog{max-width:460px}.delete-dialog-title{color:var(--danger);font-size:13px;font-weight:600}.delete-dialog-body{flex-direction:column;gap:16px;display:flex}.delete-dialog-lead{color:var(--text-2);margin:0;font-size:12.5px;line-height:1.6}.delete-dialog-lead strong{color:var(--text);font-weight:600}.delete-dialog-field{flex-direction:column;gap:6px;display:flex}.delete-dialog-field>span{color:var(--text-2);font-size:12px}.delete-dialog-field code{border-radius:var(--radius);background:var(--panel-inset);color:var(--text);padding:1px 5px}.delete-dialog-field .settings-input:focus{border-color:var(--danger)}.delete-dialog-actions{justify-content:flex-end;gap:8px;margin-top:2px;display:flex}.terminal-placeholder,.boundary-fallback{background:var(--bg);justify-content:center;align-items:center;height:100%;display:flex}.toasts{z-index:400;flex-direction:column;gap:8px;max-width:380px;display:flex;position:fixed;bottom:34px;right:16px}.toast{border-radius:var(--radius);cursor:pointer;border:1px solid var(--hairline);background:var(--panel);color:var(--text);word-break:break-word;animation:toastIn var(--dur-3) var(--ease-out);padding:9px 13px;font-size:12.5px;box-shadow:0 12px 30px -14px #000c}.toast-error{border-color:color-mix(in srgb, var(--danger) 55%, var(--hairline));color:var(--danger)}.toast-success{border-color:color-mix(in srgb, var(--ok) 50%, var(--hairline));color:var(--ok)}.toast-info{color:var(--text-2)}.update-banner{border-radius:var(--radius-pill);border:1px solid var(--accent-line);background:color-mix(in srgb, var(--accent) 12%, var(--panel));max-width:min(720px,100vw - 32px);color:var(--text);z-index:420;animation:fadeUp var(--dur-3) var(--ease-out);align-items:center;gap:10px;padding:7px 10px 7px 13px;font-size:12.5px;display:flex;position:fixed;top:50px;left:50%;transform:translate(-50%);box-shadow:0 14px 34px -16px #000000d9}.update-banner-dot{background:var(--accent-hi);width:7px;height:7px;animation:dotGlow 2.2s var(--ease) infinite;border-radius:50%;flex:none}.update-banner-text{white-space:nowrap}.update-banner-text strong{color:var(--accent-hi);font-weight:600}.update-banner-sep{color:var(--text-4)}.update-banner-dim{color:var(--text-3)}.update-banner-cmd{font-family:var(--mono);color:var(--accent-hi);background:var(--panel-inset);border:1px solid var(--hairline);border-radius:var(--radius-sm);white-space:nowrap;-webkit-user-select:all;user-select:all;padding:2px 7px;font-size:11.5px}.update-banner-dismiss{width:22px;height:22px;color:var(--text-3);border-radius:var(--radius-sm);cursor:pointer;background:0 0;border:none;flex:none;place-items:center;font-size:16px;line-height:1;display:grid}.update-banner-dismiss:hover{color:var(--text);background:var(--panel-3)}.app-loading{justify-content:center;align-items:center;height:100%;display:flex}.tb-home{cursor:pointer;color:inherit;background:0 0;border:0;align-items:center;gap:9px;padding:0;display:inline-flex}.tb-home:hover .tb-app{color:var(--accent-hi)}.tb-switcher{display:inline-flex;position:relative}.tb-switcher-btn{border-radius:var(--radius);cursor:pointer;height:24px;transition:border-color var(--dur-1), background var(--dur-1);background:0 0;border:1px solid #0000;align-items:center;gap:5px;padding:0 7px;display:inline-flex}.tb-switcher-btn:hover{border-color:var(--hairline);background:var(--panel-3)}.tb-switcher-caret{color:var(--text-4);align-items:center;display:inline-flex}.tb-menu{z-index:40;background:var(--panel);border:1px solid var(--hairline);border-radius:var(--radius-lg);min-width:240px;animation:cmdkIn var(--dur-2) var(--ease-out);padding:5px;position:absolute;top:30px;left:0;box-shadow:0 18px 44px -18px #000000d9}.tb-menu-label{letter-spacing:.08em;text-transform:uppercase;color:var(--text-4);padding:6px 8px 4px;font-size:10px}.tb-menu-item{border-radius:var(--radius);cursor:pointer;width:100%;color:var(--text-2);text-align:left;transition:background var(--dur-1), color var(--dur-1);background:0 0;border:0;align-items:center;gap:8px;padding:7px 8px;display:flex}.tb-menu-item:hover{background:var(--panel-3);color:var(--text)}.tb-menu-item.is-current{color:var(--text)}.tb-menu-name{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;font-size:13px;overflow:hidden}.tb-menu-branch{color:var(--text-4);font-size:11px}.tb-menu-check{color:var(--accent-hi);align-items:center;display:inline-flex}.tb-menu-sep{background:var(--hairline-soft);height:1px;margin:5px 4px}button.tb-runs{cursor:pointer}.home-frame{flex-direction:column;height:100%;display:flex}.home-topbar{border-bottom:1px solid var(--hairline);background:var(--panel);flex:0 0 44px;align-items:center;gap:9px;padding:0 16px;display:flex}.home{min-height:0;animation:fadeUp var(--dur-3) var(--ease-out);flex:1;padding:48px clamp(20px,6vw,72px) 56px;overflow-y:auto}.home-head{max-width:1100px;margin:0 auto 30px}.home-title{align-items:center;gap:11px;display:flex}.home-title-text{letter-spacing:-.01em;font-size:22px;font-weight:600}.home-count{font-family:var(--mono);color:var(--text-3);border:1px solid var(--hairline);border-radius:var(--radius-pill);padding:1px 9px;font-size:12px}.home-sub{color:var(--text-3);max-width:60ch;margin:10px 0 0;font-size:13px}.home-grid{grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:16px;max-width:1100px;margin:0 auto;display:grid}.project-card{border:1px solid var(--hairline);border-radius:var(--radius-lg);background:var(--panel);animation:fadeUp var(--dur-3) var(--ease-out) backwards;transition:border-color var(--dur-2), transform var(--dur-2), box-shadow var(--dur-2);flex-direction:column;display:flex;overflow:hidden}.home-grid>:nth-child(2){animation-delay:40ms}.home-grid>:nth-child(3){animation-delay:80ms}.home-grid>:nth-child(4){animation-delay:.12s}.home-grid>:nth-child(5){animation-delay:.16s}.home-grid>:nth-child(n+6){animation-delay:.2s}.project-card:hover{border-color:var(--hairline-strong);transform:translateY(-2px);box-shadow:0 16px 34px -20px #000c}.pc-main{cursor:pointer;text-align:left;color:inherit;background:0 0;border:0;flex-direction:column;flex:1;gap:5px;padding:16px 16px 14px;display:flex}.pc-head{align-items:center;gap:8px;display:flex}.pc-name{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--text);flex:1;font-size:15px;font-weight:600;overflow:hidden}.pc-rename{background:var(--panel-inset);border:1px solid var(--accent-line);border-radius:var(--radius-sm);min-width:0;height:24px;color:var(--text);flex:1;padding:0 6px;font-size:14px}.pc-health-dot{border-radius:50%;flex:none;width:8px;height:8px}.health-dot-attention{background:var(--needs)}.health-dot-working{background:var(--ph-implementation);animation:1.4s ease-in-out infinite pulse}.health-dot-steady{background:var(--ok)}.health-dot-empty{background:var(--text-4)}.pc-path{color:var(--text-4);text-overflow:ellipsis;white-space:nowrap;font-size:11px;overflow:hidden}.pc-branch{font-family:var(--mono);color:var(--text-3);align-items:center;gap:4px;font-size:11px;display:inline-flex}.pc-stats{gap:16px;margin-top:10px;display:flex}.pc-stat{color:var(--text-3);align-items:baseline;gap:5px;display:inline-flex}.pc-stat .spin-ring{align-self:center}.pc-stat-n{font-family:var(--mono);color:var(--text);font-size:16px}.pc-stat-label{font-size:11px}.pc-stat-run .pc-stat-n{color:var(--ph-implementation)}.pc-stat-needs .pc-stat-n{color:var(--needs)}.pc-health-label{letter-spacing:.06em;text-transform:uppercase;color:var(--text-4);margin-top:12px;font-size:10px}.pc-actions{border-top:1px solid var(--hairline-soft);background:var(--panel-2);opacity:0;transition:opacity var(--dur-2) var(--ease);gap:6px;padding:8px 12px;display:flex}.project-card:hover .pc-actions,.project-card:focus-within .pc-actions{opacity:1}.pc-action{border:1px solid var(--hairline);border-radius:var(--radius);height:24px;color:var(--text-3);cursor:pointer;transition:color var(--dur-1), border-color var(--dur-1);background:0 0;padding:0 10px;font-size:11px}.pc-action:hover:not(:disabled){color:var(--text);border-color:var(--hairline-strong)}.pc-action:disabled{opacity:.4;cursor:not-allowed}.pc-action-danger:hover:not(:disabled){color:var(--danger);border-color:color-mix(in srgb, var(--danger) 45%, var(--hairline))}.open-card{border:1px dashed var(--hairline-strong);border-radius:var(--radius-lg);cursor:pointer;min-height:150px;color:var(--text-3);transition:border-color var(--dur-2), color var(--dur-2), background var(--dur-2);background:0 0;flex-direction:column;justify-content:center;align-items:flex-start;gap:4px;padding:16px;display:flex}.open-card:hover{border-color:var(--accent-line);color:var(--text);background:var(--accent-soft)}.open-card-plus{color:var(--accent-hi);margin-bottom:2px;display:inline-flex}.open-card-label{font-size:14px;font-weight:600}.open-card-sub{color:var(--text-4);font-size:11px}.open-project{height:100%;animation:fadeUp var(--dur-3) var(--ease-out);justify-content:center;align-items:center;padding:24px;display:flex}.op-card{border:1px solid var(--hairline);border-radius:var(--radius-lg);background:var(--panel);flex-direction:column;gap:6px;width:100%;max-width:460px;padding:28px;display:flex;box-shadow:0 24px 60px -30px #000c}.op-logo{background:var(--accent);border-radius:9px;justify-content:center;align-items:center;width:36px;height:36px;margin-bottom:6px;display:flex}.op-kick{letter-spacing:.1em;text-transform:uppercase;color:var(--accent-hi);font-size:10px}.op-h{font-size:19px;font-weight:600}.op-sub{color:var(--text-3);margin-bottom:8px;font-size:13px;line-height:1.5}.op-label{color:var(--text-2);margin-top:4px;font-size:11px}.op-input{background:var(--panel-inset);border:1px solid var(--hairline);border-radius:var(--radius);height:32px;color:var(--text);transition:border-color var(--dur-1);padding:0 10px;font-size:13px}.op-input:focus{border-color:var(--accent-line);outline:none}.op-input-row{align-items:center;gap:6px;display:flex}.op-input-row .op-input{flex:1;min-width:0}.op-hint{color:var(--text-4);font-size:11px}.op-actions{justify-content:flex-end;gap:8px;margin-top:14px;display:flex}.peek.dir-picker{max-width:660px;height:66vh}.dir-picker-title{font-size:13px;font-weight:600}.dir-picker-bar{border-bottom:1px solid var(--hairline);align-items:center;gap:8px;padding:8px 12px;display:flex}.dir-up{min-width:28px;padding:0 8px}.dir-crumbs{white-space:nowrap;scrollbar-width:none;flex:1;align-items:center;gap:2px;min-width:0;font-size:12px;display:flex;overflow-x:auto}.dir-crumbs::-webkit-scrollbar{display:none}.dir-crumb-wrap{color:var(--text-4);align-items:center;gap:2px;display:inline-flex}.dir-crumb{border-radius:var(--radius);color:var(--text-2);font:inherit;cursor:pointer;background:0 0;border:none;padding:2px 4px}.dir-crumb:hover{color:var(--text);background:var(--panel-inset)}.dir-hidden-toggle{color:var(--text-4);cursor:pointer;-webkit-user-select:none;user-select:none;align-items:center;gap:5px;font-size:11px;display:inline-flex}.dir-picker-body{flex:1;min-height:0;display:flex}.dir-rail{border-right:1px solid var(--hairline);flex-direction:column;flex:none;gap:1px;width:140px;padding:8px;display:flex;overflow-y:auto}.dir-rail-item{border-radius:var(--radius);color:var(--text-3);font:inherit;text-align:left;cursor:pointer;background:0 0;border:none;align-items:center;gap:7px;padding:5px 7px;font-size:12px;display:flex}.dir-rail-item:hover{background:var(--panel-inset);color:var(--text)}.dir-rail-item.is-active{background:var(--accent-soft);color:var(--text)}.dir-rail-label{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.dir-list{flex:1;min-width:0;padding:8px;overflow-y:auto}.dir-item{border-radius:var(--radius);width:100%;color:var(--text-2);font:inherit;text-align:left;cursor:pointer;background:0 0;border:none;align-items:center;gap:8px;padding:6px 8px;font-size:12.5px;display:flex}.dir-item:hover{background:var(--panel-inset);color:var(--text)}.dir-item.is-repo{color:var(--text)}.dir-item-name{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.dir-item-tag{color:var(--text-4);font-size:10px}.dir-item-repo{letter-spacing:.04em;text-transform:uppercase;color:var(--accent-hi);flex:none;align-items:center;gap:3px;font-size:10px;display:inline-flex}.dir-picker-foot{border-top:1px solid var(--hairline);align-items:center;gap:12px;padding:10px 12px;display:flex}.dir-picked{min-width:0;color:var(--text-3);text-overflow:ellipsis;white-space:nowrap;text-align:left;direction:rtl;flex:1;font-size:11.5px;overflow:hidden}.dir-picked>bdi{unicode-bidi:isolate}.dir-picker-actions{flex:none;gap:8px;display:flex}.wizard-card{max-width:520px}.wizard-steps{color:var(--text-4);gap:16px;margin:0 0 6px;padding:0;font-size:11px;list-style:none;display:flex}.wizard-step{align-items:center;gap:6px;display:flex}.wizard-step.is-current{color:var(--accent-hi)}.wizard-step.is-done{color:var(--text-2)}.wizard-step-dot{background:var(--hairline);border-radius:50%;width:7px;height:7px}.wizard-step.is-current .wizard-step-dot{background:var(--accent)}.wizard-step.is-done .wizard-step-dot{background:var(--text-3)}.afk-card{flex-direction:column;gap:10px;display:flex}.afk-card-head{justify-content:space-between;align-items:flex-start;gap:12px;display:flex}.afk-card-title{font-size:16px;font-weight:600}.afk-card-sub{color:var(--text-3);margin:0;font-size:12.5px;line-height:1.5}.afk-rows{flex-direction:column;gap:8px;display:flex}.afk-row{border:1px solid var(--hairline);border-radius:var(--radius);background:var(--panel-2);flex-direction:column;gap:8px;padding:12px;display:flex}.afk-row.is-ok{opacity:.72}.afk-row-head{align-items:flex-start;gap:9px;display:flex}.afk-dot{border-radius:50%;flex:none;width:8px;height:8px;margin-top:4px}.afk-dot-ok{background:var(--ok,#3fb950)}.afk-dot-warn{background:var(--warn,#d9a441)}.afk-row-text{flex-direction:column;gap:2px;display:flex}.afk-row-label{font-size:13px;font-weight:500}.afk-row-detail{color:var(--text-4);font-size:11px}.afk-row-action{flex-direction:column;gap:8px;padding-left:17px;display:flex}.afk-cmd{background:var(--panel-inset);border:1px solid var(--hairline);border-radius:var(--radius);align-items:center;gap:8px;padding:8px 10px;display:flex}.afk-cmd-text{color:var(--accent-hi);word-break:break-all;flex:1;font-size:12px}.afk-note{color:var(--text-4);font-size:11px}.afk-term{border:1px solid var(--hairline);border-radius:var(--radius);height:280px;overflow:hidden}.afk-term-actions{justify-content:flex-end;gap:8px;display:flex}.afk-verdict{font-size:12px}.afk-verdict.is-ok{color:var(--ok,#3fb950)}.afk-verdict.is-warn{color:var(--warn,#d9a441)}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{0%,to{opacity:1}50%{opacity:.32}}@keyframes dotGlow{0%,to{box-shadow:0 0 0 3px #7c6cf638}50%{box-shadow:0 0 0 5px #7c6cf614}}@keyframes fadeUp{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}@keyframes bodyIn{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes detailIn{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}@keyframes lineIn{0%{opacity:0;transform:translate(-4px)}to{opacity:1;transform:translate(0)}}@keyframes popIn{0%{opacity:0;transform:scale(.96)}to{opacity:1;transform:scale(1)}}@keyframes cmdkIn{0%{opacity:0;transform:translateY(-10px)scale(.985)}to{opacity:1;transform:translateY(0)scale(1)}}@keyframes backdropIn{0%{opacity:0}to{opacity:1}}@keyframes toastIn{0%{opacity:0;transform:translate(16px)scale(.98)}to{opacity:1;transform:translate(0)scale(1)}}@media (prefers-reduced-motion:reduce){*,:before,:after{transition-duration:.001ms!important;animation-duration:.001ms!important;animation-iteration-count:1!important}.btn-solid:hover:not(:disabled){box-shadow:none;transform:none}}