@sma1lboy/kobe 0.5.8 → 0.5.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli/index.js CHANGED
@@ -8857,7 +8857,7 @@ var init_package = __esm(() => {
8857
8857
  package_default = {
8858
8858
  $schema: "https://json.schemastore.org/package.json",
8859
8859
  name: "@sma1lboy/kobe",
8860
- version: "0.5.8",
8860
+ version: "0.5.9",
8861
8861
  description: "TUI orchestrator for Claude Code (codename)",
8862
8862
  type: "module",
8863
8863
  packageManager: "bun@1.3.13",
@@ -10580,6 +10580,7 @@ class Orchestrator {
10580
10580
  worktrees;
10581
10581
  metadataSuggester;
10582
10582
  handles = new Map;
10583
+ firstSpawnLatches = new Map;
10583
10584
  subscribers = new Map;
10584
10585
  pumps = new Map;
10585
10586
  pendingInputBroker = new InMemoryPendingInputBroker;
@@ -10812,8 +10813,16 @@ class Orchestrator {
10812
10813
  const renameTabId = this.resolveTab(task, tabId).id;
10813
10814
  this.maybeRenameTempBranch(task.id, renameTabId, prompt);
10814
10815
  }
10815
- const targetTab = this.resolveTab(task, tabId);
10816
+ let targetTab = this.resolveTab(task, tabId);
10816
10817
  const key = tabKey(task.id, targetTab.id);
10818
+ if (!targetTab.sessionId) {
10819
+ const inflight = this.firstSpawnLatches.get(key);
10820
+ if (inflight) {
10821
+ await inflight.catch(() => {});
10822
+ task = this.requireTask(id);
10823
+ targetTab = this.resolveTab(task, tabId);
10824
+ }
10825
+ }
10817
10826
  if (this.handles.has(key) === false) {
10818
10827
  const running = this.countRunning();
10819
10828
  if (running >= CONCURRENCY_CAP) {
@@ -10834,18 +10843,28 @@ class Orchestrator {
10834
10843
  model: modelToUse
10835
10844
  });
10836
10845
  } else {
10837
- handle = await this.engine.spawn(task.worktreePath, promptToSend, {
10838
- permissionMode: task.permissionMode,
10839
- model: modelToUse
10846
+ let releaseLatch = () => {};
10847
+ const latch = new Promise((resolve3) => {
10848
+ releaseLatch = resolve3;
10840
10849
  });
10841
- await this.updateTab(task.id, targetTab.id, { sessionId: handle.sessionId });
10842
- if (task.title === PLACEHOLDER_TASK_TITLE && prompt && prompt.trim().length > 0) {
10843
- const derived = deriveTitleFromPrompt(prompt);
10844
- if (derived)
10845
- await this.store.update(task.id, { title: derived });
10846
- }
10847
- if (prompt && prompt.trim().length > 0) {
10848
- this.maybeUpgradeTitle(task.id, prompt);
10850
+ this.firstSpawnLatches.set(key, latch);
10851
+ try {
10852
+ handle = await this.engine.spawn(task.worktreePath, promptToSend, {
10853
+ permissionMode: task.permissionMode,
10854
+ model: modelToUse
10855
+ });
10856
+ await this.updateTab(task.id, targetTab.id, { sessionId: handle.sessionId });
10857
+ if (task.title === PLACEHOLDER_TASK_TITLE && prompt && prompt.trim().length > 0) {
10858
+ const derived = deriveTitleFromPrompt(prompt);
10859
+ if (derived)
10860
+ await this.store.update(task.id, { title: derived });
10861
+ }
10862
+ if (prompt && prompt.trim().length > 0) {
10863
+ this.maybeUpgradeTitle(task.id, prompt);
10864
+ }
10865
+ } finally {
10866
+ releaseLatch();
10867
+ this.firstSpawnLatches.delete(key);
10849
10868
  }
10850
10869
  }
10851
10870
  this.handles.set(key, handle);
@@ -10912,6 +10931,12 @@ class Orchestrator {
10912
10931
  }
10913
10932
  this.dispatchEvent(task.id, targetTab.id, { type: "done" });
10914
10933
  }
10934
+ async steerTask(id, prompt, tabId) {
10935
+ const task = this.requireTask(id);
10936
+ const targetTab = this.resolveTab(task, tabId);
10937
+ await this.interruptTask(task.id, targetTab.id);
10938
+ await this.runTask(task.id, prompt, targetTab.id);
10939
+ }
10915
10940
  async pauseTask(id) {
10916
10941
  const task = this.requireTask(id);
10917
10942
  if (task.status !== "in_progress") {
@@ -11459,6 +11484,10 @@ class RemoteOrchestrator {
11459
11484
  async interruptTask(taskId, tabId) {
11460
11485
  await this.client.request("chat.interrupt", { taskId, tabId });
11461
11486
  }
11487
+ async steerTask(taskId, text, tabId) {
11488
+ await this.client.request("chat.steer", { taskId, text, tabId });
11489
+ this.markRunState(taskId, tabId ?? this.getTask(taskId)?.activeTabId, "running");
11490
+ }
11462
11491
  async setArchived(taskId, archived) {
11463
11492
  await this.client.request("task.archive", { taskId, archived });
11464
11493
  }
@@ -15571,7 +15600,8 @@ var init_sync = __esm(() => {
15571
15600
  });
15572
15601
 
15573
15602
  // src/engine/claude-code-local/history.ts
15574
- import { readFile as readFile4, readdir, unlink as unlink2 } from "fs/promises";
15603
+ import { randomUUID } from "crypto";
15604
+ import { appendFile, mkdir as mkdir3, readFile as readFile4, readdir, unlink as unlink2, writeFile as writeFile3 } from "fs/promises";
15575
15605
  import { homedir as homedir8 } from "os";
15576
15606
  import path6 from "path";
15577
15607
  function encodeCwd(cwd) {
@@ -15668,6 +15698,76 @@ function extractUsage(v) {
15668
15698
  function isObject(v) {
15669
15699
  return typeof v === "object" && v !== null && !Array.isArray(v);
15670
15700
  }
15701
+ async function appendInterruptedUserPrompt(sessionId, cwd, prompt, deps = defaultDeps2) {
15702
+ if (!prompt || prompt.trim().length === 0)
15703
+ return;
15704
+ const projectDir = path6.join(deps.projectsDir(), encodeCwd(cwd));
15705
+ const filePath = path6.join(projectDir, `${sessionId}.jsonl`);
15706
+ let lines = [];
15707
+ try {
15708
+ const raw = await readFile4(filePath, "utf8");
15709
+ lines = raw.split(`
15710
+ `).filter((l) => l.length > 0);
15711
+ } catch (err) {
15712
+ if (err.code !== "ENOENT")
15713
+ throw err;
15714
+ await mkdir3(projectDir, { recursive: true });
15715
+ }
15716
+ let lastConvIdx = -1;
15717
+ let lastConvRecord = null;
15718
+ let lastConvRole = null;
15719
+ for (let i = lines.length - 1;i >= 0; i--) {
15720
+ let parsed;
15721
+ try {
15722
+ parsed = JSON.parse(lines[i]);
15723
+ } catch {
15724
+ continue;
15725
+ }
15726
+ if (!isObject(parsed))
15727
+ continue;
15728
+ const inner = isObject(parsed.message) ? parsed.message : parsed;
15729
+ const role = inner.role;
15730
+ if (role === "user" || role === "assistant") {
15731
+ lastConvIdx = i;
15732
+ lastConvRecord = parsed;
15733
+ lastConvRole = role;
15734
+ break;
15735
+ }
15736
+ }
15737
+ const now = new Date().toISOString();
15738
+ if (lastConvRole === "user" && lastConvRecord && lastConvIdx >= 0) {
15739
+ const inner = isObject(lastConvRecord.message) ? lastConvRecord.message : lastConvRecord;
15740
+ const existing = typeof inner.content === "string" ? inner.content : "";
15741
+ if (existing === prompt || existing.endsWith(`
15742
+
15743
+ ${prompt}`))
15744
+ return;
15745
+ inner.content = existing.length > 0 ? `${existing}
15746
+
15747
+ ${prompt}` : prompt;
15748
+ lastConvRecord.timestamp = now;
15749
+ lines[lastConvIdx] = JSON.stringify(lastConvRecord);
15750
+ await writeFile3(filePath, `${lines.join(`
15751
+ `)}
15752
+ `);
15753
+ return;
15754
+ }
15755
+ const parentUuid = lastConvRecord && typeof lastConvRecord.uuid === "string" ? lastConvRecord.uuid : null;
15756
+ const record = {
15757
+ type: "user",
15758
+ message: { role: "user", content: prompt },
15759
+ uuid: randomUUID(),
15760
+ parentUuid,
15761
+ sessionId,
15762
+ cwd,
15763
+ timestamp: now,
15764
+ isSidechain: false,
15765
+ userType: "external",
15766
+ version: "1.0.0"
15767
+ };
15768
+ await appendFile(filePath, `${JSON.stringify(record)}
15769
+ `);
15770
+ }
15671
15771
  var defaultDeps2;
15672
15772
  var init_history = __esm(() => {
15673
15773
  defaultDeps2 = {
@@ -16075,13 +16175,21 @@ class ClaudeCodeLocal {
16075
16175
  }
16076
16176
  async stop(handle) {
16077
16177
  const sid = handle.sessionId;
16078
- await this.registry.kill(sid, this.stopGraceMs);
16079
16178
  const session = this.running.get(sid);
16179
+ const shouldRescue = !!session && !session.completedNaturally && session.prompt.trim().length > 0;
16180
+ const rescuePrompt = session?.prompt ?? "";
16181
+ const rescueCwd = session?.cwd ?? handle.cwd;
16182
+ await this.registry.kill(sid, this.stopGraceMs);
16080
16183
  if (session) {
16081
16184
  session.closed = true;
16082
16185
  this.notify(session);
16083
16186
  this.running.delete(sid);
16084
16187
  }
16188
+ if (shouldRescue) {
16189
+ try {
16190
+ await appendInterruptedUserPrompt(sid, rescueCwd, rescuePrompt);
16191
+ } catch {}
16192
+ }
16085
16193
  }
16086
16194
  async start(args2) {
16087
16195
  const binaryPath = await this.binaryPathResolver();
@@ -16114,14 +16222,17 @@ class ClaudeCodeLocal {
16114
16222
  spawned,
16115
16223
  queue,
16116
16224
  waiters: [],
16117
- closed: false
16225
+ closed: false,
16226
+ completedNaturally: false,
16227
+ prompt: args2.prompt
16118
16228
  };
16119
16229
  this.running.set(sessionId, session);
16120
16230
  this.registry.register({
16121
16231
  sessionId,
16122
16232
  cwd: args2.cwd,
16123
16233
  proc: spawned.proc,
16124
- startedAt: Date.now()
16234
+ startedAt: Date.now(),
16235
+ prompt: args2.prompt
16125
16236
  });
16126
16237
  resolveHandle({ sessionId, cwd: args2.cwd });
16127
16238
  };
@@ -16143,6 +16254,9 @@ class ClaudeCodeLocal {
16143
16254
  try {
16144
16255
  for await (const ev of events) {
16145
16256
  queue.push(ev);
16257
+ if (ev.type === "done" && session) {
16258
+ session.completedNaturally = true;
16259
+ }
16146
16260
  if (session)
16147
16261
  this.notify(session);
16148
16262
  }
@@ -16731,7 +16845,11 @@ function stripNewlines(v) {
16731
16845
  return v.replace(/[\r\n]+/g, "");
16732
16846
  }
16733
16847
  function nextField(field) {
16734
- return field === "repo" ? "baseRef" : "repo";
16848
+ if (field === "repo")
16849
+ return "baseRef";
16850
+ if (field === "baseRef")
16851
+ return "confirm";
16852
+ return "repo";
16735
16853
  }
16736
16854
  function computeRepoOptions(defaultRepo, savedRepos) {
16737
16855
  const seen = new Set;
@@ -16799,6 +16917,27 @@ function validateRepoPath(repo) {
16799
16917
  }
16800
16918
  return null;
16801
16919
  }
16920
+ function getCurrentBranch(repo) {
16921
+ if (!repo)
16922
+ return null;
16923
+ try {
16924
+ const { spawnSync: spawnSync8 } = __require("child_process");
16925
+ const out = spawnSync8("git", ["rev-parse", "--abbrev-ref", "HEAD"], {
16926
+ cwd: repo,
16927
+ encoding: "utf-8",
16928
+ timeout: 2000,
16929
+ stdio: ["ignore", "pipe", "ignore"]
16930
+ });
16931
+ if (out.status !== 0)
16932
+ return null;
16933
+ const name = out.stdout.trim();
16934
+ if (!name || name === "HEAD")
16935
+ return null;
16936
+ return name;
16937
+ } catch {
16938
+ return null;
16939
+ }
16940
+ }
16802
16941
  function listLocalBranches(repo) {
16803
16942
  if (!repo)
16804
16943
  return [];
@@ -16896,7 +17035,8 @@ function NewTaskDialogView(props) {
16896
17035
  } = useTheme();
16897
17036
  const [field, setField] = createSignal("repo");
16898
17037
  const [repo, setRepo] = createSignal(props.defaultRepo);
16899
- const [baseRef, setBaseRef] = createSignal(DEFAULT_BASE_REF);
17038
+ const [baseRef, setBaseRef] = createSignal(getCurrentBranch(expandHome(props.defaultRepo.trim())) ?? DEFAULT_BASE_REF);
17039
+ const [baseRefTouched, setBaseRefTouched] = createSignal(false);
16900
17040
  const repoOptions = createMemo(() => computeRepoOptions(props.defaultRepo, props.savedRepos));
16901
17041
  const mode = createMemo(() => pickerModeFor(repo(), repoOptions()));
16902
17042
  const subdirSplit = createMemo(() => splitPathForDirSuggest(repo()));
@@ -16914,6 +17054,16 @@ function NewTaskDialogView(props) {
16914
17054
  branchFiltered();
16915
17055
  setBranchCursor(0);
16916
17056
  });
17057
+ createEffect(() => {
17058
+ const r = expandHome(repo().trim());
17059
+ if (!r)
17060
+ return;
17061
+ if (baseRefTouched())
17062
+ return;
17063
+ const current = getCurrentBranch(r);
17064
+ if (current)
17065
+ setBaseRef(current);
17066
+ });
16917
17067
  createEffect(() => {
16918
17068
  activeList();
16919
17069
  setRepoCursor(0);
@@ -16945,7 +17095,7 @@ function NewTaskDialogView(props) {
16945
17095
  const picked2 = activeList()[0];
16946
17096
  if (picked2) {
16947
17097
  setRepo(picked2);
16948
- commit();
17098
+ setField("baseRef");
16949
17099
  return;
16950
17100
  }
16951
17101
  }
@@ -16964,16 +17114,16 @@ function NewTaskDialogView(props) {
16964
17114
  return;
16965
17115
  }
16966
17116
  }
16967
- commit();
17117
+ setField("baseRef");
16968
17118
  return;
16969
17119
  }
16970
17120
  const picked = activeList()[repoCursor()];
16971
17121
  if (picked) {
16972
17122
  setRepo(picked);
16973
- commit();
17123
+ setField("baseRef");
16974
17124
  return;
16975
17125
  }
16976
- commit();
17126
+ setField("baseRef");
16977
17127
  }
16978
17128
  function selectRepoAtMouse(absoluteIndex) {
16979
17129
  const list = activeList();
@@ -17030,8 +17180,15 @@ function NewTaskDialogView(props) {
17030
17180
  }
17031
17181
  }]
17032
17182
  }));
17183
+ useBindings(() => ({
17184
+ enabled: field() === "confirm",
17185
+ bindings: [{
17186
+ key: "return",
17187
+ cmd: () => commit()
17188
+ }]
17189
+ }));
17033
17190
  return (() => {
17034
- var _el$ = createElement("box"), _el$2 = createElement("box"), _el$3 = createElement("text"), _el$5 = createElement("text"), _el$7 = createElement("box"), _el$8 = createElement("text"), _el$0 = createElement("input"), _el$18 = createElement("box"), _el$19 = createElement("text"), _el$21 = createElement("input"), _el$31 = createElement("box"), _el$32 = createElement("text");
17191
+ var _el$ = createElement("box"), _el$2 = createElement("box"), _el$3 = createElement("text"), _el$5 = createElement("text"), _el$7 = createElement("box"), _el$8 = createElement("text"), _el$0 = createElement("input"), _el$18 = createElement("box"), _el$19 = createElement("text"), _el$21 = createElement("input"), _el$31 = createElement("box"), _el$32 = createElement("text"), _el$34 = createElement("text");
17035
17192
  insertNode(_el$, _el$2);
17036
17193
  insertNode(_el$, _el$7);
17037
17194
  insertNode(_el$, _el$18);
@@ -17090,23 +17247,23 @@ function NewTaskDialogView(props) {
17090
17247
  const suffix = () => mode() === "browse" ? "/" : "";
17091
17248
  const tag = () => isCurrentDir() ? " (current dir)" : "";
17092
17249
  return (() => {
17093
- var _el$34 = createElement("text");
17094
- setProp(_el$34, "wrapMode", "none");
17095
- setProp(_el$34, "onMouseUp", () => selectRepoAtMouse(absoluteIndex()));
17096
- insert(_el$34, () => isCursor() ? "\u25B8 " : " ", null);
17097
- insert(_el$34, name, null);
17098
- insert(_el$34, suffix, null);
17099
- insert(_el$34, tag, null);
17250
+ var _el$35 = createElement("text");
17251
+ setProp(_el$35, "wrapMode", "none");
17252
+ setProp(_el$35, "onMouseUp", () => selectRepoAtMouse(absoluteIndex()));
17253
+ insert(_el$35, () => isCursor() ? "\u25B8 " : " ", null);
17254
+ insert(_el$35, name, null);
17255
+ insert(_el$35, suffix, null);
17256
+ insert(_el$35, tag, null);
17100
17257
  effect((_p$) => {
17101
- var _v$10 = isCursor() ? theme.primary : isSelected() ? theme.accent : theme.textMuted, _v$11 = isCursor() ? TextAttributes19.BOLD : undefined;
17102
- _v$10 !== _p$.e && (_p$.e = setProp(_el$34, "fg", _v$10, _p$.e));
17103
- _v$11 !== _p$.t && (_p$.t = setProp(_el$34, "attributes", _v$11, _p$.t));
17258
+ var _v$12 = isCursor() ? theme.primary : isSelected() ? theme.accent : theme.textMuted, _v$13 = isCursor() ? TextAttributes19.BOLD : undefined;
17259
+ _v$12 !== _p$.e && (_p$.e = setProp(_el$35, "fg", _v$12, _p$.e));
17260
+ _v$13 !== _p$.t && (_p$.t = setProp(_el$35, "attributes", _v$13, _p$.t));
17104
17261
  return _p$;
17105
17262
  }, {
17106
17263
  e: undefined,
17107
17264
  t: undefined
17108
17265
  });
17109
- return _el$34;
17266
+ return _el$35;
17110
17267
  })();
17111
17268
  }
17112
17269
  }), null);
@@ -17144,10 +17301,14 @@ function NewTaskDialogView(props) {
17144
17301
  setProp(_el$18, "gap", 0);
17145
17302
  insertNode(_el$19, createTextNode(`from branch`));
17146
17303
  setProp(_el$21, "placeholder", DEFAULT_BASE_REF);
17147
- setProp(_el$21, "onInput", (v) => setBaseRef(stripNewlines(v)));
17304
+ setProp(_el$21, "onInput", (v) => {
17305
+ setBaseRefTouched(true);
17306
+ setBaseRef(stripNewlines(v));
17307
+ });
17148
17308
  setProp(_el$21, "onSubmit", () => {
17149
17309
  setBaseRef(resolveBaseRef(baseRef(), branchFiltered(), branchCursor()));
17150
- commit();
17310
+ setBaseRefTouched(true);
17311
+ setField("confirm");
17151
17312
  });
17152
17313
  insert(_el$, createComponent2(Show, {
17153
17314
  get when() {
@@ -17197,25 +17358,26 @@ function NewTaskDialogView(props) {
17197
17358
  const isCursor = () => absoluteIndex() === branchCursor();
17198
17359
  const isSelected = () => baseRef().trim() === name;
17199
17360
  return (() => {
17200
- var _el$35 = createElement("text");
17201
- setProp(_el$35, "wrapMode", "none");
17202
- setProp(_el$35, "onMouseUp", () => {
17361
+ var _el$36 = createElement("text");
17362
+ setProp(_el$36, "wrapMode", "none");
17363
+ setProp(_el$36, "onMouseUp", () => {
17203
17364
  setBaseRef(name);
17365
+ setBaseRefTouched(true);
17204
17366
  setBranchCursor(absoluteIndex());
17205
- commit();
17367
+ setField("confirm");
17206
17368
  });
17207
- insert(_el$35, () => isCursor() ? "\u25B8 " : " ", null);
17208
- insert(_el$35, name, null);
17369
+ insert(_el$36, () => isCursor() ? "\u25B8 " : " ", null);
17370
+ insert(_el$36, name, null);
17209
17371
  effect((_p$) => {
17210
- var _v$12 = isCursor() ? theme.primary : isSelected() ? theme.accent : theme.textMuted, _v$13 = isCursor() ? TextAttributes19.BOLD : undefined;
17211
- _v$12 !== _p$.e && (_p$.e = setProp(_el$35, "fg", _v$12, _p$.e));
17212
- _v$13 !== _p$.t && (_p$.t = setProp(_el$35, "attributes", _v$13, _p$.t));
17372
+ var _v$14 = isCursor() ? theme.primary : isSelected() ? theme.accent : theme.textMuted, _v$15 = isCursor() ? TextAttributes19.BOLD : undefined;
17373
+ _v$14 !== _p$.e && (_p$.e = setProp(_el$36, "fg", _v$14, _p$.e));
17374
+ _v$15 !== _p$.t && (_p$.t = setProp(_el$36, "attributes", _v$15, _p$.t));
17213
17375
  return _p$;
17214
17376
  }, {
17215
17377
  e: undefined,
17216
17378
  t: undefined
17217
17379
  });
17218
- return _el$35;
17380
+ return _el$36;
17219
17381
  })();
17220
17382
  }
17221
17383
  }), null);
@@ -17237,10 +17399,15 @@ function NewTaskDialogView(props) {
17237
17399
  }
17238
17400
  }), _el$31);
17239
17401
  insertNode(_el$31, _el$32);
17402
+ insertNode(_el$31, _el$34);
17403
+ setProp(_el$31, "flexDirection", "row");
17404
+ setProp(_el$31, "justifyContent", "space-between");
17240
17405
  setProp(_el$31, "paddingBottom", 1);
17241
17406
  insertNode(_el$32, createTextNode(`\u2191\u2193 pick \xB7 enter select \xB7 tab next field \xB7 esc cancel`));
17407
+ setProp(_el$34, "onMouseUp", () => commit());
17408
+ insert(_el$34, () => field() === "confirm" ? "\u25B8 [ Create ]" : " [ Create ]");
17242
17409
  effect((_p$) => {
17243
- var _v$ = TextAttributes19.BOLD, _v$2 = theme.text, _v$3 = theme.textMuted, _v$4 = field() === "repo" ? theme.accent : theme.textMuted, _v$5 = repo(), _v$6 = props.defaultRepo, _v$7 = field() === "repo", _v$8 = field() === "baseRef" ? theme.accent : theme.textMuted, _v$9 = baseRef(), _v$0 = field() === "baseRef", _v$1 = theme.textMuted;
17410
+ var _v$ = TextAttributes19.BOLD, _v$2 = theme.text, _v$3 = theme.textMuted, _v$4 = field() === "repo" ? theme.accent : theme.textMuted, _v$5 = repo(), _v$6 = props.defaultRepo, _v$7 = field() === "repo", _v$8 = field() === "baseRef" ? theme.accent : theme.textMuted, _v$9 = baseRef(), _v$0 = field() === "baseRef", _v$1 = theme.textMuted, _v$10 = field() === "confirm" ? theme.primary : theme.text, _v$11 = field() === "confirm" ? TextAttributes19.BOLD : undefined;
17244
17411
  _v$ !== _p$.e && (_p$.e = setProp(_el$3, "attributes", _v$, _p$.e));
17245
17412
  _v$2 !== _p$.t && (_p$.t = setProp(_el$3, "fg", _v$2, _p$.t));
17246
17413
  _v$3 !== _p$.a && (_p$.a = setProp(_el$5, "fg", _v$3, _p$.a));
@@ -17252,6 +17419,8 @@ function NewTaskDialogView(props) {
17252
17419
  _v$9 !== _p$.r && (_p$.r = setProp(_el$21, "value", _v$9, _p$.r));
17253
17420
  _v$0 !== _p$.d && (_p$.d = setProp(_el$21, "focused", _v$0, _p$.d));
17254
17421
  _v$1 !== _p$.l && (_p$.l = setProp(_el$32, "fg", _v$1, _p$.l));
17422
+ _v$10 !== _p$.u && (_p$.u = setProp(_el$34, "fg", _v$10, _p$.u));
17423
+ _v$11 !== _p$.c && (_p$.c = setProp(_el$34, "attributes", _v$11, _p$.c));
17255
17424
  return _p$;
17256
17425
  }, {
17257
17426
  e: undefined,
@@ -17264,7 +17433,9 @@ function NewTaskDialogView(props) {
17264
17433
  h: undefined,
17265
17434
  r: undefined,
17266
17435
  d: undefined,
17267
- l: undefined
17436
+ l: undefined,
17437
+ u: undefined,
17438
+ c: undefined
17268
17439
  });
17269
17440
  return _el$;
17270
17441
  })();
@@ -17409,11 +17580,17 @@ var init_rename_task_dialog = __esm(() => {
17409
17580
  function useTaskActions(deps) {
17410
17581
  const { orchestrator, dialog, kv, selectedId, setSelectedId, setFocusedPane, savedRepos } = deps;
17411
17582
  async function openNewTaskFlow() {
17412
- const lastRepo = (() => {
17583
+ const defaultRepo = (() => {
17584
+ const sid = selectedId();
17585
+ if (sid) {
17586
+ const task = orchestrator.getTask(sid);
17587
+ if (task?.repo?.trim())
17588
+ return task.repo;
17589
+ }
17413
17590
  const raw = kv.get("lastNewTaskRepo");
17414
17591
  return typeof raw === "string" && raw.trim() ? raw : process.cwd();
17415
17592
  })();
17416
- const result = await NewTaskDialog.show(dialog, lastRepo, savedRepos());
17593
+ const result = await NewTaskDialog.show(dialog, defaultRepo, savedRepos());
17417
17594
  if (!result)
17418
17595
  return;
17419
17596
  try {
@@ -17956,7 +18133,7 @@ var init_history2 = __esm(() => {
17956
18133
  });
17957
18134
 
17958
18135
  // src/tui/panes/chat/composer/image-paste.ts
17959
- import { randomUUID } from "crypto";
18136
+ import { randomUUID as randomUUID2 } from "crypto";
17960
18137
  import { mkdirSync as mkdirSync5, writeFileSync as writeFileSync4 } from "fs";
17961
18138
  import { join as join13 } from "path";
17962
18139
  function pastedImagesDir() {
@@ -18040,7 +18217,7 @@ function mimeTypeToExt(mimeType) {
18040
18217
  return ".png";
18041
18218
  }
18042
18219
  function mintPath(ext) {
18043
- return join13(pastedImagesDir(), `${randomUUID()}${ext}`);
18220
+ return join13(pastedImagesDir(), `${randomUUID2()}${ext}`);
18044
18221
  }
18045
18222
  var IMAGE_TOKEN_RE;
18046
18223
  var init_image_paste = __esm(() => {
@@ -18642,9 +18819,9 @@ function Composer(props) {
18642
18819
  return theme.border;
18643
18820
  };
18644
18821
  return (() => {
18645
- var _el$ = createElement("box"), _el$14 = createElement("box"), _el$15 = createElement("box"), _el$16 = createElement("box"), _el$17 = createElement("text"), _el$18 = createElement("box"), _el$25 = createElement("box"), _el$26 = createElement("box");
18822
+ var _el$ = createElement("box"), _el$14 = createElement("box"), _el$15 = createElement("box"), _el$21 = createElement("box"), _el$22 = createElement("text"), _el$23 = createElement("box"), _el$30 = createElement("box"), _el$31 = createElement("box");
18646
18823
  insertNode(_el$, _el$14);
18647
- insertNode(_el$, _el$25);
18824
+ insertNode(_el$, _el$30);
18648
18825
  setProp(_el$, "flexShrink", 0);
18649
18826
  setProp(_el$, "flexDirection", "column");
18650
18827
  setProp(_el$, "paddingTop", 1);
@@ -18691,35 +18868,35 @@ function Composer(props) {
18691
18868
  return idx >= 0 ? match.displayPath.slice(0, idx) : "";
18692
18869
  };
18693
18870
  return (() => {
18694
- var _el$27 = createElement("box"), _el$28 = createElement("text");
18695
- insertNode(_el$27, _el$28);
18696
- setProp(_el$27, "flexDirection", "row");
18697
- setProp(_el$27, "gap", 2);
18698
- setProp(_el$28, "wrapMode", "none");
18699
- insert(_el$28, () => active() ? "\u25B8 " : " ", null);
18700
- insert(_el$28, filename, null);
18701
- insert(_el$27, createComponent2(Show, {
18871
+ var _el$32 = createElement("box"), _el$33 = createElement("text");
18872
+ insertNode(_el$32, _el$33);
18873
+ setProp(_el$32, "flexDirection", "row");
18874
+ setProp(_el$32, "gap", 2);
18875
+ setProp(_el$33, "wrapMode", "none");
18876
+ insert(_el$33, () => active() ? "\u25B8 " : " ", null);
18877
+ insert(_el$33, filename, null);
18878
+ insert(_el$32, createComponent2(Show, {
18702
18879
  get when() {
18703
18880
  return directory().length > 0;
18704
18881
  },
18705
18882
  get children() {
18706
- var _el$29 = createElement("text");
18707
- setProp(_el$29, "wrapMode", "none");
18708
- insert(_el$29, directory);
18709
- effect((_$p) => setProp(_el$29, "fg", theme.textMuted, _$p));
18710
- return _el$29;
18883
+ var _el$34 = createElement("text");
18884
+ setProp(_el$34, "wrapMode", "none");
18885
+ insert(_el$34, directory);
18886
+ effect((_$p) => setProp(_el$34, "fg", theme.textMuted, _$p));
18887
+ return _el$34;
18711
18888
  }
18712
18889
  }), null);
18713
18890
  effect((_p$) => {
18714
- var _v$20 = active() ? theme.primary : theme.text, _v$21 = active() ? TextAttributes22.BOLD : undefined;
18715
- _v$20 !== _p$.e && (_p$.e = setProp(_el$28, "fg", _v$20, _p$.e));
18716
- _v$21 !== _p$.t && (_p$.t = setProp(_el$28, "attributes", _v$21, _p$.t));
18891
+ var _v$23 = active() ? theme.primary : theme.text, _v$24 = active() ? TextAttributes22.BOLD : undefined;
18892
+ _v$23 !== _p$.e && (_p$.e = setProp(_el$33, "fg", _v$23, _p$.e));
18893
+ _v$24 !== _p$.t && (_p$.t = setProp(_el$33, "attributes", _v$24, _p$.t));
18717
18894
  return _p$;
18718
18895
  }, {
18719
18896
  e: undefined,
18720
18897
  t: undefined
18721
18898
  });
18722
- return _el$27;
18899
+ return _el$32;
18723
18900
  })();
18724
18901
  }
18725
18902
  }), null);
@@ -18786,47 +18963,47 @@ function Composer(props) {
18786
18963
  const absoluteIndex = () => slashWindow().start + i();
18787
18964
  const active = () => absoluteIndex() === slashCursor();
18788
18965
  return (() => {
18789
- var _el$30 = createElement("box"), _el$31 = createElement("text");
18790
- insertNode(_el$30, _el$31);
18791
- setProp(_el$30, "flexDirection", "row");
18792
- setProp(_el$30, "gap", 2);
18793
- setProp(_el$31, "wrapMode", "none");
18794
- insert(_el$31, () => active() ? "\u25B8 " : " ", null);
18795
- insert(_el$31, () => entry.display, null);
18796
- insert(_el$30, createComponent2(Show, {
18966
+ var _el$35 = createElement("box"), _el$36 = createElement("text");
18967
+ insertNode(_el$35, _el$36);
18968
+ setProp(_el$35, "flexDirection", "row");
18969
+ setProp(_el$35, "gap", 2);
18970
+ setProp(_el$36, "wrapMode", "none");
18971
+ insert(_el$36, () => active() ? "\u25B8 " : " ", null);
18972
+ insert(_el$36, () => entry.display, null);
18973
+ insert(_el$35, createComponent2(Show, {
18797
18974
  get when() {
18798
18975
  return entry.source === "user";
18799
18976
  },
18800
18977
  get children() {
18801
- var _el$32 = createElement("text");
18802
- insertNode(_el$32, createTextNode(`user`));
18803
- setProp(_el$32, "wrapMode", "none");
18804
- effect((_$p) => setProp(_el$32, "fg", theme.textMuted, _$p));
18805
- return _el$32;
18978
+ var _el$37 = createElement("text");
18979
+ insertNode(_el$37, createTextNode(`user`));
18980
+ setProp(_el$37, "wrapMode", "none");
18981
+ effect((_$p) => setProp(_el$37, "fg", theme.textMuted, _$p));
18982
+ return _el$37;
18806
18983
  }
18807
18984
  }), null);
18808
- insert(_el$30, createComponent2(Show, {
18985
+ insert(_el$35, createComponent2(Show, {
18809
18986
  get when() {
18810
18987
  return entry.description;
18811
18988
  },
18812
18989
  get children() {
18813
- var _el$34 = createElement("text");
18814
- setProp(_el$34, "wrapMode", "none");
18815
- insert(_el$34, () => entry.description);
18816
- effect((_$p) => setProp(_el$34, "fg", theme.textMuted, _$p));
18817
- return _el$34;
18990
+ var _el$39 = createElement("text");
18991
+ setProp(_el$39, "wrapMode", "none");
18992
+ insert(_el$39, () => entry.description);
18993
+ effect((_$p) => setProp(_el$39, "fg", theme.textMuted, _$p));
18994
+ return _el$39;
18818
18995
  }
18819
18996
  }), null);
18820
18997
  effect((_p$) => {
18821
- var _v$22 = active() ? theme.primary : theme.text, _v$23 = active() ? TextAttributes22.BOLD : undefined;
18822
- _v$22 !== _p$.e && (_p$.e = setProp(_el$31, "fg", _v$22, _p$.e));
18823
- _v$23 !== _p$.t && (_p$.t = setProp(_el$31, "attributes", _v$23, _p$.t));
18998
+ var _v$25 = active() ? theme.primary : theme.text, _v$26 = active() ? TextAttributes22.BOLD : undefined;
18999
+ _v$25 !== _p$.e && (_p$.e = setProp(_el$36, "fg", _v$25, _p$.e));
19000
+ _v$26 !== _p$.t && (_p$.t = setProp(_el$36, "attributes", _v$26, _p$.t));
18824
19001
  return _p$;
18825
19002
  }, {
18826
19003
  e: undefined,
18827
19004
  t: undefined
18828
19005
  });
18829
- return _el$30;
19006
+ return _el$35;
18830
19007
  })();
18831
19008
  }
18832
19009
  }), null);
@@ -18860,37 +19037,125 @@ function Composer(props) {
18860
19037
  }), _el$14);
18861
19038
  insertNode(_el$14, _el$15);
18862
19039
  setProp(_el$14, "border", ["left"]);
18863
- insertNode(_el$15, _el$16);
19040
+ insertNode(_el$15, _el$21);
18864
19041
  setProp(_el$15, "paddingLeft", 2);
18865
19042
  setProp(_el$15, "paddingRight", 2);
18866
19043
  setProp(_el$15, "paddingTop", 1);
18867
19044
  setProp(_el$15, "paddingBottom", 0);
18868
19045
  setProp(_el$15, "flexDirection", "column");
18869
19046
  setProp(_el$15, "flexGrow", 1);
18870
- insertNode(_el$16, _el$17);
18871
- insertNode(_el$16, _el$18);
18872
- setProp(_el$16, "flexDirection", "row");
18873
- setProp(_el$16, "gap", 1);
18874
- setProp(_el$16, "alignItems", "flex-start");
18875
- insert(_el$17, () => props.isStreaming ? "\u2026" : ">");
18876
- setProp(_el$18, "flexGrow", 1);
18877
- setProp(_el$18, "flexShrink", 1);
18878
- setProp(_el$18, "maxHeight", 8);
18879
- setProp(_el$18, "minHeight", 1);
18880
- insert(_el$18, createComponent2(Show, {
19047
+ insert(_el$15, createComponent2(Show, {
19048
+ get when() {
19049
+ return (props.queue?.() ?? []).length > 0;
19050
+ },
19051
+ get children() {
19052
+ var _el$16 = createElement("box");
19053
+ setProp(_el$16, "flexDirection", "column");
19054
+ setProp(_el$16, "paddingBottom", 1);
19055
+ insert(_el$16, createComponent2(For, {
19056
+ get each() {
19057
+ return (props.queue?.() ?? []).slice(0, QUEUE_VISIBLE_CAP);
19058
+ },
19059
+ children: (entry, idx) => (() => {
19060
+ var _el$40 = createElement("box"), _el$41 = createElement("text"), _el$43 = createElement("text"), _el$44 = createTextNode(`queued`), _el$45 = createTextNode(`:`), _el$46 = createElement("box"), _el$47 = createElement("text"), _el$48 = createElement("text"), _el$50 = createElement("text");
19061
+ insertNode(_el$40, _el$41);
19062
+ insertNode(_el$40, _el$43);
19063
+ insertNode(_el$40, _el$46);
19064
+ insertNode(_el$40, _el$48);
19065
+ insertNode(_el$40, _el$50);
19066
+ setProp(_el$40, "flexDirection", "row");
19067
+ setProp(_el$40, "gap", 1);
19068
+ setProp(_el$40, "alignItems", "flex-start");
19069
+ insertNode(_el$41, createTextNode(`+`));
19070
+ insertNode(_el$43, _el$44);
19071
+ insertNode(_el$43, _el$45);
19072
+ setProp(_el$43, "wrapMode", "none");
19073
+ insert(_el$43, () => idx() === 0 ? " (next)" : "", _el$45);
19074
+ insertNode(_el$46, _el$47);
19075
+ setProp(_el$46, "flexGrow", 1);
19076
+ insert(_el$47, () => entry.text);
19077
+ insertNode(_el$48, createTextNode(`[\u25B6]`));
19078
+ setProp(_el$48, "onMouseUp", () => props.onSendQueuedNow?.(entry.id));
19079
+ insertNode(_el$50, createTextNode(`[x]`));
19080
+ setProp(_el$50, "onMouseUp", () => props.onCancelQueued?.(entry.id));
19081
+ effect((_p$) => {
19082
+ var _v$27 = theme.textMuted, _v$28 = TextAttributes22.BOLD, _v$29 = theme.textMuted, _v$30 = theme.text, _v$31 = theme.primary, _v$32 = TextAttributes22.BOLD, _v$33 = theme.error, _v$34 = TextAttributes22.BOLD;
19083
+ _v$27 !== _p$.e && (_p$.e = setProp(_el$41, "fg", _v$27, _p$.e));
19084
+ _v$28 !== _p$.t && (_p$.t = setProp(_el$41, "attributes", _v$28, _p$.t));
19085
+ _v$29 !== _p$.a && (_p$.a = setProp(_el$43, "fg", _v$29, _p$.a));
19086
+ _v$30 !== _p$.o && (_p$.o = setProp(_el$47, "fg", _v$30, _p$.o));
19087
+ _v$31 !== _p$.i && (_p$.i = setProp(_el$48, "fg", _v$31, _p$.i));
19088
+ _v$32 !== _p$.n && (_p$.n = setProp(_el$48, "attributes", _v$32, _p$.n));
19089
+ _v$33 !== _p$.s && (_p$.s = setProp(_el$50, "fg", _v$33, _p$.s));
19090
+ _v$34 !== _p$.h && (_p$.h = setProp(_el$50, "attributes", _v$34, _p$.h));
19091
+ return _p$;
19092
+ }, {
19093
+ e: undefined,
19094
+ t: undefined,
19095
+ a: undefined,
19096
+ o: undefined,
19097
+ i: undefined,
19098
+ n: undefined,
19099
+ s: undefined,
19100
+ h: undefined
19101
+ });
19102
+ return _el$40;
19103
+ })()
19104
+ }), null);
19105
+ insert(_el$16, createComponent2(Show, {
19106
+ get when() {
19107
+ return (props.queue?.() ?? []).length > QUEUE_VISIBLE_CAP;
19108
+ },
19109
+ get children() {
19110
+ var _el$17 = createElement("box"), _el$18 = createElement("text"), _el$20 = createElement("text");
19111
+ insertNode(_el$17, _el$18);
19112
+ insertNode(_el$17, _el$20);
19113
+ setProp(_el$17, "flexDirection", "row");
19114
+ setProp(_el$17, "gap", 1);
19115
+ setProp(_el$17, "alignItems", "flex-start");
19116
+ insertNode(_el$18, createTextNode(`+`));
19117
+ insert(_el$20, () => `\u2026 ${(props.queue?.() ?? []).length - QUEUE_VISIBLE_CAP} more queued`);
19118
+ effect((_p$) => {
19119
+ var _v$7 = theme.textMuted, _v$8 = TextAttributes22.BOLD, _v$9 = theme.textMuted;
19120
+ _v$7 !== _p$.e && (_p$.e = setProp(_el$18, "fg", _v$7, _p$.e));
19121
+ _v$8 !== _p$.t && (_p$.t = setProp(_el$18, "attributes", _v$8, _p$.t));
19122
+ _v$9 !== _p$.a && (_p$.a = setProp(_el$20, "fg", _v$9, _p$.a));
19123
+ return _p$;
19124
+ }, {
19125
+ e: undefined,
19126
+ t: undefined,
19127
+ a: undefined
19128
+ });
19129
+ return _el$17;
19130
+ }
19131
+ }), null);
19132
+ return _el$16;
19133
+ }
19134
+ }), _el$21);
19135
+ insertNode(_el$21, _el$22);
19136
+ insertNode(_el$21, _el$23);
19137
+ setProp(_el$21, "flexDirection", "row");
19138
+ setProp(_el$21, "gap", 1);
19139
+ setProp(_el$21, "alignItems", "flex-start");
19140
+ insert(_el$22, () => props.isStreaming ? "\u2026" : ">");
19141
+ setProp(_el$23, "flexGrow", 1);
19142
+ setProp(_el$23, "flexShrink", 1);
19143
+ setProp(_el$23, "maxHeight", 8);
19144
+ setProp(_el$23, "minHeight", 1);
19145
+ insert(_el$23, createComponent2(Show, {
18881
19146
  get when() {
18882
19147
  return props.hasTask;
18883
19148
  },
18884
19149
  get fallback() {
18885
19150
  return (() => {
18886
- var _el$35 = createElement("text");
18887
- insert(_el$35, () => props.noTaskMessage ?? "(no task \u2014 press n to create)");
18888
- effect((_$p) => setProp(_el$35, "fg", theme.textMuted, _$p));
18889
- return _el$35;
19151
+ var _el$52 = createElement("text");
19152
+ insert(_el$52, () => props.noTaskMessage ?? "(no task \u2014 press n to create)");
19153
+ effect((_$p) => setProp(_el$52, "fg", theme.textMuted, _$p));
19154
+ return _el$52;
18890
19155
  })();
18891
19156
  },
18892
19157
  get children() {
18893
- var _el$19 = createElement("textarea");
19158
+ var _el$24 = createElement("textarea");
18894
19159
  use((r) => {
18895
19160
  textareaRef = r;
18896
19161
  if (props.draft)
@@ -18898,23 +19163,23 @@ function Composer(props) {
18898
19163
  r.onPaste = handlePaste;
18899
19164
  if (props.focused?.())
18900
19165
  r.focus();
18901
- }, _el$19);
18902
- setProp(_el$19, "wrapMode", "word");
18903
- setProp(_el$19, "keyBindings", composerKeyBindings);
18904
- setProp(_el$19, "onContentChange", handleContentChange);
18905
- setProp(_el$19, "onKeyDown", handleKeyDown);
18906
- setProp(_el$19, "onSubmit", () => handleSubmit("auto"));
19166
+ }, _el$24);
19167
+ setProp(_el$24, "wrapMode", "word");
19168
+ setProp(_el$24, "keyBindings", composerKeyBindings);
19169
+ setProp(_el$24, "onContentChange", handleContentChange);
19170
+ setProp(_el$24, "onKeyDown", handleKeyDown);
19171
+ setProp(_el$24, "onSubmit", () => handleSubmit("auto"));
18907
19172
  effect((_p$) => {
18908
- var _v$7 = resolvePlaceholder({
19173
+ var _v$0 = resolvePlaceholder({
18909
19174
  isStreaming: props.isStreaming,
18910
19175
  hasTask: props.hasTask,
18911
19176
  noTaskMessage: props.noTaskMessage
18912
- }), _v$8 = theme.textMuted, _v$9 = theme.text, _v$0 = theme.backgroundElement, _v$1 = theme.backgroundElement;
18913
- _v$7 !== _p$.e && (_p$.e = setProp(_el$19, "placeholder", _v$7, _p$.e));
18914
- _v$8 !== _p$.t && (_p$.t = setProp(_el$19, "placeholderColor", _v$8, _p$.t));
18915
- _v$9 !== _p$.a && (_p$.a = setProp(_el$19, "textColor", _v$9, _p$.a));
18916
- _v$0 !== _p$.o && (_p$.o = setProp(_el$19, "backgroundColor", _v$0, _p$.o));
18917
- _v$1 !== _p$.i && (_p$.i = setProp(_el$19, "focusedBackgroundColor", _v$1, _p$.i));
19177
+ }), _v$1 = theme.textMuted, _v$10 = theme.text, _v$11 = theme.backgroundElement, _v$12 = theme.backgroundElement;
19178
+ _v$0 !== _p$.e && (_p$.e = setProp(_el$24, "placeholder", _v$0, _p$.e));
19179
+ _v$1 !== _p$.t && (_p$.t = setProp(_el$24, "placeholderColor", _v$1, _p$.t));
19180
+ _v$10 !== _p$.a && (_p$.a = setProp(_el$24, "textColor", _v$10, _p$.a));
19181
+ _v$11 !== _p$.o && (_p$.o = setProp(_el$24, "backgroundColor", _v$11, _p$.o));
19182
+ _v$12 !== _p$.i && (_p$.i = setProp(_el$24, "focusedBackgroundColor", _v$12, _p$.i));
18918
19183
  return _p$;
18919
19184
  }, {
18920
19185
  e: undefined,
@@ -18923,7 +19188,7 @@ function Composer(props) {
18923
19188
  o: undefined,
18924
19189
  i: undefined
18925
19190
  });
18926
- return _el$19;
19191
+ return _el$24;
18927
19192
  }
18928
19193
  }));
18929
19194
  insert(_el$15, createComponent2(Show, {
@@ -18931,74 +19196,74 @@ function Composer(props) {
18931
19196
  return props.hasTask;
18932
19197
  },
18933
19198
  get children() {
18934
- var _el$20 = createElement("box"), _el$21 = createElement("text"), _el$22 = createElement("box"), _el$23 = createElement("box"), _el$24 = createElement("text");
18935
- insertNode(_el$20, _el$21);
18936
- insertNode(_el$20, _el$22);
18937
- setProp(_el$20, "flexDirection", "row");
18938
- setProp(_el$20, "justifyContent", "space-between");
18939
- setProp(_el$20, "paddingTop", 1);
18940
- setProp(_el$20, "flexShrink", 0);
18941
- setProp(_el$21, "wrapMode", "none");
18942
- insert(_el$21, footerHint);
18943
- insertNode(_el$22, _el$23);
18944
- setProp(_el$22, "flexDirection", "row");
18945
- setProp(_el$22, "gap", 2);
18946
- setProp(_el$22, "flexShrink", 0);
18947
- insert(_el$22, createComponent2(Show, {
19199
+ var _el$25 = createElement("box"), _el$26 = createElement("text"), _el$27 = createElement("box"), _el$28 = createElement("box"), _el$29 = createElement("text");
19200
+ insertNode(_el$25, _el$26);
19201
+ insertNode(_el$25, _el$27);
19202
+ setProp(_el$25, "flexDirection", "row");
19203
+ setProp(_el$25, "justifyContent", "space-between");
19204
+ setProp(_el$25, "paddingTop", 1);
19205
+ setProp(_el$25, "flexShrink", 0);
19206
+ setProp(_el$26, "wrapMode", "none");
19207
+ insert(_el$26, footerHint);
19208
+ insertNode(_el$27, _el$28);
19209
+ setProp(_el$27, "flexDirection", "row");
19210
+ setProp(_el$27, "gap", 2);
19211
+ setProp(_el$27, "flexShrink", 0);
19212
+ insert(_el$27, createComponent2(Show, {
18948
19213
  get when() {
18949
19214
  return modeBadge();
18950
19215
  },
18951
19216
  children: (badge) => (() => {
18952
- var _el$36 = createElement("text");
18953
- setProp(_el$36, "wrapMode", "none");
18954
- insert(_el$36, () => badge().label);
18955
- effect((_$p) => setProp(_el$36, "fg", toneColor(badge().tone), _$p));
18956
- return _el$36;
19217
+ var _el$53 = createElement("text");
19218
+ setProp(_el$53, "wrapMode", "none");
19219
+ insert(_el$53, () => badge().label);
19220
+ effect((_$p) => setProp(_el$53, "fg", toneColor(badge().tone), _$p));
19221
+ return _el$53;
18957
19222
  })()
18958
- }), _el$23);
18959
- insertNode(_el$23, _el$24);
18960
- setProp(_el$23, "flexDirection", "row");
18961
- setProp(_el$23, "flexShrink", 0);
18962
- setProp(_el$23, "onMouseUp", () => props.onChooseModel?.());
18963
- setProp(_el$24, "wrapMode", "none");
18964
- insert(_el$24, modelLabel, null);
18965
- insert(_el$24, () => props.onChooseModel ? " \u25BE" : "", null);
19223
+ }), _el$28);
19224
+ insertNode(_el$28, _el$29);
19225
+ setProp(_el$28, "flexDirection", "row");
19226
+ setProp(_el$28, "flexShrink", 0);
19227
+ setProp(_el$28, "onMouseUp", () => props.onChooseModel?.());
19228
+ setProp(_el$29, "wrapMode", "none");
19229
+ insert(_el$29, modelLabel, null);
19230
+ insert(_el$29, () => props.onChooseModel ? " \u25BE" : "", null);
18966
19231
  effect((_p$) => {
18967
- var _v$10 = props.isStreaming ? theme.accent : theme.textMuted, _v$11 = theme.textMuted;
18968
- _v$10 !== _p$.e && (_p$.e = setProp(_el$21, "fg", _v$10, _p$.e));
18969
- _v$11 !== _p$.t && (_p$.t = setProp(_el$24, "fg", _v$11, _p$.t));
19232
+ var _v$13 = props.isStreaming ? theme.accent : theme.textMuted, _v$14 = theme.textMuted;
19233
+ _v$13 !== _p$.e && (_p$.e = setProp(_el$26, "fg", _v$13, _p$.e));
19234
+ _v$14 !== _p$.t && (_p$.t = setProp(_el$29, "fg", _v$14, _p$.t));
18970
19235
  return _p$;
18971
19236
  }, {
18972
19237
  e: undefined,
18973
19238
  t: undefined
18974
19239
  });
18975
- return _el$20;
19240
+ return _el$25;
18976
19241
  }
18977
19242
  }), null);
18978
- insertNode(_el$25, _el$26);
18979
- setProp(_el$25, "height", 1);
18980
- setProp(_el$25, "border", ["left"]);
18981
- setProp(_el$26, "height", 1);
18982
- setProp(_el$26, "border", ["bottom"]);
19243
+ insertNode(_el$30, _el$31);
19244
+ setProp(_el$30, "height", 1);
19245
+ setProp(_el$30, "border", ["left"]);
19246
+ setProp(_el$31, "height", 1);
19247
+ setProp(_el$31, "border", ["bottom"]);
18983
19248
  effect((_p$) => {
18984
- var _v$12 = railColor(), _v$13 = {
19249
+ var _v$15 = railColor(), _v$16 = {
18985
19250
  ...SplitBorder.customBorderChars,
18986
19251
  bottomLeft: "\u2579"
18987
- }, _v$14 = theme.backgroundElement, _v$15 = props.isStreaming ? theme.accent : theme.primary, _v$16 = railColor(), _v$17 = {
19252
+ }, _v$17 = theme.backgroundElement, _v$18 = props.isStreaming ? theme.accent : theme.primary, _v$19 = railColor(), _v$20 = {
18988
19253
  ...EmptyBorder,
18989
19254
  vertical: theme.backgroundElement.a !== 0 ? "\u2579" : " "
18990
- }, _v$18 = theme.backgroundElement, _v$19 = {
19255
+ }, _v$21 = theme.backgroundElement, _v$22 = {
18991
19256
  ...EmptyBorder,
18992
19257
  horizontal: theme.backgroundElement.a !== 0 ? "\u2580" : " "
18993
19258
  };
18994
- _v$12 !== _p$.e && (_p$.e = setProp(_el$14, "borderColor", _v$12, _p$.e));
18995
- _v$13 !== _p$.t && (_p$.t = setProp(_el$14, "customBorderChars", _v$13, _p$.t));
18996
- _v$14 !== _p$.a && (_p$.a = setProp(_el$15, "backgroundColor", _v$14, _p$.a));
18997
- _v$15 !== _p$.o && (_p$.o = setProp(_el$17, "fg", _v$15, _p$.o));
18998
- _v$16 !== _p$.i && (_p$.i = setProp(_el$25, "borderColor", _v$16, _p$.i));
18999
- _v$17 !== _p$.n && (_p$.n = setProp(_el$25, "customBorderChars", _v$17, _p$.n));
19000
- _v$18 !== _p$.s && (_p$.s = setProp(_el$26, "borderColor", _v$18, _p$.s));
19001
- _v$19 !== _p$.h && (_p$.h = setProp(_el$26, "customBorderChars", _v$19, _p$.h));
19259
+ _v$15 !== _p$.e && (_p$.e = setProp(_el$14, "borderColor", _v$15, _p$.e));
19260
+ _v$16 !== _p$.t && (_p$.t = setProp(_el$14, "customBorderChars", _v$16, _p$.t));
19261
+ _v$17 !== _p$.a && (_p$.a = setProp(_el$15, "backgroundColor", _v$17, _p$.a));
19262
+ _v$18 !== _p$.o && (_p$.o = setProp(_el$22, "fg", _v$18, _p$.o));
19263
+ _v$19 !== _p$.i && (_p$.i = setProp(_el$30, "borderColor", _v$19, _p$.i));
19264
+ _v$20 !== _p$.n && (_p$.n = setProp(_el$30, "customBorderChars", _v$20, _p$.n));
19265
+ _v$21 !== _p$.s && (_p$.s = setProp(_el$31, "borderColor", _v$21, _p$.s));
19266
+ _v$22 !== _p$.h && (_p$.h = setProp(_el$31, "customBorderChars", _v$22, _p$.h));
19002
19267
  return _p$;
19003
19268
  }, {
19004
19269
  e: undefined,
@@ -19013,6 +19278,7 @@ function Composer(props) {
19013
19278
  return _el$;
19014
19279
  })();
19015
19280
  }
19281
+ var QUEUE_VISIBLE_CAP = 4;
19016
19282
  var init_Composer = __esm(() => {
19017
19283
  init_solid();
19018
19284
  init_solid();
@@ -21723,6 +21989,81 @@ var init_user_slashes = () => {};
21723
21989
  function totalContextTokens(u) {
21724
21990
  return u.input_tokens + (u.cache_read_input_tokens ?? 0) + (u.cache_creation_input_tokens ?? 0);
21725
21991
  }
21992
+ function parseTimestampMs(value) {
21993
+ const ms = new Date(value).getTime();
21994
+ return Number.isFinite(ms) ? ms : null;
21995
+ }
21996
+ function mergeIntervals(intervals) {
21997
+ if (intervals.length === 0)
21998
+ return [];
21999
+ const sorted = [...intervals].sort((a, b) => a.startMs - b.startMs);
22000
+ const first = sorted[0];
22001
+ if (!first)
22002
+ return [];
22003
+ const merged = [{ startMs: first.startMs, endMs: first.endMs }];
22004
+ for (let i = 1;i < sorted.length; i++) {
22005
+ const current = sorted[i];
22006
+ const last = merged[merged.length - 1];
22007
+ if (!current || !last)
22008
+ continue;
22009
+ if (current.startMs <= last.endMs) {
22010
+ last.endMs = Math.max(last.endMs, current.endMs);
22011
+ } else {
22012
+ merged.push({ startMs: current.startMs, endMs: current.endMs });
22013
+ }
22014
+ }
22015
+ return merged;
22016
+ }
22017
+ function durationMs(intervals) {
22018
+ return intervals.reduce((total, interval) => total + (interval.endMs - interval.startMs), 0);
22019
+ }
22020
+ function deriveUsageMetricsFromHistory(past) {
22021
+ let latestUsage;
22022
+ let latestUsageTimestampMs = null;
22023
+ let lastUserTimestampMs = null;
22024
+ let inputTokens = 0;
22025
+ let outputTokens = 0;
22026
+ const intervals = [];
22027
+ for (const message of past) {
22028
+ const timestampMs = parseTimestampMs(message.timestamp);
22029
+ if (message.role === "user" && timestampMs !== null) {
22030
+ lastUserTimestampMs = timestampMs;
22031
+ continue;
22032
+ }
22033
+ if (message.role !== "assistant" || !message.usage)
22034
+ continue;
22035
+ if (timestampMs !== null && (latestUsageTimestampMs === null || timestampMs > latestUsageTimestampMs)) {
22036
+ latestUsageTimestampMs = timestampMs;
22037
+ latestUsage = message.usage;
22038
+ } else if (latestUsage === undefined) {
22039
+ latestUsage = message.usage;
22040
+ }
22041
+ inputTokens += message.usage.input_tokens;
22042
+ outputTokens += message.usage.output_tokens;
22043
+ if (timestampMs !== null && lastUserTimestampMs !== null && timestampMs > lastUserTimestampMs) {
22044
+ intervals.push({ startMs: lastUserTimestampMs, endMs: timestampMs });
22045
+ }
22046
+ }
22047
+ if (!latestUsage)
22048
+ return;
22049
+ const totalDurationMs = durationMs(mergeIntervals(intervals));
22050
+ if (totalDurationMs <= 0)
22051
+ return latestUsage;
22052
+ return {
22053
+ ...latestUsage,
22054
+ total_speed_tokens_per_second: (inputTokens + outputTokens) / (totalDurationMs / 1000)
22055
+ };
22056
+ }
22057
+ function withTotalSpeedForTurn(usage, startedAtIso, endedAtIso) {
22058
+ const startMs = startedAtIso ? parseTimestampMs(startedAtIso) : null;
22059
+ const endMs = parseTimestampMs(endedAtIso);
22060
+ if (startMs === null || endMs === null || endMs <= startMs)
22061
+ return usage;
22062
+ return {
22063
+ ...usage,
22064
+ total_speed_tokens_per_second: (usage.input_tokens + usage.output_tokens) / ((endMs - startMs) / 1000)
22065
+ };
22066
+ }
21726
22067
  function contextWindowTokensForModel(modelId) {
21727
22068
  const id = modelId ?? resolveDefaultModelId();
21728
22069
  if (id.includes("[1m]"))
@@ -21745,13 +22086,21 @@ function formatTokShort(n) {
21745
22086
  return `${(n / 1000).toFixed(1)}k`;
21746
22087
  return String(n);
21747
22088
  }
22089
+ function formatTotalSpeed(tokensPerSecond) {
22090
+ if (typeof tokensPerSecond !== "number" || !Number.isFinite(tokensPerSecond))
22091
+ return null;
22092
+ if (tokensPerSecond >= 1000)
22093
+ return `${(tokensPerSecond / 1000).toFixed(1)}k t/s`;
22094
+ return `${tokensPerSecond.toFixed(1)} t/s`;
22095
+ }
21748
22096
  function formatContextUsageCompact(u, modelId) {
21749
22097
  const window = contextWindowTokensForModel(modelId);
21750
22098
  const total = totalContextTokens(u);
21751
22099
  if (total <= 0 || window <= 0)
21752
22100
  return null;
21753
22101
  const pct2 = Math.min(100, Math.max(0, Math.round(total / window * 100)));
21754
- return `${pct2}% \xB7 ${formatTokShort(total)}/${formatTokShort(window)}`;
22102
+ const speed = formatTotalSpeed(u.total_speed_tokens_per_second);
22103
+ return [`${pct2}% \xB7 ${formatTokShort(total)}/${formatTokShort(window)}`, speed].filter(Boolean).join(" \xB7 ");
21755
22104
  }
21756
22105
  var LONG_CTX = 1e6, STD_CTX = 200000;
21757
22106
  var init_context_meter = __esm(() => {
@@ -21803,14 +22152,7 @@ function setMessagesFromHistory(state, past) {
21803
22152
  for (const m of past) {
21804
22153
  appendRowsFromMessage(rows, toolIndexById, m);
21805
22154
  }
21806
- let latestUsage;
21807
- for (let i = past.length - 1;i >= 0; i--) {
21808
- const u = past[i]?.usage;
21809
- if (u) {
21810
- latestUsage = u;
21811
- break;
21812
- }
21813
- }
22155
+ const latestUsage = deriveUsageMetricsFromHistory(past);
21814
22156
  return {
21815
22157
  ...state,
21816
22158
  messages: capMessages(rows, new Date().toISOString()),
@@ -21888,19 +22230,20 @@ function applyEvent(state, ev, nowIso = new Date().toISOString()) {
21888
22230
  case "usage":
21889
22231
  return {
21890
22232
  ...state,
21891
- lastUsage: {
22233
+ lastUsage: withTotalSpeedForTurn({
21892
22234
  input_tokens: ev.input_tokens,
21893
22235
  output_tokens: ev.output_tokens,
21894
22236
  cache_read_input_tokens: ev.cache_read_input_tokens,
21895
22237
  cache_creation_input_tokens: ev.cache_creation_input_tokens
21896
- }
22238
+ }, state.activeTurnStartedAt, nowIso)
21897
22239
  };
21898
22240
  case "done":
21899
- return { ...state, isStreaming: false };
22241
+ return { ...state, isStreaming: false, activeTurnStartedAt: undefined };
21900
22242
  case "error":
21901
22243
  return {
21902
22244
  ...state,
21903
22245
  isStreaming: false,
22246
+ activeTurnStartedAt: undefined,
21904
22247
  error: ev.message,
21905
22248
  messages: capMessages([...state.messages, { kind: "system", text: `error: ${ev.message}`, ts: nowIso }], nowIso)
21906
22249
  };
@@ -21910,6 +22253,7 @@ function applyEvent(state, ev, nowIso = new Date().toISOString()) {
21910
22253
  isStreaming: true,
21911
22254
  error: null,
21912
22255
  lastUsage: undefined,
22256
+ activeTurnStartedAt: nowIso,
21913
22257
  messages: capMessages([...state.messages, { kind: "user", text: ev.text, ts: nowIso }], nowIso)
21914
22258
  };
21915
22259
  case "system.info":
@@ -22078,6 +22422,7 @@ function findLastIndex(arr, pred) {
22078
22422
  }
22079
22423
  var SCROLLBACK_CAP = 1000, SENTINEL_PREFIX = "(scrollback truncated \u2014 ", SENTINEL_SUFFIX = " rows dropped)", CLAUDE_NOISE_TAGS, NOISE_TAG_PATTERN, QUEUE_SOFT_CAP = 50;
22080
22424
  var init_store2 = __esm(() => {
22425
+ init_context_meter();
22081
22426
  CLAUDE_NOISE_TAGS = [
22082
22427
  "local-command-caveat",
22083
22428
  "command-message",
@@ -22278,7 +22623,6 @@ var init_use_chat_session = __esm(() => {
22278
22623
  });
22279
22624
 
22280
22625
  // src/tui/panes/chat/Chat.tsx
22281
- import { TextAttributes as TextAttributes25 } from "@opentui/core";
22282
22626
  function Chat(props) {
22283
22627
  const {
22284
22628
  theme
@@ -22483,7 +22827,7 @@ function Chat(props) {
22483
22827
  send(pp);
22484
22828
  });
22485
22829
  });
22486
- let draining = false;
22830
+ let dispatching = false;
22487
22831
  createEffect(() => {
22488
22832
  const taskId = props.taskId();
22489
22833
  const tabId = activeTabId();
@@ -22496,15 +22840,15 @@ function Chat(props) {
22496
22840
  return;
22497
22841
  if (hasPendingInput())
22498
22842
  return;
22499
- if (draining)
22843
+ if (dispatching)
22500
22844
  return;
22501
22845
  queueMicrotask(async () => {
22502
- if (draining)
22846
+ if (dispatching)
22503
22847
  return;
22504
22848
  const cur = activeState();
22505
22849
  if (cur.isStreaming || cur.queue.length === 0)
22506
22850
  return;
22507
- draining = true;
22851
+ dispatching = true;
22508
22852
  try {
22509
22853
  let head = null;
22510
22854
  patchActiveState((s) => {
@@ -22521,7 +22865,7 @@ function Chat(props) {
22521
22865
  patchActiveState((s) => pushSystemError(s, `queued runTask failed: ${stringifyErr2(err)}`));
22522
22866
  }
22523
22867
  } finally {
22524
- draining = false;
22868
+ dispatching = false;
22525
22869
  }
22526
22870
  });
22527
22871
  });
@@ -22547,16 +22891,17 @@ function Chat(props) {
22547
22891
  const streaming = activeState().isStreaming;
22548
22892
  if (streaming && mode === "steer") {
22549
22893
  setDraft("");
22550
- try {
22551
- await props.orchestrator.interruptTask(taskId, tabId);
22552
- } catch (err) {
22553
- patchActiveState((s) => pushSystemError(s, `interrupt failed: ${stringifyErr2(err)}`));
22894
+ if (dispatching)
22554
22895
  return;
22555
- }
22896
+ dispatching = true;
22556
22897
  try {
22557
- await props.orchestrator.runTask(taskId, text, tabId);
22558
- } catch (err) {
22559
- patchActiveState((s) => pushSystemError(s, `runTask failed: ${stringifyErr2(err)}`));
22898
+ try {
22899
+ await props.orchestrator.steerTask(taskId, text, tabId);
22900
+ } catch (err) {
22901
+ patchActiveState((s) => pushSystemError(s, `steer failed: ${stringifyErr2(err)}`));
22902
+ }
22903
+ } finally {
22904
+ dispatching = false;
22560
22905
  }
22561
22906
  return;
22562
22907
  }
@@ -22579,6 +22924,13 @@ function Chat(props) {
22579
22924
  function cancelQueued(id) {
22580
22925
  patchActiveState((s) => removeFromQueue(s, id));
22581
22926
  }
22927
+ function sendQueuedNow(id) {
22928
+ const entry = activeState().queue.find((q) => q.id === id);
22929
+ if (!entry)
22930
+ return;
22931
+ patchActiveState((s) => removeFromQueue(s, id));
22932
+ send(entry.text, "steer");
22933
+ }
22582
22934
  async function newTab() {
22583
22935
  const taskId = props.taskId();
22584
22936
  if (!taskId)
@@ -22832,19 +23184,6 @@ function Chat(props) {
22832
23184
  return _el$5;
22833
23185
  }
22834
23186
  }), null);
22835
- insert(_el$, createComponent2(Show, {
22836
- get when() {
22837
- return memo2(() => !!props.taskId())() && activeState().queue.length > 0;
22838
- },
22839
- get children() {
22840
- return createComponent2(QueuedPromptList, {
22841
- get queue() {
22842
- return activeState().queue;
22843
- },
22844
- onCancel: cancelQueued
22845
- });
22846
- }
22847
- }), null);
22848
23187
  insert(_el$, createComponent2(Show, {
22849
23188
  get when() {
22850
23189
  return memo2(() => !!showThinking())() && props.taskId();
@@ -22889,7 +23228,10 @@ function Chat(props) {
22889
23228
  onCyclePermissionMode: cyclePermissionMode,
22890
23229
  modelLabel,
22891
23230
  onChooseModel: () => void chooseModel(),
22892
- worktreePath
23231
+ worktreePath,
23232
+ queue: () => activeState().queue,
23233
+ onCancelQueued: cancelQueued,
23234
+ onSendQueuedNow: sendQueuedNow
22893
23235
  });
22894
23236
  }
22895
23237
  }), null);
@@ -22905,97 +23247,6 @@ function stringifyErr2(err) {
22905
23247
  return String(err);
22906
23248
  }
22907
23249
  }
22908
- function QueuedPromptList(props) {
22909
- const {
22910
- theme
22911
- } = useTheme();
22912
- const visible = () => props.queue.slice(0, QUEUE_VISIBLE_CAP);
22913
- const hidden = () => Math.max(0, props.queue.length - QUEUE_VISIBLE_CAP);
22914
- return (() => {
22915
- var _el$7 = createElement("box");
22916
- setProp(_el$7, "flexDirection", "column");
22917
- setProp(_el$7, "gap", 0);
22918
- setProp(_el$7, "paddingTop", 1);
22919
- setProp(_el$7, "paddingLeft", 1);
22920
- setProp(_el$7, "paddingRight", 1);
22921
- insert(_el$7, createComponent2(For, {
22922
- get each() {
22923
- return visible();
22924
- },
22925
- children: (entry, idx) => (() => {
22926
- var _el$10 = createElement("box"), _el$11 = createElement("text"), _el$13 = createElement("box"), _el$14 = createElement("text"), _el$15 = createTextNode(`queued`), _el$16 = createTextNode(`:`), _el$17 = createElement("box"), _el$18 = createElement("text"), _el$19 = createElement("text");
22927
- insertNode(_el$10, _el$11);
22928
- insertNode(_el$10, _el$13);
22929
- setProp(_el$10, "flexDirection", "row");
22930
- setProp(_el$10, "gap", 1);
22931
- setProp(_el$10, "alignItems", "flex-start");
22932
- insertNode(_el$11, createTextNode(`+`));
22933
- insertNode(_el$13, _el$14);
22934
- insertNode(_el$13, _el$17);
22935
- insertNode(_el$13, _el$19);
22936
- setProp(_el$13, "flexGrow", 1);
22937
- setProp(_el$13, "flexDirection", "row");
22938
- setProp(_el$13, "gap", 1);
22939
- insertNode(_el$14, _el$15);
22940
- insertNode(_el$14, _el$16);
22941
- setProp(_el$14, "wrapMode", "none");
22942
- insert(_el$14, () => idx() === 0 ? " (next)" : "", _el$16);
22943
- insertNode(_el$17, _el$18);
22944
- setProp(_el$17, "flexGrow", 1);
22945
- insert(_el$18, () => entry.text);
22946
- insertNode(_el$19, createTextNode(`[x]`));
22947
- setProp(_el$19, "onMouseUp", () => props.onCancel(entry.id));
22948
- effect((_p$) => {
22949
- var _v$4 = theme.textMuted, _v$5 = TextAttributes25.BOLD, _v$6 = theme.textMuted, _v$7 = theme.text, _v$8 = theme.error, _v$9 = TextAttributes25.BOLD;
22950
- _v$4 !== _p$.e && (_p$.e = setProp(_el$11, "fg", _v$4, _p$.e));
22951
- _v$5 !== _p$.t && (_p$.t = setProp(_el$11, "attributes", _v$5, _p$.t));
22952
- _v$6 !== _p$.a && (_p$.a = setProp(_el$14, "fg", _v$6, _p$.a));
22953
- _v$7 !== _p$.o && (_p$.o = setProp(_el$18, "fg", _v$7, _p$.o));
22954
- _v$8 !== _p$.i && (_p$.i = setProp(_el$19, "fg", _v$8, _p$.i));
22955
- _v$9 !== _p$.n && (_p$.n = setProp(_el$19, "attributes", _v$9, _p$.n));
22956
- return _p$;
22957
- }, {
22958
- e: undefined,
22959
- t: undefined,
22960
- a: undefined,
22961
- o: undefined,
22962
- i: undefined,
22963
- n: undefined
22964
- });
22965
- return _el$10;
22966
- })()
22967
- }), null);
22968
- insert(_el$7, createComponent2(Show, {
22969
- get when() {
22970
- return hidden() > 0;
22971
- },
22972
- get children() {
22973
- var _el$8 = createElement("box"), _el$9 = createElement("text"), _el$1 = createElement("text");
22974
- insertNode(_el$8, _el$9);
22975
- insertNode(_el$8, _el$1);
22976
- setProp(_el$8, "flexDirection", "row");
22977
- setProp(_el$8, "gap", 1);
22978
- setProp(_el$8, "alignItems", "flex-start");
22979
- insertNode(_el$9, createTextNode(`+`));
22980
- insert(_el$1, () => `\u2026 ${hidden()} more queued`);
22981
- effect((_p$) => {
22982
- var _v$ = theme.textMuted, _v$2 = TextAttributes25.BOLD, _v$3 = theme.textMuted;
22983
- _v$ !== _p$.e && (_p$.e = setProp(_el$9, "fg", _v$, _p$.e));
22984
- _v$2 !== _p$.t && (_p$.t = setProp(_el$9, "attributes", _v$2, _p$.t));
22985
- _v$3 !== _p$.a && (_p$.a = setProp(_el$1, "fg", _v$3, _p$.a));
22986
- return _p$;
22987
- }, {
22988
- e: undefined,
22989
- t: undefined,
22990
- a: undefined
22991
- });
22992
- return _el$8;
22993
- }
22994
- }), null);
22995
- return _el$7;
22996
- })();
22997
- }
22998
- var QUEUE_VISIBLE_CAP = 4;
22999
23250
  var init_Chat = __esm(() => {
23000
23251
  init_solid();
23001
23252
  init_solid();
@@ -23025,7 +23276,7 @@ var init_Chat = __esm(() => {
23025
23276
  });
23026
23277
 
23027
23278
  // src/tui/component/sidebar.tsx
23028
- import { TextAttributes as TextAttributes26 } from "@opentui/core";
23279
+ import { TextAttributes as TextAttributes25 } from "@opentui/core";
23029
23280
  function Sidebar(props) {
23030
23281
  const {
23031
23282
  theme
@@ -23051,7 +23302,7 @@ function Sidebar(props) {
23051
23302
  setProp(_el$2, "paddingBottom", 1);
23052
23303
  insert(_el$3, () => props.title);
23053
23304
  effect((_p$) => {
23054
- var _v$ = theme.text, _v$2 = TextAttributes26.BOLD;
23305
+ var _v$ = theme.text, _v$2 = TextAttributes25.BOLD;
23055
23306
  _v$ !== _p$.e && (_p$.e = setProp(_el$3, "fg", _v$, _p$.e));
23056
23307
  _v$2 !== _p$.t && (_p$.t = setProp(_el$3, "attributes", _v$2, _p$.t));
23057
23308
  return _p$;
@@ -23310,7 +23561,7 @@ var init_keys4 = __esm(() => {
23310
23561
  });
23311
23562
 
23312
23563
  // src/tui/panes/sidebar/Sidebar.tsx
23313
- import { TextAttributes as TextAttributes27 } from "@opentui/core";
23564
+ import { TextAttributes as TextAttributes26 } from "@opentui/core";
23314
23565
  function Sidebar2(props) {
23315
23566
  const {
23316
23567
  theme
@@ -23402,7 +23653,7 @@ function Sidebar2(props) {
23402
23653
  return () => _c$() ? `[ ${tab.label} ]` : tab.label;
23403
23654
  })());
23404
23655
  effect((_p$) => {
23405
- var _v$7 = active() ? theme.primary : theme.textMuted, _v$8 = active() ? TextAttributes27.BOLD : undefined;
23656
+ var _v$7 = active() ? theme.primary : theme.textMuted, _v$8 = active() ? TextAttributes26.BOLD : undefined;
23406
23657
  _v$7 !== _p$.e && (_p$.e = setProp(_el$13, "fg", _v$7, _p$.e));
23407
23658
  _v$8 !== _p$.t && (_p$.t = setProp(_el$13, "attributes", _v$8, _p$.t));
23408
23659
  return _p$;
@@ -23497,7 +23748,7 @@ function Sidebar2(props) {
23497
23748
  }
23498
23749
  }), null);
23499
23750
  effect((_p$) => {
23500
- var _v$9 = isCursor() ? theme.primary : isSelected() ? theme.backgroundElement : undefined, _v$0 = isCursor() ? theme.selectedListItemText : badgeColor(), _v$1 = isCursor() ? theme.selectedListItemText : theme.text, _v$10 = (isMain || isSelected() && !isCursor()) && !isCursor() ? TextAttributes27.BOLD : undefined;
23751
+ var _v$9 = isCursor() ? theme.primary : isSelected() ? theme.backgroundElement : undefined, _v$0 = isCursor() ? theme.selectedListItemText : badgeColor(), _v$1 = isCursor() ? theme.selectedListItemText : theme.text, _v$10 = (isMain || isSelected() && !isCursor()) && !isCursor() ? TextAttributes26.BOLD : undefined;
23501
23752
  _v$9 !== _p$.e && (_p$.e = setProp(_el$14, "backgroundColor", _v$9, _p$.e));
23502
23753
  _v$0 !== _p$.t && (_p$.t = setProp(_el$15, "fg", _v$0, _p$.t));
23503
23754
  _v$1 !== _p$.a && (_p$.a = setProp(_el$16, "fg", _v$1, _p$.a));
@@ -23535,7 +23786,7 @@ function Sidebar2(props) {
23535
23786
  setProp(_el$11, "wrapMode", "none");
23536
23787
  setProp(_el$11, "onMouseUp", () => props.onAddTask?.());
23537
23788
  effect((_p$) => {
23538
- var _v$ = props.width ? props.width() : SIDEBAR_WIDTH, _v$2 = focusedAccessor() ? theme.focusAccent : theme.textMuted, _v$3 = TextAttributes27.BOLD, _v$4 = focusedAccessor() ? theme.focusAccent : theme.textMuted, _v$5 = TextAttributes27.BOLD, _v$6 = theme.textMuted;
23789
+ var _v$ = props.width ? props.width() : SIDEBAR_WIDTH, _v$2 = focusedAccessor() ? theme.focusAccent : theme.textMuted, _v$3 = TextAttributes26.BOLD, _v$4 = focusedAccessor() ? theme.focusAccent : theme.textMuted, _v$5 = TextAttributes26.BOLD, _v$6 = theme.textMuted;
23539
23790
  _v$ !== _p$.e && (_p$.e = setProp(_el$, "width", _v$, _p$.e));
23540
23791
  _v$2 !== _p$.t && (_p$.t = setProp(_el$3, "fg", _v$2, _p$.t));
23541
23792
  _v$3 !== _p$.a && (_p$.a = setProp(_el$3, "attributes", _v$3, _p$.a));
@@ -23605,11 +23856,11 @@ var init_Sidebar = __esm(() => {
23605
23856
  });
23606
23857
 
23607
23858
  // src/orchestrator/bridge/server.ts
23608
- import { mkdir as mkdir3, unlink as unlink3 } from "fs/promises";
23859
+ import { mkdir as mkdir4, unlink as unlink3 } from "fs/promises";
23609
23860
  import { createServer } from "net";
23610
23861
  import { dirname as dirname6 } from "path";
23611
23862
  async function startBridgeServer(orch, socketPath) {
23612
- await mkdir3(dirname6(socketPath), { recursive: true });
23863
+ await mkdir4(dirname6(socketPath), { recursive: true });
23613
23864
  await unlink3(socketPath).catch(() => {});
23614
23865
  const conns = new Set;
23615
23866
  const server = createServer((conn) => {
@@ -23742,7 +23993,7 @@ var exports_bridge = {};
23742
23993
  __export(exports_bridge, {
23743
23994
  startBridge: () => startBridge
23744
23995
  });
23745
- import { writeFile as writeFile3 } from "fs/promises";
23996
+ import { writeFile as writeFile4 } from "fs/promises";
23746
23997
  import { homedir as homedir12 } from "os";
23747
23998
  import { join as join15 } from "path";
23748
23999
  import { fileURLToPath as fileURLToPath2 } from "url";
@@ -23762,7 +24013,7 @@ async function startBridge(orch, opts = {}) {
23762
24013
  }
23763
24014
  }
23764
24015
  };
23765
- await writeFile3(mcpConfigPath, JSON.stringify(mcpConfig, null, 2), "utf8");
24016
+ await writeFile4(mcpConfigPath, JSON.stringify(mcpConfig, null, 2), "utf8");
23766
24017
  process.env.KOBE_MCP_CONFIG = mcpConfigPath;
23767
24018
  return {
23768
24019
  socketPath,
@@ -24345,7 +24596,7 @@ var exports_tui = {};
24345
24596
  __export(exports_tui, {
24346
24597
  startTui: () => startTui
24347
24598
  });
24348
- import { TextAttributes as TextAttributes28 } from "@opentui/core";
24599
+ import { TextAttributes as TextAttributes27 } from "@opentui/core";
24349
24600
  function HelpHint() {
24350
24601
  const {
24351
24602
  theme
@@ -24419,7 +24670,7 @@ function Banner() {
24419
24670
  insert(_el$20, selected);
24420
24671
  insert(_el$12, createComponent2(HelpHint, {}), null);
24421
24672
  effect((_p$) => {
24422
- var _v$7 = theme.primary, _v$8 = TextAttributes28.BOLD, _v$9 = theme.borderActive, _v$0 = theme.text, _v$1 = theme.textMuted, _v$10 = {
24673
+ var _v$7 = theme.primary, _v$8 = TextAttributes27.BOLD, _v$9 = theme.borderActive, _v$0 = theme.text, _v$1 = theme.textMuted, _v$10 = {
24423
24674
  fg: theme.accent
24424
24675
  };
24425
24676
  _v$7 !== _p$.e && (_p$.e = setProp(_el$13, "fg", _v$7, _p$.e));