@sma1lboy/kobe 0.7.4 → 0.7.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/cli/index.js +189 -51
  2. package/package.json +1 -1
package/dist/cli/index.js CHANGED
@@ -70,7 +70,7 @@ var init_package = __esm(() => {
70
70
  package_default = {
71
71
  $schema: "https://json.schemastore.org/package.json",
72
72
  name: "@sma1lboy/kobe",
73
- version: "0.7.4",
73
+ version: "0.7.5",
74
74
  description: "TUI orchestrator for Claude Code (codename)",
75
75
  type: "module",
76
76
  packageManager: "bun@1.3.13",
@@ -2502,6 +2502,8 @@ class ClaudeHookAdapter {
2502
2502
  }
2503
2503
  }
2504
2504
  async function hideFromGit(worktreeDir, relPath) {
2505
+ if (hiddenWorktrees.has(worktreeDir))
2506
+ return;
2505
2507
  try {
2506
2508
  const proc = Bun.spawn(["git", "-C", worktreeDir, "rev-parse", "--git-common-dir"], {
2507
2509
  stdout: "pipe",
@@ -2518,16 +2520,19 @@ async function hideFromGit(worktreeDir, relPath) {
2518
2520
  const excludePath = join3(commonDir, "info", "exclude");
2519
2521
  const existing = existsSync(excludePath) ? await readFile2(excludePath, "utf8") : "";
2520
2522
  if (existing.split(`
2521
- `).some((l) => l.trim() === relPath))
2523
+ `).some((l) => l.trim() === relPath)) {
2524
+ hiddenWorktrees.add(worktreeDir);
2522
2525
  return;
2526
+ }
2523
2527
  await mkdir2(join3(commonDir, "info"), { recursive: true });
2524
2528
  await appendFile(excludePath, `${existing.endsWith(`
2525
2529
  `) || existing === "" ? "" : `
2526
2530
  `}${relPath}
2527
2531
  `);
2532
+ hiddenWorktrees.add(worktreeDir);
2528
2533
  } catch {}
2529
2534
  }
2530
- var EVENT_MAP, KOBE_HOOK_EVENTS, WORKTREE_SYNC_MARKER = "worktree-created";
2535
+ var EVENT_MAP, KOBE_HOOK_EVENTS, WORKTREE_SYNC_MARKER = "worktree-created", hiddenWorktrees;
2531
2536
  var init_hook_adapter = __esm(() => {
2532
2537
  init_invocation();
2533
2538
  EVENT_MAP = [
@@ -2539,6 +2544,7 @@ var init_hook_adapter = __esm(() => {
2539
2544
  { event: "SessionEnd", verb: "session-end" }
2540
2545
  ];
2541
2546
  KOBE_HOOK_EVENTS = EVENT_MAP.map((e) => e.event);
2547
+ hiddenWorktrees = new Set;
2542
2548
  });
2543
2549
 
2544
2550
  // src/engine/hook-adapter.ts
@@ -3397,6 +3403,18 @@ class Orchestrator {
3397
3403
  if (!input.worktreePath)
3398
3404
  throw new Error("adoptWorktree: worktreePath is required");
3399
3405
  const target = canonPath(input.worktreePath);
3406
+ const inflight = this.adoptLocks.get(target);
3407
+ if (inflight)
3408
+ return inflight;
3409
+ const work = this.adoptWorktreeLocked(input, target);
3410
+ this.adoptLocks.set(target, work);
3411
+ try {
3412
+ return await work;
3413
+ } finally {
3414
+ this.adoptLocks.delete(target);
3415
+ }
3416
+ }
3417
+ async adoptWorktreeLocked(input, target) {
3400
3418
  const existing = this.store.list().find((t) => t.worktreePath && canonPath(t.worktreePath) === target);
3401
3419
  if (existing) {
3402
3420
  if (input.ifExists === "return")
@@ -3429,6 +3447,7 @@ class Orchestrator {
3429
3447
  });
3430
3448
  }
3431
3449
  pendingBaseRefs = new Map;
3450
+ adoptLocks = new Map;
3432
3451
  requireTask(id) {
3433
3452
  const task = this.store.get(id);
3434
3453
  if (!task)
@@ -3459,6 +3478,11 @@ var init_core = __esm(() => {
3459
3478
  function isProtocolCompatible(args) {
3460
3479
  return args.remoteVersion >= args.localMin && args.localVersion >= args.remoteMin;
3461
3480
  }
3481
+ function isDaemonVersionStale(daemonVersion, clientVersion) {
3482
+ if (!daemonVersion)
3483
+ return false;
3484
+ return daemonVersion !== clientVersion;
3485
+ }
3462
3486
  function serializeTask(task) {
3463
3487
  return {
3464
3488
  id: task.id,
@@ -5350,6 +5374,7 @@ async function startDaemonServer(orch, options = {}) {
5350
5374
  return {
5351
5375
  protocolVersion: DAEMON_PROTOCOL_VERSION,
5352
5376
  minProtocolVersion: MIN_COMPATIBLE_PROTOCOL_VERSION,
5377
+ kobeVersion: CURRENT_VERSION,
5353
5378
  capabilities: [...CHANNEL_NAMES],
5354
5379
  daemonPid: process.pid,
5355
5380
  clientId: client.id,
@@ -5359,6 +5384,7 @@ async function startDaemonServer(orch, options = {}) {
5359
5384
  case "daemon.status":
5360
5385
  return {
5361
5386
  daemonPid: process.pid,
5387
+ kobeVersion: CURRENT_VERSION,
5362
5388
  uptimeMs: Date.now() - startedAt.getTime(),
5363
5389
  startedAt: startedAt.toISOString(),
5364
5390
  attachedClients: guiCount(),
@@ -5418,6 +5444,8 @@ async function startDaemonServer(orch, options = {}) {
5418
5444
  if (gone?.lapse)
5419
5445
  clearTimeout(gone.lapse);
5420
5446
  activity.delete(taskId);
5447
+ if (gone)
5448
+ bus.publish("engine-state", { taskId, state: "idle", at: Date.now() });
5421
5449
  return {};
5422
5450
  }
5423
5451
  case "task.pin": {
@@ -8110,6 +8138,13 @@ async function runDoctorSubcommand(argv = []) {
8110
8138
  const tasks = typeof status.taskCount === "number" ? status.taskCount : "?";
8111
8139
  const clients = typeof status.attachedClients === "number" ? status.attachedClients : "?";
8112
8140
  out.push(`daemon: \u2713 running (pid ${pid}, up ${up}, ${tasks} task(s), ${clients} client(s))`);
8141
+ const daemonVersion = typeof status.kobeVersion === "string" ? status.kobeVersion : undefined;
8142
+ if (daemonVersion && daemonVersion !== CURRENT_VERSION) {
8143
+ out.push(` \u26A0 stale build: daemon is v${daemonVersion}, you launched v${CURRENT_VERSION}`);
8144
+ out.push(" \u2192 run `kobe daemon restart`, then `kobe reload` in any open kobe sessions");
8145
+ } else if (daemonVersion) {
8146
+ out.push(` build: v${daemonVersion}`);
8147
+ }
8113
8148
  } else {
8114
8149
  const pid = await readPidFile(pidPath);
8115
8150
  if (pid && isProcessAlive2(pid)) {
@@ -8313,6 +8348,7 @@ var init_maintenance = __esm(() => {
8313
8348
  init_env();
8314
8349
  init_skill_install();
8315
8350
  init_client2();
8351
+ init_version();
8316
8352
  });
8317
8353
 
8318
8354
  // src/cli/skill-cmd.ts
@@ -8527,6 +8563,15 @@ function syncSettingsPath(scope) {
8527
8563
  function worktreeSyncAdapters() {
8528
8564
  return ALL_VENDORS.map((v) => createEngineHookAdapter(v)).filter((a) => a.supportsWorktreeSync());
8529
8565
  }
8566
+ function persistedSyncPath(stored) {
8567
+ if (!stored || stored === "off")
8568
+ return;
8569
+ if (stored === "global")
8570
+ return syncSettingsPath({ kind: "global" });
8571
+ if (stored.startsWith("repo:"))
8572
+ return syncSettingsPath({ kind: "repo", path: stored.slice(5) });
8573
+ return stored;
8574
+ }
8530
8575
  async function runHookSetup(argv) {
8531
8576
  if (argv.includes("--help") || argv.includes("-h")) {
8532
8577
  process.stdout.write([
@@ -8553,21 +8598,26 @@ async function runHookSetup(argv) {
8553
8598
  `);
8554
8599
  return;
8555
8600
  }
8601
+ const prevPath = persistedSyncPath(getPersistedString(SYNC_SETTING_KEY));
8556
8602
  if (off) {
8557
- const prev = getPersistedString(SYNC_SETTING_KEY);
8558
- const path7 = prev?.startsWith("repo:") ? syncSettingsPath({ kind: "repo", path: prev.slice(5) }) : syncSettingsPath({ kind: "global" });
8559
- for (const a of adapters)
8560
- await a.removeWorktreeSyncHook(path7);
8603
+ if (prevPath) {
8604
+ for (const a of adapters)
8605
+ await a.removeWorktreeSyncHook(prevPath);
8606
+ }
8561
8607
  setPersistedString(SYNC_SETTING_KEY, "off");
8562
- process.stdout.write(`kobe hook setup: external worktree sync disabled (removed from ${path7})
8608
+ process.stdout.write(`kobe hook setup: external worktree sync disabled${prevPath ? ` (removed from ${prevPath})` : ""}
8563
8609
  `);
8564
8610
  return;
8565
8611
  }
8566
8612
  const scope = repoPath ? { kind: "repo", path: repoPath } : { kind: "global" };
8567
8613
  const path6 = syncSettingsPath(scope);
8614
+ if (prevPath && prevPath !== path6) {
8615
+ for (const a of adapters)
8616
+ await a.removeWorktreeSyncHook(prevPath);
8617
+ }
8568
8618
  for (const a of adapters)
8569
8619
  await a.installWorktreeSyncHook(path6);
8570
- setPersistedString(SYNC_SETTING_KEY, scope.kind === "repo" ? `repo:${resolve6(scope.path)}` : "global");
8620
+ setPersistedString(SYNC_SETTING_KEY, path6);
8571
8621
  process.stdout.write([
8572
8622
  `kobe hook setup: external worktree sync enabled (${scope.kind}) \u2014 wrote ${path6}`,
8573
8623
  "New `claude --worktree` worktrees will appear as kobe tasks.",
@@ -9869,6 +9919,8 @@ class RemoteOrchestrator {
9869
9919
  setActiveTaskSig;
9870
9920
  updateAcc;
9871
9921
  setUpdateSig;
9922
+ daemonVersionAcc;
9923
+ setDaemonVersionSig;
9872
9924
  engineStateAcc;
9873
9925
  setEngineStateSig;
9874
9926
  connectionStateAcc;
@@ -9881,6 +9933,7 @@ class RemoteOrchestrator {
9881
9933
  const [tasks, setTasks] = createSignal([]);
9882
9934
  const [activeTask, setActiveTask] = createSignal(null);
9883
9935
  const [update, setUpdate] = createSignal(null);
9936
+ const [daemonVersion, setDaemonVersion] = createSignal(null);
9884
9937
  const [engineState, setEngineState] = createSignal(new Map);
9885
9938
  const [connectionState, setConnectionState] = createSignal("online");
9886
9939
  this.tasksAcc = tasks;
@@ -9889,6 +9942,8 @@ class RemoteOrchestrator {
9889
9942
  this.setActiveTaskSig = (next) => setActiveTask(() => next);
9890
9943
  this.updateAcc = update;
9891
9944
  this.setUpdateSig = (next) => setUpdate(() => next);
9945
+ this.daemonVersionAcc = daemonVersion;
9946
+ this.setDaemonVersionSig = (next) => setDaemonVersion(() => next);
9892
9947
  this.engineStateAcc = engineState;
9893
9948
  this.setEngineStateSig = (next) => setEngineState(() => next);
9894
9949
  this.connectionStateAcc = connectionState;
@@ -9943,6 +9998,7 @@ class RemoteOrchestrator {
9943
9998
  })) {
9944
9999
  throw new Error(`kobe daemon is protocol v${daemonVersion} (min v${daemonMin}); this client is v${DAEMON_PROTOCOL_VERSION} (min v${MIN_COMPATIBLE_PROTOCOL_VERSION}). Restart the daemon (\`kobe daemon restart\`) or upgrade kobe.`);
9945
10000
  }
10001
+ this.setDaemonVersionSig(typeof hello.kobeVersion === "string" ? hello.kobeVersion : null);
9946
10002
  if (hello.tasks)
9947
10003
  this.setTasks(hello.tasks.map(deserializeTask));
9948
10004
  await this.client.subscribe({ role: this.role });
@@ -9969,6 +10025,12 @@ class RemoteOrchestrator {
9969
10025
  updateSignal() {
9970
10026
  return this.updateAcc;
9971
10027
  }
10028
+ daemonVersionSignal() {
10029
+ return this.daemonVersionAcc;
10030
+ }
10031
+ daemonStaleSignal() {
10032
+ return () => isDaemonVersionStale(this.daemonVersionAcc() ?? undefined, CURRENT_VERSION);
10033
+ }
9972
10034
  engineStateSignal() {
9973
10035
  return this.engineStateAcc;
9974
10036
  }
@@ -10096,6 +10158,7 @@ function deserializeTask(s) {
10096
10158
  var init_remote_orchestrator = __esm(() => {
10097
10159
  init_dev();
10098
10160
  init_protocol();
10161
+ init_version();
10099
10162
  init_client_log();
10100
10163
  init_daemon_process();
10101
10164
  });
@@ -15776,6 +15839,72 @@ var init_settings_dialog = __esm(() => {
15776
15839
  };
15777
15840
  });
15778
15841
 
15842
+ // src/tui/component/version-skew-banner.tsx
15843
+ import { TextAttributes as TextAttributes7 } from "@opentui/core";
15844
+ function versionSkewHint(daemonVersion, clientVersion) {
15845
+ const daemon = daemonVersion ? `v${daemonVersion}` : "an older build";
15846
+ return `daemon is ${daemon} \u2014 you launched v${clientVersion}. Run \`kobe daemon restart\` then \`kobe reload\``;
15847
+ }
15848
+ function VersionSkewBanner(props) {
15849
+ const {
15850
+ theme
15851
+ } = useTheme();
15852
+ const ruleWidth = () => Math.max(4, props.width() - 2);
15853
+ return createComponent2(Show, {
15854
+ get when() {
15855
+ return props.stale();
15856
+ },
15857
+ get children() {
15858
+ var _el$ = createElement("box"), _el$2 = createElement("text"), _el$3 = createElement("box"), _el$4 = createElement("text"), _el$6 = createElement("box"), _el$7 = createElement("text");
15859
+ insertNode(_el$, _el$2);
15860
+ insertNode(_el$, _el$3);
15861
+ insertNode(_el$, _el$6);
15862
+ setProp(_el$, "flexDirection", "column");
15863
+ setProp(_el$, "flexShrink", 0);
15864
+ setProp(_el$, "paddingLeft", 1);
15865
+ setProp(_el$, "paddingRight", 1);
15866
+ setProp(_el$, "paddingBottom", 1);
15867
+ setProp(_el$2, "wrapMode", "none");
15868
+ insert(_el$2, () => "\u2594".repeat(ruleWidth()));
15869
+ insertNode(_el$3, _el$4);
15870
+ setProp(_el$3, "flexDirection", "row");
15871
+ setProp(_el$3, "gap", 1);
15872
+ insertNode(_el$4, createTextNode(`\u26A0 DAEMON OUT OF DATE`));
15873
+ setProp(_el$4, "wrapMode", "none");
15874
+ insertNode(_el$6, _el$7);
15875
+ setProp(_el$6, "flexDirection", "row");
15876
+ setProp(_el$6, "gap", 1);
15877
+ setProp(_el$7, "wrapMode", "word");
15878
+ insert(_el$7, () => versionSkewHint(props.daemonVersion(), props.clientVersion));
15879
+ effect((_p$) => {
15880
+ var { warning: _v$, warning: _v$2 } = theme, _v$3 = TextAttributes7.BOLD, _v$4 = theme.text;
15881
+ _v$ !== _p$.e && (_p$.e = setProp(_el$2, "fg", _v$, _p$.e));
15882
+ _v$2 !== _p$.t && (_p$.t = setProp(_el$4, "fg", _v$2, _p$.t));
15883
+ _v$3 !== _p$.a && (_p$.a = setProp(_el$4, "attributes", _v$3, _p$.a));
15884
+ _v$4 !== _p$.o && (_p$.o = setProp(_el$7, "fg", _v$4, _p$.o));
15885
+ return _p$;
15886
+ }, {
15887
+ e: undefined,
15888
+ t: undefined,
15889
+ a: undefined,
15890
+ o: undefined
15891
+ });
15892
+ return _el$;
15893
+ }
15894
+ });
15895
+ }
15896
+ var init_version_skew_banner = __esm(() => {
15897
+ init_solid();
15898
+ init_solid();
15899
+ init_solid();
15900
+ init_solid();
15901
+ init_solid();
15902
+ init_solid();
15903
+ init_solid();
15904
+ init_dev();
15905
+ init_theme2();
15906
+ });
15907
+
15779
15908
  // src/tui/context/focus.tsx
15780
15909
  function FocusProvider(props) {
15781
15910
  const [focused, setFocusedSignal] = createSignal(props.initial ?? "sidebar");
@@ -16125,7 +16254,7 @@ function flattenIds(rows) {
16125
16254
  var init_groups = () => {};
16126
16255
 
16127
16256
  // src/tui/context/command-palette.tsx
16128
- import { TextAttributes as TextAttributes7 } from "@opentui/core";
16257
+ import { TextAttributes as TextAttributes8 } from "@opentui/core";
16129
16258
  function CommandPaletteProvider(props) {
16130
16259
  const dialog = useDialog();
16131
16260
  const [commands, setCommands] = createSignal([]);
@@ -16274,7 +16403,7 @@ function CommandPaletteDialog(props) {
16274
16403
  }
16275
16404
  }), null);
16276
16405
  effect((_p$) => {
16277
- var _v$ = TextAttributes7.BOLD, _v$2 = theme.text, _v$3 = theme.textMuted;
16406
+ var _v$ = TextAttributes8.BOLD, _v$2 = theme.text, _v$3 = theme.textMuted;
16278
16407
  _v$ !== _p$.e && (_p$.e = setProp(_el$3, "attributes", _v$, _p$.e));
16279
16408
  _v$2 !== _p$.t && (_p$.t = setProp(_el$3, "fg", _v$2, _p$.t));
16280
16409
  _v$3 !== _p$.a && (_p$.a = setProp(_el$5, "fg", _v$3, _p$.a));
@@ -16958,7 +17087,7 @@ var init_keys = __esm(() => {
16958
17087
  });
16959
17088
 
16960
17089
  // src/tui/panes/sidebar/Sidebar.tsx
16961
- import { TextAttributes as TextAttributes8 } from "@opentui/core";
17090
+ import { TextAttributes as TextAttributes9 } from "@opentui/core";
16962
17091
  function truncateBranchLabel(branch, max = BRANCH_LABEL_MAX) {
16963
17092
  if (branch.length <= max)
16964
17093
  return branch;
@@ -17123,7 +17252,7 @@ function Sidebar(props) {
17123
17252
  setProp(_el$3, "wrapMode", "none");
17124
17253
  insert(_el$3, () => "\u2500".repeat(Math.max(2, effectiveWidth() - 9 - p.label.length)));
17125
17254
  effect((_p$) => {
17126
- var _v$ = p.topPad ? 1 : 0, _v$2 = theme.textMuted, _v$3 = TextAttributes8.BOLD, _v$4 = theme.border;
17255
+ var _v$ = p.topPad ? 1 : 0, _v$2 = theme.textMuted, _v$3 = TextAttributes9.BOLD, _v$4 = theme.border;
17127
17256
  _v$ !== _p$.e && (_p$.e = setProp(_el$, "paddingTop", _v$, _p$.e));
17128
17257
  _v$2 !== _p$.t && (_p$.t = setProp(_el$2, "fg", _v$2, _p$.t));
17129
17258
  _v$3 !== _p$.a && (_p$.a = setProp(_el$2, "attributes", _v$3, _p$.a));
@@ -17168,7 +17297,7 @@ function Sidebar(props) {
17168
17297
  setProp(_el$26, "onMouseUp", () => props.onHeaderStatusClick?.());
17169
17298
  insert(_el$26, () => status().label);
17170
17299
  effect((_p$) => {
17171
- var _v$11 = status().emphasize ? theme.warning : theme.textMuted, _v$12 = status().emphasize ? TextAttributes8.BOLD : TextAttributes8.DIM;
17300
+ var _v$11 = status().emphasize ? theme.warning : theme.textMuted, _v$12 = status().emphasize ? TextAttributes9.BOLD : TextAttributes9.DIM;
17172
17301
  _v$11 !== _p$.e && (_p$.e = setProp(_el$26, "fg", _v$11, _p$.e));
17173
17302
  _v$12 !== _p$.t && (_p$.t = setProp(_el$26, "attributes", _v$12, _p$.t));
17174
17303
  return _p$;
@@ -17226,7 +17355,7 @@ function Sidebar(props) {
17226
17355
  }
17227
17356
  }), null);
17228
17357
  effect((_p$) => {
17229
- var { info: _v$5, text: _v$6, info: _v$7 } = theme, _v$8 = TextAttributes8.BLINK;
17358
+ var { info: _v$5, text: _v$6, info: _v$7 } = theme, _v$8 = TextAttributes9.BLINK;
17230
17359
  _v$5 !== _p$.e && (_p$.e = setProp(_el$9, "fg", _v$5, _p$.e));
17231
17360
  _v$6 !== _p$.t && (_p$.t = setProp(_el$1, "fg", _v$6, _p$.t));
17232
17361
  _v$7 !== _p$.a && (_p$.a = setProp(_el$10, "fg", _v$7, _p$.a));
@@ -17255,7 +17384,7 @@ function Sidebar(props) {
17255
17384
  setProp(_el$27, "onMouseUp", () => setView(tab.view));
17256
17385
  insert(_el$27, () => tab.label);
17257
17386
  effect((_p$) => {
17258
- var _v$13 = active() ? theme.primary : theme.textMuted, _v$14 = active() ? TextAttributes8.BOLD : undefined;
17387
+ var _v$13 = active() ? theme.primary : theme.textMuted, _v$14 = active() ? TextAttributes9.BOLD : undefined;
17259
17388
  _v$13 !== _p$.e && (_p$.e = setProp(_el$27, "fg", _v$13, _p$.e));
17260
17389
  _v$14 !== _p$.t && (_p$.t = setProp(_el$27, "attributes", _v$14, _p$.t));
17261
17390
  return _p$;
@@ -17446,7 +17575,7 @@ function Sidebar(props) {
17446
17575
  setProp(_el$37, "wrapMode", "none");
17447
17576
  insert(_el$37, () => truncatePathTail(abbrevHome(task.repo), subtitleBudget()));
17448
17577
  effect((_p$) => {
17449
- var _v$15 = theme.textMuted, _v$16 = TextAttributes8.DIM;
17578
+ var _v$15 = theme.textMuted, _v$16 = TextAttributes9.DIM;
17450
17579
  _v$15 !== _p$.e && (_p$.e = setProp(_el$37, "fg", _v$15, _p$.e));
17451
17580
  _v$16 !== _p$.t && (_p$.t = setProp(_el$37, "attributes", _v$16, _p$.t));
17452
17581
  return _p$;
@@ -17458,7 +17587,7 @@ function Sidebar(props) {
17458
17587
  }
17459
17588
  }), null);
17460
17589
  effect((_p$) => {
17461
- var _v$17 = barColor(), _v$18 = theme.primary, _v$19 = TextAttributes8.BOLD, _v$20 = theme.text, _v$21 = TextAttributes8.BOLD;
17590
+ var _v$17 = barColor(), _v$18 = theme.primary, _v$19 = TextAttributes9.BOLD, _v$20 = theme.text, _v$21 = TextAttributes9.BOLD;
17462
17591
  _v$17 !== _p$.e && (_p$.e = setProp(_el$31, "fg", _v$17, _p$.e));
17463
17592
  _v$18 !== _p$.t && (_p$.t = setProp(_el$33, "fg", _v$18, _p$.t));
17464
17593
  _v$19 !== _p$.a && (_p$.a = setProp(_el$33, "attributes", _v$19, _p$.a));
@@ -17525,7 +17654,7 @@ function Sidebar(props) {
17525
17654
  })()
17526
17655
  }), null);
17527
17656
  effect((_p$) => {
17528
- var _v$22 = barColor(), _v$23 = badgeColor(), _v$24 = TextAttributes8.BOLD, _v$25 = theme.text, _v$26 = isSelected() || isCursor() ? TextAttributes8.BOLD : undefined;
17657
+ var _v$22 = barColor(), _v$23 = badgeColor(), _v$24 = TextAttributes9.BOLD, _v$25 = theme.text, _v$26 = isSelected() || isCursor() ? TextAttributes9.BOLD : undefined;
17529
17658
  _v$22 !== _p$.e && (_p$.e = setProp(_el$39, "fg", _v$22, _p$.e));
17530
17659
  _v$23 !== _p$.t && (_p$.t = setProp(_el$41, "fg", _v$23, _p$.t));
17531
17660
  _v$24 !== _p$.a && (_p$.a = setProp(_el$41, "attributes", _v$24, _p$.a));
@@ -17596,7 +17725,7 @@ function Sidebar(props) {
17596
17725
  }
17597
17726
  }), null);
17598
17727
  effect((_p$) => {
17599
- var _v$27 = barColor(), _v$28 = theme.textMuted, _v$29 = TextAttributes8.DIM;
17728
+ var _v$27 = barColor(), _v$28 = theme.textMuted, _v$29 = TextAttributes9.DIM;
17600
17729
  _v$27 !== _p$.e && (_p$.e = setProp(_el$46, "fg", _v$27, _p$.e));
17601
17730
  _v$28 !== _p$.t && (_p$.t = setProp(_el$48, "fg", _v$28, _p$.t));
17602
17731
  _v$29 !== _p$.a && (_p$.a = setProp(_el$48, "attributes", _v$29, _p$.a));
@@ -17688,7 +17817,7 @@ function Sidebar(props) {
17688
17817
  return () => _c$4() ? truncatePathTail(l.text, innerW()) : truncateTitle(l.text, innerW());
17689
17818
  })());
17690
17819
  effect((_p$) => {
17691
- var _v$35 = l.dim ? theme.textMuted : theme.text, _v$36 = l.bold ? TextAttributes8.BOLD : l.dim ? TextAttributes8.DIM : undefined;
17820
+ var _v$35 = l.dim ? theme.textMuted : theme.text, _v$36 = l.bold ? TextAttributes9.BOLD : l.dim ? TextAttributes9.DIM : undefined;
17692
17821
  _v$35 !== _p$.e && (_p$.e = setProp(_el$57, "fg", _v$35, _p$.e));
17693
17822
  _v$36 !== _p$.t && (_p$.t = setProp(_el$57, "attributes", _v$36, _p$.t));
17694
17823
  return _p$;
@@ -17719,7 +17848,7 @@ function Sidebar(props) {
17719
17848
  }
17720
17849
  }), null);
17721
17850
  effect((_p$) => {
17722
- var _v$9 = props.width ? props.width() : SIDEBAR_WIDTH, _v$0 = focusedAccessor() ? theme.focusAccent : theme.textMuted, _v$1 = TextAttributes8.BOLD, _v$10 = theme.textMuted;
17851
+ var _v$9 = props.width ? props.width() : SIDEBAR_WIDTH, _v$0 = focusedAccessor() ? theme.focusAccent : theme.textMuted, _v$1 = TextAttributes9.BOLD, _v$10 = theme.textMuted;
17723
17852
  _v$9 !== _p$.e && (_p$.e = setProp(_el$4, "width", _v$9, _p$.e));
17724
17853
  _v$0 !== _p$.t && (_p$.t = setProp(_el$6, "fg", _v$0, _p$.t));
17725
17854
  _v$1 !== _p$.a && (_p$.a = setProp(_el$6, "attributes", _v$1, _p$.a));
@@ -17801,7 +17930,7 @@ __export(exports_host, {
17801
17930
  startTasksPane: () => startTasksPane
17802
17931
  });
17803
17932
  import { existsSync as existsSync12 } from "fs";
17804
- import { TextAttributes as TextAttributes9 } from "@opentui/core";
17933
+ import { TextAttributes as TextAttributes10 } from "@opentui/core";
17805
17934
  function TasksShell(props) {
17806
17935
  const themeCtx = useTheme();
17807
17936
  const {
@@ -18157,11 +18286,19 @@ function TasksShell(props) {
18157
18286
  emphasize: false
18158
18287
  };
18159
18288
  });
18289
+ const daemonStale = () => props.orch?.daemonStaleSignal()() ?? false;
18290
+ const daemonVersion = () => props.orch?.daemonVersionSignal()() ?? null;
18160
18291
  return (() => {
18161
18292
  var _el$ = createElement("box"), _el$2 = createElement("box");
18162
18293
  insertNode(_el$, _el$2);
18163
18294
  setProp(_el$, "flexDirection", "column");
18164
18295
  setProp(_el$, "flexGrow", 1);
18296
+ insert(_el$, createComponent2(VersionSkewBanner, {
18297
+ stale: daemonStale,
18298
+ daemonVersion,
18299
+ clientVersion: CURRENT_VERSION,
18300
+ width: () => dimensions().width
18301
+ }), _el$2);
18165
18302
  setProp(_el$2, "flexGrow", 1);
18166
18303
  setProp(_el$2, "flexShrink", 1);
18167
18304
  insert(_el$2, createComponent2(Sidebar, {
@@ -18278,7 +18415,7 @@ function ShortcutHints() {
18278
18415
  setProp(_el$10, "wrapMode", "none");
18279
18416
  insert(_el$10, () => clipLabel(h.label));
18280
18417
  effect((_p$) => {
18281
- var _v$3 = theme.accent, _v$4 = TextAttributes9.BOLD, _v$5 = theme.textMuted;
18418
+ var _v$3 = theme.accent, _v$4 = TextAttributes10.BOLD, _v$5 = theme.textMuted;
18282
18419
  _v$3 !== _p$.e && (_p$.e = setProp(_el$8, "fg", _v$3, _p$.e));
18283
18420
  _v$4 !== _p$.t && (_p$.t = setProp(_el$8, "attributes", _v$4, _p$.t));
18284
18421
  _v$5 !== _p$.a && (_p$.a = setProp(_el$10, "fg", _v$5, _p$.a));
@@ -18292,7 +18429,7 @@ function ShortcutHints() {
18292
18429
  })()
18293
18430
  }), null);
18294
18431
  effect((_p$) => {
18295
- var _v$ = theme.textMuted, _v$2 = TextAttributes9.DIM;
18432
+ var _v$ = theme.textMuted, _v$2 = TextAttributes10.DIM;
18296
18433
  _v$ !== _p$.e && (_p$.e = setProp(_el$4, "fg", _v$, _p$.e));
18297
18434
  _v$2 !== _p$.t && (_p$.t = setProp(_el$4, "attributes", _v$2, _p$.t));
18298
18435
  return _p$;
@@ -18415,6 +18552,7 @@ var init_host = __esm(() => {
18415
18552
  init_new_task_dialog();
18416
18553
  init_rename_task_dialog();
18417
18554
  init_settings_dialog();
18555
+ init_version_skew_banner();
18418
18556
  init_focus();
18419
18557
  init_kv();
18420
18558
  init_theme2();
@@ -18723,7 +18861,7 @@ __export(exports_host4, {
18723
18861
  startUpdateHost: () => startUpdateHost
18724
18862
  });
18725
18863
  import { spawn as spawn4, spawnSync as spawnSync8 } from "child_process";
18726
- import { TextAttributes as TextAttributes10 } from "@opentui/core";
18864
+ import { TextAttributes as TextAttributes11 } from "@opentui/core";
18727
18865
  function openExternalUrl(url) {
18728
18866
  if (!url)
18729
18867
  return false;
@@ -18951,7 +19089,7 @@ kobe update failed with exit code ${code}.
18951
19089
  setProp(_el$32, "wrapMode", "word");
18952
19090
  insert(_el$32, () => action.detail);
18953
19091
  effect((_p$) => {
18954
- var _v$12 = selected() === action.id ? theme.primary : undefined, _v$13 = selected() === action.id ? theme.selectedListItemText : theme.accent, _v$14 = TextAttributes10.BOLD, _v$15 = selected() === action.id ? theme.selectedListItemText : theme.text, _v$16 = selected() === action.id ? theme.selectedListItemText : theme.textMuted;
19092
+ var _v$12 = selected() === action.id ? theme.primary : undefined, _v$13 = selected() === action.id ? theme.selectedListItemText : theme.accent, _v$14 = TextAttributes11.BOLD, _v$15 = selected() === action.id ? theme.selectedListItemText : theme.text, _v$16 = selected() === action.id ? theme.selectedListItemText : theme.textMuted;
18955
19093
  _v$12 !== _p$.e && (_p$.e = setProp(_el$25, "backgroundColor", _v$12, _p$.e));
18956
19094
  _v$13 !== _p$.t && (_p$.t = setProp(_el$27, "fg", _v$13, _p$.t));
18957
19095
  _v$14 !== _p$.a && (_p$.a = setProp(_el$27, "attributes", _v$14, _p$.a));
@@ -19029,7 +19167,7 @@ kobe update failed with exit code ${code}.
19029
19167
  })()
19030
19168
  }), null);
19031
19169
  effect((_p$) => {
19032
- var { background: _v$, text: _v$2 } = theme, _v$3 = TextAttributes10.BOLD, _v$4 = theme.textMuted, _v$5 = theme.textMuted, _v$6 = theme.text, _v$7 = TextAttributes10.BOLD, _v$8 = theme.textMuted, _v$9 = info()?.hasUpdate ? theme.warning : theme.success, _v$0 = TextAttributes10.BOLD, _v$1 = theme.textMuted, _v$10 = TextAttributes10.DIM, _v$11 = {
19170
+ var { background: _v$, text: _v$2 } = theme, _v$3 = TextAttributes11.BOLD, _v$4 = theme.textMuted, _v$5 = theme.textMuted, _v$6 = theme.text, _v$7 = TextAttributes11.BOLD, _v$8 = theme.textMuted, _v$9 = info()?.hasUpdate ? theme.warning : theme.success, _v$0 = TextAttributes11.BOLD, _v$1 = theme.textMuted, _v$10 = TextAttributes11.DIM, _v$11 = {
19033
19171
  trackOptions: {
19034
19172
  backgroundColor: theme.background,
19035
19173
  foregroundColor: theme.borderActive
@@ -19601,7 +19739,7 @@ var init_open_external = () => {};
19601
19739
 
19602
19740
  // src/tui/panes/filetree/FileTree.tsx
19603
19741
  import { watch } from "fs";
19604
- import { TextAttributes as TextAttributes11 } from "@opentui/core";
19742
+ import { TextAttributes as TextAttributes12 } from "@opentui/core";
19605
19743
  function statusToken(s) {
19606
19744
  switch (s) {
19607
19745
  case "M":
@@ -20000,7 +20138,7 @@ function FileTree(props) {
20000
20138
  insertNode(_el$6, createTextNode(`create PR`));
20001
20139
  setProp(_el$6, "wrapMode", "none");
20002
20140
  effect((_p$) => {
20003
- var _v$ = theme.accent, _v$2 = TextAttributes11.BOLD, _v$3 = theme.text;
20141
+ var _v$ = theme.accent, _v$2 = TextAttributes12.BOLD, _v$3 = theme.text;
20004
20142
  _v$ !== _p$.e && (_p$.e = setProp(_el$4, "fg", _v$, _p$.e));
20005
20143
  _v$2 !== _p$.t && (_p$.t = setProp(_el$4, "attributes", _v$2, _p$.t));
20006
20144
  _v$3 !== _p$.a && (_p$.a = setProp(_el$6, "fg", _v$3, _p$.a));
@@ -20030,7 +20168,7 @@ function FileTree(props) {
20030
20168
  setProp(_el$26, "onMouseUp", () => setTab(t));
20031
20169
  insert(_el$26, () => TAB_LABEL[t]);
20032
20170
  effect((_p$) => {
20033
- var _v$6 = isActive() ? theme.primary : theme.textMuted, _v$7 = isActive() ? TextAttributes11.BOLD : undefined;
20171
+ var _v$6 = isActive() ? theme.primary : theme.textMuted, _v$7 = isActive() ? TextAttributes12.BOLD : undefined;
20034
20172
  _v$6 !== _p$.e && (_p$.e = setProp(_el$26, "fg", _v$6, _p$.e));
20035
20173
  _v$7 !== _p$.t && (_p$.t = setProp(_el$26, "attributes", _v$7, _p$.t));
20036
20174
  return _p$;
@@ -20051,7 +20189,7 @@ function FileTree(props) {
20051
20189
  setProp(_el$27, "wrapMode", "none");
20052
20190
  insert(_el$27, () => badge().text);
20053
20191
  effect((_p$) => {
20054
- var _v$8 = badge().active ? theme.accent : theme.textMuted, _v$9 = badge().active ? TextAttributes11.BOLD : undefined;
20192
+ var _v$8 = badge().active ? theme.accent : theme.textMuted, _v$9 = badge().active ? TextAttributes12.BOLD : undefined;
20055
20193
  _v$8 !== _p$.e && (_p$.e = setProp(_el$27, "fg", _v$8, _p$.e));
20056
20194
  _v$9 !== _p$.t && (_p$.t = setProp(_el$27, "attributes", _v$9, _p$.t));
20057
20195
  return _p$;
@@ -20205,7 +20343,7 @@ function FileTree(props) {
20205
20343
  setProp(_el$31, "wrapMode", "none");
20206
20344
  insert(_el$31, () => `${indent}${marker} ${row.name}/`);
20207
20345
  effect((_p$) => {
20208
- var _v$0 = rowBg(), _v$1 = theme.textMuted, _v$10 = TextAttributes11.BOLD;
20346
+ var _v$0 = rowBg(), _v$1 = theme.textMuted, _v$10 = TextAttributes12.BOLD;
20209
20347
  _v$0 !== _p$.e && (_p$.e = setProp(_el$29, "backgroundColor", _v$0, _p$.e));
20210
20348
  _v$1 !== _p$.t && (_p$.t = setProp(_el$31, "fg", _v$1, _p$.t));
20211
20349
  _v$10 !== _p$.a && (_p$.a = setProp(_el$31, "attributes", _v$10, _p$.a));
@@ -21085,7 +21223,7 @@ var init_direct = __esm(() => {
21085
21223
  });
21086
21224
 
21087
21225
  // src/tui/component/help-dialog.tsx
21088
- import { TextAttributes as TextAttributes12 } from "@opentui/core";
21226
+ import { TextAttributes as TextAttributes13 } from "@opentui/core";
21089
21227
  function groupBindings(keymap) {
21090
21228
  const groups = new Map;
21091
21229
  const order = [];
@@ -21189,7 +21327,7 @@ function HelpDialog() {
21189
21327
  }
21190
21328
  }), null);
21191
21329
  effect((_p$) => {
21192
- var _v$5 = theme.accent, _v$6 = TextAttributes12.BOLD;
21330
+ var _v$5 = theme.accent, _v$6 = TextAttributes13.BOLD;
21193
21331
  _v$5 !== _p$.e && (_p$.e = setProp(_el$0, "fg", _v$5, _p$.e));
21194
21332
  _v$6 !== _p$.t && (_p$.t = setProp(_el$0, "attributes", _v$6, _p$.t));
21195
21333
  return _p$;
@@ -21201,7 +21339,7 @@ function HelpDialog() {
21201
21339
  })()
21202
21340
  }));
21203
21341
  effect((_p$) => {
21204
- var _v$ = TextAttributes12.BOLD, _v$2 = theme.text, _v$3 = theme.textMuted, _v$4 = {
21342
+ var _v$ = TextAttributes13.BOLD, _v$2 = theme.text, _v$3 = theme.textMuted, _v$4 = {
21205
21343
  trackOptions: {
21206
21344
  backgroundColor: theme.backgroundDialog,
21207
21345
  foregroundColor: theme.borderActive
@@ -21241,7 +21379,7 @@ var init_help_dialog = __esm(() => {
21241
21379
  });
21242
21380
 
21243
21381
  // src/tui/component/pane-header.tsx
21244
- import { TextAttributes as TextAttributes13 } from "@opentui/core";
21382
+ import { TextAttributes as TextAttributes14 } from "@opentui/core";
21245
21383
  function PaneHeader(props) {
21246
21384
  const {
21247
21385
  theme
@@ -21271,7 +21409,7 @@ function PaneHeader(props) {
21271
21409
  setProp(_el$3, "wrapMode", "none");
21272
21410
  insert(_el$3, () => props.ordinal);
21273
21411
  effect((_p$) => {
21274
- var _v$ = titleColor(), _v$2 = TextAttributes13.BOLD;
21412
+ var _v$ = titleColor(), _v$2 = TextAttributes14.BOLD;
21275
21413
  _v$ !== _p$.e && (_p$.e = setProp(_el$3, "fg", _v$, _p$.e));
21276
21414
  _v$2 !== _p$.t && (_p$.t = setProp(_el$3, "attributes", _v$2, _p$.t));
21277
21415
  return _p$;
@@ -21322,7 +21460,7 @@ function PaneHeader(props) {
21322
21460
  }
21323
21461
  }), null);
21324
21462
  effect((_p$) => {
21325
- var _v$3 = titleColor(), _v$4 = TextAttributes13.BOLD;
21463
+ var _v$3 = titleColor(), _v$4 = TextAttributes14.BOLD;
21326
21464
  _v$3 !== _p$.e && (_p$.e = setProp(_el$4, "fg", _v$3, _p$.e));
21327
21465
  _v$4 !== _p$.t && (_p$.t = setProp(_el$4, "attributes", _v$4, _p$.t));
21328
21466
  return _p$;
@@ -21447,7 +21585,7 @@ var init_resizable_edge = __esm(() => {
21447
21585
  });
21448
21586
 
21449
21587
  // src/tui/component/status-bar.tsx
21450
- import { TextAttributes as TextAttributes14 } from "@opentui/core";
21588
+ import { TextAttributes as TextAttributes15 } from "@opentui/core";
21451
21589
  function Hotkey(props) {
21452
21590
  const {
21453
21591
  theme
@@ -21466,7 +21604,7 @@ function Hotkey(props) {
21466
21604
  setProp(_el$5, "wrapMode", "none");
21467
21605
  insert(_el$5, () => props.label);
21468
21606
  effect((_p$) => {
21469
- var _v$ = theme.accent, _v$2 = TextAttributes14.BOLD, _v$3 = theme.textMuted;
21607
+ var _v$ = theme.accent, _v$2 = TextAttributes15.BOLD, _v$3 = theme.textMuted;
21470
21608
  _v$ !== _p$.e && (_p$.e = setProp(_el$2, "fg", _v$, _p$.e));
21471
21609
  _v$2 !== _p$.t && (_p$.t = setProp(_el$2, "attributes", _v$2, _p$.t));
21472
21610
  _v$3 !== _p$.a && (_p$.a = setProp(_el$5, "fg", _v$3, _p$.a));
@@ -21554,7 +21692,7 @@ function StatusBar() {
21554
21692
  insertNode(_el$0, createTextNode(`Press Ctrl+C again to exit`));
21555
21693
  setProp(_el$0, "wrapMode", "none");
21556
21694
  effect((_p$) => {
21557
- var _v$4 = theme.warning, _v$5 = TextAttributes14.BOLD;
21695
+ var _v$4 = theme.warning, _v$5 = TextAttributes15.BOLD;
21558
21696
  _v$4 !== _p$.e && (_p$.e = setProp(_el$0, "fg", _v$4, _p$.e));
21559
21697
  _v$5 !== _p$.t && (_p$.t = setProp(_el$0, "attributes", _v$5, _p$.t));
21560
21698
  return _p$;
@@ -21566,7 +21704,7 @@ function StatusBar() {
21566
21704
  }
21567
21705
  }), null);
21568
21706
  effect((_p$) => {
21569
- var _v$6 = theme.primary, _v$7 = TextAttributes14.BOLD;
21707
+ var _v$6 = theme.primary, _v$7 = TextAttributes15.BOLD;
21570
21708
  _v$6 !== _p$.e && (_p$.e = setProp(_el$8, "fg", _v$6, _p$.e));
21571
21709
  _v$7 !== _p$.t && (_p$.t = setProp(_el$8, "attributes", _v$7, _p$.t));
21572
21710
  return _p$;
@@ -21755,7 +21893,7 @@ var init_notifications = __esm(() => {
21755
21893
  });
21756
21894
 
21757
21895
  // src/tui/component/toast-overlay.tsx
21758
- import { TextAttributes as TextAttributes15 } from "@opentui/core";
21896
+ import { TextAttributes as TextAttributes16 } from "@opentui/core";
21759
21897
  function ToastOverlay() {
21760
21898
  const {
21761
21899
  theme
@@ -21798,7 +21936,7 @@ function ToastOverlay() {
21798
21936
  setProp(_el$4, "wrapMode", "none");
21799
21937
  insert(_el$4, () => toast.title);
21800
21938
  effect((_p$) => {
21801
- var _v$3 = bg(), _v$4 = fg(), _v$5 = TextAttributes15.BOLD, _v$6 = fg();
21939
+ var _v$3 = bg(), _v$4 = fg(), _v$5 = TextAttributes16.BOLD, _v$6 = fg();
21802
21940
  _v$3 !== _p$.e && (_p$.e = setProp(_el$2, "backgroundColor", _v$3, _p$.e));
21803
21941
  _v$4 !== _p$.t && (_p$.t = setProp(_el$3, "fg", _v$4, _p$.t));
21804
21942
  _v$5 !== _p$.a && (_p$.a = setProp(_el$3, "attributes", _v$5, _p$.a));
@@ -21858,7 +21996,7 @@ function repoBasename2(repo) {
21858
21996
 
21859
21997
  // src/tui/component/top-bar.tsx
21860
21998
  import { spawnSync as spawnSync10 } from "child_process";
21861
- import { TextAttributes as TextAttributes16 } from "@opentui/core";
21999
+ import { TextAttributes as TextAttributes17 } from "@opentui/core";
21862
22000
  function TopBar(props) {
21863
22001
  const {
21864
22002
  theme
@@ -21933,7 +22071,7 @@ function TopBar(props) {
21933
22071
  insertNode(_el$7, createTextNode(`[Update]`));
21934
22072
  setProp(_el$7, "onMouseUp", () => void confirmUpdate());
21935
22073
  effect((_p$) => {
21936
- var _v$ = theme.warning, _v$2 = TextAttributes16.BOLD;
22074
+ var _v$ = theme.warning, _v$2 = TextAttributes17.BOLD;
21937
22075
  _v$ !== _p$.e && (_p$.e = setProp(_el$7, "fg", _v$, _p$.e));
21938
22076
  _v$2 !== _p$.t && (_p$.t = setProp(_el$7, "attributes", _v$2, _p$.t));
21939
22077
  return _p$;
@@ -21969,7 +22107,7 @@ function TopBar(props) {
21969
22107
  insertNode(_el$12, createTextNode(`daemon disconnected`));
21970
22108
  setProp(_el$12, "wrapMode", "none");
21971
22109
  effect((_p$) => {
21972
- var _v$6 = theme.error, _v$7 = TextAttributes16.BOLD;
22110
+ var _v$6 = theme.error, _v$7 = TextAttributes17.BOLD;
21973
22111
  _v$6 !== _p$.e && (_p$.e = setProp(_el$12, "fg", _v$6, _p$.e));
21974
22112
  _v$7 !== _p$.t && (_p$.t = setProp(_el$12, "attributes", _v$7, _p$.t));
21975
22113
  return _p$;
@@ -21999,7 +22137,7 @@ function TopBar(props) {
21999
22137
  setProp(_el$15, "wrapMode", "none");
22000
22138
  insert(_el$15, () => label().repoName);
22001
22139
  effect((_p$) => {
22002
- var _v$8 = label().branch ? theme.textMuted : theme.text, _v$9 = label().branch ? undefined : TextAttributes16.BOLD;
22140
+ var _v$8 = label().branch ? theme.textMuted : theme.text, _v$9 = label().branch ? undefined : TextAttributes17.BOLD;
22003
22141
  _v$8 !== _p$.e && (_p$.e = setProp(_el$15, "fg", _v$8, _p$.e));
22004
22142
  _v$9 !== _p$.t && (_p$.t = setProp(_el$15, "attributes", _v$9, _p$.t));
22005
22143
  return _p$;
@@ -22031,7 +22169,7 @@ function TopBar(props) {
22031
22169
  setProp(_el$18, "wrapMode", "none");
22032
22170
  insert(_el$18, () => label().branch);
22033
22171
  effect((_p$) => {
22034
- var _v$0 = theme.text, _v$1 = TextAttributes16.BOLD;
22172
+ var _v$0 = theme.text, _v$1 = TextAttributes17.BOLD;
22035
22173
  _v$0 !== _p$.e && (_p$.e = setProp(_el$18, "fg", _v$0, _p$.e));
22036
22174
  _v$1 !== _p$.t && (_p$.t = setProp(_el$18, "attributes", _v$1, _p$.t));
22037
22175
  return _p$;
@@ -22054,7 +22192,7 @@ function TopBar(props) {
22054
22192
  setProp(_el$11, "gap", 2);
22055
22193
  setProp(_el$11, "justifyContent", "flex-end");
22056
22194
  effect((_p$) => {
22057
- var _v$3 = theme.primary, _v$4 = TextAttributes16.BOLD, _v$5 = theme.textMuted;
22195
+ var _v$3 = theme.primary, _v$4 = TextAttributes17.BOLD, _v$5 = theme.textMuted;
22058
22196
  _v$3 !== _p$.e && (_p$.e = setProp(_el$3, "fg", _v$3, _p$.e));
22059
22197
  _v$4 !== _p$.t && (_p$.t = setProp(_el$3, "attributes", _v$4, _p$.t));
22060
22198
  _v$5 !== _p$.a && (_p$.a = setProp(_el$5, "fg", _v$5, _p$.a));
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
3
  "name": "@sma1lboy/kobe",
4
- "version": "0.7.4",
4
+ "version": "0.7.5",
5
5
  "description": "TUI orchestrator for Claude Code (codename)",
6
6
  "type": "module",
7
7
  "packageManager": "bun@1.3.13",