@sma1lboy/kobe 0.7.4 → 0.7.6

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 +212 -54
  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.6",
74
74
  description: "TUI orchestrator for Claude Code (codename)",
75
75
  type: "module",
76
76
  packageManager: "bun@1.3.13",
@@ -2477,6 +2477,8 @@ class ClaudeHookAdapter {
2477
2477
  const current = await readJsonObject(settingsFilePath);
2478
2478
  const command = install ? shellQuoteArgv([...kobeCliInvocation(), "hook", "worktree-created"]) : null;
2479
2479
  const next = mergeWorktreeSyncHook(current, command);
2480
+ if (JSON.stringify(next) === JSON.stringify(current))
2481
+ return;
2480
2482
  await mkdir2(dirname3(settingsFilePath), { recursive: true });
2481
2483
  await writeFile2(settingsFilePath, `${JSON.stringify(next, null, 2)}
2482
2484
  `);
@@ -2502,6 +2504,8 @@ class ClaudeHookAdapter {
2502
2504
  }
2503
2505
  }
2504
2506
  async function hideFromGit(worktreeDir, relPath) {
2507
+ if (hiddenWorktrees.has(worktreeDir))
2508
+ return;
2505
2509
  try {
2506
2510
  const proc = Bun.spawn(["git", "-C", worktreeDir, "rev-parse", "--git-common-dir"], {
2507
2511
  stdout: "pipe",
@@ -2518,16 +2522,19 @@ async function hideFromGit(worktreeDir, relPath) {
2518
2522
  const excludePath = join3(commonDir, "info", "exclude");
2519
2523
  const existing = existsSync(excludePath) ? await readFile2(excludePath, "utf8") : "";
2520
2524
  if (existing.split(`
2521
- `).some((l) => l.trim() === relPath))
2525
+ `).some((l) => l.trim() === relPath)) {
2526
+ hiddenWorktrees.add(worktreeDir);
2522
2527
  return;
2528
+ }
2523
2529
  await mkdir2(join3(commonDir, "info"), { recursive: true });
2524
2530
  await appendFile(excludePath, `${existing.endsWith(`
2525
2531
  `) || existing === "" ? "" : `
2526
2532
  `}${relPath}
2527
2533
  `);
2534
+ hiddenWorktrees.add(worktreeDir);
2528
2535
  } catch {}
2529
2536
  }
2530
- var EVENT_MAP, KOBE_HOOK_EVENTS, WORKTREE_SYNC_MARKER = "worktree-created";
2537
+ var EVENT_MAP, KOBE_HOOK_EVENTS, WORKTREE_SYNC_MARKER = "worktree-created", hiddenWorktrees;
2531
2538
  var init_hook_adapter = __esm(() => {
2532
2539
  init_invocation();
2533
2540
  EVENT_MAP = [
@@ -2539,6 +2546,7 @@ var init_hook_adapter = __esm(() => {
2539
2546
  { event: "SessionEnd", verb: "session-end" }
2540
2547
  ];
2541
2548
  KOBE_HOOK_EVENTS = EVENT_MAP.map((e) => e.event);
2549
+ hiddenWorktrees = new Set;
2542
2550
  });
2543
2551
 
2544
2552
  // src/engine/hook-adapter.ts
@@ -3397,6 +3405,18 @@ class Orchestrator {
3397
3405
  if (!input.worktreePath)
3398
3406
  throw new Error("adoptWorktree: worktreePath is required");
3399
3407
  const target = canonPath(input.worktreePath);
3408
+ const inflight = this.adoptLocks.get(target);
3409
+ if (inflight)
3410
+ return inflight;
3411
+ const work = this.adoptWorktreeLocked(input, target);
3412
+ this.adoptLocks.set(target, work);
3413
+ try {
3414
+ return await work;
3415
+ } finally {
3416
+ this.adoptLocks.delete(target);
3417
+ }
3418
+ }
3419
+ async adoptWorktreeLocked(input, target) {
3400
3420
  const existing = this.store.list().find((t) => t.worktreePath && canonPath(t.worktreePath) === target);
3401
3421
  if (existing) {
3402
3422
  if (input.ifExists === "return")
@@ -3429,6 +3449,7 @@ class Orchestrator {
3429
3449
  });
3430
3450
  }
3431
3451
  pendingBaseRefs = new Map;
3452
+ adoptLocks = new Map;
3432
3453
  requireTask(id) {
3433
3454
  const task = this.store.get(id);
3434
3455
  if (!task)
@@ -3459,6 +3480,11 @@ var init_core = __esm(() => {
3459
3480
  function isProtocolCompatible(args) {
3460
3481
  return args.remoteVersion >= args.localMin && args.localVersion >= args.remoteMin;
3461
3482
  }
3483
+ function isDaemonVersionStale(daemonVersion, clientVersion) {
3484
+ if (!daemonVersion)
3485
+ return false;
3486
+ return daemonVersion !== clientVersion;
3487
+ }
3462
3488
  function serializeTask(task) {
3463
3489
  return {
3464
3490
  id: task.id,
@@ -5350,6 +5376,7 @@ async function startDaemonServer(orch, options = {}) {
5350
5376
  return {
5351
5377
  protocolVersion: DAEMON_PROTOCOL_VERSION,
5352
5378
  minProtocolVersion: MIN_COMPATIBLE_PROTOCOL_VERSION,
5379
+ kobeVersion: CURRENT_VERSION,
5353
5380
  capabilities: [...CHANNEL_NAMES],
5354
5381
  daemonPid: process.pid,
5355
5382
  clientId: client.id,
@@ -5359,6 +5386,7 @@ async function startDaemonServer(orch, options = {}) {
5359
5386
  case "daemon.status":
5360
5387
  return {
5361
5388
  daemonPid: process.pid,
5389
+ kobeVersion: CURRENT_VERSION,
5362
5390
  uptimeMs: Date.now() - startedAt.getTime(),
5363
5391
  startedAt: startedAt.toISOString(),
5364
5392
  attachedClients: guiCount(),
@@ -5418,6 +5446,8 @@ async function startDaemonServer(orch, options = {}) {
5418
5446
  if (gone?.lapse)
5419
5447
  clearTimeout(gone.lapse);
5420
5448
  activity.delete(taskId);
5449
+ if (gone)
5450
+ bus.publish("engine-state", { taskId, state: "idle", at: Date.now() });
5421
5451
  return {};
5422
5452
  }
5423
5453
  case "task.pin": {
@@ -8110,6 +8140,13 @@ async function runDoctorSubcommand(argv = []) {
8110
8140
  const tasks = typeof status.taskCount === "number" ? status.taskCount : "?";
8111
8141
  const clients = typeof status.attachedClients === "number" ? status.attachedClients : "?";
8112
8142
  out.push(`daemon: \u2713 running (pid ${pid}, up ${up}, ${tasks} task(s), ${clients} client(s))`);
8143
+ const daemonVersion = typeof status.kobeVersion === "string" ? status.kobeVersion : undefined;
8144
+ if (daemonVersion && daemonVersion !== CURRENT_VERSION) {
8145
+ out.push(` \u26A0 stale build: daemon is v${daemonVersion}, you launched v${CURRENT_VERSION}`);
8146
+ out.push(" \u2192 run `kobe daemon restart`, then `kobe reload` in any open kobe sessions");
8147
+ } else if (daemonVersion) {
8148
+ out.push(` build: v${daemonVersion}`);
8149
+ }
8113
8150
  } else {
8114
8151
  const pid = await readPidFile(pidPath);
8115
8152
  if (pid && isProcessAlive2(pid)) {
@@ -8313,6 +8350,7 @@ var init_maintenance = __esm(() => {
8313
8350
  init_env();
8314
8351
  init_skill_install();
8315
8352
  init_client2();
8353
+ init_version();
8316
8354
  });
8317
8355
 
8318
8356
  // src/cli/skill-cmd.ts
@@ -8418,7 +8456,8 @@ var init_skill_cmd = __esm(() => {
8418
8456
  // src/cli/hook-cmd.ts
8419
8457
  var exports_hook_cmd = {};
8420
8458
  __export(exports_hook_cmd, {
8421
- runHookSubcommand: () => runHookSubcommand
8459
+ runHookSubcommand: () => runHookSubcommand,
8460
+ ensureDefaultWorktreeSync: () => ensureDefaultWorktreeSync
8422
8461
  });
8423
8462
  import { homedir as homedir10 } from "os";
8424
8463
  import { dirname as dirname7, join as join10, resolve as resolve6 } from "path";
@@ -8527,13 +8566,38 @@ function syncSettingsPath(scope) {
8527
8566
  function worktreeSyncAdapters() {
8528
8567
  return ALL_VENDORS.map((v) => createEngineHookAdapter(v)).filter((a) => a.supportsWorktreeSync());
8529
8568
  }
8569
+ function persistedSyncPath(stored) {
8570
+ if (!stored || stored === "off")
8571
+ return;
8572
+ if (stored === "global")
8573
+ return syncSettingsPath({ kind: "global" });
8574
+ if (stored.startsWith("repo:"))
8575
+ return syncSettingsPath({ kind: "repo", path: stored.slice(5) });
8576
+ return stored;
8577
+ }
8578
+ async function ensureDefaultWorktreeSync() {
8579
+ try {
8580
+ const stored = getPersistedString(SYNC_SETTING_KEY);
8581
+ if (stored === "off")
8582
+ return;
8583
+ const adapters = worktreeSyncAdapters();
8584
+ if (adapters.length === 0)
8585
+ return;
8586
+ const path6 = persistedSyncPath(stored) ?? syncSettingsPath({ kind: "global" });
8587
+ for (const a of adapters)
8588
+ await a.installWorktreeSyncHook(path6);
8589
+ if (!stored)
8590
+ setPersistedString(SYNC_SETTING_KEY, path6);
8591
+ } catch {}
8592
+ }
8530
8593
  async function runHookSetup(argv) {
8531
8594
  if (argv.includes("--help") || argv.includes("-h")) {
8532
8595
  process.stdout.write([
8533
8596
  "Usage: kobe hook setup [--global | --repo <path> | --off]",
8534
8597
  "",
8535
- "Install (or remove with --off) the hook that syncs an external",
8536
- "`claude --worktree` into kobe as a task. Default: --global (~/.claude).",
8598
+ "Syncs an external `claude --worktree` into kobe as a task. This is ON",
8599
+ "by default (installed globally into ~/.claude on launch). Use this to",
8600
+ "move it to one repo (--repo <path>) or to turn it OFF (--off).",
8537
8601
  ""
8538
8602
  ].join(`
8539
8603
  `));
@@ -8553,21 +8617,26 @@ async function runHookSetup(argv) {
8553
8617
  `);
8554
8618
  return;
8555
8619
  }
8620
+ const prevPath = persistedSyncPath(getPersistedString(SYNC_SETTING_KEY));
8556
8621
  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);
8622
+ if (prevPath) {
8623
+ for (const a of adapters)
8624
+ await a.removeWorktreeSyncHook(prevPath);
8625
+ }
8561
8626
  setPersistedString(SYNC_SETTING_KEY, "off");
8562
- process.stdout.write(`kobe hook setup: external worktree sync disabled (removed from ${path7})
8627
+ process.stdout.write(`kobe hook setup: external worktree sync disabled${prevPath ? ` (removed from ${prevPath})` : ""}
8563
8628
  `);
8564
8629
  return;
8565
8630
  }
8566
8631
  const scope = repoPath ? { kind: "repo", path: repoPath } : { kind: "global" };
8567
8632
  const path6 = syncSettingsPath(scope);
8633
+ if (prevPath && prevPath !== path6) {
8634
+ for (const a of adapters)
8635
+ await a.removeWorktreeSyncHook(prevPath);
8636
+ }
8568
8637
  for (const a of adapters)
8569
8638
  await a.installWorktreeSyncHook(path6);
8570
- setPersistedString(SYNC_SETTING_KEY, scope.kind === "repo" ? `repo:${resolve6(scope.path)}` : "global");
8639
+ setPersistedString(SYNC_SETTING_KEY, path6);
8571
8640
  process.stdout.write([
8572
8641
  `kobe hook setup: external worktree sync enabled (${scope.kind}) \u2014 wrote ${path6}`,
8573
8642
  "New `claude --worktree` worktrees will appear as kobe tasks.",
@@ -9869,6 +9938,8 @@ class RemoteOrchestrator {
9869
9938
  setActiveTaskSig;
9870
9939
  updateAcc;
9871
9940
  setUpdateSig;
9941
+ daemonVersionAcc;
9942
+ setDaemonVersionSig;
9872
9943
  engineStateAcc;
9873
9944
  setEngineStateSig;
9874
9945
  connectionStateAcc;
@@ -9881,6 +9952,7 @@ class RemoteOrchestrator {
9881
9952
  const [tasks, setTasks] = createSignal([]);
9882
9953
  const [activeTask, setActiveTask] = createSignal(null);
9883
9954
  const [update, setUpdate] = createSignal(null);
9955
+ const [daemonVersion, setDaemonVersion] = createSignal(null);
9884
9956
  const [engineState, setEngineState] = createSignal(new Map);
9885
9957
  const [connectionState, setConnectionState] = createSignal("online");
9886
9958
  this.tasksAcc = tasks;
@@ -9889,6 +9961,8 @@ class RemoteOrchestrator {
9889
9961
  this.setActiveTaskSig = (next) => setActiveTask(() => next);
9890
9962
  this.updateAcc = update;
9891
9963
  this.setUpdateSig = (next) => setUpdate(() => next);
9964
+ this.daemonVersionAcc = daemonVersion;
9965
+ this.setDaemonVersionSig = (next) => setDaemonVersion(() => next);
9892
9966
  this.engineStateAcc = engineState;
9893
9967
  this.setEngineStateSig = (next) => setEngineState(() => next);
9894
9968
  this.connectionStateAcc = connectionState;
@@ -9943,6 +10017,7 @@ class RemoteOrchestrator {
9943
10017
  })) {
9944
10018
  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
10019
  }
10020
+ this.setDaemonVersionSig(typeof hello.kobeVersion === "string" ? hello.kobeVersion : null);
9946
10021
  if (hello.tasks)
9947
10022
  this.setTasks(hello.tasks.map(deserializeTask));
9948
10023
  await this.client.subscribe({ role: this.role });
@@ -9969,6 +10044,12 @@ class RemoteOrchestrator {
9969
10044
  updateSignal() {
9970
10045
  return this.updateAcc;
9971
10046
  }
10047
+ daemonVersionSignal() {
10048
+ return this.daemonVersionAcc;
10049
+ }
10050
+ daemonStaleSignal() {
10051
+ return () => isDaemonVersionStale(this.daemonVersionAcc() ?? undefined, CURRENT_VERSION);
10052
+ }
9972
10053
  engineStateSignal() {
9973
10054
  return this.engineStateAcc;
9974
10055
  }
@@ -10096,6 +10177,7 @@ function deserializeTask(s) {
10096
10177
  var init_remote_orchestrator = __esm(() => {
10097
10178
  init_dev();
10098
10179
  init_protocol();
10180
+ init_version();
10099
10181
  init_client_log();
10100
10182
  init_daemon_process();
10101
10183
  });
@@ -15776,6 +15858,72 @@ var init_settings_dialog = __esm(() => {
15776
15858
  };
15777
15859
  });
15778
15860
 
15861
+ // src/tui/component/version-skew-banner.tsx
15862
+ import { TextAttributes as TextAttributes7 } from "@opentui/core";
15863
+ function versionSkewHint(daemonVersion, clientVersion) {
15864
+ const daemon = daemonVersion ? `v${daemonVersion}` : "an older build";
15865
+ return `daemon is ${daemon} \u2014 you launched v${clientVersion}. Run \`kobe daemon restart\` then \`kobe reload\``;
15866
+ }
15867
+ function VersionSkewBanner(props) {
15868
+ const {
15869
+ theme
15870
+ } = useTheme();
15871
+ const ruleWidth = () => Math.max(4, props.width() - 2);
15872
+ return createComponent2(Show, {
15873
+ get when() {
15874
+ return props.stale();
15875
+ },
15876
+ get children() {
15877
+ var _el$ = createElement("box"), _el$2 = createElement("text"), _el$3 = createElement("box"), _el$4 = createElement("text"), _el$6 = createElement("box"), _el$7 = createElement("text");
15878
+ insertNode(_el$, _el$2);
15879
+ insertNode(_el$, _el$3);
15880
+ insertNode(_el$, _el$6);
15881
+ setProp(_el$, "flexDirection", "column");
15882
+ setProp(_el$, "flexShrink", 0);
15883
+ setProp(_el$, "paddingLeft", 1);
15884
+ setProp(_el$, "paddingRight", 1);
15885
+ setProp(_el$, "paddingBottom", 1);
15886
+ setProp(_el$2, "wrapMode", "none");
15887
+ insert(_el$2, () => "\u2594".repeat(ruleWidth()));
15888
+ insertNode(_el$3, _el$4);
15889
+ setProp(_el$3, "flexDirection", "row");
15890
+ setProp(_el$3, "gap", 1);
15891
+ insertNode(_el$4, createTextNode(`\u26A0 DAEMON OUT OF DATE`));
15892
+ setProp(_el$4, "wrapMode", "none");
15893
+ insertNode(_el$6, _el$7);
15894
+ setProp(_el$6, "flexDirection", "row");
15895
+ setProp(_el$6, "gap", 1);
15896
+ setProp(_el$7, "wrapMode", "word");
15897
+ insert(_el$7, () => versionSkewHint(props.daemonVersion(), props.clientVersion));
15898
+ effect((_p$) => {
15899
+ var { warning: _v$, warning: _v$2 } = theme, _v$3 = TextAttributes7.BOLD, _v$4 = theme.text;
15900
+ _v$ !== _p$.e && (_p$.e = setProp(_el$2, "fg", _v$, _p$.e));
15901
+ _v$2 !== _p$.t && (_p$.t = setProp(_el$4, "fg", _v$2, _p$.t));
15902
+ _v$3 !== _p$.a && (_p$.a = setProp(_el$4, "attributes", _v$3, _p$.a));
15903
+ _v$4 !== _p$.o && (_p$.o = setProp(_el$7, "fg", _v$4, _p$.o));
15904
+ return _p$;
15905
+ }, {
15906
+ e: undefined,
15907
+ t: undefined,
15908
+ a: undefined,
15909
+ o: undefined
15910
+ });
15911
+ return _el$;
15912
+ }
15913
+ });
15914
+ }
15915
+ var init_version_skew_banner = __esm(() => {
15916
+ init_solid();
15917
+ init_solid();
15918
+ init_solid();
15919
+ init_solid();
15920
+ init_solid();
15921
+ init_solid();
15922
+ init_solid();
15923
+ init_dev();
15924
+ init_theme2();
15925
+ });
15926
+
15779
15927
  // src/tui/context/focus.tsx
15780
15928
  function FocusProvider(props) {
15781
15929
  const [focused, setFocusedSignal] = createSignal(props.initial ?? "sidebar");
@@ -16125,7 +16273,7 @@ function flattenIds(rows) {
16125
16273
  var init_groups = () => {};
16126
16274
 
16127
16275
  // src/tui/context/command-palette.tsx
16128
- import { TextAttributes as TextAttributes7 } from "@opentui/core";
16276
+ import { TextAttributes as TextAttributes8 } from "@opentui/core";
16129
16277
  function CommandPaletteProvider(props) {
16130
16278
  const dialog = useDialog();
16131
16279
  const [commands, setCommands] = createSignal([]);
@@ -16274,7 +16422,7 @@ function CommandPaletteDialog(props) {
16274
16422
  }
16275
16423
  }), null);
16276
16424
  effect((_p$) => {
16277
- var _v$ = TextAttributes7.BOLD, _v$2 = theme.text, _v$3 = theme.textMuted;
16425
+ var _v$ = TextAttributes8.BOLD, _v$2 = theme.text, _v$3 = theme.textMuted;
16278
16426
  _v$ !== _p$.e && (_p$.e = setProp(_el$3, "attributes", _v$, _p$.e));
16279
16427
  _v$2 !== _p$.t && (_p$.t = setProp(_el$3, "fg", _v$2, _p$.t));
16280
16428
  _v$3 !== _p$.a && (_p$.a = setProp(_el$5, "fg", _v$3, _p$.a));
@@ -16958,7 +17106,7 @@ var init_keys = __esm(() => {
16958
17106
  });
16959
17107
 
16960
17108
  // src/tui/panes/sidebar/Sidebar.tsx
16961
- import { TextAttributes as TextAttributes8 } from "@opentui/core";
17109
+ import { TextAttributes as TextAttributes9 } from "@opentui/core";
16962
17110
  function truncateBranchLabel(branch, max = BRANCH_LABEL_MAX) {
16963
17111
  if (branch.length <= max)
16964
17112
  return branch;
@@ -17123,7 +17271,7 @@ function Sidebar(props) {
17123
17271
  setProp(_el$3, "wrapMode", "none");
17124
17272
  insert(_el$3, () => "\u2500".repeat(Math.max(2, effectiveWidth() - 9 - p.label.length)));
17125
17273
  effect((_p$) => {
17126
- var _v$ = p.topPad ? 1 : 0, _v$2 = theme.textMuted, _v$3 = TextAttributes8.BOLD, _v$4 = theme.border;
17274
+ var _v$ = p.topPad ? 1 : 0, _v$2 = theme.textMuted, _v$3 = TextAttributes9.BOLD, _v$4 = theme.border;
17127
17275
  _v$ !== _p$.e && (_p$.e = setProp(_el$, "paddingTop", _v$, _p$.e));
17128
17276
  _v$2 !== _p$.t && (_p$.t = setProp(_el$2, "fg", _v$2, _p$.t));
17129
17277
  _v$3 !== _p$.a && (_p$.a = setProp(_el$2, "attributes", _v$3, _p$.a));
@@ -17168,7 +17316,7 @@ function Sidebar(props) {
17168
17316
  setProp(_el$26, "onMouseUp", () => props.onHeaderStatusClick?.());
17169
17317
  insert(_el$26, () => status().label);
17170
17318
  effect((_p$) => {
17171
- var _v$11 = status().emphasize ? theme.warning : theme.textMuted, _v$12 = status().emphasize ? TextAttributes8.BOLD : TextAttributes8.DIM;
17319
+ var _v$11 = status().emphasize ? theme.warning : theme.textMuted, _v$12 = status().emphasize ? TextAttributes9.BOLD : TextAttributes9.DIM;
17172
17320
  _v$11 !== _p$.e && (_p$.e = setProp(_el$26, "fg", _v$11, _p$.e));
17173
17321
  _v$12 !== _p$.t && (_p$.t = setProp(_el$26, "attributes", _v$12, _p$.t));
17174
17322
  return _p$;
@@ -17226,7 +17374,7 @@ function Sidebar(props) {
17226
17374
  }
17227
17375
  }), null);
17228
17376
  effect((_p$) => {
17229
- var { info: _v$5, text: _v$6, info: _v$7 } = theme, _v$8 = TextAttributes8.BLINK;
17377
+ var { info: _v$5, text: _v$6, info: _v$7 } = theme, _v$8 = TextAttributes9.BLINK;
17230
17378
  _v$5 !== _p$.e && (_p$.e = setProp(_el$9, "fg", _v$5, _p$.e));
17231
17379
  _v$6 !== _p$.t && (_p$.t = setProp(_el$1, "fg", _v$6, _p$.t));
17232
17380
  _v$7 !== _p$.a && (_p$.a = setProp(_el$10, "fg", _v$7, _p$.a));
@@ -17255,7 +17403,7 @@ function Sidebar(props) {
17255
17403
  setProp(_el$27, "onMouseUp", () => setView(tab.view));
17256
17404
  insert(_el$27, () => tab.label);
17257
17405
  effect((_p$) => {
17258
- var _v$13 = active() ? theme.primary : theme.textMuted, _v$14 = active() ? TextAttributes8.BOLD : undefined;
17406
+ var _v$13 = active() ? theme.primary : theme.textMuted, _v$14 = active() ? TextAttributes9.BOLD : undefined;
17259
17407
  _v$13 !== _p$.e && (_p$.e = setProp(_el$27, "fg", _v$13, _p$.e));
17260
17408
  _v$14 !== _p$.t && (_p$.t = setProp(_el$27, "attributes", _v$14, _p$.t));
17261
17409
  return _p$;
@@ -17446,7 +17594,7 @@ function Sidebar(props) {
17446
17594
  setProp(_el$37, "wrapMode", "none");
17447
17595
  insert(_el$37, () => truncatePathTail(abbrevHome(task.repo), subtitleBudget()));
17448
17596
  effect((_p$) => {
17449
- var _v$15 = theme.textMuted, _v$16 = TextAttributes8.DIM;
17597
+ var _v$15 = theme.textMuted, _v$16 = TextAttributes9.DIM;
17450
17598
  _v$15 !== _p$.e && (_p$.e = setProp(_el$37, "fg", _v$15, _p$.e));
17451
17599
  _v$16 !== _p$.t && (_p$.t = setProp(_el$37, "attributes", _v$16, _p$.t));
17452
17600
  return _p$;
@@ -17458,7 +17606,7 @@ function Sidebar(props) {
17458
17606
  }
17459
17607
  }), null);
17460
17608
  effect((_p$) => {
17461
- var _v$17 = barColor(), _v$18 = theme.primary, _v$19 = TextAttributes8.BOLD, _v$20 = theme.text, _v$21 = TextAttributes8.BOLD;
17609
+ var _v$17 = barColor(), _v$18 = theme.primary, _v$19 = TextAttributes9.BOLD, _v$20 = theme.text, _v$21 = TextAttributes9.BOLD;
17462
17610
  _v$17 !== _p$.e && (_p$.e = setProp(_el$31, "fg", _v$17, _p$.e));
17463
17611
  _v$18 !== _p$.t && (_p$.t = setProp(_el$33, "fg", _v$18, _p$.t));
17464
17612
  _v$19 !== _p$.a && (_p$.a = setProp(_el$33, "attributes", _v$19, _p$.a));
@@ -17525,7 +17673,7 @@ function Sidebar(props) {
17525
17673
  })()
17526
17674
  }), null);
17527
17675
  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;
17676
+ var _v$22 = barColor(), _v$23 = badgeColor(), _v$24 = TextAttributes9.BOLD, _v$25 = theme.text, _v$26 = isSelected() || isCursor() ? TextAttributes9.BOLD : undefined;
17529
17677
  _v$22 !== _p$.e && (_p$.e = setProp(_el$39, "fg", _v$22, _p$.e));
17530
17678
  _v$23 !== _p$.t && (_p$.t = setProp(_el$41, "fg", _v$23, _p$.t));
17531
17679
  _v$24 !== _p$.a && (_p$.a = setProp(_el$41, "attributes", _v$24, _p$.a));
@@ -17596,7 +17744,7 @@ function Sidebar(props) {
17596
17744
  }
17597
17745
  }), null);
17598
17746
  effect((_p$) => {
17599
- var _v$27 = barColor(), _v$28 = theme.textMuted, _v$29 = TextAttributes8.DIM;
17747
+ var _v$27 = barColor(), _v$28 = theme.textMuted, _v$29 = TextAttributes9.DIM;
17600
17748
  _v$27 !== _p$.e && (_p$.e = setProp(_el$46, "fg", _v$27, _p$.e));
17601
17749
  _v$28 !== _p$.t && (_p$.t = setProp(_el$48, "fg", _v$28, _p$.t));
17602
17750
  _v$29 !== _p$.a && (_p$.a = setProp(_el$48, "attributes", _v$29, _p$.a));
@@ -17688,7 +17836,7 @@ function Sidebar(props) {
17688
17836
  return () => _c$4() ? truncatePathTail(l.text, innerW()) : truncateTitle(l.text, innerW());
17689
17837
  })());
17690
17838
  effect((_p$) => {
17691
- var _v$35 = l.dim ? theme.textMuted : theme.text, _v$36 = l.bold ? TextAttributes8.BOLD : l.dim ? TextAttributes8.DIM : undefined;
17839
+ var _v$35 = l.dim ? theme.textMuted : theme.text, _v$36 = l.bold ? TextAttributes9.BOLD : l.dim ? TextAttributes9.DIM : undefined;
17692
17840
  _v$35 !== _p$.e && (_p$.e = setProp(_el$57, "fg", _v$35, _p$.e));
17693
17841
  _v$36 !== _p$.t && (_p$.t = setProp(_el$57, "attributes", _v$36, _p$.t));
17694
17842
  return _p$;
@@ -17719,7 +17867,7 @@ function Sidebar(props) {
17719
17867
  }
17720
17868
  }), null);
17721
17869
  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;
17870
+ 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
17871
  _v$9 !== _p$.e && (_p$.e = setProp(_el$4, "width", _v$9, _p$.e));
17724
17872
  _v$0 !== _p$.t && (_p$.t = setProp(_el$6, "fg", _v$0, _p$.t));
17725
17873
  _v$1 !== _p$.a && (_p$.a = setProp(_el$6, "attributes", _v$1, _p$.a));
@@ -17801,7 +17949,7 @@ __export(exports_host, {
17801
17949
  startTasksPane: () => startTasksPane
17802
17950
  });
17803
17951
  import { existsSync as existsSync12 } from "fs";
17804
- import { TextAttributes as TextAttributes9 } from "@opentui/core";
17952
+ import { TextAttributes as TextAttributes10 } from "@opentui/core";
17805
17953
  function TasksShell(props) {
17806
17954
  const themeCtx = useTheme();
17807
17955
  const {
@@ -18157,11 +18305,19 @@ function TasksShell(props) {
18157
18305
  emphasize: false
18158
18306
  };
18159
18307
  });
18308
+ const daemonStale = () => props.orch?.daemonStaleSignal()() ?? false;
18309
+ const daemonVersion = () => props.orch?.daemonVersionSignal()() ?? null;
18160
18310
  return (() => {
18161
18311
  var _el$ = createElement("box"), _el$2 = createElement("box");
18162
18312
  insertNode(_el$, _el$2);
18163
18313
  setProp(_el$, "flexDirection", "column");
18164
18314
  setProp(_el$, "flexGrow", 1);
18315
+ insert(_el$, createComponent2(VersionSkewBanner, {
18316
+ stale: daemonStale,
18317
+ daemonVersion,
18318
+ clientVersion: CURRENT_VERSION,
18319
+ width: () => dimensions().width
18320
+ }), _el$2);
18165
18321
  setProp(_el$2, "flexGrow", 1);
18166
18322
  setProp(_el$2, "flexShrink", 1);
18167
18323
  insert(_el$2, createComponent2(Sidebar, {
@@ -18278,7 +18434,7 @@ function ShortcutHints() {
18278
18434
  setProp(_el$10, "wrapMode", "none");
18279
18435
  insert(_el$10, () => clipLabel(h.label));
18280
18436
  effect((_p$) => {
18281
- var _v$3 = theme.accent, _v$4 = TextAttributes9.BOLD, _v$5 = theme.textMuted;
18437
+ var _v$3 = theme.accent, _v$4 = TextAttributes10.BOLD, _v$5 = theme.textMuted;
18282
18438
  _v$3 !== _p$.e && (_p$.e = setProp(_el$8, "fg", _v$3, _p$.e));
18283
18439
  _v$4 !== _p$.t && (_p$.t = setProp(_el$8, "attributes", _v$4, _p$.t));
18284
18440
  _v$5 !== _p$.a && (_p$.a = setProp(_el$10, "fg", _v$5, _p$.a));
@@ -18292,7 +18448,7 @@ function ShortcutHints() {
18292
18448
  })()
18293
18449
  }), null);
18294
18450
  effect((_p$) => {
18295
- var _v$ = theme.textMuted, _v$2 = TextAttributes9.DIM;
18451
+ var _v$ = theme.textMuted, _v$2 = TextAttributes10.DIM;
18296
18452
  _v$ !== _p$.e && (_p$.e = setProp(_el$4, "fg", _v$, _p$.e));
18297
18453
  _v$2 !== _p$.t && (_p$.t = setProp(_el$4, "attributes", _v$2, _p$.t));
18298
18454
  return _p$;
@@ -18415,6 +18571,7 @@ var init_host = __esm(() => {
18415
18571
  init_new_task_dialog();
18416
18572
  init_rename_task_dialog();
18417
18573
  init_settings_dialog();
18574
+ init_version_skew_banner();
18418
18575
  init_focus();
18419
18576
  init_kv();
18420
18577
  init_theme2();
@@ -18723,7 +18880,7 @@ __export(exports_host4, {
18723
18880
  startUpdateHost: () => startUpdateHost
18724
18881
  });
18725
18882
  import { spawn as spawn4, spawnSync as spawnSync8 } from "child_process";
18726
- import { TextAttributes as TextAttributes10 } from "@opentui/core";
18883
+ import { TextAttributes as TextAttributes11 } from "@opentui/core";
18727
18884
  function openExternalUrl(url) {
18728
18885
  if (!url)
18729
18886
  return false;
@@ -18951,7 +19108,7 @@ kobe update failed with exit code ${code}.
18951
19108
  setProp(_el$32, "wrapMode", "word");
18952
19109
  insert(_el$32, () => action.detail);
18953
19110
  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;
19111
+ 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
19112
  _v$12 !== _p$.e && (_p$.e = setProp(_el$25, "backgroundColor", _v$12, _p$.e));
18956
19113
  _v$13 !== _p$.t && (_p$.t = setProp(_el$27, "fg", _v$13, _p$.t));
18957
19114
  _v$14 !== _p$.a && (_p$.a = setProp(_el$27, "attributes", _v$14, _p$.a));
@@ -19029,7 +19186,7 @@ kobe update failed with exit code ${code}.
19029
19186
  })()
19030
19187
  }), null);
19031
19188
  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 = {
19189
+ 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
19190
  trackOptions: {
19034
19191
  backgroundColor: theme.background,
19035
19192
  foregroundColor: theme.borderActive
@@ -19601,7 +19758,7 @@ var init_open_external = () => {};
19601
19758
 
19602
19759
  // src/tui/panes/filetree/FileTree.tsx
19603
19760
  import { watch } from "fs";
19604
- import { TextAttributes as TextAttributes11 } from "@opentui/core";
19761
+ import { TextAttributes as TextAttributes12 } from "@opentui/core";
19605
19762
  function statusToken(s) {
19606
19763
  switch (s) {
19607
19764
  case "M":
@@ -20000,7 +20157,7 @@ function FileTree(props) {
20000
20157
  insertNode(_el$6, createTextNode(`create PR`));
20001
20158
  setProp(_el$6, "wrapMode", "none");
20002
20159
  effect((_p$) => {
20003
- var _v$ = theme.accent, _v$2 = TextAttributes11.BOLD, _v$3 = theme.text;
20160
+ var _v$ = theme.accent, _v$2 = TextAttributes12.BOLD, _v$3 = theme.text;
20004
20161
  _v$ !== _p$.e && (_p$.e = setProp(_el$4, "fg", _v$, _p$.e));
20005
20162
  _v$2 !== _p$.t && (_p$.t = setProp(_el$4, "attributes", _v$2, _p$.t));
20006
20163
  _v$3 !== _p$.a && (_p$.a = setProp(_el$6, "fg", _v$3, _p$.a));
@@ -20030,7 +20187,7 @@ function FileTree(props) {
20030
20187
  setProp(_el$26, "onMouseUp", () => setTab(t));
20031
20188
  insert(_el$26, () => TAB_LABEL[t]);
20032
20189
  effect((_p$) => {
20033
- var _v$6 = isActive() ? theme.primary : theme.textMuted, _v$7 = isActive() ? TextAttributes11.BOLD : undefined;
20190
+ var _v$6 = isActive() ? theme.primary : theme.textMuted, _v$7 = isActive() ? TextAttributes12.BOLD : undefined;
20034
20191
  _v$6 !== _p$.e && (_p$.e = setProp(_el$26, "fg", _v$6, _p$.e));
20035
20192
  _v$7 !== _p$.t && (_p$.t = setProp(_el$26, "attributes", _v$7, _p$.t));
20036
20193
  return _p$;
@@ -20051,7 +20208,7 @@ function FileTree(props) {
20051
20208
  setProp(_el$27, "wrapMode", "none");
20052
20209
  insert(_el$27, () => badge().text);
20053
20210
  effect((_p$) => {
20054
- var _v$8 = badge().active ? theme.accent : theme.textMuted, _v$9 = badge().active ? TextAttributes11.BOLD : undefined;
20211
+ var _v$8 = badge().active ? theme.accent : theme.textMuted, _v$9 = badge().active ? TextAttributes12.BOLD : undefined;
20055
20212
  _v$8 !== _p$.e && (_p$.e = setProp(_el$27, "fg", _v$8, _p$.e));
20056
20213
  _v$9 !== _p$.t && (_p$.t = setProp(_el$27, "attributes", _v$9, _p$.t));
20057
20214
  return _p$;
@@ -20205,7 +20362,7 @@ function FileTree(props) {
20205
20362
  setProp(_el$31, "wrapMode", "none");
20206
20363
  insert(_el$31, () => `${indent}${marker} ${row.name}/`);
20207
20364
  effect((_p$) => {
20208
- var _v$0 = rowBg(), _v$1 = theme.textMuted, _v$10 = TextAttributes11.BOLD;
20365
+ var _v$0 = rowBg(), _v$1 = theme.textMuted, _v$10 = TextAttributes12.BOLD;
20209
20366
  _v$0 !== _p$.e && (_p$.e = setProp(_el$29, "backgroundColor", _v$0, _p$.e));
20210
20367
  _v$1 !== _p$.t && (_p$.t = setProp(_el$31, "fg", _v$1, _p$.t));
20211
20368
  _v$10 !== _p$.a && (_p$.a = setProp(_el$31, "attributes", _v$10, _p$.a));
@@ -21003,6 +21160,7 @@ async function ensureRepos(orchestrator) {
21003
21160
  }
21004
21161
  async function startDirectTmux() {
21005
21162
  setClientLogContext("gui");
21163
+ Promise.resolve().then(() => (init_hook_cmd(), exports_hook_cmd)).then((m) => m.ensureDefaultWorktreeSync());
21006
21164
  if (!await tmuxAvailable()) {
21007
21165
  console.error("kobe: tmux not found on PATH \u2014 install tmux to use kobe 0.6 direct mode");
21008
21166
  process.exitCode = 1;
@@ -21085,7 +21243,7 @@ var init_direct = __esm(() => {
21085
21243
  });
21086
21244
 
21087
21245
  // src/tui/component/help-dialog.tsx
21088
- import { TextAttributes as TextAttributes12 } from "@opentui/core";
21246
+ import { TextAttributes as TextAttributes13 } from "@opentui/core";
21089
21247
  function groupBindings(keymap) {
21090
21248
  const groups = new Map;
21091
21249
  const order = [];
@@ -21189,7 +21347,7 @@ function HelpDialog() {
21189
21347
  }
21190
21348
  }), null);
21191
21349
  effect((_p$) => {
21192
- var _v$5 = theme.accent, _v$6 = TextAttributes12.BOLD;
21350
+ var _v$5 = theme.accent, _v$6 = TextAttributes13.BOLD;
21193
21351
  _v$5 !== _p$.e && (_p$.e = setProp(_el$0, "fg", _v$5, _p$.e));
21194
21352
  _v$6 !== _p$.t && (_p$.t = setProp(_el$0, "attributes", _v$6, _p$.t));
21195
21353
  return _p$;
@@ -21201,7 +21359,7 @@ function HelpDialog() {
21201
21359
  })()
21202
21360
  }));
21203
21361
  effect((_p$) => {
21204
- var _v$ = TextAttributes12.BOLD, _v$2 = theme.text, _v$3 = theme.textMuted, _v$4 = {
21362
+ var _v$ = TextAttributes13.BOLD, _v$2 = theme.text, _v$3 = theme.textMuted, _v$4 = {
21205
21363
  trackOptions: {
21206
21364
  backgroundColor: theme.backgroundDialog,
21207
21365
  foregroundColor: theme.borderActive
@@ -21241,7 +21399,7 @@ var init_help_dialog = __esm(() => {
21241
21399
  });
21242
21400
 
21243
21401
  // src/tui/component/pane-header.tsx
21244
- import { TextAttributes as TextAttributes13 } from "@opentui/core";
21402
+ import { TextAttributes as TextAttributes14 } from "@opentui/core";
21245
21403
  function PaneHeader(props) {
21246
21404
  const {
21247
21405
  theme
@@ -21271,7 +21429,7 @@ function PaneHeader(props) {
21271
21429
  setProp(_el$3, "wrapMode", "none");
21272
21430
  insert(_el$3, () => props.ordinal);
21273
21431
  effect((_p$) => {
21274
- var _v$ = titleColor(), _v$2 = TextAttributes13.BOLD;
21432
+ var _v$ = titleColor(), _v$2 = TextAttributes14.BOLD;
21275
21433
  _v$ !== _p$.e && (_p$.e = setProp(_el$3, "fg", _v$, _p$.e));
21276
21434
  _v$2 !== _p$.t && (_p$.t = setProp(_el$3, "attributes", _v$2, _p$.t));
21277
21435
  return _p$;
@@ -21322,7 +21480,7 @@ function PaneHeader(props) {
21322
21480
  }
21323
21481
  }), null);
21324
21482
  effect((_p$) => {
21325
- var _v$3 = titleColor(), _v$4 = TextAttributes13.BOLD;
21483
+ var _v$3 = titleColor(), _v$4 = TextAttributes14.BOLD;
21326
21484
  _v$3 !== _p$.e && (_p$.e = setProp(_el$4, "fg", _v$3, _p$.e));
21327
21485
  _v$4 !== _p$.t && (_p$.t = setProp(_el$4, "attributes", _v$4, _p$.t));
21328
21486
  return _p$;
@@ -21447,7 +21605,7 @@ var init_resizable_edge = __esm(() => {
21447
21605
  });
21448
21606
 
21449
21607
  // src/tui/component/status-bar.tsx
21450
- import { TextAttributes as TextAttributes14 } from "@opentui/core";
21608
+ import { TextAttributes as TextAttributes15 } from "@opentui/core";
21451
21609
  function Hotkey(props) {
21452
21610
  const {
21453
21611
  theme
@@ -21466,7 +21624,7 @@ function Hotkey(props) {
21466
21624
  setProp(_el$5, "wrapMode", "none");
21467
21625
  insert(_el$5, () => props.label);
21468
21626
  effect((_p$) => {
21469
- var _v$ = theme.accent, _v$2 = TextAttributes14.BOLD, _v$3 = theme.textMuted;
21627
+ var _v$ = theme.accent, _v$2 = TextAttributes15.BOLD, _v$3 = theme.textMuted;
21470
21628
  _v$ !== _p$.e && (_p$.e = setProp(_el$2, "fg", _v$, _p$.e));
21471
21629
  _v$2 !== _p$.t && (_p$.t = setProp(_el$2, "attributes", _v$2, _p$.t));
21472
21630
  _v$3 !== _p$.a && (_p$.a = setProp(_el$5, "fg", _v$3, _p$.a));
@@ -21554,7 +21712,7 @@ function StatusBar() {
21554
21712
  insertNode(_el$0, createTextNode(`Press Ctrl+C again to exit`));
21555
21713
  setProp(_el$0, "wrapMode", "none");
21556
21714
  effect((_p$) => {
21557
- var _v$4 = theme.warning, _v$5 = TextAttributes14.BOLD;
21715
+ var _v$4 = theme.warning, _v$5 = TextAttributes15.BOLD;
21558
21716
  _v$4 !== _p$.e && (_p$.e = setProp(_el$0, "fg", _v$4, _p$.e));
21559
21717
  _v$5 !== _p$.t && (_p$.t = setProp(_el$0, "attributes", _v$5, _p$.t));
21560
21718
  return _p$;
@@ -21566,7 +21724,7 @@ function StatusBar() {
21566
21724
  }
21567
21725
  }), null);
21568
21726
  effect((_p$) => {
21569
- var _v$6 = theme.primary, _v$7 = TextAttributes14.BOLD;
21727
+ var _v$6 = theme.primary, _v$7 = TextAttributes15.BOLD;
21570
21728
  _v$6 !== _p$.e && (_p$.e = setProp(_el$8, "fg", _v$6, _p$.e));
21571
21729
  _v$7 !== _p$.t && (_p$.t = setProp(_el$8, "attributes", _v$7, _p$.t));
21572
21730
  return _p$;
@@ -21755,7 +21913,7 @@ var init_notifications = __esm(() => {
21755
21913
  });
21756
21914
 
21757
21915
  // src/tui/component/toast-overlay.tsx
21758
- import { TextAttributes as TextAttributes15 } from "@opentui/core";
21916
+ import { TextAttributes as TextAttributes16 } from "@opentui/core";
21759
21917
  function ToastOverlay() {
21760
21918
  const {
21761
21919
  theme
@@ -21798,7 +21956,7 @@ function ToastOverlay() {
21798
21956
  setProp(_el$4, "wrapMode", "none");
21799
21957
  insert(_el$4, () => toast.title);
21800
21958
  effect((_p$) => {
21801
- var _v$3 = bg(), _v$4 = fg(), _v$5 = TextAttributes15.BOLD, _v$6 = fg();
21959
+ var _v$3 = bg(), _v$4 = fg(), _v$5 = TextAttributes16.BOLD, _v$6 = fg();
21802
21960
  _v$3 !== _p$.e && (_p$.e = setProp(_el$2, "backgroundColor", _v$3, _p$.e));
21803
21961
  _v$4 !== _p$.t && (_p$.t = setProp(_el$3, "fg", _v$4, _p$.t));
21804
21962
  _v$5 !== _p$.a && (_p$.a = setProp(_el$3, "attributes", _v$5, _p$.a));
@@ -21858,7 +22016,7 @@ function repoBasename2(repo) {
21858
22016
 
21859
22017
  // src/tui/component/top-bar.tsx
21860
22018
  import { spawnSync as spawnSync10 } from "child_process";
21861
- import { TextAttributes as TextAttributes16 } from "@opentui/core";
22019
+ import { TextAttributes as TextAttributes17 } from "@opentui/core";
21862
22020
  function TopBar(props) {
21863
22021
  const {
21864
22022
  theme
@@ -21933,7 +22091,7 @@ function TopBar(props) {
21933
22091
  insertNode(_el$7, createTextNode(`[Update]`));
21934
22092
  setProp(_el$7, "onMouseUp", () => void confirmUpdate());
21935
22093
  effect((_p$) => {
21936
- var _v$ = theme.warning, _v$2 = TextAttributes16.BOLD;
22094
+ var _v$ = theme.warning, _v$2 = TextAttributes17.BOLD;
21937
22095
  _v$ !== _p$.e && (_p$.e = setProp(_el$7, "fg", _v$, _p$.e));
21938
22096
  _v$2 !== _p$.t && (_p$.t = setProp(_el$7, "attributes", _v$2, _p$.t));
21939
22097
  return _p$;
@@ -21969,7 +22127,7 @@ function TopBar(props) {
21969
22127
  insertNode(_el$12, createTextNode(`daemon disconnected`));
21970
22128
  setProp(_el$12, "wrapMode", "none");
21971
22129
  effect((_p$) => {
21972
- var _v$6 = theme.error, _v$7 = TextAttributes16.BOLD;
22130
+ var _v$6 = theme.error, _v$7 = TextAttributes17.BOLD;
21973
22131
  _v$6 !== _p$.e && (_p$.e = setProp(_el$12, "fg", _v$6, _p$.e));
21974
22132
  _v$7 !== _p$.t && (_p$.t = setProp(_el$12, "attributes", _v$7, _p$.t));
21975
22133
  return _p$;
@@ -21999,7 +22157,7 @@ function TopBar(props) {
21999
22157
  setProp(_el$15, "wrapMode", "none");
22000
22158
  insert(_el$15, () => label().repoName);
22001
22159
  effect((_p$) => {
22002
- var _v$8 = label().branch ? theme.textMuted : theme.text, _v$9 = label().branch ? undefined : TextAttributes16.BOLD;
22160
+ var _v$8 = label().branch ? theme.textMuted : theme.text, _v$9 = label().branch ? undefined : TextAttributes17.BOLD;
22003
22161
  _v$8 !== _p$.e && (_p$.e = setProp(_el$15, "fg", _v$8, _p$.e));
22004
22162
  _v$9 !== _p$.t && (_p$.t = setProp(_el$15, "attributes", _v$9, _p$.t));
22005
22163
  return _p$;
@@ -22031,7 +22189,7 @@ function TopBar(props) {
22031
22189
  setProp(_el$18, "wrapMode", "none");
22032
22190
  insert(_el$18, () => label().branch);
22033
22191
  effect((_p$) => {
22034
- var _v$0 = theme.text, _v$1 = TextAttributes16.BOLD;
22192
+ var _v$0 = theme.text, _v$1 = TextAttributes17.BOLD;
22035
22193
  _v$0 !== _p$.e && (_p$.e = setProp(_el$18, "fg", _v$0, _p$.e));
22036
22194
  _v$1 !== _p$.t && (_p$.t = setProp(_el$18, "attributes", _v$1, _p$.t));
22037
22195
  return _p$;
@@ -22054,7 +22212,7 @@ function TopBar(props) {
22054
22212
  setProp(_el$11, "gap", 2);
22055
22213
  setProp(_el$11, "justifyContent", "flex-end");
22056
22214
  effect((_p$) => {
22057
- var _v$3 = theme.primary, _v$4 = TextAttributes16.BOLD, _v$5 = theme.textMuted;
22215
+ var _v$3 = theme.primary, _v$4 = TextAttributes17.BOLD, _v$5 = theme.textMuted;
22058
22216
  _v$3 !== _p$.e && (_p$.e = setProp(_el$3, "fg", _v$3, _p$.e));
22059
22217
  _v$4 !== _p$.t && (_p$.t = setProp(_el$3, "attributes", _v$4, _p$.t));
22060
22218
  _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.6",
5
5
  "description": "TUI orchestrator for Claude Code (codename)",
6
6
  "type": "module",
7
7
  "packageManager": "bun@1.3.13",